1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| #include <iostream> #include <vector> #include <string> #include <initializer_list>
struct Tag { std::string name; std::string text; std::vector<Tag> children; std::vector<std::pair<std::string, std::string>> attributes;
friend std::ostream& operator<<(std::ostream& os, const Tag& tag) { os << "<" << tag.name;
for (const auto& attribute : tag.attributes) { os << " " << attribute.first << "=" << "\"" << attribute.second << "\""; }
for (const auto& child : tag.children) { os << ">" << child << "</" << child.name << ">"; }
if (!tag.text.empty()) { os << ">" << tag.text << "</" << tag.name; } else { os << "/>"; }
return os; }
protected: Tag(const std::string& name, const std::string& text) : name{name}, text{text} {} Tag(const std::string& name, const std::vector<Tag>& children) : name{name}, children{children} {} };
struct P : Tag { explicit P(const std::string& text) : Tag{"p", text} {}
P(std::initializer_list<Tag> children) : Tag("p", children) {}; };
struct IMG : Tag { explicit IMG(const std::string& url) : Tag{"img", ""} { attributes.emplace_back(std::make_pair("src", url)); } };
int main(int argc, char* argv[]) { std::cout <<
P { IMG {"http://pokemon.com/pikachu.png"} }
<< std::endl;
return 0; }
|