rails-bootstrap-markdown 1.0.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +4 -1
- data/app/assets/javascripts/bootstrap-markdown-bundle.js +5 -0
- data/app/assets/javascripts/bootstrap-markdown.js +482 -100
- data/app/assets/javascripts/he.js +329 -0
- data/app/assets/javascripts/markdown.js +1477 -1379
- data/app/assets/javascripts/to-markdown.js +10 -5
- data/app/assets/stylesheets/bootstrap-markdown.css.scss +168 -7
- data/lib/rails-bootstrap-markdown/version.rb +1 -1
- metadata +8 -7
@@ -0,0 +1,329 @@
|
|
1
|
+
/*! http://mths.be/he v0.5.0 by @mathias | MIT license */
|
2
|
+
;(function(root) {
|
3
|
+
|
4
|
+
// Detect free variables `exports`.
|
5
|
+
var freeExports = typeof exports == 'object' && exports;
|
6
|
+
|
7
|
+
// Detect free variable `module`.
|
8
|
+
var freeModule = typeof module == 'object' && module &&
|
9
|
+
module.exports == freeExports && module;
|
10
|
+
|
11
|
+
// Detect free variable `global`, from Node.js or Browserified code,
|
12
|
+
// and use it as `root`.
|
13
|
+
var freeGlobal = typeof global == 'object' && global;
|
14
|
+
if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
|
15
|
+
root = freeGlobal;
|
16
|
+
}
|
17
|
+
|
18
|
+
/*--------------------------------------------------------------------------*/
|
19
|
+
|
20
|
+
// All astral symbols.
|
21
|
+
var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
|
22
|
+
// All ASCII symbols (not just printable ASCII) except those listed in the
|
23
|
+
// first column of the overrides table.
|
24
|
+
// http://whatwg.org/html/tokenization.html#table-charref-overrides
|
25
|
+
var regexAsciiWhitelist = /[\x01-\x7F]/g;
|
26
|
+
// All BMP symbols that are not ASCII newlines, printable ASCII symbols, or
|
27
|
+
// code points listed in the first column of the overrides table on
|
28
|
+
// http://whatwg.org/html/tokenization.html#table-charref-overrides.
|
29
|
+
var regexBmpWhitelist = /[\x01-\t\x0B\f\x0E-\x1F\x7F\x81\x8D\x8F\x90\x9D\xA0-\uFFFF]/g;
|
30
|
+
|
31
|
+
var regexEncodeNonAscii = /<\u20D2|=\u20E5|>\u20D2|\u205F\u200A|\u219D\u0338|\u2202\u0338|\u2220\u20D2|\u2229\uFE00|\u222A\uFE00|\u223C\u20D2|\u223D\u0331|\u223E\u0333|\u2242\u0338|\u224B\u0338|\u224D\u20D2|\u224E\u0338|\u224F\u0338|\u2250\u0338|\u2261\u20E5|\u2264\u20D2|\u2265\u20D2|\u2266\u0338|\u2267\u0338|\u2268\uFE00|\u2269\uFE00|\u226A\u0338|\u226A\u20D2|\u226B\u0338|\u226B\u20D2|\u227F\u0338|\u2282\u20D2|\u2283\u20D2|\u228A\uFE00|\u228B\uFE00|\u228F\u0338|\u2290\u0338|\u2293\uFE00|\u2294\uFE00|\u22B4\u20D2|\u22B5\u20D2|\u22D8\u0338|\u22D9\u0338|\u22DA\uFE00|\u22DB\uFE00|\u22F5\u0338|\u22F9\u0338|\u2933\u0338|\u29CF\u0338|\u29D0\u0338|\u2A6D\u0338|\u2A70\u0338|\u2A7D\u0338|\u2A7E\u0338|\u2AA1\u0338|\u2AA2\u0338|\u2AAC\uFE00|\u2AAD\uFE00|\u2AAF\u0338|\u2AB0\u0338|\u2AC5\u0338|\u2AC6\u0338|\u2ACB\uFE00|\u2ACC\uFE00|\u2AFD\u20E5|[\xA0-\u0113\u0116-\u0122\u0124-\u012B\u012E-\u014D\u0150-\u017E\u0192\u01B5\u01F5\u0237\u02C6\u02C7\u02D8-\u02DD\u0311\u0391-\u03A1\u03A3-\u03A9\u03B1-\u03C9\u03D1\u03D2\u03D5\u03D6\u03DC\u03DD\u03F0\u03F1\u03F5\u03F6\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E\u045F\u2002-\u2005\u2007-\u2010\u2013-\u2016\u2018-\u201A\u201C-\u201E\u2020-\u2022\u2025\u2026\u2030-\u2035\u2039\u203A\u203E\u2041\u2043\u2044\u204F\u2057\u205F-\u2063\u20AC\u20DB\u20DC\u2102\u2105\u210A-\u2113\u2115-\u211E\u2122\u2124\u2127-\u2129\u212C\u212D\u212F-\u2131\u2133-\u2138\u2145-\u2148\u2153-\u215E\u2190-\u219B\u219D-\u21A7\u21A9-\u21AE\u21B0-\u21B3\u21B5-\u21B7\u21BA-\u21DB\u21DD\u21E4\u21E5\u21F5\u21FD-\u2205\u2207-\u2209\u220B\u220C\u220F-\u2214\u2216-\u2218\u221A\u221D-\u2238\u223A-\u2257\u2259\u225A\u225C\u225F-\u2262\u2264-\u228B\u228D-\u229B\u229D-\u22A5\u22A7-\u22B0\u22B2-\u22BB\u22BD-\u22DB\u22DE-\u22E3\u22E6-\u22F7\u22F9-\u22FE\u2305\u2306\u2308-\u2310\u2312\u2313\u2315\u2316\u231C-\u231F\u2322\u2323\u232D\u232E\u2336\u233D\u233F\u237C\u23B0\u23B1\u23B4-\u23B6\u23DC-\u23DF\u23E2\u23E7\u2423\u24C8\u2500\u2502\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C\u2550-\u256C\u2580\u2584\u2588\u2591-\u2593\u25A1\u25AA\u25AB\u25AD\u25AE\u25B1\u25B3-\u25B5\u25B8\u25B9\u25BD-\u25BF\u25C2\u25C3\u25CA\u25CB\u25EC\u25EF\u25F8-\u25FC\u2605\u2606\u260E\u2640\u2642\u2660\u2663\u2665\u2666\u266A\u266D-\u266F\u2713\u2717\u2720\u2736\u2758\u2772\u2773\u27C8\u27C9\u27E6-\u27ED\u27F5-\u27FA\u27FC\u27FF\u2902-\u2905\u290C-\u2913\u2916\u2919-\u2920\u2923-\u292A\u2933\u2935-\u2939\u293C\u293D\u2945\u2948-\u294B\u294E-\u2976\u2978\u2979\u297B-\u297F\u2985\u2986\u298B-\u2996\u299A\u299C\u299D\u29A4-\u29B7\u29B9\u29BB\u29BC\u29BE-\u29C5\u29C9\u29CD-\u29D0\u29DC-\u29DE\u29E3-\u29E5\u29EB\u29F4\u29F6\u2A00-\u2A02\u2A04\u2A06\u2A0C\u2A0D\u2A10-\u2A17\u2A22-\u2A27\u2A29\u2A2A\u2A2D-\u2A31\u2A33-\u2A3C\u2A3F\u2A40\u2A42-\u2A4D\u2A50\u2A53-\u2A58\u2A5A-\u2A5D\u2A5F\u2A66\u2A6A\u2A6D-\u2A75\u2A77-\u2A9A\u2A9D-\u2AA2\u2AA4-\u2AB0\u2AB3-\u2AC8\u2ACB\u2ACC\u2ACF-\u2ADB\u2AE4\u2AE6-\u2AE9\u2AEB-\u2AF3\u2AFD\uFB00-\uFB04]|\uD835[\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDD6B]/g;
|
32
|
+
var encodeMap = {'\xC1':'Aacute','\xE1':'aacute','\u0102':'Abreve','\u0103':'abreve','\u223E':'ac','\u223F':'acd','\u223E\u0333':'acE','\xC2':'Acirc','\xE2':'acirc','\xB4':'acute','\u0410':'Acy','\u0430':'acy','\xC6':'AElig','\xE6':'aelig','\u2061':'af','\uD835\uDD04':'Afr','\uD835\uDD1E':'afr','\xC0':'Agrave','\xE0':'agrave','\u2135':'aleph','\u0391':'Alpha','\u03B1':'alpha','\u0100':'Amacr','\u0101':'amacr','\u2A3F':'amalg','&':'amp','\u2A55':'andand','\u2A53':'And','\u2227':'and','\u2A5C':'andd','\u2A58':'andslope','\u2A5A':'andv','\u2220':'ang','\u29A4':'ange','\u29A8':'angmsdaa','\u29A9':'angmsdab','\u29AA':'angmsdac','\u29AB':'angmsdad','\u29AC':'angmsdae','\u29AD':'angmsdaf','\u29AE':'angmsdag','\u29AF':'angmsdah','\u2221':'angmsd','\u221F':'angrt','\u22BE':'angrtvb','\u299D':'angrtvbd','\u2222':'angsph','\xC5':'angst','\u237C':'angzarr','\u0104':'Aogon','\u0105':'aogon','\uD835\uDD38':'Aopf','\uD835\uDD52':'aopf','\u2A6F':'apacir','\u2248':'ap','\u2A70':'apE','\u224A':'ape','\u224B':'apid','\'':'apos','\xE5':'aring','\uD835\uDC9C':'Ascr','\uD835\uDCB6':'ascr','\u2254':'colone','*':'ast','\u224D':'CupCap','\xC3':'Atilde','\xE3':'atilde','\xC4':'Auml','\xE4':'auml','\u2233':'awconint','\u2A11':'awint','\u224C':'bcong','\u03F6':'bepsi','\u2035':'bprime','\u223D':'bsim','\u22CD':'bsime','\u2216':'setmn','\u2AE7':'Barv','\u22BD':'barvee','\u2305':'barwed','\u2306':'Barwed','\u23B5':'bbrk','\u23B6':'bbrktbrk','\u0411':'Bcy','\u0431':'bcy','\u201E':'bdquo','\u2235':'becaus','\u29B0':'bemptyv','\u212C':'Bscr','\u0392':'Beta','\u03B2':'beta','\u2136':'beth','\u226C':'twixt','\uD835\uDD05':'Bfr','\uD835\uDD1F':'bfr','\u22C2':'xcap','\u25EF':'xcirc','\u22C3':'xcup','\u2A00':'xodot','\u2A01':'xoplus','\u2A02':'xotime','\u2A06':'xsqcup','\u2605':'starf','\u25BD':'xdtri','\u25B3':'xutri','\u2A04':'xuplus','\u22C1':'Vee','\u22C0':'Wedge','\u290D':'rbarr','\u29EB':'lozf','\u25AA':'squf','\u25B4':'utrif','\u25BE':'dtrif','\u25C2':'ltrif','\u25B8':'rtrif','\u2423':'blank','\u2592':'blk12','\u2591':'blk14','\u2593':'blk34','\u2588':'block','=\u20E5':'bne','\u2261\u20E5':'bnequiv','\u2AED':'bNot','\u2310':'bnot','\uD835\uDD39':'Bopf','\uD835\uDD53':'bopf','\u22A5':'bot','\u22C8':'bowtie','\u29C9':'boxbox','\u2510':'boxdl','\u2555':'boxdL','\u2556':'boxDl','\u2557':'boxDL','\u250C':'boxdr','\u2552':'boxdR','\u2553':'boxDr','\u2554':'boxDR','\u2500':'boxh','\u2550':'boxH','\u252C':'boxhd','\u2564':'boxHd','\u2565':'boxhD','\u2566':'boxHD','\u2534':'boxhu','\u2567':'boxHu','\u2568':'boxhU','\u2569':'boxHU','\u229F':'minusb','\u229E':'plusb','\u22A0':'timesb','\u2518':'boxul','\u255B':'boxuL','\u255C':'boxUl','\u255D':'boxUL','\u2514':'boxur','\u2558':'boxuR','\u2559':'boxUr','\u255A':'boxUR','\u2502':'boxv','\u2551':'boxV','\u253C':'boxvh','\u256A':'boxvH','\u256B':'boxVh','\u256C':'boxVH','\u2524':'boxvl','\u2561':'boxvL','\u2562':'boxVl','\u2563':'boxVL','\u251C':'boxvr','\u255E':'boxvR','\u255F':'boxVr','\u2560':'boxVR','\u02D8':'breve','\xA6':'brvbar','\uD835\uDCB7':'bscr','\u204F':'bsemi','\u29C5':'bsolb','\\':'bsol','\u27C8':'bsolhsub','\u2022':'bull','\u224E':'bump','\u2AAE':'bumpE','\u224F':'bumpe','\u0106':'Cacute','\u0107':'cacute','\u2A44':'capand','\u2A49':'capbrcup','\u2A4B':'capcap','\u2229':'cap','\u22D2':'Cap','\u2A47':'capcup','\u2A40':'capdot','\u2145':'DD','\u2229\uFE00':'caps','\u2041':'caret','\u02C7':'caron','\u212D':'Cfr','\u2A4D':'ccaps','\u010C':'Ccaron','\u010D':'ccaron','\xC7':'Ccedil','\xE7':'ccedil','\u0108':'Ccirc','\u0109':'ccirc','\u2230':'Cconint','\u2A4C':'ccups','\u2A50':'ccupssm','\u010A':'Cdot','\u010B':'cdot','\xB8':'cedil','\u29B2':'cemptyv','\xA2':'cent','\xB7':'middot','\uD835\uDD20':'cfr','\u0427':'CHcy','\u0447':'chcy','\u2713':'check','\u03A7':'Chi','\u03C7':'chi','\u02C6':'circ','\u2257':'cire','\u21BA':'olarr','\u21BB':'orarr','\u229B':'oast','\u229A':'ocir','\u229D':'odash','\u2299':'odot','\xAE':'reg','\u24C8':'oS','\u2296':'ominus','\u2295':'oplus','\u2297':'otimes','\u25CB':'cir','\u29C3':'cirE','\u2A10':'cirfnint','\u2AEF':'cirmid','\u29C2':'cirscir','\u2232':'cwconint','\u201D':'rdquo','\u2019':'rsquo','\u2663':'clubs',':':'colon','\u2237':'Colon','\u2A74':'Colone',',':'comma','@':'commat','\u2201':'comp','\u2218':'compfn','\u2102':'Copf','\u2245':'cong','\u2A6D':'congdot','\u2261':'equiv','\u222E':'oint','\u222F':'Conint','\uD835\uDD54':'copf','\u2210':'coprod','\xA9':'copy','\u2117':'copysr','\u21B5':'crarr','\u2717':'cross','\u2A2F':'Cross','\uD835\uDC9E':'Cscr','\uD835\uDCB8':'cscr','\u2ACF':'csub','\u2AD1':'csube','\u2AD0':'csup','\u2AD2':'csupe','\u22EF':'ctdot','\u2938':'cudarrl','\u2935':'cudarrr','\u22DE':'cuepr','\u22DF':'cuesc','\u21B6':'cularr','\u293D':'cularrp','\u2A48':'cupbrcap','\u2A46':'cupcap','\u222A':'cup','\u22D3':'Cup','\u2A4A':'cupcup','\u228D':'cupdot','\u2A45':'cupor','\u222A\uFE00':'cups','\u21B7':'curarr','\u293C':'curarrm','\u22CE':'cuvee','\u22CF':'cuwed','\xA4':'curren','\u2231':'cwint','\u232D':'cylcty','\u2020':'dagger','\u2021':'Dagger','\u2138':'daleth','\u2193':'darr','\u21A1':'Darr','\u21D3':'dArr','\u2010':'dash','\u2AE4':'Dashv','\u22A3':'dashv','\u290F':'rBarr','\u02DD':'dblac','\u010E':'Dcaron','\u010F':'dcaron','\u0414':'Dcy','\u0434':'dcy','\u21CA':'ddarr','\u2146':'dd','\u2911':'DDotrahd','\u2A77':'eDDot','\xB0':'deg','\u2207':'Del','\u0394':'Delta','\u03B4':'delta','\u29B1':'demptyv','\u297F':'dfisht','\uD835\uDD07':'Dfr','\uD835\uDD21':'dfr','\u2965':'dHar','\u21C3':'dharl','\u21C2':'dharr','\u02D9':'dot','`':'grave','\u02DC':'tilde','\u22C4':'diam','\u2666':'diams','\xA8':'die','\u03DD':'gammad','\u22F2':'disin','\xF7':'div','\u22C7':'divonx','\u0402':'DJcy','\u0452':'djcy','\u231E':'dlcorn','\u230D':'dlcrop','$':'dollar','\uD835\uDD3B':'Dopf','\uD835\uDD55':'dopf','\u20DC':'DotDot','\u2250':'doteq','\u2251':'eDot','\u2238':'minusd','\u2214':'plusdo','\u22A1':'sdotb','\u21D0':'lArr','\u21D4':'iff','\u27F8':'xlArr','\u27FA':'xhArr','\u27F9':'xrArr','\u21D2':'rArr','\u22A8':'vDash','\u21D1':'uArr','\u21D5':'vArr','\u2225':'par','\u2913':'DownArrowBar','\u21F5':'duarr','\u0311':'DownBreve','\u2950':'DownLeftRightVector','\u295E':'DownLeftTeeVector','\u2956':'DownLeftVectorBar','\u21BD':'lhard','\u295F':'DownRightTeeVector','\u2957':'DownRightVectorBar','\u21C1':'rhard','\u21A7':'mapstodown','\u22A4':'top','\u2910':'RBarr','\u231F':'drcorn','\u230C':'drcrop','\uD835\uDC9F':'Dscr','\uD835\uDCB9':'dscr','\u0405':'DScy','\u0455':'dscy','\u29F6':'dsol','\u0110':'Dstrok','\u0111':'dstrok','\u22F1':'dtdot','\u25BF':'dtri','\u296F':'duhar','\u29A6':'dwangle','\u040F':'DZcy','\u045F':'dzcy','\u27FF':'dzigrarr','\xC9':'Eacute','\xE9':'eacute','\u2A6E':'easter','\u011A':'Ecaron','\u011B':'ecaron','\xCA':'Ecirc','\xEA':'ecirc','\u2256':'ecir','\u2255':'ecolon','\u042D':'Ecy','\u044D':'ecy','\u0116':'Edot','\u0117':'edot','\u2147':'ee','\u2252':'efDot','\uD835\uDD08':'Efr','\uD835\uDD22':'efr','\u2A9A':'eg','\xC8':'Egrave','\xE8':'egrave','\u2A96':'egs','\u2A98':'egsdot','\u2A99':'el','\u2208':'in','\u23E7':'elinters','\u2113':'ell','\u2A95':'els','\u2A97':'elsdot','\u0112':'Emacr','\u0113':'emacr','\u2205':'empty','\u25FB':'EmptySmallSquare','\u25AB':'EmptyVerySmallSquare','\u2004':'emsp13','\u2005':'emsp14','\u2003':'emsp','\u014A':'ENG','\u014B':'eng','\u2002':'ensp','\u0118':'Eogon','\u0119':'eogon','\uD835\uDD3C':'Eopf','\uD835\uDD56':'eopf','\u22D5':'epar','\u29E3':'eparsl','\u2A71':'eplus','\u03B5':'epsi','\u0395':'Epsilon','\u03F5':'epsiv','\u2242':'esim','\u2A75':'Equal','=':'equals','\u225F':'equest','\u21CC':'rlhar','\u2A78':'equivDD','\u29E5':'eqvparsl','\u2971':'erarr','\u2253':'erDot','\u212F':'escr','\u2130':'Escr','\u2A73':'Esim','\u0397':'Eta','\u03B7':'eta','\xD0':'ETH','\xF0':'eth','\xCB':'Euml','\xEB':'euml','\u20AC':'euro','!':'excl','\u2203':'exist','\u0424':'Fcy','\u0444':'fcy','\u2640':'female','\uFB03':'ffilig','\uFB00':'fflig','\uFB04':'ffllig','\uD835\uDD09':'Ffr','\uD835\uDD23':'ffr','\uFB01':'filig','\u25FC':'FilledSmallSquare','fj':'fjlig','\u266D':'flat','\uFB02':'fllig','\u25B1':'fltns','\u0192':'fnof','\uD835\uDD3D':'Fopf','\uD835\uDD57':'fopf','\u2200':'forall','\u22D4':'fork','\u2AD9':'forkv','\u2131':'Fscr','\u2A0D':'fpartint','\xBD':'half','\u2153':'frac13','\xBC':'frac14','\u2155':'frac15','\u2159':'frac16','\u215B':'frac18','\u2154':'frac23','\u2156':'frac25','\xBE':'frac34','\u2157':'frac35','\u215C':'frac38','\u2158':'frac45','\u215A':'frac56','\u215D':'frac58','\u215E':'frac78','\u2044':'frasl','\u2322':'frown','\uD835\uDCBB':'fscr','\u01F5':'gacute','\u0393':'Gamma','\u03B3':'gamma','\u03DC':'Gammad','\u2A86':'gap','\u011E':'Gbreve','\u011F':'gbreve','\u0122':'Gcedil','\u011C':'Gcirc','\u011D':'gcirc','\u0413':'Gcy','\u0433':'gcy','\u0120':'Gdot','\u0121':'gdot','\u2265':'ge','\u2267':'gE','\u2A8C':'gEl','\u22DB':'gel','\u2A7E':'ges','\u2AA9':'gescc','\u2A80':'gesdot','\u2A82':'gesdoto','\u2A84':'gesdotol','\u22DB\uFE00':'gesl','\u2A94':'gesles','\uD835\uDD0A':'Gfr','\uD835\uDD24':'gfr','\u226B':'gg','\u22D9':'Gg','\u2137':'gimel','\u0403':'GJcy','\u0453':'gjcy','\u2AA5':'gla','\u2277':'gl','\u2A92':'glE','\u2AA4':'glj','\u2A8A':'gnap','\u2A88':'gne','\u2269':'gnE','\u22E7':'gnsim','\uD835\uDD3E':'Gopf','\uD835\uDD58':'gopf','\u2AA2':'GreaterGreater','\u2273':'gsim','\uD835\uDCA2':'Gscr','\u210A':'gscr','\u2A8E':'gsime','\u2A90':'gsiml','\u2AA7':'gtcc','\u2A7A':'gtcir','>':'gt','\u22D7':'gtdot','\u2995':'gtlPar','\u2A7C':'gtquest','\u2978':'gtrarr','\u2269\uFE00':'gvnE','\u200A':'hairsp','\u210B':'Hscr','\u042A':'HARDcy','\u044A':'hardcy','\u2948':'harrcir','\u2194':'harr','\u21AD':'harrw','^':'Hat','\u210F':'hbar','\u0124':'Hcirc','\u0125':'hcirc','\u2665':'hearts','\u2026':'mldr','\u22B9':'hercon','\uD835\uDD25':'hfr','\u210C':'Hfr','\u2925':'searhk','\u2926':'swarhk','\u21FF':'hoarr','\u223B':'homtht','\u21A9':'larrhk','\u21AA':'rarrhk','\uD835\uDD59':'hopf','\u210D':'Hopf','\u2015':'horbar','\uD835\uDCBD':'hscr','\u0126':'Hstrok','\u0127':'hstrok','\u2043':'hybull','\xCD':'Iacute','\xED':'iacute','\u2063':'ic','\xCE':'Icirc','\xEE':'icirc','\u0418':'Icy','\u0438':'icy','\u0130':'Idot','\u0415':'IEcy','\u0435':'iecy','\xA1':'iexcl','\uD835\uDD26':'ifr','\u2111':'Im','\xCC':'Igrave','\xEC':'igrave','\u2148':'ii','\u2A0C':'qint','\u222D':'tint','\u29DC':'iinfin','\u2129':'iiota','\u0132':'IJlig','\u0133':'ijlig','\u012A':'Imacr','\u012B':'imacr','\u2110':'Iscr','\u0131':'imath','\u22B7':'imof','\u01B5':'imped','\u2105':'incare','\u221E':'infin','\u29DD':'infintie','\u22BA':'intcal','\u222B':'int','\u222C':'Int','\u2124':'Zopf','\u2A17':'intlarhk','\u2A3C':'iprod','\u2062':'it','\u0401':'IOcy','\u0451':'iocy','\u012E':'Iogon','\u012F':'iogon','\uD835\uDD40':'Iopf','\uD835\uDD5A':'iopf','\u0399':'Iota','\u03B9':'iota','\xBF':'iquest','\uD835\uDCBE':'iscr','\u22F5':'isindot','\u22F9':'isinE','\u22F4':'isins','\u22F3':'isinsv','\u0128':'Itilde','\u0129':'itilde','\u0406':'Iukcy','\u0456':'iukcy','\xCF':'Iuml','\xEF':'iuml','\u0134':'Jcirc','\u0135':'jcirc','\u0419':'Jcy','\u0439':'jcy','\uD835\uDD0D':'Jfr','\uD835\uDD27':'jfr','\u0237':'jmath','\uD835\uDD41':'Jopf','\uD835\uDD5B':'jopf','\uD835\uDCA5':'Jscr','\uD835\uDCBF':'jscr','\u0408':'Jsercy','\u0458':'jsercy','\u0404':'Jukcy','\u0454':'jukcy','\u039A':'Kappa','\u03BA':'kappa','\u03F0':'kappav','\u0136':'Kcedil','\u0137':'kcedil','\u041A':'Kcy','\u043A':'kcy','\uD835\uDD0E':'Kfr','\uD835\uDD28':'kfr','\u0138':'kgreen','\u0425':'KHcy','\u0445':'khcy','\u040C':'KJcy','\u045C':'kjcy','\uD835\uDD42':'Kopf','\uD835\uDD5C':'kopf','\uD835\uDCA6':'Kscr','\uD835\uDCC0':'kscr','\u21DA':'lAarr','\u0139':'Lacute','\u013A':'lacute','\u29B4':'laemptyv','\u2112':'Lscr','\u039B':'Lambda','\u03BB':'lambda','\u27E8':'lang','\u27EA':'Lang','\u2991':'langd','\u2A85':'lap','\xAB':'laquo','\u21E4':'larrb','\u291F':'larrbfs','\u2190':'larr','\u219E':'Larr','\u291D':'larrfs','\u21AB':'larrlp','\u2939':'larrpl','\u2973':'larrsim','\u21A2':'larrtl','\u2919':'latail','\u291B':'lAtail','\u2AAB':'lat','\u2AAD':'late','\u2AAD\uFE00':'lates','\u290C':'lbarr','\u290E':'lBarr','\u2772':'lbbrk','{':'lcub','[':'lsqb','\u298B':'lbrke','\u298F':'lbrksld','\u298D':'lbrkslu','\u013D':'Lcaron','\u013E':'lcaron','\u013B':'Lcedil','\u013C':'lcedil','\u2308':'lceil','\u041B':'Lcy','\u043B':'lcy','\u2936':'ldca','\u201C':'ldquo','\u2967':'ldrdhar','\u294B':'ldrushar','\u21B2':'ldsh','\u2264':'le','\u2266':'lE','\u21C6':'lrarr','\u27E6':'lobrk','\u2961':'LeftDownTeeVector','\u2959':'LeftDownVectorBar','\u230A':'lfloor','\u21BC':'lharu','\u21C7':'llarr','\u21CB':'lrhar','\u294E':'LeftRightVector','\u21A4':'mapstoleft','\u295A':'LeftTeeVector','\u22CB':'lthree','\u29CF':'LeftTriangleBar','\u22B2':'vltri','\u22B4':'ltrie','\u2951':'LeftUpDownVector','\u2960':'LeftUpTeeVector','\u2958':'LeftUpVectorBar','\u21BF':'uharl','\u2952':'LeftVectorBar','\u2A8B':'lEg','\u22DA':'leg','\u2A7D':'les','\u2AA8':'lescc','\u2A7F':'lesdot','\u2A81':'lesdoto','\u2A83':'lesdotor','\u22DA\uFE00':'lesg','\u2A93':'lesges','\u22D6':'ltdot','\u2276':'lg','\u2AA1':'LessLess','\u2272':'lsim','\u297C':'lfisht','\uD835\uDD0F':'Lfr','\uD835\uDD29':'lfr','\u2A91':'lgE','\u2962':'lHar','\u296A':'lharul','\u2584':'lhblk','\u0409':'LJcy','\u0459':'ljcy','\u226A':'ll','\u22D8':'Ll','\u296B':'llhard','\u25FA':'lltri','\u013F':'Lmidot','\u0140':'lmidot','\u23B0':'lmoust','\u2A89':'lnap','\u2A87':'lne','\u2268':'lnE','\u22E6':'lnsim','\u27EC':'loang','\u21FD':'loarr','\u27F5':'xlarr','\u27F7':'xharr','\u27FC':'xmap','\u27F6':'xrarr','\u21AC':'rarrlp','\u2985':'lopar','\uD835\uDD43':'Lopf','\uD835\uDD5D':'lopf','\u2A2D':'loplus','\u2A34':'lotimes','\u2217':'lowast','_':'lowbar','\u2199':'swarr','\u2198':'searr','\u25CA':'loz','(':'lpar','\u2993':'lparlt','\u296D':'lrhard','\u200E':'lrm','\u22BF':'lrtri','\u2039':'lsaquo','\uD835\uDCC1':'lscr','\u21B0':'lsh','\u2A8D':'lsime','\u2A8F':'lsimg','\u2018':'lsquo','\u201A':'sbquo','\u0141':'Lstrok','\u0142':'lstrok','\u2AA6':'ltcc','\u2A79':'ltcir','<':'lt','\u22C9':'ltimes','\u2976':'ltlarr','\u2A7B':'ltquest','\u25C3':'ltri','\u2996':'ltrPar','\u294A':'lurdshar','\u2966':'luruhar','\u2268\uFE00':'lvnE','\xAF':'macr','\u2642':'male','\u2720':'malt','\u2905':'Map','\u21A6':'map','\u21A5':'mapstoup','\u25AE':'marker','\u2A29':'mcomma','\u041C':'Mcy','\u043C':'mcy','\u2014':'mdash','\u223A':'mDDot','\u205F':'MediumSpace','\u2133':'Mscr','\uD835\uDD10':'Mfr','\uD835\uDD2A':'mfr','\u2127':'mho','\xB5':'micro','\u2AF0':'midcir','\u2223':'mid','\u2212':'minus','\u2A2A':'minusdu','\u2213':'mp','\u2ADB':'mlcp','\u22A7':'models','\uD835\uDD44':'Mopf','\uD835\uDD5E':'mopf','\uD835\uDCC2':'mscr','\u039C':'Mu','\u03BC':'mu','\u22B8':'mumap','\u0143':'Nacute','\u0144':'nacute','\u2220\u20D2':'nang','\u2249':'nap','\u2A70\u0338':'napE','\u224B\u0338':'napid','\u0149':'napos','\u266E':'natur','\u2115':'Nopf','\xA0':'nbsp','\u224E\u0338':'nbump','\u224F\u0338':'nbumpe','\u2A43':'ncap','\u0147':'Ncaron','\u0148':'ncaron','\u0145':'Ncedil','\u0146':'ncedil','\u2247':'ncong','\u2A6D\u0338':'ncongdot','\u2A42':'ncup','\u041D':'Ncy','\u043D':'ncy','\u2013':'ndash','\u2924':'nearhk','\u2197':'nearr','\u21D7':'neArr','\u2260':'ne','\u2250\u0338':'nedot','\u200B':'ZeroWidthSpace','\u2262':'nequiv','\u2928':'toea','\u2242\u0338':'nesim','\n':'NewLine','\u2204':'nexist','\uD835\uDD11':'Nfr','\uD835\uDD2B':'nfr','\u2267\u0338':'ngE','\u2271':'nge','\u2A7E\u0338':'nges','\u22D9\u0338':'nGg','\u2275':'ngsim','\u226B\u20D2':'nGt','\u226F':'ngt','\u226B\u0338':'nGtv','\u21AE':'nharr','\u21CE':'nhArr','\u2AF2':'nhpar','\u220B':'ni','\u22FC':'nis','\u22FA':'nisd','\u040A':'NJcy','\u045A':'njcy','\u219A':'nlarr','\u21CD':'nlArr','\u2025':'nldr','\u2266\u0338':'nlE','\u2270':'nle','\u2A7D\u0338':'nles','\u226E':'nlt','\u22D8\u0338':'nLl','\u2274':'nlsim','\u226A\u20D2':'nLt','\u22EA':'nltri','\u22EC':'nltrie','\u226A\u0338':'nLtv','\u2224':'nmid','\u2060':'NoBreak','\uD835\uDD5F':'nopf','\u2AEC':'Not','\xAC':'not','\u226D':'NotCupCap','\u2226':'npar','\u2209':'notin','\u2279':'ntgl','\u22F5\u0338':'notindot','\u22F9\u0338':'notinE','\u22F7':'notinvb','\u22F6':'notinvc','\u29CF\u0338':'NotLeftTriangleBar','\u2278':'ntlg','\u2AA2\u0338':'NotNestedGreaterGreater','\u2AA1\u0338':'NotNestedLessLess','\u220C':'notni','\u22FE':'notnivb','\u22FD':'notnivc','\u2280':'npr','\u2AAF\u0338':'npre','\u22E0':'nprcue','\u29D0\u0338':'NotRightTriangleBar','\u22EB':'nrtri','\u22ED':'nrtrie','\u228F\u0338':'NotSquareSubset','\u22E2':'nsqsube','\u2290\u0338':'NotSquareSuperset','\u22E3':'nsqsupe','\u2282\u20D2':'vnsub','\u2288':'nsube','\u2281':'nsc','\u2AB0\u0338':'nsce','\u22E1':'nsccue','\u227F\u0338':'NotSucceedsTilde','\u2283\u20D2':'vnsup','\u2289':'nsupe','\u2241':'nsim','\u2244':'nsime','\u2AFD\u20E5':'nparsl','\u2202\u0338':'npart','\u2A14':'npolint','\u2933\u0338':'nrarrc','\u219B':'nrarr','\u21CF':'nrArr','\u219D\u0338':'nrarrw','\uD835\uDCA9':'Nscr','\uD835\uDCC3':'nscr','\u2284':'nsub','\u2AC5\u0338':'nsubE','\u2285':'nsup','\u2AC6\u0338':'nsupE','\xD1':'Ntilde','\xF1':'ntilde','\u039D':'Nu','\u03BD':'nu','#':'num','\u2116':'numero','\u2007':'numsp','\u224D\u20D2':'nvap','\u22AC':'nvdash','\u22AD':'nvDash','\u22AE':'nVdash','\u22AF':'nVDash','\u2265\u20D2':'nvge','>\u20D2':'nvgt','\u2904':'nvHarr','\u29DE':'nvinfin','\u2902':'nvlArr','\u2264\u20D2':'nvle','<\u20D2':'nvlt','\u22B4\u20D2':'nvltrie','\u2903':'nvrArr','\u22B5\u20D2':'nvrtrie','\u223C\u20D2':'nvsim','\u2923':'nwarhk','\u2196':'nwarr','\u21D6':'nwArr','\u2927':'nwnear','\xD3':'Oacute','\xF3':'oacute','\xD4':'Ocirc','\xF4':'ocirc','\u041E':'Ocy','\u043E':'ocy','\u0150':'Odblac','\u0151':'odblac','\u2A38':'odiv','\u29BC':'odsold','\u0152':'OElig','\u0153':'oelig','\u29BF':'ofcir','\uD835\uDD12':'Ofr','\uD835\uDD2C':'ofr','\u02DB':'ogon','\xD2':'Ograve','\xF2':'ograve','\u29C1':'ogt','\u29B5':'ohbar','\u03A9':'ohm','\u29BE':'olcir','\u29BB':'olcross','\u203E':'oline','\u29C0':'olt','\u014C':'Omacr','\u014D':'omacr','\u03C9':'omega','\u039F':'Omicron','\u03BF':'omicron','\u29B6':'omid','\uD835\uDD46':'Oopf','\uD835\uDD60':'oopf','\u29B7':'opar','\u29B9':'operp','\u2A54':'Or','\u2228':'or','\u2A5D':'ord','\u2134':'oscr','\xAA':'ordf','\xBA':'ordm','\u22B6':'origof','\u2A56':'oror','\u2A57':'orslope','\u2A5B':'orv','\uD835\uDCAA':'Oscr','\xD8':'Oslash','\xF8':'oslash','\u2298':'osol','\xD5':'Otilde','\xF5':'otilde','\u2A36':'otimesas','\u2A37':'Otimes','\xD6':'Ouml','\xF6':'ouml','\u233D':'ovbar','\u23DE':'OverBrace','\u23B4':'tbrk','\u23DC':'OverParenthesis','\xB6':'para','\u2AF3':'parsim','\u2AFD':'parsl','\u2202':'part','\u041F':'Pcy','\u043F':'pcy','%':'percnt','.':'period','\u2030':'permil','\u2031':'pertenk','\uD835\uDD13':'Pfr','\uD835\uDD2D':'pfr','\u03A6':'Phi','\u03C6':'phi','\u03D5':'phiv','\u260E':'phone','\u03A0':'Pi','\u03C0':'pi','\u03D6':'piv','\u210E':'planckh','\u2A23':'plusacir','\u2A22':'pluscir','+':'plus','\u2A25':'plusdu','\u2A72':'pluse','\xB1':'pm','\u2A26':'plussim','\u2A27':'plustwo','\u2A15':'pointint','\uD835\uDD61':'popf','\u2119':'Popf','\xA3':'pound','\u2AB7':'prap','\u2ABB':'Pr','\u227A':'pr','\u227C':'prcue','\u2AAF':'pre','\u227E':'prsim','\u2AB9':'prnap','\u2AB5':'prnE','\u22E8':'prnsim','\u2AB3':'prE','\u2032':'prime','\u2033':'Prime','\u220F':'prod','\u232E':'profalar','\u2312':'profline','\u2313':'profsurf','\u221D':'prop','\u22B0':'prurel','\uD835\uDCAB':'Pscr','\uD835\uDCC5':'pscr','\u03A8':'Psi','\u03C8':'psi','\u2008':'puncsp','\uD835\uDD14':'Qfr','\uD835\uDD2E':'qfr','\uD835\uDD62':'qopf','\u211A':'Qopf','\u2057':'qprime','\uD835\uDCAC':'Qscr','\uD835\uDCC6':'qscr','\u2A16':'quatint','?':'quest','"':'quot','\u21DB':'rAarr','\u223D\u0331':'race','\u0154':'Racute','\u0155':'racute','\u221A':'Sqrt','\u29B3':'raemptyv','\u27E9':'rang','\u27EB':'Rang','\u2992':'rangd','\u29A5':'range','\xBB':'raquo','\u2975':'rarrap','\u21E5':'rarrb','\u2920':'rarrbfs','\u2933':'rarrc','\u2192':'rarr','\u21A0':'Rarr','\u291E':'rarrfs','\u2945':'rarrpl','\u2974':'rarrsim','\u2916':'Rarrtl','\u21A3':'rarrtl','\u219D':'rarrw','\u291A':'ratail','\u291C':'rAtail','\u2236':'ratio','\u2773':'rbbrk','}':'rcub',']':'rsqb','\u298C':'rbrke','\u298E':'rbrksld','\u2990':'rbrkslu','\u0158':'Rcaron','\u0159':'rcaron','\u0156':'Rcedil','\u0157':'rcedil','\u2309':'rceil','\u0420':'Rcy','\u0440':'rcy','\u2937':'rdca','\u2969':'rdldhar','\u21B3':'rdsh','\u211C':'Re','\u211B':'Rscr','\u211D':'Ropf','\u25AD':'rect','\u297D':'rfisht','\u230B':'rfloor','\uD835\uDD2F':'rfr','\u2964':'rHar','\u21C0':'rharu','\u296C':'rharul','\u03A1':'Rho','\u03C1':'rho','\u03F1':'rhov','\u21C4':'rlarr','\u27E7':'robrk','\u295D':'RightDownTeeVector','\u2955':'RightDownVectorBar','\u21C9':'rrarr','\u22A2':'vdash','\u295B':'RightTeeVector','\u22CC':'rthree','\u29D0':'RightTriangleBar','\u22B3':'vrtri','\u22B5':'rtrie','\u294F':'RightUpDownVector','\u295C':'RightUpTeeVector','\u2954':'RightUpVectorBar','\u21BE':'uharr','\u2953':'RightVectorBar','\u02DA':'ring','\u200F':'rlm','\u23B1':'rmoust','\u2AEE':'rnmid','\u27ED':'roang','\u21FE':'roarr','\u2986':'ropar','\uD835\uDD63':'ropf','\u2A2E':'roplus','\u2A35':'rotimes','\u2970':'RoundImplies',')':'rpar','\u2994':'rpargt','\u2A12':'rppolint','\u203A':'rsaquo','\uD835\uDCC7':'rscr','\u21B1':'rsh','\u22CA':'rtimes','\u25B9':'rtri','\u29CE':'rtriltri','\u29F4':'RuleDelayed','\u2968':'ruluhar','\u211E':'rx','\u015A':'Sacute','\u015B':'sacute','\u2AB8':'scap','\u0160':'Scaron','\u0161':'scaron','\u2ABC':'Sc','\u227B':'sc','\u227D':'sccue','\u2AB0':'sce','\u2AB4':'scE','\u015E':'Scedil','\u015F':'scedil','\u015C':'Scirc','\u015D':'scirc','\u2ABA':'scnap','\u2AB6':'scnE','\u22E9':'scnsim','\u2A13':'scpolint','\u227F':'scsim','\u0421':'Scy','\u0441':'scy','\u22C5':'sdot','\u2A66':'sdote','\u21D8':'seArr','\xA7':'sect',';':'semi','\u2929':'tosa','\u2736':'sext','\uD835\uDD16':'Sfr','\uD835\uDD30':'sfr','\u266F':'sharp','\u0429':'SHCHcy','\u0449':'shchcy','\u0428':'SHcy','\u0448':'shcy','\u2191':'uarr','\xAD':'shy','\u03A3':'Sigma','\u03C3':'sigma','\u03C2':'sigmaf','\u223C':'sim','\u2A6A':'simdot','\u2243':'sime','\u2A9E':'simg','\u2AA0':'simgE','\u2A9D':'siml','\u2A9F':'simlE','\u2246':'simne','\u2A24':'simplus','\u2972':'simrarr','\u2A33':'smashp','\u29E4':'smeparsl','\u2323':'smile','\u2AAA':'smt','\u2AAC':'smte','\u2AAC\uFE00':'smtes','\u042C':'SOFTcy','\u044C':'softcy','\u233F':'solbar','\u29C4':'solb','/':'sol','\uD835\uDD4A':'Sopf','\uD835\uDD64':'sopf','\u2660':'spades','\u2293':'sqcap','\u2293\uFE00':'sqcaps','\u2294':'sqcup','\u2294\uFE00':'sqcups','\u228F':'sqsub','\u2291':'sqsube','\u2290':'sqsup','\u2292':'sqsupe','\u25A1':'squ','\uD835\uDCAE':'Sscr','\uD835\uDCC8':'sscr','\u22C6':'Star','\u2606':'star','\u2282':'sub','\u22D0':'Sub','\u2ABD':'subdot','\u2AC5':'subE','\u2286':'sube','\u2AC3':'subedot','\u2AC1':'submult','\u2ACB':'subnE','\u228A':'subne','\u2ABF':'subplus','\u2979':'subrarr','\u2AC7':'subsim','\u2AD5':'subsub','\u2AD3':'subsup','\u2211':'sum','\u266A':'sung','\xB9':'sup1','\xB2':'sup2','\xB3':'sup3','\u2283':'sup','\u22D1':'Sup','\u2ABE':'supdot','\u2AD8':'supdsub','\u2AC6':'supE','\u2287':'supe','\u2AC4':'supedot','\u27C9':'suphsol','\u2AD7':'suphsub','\u297B':'suplarr','\u2AC2':'supmult','\u2ACC':'supnE','\u228B':'supne','\u2AC0':'supplus','\u2AC8':'supsim','\u2AD4':'supsub','\u2AD6':'supsup','\u21D9':'swArr','\u292A':'swnwar','\xDF':'szlig','\t':'Tab','\u2316':'target','\u03A4':'Tau','\u03C4':'tau','\u0164':'Tcaron','\u0165':'tcaron','\u0162':'Tcedil','\u0163':'tcedil','\u0422':'Tcy','\u0442':'tcy','\u20DB':'tdot','\u2315':'telrec','\uD835\uDD17':'Tfr','\uD835\uDD31':'tfr','\u2234':'there4','\u0398':'Theta','\u03B8':'theta','\u03D1':'thetav','\u205F\u200A':'ThickSpace','\u2009':'thinsp','\xDE':'THORN','\xFE':'thorn','\u2A31':'timesbar','\xD7':'times','\u2A30':'timesd','\u2336':'topbot','\u2AF1':'topcir','\uD835\uDD4B':'Topf','\uD835\uDD65':'topf','\u2ADA':'topfork','\u2034':'tprime','\u2122':'trade','\u25B5':'utri','\u225C':'trie','\u25EC':'tridot','\u2A3A':'triminus','\u2A39':'triplus','\u29CD':'trisb','\u2A3B':'tritime','\u23E2':'trpezium','\uD835\uDCAF':'Tscr','\uD835\uDCC9':'tscr','\u0426':'TScy','\u0446':'tscy','\u040B':'TSHcy','\u045B':'tshcy','\u0166':'Tstrok','\u0167':'tstrok','\xDA':'Uacute','\xFA':'uacute','\u219F':'Uarr','\u2949':'Uarrocir','\u040E':'Ubrcy','\u045E':'ubrcy','\u016C':'Ubreve','\u016D':'ubreve','\xDB':'Ucirc','\xFB':'ucirc','\u0423':'Ucy','\u0443':'ucy','\u21C5':'udarr','\u0170':'Udblac','\u0171':'udblac','\u296E':'udhar','\u297E':'ufisht','\uD835\uDD18':'Ufr','\uD835\uDD32':'ufr','\xD9':'Ugrave','\xF9':'ugrave','\u2963':'uHar','\u2580':'uhblk','\u231C':'ulcorn','\u230F':'ulcrop','\u25F8':'ultri','\u016A':'Umacr','\u016B':'umacr','\u23DF':'UnderBrace','\u23DD':'UnderParenthesis','\u228E':'uplus','\u0172':'Uogon','\u0173':'uogon','\uD835\uDD4C':'Uopf','\uD835\uDD66':'uopf','\u2912':'UpArrowBar','\u2195':'varr','\u03C5':'upsi','\u03D2':'Upsi','\u03A5':'Upsilon','\u21C8':'uuarr','\u231D':'urcorn','\u230E':'urcrop','\u016E':'Uring','\u016F':'uring','\u25F9':'urtri','\uD835\uDCB0':'Uscr','\uD835\uDCCA':'uscr','\u22F0':'utdot','\u0168':'Utilde','\u0169':'utilde','\xDC':'Uuml','\xFC':'uuml','\u29A7':'uwangle','\u299C':'vangrt','\u228A\uFE00':'vsubne','\u2ACB\uFE00':'vsubnE','\u228B\uFE00':'vsupne','\u2ACC\uFE00':'vsupnE','\u2AE8':'vBar','\u2AEB':'Vbar','\u2AE9':'vBarv','\u0412':'Vcy','\u0432':'vcy','\u22A9':'Vdash','\u22AB':'VDash','\u2AE6':'Vdashl','\u22BB':'veebar','\u225A':'veeeq','\u22EE':'vellip','|':'vert','\u2016':'Vert','\u2758':'VerticalSeparator','\u2240':'wr','\uD835\uDD19':'Vfr','\uD835\uDD33':'vfr','\uD835\uDD4D':'Vopf','\uD835\uDD67':'vopf','\uD835\uDCB1':'Vscr','\uD835\uDCCB':'vscr','\u22AA':'Vvdash','\u299A':'vzigzag','\u0174':'Wcirc','\u0175':'wcirc','\u2A5F':'wedbar','\u2259':'wedgeq','\u2118':'wp','\uD835\uDD1A':'Wfr','\uD835\uDD34':'wfr','\uD835\uDD4E':'Wopf','\uD835\uDD68':'wopf','\uD835\uDCB2':'Wscr','\uD835\uDCCC':'wscr','\uD835\uDD1B':'Xfr','\uD835\uDD35':'xfr','\u039E':'Xi','\u03BE':'xi','\u22FB':'xnis','\uD835\uDD4F':'Xopf','\uD835\uDD69':'xopf','\uD835\uDCB3':'Xscr','\uD835\uDCCD':'xscr','\xDD':'Yacute','\xFD':'yacute','\u042F':'YAcy','\u044F':'yacy','\u0176':'Ycirc','\u0177':'ycirc','\u042B':'Ycy','\u044B':'ycy','\xA5':'yen','\uD835\uDD1C':'Yfr','\uD835\uDD36':'yfr','\u0407':'YIcy','\u0457':'yicy','\uD835\uDD50':'Yopf','\uD835\uDD6A':'yopf','\uD835\uDCB4':'Yscr','\uD835\uDCCE':'yscr','\u042E':'YUcy','\u044E':'yucy','\xFF':'yuml','\u0178':'Yuml','\u0179':'Zacute','\u017A':'zacute','\u017D':'Zcaron','\u017E':'zcaron','\u0417':'Zcy','\u0437':'zcy','\u017B':'Zdot','\u017C':'zdot','\u2128':'Zfr','\u0396':'Zeta','\u03B6':'zeta','\uD835\uDD37':'zfr','\u0416':'ZHcy','\u0436':'zhcy','\u21DD':'zigrarr','\uD835\uDD6B':'zopf','\uD835\uDCB5':'Zscr','\uD835\uDCCF':'zscr','\u200D':'zwj','\u200C':'zwnj'};
|
33
|
+
|
34
|
+
var regexEscape = /["&'<>`]/g;
|
35
|
+
var escapeMap = {
|
36
|
+
'"': '"',
|
37
|
+
'&': '&',
|
38
|
+
'\'': ''',
|
39
|
+
'<': '<',
|
40
|
+
// See https://mathiasbynens.be/notes/ambiguous-ampersands: in HTML, the
|
41
|
+
// following is not strictly necessary unless it’s part of a tag or an
|
42
|
+
// unquoted attribute value. We’re only escaping it to support those
|
43
|
+
// situations, and for XML support.
|
44
|
+
'>': '>',
|
45
|
+
// In Internet Explorer ≤ 8, the backtick character can be used
|
46
|
+
// to break out of (un)quoted attribute values or HTML comments.
|
47
|
+
// See http://html5sec.org/#102, http://html5sec.org/#108, and
|
48
|
+
// http://html5sec.org/#133.
|
49
|
+
'`': '`'
|
50
|
+
};
|
51
|
+
|
52
|
+
var regexInvalidEntity = /&#(?:[xX][^a-fA-F0-9]|[^0-9xX])/;
|
53
|
+
var regexInvalidRawCodePoint = /[\0-\x08\x0B\x0E-\x1F\x7F-\x9F\uFDD0-\uFDEF\uFFFE\uFFFF]|[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/;
|
54
|
+
var regexDecode = /&#([0-9]+)(;?)|&#[xX]([a-fA-F0-9]+)(;?)|&([0-9a-zA-Z]+);|&(Aacute|iacute|Uacute|plusmn|otilde|Otilde|Agrave|agrave|yacute|Yacute|oslash|Oslash|Atilde|atilde|brvbar|Ccedil|ccedil|ograve|curren|divide|Eacute|eacute|Ograve|oacute|Egrave|egrave|ugrave|frac12|frac14|frac34|Ugrave|Oacute|Iacute|ntilde|Ntilde|uacute|middot|Igrave|igrave|iquest|aacute|laquo|THORN|micro|iexcl|icirc|Icirc|Acirc|ucirc|ecirc|Ocirc|ocirc|Ecirc|Ucirc|aring|Aring|aelig|AElig|acute|pound|raquo|acirc|times|thorn|szlig|cedil|COPY|Auml|ordf|ordm|uuml|macr|Uuml|auml|Ouml|ouml|para|nbsp|Euml|quot|QUOT|euml|yuml|cent|sect|copy|sup1|sup2|sup3|Iuml|iuml|shy|eth|reg|not|yen|amp|AMP|REG|uml|ETH|deg|gt|GT|LT|lt)([=a-zA-Z0-9])?/g;
|
55
|
+
var decodeMap = {'Aacute':'\xC1','aacute':'\xE1','Abreve':'\u0102','abreve':'\u0103','ac':'\u223E','acd':'\u223F','acE':'\u223E\u0333','Acirc':'\xC2','acirc':'\xE2','acute':'\xB4','Acy':'\u0410','acy':'\u0430','AElig':'\xC6','aelig':'\xE6','af':'\u2061','Afr':'\uD835\uDD04','afr':'\uD835\uDD1E','Agrave':'\xC0','agrave':'\xE0','alefsym':'\u2135','aleph':'\u2135','Alpha':'\u0391','alpha':'\u03B1','Amacr':'\u0100','amacr':'\u0101','amalg':'\u2A3F','amp':'&','AMP':'&','andand':'\u2A55','And':'\u2A53','and':'\u2227','andd':'\u2A5C','andslope':'\u2A58','andv':'\u2A5A','ang':'\u2220','ange':'\u29A4','angle':'\u2220','angmsdaa':'\u29A8','angmsdab':'\u29A9','angmsdac':'\u29AA','angmsdad':'\u29AB','angmsdae':'\u29AC','angmsdaf':'\u29AD','angmsdag':'\u29AE','angmsdah':'\u29AF','angmsd':'\u2221','angrt':'\u221F','angrtvb':'\u22BE','angrtvbd':'\u299D','angsph':'\u2222','angst':'\xC5','angzarr':'\u237C','Aogon':'\u0104','aogon':'\u0105','Aopf':'\uD835\uDD38','aopf':'\uD835\uDD52','apacir':'\u2A6F','ap':'\u2248','apE':'\u2A70','ape':'\u224A','apid':'\u224B','apos':'\'','ApplyFunction':'\u2061','approx':'\u2248','approxeq':'\u224A','Aring':'\xC5','aring':'\xE5','Ascr':'\uD835\uDC9C','ascr':'\uD835\uDCB6','Assign':'\u2254','ast':'*','asymp':'\u2248','asympeq':'\u224D','Atilde':'\xC3','atilde':'\xE3','Auml':'\xC4','auml':'\xE4','awconint':'\u2233','awint':'\u2A11','backcong':'\u224C','backepsilon':'\u03F6','backprime':'\u2035','backsim':'\u223D','backsimeq':'\u22CD','Backslash':'\u2216','Barv':'\u2AE7','barvee':'\u22BD','barwed':'\u2305','Barwed':'\u2306','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':'=\u20E5','bnequiv':'\u2261\u20E5','bNot':'\u2AED','bnot':'\u2310','Bopf':'\uD835\uDD39','bopf':'\uD835\uDD53','bot':'\u22A5','bottom':'\u22A5','bowtie':'\u22C8','boxbox':'\u29C9','boxdl':'\u2510','boxdL':'\u2555','boxDl':'\u2556','boxDL':'\u2557','boxdr':'\u250C','boxdR':'\u2552','boxDr':'\u2553','boxDR':'\u2554','boxh':'\u2500','boxH':'\u2550','boxhd':'\u252C','boxHd':'\u2564','boxhD':'\u2565','boxHD':'\u2566','boxhu':'\u2534','boxHu':'\u2567','boxhU':'\u2568','boxHU':'\u2569','boxminus':'\u229F','boxplus':'\u229E','boxtimes':'\u22A0','boxul':'\u2518','boxuL':'\u255B','boxUl':'\u255C','boxUL':'\u255D','boxur':'\u2514','boxuR':'\u2558','boxUr':'\u2559','boxUR':'\u255A','boxv':'\u2502','boxV':'\u2551','boxvh':'\u253C','boxvH':'\u256A','boxVh':'\u256B','boxVH':'\u256C','boxvl':'\u2524','boxvL':'\u2561','boxVl':'\u2562','boxVL':'\u2563','boxvr':'\u251C','boxvR':'\u255E','boxVr':'\u255F','boxVR':'\u2560','bprime':'\u2035','breve':'\u02D8','Breve':'\u02D8','brvbar':'\xA6','bscr':'\uD835\uDCB7','Bscr':'\u212C','bsemi':'\u204F','bsim':'\u223D','bsime':'\u22CD','bsolb':'\u29C5','bsol':'\\','bsolhsub':'\u27C8','bull':'\u2022','bullet':'\u2022','bump':'\u224E','bumpE':'\u2AAE','bumpe':'\u224F','Bumpeq':'\u224E','bumpeq':'\u224F','Cacute':'\u0106','cacute':'\u0107','capand':'\u2A44','capbrcup':'\u2A49','capcap':'\u2A4B','cap':'\u2229','Cap':'\u22D2','capcup':'\u2A47','capdot':'\u2A40','CapitalDifferentialD':'\u2145','caps':'\u2229\uFE00','caret':'\u2041','caron':'\u02C7','Cayleys':'\u212D','ccaps':'\u2A4D','Ccaron':'\u010C','ccaron':'\u010D','Ccedil':'\xC7','ccedil':'\xE7','Ccirc':'\u0108','ccirc':'\u0109','Cconint':'\u2230','ccups':'\u2A4C','ccupssm':'\u2A50','Cdot':'\u010A','cdot':'\u010B','cedil':'\xB8','Cedilla':'\xB8','cemptyv':'\u29B2','cent':'\xA2','centerdot':'\xB7','CenterDot':'\xB7','cfr':'\uD835\uDD20','Cfr':'\u212D','CHcy':'\u0427','chcy':'\u0447','check':'\u2713','checkmark':'\u2713','Chi':'\u03A7','chi':'\u03C7','circ':'\u02C6','circeq':'\u2257','circlearrowleft':'\u21BA','circlearrowright':'\u21BB','circledast':'\u229B','circledcirc':'\u229A','circleddash':'\u229D','CircleDot':'\u2299','circledR':'\xAE','circledS':'\u24C8','CircleMinus':'\u2296','CirclePlus':'\u2295','CircleTimes':'\u2297','cir':'\u25CB','cirE':'\u29C3','cire':'\u2257','cirfnint':'\u2A10','cirmid':'\u2AEF','cirscir':'\u29C2','ClockwiseContourIntegral':'\u2232','CloseCurlyDoubleQuote':'\u201D','CloseCurlyQuote':'\u2019','clubs':'\u2663','clubsuit':'\u2663','colon':':','Colon':'\u2237','Colone':'\u2A74','colone':'\u2254','coloneq':'\u2254','comma':',','commat':'@','comp':'\u2201','compfn':'\u2218','complement':'\u2201','complexes':'\u2102','cong':'\u2245','congdot':'\u2A6D','Congruent':'\u2261','conint':'\u222E','Conint':'\u222F','ContourIntegral':'\u222E','copf':'\uD835\uDD54','Copf':'\u2102','coprod':'\u2210','Coproduct':'\u2210','copy':'\xA9','COPY':'\xA9','copysr':'\u2117','CounterClockwiseContourIntegral':'\u2233','crarr':'\u21B5','cross':'\u2717','Cross':'\u2A2F','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','cupbrcap':'\u2A48','cupcap':'\u2A46','CupCap':'\u224D','cup':'\u222A','Cup':'\u22D3','cupcup':'\u2A4A','cupdot':'\u228D','cupor':'\u2A45','cups':'\u222A\uFE00','curarr':'\u21B7','curarrm':'\u293C','curlyeqprec':'\u22DE','curlyeqsucc':'\u22DF','curlyvee':'\u22CE','curlywedge':'\u22CF','curren':'\xA4','curvearrowleft':'\u21B6','curvearrowright':'\u21B7','cuvee':'\u22CE','cuwed':'\u22CF','cwconint':'\u2232','cwint':'\u2231','cylcty':'\u232D','dagger':'\u2020','Dagger':'\u2021','daleth':'\u2138','darr':'\u2193','Darr':'\u21A1','dArr':'\u21D3','dash':'\u2010','Dashv':'\u2AE4','dashv':'\u22A3','dbkarow':'\u290F','dblac':'\u02DD','Dcaron':'\u010E','dcaron':'\u010F','Dcy':'\u0414','dcy':'\u0434','ddagger':'\u2021','ddarr':'\u21CA','DD':'\u2145','dd':'\u2146','DDotrahd':'\u2911','ddotseq':'\u2A77','deg':'\xB0','Del':'\u2207','Delta':'\u0394','delta':'\u03B4','demptyv':'\u29B1','dfisht':'\u297F','Dfr':'\uD835\uDD07','dfr':'\uD835\uDD21','dHar':'\u2965','dharl':'\u21C3','dharr':'\u21C2','DiacriticalAcute':'\xB4','DiacriticalDot':'\u02D9','DiacriticalDoubleAcute':'\u02DD','DiacriticalGrave':'`','DiacriticalTilde':'\u02DC','diam':'\u22C4','diamond':'\u22C4','Diamond':'\u22C4','diamondsuit':'\u2666','diams':'\u2666','die':'\xA8','DifferentialD':'\u2146','digamma':'\u03DD','disin':'\u22F2','div':'\xF7','divide':'\xF7','divideontimes':'\u22C7','divonx':'\u22C7','DJcy':'\u0402','djcy':'\u0452','dlcorn':'\u231E','dlcrop':'\u230D','dollar':'$','Dopf':'\uD835\uDD3B','dopf':'\uD835\uDD55','Dot':'\xA8','dot':'\u02D9','DotDot':'\u20DC','doteq':'\u2250','doteqdot':'\u2251','DotEqual':'\u2250','dotminus':'\u2238','dotplus':'\u2214','dotsquare':'\u22A1','doublebarwedge':'\u2306','DoubleContourIntegral':'\u222F','DoubleDot':'\xA8','DoubleDownArrow':'\u21D3','DoubleLeftArrow':'\u21D0','DoubleLeftRightArrow':'\u21D4','DoubleLeftTee':'\u2AE4','DoubleLongLeftArrow':'\u27F8','DoubleLongLeftRightArrow':'\u27FA','DoubleLongRightArrow':'\u27F9','DoubleRightArrow':'\u21D2','DoubleRightTee':'\u22A8','DoubleUpArrow':'\u21D1','DoubleUpDownArrow':'\u21D5','DoubleVerticalBar':'\u2225','DownArrowBar':'\u2913','downarrow':'\u2193','DownArrow':'\u2193','Downarrow':'\u21D3','DownArrowUpArrow':'\u21F5','DownBreve':'\u0311','downdownarrows':'\u21CA','downharpoonleft':'\u21C3','downharpoonright':'\u21C2','DownLeftRightVector':'\u2950','DownLeftTeeVector':'\u295E','DownLeftVectorBar':'\u2956','DownLeftVector':'\u21BD','DownRightTeeVector':'\u295F','DownRightVectorBar':'\u2957','DownRightVector':'\u21C1','DownTeeArrow':'\u21A7','DownTee':'\u22A4','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':'\xC9','eacute':'\xE9','easter':'\u2A6E','Ecaron':'\u011A','ecaron':'\u011B','Ecirc':'\xCA','ecirc':'\xEA','ecir':'\u2256','ecolon':'\u2255','Ecy':'\u042D','ecy':'\u044D','eDDot':'\u2A77','Edot':'\u0116','edot':'\u0117','eDot':'\u2251','ee':'\u2147','efDot':'\u2252','Efr':'\uD835\uDD08','efr':'\uD835\uDD22','eg':'\u2A9A','Egrave':'\xC8','egrave':'\xE8','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','emsp13':'\u2004','emsp14':'\u2005','emsp':'\u2003','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':'=','EqualTilde':'\u2242','equest':'\u225F','Equilibrium':'\u21CC','equiv':'\u2261','equivDD':'\u2A78','eqvparsl':'\u29E5','erarr':'\u2971','erDot':'\u2253','escr':'\u212F','Escr':'\u2130','esdot':'\u2250','Esim':'\u2A73','esim':'\u2242','Eta':'\u0397','eta':'\u03B7','ETH':'\xD0','eth':'\xF0','Euml':'\xCB','euml':'\xEB','euro':'\u20AC','excl':'!','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':'fj','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':'\xBD','frac13':'\u2153','frac14':'\xBC','frac15':'\u2155','frac16':'\u2159','frac18':'\u215B','frac23':'\u2154','frac25':'\u2156','frac34':'\xBE','frac35':'\u2157','frac38':'\u215C','frac45':'\u2158','frac56':'\u215A','frac58':'\u215D','frac78':'\u215E','frasl':'\u2044','frown':'\u2322','fscr':'\uD835\uDCBB','Fscr':'\u2131','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':'\u2265','gE':'\u2267','gEl':'\u2A8C','gel':'\u22DB','geq':'\u2265','geqq':'\u2267','geqslant':'\u2A7E','gescc':'\u2AA9','ges':'\u2A7E','gesdot':'\u2A80','gesdoto':'\u2A82','gesdotol':'\u2A84','gesl':'\u22DB\uFE00','gesles':'\u2A94','Gfr':'\uD835\uDD0A','gfr':'\uD835\uDD24','gg':'\u226B','Gg':'\u22D9','ggg':'\u22D9','gimel':'\u2137','GJcy':'\u0403','gjcy':'\u0453','gla':'\u2AA5','gl':'\u2277','glE':'\u2A92','glj':'\u2AA4','gnap':'\u2A8A','gnapprox':'\u2A8A','gne':'\u2A88','gnE':'\u2269','gneq':'\u2A88','gneqq':'\u2269','gnsim':'\u22E7','Gopf':'\uD835\uDD3E','gopf':'\uD835\uDD58','grave':'`','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','gtcc':'\u2AA7','gtcir':'\u2A7A','gt':'>','GT':'>','Gt':'\u226B','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':'\xBD','hamilt':'\u210B','HARDcy':'\u042A','hardcy':'\u044A','harrcir':'\u2948','harr':'\u2194','hArr':'\u21D4','harrw':'\u21AD','Hat':'^','hbar':'\u210F','Hcirc':'\u0124','hcirc':'\u0125','hearts':'\u2665','heartsuit':'\u2665','hellip':'\u2026','hercon':'\u22B9','hfr':'\uD835\uDD25','Hfr':'\u210C','HilbertSpace':'\u210B','hksearow':'\u2925','hkswarow':'\u2926','hoarr':'\u21FF','homtht':'\u223B','hookleftarrow':'\u21A9','hookrightarrow':'\u21AA','hopf':'\uD835\uDD59','Hopf':'\u210D','horbar':'\u2015','HorizontalLine':'\u2500','hscr':'\uD835\uDCBD','Hscr':'\u210B','hslash':'\u210F','Hstrok':'\u0126','hstrok':'\u0127','HumpDownHump':'\u224E','HumpEqual':'\u224F','hybull':'\u2043','hyphen':'\u2010','Iacute':'\xCD','iacute':'\xED','ic':'\u2063','Icirc':'\xCE','icirc':'\xEE','Icy':'\u0418','icy':'\u0438','Idot':'\u0130','IEcy':'\u0415','iecy':'\u0435','iexcl':'\xA1','iff':'\u21D4','ifr':'\uD835\uDD26','Ifr':'\u2111','Igrave':'\xCC','igrave':'\xEC','ii':'\u2148','iiiint':'\u2A0C','iiint':'\u222D','iinfin':'\u29DC','iiota':'\u2129','IJlig':'\u0132','ijlig':'\u0133','Imacr':'\u012A','imacr':'\u012B','image':'\u2111','ImaginaryI':'\u2148','imagline':'\u2110','imagpart':'\u2111','imath':'\u0131','Im':'\u2111','imof':'\u22B7','imped':'\u01B5','Implies':'\u21D2','incare':'\u2105','in':'\u2208','infin':'\u221E','infintie':'\u29DD','inodot':'\u0131','intcal':'\u22BA','int':'\u222B','Int':'\u222C','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':'\xBF','iscr':'\uD835\uDCBE','Iscr':'\u2110','isin':'\u2208','isindot':'\u22F5','isinE':'\u22F9','isins':'\u22F4','isinsv':'\u22F3','isinv':'\u2208','it':'\u2062','Itilde':'\u0128','itilde':'\u0129','Iukcy':'\u0406','iukcy':'\u0456','Iuml':'\xCF','iuml':'\xEF','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':'\u27E8','Lang':'\u27EA','langd':'\u2991','langle':'\u27E8','lap':'\u2A85','Laplacetrf':'\u2112','laquo':'\xAB','larrb':'\u21E4','larrbfs':'\u291F','larr':'\u2190','Larr':'\u219E','lArr':'\u21D0','larrfs':'\u291D','larrhk':'\u21A9','larrlp':'\u21AB','larrpl':'\u2939','larrsim':'\u2973','larrtl':'\u21A2','latail':'\u2919','lAtail':'\u291B','lat':'\u2AAB','late':'\u2AAD','lates':'\u2AAD\uFE00','lbarr':'\u290C','lBarr':'\u290E','lbbrk':'\u2772','lbrace':'{','lbrack':'[','lbrke':'\u298B','lbrksld':'\u298F','lbrkslu':'\u298D','Lcaron':'\u013D','lcaron':'\u013E','Lcedil':'\u013B','lcedil':'\u013C','lceil':'\u2308','lcub':'{','Lcy':'\u041B','lcy':'\u043B','ldca':'\u2936','ldquo':'\u201C','ldquor':'\u201E','ldrdhar':'\u2967','ldrushar':'\u294B','ldsh':'\u21B2','le':'\u2264','lE':'\u2266','LeftAngleBracket':'\u27E8','LeftArrowBar':'\u21E4','leftarrow':'\u2190','LeftArrow':'\u2190','Leftarrow':'\u21D0','LeftArrowRightArrow':'\u21C6','leftarrowtail':'\u21A2','LeftCeiling':'\u2308','LeftDoubleBracket':'\u27E6','LeftDownTeeVector':'\u2961','LeftDownVectorBar':'\u2959','LeftDownVector':'\u21C3','LeftFloor':'\u230A','leftharpoondown':'\u21BD','leftharpoonup':'\u21BC','leftleftarrows':'\u21C7','leftrightarrow':'\u2194','LeftRightArrow':'\u2194','Leftrightarrow':'\u21D4','leftrightarrows':'\u21C6','leftrightharpoons':'\u21CB','leftrightsquigarrow':'\u21AD','LeftRightVector':'\u294E','LeftTeeArrow':'\u21A4','LeftTee':'\u22A3','LeftTeeVector':'\u295A','leftthreetimes':'\u22CB','LeftTriangleBar':'\u29CF','LeftTriangle':'\u22B2','LeftTriangleEqual':'\u22B4','LeftUpDownVector':'\u2951','LeftUpTeeVector':'\u2960','LeftUpVectorBar':'\u2958','LeftUpVector':'\u21BF','LeftVectorBar':'\u2952','LeftVector':'\u21BC','lEg':'\u2A8B','leg':'\u22DA','leq':'\u2264','leqq':'\u2266','leqslant':'\u2A7D','lescc':'\u2AA8','les':'\u2A7D','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','llarr':'\u21C7','ll':'\u226A','Ll':'\u22D8','llcorner':'\u231E','Lleftarrow':'\u21DA','llhard':'\u296B','lltri':'\u25FA','Lmidot':'\u013F','lmidot':'\u0140','lmoustache':'\u23B0','lmoust':'\u23B0','lnap':'\u2A89','lnapprox':'\u2A89','lne':'\u2A87','lnE':'\u2268','lneq':'\u2A87','lneqq':'\u2268','lnsim':'\u22E6','loang':'\u27EC','loarr':'\u21FD','lobrk':'\u27E6','longleftarrow':'\u27F5','LongLeftArrow':'\u27F5','Longleftarrow':'\u27F8','longleftrightarrow':'\u27F7','LongLeftRightArrow':'\u27F7','Longleftrightarrow':'\u27FA','longmapsto':'\u27FC','longrightarrow':'\u27F6','LongRightArrow':'\u27F6','Longrightarrow':'\u27F9','looparrowleft':'\u21AB','looparrowright':'\u21AC','lopar':'\u2985','Lopf':'\uD835\uDD43','lopf':'\uD835\uDD5D','loplus':'\u2A2D','lotimes':'\u2A34','lowast':'\u2217','lowbar':'_','LowerLeftArrow':'\u2199','LowerRightArrow':'\u2198','loz':'\u25CA','lozenge':'\u25CA','lozf':'\u29EB','lpar':'(','lparlt':'\u2993','lrarr':'\u21C6','lrcorner':'\u231F','lrhar':'\u21CB','lrhard':'\u296D','lrm':'\u200E','lrtri':'\u22BF','lsaquo':'\u2039','lscr':'\uD835\uDCC1','Lscr':'\u2112','lsh':'\u21B0','Lsh':'\u21B0','lsim':'\u2272','lsime':'\u2A8D','lsimg':'\u2A8F','lsqb':'[','lsquo':'\u2018','lsquor':'\u201A','Lstrok':'\u0141','lstrok':'\u0142','ltcc':'\u2AA6','ltcir':'\u2A79','lt':'<','LT':'<','Lt':'\u226A','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':'\xAF','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':'\xB5','midast':'*','midcir':'\u2AF0','mid':'\u2223','middot':'\xB7','minusb':'\u229F','minus':'\u2212','minusd':'\u2238','minusdu':'\u2A2A','MinusPlus':'\u2213','mlcp':'\u2ADB','mldr':'\u2026','mnplus':'\u2213','models':'\u22A7','Mopf':'\uD835\uDD44','mopf':'\uD835\uDD5E','mp':'\u2213','mscr':'\uD835\uDCC2','Mscr':'\u2133','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','natural':'\u266E','naturals':'\u2115','natur':'\u266E','nbsp':'\xA0','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','nearhk':'\u2924','nearr':'\u2197','neArr':'\u21D7','nearrow':'\u2197','ne':'\u2260','nedot':'\u2250\u0338','NegativeMediumSpace':'\u200B','NegativeThickSpace':'\u200B','NegativeThinSpace':'\u200B','NegativeVeryThinSpace':'\u200B','nequiv':'\u2262','nesear':'\u2928','nesim':'\u2242\u0338','NestedGreaterGreater':'\u226B','NestedLessLess':'\u226A','NewLine':'\n','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':'\u21AE','nhArr':'\u21CE','nhpar':'\u2AF2','ni':'\u220B','nis':'\u22FC','nisd':'\u22FA','niv':'\u220B','NJcy':'\u040A','njcy':'\u045A','nlarr':'\u219A','nlArr':'\u21CD','nldr':'\u2025','nlE':'\u2266\u0338','nle':'\u2270','nleftarrow':'\u219A','nLeftarrow':'\u21CD','nleftrightarrow':'\u21AE','nLeftrightarrow':'\u21CE','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':'\xA0','nopf':'\uD835\uDD5F','Nopf':'\u2115','Not':'\u2AEC','not':'\xAC','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','NotLeftTriangleBar':'\u29CF\u0338','NotLeftTriangle':'\u22EA','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','NotRightTriangleBar':'\u29D0\u0338','NotRightTriangle':'\u22EB','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','nparallel':'\u2226','npar':'\u2226','nparsl':'\u2AFD\u20E5','npart':'\u2202\u0338','npolint':'\u2A14','npr':'\u2280','nprcue':'\u22E0','nprec':'\u2280','npreceq':'\u2AAF\u0338','npre':'\u2AAF\u0338','nrarrc':'\u2933\u0338','nrarr':'\u219B','nrArr':'\u21CF','nrarrw':'\u219D\u0338','nrightarrow':'\u219B','nRightarrow':'\u21CF','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':'\xD1','ntilde':'\xF1','ntlg':'\u2278','ntriangleleft':'\u22EA','ntrianglelefteq':'\u22EC','ntriangleright':'\u22EB','ntrianglerighteq':'\u22ED','Nu':'\u039D','nu':'\u03BD','num':'#','numero':'\u2116','numsp':'\u2007','nvap':'\u224D\u20D2','nvdash':'\u22AC','nvDash':'\u22AD','nVdash':'\u22AE','nVDash':'\u22AF','nvge':'\u2265\u20D2','nvgt':'>\u20D2','nvHarr':'\u2904','nvinfin':'\u29DE','nvlArr':'\u2902','nvle':'\u2264\u20D2','nvlt':'<\u20D2','nvltrie':'\u22B4\u20D2','nvrArr':'\u2903','nvrtrie':'\u22B5\u20D2','nvsim':'\u223C\u20D2','nwarhk':'\u2923','nwarr':'\u2196','nwArr':'\u21D6','nwarrow':'\u2196','nwnear':'\u2927','Oacute':'\xD3','oacute':'\xF3','oast':'\u229B','Ocirc':'\xD4','ocirc':'\xF4','ocir':'\u229A','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':'\xD2','ograve':'\xF2','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','orarr':'\u21BB','Or':'\u2A54','or':'\u2228','ord':'\u2A5D','order':'\u2134','orderof':'\u2134','ordf':'\xAA','ordm':'\xBA','origof':'\u22B6','oror':'\u2A56','orslope':'\u2A57','orv':'\u2A5B','oS':'\u24C8','Oscr':'\uD835\uDCAA','oscr':'\u2134','Oslash':'\xD8','oslash':'\xF8','osol':'\u2298','Otilde':'\xD5','otilde':'\xF5','otimesas':'\u2A36','Otimes':'\u2A37','otimes':'\u2297','Ouml':'\xD6','ouml':'\xF6','ovbar':'\u233D','OverBar':'\u203E','OverBrace':'\u23DE','OverBracket':'\u23B4','OverParenthesis':'\u23DC','para':'\xB6','parallel':'\u2225','par':'\u2225','parsim':'\u2AF3','parsl':'\u2AFD','part':'\u2202','PartialD':'\u2202','Pcy':'\u041F','pcy':'\u043F','percnt':'%','period':'.','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','plusacir':'\u2A23','plusb':'\u229E','pluscir':'\u2A22','plus':'+','plusdo':'\u2214','plusdu':'\u2A25','pluse':'\u2A72','PlusMinus':'\xB1','plusmn':'\xB1','plussim':'\u2A26','plustwo':'\u2A27','pm':'\xB1','Poincareplane':'\u210C','pointint':'\u2A15','popf':'\uD835\uDD61','Popf':'\u2119','pound':'\xA3','prap':'\u2AB7','Pr':'\u2ABB','pr':'\u227A','prcue':'\u227C','precapprox':'\u2AB7','prec':'\u227A','preccurlyeq':'\u227C','Precedes':'\u227A','PrecedesEqual':'\u2AAF','PrecedesSlantEqual':'\u227C','PrecedesTilde':'\u227E','preceq':'\u2AAF','precnapprox':'\u2AB9','precneqq':'\u2AB5','precnsim':'\u22E8','pre':'\u2AAF','prE':'\u2AB3','precsim':'\u227E','prime':'\u2032','Prime':'\u2033','primes':'\u2119','prnap':'\u2AB9','prnE':'\u2AB5','prnsim':'\u22E8','prod':'\u220F','Product':'\u220F','profalar':'\u232E','profline':'\u2312','profsurf':'\u2313','prop':'\u221D','Proportional':'\u221D','Proportion':'\u2237','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':'\uD835\uDD62','Qopf':'\u211A','qprime':'\u2057','Qscr':'\uD835\uDCAC','qscr':'\uD835\uDCC6','quaternions':'\u210D','quatint':'\u2A16','quest':'?','questeq':'\u225F','quot':'"','QUOT':'"','rAarr':'\u21DB','race':'\u223D\u0331','Racute':'\u0154','racute':'\u0155','radic':'\u221A','raemptyv':'\u29B3','rang':'\u27E9','Rang':'\u27EB','rangd':'\u2992','range':'\u29A5','rangle':'\u27E9','raquo':'\xBB','rarrap':'\u2975','rarrb':'\u21E5','rarrbfs':'\u2920','rarrc':'\u2933','rarr':'\u2192','Rarr':'\u21A0','rArr':'\u21D2','rarrfs':'\u291E','rarrhk':'\u21AA','rarrlp':'\u21AC','rarrpl':'\u2945','rarrsim':'\u2974','Rarrtl':'\u2916','rarrtl':'\u21A3','rarrw':'\u219D','ratail':'\u291A','rAtail':'\u291C','ratio':'\u2236','rationals':'\u211A','rbarr':'\u290D','rBarr':'\u290F','RBarr':'\u2910','rbbrk':'\u2773','rbrace':'}','rbrack':']','rbrke':'\u298C','rbrksld':'\u298E','rbrkslu':'\u2990','Rcaron':'\u0158','rcaron':'\u0159','Rcedil':'\u0156','rcedil':'\u0157','rceil':'\u2309','rcub':'}','Rcy':'\u0420','rcy':'\u0440','rdca':'\u2937','rdldhar':'\u2969','rdquo':'\u201D','rdquor':'\u201D','rdsh':'\u21B3','real':'\u211C','realine':'\u211B','realpart':'\u211C','reals':'\u211D','Re':'\u211C','rect':'\u25AD','reg':'\xAE','REG':'\xAE','ReverseElement':'\u220B','ReverseEquilibrium':'\u21CB','ReverseUpEquilibrium':'\u296F','rfisht':'\u297D','rfloor':'\u230B','rfr':'\uD835\uDD2F','Rfr':'\u211C','rHar':'\u2964','rhard':'\u21C1','rharu':'\u21C0','rharul':'\u296C','Rho':'\u03A1','rho':'\u03C1','rhov':'\u03F1','RightAngleBracket':'\u27E9','RightArrowBar':'\u21E5','rightarrow':'\u2192','RightArrow':'\u2192','Rightarrow':'\u21D2','RightArrowLeftArrow':'\u21C4','rightarrowtail':'\u21A3','RightCeiling':'\u2309','RightDoubleBracket':'\u27E7','RightDownTeeVector':'\u295D','RightDownVectorBar':'\u2955','RightDownVector':'\u21C2','RightFloor':'\u230B','rightharpoondown':'\u21C1','rightharpoonup':'\u21C0','rightleftarrows':'\u21C4','rightleftharpoons':'\u21CC','rightrightarrows':'\u21C9','rightsquigarrow':'\u219D','RightTeeArrow':'\u21A6','RightTee':'\u22A2','RightTeeVector':'\u295B','rightthreetimes':'\u22CC','RightTriangleBar':'\u29D0','RightTriangle':'\u22B3','RightTriangleEqual':'\u22B5','RightUpDownVector':'\u294F','RightUpTeeVector':'\u295C','RightUpVectorBar':'\u2954','RightUpVector':'\u21BE','RightVectorBar':'\u2953','RightVector':'\u21C0','ring':'\u02DA','risingdotseq':'\u2253','rlarr':'\u21C4','rlhar':'\u21CC','rlm':'\u200F','rmoustache':'\u23B1','rmoust':'\u23B1','rnmid':'\u2AEE','roang':'\u27ED','roarr':'\u21FE','robrk':'\u27E7','ropar':'\u2986','ropf':'\uD835\uDD63','Ropf':'\u211D','roplus':'\u2A2E','rotimes':'\u2A35','RoundImplies':'\u2970','rpar':')','rpargt':'\u2994','rppolint':'\u2A12','rrarr':'\u21C9','Rrightarrow':'\u21DB','rsaquo':'\u203A','rscr':'\uD835\uDCC7','Rscr':'\u211B','rsh':'\u21B1','Rsh':'\u21B1','rsqb':']','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','scap':'\u2AB8','Scaron':'\u0160','scaron':'\u0161','Sc':'\u2ABC','sc':'\u227B','sccue':'\u227D','sce':'\u2AB0','scE':'\u2AB4','Scedil':'\u015E','scedil':'\u015F','Scirc':'\u015C','scirc':'\u015D','scnap':'\u2ABA','scnE':'\u2AB6','scnsim':'\u22E9','scpolint':'\u2A13','scsim':'\u227F','Scy':'\u0421','scy':'\u0441','sdotb':'\u22A1','sdot':'\u22C5','sdote':'\u2A66','searhk':'\u2925','searr':'\u2198','seArr':'\u21D8','searrow':'\u2198','sect':'\xA7','semi':';','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':'\xAD','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','solbar':'\u233F','solb':'\u29C4','sol':'/','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','square':'\u25A1','Square':'\u25A1','SquareIntersection':'\u2293','SquareSubset':'\u228F','SquareSubsetEqual':'\u2291','SquareSuperset':'\u2290','SquareSupersetEqual':'\u2292','SquareUnion':'\u2294','squarf':'\u25AA','squ':'\u25A1','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':'\xAF','sub':'\u2282','Sub':'\u22D0','subdot':'\u2ABD','subE':'\u2AC5','sube':'\u2286','subedot':'\u2AC3','submult':'\u2AC1','subnE':'\u2ACB','subne':'\u228A','subplus':'\u2ABF','subrarr':'\u2979','subset':'\u2282','Subset':'\u22D0','subseteq':'\u2286','subseteqq':'\u2AC5','SubsetEqual':'\u2286','subsetneq':'\u228A','subsetneqq':'\u2ACB','subsim':'\u2AC7','subsub':'\u2AD5','subsup':'\u2AD3','succapprox':'\u2AB8','succ':'\u227B','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','sup1':'\xB9','sup2':'\xB2','sup3':'\xB3','sup':'\u2283','Sup':'\u22D1','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':'\u2283','Supset':'\u22D1','supseteq':'\u2287','supseteqq':'\u2AC6','supsetneq':'\u228B','supsetneqq':'\u2ACC','supsim':'\u2AC8','supsub':'\u2AD4','supsup':'\u2AD6','swarhk':'\u2926','swarr':'\u2199','swArr':'\u21D9','swarrow':'\u2199','swnwar':'\u292A','szlig':'\xDF','Tab':'\t','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','ThinSpace':'\u2009','thinsp':'\u2009','thkap':'\u2248','thksim':'\u223C','THORN':'\xDE','thorn':'\xFE','tilde':'\u02DC','Tilde':'\u223C','TildeEqual':'\u2243','TildeFullEqual':'\u2245','TildeTilde':'\u2248','timesbar':'\u2A31','timesb':'\u22A0','times':'\xD7','timesd':'\u2A30','tint':'\u222D','toea':'\u2928','topbot':'\u2336','topcir':'\u2AF1','top':'\u22A4','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':'\xDA','uacute':'\xFA','uarr':'\u2191','Uarr':'\u219F','uArr':'\u21D1','Uarrocir':'\u2949','Ubrcy':'\u040E','ubrcy':'\u045E','Ubreve':'\u016C','ubreve':'\u016D','Ucirc':'\xDB','ucirc':'\xFB','Ucy':'\u0423','ucy':'\u0443','udarr':'\u21C5','Udblac':'\u0170','udblac':'\u0171','udhar':'\u296E','ufisht':'\u297E','Ufr':'\uD835\uDD18','ufr':'\uD835\uDD32','Ugrave':'\xD9','ugrave':'\xF9','uHar':'\u2963','uharl':'\u21BF','uharr':'\u21BE','uhblk':'\u2580','ulcorn':'\u231C','ulcorner':'\u231C','ulcrop':'\u230F','ultri':'\u25F8','Umacr':'\u016A','umacr':'\u016B','uml':'\xA8','UnderBar':'_','UnderBrace':'\u23DF','UnderBracket':'\u23B5','UnderParenthesis':'\u23DD','Union':'\u22C3','UnionPlus':'\u228E','Uogon':'\u0172','uogon':'\u0173','Uopf':'\uD835\uDD4C','uopf':'\uD835\uDD66','UpArrowBar':'\u2912','uparrow':'\u2191','UpArrow':'\u2191','Uparrow':'\u21D1','UpArrowDownArrow':'\u21C5','updownarrow':'\u2195','UpDownArrow':'\u2195','Updownarrow':'\u21D5','UpEquilibrium':'\u296E','upharpoonleft':'\u21BF','upharpoonright':'\u21BE','uplus':'\u228E','UpperLeftArrow':'\u2196','UpperRightArrow':'\u2197','upsi':'\u03C5','Upsi':'\u03D2','upsih':'\u03D2','Upsilon':'\u03A5','upsilon':'\u03C5','UpTeeArrow':'\u21A5','UpTee':'\u22A5','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':'\xDC','uuml':'\xFC','uwangle':'\u29A7','vangrt':'\u299C','varepsilon':'\u03F5','varkappa':'\u03F0','varnothing':'\u2205','varphi':'\u03D5','varpi':'\u03D6','varpropto':'\u221D','varr':'\u2195','vArr':'\u21D5','varrho':'\u03F1','varsigma':'\u03C2','varsubsetneq':'\u228A\uFE00','varsubsetneqq':'\u2ACB\uFE00','varsupsetneq':'\u228B\uFE00','varsupsetneqq':'\u2ACC\uFE00','vartheta':'\u03D1','vartriangleleft':'\u22B2','vartriangleright':'\u22B3','vBar':'\u2AE8','Vbar':'\u2AEB','vBarv':'\u2AE9','Vcy':'\u0412','vcy':'\u0432','vdash':'\u22A2','vDash':'\u22A8','Vdash':'\u22A9','VDash':'\u22AB','Vdashl':'\u2AE6','veebar':'\u22BB','vee':'\u2228','Vee':'\u22C1','veeeq':'\u225A','vellip':'\u22EE','verbar':'|','Verbar':'\u2016','vert':'|','Vert':'\u2016','VerticalBar':'\u2223','VerticalLine':'|','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':'\u2227','Wedge':'\u22C0','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':'\u27F7','xhArr':'\u27FA','Xi':'\u039E','xi':'\u03BE','xlarr':'\u27F5','xlArr':'\u27F8','xmap':'\u27FC','xnis':'\u22FB','xodot':'\u2A00','Xopf':'\uD835\uDD4F','xopf':'\uD835\uDD69','xoplus':'\u2A01','xotime':'\u2A02','xrarr':'\u27F6','xrArr':'\u27F9','Xscr':'\uD835\uDCB3','xscr':'\uD835\uDCCD','xsqcup':'\u2A06','xuplus':'\u2A04','xutri':'\u25B3','xvee':'\u22C1','xwedge':'\u22C0','Yacute':'\xDD','yacute':'\xFD','YAcy':'\u042F','yacy':'\u044F','Ycirc':'\u0176','ycirc':'\u0177','Ycy':'\u042B','ycy':'\u044B','yen':'\xA5','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':'\xFF','Yuml':'\u0178','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':'\uD835\uDD37','Zfr':'\u2128','ZHcy':'\u0416','zhcy':'\u0436','zigrarr':'\u21DD','zopf':'\uD835\uDD6B','Zopf':'\u2124','Zscr':'\uD835\uDCB5','zscr':'\uD835\uDCCF','zwj':'\u200D','zwnj':'\u200C'};
|
56
|
+
var decodeMapLegacy = {'Aacute':'\xC1','aacute':'\xE1','Acirc':'\xC2','acirc':'\xE2','acute':'\xB4','AElig':'\xC6','aelig':'\xE6','Agrave':'\xC0','agrave':'\xE0','amp':'&','AMP':'&','Aring':'\xC5','aring':'\xE5','Atilde':'\xC3','atilde':'\xE3','Auml':'\xC4','auml':'\xE4','brvbar':'\xA6','Ccedil':'\xC7','ccedil':'\xE7','cedil':'\xB8','cent':'\xA2','copy':'\xA9','COPY':'\xA9','curren':'\xA4','deg':'\xB0','divide':'\xF7','Eacute':'\xC9','eacute':'\xE9','Ecirc':'\xCA','ecirc':'\xEA','Egrave':'\xC8','egrave':'\xE8','ETH':'\xD0','eth':'\xF0','Euml':'\xCB','euml':'\xEB','frac12':'\xBD','frac14':'\xBC','frac34':'\xBE','gt':'>','GT':'>','Iacute':'\xCD','iacute':'\xED','Icirc':'\xCE','icirc':'\xEE','iexcl':'\xA1','Igrave':'\xCC','igrave':'\xEC','iquest':'\xBF','Iuml':'\xCF','iuml':'\xEF','laquo':'\xAB','lt':'<','LT':'<','macr':'\xAF','micro':'\xB5','middot':'\xB7','nbsp':'\xA0','not':'\xAC','Ntilde':'\xD1','ntilde':'\xF1','Oacute':'\xD3','oacute':'\xF3','Ocirc':'\xD4','ocirc':'\xF4','Ograve':'\xD2','ograve':'\xF2','ordf':'\xAA','ordm':'\xBA','Oslash':'\xD8','oslash':'\xF8','Otilde':'\xD5','otilde':'\xF5','Ouml':'\xD6','ouml':'\xF6','para':'\xB6','plusmn':'\xB1','pound':'\xA3','quot':'"','QUOT':'"','raquo':'\xBB','reg':'\xAE','REG':'\xAE','sect':'\xA7','shy':'\xAD','sup1':'\xB9','sup2':'\xB2','sup3':'\xB3','szlig':'\xDF','THORN':'\xDE','thorn':'\xFE','times':'\xD7','Uacute':'\xDA','uacute':'\xFA','Ucirc':'\xDB','ucirc':'\xFB','Ugrave':'\xD9','ugrave':'\xF9','uml':'\xA8','Uuml':'\xDC','uuml':'\xFC','Yacute':'\xDD','yacute':'\xFD','yen':'\xA5','yuml':'\xFF'};
|
57
|
+
var decodeMapNumeric = {'0':'\uFFFD','128':'\u20AC','130':'\u201A','131':'\u0192','132':'\u201E','133':'\u2026','134':'\u2020','135':'\u2021','136':'\u02C6','137':'\u2030','138':'\u0160','139':'\u2039','140':'\u0152','142':'\u017D','145':'\u2018','146':'\u2019','147':'\u201C','148':'\u201D','149':'\u2022','150':'\u2013','151':'\u2014','152':'\u02DC','153':'\u2122','154':'\u0161','155':'\u203A','156':'\u0153','158':'\u017E','159':'\u0178'};
|
58
|
+
var invalidReferenceCodePoints = [1,2,3,4,5,6,7,8,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,64976,64977,64978,64979,64980,64981,64982,64983,64984,64985,64986,64987,64988,64989,64990,64991,64992,64993,64994,64995,64996,64997,64998,64999,65000,65001,65002,65003,65004,65005,65006,65007,65534,65535,131070,131071,196606,196607,262142,262143,327678,327679,393214,393215,458750,458751,524286,524287,589822,589823,655358,655359,720894,720895,786430,786431,851966,851967,917502,917503,983038,983039,1048574,1048575,1114110,1114111];
|
59
|
+
|
60
|
+
/*--------------------------------------------------------------------------*/
|
61
|
+
|
62
|
+
var stringFromCharCode = String.fromCharCode;
|
63
|
+
|
64
|
+
var object = {};
|
65
|
+
var hasOwnProperty = object.hasOwnProperty;
|
66
|
+
var has = function(object, propertyName) {
|
67
|
+
return hasOwnProperty.call(object, propertyName);
|
68
|
+
};
|
69
|
+
|
70
|
+
var contains = function(array, value) {
|
71
|
+
var index = -1;
|
72
|
+
var length = array.length;
|
73
|
+
while (++index < length) {
|
74
|
+
if (array[index] == value) {
|
75
|
+
return true;
|
76
|
+
}
|
77
|
+
}
|
78
|
+
return false;
|
79
|
+
};
|
80
|
+
|
81
|
+
var merge = function(options, defaults) {
|
82
|
+
if (!options) {
|
83
|
+
return defaults;
|
84
|
+
}
|
85
|
+
var result = {};
|
86
|
+
var key;
|
87
|
+
for (key in defaults) {
|
88
|
+
// A `hasOwnProperty` check is not needed here, since only recognized
|
89
|
+
// option names are used anyway. Any others are ignored.
|
90
|
+
result[key] = has(options, key) ? options[key] : defaults[key];
|
91
|
+
}
|
92
|
+
return result;
|
93
|
+
};
|
94
|
+
|
95
|
+
// Modified version of `ucs2encode`; see http://mths.be/punycode.
|
96
|
+
var codePointToSymbol = function(codePoint, strict) {
|
97
|
+
var output = '';
|
98
|
+
if ((codePoint >= 0xD800 && codePoint <= 0xDFFF) || codePoint > 0x10FFFF) {
|
99
|
+
// See issue #4:
|
100
|
+
// “Otherwise, if the number is in the range 0xD800 to 0xDFFF or is
|
101
|
+
// greater than 0x10FFFF, then this is a parse error. Return a U+FFFD
|
102
|
+
// REPLACEMENT CHARACTER.”
|
103
|
+
if (strict) {
|
104
|
+
parseError('character reference outside the permissible Unicode range');
|
105
|
+
}
|
106
|
+
return '\uFFFD';
|
107
|
+
}
|
108
|
+
if (has(decodeMapNumeric, codePoint)) {
|
109
|
+
if (strict) {
|
110
|
+
parseError('disallowed character reference');
|
111
|
+
}
|
112
|
+
return decodeMapNumeric[codePoint];
|
113
|
+
}
|
114
|
+
if (strict && contains(invalidReferenceCodePoints, codePoint)) {
|
115
|
+
parseError('disallowed character reference');
|
116
|
+
}
|
117
|
+
if (codePoint > 0xFFFF) {
|
118
|
+
codePoint -= 0x10000;
|
119
|
+
output += stringFromCharCode(codePoint >>> 10 & 0x3FF | 0xD800);
|
120
|
+
codePoint = 0xDC00 | codePoint & 0x3FF;
|
121
|
+
}
|
122
|
+
output += stringFromCharCode(codePoint);
|
123
|
+
return output;
|
124
|
+
};
|
125
|
+
|
126
|
+
var hexEscape = function(symbol) {
|
127
|
+
return '&#x' + symbol.charCodeAt(0).toString(16).toUpperCase() + ';';
|
128
|
+
};
|
129
|
+
|
130
|
+
var parseError = function(message) {
|
131
|
+
throw Error('Parse error: ' + message);
|
132
|
+
};
|
133
|
+
|
134
|
+
/*--------------------------------------------------------------------------*/
|
135
|
+
|
136
|
+
var encode = function(string, options) {
|
137
|
+
options = merge(options, encode.options);
|
138
|
+
var strict = options.strict;
|
139
|
+
if (strict && regexInvalidRawCodePoint.test(string)) {
|
140
|
+
parseError('forbidden code point');
|
141
|
+
}
|
142
|
+
var encodeEverything = options.encodeEverything;
|
143
|
+
var useNamedReferences = options.useNamedReferences;
|
144
|
+
var allowUnsafeSymbols = options.allowUnsafeSymbols;
|
145
|
+
if (encodeEverything) {
|
146
|
+
// Encode ASCII symbols.
|
147
|
+
string = string.replace(regexAsciiWhitelist, function(symbol) {
|
148
|
+
// Use named references if requested & possible.
|
149
|
+
if (useNamedReferences && has(encodeMap, symbol)) {
|
150
|
+
return '&' + encodeMap[symbol] + ';';
|
151
|
+
}
|
152
|
+
return hexEscape(symbol);
|
153
|
+
});
|
154
|
+
// Shorten a few escapes that represent two symbols, of which at least one
|
155
|
+
// is within the ASCII range.
|
156
|
+
if (useNamedReferences) {
|
157
|
+
string = string
|
158
|
+
.replace(/>\u20D2/g, '>⃒')
|
159
|
+
.replace(/<\u20D2/g, '<⃒')
|
160
|
+
.replace(/fj/g, 'fj');
|
161
|
+
}
|
162
|
+
// Encode non-ASCII symbols.
|
163
|
+
if (useNamedReferences) {
|
164
|
+
// Encode non-ASCII symbols that can be replaced with a named reference.
|
165
|
+
string = string.replace(regexEncodeNonAscii, function(string) {
|
166
|
+
// Note: there is no need to check `has(encodeMap, string)` here.
|
167
|
+
return '&' + encodeMap[string] + ';';
|
168
|
+
});
|
169
|
+
}
|
170
|
+
// Note: any remaining non-ASCII symbols are handled outside of the `if`.
|
171
|
+
} else if (useNamedReferences) {
|
172
|
+
// Apply named character references.
|
173
|
+
// Encode `<>"'&` using named character references.
|
174
|
+
if (!allowUnsafeSymbols) {
|
175
|
+
string = string.replace(regexEscape, function(string) {
|
176
|
+
return '&' + encodeMap[string] + ';'; // no need to check `has()` here
|
177
|
+
});
|
178
|
+
}
|
179
|
+
// Shorten escapes that represent two symbols, of which at least one is
|
180
|
+
// `<>"'&`.
|
181
|
+
string = string
|
182
|
+
.replace(/>\u20D2/g, '>⃒')
|
183
|
+
.replace(/<\u20D2/g, '<⃒');
|
184
|
+
// Encode non-ASCII symbols that can be replaced with a named reference.
|
185
|
+
string = string.replace(regexEncodeNonAscii, function(string) {
|
186
|
+
// Note: there is no need to check `has(encodeMap, string)` here.
|
187
|
+
return '&' + encodeMap[string] + ';';
|
188
|
+
});
|
189
|
+
} else if (!allowUnsafeSymbols) {
|
190
|
+
// Encode `<>"'&` using hexadecimal escapes, now that they’re not handled
|
191
|
+
// using named character references.
|
192
|
+
string = string.replace(regexEscape, hexEscape);
|
193
|
+
}
|
194
|
+
return string
|
195
|
+
// Encode astral symbols.
|
196
|
+
.replace(regexAstralSymbols, function($0) {
|
197
|
+
// https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
|
198
|
+
var high = $0.charCodeAt(0);
|
199
|
+
var low = $0.charCodeAt(1);
|
200
|
+
var codePoint = (high - 0xD800) * 0x400 + low - 0xDC00 + 0x10000;
|
201
|
+
return '&#x' + codePoint.toString(16).toUpperCase() + ';';
|
202
|
+
})
|
203
|
+
// Encode any remaining BMP symbols that are not printable ASCII symbols
|
204
|
+
// using a hexadecimal escape.
|
205
|
+
.replace(regexBmpWhitelist, hexEscape);
|
206
|
+
};
|
207
|
+
// Expose default options (so they can be overridden globally).
|
208
|
+
encode.options = {
|
209
|
+
'allowUnsafeSymbols': false,
|
210
|
+
'encodeEverything': false,
|
211
|
+
'strict': false,
|
212
|
+
'useNamedReferences': false
|
213
|
+
};
|
214
|
+
|
215
|
+
var decode = function(html, options) {
|
216
|
+
options = merge(options, decode.options);
|
217
|
+
var strict = options.strict;
|
218
|
+
if (strict && regexInvalidEntity.test(html)) {
|
219
|
+
parseError('malformed character reference');
|
220
|
+
}
|
221
|
+
return html.replace(regexDecode, function($0, $1, $2, $3, $4, $5, $6, $7) {
|
222
|
+
var codePoint;
|
223
|
+
var semicolon;
|
224
|
+
var hexDigits;
|
225
|
+
var reference;
|
226
|
+
var next;
|
227
|
+
if ($1) {
|
228
|
+
// Decode decimal escapes, e.g. `𝌆`.
|
229
|
+
codePoint = $1;
|
230
|
+
semicolon = $2;
|
231
|
+
if (strict && !semicolon) {
|
232
|
+
parseError('character reference was not terminated by a semicolon');
|
233
|
+
}
|
234
|
+
return codePointToSymbol(codePoint, strict);
|
235
|
+
}
|
236
|
+
if ($3) {
|
237
|
+
// Decode hexadecimal escapes, e.g. `𝌆`.
|
238
|
+
hexDigits = $3;
|
239
|
+
semicolon = $4;
|
240
|
+
if (strict && !semicolon) {
|
241
|
+
parseError('character reference was not terminated by a semicolon');
|
242
|
+
}
|
243
|
+
codePoint = parseInt(hexDigits, 16);
|
244
|
+
return codePointToSymbol(codePoint, strict);
|
245
|
+
}
|
246
|
+
if ($5) {
|
247
|
+
// Decode named character references with trailing `;`, e.g. `©`.
|
248
|
+
reference = $5;
|
249
|
+
if (has(decodeMap, reference)) {
|
250
|
+
return decodeMap[reference];
|
251
|
+
} else {
|
252
|
+
// Ambiguous ampersand; see http://mths.be/notes/ambiguous-ampersands.
|
253
|
+
if (strict) {
|
254
|
+
parseError(
|
255
|
+
'named character reference was not terminated by a semicolon'
|
256
|
+
);
|
257
|
+
}
|
258
|
+
return $0;
|
259
|
+
}
|
260
|
+
}
|
261
|
+
// If we’re still here, it’s a legacy reference for sure. No need for an
|
262
|
+
// extra `if` check.
|
263
|
+
// Decode named character references without trailing `;`, e.g. `&`
|
264
|
+
// This is only a parse error if it gets converted to `&`, or if it is
|
265
|
+
// followed by `=` in an attribute context.
|
266
|
+
reference = $6;
|
267
|
+
next = $7;
|
268
|
+
if (next && options.isAttributeValue) {
|
269
|
+
if (strict && next == '=') {
|
270
|
+
parseError('`&` did not start a character reference');
|
271
|
+
}
|
272
|
+
return $0;
|
273
|
+
} else {
|
274
|
+
if (strict) {
|
275
|
+
parseError(
|
276
|
+
'named character reference was not terminated by a semicolon'
|
277
|
+
);
|
278
|
+
}
|
279
|
+
// Note: there is no need to check `has(decodeMapLegacy, reference)`.
|
280
|
+
return decodeMapLegacy[reference] + (next || '');
|
281
|
+
}
|
282
|
+
});
|
283
|
+
};
|
284
|
+
// Expose default options (so they can be overridden globally).
|
285
|
+
decode.options = {
|
286
|
+
'isAttributeValue': false,
|
287
|
+
'strict': false
|
288
|
+
};
|
289
|
+
|
290
|
+
var escape = function(string) {
|
291
|
+
return string.replace(regexEscape, function($0) {
|
292
|
+
// Note: there is no need to check `has(escapeMap, $0)` here.
|
293
|
+
return escapeMap[$0];
|
294
|
+
});
|
295
|
+
};
|
296
|
+
|
297
|
+
/*--------------------------------------------------------------------------*/
|
298
|
+
|
299
|
+
var he = {
|
300
|
+
'version': '0.5.0',
|
301
|
+
'encode': encode,
|
302
|
+
'decode': decode,
|
303
|
+
'escape': escape,
|
304
|
+
'unescape': decode
|
305
|
+
};
|
306
|
+
|
307
|
+
// Some AMD build optimizers, like r.js, check for specific condition patterns
|
308
|
+
// like the following:
|
309
|
+
if (
|
310
|
+
typeof define == 'function' &&
|
311
|
+
typeof define.amd == 'object' &&
|
312
|
+
define.amd
|
313
|
+
) {
|
314
|
+
define(function() {
|
315
|
+
return he;
|
316
|
+
});
|
317
|
+
} else if (freeExports && !freeExports.nodeType) {
|
318
|
+
if (freeModule) { // in Node.js or RingoJS v0.8.0+
|
319
|
+
freeModule.exports = he;
|
320
|
+
} else { // in Narwhal or RingoJS v0.7.0-
|
321
|
+
for (var key in he) {
|
322
|
+
has(he, key) && (freeExports[key] = he[key]);
|
323
|
+
}
|
324
|
+
}
|
325
|
+
} else { // in Rhino or a web browser
|
326
|
+
root.he = he;
|
327
|
+
}
|
328
|
+
|
329
|
+
}(this));
|
@@ -2,40 +2,125 @@
|
|
2
2
|
// Copyright (c) 2009-2010 Dominic Baggott
|
3
3
|
// Copyright (c) 2009-2010 Ash Berlin
|
4
4
|
// Copyright (c) 2011 Christoph Dorn <christoph@christophdorn.com> (http://www.christophdorn.com)
|
5
|
+
// Date: 2013-09-15T16:12Z
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
7
|
+
(function(expose) {
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
var MarkdownHelpers = {};
|
13
|
+
|
14
|
+
// For Spidermonkey based engines
|
15
|
+
function mk_block_toSource() {
|
16
|
+
return "Markdown.mk_block( " +
|
17
|
+
uneval(this.toString()) +
|
18
|
+
", " +
|
19
|
+
uneval(this.trailing) +
|
20
|
+
", " +
|
21
|
+
uneval(this.lineNumber) +
|
22
|
+
" )";
|
23
|
+
}
|
24
|
+
|
25
|
+
// node
|
26
|
+
function mk_block_inspect() {
|
27
|
+
var util = require("util");
|
28
|
+
return "Markdown.mk_block( " +
|
29
|
+
util.inspect(this.toString()) +
|
30
|
+
", " +
|
31
|
+
util.inspect(this.trailing) +
|
32
|
+
", " +
|
33
|
+
util.inspect(this.lineNumber) +
|
34
|
+
" )";
|
35
|
+
|
36
|
+
}
|
37
|
+
|
38
|
+
MarkdownHelpers.mk_block = function(block, trail, line) {
|
39
|
+
// Be helpful for default case in tests.
|
40
|
+
if ( arguments.length === 1 )
|
41
|
+
trail = "\n\n";
|
42
|
+
|
43
|
+
// We actually need a String object, not a string primitive
|
44
|
+
/* jshint -W053 */
|
45
|
+
var s = new String(block);
|
46
|
+
s.trailing = trail;
|
47
|
+
// To make it clear its not just a string
|
48
|
+
s.inspect = mk_block_inspect;
|
49
|
+
s.toSource = mk_block_toSource;
|
50
|
+
|
51
|
+
if ( line !== undefined )
|
52
|
+
s.lineNumber = line;
|
53
|
+
|
54
|
+
return s;
|
55
|
+
};
|
56
|
+
|
57
|
+
|
58
|
+
var isArray = MarkdownHelpers.isArray = Array.isArray || function(obj) {
|
59
|
+
return Object.prototype.toString.call(obj) === "[object Array]";
|
60
|
+
};
|
61
|
+
|
62
|
+
// Don't mess with Array.prototype. Its not friendly
|
63
|
+
if ( Array.prototype.forEach ) {
|
64
|
+
MarkdownHelpers.forEach = function forEach( arr, cb, thisp ) {
|
65
|
+
return arr.forEach( cb, thisp );
|
66
|
+
};
|
67
|
+
}
|
68
|
+
else {
|
69
|
+
MarkdownHelpers.forEach = function forEach(arr, cb, thisp) {
|
70
|
+
for (var i = 0; i < arr.length; i++)
|
71
|
+
cb.call(thisp || arr, arr[i], i, arr);
|
72
|
+
};
|
73
|
+
}
|
74
|
+
|
75
|
+
MarkdownHelpers.isEmpty = function isEmpty( obj ) {
|
76
|
+
for ( var key in obj ) {
|
77
|
+
if ( hasOwnProperty.call( obj, key ) )
|
78
|
+
return false;
|
79
|
+
}
|
80
|
+
return true;
|
81
|
+
};
|
82
|
+
|
83
|
+
MarkdownHelpers.extract_attr = function extract_attr( jsonml ) {
|
84
|
+
return isArray(jsonml)
|
85
|
+
&& jsonml.length > 1
|
86
|
+
&& typeof jsonml[ 1 ] === "object"
|
87
|
+
&& !( isArray(jsonml[ 1 ]) )
|
88
|
+
? jsonml[ 1 ]
|
89
|
+
: undefined;
|
90
|
+
};
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
/**
|
96
|
+
* class Markdown
|
97
|
+
*
|
98
|
+
* Markdown processing in Javascript done right. We have very particular views
|
99
|
+
* on what constitutes 'right' which include:
|
100
|
+
*
|
101
|
+
* - produces well-formed HTML (this means that em and strong nesting is
|
102
|
+
* important)
|
103
|
+
*
|
104
|
+
* - has an intermediate representation to allow processing of parsed data (We
|
105
|
+
* in fact have two, both as [JsonML]: a markdown tree and an HTML tree).
|
106
|
+
*
|
107
|
+
* - is easily extensible to add new dialects without having to rewrite the
|
108
|
+
* entire parsing mechanics
|
109
|
+
*
|
110
|
+
* - has a good test suite
|
111
|
+
*
|
112
|
+
* This implementation fulfills all of these (except that the test suite could
|
113
|
+
* do with expanding to automatically run all the fixtures from other Markdown
|
114
|
+
* implementations.)
|
115
|
+
*
|
116
|
+
* ##### Intermediate Representation
|
117
|
+
*
|
118
|
+
* *TODO* Talk about this :) Its JsonML, but document the node names we use.
|
119
|
+
*
|
120
|
+
* [JsonML]: http://jsonml.org/ "JSON Markup Language"
|
121
|
+
**/
|
122
|
+
var Markdown = function(dialect) {
|
123
|
+
switch (typeof dialect) {
|
39
124
|
case "undefined":
|
40
125
|
this.dialect = Markdown.dialects.Gruber;
|
41
126
|
break;
|
@@ -43,1138 +128,1361 @@ var Markdown = expose.Markdown = function(dialect) {
|
|
43
128
|
this.dialect = dialect;
|
44
129
|
break;
|
45
130
|
default:
|
46
|
-
if ( dialect in Markdown.dialects )
|
131
|
+
if ( dialect in Markdown.dialects )
|
47
132
|
this.dialect = Markdown.dialects[dialect];
|
48
|
-
|
49
|
-
else {
|
133
|
+
else
|
50
134
|
throw new Error("Unknown Markdown dialect '" + String(dialect) + "'");
|
51
|
-
}
|
52
135
|
break;
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
};
|
58
|
-
|
59
|
-
/**
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
**/
|
66
|
-
expose.parse = function( source, dialect ) {
|
67
|
-
// dialect will default if undefined
|
68
|
-
var md = new Markdown( dialect );
|
69
|
-
return md.toTree( source );
|
70
|
-
};
|
71
|
-
|
72
|
-
/**
|
73
|
-
* toHTML( markdown, [dialect] ) -> String
|
74
|
-
* toHTML( md_tree ) -> String
|
75
|
-
* - markdown (String): markdown string to parse
|
76
|
-
* - md_tree (Markdown.JsonML): parsed markdown tree
|
77
|
-
*
|
78
|
-
* Take markdown (either as a string or as a JsonML tree) and run it through
|
79
|
-
* [[toHTMLTree]] then turn it into a well-formated HTML fragment.
|
80
|
-
**/
|
81
|
-
expose.toHTML = function toHTML( source , dialect , options ) {
|
82
|
-
var input = expose.toHTMLTree( source , dialect , options );
|
83
|
-
|
84
|
-
return expose.renderJsonML( input );
|
85
|
-
};
|
86
|
-
|
87
|
-
/**
|
88
|
-
* toHTMLTree( markdown, [dialect] ) -> JsonML
|
89
|
-
* toHTMLTree( md_tree ) -> JsonML
|
90
|
-
* - markdown (String): markdown string to parse
|
91
|
-
* - dialect (String | Dialect): the dialect to use, defaults to gruber
|
92
|
-
* - md_tree (Markdown.JsonML): parsed markdown tree
|
93
|
-
*
|
94
|
-
* Turn markdown into HTML, represented as a JsonML tree. If a string is given
|
95
|
-
* to this function, it is first parsed into a markdown tree by calling
|
96
|
-
* [[parse]].
|
97
|
-
**/
|
98
|
-
expose.toHTMLTree = function toHTMLTree( input, dialect , options ) {
|
99
|
-
// convert string input to an MD tree
|
100
|
-
if ( typeof input ==="string" ) input = this.parse( input, dialect );
|
101
|
-
|
102
|
-
// Now convert the MD tree to an HTML tree
|
103
|
-
|
104
|
-
// remove references from the tree
|
105
|
-
var attrs = extract_attr( input ),
|
106
|
-
refs = {};
|
107
|
-
|
108
|
-
if ( attrs && attrs.references ) {
|
109
|
-
refs = attrs.references;
|
110
|
-
}
|
136
|
+
}
|
137
|
+
this.em_state = [];
|
138
|
+
this.strong_state = [];
|
139
|
+
this.debug_indent = "";
|
140
|
+
};
|
141
|
+
|
142
|
+
/**
|
143
|
+
* Markdown.dialects
|
144
|
+
*
|
145
|
+
* Namespace of built-in dialects.
|
146
|
+
**/
|
147
|
+
Markdown.dialects = {};
|
111
148
|
|
112
|
-
var html = convert_tree_to_html( input, refs , options );
|
113
|
-
merge_text_nodes( html );
|
114
|
-
return html;
|
115
|
-
};
|
116
|
-
|
117
|
-
// For Spidermonkey based engines
|
118
|
-
function mk_block_toSource() {
|
119
|
-
return "Markdown.mk_block( " +
|
120
|
-
uneval(this.toString()) +
|
121
|
-
", " +
|
122
|
-
uneval(this.trailing) +
|
123
|
-
", " +
|
124
|
-
uneval(this.lineNumber) +
|
125
|
-
" )";
|
126
|
-
}
|
127
|
-
|
128
|
-
// node
|
129
|
-
function mk_block_inspect() {
|
130
|
-
var util = require("util");
|
131
|
-
return "Markdown.mk_block( " +
|
132
|
-
util.inspect(this.toString()) +
|
133
|
-
", " +
|
134
|
-
util.inspect(this.trailing) +
|
135
|
-
", " +
|
136
|
-
util.inspect(this.lineNumber) +
|
137
|
-
" )";
|
138
|
-
|
139
|
-
}
|
140
|
-
|
141
|
-
var mk_block = Markdown.mk_block = function(block, trail, line) {
|
142
|
-
// Be helpful for default case in tests.
|
143
|
-
if ( arguments.length == 1 ) trail = "\n\n";
|
144
|
-
|
145
|
-
var s = new String(block);
|
146
|
-
s.trailing = trail;
|
147
|
-
// To make it clear its not just a string
|
148
|
-
s.inspect = mk_block_inspect;
|
149
|
-
s.toSource = mk_block_toSource;
|
150
|
-
|
151
|
-
if ( line != undefined )
|
152
|
-
s.lineNumber = line;
|
153
|
-
|
154
|
-
return s;
|
155
|
-
};
|
156
|
-
|
157
|
-
function count_lines( str ) {
|
158
|
-
var n = 0, i = -1;
|
159
|
-
while ( ( i = str.indexOf("\n", i + 1) ) !== -1 ) n++;
|
160
|
-
return n;
|
161
|
-
}
|
162
|
-
|
163
|
-
// Internal - split source into rough blocks
|
164
|
-
Markdown.prototype.split_blocks = function splitBlocks( input, startLine ) {
|
165
|
-
input = input.replace(/(\r\n|\n|\r)/g, "\n");
|
166
|
-
// [\s\S] matches _anything_ (newline or space)
|
167
|
-
var re = /([\s\S]+?)($|\n(?:\s*\n|$)+)/g,
|
168
|
-
blocks = [],
|
169
|
-
m;
|
170
|
-
|
171
|
-
var line_no = 1;
|
172
|
-
|
173
|
-
if ( ( m = /^(\s*\n)/.exec(input) ) != null ) {
|
174
|
-
// skip (but count) leading blank lines
|
175
|
-
line_no += count_lines( m[0] );
|
176
|
-
re.lastIndex = m[0].length;
|
177
|
-
}
|
178
149
|
|
179
|
-
while ( ( m = re.exec(input) ) !== null ) {
|
180
|
-
blocks.push( mk_block( m[1], m[2], line_no ) );
|
181
|
-
line_no += count_lines( m[0] );
|
182
|
-
}
|
183
150
|
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
Markdown.prototype.processBlock = function processBlock( block, next ) {
|
209
|
-
var cbs = this.dialect.block,
|
210
|
-
ord = cbs.__order__;
|
211
|
-
|
212
|
-
if ( "__call__" in cbs ) {
|
213
|
-
return cbs.__call__.call(this, block, next);
|
151
|
+
|
152
|
+
// Imported functions
|
153
|
+
var mk_block = Markdown.mk_block = MarkdownHelpers.mk_block,
|
154
|
+
isArray = MarkdownHelpers.isArray;
|
155
|
+
|
156
|
+
/**
|
157
|
+
* parse( markdown, [dialect] ) -> JsonML
|
158
|
+
* - markdown (String): markdown string to parse
|
159
|
+
* - dialect (String | Dialect): the dialect to use, defaults to gruber
|
160
|
+
*
|
161
|
+
* Parse `markdown` and return a markdown document as a Markdown.JsonML tree.
|
162
|
+
**/
|
163
|
+
Markdown.parse = function( source, dialect ) {
|
164
|
+
// dialect will default if undefined
|
165
|
+
var md = new Markdown( dialect );
|
166
|
+
return md.toTree( source );
|
167
|
+
};
|
168
|
+
|
169
|
+
function count_lines( str ) {
|
170
|
+
var n = 0,
|
171
|
+
i = -1;
|
172
|
+
while ( ( i = str.indexOf("\n", i + 1) ) !== -1 )
|
173
|
+
n++;
|
174
|
+
return n;
|
214
175
|
}
|
215
176
|
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
177
|
+
// Internal - split source into rough blocks
|
178
|
+
Markdown.prototype.split_blocks = function splitBlocks( input ) {
|
179
|
+
input = input.replace(/(\r\n|\n|\r)/g, "\n");
|
180
|
+
// [\s\S] matches _anything_ (newline or space)
|
181
|
+
// [^] is equivalent but doesn't work in IEs.
|
182
|
+
var re = /([\s\S]+?)($|\n#|\n(?:\s*\n|$)+)/g,
|
183
|
+
blocks = [],
|
184
|
+
m;
|
185
|
+
|
186
|
+
var line_no = 1;
|
187
|
+
|
188
|
+
if ( ( m = /^(\s*\n)/.exec(input) ) !== null ) {
|
189
|
+
// skip (but count) leading blank lines
|
190
|
+
line_no += count_lines( m[0] );
|
191
|
+
re.lastIndex = m[0].length;
|
225
192
|
}
|
226
|
-
}
|
227
193
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
/**
|
237
|
-
* Markdown#toTree( source ) -> JsonML
|
238
|
-
* - source (String): markdown source to parse
|
239
|
-
*
|
240
|
-
* Parse `source` into a JsonML tree representing the markdown document.
|
241
|
-
**/
|
242
|
-
// custom_tree means set this.tree to `custom_tree` and restore old value on return
|
243
|
-
Markdown.prototype.toTree = function toTree( source, custom_root ) {
|
244
|
-
var blocks = source instanceof Array ? source : this.split_blocks( source );
|
245
|
-
|
246
|
-
// Make tree a member variable so its easier to mess with in extensions
|
247
|
-
var old_tree = this.tree;
|
248
|
-
try {
|
249
|
-
this.tree = custom_root || this.tree || [ "markdown" ];
|
250
|
-
|
251
|
-
blocks:
|
252
|
-
while ( blocks.length ) {
|
253
|
-
var b = this.processBlock( blocks.shift(), blocks );
|
254
|
-
|
255
|
-
// Reference blocks and the like won't return any content
|
256
|
-
if ( !b.length ) continue blocks;
|
257
|
-
|
258
|
-
this.tree.push.apply( this.tree, b );
|
194
|
+
while ( ( m = re.exec(input) ) !== null ) {
|
195
|
+
if (m[2] === "\n#") {
|
196
|
+
m[2] = "\n";
|
197
|
+
re.lastIndex--;
|
198
|
+
}
|
199
|
+
blocks.push( mk_block( m[1], m[2], line_no ) );
|
200
|
+
line_no += count_lines( m[0] );
|
259
201
|
}
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
202
|
+
|
203
|
+
return blocks;
|
204
|
+
};
|
205
|
+
|
206
|
+
/**
|
207
|
+
* Markdown#processBlock( block, next ) -> undefined | [ JsonML, ... ]
|
208
|
+
* - block (String): the block to process
|
209
|
+
* - next (Array): the following blocks
|
210
|
+
*
|
211
|
+
* Process `block` and return an array of JsonML nodes representing `block`.
|
212
|
+
*
|
213
|
+
* It does this by asking each block level function in the dialect to process
|
214
|
+
* the block until one can. Succesful handling is indicated by returning an
|
215
|
+
* array (with zero or more JsonML nodes), failure by a false value.
|
216
|
+
*
|
217
|
+
* Blocks handlers are responsible for calling [[Markdown#processInline]]
|
218
|
+
* themselves as appropriate.
|
219
|
+
*
|
220
|
+
* If the blocks were split incorrectly or adjacent blocks need collapsing you
|
221
|
+
* can adjust `next` in place using shift/splice etc.
|
222
|
+
*
|
223
|
+
* If any of this default behaviour is not right for the dialect, you can
|
224
|
+
* define a `__call__` method on the dialect that will get invoked to handle
|
225
|
+
* the block processing.
|
226
|
+
*/
|
227
|
+
Markdown.prototype.processBlock = function processBlock( block, next ) {
|
228
|
+
var cbs = this.dialect.block,
|
229
|
+
ord = cbs.__order__;
|
230
|
+
|
231
|
+
if ( "__call__" in cbs )
|
232
|
+
return cbs.__call__.call(this, block, next);
|
233
|
+
|
234
|
+
for ( var i = 0; i < ord.length; i++ ) {
|
235
|
+
//D:this.debug( "Testing", ord[i] );
|
236
|
+
var res = cbs[ ord[i] ].call( this, block, next );
|
237
|
+
if ( res ) {
|
238
|
+
//D:this.debug(" matched");
|
239
|
+
if ( !isArray(res) || ( res.length > 0 && !( isArray(res[0]) ) ) )
|
240
|
+
this.debug(ord[i], "didn't return a proper array");
|
241
|
+
//D:this.debug( "" );
|
242
|
+
return res;
|
243
|
+
}
|
265
244
|
}
|
266
|
-
}
|
267
|
-
};
|
268
245
|
|
269
|
-
//
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
246
|
+
// Uhoh! no match! Should we throw an error?
|
247
|
+
return [];
|
248
|
+
};
|
249
|
+
|
250
|
+
Markdown.prototype.processInline = function processInline( block ) {
|
251
|
+
return this.dialect.inline.__call__.call( this, String( block ) );
|
252
|
+
};
|
253
|
+
|
254
|
+
/**
|
255
|
+
* Markdown#toTree( source ) -> JsonML
|
256
|
+
* - source (String): markdown source to parse
|
257
|
+
*
|
258
|
+
* Parse `source` into a JsonML tree representing the markdown document.
|
259
|
+
**/
|
260
|
+
// custom_tree means set this.tree to `custom_tree` and restore old value on return
|
261
|
+
Markdown.prototype.toTree = function toTree( source, custom_root ) {
|
262
|
+
var blocks = source instanceof Array ? source : this.split_blocks( source );
|
263
|
+
|
264
|
+
// Make tree a member variable so its easier to mess with in extensions
|
265
|
+
var old_tree = this.tree;
|
266
|
+
try {
|
267
|
+
this.tree = custom_root || this.tree || [ "markdown" ];
|
268
|
+
|
269
|
+
blocks_loop:
|
270
|
+
while ( blocks.length ) {
|
271
|
+
var b = this.processBlock( blocks.shift(), blocks );
|
272
|
+
|
273
|
+
// Reference blocks and the like won't return any content
|
274
|
+
if ( !b.length )
|
275
|
+
continue blocks_loop;
|
276
|
+
|
277
|
+
this.tree.push.apply( this.tree, b );
|
278
|
+
}
|
279
|
+
return this.tree;
|
280
|
+
}
|
281
|
+
finally {
|
282
|
+
if ( custom_root )
|
283
|
+
this.tree = old_tree;
|
284
|
+
}
|
285
|
+
};
|
286
|
+
|
287
|
+
// Noop by default
|
288
|
+
Markdown.prototype.debug = function () {
|
289
|
+
var args = Array.prototype.slice.call( arguments);
|
290
|
+
args.unshift(this.debug_indent);
|
291
|
+
if ( typeof print !== "undefined" )
|
274
292
|
print.apply( print, args );
|
275
|
-
|
293
|
+
if ( typeof console !== "undefined" && typeof console.log !== "undefined" )
|
276
294
|
console.log.apply( null, args );
|
277
|
-
}
|
295
|
+
};
|
278
296
|
|
279
|
-
Markdown.prototype.loop_re_over_block = function( re, block, cb ) {
|
280
|
-
|
281
|
-
|
282
|
-
|
297
|
+
Markdown.prototype.loop_re_over_block = function( re, block, cb ) {
|
298
|
+
// Dont use /g regexps with this
|
299
|
+
var m,
|
300
|
+
b = block.valueOf();
|
283
301
|
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
};
|
290
|
-
|
291
|
-
/**
|
292
|
-
* Markdown.dialects
|
293
|
-
*
|
294
|
-
* Namespace of built-in dialects.
|
295
|
-
**/
|
296
|
-
Markdown.dialects = {};
|
297
|
-
|
298
|
-
/**
|
299
|
-
* Markdown.dialects.Gruber
|
300
|
-
*
|
301
|
-
* The default dialect that follows the rules set out by John Gruber's
|
302
|
-
* markdown.pl as closely as possible. Well actually we follow the behaviour of
|
303
|
-
* that script which in some places is not exactly what the syntax web page
|
304
|
-
* says.
|
305
|
-
**/
|
306
|
-
Markdown.dialects.Gruber = {
|
307
|
-
block: {
|
308
|
-
atxHeader: function atxHeader( block, next ) {
|
309
|
-
var m = block.match( /^(#{1,6})\s*(.*?)\s*#*\s*(?:\n|$)/ );
|
310
|
-
|
311
|
-
if ( !m ) return undefined;
|
312
|
-
|
313
|
-
var header = [ "header", { level: m[ 1 ].length } ];
|
314
|
-
Array.prototype.push.apply(header, this.processInline(m[ 2 ]));
|
315
|
-
|
316
|
-
if ( m[0].length < block.length )
|
317
|
-
next.unshift( mk_block( block.substr( m[0].length ), block.trailing, block.lineNumber + 2 ) );
|
318
|
-
|
319
|
-
return [ header ];
|
320
|
-
},
|
302
|
+
while ( b.length && (m = re.exec(b) ) !== null ) {
|
303
|
+
b = b.substr( m[0].length );
|
304
|
+
cb.call(this, m);
|
305
|
+
}
|
306
|
+
return b;
|
307
|
+
};
|
321
308
|
|
322
|
-
|
323
|
-
|
309
|
+
// Build default order from insertion order.
|
310
|
+
Markdown.buildBlockOrder = function(d) {
|
311
|
+
var ord = [];
|
312
|
+
for ( var i in d ) {
|
313
|
+
if ( i === "__order__" || i === "__call__" )
|
314
|
+
continue;
|
315
|
+
ord.push( i );
|
316
|
+
}
|
317
|
+
d.__order__ = ord;
|
318
|
+
};
|
324
319
|
|
325
|
-
|
320
|
+
// Build patterns for inline matcher
|
321
|
+
Markdown.buildInlinePatterns = function(d) {
|
322
|
+
var patterns = [];
|
323
|
+
|
324
|
+
for ( var i in d ) {
|
325
|
+
// __foo__ is reserved and not a pattern
|
326
|
+
if ( i.match( /^__.*__$/) )
|
327
|
+
continue;
|
328
|
+
var l = i.replace( /([\\.*+?|()\[\]{}])/g, "\\$1" )
|
329
|
+
.replace( /\n/, "\\n" );
|
330
|
+
patterns.push( i.length === 1 ? l : "(?:" + l + ")" );
|
331
|
+
}
|
326
332
|
|
327
|
-
|
328
|
-
|
333
|
+
patterns = patterns.join("|");
|
334
|
+
d.__patterns__ = patterns;
|
335
|
+
//print("patterns:", uneval( patterns ) );
|
329
336
|
|
330
|
-
|
331
|
-
|
337
|
+
var fn = d.__call__;
|
338
|
+
d.__call__ = function(text, pattern) {
|
339
|
+
if ( pattern !== undefined )
|
340
|
+
return fn.call(this, text, pattern);
|
341
|
+
else
|
342
|
+
return fn.call(this, text, patterns);
|
343
|
+
};
|
344
|
+
};
|
332
345
|
|
333
|
-
return [ header ];
|
334
|
-
},
|
335
346
|
|
336
|
-
code: function code( block, next ) {
|
337
|
-
// | Foo
|
338
|
-
// |bar
|
339
|
-
// should be a code block followed by a paragraph. Fun
|
340
|
-
//
|
341
|
-
// There might also be adjacent code block to merge.
|
342
347
|
|
343
|
-
var ret = [],
|
344
|
-
re = /^(?: {0,3}\t| {4})(.*)\n?/,
|
345
|
-
lines;
|
346
348
|
|
347
|
-
|
348
|
-
if ( !block.match( re ) ) return undefined;
|
349
|
+
var extract_attr = MarkdownHelpers.extract_attr;
|
349
350
|
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
351
|
+
/**
|
352
|
+
* renderJsonML( jsonml[, options] ) -> String
|
353
|
+
* - jsonml (Array): JsonML array to render to XML
|
354
|
+
* - options (Object): options
|
355
|
+
*
|
356
|
+
* Converts the given JsonML into well-formed XML.
|
357
|
+
*
|
358
|
+
* The options currently understood are:
|
359
|
+
*
|
360
|
+
* - root (Boolean): wether or not the root node should be included in the
|
361
|
+
* output, or just its children. The default `false` is to not include the
|
362
|
+
* root itself.
|
363
|
+
*/
|
364
|
+
Markdown.renderJsonML = function( jsonml, options ) {
|
365
|
+
options = options || {};
|
366
|
+
// include the root element in the rendered output?
|
367
|
+
options.root = options.root || false;
|
355
368
|
|
356
|
-
|
357
|
-
// Case alluded to in first comment. push it back on as a new block
|
358
|
-
next.unshift( mk_block(b, block.trailing) );
|
359
|
-
break block_search;
|
360
|
-
}
|
361
|
-
else if ( next.length ) {
|
362
|
-
// Check the next block - it might be code too
|
363
|
-
if ( !next[0].match( re ) ) break block_search;
|
369
|
+
var content = [];
|
364
370
|
|
365
|
-
|
366
|
-
|
371
|
+
if ( options.root ) {
|
372
|
+
content.push( render_tree( jsonml ) );
|
373
|
+
}
|
374
|
+
else {
|
375
|
+
jsonml.shift(); // get rid of the tag
|
376
|
+
if ( jsonml.length && typeof jsonml[ 0 ] === "object" && !( jsonml[ 0 ] instanceof Array ) )
|
377
|
+
jsonml.shift(); // get rid of the attributes
|
367
378
|
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
break block_search;
|
372
|
-
}
|
373
|
-
} while ( true );
|
379
|
+
while ( jsonml.length )
|
380
|
+
content.push( render_tree( jsonml.shift() ) );
|
381
|
+
}
|
374
382
|
|
375
|
-
|
376
|
-
|
383
|
+
return content.join( "\n\n" );
|
384
|
+
};
|
377
385
|
|
378
|
-
horizRule: function horizRule( block, next ) {
|
379
|
-
// this needs to find any hr in the block to handle abutting blocks
|
380
|
-
var m = block.match( /^(?:([\s\S]*?)\n)?[ \t]*([-_*])(?:[ \t]*\2){2,}[ \t]*(?:\n([\s\S]*))?$/ );
|
381
386
|
|
382
|
-
|
383
|
-
|
384
|
-
|
387
|
+
/**
|
388
|
+
* toHTMLTree( markdown, [dialect] ) -> JsonML
|
389
|
+
* toHTMLTree( md_tree ) -> JsonML
|
390
|
+
* - markdown (String): markdown string to parse
|
391
|
+
* - dialect (String | Dialect): the dialect to use, defaults to gruber
|
392
|
+
* - md_tree (Markdown.JsonML): parsed markdown tree
|
393
|
+
*
|
394
|
+
* Turn markdown into HTML, represented as a JsonML tree. If a string is given
|
395
|
+
* to this function, it is first parsed into a markdown tree by calling
|
396
|
+
* [[parse]].
|
397
|
+
**/
|
398
|
+
Markdown.toHTMLTree = function toHTMLTree( input, dialect , options ) {
|
385
399
|
|
386
|
-
|
400
|
+
// convert string input to an MD tree
|
401
|
+
if ( typeof input === "string" )
|
402
|
+
input = this.parse( input, dialect );
|
387
403
|
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
404
|
+
// Now convert the MD tree to an HTML tree
|
405
|
+
|
406
|
+
// remove references from the tree
|
407
|
+
var attrs = extract_attr( input ),
|
408
|
+
refs = {};
|
409
|
+
|
410
|
+
if ( attrs && attrs.references )
|
411
|
+
refs = attrs.references;
|
412
|
+
|
413
|
+
var html = convert_tree_to_html( input, refs , options );
|
414
|
+
merge_text_nodes( html );
|
415
|
+
return html;
|
416
|
+
};
|
417
|
+
|
418
|
+
/**
|
419
|
+
* toHTML( markdown, [dialect] ) -> String
|
420
|
+
* toHTML( md_tree ) -> String
|
421
|
+
* - markdown (String): markdown string to parse
|
422
|
+
* - md_tree (Markdown.JsonML): parsed markdown tree
|
423
|
+
*
|
424
|
+
* Take markdown (either as a string or as a JsonML tree) and run it through
|
425
|
+
* [[toHTMLTree]] then turn it into a well-formated HTML fragment.
|
426
|
+
**/
|
427
|
+
Markdown.toHTML = function toHTML( source , dialect , options ) {
|
428
|
+
var input = this.toHTMLTree( source , dialect , options );
|
429
|
+
|
430
|
+
return this.renderJsonML( input );
|
431
|
+
};
|
432
|
+
|
433
|
+
|
434
|
+
function escapeHTML( text ) {
|
435
|
+
return text.replace( /&/g, "&" )
|
436
|
+
.replace( /</g, "<" )
|
437
|
+
.replace( />/g, ">" )
|
438
|
+
.replace( /"/g, """ )
|
439
|
+
.replace( /'/g, "'" );
|
440
|
+
}
|
441
|
+
|
442
|
+
function render_tree( jsonml ) {
|
443
|
+
// basic case
|
444
|
+
if ( typeof jsonml === "string" )
|
445
|
+
return escapeHTML( jsonml );
|
446
|
+
|
447
|
+
var tag = jsonml.shift(),
|
448
|
+
attributes = {},
|
449
|
+
content = [];
|
450
|
+
|
451
|
+
if ( jsonml.length && typeof jsonml[ 0 ] === "object" && !( jsonml[ 0 ] instanceof Array ) )
|
452
|
+
attributes = jsonml.shift();
|
453
|
+
|
454
|
+
while ( jsonml.length )
|
455
|
+
content.push( render_tree( jsonml.shift() ) );
|
456
|
+
|
457
|
+
var tag_attrs = "";
|
458
|
+
for ( var a in attributes )
|
459
|
+
tag_attrs += " " + a + '="' + escapeHTML( attributes[ a ] ) + '"';
|
460
|
+
|
461
|
+
// be careful about adding whitespace here for inline elements
|
462
|
+
if ( tag === "img" || tag === "br" || tag === "hr" )
|
463
|
+
return "<"+ tag + tag_attrs + "/>";
|
464
|
+
else
|
465
|
+
return "<"+ tag + tag_attrs + ">" + content.join( "" ) + "</" + tag + ">";
|
466
|
+
}
|
392
467
|
|
393
|
-
|
394
|
-
|
395
|
-
|
468
|
+
function convert_tree_to_html( tree, references, options ) {
|
469
|
+
var i;
|
470
|
+
options = options || {};
|
471
|
+
|
472
|
+
// shallow clone
|
473
|
+
var jsonml = tree.slice( 0 );
|
474
|
+
|
475
|
+
if ( typeof options.preprocessTreeNode === "function" )
|
476
|
+
jsonml = options.preprocessTreeNode(jsonml, references);
|
477
|
+
|
478
|
+
// Clone attributes if they exist
|
479
|
+
var attrs = extract_attr( jsonml );
|
480
|
+
if ( attrs ) {
|
481
|
+
jsonml[ 1 ] = {};
|
482
|
+
for ( i in attrs ) {
|
483
|
+
jsonml[ 1 ][ i ] = attrs[ i ];
|
396
484
|
}
|
485
|
+
attrs = jsonml[ 1 ];
|
486
|
+
}
|
397
487
|
|
488
|
+
// basic case
|
489
|
+
if ( typeof jsonml === "string" )
|
398
490
|
return jsonml;
|
399
|
-
},
|
400
491
|
|
401
|
-
//
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
492
|
+
// convert this node
|
493
|
+
switch ( jsonml[ 0 ] ) {
|
494
|
+
case "header":
|
495
|
+
jsonml[ 0 ] = "h" + jsonml[ 1 ].level;
|
496
|
+
delete jsonml[ 1 ].level;
|
497
|
+
break;
|
498
|
+
case "bulletlist":
|
499
|
+
jsonml[ 0 ] = "ul";
|
500
|
+
break;
|
501
|
+
case "numberlist":
|
502
|
+
jsonml[ 0 ] = "ol";
|
503
|
+
break;
|
504
|
+
case "listitem":
|
505
|
+
jsonml[ 0 ] = "li";
|
506
|
+
break;
|
507
|
+
case "para":
|
508
|
+
jsonml[ 0 ] = "p";
|
509
|
+
break;
|
510
|
+
case "markdown":
|
511
|
+
jsonml[ 0 ] = "html";
|
512
|
+
if ( attrs )
|
513
|
+
delete attrs.references;
|
514
|
+
break;
|
515
|
+
case "code_block":
|
516
|
+
jsonml[ 0 ] = "pre";
|
517
|
+
i = attrs ? 2 : 1;
|
518
|
+
var code = [ "code" ];
|
519
|
+
code.push.apply( code, jsonml.splice( i, jsonml.length - i ) );
|
520
|
+
jsonml[ i ] = code;
|
521
|
+
break;
|
522
|
+
case "inlinecode":
|
523
|
+
jsonml[ 0 ] = "code";
|
524
|
+
break;
|
525
|
+
case "img":
|
526
|
+
jsonml[ 1 ].src = jsonml[ 1 ].href;
|
527
|
+
delete jsonml[ 1 ].href;
|
528
|
+
break;
|
529
|
+
case "linebreak":
|
530
|
+
jsonml[ 0 ] = "br";
|
531
|
+
break;
|
532
|
+
case "link":
|
533
|
+
jsonml[ 0 ] = "a";
|
534
|
+
break;
|
535
|
+
case "link_ref":
|
536
|
+
jsonml[ 0 ] = "a";
|
537
|
+
|
538
|
+
// grab this ref and clean up the attribute node
|
539
|
+
var ref = references[ attrs.ref ];
|
540
|
+
|
541
|
+
// if the reference exists, make the link
|
542
|
+
if ( ref ) {
|
543
|
+
delete attrs.ref;
|
544
|
+
|
545
|
+
// add in the href and title, if present
|
546
|
+
attrs.href = ref.href;
|
547
|
+
if ( ref.title )
|
548
|
+
attrs.title = ref.title;
|
549
|
+
|
550
|
+
// get rid of the unneeded original text
|
551
|
+
delete attrs.original;
|
437
552
|
}
|
438
|
-
|
439
|
-
|
553
|
+
// the reference doesn't exist, so revert to plain text
|
554
|
+
else {
|
555
|
+
return attrs.original;
|
440
556
|
}
|
557
|
+
break;
|
558
|
+
case "img_ref":
|
559
|
+
jsonml[ 0 ] = "img";
|
560
|
+
|
561
|
+
// grab this ref and clean up the attribute node
|
562
|
+
var ref = references[ attrs.ref ];
|
563
|
+
|
564
|
+
// if the reference exists, make the link
|
565
|
+
if ( ref ) {
|
566
|
+
delete attrs.ref;
|
441
567
|
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
568
|
+
// add in the href and title, if present
|
569
|
+
attrs.src = ref.href;
|
570
|
+
if ( ref.title )
|
571
|
+
attrs.title = ref.title;
|
572
|
+
|
573
|
+
// get rid of the unneeded original text
|
574
|
+
delete attrs.original;
|
575
|
+
}
|
576
|
+
// the reference doesn't exist, so revert to plain text
|
577
|
+
else {
|
578
|
+
return attrs.original;
|
579
|
+
}
|
580
|
+
break;
|
581
|
+
}
|
582
|
+
|
583
|
+
// convert all the children
|
584
|
+
i = 1;
|
585
|
+
|
586
|
+
// deal with the attribute node, if it exists
|
587
|
+
if ( attrs ) {
|
588
|
+
// if there are keys, skip over it
|
589
|
+
for ( var key in jsonml[ 1 ] ) {
|
590
|
+
i = 2;
|
591
|
+
break;
|
592
|
+
}
|
593
|
+
// if there aren't, remove it
|
594
|
+
if ( i === 1 )
|
595
|
+
jsonml.splice( i, 1 );
|
596
|
+
}
|
597
|
+
|
598
|
+
for ( ; i < jsonml.length; ++i ) {
|
599
|
+
jsonml[ i ] = convert_tree_to_html( jsonml[ i ], references, options );
|
600
|
+
}
|
601
|
+
|
602
|
+
return jsonml;
|
603
|
+
}
|
604
|
+
|
605
|
+
|
606
|
+
// merges adjacent text nodes into a single node
|
607
|
+
function merge_text_nodes( jsonml ) {
|
608
|
+
// skip the tag name and attribute hash
|
609
|
+
var i = extract_attr( jsonml ) ? 2 : 1;
|
610
|
+
|
611
|
+
while ( i < jsonml.length ) {
|
612
|
+
// if it's a string check the next item too
|
613
|
+
if ( typeof jsonml[ i ] === "string" ) {
|
614
|
+
if ( i + 1 < jsonml.length && typeof jsonml[ i + 1 ] === "string" ) {
|
615
|
+
// merge the second string into the first and remove it
|
616
|
+
jsonml[ i ] += jsonml.splice( i + 1, 1 )[ 0 ];
|
448
617
|
}
|
449
|
-
|
450
|
-
|
451
|
-
? li[li.length -1]
|
452
|
-
: li;
|
453
|
-
|
454
|
-
// If there is already some content in this list, add the new line in
|
455
|
-
if ( nl && li.length > 1 ) inline.unshift(nl);
|
456
|
-
|
457
|
-
for ( var i = 0; i < inline.length; i++ ) {
|
458
|
-
var what = inline[i],
|
459
|
-
is_str = typeof what == "string";
|
460
|
-
if ( is_str && add_to.length > 1 && typeof add_to[add_to.length-1] == "string" ) {
|
461
|
-
add_to[ add_to.length-1 ] += what;
|
462
|
-
}
|
463
|
-
else {
|
464
|
-
add_to.push( what );
|
465
|
-
}
|
618
|
+
else {
|
619
|
+
++i;
|
466
620
|
}
|
467
621
|
}
|
622
|
+
// if it's not a string recurse
|
623
|
+
else {
|
624
|
+
merge_text_nodes( jsonml[ i ] );
|
625
|
+
++i;
|
626
|
+
}
|
627
|
+
}
|
628
|
+
};
|
629
|
+
|
630
|
+
|
631
|
+
|
632
|
+
var DialectHelpers = {};
|
633
|
+
DialectHelpers.inline_until_char = function( text, want ) {
|
634
|
+
var consumed = 0,
|
635
|
+
nodes = [];
|
636
|
+
|
637
|
+
while ( true ) {
|
638
|
+
if ( text.charAt( consumed ) === want ) {
|
639
|
+
// Found the character we were looking for
|
640
|
+
consumed++;
|
641
|
+
return [ consumed, nodes ];
|
642
|
+
}
|
643
|
+
|
644
|
+
if ( consumed >= text.length ) {
|
645
|
+
// No closing char found. Abort.
|
646
|
+
return null;
|
647
|
+
}
|
648
|
+
|
649
|
+
var res = this.dialect.inline.__oneElement__.call(this, text.substr( consumed ) );
|
650
|
+
consumed += res[ 0 ];
|
651
|
+
// Add any returned nodes.
|
652
|
+
nodes.push.apply( nodes, res.slice( 1 ) );
|
653
|
+
}
|
654
|
+
};
|
655
|
+
|
656
|
+
// Helper function to make sub-classing a dialect easier
|
657
|
+
DialectHelpers.subclassDialect = function( d ) {
|
658
|
+
function Block() {}
|
659
|
+
Block.prototype = d.block;
|
660
|
+
function Inline() {}
|
661
|
+
Inline.prototype = d.inline;
|
662
|
+
|
663
|
+
return { block: new Block(), inline: new Inline() };
|
664
|
+
};
|
665
|
+
|
666
|
+
|
667
|
+
|
668
|
+
|
669
|
+
var forEach = MarkdownHelpers.forEach,
|
670
|
+
extract_attr = MarkdownHelpers.extract_attr,
|
671
|
+
mk_block = MarkdownHelpers.mk_block,
|
672
|
+
isEmpty = MarkdownHelpers.isEmpty,
|
673
|
+
inline_until_char = DialectHelpers.inline_until_char;
|
674
|
+
|
675
|
+
/**
|
676
|
+
* Gruber dialect
|
677
|
+
*
|
678
|
+
* The default dialect that follows the rules set out by John Gruber's
|
679
|
+
* markdown.pl as closely as possible. Well actually we follow the behaviour of
|
680
|
+
* that script which in some places is not exactly what the syntax web page
|
681
|
+
* says.
|
682
|
+
**/
|
683
|
+
var Gruber = {
|
684
|
+
block: {
|
685
|
+
atxHeader: function atxHeader( block, next ) {
|
686
|
+
var m = block.match( /^(#{1,6})\s*(.*?)\s*#*\s*(?:\n|$)/ );
|
687
|
+
|
688
|
+
if ( !m )
|
689
|
+
return undefined;
|
690
|
+
|
691
|
+
var header = [ "header", { level: m[ 1 ].length } ];
|
692
|
+
Array.prototype.push.apply(header, this.processInline(m[ 2 ]));
|
693
|
+
|
694
|
+
if ( m[0].length < block.length )
|
695
|
+
next.unshift( mk_block( block.substr( m[0].length ), block.trailing, block.lineNumber + 2 ) );
|
696
|
+
|
697
|
+
return [ header ];
|
698
|
+
},
|
699
|
+
|
700
|
+
setextHeader: function setextHeader( block, next ) {
|
701
|
+
var m = block.match( /^(.*)\n([-=])\2\2+(?:\n|$)/ );
|
702
|
+
|
703
|
+
if ( !m )
|
704
|
+
return undefined;
|
705
|
+
|
706
|
+
var level = ( m[ 2 ] === "=" ) ? 1 : 2,
|
707
|
+
header = [ "header", { level : level }, m[ 1 ] ];
|
708
|
+
|
709
|
+
if ( m[0].length < block.length )
|
710
|
+
next.unshift( mk_block( block.substr( m[0].length ), block.trailing, block.lineNumber + 2 ) );
|
711
|
+
|
712
|
+
return [ header ];
|
713
|
+
},
|
468
714
|
|
469
|
-
|
470
|
-
|
471
|
-
|
715
|
+
code: function code( block, next ) {
|
716
|
+
// | Foo
|
717
|
+
// |bar
|
718
|
+
// should be a code block followed by a paragraph. Fun
|
719
|
+
//
|
720
|
+
// There might also be adjacent code block to merge.
|
472
721
|
|
473
|
-
var
|
474
|
-
|
475
|
-
ret = [];
|
722
|
+
var ret = [],
|
723
|
+
re = /^(?: {0,3}\t| {4})(.*)\n?/;
|
476
724
|
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
// Now remove that indent
|
481
|
-
x = b.replace( replace, "");
|
725
|
+
// 4 spaces + content
|
726
|
+
if ( !block.match( re ) )
|
727
|
+
return undefined;
|
482
728
|
|
483
|
-
|
729
|
+
block_search:
|
730
|
+
do {
|
731
|
+
// Now pull out the rest of the lines
|
732
|
+
var b = this.loop_re_over_block(
|
733
|
+
re, block.valueOf(), function( m ) { ret.push( m[1] ); } );
|
734
|
+
|
735
|
+
if ( b.length ) {
|
736
|
+
// Case alluded to in first comment. push it back on as a new block
|
737
|
+
next.unshift( mk_block(b, block.trailing) );
|
738
|
+
break block_search;
|
739
|
+
}
|
740
|
+
else if ( next.length ) {
|
741
|
+
// Check the next block - it might be code too
|
742
|
+
if ( !next[0].match( re ) )
|
743
|
+
break block_search;
|
744
|
+
|
745
|
+
// Pull how how many blanks lines follow - minus two to account for .join
|
746
|
+
ret.push ( block.trailing.replace(/[^\n]/g, "").substring(2) );
|
747
|
+
|
748
|
+
block = next.shift();
|
484
749
|
}
|
485
750
|
else {
|
486
|
-
break;
|
751
|
+
break block_search;
|
487
752
|
}
|
488
|
-
}
|
489
|
-
return ret;
|
490
|
-
}
|
753
|
+
} while ( true );
|
491
754
|
|
492
|
-
|
493
|
-
|
494
|
-
var list = s.list;
|
495
|
-
var last_li = list[list.length-1];
|
755
|
+
return [ [ "code_block", ret.join("\n") ] ];
|
756
|
+
},
|
496
757
|
|
497
|
-
|
498
|
-
|
499
|
-
}
|
500
|
-
if ( i + 1 == stack.length ) {
|
501
|
-
// Last stack frame
|
502
|
-
// Keep the same array, but replace the contents
|
503
|
-
last_li.push( ["para"].concat( last_li.splice(1, last_li.length - 1) ) );
|
504
|
-
}
|
505
|
-
else {
|
506
|
-
var sublist = last_li.pop();
|
507
|
-
last_li.push( ["para"].concat( last_li.splice(1, last_li.length - 1) ), sublist );
|
508
|
-
}
|
509
|
-
}
|
758
|
+
horizRule: function horizRule( block, next ) {
|
759
|
+
// this needs to find any hr in the block to handle abutting blocks
|
760
|
+
var m = block.match( /^(?:([\s\S]*?)\n)?[ \t]*([-_*])(?:[ \t]*\2){2,}[ \t]*(?:\n([\s\S]*))?$/ );
|
510
761
|
|
511
|
-
|
512
|
-
|
513
|
-
var m = block.match( is_list_re );
|
514
|
-
if ( !m ) return undefined;
|
762
|
+
if ( !m )
|
763
|
+
return undefined;
|
515
764
|
|
516
|
-
|
517
|
-
var list = bullet_list.exec( m[2] )
|
518
|
-
? ["bulletlist"]
|
519
|
-
: ["numberlist"];
|
765
|
+
var jsonml = [ [ "hr" ] ];
|
520
766
|
|
521
|
-
|
522
|
-
|
767
|
+
// if there's a leading abutting block, process it
|
768
|
+
if ( m[ 1 ] ) {
|
769
|
+
var contained = mk_block( m[ 1 ], "", block.lineNumber );
|
770
|
+
jsonml.unshift.apply( jsonml, this.toTree( contained, [] ) );
|
523
771
|
}
|
524
772
|
|
773
|
+
// if there's a trailing abutting block, stick it into next
|
774
|
+
if ( m[ 3 ] )
|
775
|
+
next.unshift( mk_block( m[ 3 ], block.trailing, block.lineNumber + 1 ) );
|
525
776
|
|
526
|
-
|
527
|
-
|
528
|
-
last_li,
|
529
|
-
loose = false,
|
530
|
-
ret = [ stack[0].list ],
|
531
|
-
i;
|
532
|
-
|
533
|
-
// Loop to search over block looking for inner block elements and loose lists
|
534
|
-
loose_search:
|
535
|
-
while ( true ) {
|
536
|
-
// Split into lines preserving new lines at end of line
|
537
|
-
var lines = block.split( /(?=\n)/ );
|
538
|
-
|
539
|
-
// We have to grab all lines for a li and call processInline on them
|
540
|
-
// once as there are some inline things that can span lines.
|
541
|
-
var li_accumulate = "";
|
542
|
-
|
543
|
-
// Loop over the lines in this block looking for tight lists.
|
544
|
-
tight_search:
|
545
|
-
for ( var line_no = 0; line_no < lines.length; line_no++ ) {
|
546
|
-
var nl = "",
|
547
|
-
l = lines[line_no].replace(/^\n/, function(n) { nl = n; return ""; });
|
548
|
-
|
549
|
-
// TODO: really should cache this
|
550
|
-
var line_re = regex_for_depth( stack.length );
|
551
|
-
|
552
|
-
m = l.match( line_re );
|
553
|
-
//print( "line:", uneval(l), "\nline match:", uneval(m) );
|
554
|
-
|
555
|
-
// We have a list item
|
556
|
-
if ( m[1] !== undefined ) {
|
557
|
-
// Process the previous list item, if any
|
558
|
-
if ( li_accumulate.length ) {
|
559
|
-
add( last_li, loose, this.processInline( li_accumulate ), nl );
|
560
|
-
// Loose mode will have been dealt with. Reset it
|
561
|
-
loose = false;
|
562
|
-
li_accumulate = "";
|
563
|
-
}
|
777
|
+
return jsonml;
|
778
|
+
},
|
564
779
|
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
780
|
+
// There are two types of lists. Tight and loose. Tight lists have no whitespace
|
781
|
+
// between the items (and result in text just in the <li>) and loose lists,
|
782
|
+
// which have an empty line between list items, resulting in (one or more)
|
783
|
+
// paragraphs inside the <li>.
|
784
|
+
//
|
785
|
+
// There are all sorts weird edge cases about the original markdown.pl's
|
786
|
+
// handling of lists:
|
787
|
+
//
|
788
|
+
// * Nested lists are supposed to be indented by four chars per level. But
|
789
|
+
// if they aren't, you can get a nested list by indenting by less than
|
790
|
+
// four so long as the indent doesn't match an indent of an existing list
|
791
|
+
// item in the 'nest stack'.
|
792
|
+
//
|
793
|
+
// * The type of the list (bullet or number) is controlled just by the
|
794
|
+
// first item at the indent. Subsequent changes are ignored unless they
|
795
|
+
// are for nested lists
|
796
|
+
//
|
797
|
+
lists: (function( ) {
|
798
|
+
// Use a closure to hide a few variables.
|
799
|
+
var any_list = "[*+-]|\\d+\\.",
|
800
|
+
bullet_list = /[*+-]/,
|
801
|
+
// Capture leading indent as it matters for determining nested lists.
|
802
|
+
is_list_re = new RegExp( "^( {0,3})(" + any_list + ")[ \t]+" ),
|
803
|
+
indent_re = "(?: {0,3}\\t| {4})";
|
804
|
+
|
805
|
+
// TODO: Cache this regexp for certain depths.
|
806
|
+
// Create a regexp suitable for matching an li for a given stack depth
|
807
|
+
function regex_for_depth( depth ) {
|
808
|
+
|
809
|
+
return new RegExp(
|
810
|
+
// m[1] = indent, m[2] = list_type
|
811
|
+
"(?:^(" + indent_re + "{0," + depth + "} {0,3})(" + any_list + ")\\s+)|" +
|
812
|
+
// m[3] = cont
|
813
|
+
"(^" + indent_re + "{0," + (depth-1) + "}[ ]{0,4})"
|
814
|
+
);
|
815
|
+
}
|
816
|
+
function expand_tab( input ) {
|
817
|
+
return input.replace( / {0,3}\t/g, " " );
|
818
|
+
}
|
588
819
|
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
820
|
+
// Add inline content `inline` to `li`. inline comes from processInline
|
821
|
+
// so is an array of content
|
822
|
+
function add(li, loose, inline, nl) {
|
823
|
+
if ( loose ) {
|
824
|
+
li.push( [ "para" ].concat(inline) );
|
825
|
+
return;
|
826
|
+
}
|
827
|
+
// Hmmm, should this be any block level element or just paras?
|
828
|
+
var add_to = li[li.length -1] instanceof Array && li[li.length - 1][0] === "para"
|
829
|
+
? li[li.length -1]
|
830
|
+
: li;
|
831
|
+
|
832
|
+
// If there is already some content in this list, add the new line in
|
833
|
+
if ( nl && li.length > 1 )
|
834
|
+
inline.unshift(nl);
|
835
|
+
|
836
|
+
for ( var i = 0; i < inline.length; i++ ) {
|
837
|
+
var what = inline[i],
|
838
|
+
is_str = typeof what === "string";
|
839
|
+
if ( is_str && add_to.length > 1 && typeof add_to[add_to.length-1] === "string" )
|
840
|
+
add_to[ add_to.length-1 ] += what;
|
841
|
+
else
|
842
|
+
add_to.push( what );
|
843
|
+
}
|
844
|
+
}
|
604
845
|
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
} // end depth of shenegains
|
609
|
-
nl = "";
|
610
|
-
}
|
846
|
+
// contained means have an indent greater than the current one. On
|
847
|
+
// *every* line in the block
|
848
|
+
function get_contained_blocks( depth, blocks ) {
|
611
849
|
|
612
|
-
|
613
|
-
|
614
|
-
|
850
|
+
var re = new RegExp( "^(" + indent_re + "{" + depth + "}.*?\\n?)*$" ),
|
851
|
+
replace = new RegExp("^" + indent_re + "{" + depth + "}", "gm"),
|
852
|
+
ret = [];
|
853
|
+
|
854
|
+
while ( blocks.length > 0 ) {
|
855
|
+
if ( re.exec( blocks[0] ) ) {
|
856
|
+
var b = blocks.shift(),
|
857
|
+
// Now remove that indent
|
858
|
+
x = b.replace( replace, "");
|
859
|
+
|
860
|
+
ret.push( mk_block( x, b.trailing, b.lineNumber ) );
|
615
861
|
}
|
616
|
-
|
862
|
+
else
|
863
|
+
break;
|
864
|
+
}
|
865
|
+
return ret;
|
866
|
+
}
|
617
867
|
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
868
|
+
// passed to stack.forEach to turn list items up the stack into paras
|
869
|
+
function paragraphify(s, i, stack) {
|
870
|
+
var list = s.list;
|
871
|
+
var last_li = list[list.length-1];
|
872
|
+
|
873
|
+
if ( last_li[1] instanceof Array && last_li[1][0] === "para" )
|
874
|
+
return;
|
875
|
+
if ( i + 1 === stack.length ) {
|
876
|
+
// Last stack frame
|
877
|
+
// Keep the same array, but replace the contents
|
878
|
+
last_li.push( ["para"].concat( last_li.splice(1, last_li.length - 1) ) );
|
623
879
|
}
|
880
|
+
else {
|
881
|
+
var sublist = last_li.pop();
|
882
|
+
last_li.push( ["para"].concat( last_li.splice(1, last_li.length - 1) ), sublist );
|
883
|
+
}
|
884
|
+
}
|
624
885
|
|
625
|
-
|
626
|
-
|
627
|
-
var
|
886
|
+
// The matcher function
|
887
|
+
return function( block, next ) {
|
888
|
+
var m = block.match( is_list_re );
|
889
|
+
if ( !m )
|
890
|
+
return undefined;
|
628
891
|
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
892
|
+
function make_list( m ) {
|
893
|
+
var list = bullet_list.exec( m[2] )
|
894
|
+
? ["bulletlist"]
|
895
|
+
: ["numberlist"];
|
633
896
|
|
634
|
-
|
897
|
+
stack.push( { list: list, indent: m[1] } );
|
898
|
+
return list;
|
635
899
|
}
|
636
900
|
|
637
|
-
var next_block = next[0] && next[0].valueOf() || "";
|
638
901
|
|
639
|
-
|
640
|
-
|
902
|
+
var stack = [], // Stack of lists for nesting.
|
903
|
+
list = make_list( m ),
|
904
|
+
last_li,
|
905
|
+
loose = false,
|
906
|
+
ret = [ stack[0].list ],
|
907
|
+
i;
|
641
908
|
|
642
|
-
|
643
|
-
|
909
|
+
// Loop to search over block looking for inner block elements and loose lists
|
910
|
+
loose_search:
|
911
|
+
while ( true ) {
|
912
|
+
// Split into lines preserving new lines at end of line
|
913
|
+
var lines = block.split( /(?=\n)/ );
|
644
914
|
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
}
|
915
|
+
// We have to grab all lines for a li and call processInline on them
|
916
|
+
// once as there are some inline things that can span lines.
|
917
|
+
var li_accumulate = "", nl = "";
|
649
918
|
|
650
|
-
//
|
651
|
-
|
919
|
+
// Loop over the lines in this block looking for tight lists.
|
920
|
+
tight_search:
|
921
|
+
for ( var line_no = 0; line_no < lines.length; line_no++ ) {
|
922
|
+
nl = "";
|
923
|
+
var l = lines[line_no].replace(/^\n/, function(n) { nl = n; return ""; });
|
652
924
|
|
653
|
-
loose = true;
|
654
|
-
continue loose_search;
|
655
|
-
}
|
656
|
-
break;
|
657
|
-
} // loose_search
|
658
925
|
|
659
|
-
|
660
|
-
|
661
|
-
})(),
|
926
|
+
// TODO: really should cache this
|
927
|
+
var line_re = regex_for_depth( stack.length );
|
662
928
|
|
663
|
-
|
664
|
-
|
665
|
-
return undefined;
|
929
|
+
m = l.match( line_re );
|
930
|
+
//print( "line:", uneval(l), "\nline match:", uneval(m) );
|
666
931
|
|
667
|
-
|
932
|
+
// We have a list item
|
933
|
+
if ( m[1] !== undefined ) {
|
934
|
+
// Process the previous list item, if any
|
935
|
+
if ( li_accumulate.length ) {
|
936
|
+
add( last_li, loose, this.processInline( li_accumulate ), nl );
|
937
|
+
// Loose mode will have been dealt with. Reset it
|
938
|
+
loose = false;
|
939
|
+
li_accumulate = "";
|
940
|
+
}
|
668
941
|
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
942
|
+
m[1] = expand_tab( m[1] );
|
943
|
+
var wanted_depth = Math.floor(m[1].length/4)+1;
|
944
|
+
//print( "want:", wanted_depth, "stack:", stack.length);
|
945
|
+
if ( wanted_depth > stack.length ) {
|
946
|
+
// Deep enough for a nested list outright
|
947
|
+
//print ( "new nested list" );
|
948
|
+
list = make_list( m );
|
949
|
+
last_li.push( list );
|
950
|
+
last_li = list[1] = [ "listitem" ];
|
951
|
+
}
|
952
|
+
else {
|
953
|
+
// We aren't deep enough to be strictly a new level. This is
|
954
|
+
// where Md.pl goes nuts. If the indent matches a level in the
|
955
|
+
// stack, put it there, else put it one deeper then the
|
956
|
+
// wanted_depth deserves.
|
957
|
+
var found = false;
|
958
|
+
for ( i = 0; i < stack.length; i++ ) {
|
959
|
+
if ( stack[ i ].indent !== m[1] )
|
960
|
+
continue;
|
961
|
+
|
962
|
+
list = stack[ i ].list;
|
963
|
+
stack.splice( i+1, stack.length - (i+1) );
|
964
|
+
found = true;
|
965
|
+
break;
|
966
|
+
}
|
673
967
|
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
968
|
+
if (!found) {
|
969
|
+
//print("not found. l:", uneval(l));
|
970
|
+
wanted_depth++;
|
971
|
+
if ( wanted_depth <= stack.length ) {
|
972
|
+
stack.splice(wanted_depth, stack.length - wanted_depth);
|
973
|
+
//print("Desired depth now", wanted_depth, "stack:", stack.length);
|
974
|
+
list = stack[wanted_depth-1].list;
|
975
|
+
//print("list:", uneval(list) );
|
976
|
+
}
|
977
|
+
else {
|
978
|
+
//print ("made new stack for messy indent");
|
979
|
+
list = make_list(m);
|
980
|
+
last_li.push(list);
|
981
|
+
}
|
982
|
+
}
|
678
983
|
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
984
|
+
//print( uneval(list), "last", list === stack[stack.length-1].list );
|
985
|
+
last_li = [ "listitem" ];
|
986
|
+
list.push(last_li);
|
987
|
+
} // end depth of shenegains
|
988
|
+
nl = "";
|
989
|
+
}
|
683
990
|
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
block.trailing = b.trailing;
|
689
|
-
}
|
991
|
+
// Add content
|
992
|
+
if ( l.length > m[0].length )
|
993
|
+
li_accumulate += nl + l.substr( m[0].length );
|
994
|
+
} // tight_search
|
690
995
|
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
// If any link references were found get rid of them
|
698
|
-
if ( attr && attr.references ) {
|
699
|
-
delete attr.references;
|
700
|
-
// And then remove the attribute object if it's empty
|
701
|
-
if ( isEmpty( attr ) ) {
|
702
|
-
processedBlock.splice( 1, 1 );
|
703
|
-
}
|
704
|
-
}
|
996
|
+
if ( li_accumulate.length ) {
|
997
|
+
add( last_li, loose, this.processInline( li_accumulate ), nl );
|
998
|
+
// Loose mode will have been dealt with. Reset it
|
999
|
+
loose = false;
|
1000
|
+
li_accumulate = "";
|
1001
|
+
}
|
705
1002
|
|
706
|
-
|
707
|
-
|
708
|
-
|
1003
|
+
// Look at the next block - we might have a loose list. Or an extra
|
1004
|
+
// paragraph for the current li
|
1005
|
+
var contained = get_contained_blocks( stack.length, next );
|
709
1006
|
|
710
|
-
|
711
|
-
|
712
|
-
|
1007
|
+
// Deal with code blocks or properly nested lists
|
1008
|
+
if ( contained.length > 0 ) {
|
1009
|
+
// Make sure all listitems up the stack are paragraphs
|
1010
|
+
forEach( stack, paragraphify, this);
|
713
1011
|
|
714
|
-
|
715
|
-
|
1012
|
+
last_li.push.apply( last_li, this.toTree( contained, [] ) );
|
1013
|
+
}
|
716
1014
|
|
717
|
-
|
718
|
-
if ( !extract_attr( this.tree ) ) {
|
719
|
-
this.tree.splice( 1, 0, {} );
|
720
|
-
}
|
1015
|
+
var next_block = next[0] && next[0].valueOf() || "";
|
721
1016
|
|
722
|
-
|
1017
|
+
if ( next_block.match(is_list_re) || next_block.match( /^ / ) ) {
|
1018
|
+
block = next.shift();
|
723
1019
|
|
724
|
-
|
725
|
-
|
726
|
-
attrs.references = {};
|
727
|
-
}
|
1020
|
+
// Check for an HR following a list: features/lists/hr_abutting
|
1021
|
+
var hr = this.dialect.block.horizRule( block, next );
|
728
1022
|
|
729
|
-
|
1023
|
+
if ( hr ) {
|
1024
|
+
ret.push.apply(ret, hr);
|
1025
|
+
break;
|
1026
|
+
}
|
730
1027
|
|
731
|
-
|
732
|
-
|
1028
|
+
// Make sure all listitems up the stack are paragraphs
|
1029
|
+
forEach( stack, paragraphify, this);
|
1030
|
+
|
1031
|
+
loose = true;
|
1032
|
+
continue loose_search;
|
1033
|
+
}
|
1034
|
+
break;
|
1035
|
+
} // loose_search
|
733
1036
|
|
734
|
-
|
735
|
-
href: m[2]
|
1037
|
+
return ret;
|
736
1038
|
};
|
1039
|
+
})(),
|
1040
|
+
|
1041
|
+
blockquote: function blockquote( block, next ) {
|
1042
|
+
if ( !block.match( /^>/m ) )
|
1043
|
+
return undefined;
|
1044
|
+
|
1045
|
+
var jsonml = [];
|
1046
|
+
|
1047
|
+
// separate out the leading abutting block, if any. I.e. in this case:
|
1048
|
+
//
|
1049
|
+
// a
|
1050
|
+
// > b
|
1051
|
+
//
|
1052
|
+
if ( block[ 0 ] !== ">" ) {
|
1053
|
+
var lines = block.split( /\n/ ),
|
1054
|
+
prev = [],
|
1055
|
+
line_no = block.lineNumber;
|
1056
|
+
|
1057
|
+
// keep shifting lines until you find a crotchet
|
1058
|
+
while ( lines.length && lines[ 0 ][ 0 ] !== ">" ) {
|
1059
|
+
prev.push( lines.shift() );
|
1060
|
+
line_no++;
|
1061
|
+
}
|
1062
|
+
|
1063
|
+
var abutting = mk_block( prev.join( "\n" ), "\n", block.lineNumber );
|
1064
|
+
jsonml.push.apply( jsonml, this.processBlock( abutting, [] ) );
|
1065
|
+
// reassemble new block of just block quotes!
|
1066
|
+
block = mk_block( lines.join( "\n" ), block.trailing, line_no );
|
1067
|
+
}
|
737
1068
|
|
738
|
-
if ( m[4] !== undefined )
|
739
|
-
ref.title = m[4];
|
740
|
-
else if ( m[5] !== undefined )
|
741
|
-
ref.title = m[5];
|
742
1069
|
|
743
|
-
|
1070
|
+
// if the next block is also a blockquote merge it in
|
1071
|
+
while ( next.length && next[ 0 ][ 0 ] === ">" ) {
|
1072
|
+
var b = next.shift();
|
1073
|
+
block = mk_block( block + block.trailing + b, b.trailing, block.lineNumber );
|
1074
|
+
}
|
744
1075
|
|
745
|
-
|
746
|
-
|
1076
|
+
// Strip off the leading "> " and re-process as a block.
|
1077
|
+
var input = block.replace( /^> ?/gm, "" ),
|
1078
|
+
old_tree = this.tree,
|
1079
|
+
processedBlock = this.toTree( input, [ "blockquote" ] ),
|
1080
|
+
attr = extract_attr( processedBlock );
|
1081
|
+
|
1082
|
+
// If any link references were found get rid of them
|
1083
|
+
if ( attr && attr.references ) {
|
1084
|
+
delete attr.references;
|
1085
|
+
// And then remove the attribute object if it's empty
|
1086
|
+
if ( isEmpty( attr ) )
|
1087
|
+
processedBlock.splice( 1, 1 );
|
1088
|
+
}
|
747
1089
|
|
748
|
-
|
749
|
-
|
1090
|
+
jsonml.push( processedBlock );
|
1091
|
+
return jsonml;
|
1092
|
+
},
|
750
1093
|
|
751
|
-
|
752
|
-
|
753
|
-
|
754
|
-
}
|
755
|
-
}
|
756
|
-
};
|
1094
|
+
referenceDefn: function referenceDefn( block, next) {
|
1095
|
+
var re = /^\s*\[(.*?)\]:\s*(\S+)(?:\s+(?:(['"])(.*?)\3|\((.*?)\)))?\n?/;
|
1096
|
+
// interesting matches are [ , ref_id, url, , title, title ]
|
757
1097
|
|
758
|
-
|
1098
|
+
if ( !block.match(re) )
|
1099
|
+
return undefined;
|
759
1100
|
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
lastIndex = 0;
|
1101
|
+
// make an attribute node if it doesn't exist
|
1102
|
+
if ( !extract_attr( this.tree ) )
|
1103
|
+
this.tree.splice( 1, 0, {} );
|
764
1104
|
|
765
|
-
|
766
|
-
var re = new RegExp( "([\\s\\S]*?)(" + (patterns_or_re.source || patterns_or_re) + ")" );
|
1105
|
+
var attrs = extract_attr( this.tree );
|
767
1106
|
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
}
|
1107
|
+
// make a references hash if it doesn't exist
|
1108
|
+
if ( attrs.references === undefined )
|
1109
|
+
attrs.references = {};
|
1110
|
+
|
1111
|
+
var b = this.loop_re_over_block(re, block, function( m ) {
|
1112
|
+
|
1113
|
+
if ( m[2] && m[2][0] === "<" && m[2][m[2].length-1] === ">" )
|
1114
|
+
m[2] = m[2].substring( 1, m[2].length - 1 );
|
777
1115
|
|
778
|
-
|
779
|
-
|
780
|
-
|
781
|
-
this,
|
782
|
-
text.substr( m.index ), m, previous_nodes || [] );
|
783
|
-
}
|
784
|
-
// Default for now to make dev easier. just slurp special and output it.
|
785
|
-
res = res || [ m[2].length, m[2] ];
|
786
|
-
return res;
|
787
|
-
},
|
1116
|
+
var ref = attrs.references[ m[1].toLowerCase() ] = {
|
1117
|
+
href: m[2]
|
1118
|
+
};
|
788
1119
|
|
789
|
-
|
1120
|
+
if ( m[4] !== undefined )
|
1121
|
+
ref.title = m[4];
|
1122
|
+
else if ( m[5] !== undefined )
|
1123
|
+
ref.title = m[5];
|
790
1124
|
|
791
|
-
|
792
|
-
res;
|
1125
|
+
} );
|
793
1126
|
|
794
|
-
|
795
|
-
|
796
|
-
if ( typeof x == "string" && typeof out[out.length-1] == "string" )
|
797
|
-
out[ out.length-1 ] += x;
|
798
|
-
else
|
799
|
-
out.push(x);
|
800
|
-
}
|
1127
|
+
if ( b.length )
|
1128
|
+
next.unshift( mk_block( b, block.trailing ) );
|
801
1129
|
|
802
|
-
|
803
|
-
|
804
|
-
text = text.substr( res.shift() );
|
805
|
-
forEach(res, add )
|
806
|
-
}
|
1130
|
+
return [];
|
1131
|
+
},
|
807
1132
|
|
808
|
-
|
1133
|
+
para: function para( block ) {
|
1134
|
+
// everything's a para!
|
1135
|
+
return [ ["para"].concat( this.processInline( block ) ) ];
|
1136
|
+
}
|
809
1137
|
},
|
810
1138
|
|
811
|
-
|
812
|
-
// chunks of plain text blocks don't include them
|
813
|
-
"]": function () {},
|
814
|
-
"}": function () {},
|
1139
|
+
inline: {
|
815
1140
|
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
if ( text.match( /^\\[\\`\*_{}\[\]()#\+.!\-]/ ) )
|
820
|
-
return [ 2, text.charAt( 1 ) ];
|
821
|
-
else
|
822
|
-
// Not an esacpe
|
823
|
-
return [ 1, "\\" ];
|
824
|
-
},
|
1141
|
+
__oneElement__: function oneElement( text, patterns_or_re, previous_nodes ) {
|
1142
|
+
var m,
|
1143
|
+
res;
|
825
1144
|
|
826
|
-
|
1145
|
+
patterns_or_re = patterns_or_re || this.dialect.inline.__patterns__;
|
1146
|
+
var re = new RegExp( "([\\s\\S]*?)(" + (patterns_or_re.source || patterns_or_re) + ")" );
|
827
1147
|
|
828
|
-
|
829
|
-
|
1148
|
+
m = re.exec( text );
|
1149
|
+
if (!m) {
|
1150
|
+
// Just boring text
|
1151
|
+
return [ text.length, text ];
|
1152
|
+
}
|
1153
|
+
else if ( m[1] ) {
|
1154
|
+
// Some un-interesting text matched. Return that first
|
1155
|
+
return [ m[1].length, m[1] ];
|
1156
|
+
}
|
830
1157
|
|
831
|
-
|
832
|
-
|
833
|
-
|
1158
|
+
var res;
|
1159
|
+
if ( m[2] in this.dialect.inline ) {
|
1160
|
+
res = this.dialect.inline[ m[2] ].call(
|
1161
|
+
this,
|
1162
|
+
text.substr( m.index ), m, previous_nodes || [] );
|
1163
|
+
}
|
1164
|
+
// Default for now to make dev easier. just slurp special and output it.
|
1165
|
+
res = res || [ m[2].length, m[2] ];
|
1166
|
+
return res;
|
1167
|
+
},
|
1168
|
+
|
1169
|
+
__call__: function inline( text, patterns ) {
|
1170
|
+
|
1171
|
+
var out = [],
|
1172
|
+
res;
|
1173
|
+
|
1174
|
+
function add(x) {
|
1175
|
+
//D:self.debug(" adding output", uneval(x));
|
1176
|
+
if ( typeof x === "string" && typeof out[out.length-1] === "string" )
|
1177
|
+
out[ out.length-1 ] += x;
|
1178
|
+
else
|
1179
|
+
out.push(x);
|
1180
|
+
}
|
834
1181
|
|
835
|
-
|
836
|
-
|
837
|
-
|
1182
|
+
while ( text.length > 0 ) {
|
1183
|
+
res = this.dialect.inline.__oneElement__.call(this, text, patterns, out );
|
1184
|
+
text = text.substr( res.shift() );
|
1185
|
+
forEach(res, add );
|
1186
|
+
}
|
838
1187
|
|
839
|
-
|
1188
|
+
return out;
|
1189
|
+
},
|
840
1190
|
|
841
|
-
|
842
|
-
|
843
|
-
|
1191
|
+
// These characters are intersting elsewhere, so have rules for them so that
|
1192
|
+
// chunks of plain text blocks don't include them
|
1193
|
+
"]": function () {},
|
1194
|
+
"}": function () {},
|
844
1195
|
|
845
|
-
|
846
|
-
}
|
1196
|
+
__escape__ : /^\\[\\`\*_{}\[\]()#\+.!\-]/,
|
847
1197
|
|
848
|
-
|
849
|
-
|
1198
|
+
"\\": function escaped( text ) {
|
1199
|
+
// [ length of input processed, node/children to add... ]
|
1200
|
+
// Only esacape: \ ` * _ { } [ ] ( ) # * + - . !
|
1201
|
+
if ( this.dialect.inline.__escape__.exec( text ) )
|
1202
|
+
return [ 2, text.charAt( 1 ) ];
|
1203
|
+
else
|
1204
|
+
// Not an esacpe
|
1205
|
+
return [ 1, "\\" ];
|
1206
|
+
},
|
850
1207
|
|
851
|
-
|
852
|
-
// We can't check if the reference is known here as it likely wont be
|
853
|
-
// found till after. Check it in md tree->hmtl tree conversion
|
854
|
-
return [ m[0].length, [ "img_ref", { alt: m[1], ref: m[2].toLowerCase(), original: m[0] } ] ];
|
855
|
-
}
|
1208
|
+
"![": function image( text ) {
|
856
1209
|
|
857
|
-
|
858
|
-
|
859
|
-
},
|
1210
|
+
// Unlike images, alt text is plain text only. no other elements are
|
1211
|
+
// allowed in there
|
860
1212
|
|
861
|
-
|
862
|
-
|
863
|
-
|
864
|
-
// Inline content is possible inside `link text`
|
865
|
-
var res = Markdown.DialectHelpers.inline_until_char.call( this, text.substr(1), "]" );
|
866
|
-
|
867
|
-
// No closing ']' found. Just consume the [
|
868
|
-
if ( !res ) return [ 1, "[" ];
|
869
|
-
|
870
|
-
var consumed = 1 + res[ 0 ],
|
871
|
-
children = res[ 1 ],
|
872
|
-
link,
|
873
|
-
attrs;
|
874
|
-
|
875
|
-
// At this point the first [...] has been parsed. See what follows to find
|
876
|
-
// out which kind of link we are (reference or direct url)
|
877
|
-
text = text.substr( consumed );
|
878
|
-
|
879
|
-
// [link text](/path/to/img.jpg "Optional title")
|
880
|
-
// 1 2 3 <--- captures
|
881
|
-
// This will capture up to the last paren in the block. We then pull
|
882
|
-
// back based on if there a matching ones in the url
|
883
|
-
// ([here](/url/(test))
|
884
|
-
// The parens have to be balanced
|
885
|
-
var m = text.match( /^\s*\([ \t]*([^"']*)(?:[ \t]+(["'])(.*?)\2)?[ \t]*\)/ );
|
886
|
-
if ( m ) {
|
887
|
-
var url = m[1];
|
888
|
-
consumed += m[0].length;
|
889
|
-
|
890
|
-
if ( url && url[0] == "<" && url[url.length-1] == ">" )
|
891
|
-
url = url.substring( 1, url.length - 1 );
|
892
|
-
|
893
|
-
// If there is a title we don't have to worry about parens in the url
|
894
|
-
if ( !m[3] ) {
|
895
|
-
var open_parens = 1; // One open that isn't in the capture
|
896
|
-
for ( var len = 0; len < url.length; len++ ) {
|
897
|
-
switch ( url[len] ) {
|
898
|
-
case "(":
|
899
|
-
open_parens++;
|
900
|
-
break;
|
901
|
-
case ")":
|
902
|
-
if ( --open_parens == 0) {
|
903
|
-
consumed -= url.length - len;
|
904
|
-
url = url.substring(0, len);
|
905
|
-
}
|
906
|
-
break;
|
907
|
-
}
|
908
|
-
}
|
909
|
-
}
|
1213
|
+
// 
|
1214
|
+
// 1 2 3 4 <--- captures
|
1215
|
+
var m = text.match( /^!\[(.*?)\][ \t]*\([ \t]*([^")]*?)(?:[ \t]+(["'])(.*?)\3)?[ \t]*\)/ );
|
910
1216
|
|
911
|
-
|
912
|
-
|
1217
|
+
if ( m ) {
|
1218
|
+
if ( m[2] && m[2][0] === "<" && m[2][m[2].length-1] === ">" )
|
1219
|
+
m[2] = m[2].substring( 1, m[2].length - 1 );
|
913
1220
|
|
914
|
-
|
915
|
-
if ( m[3] !== undefined)
|
916
|
-
attrs.title = m[3];
|
1221
|
+
m[2] = this.dialect.inline.__call__.call( this, m[2], /\\/ )[0];
|
917
1222
|
|
918
|
-
|
919
|
-
|
920
|
-
|
1223
|
+
var attrs = { alt: m[1], href: m[2] || "" };
|
1224
|
+
if ( m[4] !== undefined)
|
1225
|
+
attrs.title = m[4];
|
921
1226
|
|
922
|
-
|
923
|
-
|
924
|
-
m = text.match( /^\s*\[(.*?)\]/ );
|
1227
|
+
return [ m[0].length, [ "img", attrs ] ];
|
1228
|
+
}
|
925
1229
|
|
926
|
-
|
1230
|
+
// ![Alt text][id]
|
1231
|
+
m = text.match( /^!\[(.*?)\][ \t]*\[(.*?)\]/ );
|
927
1232
|
|
928
|
-
|
1233
|
+
if ( m ) {
|
1234
|
+
// We can't check if the reference is known here as it likely wont be
|
1235
|
+
// found till after. Check it in md tree->hmtl tree conversion
|
1236
|
+
return [ m[0].length, [ "img_ref", { alt: m[1], ref: m[2].toLowerCase(), original: m[0] } ] ];
|
1237
|
+
}
|
929
1238
|
|
930
|
-
//
|
931
|
-
|
1239
|
+
// Just consume the '!['
|
1240
|
+
return [ 2, "![" ];
|
1241
|
+
},
|
1242
|
+
|
1243
|
+
"[": function link( text ) {
|
1244
|
+
|
1245
|
+
var orig = String(text);
|
1246
|
+
// Inline content is possible inside `link text`
|
1247
|
+
var res = inline_until_char.call( this, text.substr(1), "]" );
|
1248
|
+
|
1249
|
+
// No closing ']' found. Just consume the [
|
1250
|
+
if ( !res )
|
1251
|
+
return [ 1, "[" ];
|
1252
|
+
|
1253
|
+
var consumed = 1 + res[ 0 ],
|
1254
|
+
children = res[ 1 ],
|
1255
|
+
link,
|
1256
|
+
attrs;
|
1257
|
+
|
1258
|
+
// At this point the first [...] has been parsed. See what follows to find
|
1259
|
+
// out which kind of link we are (reference or direct url)
|
1260
|
+
text = text.substr( consumed );
|
1261
|
+
|
1262
|
+
// [link text](/path/to/img.jpg "Optional title")
|
1263
|
+
// 1 2 3 <--- captures
|
1264
|
+
// This will capture up to the last paren in the block. We then pull
|
1265
|
+
// back based on if there a matching ones in the url
|
1266
|
+
// ([here](/url/(test))
|
1267
|
+
// The parens have to be balanced
|
1268
|
+
var m = text.match( /^\s*\([ \t]*([^"']*)(?:[ \t]+(["'])(.*?)\2)?[ \t]*\)/ );
|
1269
|
+
if ( m ) {
|
1270
|
+
var url = m[1];
|
1271
|
+
consumed += m[0].length;
|
1272
|
+
|
1273
|
+
if ( url && url[0] === "<" && url[url.length-1] === ">" )
|
1274
|
+
url = url.substring( 1, url.length - 1 );
|
1275
|
+
|
1276
|
+
// If there is a title we don't have to worry about parens in the url
|
1277
|
+
if ( !m[3] ) {
|
1278
|
+
var open_parens = 1; // One open that isn't in the capture
|
1279
|
+
for ( var len = 0; len < url.length; len++ ) {
|
1280
|
+
switch ( url[len] ) {
|
1281
|
+
case "(":
|
1282
|
+
open_parens++;
|
1283
|
+
break;
|
1284
|
+
case ")":
|
1285
|
+
if ( --open_parens === 0) {
|
1286
|
+
consumed -= url.length - len;
|
1287
|
+
url = url.substring(0, len);
|
1288
|
+
}
|
1289
|
+
break;
|
1290
|
+
}
|
1291
|
+
}
|
1292
|
+
}
|
932
1293
|
|
933
|
-
|
1294
|
+
// Process escapes only
|
1295
|
+
url = this.dialect.inline.__call__.call( this, url, /\\/ )[0];
|
934
1296
|
|
935
|
-
|
936
|
-
|
937
|
-
|
938
|
-
return [ consumed, link ];
|
939
|
-
}
|
1297
|
+
attrs = { href: url || "" };
|
1298
|
+
if ( m[3] !== undefined)
|
1299
|
+
attrs.title = m[3];
|
940
1300
|
|
941
|
-
|
942
|
-
|
943
|
-
|
1301
|
+
link = [ "link", attrs ].concat( children );
|
1302
|
+
return [ consumed, link ];
|
1303
|
+
}
|
944
1304
|
|
945
|
-
|
946
|
-
|
947
|
-
|
948
|
-
}
|
1305
|
+
// [Alt text][id]
|
1306
|
+
// [Alt text] [id]
|
1307
|
+
m = text.match( /^\s*\[(.*?)\]/ );
|
949
1308
|
|
950
|
-
|
951
|
-
return [ 1, "[" ];
|
952
|
-
},
|
1309
|
+
if ( m ) {
|
953
1310
|
|
1311
|
+
consumed += m[ 0 ].length;
|
954
1312
|
|
955
|
-
|
956
|
-
|
1313
|
+
// [links][] uses links as its reference
|
1314
|
+
attrs = { ref: ( m[ 1 ] || String(children) ).toLowerCase(), original: orig.substr( 0, consumed ) };
|
957
1315
|
|
958
|
-
|
959
|
-
if ( m[3] ) {
|
960
|
-
return [ m[0].length, [ "link", { href: "mailto:" + m[3] }, m[3] ] ];
|
1316
|
+
link = [ "link_ref", attrs ].concat( children );
|
961
1317
|
|
1318
|
+
// We can't check if the reference is known here as it likely wont be
|
1319
|
+
// found till after. Check it in md tree->hmtl tree conversion.
|
1320
|
+
// Store the original so that conversion can revert if the ref isn't found.
|
1321
|
+
return [ consumed, link ];
|
962
1322
|
}
|
963
|
-
else if ( m[2] == "mailto" ) {
|
964
|
-
return [ m[0].length, [ "link", { href: m[1] }, m[1].substr("mailto:".length ) ] ];
|
965
|
-
}
|
966
|
-
else
|
967
|
-
return [ m[0].length, [ "link", { href: m[1] }, m[1] ] ];
|
968
|
-
}
|
969
1323
|
|
970
|
-
|
971
|
-
|
1324
|
+
// [id]
|
1325
|
+
// Only if id is plain (no formatting.)
|
1326
|
+
if ( children.length === 1 && typeof children[0] === "string" ) {
|
972
1327
|
|
973
|
-
|
974
|
-
|
975
|
-
|
976
|
-
|
1328
|
+
attrs = { ref: children[0].toLowerCase(), original: orig.substr( 0, consumed ) };
|
1329
|
+
link = [ "link_ref", attrs, children[0] ];
|
1330
|
+
return [ consumed, link ];
|
1331
|
+
}
|
977
1332
|
|
978
|
-
|
979
|
-
return [
|
980
|
-
|
981
|
-
// TODO: No matching end code found - warn!
|
982
|
-
return [ 1, "`" ];
|
983
|
-
}
|
984
|
-
},
|
1333
|
+
// Just consume the "["
|
1334
|
+
return [ 1, "[" ];
|
1335
|
+
},
|
985
1336
|
|
986
|
-
" \n": function lineBreak( text ) {
|
987
|
-
return [ 3, [ "linebreak" ] ];
|
988
|
-
}
|
989
1337
|
|
990
|
-
|
1338
|
+
"<": function autoLink( text ) {
|
1339
|
+
var m;
|
991
1340
|
|
992
|
-
|
993
|
-
|
1341
|
+
if ( ( m = text.match( /^<(?:((https?|ftp|mailto):[^>]+)|(.*?@.*?\.[a-zA-Z]+))>/ ) ) !== null ) {
|
1342
|
+
if ( m[3] )
|
1343
|
+
return [ m[0].length, [ "link", { href: "mailto:" + m[3] }, m[3] ] ];
|
1344
|
+
else if ( m[2] === "mailto" )
|
1345
|
+
return [ m[0].length, [ "link", { href: m[1] }, m[1].substr("mailto:".length ) ] ];
|
1346
|
+
else
|
1347
|
+
return [ m[0].length, [ "link", { href: m[1] }, m[1] ] ];
|
1348
|
+
}
|
994
1349
|
|
995
|
-
|
996
|
-
|
1350
|
+
return [ 1, "<" ];
|
1351
|
+
},
|
997
1352
|
|
998
|
-
|
999
|
-
|
1000
|
-
|
1001
|
-
|
1353
|
+
"`": function inlineCode( text ) {
|
1354
|
+
// Inline code block. as many backticks as you like to start it
|
1355
|
+
// Always skip over the opening ticks.
|
1356
|
+
var m = text.match( /(`+)(([\s\S]*?)\1)/ );
|
1002
1357
|
|
1003
|
-
|
1358
|
+
if ( m && m[2] )
|
1359
|
+
return [ m[1].length + m[2].length, [ "inlinecode", m[3] ] ];
|
1360
|
+
else {
|
1361
|
+
// TODO: No matching end code found - warn!
|
1362
|
+
return [ 1, "`" ];
|
1363
|
+
}
|
1364
|
+
},
|
1004
1365
|
|
1005
|
-
|
1006
|
-
|
1007
|
-
|
1008
|
-
this[state_slot].shift();
|
1366
|
+
" \n": function lineBreak() {
|
1367
|
+
return [ 3, [ "linebreak" ] ];
|
1368
|
+
}
|
1009
1369
|
|
1010
|
-
// "Consume" everything to go back to the recrusion in the else-block below
|
1011
|
-
return[ text.length, new CloseTag(text.length-md.length) ];
|
1012
1370
|
}
|
1013
|
-
|
1014
|
-
// Store a clone of the em/strong states
|
1015
|
-
var other = this[other_slot].slice(),
|
1016
|
-
state = this[state_slot].slice();
|
1371
|
+
};
|
1017
1372
|
|
1018
|
-
|
1373
|
+
// Meta Helper/generator method for em and strong handling
|
1374
|
+
function strong_em( tag, md ) {
|
1019
1375
|
|
1020
|
-
|
1376
|
+
var state_slot = tag + "_state",
|
1377
|
+
other_slot = tag === "strong" ? "em_state" : "strong_state";
|
1021
1378
|
|
1022
|
-
|
1023
|
-
|
1024
|
-
|
1379
|
+
function CloseTag(len) {
|
1380
|
+
this.len_after = len;
|
1381
|
+
this.name = "close_" + md;
|
1382
|
+
}
|
1025
1383
|
|
1026
|
-
|
1384
|
+
return function ( text ) {
|
1027
1385
|
|
1028
|
-
|
1386
|
+
if ( this[state_slot][0] === md ) {
|
1387
|
+
// Most recent em is of this type
|
1388
|
+
//D:this.debug("closing", md);
|
1389
|
+
this[state_slot].shift();
|
1029
1390
|
|
1030
|
-
|
1031
|
-
|
1032
|
-
res.pop();
|
1033
|
-
// We matched! Huzzah.
|
1034
|
-
var consumed = text.length - last.len_after;
|
1035
|
-
return [ consumed, [ tag ].concat(res) ];
|
1391
|
+
// "Consume" everything to go back to the recrusion in the else-block below
|
1392
|
+
return[ text.length, new CloseTag(text.length-md.length) ];
|
1036
1393
|
}
|
1037
1394
|
else {
|
1038
|
-
//
|
1039
|
-
this[other_slot]
|
1040
|
-
|
1395
|
+
// Store a clone of the em/strong states
|
1396
|
+
var other = this[other_slot].slice(),
|
1397
|
+
state = this[state_slot].slice();
|
1041
1398
|
|
1042
|
-
|
1043
|
-
return [ md.length, md ];
|
1044
|
-
}
|
1045
|
-
}
|
1046
|
-
}; // End returned function
|
1047
|
-
}
|
1399
|
+
this[state_slot].unshift(md);
|
1048
1400
|
|
1049
|
-
|
1050
|
-
Markdown.dialects.Gruber.inline["__"] = strong_em("strong", "__");
|
1051
|
-
Markdown.dialects.Gruber.inline["*"] = strong_em("em", "*");
|
1052
|
-
Markdown.dialects.Gruber.inline["_"] = strong_em("em", "_");
|
1401
|
+
//D:this.debug_indent += " ";
|
1053
1402
|
|
1403
|
+
// Recurse
|
1404
|
+
var res = this.processInline( text.substr( md.length ) );
|
1405
|
+
//D:this.debug_indent = this.debug_indent.substr(2);
|
1054
1406
|
|
1055
|
-
|
1056
|
-
Markdown.buildBlockOrder = function(d) {
|
1057
|
-
var ord = [];
|
1058
|
-
for ( var i in d ) {
|
1059
|
-
if ( i == "__order__" || i == "__call__" ) continue;
|
1060
|
-
ord.push( i );
|
1061
|
-
}
|
1062
|
-
d.__order__ = ord;
|
1063
|
-
};
|
1064
|
-
|
1065
|
-
// Build patterns for inline matcher
|
1066
|
-
Markdown.buildInlinePatterns = function(d) {
|
1067
|
-
var patterns = [];
|
1068
|
-
|
1069
|
-
for ( var i in d ) {
|
1070
|
-
// __foo__ is reserved and not a pattern
|
1071
|
-
if ( i.match( /^__.*__$/) ) continue;
|
1072
|
-
var l = i.replace( /([\\.*+?|()\[\]{}])/g, "\\$1" )
|
1073
|
-
.replace( /\n/, "\\n" );
|
1074
|
-
patterns.push( i.length == 1 ? l : "(?:" + l + ")" );
|
1075
|
-
}
|
1076
|
-
|
1077
|
-
patterns = patterns.join("|");
|
1078
|
-
d.__patterns__ = patterns;
|
1079
|
-
//print("patterns:", uneval( patterns ) );
|
1407
|
+
var last = res[res.length - 1];
|
1080
1408
|
|
1081
|
-
|
1082
|
-
d.__call__ = function(text, pattern) {
|
1083
|
-
if ( pattern != undefined ) {
|
1084
|
-
return fn.call(this, text, pattern);
|
1085
|
-
}
|
1086
|
-
else
|
1087
|
-
{
|
1088
|
-
return fn.call(this, text, patterns);
|
1089
|
-
}
|
1090
|
-
};
|
1091
|
-
};
|
1092
|
-
|
1093
|
-
Markdown.DialectHelpers = {};
|
1094
|
-
Markdown.DialectHelpers.inline_until_char = function( text, want ) {
|
1095
|
-
var consumed = 0,
|
1096
|
-
nodes = [];
|
1097
|
-
|
1098
|
-
while ( true ) {
|
1099
|
-
if ( text.charAt( consumed ) == want ) {
|
1100
|
-
// Found the character we were looking for
|
1101
|
-
consumed++;
|
1102
|
-
return [ consumed, nodes ];
|
1103
|
-
}
|
1409
|
+
//D:this.debug("processInline from", tag + ": ", uneval( res ) );
|
1104
1410
|
|
1105
|
-
|
1106
|
-
|
1107
|
-
|
1108
|
-
|
1411
|
+
var check = this[state_slot].shift();
|
1412
|
+
if ( last instanceof CloseTag ) {
|
1413
|
+
res.pop();
|
1414
|
+
// We matched! Huzzah.
|
1415
|
+
var consumed = text.length - last.len_after;
|
1416
|
+
return [ consumed, [ tag ].concat(res) ];
|
1417
|
+
}
|
1418
|
+
else {
|
1419
|
+
// Restore the state of the other kind. We might have mistakenly closed it.
|
1420
|
+
this[other_slot] = other;
|
1421
|
+
this[state_slot] = state;
|
1109
1422
|
|
1110
|
-
|
1111
|
-
|
1112
|
-
|
1113
|
-
|
1423
|
+
// We can't reuse the processed result as it could have wrong parsing contexts in it.
|
1424
|
+
return [ md.length, md ];
|
1425
|
+
}
|
1426
|
+
}
|
1427
|
+
}; // End returned function
|
1114
1428
|
}
|
1115
|
-
}
|
1116
1429
|
|
1117
|
-
|
1118
|
-
|
1119
|
-
|
1120
|
-
|
1121
|
-
function Inline() {}
|
1122
|
-
Inline.prototype = d.inline;
|
1430
|
+
Gruber.inline["**"] = strong_em("strong", "**");
|
1431
|
+
Gruber.inline["__"] = strong_em("strong", "__");
|
1432
|
+
Gruber.inline["*"] = strong_em("em", "*");
|
1433
|
+
Gruber.inline["_"] = strong_em("em", "_");
|
1123
1434
|
|
1124
|
-
|
1125
|
-
|
1435
|
+
Markdown.dialects.Gruber = Gruber;
|
1436
|
+
Markdown.buildBlockOrder ( Markdown.dialects.Gruber.block );
|
1437
|
+
Markdown.buildInlinePatterns( Markdown.dialects.Gruber.inline );
|
1126
1438
|
|
1127
|
-
Markdown.buildBlockOrder ( Markdown.dialects.Gruber.block );
|
1128
|
-
Markdown.buildInlinePatterns( Markdown.dialects.Gruber.inline );
|
1129
1439
|
|
1130
|
-
Markdown.dialects.Maruku = Markdown.subclassDialect( Markdown.dialects.Gruber );
|
1131
1440
|
|
1132
|
-
|
1133
|
-
|
1134
|
-
|
1441
|
+
var Maruku = DialectHelpers.subclassDialect( Gruber ),
|
1442
|
+
extract_attr = MarkdownHelpers.extract_attr,
|
1443
|
+
forEach = MarkdownHelpers.forEach;
|
1135
1444
|
|
1136
|
-
|
1137
|
-
|
1138
|
-
|
1139
|
-
|
1140
|
-
|
1141
|
-
|
1142
|
-
|
1143
|
-
|
1144
|
-
|
1145
|
-
|
1445
|
+
Maruku.processMetaHash = function processMetaHash( meta_string ) {
|
1446
|
+
var meta = split_meta_hash( meta_string ),
|
1447
|
+
attr = {};
|
1448
|
+
|
1449
|
+
for ( var i = 0; i < meta.length; ++i ) {
|
1450
|
+
// id: #foo
|
1451
|
+
if ( /^#/.test( meta[ i ] ) )
|
1452
|
+
attr.id = meta[ i ].substring( 1 );
|
1453
|
+
// class: .foo
|
1454
|
+
else if ( /^\./.test( meta[ i ] ) ) {
|
1455
|
+
// if class already exists, append the new one
|
1456
|
+
if ( attr["class"] )
|
1457
|
+
attr["class"] = attr["class"] + meta[ i ].replace( /./, " " );
|
1458
|
+
else
|
1459
|
+
attr["class"] = meta[ i ].substring( 1 );
|
1146
1460
|
}
|
1147
|
-
|
1148
|
-
|
1461
|
+
// attribute: foo=bar
|
1462
|
+
else if ( /\=/.test( meta[ i ] ) ) {
|
1463
|
+
var s = meta[ i ].split( /\=/ );
|
1464
|
+
attr[ s[ 0 ] ] = s[ 1 ];
|
1149
1465
|
}
|
1150
1466
|
}
|
1151
|
-
// attribute: foo=bar
|
1152
|
-
else if ( /\=/.test( meta[ i ] ) ) {
|
1153
|
-
var s = meta[ i ].split( /\=/ );
|
1154
|
-
attr[ s[ 0 ] ] = s[ 1 ];
|
1155
|
-
}
|
1156
|
-
}
|
1157
1467
|
|
1158
|
-
|
1159
|
-
}
|
1468
|
+
return attr;
|
1469
|
+
};
|
1160
1470
|
|
1161
|
-
function split_meta_hash( meta_string ) {
|
1162
|
-
|
1163
|
-
|
1164
|
-
|
1471
|
+
function split_meta_hash( meta_string ) {
|
1472
|
+
var meta = meta_string.split( "" ),
|
1473
|
+
parts = [ "" ],
|
1474
|
+
in_quotes = false;
|
1165
1475
|
|
1166
|
-
|
1167
|
-
|
1168
|
-
|
1476
|
+
while ( meta.length ) {
|
1477
|
+
var letter = meta.shift();
|
1478
|
+
switch ( letter ) {
|
1169
1479
|
case " " :
|
1170
1480
|
// if we're in a quoted section, keep it
|
1171
|
-
if ( in_quotes )
|
1481
|
+
if ( in_quotes )
|
1172
1482
|
parts[ parts.length - 1 ] += letter;
|
1173
|
-
}
|
1174
1483
|
// otherwise make a new part
|
1175
|
-
else
|
1484
|
+
else
|
1176
1485
|
parts.push( "" );
|
1177
|
-
}
|
1178
1486
|
break;
|
1179
1487
|
case "'" :
|
1180
1488
|
case '"' :
|
@@ -1185,458 +1493,248 @@ function split_meta_hash( meta_string ) {
|
|
1185
1493
|
// shift off the next letter to be used straight away.
|
1186
1494
|
// it was escaped so we'll keep it whatever it is
|
1187
1495
|
letter = meta.shift();
|
1496
|
+
/* falls through */
|
1188
1497
|
default :
|
1189
1498
|
parts[ parts.length - 1 ] += letter;
|
1190
1499
|
break;
|
1500
|
+
}
|
1191
1501
|
}
|
1192
|
-
}
|
1193
|
-
|
1194
|
-
return parts;
|
1195
|
-
}
|
1196
|
-
|
1197
|
-
Markdown.dialects.Maruku.block.document_meta = function document_meta( block, next ) {
|
1198
|
-
// we're only interested in the first block
|
1199
|
-
if ( block.lineNumber > 1 ) return undefined;
|
1200
|
-
|
1201
|
-
// document_meta blocks consist of one or more lines of `Key: Value\n`
|
1202
|
-
if ( ! block.match( /^(?:\w+:.*\n)*\w+:.*$/ ) ) return undefined;
|
1203
1502
|
|
1204
|
-
|
1205
|
-
if ( !extract_attr( this.tree ) ) {
|
1206
|
-
this.tree.splice( 1, 0, {} );
|
1503
|
+
return parts;
|
1207
1504
|
}
|
1208
1505
|
|
1209
|
-
|
1210
|
-
|
1211
|
-
|
1212
|
-
|
1213
|
-
value = m[ 2 ];
|
1214
|
-
|
1215
|
-
this.tree[ 1 ][ key ] = value;
|
1216
|
-
}
|
1217
|
-
|
1218
|
-
// document_meta produces no content!
|
1219
|
-
return [];
|
1220
|
-
};
|
1221
|
-
|
1222
|
-
Markdown.dialects.Maruku.block.block_meta = function block_meta( block, next ) {
|
1223
|
-
// check if the last line of the block is an meta hash
|
1224
|
-
var m = block.match( /(^|\n) {0,3}\{:\s*((?:\\\}|[^\}])*)\s*\}$/ );
|
1225
|
-
if ( !m ) return undefined;
|
1506
|
+
Maruku.block.document_meta = function document_meta( block ) {
|
1507
|
+
// we're only interested in the first block
|
1508
|
+
if ( block.lineNumber > 1 )
|
1509
|
+
return undefined;
|
1226
1510
|
|
1227
|
-
|
1228
|
-
|
1511
|
+
// document_meta blocks consist of one or more lines of `Key: Value\n`
|
1512
|
+
if ( ! block.match( /^(?:\w+:.*\n)*\w+:.*$/ ) )
|
1513
|
+
return undefined;
|
1229
1514
|
|
1230
|
-
|
1515
|
+
// make an attribute node if it doesn't exist
|
1516
|
+
if ( !extract_attr( this.tree ) )
|
1517
|
+
this.tree.splice( 1, 0, {} );
|
1231
1518
|
|
1232
|
-
|
1233
|
-
|
1234
|
-
|
1235
|
-
|
1519
|
+
var pairs = block.split( /\n/ );
|
1520
|
+
for ( var p in pairs ) {
|
1521
|
+
var m = pairs[ p ].match( /(\w+):\s*(.*)$/ ),
|
1522
|
+
key = m[ 1 ].toLowerCase(),
|
1523
|
+
value = m[ 2 ];
|
1236
1524
|
|
1237
|
-
|
1238
|
-
if ( typeof node === "string" ) return undefined;
|
1239
|
-
|
1240
|
-
// create the attribute hash if it doesn't exist
|
1241
|
-
if ( !hash ) {
|
1242
|
-
hash = {};
|
1243
|
-
node.splice( 1, 0, hash );
|
1244
|
-
}
|
1245
|
-
|
1246
|
-
// add the attributes in
|
1247
|
-
for ( a in attr ) {
|
1248
|
-
hash[ a ] = attr[ a ];
|
1525
|
+
this.tree[ 1 ][ key ] = value;
|
1249
1526
|
}
|
1250
1527
|
|
1251
|
-
//
|
1528
|
+
// document_meta produces no content!
|
1252
1529
|
return [];
|
1253
|
-
}
|
1254
|
-
|
1255
|
-
// pull the meta hash off the block and process what's left
|
1256
|
-
var b = block.replace( /\n.*$/, "" ),
|
1257
|
-
result = this.processBlock( b, [] );
|
1258
|
-
|
1259
|
-
// get or make the attributes hash
|
1260
|
-
hash = extract_attr( result[ 0 ] );
|
1261
|
-
if ( !hash ) {
|
1262
|
-
hash = {};
|
1263
|
-
result[ 0 ].splice( 1, 0, hash );
|
1264
|
-
}
|
1265
|
-
|
1266
|
-
// attach the attributes to the block
|
1267
|
-
for ( a in attr ) {
|
1268
|
-
hash[ a ] = attr[ a ];
|
1269
|
-
}
|
1530
|
+
};
|
1270
1531
|
|
1271
|
-
|
1272
|
-
|
1273
|
-
|
1274
|
-
|
1275
|
-
|
1276
|
-
var tight = /^((?:[^\s:].*\n)+):\s+([\s\S]+)$/,
|
1277
|
-
list = [ "dl" ],
|
1278
|
-
i;
|
1279
|
-
|
1280
|
-
// see if we're dealing with a tight or loose block
|
1281
|
-
if ( ( m = block.match( tight ) ) ) {
|
1282
|
-
// pull subsequent tight DL blocks out of `next`
|
1283
|
-
var blocks = [ block ];
|
1284
|
-
while ( next.length && tight.exec( next[ 0 ] ) ) {
|
1285
|
-
blocks.push( next.shift() );
|
1286
|
-
}
|
1532
|
+
Maruku.block.block_meta = function block_meta( block ) {
|
1533
|
+
// check if the last line of the block is an meta hash
|
1534
|
+
var m = block.match( /(^|\n) {0,3}\{:\s*((?:\\\}|[^\}])*)\s*\}$/ );
|
1535
|
+
if ( !m )
|
1536
|
+
return undefined;
|
1287
1537
|
|
1288
|
-
|
1289
|
-
|
1290
|
-
|
1291
|
-
defns = m[ 2 ].split( /\n:\s+/ );
|
1538
|
+
// process the meta hash
|
1539
|
+
var attr = this.dialect.processMetaHash( m[ 2 ] ),
|
1540
|
+
hash;
|
1292
1541
|
|
1293
|
-
|
1542
|
+
// if we matched ^ then we need to apply meta to the previous block
|
1543
|
+
if ( m[ 1 ] === "" ) {
|
1544
|
+
var node = this.tree[ this.tree.length - 1 ];
|
1545
|
+
hash = extract_attr( node );
|
1294
1546
|
|
1295
|
-
|
1296
|
-
|
1297
|
-
|
1547
|
+
// if the node is a string (rather than JsonML), bail
|
1548
|
+
if ( typeof node === "string" )
|
1549
|
+
return undefined;
|
1298
1550
|
|
1299
|
-
|
1300
|
-
|
1301
|
-
|
1551
|
+
// create the attribute hash if it doesn't exist
|
1552
|
+
if ( !hash ) {
|
1553
|
+
hash = {};
|
1554
|
+
node.splice( 1, 0, hash );
|
1302
1555
|
}
|
1303
|
-
}
|
1304
|
-
}
|
1305
|
-
else {
|
1306
|
-
return undefined;
|
1307
|
-
}
|
1308
1556
|
|
1309
|
-
|
1310
|
-
|
1557
|
+
// add the attributes in
|
1558
|
+
for ( var a in attr )
|
1559
|
+
hash[ a ] = attr[ a ];
|
1311
1560
|
|
1312
|
-
|
1313
|
-
|
1314
|
-
|
1315
|
-
}
|
1316
|
-
|
1317
|
-
// get the preceeding element
|
1318
|
-
var before = out[ out.length - 1 ];
|
1561
|
+
// return nothing so the meta hash is removed
|
1562
|
+
return [];
|
1563
|
+
}
|
1319
1564
|
|
1320
|
-
|
1321
|
-
|
1322
|
-
|
1565
|
+
// pull the meta hash off the block and process what's left
|
1566
|
+
var b = block.replace( /\n.*$/, "" ),
|
1567
|
+
result = this.processBlock( b, [] );
|
1323
1568
|
|
1324
|
-
|
1325
|
-
|
1569
|
+
// get or make the attributes hash
|
1570
|
+
hash = extract_attr( result[ 0 ] );
|
1571
|
+
if ( !hash ) {
|
1572
|
+
hash = {};
|
1573
|
+
result[ 0 ].splice( 1, 0, hash );
|
1574
|
+
}
|
1326
1575
|
|
1327
|
-
|
1328
|
-
|
1329
|
-
|
1330
|
-
}
|
1576
|
+
// attach the attributes to the block
|
1577
|
+
for ( var a in attr )
|
1578
|
+
hash[ a ] = attr[ a ];
|
1331
1579
|
|
1332
|
-
|
1333
|
-
|
1334
|
-
attr = extract_attr( before );
|
1580
|
+
return result;
|
1581
|
+
};
|
1335
1582
|
|
1336
|
-
|
1337
|
-
|
1338
|
-
|
1339
|
-
|
1583
|
+
Maruku.block.definition_list = function definition_list( block, next ) {
|
1584
|
+
// one or more terms followed by one or more definitions, in a single block
|
1585
|
+
var tight = /^((?:[^\s:].*\n)+):\s+([\s\S]+)$/,
|
1586
|
+
list = [ "dl" ],
|
1587
|
+
i, m;
|
1340
1588
|
|
1341
|
-
|
1342
|
-
|
1343
|
-
|
1589
|
+
// see if we're dealing with a tight or loose block
|
1590
|
+
if ( ( m = block.match( tight ) ) ) {
|
1591
|
+
// pull subsequent tight DL blocks out of `next`
|
1592
|
+
var blocks = [ block ];
|
1593
|
+
while ( next.length && tight.exec( next[ 0 ] ) )
|
1594
|
+
blocks.push( next.shift() );
|
1344
1595
|
|
1345
|
-
|
1346
|
-
|
1347
|
-
|
1596
|
+
for ( var b = 0; b < blocks.length; ++b ) {
|
1597
|
+
var m = blocks[ b ].match( tight ),
|
1598
|
+
terms = m[ 1 ].replace( /\n$/, "" ).split( /\n/ ),
|
1599
|
+
defns = m[ 2 ].split( /\n:\s+/ );
|
1348
1600
|
|
1349
|
-
|
1350
|
-
Markdown.buildInlinePatterns( Markdown.dialects.Maruku.inline );
|
1601
|
+
// print( uneval( m ) );
|
1351
1602
|
|
1352
|
-
|
1353
|
-
|
1354
|
-
};
|
1603
|
+
for ( i = 0; i < terms.length; ++i )
|
1604
|
+
list.push( [ "dt", terms[ i ] ] );
|
1355
1605
|
|
1356
|
-
|
1357
|
-
//
|
1358
|
-
|
1359
|
-
|
1360
|
-
|
1361
|
-
};
|
1362
|
-
}
|
1363
|
-
else {
|
1364
|
-
forEach = function(arr, cb, thisp) {
|
1365
|
-
for (var i = 0; i < arr.length; i++) {
|
1366
|
-
cb.call(thisp || arr, arr[i], i, arr);
|
1606
|
+
for ( i = 0; i < defns.length; ++i ) {
|
1607
|
+
// run inline processing over the definition
|
1608
|
+
list.push( [ "dd" ].concat( this.processInline( defns[ i ].replace( /(\n)\s+/, "$1" ) ) ) );
|
1609
|
+
}
|
1610
|
+
}
|
1367
1611
|
}
|
1368
|
-
|
1369
|
-
|
1370
|
-
|
1371
|
-
var isEmpty = function( obj ) {
|
1372
|
-
for ( var key in obj ) {
|
1373
|
-
if ( hasOwnProperty.call( obj, key ) ) {
|
1374
|
-
return false;
|
1612
|
+
else {
|
1613
|
+
return undefined;
|
1375
1614
|
}
|
1376
|
-
}
|
1377
1615
|
|
1378
|
-
|
1379
|
-
}
|
1380
|
-
|
1381
|
-
function extract_attr( jsonml ) {
|
1382
|
-
return isArray(jsonml)
|
1383
|
-
&& jsonml.length > 1
|
1384
|
-
&& typeof jsonml[ 1 ] === "object"
|
1385
|
-
&& !( isArray(jsonml[ 1 ]) )
|
1386
|
-
? jsonml[ 1 ]
|
1387
|
-
: undefined;
|
1388
|
-
}
|
1389
|
-
|
1390
|
-
|
1391
|
-
|
1392
|
-
/**
|
1393
|
-
* renderJsonML( jsonml[, options] ) -> String
|
1394
|
-
* - jsonml (Array): JsonML array to render to XML
|
1395
|
-
* - options (Object): options
|
1396
|
-
*
|
1397
|
-
* Converts the given JsonML into well-formed XML.
|
1398
|
-
*
|
1399
|
-
* The options currently understood are:
|
1400
|
-
*
|
1401
|
-
* - root (Boolean): wether or not the root node should be included in the
|
1402
|
-
* output, or just its children. The default `false` is to not include the
|
1403
|
-
* root itself.
|
1404
|
-
*/
|
1405
|
-
expose.renderJsonML = function( jsonml, options ) {
|
1406
|
-
options = options || {};
|
1407
|
-
// include the root element in the rendered output?
|
1408
|
-
options.root = options.root || false;
|
1409
|
-
|
1410
|
-
var content = [];
|
1411
|
-
|
1412
|
-
if ( options.root ) {
|
1413
|
-
content.push( render_tree( jsonml ) );
|
1414
|
-
}
|
1415
|
-
else {
|
1416
|
-
jsonml.shift(); // get rid of the tag
|
1417
|
-
if ( jsonml.length && typeof jsonml[ 0 ] === "object" && !( jsonml[ 0 ] instanceof Array ) ) {
|
1418
|
-
jsonml.shift(); // get rid of the attributes
|
1419
|
-
}
|
1616
|
+
return [ list ];
|
1617
|
+
};
|
1420
1618
|
|
1421
|
-
|
1422
|
-
|
1619
|
+
// splits on unescaped instances of @ch. If @ch is not a character the result
|
1620
|
+
// can be unpredictable
|
1621
|
+
|
1622
|
+
Maruku.block.table = function table ( block ) {
|
1623
|
+
|
1624
|
+
var _split_on_unescaped = function( s, ch ) {
|
1625
|
+
ch = ch || '\\s';
|
1626
|
+
if ( ch.match(/^[\\|\[\]{}?*.+^$]$/) )
|
1627
|
+
ch = '\\' + ch;
|
1628
|
+
var res = [ ],
|
1629
|
+
r = new RegExp('^((?:\\\\.|[^\\\\' + ch + '])*)' + ch + '(.*)'),
|
1630
|
+
m;
|
1631
|
+
while ( ( m = s.match( r ) ) ) {
|
1632
|
+
res.push( m[1] );
|
1633
|
+
s = m[2];
|
1634
|
+
}
|
1635
|
+
res.push(s);
|
1636
|
+
return res;
|
1637
|
+
};
|
1638
|
+
|
1639
|
+
var leading_pipe = /^ {0,3}\|(.+)\n {0,3}\|\s*([\-:]+[\-| :]*)\n((?:\s*\|.*(?:\n|$))*)(?=\n|$)/,
|
1640
|
+
// find at least an unescaped pipe in each line
|
1641
|
+
no_leading_pipe = /^ {0,3}(\S(?:\\.|[^\\|])*\|.*)\n {0,3}([\-:]+\s*\|[\-| :]*)\n((?:(?:\\.|[^\\|])*\|.*(?:\n|$))*)(?=\n|$)/,
|
1642
|
+
i,
|
1643
|
+
m;
|
1644
|
+
if ( ( m = block.match( leading_pipe ) ) ) {
|
1645
|
+
// remove leading pipes in contents
|
1646
|
+
// (header and horizontal rule already have the leading pipe left out)
|
1647
|
+
m[3] = m[3].replace(/^\s*\|/gm, '');
|
1648
|
+
} else if ( ! ( m = block.match( no_leading_pipe ) ) ) {
|
1649
|
+
return undefined;
|
1423
1650
|
}
|
1424
|
-
}
|
1425
|
-
|
1426
|
-
return content.join( "\n\n" );
|
1427
|
-
};
|
1428
|
-
|
1429
|
-
function escapeHTML( text ) {
|
1430
|
-
return text.replace( /&/g, "&" )
|
1431
|
-
.replace( /</g, "<" )
|
1432
|
-
.replace( />/g, ">" )
|
1433
|
-
.replace( /"/g, """ )
|
1434
|
-
.replace( /'/g, "'" );
|
1435
|
-
}
|
1436
|
-
|
1437
|
-
function render_tree( jsonml ) {
|
1438
|
-
// basic case
|
1439
|
-
if ( typeof jsonml === "string" ) {
|
1440
|
-
return escapeHTML( jsonml );
|
1441
|
-
}
|
1442
|
-
|
1443
|
-
var tag = jsonml.shift(),
|
1444
|
-
attributes = {},
|
1445
|
-
content = [];
|
1446
|
-
|
1447
|
-
if ( jsonml.length && typeof jsonml[ 0 ] === "object" && !( jsonml[ 0 ] instanceof Array ) ) {
|
1448
|
-
attributes = jsonml.shift();
|
1449
|
-
}
|
1450
|
-
|
1451
|
-
while ( jsonml.length ) {
|
1452
|
-
content.push( render_tree( jsonml.shift() ) );
|
1453
|
-
}
|
1454
|
-
|
1455
|
-
var tag_attrs = "";
|
1456
|
-
for ( var a in attributes ) {
|
1457
|
-
tag_attrs += " " + a + '="' + escapeHTML( attributes[ a ] ) + '"';
|
1458
|
-
}
|
1459
|
-
|
1460
|
-
// be careful about adding whitespace here for inline elements
|
1461
|
-
if ( tag == "img" || tag == "br" || tag == "hr" ) {
|
1462
|
-
return "<"+ tag + tag_attrs + "/>";
|
1463
|
-
}
|
1464
|
-
else {
|
1465
|
-
return "<"+ tag + tag_attrs + ">" + content.join( "" ) + "</" + tag + ">";
|
1466
|
-
}
|
1467
|
-
}
|
1468
|
-
|
1469
|
-
function convert_tree_to_html( tree, references, options ) {
|
1470
|
-
var i;
|
1471
|
-
options = options || {};
|
1472
|
-
|
1473
|
-
// shallow clone
|
1474
|
-
var jsonml = tree.slice( 0 );
|
1475
|
-
|
1476
|
-
if ( typeof options.preprocessTreeNode === "function" ) {
|
1477
|
-
jsonml = options.preprocessTreeNode(jsonml, references);
|
1478
|
-
}
|
1479
1651
|
|
1480
|
-
|
1481
|
-
|
1482
|
-
|
1483
|
-
|
1484
|
-
|
1485
|
-
|
1652
|
+
var table = [ "table", [ "thead", [ "tr" ] ], [ "tbody" ] ];
|
1653
|
+
|
1654
|
+
// remove trailing pipes, then split on pipes
|
1655
|
+
// (no escaped pipes are allowed in horizontal rule)
|
1656
|
+
m[2] = m[2].replace(/\|\s*$/, '').split('|');
|
1657
|
+
|
1658
|
+
// process alignment
|
1659
|
+
var html_attrs = [ ];
|
1660
|
+
forEach (m[2], function (s) {
|
1661
|
+
if (s.match(/^\s*-+:\s*$/))
|
1662
|
+
html_attrs.push({align: "right"});
|
1663
|
+
else if (s.match(/^\s*:-+\s*$/))
|
1664
|
+
html_attrs.push({align: "left"});
|
1665
|
+
else if (s.match(/^\s*:-+:\s*$/))
|
1666
|
+
html_attrs.push({align: "center"});
|
1667
|
+
else
|
1668
|
+
html_attrs.push({});
|
1669
|
+
});
|
1670
|
+
|
1671
|
+
// now for the header, avoid escaped pipes
|
1672
|
+
m[1] = _split_on_unescaped(m[1].replace(/\|\s*$/, ''), '|');
|
1673
|
+
for (i = 0; i < m[1].length; i++) {
|
1674
|
+
table[1][1].push(['th', html_attrs[i] || {}].concat(
|
1675
|
+
this.processInline(m[1][i].trim())));
|
1486
1676
|
}
|
1487
|
-
attrs = jsonml[ 1 ];
|
1488
|
-
}
|
1489
|
-
|
1490
|
-
// basic case
|
1491
|
-
if ( typeof jsonml === "string" ) {
|
1492
|
-
return jsonml;
|
1493
|
-
}
|
1494
|
-
|
1495
|
-
// convert this node
|
1496
|
-
switch ( jsonml[ 0 ] ) {
|
1497
|
-
case "header":
|
1498
|
-
jsonml[ 0 ] = "h" + jsonml[ 1 ].level;
|
1499
|
-
delete jsonml[ 1 ].level;
|
1500
|
-
break;
|
1501
|
-
case "bulletlist":
|
1502
|
-
jsonml[ 0 ] = "ul";
|
1503
|
-
break;
|
1504
|
-
case "numberlist":
|
1505
|
-
jsonml[ 0 ] = "ol";
|
1506
|
-
break;
|
1507
|
-
case "listitem":
|
1508
|
-
jsonml[ 0 ] = "li";
|
1509
|
-
break;
|
1510
|
-
case "para":
|
1511
|
-
jsonml[ 0 ] = "p";
|
1512
|
-
break;
|
1513
|
-
case "markdown":
|
1514
|
-
jsonml[ 0 ] = "html";
|
1515
|
-
if ( attrs ) delete attrs.references;
|
1516
|
-
break;
|
1517
|
-
case "code_block":
|
1518
|
-
jsonml[ 0 ] = "pre";
|
1519
|
-
i = attrs ? 2 : 1;
|
1520
|
-
var code = [ "code" ];
|
1521
|
-
code.push.apply( code, jsonml.splice( i, jsonml.length - i ) );
|
1522
|
-
jsonml[ i ] = code;
|
1523
|
-
break;
|
1524
|
-
case "inlinecode":
|
1525
|
-
jsonml[ 0 ] = "code";
|
1526
|
-
break;
|
1527
|
-
case "img":
|
1528
|
-
jsonml[ 1 ].src = jsonml[ 1 ].href;
|
1529
|
-
delete jsonml[ 1 ].href;
|
1530
|
-
break;
|
1531
|
-
case "linebreak":
|
1532
|
-
jsonml[ 0 ] = "br";
|
1533
|
-
break;
|
1534
|
-
case "link":
|
1535
|
-
jsonml[ 0 ] = "a";
|
1536
|
-
break;
|
1537
|
-
case "link_ref":
|
1538
|
-
jsonml[ 0 ] = "a";
|
1539
1677
|
|
1540
|
-
|
1541
|
-
|
1542
|
-
|
1543
|
-
|
1544
|
-
|
1545
|
-
|
1678
|
+
// now for body contents
|
1679
|
+
forEach (m[3].replace(/\|\s*$/mg, '').split('\n'), function (row) {
|
1680
|
+
var html_row = ['tr'];
|
1681
|
+
row = _split_on_unescaped(row, '|');
|
1682
|
+
for (i = 0; i < row.length; i++)
|
1683
|
+
html_row.push(['td', html_attrs[i] || {}].concat(this.processInline(row[i].trim())));
|
1684
|
+
table[2].push(html_row);
|
1685
|
+
}, this);
|
1546
1686
|
|
1547
|
-
|
1548
|
-
|
1549
|
-
if ( ref.title ) {
|
1550
|
-
attrs.title = ref.title;
|
1551
|
-
}
|
1687
|
+
return [table];
|
1688
|
+
};
|
1552
1689
|
|
1553
|
-
|
1554
|
-
|
1555
|
-
|
1556
|
-
// the reference doesn't exist, so revert to plain text
|
1557
|
-
else {
|
1558
|
-
return attrs.original;
|
1559
|
-
}
|
1560
|
-
break;
|
1561
|
-
case "img_ref":
|
1562
|
-
jsonml[ 0 ] = "img";
|
1690
|
+
Maruku.inline[ "{:" ] = function inline_meta( text, matches, out ) {
|
1691
|
+
if ( !out.length )
|
1692
|
+
return [ 2, "{:" ];
|
1563
1693
|
|
1564
|
-
|
1565
|
-
|
1694
|
+
// get the preceeding element
|
1695
|
+
var before = out[ out.length - 1 ];
|
1566
1696
|
|
1567
|
-
|
1568
|
-
|
1569
|
-
delete attrs.ref;
|
1697
|
+
if ( typeof before === "string" )
|
1698
|
+
return [ 2, "{:" ];
|
1570
1699
|
|
1571
|
-
|
1572
|
-
|
1573
|
-
if ( ref.title ) {
|
1574
|
-
attrs.title = ref.title;
|
1575
|
-
}
|
1700
|
+
// match a meta hash
|
1701
|
+
var m = text.match( /^\{:\s*((?:\\\}|[^\}])*)\s*\}/ );
|
1576
1702
|
|
1577
|
-
|
1578
|
-
|
1579
|
-
|
1580
|
-
// the reference doesn't exist, so revert to plain text
|
1581
|
-
else {
|
1582
|
-
return attrs.original;
|
1583
|
-
}
|
1584
|
-
break;
|
1585
|
-
}
|
1703
|
+
// no match, false alarm
|
1704
|
+
if ( !m )
|
1705
|
+
return [ 2, "{:" ];
|
1586
1706
|
|
1587
|
-
|
1588
|
-
|
1707
|
+
// attach the attributes to the preceeding element
|
1708
|
+
var meta = this.dialect.processMetaHash( m[ 1 ] ),
|
1709
|
+
attr = extract_attr( before );
|
1589
1710
|
|
1590
|
-
|
1591
|
-
|
1592
|
-
|
1593
|
-
for ( var key in jsonml[ 1 ] ) {
|
1594
|
-
i = 2;
|
1595
|
-
}
|
1596
|
-
// if there aren't, remove it
|
1597
|
-
if ( i === 1 ) {
|
1598
|
-
jsonml.splice( i, 1 );
|
1711
|
+
if ( !attr ) {
|
1712
|
+
attr = {};
|
1713
|
+
before.splice( 1, 0, attr );
|
1599
1714
|
}
|
1600
|
-
}
|
1601
1715
|
|
1602
|
-
|
1603
|
-
|
1604
|
-
}
|
1716
|
+
for ( var k in meta )
|
1717
|
+
attr[ k ] = meta[ k ];
|
1605
1718
|
|
1606
|
-
|
1607
|
-
|
1719
|
+
// cut out the string and replace it with nothing
|
1720
|
+
return [ m[ 0 ].length, "" ];
|
1721
|
+
};
|
1608
1722
|
|
1609
1723
|
|
1610
|
-
|
1611
|
-
|
1612
|
-
|
1613
|
-
|
1724
|
+
Markdown.dialects.Maruku = Maruku;
|
1725
|
+
Markdown.dialects.Maruku.inline.__escape__ = /^\\[\\`\*_{}\[\]()#\+.!\-|:]/;
|
1726
|
+
Markdown.buildBlockOrder ( Markdown.dialects.Maruku.block );
|
1727
|
+
Markdown.buildInlinePatterns( Markdown.dialects.Maruku.inline );
|
1614
1728
|
|
1615
|
-
while ( i < jsonml.length ) {
|
1616
|
-
// if it's a string check the next item too
|
1617
|
-
if ( typeof jsonml[ i ] === "string" ) {
|
1618
|
-
if ( i + 1 < jsonml.length && typeof jsonml[ i + 1 ] === "string" ) {
|
1619
|
-
// merge the second string into the first and remove it
|
1620
|
-
jsonml[ i ] += jsonml.splice( i + 1, 1 )[ 0 ];
|
1621
|
-
}
|
1622
|
-
else {
|
1623
|
-
++i;
|
1624
|
-
}
|
1625
|
-
}
|
1626
|
-
// if it's not a string recurse
|
1627
|
-
else {
|
1628
|
-
merge_text_nodes( jsonml[ i ] );
|
1629
|
-
++i;
|
1630
|
-
}
|
1631
|
-
}
|
1632
|
-
}
|
1633
1729
|
|
1634
|
-
|
1635
|
-
|
1636
|
-
|
1637
|
-
|
1638
|
-
|
1639
|
-
|
1640
|
-
|
1641
|
-
|
1642
|
-
|
1730
|
+
// Include all our depndencies and;
|
1731
|
+
expose.Markdown = Markdown;
|
1732
|
+
expose.parse = Markdown.parse;
|
1733
|
+
expose.toHTML = Markdown.toHTML;
|
1734
|
+
expose.toHTMLTree = Markdown.toHTMLTree;
|
1735
|
+
expose.renderJsonML = Markdown.renderJsonML;
|
1736
|
+
|
1737
|
+
})(function() {
|
1738
|
+
window.markdown = {};
|
1739
|
+
return window.markdown;
|
1740
|
+
}());
|