1 #ifndef _XML_TEMPLATE_H
2 #define _XML_TEMPLATE_H 1
4 #include <libxml/tree.h>
8 #include <unordered_map>
14 virtual void process(xmlNode *node, bool clean) = 0;
15 virtual std::string get_contents(); // Only makes sense for Replace.
18 class Replace : public Directive {
20 Replace(const std::string &str);
21 virtual void process(xmlNode *node, bool clean);
22 virtual std::string get_contents();
25 const std::string str;
28 class ReplaceInclude : public Directive {
30 ReplaceInclude(xmlNodePtr included_node);
31 ReplaceInclude(xmlDocPtr included_doc);
33 virtual void process(xmlNode *node, bool clean);
36 xmlNodePtr included_node;
37 xmlDocPtr included_doc;
42 class Clone : public Directive {
44 Clone(const std::vector<Directive *> &subdirectives);
45 Clone(const std::vector<Substitute *> &subdirectives);
46 Clone(std::initializer_list<Directive *> subdirectives);
48 virtual void process(xmlNode *node, bool clean);
51 std::vector<Directive *> subdirectives;
54 class Substitute : public Directive {
56 Substitute(const std::unordered_map<std::string, Directive*> &substitution_map);
57 Substitute(std::initializer_list<std::pair<const std::string, Directive*>> substitution_map);
60 virtual void process(xmlNode *node, bool clean);
63 friend class Alternate;
64 std::unordered_map<std::string, Directive*> substitution_map;
67 class Alternate : public Clone {
69 Alternate(const std::string &attribute,
70 const std::vector<Substitute *> &subdirectives_subs,
71 const std::vector<std::string> &alternatives);
74 xmlDocPtr process_file(const std::string &input_filename,
75 Directive *root_directive,
78 void output_to_fd_and_free(xmlDocPtr doc, int fd);
80 #endif // !defined(_XML_TEMPLATE_H)