markdown-it
Advanced tools
Comparing version 3.1.0 to 4.0.0
@@ -0,1 +1,19 @@ | ||
4.0.0 / 2015-03-11 | ||
------------------ | ||
- Breaking internal API changes. See [v4 migration notes](https://github.com/markdown-it/markdown-it/blob/master/docs/4.0_migration.md). In usual case you will need to update plugins. | ||
- Token internals changed | ||
- Unified the most of renderer methods. | ||
- Changed tokens creation - use `state.push(...)` (see sources) | ||
- Moved `normalizeUrl()` to root class as `.normalizeLink()` & | ||
added `normalizeLinkText()` method. | ||
- Moved `.validateUrl()` to root class and simplified logic - no more need to | ||
replace entities. | ||
- Joined md unescape & replace entities logic to `utils.unescapeAll()`. | ||
- Removed `replaceEntities()` in `utils`. | ||
- `md.utils.lib` now exposes useful libs for plugins. | ||
- Use entities data from external package. | ||
- Fixed emphasis regression, caused by CM v0.18 spec (#65). | ||
3.1.0 / 2015-03-05 | ||
@@ -2,0 +20,0 @@ ------------------ |
@@ -1,2134 +0,6 @@ | ||
// List of valid entities | ||
// HTML5 entities map: { name -> utf16string } | ||
// | ||
// Generate with ./support/entities.js script | ||
// | ||
'use strict'; | ||
/*eslint quotes:0*/ | ||
module.exports = { | ||
"Aacute":"\u00C1", | ||
"aacute":"\u00E1", | ||
"Abreve":"\u0102", | ||
"abreve":"\u0103", | ||
"ac":"\u223E", | ||
"acd":"\u223F", | ||
"acE":"\u223E\u0333", | ||
"Acirc":"\u00C2", | ||
"acirc":"\u00E2", | ||
"acute":"\u00B4", | ||
"Acy":"\u0410", | ||
"acy":"\u0430", | ||
"AElig":"\u00C6", | ||
"aelig":"\u00E6", | ||
"af":"\u2061", | ||
"Afr":"\uD835\uDD04", | ||
"afr":"\uD835\uDD1E", | ||
"Agrave":"\u00C0", | ||
"agrave":"\u00E0", | ||
"alefsym":"\u2135", | ||
"aleph":"\u2135", | ||
"Alpha":"\u0391", | ||
"alpha":"\u03B1", | ||
"Amacr":"\u0100", | ||
"amacr":"\u0101", | ||
"amalg":"\u2A3F", | ||
"AMP":"\u0026", | ||
"amp":"\u0026", | ||
"And":"\u2A53", | ||
"and":"\u2227", | ||
"andand":"\u2A55", | ||
"andd":"\u2A5C", | ||
"andslope":"\u2A58", | ||
"andv":"\u2A5A", | ||
"ang":"\u2220", | ||
"ange":"\u29A4", | ||
"angle":"\u2220", | ||
"angmsd":"\u2221", | ||
"angmsdaa":"\u29A8", | ||
"angmsdab":"\u29A9", | ||
"angmsdac":"\u29AA", | ||
"angmsdad":"\u29AB", | ||
"angmsdae":"\u29AC", | ||
"angmsdaf":"\u29AD", | ||
"angmsdag":"\u29AE", | ||
"angmsdah":"\u29AF", | ||
"angrt":"\u221F", | ||
"angrtvb":"\u22BE", | ||
"angrtvbd":"\u299D", | ||
"angsph":"\u2222", | ||
"angst":"\u00C5", | ||
"angzarr":"\u237C", | ||
"Aogon":"\u0104", | ||
"aogon":"\u0105", | ||
"Aopf":"\uD835\uDD38", | ||
"aopf":"\uD835\uDD52", | ||
"ap":"\u2248", | ||
"apacir":"\u2A6F", | ||
"apE":"\u2A70", | ||
"ape":"\u224A", | ||
"apid":"\u224B", | ||
"apos":"\u0027", | ||
"ApplyFunction":"\u2061", | ||
"approx":"\u2248", | ||
"approxeq":"\u224A", | ||
"Aring":"\u00C5", | ||
"aring":"\u00E5", | ||
"Ascr":"\uD835\uDC9C", | ||
"ascr":"\uD835\uDCB6", | ||
"Assign":"\u2254", | ||
"ast":"\u002A", | ||
"asymp":"\u2248", | ||
"asympeq":"\u224D", | ||
"Atilde":"\u00C3", | ||
"atilde":"\u00E3", | ||
"Auml":"\u00C4", | ||
"auml":"\u00E4", | ||
"awconint":"\u2233", | ||
"awint":"\u2A11", | ||
"backcong":"\u224C", | ||
"backepsilon":"\u03F6", | ||
"backprime":"\u2035", | ||
"backsim":"\u223D", | ||
"backsimeq":"\u22CD", | ||
"Backslash":"\u2216", | ||
"Barv":"\u2AE7", | ||
"barvee":"\u22BD", | ||
"Barwed":"\u2306", | ||
"barwed":"\u2305", | ||
"barwedge":"\u2305", | ||
"bbrk":"\u23B5", | ||
"bbrktbrk":"\u23B6", | ||
"bcong":"\u224C", | ||
"Bcy":"\u0411", | ||
"bcy":"\u0431", | ||
"bdquo":"\u201E", | ||
"becaus":"\u2235", | ||
"Because":"\u2235", | ||
"because":"\u2235", | ||
"bemptyv":"\u29B0", | ||
"bepsi":"\u03F6", | ||
"bernou":"\u212C", | ||
"Bernoullis":"\u212C", | ||
"Beta":"\u0392", | ||
"beta":"\u03B2", | ||
"beth":"\u2136", | ||
"between":"\u226C", | ||
"Bfr":"\uD835\uDD05", | ||
"bfr":"\uD835\uDD1F", | ||
"bigcap":"\u22C2", | ||
"bigcirc":"\u25EF", | ||
"bigcup":"\u22C3", | ||
"bigodot":"\u2A00", | ||
"bigoplus":"\u2A01", | ||
"bigotimes":"\u2A02", | ||
"bigsqcup":"\u2A06", | ||
"bigstar":"\u2605", | ||
"bigtriangledown":"\u25BD", | ||
"bigtriangleup":"\u25B3", | ||
"biguplus":"\u2A04", | ||
"bigvee":"\u22C1", | ||
"bigwedge":"\u22C0", | ||
"bkarow":"\u290D", | ||
"blacklozenge":"\u29EB", | ||
"blacksquare":"\u25AA", | ||
"blacktriangle":"\u25B4", | ||
"blacktriangledown":"\u25BE", | ||
"blacktriangleleft":"\u25C2", | ||
"blacktriangleright":"\u25B8", | ||
"blank":"\u2423", | ||
"blk12":"\u2592", | ||
"blk14":"\u2591", | ||
"blk34":"\u2593", | ||
"block":"\u2588", | ||
"bne":"\u003D\u20E5", | ||
"bnequiv":"\u2261\u20E5", | ||
"bNot":"\u2AED", | ||
"bnot":"\u2310", | ||
"Bopf":"\uD835\uDD39", | ||
"bopf":"\uD835\uDD53", | ||
"bot":"\u22A5", | ||
"bottom":"\u22A5", | ||
"bowtie":"\u22C8", | ||
"boxbox":"\u29C9", | ||
"boxDL":"\u2557", | ||
"boxDl":"\u2556", | ||
"boxdL":"\u2555", | ||
"boxdl":"\u2510", | ||
"boxDR":"\u2554", | ||
"boxDr":"\u2553", | ||
"boxdR":"\u2552", | ||
"boxdr":"\u250C", | ||
"boxH":"\u2550", | ||
"boxh":"\u2500", | ||
"boxHD":"\u2566", | ||
"boxHd":"\u2564", | ||
"boxhD":"\u2565", | ||
"boxhd":"\u252C", | ||
"boxHU":"\u2569", | ||
"boxHu":"\u2567", | ||
"boxhU":"\u2568", | ||
"boxhu":"\u2534", | ||
"boxminus":"\u229F", | ||
"boxplus":"\u229E", | ||
"boxtimes":"\u22A0", | ||
"boxUL":"\u255D", | ||
"boxUl":"\u255C", | ||
"boxuL":"\u255B", | ||
"boxul":"\u2518", | ||
"boxUR":"\u255A", | ||
"boxUr":"\u2559", | ||
"boxuR":"\u2558", | ||
"boxur":"\u2514", | ||
"boxV":"\u2551", | ||
"boxv":"\u2502", | ||
"boxVH":"\u256C", | ||
"boxVh":"\u256B", | ||
"boxvH":"\u256A", | ||
"boxvh":"\u253C", | ||
"boxVL":"\u2563", | ||
"boxVl":"\u2562", | ||
"boxvL":"\u2561", | ||
"boxvl":"\u2524", | ||
"boxVR":"\u2560", | ||
"boxVr":"\u255F", | ||
"boxvR":"\u255E", | ||
"boxvr":"\u251C", | ||
"bprime":"\u2035", | ||
"Breve":"\u02D8", | ||
"breve":"\u02D8", | ||
"brvbar":"\u00A6", | ||
"Bscr":"\u212C", | ||
"bscr":"\uD835\uDCB7", | ||
"bsemi":"\u204F", | ||
"bsim":"\u223D", | ||
"bsime":"\u22CD", | ||
"bsol":"\u005C", | ||
"bsolb":"\u29C5", | ||
"bsolhsub":"\u27C8", | ||
"bull":"\u2022", | ||
"bullet":"\u2022", | ||
"bump":"\u224E", | ||
"bumpE":"\u2AAE", | ||
"bumpe":"\u224F", | ||
"Bumpeq":"\u224E", | ||
"bumpeq":"\u224F", | ||
"Cacute":"\u0106", | ||
"cacute":"\u0107", | ||
"Cap":"\u22D2", | ||
"cap":"\u2229", | ||
"capand":"\u2A44", | ||
"capbrcup":"\u2A49", | ||
"capcap":"\u2A4B", | ||
"capcup":"\u2A47", | ||
"capdot":"\u2A40", | ||
"CapitalDifferentialD":"\u2145", | ||
"caps":"\u2229\uFE00", | ||
"caret":"\u2041", | ||
"caron":"\u02C7", | ||
"Cayleys":"\u212D", | ||
"ccaps":"\u2A4D", | ||
"Ccaron":"\u010C", | ||
"ccaron":"\u010D", | ||
"Ccedil":"\u00C7", | ||
"ccedil":"\u00E7", | ||
"Ccirc":"\u0108", | ||
"ccirc":"\u0109", | ||
"Cconint":"\u2230", | ||
"ccups":"\u2A4C", | ||
"ccupssm":"\u2A50", | ||
"Cdot":"\u010A", | ||
"cdot":"\u010B", | ||
"cedil":"\u00B8", | ||
"Cedilla":"\u00B8", | ||
"cemptyv":"\u29B2", | ||
"cent":"\u00A2", | ||
"CenterDot":"\u00B7", | ||
"centerdot":"\u00B7", | ||
"Cfr":"\u212D", | ||
"cfr":"\uD835\uDD20", | ||
"CHcy":"\u0427", | ||
"chcy":"\u0447", | ||
"check":"\u2713", | ||
"checkmark":"\u2713", | ||
"Chi":"\u03A7", | ||
"chi":"\u03C7", | ||
"cir":"\u25CB", | ||
"circ":"\u02C6", | ||
"circeq":"\u2257", | ||
"circlearrowleft":"\u21BA", | ||
"circlearrowright":"\u21BB", | ||
"circledast":"\u229B", | ||
"circledcirc":"\u229A", | ||
"circleddash":"\u229D", | ||
"CircleDot":"\u2299", | ||
"circledR":"\u00AE", | ||
"circledS":"\u24C8", | ||
"CircleMinus":"\u2296", | ||
"CirclePlus":"\u2295", | ||
"CircleTimes":"\u2297", | ||
"cirE":"\u29C3", | ||
"cire":"\u2257", | ||
"cirfnint":"\u2A10", | ||
"cirmid":"\u2AEF", | ||
"cirscir":"\u29C2", | ||
"ClockwiseContourIntegral":"\u2232", | ||
"CloseCurlyDoubleQuote":"\u201D", | ||
"CloseCurlyQuote":"\u2019", | ||
"clubs":"\u2663", | ||
"clubsuit":"\u2663", | ||
"Colon":"\u2237", | ||
"colon":"\u003A", | ||
"Colone":"\u2A74", | ||
"colone":"\u2254", | ||
"coloneq":"\u2254", | ||
"comma":"\u002C", | ||
"commat":"\u0040", | ||
"comp":"\u2201", | ||
"compfn":"\u2218", | ||
"complement":"\u2201", | ||
"complexes":"\u2102", | ||
"cong":"\u2245", | ||
"congdot":"\u2A6D", | ||
"Congruent":"\u2261", | ||
"Conint":"\u222F", | ||
"conint":"\u222E", | ||
"ContourIntegral":"\u222E", | ||
"Copf":"\u2102", | ||
"copf":"\uD835\uDD54", | ||
"coprod":"\u2210", | ||
"Coproduct":"\u2210", | ||
"COPY":"\u00A9", | ||
"copy":"\u00A9", | ||
"copysr":"\u2117", | ||
"CounterClockwiseContourIntegral":"\u2233", | ||
"crarr":"\u21B5", | ||
"Cross":"\u2A2F", | ||
"cross":"\u2717", | ||
"Cscr":"\uD835\uDC9E", | ||
"cscr":"\uD835\uDCB8", | ||
"csub":"\u2ACF", | ||
"csube":"\u2AD1", | ||
"csup":"\u2AD0", | ||
"csupe":"\u2AD2", | ||
"ctdot":"\u22EF", | ||
"cudarrl":"\u2938", | ||
"cudarrr":"\u2935", | ||
"cuepr":"\u22DE", | ||
"cuesc":"\u22DF", | ||
"cularr":"\u21B6", | ||
"cularrp":"\u293D", | ||
"Cup":"\u22D3", | ||
"cup":"\u222A", | ||
"cupbrcap":"\u2A48", | ||
"CupCap":"\u224D", | ||
"cupcap":"\u2A46", | ||
"cupcup":"\u2A4A", | ||
"cupdot":"\u228D", | ||
"cupor":"\u2A45", | ||
"cups":"\u222A\uFE00", | ||
"curarr":"\u21B7", | ||
"curarrm":"\u293C", | ||
"curlyeqprec":"\u22DE", | ||
"curlyeqsucc":"\u22DF", | ||
"curlyvee":"\u22CE", | ||
"curlywedge":"\u22CF", | ||
"curren":"\u00A4", | ||
"curvearrowleft":"\u21B6", | ||
"curvearrowright":"\u21B7", | ||
"cuvee":"\u22CE", | ||
"cuwed":"\u22CF", | ||
"cwconint":"\u2232", | ||
"cwint":"\u2231", | ||
"cylcty":"\u232D", | ||
"Dagger":"\u2021", | ||
"dagger":"\u2020", | ||
"daleth":"\u2138", | ||
"Darr":"\u21A1", | ||
"dArr":"\u21D3", | ||
"darr":"\u2193", | ||
"dash":"\u2010", | ||
"Dashv":"\u2AE4", | ||
"dashv":"\u22A3", | ||
"dbkarow":"\u290F", | ||
"dblac":"\u02DD", | ||
"Dcaron":"\u010E", | ||
"dcaron":"\u010F", | ||
"Dcy":"\u0414", | ||
"dcy":"\u0434", | ||
"DD":"\u2145", | ||
"dd":"\u2146", | ||
"ddagger":"\u2021", | ||
"ddarr":"\u21CA", | ||
"DDotrahd":"\u2911", | ||
"ddotseq":"\u2A77", | ||
"deg":"\u00B0", | ||
"Del":"\u2207", | ||
"Delta":"\u0394", | ||
"delta":"\u03B4", | ||
"demptyv":"\u29B1", | ||
"dfisht":"\u297F", | ||
"Dfr":"\uD835\uDD07", | ||
"dfr":"\uD835\uDD21", | ||
"dHar":"\u2965", | ||
"dharl":"\u21C3", | ||
"dharr":"\u21C2", | ||
"DiacriticalAcute":"\u00B4", | ||
"DiacriticalDot":"\u02D9", | ||
"DiacriticalDoubleAcute":"\u02DD", | ||
"DiacriticalGrave":"\u0060", | ||
"DiacriticalTilde":"\u02DC", | ||
"diam":"\u22C4", | ||
"Diamond":"\u22C4", | ||
"diamond":"\u22C4", | ||
"diamondsuit":"\u2666", | ||
"diams":"\u2666", | ||
"die":"\u00A8", | ||
"DifferentialD":"\u2146", | ||
"digamma":"\u03DD", | ||
"disin":"\u22F2", | ||
"div":"\u00F7", | ||
"divide":"\u00F7", | ||
"divideontimes":"\u22C7", | ||
"divonx":"\u22C7", | ||
"DJcy":"\u0402", | ||
"djcy":"\u0452", | ||
"dlcorn":"\u231E", | ||
"dlcrop":"\u230D", | ||
"dollar":"\u0024", | ||
"Dopf":"\uD835\uDD3B", | ||
"dopf":"\uD835\uDD55", | ||
"Dot":"\u00A8", | ||
"dot":"\u02D9", | ||
"DotDot":"\u20DC", | ||
"doteq":"\u2250", | ||
"doteqdot":"\u2251", | ||
"DotEqual":"\u2250", | ||
"dotminus":"\u2238", | ||
"dotplus":"\u2214", | ||
"dotsquare":"\u22A1", | ||
"doublebarwedge":"\u2306", | ||
"DoubleContourIntegral":"\u222F", | ||
"DoubleDot":"\u00A8", | ||
"DoubleDownArrow":"\u21D3", | ||
"DoubleLeftArrow":"\u21D0", | ||
"DoubleLeftRightArrow":"\u21D4", | ||
"DoubleLeftTee":"\u2AE4", | ||
"DoubleLongLeftArrow":"\u27F8", | ||
"DoubleLongLeftRightArrow":"\u27FA", | ||
"DoubleLongRightArrow":"\u27F9", | ||
"DoubleRightArrow":"\u21D2", | ||
"DoubleRightTee":"\u22A8", | ||
"DoubleUpArrow":"\u21D1", | ||
"DoubleUpDownArrow":"\u21D5", | ||
"DoubleVerticalBar":"\u2225", | ||
"DownArrow":"\u2193", | ||
"Downarrow":"\u21D3", | ||
"downarrow":"\u2193", | ||
"DownArrowBar":"\u2913", | ||
"DownArrowUpArrow":"\u21F5", | ||
"DownBreve":"\u0311", | ||
"downdownarrows":"\u21CA", | ||
"downharpoonleft":"\u21C3", | ||
"downharpoonright":"\u21C2", | ||
"DownLeftRightVector":"\u2950", | ||
"DownLeftTeeVector":"\u295E", | ||
"DownLeftVector":"\u21BD", | ||
"DownLeftVectorBar":"\u2956", | ||
"DownRightTeeVector":"\u295F", | ||
"DownRightVector":"\u21C1", | ||
"DownRightVectorBar":"\u2957", | ||
"DownTee":"\u22A4", | ||
"DownTeeArrow":"\u21A7", | ||
"drbkarow":"\u2910", | ||
"drcorn":"\u231F", | ||
"drcrop":"\u230C", | ||
"Dscr":"\uD835\uDC9F", | ||
"dscr":"\uD835\uDCB9", | ||
"DScy":"\u0405", | ||
"dscy":"\u0455", | ||
"dsol":"\u29F6", | ||
"Dstrok":"\u0110", | ||
"dstrok":"\u0111", | ||
"dtdot":"\u22F1", | ||
"dtri":"\u25BF", | ||
"dtrif":"\u25BE", | ||
"duarr":"\u21F5", | ||
"duhar":"\u296F", | ||
"dwangle":"\u29A6", | ||
"DZcy":"\u040F", | ||
"dzcy":"\u045F", | ||
"dzigrarr":"\u27FF", | ||
"Eacute":"\u00C9", | ||
"eacute":"\u00E9", | ||
"easter":"\u2A6E", | ||
"Ecaron":"\u011A", | ||
"ecaron":"\u011B", | ||
"ecir":"\u2256", | ||
"Ecirc":"\u00CA", | ||
"ecirc":"\u00EA", | ||
"ecolon":"\u2255", | ||
"Ecy":"\u042D", | ||
"ecy":"\u044D", | ||
"eDDot":"\u2A77", | ||
"Edot":"\u0116", | ||
"eDot":"\u2251", | ||
"edot":"\u0117", | ||
"ee":"\u2147", | ||
"efDot":"\u2252", | ||
"Efr":"\uD835\uDD08", | ||
"efr":"\uD835\uDD22", | ||
"eg":"\u2A9A", | ||
"Egrave":"\u00C8", | ||
"egrave":"\u00E8", | ||
"egs":"\u2A96", | ||
"egsdot":"\u2A98", | ||
"el":"\u2A99", | ||
"Element":"\u2208", | ||
"elinters":"\u23E7", | ||
"ell":"\u2113", | ||
"els":"\u2A95", | ||
"elsdot":"\u2A97", | ||
"Emacr":"\u0112", | ||
"emacr":"\u0113", | ||
"empty":"\u2205", | ||
"emptyset":"\u2205", | ||
"EmptySmallSquare":"\u25FB", | ||
"emptyv":"\u2205", | ||
"EmptyVerySmallSquare":"\u25AB", | ||
"emsp":"\u2003", | ||
"emsp13":"\u2004", | ||
"emsp14":"\u2005", | ||
"ENG":"\u014A", | ||
"eng":"\u014B", | ||
"ensp":"\u2002", | ||
"Eogon":"\u0118", | ||
"eogon":"\u0119", | ||
"Eopf":"\uD835\uDD3C", | ||
"eopf":"\uD835\uDD56", | ||
"epar":"\u22D5", | ||
"eparsl":"\u29E3", | ||
"eplus":"\u2A71", | ||
"epsi":"\u03B5", | ||
"Epsilon":"\u0395", | ||
"epsilon":"\u03B5", | ||
"epsiv":"\u03F5", | ||
"eqcirc":"\u2256", | ||
"eqcolon":"\u2255", | ||
"eqsim":"\u2242", | ||
"eqslantgtr":"\u2A96", | ||
"eqslantless":"\u2A95", | ||
"Equal":"\u2A75", | ||
"equals":"\u003D", | ||
"EqualTilde":"\u2242", | ||
"equest":"\u225F", | ||
"Equilibrium":"\u21CC", | ||
"equiv":"\u2261", | ||
"equivDD":"\u2A78", | ||
"eqvparsl":"\u29E5", | ||
"erarr":"\u2971", | ||
"erDot":"\u2253", | ||
"Escr":"\u2130", | ||
"escr":"\u212F", | ||
"esdot":"\u2250", | ||
"Esim":"\u2A73", | ||
"esim":"\u2242", | ||
"Eta":"\u0397", | ||
"eta":"\u03B7", | ||
"ETH":"\u00D0", | ||
"eth":"\u00F0", | ||
"Euml":"\u00CB", | ||
"euml":"\u00EB", | ||
"euro":"\u20AC", | ||
"excl":"\u0021", | ||
"exist":"\u2203", | ||
"Exists":"\u2203", | ||
"expectation":"\u2130", | ||
"ExponentialE":"\u2147", | ||
"exponentiale":"\u2147", | ||
"fallingdotseq":"\u2252", | ||
"Fcy":"\u0424", | ||
"fcy":"\u0444", | ||
"female":"\u2640", | ||
"ffilig":"\uFB03", | ||
"fflig":"\uFB00", | ||
"ffllig":"\uFB04", | ||
"Ffr":"\uD835\uDD09", | ||
"ffr":"\uD835\uDD23", | ||
"filig":"\uFB01", | ||
"FilledSmallSquare":"\u25FC", | ||
"FilledVerySmallSquare":"\u25AA", | ||
"fjlig":"\u0066\u006A", | ||
"flat":"\u266D", | ||
"fllig":"\uFB02", | ||
"fltns":"\u25B1", | ||
"fnof":"\u0192", | ||
"Fopf":"\uD835\uDD3D", | ||
"fopf":"\uD835\uDD57", | ||
"ForAll":"\u2200", | ||
"forall":"\u2200", | ||
"fork":"\u22D4", | ||
"forkv":"\u2AD9", | ||
"Fouriertrf":"\u2131", | ||
"fpartint":"\u2A0D", | ||
"frac12":"\u00BD", | ||
"frac13":"\u2153", | ||
"frac14":"\u00BC", | ||
"frac15":"\u2155", | ||
"frac16":"\u2159", | ||
"frac18":"\u215B", | ||
"frac23":"\u2154", | ||
"frac25":"\u2156", | ||
"frac34":"\u00BE", | ||
"frac35":"\u2157", | ||
"frac38":"\u215C", | ||
"frac45":"\u2158", | ||
"frac56":"\u215A", | ||
"frac58":"\u215D", | ||
"frac78":"\u215E", | ||
"frasl":"\u2044", | ||
"frown":"\u2322", | ||
"Fscr":"\u2131", | ||
"fscr":"\uD835\uDCBB", | ||
"gacute":"\u01F5", | ||
"Gamma":"\u0393", | ||
"gamma":"\u03B3", | ||
"Gammad":"\u03DC", | ||
"gammad":"\u03DD", | ||
"gap":"\u2A86", | ||
"Gbreve":"\u011E", | ||
"gbreve":"\u011F", | ||
"Gcedil":"\u0122", | ||
"Gcirc":"\u011C", | ||
"gcirc":"\u011D", | ||
"Gcy":"\u0413", | ||
"gcy":"\u0433", | ||
"Gdot":"\u0120", | ||
"gdot":"\u0121", | ||
"gE":"\u2267", | ||
"ge":"\u2265", | ||
"gEl":"\u2A8C", | ||
"gel":"\u22DB", | ||
"geq":"\u2265", | ||
"geqq":"\u2267", | ||
"geqslant":"\u2A7E", | ||
"ges":"\u2A7E", | ||
"gescc":"\u2AA9", | ||
"gesdot":"\u2A80", | ||
"gesdoto":"\u2A82", | ||
"gesdotol":"\u2A84", | ||
"gesl":"\u22DB\uFE00", | ||
"gesles":"\u2A94", | ||
"Gfr":"\uD835\uDD0A", | ||
"gfr":"\uD835\uDD24", | ||
"Gg":"\u22D9", | ||
"gg":"\u226B", | ||
"ggg":"\u22D9", | ||
"gimel":"\u2137", | ||
"GJcy":"\u0403", | ||
"gjcy":"\u0453", | ||
"gl":"\u2277", | ||
"gla":"\u2AA5", | ||
"glE":"\u2A92", | ||
"glj":"\u2AA4", | ||
"gnap":"\u2A8A", | ||
"gnapprox":"\u2A8A", | ||
"gnE":"\u2269", | ||
"gne":"\u2A88", | ||
"gneq":"\u2A88", | ||
"gneqq":"\u2269", | ||
"gnsim":"\u22E7", | ||
"Gopf":"\uD835\uDD3E", | ||
"gopf":"\uD835\uDD58", | ||
"grave":"\u0060", | ||
"GreaterEqual":"\u2265", | ||
"GreaterEqualLess":"\u22DB", | ||
"GreaterFullEqual":"\u2267", | ||
"GreaterGreater":"\u2AA2", | ||
"GreaterLess":"\u2277", | ||
"GreaterSlantEqual":"\u2A7E", | ||
"GreaterTilde":"\u2273", | ||
"Gscr":"\uD835\uDCA2", | ||
"gscr":"\u210A", | ||
"gsim":"\u2273", | ||
"gsime":"\u2A8E", | ||
"gsiml":"\u2A90", | ||
"GT":"\u003E", | ||
"Gt":"\u226B", | ||
"gt":"\u003E", | ||
"gtcc":"\u2AA7", | ||
"gtcir":"\u2A7A", | ||
"gtdot":"\u22D7", | ||
"gtlPar":"\u2995", | ||
"gtquest":"\u2A7C", | ||
"gtrapprox":"\u2A86", | ||
"gtrarr":"\u2978", | ||
"gtrdot":"\u22D7", | ||
"gtreqless":"\u22DB", | ||
"gtreqqless":"\u2A8C", | ||
"gtrless":"\u2277", | ||
"gtrsim":"\u2273", | ||
"gvertneqq":"\u2269\uFE00", | ||
"gvnE":"\u2269\uFE00", | ||
"Hacek":"\u02C7", | ||
"hairsp":"\u200A", | ||
"half":"\u00BD", | ||
"hamilt":"\u210B", | ||
"HARDcy":"\u042A", | ||
"hardcy":"\u044A", | ||
"hArr":"\u21D4", | ||
"harr":"\u2194", | ||
"harrcir":"\u2948", | ||
"harrw":"\u21AD", | ||
"Hat":"\u005E", | ||
"hbar":"\u210F", | ||
"Hcirc":"\u0124", | ||
"hcirc":"\u0125", | ||
"hearts":"\u2665", | ||
"heartsuit":"\u2665", | ||
"hellip":"\u2026", | ||
"hercon":"\u22B9", | ||
"Hfr":"\u210C", | ||
"hfr":"\uD835\uDD25", | ||
"HilbertSpace":"\u210B", | ||
"hksearow":"\u2925", | ||
"hkswarow":"\u2926", | ||
"hoarr":"\u21FF", | ||
"homtht":"\u223B", | ||
"hookleftarrow":"\u21A9", | ||
"hookrightarrow":"\u21AA", | ||
"Hopf":"\u210D", | ||
"hopf":"\uD835\uDD59", | ||
"horbar":"\u2015", | ||
"HorizontalLine":"\u2500", | ||
"Hscr":"\u210B", | ||
"hscr":"\uD835\uDCBD", | ||
"hslash":"\u210F", | ||
"Hstrok":"\u0126", | ||
"hstrok":"\u0127", | ||
"HumpDownHump":"\u224E", | ||
"HumpEqual":"\u224F", | ||
"hybull":"\u2043", | ||
"hyphen":"\u2010", | ||
"Iacute":"\u00CD", | ||
"iacute":"\u00ED", | ||
"ic":"\u2063", | ||
"Icirc":"\u00CE", | ||
"icirc":"\u00EE", | ||
"Icy":"\u0418", | ||
"icy":"\u0438", | ||
"Idot":"\u0130", | ||
"IEcy":"\u0415", | ||
"iecy":"\u0435", | ||
"iexcl":"\u00A1", | ||
"iff":"\u21D4", | ||
"Ifr":"\u2111", | ||
"ifr":"\uD835\uDD26", | ||
"Igrave":"\u00CC", | ||
"igrave":"\u00EC", | ||
"ii":"\u2148", | ||
"iiiint":"\u2A0C", | ||
"iiint":"\u222D", | ||
"iinfin":"\u29DC", | ||
"iiota":"\u2129", | ||
"IJlig":"\u0132", | ||
"ijlig":"\u0133", | ||
"Im":"\u2111", | ||
"Imacr":"\u012A", | ||
"imacr":"\u012B", | ||
"image":"\u2111", | ||
"ImaginaryI":"\u2148", | ||
"imagline":"\u2110", | ||
"imagpart":"\u2111", | ||
"imath":"\u0131", | ||
"imof":"\u22B7", | ||
"imped":"\u01B5", | ||
"Implies":"\u21D2", | ||
"in":"\u2208", | ||
"incare":"\u2105", | ||
"infin":"\u221E", | ||
"infintie":"\u29DD", | ||
"inodot":"\u0131", | ||
"Int":"\u222C", | ||
"int":"\u222B", | ||
"intcal":"\u22BA", | ||
"integers":"\u2124", | ||
"Integral":"\u222B", | ||
"intercal":"\u22BA", | ||
"Intersection":"\u22C2", | ||
"intlarhk":"\u2A17", | ||
"intprod":"\u2A3C", | ||
"InvisibleComma":"\u2063", | ||
"InvisibleTimes":"\u2062", | ||
"IOcy":"\u0401", | ||
"iocy":"\u0451", | ||
"Iogon":"\u012E", | ||
"iogon":"\u012F", | ||
"Iopf":"\uD835\uDD40", | ||
"iopf":"\uD835\uDD5A", | ||
"Iota":"\u0399", | ||
"iota":"\u03B9", | ||
"iprod":"\u2A3C", | ||
"iquest":"\u00BF", | ||
"Iscr":"\u2110", | ||
"iscr":"\uD835\uDCBE", | ||
"isin":"\u2208", | ||
"isindot":"\u22F5", | ||
"isinE":"\u22F9", | ||
"isins":"\u22F4", | ||
"isinsv":"\u22F3", | ||
"isinv":"\u2208", | ||
"it":"\u2062", | ||
"Itilde":"\u0128", | ||
"itilde":"\u0129", | ||
"Iukcy":"\u0406", | ||
"iukcy":"\u0456", | ||
"Iuml":"\u00CF", | ||
"iuml":"\u00EF", | ||
"Jcirc":"\u0134", | ||
"jcirc":"\u0135", | ||
"Jcy":"\u0419", | ||
"jcy":"\u0439", | ||
"Jfr":"\uD835\uDD0D", | ||
"jfr":"\uD835\uDD27", | ||
"jmath":"\u0237", | ||
"Jopf":"\uD835\uDD41", | ||
"jopf":"\uD835\uDD5B", | ||
"Jscr":"\uD835\uDCA5", | ||
"jscr":"\uD835\uDCBF", | ||
"Jsercy":"\u0408", | ||
"jsercy":"\u0458", | ||
"Jukcy":"\u0404", | ||
"jukcy":"\u0454", | ||
"Kappa":"\u039A", | ||
"kappa":"\u03BA", | ||
"kappav":"\u03F0", | ||
"Kcedil":"\u0136", | ||
"kcedil":"\u0137", | ||
"Kcy":"\u041A", | ||
"kcy":"\u043A", | ||
"Kfr":"\uD835\uDD0E", | ||
"kfr":"\uD835\uDD28", | ||
"kgreen":"\u0138", | ||
"KHcy":"\u0425", | ||
"khcy":"\u0445", | ||
"KJcy":"\u040C", | ||
"kjcy":"\u045C", | ||
"Kopf":"\uD835\uDD42", | ||
"kopf":"\uD835\uDD5C", | ||
"Kscr":"\uD835\uDCA6", | ||
"kscr":"\uD835\uDCC0", | ||
"lAarr":"\u21DA", | ||
"Lacute":"\u0139", | ||
"lacute":"\u013A", | ||
"laemptyv":"\u29B4", | ||
"lagran":"\u2112", | ||
"Lambda":"\u039B", | ||
"lambda":"\u03BB", | ||
"Lang":"\u27EA", | ||
"lang":"\u27E8", | ||
"langd":"\u2991", | ||
"langle":"\u27E8", | ||
"lap":"\u2A85", | ||
"Laplacetrf":"\u2112", | ||
"laquo":"\u00AB", | ||
"Larr":"\u219E", | ||
"lArr":"\u21D0", | ||
"larr":"\u2190", | ||
"larrb":"\u21E4", | ||
"larrbfs":"\u291F", | ||
"larrfs":"\u291D", | ||
"larrhk":"\u21A9", | ||
"larrlp":"\u21AB", | ||
"larrpl":"\u2939", | ||
"larrsim":"\u2973", | ||
"larrtl":"\u21A2", | ||
"lat":"\u2AAB", | ||
"lAtail":"\u291B", | ||
"latail":"\u2919", | ||
"late":"\u2AAD", | ||
"lates":"\u2AAD\uFE00", | ||
"lBarr":"\u290E", | ||
"lbarr":"\u290C", | ||
"lbbrk":"\u2772", | ||
"lbrace":"\u007B", | ||
"lbrack":"\u005B", | ||
"lbrke":"\u298B", | ||
"lbrksld":"\u298F", | ||
"lbrkslu":"\u298D", | ||
"Lcaron":"\u013D", | ||
"lcaron":"\u013E", | ||
"Lcedil":"\u013B", | ||
"lcedil":"\u013C", | ||
"lceil":"\u2308", | ||
"lcub":"\u007B", | ||
"Lcy":"\u041B", | ||
"lcy":"\u043B", | ||
"ldca":"\u2936", | ||
"ldquo":"\u201C", | ||
"ldquor":"\u201E", | ||
"ldrdhar":"\u2967", | ||
"ldrushar":"\u294B", | ||
"ldsh":"\u21B2", | ||
"lE":"\u2266", | ||
"le":"\u2264", | ||
"LeftAngleBracket":"\u27E8", | ||
"LeftArrow":"\u2190", | ||
"Leftarrow":"\u21D0", | ||
"leftarrow":"\u2190", | ||
"LeftArrowBar":"\u21E4", | ||
"LeftArrowRightArrow":"\u21C6", | ||
"leftarrowtail":"\u21A2", | ||
"LeftCeiling":"\u2308", | ||
"LeftDoubleBracket":"\u27E6", | ||
"LeftDownTeeVector":"\u2961", | ||
"LeftDownVector":"\u21C3", | ||
"LeftDownVectorBar":"\u2959", | ||
"LeftFloor":"\u230A", | ||
"leftharpoondown":"\u21BD", | ||
"leftharpoonup":"\u21BC", | ||
"leftleftarrows":"\u21C7", | ||
"LeftRightArrow":"\u2194", | ||
"Leftrightarrow":"\u21D4", | ||
"leftrightarrow":"\u2194", | ||
"leftrightarrows":"\u21C6", | ||
"leftrightharpoons":"\u21CB", | ||
"leftrightsquigarrow":"\u21AD", | ||
"LeftRightVector":"\u294E", | ||
"LeftTee":"\u22A3", | ||
"LeftTeeArrow":"\u21A4", | ||
"LeftTeeVector":"\u295A", | ||
"leftthreetimes":"\u22CB", | ||
"LeftTriangle":"\u22B2", | ||
"LeftTriangleBar":"\u29CF", | ||
"LeftTriangleEqual":"\u22B4", | ||
"LeftUpDownVector":"\u2951", | ||
"LeftUpTeeVector":"\u2960", | ||
"LeftUpVector":"\u21BF", | ||
"LeftUpVectorBar":"\u2958", | ||
"LeftVector":"\u21BC", | ||
"LeftVectorBar":"\u2952", | ||
"lEg":"\u2A8B", | ||
"leg":"\u22DA", | ||
"leq":"\u2264", | ||
"leqq":"\u2266", | ||
"leqslant":"\u2A7D", | ||
"les":"\u2A7D", | ||
"lescc":"\u2AA8", | ||
"lesdot":"\u2A7F", | ||
"lesdoto":"\u2A81", | ||
"lesdotor":"\u2A83", | ||
"lesg":"\u22DA\uFE00", | ||
"lesges":"\u2A93", | ||
"lessapprox":"\u2A85", | ||
"lessdot":"\u22D6", | ||
"lesseqgtr":"\u22DA", | ||
"lesseqqgtr":"\u2A8B", | ||
"LessEqualGreater":"\u22DA", | ||
"LessFullEqual":"\u2266", | ||
"LessGreater":"\u2276", | ||
"lessgtr":"\u2276", | ||
"LessLess":"\u2AA1", | ||
"lesssim":"\u2272", | ||
"LessSlantEqual":"\u2A7D", | ||
"LessTilde":"\u2272", | ||
"lfisht":"\u297C", | ||
"lfloor":"\u230A", | ||
"Lfr":"\uD835\uDD0F", | ||
"lfr":"\uD835\uDD29", | ||
"lg":"\u2276", | ||
"lgE":"\u2A91", | ||
"lHar":"\u2962", | ||
"lhard":"\u21BD", | ||
"lharu":"\u21BC", | ||
"lharul":"\u296A", | ||
"lhblk":"\u2584", | ||
"LJcy":"\u0409", | ||
"ljcy":"\u0459", | ||
"Ll":"\u22D8", | ||
"ll":"\u226A", | ||
"llarr":"\u21C7", | ||
"llcorner":"\u231E", | ||
"Lleftarrow":"\u21DA", | ||
"llhard":"\u296B", | ||
"lltri":"\u25FA", | ||
"Lmidot":"\u013F", | ||
"lmidot":"\u0140", | ||
"lmoust":"\u23B0", | ||
"lmoustache":"\u23B0", | ||
"lnap":"\u2A89", | ||
"lnapprox":"\u2A89", | ||
"lnE":"\u2268", | ||
"lne":"\u2A87", | ||
"lneq":"\u2A87", | ||
"lneqq":"\u2268", | ||
"lnsim":"\u22E6", | ||
"loang":"\u27EC", | ||
"loarr":"\u21FD", | ||
"lobrk":"\u27E6", | ||
"LongLeftArrow":"\u27F5", | ||
"Longleftarrow":"\u27F8", | ||
"longleftarrow":"\u27F5", | ||
"LongLeftRightArrow":"\u27F7", | ||
"Longleftrightarrow":"\u27FA", | ||
"longleftrightarrow":"\u27F7", | ||
"longmapsto":"\u27FC", | ||
"LongRightArrow":"\u27F6", | ||
"Longrightarrow":"\u27F9", | ||
"longrightarrow":"\u27F6", | ||
"looparrowleft":"\u21AB", | ||
"looparrowright":"\u21AC", | ||
"lopar":"\u2985", | ||
"Lopf":"\uD835\uDD43", | ||
"lopf":"\uD835\uDD5D", | ||
"loplus":"\u2A2D", | ||
"lotimes":"\u2A34", | ||
"lowast":"\u2217", | ||
"lowbar":"\u005F", | ||
"LowerLeftArrow":"\u2199", | ||
"LowerRightArrow":"\u2198", | ||
"loz":"\u25CA", | ||
"lozenge":"\u25CA", | ||
"lozf":"\u29EB", | ||
"lpar":"\u0028", | ||
"lparlt":"\u2993", | ||
"lrarr":"\u21C6", | ||
"lrcorner":"\u231F", | ||
"lrhar":"\u21CB", | ||
"lrhard":"\u296D", | ||
"lrm":"\u200E", | ||
"lrtri":"\u22BF", | ||
"lsaquo":"\u2039", | ||
"Lscr":"\u2112", | ||
"lscr":"\uD835\uDCC1", | ||
"Lsh":"\u21B0", | ||
"lsh":"\u21B0", | ||
"lsim":"\u2272", | ||
"lsime":"\u2A8D", | ||
"lsimg":"\u2A8F", | ||
"lsqb":"\u005B", | ||
"lsquo":"\u2018", | ||
"lsquor":"\u201A", | ||
"Lstrok":"\u0141", | ||
"lstrok":"\u0142", | ||
"LT":"\u003C", | ||
"Lt":"\u226A", | ||
"lt":"\u003C", | ||
"ltcc":"\u2AA6", | ||
"ltcir":"\u2A79", | ||
"ltdot":"\u22D6", | ||
"lthree":"\u22CB", | ||
"ltimes":"\u22C9", | ||
"ltlarr":"\u2976", | ||
"ltquest":"\u2A7B", | ||
"ltri":"\u25C3", | ||
"ltrie":"\u22B4", | ||
"ltrif":"\u25C2", | ||
"ltrPar":"\u2996", | ||
"lurdshar":"\u294A", | ||
"luruhar":"\u2966", | ||
"lvertneqq":"\u2268\uFE00", | ||
"lvnE":"\u2268\uFE00", | ||
"macr":"\u00AF", | ||
"male":"\u2642", | ||
"malt":"\u2720", | ||
"maltese":"\u2720", | ||
"Map":"\u2905", | ||
"map":"\u21A6", | ||
"mapsto":"\u21A6", | ||
"mapstodown":"\u21A7", | ||
"mapstoleft":"\u21A4", | ||
"mapstoup":"\u21A5", | ||
"marker":"\u25AE", | ||
"mcomma":"\u2A29", | ||
"Mcy":"\u041C", | ||
"mcy":"\u043C", | ||
"mdash":"\u2014", | ||
"mDDot":"\u223A", | ||
"measuredangle":"\u2221", | ||
"MediumSpace":"\u205F", | ||
"Mellintrf":"\u2133", | ||
"Mfr":"\uD835\uDD10", | ||
"mfr":"\uD835\uDD2A", | ||
"mho":"\u2127", | ||
"micro":"\u00B5", | ||
"mid":"\u2223", | ||
"midast":"\u002A", | ||
"midcir":"\u2AF0", | ||
"middot":"\u00B7", | ||
"minus":"\u2212", | ||
"minusb":"\u229F", | ||
"minusd":"\u2238", | ||
"minusdu":"\u2A2A", | ||
"MinusPlus":"\u2213", | ||
"mlcp":"\u2ADB", | ||
"mldr":"\u2026", | ||
"mnplus":"\u2213", | ||
"models":"\u22A7", | ||
"Mopf":"\uD835\uDD44", | ||
"mopf":"\uD835\uDD5E", | ||
"mp":"\u2213", | ||
"Mscr":"\u2133", | ||
"mscr":"\uD835\uDCC2", | ||
"mstpos":"\u223E", | ||
"Mu":"\u039C", | ||
"mu":"\u03BC", | ||
"multimap":"\u22B8", | ||
"mumap":"\u22B8", | ||
"nabla":"\u2207", | ||
"Nacute":"\u0143", | ||
"nacute":"\u0144", | ||
"nang":"\u2220\u20D2", | ||
"nap":"\u2249", | ||
"napE":"\u2A70\u0338", | ||
"napid":"\u224B\u0338", | ||
"napos":"\u0149", | ||
"napprox":"\u2249", | ||
"natur":"\u266E", | ||
"natural":"\u266E", | ||
"naturals":"\u2115", | ||
"nbsp":"\u00A0", | ||
"nbump":"\u224E\u0338", | ||
"nbumpe":"\u224F\u0338", | ||
"ncap":"\u2A43", | ||
"Ncaron":"\u0147", | ||
"ncaron":"\u0148", | ||
"Ncedil":"\u0145", | ||
"ncedil":"\u0146", | ||
"ncong":"\u2247", | ||
"ncongdot":"\u2A6D\u0338", | ||
"ncup":"\u2A42", | ||
"Ncy":"\u041D", | ||
"ncy":"\u043D", | ||
"ndash":"\u2013", | ||
"ne":"\u2260", | ||
"nearhk":"\u2924", | ||
"neArr":"\u21D7", | ||
"nearr":"\u2197", | ||
"nearrow":"\u2197", | ||
"nedot":"\u2250\u0338", | ||
"NegativeMediumSpace":"\u200B", | ||
"NegativeThickSpace":"\u200B", | ||
"NegativeThinSpace":"\u200B", | ||
"NegativeVeryThinSpace":"\u200B", | ||
"nequiv":"\u2262", | ||
"nesear":"\u2928", | ||
"nesim":"\u2242\u0338", | ||
"NestedGreaterGreater":"\u226B", | ||
"NestedLessLess":"\u226A", | ||
"NewLine":"\u000A", | ||
"nexist":"\u2204", | ||
"nexists":"\u2204", | ||
"Nfr":"\uD835\uDD11", | ||
"nfr":"\uD835\uDD2B", | ||
"ngE":"\u2267\u0338", | ||
"nge":"\u2271", | ||
"ngeq":"\u2271", | ||
"ngeqq":"\u2267\u0338", | ||
"ngeqslant":"\u2A7E\u0338", | ||
"nges":"\u2A7E\u0338", | ||
"nGg":"\u22D9\u0338", | ||
"ngsim":"\u2275", | ||
"nGt":"\u226B\u20D2", | ||
"ngt":"\u226F", | ||
"ngtr":"\u226F", | ||
"nGtv":"\u226B\u0338", | ||
"nhArr":"\u21CE", | ||
"nharr":"\u21AE", | ||
"nhpar":"\u2AF2", | ||
"ni":"\u220B", | ||
"nis":"\u22FC", | ||
"nisd":"\u22FA", | ||
"niv":"\u220B", | ||
"NJcy":"\u040A", | ||
"njcy":"\u045A", | ||
"nlArr":"\u21CD", | ||
"nlarr":"\u219A", | ||
"nldr":"\u2025", | ||
"nlE":"\u2266\u0338", | ||
"nle":"\u2270", | ||
"nLeftarrow":"\u21CD", | ||
"nleftarrow":"\u219A", | ||
"nLeftrightarrow":"\u21CE", | ||
"nleftrightarrow":"\u21AE", | ||
"nleq":"\u2270", | ||
"nleqq":"\u2266\u0338", | ||
"nleqslant":"\u2A7D\u0338", | ||
"nles":"\u2A7D\u0338", | ||
"nless":"\u226E", | ||
"nLl":"\u22D8\u0338", | ||
"nlsim":"\u2274", | ||
"nLt":"\u226A\u20D2", | ||
"nlt":"\u226E", | ||
"nltri":"\u22EA", | ||
"nltrie":"\u22EC", | ||
"nLtv":"\u226A\u0338", | ||
"nmid":"\u2224", | ||
"NoBreak":"\u2060", | ||
"NonBreakingSpace":"\u00A0", | ||
"Nopf":"\u2115", | ||
"nopf":"\uD835\uDD5F", | ||
"Not":"\u2AEC", | ||
"not":"\u00AC", | ||
"NotCongruent":"\u2262", | ||
"NotCupCap":"\u226D", | ||
"NotDoubleVerticalBar":"\u2226", | ||
"NotElement":"\u2209", | ||
"NotEqual":"\u2260", | ||
"NotEqualTilde":"\u2242\u0338", | ||
"NotExists":"\u2204", | ||
"NotGreater":"\u226F", | ||
"NotGreaterEqual":"\u2271", | ||
"NotGreaterFullEqual":"\u2267\u0338", | ||
"NotGreaterGreater":"\u226B\u0338", | ||
"NotGreaterLess":"\u2279", | ||
"NotGreaterSlantEqual":"\u2A7E\u0338", | ||
"NotGreaterTilde":"\u2275", | ||
"NotHumpDownHump":"\u224E\u0338", | ||
"NotHumpEqual":"\u224F\u0338", | ||
"notin":"\u2209", | ||
"notindot":"\u22F5\u0338", | ||
"notinE":"\u22F9\u0338", | ||
"notinva":"\u2209", | ||
"notinvb":"\u22F7", | ||
"notinvc":"\u22F6", | ||
"NotLeftTriangle":"\u22EA", | ||
"NotLeftTriangleBar":"\u29CF\u0338", | ||
"NotLeftTriangleEqual":"\u22EC", | ||
"NotLess":"\u226E", | ||
"NotLessEqual":"\u2270", | ||
"NotLessGreater":"\u2278", | ||
"NotLessLess":"\u226A\u0338", | ||
"NotLessSlantEqual":"\u2A7D\u0338", | ||
"NotLessTilde":"\u2274", | ||
"NotNestedGreaterGreater":"\u2AA2\u0338", | ||
"NotNestedLessLess":"\u2AA1\u0338", | ||
"notni":"\u220C", | ||
"notniva":"\u220C", | ||
"notnivb":"\u22FE", | ||
"notnivc":"\u22FD", | ||
"NotPrecedes":"\u2280", | ||
"NotPrecedesEqual":"\u2AAF\u0338", | ||
"NotPrecedesSlantEqual":"\u22E0", | ||
"NotReverseElement":"\u220C", | ||
"NotRightTriangle":"\u22EB", | ||
"NotRightTriangleBar":"\u29D0\u0338", | ||
"NotRightTriangleEqual":"\u22ED", | ||
"NotSquareSubset":"\u228F\u0338", | ||
"NotSquareSubsetEqual":"\u22E2", | ||
"NotSquareSuperset":"\u2290\u0338", | ||
"NotSquareSupersetEqual":"\u22E3", | ||
"NotSubset":"\u2282\u20D2", | ||
"NotSubsetEqual":"\u2288", | ||
"NotSucceeds":"\u2281", | ||
"NotSucceedsEqual":"\u2AB0\u0338", | ||
"NotSucceedsSlantEqual":"\u22E1", | ||
"NotSucceedsTilde":"\u227F\u0338", | ||
"NotSuperset":"\u2283\u20D2", | ||
"NotSupersetEqual":"\u2289", | ||
"NotTilde":"\u2241", | ||
"NotTildeEqual":"\u2244", | ||
"NotTildeFullEqual":"\u2247", | ||
"NotTildeTilde":"\u2249", | ||
"NotVerticalBar":"\u2224", | ||
"npar":"\u2226", | ||
"nparallel":"\u2226", | ||
"nparsl":"\u2AFD\u20E5", | ||
"npart":"\u2202\u0338", | ||
"npolint":"\u2A14", | ||
"npr":"\u2280", | ||
"nprcue":"\u22E0", | ||
"npre":"\u2AAF\u0338", | ||
"nprec":"\u2280", | ||
"npreceq":"\u2AAF\u0338", | ||
"nrArr":"\u21CF", | ||
"nrarr":"\u219B", | ||
"nrarrc":"\u2933\u0338", | ||
"nrarrw":"\u219D\u0338", | ||
"nRightarrow":"\u21CF", | ||
"nrightarrow":"\u219B", | ||
"nrtri":"\u22EB", | ||
"nrtrie":"\u22ED", | ||
"nsc":"\u2281", | ||
"nsccue":"\u22E1", | ||
"nsce":"\u2AB0\u0338", | ||
"Nscr":"\uD835\uDCA9", | ||
"nscr":"\uD835\uDCC3", | ||
"nshortmid":"\u2224", | ||
"nshortparallel":"\u2226", | ||
"nsim":"\u2241", | ||
"nsime":"\u2244", | ||
"nsimeq":"\u2244", | ||
"nsmid":"\u2224", | ||
"nspar":"\u2226", | ||
"nsqsube":"\u22E2", | ||
"nsqsupe":"\u22E3", | ||
"nsub":"\u2284", | ||
"nsubE":"\u2AC5\u0338", | ||
"nsube":"\u2288", | ||
"nsubset":"\u2282\u20D2", | ||
"nsubseteq":"\u2288", | ||
"nsubseteqq":"\u2AC5\u0338", | ||
"nsucc":"\u2281", | ||
"nsucceq":"\u2AB0\u0338", | ||
"nsup":"\u2285", | ||
"nsupE":"\u2AC6\u0338", | ||
"nsupe":"\u2289", | ||
"nsupset":"\u2283\u20D2", | ||
"nsupseteq":"\u2289", | ||
"nsupseteqq":"\u2AC6\u0338", | ||
"ntgl":"\u2279", | ||
"Ntilde":"\u00D1", | ||
"ntilde":"\u00F1", | ||
"ntlg":"\u2278", | ||
"ntriangleleft":"\u22EA", | ||
"ntrianglelefteq":"\u22EC", | ||
"ntriangleright":"\u22EB", | ||
"ntrianglerighteq":"\u22ED", | ||
"Nu":"\u039D", | ||
"nu":"\u03BD", | ||
"num":"\u0023", | ||
"numero":"\u2116", | ||
"numsp":"\u2007", | ||
"nvap":"\u224D\u20D2", | ||
"nVDash":"\u22AF", | ||
"nVdash":"\u22AE", | ||
"nvDash":"\u22AD", | ||
"nvdash":"\u22AC", | ||
"nvge":"\u2265\u20D2", | ||
"nvgt":"\u003E\u20D2", | ||
"nvHarr":"\u2904", | ||
"nvinfin":"\u29DE", | ||
"nvlArr":"\u2902", | ||
"nvle":"\u2264\u20D2", | ||
"nvlt":"\u003C\u20D2", | ||
"nvltrie":"\u22B4\u20D2", | ||
"nvrArr":"\u2903", | ||
"nvrtrie":"\u22B5\u20D2", | ||
"nvsim":"\u223C\u20D2", | ||
"nwarhk":"\u2923", | ||
"nwArr":"\u21D6", | ||
"nwarr":"\u2196", | ||
"nwarrow":"\u2196", | ||
"nwnear":"\u2927", | ||
"Oacute":"\u00D3", | ||
"oacute":"\u00F3", | ||
"oast":"\u229B", | ||
"ocir":"\u229A", | ||
"Ocirc":"\u00D4", | ||
"ocirc":"\u00F4", | ||
"Ocy":"\u041E", | ||
"ocy":"\u043E", | ||
"odash":"\u229D", | ||
"Odblac":"\u0150", | ||
"odblac":"\u0151", | ||
"odiv":"\u2A38", | ||
"odot":"\u2299", | ||
"odsold":"\u29BC", | ||
"OElig":"\u0152", | ||
"oelig":"\u0153", | ||
"ofcir":"\u29BF", | ||
"Ofr":"\uD835\uDD12", | ||
"ofr":"\uD835\uDD2C", | ||
"ogon":"\u02DB", | ||
"Ograve":"\u00D2", | ||
"ograve":"\u00F2", | ||
"ogt":"\u29C1", | ||
"ohbar":"\u29B5", | ||
"ohm":"\u03A9", | ||
"oint":"\u222E", | ||
"olarr":"\u21BA", | ||
"olcir":"\u29BE", | ||
"olcross":"\u29BB", | ||
"oline":"\u203E", | ||
"olt":"\u29C0", | ||
"Omacr":"\u014C", | ||
"omacr":"\u014D", | ||
"Omega":"\u03A9", | ||
"omega":"\u03C9", | ||
"Omicron":"\u039F", | ||
"omicron":"\u03BF", | ||
"omid":"\u29B6", | ||
"ominus":"\u2296", | ||
"Oopf":"\uD835\uDD46", | ||
"oopf":"\uD835\uDD60", | ||
"opar":"\u29B7", | ||
"OpenCurlyDoubleQuote":"\u201C", | ||
"OpenCurlyQuote":"\u2018", | ||
"operp":"\u29B9", | ||
"oplus":"\u2295", | ||
"Or":"\u2A54", | ||
"or":"\u2228", | ||
"orarr":"\u21BB", | ||
"ord":"\u2A5D", | ||
"order":"\u2134", | ||
"orderof":"\u2134", | ||
"ordf":"\u00AA", | ||
"ordm":"\u00BA", | ||
"origof":"\u22B6", | ||
"oror":"\u2A56", | ||
"orslope":"\u2A57", | ||
"orv":"\u2A5B", | ||
"oS":"\u24C8", | ||
"Oscr":"\uD835\uDCAA", | ||
"oscr":"\u2134", | ||
"Oslash":"\u00D8", | ||
"oslash":"\u00F8", | ||
"osol":"\u2298", | ||
"Otilde":"\u00D5", | ||
"otilde":"\u00F5", | ||
"Otimes":"\u2A37", | ||
"otimes":"\u2297", | ||
"otimesas":"\u2A36", | ||
"Ouml":"\u00D6", | ||
"ouml":"\u00F6", | ||
"ovbar":"\u233D", | ||
"OverBar":"\u203E", | ||
"OverBrace":"\u23DE", | ||
"OverBracket":"\u23B4", | ||
"OverParenthesis":"\u23DC", | ||
"par":"\u2225", | ||
"para":"\u00B6", | ||
"parallel":"\u2225", | ||
"parsim":"\u2AF3", | ||
"parsl":"\u2AFD", | ||
"part":"\u2202", | ||
"PartialD":"\u2202", | ||
"Pcy":"\u041F", | ||
"pcy":"\u043F", | ||
"percnt":"\u0025", | ||
"period":"\u002E", | ||
"permil":"\u2030", | ||
"perp":"\u22A5", | ||
"pertenk":"\u2031", | ||
"Pfr":"\uD835\uDD13", | ||
"pfr":"\uD835\uDD2D", | ||
"Phi":"\u03A6", | ||
"phi":"\u03C6", | ||
"phiv":"\u03D5", | ||
"phmmat":"\u2133", | ||
"phone":"\u260E", | ||
"Pi":"\u03A0", | ||
"pi":"\u03C0", | ||
"pitchfork":"\u22D4", | ||
"piv":"\u03D6", | ||
"planck":"\u210F", | ||
"planckh":"\u210E", | ||
"plankv":"\u210F", | ||
"plus":"\u002B", | ||
"plusacir":"\u2A23", | ||
"plusb":"\u229E", | ||
"pluscir":"\u2A22", | ||
"plusdo":"\u2214", | ||
"plusdu":"\u2A25", | ||
"pluse":"\u2A72", | ||
"PlusMinus":"\u00B1", | ||
"plusmn":"\u00B1", | ||
"plussim":"\u2A26", | ||
"plustwo":"\u2A27", | ||
"pm":"\u00B1", | ||
"Poincareplane":"\u210C", | ||
"pointint":"\u2A15", | ||
"Popf":"\u2119", | ||
"popf":"\uD835\uDD61", | ||
"pound":"\u00A3", | ||
"Pr":"\u2ABB", | ||
"pr":"\u227A", | ||
"prap":"\u2AB7", | ||
"prcue":"\u227C", | ||
"prE":"\u2AB3", | ||
"pre":"\u2AAF", | ||
"prec":"\u227A", | ||
"precapprox":"\u2AB7", | ||
"preccurlyeq":"\u227C", | ||
"Precedes":"\u227A", | ||
"PrecedesEqual":"\u2AAF", | ||
"PrecedesSlantEqual":"\u227C", | ||
"PrecedesTilde":"\u227E", | ||
"preceq":"\u2AAF", | ||
"precnapprox":"\u2AB9", | ||
"precneqq":"\u2AB5", | ||
"precnsim":"\u22E8", | ||
"precsim":"\u227E", | ||
"Prime":"\u2033", | ||
"prime":"\u2032", | ||
"primes":"\u2119", | ||
"prnap":"\u2AB9", | ||
"prnE":"\u2AB5", | ||
"prnsim":"\u22E8", | ||
"prod":"\u220F", | ||
"Product":"\u220F", | ||
"profalar":"\u232E", | ||
"profline":"\u2312", | ||
"profsurf":"\u2313", | ||
"prop":"\u221D", | ||
"Proportion":"\u2237", | ||
"Proportional":"\u221D", | ||
"propto":"\u221D", | ||
"prsim":"\u227E", | ||
"prurel":"\u22B0", | ||
"Pscr":"\uD835\uDCAB", | ||
"pscr":"\uD835\uDCC5", | ||
"Psi":"\u03A8", | ||
"psi":"\u03C8", | ||
"puncsp":"\u2008", | ||
"Qfr":"\uD835\uDD14", | ||
"qfr":"\uD835\uDD2E", | ||
"qint":"\u2A0C", | ||
"Qopf":"\u211A", | ||
"qopf":"\uD835\uDD62", | ||
"qprime":"\u2057", | ||
"Qscr":"\uD835\uDCAC", | ||
"qscr":"\uD835\uDCC6", | ||
"quaternions":"\u210D", | ||
"quatint":"\u2A16", | ||
"quest":"\u003F", | ||
"questeq":"\u225F", | ||
"QUOT":"\u0022", | ||
"quot":"\u0022", | ||
"rAarr":"\u21DB", | ||
"race":"\u223D\u0331", | ||
"Racute":"\u0154", | ||
"racute":"\u0155", | ||
"radic":"\u221A", | ||
"raemptyv":"\u29B3", | ||
"Rang":"\u27EB", | ||
"rang":"\u27E9", | ||
"rangd":"\u2992", | ||
"range":"\u29A5", | ||
"rangle":"\u27E9", | ||
"raquo":"\u00BB", | ||
"Rarr":"\u21A0", | ||
"rArr":"\u21D2", | ||
"rarr":"\u2192", | ||
"rarrap":"\u2975", | ||
"rarrb":"\u21E5", | ||
"rarrbfs":"\u2920", | ||
"rarrc":"\u2933", | ||
"rarrfs":"\u291E", | ||
"rarrhk":"\u21AA", | ||
"rarrlp":"\u21AC", | ||
"rarrpl":"\u2945", | ||
"rarrsim":"\u2974", | ||
"Rarrtl":"\u2916", | ||
"rarrtl":"\u21A3", | ||
"rarrw":"\u219D", | ||
"rAtail":"\u291C", | ||
"ratail":"\u291A", | ||
"ratio":"\u2236", | ||
"rationals":"\u211A", | ||
"RBarr":"\u2910", | ||
"rBarr":"\u290F", | ||
"rbarr":"\u290D", | ||
"rbbrk":"\u2773", | ||
"rbrace":"\u007D", | ||
"rbrack":"\u005D", | ||
"rbrke":"\u298C", | ||
"rbrksld":"\u298E", | ||
"rbrkslu":"\u2990", | ||
"Rcaron":"\u0158", | ||
"rcaron":"\u0159", | ||
"Rcedil":"\u0156", | ||
"rcedil":"\u0157", | ||
"rceil":"\u2309", | ||
"rcub":"\u007D", | ||
"Rcy":"\u0420", | ||
"rcy":"\u0440", | ||
"rdca":"\u2937", | ||
"rdldhar":"\u2969", | ||
"rdquo":"\u201D", | ||
"rdquor":"\u201D", | ||
"rdsh":"\u21B3", | ||
"Re":"\u211C", | ||
"real":"\u211C", | ||
"realine":"\u211B", | ||
"realpart":"\u211C", | ||
"reals":"\u211D", | ||
"rect":"\u25AD", | ||
"REG":"\u00AE", | ||
"reg":"\u00AE", | ||
"ReverseElement":"\u220B", | ||
"ReverseEquilibrium":"\u21CB", | ||
"ReverseUpEquilibrium":"\u296F", | ||
"rfisht":"\u297D", | ||
"rfloor":"\u230B", | ||
"Rfr":"\u211C", | ||
"rfr":"\uD835\uDD2F", | ||
"rHar":"\u2964", | ||
"rhard":"\u21C1", | ||
"rharu":"\u21C0", | ||
"rharul":"\u296C", | ||
"Rho":"\u03A1", | ||
"rho":"\u03C1", | ||
"rhov":"\u03F1", | ||
"RightAngleBracket":"\u27E9", | ||
"RightArrow":"\u2192", | ||
"Rightarrow":"\u21D2", | ||
"rightarrow":"\u2192", | ||
"RightArrowBar":"\u21E5", | ||
"RightArrowLeftArrow":"\u21C4", | ||
"rightarrowtail":"\u21A3", | ||
"RightCeiling":"\u2309", | ||
"RightDoubleBracket":"\u27E7", | ||
"RightDownTeeVector":"\u295D", | ||
"RightDownVector":"\u21C2", | ||
"RightDownVectorBar":"\u2955", | ||
"RightFloor":"\u230B", | ||
"rightharpoondown":"\u21C1", | ||
"rightharpoonup":"\u21C0", | ||
"rightleftarrows":"\u21C4", | ||
"rightleftharpoons":"\u21CC", | ||
"rightrightarrows":"\u21C9", | ||
"rightsquigarrow":"\u219D", | ||
"RightTee":"\u22A2", | ||
"RightTeeArrow":"\u21A6", | ||
"RightTeeVector":"\u295B", | ||
"rightthreetimes":"\u22CC", | ||
"RightTriangle":"\u22B3", | ||
"RightTriangleBar":"\u29D0", | ||
"RightTriangleEqual":"\u22B5", | ||
"RightUpDownVector":"\u294F", | ||
"RightUpTeeVector":"\u295C", | ||
"RightUpVector":"\u21BE", | ||
"RightUpVectorBar":"\u2954", | ||
"RightVector":"\u21C0", | ||
"RightVectorBar":"\u2953", | ||
"ring":"\u02DA", | ||
"risingdotseq":"\u2253", | ||
"rlarr":"\u21C4", | ||
"rlhar":"\u21CC", | ||
"rlm":"\u200F", | ||
"rmoust":"\u23B1", | ||
"rmoustache":"\u23B1", | ||
"rnmid":"\u2AEE", | ||
"roang":"\u27ED", | ||
"roarr":"\u21FE", | ||
"robrk":"\u27E7", | ||
"ropar":"\u2986", | ||
"Ropf":"\u211D", | ||
"ropf":"\uD835\uDD63", | ||
"roplus":"\u2A2E", | ||
"rotimes":"\u2A35", | ||
"RoundImplies":"\u2970", | ||
"rpar":"\u0029", | ||
"rpargt":"\u2994", | ||
"rppolint":"\u2A12", | ||
"rrarr":"\u21C9", | ||
"Rrightarrow":"\u21DB", | ||
"rsaquo":"\u203A", | ||
"Rscr":"\u211B", | ||
"rscr":"\uD835\uDCC7", | ||
"Rsh":"\u21B1", | ||
"rsh":"\u21B1", | ||
"rsqb":"\u005D", | ||
"rsquo":"\u2019", | ||
"rsquor":"\u2019", | ||
"rthree":"\u22CC", | ||
"rtimes":"\u22CA", | ||
"rtri":"\u25B9", | ||
"rtrie":"\u22B5", | ||
"rtrif":"\u25B8", | ||
"rtriltri":"\u29CE", | ||
"RuleDelayed":"\u29F4", | ||
"ruluhar":"\u2968", | ||
"rx":"\u211E", | ||
"Sacute":"\u015A", | ||
"sacute":"\u015B", | ||
"sbquo":"\u201A", | ||
"Sc":"\u2ABC", | ||
"sc":"\u227B", | ||
"scap":"\u2AB8", | ||
"Scaron":"\u0160", | ||
"scaron":"\u0161", | ||
"sccue":"\u227D", | ||
"scE":"\u2AB4", | ||
"sce":"\u2AB0", | ||
"Scedil":"\u015E", | ||
"scedil":"\u015F", | ||
"Scirc":"\u015C", | ||
"scirc":"\u015D", | ||
"scnap":"\u2ABA", | ||
"scnE":"\u2AB6", | ||
"scnsim":"\u22E9", | ||
"scpolint":"\u2A13", | ||
"scsim":"\u227F", | ||
"Scy":"\u0421", | ||
"scy":"\u0441", | ||
"sdot":"\u22C5", | ||
"sdotb":"\u22A1", | ||
"sdote":"\u2A66", | ||
"searhk":"\u2925", | ||
"seArr":"\u21D8", | ||
"searr":"\u2198", | ||
"searrow":"\u2198", | ||
"sect":"\u00A7", | ||
"semi":"\u003B", | ||
"seswar":"\u2929", | ||
"setminus":"\u2216", | ||
"setmn":"\u2216", | ||
"sext":"\u2736", | ||
"Sfr":"\uD835\uDD16", | ||
"sfr":"\uD835\uDD30", | ||
"sfrown":"\u2322", | ||
"sharp":"\u266F", | ||
"SHCHcy":"\u0429", | ||
"shchcy":"\u0449", | ||
"SHcy":"\u0428", | ||
"shcy":"\u0448", | ||
"ShortDownArrow":"\u2193", | ||
"ShortLeftArrow":"\u2190", | ||
"shortmid":"\u2223", | ||
"shortparallel":"\u2225", | ||
"ShortRightArrow":"\u2192", | ||
"ShortUpArrow":"\u2191", | ||
"shy":"\u00AD", | ||
"Sigma":"\u03A3", | ||
"sigma":"\u03C3", | ||
"sigmaf":"\u03C2", | ||
"sigmav":"\u03C2", | ||
"sim":"\u223C", | ||
"simdot":"\u2A6A", | ||
"sime":"\u2243", | ||
"simeq":"\u2243", | ||
"simg":"\u2A9E", | ||
"simgE":"\u2AA0", | ||
"siml":"\u2A9D", | ||
"simlE":"\u2A9F", | ||
"simne":"\u2246", | ||
"simplus":"\u2A24", | ||
"simrarr":"\u2972", | ||
"slarr":"\u2190", | ||
"SmallCircle":"\u2218", | ||
"smallsetminus":"\u2216", | ||
"smashp":"\u2A33", | ||
"smeparsl":"\u29E4", | ||
"smid":"\u2223", | ||
"smile":"\u2323", | ||
"smt":"\u2AAA", | ||
"smte":"\u2AAC", | ||
"smtes":"\u2AAC\uFE00", | ||
"SOFTcy":"\u042C", | ||
"softcy":"\u044C", | ||
"sol":"\u002F", | ||
"solb":"\u29C4", | ||
"solbar":"\u233F", | ||
"Sopf":"\uD835\uDD4A", | ||
"sopf":"\uD835\uDD64", | ||
"spades":"\u2660", | ||
"spadesuit":"\u2660", | ||
"spar":"\u2225", | ||
"sqcap":"\u2293", | ||
"sqcaps":"\u2293\uFE00", | ||
"sqcup":"\u2294", | ||
"sqcups":"\u2294\uFE00", | ||
"Sqrt":"\u221A", | ||
"sqsub":"\u228F", | ||
"sqsube":"\u2291", | ||
"sqsubset":"\u228F", | ||
"sqsubseteq":"\u2291", | ||
"sqsup":"\u2290", | ||
"sqsupe":"\u2292", | ||
"sqsupset":"\u2290", | ||
"sqsupseteq":"\u2292", | ||
"squ":"\u25A1", | ||
"Square":"\u25A1", | ||
"square":"\u25A1", | ||
"SquareIntersection":"\u2293", | ||
"SquareSubset":"\u228F", | ||
"SquareSubsetEqual":"\u2291", | ||
"SquareSuperset":"\u2290", | ||
"SquareSupersetEqual":"\u2292", | ||
"SquareUnion":"\u2294", | ||
"squarf":"\u25AA", | ||
"squf":"\u25AA", | ||
"srarr":"\u2192", | ||
"Sscr":"\uD835\uDCAE", | ||
"sscr":"\uD835\uDCC8", | ||
"ssetmn":"\u2216", | ||
"ssmile":"\u2323", | ||
"sstarf":"\u22C6", | ||
"Star":"\u22C6", | ||
"star":"\u2606", | ||
"starf":"\u2605", | ||
"straightepsilon":"\u03F5", | ||
"straightphi":"\u03D5", | ||
"strns":"\u00AF", | ||
"Sub":"\u22D0", | ||
"sub":"\u2282", | ||
"subdot":"\u2ABD", | ||
"subE":"\u2AC5", | ||
"sube":"\u2286", | ||
"subedot":"\u2AC3", | ||
"submult":"\u2AC1", | ||
"subnE":"\u2ACB", | ||
"subne":"\u228A", | ||
"subplus":"\u2ABF", | ||
"subrarr":"\u2979", | ||
"Subset":"\u22D0", | ||
"subset":"\u2282", | ||
"subseteq":"\u2286", | ||
"subseteqq":"\u2AC5", | ||
"SubsetEqual":"\u2286", | ||
"subsetneq":"\u228A", | ||
"subsetneqq":"\u2ACB", | ||
"subsim":"\u2AC7", | ||
"subsub":"\u2AD5", | ||
"subsup":"\u2AD3", | ||
"succ":"\u227B", | ||
"succapprox":"\u2AB8", | ||
"succcurlyeq":"\u227D", | ||
"Succeeds":"\u227B", | ||
"SucceedsEqual":"\u2AB0", | ||
"SucceedsSlantEqual":"\u227D", | ||
"SucceedsTilde":"\u227F", | ||
"succeq":"\u2AB0", | ||
"succnapprox":"\u2ABA", | ||
"succneqq":"\u2AB6", | ||
"succnsim":"\u22E9", | ||
"succsim":"\u227F", | ||
"SuchThat":"\u220B", | ||
"Sum":"\u2211", | ||
"sum":"\u2211", | ||
"sung":"\u266A", | ||
"Sup":"\u22D1", | ||
"sup":"\u2283", | ||
"sup1":"\u00B9", | ||
"sup2":"\u00B2", | ||
"sup3":"\u00B3", | ||
"supdot":"\u2ABE", | ||
"supdsub":"\u2AD8", | ||
"supE":"\u2AC6", | ||
"supe":"\u2287", | ||
"supedot":"\u2AC4", | ||
"Superset":"\u2283", | ||
"SupersetEqual":"\u2287", | ||
"suphsol":"\u27C9", | ||
"suphsub":"\u2AD7", | ||
"suplarr":"\u297B", | ||
"supmult":"\u2AC2", | ||
"supnE":"\u2ACC", | ||
"supne":"\u228B", | ||
"supplus":"\u2AC0", | ||
"Supset":"\u22D1", | ||
"supset":"\u2283", | ||
"supseteq":"\u2287", | ||
"supseteqq":"\u2AC6", | ||
"supsetneq":"\u228B", | ||
"supsetneqq":"\u2ACC", | ||
"supsim":"\u2AC8", | ||
"supsub":"\u2AD4", | ||
"supsup":"\u2AD6", | ||
"swarhk":"\u2926", | ||
"swArr":"\u21D9", | ||
"swarr":"\u2199", | ||
"swarrow":"\u2199", | ||
"swnwar":"\u292A", | ||
"szlig":"\u00DF", | ||
"Tab":"\u0009", | ||
"target":"\u2316", | ||
"Tau":"\u03A4", | ||
"tau":"\u03C4", | ||
"tbrk":"\u23B4", | ||
"Tcaron":"\u0164", | ||
"tcaron":"\u0165", | ||
"Tcedil":"\u0162", | ||
"tcedil":"\u0163", | ||
"Tcy":"\u0422", | ||
"tcy":"\u0442", | ||
"tdot":"\u20DB", | ||
"telrec":"\u2315", | ||
"Tfr":"\uD835\uDD17", | ||
"tfr":"\uD835\uDD31", | ||
"there4":"\u2234", | ||
"Therefore":"\u2234", | ||
"therefore":"\u2234", | ||
"Theta":"\u0398", | ||
"theta":"\u03B8", | ||
"thetasym":"\u03D1", | ||
"thetav":"\u03D1", | ||
"thickapprox":"\u2248", | ||
"thicksim":"\u223C", | ||
"ThickSpace":"\u205F\u200A", | ||
"thinsp":"\u2009", | ||
"ThinSpace":"\u2009", | ||
"thkap":"\u2248", | ||
"thksim":"\u223C", | ||
"THORN":"\u00DE", | ||
"thorn":"\u00FE", | ||
"Tilde":"\u223C", | ||
"tilde":"\u02DC", | ||
"TildeEqual":"\u2243", | ||
"TildeFullEqual":"\u2245", | ||
"TildeTilde":"\u2248", | ||
"times":"\u00D7", | ||
"timesb":"\u22A0", | ||
"timesbar":"\u2A31", | ||
"timesd":"\u2A30", | ||
"tint":"\u222D", | ||
"toea":"\u2928", | ||
"top":"\u22A4", | ||
"topbot":"\u2336", | ||
"topcir":"\u2AF1", | ||
"Topf":"\uD835\uDD4B", | ||
"topf":"\uD835\uDD65", | ||
"topfork":"\u2ADA", | ||
"tosa":"\u2929", | ||
"tprime":"\u2034", | ||
"TRADE":"\u2122", | ||
"trade":"\u2122", | ||
"triangle":"\u25B5", | ||
"triangledown":"\u25BF", | ||
"triangleleft":"\u25C3", | ||
"trianglelefteq":"\u22B4", | ||
"triangleq":"\u225C", | ||
"triangleright":"\u25B9", | ||
"trianglerighteq":"\u22B5", | ||
"tridot":"\u25EC", | ||
"trie":"\u225C", | ||
"triminus":"\u2A3A", | ||
"TripleDot":"\u20DB", | ||
"triplus":"\u2A39", | ||
"trisb":"\u29CD", | ||
"tritime":"\u2A3B", | ||
"trpezium":"\u23E2", | ||
"Tscr":"\uD835\uDCAF", | ||
"tscr":"\uD835\uDCC9", | ||
"TScy":"\u0426", | ||
"tscy":"\u0446", | ||
"TSHcy":"\u040B", | ||
"tshcy":"\u045B", | ||
"Tstrok":"\u0166", | ||
"tstrok":"\u0167", | ||
"twixt":"\u226C", | ||
"twoheadleftarrow":"\u219E", | ||
"twoheadrightarrow":"\u21A0", | ||
"Uacute":"\u00DA", | ||
"uacute":"\u00FA", | ||
"Uarr":"\u219F", | ||
"uArr":"\u21D1", | ||
"uarr":"\u2191", | ||
"Uarrocir":"\u2949", | ||
"Ubrcy":"\u040E", | ||
"ubrcy":"\u045E", | ||
"Ubreve":"\u016C", | ||
"ubreve":"\u016D", | ||
"Ucirc":"\u00DB", | ||
"ucirc":"\u00FB", | ||
"Ucy":"\u0423", | ||
"ucy":"\u0443", | ||
"udarr":"\u21C5", | ||
"Udblac":"\u0170", | ||
"udblac":"\u0171", | ||
"udhar":"\u296E", | ||
"ufisht":"\u297E", | ||
"Ufr":"\uD835\uDD18", | ||
"ufr":"\uD835\uDD32", | ||
"Ugrave":"\u00D9", | ||
"ugrave":"\u00F9", | ||
"uHar":"\u2963", | ||
"uharl":"\u21BF", | ||
"uharr":"\u21BE", | ||
"uhblk":"\u2580", | ||
"ulcorn":"\u231C", | ||
"ulcorner":"\u231C", | ||
"ulcrop":"\u230F", | ||
"ultri":"\u25F8", | ||
"Umacr":"\u016A", | ||
"umacr":"\u016B", | ||
"uml":"\u00A8", | ||
"UnderBar":"\u005F", | ||
"UnderBrace":"\u23DF", | ||
"UnderBracket":"\u23B5", | ||
"UnderParenthesis":"\u23DD", | ||
"Union":"\u22C3", | ||
"UnionPlus":"\u228E", | ||
"Uogon":"\u0172", | ||
"uogon":"\u0173", | ||
"Uopf":"\uD835\uDD4C", | ||
"uopf":"\uD835\uDD66", | ||
"UpArrow":"\u2191", | ||
"Uparrow":"\u21D1", | ||
"uparrow":"\u2191", | ||
"UpArrowBar":"\u2912", | ||
"UpArrowDownArrow":"\u21C5", | ||
"UpDownArrow":"\u2195", | ||
"Updownarrow":"\u21D5", | ||
"updownarrow":"\u2195", | ||
"UpEquilibrium":"\u296E", | ||
"upharpoonleft":"\u21BF", | ||
"upharpoonright":"\u21BE", | ||
"uplus":"\u228E", | ||
"UpperLeftArrow":"\u2196", | ||
"UpperRightArrow":"\u2197", | ||
"Upsi":"\u03D2", | ||
"upsi":"\u03C5", | ||
"upsih":"\u03D2", | ||
"Upsilon":"\u03A5", | ||
"upsilon":"\u03C5", | ||
"UpTee":"\u22A5", | ||
"UpTeeArrow":"\u21A5", | ||
"upuparrows":"\u21C8", | ||
"urcorn":"\u231D", | ||
"urcorner":"\u231D", | ||
"urcrop":"\u230E", | ||
"Uring":"\u016E", | ||
"uring":"\u016F", | ||
"urtri":"\u25F9", | ||
"Uscr":"\uD835\uDCB0", | ||
"uscr":"\uD835\uDCCA", | ||
"utdot":"\u22F0", | ||
"Utilde":"\u0168", | ||
"utilde":"\u0169", | ||
"utri":"\u25B5", | ||
"utrif":"\u25B4", | ||
"uuarr":"\u21C8", | ||
"Uuml":"\u00DC", | ||
"uuml":"\u00FC", | ||
"uwangle":"\u29A7", | ||
"vangrt":"\u299C", | ||
"varepsilon":"\u03F5", | ||
"varkappa":"\u03F0", | ||
"varnothing":"\u2205", | ||
"varphi":"\u03D5", | ||
"varpi":"\u03D6", | ||
"varpropto":"\u221D", | ||
"vArr":"\u21D5", | ||
"varr":"\u2195", | ||
"varrho":"\u03F1", | ||
"varsigma":"\u03C2", | ||
"varsubsetneq":"\u228A\uFE00", | ||
"varsubsetneqq":"\u2ACB\uFE00", | ||
"varsupsetneq":"\u228B\uFE00", | ||
"varsupsetneqq":"\u2ACC\uFE00", | ||
"vartheta":"\u03D1", | ||
"vartriangleleft":"\u22B2", | ||
"vartriangleright":"\u22B3", | ||
"Vbar":"\u2AEB", | ||
"vBar":"\u2AE8", | ||
"vBarv":"\u2AE9", | ||
"Vcy":"\u0412", | ||
"vcy":"\u0432", | ||
"VDash":"\u22AB", | ||
"Vdash":"\u22A9", | ||
"vDash":"\u22A8", | ||
"vdash":"\u22A2", | ||
"Vdashl":"\u2AE6", | ||
"Vee":"\u22C1", | ||
"vee":"\u2228", | ||
"veebar":"\u22BB", | ||
"veeeq":"\u225A", | ||
"vellip":"\u22EE", | ||
"Verbar":"\u2016", | ||
"verbar":"\u007C", | ||
"Vert":"\u2016", | ||
"vert":"\u007C", | ||
"VerticalBar":"\u2223", | ||
"VerticalLine":"\u007C", | ||
"VerticalSeparator":"\u2758", | ||
"VerticalTilde":"\u2240", | ||
"VeryThinSpace":"\u200A", | ||
"Vfr":"\uD835\uDD19", | ||
"vfr":"\uD835\uDD33", | ||
"vltri":"\u22B2", | ||
"vnsub":"\u2282\u20D2", | ||
"vnsup":"\u2283\u20D2", | ||
"Vopf":"\uD835\uDD4D", | ||
"vopf":"\uD835\uDD67", | ||
"vprop":"\u221D", | ||
"vrtri":"\u22B3", | ||
"Vscr":"\uD835\uDCB1", | ||
"vscr":"\uD835\uDCCB", | ||
"vsubnE":"\u2ACB\uFE00", | ||
"vsubne":"\u228A\uFE00", | ||
"vsupnE":"\u2ACC\uFE00", | ||
"vsupne":"\u228B\uFE00", | ||
"Vvdash":"\u22AA", | ||
"vzigzag":"\u299A", | ||
"Wcirc":"\u0174", | ||
"wcirc":"\u0175", | ||
"wedbar":"\u2A5F", | ||
"Wedge":"\u22C0", | ||
"wedge":"\u2227", | ||
"wedgeq":"\u2259", | ||
"weierp":"\u2118", | ||
"Wfr":"\uD835\uDD1A", | ||
"wfr":"\uD835\uDD34", | ||
"Wopf":"\uD835\uDD4E", | ||
"wopf":"\uD835\uDD68", | ||
"wp":"\u2118", | ||
"wr":"\u2240", | ||
"wreath":"\u2240", | ||
"Wscr":"\uD835\uDCB2", | ||
"wscr":"\uD835\uDCCC", | ||
"xcap":"\u22C2", | ||
"xcirc":"\u25EF", | ||
"xcup":"\u22C3", | ||
"xdtri":"\u25BD", | ||
"Xfr":"\uD835\uDD1B", | ||
"xfr":"\uD835\uDD35", | ||
"xhArr":"\u27FA", | ||
"xharr":"\u27F7", | ||
"Xi":"\u039E", | ||
"xi":"\u03BE", | ||
"xlArr":"\u27F8", | ||
"xlarr":"\u27F5", | ||
"xmap":"\u27FC", | ||
"xnis":"\u22FB", | ||
"xodot":"\u2A00", | ||
"Xopf":"\uD835\uDD4F", | ||
"xopf":"\uD835\uDD69", | ||
"xoplus":"\u2A01", | ||
"xotime":"\u2A02", | ||
"xrArr":"\u27F9", | ||
"xrarr":"\u27F6", | ||
"Xscr":"\uD835\uDCB3", | ||
"xscr":"\uD835\uDCCD", | ||
"xsqcup":"\u2A06", | ||
"xuplus":"\u2A04", | ||
"xutri":"\u25B3", | ||
"xvee":"\u22C1", | ||
"xwedge":"\u22C0", | ||
"Yacute":"\u00DD", | ||
"yacute":"\u00FD", | ||
"YAcy":"\u042F", | ||
"yacy":"\u044F", | ||
"Ycirc":"\u0176", | ||
"ycirc":"\u0177", | ||
"Ycy":"\u042B", | ||
"ycy":"\u044B", | ||
"yen":"\u00A5", | ||
"Yfr":"\uD835\uDD1C", | ||
"yfr":"\uD835\uDD36", | ||
"YIcy":"\u0407", | ||
"yicy":"\u0457", | ||
"Yopf":"\uD835\uDD50", | ||
"yopf":"\uD835\uDD6A", | ||
"Yscr":"\uD835\uDCB4", | ||
"yscr":"\uD835\uDCCE", | ||
"YUcy":"\u042E", | ||
"yucy":"\u044E", | ||
"Yuml":"\u0178", | ||
"yuml":"\u00FF", | ||
"Zacute":"\u0179", | ||
"zacute":"\u017A", | ||
"Zcaron":"\u017D", | ||
"zcaron":"\u017E", | ||
"Zcy":"\u0417", | ||
"zcy":"\u0437", | ||
"Zdot":"\u017B", | ||
"zdot":"\u017C", | ||
"zeetrf":"\u2128", | ||
"ZeroWidthSpace":"\u200B", | ||
"Zeta":"\u0396", | ||
"zeta":"\u03B6", | ||
"Zfr":"\u2128", | ||
"zfr":"\uD835\uDD37", | ||
"ZHcy":"\u0416", | ||
"zhcy":"\u0436", | ||
"zigrarr":"\u21DD", | ||
"Zopf":"\u2124", | ||
"zopf":"\uD835\uDD6B", | ||
"Zscr":"\uD835\uDCB5", | ||
"zscr":"\uD835\uDCCF", | ||
"zwj":"\u200D", | ||
"zwnj":"\u200C" | ||
}; | ||
module.exports = require('entities/maps/entities.json'); |
@@ -87,3 +87,5 @@ // Utilities | ||
return entities[name]; | ||
} else if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) { | ||
} | ||
if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) { | ||
code = name[1].toLowerCase() === 'x' ? | ||
@@ -97,10 +99,11 @@ parseInt(name.slice(2), 16) | ||
} | ||
return match; | ||
} | ||
function replaceEntities(str) { | ||
/*function replaceEntities(str) { | ||
if (str.indexOf('&') < 0) { return str; } | ||
return str.replace(ENTITY_RE, replaceEntityPattern); | ||
} | ||
}*/ | ||
@@ -145,19 +148,2 @@ function unescapeMd(str) { | ||
var encode = require('mdurl/encode'); | ||
// Incoming link can be partially encoded. Convert possible combinations to | ||
// unified form. | ||
// | ||
// TODO: Rewrite it. Should use: | ||
// | ||
// - encodeURIComponent for query | ||
// - encodeURI for path | ||
// - (?) punicode for domain mame (but encodeURI seems to work in real world) | ||
// | ||
function normalizeLink(url) { | ||
return encode(url); | ||
} | ||
//////////////////////////////////////////////////////////////////////////////// | ||
var REGEXP_ESCAPE_RE = /[.?*+^$[\]\\(){}|-]/g; | ||
@@ -260,2 +246,10 @@ | ||
// Re-export libraries commonly used in both markdown-it and its plugins, | ||
// so plugins won't have to depend on them explicitly, which reduces their | ||
// bundled size (e.g. a browser build). | ||
// | ||
exports.lib = {}; | ||
exports.lib.mdurl = require('mdurl'); | ||
exports.lib.ucmicro = require('uc.micro'); | ||
exports.assign = assign; | ||
@@ -268,6 +262,5 @@ exports.isString = isString; | ||
exports.fromCodePoint = fromCodePoint; | ||
exports.replaceEntities = replaceEntities; | ||
// exports.replaceEntities = replaceEntities; | ||
exports.escapeHtml = escapeHtml; | ||
exports.arrayReplaceAt = arrayReplaceAt; | ||
exports.normalizeLink = normalizeLink; | ||
exports.isWhiteSpace = isWhiteSpace; | ||
@@ -274,0 +267,0 @@ exports.isMdAsciiPunct = isMdAsciiPunct; |
@@ -6,3 +6,2 @@ // Parse link destination | ||
var normalizeLink = require('../common/utils').normalizeLink; | ||
var unescapeAll = require('../common/utils').unescapeAll; | ||
@@ -29,3 +28,3 @@ | ||
result.pos = pos + 1; | ||
result.str = normalizeLink(unescapeAll(str.slice(start + 1, pos))); | ||
result.str = unescapeAll(str.slice(start + 1, pos)); | ||
result.ok = true; | ||
@@ -77,3 +76,3 @@ return result; | ||
result.str = normalizeLink(unescapeAll(str.slice(start, pos))); | ||
result.str = unescapeAll(str.slice(start, pos)); | ||
result.lines = lines; | ||
@@ -80,0 +79,0 @@ result.pos = pos; |
@@ -13,3 +13,6 @@ // Main perser class | ||
var LinkifyIt = require('linkify-it'); | ||
var mdurl = require('mdurl'); | ||
var punycode = require('punycode'); | ||
var config = { | ||
@@ -22,2 +25,58 @@ 'default': require('./presets/default'), | ||
var BAD_PROTOCOLS = [ 'vbscript', 'javascript', 'file' ]; | ||
function validateLink(url) { | ||
// url should be normalized at this point, and existing entities are decoded | ||
// | ||
var str = url.trim().toLowerCase(); | ||
if (str.indexOf(':') >= 0 && BAD_PROTOCOLS.indexOf(str.split(':')[0]) >= 0) { | ||
return false; | ||
} | ||
return true; | ||
} | ||
var RECODE_HOSTNAME_FOR = [ 'http:', 'https:', 'mailto:' ]; | ||
function normalizeLink(url) { | ||
var parsed = mdurl.parse(url, true); | ||
if (parsed.hostname) { | ||
// Encode hostnames in urls like: | ||
// `http://host/`, `https://host/`, `mailto:user@host`, `//host/` | ||
// | ||
// We don't encode unknown schemas, because it's likely that we encode | ||
// something we shouldn't (e.g. `skype:name` treated as `skype:host`) | ||
// | ||
if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) { | ||
try { | ||
parsed.hostname = punycode.toASCII(parsed.hostname); | ||
} catch(er) {} | ||
} | ||
} | ||
return mdurl.encode(mdurl.format(parsed)); | ||
} | ||
function normalizeLinkText(url) { | ||
var parsed = mdurl.parse(url, true); | ||
if (parsed.hostname) { | ||
// Encode hostnames in urls like: | ||
// `http://host/`, `https://host/`, `mailto:user@host`, `//host/` | ||
// | ||
// We don't encode unknown schemas, because it's likely that we encode | ||
// something we shouldn't (e.g. `skype:name` treated as `skype:host`) | ||
// | ||
if (!parsed.protocol || RECODE_HOSTNAME_FOR.indexOf(parsed.protocol) >= 0) { | ||
try { | ||
parsed.hostname = punycode.toUnicode(parsed.hostname); | ||
} catch(er) {} | ||
} | ||
} | ||
return mdurl.decode(mdurl.format(parsed)); | ||
} | ||
/** | ||
@@ -207,2 +266,33 @@ * class MarkdownIt | ||
/** | ||
* MarkdownIt#validateLink(url) -> Boolean | ||
* | ||
* Link validation function. CommonMark allows too much in links. By default | ||
* we disable `javascript:` and `vbscript:` schemas. You can change this | ||
* behaviour. | ||
* | ||
* ```javascript | ||
* var md = require('markdown-it')(); | ||
* // enable everything | ||
* md.validateLink = function () { return true; } | ||
* ``` | ||
**/ | ||
this.validateLink = validateLink; | ||
/** | ||
* MarkdownIt#normalizeLink(url) -> String | ||
* | ||
* Function used to encode link url to a machine-readable format, | ||
* which includes url-encoding, punycode, etc. | ||
**/ | ||
this.normalizeLink = normalizeLink; | ||
/** | ||
* MarkdownIt#normalizeLinkText(url) -> String | ||
* | ||
* Function used to decode link url to a human-readable format` | ||
**/ | ||
this.normalizeLinkText = normalizeLinkText; | ||
// Expose utils & helpers for easy acces from plugins | ||
@@ -209,0 +299,0 @@ |
@@ -17,5 +17,5 @@ /** internal | ||
[ 'inline', require('./rules_core/inline') ], | ||
[ 'linkify', require('./rules_core/linkify') ], | ||
[ 'replacements', require('./rules_core/replacements') ], | ||
[ 'smartquotes', require('./rules_core/smartquotes') ], | ||
[ 'linkify', require('./rules_core/linkify') ] | ||
[ 'smartquotes', require('./rules_core/smartquotes') ] | ||
]; | ||
@@ -22,0 +22,0 @@ |
@@ -10,4 +10,4 @@ /** internal | ||
var Ruler = require('./ruler'); | ||
var replaceEntities = require('./common/utils').replaceEntities; | ||
//////////////////////////////////////////////////////////////////////////////// | ||
@@ -31,17 +31,2 @@ // Parser rules | ||
var BAD_PROTOCOLS = [ 'vbscript', 'javascript', 'file' ]; | ||
function validateLink(url) { | ||
// Care about digital entities "javascript:alert(1)" | ||
var str = replaceEntities(url); | ||
str = str.trim().toLowerCase(); | ||
if (str.indexOf(':') >= 0 && BAD_PROTOCOLS.indexOf(str.split(':')[0]) >= 0) { | ||
return false; | ||
} | ||
return true; | ||
} | ||
/** | ||
@@ -52,17 +37,2 @@ * new ParserInline() | ||
/** | ||
* ParserInline#validateLink(url) -> Boolean | ||
* | ||
* Link validation function. CommonMark allows too much in links. By default | ||
* we disable `javascript:` and `vbscript:` schemas. You can change this | ||
* behaviour. | ||
* | ||
* ```javascript | ||
* var md = require('markdown-it')(); | ||
* // enable everything | ||
* md.inline.validateLink = function () { return true; } | ||
* ``` | ||
**/ | ||
this.validateLink = validateLink; | ||
/** | ||
* ParserInline#ruler -> Ruler | ||
@@ -84,10 +54,11 @@ * | ||
ParserInline.prototype.skipToken = function (state) { | ||
var i, cached_pos, pos = state.pos, | ||
var i, pos = state.pos, | ||
rules = this.ruler.getRules(''), | ||
len = rules.length, | ||
maxNesting = state.md.options.maxNesting; | ||
maxNesting = state.md.options.maxNesting, | ||
cache = state.cache; | ||
if ((cached_pos = state.cacheGet(pos)) > 0) { | ||
state.pos = cached_pos; | ||
if (typeof cache[pos] !== 'undefined') { | ||
state.pos = cache[pos]; | ||
return; | ||
@@ -100,3 +71,3 @@ } | ||
if (rules[i](state, true)) { | ||
state.cacheSet(pos, state.pos); | ||
cache[pos] = state.pos; | ||
return; | ||
@@ -108,3 +79,3 @@ } | ||
state.pos++; | ||
state.cacheSet(pos, state.pos); | ||
cache[pos] = state.pos; | ||
}; | ||
@@ -111,0 +82,0 @@ |
@@ -18,27 +18,23 @@ /** | ||
var rules = {}; | ||
var default_rules = {}; | ||
rules.blockquote_open = function () { return '<blockquote>\n'; }; | ||
rules.blockquote_close = function () { return '</blockquote>\n'; }; | ||
default_rules.code_inline = function (tokens, idx /*, options, env */) { | ||
return '<code>' + escapeHtml(tokens[idx].content) + '</code>'; | ||
}; | ||
rules.code_block = function (tokens, idx /*, options, env */) { | ||
default_rules.code_block = function (tokens, idx /*, options, env */) { | ||
return '<pre><code>' + escapeHtml(tokens[idx].content) + '</code></pre>\n'; | ||
}; | ||
rules.code_inline = function (tokens, idx /*, options, env */) { | ||
return '<code>' + escapeHtml(tokens[idx].content) + '</code>'; | ||
}; | ||
rules.fence = function (tokens, idx, options /*, env, self*/) { | ||
var token = tokens[idx]; | ||
var langClass = ''; | ||
var langPrefix = options.langPrefix; | ||
var langName = ''; | ||
var highlighted; | ||
default_rules.fence = function (tokens, idx, options, env, self) { | ||
var token = tokens[idx], | ||
langName = '', | ||
highlighted; | ||
if (token.params) { | ||
langName = escapeHtml(unescapeAll(token.params.split(/\s+/g)[0])); | ||
langClass = ' class="' + langPrefix + langName + '"'; | ||
if (token.info) { | ||
langName = unescapeAll(token.info.trim().split(/\s+/g)[0]); | ||
token.attrPush([ 'class', options.langPrefix + langName ]); | ||
} | ||
@@ -52,4 +48,3 @@ | ||
return '<pre><code' + langClass + '>' | ||
return '<pre><code' + self.renderAttrs(token) + '>' | ||
+ highlighted | ||
@@ -60,105 +55,21 @@ + '</code></pre>\n'; | ||
rules.heading_open = function (tokens, idx /*, options, env */) { | ||
return '<h' + tokens[idx].hLevel + '>'; | ||
}; | ||
rules.heading_close = function (tokens, idx /*, options, env */) { | ||
return '</h' + tokens[idx].hLevel + '>\n'; | ||
}; | ||
default_rules.image = function (tokens, idx, options, env, self) { | ||
var token = tokens[idx]; | ||
// "alt" attr MUST be set, even if empty. Because it's mandatory and | ||
// should be placed on proper position for tests. | ||
// | ||
// Replace content with actual value | ||
rules.hr = function (tokens, idx, options /*, env */) { | ||
return (options.xhtmlOut ? '<hr />\n' : '<hr>\n'); | ||
}; | ||
token.attrs[token.attrIndex('alt')][1] = | ||
self.renderInlineAsText(token.children, options, env); | ||
rules.bullet_list_open = function () { return '<ul>\n'; }; | ||
rules.bullet_list_close = function () { return '</ul>\n'; }; | ||
rules.list_item_open = function (tokens, idx /*, options, env */) { | ||
var next = tokens[idx + 1]; | ||
if ((next.type === 'list_item_close') || | ||
(next.type === 'paragraph_open' && next.tight)) { | ||
return '<li>'; | ||
} | ||
return '<li>\n'; | ||
return self.renderToken(tokens, idx, options, env, self); | ||
}; | ||
rules.list_item_close = function () { return '</li>\n'; }; | ||
rules.ordered_list_open = function (tokens, idx /*, options, env */) { | ||
if (tokens[idx].order > 1) { | ||
return '<ol start="' + tokens[idx].order + '">\n'; | ||
} | ||
return '<ol>\n'; | ||
}; | ||
rules.ordered_list_close = function () { return '</ol>\n'; }; | ||
rules.paragraph_open = function (tokens, idx /*, options, env */) { | ||
return tokens[idx].tight ? '' : '<p>'; | ||
}; | ||
rules.paragraph_close = function (tokens, idx /*, options, env */) { | ||
if (tokens[idx].tight === true) { | ||
return tokens[idx + 1].type.slice(-5) === 'close' ? '' : '\n'; | ||
} | ||
return '</p>\n'; | ||
}; | ||
rules.link_open = function (tokens, idx /*, options, env */) { | ||
var title = tokens[idx].title ? (' title="' + escapeHtml(tokens[idx].title) + '"') : ''; | ||
var target = tokens[idx].target ? (' target="' + escapeHtml(tokens[idx].target) + '"') : ''; | ||
return '<a href="' + escapeHtml(tokens[idx].href) + '"' + title + target + '>'; | ||
}; | ||
rules.link_close = function (/* tokens, idx, options, env */) { | ||
return '</a>'; | ||
}; | ||
rules.image = function (tokens, idx, options, env, self) { | ||
var src = ' src="' + escapeHtml(tokens[idx].src) + '"'; | ||
var title = tokens[idx].title ? (' title="' + escapeHtml(tokens[idx].title) + '"') : ''; | ||
var alt = ' alt="' + self.renderInlineAsText(tokens[idx].tokens, options, env) + '"'; | ||
var suffix = options.xhtmlOut ? ' /' : ''; | ||
return '<img' + src + alt + title + suffix + '>'; | ||
}; | ||
rules.table_open = function () { return '<table>\n'; }; | ||
rules.table_close = function () { return '</table>\n'; }; | ||
rules.thead_open = function () { return '<thead>\n'; }; | ||
rules.thead_close = function () { return '</thead>\n'; }; | ||
rules.tbody_open = function () { return '<tbody>\n'; }; | ||
rules.tbody_close = function () { return '</tbody>\n'; }; | ||
rules.tr_open = function () { return '<tr>'; }; | ||
rules.tr_close = function () { return '</tr>\n'; }; | ||
rules.th_open = function (tokens, idx /*, options, env */) { | ||
if (tokens[idx].align) { | ||
return '<th style="text-align:' + tokens[idx].align + '">'; | ||
} | ||
return '<th>'; | ||
}; | ||
rules.th_close = function () { return '</th>'; }; | ||
rules.td_open = function (tokens, idx /*, options, env */) { | ||
if (tokens[idx].align) { | ||
return '<td style="text-align:' + tokens[idx].align + '">'; | ||
} | ||
return '<td>'; | ||
}; | ||
rules.td_close = function () { return '</td>'; }; | ||
rules.strong_open = function () { return '<strong>'; }; | ||
rules.strong_close = function () { return '</strong>'; }; | ||
rules.em_open = function () { return '<em>'; }; | ||
rules.em_close = function () { return '</em>'; }; | ||
rules.s_open = function () { return '<s>'; }; | ||
rules.s_close = function () { return '</s>'; }; | ||
rules.hardbreak = function (tokens, idx, options /*, env */) { | ||
default_rules.hardbreak = function (tokens, idx, options /*, env */) { | ||
return options.xhtmlOut ? '<br />\n' : '<br>\n'; | ||
}; | ||
rules.softbreak = function (tokens, idx, options /*, env */) { | ||
default_rules.softbreak = function (tokens, idx, options /*, env */) { | ||
return options.breaks ? (options.xhtmlOut ? '<br />\n' : '<br>\n') : '\n'; | ||
@@ -168,3 +79,3 @@ }; | ||
rules.text = function (tokens, idx /*, options, env */) { | ||
default_rules.text = function (tokens, idx /*, options, env */) { | ||
return escapeHtml(tokens[idx].content); | ||
@@ -174,6 +85,6 @@ }; | ||
rules.html_block = function (tokens, idx /*, options, env */) { | ||
default_rules.html_block = function (tokens, idx /*, options, env */) { | ||
return tokens[idx].content; | ||
}; | ||
rules.html_inline = function (tokens, idx /*, options, env */) { | ||
default_rules.html_inline = function (tokens, idx /*, options, env */) { | ||
return tokens[idx].content; | ||
@@ -218,3 +129,3 @@ }; | ||
**/ | ||
this.rules = assign({}, rules); | ||
this.rules = assign({}, default_rules); | ||
} | ||
@@ -224,2 +135,92 @@ | ||
/** | ||
* Renderer.renderAttrs(token) -> String | ||
* | ||
* Render token attributes to string. | ||
**/ | ||
Renderer.prototype.renderAttrs = function renderAttrs(token) { | ||
var i, l, result; | ||
if (!token.attrs) { return ''; } | ||
result = ''; | ||
for (i = 0, l = token.attrs.length; i < l; i++) { | ||
result += ' ' + escapeHtml(token.attrs[i][0]) + '="' + escapeHtml(token.attrs[i][1]) + '"'; | ||
} | ||
return result; | ||
}; | ||
/** | ||
* Renderer.renderToken(tokens, idx, options) -> String | ||
* - tokens (Array): list of tokens | ||
* - idx (Numbed): token index to render | ||
* - options (Object): params of parser instance | ||
* | ||
* Default token renderer. Can be overriden by custom function | ||
* in [[Renderer#rules]]. | ||
**/ | ||
Renderer.prototype.renderToken = function renderToken(tokens, idx, options) { | ||
var nextToken, | ||
result = '', | ||
needLf = false, | ||
token = tokens[idx]; | ||
// Tight list paragraphs | ||
if (token.hidden) { | ||
return ''; | ||
} | ||
// Insert a newline between hidden paragraph and subsequent opening | ||
// block-level tag. | ||
// | ||
// For example, here we should insert a newline before blockquote: | ||
// - a | ||
// > | ||
// | ||
if (token.block && token.nesting !== -1 && idx && tokens[idx - 1].hidden) { | ||
result += '\n'; | ||
} | ||
// Add token name, e.g. `<img` | ||
result += (token.nesting === -1 ? '</' : '<') + token.tag; | ||
// Encode attributes, e.g. `<img src="foo"` | ||
result += this.renderAttrs(token); | ||
// Add a slash for self-closing tags, e.g. `<img src="foo" /` | ||
if (token.nesting === 0 && options.xhtmlOut) { | ||
result += ' /'; | ||
} | ||
// Check if we need to add a newline after this tag | ||
if (token.block) { | ||
needLf = true; | ||
if (token.nesting === 1) { | ||
if (idx + 1 < tokens.length) { | ||
nextToken = tokens[idx + 1]; | ||
if (nextToken.type === 'inline' || nextToken.hidden) { | ||
// Block-level tag containing an inline tag. | ||
// | ||
needLf = false; | ||
} else if (nextToken.nesting === -1 && nextToken.tag === token.tag) { | ||
// Opening tag + closing tag of the same type. E.g. `<li></li>`. | ||
// | ||
needLf = false; | ||
} | ||
} | ||
} | ||
} | ||
result += needLf ? '>\n' : '>'; | ||
return result; | ||
}; | ||
/** | ||
* Renderer.renderInline(tokens, options, env) -> String | ||
@@ -233,7 +234,14 @@ * - tokens (Array): list on block tokens to renter | ||
Renderer.prototype.renderInline = function (tokens, options, env) { | ||
var result = '', | ||
_rules = this.rules; | ||
var type, | ||
result = '', | ||
rules = this.rules; | ||
for (var i = 0, len = tokens.length; i < len; i++) { | ||
result += _rules[tokens[i].type](tokens, i, options, env, this); | ||
type = tokens[i].type; | ||
if (typeof rules[type] !== 'undefined') { | ||
result += rules[type](tokens, i, options, env, this); | ||
} else { | ||
result += this.renderToken(tokens, i, options, env); | ||
} | ||
} | ||
@@ -257,9 +265,9 @@ | ||
var result = '', | ||
_rules = this.rules; | ||
rules = this.rules; | ||
for (var i = 0, len = tokens.length; i < len; i++) { | ||
if (tokens[i].type === 'text') { | ||
result += _rules.text(tokens, i, options, env, this); | ||
result += rules.text(tokens, i, options, env, this); | ||
} else if (tokens[i].type === 'image') { | ||
result += this.renderInlineAsText(tokens[i].tokens, options, env); | ||
result += this.renderInlineAsText(tokens[i].children, options, env); | ||
} | ||
@@ -282,11 +290,15 @@ } | ||
Renderer.prototype.render = function (tokens, options, env) { | ||
var i, len, | ||
var i, len, type, | ||
result = '', | ||
_rules = this.rules; | ||
rules = this.rules; | ||
for (i = 0, len = tokens.length; i < len; i++) { | ||
if (tokens[i].type === 'inline') { | ||
type = tokens[i].type; | ||
if (type === 'inline') { | ||
result += this.renderInline(tokens[i].children, options, env); | ||
} else if (typeof rules[type] !== 'undefined') { | ||
result += rules[tokens[i].type](tokens, i, options, env, this); | ||
} else { | ||
result += _rules[tokens[i].type](tokens, i, options, env, this); | ||
result += this.renderToken(tokens, i, options, env); | ||
} | ||
@@ -293,0 +305,0 @@ } |
@@ -8,3 +8,3 @@ // Block quotes | ||
var nextLine, lastLineEmpty, oldTShift, oldBMarks, oldIndent, oldParentType, lines, | ||
terminatorRules, | ||
terminatorRules, token, | ||
i, l, terminate, | ||
@@ -108,12 +108,12 @@ pos = state.bMarks[startLine] + state.tShift[startLine], | ||
state.parentType = 'blockquote'; | ||
state.tokens.push({ | ||
type: 'blockquote_open', | ||
lines: lines = [ startLine, 0 ], | ||
level: state.level++ | ||
}); | ||
token = state.push('blockquote_open', 'blockquote', 1); | ||
token.markup = '>'; | ||
token.map = lines = [ startLine, 0 ]; | ||
state.md.block.tokenize(state, startLine, nextLine); | ||
state.tokens.push({ | ||
type: 'blockquote_close', | ||
level: --state.level | ||
}); | ||
token = state.push('blockquote_close', 'blockquote', -1); | ||
token.markup = '>'; | ||
state.parentType = oldParentType; | ||
@@ -120,0 +120,0 @@ lines[1] = state.line; |
@@ -7,3 +7,3 @@ // Code block (4 spaces padded) | ||
module.exports = function code(state, startLine, endLine/*, silent*/) { | ||
var nextLine, last; | ||
var nextLine, last, token; | ||
@@ -28,10 +28,8 @@ if (state.tShift[startLine] - state.blkIndent < 4) { return false; } | ||
state.line = nextLine; | ||
state.tokens.push({ | ||
type: 'code_block', | ||
content: state.getLines(startLine, last, 4 + state.blkIndent, true), | ||
lines: [ startLine, state.line ], | ||
level: state.level | ||
}); | ||
token = state.push('code_block', 'code', 0); | ||
token.content = state.getLines(startLine, last, 4 + state.blkIndent, true); | ||
token.map = [ startLine, state.line ]; | ||
return true; | ||
}; |
@@ -7,3 +7,3 @@ // fences (``` lang, ~~~ lang) | ||
module.exports = function fence(state, startLine, endLine, silent) { | ||
var marker, len, params, nextLine, mem, | ||
var marker, len, params, nextLine, mem, token, markup, | ||
haveEndMarker = false, | ||
@@ -29,3 +29,4 @@ pos = state.bMarks[startLine] + state.tShift[startLine], | ||
params = state.src.slice(pos, max).trim(); | ||
markup = state.src.slice(mem, pos); | ||
params = state.src.slice(pos, max); | ||
@@ -84,11 +85,10 @@ if (params.indexOf('`') >= 0) { return false; } | ||
state.line = nextLine + (haveEndMarker ? 1 : 0); | ||
state.tokens.push({ | ||
type: 'fence', | ||
params: params, | ||
content: state.getLines(startLine + 1, nextLine, len, true), | ||
lines: [ startLine, state.line ], | ||
level: state.level | ||
}); | ||
token = state.push('fence', 'code', 0); | ||
token.info = params; | ||
token.content = state.getLines(startLine + 1, nextLine, len, true); | ||
token.markup = markup; | ||
token.map = [ startLine, state.line ]; | ||
return true; | ||
}; |
@@ -7,3 +7,3 @@ // heading (#, ##, ...) | ||
module.exports = function heading(state, startLine, endLine, silent) { | ||
var ch, level, tmp, | ||
var ch, level, tmp, token, | ||
pos = state.bMarks[startLine] + state.tShift[startLine], | ||
@@ -38,21 +38,15 @@ max = state.eMarks[startLine]; | ||
state.tokens.push({ type: 'heading_open', | ||
hLevel: level, | ||
lines: [ startLine, state.line ], | ||
level: state.level | ||
}); | ||
token = state.push('heading_open', 'h' + String(level), 1); | ||
token.markup = '########'.slice(0, level); | ||
token.map = [ startLine, state.line ]; | ||
// only if header is not empty | ||
if (pos < max) { | ||
state.tokens.push({ | ||
type: 'inline', | ||
content: state.src.slice(pos, max).trim(), | ||
level: state.level + 1, | ||
lines: [ startLine, state.line ], | ||
children: [] | ||
}); | ||
} | ||
state.tokens.push({ type: 'heading_close', hLevel: level, level: state.level }); | ||
token = state.push('inline', '', 0); | ||
token.content = state.src.slice(pos, max).trim(); | ||
token.map = [ startLine, state.line ]; | ||
token.children = []; | ||
token = state.push('heading_close', 'h' + String(level), -1); | ||
token.markup = '########'.slice(0, level); | ||
return true; | ||
}; |
@@ -7,3 +7,3 @@ // Horizontal rule | ||
module.exports = function hr(state, startLine, endLine, silent) { | ||
var marker, cnt, ch, | ||
var marker, cnt, ch, token, | ||
pos = state.bMarks[startLine] + state.tShift[startLine], | ||
@@ -35,9 +35,8 @@ max = state.eMarks[startLine]; | ||
state.line = startLine + 1; | ||
state.tokens.push({ | ||
type: 'hr', | ||
lines: [ startLine, state.line ], | ||
level: state.level | ||
}); | ||
token = state.push('hr', 'hr', 0); | ||
token.map = [ startLine, state.line ]; | ||
token.markup = Array(cnt + 1).join(String.fromCharCode(marker)); | ||
return true; | ||
}; |
@@ -19,3 +19,3 @@ // HTML block | ||
module.exports = function html_block(state, startLine, endLine, silent) { | ||
var ch, match, nextLine, | ||
var ch, match, nextLine, token, | ||
pos = state.bMarks[startLine], | ||
@@ -67,10 +67,8 @@ max = state.eMarks[startLine], | ||
state.line = nextLine; | ||
state.tokens.push({ | ||
type: 'html_block', | ||
level: state.level, | ||
lines: [ startLine, state.line ], | ||
content: state.getLines(startLine, nextLine, 0, true) | ||
}); | ||
token = state.push('html_block', '', 0); | ||
token.map = [ startLine, state.line ]; | ||
token.content = state.getLines(startLine, nextLine, 0, true); | ||
return true; | ||
}; |
@@ -7,3 +7,3 @@ // lheading (---, ===) | ||
module.exports = function lheading(state, startLine, endLine/*, silent*/) { | ||
var marker, pos, max, | ||
var marker, pos, max, token, level, | ||
next = startLine + 1; | ||
@@ -36,22 +36,17 @@ | ||
state.line = next + 1; | ||
state.tokens.push({ | ||
type: 'heading_open', | ||
hLevel: marker === 0x3D/* = */ ? 1 : 2, | ||
lines: [ startLine, state.line ], | ||
level: state.level | ||
}); | ||
state.tokens.push({ | ||
type: 'inline', | ||
content: state.src.slice(pos, state.eMarks[startLine]).trim(), | ||
level: state.level + 1, | ||
lines: [ startLine, state.line - 1 ], | ||
children: [] | ||
}); | ||
state.tokens.push({ | ||
type: 'heading_close', | ||
hLevel: marker === 0x3D/* = */ ? 1 : 2, | ||
level: state.level | ||
}); | ||
level = (marker === 0x3D/* = */ ? 1 : 2); | ||
token = state.push('heading_open', 'h' + String(level), 1); | ||
token.markup = String.fromCharCode(marker); | ||
token.map = [ startLine, state.line ]; | ||
token = state.push('inline', '', 0); | ||
token.content = state.src.slice(pos, state.eMarks[startLine]).trim(); | ||
token.map = [ startLine, state.line - 1 ]; | ||
token.children = []; | ||
token = state.push('heading_close', 'h' + String(level), -1); | ||
token.markup = String.fromCharCode(marker); | ||
return true; | ||
}; |
@@ -76,4 +76,4 @@ // Lists | ||
if (state.tokens[i].level === level && state.tokens[i].type === 'paragraph_open') { | ||
state.tokens[i + 2].tight = true; | ||
state.tokens[i].tight = true; | ||
state.tokens[i + 2].hidden = true; | ||
state.tokens[i].hidden = true; | ||
i += 2; | ||
@@ -106,2 +106,3 @@ } | ||
terminatorRules, | ||
token, | ||
i, l, terminate; | ||
@@ -131,17 +132,14 @@ | ||
state.tokens.push({ | ||
type: 'ordered_list_open', | ||
order: markerValue, | ||
lines: listLines = [ startLine, 0 ], | ||
level: state.level++ | ||
}); | ||
token = state.push('ordered_list_open', 'ol', 1); | ||
if (markerValue > 1) { | ||
token.attrs = [ [ 'start', markerValue ] ]; | ||
} | ||
} else { | ||
state.tokens.push({ | ||
type: 'bullet_list_open', | ||
lines: listLines = [ startLine, 0 ], | ||
level: state.level++ | ||
}); | ||
token = state.push('bullet_list_open', 'ul', 1); | ||
} | ||
token.map = listLines = [ startLine, 0 ]; | ||
token.markup = String.fromCharCode(markerCharCode); | ||
// | ||
@@ -175,7 +173,5 @@ // Iterate list items | ||
// Run subparser & write tokens | ||
state.tokens.push({ | ||
type: 'list_item_open', | ||
lines: itemLines = [ startLine, 0 ], | ||
level: state.level++ | ||
}); | ||
token = state.push('list_item_open', 'li', 1); | ||
token.markup = String.fromCharCode(markerCharCode); | ||
token.map = itemLines = [ startLine, 0 ]; | ||
@@ -206,6 +202,4 @@ oldIndent = state.blkIndent; | ||
state.tokens.push({ | ||
type: 'list_item_close', | ||
level: --state.level | ||
}); | ||
token = state.push('list_item_close', 'li', -1); | ||
token.markup = String.fromCharCode(markerCharCode); | ||
@@ -250,8 +244,10 @@ nextLine = startLine = state.line; | ||
// Finilize list | ||
state.tokens.push({ | ||
type: isOrdered ? 'ordered_list_close' : 'bullet_list_close', | ||
level: --state.level | ||
}); | ||
if (isOrdered) { | ||
token = state.push('ordered_list_close', 'ol', -1); | ||
} else { | ||
token = state.push('bullet_list_close', 'ul', -1); | ||
} | ||
token.markup = String.fromCharCode(markerCharCode); | ||
listLines[1] = nextLine; | ||
state.line = nextLine; | ||
@@ -258,0 +254,0 @@ |
@@ -7,27 +7,22 @@ // Paragraph | ||
module.exports = function paragraph(state, startLine/*, endLine*/) { | ||
var endLine, content, terminate, i, l, | ||
var content, terminate, i, l, token, | ||
nextLine = startLine + 1, | ||
terminatorRules; | ||
terminatorRules = state.md.block.ruler.getRules('paragraph'), | ||
endLine = state.lineMax; | ||
endLine = state.lineMax; | ||
// jump line-by-line until empty one or EOF | ||
if (nextLine < endLine && !state.isEmpty(nextLine)) { | ||
terminatorRules = state.md.block.ruler.getRules('paragraph'); | ||
for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) { | ||
// this would be a code block normally, but after paragraph | ||
// it's considered a lazy continuation regardless of what's there | ||
if (state.tShift[nextLine] - state.blkIndent > 3) { continue; } | ||
for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) { | ||
// this would be a code block normally, but after paragraph | ||
// it's considered a lazy continuation regardless of what's there | ||
if (state.tShift[nextLine] - state.blkIndent > 3) { continue; } | ||
// Some tags can terminate paragraph without empty line. | ||
terminate = false; | ||
for (i = 0, l = terminatorRules.length; i < l; i++) { | ||
if (terminatorRules[i](state, nextLine, endLine, true)) { | ||
terminate = true; | ||
break; | ||
} | ||
// Some tags can terminate paragraph without empty line. | ||
terminate = false; | ||
for (i = 0, l = terminatorRules.length; i < l; i++) { | ||
if (terminatorRules[i](state, nextLine, endLine, true)) { | ||
terminate = true; | ||
break; | ||
} | ||
if (terminate) { break; } | ||
} | ||
if (terminate) { break; } | ||
} | ||
@@ -38,22 +33,14 @@ | ||
state.line = nextLine; | ||
state.tokens.push({ | ||
type: 'paragraph_open', | ||
tight: false, | ||
lines: [ startLine, state.line ], | ||
level: state.level | ||
}); | ||
state.tokens.push({ | ||
type: 'inline', | ||
content: content, | ||
level: state.level + 1, | ||
lines: [ startLine, state.line ], | ||
children: [] | ||
}); | ||
state.tokens.push({ | ||
type: 'paragraph_close', | ||
tight: false, | ||
level: state.level | ||
}); | ||
token = state.push('paragraph_open', 'p', 1); | ||
token.map = [ startLine, state.line ]; | ||
token = state.push('inline', '', 0); | ||
token.content = content; | ||
token.map = [ startLine, state.line ]; | ||
token.children = []; | ||
token = state.push('paragraph_close', 'p', -1); | ||
return true; | ||
}; |
@@ -46,20 +46,18 @@ 'use strict'; | ||
// jump line-by-line until empty one or EOF | ||
if (nextLine < endLine && !state.isEmpty(nextLine)) { | ||
terminatorRules = state.md.block.ruler.getRules('reference'); | ||
terminatorRules = state.md.block.ruler.getRules('reference'); | ||
for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) { | ||
// this would be a code block normally, but after paragraph | ||
// it's considered a lazy continuation regardless of what's there | ||
if (state.tShift[nextLine] - state.blkIndent > 3) { continue; } | ||
for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) { | ||
// this would be a code block normally, but after paragraph | ||
// it's considered a lazy continuation regardless of what's there | ||
if (state.tShift[nextLine] - state.blkIndent > 3) { continue; } | ||
// Some tags can terminate paragraph without empty line. | ||
terminate = false; | ||
for (i = 0, l = terminatorRules.length; i < l; i++) { | ||
if (terminatorRules[i](state, nextLine, endLine, true)) { | ||
terminate = true; | ||
break; | ||
} | ||
// Some tags can terminate paragraph without empty line. | ||
terminate = false; | ||
for (i = 0, l = terminatorRules.length; i < l; i++) { | ||
if (terminatorRules[i](state, nextLine, endLine, true)) { | ||
terminate = true; | ||
break; | ||
} | ||
if (terminate) { break; } | ||
} | ||
if (terminate) { break; } | ||
} | ||
@@ -106,4 +104,6 @@ | ||
if (!res.ok) { return false; } | ||
if (!state.md.inline.validateLink(res.str)) { return false; } | ||
href = res.str; | ||
href = state.md.normalizeLink(res.str); | ||
if (!state.md.validateLink(href)) { return false; } | ||
pos = res.pos; | ||
@@ -110,0 +110,0 @@ lines += res.lines; |
@@ -5,3 +5,5 @@ // Parser state class | ||
var Token = require('../token'); | ||
function StateBlock(src, md, env, tokens) { | ||
@@ -79,2 +81,16 @@ var ch, s, start, pos, len, indent, indent_found; | ||
// Push new token to "stream". | ||
// | ||
StateBlock.prototype.push = function (type, tag, nesting) { | ||
var token = new Token(type, tag, nesting); | ||
token.block = true; | ||
if (nesting < 0) { this.level--; } | ||
token.level = this.level; | ||
if (nesting > 0) { this.level++; } | ||
this.tokens.push(token); | ||
return token; | ||
}; | ||
StateBlock.prototype.isEmpty = function isEmpty(line) { | ||
@@ -157,3 +173,6 @@ return this.bMarks[line] + this.tShift[line] >= this.eMarks[line]; | ||
// re-export Token class to use in block rules | ||
StateBlock.prototype.Token = Token; | ||
module.exports = StateBlock; |
@@ -43,3 +43,3 @@ // GFM table, non-standard | ||
module.exports = function table(state, startLine, endLine, silent) { | ||
var ch, lineText, pos, i, nextLine, rows, | ||
var ch, lineText, pos, i, nextLine, rows, token, | ||
aligns, t, tableLines, tbodyLines; | ||
@@ -96,43 +96,32 @@ | ||
state.tokens.push({ | ||
type: 'table_open', | ||
lines: tableLines = [ startLine, 0 ], | ||
level: state.level++ | ||
}); | ||
state.tokens.push({ | ||
type: 'thead_open', | ||
lines: [ startLine, startLine + 1 ], | ||
level: state.level++ | ||
}); | ||
token = state.push('table_open', 'table', 1); | ||
token.map = tableLines = [ startLine, 0 ]; | ||
state.tokens.push({ | ||
type: 'tr_open', | ||
lines: [ startLine, startLine + 1 ], | ||
level: state.level++ | ||
}); | ||
token = state.push('thead_open', 'thead', 1); | ||
token.map = [ startLine, startLine + 1 ]; | ||
token = state.push('tr_open', 'tr', 1); | ||
token.map = [ startLine, startLine + 1 ]; | ||
for (i = 0; i < rows.length; i++) { | ||
state.tokens.push({ | ||
type: 'th_open', | ||
align: aligns[i], | ||
lines: [ startLine, startLine + 1 ], | ||
level: state.level++ | ||
}); | ||
state.tokens.push({ | ||
type: 'inline', | ||
content: rows[i].trim(), | ||
lines: [ startLine, startLine + 1 ], | ||
level: state.level, | ||
children: [] | ||
}); | ||
state.tokens.push({ type: 'th_close', level: --state.level }); | ||
token = state.push('th_open', 'th', 1); | ||
token.map = [ startLine, startLine + 1 ]; | ||
if (aligns[i]) { | ||
token.attrs = [ [ 'style', 'text-align:' + aligns[i] ] ]; | ||
} | ||
token = state.push('inline', '', 0); | ||
token.content = rows[i].trim(); | ||
token.map = [ startLine, startLine + 1 ]; | ||
token.children = []; | ||
token = state.push('th_close', 'th', -1); | ||
} | ||
state.tokens.push({ type: 'tr_close', level: --state.level }); | ||
state.tokens.push({ type: 'thead_close', level: --state.level }); | ||
state.tokens.push({ | ||
type: 'tbody_open', | ||
lines: tbodyLines = [ startLine + 2, 0 ], | ||
level: state.level++ | ||
}); | ||
token = state.push('tr_close', 'tr', -1); | ||
token = state.push('thead_close', 'thead', -1); | ||
token = state.push('tbody_open', 'tbody', 1); | ||
token.map = tbodyLines = [ startLine + 2, 0 ]; | ||
for (nextLine = startLine + 2; nextLine < endLine; nextLine++) { | ||
@@ -148,17 +137,19 @@ if (state.tShift[nextLine] < state.blkIndent) { break; } | ||
state.tokens.push({ type: 'tr_open', level: state.level++ }); | ||
token = state.push('tr_open', 'tr', 1); | ||
for (i = 0; i < rows.length; i++) { | ||
state.tokens.push({ type: 'td_open', align: aligns[i], level: state.level++ }); | ||
state.tokens.push({ | ||
type: 'inline', | ||
content: rows[i] ? rows[i].trim() : '', | ||
level: state.level, | ||
children: [] | ||
}); | ||
state.tokens.push({ type: 'td_close', level: --state.level }); | ||
token = state.push('td_open', 'td', 1); | ||
if (aligns[i]) { | ||
token.attrs = [ [ 'style', 'text-align:' + aligns[i] ] ]; | ||
} | ||
token = state.push('inline', '', 0); | ||
token.content = rows[i] ? rows[i].trim() : ''; | ||
token.children = []; | ||
token = state.push('td_close', 'td', -1); | ||
} | ||
state.tokens.push({ type: 'tr_close', level: --state.level }); | ||
token = state.push('tr_close', 'tr', -1); | ||
} | ||
state.tokens.push({ type: 'tbody_close', level: --state.level }); | ||
state.tokens.push({ type: 'table_close', level: --state.level }); | ||
token = state.push('tbody_close', 'tbody', -1); | ||
token = state.push('table_close', 'table', -1); | ||
@@ -165,0 +156,0 @@ tableLines[1] = tbodyLines[1] = nextLine; |
'use strict'; | ||
module.exports = function block(state) { | ||
var token; | ||
if (state.inlineMode) { | ||
state.tokens.push({ | ||
type: 'inline', | ||
content: state.src, | ||
level: 0, | ||
lines: [ 0, 1 ], | ||
children: [] | ||
}); | ||
token = new state.Token('inline', '', 0); | ||
token.content = state.src; | ||
token.map = [ 0, 1 ]; | ||
token.children = []; | ||
state.tokens.push(token); | ||
} else { | ||
@@ -15,0 +14,0 @@ state.md.block.parse(state.src, state.md, state.env, state.tokens); |
// Replace link-like texts with link nodes. | ||
// | ||
// Currently restricted by `inline.validateLink()` to http/https/ftp | ||
// Currently restricted by `md.validateLink()` to http/https/ftp | ||
// | ||
@@ -9,3 +9,2 @@ 'use strict'; | ||
var arrayReplaceAt = require('../common/utils').arrayReplaceAt; | ||
var normalizeLink = require('../common/utils').normalizeLink; | ||
@@ -22,3 +21,4 @@ | ||
module.exports = function linkify(state) { | ||
var i, j, l, tokens, token, nodes, ln, text, pos, lastPos, level, htmlLinkLevel, | ||
var i, j, l, tokens, token, currentToken, nodes, ln, text, pos, lastPos, | ||
level, htmlLinkLevel, url, fullUrl, urlText, | ||
blockTokens = state.tokens, | ||
@@ -30,3 +30,6 @@ links; | ||
for (j = 0, l = blockTokens.length; j < l; j++) { | ||
if (blockTokens[j].type !== 'inline') { continue; } | ||
if (blockTokens[j].type !== 'inline' || | ||
!state.md.linkify.test(blockTokens[j].content)) { | ||
continue; | ||
} | ||
@@ -40,8 +43,8 @@ tokens = blockTokens[j].children; | ||
for (i = tokens.length - 1; i >= 0; i--) { | ||
token = tokens[i]; | ||
currentToken = tokens[i]; | ||
// Skip content of markdown links | ||
if (token.type === 'link_close') { | ||
if (currentToken.type === 'link_close') { | ||
i--; | ||
while (tokens[i].level !== token.level && tokens[i].type !== 'link_open') { | ||
while (tokens[i].level !== currentToken.level && tokens[i].type !== 'link_open') { | ||
i--; | ||
@@ -53,7 +56,7 @@ } | ||
// Skip content of html tag links | ||
if (token.type === 'html_inline') { | ||
if (isLinkOpen(token.content) && htmlLinkLevel > 0) { | ||
if (currentToken.type === 'html_inline') { | ||
if (isLinkOpen(currentToken.content) && htmlLinkLevel > 0) { | ||
htmlLinkLevel--; | ||
} | ||
if (isLinkClose(token.content)) { | ||
if (isLinkClose(currentToken.content)) { | ||
htmlLinkLevel++; | ||
@@ -64,5 +67,5 @@ } | ||
if (token.type === 'text' && state.md.linkify.test(token.content)) { | ||
if (currentToken.type === 'text' && state.md.linkify.test(currentToken.content)) { | ||
text = token.content; | ||
text = currentToken.content; | ||
links = state.md.linkify.match(text); | ||
@@ -72,3 +75,3 @@ | ||
nodes = []; | ||
level = token.level; | ||
level = currentToken.level; | ||
lastPos = 0; | ||
@@ -78,38 +81,54 @@ | ||
if (!state.md.inline.validateLink(links[ln].url)) { continue; } | ||
url = links[ln].url; | ||
fullUrl = state.md.normalizeLink(url); | ||
if (!state.md.validateLink(fullUrl)) { continue; } | ||
urlText = links[ln].text; | ||
// Linkifier might send raw hostnames like "example.com", where url | ||
// starts with domain name. So we prepend http:// in those cases, | ||
// and remove it afterwards. | ||
// | ||
if (!links[ln].schema) { | ||
urlText = state.md.normalizeLinkText('http://' + urlText).replace(/^http:\/\//, ''); | ||
} else if (links[ln].schema === 'mailto:' && !/^mailto:/i.test(urlText)) { | ||
urlText = state.md.normalizeLinkText('mailto:' + urlText).replace(/^mailto:/, ''); | ||
} else { | ||
urlText = state.md.normalizeLinkText(urlText); | ||
} | ||
pos = links[ln].index; | ||
if (pos > lastPos) { | ||
level = level; | ||
nodes.push({ | ||
type: 'text', | ||
content: text.slice(lastPos, pos), | ||
level: level | ||
}); | ||
token = new state.Token('text', '', 0); | ||
token.content = text.slice(lastPos, pos); | ||
token.level = level; | ||
nodes.push(token); | ||
} | ||
nodes.push({ | ||
type: 'link_open', | ||
href: normalizeLink(links[ln].url), | ||
target: '', | ||
title: '', | ||
level: level++ | ||
}); | ||
nodes.push({ | ||
type: 'text', | ||
content: links[ln].text, | ||
level: level | ||
}); | ||
nodes.push({ | ||
type: 'link_close', | ||
level: --level | ||
}); | ||
token = new state.Token('link_open', 'a', 1); | ||
token.attrs = [ [ 'href', fullUrl ] ]; | ||
token.level = level++; | ||
token.markup = 'linkify'; | ||
token.info = 'auto'; | ||
nodes.push(token); | ||
token = new state.Token('text', '', 0); | ||
token.content = urlText; | ||
token.level = level; | ||
nodes.push(token); | ||
token = new state.Token('link_close', 'a', -1); | ||
token.level = --level; | ||
token.markup = 'linkify'; | ||
token.info = 'auto'; | ||
nodes.push(token); | ||
lastPos = links[ln].lastIndex; | ||
} | ||
if (lastPos < text.length) { | ||
nodes.push({ | ||
type: 'text', | ||
content: text.slice(lastPos), | ||
level: level | ||
}); | ||
token = new state.Token('text', '', 0); | ||
token.content = text.slice(lastPos); | ||
token.level = level; | ||
nodes.push(token); | ||
} | ||
@@ -116,0 +135,0 @@ |
@@ -30,13 +30,43 @@ // Simple typographyc replacements | ||
function replaceScopedAbbr(str) { | ||
if (str.indexOf('(') < 0) { return str; } | ||
function replaceFn(match, name) { | ||
return SCOPED_ABBR[name.toLowerCase()]; | ||
} | ||
return str.replace(SCOPED_ABBR_RE, function(match, name) { | ||
return SCOPED_ABBR[name.toLowerCase()]; | ||
}); | ||
function replace_scoped(inlineTokens) { | ||
var i, token; | ||
for (i = inlineTokens.length - 1; i >= 0; i--) { | ||
token = inlineTokens[i]; | ||
if (token.type === 'text') { | ||
token.content = token.content.replace(SCOPED_ABBR_RE, replaceFn); | ||
} | ||
} | ||
} | ||
function replace_rare(inlineTokens) { | ||
var i, token; | ||
for (i = inlineTokens.length - 1; i >= 0; i--) { | ||
token = inlineTokens[i]; | ||
if (token.type === 'text') { | ||
if (RARE_RE.test(token.content)) { | ||
token.content = token.content | ||
.replace(/\+-/g, '±') | ||
// .., ..., ....... -> … | ||
// but ?..... & !..... -> ?.. & !.. | ||
.replace(/\.{2,}/g, '…').replace(/([?!])…/g, '$1..') | ||
.replace(/([?!]){4,}/g, '$1$1$1').replace(/,{2,}/g, ',') | ||
// em-dash | ||
.replace(/(^|[^-])---([^-]|$)/mg, '$1\u2014$2') | ||
// en-dash | ||
.replace(/(^|\s)--(\s|$)/mg, '$1\u2013$2') | ||
.replace(/(^|[^-\s])--([^-\s]|$)/mg, '$1\u2013$2'); | ||
} | ||
} | ||
} | ||
} | ||
module.exports = function replace(state) { | ||
var i, token, text, inlineTokens, blkIdx; | ||
var blkIdx; | ||
@@ -49,28 +79,11 @@ if (!state.md.options.typographer) { return; } | ||
inlineTokens = state.tokens[blkIdx].children; | ||
if (SCOPED_ABBR_RE.test(state.tokens[blkIdx].content)) { | ||
replace_scoped(state.tokens[blkIdx].children); | ||
} | ||
for (i = inlineTokens.length - 1; i >= 0; i--) { | ||
token = inlineTokens[i]; | ||
if (token.type === 'text') { | ||
text = token.content; | ||
if (RARE_RE.test(state.tokens[blkIdx].content)) { | ||
replace_rare(state.tokens[blkIdx].children); | ||
} | ||
text = replaceScopedAbbr(text); | ||
if (RARE_RE.test(text)) { | ||
text = text.replace(/\+-/g, '±') | ||
// .., ..., ....... -> … | ||
// but ?..... & !..... -> ?.. & !.. | ||
.replace(/\.{2,}/g, '…').replace(/([?!])…/g, '$1..') | ||
.replace(/([?!]){4,}/g, '$1$1$1').replace(/,{2,}/g, ',') | ||
// em-dash | ||
.replace(/(^|[^-])---([^-]|$)/mg, '$1\u2014$2') | ||
// en-dash | ||
.replace(/(^|\s)--(\s|$)/mg, '$1\u2013$2') | ||
.replace(/(^|[^-\s])--([^-\s]|$)/mg, '$1\u2013$2'); | ||
} | ||
token.content = text; | ||
} | ||
} | ||
} | ||
}; |
@@ -19,131 +19,136 @@ // Convert straight quotation marks to typographic ones | ||
module.exports = function smartquotes(state) { | ||
/*eslint max-depth:0*/ | ||
function process_inlines(tokens, state) { | ||
var i, token, text, t, pos, max, thisLevel, item, lastChar, nextChar, | ||
isLastPunctChar, isNextPunctChar, isLastWhiteSpace, isNextWhiteSpace, | ||
canOpen, canClose, j, isSingle, blkIdx, tokens, stack; | ||
canOpen, canClose, j, isSingle, stack; | ||
if (!state.md.options.typographer) { return; } | ||
stack = []; | ||
for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) { | ||
for (i = 0; i < tokens.length; i++) { | ||
token = tokens[i]; | ||
if (state.tokens[blkIdx].type !== 'inline') { continue; } | ||
if (token.type !== 'text' || QUOTE_TEST_RE.test(token.text)) { continue; } | ||
tokens = state.tokens[blkIdx].children; | ||
stack.length = 0; | ||
thisLevel = tokens[i].level; | ||
for (i = 0; i < tokens.length; i++) { | ||
token = tokens[i]; | ||
for (j = stack.length - 1; j >= 0; j--) { | ||
if (stack[j].level <= thisLevel) { break; } | ||
} | ||
stack.length = j + 1; | ||
if (token.type !== 'text' || QUOTE_TEST_RE.test(token.text)) { continue; } | ||
text = token.content; | ||
pos = 0; | ||
max = text.length; | ||
thisLevel = tokens[i].level; | ||
/*eslint no-labels:0,block-scoped-var:0*/ | ||
OUTER: | ||
while (pos < max) { | ||
QUOTE_RE.lastIndex = pos; | ||
t = QUOTE_RE.exec(text); | ||
if (!t) { break; } | ||
for (j = stack.length - 1; j >= 0; j--) { | ||
if (stack[j].level <= thisLevel) { break; } | ||
} | ||
stack.length = j + 1; | ||
canOpen = canClose = true; | ||
pos = t.index + 1; | ||
isSingle = (t[0] === "'"); | ||
text = token.content; | ||
pos = 0; | ||
max = text.length; | ||
// treat begin/end of the line as a whitespace | ||
lastChar = t.index - 1 >= 0 ? text.charCodeAt(t.index - 1) : 0x20; | ||
nextChar = pos < max ? text.charCodeAt(pos) : 0x20; | ||
/*eslint no-labels:0,block-scoped-var:0*/ | ||
OUTER: | ||
while (pos < max) { | ||
QUOTE_RE.lastIndex = pos; | ||
t = QUOTE_RE.exec(text); | ||
if (!t) { break; } | ||
isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar)); | ||
isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar)); | ||
canOpen = canClose = true; | ||
pos = t.index + 1; | ||
isSingle = (t[0] === "'"); | ||
isLastWhiteSpace = isWhiteSpace(lastChar); | ||
isNextWhiteSpace = isWhiteSpace(nextChar); | ||
lastChar = t.index - 1 >= 0 ? text.charCodeAt(t.index - 1) : -1; | ||
nextChar = pos < max ? text.charCodeAt(pos) : -1; | ||
isLastPunctChar = lastChar >= 0 && | ||
(isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar))); | ||
isNextPunctChar = nextChar >= 0 && | ||
(isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar))); | ||
// begin/end of the line counts as a whitespace too | ||
isLastWhiteSpace = lastChar < 0 || isWhiteSpace(lastChar); | ||
isNextWhiteSpace = nextChar < 0 || isWhiteSpace(nextChar); | ||
if (isNextWhiteSpace) { | ||
if (isNextWhiteSpace) { | ||
canOpen = false; | ||
} else if (isNextPunctChar) { | ||
if (!(isLastWhiteSpace || isLastPunctChar)) { | ||
canOpen = false; | ||
} else if (isNextPunctChar) { | ||
if (!(isLastWhiteSpace || isLastPunctChar)) { | ||
canOpen = false; | ||
} | ||
} | ||
} | ||
if (isLastWhiteSpace) { | ||
if (isLastWhiteSpace) { | ||
canClose = false; | ||
} else if (isLastPunctChar) { | ||
if (!(isNextWhiteSpace || isNextPunctChar)) { | ||
canClose = false; | ||
} else if (isLastPunctChar) { | ||
if (!(isNextWhiteSpace || isNextPunctChar)) { | ||
canClose = false; | ||
} | ||
} | ||
} | ||
if (nextChar === 0x22 /* " */ && t[0] === '"') { | ||
if (lastChar >= 0x30 /* 0 */ && lastChar <= 0x39 /* 9 */) { | ||
// special case: 1"" - count first quote as an inch | ||
canClose = canOpen = false; | ||
} | ||
if (nextChar === 0x22 /* " */ && t[0] === '"') { | ||
if (lastChar >= 0x30 /* 0 */ && lastChar <= 0x39 /* 9 */) { | ||
// special case: 1"" - count first quote as an inch | ||
canClose = canOpen = false; | ||
} | ||
} | ||
if (canOpen && canClose) { | ||
// treat this as the middle of the word | ||
canOpen = canClose = false; | ||
} | ||
if (canOpen && canClose) { | ||
// treat this as the middle of the word | ||
canOpen = false; | ||
canClose = isNextPunctChar; | ||
} | ||
if (!canOpen && !canClose) { | ||
// middle of word | ||
if (isSingle) { | ||
token.content = replaceAt(token.content, t.index, APOSTROPHE); | ||
} | ||
continue; | ||
if (!canOpen && !canClose) { | ||
// middle of word | ||
if (isSingle) { | ||
token.content = replaceAt(token.content, t.index, APOSTROPHE); | ||
} | ||
continue; | ||
} | ||
if (canClose) { | ||
// this could be a closing quote, rewind the stack to get a match | ||
for (j = stack.length - 1; j >= 0; j--) { | ||
if (canClose) { | ||
// this could be a closing quote, rewind the stack to get a match | ||
for (j = stack.length - 1; j >= 0; j--) { | ||
item = stack[j]; | ||
if (stack[j].level < thisLevel) { break; } | ||
if (item.single === isSingle && stack[j].level === thisLevel) { | ||
item = stack[j]; | ||
if (stack[j].level < thisLevel) { break; } | ||
if (item.single === isSingle && stack[j].level === thisLevel) { | ||
item = stack[j]; | ||
if (isSingle) { | ||
tokens[item.token].content = replaceAt( | ||
tokens[item.token].content, item.pos, state.md.options.quotes[2]); | ||
token.content = replaceAt( | ||
token.content, t.index, state.md.options.quotes[3]); | ||
} else { | ||
tokens[item.token].content = replaceAt( | ||
tokens[item.token].content, item.pos, state.md.options.quotes[0]); | ||
token.content = replaceAt(token.content, t.index, state.md.options.quotes[1]); | ||
} | ||
stack.length = j; | ||
continue OUTER; | ||
if (isSingle) { | ||
tokens[item.token].content = replaceAt( | ||
tokens[item.token].content, item.pos, state.md.options.quotes[2]); | ||
token.content = replaceAt( | ||
token.content, t.index, state.md.options.quotes[3]); | ||
} else { | ||
tokens[item.token].content = replaceAt( | ||
tokens[item.token].content, item.pos, state.md.options.quotes[0]); | ||
token.content = replaceAt(token.content, t.index, state.md.options.quotes[1]); | ||
} | ||
stack.length = j; | ||
continue OUTER; | ||
} | ||
} | ||
} | ||
if (canOpen) { | ||
stack.push({ | ||
token: i, | ||
pos: t.index, | ||
single: isSingle, | ||
level: thisLevel | ||
}); | ||
} else if (canClose && isSingle) { | ||
token.content = replaceAt(token.content, t.index, APOSTROPHE); | ||
} | ||
if (canOpen) { | ||
stack.push({ | ||
token: i, | ||
pos: t.index, | ||
single: isSingle, | ||
level: thisLevel | ||
}); | ||
} else if (canClose && isSingle) { | ||
token.content = replaceAt(token.content, t.index, APOSTROPHE); | ||
} | ||
} | ||
} | ||
} | ||
module.exports = function smartquotes(state) { | ||
/*eslint max-depth:0*/ | ||
var blkIdx; | ||
if (!state.md.options.typographer) { return; } | ||
for (blkIdx = state.tokens.length - 1; blkIdx >= 0; blkIdx--) { | ||
if (state.tokens[blkIdx].type !== 'inline' || | ||
!QUOTE_TEST_RE.test(state.tokens[blkIdx].content)) { | ||
continue; | ||
} | ||
process_inlines(state.tokens[blkIdx].children, state); | ||
} | ||
}; |
@@ -5,3 +5,6 @@ // Core state object | ||
module.exports = function StateCore(src, md, env) { | ||
var Token = require('../token'); | ||
function StateCore(src, md, env) { | ||
this.src = src; | ||
@@ -12,2 +15,8 @@ this.env = env; | ||
this.md = md; // link to parser instance | ||
}; | ||
} | ||
// re-export Token class to use in core rules | ||
StateCore.prototype.Token = Token; | ||
module.exports = StateCore; |
@@ -5,4 +5,3 @@ // Process autolinks '<protocol:...>' | ||
var url_schemas = require('../common/url_schemas'); | ||
var normalizeLink = require('../common/utils').normalizeLink; | ||
var url_schemas = require('../common/url_schemas'); | ||
@@ -16,3 +15,4 @@ | ||
module.exports = function autolink(state, silent) { | ||
var tail, linkMatch, emailMatch, url, fullUrl, pos = state.pos; | ||
var tail, linkMatch, emailMatch, url, fullUrl, token, | ||
pos = state.pos; | ||
@@ -25,24 +25,19 @@ if (state.src.charCodeAt(pos) !== 0x3C/* < */) { return false; } | ||
linkMatch = tail.match(AUTOLINK_RE); | ||
if (AUTOLINK_RE.test(tail)) { | ||
linkMatch = tail.match(AUTOLINK_RE); | ||
if (linkMatch) { | ||
if (url_schemas.indexOf(linkMatch[1].toLowerCase()) < 0) { return false; } | ||
url = linkMatch[0].slice(1, -1); | ||
fullUrl = normalizeLink(url); | ||
if (!state.md.inline.validateLink(url)) { return false; } | ||
fullUrl = state.md.normalizeLink(url); | ||
if (!state.md.validateLink(fullUrl)) { return false; } | ||
if (!silent) { | ||
state.push({ | ||
type: 'link_open', | ||
href: fullUrl, | ||
target: '', | ||
level: state.level | ||
}); | ||
state.push({ | ||
type: 'text', | ||
content: url, | ||
level: state.level + 1 | ||
}); | ||
state.push({ type: 'link_close', level: state.level }); | ||
token = state.push('link_open', 'a', 1); | ||
token.attrs = [ [ 'href', fullUrl ] ]; | ||
token = state.push('text', '', 0); | ||
token.content = state.md.normalizeLinkText(url); | ||
token = state.push('link_close', 'a', -1); | ||
} | ||
@@ -54,24 +49,21 @@ | ||
emailMatch = tail.match(EMAIL_RE); | ||
if (EMAIL_RE.test(tail)) { | ||
emailMatch = tail.match(EMAIL_RE); | ||
if (emailMatch) { | ||
url = emailMatch[0].slice(1, -1); | ||
fullUrl = state.md.normalizeLink('mailto:' + url); | ||
if (!state.md.validateLink(fullUrl)) { return false; } | ||
fullUrl = normalizeLink('mailto:' + url); | ||
if (!state.md.inline.validateLink(fullUrl)) { return false; } | ||
if (!silent) { | ||
token = state.push('link_open', 'a', 1); | ||
token.attrs = [ [ 'href', fullUrl ] ]; | ||
token.markup = 'autolink'; | ||
token.info = 'auto'; | ||
if (!silent) { | ||
state.push({ | ||
type: 'link_open', | ||
href: fullUrl, | ||
target: '', | ||
level: state.level | ||
}); | ||
state.push({ | ||
type: 'text', | ||
content: url, | ||
level: state.level + 1 | ||
}); | ||
state.push({ type: 'link_close', level: state.level }); | ||
token = state.push('text', '', 0); | ||
token.content = state.md.normalizeLinkText(url); | ||
token = state.push('link_close', 'a', -1); | ||
token.markup = 'autolink'; | ||
token.info = 'auto'; | ||
} | ||
@@ -78,0 +70,0 @@ |
@@ -6,3 +6,3 @@ // Parse backticks | ||
module.exports = function backtick(state, silent) { | ||
var start, max, marker, matchStart, matchEnd, | ||
var start, max, marker, matchStart, matchEnd, token, | ||
pos = state.pos, | ||
@@ -30,9 +30,7 @@ ch = state.src.charCodeAt(pos); | ||
if (!silent) { | ||
state.push({ | ||
type: 'code_inline', | ||
content: state.src.slice(pos, matchStart) | ||
.replace(/[ \n]+/g, ' ') | ||
.trim(), | ||
level: state.level | ||
}); | ||
token = state.push('code_inline', 'code', 0); | ||
token.markup = marker; | ||
token.content = state.src.slice(pos, matchStart) | ||
.replace(/[ \n]+/g, ' ') | ||
.trim(); | ||
} | ||
@@ -39,0 +37,0 @@ state.pos = matchEnd; |
@@ -22,18 +22,21 @@ // Process *this* and _that_ | ||
lastChar = start > 0 ? state.src.charCodeAt(start - 1) : -1; | ||
// treat beginning of the line as a whitespace | ||
lastChar = start > 0 ? state.src.charCodeAt(start - 1) : 0x20; | ||
while (pos < max && state.src.charCodeAt(pos) === marker) { pos++; } | ||
if (pos >= max) { can_open = false; } | ||
if (pos >= max) { | ||
can_open = false; | ||
} | ||
count = pos - start; | ||
nextChar = pos < max ? state.src.charCodeAt(pos) : -1; | ||
// treat end of the line as a whitespace | ||
nextChar = pos < max ? state.src.charCodeAt(pos) : 0x20; | ||
isLastPunctChar = lastChar >= 0 && | ||
(isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar))); | ||
isNextPunctChar = nextChar >= 0 && | ||
(isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar))); | ||
isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar)); | ||
isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar)); | ||
// begin/end of the line counts as a whitespace too | ||
isLastWhiteSpace = lastChar < 0 || isWhiteSpace(lastChar); | ||
isNextWhiteSpace = nextChar < 0 || isWhiteSpace(nextChar); | ||
isLastWhiteSpace = isWhiteSpace(lastChar); | ||
isNextWhiteSpace = isWhiteSpace(nextChar); | ||
@@ -59,3 +62,4 @@ if (isNextWhiteSpace) { | ||
// "_" inside a word can neither open nor close an emphasis | ||
can_open = can_close = false; | ||
can_open = false; | ||
can_close = isNextPunctChar; | ||
} | ||
@@ -79,2 +83,3 @@ } | ||
res, | ||
token, | ||
max = state.posMax, | ||
@@ -153,11 +158,19 @@ start = state.pos, | ||
for (count = startCount; count > 1; count -= 2) { | ||
state.push({ type: 'strong_open', level: state.level++ }); | ||
token = state.push('strong_open', 'strong', 1); | ||
token.markup = String.fromCharCode(marker) + String.fromCharCode(marker); | ||
} | ||
if (count % 2) { state.push({ type: 'em_open', level: state.level++ }); } | ||
if (count % 2) { | ||
token = state.push('em_open', 'em', 1); | ||
token.markup = String.fromCharCode(marker); | ||
} | ||
state.md.inline.tokenize(state); | ||
if (count % 2) { state.push({ type: 'em_close', level: --state.level }); } | ||
if (count % 2) { | ||
token = state.push('em_close', 'em', -1); | ||
token.markup = String.fromCharCode(marker) + String.fromCharCode(marker); | ||
} | ||
for (count = startCount; count > 1; count -= 2) { | ||
state.push({ type: 'strong_close', level: --state.level }); | ||
token = state.push('strong_close', 'strong', -1); | ||
token.markup = String.fromCharCode(marker); | ||
} | ||
@@ -164,0 +177,0 @@ |
@@ -31,6 +31,3 @@ // Proceess escaped chars and hardbreaks | ||
if (!silent) { | ||
state.push({ | ||
type: 'hardbreak', | ||
level: state.level | ||
}); | ||
state.push('hardbreak', 'br', 0); | ||
} | ||
@@ -37,0 +34,0 @@ |
@@ -17,3 +17,4 @@ // Process html tags | ||
module.exports = function html_inline(state, silent) { | ||
var ch, match, max, pos = state.pos; | ||
var ch, match, max, token, | ||
pos = state.pos; | ||
@@ -42,7 +43,4 @@ if (!state.md.options.html) { return false; } | ||
if (!silent) { | ||
state.push({ | ||
type: 'html_inline', | ||
content: state.src.slice(pos, pos + match[0].length), | ||
level: state.level | ||
}); | ||
token = state.push('html_inline', '', 0); | ||
token.content = state.src.slice(pos, pos + match[0].length); | ||
} | ||
@@ -49,0 +47,0 @@ state.pos += match[0].length; |
@@ -12,4 +12,4 @@ // Process ![image](<src> "title") | ||
module.exports = function image(state, silent) { | ||
var code, | ||
href, | ||
var attrs, | ||
code, | ||
label, | ||
@@ -22,4 +22,6 @@ labelEnd, | ||
title, | ||
token, | ||
tokens, | ||
start, | ||
href = '', | ||
oldPos = state.pos, | ||
@@ -56,7 +58,9 @@ max = state.posMax; | ||
res = parseLinkDestination(state.src, pos, state.posMax); | ||
if (res.ok && state.md.inline.validateLink(res.str)) { | ||
href = res.str; | ||
pos = res.pos; | ||
} else { | ||
href = ''; | ||
if (res.ok) { | ||
href = state.md.normalizeLink(res.str); | ||
if (state.md.validateLink(href)) { | ||
pos = res.pos; | ||
} else { | ||
href = ''; | ||
} | ||
} | ||
@@ -148,9 +152,8 @@ | ||
state.push({ | ||
type: 'image', | ||
src: href, | ||
title: title, | ||
tokens: tokens, | ||
level: state.level | ||
}); | ||
token = state.push('image', 'img', 0); | ||
token.attrs = attrs = [ [ 'src', href ], [ 'alt', '' ] ]; | ||
token.children = tokens; | ||
if (title) { | ||
attrs.push([ 'title', title ]); | ||
} | ||
} | ||
@@ -157,0 +160,0 @@ |
@@ -12,4 +12,4 @@ // Process [link](<to> "stuff") | ||
module.exports = function link(state, silent) { | ||
var code, | ||
href, | ||
var attrs, | ||
code, | ||
label, | ||
@@ -22,2 +22,4 @@ labelEnd, | ||
title, | ||
token, | ||
href = '', | ||
oldPos = state.pos, | ||
@@ -54,7 +56,9 @@ max = state.posMax, | ||
res = parseLinkDestination(state.src, pos, state.posMax); | ||
if (res.ok && state.md.inline.validateLink(res.str)) { | ||
href = res.str; | ||
pos = res.pos; | ||
} else { | ||
href = ''; | ||
if (res.ok) { | ||
href = state.md.normalizeLink(res.str); | ||
if (state.md.validateLink(href)) { | ||
pos = res.pos; | ||
} else { | ||
href = ''; | ||
} | ||
} | ||
@@ -138,11 +142,11 @@ | ||
state.push({ | ||
type: 'link_open', | ||
href: href, | ||
target: '', | ||
title: title, | ||
level: state.level++ | ||
}); | ||
token = state.push('link_open', 'a', 1); | ||
token.attrs = attrs = [ [ 'href', href ] ]; | ||
if (title) { | ||
attrs.push([ 'title', title ]); | ||
} | ||
state.md.inline.tokenize(state); | ||
state.push({ type: 'link_close', level: --state.level }); | ||
token = state.push('link_close', 'a', -1); | ||
} | ||
@@ -149,0 +153,0 @@ |
@@ -21,19 +21,10 @@ // Proceess '\n' | ||
state.pending = state.pending.replace(/ +$/, ''); | ||
state.push({ | ||
type: 'hardbreak', | ||
level: state.level | ||
}); | ||
state.push('hardbreak', 'br', 0); | ||
} else { | ||
state.pending = state.pending.slice(0, -1); | ||
state.push({ | ||
type: 'softbreak', | ||
level: state.level | ||
}); | ||
state.push('softbreak', 'br', 0); | ||
} | ||
} else { | ||
state.push({ | ||
type: 'softbreak', | ||
level: state.level | ||
}); | ||
state.push('softbreak', 'br', 0); | ||
} | ||
@@ -40,0 +31,0 @@ } |
@@ -6,2 +6,4 @@ // Inline parser state | ||
var Token = require('../token'); | ||
function StateInline(src, md, env, outTokens) { | ||
@@ -19,3 +21,3 @@ this.src = src; | ||
this.cache = []; // Stores { start: end } pairs. Useful for backtrack | ||
this.cache = {}; // Stores { start: end } pairs. Useful for backtrack | ||
// optimization of pairs parse (emphasis, strikes). | ||
@@ -28,8 +30,8 @@ } | ||
StateInline.prototype.pushPending = function () { | ||
this.tokens.push({ | ||
type: 'text', | ||
content: this.pending, | ||
level: this.pendingLevel | ||
}); | ||
var token = new Token('text', '', 0); | ||
token.content = this.pending; | ||
token.level = this.pendingLevel; | ||
this.tokens.push(token); | ||
this.pending = ''; | ||
return token; | ||
}; | ||
@@ -41,3 +43,3 @@ | ||
// | ||
StateInline.prototype.push = function (token) { | ||
StateInline.prototype.push = function (type, tag, nesting) { | ||
if (this.pending) { | ||
@@ -47,27 +49,17 @@ this.pushPending(); | ||
this.tokens.push(token); | ||
this.pendingLevel = this.level; | ||
}; | ||
var token = new Token(type, tag, nesting); | ||
if (nesting < 0) { this.level--; } | ||
token.level = this.level; | ||
if (nesting > 0) { this.level++; } | ||
// Store value to cache. | ||
// !!! Implementation has parser-specific optimizations | ||
// !!! keys MUST be integer, >= 0; values MUST be integer, > 0 | ||
// | ||
StateInline.prototype.cacheSet = function (key, val) { | ||
for (var i = this.cache.length; i <= key; i++) { | ||
this.cache.push(0); | ||
} | ||
this.cache[key] = val; | ||
this.pendingLevel = this.level; | ||
this.tokens.push(token); | ||
return token; | ||
}; | ||
// re-export Token class to use in block rules | ||
StateInline.prototype.Token = Token; | ||
// Get cache value | ||
// | ||
StateInline.prototype.cacheGet = function (key) { | ||
return key < this.cache.length ? this.cache[key] : 0; | ||
}; | ||
module.exports = StateInline; |
@@ -22,21 +22,26 @@ // ~~strike through~~ | ||
lastChar = start > 0 ? state.src.charCodeAt(start - 1) : -1; | ||
// treat beginning of the line as a whitespace | ||
lastChar = start > 0 ? state.src.charCodeAt(start - 1) : 0x20; | ||
while (pos < max && state.src.charCodeAt(pos) === marker) { pos++; } | ||
if (pos >= max) { can_open = false; } | ||
if (pos >= max) { | ||
can_open = false; | ||
} | ||
count = pos - start; | ||
nextChar = pos < max ? state.src.charCodeAt(pos) : -1; | ||
// treat end of the line as a whitespace | ||
nextChar = pos < max ? state.src.charCodeAt(pos) : 0x20; | ||
isLastPunctChar = lastChar >= 0 && | ||
(isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar))); | ||
isNextPunctChar = nextChar >= 0 && | ||
(isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar))); | ||
isLastWhiteSpace = lastChar >= 0 && isWhiteSpace(lastChar); | ||
isNextWhiteSpace = nextChar >= 0 && isWhiteSpace(nextChar); | ||
isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar)); | ||
isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar)); | ||
isLastWhiteSpace = isWhiteSpace(lastChar); | ||
isNextWhiteSpace = isWhiteSpace(nextChar); | ||
if (isNextWhiteSpace) { | ||
can_open = false; | ||
} else if (isNextPunctChar) { | ||
if (!(isLastWhiteSpace || isLastPunctChar || lastChar === -1)) { | ||
if (!(isLastWhiteSpace || isLastPunctChar)) { | ||
can_open = false; | ||
@@ -49,3 +54,3 @@ } | ||
} else if (isLastPunctChar) { | ||
if (!(isNextWhiteSpace || isNextPunctChar || nextChar === -1)) { | ||
if (!(isNextWhiteSpace || isNextPunctChar)) { | ||
can_close = false; | ||
@@ -70,2 +75,3 @@ } | ||
res, | ||
token, | ||
max = state.posMax, | ||
@@ -126,6 +132,10 @@ start = state.pos, | ||
// Earlier we checked !silent, but this implementation does not need it | ||
state.push({ type: 's_open', level: state.level++ }); | ||
token = state.push('s_open', 's', 1); | ||
token.markup = '~~'; | ||
state.md.inline.tokenize(state); | ||
state.push({ type: 's_close', level: --state.level }); | ||
token = state.push('s_close', 's', -1); | ||
token.markup = '~~'; | ||
state.pos = state.posMax + 2; | ||
@@ -132,0 +142,0 @@ state.posMax = max; |
@@ -60,1 +60,31 @@ // Skip text characters for text token, place those to pending buffer | ||
}; | ||
// Alternative implementation, for memory. | ||
// | ||
// It costs 10% of performance, but allows extend terminators list, if place it | ||
// to `ParcerInline` property. Probably, will switch to it sometime, such | ||
// flexibility required. | ||
/* | ||
var TERMINATOR_RE = /[\n!#$%&*+\-:<=>@[\\\]^_`{}~]/; | ||
module.exports = function text(state, silent) { | ||
var pos = state.pos, | ||
idx = state.src.slice(pos).search(TERMINATOR_RE); | ||
// first char is terminator -> empty text | ||
if (idx === 0) { return false; } | ||
// no terminator -> text till end of string | ||
if (idx < 0) { | ||
if (!silent) { state.pending += state.src.slice(pos); } | ||
state.pos = state.src.length; | ||
return true; | ||
} | ||
if (!silent) { state.pending += state.src.slice(pos, pos + idx); } | ||
state.pos += idx; | ||
return true; | ||
};*/ |
{ | ||
"name": "markdown-it", | ||
"version": "3.1.0", | ||
"version": "4.0.0", | ||
"description": "Markdown-it - modern pluggable markdown parser.", | ||
@@ -21,6 +21,7 @@ "keywords": [ | ||
"dependencies": { | ||
"argparse": "~ 1.0.0", | ||
"linkify-it": "~ 0.1.2", | ||
"mdurl": "~ 1.0.0", | ||
"uc.micro": "~ 0.1.0" | ||
"argparse": "~1.0.0", | ||
"entities": "~1.1.1", | ||
"linkify-it": "~0.1.2", | ||
"mdurl": "~1.0.0", | ||
"uc.micro": "^1.0.0" | ||
}, | ||
@@ -32,3 +33,3 @@ "devDependencies": { | ||
"browserify": "*", | ||
"chai": "~2.1.0", | ||
"chai": "^2.1.0", | ||
"commonmark": "~0.18.1", | ||
@@ -35,0 +36,0 @@ "coveralls": "~2.11.2", |
@@ -12,2 +12,4 @@ # markdown-it | ||
__v4.+ changed internals! Plugins need update. See [migration details](https://github.com/markdown-it/markdown-it/blob/master/docs/4.0_migration.md)__ | ||
- Supports the CommonMark spec + syntax extensions + sugar (URL autolinking, typographer). | ||
@@ -14,0 +16,0 @@ - Configurable syntax! You can add new rules and even replace existing ones. |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
60
252
487644
5
10791
+ Addedentities@~1.1.1
+ Addedentities@1.1.2(transitive)
- Removeduc.micro@0.1.0(transitive)
Updatedargparse@~1.0.0
Updatedlinkify-it@~0.1.2
Updatedmdurl@~1.0.0
Updateduc.micro@^1.0.0