]> git.sesse.net Git - xml-template/blobdiff - c++0x/simple.cpp
Tweak C++0x API a bit, to prepare for include. Also, output to stdout instead of...
[xml-template] / c++0x / simple.cpp
index 69480e9c4abf21bb3ea619a554d7c2e77c6fc40c..0c895426383497494e362f9f8ddadd90d4827989 100644 (file)
@@ -1,82 +1,17 @@
 #include <stdio.h>
-#include <string.h>
-#include <libxml/parser.h>
 
-#include <string>
-#include <utility>
-#include <unordered_map>
+#include "xml-template.h"
 
 using namespace std;
 
-class Directive {
- public:
-       virtual void process(xmlNode *node, bool clean) = 0;
-};
-
-class Replace : public Directive {
- public:
-       Replace(const string &str) : str(str) {}
-       virtual void process(xmlNode *node, bool clean) {
-               node->children = xmlNewTextLen(reinterpret_cast<const xmlChar *>(str.data()), str.size());
-       }
-
- private:
-       const string str;
-};
-
-class Substitute : public Directive {
- public:
-       Substitute(const unordered_map<string, Directive*> &substitution_map)
-               : substitution_map(substitution_map) {}
-
-       virtual void process(xmlNode *node, bool clean) {
-               for (xmlNode *child = node->children; child != NULL; child = child->next) {
-                       bool processed = false;
-
-                       if (child->type == XML_ELEMENT_NODE) {
-                               // Find the ID, if any.
-                               string id;
-                               for (xmlAttr *attr = child->properties; attr != NULL; attr = attr->next) {
-                                       if (strcmp(reinterpret_cast<const char *>(attr->ns->href), "http://template.sesse.net/") == 0 &&
-                                           strcmp(reinterpret_cast<const char *>(attr->name), "id") == 0) {
-                                               id = reinterpret_cast<const char *>(xmlNodeGetContent(attr->children));
-                                       }
-                               }
-
-                               // Check all substitutions to see if we found anything appropriate.
-                               for (auto it : substitution_map) {
-                                       if (it.first == reinterpret_cast<const char *>(child->name) ||
-                                           (!id.empty() && it.first == ("#" + id))) {
-                                               it.second->process(child, clean);
-                                               processed = true;
-                                               break;
-                                       }
-                               }
-                       }
-                       
-                       if (!processed) {
-                               process(child, clean);
-                       }
-               }
-       }
-
- private:
-       const unordered_map<string, Directive*> &substitution_map;
-};
-
 int main(int argc, char **argv)
 {
-       LIBXML_TEST_VERSION
-
-       unordered_map<string, Directive*> master_map;
-       master_map.insert(make_pair("title", new Replace("A very basic example")));
-       master_map.insert(make_pair("#hello", new Replace("Hello world!")));
-
-       xmlDocPtr doc = xmlParseFile(argv[1]);
-       Substitute(master_map).process(xmlDocGetRootElement(doc), false);
-       xmlSaveFile("out.xml", doc);
+       Substitute master_directive = {
+               make_pair("title", new Replace("A very basic example")),
+               make_pair("#hello", new Replace("Hello world!")),
+       };
 
-       xmlCleanupParser();
-       xmlMemoryDump();
+       xmlDocPtr doc = process_file("../xml/simple.xml", &master_directive);
+       output_to_fd_and_free(doc, 1);
        return(0);
 }