104 |
104 |
105 class XMLDocumentConstructor { |
105 class XMLDocumentConstructor { |
106 private: |
106 private: |
107 std::istream* input = nullptr; |
107 std::istream* input = nullptr; |
108 xmlpp::DomParser* parser = nullptr; |
108 xmlpp::DomParser* parser = nullptr; |
|
109 std::shared_ptr<INIReader> reader; |
109 public: |
110 public: |
110 |
111 |
111 XMLDocumentConstructor(std::istream* input, xmlpp::DomParser* parser) : input(input), parser(parser) { |
112 XMLDocumentConstructor(std::istream* input, xmlpp::DomParser* parser) : input(input), parser(parser) { |
|
113 reader.reset(INIReader::create(*input)); |
|
114 reader->addUnescapingProcessor(std::make_shared<BasicUnescapingProcessor>(), unescaping::Basic, true); |
|
115 reader->addUnescapingProcessor(std::make_shared<JavaPropertiesUnescapingProcessor>(), unescaping::JavaProperties, false); |
|
116 reader->addUnescapingProcessor(std::make_shared<BackspaceUnescapingProcessor>(), unescaping::Backspace, true); |
|
117 reader->addDialect(std::make_shared<JavaPropertiesDialect>(), dialect::JavaProperties, false); |
|
118 } |
|
119 |
|
120 void setOption(const std::string& uri, const std::string& value) { |
|
121 reader->setOption(uri, value); |
112 } |
122 } |
113 |
123 |
114 void process() { |
124 void process() { |
115 HierarchicalINIContentHandler handler(parser); |
125 HierarchicalINIContentHandler handler(parser); |
116 std::shared_ptr<INIReader> reader(INIReader::create(*input)); |
|
117 reader->addUnescapingProcessor(std::make_shared<BasicUnescapingProcessor>(), unescaping::Basic, true); |
|
118 reader->addUnescapingProcessor(std::make_shared<JavaPropertiesUnescapingProcessor>(), unescaping::JavaProperties, false); |
|
119 reader->addUnescapingProcessor(std::make_shared<BackspaceUnescapingProcessor>(), unescaping::Backspace, true); |
|
120 reader->addDialect(std::make_shared<JavaPropertiesDialect>(), dialect::JavaProperties, false); |
|
121 reader->addHandler(&handler); |
126 reader->addHandler(&handler); |
122 // TODO: smart pointers vs. references: are we going to call addUnescapingProcessor() dynamically/conditionally or share instances? Then pointers will be better. |
|
123 // TODO: call setOption() according to the configuration |
|
124 // for (ParserOptionRecipe option : configuration.parserOptions) reader->setOption(convertor.to_bytes(option.uri), convertor.to_bytes(option.value)); |
|
125 reader->process(); |
127 reader->process(); |
126 } |
128 } |
127 }; |
129 }; |
128 |
130 |
129 } |
131 } |