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