123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948 |
- // SiYuan - Refactor your thinking
- // Copyright (c) 2020-present, b3log.org
- //
- // This program is free software: you can redistribute it and/or modify
- // it under the terms of the GNU Affero General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- //
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU Affero General Public License for more details.
- //
- // You should have received a copy of the GNU Affero General Public License
- // along with this program. If not, see <https://www.gnu.org/licenses/>.
- package model
- import (
- "sort"
- "strings"
- )
- func extractUsedMacros(mathContent string, macrosKeys *[]string) (ret []string) {
- Next:
- for {
- for _, k := range *macrosKeys {
- if idx := strings.Index(mathContent, k); -1 < idx {
- mathContent = strings.Replace(mathContent, k, "__@"+k[1:]+"@__", 1)
- ret = append(ret, k)
- goto Next
- }
- }
- break
- }
- return
- }
- var katexSupportedFunctions = []string{ // https://katex.org/docs/supported.html
- "\\!",
- "\\\"",
- "\\#",
- "\\$",
- "\\%",
- "\\&",
- "\\'",
- "\\,",
- "\\.",
- "\\:",
- "\\;",
- "\\=",
- "\\>",
- "\\Alpha",
- "\\And",
- "\\Bbb",
- "\\Bbbk",
- "\\Beta",
- "\\Big",
- "\\Bigg",
- "\\Biggl",
- "\\Biggm",
- "\\Biggr",
- "\\Bigl",
- "\\Bigm",
- "\\Bigr",
- "\\Box",
- "\\Bra",
- "\\Braket",
- "\\Bumpeq",
- "\\Cap",
- "\\Chi",
- "\\Colonapprox",
- "\\Coloneq",
- "\\Coloneqq",
- "\\Colonsim",
- "\\Complex",
- "\\Cup",
- "\\Dagger",
- "\\Darr",
- "\\Delta",
- "\\Diamond",
- "\\Doteq",
- "\\Downarrow",
- "\\Epsilon",
- "\\Eqcolon",
- "\\Eqqcolon",
- "\\Eta",
- "\\Finv",
- "\\Game",
- "\\Gamma",
- "\\H",
- "\\Harr",
- "\\Huge AB",
- "\\Im",
- "\\Iota",
- "\\Join",
- "\\KaTeX",
- "\\Kappa",
- "\\Ket",
- "\\LARGE AB",
- "\\LaTeX",
- "\\Lambda",
- "\\Large AB",
- "\\Larr",
- "\\Leftarrow",
- "\\Leftrightarrow",
- "\\Lleftarrow",
- "\\Longleftarrow",
- "\\Longleftrightarrow",
- "\\Longrightarrow",
- "\\Lrarr",
- "\\Lsh",
- "\\Mu",
- "\\N",
- "\\Nu",
- "\\Omega",
- "\\Omicron",
- "\\Overrightarrow",
- "\\P",
- "\\Phi",
- "\\Pi",
- "\\Pr",
- "\\Psi",
- "\\R",
- "\\Rarr",
- "\\Re",
- "\\Reals",
- "\\Rho",
- "\\Rightarrow",
- "\\Rrightarrow",
- "\\Rsh",
- "\\S",
- "\\Set",
- "\\Sigma",
- "\\Subset",
- "\\Supset",
- "\\Tau",
- "\\TeX",
- "\\Theta",
- "\\Uarr",
- "\\Uparrow",
- "\\Updownarrow",
- "\\Upsilon",
- "\\Vdash",
- "\\Vert",
- "\\Vvdash",
- "\\Xi",
- "\\Z",
- "\\Zeta",
- "\\^",
- "\\_",
- "\\`",
- "\\acute",
- "\\alef",
- "\\alefsym",
- "\\aleph",
- "\\alpha",
- "\\amalg",
- "\\angle",
- "\\approx",
- "\\approxcolon",
- "\\approxcoloncolon",
- "\\approxeq",
- "\\arccos",
- "\\arcctg",
- "\\arcsin",
- "\\arctan",
- "\\arctg",
- "\\arg",
- "\\argmax",
- "\\argmin",
- "\\ast",
- "\\asymp",
- "\\backepsilon",
- "\\backprime",
- "\\backsim",
- "\\backsimeq",
- "\\backslash",
- "\\bar",
- "\\barwedge",
- "\\bcancel",
- "\\because",
- "\\begin",
- "\\beta",
- "\\beth",
- "\\between",
- "\\bf Ab0",
- "\\big",
- "\\bigcap",
- "\\bigcirc",
- "\\bigcup",
- "\\bigg",
- "\\biggl",
- "\\biggm",
- "\\biggr",
- "\\bigl",
- "\\bigm",
- "\\bigodot",
- "\\bigoplus",
- "\\bigotimes",
- "\\bigr",
- "\\bigsqcup",
- "\\bigstar",
- "\\bigtriangledown",
- "\\bigtriangleup",
- "\\biguplus",
- "\\bigvee",
- "\\bigwedge",
- "\\binom",
- "\\blacklozenge",
- "\\blacksquare",
- "\\blacktriangle",
- "\\blacktriangledown",
- "\\blacktriangleleft",
- "\\blacktriangleright",
- "\\bm",
- "\\bmod",
- "\\bold",
- "\\boldsymbol",
- "\\bot",
- "\\bowtie",
- "\\boxdot",
- "\\boxed",
- "\\boxminus",
- "\\boxplus",
- "\\boxtimes",
- "\\bra",
- "\\braket",
- "\\breve",
- "\\bullet",
- "\\bumpeq",
- "\\cal AB0",
- "\\cancel",
- "\\cap",
- "\\cdot",
- "\\cdotp",
- "\\cdots",
- "\\centerdot",
- "\\cfrac",
- "\\ch",
- "\\check",
- "\\checkmark",
- "\\chi",
- "\\circ",
- "\\circeq",
- "\\circlearrowleft",
- "\\circlearrowright",
- "\\circledR",
- "\\circledS",
- "\\circledast",
- "\\circledcirc",
- "\\circleddash",
- "\\clubs",
- "\\clubsuit",
- "\\cnums",
- "\\colon",
- "\\colonapprox",
- "\\coloncolon",
- "\\coloncolonapprox",
- "\\coloncolonequals",
- "\\coloncolonminus",
- "\\coloncolonsim",
- "\\coloneq",
- "\\coloneqq",
- "\\colonequals",
- "\\colonminus",
- "\\colonsim",
- "\\complement",
- "\\cong",
- "\\coprod",
- "\\copyright",
- "\\cos",
- "\\cosec",
- "\\cosh",
- "\\cot",
- "\\cotg",
- "\\coth",
- "\\csc",
- "\\ctg",
- "\\cth",
- "\\cup",
- "\\curlyeqprec",
- "\\curlyeqsucc",
- "\\curlyvee",
- "\\curlywedge",
- "\\curvearrowleft",
- "\\curvearrowright",
- "\\dArr",
- "\\dag",
- "\\dagger",
- "\\daleth",
- "\\darr",
- "\\dashleftarrow",
- "\\dashrightarrow",
- "\\dashv",
- "\\dbinom",
- "\\dblcolon",
- "\\ddag",
- "\\ddagger",
- "\\ddot",
- "\\ddots",
- "\\def\\arraystretch",
- "\\def\\foo",
- "\\deg",
- "\\degree",
- "\\delta",
- "\\det",
- "\\dfrac",
- "\\diagdown",
- "\\diagup",
- "\\diamond",
- "\\diamonds",
- "\\diamondsuit",
- "\\digamma",
- "\\dim",
- "\\displaystyle\\sum_",
- "\\div",
- "\\divideontimes",
- "\\dot",
- "\\doteq",
- "\\doteqdot",
- "\\dotplus",
- "\\dots",
- "\\dotsb",
- "\\dotsc",
- "\\dotsi",
- "\\dotsm",
- "\\dotso",
- "\\doublebarwedge",
- "\\doublecap",
- "\\doublecup",
- "\\downarrow",
- "\\downdownarrows",
- "\\downharpoonleft",
- "\\downharpoonright",
- "\\edef\\macroname#1#2…",
- "\\ell",
- "\\empty",
- "\\emptyset",
- "\\end",
- "\\enspace",
- "\\epsilon",
- "\\eqcirc",
- "\\eqcolon",
- "\\eqqcolon",
- "\\eqsim",
- "\\eqslantgtr",
- "\\eqslantless",
- "\\equalscolon",
- "\\equalscoloncolon",
- "\\equiv",
- "\\eta",
- "\\eth",
- "\\exist",
- "\\exists",
- "\\exp",
- "\\fallingdotseq",
- "\\flat",
- "\\footnotesize AB",
- "\\forall",
- "\\frac",
- "\\frak",
- "\\frown",
- "\\futurelet\\foo\\bar x",
- "\\gamma",
- "\\gcd",
- "\\gdef\\bar#1",
- "\\ge",
- "\\genfrac ( ] ",
- "\\geq",
- "\\geqq",
- "\\geqslant",
- "\\gets",
- "\\gg",
- "\\ggg",
- "\\gggtr",
- "\\gimel",
- "\\global\\def\\macroname#1#2…",
- "\\gnapprox",
- "\\gneq",
- "\\gneqq",
- "\\gnsim",
- "\\grave",
- "\\gt",
- "\\gtrapprox",
- "\\gtrdot",
- "\\gtreqless",
- "\\gtreqqless",
- "\\gtrless",
- "\\gtrsim",
- "\\gvertneqq",
- "\\hArr",
- "\\harr",
- "\\hat",
- "\\hbar",
- "\\hdashline",
- "\\hearts",
- "\\heartsuit",
- "\\hom",
- "\\hookleftarrow",
- "\\hookrightarrow",
- "\\hphantom",
- "\\href",
- "\\hskip",
- "\\hslash",
- "\\hspace",
- "\\hspace*",
- "\\htmlClass",
- "\\htmlData",
- "\\htmlId",
- "\\htmlStyle",
- "\\huge AB",
- "\\iff",
- "\\iiint",
- "\\iint",
- "\\image",
- "\\imageof",
- "\\imath",
- "\\impliedby",
- "\\implies",
- "\\in",
- "\\includegraphics[height=0.8em, totalheight=0.9em, width=0.9em, alt=KA logo]",
- "\\inf",
- "\\infin",
- "\\infty",
- "\\injlim",
- "\\int",
- "\\intercal",
- "\\intop",
- "\\iota",
- "\\isin",
- "\\it Ab0",
- "\\jmath",
- "\\kappa",
- "\\ker",
- "\\kern",
- "\\ket",
- "\\lArr",
- "\\lBrace \\rBrace",
- "\\lVert",
- "\\lambda",
- "\\land",
- "\\lang",
- "\\langle",
- "\\large AB",
- "\\larr",
- "\\lbrace",
- "\\lbrack",
- "\\lceil",
- "\\ldotp",
- "\\ldots",
- "\\le",
- "\\leadsto",
- "\\left",
- "\\left(x^",
- "\\left.",
- "\\leftarrow",
- "\\leftarrowtail",
- "\\leftharpoondown",
- "\\leftharpoonup",
- "\\leftleftarrows",
- "\\leftrightarrow",
- "\\leftrightarrows",
- "\\leftrightharpoons",
- "\\leftrightsquigarrow",
- "\\leftthreetimes",
- "\\leq",
- "\\leqq",
- "\\leqslant",
- "\\lessapprox",
- "\\lessdot",
- "\\lesseqgtr",
- "\\lesseqqgtr",
- "\\lessgtr",
- "\\lesssim",
- "\\let\\foo=\\bar",
- "\\lfloor",
- "\\lg",
- "\\lgroup",
- "\\lhd",
- "\\lim",
- "\\lim\\limits_x",
- "\\lim\\nolimits_x",
- "\\liminf",
- "\\limsup",
- "\\ll",
- "\\llbracket",
- "\\llcorner",
- "\\lll",
- "\\llless",
- "\\lmoustache",
- "\\ln",
- "\\lnapprox",
- "\\lneq",
- "\\lneqq",
- "\\lnot",
- "\\lnsim",
- "\\log",
- "\\longleftarrow",
- "\\longleftrightarrow",
- "\\longmapsto",
- "\\longrightarrow",
- "\\looparrowleft",
- "\\looparrowright",
- "\\lor",
- "\\lozenge",
- "\\lparen",
- "\\lq",
- "\\lrArr",
- "\\lrarr",
- "\\lrcorner",
- "\\lt",
- "\\lt \\gt",
- "\\ltimes",
- "\\lvert",
- "\\lvertneqq",
- "\\maltese",
- "\\mapsto",
- "\\mathbb",
- "\\mathbf",
- "\\mathcal",
- "\\mathellipsis",
- "\\mathfrak",
- "\\mathit",
- "\\mathnormal",
- "\\mathring",
- "\\mathrlap",
- "\\mathrm",
- "\\mathscr",
- "\\mathsf",
- "\\mathsterling",
- "\\mathstrut",
- "\\mathtt",
- "\\max",
- "\\measuredangle",
- "\\medspace",
- "\\mho",
- "\\mid",
- "\\middle",
- "\\min",
- "\\minuscolon",
- "\\minuscoloncolon",
- "\\minuso",
- "\\mkern",
- "\\models",
- "\\mp",
- "\\mskip",
- "\\mu",
- "\\multimap",
- "\\nLeftarrow",
- "\\nLeftrightarrow",
- "\\nRightarrow",
- "\\nVDash",
- "\\nVdash",
- "\\nabla",
- "\\natnums",
- "\\natural",
- "\\ncong",
- "\\ne",
- "\\nearrow",
- "\\neg",
- "\\negmedspace",
- "\\negthickspace",
- "\\negthinspace",
- "\\neq",
- "\\newcommand\\macroname[numargs]",
- "\\nexists",
- "\\ngeq",
- "\\ngeqq",
- "\\ngeqslant",
- "\\ngtr",
- "\\ni",
- "\\nleftarrow",
- "\\nleftrightarrow",
- "\\nleq",
- "\\nleqq",
- "\\nleqslant",
- "\\nless",
- "\\nmid",
- "\\nobreakspace",
- "\\nonumber",
- "\\normalsize AB",
- "\\not =",
- "\\notag",
- "\\notin",
- "\\notni",
- "\\nparallel",
- "\\nprec",
- "\\npreceq",
- "\\nrightarrow",
- "\\nshortmid",
- "\\nshortparallel",
- "\\nsim",
- "\\nsubseteq",
- "\\nsubseteqq",
- "\\nsucc",
- "\\nsucceq",
- "\\nsupseteq",
- "\\nsupseteqq",
- "\\ntriangleleft",
- "\\ntrianglelefteq",
- "\\ntriangleright",
- "\\ntrianglerighteq",
- "\\nu",
- "\\nvDash",
- "\\nvdash",
- "\\nwarrow",
- "\\odot",
- "\\oiiint",
- "\\oiint",
- "\\oint",
- "\\omega",
- "\\omicron",
- "\\ominus",
- "\\operatorname",
- "\\operatorname*",
- "\\operatornamewithlimits",
- "\\oplus",
- "\\origof",
- "\\oslash",
- "\\otimes",
- "\\overbrace",
- "\\overgroup",
- "\\overleftarrow",
- "\\overleftharpoon",
- "\\overleftrightarrow",
- "\\overline",
- "\\overlinesegment",
- "\\overrightarrow",
- "\\overrightharpoon",
- "\\overset",
- "\\owns",
- "\\parallel",
- "\\partial",
- "\\perp",
- "\\phantom",
- "\\phase",
- "\\phi",
- "\\pi",
- "\\pitchfork",
- "\\plim",
- "\\plusmn",
- "\\pm",
- "\\pounds",
- "\\prec",
- "\\precapprox",
- "\\preccurlyeq",
- "\\preceq",
- "\\precnapprox",
- "\\precneqq",
- "\\precnsim",
- "\\precsim",
- "\\prime",
- "\\prod",
- "\\projlim",
- "\\propto",
- "\\providecommand\\macroname[numargs]",
- "\\psi",
- "\\qquad",
- "\\quad",
- "\\r",
- "\\rArr",
- "\\rVert",
- "\\rang",
- "\\rangle",
- "\\rarr",
- "\\ratio",
- "\\rbrace",
- "\\rbrack",
- "\\rceil",
- "\\real",
- "\\reals",
- "\\renewcommand\\macroname[numargs]",
- "\\restriction",
- "\\rfloor",
- "\\rgroup",
- "\\rhd",
- "\\rho",
- "\\right",
- "\\right.",
- "\\rightarrow",
- "\\rightarrowtail",
- "\\rightharpoondown",
- "\\rightharpoonup",
- "\\rightleftarrows",
- "\\rightleftharpoons",
- "\\rightrightarrows",
- "\\rightsquigarrow",
- "\\rightthreetimes",
- "\\risingdotseq",
- "\\rm Ab0",
- "\\rmoustache",
- "\\rparen",
- "\\rq",
- "\\rrbracket",
- "\\rtimes",
- "\\rvert",
- "\\scriptscriptstyle x",
- "\\scriptsize AB",
- "\\scriptstyle x",
- "\\sdot",
- "\\searrow",
- "\\sec",
- "\\set",
- "\\setminus",
- "\\sf Ab0",
- "\\sh",
- "\\sharp",
- "\\shortmid",
- "\\shortparallel",
- "\\sigma",
- "\\sim",
- "\\simcolon",
- "\\simcoloncolon",
- "\\simeq",
- "\\sin",
- "\\sinh",
- "\\small AB",
- "\\smallfrown",
- "\\smallint",
- "\\smallsetminus",
- "\\smallsmile",
- "\\smile",
- "\\sout",
- "\\space",
- "\\spades",
- "\\spadesuit",
- "\\sphericalangle",
- "\\sqcap",
- "\\sqcup",
- "\\sqrt",
- "\\sqsubset",
- "\\sqsubseteq",
- "\\sqsupset",
- "\\sqsupseteq",
- "\\square",
- "\\stackrel",
- "\\star",
- "\\sub",
- "\\sube",
- "\\subset",
- "\\subseteq",
- "\\subseteqq",
- "\\subsetneq",
- "\\subsetneqq",
- "\\succ",
- "\\succapprox",
- "\\succcurlyeq",
- "\\succeq",
- "\\succnapprox",
- "\\succneqq",
- "\\succnsim",
- "\\succsim",
- "\\sum",
- "\\sum_",
- "\\sup",
- "\\supe",
- "\\supset",
- "\\supseteq",
- "\\supseteqq",
- "\\supsetneq",
- "\\supsetneqq",
- "\\surd",
- "\\swarrow",
- "\\tan",
- "\\tanh",
- "\\tau",
- "\\tbinom",
- "\\text",
- "\\textbf",
- "\\textit",
- "\\textmd",
- "\\textnormal",
- "\\textrm",
- "\\textsf",
- "\\textstyle\\sum_",
- "\\texttt",
- "\\textup",
- "\\tfrac",
- "\\tg",
- "\\th",
- "\\therefore",
- "\\theta",
- "\\thetasym",
- "\\thickapprox",
- "\\thicksim",
- "\\thickspace",
- "\\thinspace",
- "\\tilde",
- "\\times",
- "\\tiny AB",
- "\\to",
- "\\top",
- "\\triangle",
- "\\triangledown",
- "\\triangleleft",
- "\\trianglelefteq",
- "\\triangleq",
- "\\triangleright",
- "\\trianglerighteq",
- "\\tt Ab0",
- "\\twoheadleftarrow",
- "\\twoheadrightarrow",
- "\\u",
- "\\uArr",
- "\\uarr",
- "\\ulcorner",
- "\\underbar",
- "\\underbrace",
- "\\undergroup",
- "\\underleftarrow",
- "\\underleftrightarrow",
- "\\underline",
- "\\underlinesegment",
- "\\underrightarrow",
- "\\underset",
- "\\unlhd",
- "\\unrhd",
- "\\uparrow",
- "\\updownarrow",
- "\\upharpoonleft",
- "\\upharpoonright",
- "\\uplus",
- "\\upsilon",
- "\\upuparrows",
- "\\urcorner",
- "\\url",
- "\\utilde",
- "\\v",
- "\\vDash",
- "\\varDelta",
- "\\varGamma",
- "\\varLambda",
- "\\varOmega",
- "\\varPhi",
- "\\varPi",
- "\\varPsi",
- "\\varSigma",
- "\\varTheta",
- "\\varUpsilon",
- "\\varXi",
- "\\varepsilon",
- "\\varinjlim",
- "\\varkappa",
- "\\varliminf",
- "\\varlimsup",
- "\\varnothing",
- "\\varphi",
- "\\varpi",
- "\\varprojlim",
- "\\varpropto",
- "\\varrho",
- "\\varsigma",
- "\\varsubsetneq",
- "\\varsubsetneqq",
- "\\varsupsetneq",
- "\\varsupsetneqq",
- "\\vartheta",
- "\\vartriangle",
- "\\vartriangleleft",
- "\\vartriangleright",
- "\\vcentcolon",
- "\\vdash",
- "\\vdots",
- "\\vec",
- "\\vee",
- "\\veebar",
- "\\verb!x^2!",
- "\\vert",
- "\\vphantom",
- "\\wedge",
- "\\weierp",
- "\\widecheck",
- "\\widehat",
- "\\widetilde",
- "\\wp",
- "\\wr",
- "\\xLeftarrow",
- "\\xLeftrightarrow",
- "\\xRightarrow",
- "\\xcancel",
- "\\xdef\\macroname#1#2…",
- "\\xhookleftarrow",
- "\\xhookrightarrow",
- "\\xi",
- "\\xleftarrow",
- "\\xleftharpoondown",
- "\\xleftharpoonup",
- "\\xleftrightarrow",
- "\\xleftrightharpoons",
- "\\xlongequal",
- "\\xmapsto",
- "\\xrightarrow[under]",
- "\\xrightharpoondown",
- "\\xrightharpoonup",
- "\\xrightleftharpoons",
- "\\xtofrom",
- "\\xtwoheadleftarrow",
- "\\xtwoheadrightarrow",
- "\\yen",
- "\\zeta",
- "\\|",
- "\\~",
- }
- func init() {
- sort.Slice(katexSupportedFunctions, func(i, j int) bool { return len(katexSupportedFunctions[i]) > len(katexSupportedFunctions[j]) })
- }
- func resolveKaTexMacro(macroName string, macros *map[string]string, keys *[]string) string {
- v := (*macros)[macroName]
- sort.Slice(*keys, func(i, j int) bool { return len((*keys)[i]) > len((*keys)[j]) })
- for _, k := range *keys {
- escaped := escapeKaTexSupportedFunctions(v)
- if strings.Contains(escaped, k) {
- escaped = strings.ReplaceAll(escaped, k, resolveKaTexMacro(k, macros, keys))
- v = unescapeKaTexSupportedFunctions(escaped)
- (*macros)[macroName] = v
- }
- }
- return v
- }
- func escapeKaTexSupportedFunctions(macroVal string) string {
- Next:
- for {
- for _, f := range katexSupportedFunctions {
- if idx := strings.Index(macroVal, f); -1 < idx {
- macroVal = strings.Replace(macroVal, f, "__@"+f[1:]+"@__", 1)
- goto Next
- }
- }
- break
- }
- return macroVal
- }
- func unescapeKaTexSupportedFunctions(macroVal string) string {
- if !strings.Contains(macroVal, "__@") {
- return macroVal
- }
- for _, f := range katexSupportedFunctions {
- macroVal = strings.ReplaceAll(macroVal, "__@"+f[1:]+"@__", f)
- }
- return macroVal
- }
|