+my %serifFonts = (
+ # some extra serif fonts
+ "value" => SERIF,
+ "g" => qr/^gfs ?(didot)/i,
+);
+# list of regexes for known sans serif fonts
+my %sansFonts = (
+ "value" => SANS, # Sans serif
+ "a" => qr/^a(030|bydos|haroni|e?rial|ndika|ngostura|nonymous|rab|roania|rimo|rundina|sap|e almothnna|egean|egyptus|l (arabiya|battar|hor|manzomah|yarmook)|lmonte|natolian|ndale|nglepoise|njali|xaxa)/i,
+ "b" => qr/^b(abel ?stone ?modern|aekmuk|alker|altar|andal|angwool|arbatrick|aveuse|old|dxsfm|ebas|erenika|eteckna|euron|iometric|iting|lue|m ?hanna)/i,
+ "c" => qr/^c(abin|aliban|antarell|arbon|arlito|handas|harles|hilanka|hinese ?rocks|hivo|mu bright|omfortaa|omi[cx]|omputer ?(bold|(modern ?(bright ?((semi)?bold|math|oblique|roman|italic))))|oolvetica|ortoba|ountries|ousine|uprum|wtex(hei|yen)|yklop|ypro)/i,
+ "d" => qr/^(d2coding|dimnah|dosis|dyuthi)/i,
+ "e" => qr/^(electron|engebrechtre)/i,
+ "f" => qr/^(fandolhei|fetamont|fira|font awesome 5|forgotten)/i,
+ "g" => qr/^g(ardiner|aruda|fs ?neo|illius|ood ?times|ranada|raph|uanine|unplay)/i,
+ "h" => qr/^(hack|hani|haramain|harano|harmattan|hor\b)/i,
+ "i" => qr/^(ibm ?(plex ?mono|3270)|ikarius|inconsolata|induni.?h|iwona)/i,
+ "j" => qr/^j(ara|ura|s ?math.?bbold)/i,
+ "k" => qr/^(kalimati|kanji|karla|karma|kayrawan|kenyan|keraleeyam|khalid|khmer [or]|kiloji|klaudia|ko[mn]atu|kp ?mono|kurier|kustom)/i,
+ "l" => qr/^l(aksaman|arabie|ato|eague|exend|exigulim|ibel|iberation ?mono|ibre franklin|ibris|inux biolinum|obster|ogix|ohit ?(devana|telugu)|oma)/i,
+ "m" => qr/^m(\+ |anchu|anjari|arcellus|ashq|eera|etal|igmix|igu|ikachan|intspirit|iriam ?clm|isaki|itra ?mono|ona|onlam|ono(fonto|id|isome|noki)|ontserrat|otoyal|ukti|usica)/i,
+ "n" => qr/^(nachlieli|nada|nafees|nagham|nanum(barunpen|square)|nice|noto ?mono)/i,
+ "o" => qr/^(ocr|okolaks|open ?dyslexic|ostorah|ouhud|over|oxygen)/i,
+ "p" => qr/^(padauk|pagul|paktype|pakenham|palladio|petra|phetsarath|play\b|poiret|port\b|primer\b|prociono|pt\b|purisa)/i,
+ "q" => qr/^(qt(ancient|helvet|avanti|doghaus|eratype|eurotype|floraline|frank|fritz|future|greece|howard|letter|optimum)|quercus)/i,
+ "r" => qr/^(rachana|radio\b|raleway|ricty|roboto|rosario)/i,
+ "s" => qr/^(salem|samanata|sawasdee|shado|sharja|simple|sophia|soul|source|switzera)/i,
+ "t" => qr/^(tarablus|teen|texgyre(adventor|heros)|tiresias|trebuchet|tscu|tuffy)/i,
+ "u" => qr/^u(buntu|kij (bom|chechek|cjk|diwani|ekran|elipbe|inchike|jelliy|kufi|mejnuntal|qara|qolyazma|teng|title|tor|tuz ?(neqish|tom))|mpush|n ?(dinaru|jamo|graphic|taza|vada|yetgul)|ni(kurd|space|versalis)|roob|rw ?classico)/i,
+ "v" => qr/^(veranda|vn ?urwclassico)/i,
+ "w" => qr/^(waree)/i,
+ "y" => qr/^(yanone)/i,
+ "z" => qr/^(zekton|zero)/i,
+);
+my %scriptFonts = (
+ "value" => SCRIPT, # Script
+ "a" => qr/^a(becedario|ir ?cut|ugie|uriocus ?kalligraph)/i,
+ "b" => qr/^b(reip|rush ?script)/i,
+ "c" => qr/^(chancery)/i,
+ "d" => qr/^(dancing)/i,
+ "e" => qr/^(elegante)/i,
+ "f" => qr/^femkeklaver/i,
+ "j" => qr/^jsmath.?(rsfs)/i,
+ "k" => qr/^(kaushan|karumbi|kristi)/i,
+ "m" => qr/^(math ?jax.?script|miama)/i,
+ "n" => qr/^(nanum (brush|pen) script)/i,
+ "p" => qr/^pecita/i,
+ "q" => qr/^qt( ?black ?forest|arabian|boulevard|brush ?stroke|chancery|coronation|florencia|handwriting|linostroke|merry|pandora|slogan)/i,
+ "r" => qr/^((romande.*|ruf)script|rsfs)/i,
+ "t" => qr/^typo ?script/i,
+ "u" => qr/^u(n ?pilgi|rw ?chancery|kij ?(jelliy|moy|qolyazma ?(tez|yantu)))/i,
+);
+
+my %fraktFonts = (
+ "value" => FRAKTUR, # Fraktur
+ "b" => qr/^boondox ?fraktur/i,
+ "e" => qr/^eufm/i,
+ "j" => qr/^(jsmath.?euf)/i,
+ "m" => qr/^(missaali)/i,
+ "o" => qr/^(oldania)/i,
+ "q" => qr/^qt(blackforest|cloisteredmonk|dublinirish|fraktur|heidelbergtype|(lino|london) ?scroll)/i,
+ "u" => qr/^ukij ?(kufi ?tar|mejnun ?reg)/i,
+);
+
+my %fancyFonts = (
+ "value" => FANCY, # Fancy
+ "a" => qr/^a(bandoned|bberancy|driator|irmole|lmendra ?display|lmonte (snow|woodgrain)|nalecta|ni|nklepants|nn ?stone|oyagi|rt ?nouveau ?caps|stron|xaxa)/i,
+ "b" => qr/^b(aileys|alcony|altar|andal|arbatrick|aveuse|eat ?my|etsy|iometric|iting|lankenburg|oondox ?callig|org|oron|raeside|ramalea|udmo|urnstown|utterbelly)/i,
+ "c" => qr/^c(retino|msy|abin ?sketch|arbon|arolingan|harles|hicken|hilanka|hr\d)/i,
+ "d" => qr/^dseg/i,
+ "e" => qr/^electorate/i,
+ "f" => qr/^frederika/i,
+ "g" => qr/^(gfs.?theo)/i,
+ "j" => qr/^jsmath.cmsy/i,
+ "k" => qr/^keter|kicking|kredit|kouzan/i,
+ "l" => qr/^lcmsy/i,
+ "q" => qr/^qtcaslan ?open/i,
+ "u" => qr/^u(kij ?(saet|tiken)|nion ?city)/i,
+ "v" => qr/^vectroid/i,
+);
+
+my %initialFonts = (
+ "value" => INITIALS, # Initials
+ "c" => qr/^carrick/i,
+ "e" => qr/^(eb.?garamond.?init)/i,
+ "t" => qr/^typographer/i,
+ "y" => qr/^(yinit)/i,
+);
+
+my %symbolFonts = (
+ "value" => SYMBOL, # Symbol
+ "a" => qr/^a(cademicons|lblant|lianna|mar|nka|rb?\d|rchaic|rrow|rs|rt[mt]|ssy(rb\d+)?\b|miri ?quran|mit\b)/i,
+ "b" => qr/^b(aby ?jeepers|bding|euron|guq|lex|lsy|oondox ?upr|ullets|urma)/i,
+ "c" => qr/^c(aladings|cicons|hess|msy|mex|apacitor|ounterscraps)/i,
+ "d" => qr/^(dingbats|drmsym|d05)/i,
+ "e" => qr/^e(lusiveicons|mmentaler|moji|sint|uterpe)/i,
+ "f" => qr/^(fandol.?brail|fdsymbol|fourierorns|font(awesome|ello|.?mfizz))/i,
+ "g" => qr/^(gan.?clm|gfs.?(baskerville|gazis|olga|porson|solomos|(bodoni|didot).?classic|complutum))/i,
+ "h" => qr/^h(ots|ershey)/i,
+ "j" => qr/^jsmath.?(msam|cmsy|masm|msbm|wasy|cmex|stmary)/i,
+ "l" => qr/^l(cmsy|msam|ohit ?(Assamese|Bengali|Gujarati|Gurmukhi|Kannada|Malayalam|Marathi|Nepali|Odia|Tamil))/i,
+ "m" => qr/^(marvosym|material|msam|msbm)/i,
+ "n" => qr/^(noto.*(emoji|brahmi))/i,
+ "o" => qr/^(octicons)/i,
+ "p" => qr/^patch/i,
+ "q" => qr/^(qtding ?bits)/i,
+ "s" => qr/^s(emafor|kak|tmary|s?msam|tix ?math)/i,
+ "t" => qr/^(te ?xxslh?[du]|typicons|twemoji)/i,
+ "u" => qr/^ukij ?(imaret|orxun|tughra)/i,
+ "w" => qr/^w(ebdings|asy|elfare ?brat)/i,
+);
+
+my %smallcapFonts = (
+ "value" => SMALLCAP | SERIF,
+ "c" => qr/^c(s[ct]sc\d|inzel|omputer ?modern ?sans ?italic ?regular ?\d)/i,
+ "d" => qr/^drm(it)?sc\d/i,
+ "f" => qr/^fetamont.?script/i,
+ "n" => qr/^newtxb?ttsc/i,
+ "s" => qr/^(screengem|sf.?kp.?sc)/i,
+ "t" => qr/^t1?xb?ttsc/i,
+ "v" => qr/^vn ?cccsc\d/i,
+);
+