From 1912af04e38e7972c47d0c3b875d7769e01cb949 Mon Sep 17 00:00:00 2001 From: Evan You Date: Sat, 18 Nov 2023 21:39:31 +0800 Subject: [PATCH] wip: entities parsing in browser --- packages/compiler-core/src/options.ts | 3 +- .../compiler-core/src/parser/Tokenizer.ts | 114 +- packages/compiler-core/src/parser/index.ts | 49 +- packages/compiler-dom/src/decodeHtml.ts | 133 - packages/compiler-dom/src/namedChars.json | 2233 ----------------- packages/compiler-dom/src/parserOptions.ts | 3 +- rollup.config.js | 7 +- 7 files changed, 103 insertions(+), 2439 deletions(-) delete mode 100644 packages/compiler-dom/src/decodeHtml.ts delete mode 100644 packages/compiler-dom/src/namedChars.json diff --git a/packages/compiler-core/src/options.ts b/packages/compiler-core/src/options.ts index 491d1eafa..a85842754 100644 --- a/packages/compiler-core/src/options.ts +++ b/packages/compiler-core/src/options.ts @@ -50,7 +50,8 @@ export interface ParserOptions */ whitespace?: 'preserve' | 'condense' /** - * Only needed for DOM compilers + * Only used for DOM compilers that runs in the browser. + * In non-browser builds, this option is ignored. */ decodeEntities?: (rawText: string, asAttr: boolean) => string /** diff --git a/packages/compiler-core/src/parser/Tokenizer.ts b/packages/compiler-core/src/parser/Tokenizer.ts index 536de3a61..2c128a670 100644 --- a/packages/compiler-core/src/parser/Tokenizer.ts +++ b/packages/compiler-core/src/parser/Tokenizer.ts @@ -22,12 +22,20 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +import { ElementNode, Position } from '../ast' + +/** + * Note: entities is a non-browser-build-only dependency. + * In the browser, we use an HTML element to do the decoding. + * Make sure all imports from entities are only used in non-browser branches + * so that it can be properly treeshaken. + */ import { EntityDecoder, DecodingMode, - htmlDecodeTree + htmlDecodeTree, + fromCodePoint } from 'entities/lib/decode.js' -import { ElementNode, Position } from '../ast' export const enum ParseMode { BASE, @@ -170,7 +178,7 @@ export enum QuoteType { export interface Callbacks { ontext(start: number, endIndex: number): void - ontextentity(codepoint: number, endIndex: number): void + ontextentity(char: string, endIndex: number): void oninterpolation(start: number, endIndex: number): void @@ -180,7 +188,7 @@ export interface Callbacks { onclosetag(start: number, endIndex: number): void onattribdata(start: number, endIndex: number): void - onattribentity(codepoint: number): void + onattribentity(char: string): void onattribend(quote: QuoteType, endIndex: number): void onattribname(start: number, endIndex: number): void onattribnameend(endIndex: number): void @@ -233,15 +241,17 @@ export default class Tokenizer { /** Reocrd newline positions for fast line / column calculation */ private newlines: number[] = [] - private readonly entityDecoder: EntityDecoder + private readonly entityDecoder?: EntityDecoder constructor( private readonly stack: ElementNode[], private readonly cbs: Callbacks ) { - this.entityDecoder = new EntityDecoder(htmlDecodeTree, (cp, consumed) => - this.emitCodePoint(cp, consumed) - ) + if (!__BROWSER__) { + this.entityDecoder = new EntityDecoder(htmlDecodeTree, (cp, consumed) => + this.emitCodePoint(cp, consumed) + ) + } } public mode = ParseMode.BASE @@ -290,7 +300,7 @@ export default class Tokenizer { } this.state = State.BeforeTagName this.sectionStart = this.index - } else if (c === CharCodes.Amp) { + } else if (!__BROWSER__ && c === CharCodes.Amp) { this.startEntity() } else if (c === this.delimiterOpen[0]) { this.state = State.InterpolationOpen @@ -398,7 +408,7 @@ export default class Tokenizer { !(this.mode === ParseMode.SFC && this.stack.length === 0)) ) { // We have to parse entities in and <textarea> tags. - if (c === CharCodes.Amp) { + if (!__BROWSER__ && c === CharCodes.Amp) { this.startEntity() } } else if (this.fastForwardTo(CharCodes.Lt)) { @@ -702,7 +712,7 @@ export default class Tokenizer { } } private handleInAttributeValue(c: number, quote: number) { - if (c === quote) { + if (c === quote || (__BROWSER__ && this.fastForwardTo(quote))) { this.cbs.onattribdata(this.sectionStart, this.index) this.sectionStart = -1 this.cbs.onattribend( @@ -710,7 +720,7 @@ export default class Tokenizer { this.index + 1 ) this.state = State.BeforeAttributeName - } else if (c === CharCodes.Amp) { + } else if (!__BROWSER__ && c === CharCodes.Amp) { this.startEntity() } } @@ -727,7 +737,7 @@ export default class Tokenizer { this.cbs.onattribend(QuoteType.Unquoted, this.index) this.state = State.BeforeAttributeName this.stateBeforeAttributeName(c) - } else if (c === CharCodes.Amp) { + } else if (!__BROWSER__ && c === CharCodes.Amp) { this.startEntity() } } @@ -796,29 +806,33 @@ export default class Tokenizer { } private startEntity() { - this.baseState = this.state - this.state = State.InEntity - this.entityStart = this.index - this.entityDecoder.startEntity( - this.baseState === State.Text || this.baseState === State.InSpecialTag - ? DecodingMode.Legacy - : DecodingMode.Attribute - ) + if (!__BROWSER__) { + this.baseState = this.state + this.state = State.InEntity + this.entityStart = this.index + this.entityDecoder!.startEntity( + this.baseState === State.Text || this.baseState === State.InSpecialTag + ? DecodingMode.Legacy + : DecodingMode.Attribute + ) + } } private stateInEntity(): void { - const length = this.entityDecoder.write(this.buffer, this.index) + if (!__BROWSER__) { + const length = this.entityDecoder!.write(this.buffer, this.index) - // If `length` is positive, we are done with the entity. - if (length >= 0) { - this.state = this.baseState + // If `length` is positive, we are done with the entity. + if (length >= 0) { + this.state = this.baseState - if (length === 0) { - this.index = this.entityStart + if (length === 0) { + this.index = this.entityStart + } + } else { + // Mark buffer as consumed. + this.index = this.buffer.length - 1 } - } else { - // Mark buffer as consumed. - this.index = this.buffer.length - 1 } } @@ -1002,8 +1016,8 @@ export default class Tokenizer { } private finish() { - if (this.state === State.InEntity) { - this.entityDecoder.end() + if (!__BROWSER__ && this.state === State.InEntity) { + this.entityDecoder!.end() this.state = this.baseState } @@ -1052,25 +1066,27 @@ export default class Tokenizer { } private emitCodePoint(cp: number, consumed: number): void { - if ( - this.baseState !== State.Text && - this.baseState !== State.InSpecialTag - ) { - if (this.sectionStart < this.entityStart) { - this.cbs.onattribdata(this.sectionStart, this.entityStart) - } - this.sectionStart = this.entityStart + consumed - this.index = this.sectionStart - 1 + if (!__BROWSER__) { + if ( + this.baseState !== State.Text && + this.baseState !== State.InSpecialTag + ) { + if (this.sectionStart < this.entityStart) { + this.cbs.onattribdata(this.sectionStart, this.entityStart) + } + this.sectionStart = this.entityStart + consumed + this.index = this.sectionStart - 1 - this.cbs.onattribentity(cp) - } else { - if (this.sectionStart < this.entityStart) { - this.cbs.ontext(this.sectionStart, this.entityStart) - } - this.sectionStart = this.entityStart + consumed - this.index = this.sectionStart - 1 + this.cbs.onattribentity(fromCodePoint(cp)) + } else { + if (this.sectionStart < this.entityStart) { + this.cbs.ontext(this.sectionStart, this.entityStart) + } + this.sectionStart = this.entityStart + consumed + this.index = this.sectionStart - 1 - this.cbs.ontextentity(cp, this.sectionStart) + this.cbs.ontextentity(fromCodePoint(cp), this.sectionStart) + } } } } diff --git a/packages/compiler-core/src/parser/index.ts b/packages/compiler-core/src/parser/index.ts index cb8e26ab4..858c4aaff 100644 --- a/packages/compiler-core/src/parser/index.ts +++ b/packages/compiler-core/src/parser/index.ts @@ -1,4 +1,3 @@ -import { fromCodePoint } from 'entities/lib/decode.js' import { AttributeNode, ConstantTypes, @@ -29,6 +28,7 @@ import { defaultOnError, defaultOnWarn } from '../errors' import { forAliasRE, isCoreComponent } from '../utils' type OptionalOptions = + | 'decodeEntities' | 'whitespace' | 'isNativeTag' | 'isBuiltInComponent' @@ -37,18 +37,6 @@ type OptionalOptions = type MergedParserOptions = Omit<Required<ParserOptions>, OptionalOptions> & Pick<ParserOptions, OptionalOptions> -// The default decoder only provides escapes for characters reserved as part of -// the template syntax, and is only used if the custom renderer did not provide -// a platform-specific decoder. -const decodeRE = /&(gt|lt|amp|apos|quot);/g -const decodeMap: Record<string, string> = { - gt: '>', - lt: '<', - amp: '&', - apos: "'", - quot: '"' -} - export const defaultParserOptions: MergedParserOptions = { parseMode: 'base', delimiters: [`{{`, `}}`], @@ -56,9 +44,6 @@ export const defaultParserOptions: MergedParserOptions = { isVoidTag: NO, isPreTag: NO, isCustomElement: NO, - // TODO handle entities - decodeEntities: (rawText: string): string => - rawText.replace(decodeRE, (_, p1) => decodeMap[p1]), onError: defaultOnError, onWarn: defaultOnWarn, comments: __DEV__ @@ -84,8 +69,8 @@ const tokenizer = new Tokenizer(stack, { onText(getSlice(start, end), start, end) }, - ontextentity(cp, end) { - onText(fromCodePoint(cp), end - 1, end) + ontextentity(char, end) { + onText(char, end - 1, end) }, oninterpolation(start, end) { @@ -242,8 +227,8 @@ const tokenizer = new Tokenizer(stack, { currentAttrEndIndex = end }, - onattribentity(codepoint) { - currentAttrValue += fromCodePoint(codepoint) + onattribentity(char) { + currentAttrValue += char }, onattribnameend(end) { @@ -265,6 +250,13 @@ const tokenizer = new Tokenizer(stack, { onattribend(quote, end) { if (currentElement && currentProp) { if (quote !== QuoteType.NoValue) { + if (__BROWSER__ && currentAttrValue.includes('&')) { + // TODO should not do this in <script> or <style> + currentAttrValue = currentOptions.decodeEntities!( + currentAttrValue, + true + ) + } if (currentProp.type === NodeTypes.ATTRIBUTE) { // assign value @@ -422,6 +414,10 @@ function closeCurrentTag(end: number) { } function onText(content: string, start: number, end: number) { + if (__BROWSER__ && content.includes('&')) { + // TODO do not do this in <script> or <style> + content = currentOptions.decodeEntities!(content, false) + } const parent = getParent() const lastNode = parent.children[parent.children.length - 1] if (lastNode?.type === NodeTypes.TEXT) { @@ -697,6 +693,19 @@ export function baseParse(input: string, options?: ParserOptions): RootNode { currentInput = input currentOptions = extend({}, defaultParserOptions, options) + if (__DEV__) { + if (!__BROWSER__ && currentOptions.decodeEntities) { + console.warn( + `[@vue/compiler-core] decodeEntities option is passed but will be ` + + `ignored in non-browser builds.` + ) + } else if (__BROWSER__ && !currentOptions.decodeEntities) { + throw new Error( + `[@vue/compiler-core] decodeEntities option is required in browser builds.` + ) + } + } + tokenizer.mode = currentOptions.parseMode === 'html' ? ParseMode.HTML diff --git a/packages/compiler-dom/src/decodeHtml.ts b/packages/compiler-dom/src/decodeHtml.ts deleted file mode 100644 index 68b0277a4..000000000 --- a/packages/compiler-dom/src/decodeHtml.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { ParserOptions } from '@vue/compiler-core' -import namedCharacterReferences from './namedChars.json' - -// lazy compute this to make this file tree-shakable for browser -let maxCRNameLength: number - -export const decodeHtml: ParserOptions['decodeEntities'] = ( - rawText, - asAttr -) => { - let offset = 0 - const end = rawText.length - let decodedText = '' - - function advance(length: number) { - offset += length - rawText = rawText.slice(length) - } - - while (offset < end) { - const head = /&(?:#x?)?/i.exec(rawText) - if (!head || offset + head.index >= end) { - const remaining = end - offset - decodedText += rawText.slice(0, remaining) - advance(remaining) - break - } - - // Advance to the "&". - decodedText += rawText.slice(0, head.index) - advance(head.index) - - if (head[0] === '&') { - // Named character reference. - let name = '' - let value: string | undefined = undefined - if (/[0-9a-z]/i.test(rawText[1])) { - if (!maxCRNameLength) { - maxCRNameLength = Object.keys(namedCharacterReferences).reduce( - (max, name) => Math.max(max, name.length), - 0 - ) - } - for (let length = maxCRNameLength; !value && length > 0; --length) { - name = rawText.slice(1, 1 + length) - value = (namedCharacterReferences as Record<string, string>)[name] - } - if (value) { - const semi = name.endsWith(';') - if ( - asAttr && - !semi && - /[=a-z0-9]/i.test(rawText[name.length + 1] || '') - ) { - decodedText += '&' + name - advance(1 + name.length) - } else { - decodedText += value - advance(1 + name.length) - } - } else { - decodedText += '&' + name - advance(1 + name.length) - } - } else { - decodedText += '&' - advance(1) - } - } else { - // Numeric character reference. - const hex = head[0] === '&#x' - const pattern = hex ? /^&#x([0-9a-f]+);?/i : /^&#([0-9]+);?/ - const body = pattern.exec(rawText) - if (!body) { - decodedText += head[0] - advance(head[0].length) - } else { - // https://html.spec.whatwg.org/multipage/parsing.html#numeric-character-reference-end-state - let cp = Number.parseInt(body[1], hex ? 16 : 10) - if (cp === 0) { - cp = 0xfffd - } else if (cp > 0x10ffff) { - cp = 0xfffd - } else if (cp >= 0xd800 && cp <= 0xdfff) { - cp = 0xfffd - } else if ((cp >= 0xfdd0 && cp <= 0xfdef) || (cp & 0xfffe) === 0xfffe) { - // noop - } else if ( - (cp >= 0x01 && cp <= 0x08) || - cp === 0x0b || - (cp >= 0x0d && cp <= 0x1f) || - (cp >= 0x7f && cp <= 0x9f) - ) { - cp = CCR_REPLACEMENTS[cp] || cp - } - decodedText += String.fromCodePoint(cp) - advance(body[0].length) - } - } - } - return decodedText -} - -// https://html.spec.whatwg.org/multipage/parsing.html#numeric-character-reference-end-state -const CCR_REPLACEMENTS: Record<number, number | undefined> = { - 0x80: 0x20ac, - 0x82: 0x201a, - 0x83: 0x0192, - 0x84: 0x201e, - 0x85: 0x2026, - 0x86: 0x2020, - 0x87: 0x2021, - 0x88: 0x02c6, - 0x89: 0x2030, - 0x8a: 0x0160, - 0x8b: 0x2039, - 0x8c: 0x0152, - 0x8e: 0x017d, - 0x91: 0x2018, - 0x92: 0x2019, - 0x93: 0x201c, - 0x94: 0x201d, - 0x95: 0x2022, - 0x96: 0x2013, - 0x97: 0x2014, - 0x98: 0x02dc, - 0x99: 0x2122, - 0x9a: 0x0161, - 0x9b: 0x203a, - 0x9c: 0x0153, - 0x9e: 0x017e, - 0x9f: 0x0178 -} diff --git a/packages/compiler-dom/src/namedChars.json b/packages/compiler-dom/src/namedChars.json deleted file mode 100644 index 0bda5db6f..000000000 --- a/packages/compiler-dom/src/namedChars.json +++ /dev/null @@ -1,2233 +0,0 @@ -{ - "GT": ">", - "gt": ">", - "LT": "<", - "lt": "<", - "ac;": "∾", - "af;": "⁡", - "AMP": "&", - "amp": "&", - "ap;": "≈", - "DD;": "ⅅ", - "dd;": "ⅆ", - "deg": "°", - "ee;": "ⅇ", - "eg;": "⪚", - "el;": "⪙", - "ETH": "Ð", - "eth": "ð", - "gE;": "≧", - "ge;": "≥", - "Gg;": "⋙", - "gg;": "≫", - "gl;": "≷", - "GT;": ">", - "Gt;": "≫", - "gt;": ">", - "ic;": "⁣", - "ii;": "ⅈ", - "Im;": "ℑ", - "in;": "∈", - "it;": "⁢", - "lE;": "≦", - "le;": "≤", - "lg;": "≶", - "Ll;": "⋘", - "ll;": "≪", - "LT;": "<", - "Lt;": "≪", - "lt;": "<", - "mp;": "∓", - "Mu;": "Μ", - "mu;": "μ", - "ne;": "≠", - "ni;": "∋", - "not": "¬", - "Nu;": "Ν", - "nu;": "ν", - "Or;": "⩔", - "or;": "∨", - "oS;": "Ⓢ", - "Pi;": "Π", - "pi;": "π", - "pm;": "±", - "Pr;": "⪻", - "pr;": "≺", - "Re;": "ℜ", - "REG": "®", - "reg": "®", - "rx;": "℞", - "Sc;": "⪼", - "sc;": "≻", - "shy": "­", - "uml": "¨", - "wp;": "℘", - "wr;": "≀", - "Xi;": "Ξ", - "xi;": "ξ", - "yen": "¥", - "acd;": "∿", - "acE;": "∾̳", - "Acy;": "А", - "acy;": "а", - "Afr;": "𝔄", - "afr;": "𝔞", - "AMP;": "&", - "amp;": "&", - "And;": "⩓", - "and;": "∧", - "ang;": "∠", - "apE;": "⩰", - "ape;": "≊", - "ast;": "*", - "Auml": "Ä", - "auml": "ä", - "Bcy;": "Б", - "bcy;": "б", - "Bfr;": "𝔅", - "bfr;": "𝔟", - "bne;": "=⃥", - "bot;": "⊥", - "Cap;": "⋒", - "cap;": "∩", - "cent": "¢", - "Cfr;": "ℭ", - "cfr;": "𝔠", - "Chi;": "Χ", - "chi;": "χ", - "cir;": "○", - "COPY": "©", - "copy": "©", - "Cup;": "⋓", - "cup;": "∪", - "Dcy;": "Д", - "dcy;": "д", - "deg;": "°", - "Del;": "∇", - "Dfr;": "𝔇", - "dfr;": "𝔡", - "die;": "¨", - "div;": "÷", - "Dot;": "¨", - "dot;": "˙", - "Ecy;": "Э", - "ecy;": "э", - "Efr;": "𝔈", - "efr;": "𝔢", - "egs;": "⪖", - "ell;": "ℓ", - "els;": "⪕", - "ENG;": "Ŋ", - "eng;": "ŋ", - "Eta;": "Η", - "eta;": "η", - "ETH;": "Ð", - "eth;": "ð", - "Euml": "Ë", - "euml": "ë", - "Fcy;": "Ф", - "fcy;": "ф", - "Ffr;": "𝔉", - "ffr;": "𝔣", - "gap;": "⪆", - "Gcy;": "Г", - "gcy;": "г", - "gEl;": "⪌", - "gel;": "⋛", - "geq;": "≥", - "ges;": "⩾", - "Gfr;": "𝔊", - "gfr;": "𝔤", - "ggg;": "⋙", - "gla;": "⪥", - "glE;": "⪒", - "glj;": "⪤", - "gnE;": "≩", - "gne;": "⪈", - "Hat;": "^", - "Hfr;": "ℌ", - "hfr;": "𝔥", - "Icy;": "И", - "icy;": "и", - "iff;": "⇔", - "Ifr;": "ℑ", - "ifr;": "𝔦", - "Int;": "∬", - "int;": "∫", - "Iuml": "Ï", - "iuml": "ï", - "Jcy;": "Й", - "jcy;": "й", - "Jfr;": "𝔍", - "jfr;": "𝔧", - "Kcy;": "К", - "kcy;": "к", - "Kfr;": "𝔎", - "kfr;": "𝔨", - "lap;": "⪅", - "lat;": "⪫", - "Lcy;": "Л", - "lcy;": "л", - "lEg;": "⪋", - "leg;": "⋚", - "leq;": "≤", - "les;": "⩽", - "Lfr;": "𝔏", - "lfr;": "𝔩", - "lgE;": "⪑", - "lnE;": "≨", - "lne;": "⪇", - "loz;": "◊", - "lrm;": "‎", - "Lsh;": "↰", - "lsh;": "↰", - "macr": "¯", - "Map;": "⤅", - "map;": "↦", - "Mcy;": "М", - "mcy;": "м", - "Mfr;": "𝔐", - "mfr;": "𝔪", - "mho;": "℧", - "mid;": "∣", - "nap;": "≉", - "nbsp": " ", - "Ncy;": "Н", - "ncy;": "н", - "Nfr;": "𝔑", - "nfr;": "𝔫", - "ngE;": "≧̸", - "nge;": "≱", - "nGg;": "⋙̸", - "nGt;": "≫⃒", - "ngt;": "≯", - "nis;": "⋼", - "niv;": "∋", - "nlE;": "≦̸", - "nle;": "≰", - "nLl;": "⋘̸", - "nLt;": "≪⃒", - "nlt;": "≮", - "Not;": "⫬", - "not;": "¬", - "npr;": "⊀", - "nsc;": "⊁", - "num;": "#", - "Ocy;": "О", - "ocy;": "о", - "Ofr;": "𝔒", - "ofr;": "𝔬", - "ogt;": "⧁", - "ohm;": "Ω", - "olt;": "⧀", - "ord;": "⩝", - "ordf": "ª", - "ordm": "º", - "orv;": "⩛", - "Ouml": "Ö", - "ouml": "ö", - "par;": "∥", - "para": "¶", - "Pcy;": "П", - "pcy;": "п", - "Pfr;": "𝔓", - "pfr;": "𝔭", - "Phi;": "Φ", - "phi;": "φ", - "piv;": "ϖ", - "prE;": "⪳", - "pre;": "⪯", - "Psi;": "Ψ", - "psi;": "ψ", - "Qfr;": "𝔔", - "qfr;": "𝔮", - "QUOT": "\"", - "quot": "\"", - "Rcy;": "Р", - "rcy;": "р", - "REG;": "®", - "reg;": "®", - "Rfr;": "ℜ", - "rfr;": "𝔯", - "Rho;": "Ρ", - "rho;": "ρ", - "rlm;": "‏", - "Rsh;": "↱", - "rsh;": "↱", - "scE;": "⪴", - "sce;": "⪰", - "Scy;": "С", - "scy;": "с", - "sect": "§", - "Sfr;": "𝔖", - "sfr;": "𝔰", - "shy;": "­", - "sim;": "∼", - "smt;": "⪪", - "sol;": "/", - "squ;": "□", - "Sub;": "⋐", - "sub;": "⊂", - "Sum;": "∑", - "sum;": "∑", - "Sup;": "⋑", - "sup;": "⊃", - "sup1": "¹", - "sup2": "²", - "sup3": "³", - "Tab;": "\t", - "Tau;": "Τ", - "tau;": "τ", - "Tcy;": "Т", - "tcy;": "т", - "Tfr;": "𝔗", - "tfr;": "𝔱", - "top;": "⊤", - "Ucy;": "У", - "ucy;": "у", - "Ufr;": "𝔘", - "ufr;": "𝔲", - "uml;": "¨", - "Uuml": "Ü", - "uuml": "ü", - "Vcy;": "В", - "vcy;": "в", - "Vee;": "⋁", - "vee;": "∨", - "Vfr;": "𝔙", - "vfr;": "𝔳", - "Wfr;": "𝔚", - "wfr;": "𝔴", - "Xfr;": "𝔛", - "xfr;": "𝔵", - "Ycy;": "Ы", - "ycy;": "ы", - "yen;": "¥", - "Yfr;": "𝔜", - "yfr;": "𝔶", - "yuml": "ÿ", - "Zcy;": "З", - "zcy;": "з", - "Zfr;": "ℨ", - "zfr;": "𝔷", - "zwj;": "‍", - "Acirc": "Â", - "acirc": "â", - "acute": "´", - "AElig": "Æ", - "aelig": "æ", - "andd;": "⩜", - "andv;": "⩚", - "ange;": "⦤", - "Aopf;": "𝔸", - "aopf;": "𝕒", - "apid;": "≋", - "apos;": "'", - "Aring": "Å", - "aring": "å", - "Ascr;": "𝒜", - "ascr;": "𝒶", - "Auml;": "Ä", - "auml;": "ä", - "Barv;": "⫧", - "bbrk;": "⎵", - "Beta;": "Β", - "beta;": "β", - "beth;": "ℶ", - "bNot;": "⫭", - "bnot;": "⌐", - "Bopf;": "𝔹", - "bopf;": "𝕓", - "boxH;": "═", - "boxh;": "─", - "boxV;": "║", - "boxv;": "│", - "Bscr;": "ℬ", - "bscr;": "𝒷", - "bsim;": "∽", - "bsol;": "\\", - "bull;": "•", - "bump;": "≎", - "caps;": "∩︀", - "Cdot;": "Ċ", - "cdot;": "ċ", - "cedil": "¸", - "cent;": "¢", - "CHcy;": "Ч", - "chcy;": "ч", - "circ;": "ˆ", - "cirE;": "⧃", - "cire;": "≗", - "comp;": "∁", - "cong;": "≅", - "Copf;": "ℂ", - "copf;": "𝕔", - "COPY;": "©", - "copy;": "©", - "Cscr;": "𝒞", - "cscr;": "𝒸", - "csub;": "⫏", - "csup;": "⫐", - "cups;": "∪︀", - "Darr;": "↡", - "dArr;": "⇓", - "darr;": "↓", - "dash;": "‐", - "dHar;": "⥥", - "diam;": "⋄", - "DJcy;": "Ђ", - "djcy;": "ђ", - "Dopf;": "𝔻", - "dopf;": "𝕕", - "Dscr;": "𝒟", - "dscr;": "𝒹", - "DScy;": "Ѕ", - "dscy;": "ѕ", - "dsol;": "⧶", - "dtri;": "▿", - "DZcy;": "Џ", - "dzcy;": "џ", - "ecir;": "≖", - "Ecirc": "Ê", - "ecirc": "ê", - "Edot;": "Ė", - "eDot;": "≑", - "edot;": "ė", - "emsp;": " ", - "ensp;": " ", - "Eopf;": "𝔼", - "eopf;": "𝕖", - "epar;": "⋕", - "epsi;": "ε", - "Escr;": "ℰ", - "escr;": "ℯ", - "Esim;": "⩳", - "esim;": "≂", - "Euml;": "Ë", - "euml;": "ë", - "euro;": "€", - "excl;": "!", - "flat;": "♭", - "fnof;": "ƒ", - "Fopf;": "𝔽", - "fopf;": "𝕗", - "fork;": "⋔", - "Fscr;": "ℱ", - "fscr;": "𝒻", - "Gdot;": "Ġ", - "gdot;": "ġ", - "geqq;": "≧", - "gesl;": "⋛︀", - "GJcy;": "Ѓ", - "gjcy;": "ѓ", - "gnap;": "⪊", - "gneq;": "⪈", - "Gopf;": "𝔾", - "gopf;": "𝕘", - "Gscr;": "𝒢", - "gscr;": "ℊ", - "gsim;": "≳", - "gtcc;": "⪧", - "gvnE;": "≩︀", - "half;": "½", - "hArr;": "⇔", - "harr;": "↔", - "hbar;": "ℏ", - "Hopf;": "ℍ", - "hopf;": "𝕙", - "Hscr;": "ℋ", - "hscr;": "𝒽", - "Icirc": "Î", - "icirc": "î", - "Idot;": "İ", - "IEcy;": "Е", - "iecy;": "е", - "iexcl": "¡", - "imof;": "⊷", - "IOcy;": "Ё", - "iocy;": "ё", - "Iopf;": "𝕀", - "iopf;": "𝕚", - "Iota;": "Ι", - "iota;": "ι", - "Iscr;": "ℐ", - "iscr;": "𝒾", - "isin;": "∈", - "Iuml;": "Ï", - "iuml;": "ï", - "Jopf;": "𝕁", - "jopf;": "𝕛", - "Jscr;": "𝒥", - "jscr;": "𝒿", - "KHcy;": "Х", - "khcy;": "х", - "KJcy;": "Ќ", - "kjcy;": "ќ", - "Kopf;": "𝕂", - "kopf;": "𝕜", - "Kscr;": "𝒦", - "kscr;": "𝓀", - "Lang;": "⟪", - "lang;": "⟨", - "laquo": "«", - "Larr;": "↞", - "lArr;": "⇐", - "larr;": "←", - "late;": "⪭", - "lcub;": "{", - "ldca;": "⤶", - "ldsh;": "↲", - "leqq;": "≦", - "lesg;": "⋚︀", - "lHar;": "⥢", - "LJcy;": "Љ", - "ljcy;": "љ", - "lnap;": "⪉", - "lneq;": "⪇", - "Lopf;": "𝕃", - "lopf;": "𝕝", - "lozf;": "⧫", - "lpar;": "(", - "Lscr;": "ℒ", - "lscr;": "𝓁", - "lsim;": "≲", - "lsqb;": "[", - "ltcc;": "⪦", - "ltri;": "◃", - "lvnE;": "≨︀", - "macr;": "¯", - "male;": "♂", - "malt;": "✠", - "micro": "µ", - "mlcp;": "⫛", - "mldr;": "…", - "Mopf;": "𝕄", - "mopf;": "𝕞", - "Mscr;": "ℳ", - "mscr;": "𝓂", - "nang;": "∠⃒", - "napE;": "⩰̸", - "nbsp;": " ", - "ncap;": "⩃", - "ncup;": "⩂", - "ngeq;": "≱", - "nges;": "⩾̸", - "ngtr;": "≯", - "nGtv;": "≫̸", - "nisd;": "⋺", - "NJcy;": "Њ", - "njcy;": "њ", - "nldr;": "‥", - "nleq;": "≰", - "nles;": "⩽̸", - "nLtv;": "≪̸", - "nmid;": "∤", - "Nopf;": "ℕ", - "nopf;": "𝕟", - "npar;": "∦", - "npre;": "⪯̸", - "nsce;": "⪰̸", - "Nscr;": "𝒩", - "nscr;": "𝓃", - "nsim;": "≁", - "nsub;": "⊄", - "nsup;": "⊅", - "ntgl;": "≹", - "ntlg;": "≸", - "nvap;": "≍⃒", - "nvge;": "≥⃒", - "nvgt;": ">⃒", - "nvle;": "≤⃒", - "nvlt;": "<⃒", - "oast;": "⊛", - "ocir;": "⊚", - "Ocirc": "Ô", - "ocirc": "ô", - "odiv;": "⨸", - "odot;": "⊙", - "ogon;": "˛", - "oint;": "∮", - "omid;": "⦶", - "Oopf;": "𝕆", - "oopf;": "𝕠", - "opar;": "⦷", - "ordf;": "ª", - "ordm;": "º", - "oror;": "⩖", - "Oscr;": "𝒪", - "oscr;": "ℴ", - "osol;": "⊘", - "Ouml;": "Ö", - "ouml;": "ö", - "para;": "¶", - "part;": "∂", - "perp;": "⊥", - "phiv;": "ϕ", - "plus;": "+", - "Popf;": "ℙ", - "popf;": "𝕡", - "pound": "£", - "prap;": "⪷", - "prec;": "≺", - "prnE;": "⪵", - "prod;": "∏", - "prop;": "∝", - "Pscr;": "𝒫", - "pscr;": "𝓅", - "qint;": "⨌", - "Qopf;": "ℚ", - "qopf;": "𝕢", - "Qscr;": "𝒬", - "qscr;": "𝓆", - "QUOT;": "\"", - "quot;": "\"", - "race;": "∽̱", - "Rang;": "⟫", - "rang;": "⟩", - "raquo": "»", - "Rarr;": "↠", - "rArr;": "⇒", - "rarr;": "→", - "rcub;": "}", - "rdca;": "⤷", - "rdsh;": "↳", - "real;": "ℜ", - "rect;": "▭", - "rHar;": "⥤", - "rhov;": "ϱ", - "ring;": "˚", - "Ropf;": "ℝ", - "ropf;": "𝕣", - "rpar;": ")", - "Rscr;": "ℛ", - "rscr;": "𝓇", - "rsqb;": "]", - "rtri;": "▹", - "scap;": "⪸", - "scnE;": "⪶", - "sdot;": "⋅", - "sect;": "§", - "semi;": ";", - "sext;": "✶", - "SHcy;": "Ш", - "shcy;": "ш", - "sime;": "≃", - "simg;": "⪞", - "siml;": "⪝", - "smid;": "∣", - "smte;": "⪬", - "solb;": "⧄", - "Sopf;": "𝕊", - "sopf;": "𝕤", - "spar;": "∥", - "Sqrt;": "√", - "squf;": "▪", - "Sscr;": "𝒮", - "sscr;": "𝓈", - "Star;": "⋆", - "star;": "☆", - "subE;": "⫅", - "sube;": "⊆", - "succ;": "≻", - "sung;": "♪", - "sup1;": "¹", - "sup2;": "²", - "sup3;": "³", - "supE;": "⫆", - "supe;": "⊇", - "szlig": "ß", - "tbrk;": "⎴", - "tdot;": "⃛", - "THORN": "Þ", - "thorn": "þ", - "times": "×", - "tint;": "∭", - "toea;": "⤨", - "Topf;": "𝕋", - "topf;": "𝕥", - "tosa;": "⤩", - "trie;": "≜", - "Tscr;": "𝒯", - "tscr;": "𝓉", - "TScy;": "Ц", - "tscy;": "ц", - "Uarr;": "↟", - "uArr;": "⇑", - "uarr;": "↑", - "Ucirc": "Û", - "ucirc": "û", - "uHar;": "⥣", - "Uopf;": "𝕌", - "uopf;": "𝕦", - "Upsi;": "ϒ", - "upsi;": "υ", - "Uscr;": "𝒰", - "uscr;": "𝓊", - "utri;": "▵", - "Uuml;": "Ü", - "uuml;": "ü", - "vArr;": "⇕", - "varr;": "↕", - "Vbar;": "⫫", - "vBar;": "⫨", - "Vert;": "‖", - "vert;": "|", - "Vopf;": "𝕍", - "vopf;": "𝕧", - "Vscr;": "𝒱", - "vscr;": "𝓋", - "Wopf;": "𝕎", - "wopf;": "𝕨", - "Wscr;": "𝒲", - "wscr;": "𝓌", - "xcap;": "⋂", - "xcup;": "⋃", - "xmap;": "⟼", - "xnis;": "⋻", - "Xopf;": "𝕏", - "xopf;": "𝕩", - "Xscr;": "𝒳", - "xscr;": "𝓍", - "xvee;": "⋁", - "YAcy;": "Я", - "yacy;": "я", - "YIcy;": "Ї", - "yicy;": "ї", - "Yopf;": "𝕐", - "yopf;": "𝕪", - "Yscr;": "𝒴", - "yscr;": "𝓎", - "YUcy;": "Ю", - "yucy;": "ю", - "Yuml;": "Ÿ", - "yuml;": "ÿ", - "Zdot;": "Ż", - "zdot;": "ż", - "Zeta;": "Ζ", - "zeta;": "ζ", - "ZHcy;": "Ж", - "zhcy;": "ж", - "Zopf;": "ℤ", - "zopf;": "𝕫", - "Zscr;": "𝒵", - "zscr;": "𝓏", - "zwnj;": "‌", - "Aacute": "Á", - "aacute": "á", - "Acirc;": "Â", - "acirc;": "â", - "acute;": "´", - "AElig;": "Æ", - "aelig;": "æ", - "Agrave": "À", - "agrave": "à", - "aleph;": "ℵ", - "Alpha;": "Α", - "alpha;": "α", - "Amacr;": "Ā", - "amacr;": "ā", - "amalg;": "⨿", - "angle;": "∠", - "angrt;": "∟", - "angst;": "Å", - "Aogon;": "Ą", - "aogon;": "ą", - "Aring;": "Å", - "aring;": "å", - "asymp;": "≈", - "Atilde": "Ã", - "atilde": "ã", - "awint;": "⨑", - "bcong;": "≌", - "bdquo;": "„", - "bepsi;": "϶", - "blank;": "␣", - "blk12;": "▒", - "blk14;": "░", - "blk34;": "▓", - "block;": "█", - "boxDL;": "╗", - "boxDl;": "╖", - "boxdL;": "╕", - "boxdl;": "┐", - "boxDR;": "╔", - "boxDr;": "╓", - "boxdR;": "╒", - "boxdr;": "┌", - "boxHD;": "╦", - "boxHd;": "╤", - "boxhD;": "╥", - "boxhd;": "┬", - "boxHU;": "╩", - "boxHu;": "╧", - "boxhU;": "╨", - "boxhu;": "┴", - "boxUL;": "╝", - "boxUl;": "╜", - "boxuL;": "╛", - "boxul;": "┘", - "boxUR;": "╚", - "boxUr;": "╙", - "boxuR;": "╘", - "boxur;": "└", - "boxVH;": "╬", - "boxVh;": "╫", - "boxvH;": "╪", - "boxvh;": "┼", - "boxVL;": "╣", - "boxVl;": "╢", - "boxvL;": "╡", - "boxvl;": "┤", - "boxVR;": "╠", - "boxVr;": "╟", - "boxvR;": "╞", - "boxvr;": "├", - "Breve;": "˘", - "breve;": "˘", - "brvbar": "¦", - "bsemi;": "⁏", - "bsime;": "⋍", - "bsolb;": "⧅", - "bumpE;": "⪮", - "bumpe;": "≏", - "caret;": "⁁", - "caron;": "ˇ", - "ccaps;": "⩍", - "Ccedil": "Ç", - "ccedil": "ç", - "Ccirc;": "Ĉ", - "ccirc;": "ĉ", - "ccups;": "⩌", - "cedil;": "¸", - "check;": "✓", - "clubs;": "♣", - "Colon;": "∷", - "colon;": ":", - "comma;": ",", - "crarr;": "↵", - "Cross;": "⨯", - "cross;": "✗", - "csube;": "⫑", - "csupe;": "⫒", - "ctdot;": "⋯", - "cuepr;": "⋞", - "cuesc;": "⋟", - "cupor;": "⩅", - "curren": "¤", - "cuvee;": "⋎", - "cuwed;": "⋏", - "cwint;": "∱", - "Dashv;": "⫤", - "dashv;": "⊣", - "dblac;": "˝", - "ddarr;": "⇊", - "Delta;": "Δ", - "delta;": "δ", - "dharl;": "⇃", - "dharr;": "⇂", - "diams;": "♦", - "disin;": "⋲", - "divide": "÷", - "doteq;": "≐", - "dtdot;": "⋱", - "dtrif;": "▾", - "duarr;": "⇵", - "duhar;": "⥯", - "Eacute": "É", - "eacute": "é", - "Ecirc;": "Ê", - "ecirc;": "ê", - "eDDot;": "⩷", - "efDot;": "≒", - "Egrave": "È", - "egrave": "è", - "Emacr;": "Ē", - "emacr;": "ē", - "empty;": "∅", - "Eogon;": "Ę", - "eogon;": "ę", - "eplus;": "⩱", - "epsiv;": "ϵ", - "eqsim;": "≂", - "Equal;": "⩵", - "equiv;": "≡", - "erarr;": "⥱", - "erDot;": "≓", - "esdot;": "≐", - "exist;": "∃", - "fflig;": "ff", - "filig;": "fi", - "fjlig;": "fj", - "fllig;": "fl", - "fltns;": "▱", - "forkv;": "⫙", - "frac12": "½", - "frac14": "¼", - "frac34": "¾", - "frasl;": "⁄", - "frown;": "⌢", - "Gamma;": "Γ", - "gamma;": "γ", - "Gcirc;": "Ĝ", - "gcirc;": "ĝ", - "gescc;": "⪩", - "gimel;": "ℷ", - "gneqq;": "≩", - "gnsim;": "⋧", - "grave;": "`", - "gsime;": "⪎", - "gsiml;": "⪐", - "gtcir;": "⩺", - "gtdot;": "⋗", - "Hacek;": "ˇ", - "harrw;": "↭", - "Hcirc;": "Ĥ", - "hcirc;": "ĥ", - "hoarr;": "⇿", - "Iacute": "Í", - "iacute": "í", - "Icirc;": "Î", - "icirc;": "î", - "iexcl;": "¡", - "Igrave": "Ì", - "igrave": "ì", - "iiint;": "∭", - "iiota;": "℩", - "IJlig;": "IJ", - "ijlig;": "ij", - "Imacr;": "Ī", - "imacr;": "ī", - "image;": "ℑ", - "imath;": "ı", - "imped;": "Ƶ", - "infin;": "∞", - "Iogon;": "Į", - "iogon;": "į", - "iprod;": "⨼", - "iquest": "¿", - "isinE;": "⋹", - "isins;": "⋴", - "isinv;": "∈", - "Iukcy;": "І", - "iukcy;": "і", - "Jcirc;": "Ĵ", - "jcirc;": "ĵ", - "jmath;": "ȷ", - "Jukcy;": "Є", - "jukcy;": "є", - "Kappa;": "Κ", - "kappa;": "κ", - "lAarr;": "⇚", - "langd;": "⦑", - "laquo;": "«", - "larrb;": "⇤", - "lates;": "⪭︀", - "lBarr;": "⤎", - "lbarr;": "⤌", - "lbbrk;": "❲", - "lbrke;": "⦋", - "lceil;": "⌈", - "ldquo;": "“", - "lescc;": "⪨", - "lhard;": "↽", - "lharu;": "↼", - "lhblk;": "▄", - "llarr;": "⇇", - "lltri;": "◺", - "lneqq;": "≨", - "lnsim;": "⋦", - "loang;": "⟬", - "loarr;": "⇽", - "lobrk;": "⟦", - "lopar;": "⦅", - "lrarr;": "⇆", - "lrhar;": "⇋", - "lrtri;": "⊿", - "lsime;": "⪍", - "lsimg;": "⪏", - "lsquo;": "‘", - "ltcir;": "⩹", - "ltdot;": "⋖", - "ltrie;": "⊴", - "ltrif;": "◂", - "mdash;": "—", - "mDDot;": "∺", - "micro;": "µ", - "middot": "·", - "minus;": "−", - "mumap;": "⊸", - "nabla;": "∇", - "napid;": "≋̸", - "napos;": "ʼn", - "natur;": "♮", - "nbump;": "≎̸", - "ncong;": "≇", - "ndash;": "–", - "neArr;": "⇗", - "nearr;": "↗", - "nedot;": "≐̸", - "nesim;": "≂̸", - "ngeqq;": "≧̸", - "ngsim;": "≵", - "nhArr;": "⇎", - "nharr;": "↮", - "nhpar;": "⫲", - "nlArr;": "⇍", - "nlarr;": "↚", - "nleqq;": "≦̸", - "nless;": "≮", - "nlsim;": "≴", - "nltri;": "⋪", - "notin;": "∉", - "notni;": "∌", - "npart;": "∂̸", - "nprec;": "⊀", - "nrArr;": "⇏", - "nrarr;": "↛", - "nrtri;": "⋫", - "nsime;": "≄", - "nsmid;": "∤", - "nspar;": "∦", - "nsubE;": "⫅̸", - "nsube;": "⊈", - "nsucc;": "⊁", - "nsupE;": "⫆̸", - "nsupe;": "⊉", - "Ntilde": "Ñ", - "ntilde": "ñ", - "numsp;": " ", - "nvsim;": "∼⃒", - "nwArr;": "⇖", - "nwarr;": "↖", - "Oacute": "Ó", - "oacute": "ó", - "Ocirc;": "Ô", - "ocirc;": "ô", - "odash;": "⊝", - "OElig;": "Œ", - "oelig;": "œ", - "ofcir;": "⦿", - "Ograve": "Ò", - "ograve": "ò", - "ohbar;": "⦵", - "olarr;": "↺", - "olcir;": "⦾", - "oline;": "‾", - "Omacr;": "Ō", - "omacr;": "ō", - "Omega;": "Ω", - "omega;": "ω", - "operp;": "⦹", - "oplus;": "⊕", - "orarr;": "↻", - "order;": "ℴ", - "Oslash": "Ø", - "oslash": "ø", - "Otilde": "Õ", - "otilde": "õ", - "ovbar;": "⌽", - "parsl;": "⫽", - "phone;": "☎", - "plusb;": "⊞", - "pluse;": "⩲", - "plusmn": "±", - "pound;": "£", - "prcue;": "≼", - "Prime;": "″", - "prime;": "′", - "prnap;": "⪹", - "prsim;": "≾", - "quest;": "?", - "rAarr;": "⇛", - "radic;": "√", - "rangd;": "⦒", - "range;": "⦥", - "raquo;": "»", - "rarrb;": "⇥", - "rarrc;": "⤳", - "rarrw;": "↝", - "ratio;": "∶", - "RBarr;": "⤐", - "rBarr;": "⤏", - "rbarr;": "⤍", - "rbbrk;": "❳", - "rbrke;": "⦌", - "rceil;": "⌉", - "rdquo;": "”", - "reals;": "ℝ", - "rhard;": "⇁", - "rharu;": "⇀", - "rlarr;": "⇄", - "rlhar;": "⇌", - "rnmid;": "⫮", - "roang;": "⟭", - "roarr;": "⇾", - "robrk;": "⟧", - "ropar;": "⦆", - "rrarr;": "⇉", - "rsquo;": "’", - "rtrie;": "⊵", - "rtrif;": "▸", - "sbquo;": "‚", - "sccue;": "≽", - "Scirc;": "Ŝ", - "scirc;": "ŝ", - "scnap;": "⪺", - "scsim;": "≿", - "sdotb;": "⊡", - "sdote;": "⩦", - "seArr;": "⇘", - "searr;": "↘", - "setmn;": "∖", - "sharp;": "♯", - "Sigma;": "Σ", - "sigma;": "σ", - "simeq;": "≃", - "simgE;": "⪠", - "simlE;": "⪟", - "simne;": "≆", - "slarr;": "←", - "smile;": "⌣", - "smtes;": "⪬︀", - "sqcap;": "⊓", - "sqcup;": "⊔", - "sqsub;": "⊏", - "sqsup;": "⊐", - "srarr;": "→", - "starf;": "★", - "strns;": "¯", - "subnE;": "⫋", - "subne;": "⊊", - "supnE;": "⫌", - "supne;": "⊋", - "swArr;": "⇙", - "swarr;": "↙", - "szlig;": "ß", - "Theta;": "Θ", - "theta;": "θ", - "thkap;": "≈", - "THORN;": "Þ", - "thorn;": "þ", - "Tilde;": "∼", - "tilde;": "˜", - "times;": "×", - "TRADE;": "™", - "trade;": "™", - "trisb;": "⧍", - "TSHcy;": "Ћ", - "tshcy;": "ћ", - "twixt;": "≬", - "Uacute": "Ú", - "uacute": "ú", - "Ubrcy;": "Ў", - "ubrcy;": "ў", - "Ucirc;": "Û", - "ucirc;": "û", - "udarr;": "⇅", - "udhar;": "⥮", - "Ugrave": "Ù", - "ugrave": "ù", - "uharl;": "↿", - "uharr;": "↾", - "uhblk;": "▀", - "ultri;": "◸", - "Umacr;": "Ū", - "umacr;": "ū", - "Union;": "⋃", - "Uogon;": "Ų", - "uogon;": "ų", - "uplus;": "⊎", - "upsih;": "ϒ", - "UpTee;": "⊥", - "Uring;": "Ů", - "uring;": "ů", - "urtri;": "◹", - "utdot;": "⋰", - "utrif;": "▴", - "uuarr;": "⇈", - "varpi;": "ϖ", - "vBarv;": "⫩", - "VDash;": "⊫", - "Vdash;": "⊩", - "vDash;": "⊨", - "vdash;": "⊢", - "veeeq;": "≚", - "vltri;": "⊲", - "vnsub;": "⊂⃒", - "vnsup;": "⊃⃒", - "vprop;": "∝", - "vrtri;": "⊳", - "Wcirc;": "Ŵ", - "wcirc;": "ŵ", - "Wedge;": "⋀", - "wedge;": "∧", - "xcirc;": "◯", - "xdtri;": "▽", - "xhArr;": "⟺", - "xharr;": "⟷", - "xlArr;": "⟸", - "xlarr;": "⟵", - "xodot;": "⨀", - "xrArr;": "⟹", - "xrarr;": "⟶", - "xutri;": "△", - "Yacute": "Ý", - "yacute": "ý", - "Ycirc;": "Ŷ", - "ycirc;": "ŷ", - "Aacute;": "Á", - "aacute;": "á", - "Abreve;": "Ă", - "abreve;": "ă", - "Agrave;": "À", - "agrave;": "à", - "andand;": "⩕", - "angmsd;": "∡", - "angsph;": "∢", - "apacir;": "⩯", - "approx;": "≈", - "Assign;": "≔", - "Atilde;": "Ã", - "atilde;": "ã", - "barvee;": "⊽", - "Barwed;": "⌆", - "barwed;": "⌅", - "becaus;": "∵", - "bernou;": "ℬ", - "bigcap;": "⋂", - "bigcup;": "⋃", - "bigvee;": "⋁", - "bkarow;": "⤍", - "bottom;": "⊥", - "bowtie;": "⋈", - "boxbox;": "⧉", - "bprime;": "‵", - "brvbar;": "¦", - "bullet;": "•", - "Bumpeq;": "≎", - "bumpeq;": "≏", - "Cacute;": "Ć", - "cacute;": "ć", - "capand;": "⩄", - "capcap;": "⩋", - "capcup;": "⩇", - "capdot;": "⩀", - "Ccaron;": "Č", - "ccaron;": "č", - "Ccedil;": "Ç", - "ccedil;": "ç", - "circeq;": "≗", - "cirmid;": "⫯", - "Colone;": "⩴", - "colone;": "≔", - "commat;": "@", - "compfn;": "∘", - "Conint;": "∯", - "conint;": "∮", - "coprod;": "∐", - "copysr;": "℗", - "cularr;": "↶", - "CupCap;": "≍", - "cupcap;": "⩆", - "cupcup;": "⩊", - "cupdot;": "⊍", - "curarr;": "↷", - "curren;": "¤", - "cylcty;": "⌭", - "Dagger;": "‡", - "dagger;": "†", - "daleth;": "ℸ", - "Dcaron;": "Ď", - "dcaron;": "ď", - "dfisht;": "⥿", - "divide;": "÷", - "divonx;": "⋇", - "dlcorn;": "⌞", - "dlcrop;": "⌍", - "dollar;": "$", - "DotDot;": "⃜", - "drcorn;": "⌟", - "drcrop;": "⌌", - "Dstrok;": "Đ", - "dstrok;": "đ", - "Eacute;": "É", - "eacute;": "é", - "easter;": "⩮", - "Ecaron;": "Ě", - "ecaron;": "ě", - "ecolon;": "≕", - "Egrave;": "È", - "egrave;": "è", - "egsdot;": "⪘", - "elsdot;": "⪗", - "emptyv;": "∅", - "emsp13;": " ", - "emsp14;": " ", - "eparsl;": "⧣", - "eqcirc;": "≖", - "equals;": "=", - "equest;": "≟", - "Exists;": "∃", - "female;": "♀", - "ffilig;": "ffi", - "ffllig;": "ffl", - "ForAll;": "∀", - "forall;": "∀", - "frac12;": "½", - "frac13;": "⅓", - "frac14;": "¼", - "frac15;": "⅕", - "frac16;": "⅙", - "frac18;": "⅛", - "frac23;": "⅔", - "frac25;": "⅖", - "frac34;": "¾", - "frac35;": "⅗", - "frac38;": "⅜", - "frac45;": "⅘", - "frac56;": "⅚", - "frac58;": "⅝", - "frac78;": "⅞", - "gacute;": "ǵ", - "Gammad;": "Ϝ", - "gammad;": "ϝ", - "Gbreve;": "Ğ", - "gbreve;": "ğ", - "Gcedil;": "Ģ", - "gesdot;": "⪀", - "gesles;": "⪔", - "gtlPar;": "⦕", - "gtrarr;": "⥸", - "gtrdot;": "⋗", - "gtrsim;": "≳", - "hairsp;": " ", - "hamilt;": "ℋ", - "HARDcy;": "Ъ", - "hardcy;": "ъ", - "hearts;": "♥", - "hellip;": "…", - "hercon;": "⊹", - "homtht;": "∻", - "horbar;": "―", - "hslash;": "ℏ", - "Hstrok;": "Ħ", - "hstrok;": "ħ", - "hybull;": "⁃", - "hyphen;": "‐", - "Iacute;": "Í", - "iacute;": "í", - "Igrave;": "Ì", - "igrave;": "ì", - "iiiint;": "⨌", - "iinfin;": "⧜", - "incare;": "℅", - "inodot;": "ı", - "intcal;": "⊺", - "iquest;": "¿", - "isinsv;": "⋳", - "Itilde;": "Ĩ", - "itilde;": "ĩ", - "Jsercy;": "Ј", - "jsercy;": "ј", - "kappav;": "ϰ", - "Kcedil;": "Ķ", - "kcedil;": "ķ", - "kgreen;": "ĸ", - "Lacute;": "Ĺ", - "lacute;": "ĺ", - "lagran;": "ℒ", - "Lambda;": "Λ", - "lambda;": "λ", - "langle;": "⟨", - "larrfs;": "⤝", - "larrhk;": "↩", - "larrlp;": "↫", - "larrpl;": "⤹", - "larrtl;": "↢", - "lAtail;": "⤛", - "latail;": "⤙", - "lbrace;": "{", - "lbrack;": "[", - "Lcaron;": "Ľ", - "lcaron;": "ľ", - "Lcedil;": "Ļ", - "lcedil;": "ļ", - "ldquor;": "„", - "lesdot;": "⩿", - "lesges;": "⪓", - "lfisht;": "⥼", - "lfloor;": "⌊", - "lharul;": "⥪", - "llhard;": "⥫", - "Lmidot;": "Ŀ", - "lmidot;": "ŀ", - "lmoust;": "⎰", - "loplus;": "⨭", - "lowast;": "∗", - "lowbar;": "_", - "lparlt;": "⦓", - "lrhard;": "⥭", - "lsaquo;": "‹", - "lsquor;": "‚", - "Lstrok;": "Ł", - "lstrok;": "ł", - "lthree;": "⋋", - "ltimes;": "⋉", - "ltlarr;": "⥶", - "ltrPar;": "⦖", - "mapsto;": "↦", - "marker;": "▮", - "mcomma;": "⨩", - "midast;": "*", - "midcir;": "⫰", - "middot;": "·", - "minusb;": "⊟", - "minusd;": "∸", - "mnplus;": "∓", - "models;": "⊧", - "mstpos;": "∾", - "Nacute;": "Ń", - "nacute;": "ń", - "nbumpe;": "≏̸", - "Ncaron;": "Ň", - "ncaron;": "ň", - "Ncedil;": "Ņ", - "ncedil;": "ņ", - "nearhk;": "⤤", - "nequiv;": "≢", - "nesear;": "⤨", - "nexist;": "∄", - "nltrie;": "⋬", - "notinE;": "⋹̸", - "nparsl;": "⫽⃥", - "nprcue;": "⋠", - "nrarrc;": "⤳̸", - "nrarrw;": "↝̸", - "nrtrie;": "⋭", - "nsccue;": "⋡", - "nsimeq;": "≄", - "Ntilde;": "Ñ", - "ntilde;": "ñ", - "numero;": "№", - "nVDash;": "⊯", - "nVdash;": "⊮", - "nvDash;": "⊭", - "nvdash;": "⊬", - "nvHarr;": "⤄", - "nvlArr;": "⤂", - "nvrArr;": "⤃", - "nwarhk;": "⤣", - "nwnear;": "⤧", - "Oacute;": "Ó", - "oacute;": "ó", - "Odblac;": "Ő", - "odblac;": "ő", - "odsold;": "⦼", - "Ograve;": "Ò", - "ograve;": "ò", - "ominus;": "⊖", - "origof;": "⊶", - "Oslash;": "Ø", - "oslash;": "ø", - "Otilde;": "Õ", - "otilde;": "õ", - "Otimes;": "⨷", - "otimes;": "⊗", - "parsim;": "⫳", - "percnt;": "%", - "period;": ".", - "permil;": "‰", - "phmmat;": "ℳ", - "planck;": "ℏ", - "plankv;": "ℏ", - "plusdo;": "∔", - "plusdu;": "⨥", - "plusmn;": "±", - "preceq;": "⪯", - "primes;": "ℙ", - "prnsim;": "⋨", - "propto;": "∝", - "prurel;": "⊰", - "puncsp;": " ", - "qprime;": "⁗", - "Racute;": "Ŕ", - "racute;": "ŕ", - "rangle;": "⟩", - "rarrap;": "⥵", - "rarrfs;": "⤞", - "rarrhk;": "↪", - "rarrlp;": "↬", - "rarrpl;": "⥅", - "Rarrtl;": "⤖", - "rarrtl;": "↣", - "rAtail;": "⤜", - "ratail;": "⤚", - "rbrace;": "}", - "rbrack;": "]", - "Rcaron;": "Ř", - "rcaron;": "ř", - "Rcedil;": "Ŗ", - "rcedil;": "ŗ", - "rdquor;": "”", - "rfisht;": "⥽", - "rfloor;": "⌋", - "rharul;": "⥬", - "rmoust;": "⎱", - "roplus;": "⨮", - "rpargt;": "⦔", - "rsaquo;": "›", - "rsquor;": "’", - "rthree;": "⋌", - "rtimes;": "⋊", - "Sacute;": "Ś", - "sacute;": "ś", - "Scaron;": "Š", - "scaron;": "š", - "Scedil;": "Ş", - "scedil;": "ş", - "scnsim;": "⋩", - "searhk;": "⤥", - "seswar;": "⤩", - "sfrown;": "⌢", - "SHCHcy;": "Щ", - "shchcy;": "щ", - "sigmaf;": "ς", - "sigmav;": "ς", - "simdot;": "⩪", - "smashp;": "⨳", - "SOFTcy;": "Ь", - "softcy;": "ь", - "solbar;": "⌿", - "spades;": "♠", - "sqcaps;": "⊓︀", - "sqcups;": "⊔︀", - "sqsube;": "⊑", - "sqsupe;": "⊒", - "Square;": "□", - "square;": "□", - "squarf;": "▪", - "ssetmn;": "∖", - "ssmile;": "⌣", - "sstarf;": "⋆", - "subdot;": "⪽", - "Subset;": "⋐", - "subset;": "⊂", - "subsim;": "⫇", - "subsub;": "⫕", - "subsup;": "⫓", - "succeq;": "⪰", - "supdot;": "⪾", - "Supset;": "⋑", - "supset;": "⊃", - "supsim;": "⫈", - "supsub;": "⫔", - "supsup;": "⫖", - "swarhk;": "⤦", - "swnwar;": "⤪", - "target;": "⌖", - "Tcaron;": "Ť", - "tcaron;": "ť", - "Tcedil;": "Ţ", - "tcedil;": "ţ", - "telrec;": "⌕", - "there4;": "∴", - "thetav;": "ϑ", - "thinsp;": " ", - "thksim;": "∼", - "timesb;": "⊠", - "timesd;": "⨰", - "topbot;": "⌶", - "topcir;": "⫱", - "tprime;": "‴", - "tridot;": "◬", - "Tstrok;": "Ŧ", - "tstrok;": "ŧ", - "Uacute;": "Ú", - "uacute;": "ú", - "Ubreve;": "Ŭ", - "ubreve;": "ŭ", - "Udblac;": "Ű", - "udblac;": "ű", - "ufisht;": "⥾", - "Ugrave;": "Ù", - "ugrave;": "ù", - "ulcorn;": "⌜", - "ulcrop;": "⌏", - "urcorn;": "⌝", - "urcrop;": "⌎", - "Utilde;": "Ũ", - "utilde;": "ũ", - "vangrt;": "⦜", - "varphi;": "ϕ", - "varrho;": "ϱ", - "Vdashl;": "⫦", - "veebar;": "⊻", - "vellip;": "⋮", - "Verbar;": "‖", - "verbar;": "|", - "vsubnE;": "⫋︀", - "vsubne;": "⊊︀", - "vsupnE;": "⫌︀", - "vsupne;": "⊋︀", - "Vvdash;": "⊪", - "wedbar;": "⩟", - "wedgeq;": "≙", - "weierp;": "℘", - "wreath;": "≀", - "xoplus;": "⨁", - "xotime;": "⨂", - "xsqcup;": "⨆", - "xuplus;": "⨄", - "xwedge;": "⋀", - "Yacute;": "Ý", - "yacute;": "ý", - "Zacute;": "Ź", - "zacute;": "ź", - "Zcaron;": "Ž", - "zcaron;": "ž", - "zeetrf;": "ℨ", - "alefsym;": "ℵ", - "angrtvb;": "⊾", - "angzarr;": "⍼", - "asympeq;": "≍", - "backsim;": "∽", - "Because;": "∵", - "because;": "∵", - "bemptyv;": "⦰", - "between;": "≬", - "bigcirc;": "◯", - "bigodot;": "⨀", - "bigstar;": "★", - "bnequiv;": "≡⃥", - "boxplus;": "⊞", - "Cayleys;": "ℭ", - "Cconint;": "∰", - "ccupssm;": "⩐", - "Cedilla;": "¸", - "cemptyv;": "⦲", - "cirscir;": "⧂", - "coloneq;": "≔", - "congdot;": "⩭", - "cudarrl;": "⤸", - "cudarrr;": "⤵", - "cularrp;": "⤽", - "curarrm;": "⤼", - "dbkarow;": "⤏", - "ddagger;": "‡", - "ddotseq;": "⩷", - "demptyv;": "⦱", - "Diamond;": "⋄", - "diamond;": "⋄", - "digamma;": "ϝ", - "dotplus;": "∔", - "DownTee;": "⊤", - "dwangle;": "⦦", - "Element;": "∈", - "Epsilon;": "Ε", - "epsilon;": "ε", - "eqcolon;": "≕", - "equivDD;": "⩸", - "gesdoto;": "⪂", - "gtquest;": "⩼", - "gtrless;": "≷", - "harrcir;": "⥈", - "Implies;": "⇒", - "intprod;": "⨼", - "isindot;": "⋵", - "larrbfs;": "⤟", - "larrsim;": "⥳", - "lbrksld;": "⦏", - "lbrkslu;": "⦍", - "ldrdhar;": "⥧", - "LeftTee;": "⊣", - "lesdoto;": "⪁", - "lessdot;": "⋖", - "lessgtr;": "≶", - "lesssim;": "≲", - "lotimes;": "⨴", - "lozenge;": "◊", - "ltquest;": "⩻", - "luruhar;": "⥦", - "maltese;": "✠", - "minusdu;": "⨪", - "napprox;": "≉", - "natural;": "♮", - "nearrow;": "↗", - "NewLine;": "\n", - "nexists;": "∄", - "NoBreak;": "⁠", - "notinva;": "∉", - "notinvb;": "⋷", - "notinvc;": "⋶", - "NotLess;": "≮", - "notniva;": "∌", - "notnivb;": "⋾", - "notnivc;": "⋽", - "npolint;": "⨔", - "npreceq;": "⪯̸", - "nsqsube;": "⋢", - "nsqsupe;": "⋣", - "nsubset;": "⊂⃒", - "nsucceq;": "⪰̸", - "nsupset;": "⊃⃒", - "nvinfin;": "⧞", - "nvltrie;": "⊴⃒", - "nvrtrie;": "⊵⃒", - "nwarrow;": "↖", - "olcross;": "⦻", - "Omicron;": "Ο", - "omicron;": "ο", - "orderof;": "ℴ", - "orslope;": "⩗", - "OverBar;": "‾", - "pertenk;": "‱", - "planckh;": "ℎ", - "pluscir;": "⨢", - "plussim;": "⨦", - "plustwo;": "⨧", - "precsim;": "≾", - "Product;": "∏", - "quatint;": "⨖", - "questeq;": "≟", - "rarrbfs;": "⤠", - "rarrsim;": "⥴", - "rbrksld;": "⦎", - "rbrkslu;": "⦐", - "rdldhar;": "⥩", - "realine;": "ℛ", - "rotimes;": "⨵", - "ruluhar;": "⥨", - "searrow;": "↘", - "simplus;": "⨤", - "simrarr;": "⥲", - "subedot;": "⫃", - "submult;": "⫁", - "subplus;": "⪿", - "subrarr;": "⥹", - "succsim;": "≿", - "supdsub;": "⫘", - "supedot;": "⫄", - "suphsol;": "⟉", - "suphsub;": "⫗", - "suplarr;": "⥻", - "supmult;": "⫂", - "supplus;": "⫀", - "swarrow;": "↙", - "topfork;": "⫚", - "triplus;": "⨹", - "tritime;": "⨻", - "UpArrow;": "↑", - "Uparrow;": "⇑", - "uparrow;": "↑", - "Upsilon;": "Υ", - "upsilon;": "υ", - "uwangle;": "⦧", - "vzigzag;": "⦚", - "zigrarr;": "⇝", - "andslope;": "⩘", - "angmsdaa;": "⦨", - "angmsdab;": "⦩", - "angmsdac;": "⦪", - "angmsdad;": "⦫", - "angmsdae;": "⦬", - "angmsdaf;": "⦭", - "angmsdag;": "⦮", - "angmsdah;": "⦯", - "angrtvbd;": "⦝", - "approxeq;": "≊", - "awconint;": "∳", - "backcong;": "≌", - "barwedge;": "⌅", - "bbrktbrk;": "⎶", - "bigoplus;": "⨁", - "bigsqcup;": "⨆", - "biguplus;": "⨄", - "bigwedge;": "⋀", - "boxminus;": "⊟", - "boxtimes;": "⊠", - "bsolhsub;": "⟈", - "capbrcup;": "⩉", - "circledR;": "®", - "circledS;": "Ⓢ", - "cirfnint;": "⨐", - "clubsuit;": "♣", - "cupbrcap;": "⩈", - "curlyvee;": "⋎", - "cwconint;": "∲", - "DDotrahd;": "⤑", - "doteqdot;": "≑", - "DotEqual;": "≐", - "dotminus;": "∸", - "drbkarow;": "⤐", - "dzigrarr;": "⟿", - "elinters;": "⏧", - "emptyset;": "∅", - "eqvparsl;": "⧥", - "fpartint;": "⨍", - "geqslant;": "⩾", - "gesdotol;": "⪄", - "gnapprox;": "⪊", - "hksearow;": "⤥", - "hkswarow;": "⤦", - "imagline;": "ℐ", - "imagpart;": "ℑ", - "infintie;": "⧝", - "integers;": "ℤ", - "Integral;": "∫", - "intercal;": "⊺", - "intlarhk;": "⨗", - "laemptyv;": "⦴", - "ldrushar;": "⥋", - "leqslant;": "⩽", - "lesdotor;": "⪃", - "LessLess;": "⪡", - "llcorner;": "⌞", - "lnapprox;": "⪉", - "lrcorner;": "⌟", - "lurdshar;": "⥊", - "mapstoup;": "↥", - "multimap;": "⊸", - "naturals;": "ℕ", - "ncongdot;": "⩭̸", - "NotEqual;": "≠", - "notindot;": "⋵̸", - "NotTilde;": "≁", - "otimesas;": "⨶", - "parallel;": "∥", - "PartialD;": "∂", - "plusacir;": "⨣", - "pointint;": "⨕", - "Precedes;": "≺", - "precneqq;": "⪵", - "precnsim;": "⋨", - "profalar;": "⌮", - "profline;": "⌒", - "profsurf;": "⌓", - "raemptyv;": "⦳", - "realpart;": "ℜ", - "RightTee;": "⊢", - "rppolint;": "⨒", - "rtriltri;": "⧎", - "scpolint;": "⨓", - "setminus;": "∖", - "shortmid;": "∣", - "smeparsl;": "⧤", - "sqsubset;": "⊏", - "sqsupset;": "⊐", - "subseteq;": "⊆", - "Succeeds;": "≻", - "succneqq;": "⪶", - "succnsim;": "⋩", - "SuchThat;": "∋", - "Superset;": "⊃", - "supseteq;": "⊇", - "thetasym;": "ϑ", - "thicksim;": "∼", - "timesbar;": "⨱", - "triangle;": "▵", - "triminus;": "⨺", - "trpezium;": "⏢", - "Uarrocir;": "⥉", - "ulcorner;": "⌜", - "UnderBar;": "_", - "urcorner;": "⌝", - "varkappa;": "ϰ", - "varsigma;": "ς", - "vartheta;": "ϑ", - "backprime;": "‵", - "backsimeq;": "⋍", - "Backslash;": "∖", - "bigotimes;": "⨂", - "CenterDot;": "·", - "centerdot;": "·", - "checkmark;": "✓", - "CircleDot;": "⊙", - "complexes;": "ℂ", - "Congruent;": "≡", - "Coproduct;": "∐", - "dotsquare;": "⊡", - "DoubleDot;": "¨", - "DownArrow;": "↓", - "Downarrow;": "⇓", - "downarrow;": "↓", - "DownBreve;": "̑", - "gtrapprox;": "⪆", - "gtreqless;": "⋛", - "gvertneqq;": "≩︀", - "heartsuit;": "♥", - "HumpEqual;": "≏", - "LeftArrow;": "←", - "Leftarrow;": "⇐", - "leftarrow;": "←", - "LeftFloor;": "⌊", - "lesseqgtr;": "⋚", - "LessTilde;": "≲", - "lvertneqq;": "≨︀", - "Mellintrf;": "ℳ", - "MinusPlus;": "∓", - "ngeqslant;": "⩾̸", - "nleqslant;": "⩽̸", - "NotCupCap;": "≭", - "NotExists;": "∄", - "NotSubset;": "⊂⃒", - "nparallel;": "∦", - "nshortmid;": "∤", - "nsubseteq;": "⊈", - "nsupseteq;": "⊉", - "OverBrace;": "⏞", - "pitchfork;": "⋔", - "PlusMinus;": "±", - "rationals;": "ℚ", - "spadesuit;": "♠", - "subseteqq;": "⫅", - "subsetneq;": "⊊", - "supseteqq;": "⫆", - "supsetneq;": "⊋", - "Therefore;": "∴", - "therefore;": "∴", - "ThinSpace;": " ", - "triangleq;": "≜", - "TripleDot;": "⃛", - "UnionPlus;": "⊎", - "varpropto;": "∝", - "Bernoullis;": "ℬ", - "circledast;": "⊛", - "CirclePlus;": "⊕", - "complement;": "∁", - "curlywedge;": "⋏", - "eqslantgtr;": "⪖", - "EqualTilde;": "≂", - "Fouriertrf;": "ℱ", - "gtreqqless;": "⪌", - "ImaginaryI;": "ⅈ", - "Laplacetrf;": "ℒ", - "LeftVector;": "↼", - "lessapprox;": "⪅", - "lesseqqgtr;": "⪋", - "Lleftarrow;": "⇚", - "lmoustache;": "⎰", - "longmapsto;": "⟼", - "mapstodown;": "↧", - "mapstoleft;": "↤", - "nLeftarrow;": "⇍", - "nleftarrow;": "↚", - "NotElement;": "∉", - "NotGreater;": "≯", - "nsubseteqq;": "⫅̸", - "nsupseteqq;": "⫆̸", - "precapprox;": "⪷", - "Proportion;": "∷", - "RightArrow;": "→", - "Rightarrow;": "⇒", - "rightarrow;": "→", - "RightFloor;": "⌋", - "rmoustache;": "⎱", - "sqsubseteq;": "⊑", - "sqsupseteq;": "⊒", - "subsetneqq;": "⫋", - "succapprox;": "⪸", - "supsetneqq;": "⫌", - "ThickSpace;": "  ", - "TildeEqual;": "≃", - "TildeTilde;": "≈", - "UnderBrace;": "⏟", - "UpArrowBar;": "⤒", - "UpTeeArrow;": "↥", - "upuparrows;": "⇈", - "varepsilon;": "ϵ", - "varnothing;": "∅", - "backepsilon;": "϶", - "blacksquare;": "▪", - "circledcirc;": "⊚", - "circleddash;": "⊝", - "CircleMinus;": "⊖", - "CircleTimes;": "⊗", - "curlyeqprec;": "⋞", - "curlyeqsucc;": "⋟", - "diamondsuit;": "♦", - "eqslantless;": "⪕", - "Equilibrium;": "⇌", - "expectation;": "ℰ", - "GreaterLess;": "≷", - "LeftCeiling;": "⌈", - "LessGreater;": "≶", - "MediumSpace;": " ", - "NotLessLess;": "≪̸", - "NotPrecedes;": "⊀", - "NotSucceeds;": "⊁", - "NotSuperset;": "⊃⃒", - "nRightarrow;": "⇏", - "nrightarrow;": "↛", - "OverBracket;": "⎴", - "preccurlyeq;": "≼", - "precnapprox;": "⪹", - "quaternions;": "ℍ", - "RightVector;": "⇀", - "Rrightarrow;": "⇛", - "RuleDelayed;": "⧴", - "SmallCircle;": "∘", - "SquareUnion;": "⊔", - "straightphi;": "ϕ", - "SubsetEqual;": "⊆", - "succcurlyeq;": "≽", - "succnapprox;": "⪺", - "thickapprox;": "≈", - "UpDownArrow;": "↕", - "Updownarrow;": "⇕", - "updownarrow;": "↕", - "VerticalBar;": "∣", - "blacklozenge;": "⧫", - "DownArrowBar;": "⤓", - "DownTeeArrow;": "↧", - "ExponentialE;": "ⅇ", - "exponentiale;": "ⅇ", - "GreaterEqual;": "≥", - "GreaterTilde;": "≳", - "HilbertSpace;": "ℋ", - "HumpDownHump;": "≎", - "Intersection;": "⋂", - "LeftArrowBar;": "⇤", - "LeftTeeArrow;": "↤", - "LeftTriangle;": "⊲", - "LeftUpVector;": "↿", - "NotCongruent;": "≢", - "NotHumpEqual;": "≏̸", - "NotLessEqual;": "≰", - "NotLessTilde;": "≴", - "Proportional;": "∝", - "RightCeiling;": "⌉", - "risingdotseq;": "≓", - "RoundImplies;": "⥰", - "ShortUpArrow;": "↑", - "SquareSubset;": "⊏", - "triangledown;": "▿", - "triangleleft;": "◃", - "UnderBracket;": "⎵", - "varsubsetneq;": "⊊︀", - "varsupsetneq;": "⊋︀", - "VerticalLine;": "|", - "ApplyFunction;": "⁡", - "bigtriangleup;": "△", - "blacktriangle;": "▴", - "DifferentialD;": "ⅆ", - "divideontimes;": "⋇", - "DoubleLeftTee;": "⫤", - "DoubleUpArrow;": "⇑", - "fallingdotseq;": "≒", - "hookleftarrow;": "↩", - "leftarrowtail;": "↢", - "leftharpoonup;": "↼", - "LeftTeeVector;": "⥚", - "LeftVectorBar;": "⥒", - "LessFullEqual;": "≦", - "LongLeftArrow;": "⟵", - "Longleftarrow;": "⟸", - "longleftarrow;": "⟵", - "looparrowleft;": "↫", - "measuredangle;": "∡", - "NotEqualTilde;": "≂̸", - "NotTildeEqual;": "≄", - "NotTildeTilde;": "≉", - "ntriangleleft;": "⋪", - "Poincareplane;": "ℌ", - "PrecedesEqual;": "⪯", - "PrecedesTilde;": "≾", - "RightArrowBar;": "⇥", - "RightTeeArrow;": "↦", - "RightTriangle;": "⊳", - "RightUpVector;": "↾", - "shortparallel;": "∥", - "smallsetminus;": "∖", - "SucceedsEqual;": "⪰", - "SucceedsTilde;": "≿", - "SupersetEqual;": "⊇", - "triangleright;": "▹", - "UpEquilibrium;": "⥮", - "upharpoonleft;": "↿", - "varsubsetneqq;": "⫋︀", - "varsupsetneqq;": "⫌︀", - "VerticalTilde;": "≀", - "VeryThinSpace;": " ", - "curvearrowleft;": "↶", - "DiacriticalDot;": "˙", - "doublebarwedge;": "⌆", - "DoubleRightTee;": "⊨", - "downdownarrows;": "⇊", - "DownLeftVector;": "↽", - "GreaterGreater;": "⪢", - "hookrightarrow;": "↪", - "HorizontalLine;": "─", - "InvisibleComma;": "⁣", - "InvisibleTimes;": "⁢", - "LeftDownVector;": "⇃", - "leftleftarrows;": "⇇", - "LeftRightArrow;": "↔", - "Leftrightarrow;": "⇔", - "leftrightarrow;": "↔", - "leftthreetimes;": "⋋", - "LessSlantEqual;": "⩽", - "LongRightArrow;": "⟶", - "Longrightarrow;": "⟹", - "longrightarrow;": "⟶", - "looparrowright;": "↬", - "LowerLeftArrow;": "↙", - "NestedLessLess;": "≪", - "NotGreaterLess;": "≹", - "NotLessGreater;": "≸", - "NotSubsetEqual;": "⊈", - "NotVerticalBar;": "∤", - "nshortparallel;": "∦", - "ntriangleright;": "⋫", - "OpenCurlyQuote;": "‘", - "ReverseElement;": "∋", - "rightarrowtail;": "↣", - "rightharpoonup;": "⇀", - "RightTeeVector;": "⥛", - "RightVectorBar;": "⥓", - "ShortDownArrow;": "↓", - "ShortLeftArrow;": "←", - "SquareSuperset;": "⊐", - "TildeFullEqual;": "≅", - "trianglelefteq;": "⊴", - "upharpoonright;": "↾", - "UpperLeftArrow;": "↖", - "ZeroWidthSpace;": "​", - "bigtriangledown;": "▽", - "circlearrowleft;": "↺", - "CloseCurlyQuote;": "’", - "ContourIntegral;": "∮", - "curvearrowright;": "↷", - "DoubleDownArrow;": "⇓", - "DoubleLeftArrow;": "⇐", - "downharpoonleft;": "⇃", - "DownRightVector;": "⇁", - "leftharpoondown;": "↽", - "leftrightarrows;": "⇆", - "LeftRightVector;": "⥎", - "LeftTriangleBar;": "⧏", - "LeftUpTeeVector;": "⥠", - "LeftUpVectorBar;": "⥘", - "LowerRightArrow;": "↘", - "nLeftrightarrow;": "⇎", - "nleftrightarrow;": "↮", - "NotGreaterEqual;": "≱", - "NotGreaterTilde;": "≵", - "NotHumpDownHump;": "≎̸", - "NotLeftTriangle;": "⋪", - "NotSquareSubset;": "⊏̸", - "ntrianglelefteq;": "⋬", - "OverParenthesis;": "⏜", - "RightDownVector;": "⇂", - "rightleftarrows;": "⇄", - "rightsquigarrow;": "↝", - "rightthreetimes;": "⋌", - "ShortRightArrow;": "→", - "straightepsilon;": "ϵ", - "trianglerighteq;": "⊵", - "UpperRightArrow;": "↗", - "vartriangleleft;": "⊲", - "circlearrowright;": "↻", - "DiacriticalAcute;": "´", - "DiacriticalGrave;": "`", - "DiacriticalTilde;": "˜", - "DoubleRightArrow;": "⇒", - "DownArrowUpArrow;": "⇵", - "downharpoonright;": "⇂", - "EmptySmallSquare;": "◻", - "GreaterEqualLess;": "⋛", - "GreaterFullEqual;": "≧", - "LeftAngleBracket;": "⟨", - "LeftUpDownVector;": "⥑", - "LessEqualGreater;": "⋚", - "NonBreakingSpace;": " ", - "NotPrecedesEqual;": "⪯̸", - "NotRightTriangle;": "⋫", - "NotSucceedsEqual;": "⪰̸", - "NotSucceedsTilde;": "≿̸", - "NotSupersetEqual;": "⊉", - "ntrianglerighteq;": "⋭", - "rightharpoondown;": "⇁", - "rightrightarrows;": "⇉", - "RightTriangleBar;": "⧐", - "RightUpTeeVector;": "⥜", - "RightUpVectorBar;": "⥔", - "twoheadleftarrow;": "↞", - "UnderParenthesis;": "⏝", - "UpArrowDownArrow;": "⇅", - "vartriangleright;": "⊳", - "blacktriangledown;": "▾", - "blacktriangleleft;": "◂", - "DoubleUpDownArrow;": "⇕", - "DoubleVerticalBar;": "∥", - "DownLeftTeeVector;": "⥞", - "DownLeftVectorBar;": "⥖", - "FilledSmallSquare;": "◼", - "GreaterSlantEqual;": "⩾", - "LeftDoubleBracket;": "⟦", - "LeftDownTeeVector;": "⥡", - "LeftDownVectorBar;": "⥙", - "leftrightharpoons;": "⇋", - "LeftTriangleEqual;": "⊴", - "NegativeThinSpace;": "​", - "NotGreaterGreater;": "≫̸", - "NotLessSlantEqual;": "⩽̸", - "NotNestedLessLess;": "⪡̸", - "NotReverseElement;": "∌", - "NotSquareSuperset;": "⊐̸", - "NotTildeFullEqual;": "≇", - "RightAngleBracket;": "⟩", - "rightleftharpoons;": "⇌", - "RightUpDownVector;": "⥏", - "SquareSubsetEqual;": "⊑", - "twoheadrightarrow;": "↠", - "VerticalSeparator;": "❘", - "blacktriangleright;": "▸", - "DownRightTeeVector;": "⥟", - "DownRightVectorBar;": "⥗", - "LongLeftRightArrow;": "⟷", - "Longleftrightarrow;": "⟺", - "longleftrightarrow;": "⟷", - "NegativeThickSpace;": "​", - "NotLeftTriangleBar;": "⧏̸", - "PrecedesSlantEqual;": "≼", - "ReverseEquilibrium;": "⇋", - "RightDoubleBracket;": "⟧", - "RightDownTeeVector;": "⥝", - "RightDownVectorBar;": "⥕", - "RightTriangleEqual;": "⊵", - "SquareIntersection;": "⊓", - "SucceedsSlantEqual;": "≽", - "DoubleLongLeftArrow;": "⟸", - "DownLeftRightVector;": "⥐", - "LeftArrowRightArrow;": "⇆", - "leftrightsquigarrow;": "↭", - "NegativeMediumSpace;": "​", - "NotGreaterFullEqual;": "≧̸", - "NotRightTriangleBar;": "⧐̸", - "RightArrowLeftArrow;": "⇄", - "SquareSupersetEqual;": "⊒", - "CapitalDifferentialD;": "ⅅ", - "DoubleLeftRightArrow;": "⇔", - "DoubleLongRightArrow;": "⟹", - "EmptyVerySmallSquare;": "▫", - "NestedGreaterGreater;": "≫", - "NotDoubleVerticalBar;": "∦", - "NotGreaterSlantEqual;": "⩾̸", - "NotLeftTriangleEqual;": "⋬", - "NotSquareSubsetEqual;": "⋢", - "OpenCurlyDoubleQuote;": "“", - "ReverseUpEquilibrium;": "⥯", - "CloseCurlyDoubleQuote;": "”", - "DoubleContourIntegral;": "∯", - "FilledVerySmallSquare;": "▪", - "NegativeVeryThinSpace;": "​", - "NotPrecedesSlantEqual;": "⋠", - "NotRightTriangleEqual;": "⋭", - "NotSucceedsSlantEqual;": "⋡", - "DiacriticalDoubleAcute;": "˝", - "NotSquareSupersetEqual;": "⋣", - "NotNestedGreaterGreater;": "⪢̸", - "ClockwiseContourIntegral;": "∲", - "DoubleLongLeftRightArrow;": "⟺", - "CounterClockwiseContourIntegral;": "∳" -} diff --git a/packages/compiler-dom/src/parserOptions.ts b/packages/compiler-dom/src/parserOptions.ts index 3a298835d..29f76b7fd 100644 --- a/packages/compiler-dom/src/parserOptions.ts +++ b/packages/compiler-dom/src/parserOptions.ts @@ -1,7 +1,6 @@ import { ParserOptions, ElementNode, NodeTypes } from '@vue/compiler-core' import { isVoidTag, isHTMLTag, isSVGTag } from '@vue/shared' import { TRANSITION, TRANSITION_GROUP } from './runtimeHelpers' -import { decodeHtml } from './decodeHtml' import { decodeHtmlBrowser } from './decodeHtmlBrowser' export const enum DOMNamespaces { @@ -15,7 +14,7 @@ export const parserOptions: ParserOptions = { isVoidTag, isNativeTag: tag => isHTMLTag(tag) || isSVGTag(tag), isPreTag: tag => tag === 'pre', - decodeEntities: __BROWSER__ ? decodeHtmlBrowser : decodeHtml, + decodeEntities: __BROWSER__ ? decodeHtmlBrowser : undefined, isBuiltInComponent: (tag: string): symbol | undefined => { if (tag === 'Transition' || tag === 'transition') { diff --git a/rollup.config.js b/rollup.config.js index d8dfc98a3..44d01861d 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -215,7 +215,12 @@ function createConfig(format, output, plugins = []) { } function resolveExternal() { - const treeShakenDeps = ['source-map-js', '@babel/parser', 'estree-walker'] + const treeShakenDeps = [ + 'source-map-js', + '@babel/parser', + 'estree-walker', + 'entities/lib/decode.js' + ] if (isGlobalBuild || isBrowserESMBuild || isCompatPackage) { if (!packageOptions.enableNonBrowserBranches) {