using namespace std;
+namespace {
+
+void clean_node(xmlNode *node)
+{
+ if (node->type != XML_ELEMENT_NODE) {
+ return;
+ }
+ if (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;
+ }
+}
+
+} // namespace
+
Replace::Replace(const string &str)
: str(str) {}
void Replace::process(xmlNode *node, bool clean) {
node->children = xmlNewTextLen(reinterpret_cast<const xmlChar *>(str.data()), str.size());
+ if (clean) {
+ clean_node(node);
+ }
}
Clone::Clone(const std::vector<Directive *> &subdirectives)
: subdirectives(subdirectives) {}
+
+Clone::Clone(std::initializer_list<Directive *> subdirectives)
+ : subdirectives(subdirectives) {}
void Clone::process(xmlNode *node, bool clean) {
// We can't use xmlNewDocFragment, since xmlDOMWrapCloneNode only knows
vector<xmlNode *> new_nodes;
for (auto it : subdirectives) {
- xmlDOMWrapCtxt ctx;
xmlNode *new_node;
- int ret = xmlDOMWrapCloneNode(NULL, node->doc, node, &new_node, node->doc, NULL, 1, 0);
+ xmlDOMWrapCloneNode(NULL, node->doc, node, &new_node, node->doc, NULL, 1, 0);
it->process(new_node, clean);
for (xmlNode *child = new_node->children; child != NULL; child = child->next) {
new_nodes.push_back(child);
for (auto child : new_nodes) {
xmlAddChild(node, child);
}
+ if (clean) {
+ clean_node(node);
+ }
}
Substitute::Substitute(const unordered_map<string, Directive*> &substitution_map)
: substitution_map(substitution_map) {}
+
+Substitute::Substitute(std::initializer_list<std::pair<const std::string, Directive*>> substitution_map)
+ : substitution_map(substitution_map) {}
void Substitute::process(xmlNode *node, bool clean) {
for (xmlNode *child = node->children; child != NULL; child = child->next) {
process(child, clean);
}
}
+ if (clean) {
+ clean_node(node);
+ }
}
void process_file(const string &input_filename,