Replace case statement with a static const std::unordered_map.

This commit is contained in:
Jacob 2024-05-15 17:36:47 +02:00
parent fa107fcb64
commit c4034adcea

View file

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