]> git.sesse.net Git - xml-template/blob - c++0x/xml-template.h
7cfa0d8dc1a3de85ffc2fdae41e3d41108dc1062
[xml-template] / c++0x / xml-template.h
1 #ifndef _XML_TEMPLATE_H
2 #define _XML_TEMPLATE_H 1
3
4 #include <libxml/tree.h>
5
6 #include <string>
7 #include <utility>
8 #include <unordered_map>
9 #include <vector>
10
11 class Directive {
12  public:
13         virtual ~Directive();
14         virtual void process(xmlNode *node, bool clean) = 0;
15         virtual std::string get_contents();  // Only makes sense for Replace.
16 };
17
18 class Replace : public Directive {
19  public:
20         Replace(const std::string &str);
21         virtual void process(xmlNode *node, bool clean);
22         virtual std::string get_contents();
23
24  private:
25         const std::string str;
26 };
27
28 class ReplaceInclude : public Directive {
29  public:
30         ReplaceInclude(xmlNodePtr included_node);
31         ReplaceInclude(xmlDocPtr included_doc);
32         ~ReplaceInclude();
33         virtual void process(xmlNode *node, bool clean);
34
35  private:
36         xmlNodePtr included_node;
37         xmlDocPtr included_doc;
38 };
39
40 class Substitute;
41
42 class Clone : public Directive {
43  public:
44         Clone(const std::vector<Directive *> &subdirectives);
45         Clone(const std::vector<Substitute *> &subdirectives);
46         Clone(std::initializer_list<Directive *> subdirectives);
47         ~Clone();
48         virtual void process(xmlNode *node, bool clean);
49
50  private:
51         std::vector<Directive *> subdirectives;
52 };
53
54 class Substitute : public Directive {
55  public:
56         Substitute(const std::unordered_map<std::string, Directive*> &substitution_map);
57         Substitute(std::initializer_list<std::pair<const std::string, Directive*>> substitution_map);
58         ~Substitute();
59
60         virtual void process(xmlNode *node, bool clean);
61
62  private:
63         friend class Alternate;
64         std::unordered_map<std::string, Directive*> substitution_map;
65 };
66
67 class Alternate : public Clone {
68  public:
69         Alternate(const std::string &attribute,
70                   const std::vector<Substitute *> &subdirectives_subs,
71                   const std::vector<std::string> &alternatives);
72 };
73
74 xmlDocPtr process_file(const std::string &input_filename,
75                        Directive *root_directive,
76                        bool clean = true);
77         
78 void output_to_fd_and_free(xmlDocPtr doc, int fd);
79
80 #endif  // !defined(_XML_TEMPLATE_H)