attribute: attribute.o $(LIBS)
$(CXX) -o $@ $< $(LIBS) $(LDFLAGS)
+attribute2: attribute2.o $(LIBS)
+ $(CXX) -o $@ $< $(LIBS) $(LDFLAGS)
+
namespace: namespace.o $(LIBS)
$(CXX) -o $@ $< $(LIBS) $(LDFLAGS)
--- /dev/null
+#include <stdio.h>
+
+#include "xml-template.h"
+
+using namespace std;
+
+int main(int argc, char **argv)
+{
+ Substitute master_directive = {
+ make_pair("color", new Replace("blue")),
+ make_pair("#things", new Alternate { "li/class", {
+ new Substitute { make_pair("li", new Replace("Raindrops on roses")), },
+ new Substitute { make_pair("li", new Replace("Whiskers on kittens")), },
+ new Substitute { make_pair("li", new Replace("Bright copper kettles")), },
+ new Substitute { make_pair("li", new Replace("Warm, woolen mittens")), },
+ }, { "odd", "even" } }),
+ };
+
+ process_file("../xml/clone.xml", argv[1], &master_directive);
+ return(0);
+}
Clone::Clone(const vector<Directive *> &subdirectives)
: subdirectives(subdirectives) {}
-
+
+Clone::Clone(const vector<Substitute *> &subdirectives_subs)
+{
+ for (auto it : subdirectives_subs) {
+ subdirectives.push_back(static_cast<Directive *>(it));
+ }
+}
+
Clone::Clone(initializer_list<Directive *> subdirectives)
: subdirectives(subdirectives) {}
clean_node(node);
}
}
+
+Alternate::Alternate(const string &attribute,
+ const vector<Substitute *> &subdirectives_subs,
+ const vector<string> &alternatives)
+ : Clone(subdirectives_subs)
+{
+ for (unsigned ix = 0; ix < subdirectives_subs.size(); ++ix) {
+ string value = alternatives[ix % alternatives.size()];
+ subdirectives_subs[ix]->substitution_map.insert(make_pair(
+ attribute,
+ new Replace { value }));
+ }
+}
Substitute::Substitute(const unordered_map<string, Directive*> &substitution_map)
: substitution_map(substitution_map) {}
const std::string str;
};
+class Substitute;
+
class Clone : public Directive {
public:
Clone(const std::vector<Directive *> &subdirectives);
+ Clone(const std::vector<Substitute *> &subdirectives);
Clone(std::initializer_list<Directive *> subdirectives);
~Clone();
virtual void process(xmlNode *node, bool clean);
private:
- const std::vector<Directive *> subdirectives;
+ std::vector<Directive *> subdirectives;
};
class Substitute : public Directive {
virtual void process(xmlNode *node, bool clean);
private:
- const std::unordered_map<std::string, Directive*> substitution_map;
+ friend class Alternate;
+ std::unordered_map<std::string, Directive*> substitution_map;
+};
+
+class Alternate : public Clone {
+ public:
+ Alternate(const std::string &attribute,
+ const std::vector<Substitute *> &subdirectives_subs,
+ const std::vector<std::string> &alternatives);
};
void process_file(const std::string &input_filename,