add --parser-option allow-sections (Java .properties have no sections) v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Fri, 27 Nov 2020 16:42:55 +0100
branchv_0
changeset 24 07e0a2edf3bc
parent 23 b497140b0b63
child 25 b9067d2812e5
add --parser-option allow-sections (Java .properties have no sections)
bash-completion.sh
src/lib/INIReader.cpp
--- a/bash-completion.sh	Fri Nov 27 16:29:12 2020 +0100
+++ b/bash-completion.sh	Fri Nov 27 16:42:55 2020 +0100
@@ -29,6 +29,7 @@
 
 	PARSER_OPTIONS=(
 		"trim-continuing-lines"
+		"allow-sections"
 		"allow-section-tags"
 		"allow-sub-keys"
 		"comment-separators"
@@ -51,6 +52,7 @@
 	elif [[ "$w1" == "--enable-event-numbers"                           ]];    then COMPREPLY=($(compgen -W "${BOOLEAN_VALUES[*]}" -- "$w0"))
 	elif [[ "$w1" == "--parser-option"                                  ]];    then COMPREPLY=($(compgen -W "${PARSER_OPTIONS[*]}" -- "$w0"))
 	elif [[ "$w2" == "--parser-option" && "$w1" == "trim-continuing-lines"                    ]];    then COMPREPLY=($(compgen -W "${BOOLEAN_VALUES[*]}" -- "$w0"))
+	elif [[ "$w2" == "--parser-option" && "$w1" == "allow-sections"                           ]];    then COMPREPLY=($(compgen -W "${BOOLEAN_VALUES[*]}" -- "$w0"))
 	elif [[ "$w2" == "--parser-option" && "$w1" == "allow-section-tags"                       ]];    then COMPREPLY=($(compgen -W "${BOOLEAN_VALUES[*]}" -- "$w0"))
 	elif [[ "$w2" == "--parser-option" && "$w1" == "allow-sub-keys"                           ]];    then COMPREPLY=($(compgen -W "${BOOLEAN_VALUES[*]}" -- "$w0"))
 	elif [[ "$w2" == "--parser-option" && "$w1" == "dialect"                                  ]];    then COMPREPLY=($(compgen -W "${DIALECTS[*]}" -- "$w0"))
--- a/src/lib/INIReader.cpp	Fri Nov 27 16:29:12 2020 +0100
+++ b/src/lib/INIReader.cpp	Fri Nov 27 16:42:55 2020 +0100
@@ -42,6 +42,14 @@
 	 */
 	bool trimLeadingSpacesOnContinuingLines = true;
 
+
+	/**
+	 * Some dialects or configuration files in general does not support sections.
+	 * Then a line, that looks like an INI section, should be interpreted as a key
+	 * (or error, if does not have a proper key-value separator).
+	 */
+	bool allowSections = true;
+
 	/**
 	 * KDE uses some weird INI dialect that allows [section][x] syntax where „x“ is kind of „tag“ that signalizes some properties of given section.
 	 * Line „[section_1][$i]“ means that the „section_1“ is „locked“.
@@ -239,12 +247,12 @@
 			// already set
 		} else if (name == "java-properties") {
 			trimLeadingSpacesOnContinuingLines = true;
+			allowSections = false;
 			allowSectionTags = false;
 			allowSubKeys = false;
 			commentSeparators = "#";
 			keyValueSeparators = "=:";
 			quotes = "";
-			// TODO: allowSections = false;
 			// TODO: enable unicode unescaping
 		} else {
 			throw std::invalid_argument(std::string("Unsupported INI dialect: ") + name);
@@ -258,7 +266,7 @@
 
 	void setOption(const std::string& uri, const std::string& value) override {
 		if (uri == "trim-continuing-lines") trimLeadingSpacesOnContinuingLines = parseBoolean(value); // TODO: continuing lines modes (enum), not just boolean
-		// TODO: else if (uri == "allow-sections") allowSections = parseBoolean(value);
+		else if (uri == "allow-sections") allowSections = parseBoolean(value);
 		else if (uri == "allow-section-tags") allowSectionTags = parseBoolean(value);
 		else if (uri == "allow-sub-keys") allowSubKeys = parseBoolean(value);
 		else if (uri == "comment-separators") commentSeparators = value;
@@ -296,7 +304,7 @@
 
 			if (ch == std::istream::traits_type::eof()) {
 				break;
-			} else if (ch == '[') {
+			} else if (ch == '[' && allowSections) {
 				if (inSection) for (INIContentHandler* handler : handlers) handler->endSection();
 				inSection = true;
 				INIContentHandler::SectionStartEvent event;
@@ -305,6 +313,7 @@
 				get();
 				readAllWhitespace();
 				event.name = readTokenAndEatTerminator(']', &quote, &found);
+				// TODO: if (!quote) event.name = trim(event.name);
 
 				readSpacesAndTabs();
 				if (allowSectionTags && peek() == '[') {