--- 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;
}
};