streamlet examples: QR: file-pattern option v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Sun, 25 Apr 2021 20:30:53 +0200
branchv_0
changeset 91 cb1adcd17d0c
parent 90 59d12eee189f
child 92 cf4971342380
streamlet examples: QR: file-pattern option e.g. --option "file-pattern" '.*\.jpeg' will analyze only JPEG files while others will be skipped
streamlet-examples/qr-decode.cpp
--- a/streamlet-examples/qr-decode.cpp	Sun Apr 25 19:26:43 2021 +0200
+++ b/streamlet-examples/qr-decode.cpp	Sun Apr 25 20:30:53 2021 +0200
@@ -121,6 +121,12 @@
 		return false;
 	}
 
+	std::vector<std::wregex> getOptionsAsPatterns(std::wstring optionName) {
+		std::vector<std::wregex> result;
+		for (Option o : getOptions(optionName)) result.push_back(std::wregex(o.value));
+		return result;
+	}
+
 protected:
 
 	std::vector<AttributeMetadata> getOutputAttributesMetadata() override {
@@ -133,69 +139,74 @@
 	}
 
 	std::vector<OutputAttribute> getOutputAttributes() override {
+		bool matchedFile = false;
 		bool validInput = false;
-		bool hasSymbols = false;
+		bool matchedFirst = false;
 		std::wstring first;
 		std::stringstream xml;
 
+		std::vector<std::wregex> filePatterns = getOptionsAsPatterns(L"file-pattern");
+		matchedFile = filePatterns.size() == 0 || matchesAny(getCurrentFile(), filePatterns);
+
 		std::vector<Symbol> symbols;
-		try {
-			symbols = findSymbols(getCurrentFile());
-			validInput = true;
-		} catch (...) {
-			// just ignore the errors;
-			// the file is probably not an image or we do not have read permissions
-			validInput = false;
-		}
+		if (matchedFile) {
+			try {
+				symbols = findSymbols(getCurrentFile());
+				validInput = true;
+			} catch (...) {
+				// just ignore the errors;
+				// the file is probably not an image or we do not have read permissions
+				validInput = false;
+			}
+
+			std::vector<std::wregex> valuePatterns = getOptionsAsPatterns(L"value-pattern");
+
+			for (Symbol s : symbols) {
+				if (valuePatterns.size() == 0 || matchesAny(s.value, valuePatterns)) {
+					first = s.value;
+					matchedFirst = true;
+					break;
+				}
+			}
+
+			relpipe::xmlwriter::XMLWriter xmlWriter(xml);
+			xmlWriter.writeStartElement(L"qr",{L"xmlns", XMLNS});
 
-		std::vector<Option> valuePatternOptions = getOptions(L"value-pattern");
-		std::vector<std::wregex> valuePatterns;
-		for (Option o : valuePatternOptions) valuePatterns.push_back(std::wregex(o.value));
+			// TODO: common metadata
+			// xmlWriter.writeStartElement(L"source");
+			// xmlWriter.writeTextElement(L"height",{}, std::to_wstring(...));
+			// xmlWriter.writeTextElement(L"width",{}, std::to_wstring(...));
+			// xmlWriter.writeEndElement();
+
+			for (Symbol s : symbols) {
+				xmlWriter.writeStartElement(L"symbol");
+				xmlWriter.writeTextElement(L"value",{}, s.value);
 
-		for (Symbol s : symbols) {
-			if (valuePatterns.size() == 0 || matchesAny(s.value, valuePatterns)) {
-				first = s.value;
-				hasSymbols = true;
-				break;
+				// TODO: well-designed XML schema
+				// TODO: synchronize/share common XML parts with relpipe-in-qr
+				xmlWriter.writeStartElement(L"rectangular-box");
+				xmlWriter.writeTextElement(L"x",{}, std::to_wstring(s.x));
+				xmlWriter.writeTextElement(L"y",{}, std::to_wstring(s.y));
+				xmlWriter.writeTextElement(L"height",{}, std::to_wstring(s.height));
+				xmlWriter.writeTextElement(L"width",{}, std::to_wstring(s.width));
+				xmlWriter.writeEndElement();
+
+				xmlWriter.writeStartElement(L"polygon");
+				for (Point p : s.polygon) xmlWriter.writeEmptyElement(L"point",{L"x", std::to_wstring(p.x), L"y", std::to_wstring(p.y)});
+				xmlWriter.writeEndElement();
+
+				xmlWriter.writeEndElement();
 			}
+
+			xmlWriter.writeEndElement();
+
 		}
 
-		relpipe::xmlwriter::XMLWriter xmlWriter(xml);
-		xmlWriter.writeStartElement(L"qr",{L"xmlns", XMLNS});
-
-		// TODO: common metadata
-		// xmlWriter.writeStartElement(L"source");
-		// xmlWriter.writeTextElement(L"height",{}, std::to_wstring(...));
-		// xmlWriter.writeTextElement(L"width",{}, std::to_wstring(...));
-		// xmlWriter.writeEndElement();
-
-		for (Symbol s : symbols) {
-			xmlWriter.writeStartElement(L"symbol");
-			xmlWriter.writeTextElement(L"value",{}, s.value);
-
-			// TODO: well-designed XML schema
-			// TODO: synchronize/share common XML parts with relpipe-in-qr
-			xmlWriter.writeStartElement(L"rectangular-box");
-			xmlWriter.writeTextElement(L"x",{}, std::to_wstring(s.x));
-			xmlWriter.writeTextElement(L"y",{}, std::to_wstring(s.y));
-			xmlWriter.writeTextElement(L"height",{}, std::to_wstring(s.height));
-			xmlWriter.writeTextElement(L"width",{}, std::to_wstring(s.width));
-			xmlWriter.writeEndElement();
-
-			xmlWriter.writeStartElement(L"polygon");
-			for (Point p : s.polygon) xmlWriter.writeEmptyElement(L"point",{L"x", std::to_wstring(p.x), L"y", std::to_wstring(p.y)});
-			xmlWriter.writeEndElement();
-
-			xmlWriter.writeEndElement();
-		}
-
-		xmlWriter.writeEndElement();
-
 		std::vector<OutputAttribute> oa;
-		// TODO: report also validInput (distinguish it from hasSymbols)
-		oa.push_back({first, !hasSymbols});
-		oa.push_back({std::to_wstring(symbols.size()), false});
-		oa.push_back({fromBytes(xml.str()), false});
+		// TODO: report also validInput and matchedFile (distinguish them from matchedFirst)?
+		oa.push_back({first, !matchedFirst});
+		oa.push_back({std::to_wstring(symbols.size()), !matchedFile});
+		oa.push_back({fromBytes(xml.str()), !matchedFile});
 		return oa;
 	}
 };