--- /dev/null
+#include <stdio.h>
+
+#include "xml-template.h"
+
+using namespace std;
+
+int main(int argc, char **argv)
+{
+ Substitute doc_directive = {
+ make_pair("color", new Replace("red")),
+ };
+ xmlDocPtr doc = process_file("../xml/included.xml", &doc_directive, false);
+
+ Substitute master_directive = {
+ make_pair("title", new Replace("Main HTML title")),
+ make_pair("h1", new Replace("Nice heading here")),
+ make_pair("contents", new ReplaceInclude(doc)),
+ };
+
+ xmlDocPtr master = process_file("../xml/master.xml", &master_directive);
+ output_to_fd_and_free(master, 1);
+ return(0);
+}
if (node->type != XML_ELEMENT_NODE) {
return;
}
- if (strcmp(reinterpret_cast<const char *>(node->ns->href), "http://template.sesse.net/") == 0) {
+ if (node->ns != NULL &&
+ strcmp(reinterpret_cast<const char *>(node->ns->href), "http://template.sesse.net/") == 0) {
xmlNode *frag = xmlNewDocFragment(node->doc);
xmlReplaceNode(node, frag);
frag->children = node->children;
string Replace::get_contents() { return str; }
+ReplaceInclude::ReplaceInclude(xmlNodePtr included_node)
+ : included_node(included_node),
+ included_doc(NULL) {}
+
+ReplaceInclude::ReplaceInclude(xmlDocPtr included_doc)
+ : included_node(xmlDocGetRootElement(included_doc)),
+ included_doc(included_doc) {}
+
+ReplaceInclude::~ReplaceInclude()
+{
+ if (included_doc != NULL) {
+ xmlFreeDoc(included_doc);
+ } else {
+ xmlFreeNode(included_node);
+ }
+}
+
+void ReplaceInclude::process(xmlNode *node, bool clean) {
+ xmlFreeNodeList(node->children);
+ node->content = NULL;
+ node->children = node->last = NULL;
+
+ xmlNode *new_node;
+ xmlDOMWrapCloneNode(NULL, NULL, included_node, &new_node, node->doc, node, 1, 0);
+ xmlAddChild(node, new_node);
+
+ if (clean) {
+ Substitute dummy_subs {};
+ dummy_subs.process(new_node, clean);
+ clean_node(node);
+ }
+}
+
Clone::Clone(const vector<Directive *> &subdirectives)
: subdirectives(subdirectives) {}
}
xmlDocPtr process_file(const string &input_filename,
- Directive *root_directive)
+ Directive *root_directive,
+ bool clean)
{
LIBXML_TEST_VERSION
xmlDocPtr doc = xmlParseFile(input_filename.c_str());
- root_directive->process(xmlDocGetRootElement(doc), true);
+ root_directive->process(xmlDocGetRootElement(doc), clean);
xmlCleanupParser();
xmlMemoryDump();
return doc;
const std::string str;
};
+class ReplaceInclude : public Directive {
+ public:
+ ReplaceInclude(xmlNodePtr included_node);
+ ReplaceInclude(xmlDocPtr included_doc);
+ ~ReplaceInclude();
+ virtual void process(xmlNode *node, bool clean);
+
+ private:
+ xmlNodePtr included_node;
+ xmlDocPtr included_doc;
+};
+
class Substitute;
class Clone : public Directive {
};
xmlDocPtr process_file(const std::string &input_filename,
- Directive *root_directive);
+ Directive *root_directive,
+ bool clean = true);
void output_to_fd_and_free(xmlDocPtr doc, int fd);