Add missing tag, resolve_tag now returns the proper closing tag as well,

for convenience.
This commit is contained in:
Jacob 2024-05-15 23:33:17 +02:00
parent 247b2cbf37
commit 6d7cb9af86
2 changed files with 158 additions and 150 deletions

View file

@ -115,6 +115,7 @@ namespace docpp {
ELEMENT_H5,
ELEMENT_H6,
ELEMENT_HGROUP,
ELEMENT_HR,
ELEMENT_HTML,
ELEMENT_IFRAME,
ELEMENT_IMAGE,
@ -477,7 +478,7 @@ namespace docpp {
* @param properties The properties of the element
* @param data The data of the element
*/
Element(const Tag tag, const Properties& properties = {}, const std::string& data = {}, const Type = TYPE_NON_SELF_CLOSING);
Element(const Tag tag, const Properties& properties = {}, const std::string& data = {});
/**
* @brief Construct a new Element object
*/
@ -825,10 +826,11 @@ namespace docpp {
};
/**
* @brief Resolve a tag.
* @brief Resolve a tag to a string and type.
* @param tag The tag to resolve
* @return std::pair<std::string, Type> The resolved tag
*/
template <typename T> T resolve_tag(const Tag tag);
std::pair<std::string, Type> resolve_tag(const Tag tag);
} // namespace HTML
/**

View file

@ -180,8 +180,12 @@ docpp::HTML::Element::Element(const std::string& tag, const Properties& properti
this->set(tag, properties, data, type);
}
docpp::HTML::Element::Element(const Tag tag, const Properties& properties, const std::string& data, const Type type) {
this->set(resolve_tag<std::string>(tag), properties, data, type);
docpp::HTML::Element::Element(const Tag tag, const Properties& properties, const std::string& data) {
std::pair<std::string, Type> map = resolve_tag(tag);
this->tag = map.first;
this->type = map.second;
this->properties = properties;
}
docpp::HTML::Element docpp::HTML::Element::operator=(const docpp::HTML::Element& element) {
@ -301,150 +305,152 @@ void docpp::HTML::Section::set(const std::string& tag, const Properties& propert
this->properties = properties;
}
template <typename T> T docpp::HTML::resolve_tag(const Tag tag) {
static const std::unordered_map<const Tag, const std::string> tag_map{
{ELEMENT_EMPTY, ""},
{ELEMENT_ABBREVIATION, "abbr"},
{ELEMENT_ABBR, "abbr"},
{ELEMENT_ACRONYM, "acronym"},
{ELEMENT_ADDRESS, "address"},
{ELEMENT_APPLET, "applet"},
{ELEMENT_ANCHOR, "a"},
{ELEMENT_A, "a"},
{ELEMENT_ARTICLE, "article"},
{ELEMENT_AREA, "area"},
{ELEMENT_ASIDE, "aside"},
{ELEMENT_AUDIO, "audio"},
{ELEMENT_BASE, "base"},
{ELEMENT_BASEFONT, "basefont"},
{ELEMENT_BDI, "bdi"},
{ELEMENT_BDO, "bdo"},
{ELEMENT_BGSOUND, "bgsound"},
{ELEMENT_BIG, "big"},
{ELEMENT_BLOCKQUOTE, "blockquote"},
{ELEMENT_BODY, "body"},
{ELEMENT_B, "b"},
{ELEMENT_BOLD, "b"},
{ELEMENT_BR, "br"},
{ELEMENT_BREAK, "br"},
{ELEMENT_BUTTON, "button"},
{ELEMENT_CAPTION, "caption"},
{ELEMENT_CANVAS, "canvas"},
{ELEMENT_CENTER, "center"},
{ELEMENT_CITE, "cite"},
{ELEMENT_CODE, "code"},
{ELEMENT_COLGROUP, "colgroup"},
{ELEMENT_COLUMN, "col"},
{ELEMENT_COL, "col"},
{ELEMENT_DATA, "data"},
{ELEMENT_DATALIST, "datalist"},
{ELEMENT_DD, "dd"},
{ELEMENT_DFN, "dfn"},
{ELEMENT_DEFINE, "dfn"},
{ELEMENT_DELETE, "del"},
{ELEMENT_DEL, "del"},
{ELEMENT_DETAILS, "details"},
{ELEMENT_DIALOG, "dialog"},
{ELEMENT_DIR, "dir"},
{ELEMENT_DIV, "div"},
{ELEMENT_DL, "dl"},
{ELEMENT_DT, "dt"},
{ELEMENT_EMBED, "embed"},
{ELEMENT_FIELDSET, "fieldset"},
{ELEMENT_FIGCAPTION, "figcaption"},
{ELEMENT_FIGURE, "figure"},
{ELEMENT_FONT, "font"},
{ELEMENT_FOOTER, "footer"},
{ELEMENT_FORM, "form"},
{ELEMENT_FRAME, "frame"},
{ELEMENT_FRAMESET, "frameset"},
{ELEMENT_HEAD, "head"},
{ELEMENT_HEADER, "header"},
{ELEMENT_H1, "h1"},
{ELEMENT_H2, "h2"},
{ELEMENT_H3, "h3"},
{ELEMENT_H4, "h4"},
{ELEMENT_H5, "h5"},
{ELEMENT_H6, "h6"},
{ELEMENT_HGROUP, "hgroup"},
{ELEMENT_HTML, "html"},
{ELEMENT_IFRAME, "iframe"},
{ELEMENT_IMAGE, "img"},
{ELEMENT_IMG, "img"},
{ELEMENT_INPUT, "input"},
{ELEMENT_INS, "ins"},
{ELEMENT_ISINDEX, "isindex"},
{ELEMENT_ITALIC, "i"},
{ELEMENT_I, "i"},
{ELEMENT_KBD, "kbd"},
{ELEMENT_KEYGEN, "keygen"},
{ELEMENT_LABEL, "label"},
{ELEMENT_LEGEND, "legend"},
{ELEMENT_LIST, "li"},
{ELEMENT_LI, "li"},
{ELEMENT_LINK, "link"},
{ELEMENT_MAIN, "main"},
{ELEMENT_MARK, "mark"},
{ELEMENT_MARQUEE, "marquee"},
{ELEMENT_MENUITEM, "menuitem"},
{ELEMENT_META, "meta"},
{ELEMENT_METER, "meter"},
{ELEMENT_NAV, "nav"},
{ELEMENT_NOBREAK, "nobr"},
{ELEMENT_NOBR, "nobr"},
{ELEMENT_NOEMBED, "noembed"},
{ELEMENT_NOSCRIPT, "noscript"},
{ELEMENT_OBJECT, "object"},
{ELEMENT_OPTGROUP, "optgroup"},
{ELEMENT_OPTION, "option"},
{ELEMENT_OUTPUT, "output"},
{ELEMENT_PARAGRAPH, "p"},
{ELEMENT_P, "p"},
{ELEMENT_PARAM, "param"},
{ELEMENT_PHRASE, "phrase"},
{ELEMENT_PRE, "pre"},
{ELEMENT_PROGRESS, "progress"},
{ELEMENT_QUOTE, "q"},
{ELEMENT_Q, "q"},
{ELEMENT_RP, "rp"},
{ELEMENT_RT, "rt"},
{ELEMENT_RUBY, "ruby"},
{ELEMENT_OUTDATED, "s"},
{ELEMENT_S, "s"},
{ELEMENT_SAMPLE, "samp"},
{ELEMENT_SAMP, "samp"},
{ELEMENT_SCRIPT, "script"},
{ELEMENT_SECTION, "section"},
{ELEMENT_SMALL, "small"},
{ELEMENT_SOURCE, "source"},
{ELEMENT_SPACER, "spacer"},
{ELEMENT_SPAN, "span"},
{ELEMENT_STRIKE, "strike"},
{ELEMENT_STRONG, "strong"},
{ELEMENT_STYLE, "style"},
{ELEMENT_SUB, "sub"},
{ELEMENT_SUBSCRIPT, "sub"},
{ELEMENT_SUP, "sup"},
{ELEMENT_SUPERSCRIPT, "sup"},
{ELEMENT_SUMMARY, "summary"},
{ELEMENT_SVG, "svg"},
{ELEMENT_TABLE, "table"},
{ELEMENT_TBODY, "tbody"},
{ELEMENT_TD, "td"},
{ELEMENT_TEMPLATE, "template"},
{ELEMENT_TFOOT, "tfoot"},
{ELEMENT_TH, "th"},
{ELEMENT_THEAD, "thead"},
{ELEMENT_TIME, "time"},
{ELEMENT_TITLE, "title"},
{ELEMENT_TRACK, "track"},
{ELEMENT_TT, "tt"},
{ELEMENT_UNDERLINE, "u"},
{ELEMENT_U, "u"},
{ELEMENT_VAR, "var"},
{ELEMENT_VIDEO, "video"},
{ELEMENT_WBR, "wbr"},
{ELEMENT_XMP, "xmp"},
std::pair<std::string, docpp::HTML::Type> docpp::HTML::resolve_tag(const Tag tag) {
std::unordered_map<Tag, std::pair<std::string, docpp::HTML::Type>> tag_map{
{ELEMENT_EMPTY, {"", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_ABBREVIATION, {"abbr", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_ABBR, {"abbr", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_ACRONYM, {"acronym", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_ADDRESS, {"address", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_APPLET, {"applet", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_ANCHOR, {"a", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_A, {"a", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_ARTICLE, {"article", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_AREA, {"area", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_ASIDE, {"aside", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_AUDIO, {"audio", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_BASE, {"base", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_BASEFONT, {"basefont", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_BDI, {"bdi", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_BDO, {"bdo", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_BGSOUND, {"bgsound", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_BIG, {"big", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_BLOCKQUOTE, {"blockquote", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_BODY, {"body", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_B, {"b", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_BOLD, {"b", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_BR, {"br", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_BREAK, {"br", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_BUTTON, {"button", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_CAPTION, {"caption", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_CANVAS, {"canvas", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_CENTER, {"center", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_CITE, {"cite", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_CODE, {"code", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_COLGROUP, {"colgroup", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_COLUMN, {"col", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_COL, {"col", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_DATA, {"data", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_DATALIST, {"datalist", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_DD, {"dd", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_DFN, {"dfn", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_DEFINE, {"dfn", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_DELETE, {"del", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_DEL, {"del", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_DETAILS, {"details", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_DIALOG, {"dialog", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_DIR, {"dir", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_DIV, {"div", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_DL, {"dl", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_DT, {"dt", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_EMBED, {"embed", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_FIELDSET, {"fieldset", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_FIGCAPTION, {"figcaption", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_FIGURE, {"figure", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_FONT, {"font", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_FOOTER, {"footer", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_FORM, {"form", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_FRAME, {"frame", docpp::HTML::TYPE_SELF_CLOSING}},
{ELEMENT_FRAMESET, {"frameset", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_HEAD, {"head", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_HEADER, {"header", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_H1, {"h1", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_H2, {"h2", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_H3, {"h3", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_H4, {"h4", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_H5, {"h5", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_H6, {"h6", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_HR, {"hr", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_HGROUP, {"hgroup", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_HTML, {"html", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_IFRAME, {"iframe", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_IMAGE, {"img", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_IMG, {"img", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_INPUT, {"input", docpp::HTML::TYPE_SELF_CLOSING}},
{ELEMENT_INS, {"ins", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_ISINDEX, {"isindex", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_ITALIC, {"i", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_I, {"i", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_KBD, {"kbd", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_KEYGEN, {"keygen", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_LABEL, {"label", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_LEGEND, {"legend", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_LIST, {"li", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_LI, {"li", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_LINK, {"link", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_MAIN, {"main", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_MARK, {"mark", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_MARQUEE, {"marquee", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_MENUITEM, {"menuitem", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_META, {"meta", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_METER, {"meter", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_NAV, {"nav", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_NOBREAK, {"nobr", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_NOBR, {"nobr", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_NOEMBED, {"noembed", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_NOSCRIPT, {"noscript", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_OBJECT, {"object", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_OPTGROUP, {"optgroup", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_OPTION, {"option", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_OUTPUT, {"output", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_PARAGRAPH, {"p", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_P, {"p", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_PARAM, {"param", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_PHRASE, {"phrase", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_PRE, {"pre", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_PROGRESS, {"progress", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_QUOTE, {"q", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_Q, {"q", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_RP, {"rp", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_RT, {"rt", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_RUBY, {"ruby", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_OUTDATED, {"s", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_S, {"s", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_SAMPLE, {"samp", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_SAMP, {"samp", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_SCRIPT, {"script", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_SECTION, {"section", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_SMALL, {"small", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_SOURCE, {"source", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_SPACER, {"spacer", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_SPAN, {"span", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_STRIKE, {"strike", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_STRONG, {"strong", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_STYLE, {"style", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_SUB, {"sub", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_SUBSCRIPT, {"sub", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_SUP, {"sup", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_SUPERSCRIPT, {"sup", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_SUMMARY, {"summary", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_SVG, {"svg", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_TABLE, {"table", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_TBODY, {"tbody", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_TD, {"td", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_TEMPLATE, {"template", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_TFOOT, {"tfoot", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_TH, {"th", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_THEAD, {"thead", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_TIME, {"time", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_TITLE, {"title", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_TRACK, {"track", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_TT, {"tt", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_UNDERLINE, {"u", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_U, {"u", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_VAR, {"var", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_VIDEO, {"video", docpp::HTML::TYPE_NON_SELF_CLOSING}},
{ELEMENT_WBR, {"wbr", docpp::HTML::TYPE_NON_CLOSED}},
{ELEMENT_XMP, {"xmp", docpp::HTML::TYPE_NON_SELF_CLOSING}},
};
if (tag_map.find(tag) != tag_map.end()) {
@ -457,7 +463,7 @@ template <typename T> T docpp::HTML::resolve_tag(const Tag tag) {
}
void docpp::HTML::Section::set(const Tag tag, const Properties& properties) {
this->tag = resolve_tag<std::string>(tag);
this->tag = resolve_tag(tag).first;
this->properties = properties;
}