...
...
@@ -0,0 +1,2454 @@
1
+# == Introduction
2
+#
3
+# This module provides sanitization of XHTML+MathML+SVG
4
+# and of inline style attributes. Its genesis is {described here}[http://golem.ph.utexas.edu/~distler/blog/archives/001181.html].
5
+#
6
+# Uses the {HTML5lib parser}[http://code.google.com/p/html5lib/], so that the parsing behaviour should
7
+# resemble that of browsers.
8
+#
9
+# sanitize_xhtml() is a case-sensitive sanitizer, suitable for XHTML
10
+# sanitize_html() is a case-insensitive sanitizer suitable for HTML
11
+# sanitize_rexml() sanitizes a REXML tree, returning a string
12
+#
13
+# == Files
14
+#
15
+# {sanitize.rb}[http://golem.ph.utexas.edu/~distler/code/instiki/svn/lib/sanitize.rb],
16
+# {HTML5lib}[http://golem.ph.utexas.edu/~distler/code/instiki/svn/vendor/plugins/HTML5lib/]
17
+#
18
+# == Author
19
+#
20
+# {Jacques Distler}[http://golem.ph.utexas.edu/~distler/]
21
+#
22
+# == License
23
+#
24
+# Ruby License
25
+
26
+class HTML5libSanitize
27
+
28
+ require 'html5/html5parser'
29
+ require 'html5/liberalxmlparser'
30
+ require 'html5/treewalkers'
31
+ require 'html5/treebuilders'
32
+ require 'html5/serializer'
33
+ require 'html5/sanitizer'
34
+
35
+ include HTML5
36
+
37
+# Sanitize a string, parsed using XHTML parsing rules.
38
+#
39
+# :call-seq:
40
+# sanitize_xhtml(string) -> string
41
+# sanitize_xhtml(string, {:encoding => 'iso-8859-1', :to_tree => true}) -> REXML::Document
42
+#
43
+# Unless otherwise specified, the string is assumed to be utf-8 encoded.
44
+# By default, the output is a string. But, optionally, you can return a REXML tree.
45
+#
46
+# The string returned is utf-8 encoded. If you want, you can use iconv to convert it to some other encoding.
47
+# (REXML trees are always utf-8 encoded.)
48
+ def sanitize_xhtml(html, options = {})
49
+ @encoding = 'utf-8'
50
+ @treebuilder = TreeBuilders::REXML::TreeBuilder
51
+ @to_tree = false
52
+ options.each do |name, value|
53
+ next unless %w(encoding treebuilder to_tree).include? name.to_s
54
+ if name.to_s == 'treebuilder'
55
+ @treebuilder = HTML5lib::TreeBuilders.get_tree_builder(value)
56
+ else
57
+ instance_variable_set("@#{name}", value)
58
+ end
59
+ end
60
+ if @encoding == 'utf-8'
61
+ parsed = XHTMLParser.parse_fragment(html.to_utf8, {:tokenizer => HTMLSanitizer,
62
+ :lowercase_element_name => false, :lowercase_attr_name => false,
63
+ :encoding => @encoding, :tree => @treebuilder })
64
+ else
65
+ parsed = XHTMLParser.parse_fragment(html.to_ncr, {:tokenizer => HTMLSanitizer,
66
+ :lowercase_element_name => false, :lowercase_attr_name => false,
67
+ :encoding => @encoding, :tree => @treebuilder })
68
+ end
69
+ return parsed if @to_tree
70
+ return parsed.to_s
71
+ end
72
+
73
+# Sanitize a string, parsed using HTML parsing rules.
74
+#
75
+# :call-seq:
76
+# sanitize_html( string ) -> string
77
+# sanitize_html( string, {:encoding => 'iso-8859-1', :to_tree => true} ) -> REXML::Document
78
+#
79
+# Unless otherwise specified, the string is assumed to be utf-8 encoded.
80
+# By default, the output is a string. But, optionally, you can return a REXML tree.
81
+#
82
+# The string returned is utf-8 encoded. If you want, you can use iconv to convert it to some other encoding.
83
+# (REXML trees are always utf-8 encoded.)
84
+ alias :sanitize :sanitize_html
85
+ def sanitize_html(html, options = {})
86
+ @encoding = 'utf-8'
87
+ @treebuilder = TreeBuilders::REXML::TreeBuilder
88
+ @to_tree = false
89
+ options.each do |name, value|
90
+ next unless %w(encoding treebuilder to_tree).include? name.to_s
91
+ if name.to_s == 'treebuilder'
92
+ @treebuilder = HTML5lib::TreeBuilders.get_tree_builder(value)
93
+ else
94
+ instance_variable_set("@#{name}", value)
95
+ end
96
+ end
97
+ if @encoding == 'utf-8'
98
+ parsed = HTMLParser.parse_fragment(html.to_utf8, {:tokenizer => HTMLSanitizer,
99
+ :encoding => @encoding, :tree => @treebuilder })
100
+ else
101
+ parsed = HTMLParser.parse_fragment(html.to_ncr, {:tokenizer => HTMLSanitizer,
102
+ :encoding => @encoding, :tree => @treebuilder })
103
+ end
104
+ return parsed if @to_tree
105
+ return parsed.to_s
106
+ end
107
+
108
+# Sanitize a REXML tree. The output is a string.
109
+#
110
+# :call-seq:
111
+# sanitize_rexml(tree) -> string
112
+#
113
+ def sanitize_rexml(tree)
114
+ tokens = TreeWalkers.get_tree_walker('rexml2').new(tree)
115
+ XHTMLSerializer.serialize(tokens, {:encoding=>'utf-8',
116
+ :space_before_trailing_solidus => true,
117
+ :inject_meta_charset => false,
118
+ :sanitize => true})
119
+ end
120
+end
121
+
122
+# Some useful additions to the String class
123
+
124
+class String
125
+
126
+# Check whether a string is valid utf-8
127
+#
128
+# :call-seq:
129
+# string.is_utf8? -> boolean
130
+#
131
+# returns true if the sequence of bytes in string is valid utf-8
132
+#--
133
+ def is_utf8?
134
+ #expand NCRs to utf-8
135
+ text = self.gsub(/&#x([a-fA-F0-9]+);/) {|m| [$1.hex].pack('U*') }
136
+ text.gsub!(/&#(\d+);/) {|m| [$1.to_i].pack('U*') }
137
+ #ensure the resulting string of bytes is valid utf-8
138
+ text =~ /\A(
139
+ [\x09\x0A\x0D\x20-\x7E] # ASCII
140
+ | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
141
+ | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
142
+ | [\xE1-\xEC\xEE][\x80-\xBF]{2} # straight 3-byte
143
+ | \xEF[\x80-\xBE]{2} #
144
+ | \xEF\xBF[\x80-\xBD] # excluding U+fffe and U+ffff
145
+ | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
146
+ | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
147
+ | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
148
+ | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
149
+ )*\Z/x;
150
+ end
151
+#++
152
+
153
+#:stopdoc:
154
+ MATHML_ENTITIES = {
155
+ 'Alpha' => 'Α',
156
+ 'Beta' => 'Β',
157
+ 'Epsilon' => 'Ε',
158
+ 'Zeta' => 'Ζ',
159
+ 'Eta' => 'Η',
160
+ 'Iota' => 'Ι',
161
+ 'Kappa' => 'Κ',
162
+ 'Mu' => 'Μ',
163
+ 'Nu' => 'Ν',
164
+ 'Omicron' => 'Ο',
165
+ 'Rho' => 'Ρ',
166
+ 'Tau' => 'Τ',
167
+ 'Chi' => 'Χ',
168
+ 'epsilon' => 'ε',
169
+ 'zeta' => 'ζ',
170
+ 'omicron' => 'ο',
171
+ 'sigmaf' => 'ς',
172
+ 'thetasym' => 'ϑ',
173
+ 'upsih' => 'ϒ',
174
+ 'oline' => '‾',
175
+ 'frasl' => '⁄',
176
+ 'alefsym' => 'ℵ',
177
+ 'crarr' => '↵',
178
+ 'empty' => '∅',
179
+ 'amp' => '&',
180
+ 'lt' => '<',
181
+ 'zwnj' => '‌',
182
+ 'zwj' => '‍',
183
+ 'lrm' => '‎',
184
+ 'rlm' => '‏',
185
+ 'sbquo' => '‚',
186
+ 'bdquo' => '„',
187
+ 'lsaquo' => '‹',
188
+ 'rsaquo' => '›',
189
+ 'euro' => '€',
190
+ 'angzarr' => '⍼',
191
+ 'cirmid' => '⫯',
192
+ 'cudarrl' => '⤸',
193
+ 'cudarrr' => '⤵',
194
+ 'cularr' => '↶',
195
+ 'cularrp' => '⤽',
196
+ 'curarr' => '↷',
197
+ 'curarrm' => '⤼',
198
+ 'Darr' => '↡',
199
+ 'dArr' => '⇓',
200
+ 'ddarr' => '⇊',
201
+ 'DDotrahd' => '⤑',
202
+ 'dfisht' => '⥿',
203
+ 'dHar' => '⥥',
204
+ 'dharl' => '⇃',
205
+ 'dharr' => '⇂',
206
+ 'duarr' => '⇵',
207
+ 'duhar' => '⥯',
208
+ 'dzigrarr' => '⟿',
209
+ 'erarr' => '⥱',
210
+ 'hArr' => '⇔',
211
+ 'harr' => '↔',
212
+ 'harrcir' => '⥈',
213
+ 'harrw' => '↭',
214
+ 'hoarr' => '⇿',
215
+ 'imof' => '⊷',
216
+ 'lAarr' => '⇚',
217
+ 'Larr' => '↞',
218
+ 'larrbfs' => '⤟',
219
+ 'larrfs' => '⤝',
220
+ 'larrhk' => '↩',
221
+ 'larrlp' => '↫',
222
+ 'larrpl' => '⤹',
223
+ 'larrsim' => '⥳',
224
+ 'larrtl' => '↢',
225
+ 'lAtail' => '⤛',
226
+ 'latail' => '⤙',
227
+ 'lBarr' => '⤎',
228
+ 'lbarr' => '⤌',
229
+ 'ldca' => '⤶',
230
+ 'ldrdhar' => '⥧',
231
+ 'ldrushar' => '⥋',
232
+ 'ldsh' => '↲',
233
+ 'lfisht' => '⥼',
234
+ 'lHar' => '⥢',
235
+ 'lhard' => '↽',
236
+ 'lharu' => '↼',
237
+ 'lharul' => '⥪',
238
+ 'llarr' => '⇇',
239
+ 'llhard' => '⥫',
240
+ 'loarr' => '⇽',
241
+ 'lrarr' => '⇆',
242
+ 'lrhar' => '⇋',
243
+ 'lrhard' => '⥭',
244
+ 'lsh' => '↰',
245
+ 'lurdshar' => '⥊',
246
+ 'luruhar' => '⥦',
247
+ 'Map' => '⤅',
248
+ 'map' => '↦',
249
+ 'midcir' => '⫰',
250
+ 'mumap' => '⊸',
251
+ 'nearhk' => '⤤',
252
+ 'neArr' => '⇗',
253
+ 'nearr' => '↗',
254
+ 'nesear' => '⤨',
255
+ 'nhArr' => '⇎',
256
+ 'nharr' => '↮',
257
+ 'nlArr' => '⇍',
258
+ 'nlarr' => '↚',
259
+ 'nrArr' => '⇏',
260
+ 'nrarr' => '↛',
261
+ 'nrarrc' => '⤳̸',
262
+ 'nrarrw' => '↝̸',
263
+ 'nvHarr' => '⤄',
264
+ 'nvlArr' => '⤂',
265
+ 'nvrArr' => '⤃',
266
+ 'nwarhk' => '⤣',
267
+ 'nwArr' => '⇖',
268
+ 'nwarr' => '↖',
269
+ 'nwnear' => '⤧',
270
+ 'olarr' => '↺',
271
+ 'orarr' => '↻',
272
+ 'origof' => '⊶',
273
+ 'rAarr' => '⇛',
274
+ 'Rarr' => '↠',
275
+ 'rarrap' => '⥵',
276
+ 'rarrbfs' => '⤠',
277
+ 'rarrc' => '⤳',
278
+ 'rarrfs' => '⤞',
279
+ 'rarrhk' => '↪',
280
+ 'rarrlp' => '↬',
281
+ 'rarrpl' => '⥅',
282
+ 'rarrsim' => '⥴',
283
+ 'Rarrtl' => '⤖',
284
+ 'rarrtl' => '↣',
285
+ 'rarrw' => '↝',
286
+ 'rAtail' => '⤜',
287
+ 'ratail' => '⤚',
288
+ 'RBarr' => '⤐',
289
+ 'rBarr' => '⤏',
290
+ 'rbarr' => '⤍',
291
+ 'rdca' => '⤷',
292
+ 'rdldhar' => '⥩',
293
+ 'rdsh' => '↳',
294
+ 'rfisht' => '⥽',
295
+ 'rHar' => '⥤',
296
+ 'rhard' => '⇁',
297
+ 'rharu' => '⇀',
298
+ 'rharul' => '⥬',
299
+ 'rlarr' => '⇄',
300
+ 'rlhar' => '⇌',
301
+ 'roarr' => '⇾',
302
+ 'rrarr' => '⇉',
303
+ 'rsh' => '↱',
304
+ 'ruluhar' => '⥨',
305
+ 'searhk' => '⤥',
306
+ 'seArr' => '⇘',
307
+ 'searr' => '↘',
308
+ 'seswar' => '⤩',
309
+ 'simrarr' => '⥲',
310
+ 'slarr' => '←',
311
+ 'srarr' => '→',
312
+ 'swarhk' => '⤦',
313
+ 'swArr' => '⇙',
314
+ 'swarr' => '↙',
315
+ 'swnwar' => '⤪',
316
+ 'Uarr' => '↟',
317
+ 'uArr' => '⇑',
318
+ 'Uarrocir' => '⥉',
319
+ 'udarr' => '⇅',
320
+ 'udhar' => '⥮',
321
+ 'ufisht' => '⥾',
322
+ 'uHar' => '⥣',
323
+ 'uharl' => '↿',
324
+ 'uharr' => '↾',
325
+ 'uuarr' => '⇈',
326
+ 'vArr' => '⇕',
327
+ 'varr' => '↕',
328
+ 'xhArr' => '⟺',
329
+ 'xharr' => '⟷',
330
+ 'xlArr' => '⟸',
331
+ 'xlarr' => '⟵',
332
+ 'xmap' => '⟼',
333
+ 'xrArr' => '⟹',
334
+ 'xrarr' => '⟶',
335
+ 'zigrarr' => '⇝',
336
+ 'ac' => '∾',
337
+ 'acE' => '∾̳',
338
+ 'amalg' => '⨿',
339
+ 'barvee' => '⊽',
340
+ 'Barwed' => '⌆',
341
+ 'barwed' => '⌅',
342
+ 'bsolb' => '⧅',
343
+ 'Cap' => '⋒',
344
+ 'capand' => '⩄',
345
+ 'capbrcup' => '⩉',
346
+ 'capcap' => '⩋',
347
+ 'capcup' => '⩇',
348
+ 'capdot' => '⩀',
349
+ 'caps' => '∩︀',
350
+ 'ccaps' => '⩍',
351
+ 'ccups' => '⩌',
352
+ 'ccupssm' => '⩐',
353
+ 'coprod' => '∐',
354
+ 'Cup' => '⋓',
355
+ 'cupbrcap' => '⩈',
356
+ 'cupcap' => '⩆',
357
+ 'cupcup' => '⩊',
358
+ 'cupdot' => '⊍',
359
+ 'cupor' => '⩅',
360
+ 'cups' => '∪︀',
361
+ 'cuvee' => '⋎',
362
+ 'cuwed' => '⋏',
363
+ 'Dagger' => '‡',
364
+ 'dagger' => '†',
365
+ 'diam' => '⋄',
366
+ 'divonx' => '⋇',
367
+ 'eplus' => '⩱',
368
+ 'hercon' => '⊹',
369
+ 'intcal' => '⊺',
370
+ 'iprod' => '⨼',
371
+ 'loplus' => '⨭',
372
+ 'lotimes' => '⨴',
373
+ 'lthree' => '⋋',
374
+ 'ltimes' => '⋉',
375
+ 'midast' => '*',
376
+ 'minusb' => '⊟',
377
+ 'minusd' => '∸',
378
+ 'minusdu' => '⨪',
379
+ 'ncap' => '⩃',
380
+ 'ncup' => '⩂',
381
+ 'oast' => '⊛',
382
+ 'ocir' => '⊚',
383
+ 'odash' => '⊝',
384
+ 'odiv' => '⨸',
385
+ 'odot' => '⊙',
386
+ 'odsold' => '⦼',
387
+ 'ofcir' => '⦿',
388
+ 'ogt' => '⧁',
389
+ 'ohbar' => '⦵',
390
+ 'olcir' => '⦾',
391
+ 'olt' => '⧀',
392
+ 'omid' => '⦶',
393
+ 'ominus' => '⊖',
394
+ 'opar' => '⦷',
395
+ 'operp' => '⦹',
396
+ 'oplus' => '⊕',
397
+ 'osol' => '⊘',
398
+ 'Otimes' => '⨷',
399
+ 'otimes' => '⊗',
400
+ 'otimesas' => '⨶',
401
+ 'ovbar' => '⌽',
402
+ 'plusacir' => '⨣',
403
+ 'plusb' => '⊞',
404
+ 'pluscir' => '⨢',
405
+ 'plusdo' => '∔',
406
+ 'plusdu' => '⨥',
407
+ 'pluse' => '⩲',
408
+ 'plussim' => '⨦',
409
+ 'plustwo' => '⨧',
410
+ 'prod' => '∏',
411
+ 'race' => '⧚',
412
+ 'roplus' => '⨮',
413
+ 'rotimes' => '⨵',
414
+ 'rthree' => '⋌',
415
+ 'rtimes' => '⋊',
416
+ 'sdot' => '⋅',
417
+ 'sdotb' => '⊡',
418
+ 'setmn' => '∖',
419
+ 'simplus' => '⨤',
420
+ 'smashp' => '⨳',
421
+ 'solb' => '⧄',
422
+ 'sqcap' => '⊓',
423
+ 'sqcaps' => '⊓︀',
424
+ 'sqcup' => '⊔',
425
+ 'sqcups' => '⊔︀',
426
+ 'ssetmn' => '∖',
427
+ 'sstarf' => '⋆',
428
+ 'subdot' => '⪽',
429
+ 'sum' => '∑',
430
+ 'supdot' => '⪾',
431
+ 'timesb' => '⊠',
432
+ 'timesbar' => '⨱',
433
+ 'timesd' => '⨰',
434
+ 'tridot' => '◬',
435
+ 'triminus' => '⨺',
436
+ 'triplus' => '⨹',
437
+ 'trisb' => '⧍',
438
+ 'tritime' => '⨻',
439
+ 'uplus' => '⊎',
440
+ 'veebar' => '⊻',
441
+ 'wedbar' => '⩟',
442
+ 'wreath' => '≀',
443
+ 'xcap' => '⋂',
444
+ 'xcirc' => '◯',
445
+ 'xcup' => '⋃',
446
+ 'xdtri' => '▽',
447
+ 'xodot' => '⨀',
448
+ 'xoplus' => '⨁',
449
+ 'xotime' => '⨂',
450
+ 'xsqcup' => '⨆',
451
+ 'xuplus' => '⨄',
452
+ 'xutri' => '△',
453
+ 'xvee' => '⋁',
454
+ 'xwedge' => '⋀',
455
+ 'dlcorn' => '⌞',
456
+ 'drcorn' => '⌟',
457
+ 'gtlPar' => '⦕',
458
+ 'langd' => '⦑',
459
+ 'lbrke' => '⦋',
460
+ 'lbrksld' => '⦏',
461
+ 'lbrkslu' => '⦍',
462
+ 'lceil' => '⌈',
463
+ 'lfloor' => '⌊',
464
+ 'lmoust' => '⎰',
465
+ 'lparlt' => '⦓',
466
+ 'ltrPar' => '⦖',
467
+ 'rangd' => '⦒',
468
+ 'rbrke' => '⦌',
469
+ 'rbrksld' => '⦎',
470
+ 'rbrkslu' => '⦐',
471
+ 'rceil' => '⌉',
472
+ 'rfloor' => '⌋',
473
+ 'rmoust' => '⎱',
474
+ 'rpargt' => '⦔',
475
+ 'ulcorn' => '⌜',
476
+ 'urcorn' => '⌝',
477
+ 'gnap' => '⪊',
478
+ 'gnE' => '≩',
479
+ 'gne' => '⪈',
480
+ 'gnsim' => '⋧',
481
+ 'gvnE' => '≩︀',
482
+ 'lnap' => '⪉',
483
+ 'lnE' => '≨',
484
+ 'lne' => '⪇',
485
+ 'lnsim' => '⋦',
486
+ 'lvnE' => '≨︀',
487
+ 'nap' => '≉',
488
+ 'napE' => '⩰̸',
489
+ 'napid' => '≋̸',
490
+ 'ncong' => '≇',
491
+ 'ncongdot' => '⩭̸',
492
+ 'nequiv' => '≢',
493
+ 'ngE' => '≧̸',
494
+ 'nge' => '≱',
495
+ 'nges' => '⩾̸',
496
+ 'nGg' => '⋙̸',
497
+ 'ngsim' => '≵',
498
+ 'nGt' => '≫⃒',
499
+ 'ngt' => '≯',
500
+ 'nGtv' => '≫̸',
501
+ 'nlE' => '≦̸',
502
+ 'nle' => '≰',
503
+ 'nles' => '⩽̸',
504
+ 'nLl' => '⋘̸',
505
+ 'nlsim' => '≴',
506
+ 'nLt' => '≪⃒',
507
+ 'nlt' => '≮',
508
+ 'nltri' => '⋪',
509
+ 'nltrie' => '⋬',
510
+ 'nLtv' => '≪̸',
511
+ 'nmid' => '∤',
512
+ 'npar' => '∦',
513
+ 'npr' => '⊀',
514
+ 'nprcue' => '⋠',
515
+ 'npre' => '⪯̸',
516
+ 'nrtri' => '⋫',
517
+ 'nrtrie' => '⋭',
518
+ 'nsc' => '⊁',
519
+ 'nsccue' => '⋡',
520
+ 'nsce' => '⪰̸',
521
+ 'nsim' => '≁',
522
+ 'nsime' => '≄',
523
+ 'nsmid' => '∤',
524
+ 'nspar' => '∦',
525
+ 'nsqsube' => '⋢',
526
+ 'nsqsupe' => '⋣',
527
+ 'nsub' => '⊄',
528
+ 'nsubE' => '⫅̸',
529
+ 'nsube' => '⊈',
530
+ 'nsup' => '⊅',
531
+ 'nsupE' => '⫆̸',
532
+ 'nsupe' => '⊉',
533
+ 'ntgl' => '≹',
534
+ 'ntlg' => '≸',
535
+ 'nvap' => '≍⃒',
536
+ 'nVDash' => '⊯',
537
+ 'nVdash' => '⊮',
538
+ 'nvDash' => '⊭',
539
+ 'nvdash' => '⊬',
540
+ 'nvge' => '≥⃒',
541
+ 'nvgt' => '>⃒',
542
+ 'nvle' => '≤⃒',
543
+ 'nvltrie' => '⊴⃒',
544
+ 'nvrtrie' => '⊵⃒',
545
+ 'nvsim' => '∼⃒',
546
+ 'parsim' => '⫳',
547
+ 'prnap' => '⪹',
548
+ 'prnE' => '⪵',
549
+ 'prnsim' => '⋨',
550
+ 'rnmid' => '⫮',
551
+ 'scnap' => '⪺',
552
+ 'scnE' => '⪶',
553
+ 'scnsim' => '⋩',
554
+ 'simne' => '≆',
555
+ 'solbar' => '⌿',
556
+ 'subnE' => '⫋',
557
+ 'subne' => '⊊',
558
+ 'supnE' => '⫌',
559
+ 'supne' => '⊋',
560
+ 'vnsub' => '⊂⃒',
561
+ 'vnsup' => '⊃⃒',
562
+ 'vsubnE' => '⫋︀',
563
+ 'vsubne' => '⊊︀',
564
+ 'vsupnE' => '⫌︀',
565
+ 'vsupne' => '⊋︀',
566
+ 'ang' => '∠',
567
+ 'ange' => '⦤',
568
+ 'angmsd' => '∡',
569
+ 'angmsdaa' => '⦨',
570
+ 'angmsdab' => '⦩',
571
+ 'angmsdac' => '⦪',
572
+ 'angmsdad' => '⦫',
573
+ 'angmsdae' => '⦬',
574
+ 'angmsdaf' => '⦭',
575
+ 'angmsdag' => '⦮',
576
+ 'angmsdah' => '⦯',
577
+ 'angrtvb' => '⊾',
578
+ 'angrtvbd' => '⦝',
579
+ 'bbrk' => '⎵',
580
+ 'bbrktbrk' => '⎶',
581
+ 'bemptyv' => '⦰',
582
+ 'beth' => 'ℶ',
583
+ 'boxbox' => '⧉',
584
+ 'bprime' => '‵',
585
+ 'bsemi' => '⁏',
586
+ 'cemptyv' => '⦲',
587
+ 'cirE' => '⧃',
588
+ 'cirscir' => '⧂',
589
+ 'comp' => '∁',
590
+ 'daleth' => 'ℸ',
591
+ 'demptyv' => '⦱',
592
+ 'ell' => 'ℓ',
593
+ 'empty' => '∅',
594
+ 'emptyv' => '∅',
595
+ 'gimel' => 'ℷ',
596
+ 'iiota' => '℩',
597
+ 'image' => 'ℑ',
598
+ 'imath' => 'ı',
599
+ 'jmath' => 'j',
600
+ 'laemptyv' => '⦴',
601
+ 'lltri' => '◺',
602
+ 'lrtri' => '⊿',
603
+ 'mho' => '℧',
604
+ 'nang' => '∠⃒',
605
+ 'nexist' => '∄',
606
+ 'oS' => 'Ⓢ',
607
+ 'planck' => 'ℏ',
608
+ 'plankv' => 'ℏ',
609
+ 'raemptyv' => '⦳',
610
+ 'range' => '⦥',
611
+ 'real' => 'ℜ',
612
+ 'tbrk' => '⎴',
613
+ 'trpezium' => '�',
614
+ 'ultri' => '◸',
615
+ 'urtri' => '◹',
616
+ 'vzigzag' => '⦚',
617
+ 'weierp' => '℘',
618
+ 'apE' => '⩰',
619
+ 'ape' => '≊',
620
+ 'apid' => '≋',
621
+ 'asymp' => '≈',
622
+ 'Barv' => '⫧',
623
+ 'bcong' => '≌',
624
+ 'bepsi' => '϶',
625
+ 'bowtie' => '⋈',
626
+ 'bsim' => '∽',
627
+ 'bsime' => '⋍',
628
+ 'bsolhsub' => '\⊂',
629
+ 'bump' => '≎',
630
+ 'bumpE' => '⪮',
631
+ 'bumpe' => '≏',
632
+ 'cire' => '≗',
633
+ 'Colon' => '∷',
634
+ 'Colone' => '⩴',
635
+ 'colone' => '≔',
636
+ 'congdot' => '⩭',
637
+ 'csub' => '⫏',
638
+ 'csube' => '⫑',
639
+ 'csup' => '⫐',
640
+ 'csupe' => '⫒',
641
+ 'cuepr' => '⋞',
642
+ 'cuesc' => '⋟',
643
+ 'Dashv' => '⫤',
644
+ 'dashv' => '⊣',
645
+ 'easter' => '⩮',
646
+ 'ecir' => '≖',
647
+ 'ecolon' => '≕',
648
+ 'eDDot' => '⩷',
649
+ 'eDot' => '≑',
650
+ 'efDot' => '≒',
651
+ 'eg' => '⪚',
652
+ 'egs' => '⪖',
653
+ 'egsdot' => '⪘',
654
+ 'el' => '⪙',
655
+ 'els' => '⪕',
656
+ 'elsdot' => '⪗',
657
+ 'equest' => '≟',
658
+ 'equivDD' => '⩸',
659
+ 'erDot' => '≓',
660
+ 'esdot' => '≐',
661
+ 'Esim' => '⩳',
662
+ 'esim' => '≂',
663
+ 'fork' => '⋔',
664
+ 'forkv' => '⫙',
665
+ 'frown' => '⌢',
666
+ 'gap' => '⪆',
667
+ 'gE' => '≧',
668
+ 'gEl' => '⪌',
669
+ 'gel' => '⋛',
670
+ 'ges' => '⩾',
671
+ 'gescc' => '⪩',
672
+ 'gesdot' => '⪀',
673
+ 'gesdoto' => '⪂',
674
+ 'gesdotol' => '⪄',
675
+ 'gesl' => '⋛︀',
676
+ 'gesles' => '⪔',
677
+ 'Gg' => '⋙',
678
+ 'gl' => '≷',
679
+ 'gla' => '⪥',
680
+ 'glE' => '⪒',
681
+ 'glj' => '⪤',
682
+ 'gsim' => '≳',
683
+ 'gsime' => '⪎',
684
+ 'gsiml' => '⪐',
685
+ 'Gt' => '≫',
686
+ 'gtcc' => '⪧',
687
+ 'gtcir' => '⩺',
688
+ 'gtdot' => '⋗',
689
+ 'gtquest' => '⩼',
690
+ 'gtrarr' => '⥸',
691
+ 'homtht' => '∻',
692
+ 'lap' => '⪅',
693
+ 'lat' => '⪫',
694
+ 'late' => '⪭',
695
+ 'lates' => '⪭︀',
696
+ 'lE' => '≦',
697
+ 'lEg' => '⪋',
698
+ 'leg' => '⋚',
699
+ 'les' => '⩽',
700
+ 'lescc' => '⪨',
701
+ 'lesdot' => '⩿',
702
+ 'lesdoto' => '⪁',
703
+ 'lesdotor' => '⪃',
704
+ 'lesg' => '⋚︀',
705
+ 'lesges' => '⪓',
706
+ 'lg' => '≶',
707
+ 'lgE' => '⪑',
708
+ 'Ll' => '⋘',
709
+ 'lsim' => '≲',
710
+ 'lsime' => '⪍',
711
+ 'lsimg' => '⪏',
712
+ 'Lt' => '≪',
713
+ 'ltcc' => '⪦',
714
+ 'ltcir' => '⩹',
715
+ 'ltdot' => '⋖',
716
+ 'ltlarr' => '⥶',
717
+ 'ltquest' => '⩻',
718
+ 'ltrie' => '⊴',
719
+ 'mcomma' => '⨩',
720
+ 'mDDot' => '∺',
721
+ 'mid' => '∣',
722
+ 'mlcp' => '⫛',
723
+ 'models' => '⊧',
724
+ 'mstpos' => '∾',
725
+ 'Pr' => '⪻',
726
+ 'pr' => '≺',
727
+ 'prap' => '⪷',
728
+ 'prcue' => '≼',
729
+ 'prE' => '⪳',
730
+ 'pre' => '⪯',
731
+ 'prsim' => '≾',
732
+ 'prurel' => '⊰',
733
+ 'ratio' => '∶',
734
+ 'rtrie' => '⊵',
735
+ 'rtriltri' => '⧎',
736
+ 'Sc' => '⪼',
737
+ 'sc' => '≻',
738
+ 'scap' => '⪸',
739
+ 'sccue' => '≽',
740
+ 'scE' => '⪴',
741
+ 'sce' => '⪰',
742
+ 'scsim' => '≿',
743
+ 'sdote' => '⩦',
744
+ 'sfrown' => '⌢',
745
+ 'simg' => '⪞',
746
+ 'simgE' => '⪠',
747
+ 'siml' => '⪝',
748
+ 'simlE' => '⪟',
749
+ 'smid' => '∣',
750
+ 'smile' => '⌣',
751
+ 'smt' => '⪪',
752
+ 'smte' => '⪬',
753
+ 'smtes' => '⪬︀',
754
+ 'spar' => '∥',
755
+ 'sqsub' => '⊏',
756
+ 'sqsube' => '⊑',
757
+ 'sqsup' => '⊐',
758
+ 'sqsupe' => '⊒',
759
+ 'ssmile' => '⌣',
760
+ 'Sub' => '⋐',
761
+ 'subE' => '⫅',
762
+ 'subedot' => '⫃',
763
+ 'submult' => '⫁',
764
+ 'subplus' => '⪿',
765
+ 'subrarr' => '⥹',
766
+ 'subsim' => '⫇',
767
+ 'subsub' => '⫕',
768
+ 'subsup' => '⫓',
769
+ 'Sup' => '⋑',
770
+ 'supdsub' => '⫘',
771
+ 'supE' => '⫆',
772
+ 'supedot' => '⫄',
773
+ 'suphsol' => '⊃/',
774
+ 'suphsub' => '⫗',
775
+ 'suplarr' => '⥻',
776
+ 'supmult' => '⫂',
777
+ 'supplus' => '⫀',
778
+ 'supsim' => '⫈',
779
+ 'supsub' => '⫔',
780
+ 'supsup' => '⫖',
781
+ 'thkap' => '≈',
782
+ 'thksim' => '∼',
783
+ 'topfork' => '⫚',
784
+ 'trie' => '≜',
785
+ 'twixt' => '≬',
786
+ 'Vbar' => '⫫',
787
+ 'vBar' => '⫨',
788
+ 'vBarv' => '⫩',
789
+ 'VDash' => '⊫',
790
+ 'Vdash' => '⊩',
791
+ 'vDash' => '⊨',
792
+ 'vdash' => '⊢',
793
+ 'Vdashl' => '⫦',
794
+ 'vltri' => '⊲',
795
+ 'vprop' => '∝',
796
+ 'vrtri' => '⊳',
797
+ 'Vvdash' => '⊪',
798
+ 'alpha' => 'α',
799
+ 'beta' => 'β',
800
+ 'chi' => 'χ',
801
+ 'Delta' => 'Δ',
802
+ 'delta' => 'δ',
803
+ 'epsi' => 'ϵ',
804
+ 'epsiv' => 'ε',
805
+ 'eta' => 'η',
806
+ 'Gamma' => 'Γ',
807
+ 'gamma' => 'γ',
808
+ 'Gammad' => 'Ϝ',
809
+ 'gammad' => 'ϝ',
810
+ 'iota' => 'ι',
811
+ 'kappa' => 'κ',
812
+ 'kappav' => 'ϰ',
813
+ 'Lambda' => 'Λ',
814
+ 'lambda' => 'λ',
815
+ 'mu' => 'μ',
816
+ 'nu' => 'ν',
817
+ 'Omega' => 'Ω',
818
+ 'omega' => 'ω',
819
+ 'Phi' => 'Φ',
820
+ 'phi' => 'ϕ',
821
+ 'phiv' => 'φ',
822
+ 'Pi' => 'Π',
823
+ 'pi' => 'π',
824
+ 'piv' => 'ϖ',
825
+ 'Psi' => 'Ψ',
826
+ 'psi' => 'ψ',
827
+ 'rho' => 'ρ',
828
+ 'rhov' => 'ϱ',
829
+ 'Sigma' => 'Σ',
830
+ 'sigma' => 'σ',
831
+ 'sigmav' => 'ς',
832
+ 'tau' => 'τ',
833
+ 'Theta' => 'Θ',
834
+ 'theta' => 'θ',
835
+ 'thetav' => 'ϑ',
836
+ 'Upsi' => 'ϒ',
837
+ 'upsi' => 'υ',
838
+ 'Xi' => 'Ξ',
839
+ 'xi' => 'ξ',
840
+ 'zeta' => 'ζ',
841
+ 'Afr' => '𝔄',
842
+ 'afr' => '𝔞',
843
+ 'Bfr' => '𝔅',
844
+ 'bfr' => '𝔟',
845
+ 'Cfr' => 'ℭ',
846
+ 'cfr' => '𝔠',
847
+ 'Dfr' => '𝔇',
848
+ 'dfr' => '𝔡',
849
+ 'Efr' => '𝔈',
850
+ 'efr' => '𝔢',
851
+ 'Ffr' => '𝔉',
852
+ 'ffr' => '𝔣',
853
+ 'Gfr' => '𝔊',
854
+ 'gfr' => '𝔤',
855
+ 'Hfr' => 'ℌ',
856
+ 'hfr' => '𝔥',
857
+ 'Ifr' => 'ℑ',
858
+ 'ifr' => '𝔦',
859
+ 'Jfr' => '𝔍',
860
+ 'jfr' => '𝔧',
861
+ 'Kfr' => '𝔎',
862
+ 'kfr' => '𝔨',
863
+ 'Lfr' => '𝔏',
864
+ 'lfr' => '𝔩',
865
+ 'Mfr' => '𝔐',
866
+ 'mfr' => '𝔪',
867
+ 'Nfr' => '𝔑',
868
+ 'nfr' => '𝔫',
869
+ 'Ofr' => '𝔒',
870
+ 'ofr' => '𝔬',
871
+ 'Pfr' => '𝔓',
872
+ 'pfr' => '𝔭',
873
+ 'Qfr' => '𝔔',
874
+ 'qfr' => '𝔮',
875
+ 'Rfr' => 'ℜ',
876
+ 'rfr' => '𝔯',
877
+ 'Sfr' => '𝔖',
878
+ 'sfr' => '𝔰',
879
+ 'Tfr' => '𝔗',
880
+ 'tfr' => '𝔱',
881
+ 'Ufr' => '𝔘',
882
+ 'ufr' => '𝔲',
883
+ 'Vfr' => '𝔙',
884
+ 'vfr' => '𝔳',
885
+ 'Wfr' => '𝔚',
886
+ 'wfr' => '𝔴',
887
+ 'Xfr' => '𝔛',
888
+ 'xfr' => '𝔵',
889
+ 'Yfr' => '𝔜',
890
+ 'yfr' => '𝔶',
891
+ 'Zfr' => 'ℨ',
892
+ 'zfr' => '𝔷',
893
+ 'Aopf' => '𝔸',
894
+ 'Bopf' => '𝔹',
895
+ 'Copf' => 'ℂ',
896
+ 'Dopf' => '𝔻',
897
+ 'Eopf' => '𝔼',
898
+ 'Fopf' => '𝔽',
899
+ 'Gopf' => '𝔾',
900
+ 'Hopf' => 'ℍ',
901
+ 'Iopf' => '𝕀',
902
+ 'Jopf' => '𝕁',
903
+ 'Kopf' => '𝕂',
904
+ 'Lopf' => '𝕃',
905
+ 'Mopf' => '𝕄',
906
+ 'Nopf' => 'ℕ',
907
+ 'Oopf' => '𝕆',
908
+ 'Popf' => 'ℙ',
909
+ 'Qopf' => 'ℚ',
910
+ 'Ropf' => 'ℝ',
911
+ 'Sopf' => '𝕊',
912
+ 'Topf' => '𝕋',
913
+ 'Uopf' => '𝕌',
914
+ 'Vopf' => '𝕍',
915
+ 'Wopf' => '𝕎',
916
+ 'Xopf' => '𝕏',
917
+ 'Yopf' => '𝕐',
918
+ 'Zopf' => 'ℤ',
919
+ 'Ascr' => '𝒜',
920
+ 'ascr' => '𝒶',
921
+ 'Bscr' => 'ℬ',
922
+ 'bscr' => '𝒷',
923
+ 'Cscr' => '𝒞',
924
+ 'cscr' => '𝒸',
925
+ 'Dscr' => '𝒟',
926
+ 'dscr' => '𝒹',
927
+ 'Escr' => 'ℰ',
928
+ 'escr' => 'ℯ',
929
+ 'Fscr' => 'ℱ',
930
+ 'fscr' => '𝒻',
931
+ 'Gscr' => '𝒢',
932
+ 'gscr' => 'ℊ',
933
+ 'Hscr' => 'ℋ',
934
+ 'hscr' => '𝒽',
935
+ 'Iscr' => 'ℐ',
936
+ 'iscr' => '𝒾',
937
+ 'Jscr' => '𝒥',
938
+ 'jscr' => '𝒿',
939
+ 'Kscr' => '𝒦',
940
+ 'kscr' => '𝓀',
941
+ 'Lscr' => 'ℒ',
942
+ 'lscr' => '𝓁',
943
+ 'Mscr' => 'ℳ',
944
+ 'mscr' => '𝓂',
945
+ 'Nscr' => '𝒩',
946
+ 'nscr' => '𝓃',
947
+ 'Oscr' => '𝒪',
948
+ 'oscr' => 'ℴ',
949
+ 'Pscr' => '𝒫',
950
+ 'pscr' => '𝓅',
951
+ 'Qscr' => '𝒬',
952
+ 'qscr' => '𝓆',
953
+ 'Rscr' => 'ℛ',
954
+ 'rscr' => '𝓇',
955
+ 'Sscr' => '𝒮',
956
+ 'sscr' => '𝓈',
957
+ 'Tscr' => '𝒯',
958
+ 'tscr' => '𝓉',
959
+ 'Uscr' => '𝒰',
960
+ 'uscr' => '𝓊',
961
+ 'Vscr' => '𝒱',
962
+ 'vscr' => '𝓋',
963
+ 'Wscr' => '𝒲',
964
+ 'wscr' => '𝓌',
965
+ 'Xscr' => '𝒳',
966
+ 'xscr' => '𝓍',
967
+ 'Yscr' => '𝒴',
968
+ 'yscr' => '𝓎',
969
+ 'Zscr' => '𝒵',
970
+ 'zscr' => '𝓏',
971
+ 'acd' => '∿',
972
+ 'aleph' => 'ℵ',
973
+ 'And' => '⩓',
974
+ 'and' => '∧',
975
+ 'andand' => '⩕',
976
+ 'andd' => '⩜',
977
+ 'andslope' => '⩘',
978
+ 'andv' => '⩚',
979
+ 'angrt' => '∟',
980
+ 'angsph' => '∢',
981
+ 'angst' => 'Å',
982
+ 'ap' => '≈',
983
+ 'apacir' => '⩯',
984
+ 'awconint' => '∳',
985
+ 'awint' => '⨑',
986
+ 'becaus' => '∵',
987
+ 'bernou' => 'ℬ',
988
+ 'bne' => '=⃥',
989
+ 'bnequiv' => '≡⃥',
990
+ 'bNot' => '⫭',
991
+ 'bnot' => '⌐',
992
+ 'bottom' => '⊥',
993
+ 'cap' => '∩',
994
+ 'Cconint' => '∰',
995
+ 'cirfnint' => '⨐',
996
+ 'compfn' => '∘',
997
+ 'cong' => '≅',
998
+ 'Conint' => '∯',
999
+ 'conint' => '∮',
1000
+ 'ctdot' => '⋯',
1001
+ 'cup' => '∪',
1002
+ 'cwconint' => '∲',
1003
+ 'cwint' => '∱',
1004
+ 'cylcty' => '⌭',
1005
+ 'disin' => '⋲',
1006
+ 'Dot' => '¨',
1007
+ 'DotDot' => '⃜',
1008
+ 'dsol' => '⧶',
1009
+ 'dtdot' => '⋱',
1010
+ 'dwangle' => '⦦',
1011
+ 'elinters' => '�',
1012
+ 'epar' => '⋕',
1013
+ 'eparsl' => '⧣',
1014
+ 'equiv' => '≡',
1015
+ 'eqvparsl' => '⧥',
1016
+ 'exist' => '∃',
1017
+ 'fltns' => '▱',
1018
+ 'fnof' => 'ƒ',
1019
+ 'forall' => '∀',
1020
+ 'fpartint' => '⨍',
1021
+ 'ge' => '≥',
1022
+ 'hamilt' => 'ℋ',
1023
+ 'iff' => '⇔',
1024
+ 'iinfin' => '⧜',
1025
+ 'imped' => 'Ƶ',
1026
+ 'infin' => '∞',
1027
+ 'infintie' => '⧝',
1028
+ 'Int' => '∬',
1029
+ 'int' => '∫',
1030
+ 'intlarhk' => '⨗',
1031
+ 'isin' => '∈',
1032
+ 'isindot' => '⋵',
1033
+ 'isinE' => '⋹',
1034
+ 'isins' => '⋴',
1035
+ 'isinsv' => '⋳',
1036
+ 'isinv' => '∈',
1037
+ 'lagran' => 'ℒ',
1038
+ 'Lang' => '《',
1039
+ 'lang' => '〈',
1040
+ 'lArr' => '⇐',
1041
+ 'lbbrk' => '〔',
1042
+ 'le' => '≤',
1043
+ 'loang' => '〘',
1044
+ 'lobrk' => '〚',
1045
+ 'lopar' => '⦅',
1046
+ 'lowast' => '∗',
1047
+ 'minus' => '−',
1048
+ 'mnplus' => '∓',
1049
+ 'nabla' => '∇',
1050
+ 'ne' => '≠',
1051
+ 'nedot' => '≐̸',
1052
+ 'nhpar' => '⫲',
1053
+ 'ni' => '∋',
1054
+ 'nis' => '⋼',
1055
+ 'nisd' => '⋺',
1056
+ 'niv' => '∋',
1057
+ 'Not' => '⫬',
1058
+ 'notin' => '∉',
1059
+ 'notindot' => '⋵̸',
1060
+ 'notinE' => '⋹̸',
1061
+ 'notinva' => '∉',
1062
+ 'notinvb' => '⋷',
1063
+ 'notinvc' => '⋶',
1064
+ 'notni' => '∌',
1065
+ 'notniva' => '∌',
1066
+ 'notnivb' => '⋾',
1067
+ 'notnivc' => '⋽',
1068
+ 'nparsl' => '⫽⃥',
1069
+ 'npart' => '∂̸',
1070
+ 'npolint' => '⨔',
1071
+ 'nvinfin' => '⧞',
1072
+ 'olcross' => '⦻',
1073
+ 'Or' => '⩔',
1074
+ 'or' => '∨',
1075
+ 'ord' => '⩝',
1076
+ 'order' => 'ℴ',
1077
+ 'oror' => '⩖',
1078
+ 'orslope' => '⩗',
1079
+ 'orv' => '⩛',
1080
+ 'par' => '∥',
1081
+ 'parsl' => '⫽',
1082
+ 'part' => '∂',
1083
+ 'permil' => '‰',
1084
+ 'perp' => '⊥',
1085
+ 'pertenk' => '‱',
1086
+ 'phmmat' => 'ℳ',
1087
+ 'pointint' => '⨕',
1088
+ 'Prime' => '″',
1089
+ 'prime' => '′',
1090
+ 'profalar' => '⌮',
1091
+ 'profline' => '⌒',
1092
+ 'profsurf' => '⌓',
1093
+ 'prop' => '∝',
1094
+ 'qint' => '⨌',
1095
+ 'qprime' => '⁗',
1096
+ 'quatint' => '⨖',
1097
+ 'radic' => '√',
1098
+ 'Rang' => '》',
1099
+ 'rang' => '〉',
1100
+ 'rArr' => '⇒',
1101
+ 'rbbrk' => '〕',
1102
+ 'roang' => '〙',
1103
+ 'robrk' => '〛',
1104
+ 'ropar' => '⦆',
1105
+ 'rppolint' => '⨒',
1106
+ 'scpolint' => '⨓',
1107
+ 'sim' => '∼',
1108
+ 'simdot' => '⩪',
1109
+ 'sime' => '≃',
1110
+ 'smeparsl' => '⧤',
1111
+ 'square' => '□',
1112
+ 'squarf' => '▪',
1113
+ 'strns' => '¯',
1114
+ 'sub' => '⊂',
1115
+ 'sube' => '⊆',
1116
+ 'sup' => '⊃',
1117
+ 'supe' => '⊇',
1118
+ 'tdot' => '⃛',
1119
+ 'there4' => '∴',
1120
+ 'tint' => '∭',
1121
+ 'top' => '⊤',
1122
+ 'topbot' => '⌶',
1123
+ 'topcir' => '⫱',
1124
+ 'tprime' => '‴',
1125
+ 'utdot' => '⋰',
1126
+ 'uwangle' => '⦧',
1127
+ 'vangrt' => '⦜',
1128
+ 'veeeq' => '≚',
1129
+ 'Verbar' => '‖',
1130
+ 'wedgeq' => '≙',
1131
+ 'xnis' => '⋻',
1132
+ 'boxDL' => '╗',
1133
+ 'boxDl' => '╖',
1134
+ 'boxdL' => '╕',
1135
+ 'boxdl' => '┐',
1136
+ 'boxDR' => '╔',
1137
+ 'boxDr' => '╓',
1138
+ 'boxdR' => '╒',
1139
+ 'boxdr' => '┌',
1140
+ 'boxH' => '═',
1141
+ 'boxh' => '─',
1142
+ 'boxHD' => '╦',
1143
+ 'boxHd' => '╤',
1144
+ 'boxhD' => '╥',
1145
+ 'boxhd' => '┬',
1146
+ 'boxHU' => '╩',
1147
+ 'boxHu' => '╧',
1148
+ 'boxhU' => '╨',
1149
+ 'boxhu' => '┴',
1150
+ 'boxUL' => '╝',
1151
+ 'boxUl' => '╜',
1152
+ 'boxuL' => '╛',
1153
+ 'boxul' => '┘',
1154
+ 'boxUR' => '╚',
1155
+ 'boxUr' => '╙',
1156
+ 'boxuR' => '╘',
1157
+ 'boxur' => '└',
1158
+ 'boxV' => '║',
1159
+ 'boxv' => '│',
1160
+ 'boxVH' => '╬',
1161
+ 'boxVh' => '╫',
1162
+ 'boxvH' => '╪',
1163
+ 'boxvh' => '┼',
1164
+ 'boxVL' => '╣',
1165
+ 'boxVl' => '╢',
1166
+ 'boxvL' => '╡',
1167
+ 'boxvl' => '┤',
1168
+ 'boxVR' => '╠',
1169
+ 'boxVr' => '╟',
1170
+ 'boxvR' => '╞',
1171
+ 'boxvr' => '├',
1172
+ 'Acy' => 'А',
1173
+ 'acy' => 'а',
1174
+ 'Bcy' => 'Б',
1175
+ 'bcy' => 'б',
1176
+ 'CHcy' => 'Ч',
1177
+ 'chcy' => 'ч',
1178
+ 'Dcy' => 'Д',
1179
+ 'dcy' => 'д',
1180
+ 'Ecy' => 'Э',
1181
+ 'ecy' => 'э',
1182
+ 'Fcy' => 'Ф',
1183
+ 'fcy' => 'ф',
1184
+ 'Gcy' => 'Г',
1185
+ 'gcy' => 'г',
1186
+ 'HARDcy' => 'Ъ',
1187
+ 'hardcy' => 'ъ',
1188
+ 'Icy' => 'И',
1189
+ 'icy' => 'и',
1190
+ 'IEcy' => 'Е',
1191
+ 'iecy' => 'е',
1192
+ 'IOcy' => 'Ё',
1193
+ 'iocy' => 'ё',
1194
+ 'Jcy' => 'Й',
1195
+ 'jcy' => 'й',
1196
+ 'Kcy' => 'К',
1197
+ 'kcy' => 'к',
1198
+ 'KHcy' => 'Х',
1199
+ 'khcy' => 'х',
1200
+ 'Lcy' => 'Л',
1201
+ 'lcy' => 'л',
1202
+ 'Mcy' => 'М',
1203
+ 'mcy' => 'м',
1204
+ 'Ncy' => 'Н',
1205
+ 'ncy' => 'н',
1206
+ 'numero' => '№',
1207
+ 'Ocy' => 'О',
1208
+ 'ocy' => 'о',
1209
+ 'Pcy' => 'П',
1210
+ 'pcy' => 'п',
1211
+ 'Rcy' => 'Р',
1212
+ 'rcy' => 'р',
1213
+ 'Scy' => 'С',
1214
+ 'scy' => 'с',
1215
+ 'SHCHcy' => 'Щ',
1216
+ 'shchcy' => 'щ',
1217
+ 'SHcy' => 'Ш',
1218
+ 'shcy' => 'ш',
1219
+ 'SOFTcy' => 'Ь',
1220
+ 'softcy' => 'ь',
1221
+ 'Tcy' => 'Т',
1222
+ 'tcy' => 'т',
1223
+ 'TScy' => 'Ц',
1224
+ 'tscy' => 'ц',
1225
+ 'Ucy' => 'У',
1226
+ 'ucy' => 'у',
1227
+ 'Vcy' => 'В',
1228
+ 'vcy' => 'в',
1229
+ 'YAcy' => 'Я',
1230
+ 'yacy' => 'я',
1231
+ 'Ycy' => 'Ы',
1232
+ 'ycy' => 'ы',
1233
+ 'YUcy' => 'Ю',
1234
+ 'yucy' => 'ю',
1235
+ 'Zcy' => 'З',
1236
+ 'zcy' => 'з',
1237
+ 'ZHcy' => 'Ж',
1238
+ 'zhcy' => 'ж',
1239
+ 'DJcy' => 'Ђ',
1240
+ 'djcy' => 'ђ',
1241
+ 'DScy' => 'Ѕ',
1242
+ 'dscy' => 'ѕ',
1243
+ 'DZcy' => 'Џ',
1244
+ 'dzcy' => 'џ',
1245
+ 'GJcy' => 'Ѓ',
1246
+ 'gjcy' => 'ѓ',
1247
+ 'Iukcy' => 'І',
1248
+ 'iukcy' => 'і',
1249
+ 'Jsercy' => 'Ј',
1250
+ 'jsercy' => 'ј',
1251
+ 'Jukcy' => 'Є',
1252
+ 'jukcy' => 'є',
1253
+ 'KJcy' => 'Ќ',
1254
+ 'kjcy' => 'ќ',
1255
+ 'LJcy' => 'Љ',
1256
+ 'ljcy' => 'љ',
1257
+ 'NJcy' => 'Њ',
1258
+ 'njcy' => 'њ',
1259
+ 'TSHcy' => 'Ћ',
1260
+ 'tshcy' => 'ћ',
1261
+ 'Ubrcy' => 'Ў',
1262
+ 'ubrcy' => 'ў',
1263
+ 'YIcy' => 'Ї',
1264
+ 'yicy' => 'ї',
1265
+ 'acute' => '´',
1266
+ 'breve' => '˘',
1267
+ 'caron' => 'ˇ',
1268
+ 'cedil' => '¸',
1269
+ 'circ' => 'ˆ',
1270
+ 'dblac' => '˝',
1271
+ 'die' => '¨',
1272
+ 'dot' => '˙',
1273
+ 'grave' => '`',
1274
+ 'macr' => '¯',
1275
+ 'ogon' => '˛',
1276
+ 'ring' => '˚',
1277
+ 'tilde' => '˜',
1278
+ 'uml' => '¨',
1279
+ 'Aacute' => 'Á',
1280
+ 'aacute' => 'á',
1281
+ 'Acirc' => 'Â',
1282
+ 'acirc' => 'â',
1283
+ 'AElig' => 'Æ',
1284
+ 'aelig' => 'æ',
1285
+ 'Agrave' => 'À',
1286
+ 'agrave' => 'à',
1287
+ 'Aring' => 'Å',
1288
+ 'aring' => 'å',
1289
+ 'Atilde' => 'Ã',
1290
+ 'atilde' => 'ã',
1291
+ 'Auml' => 'Ä',
1292
+ 'auml' => 'ä',
1293
+ 'Ccedil' => 'Ç',
1294
+ 'ccedil' => 'ç',
1295
+ 'Eacute' => 'É',
1296
+ 'eacute' => 'é',
1297
+ 'Ecirc' => 'Ê',
1298
+ 'ecirc' => 'ê',
1299
+ 'Egrave' => 'È',
1300
+ 'egrave' => 'è',
1301
+ 'ETH' => 'Ð',
1302
+ 'eth' => 'ð',
1303
+ 'Euml' => 'Ë',
1304
+ 'euml' => 'ë',
1305
+ 'Iacute' => 'Í',
1306
+ 'iacute' => 'í',
1307
+ 'Icirc' => 'Î',
1308
+ 'icirc' => 'î',
1309
+ 'Igrave' => 'Ì',
1310
+ 'igrave' => 'ì',
1311
+ 'Iuml' => 'Ï',
1312
+ 'iuml' => 'ï',
1313
+ 'Ntilde' => 'Ñ',
1314
+ 'ntilde' => 'ñ',
1315
+ 'Oacute' => 'Ó',
1316
+ 'oacute' => 'ó',
1317
+ 'Ocirc' => 'Ô',
1318
+ 'ocirc' => 'ô',
1319
+ 'Ograve' => 'Ò',
1320
+ 'ograve' => 'ò',
1321
+ 'Oslash' => 'Ø',
1322
+ 'oslash' => 'ø',
1323
+ 'Otilde' => 'Õ',
1324
+ 'otilde' => 'õ',
1325
+ 'Ouml' => 'Ö',
1326
+ 'ouml' => 'ö',
1327
+ 'szlig' => 'ß',
1328
+ 'THORN' => 'Þ',
1329
+ 'thorn' => 'þ',
1330
+ 'Uacute' => 'Ú',
1331
+ 'uacute' => 'ú',
1332
+ 'Ucirc' => 'Û',
1333
+ 'ucirc' => 'û',
1334
+ 'Ugrave' => 'Ù',
1335
+ 'ugrave' => 'ù',
1336
+ 'Uuml' => 'Ü',
1337
+ 'uuml' => 'ü',
1338
+ 'Yacute' => 'Ý',
1339
+ 'yacute' => 'ý',
1340
+ 'yuml' => 'ÿ',
1341
+ 'Abreve' => 'Ă',
1342
+ 'abreve' => 'ă',
1343
+ 'Amacr' => 'Ā',
1344
+ 'amacr' => 'ā',
1345
+ 'Aogon' => 'Ą',
1346
+ 'aogon' => 'ą',
1347
+ 'Cacute' => 'Ć',
1348
+ 'cacute' => 'ć',
1349
+ 'Ccaron' => 'Č',
1350
+ 'ccaron' => 'č',
1351
+ 'Ccirc' => 'Ĉ',
1352
+ 'ccirc' => 'ĉ',
1353
+ 'Cdot' => 'Ċ',
1354
+ 'cdot' => 'ċ',
1355
+ 'Dcaron' => 'Ď',
1356
+ 'dcaron' => 'ď',
1357
+ 'Dstrok' => 'Đ',
1358
+ 'dstrok' => 'đ',
1359
+ 'Ecaron' => 'Ě',
1360
+ 'ecaron' => 'ě',
1361
+ 'Edot' => 'Ė',
1362
+ 'edot' => 'ė',
1363
+ 'Emacr' => 'Ē',
1364
+ 'emacr' => 'ē',
1365
+ 'ENG' => 'Ŋ',
1366
+ 'eng' => 'ŋ',
1367
+ 'Eogon' => 'Ę',
1368
+ 'eogon' => 'ę',
1369
+ 'gacute' => 'ǵ',
1370
+ 'Gbreve' => 'Ğ',
1371
+ 'gbreve' => 'ğ',
1372
+ 'Gcedil' => 'Ģ',
1373
+ 'Gcirc' => 'Ĝ',
1374
+ 'gcirc' => 'ĝ',
1375
+ 'Gdot' => 'Ġ',
1376
+ 'gdot' => 'ġ',
1377
+ 'Hcirc' => 'Ĥ',
1378
+ 'hcirc' => 'ĥ',
1379
+ 'Hstrok' => 'Ħ',
1380
+ 'hstrok' => 'ħ',
1381
+ 'Idot' => 'İ',
1382
+ 'IJlig' => 'IJ',
1383
+ 'ijlig' => 'ij',
1384
+ 'Imacr' => 'Ī',
1385
+ 'imacr' => 'ī',
1386
+ 'inodot' => 'ı',
1387
+ 'Iogon' => 'Į',
1388
+ 'iogon' => 'į',
1389
+ 'Itilde' => 'Ĩ',
1390
+ 'itilde' => 'ĩ',
1391
+ 'Jcirc' => 'Ĵ',
1392
+ 'jcirc' => 'ĵ',
1393
+ 'Kcedil' => 'Ķ',
1394
+ 'kcedil' => 'ķ',
1395
+ 'kgreen' => 'ĸ',
1396
+ 'Lacute' => 'Ĺ',
1397
+ 'lacute' => 'ĺ',
1398
+ 'Lcaron' => 'Ľ',
1399
+ 'lcaron' => 'ľ',
1400
+ 'Lcedil' => 'Ļ',
1401
+ 'lcedil' => 'ļ',
1402
+ 'Lmidot' => 'Ŀ',
1403
+ 'lmidot' => 'ŀ',
1404
+ 'Lstrok' => 'Ł',
1405
+ 'lstrok' => 'ł',
1406
+ 'Nacute' => 'Ń',
1407
+ 'nacute' => 'ń',
1408
+ 'napos' => 'ʼn',
1409
+ 'Ncaron' => 'Ň',
1410
+ 'ncaron' => 'ň',
1411
+ 'Ncedil' => 'Ņ',
1412
+ 'ncedil' => 'ņ',
1413
+ 'Odblac' => 'Ő',
1414
+ 'odblac' => 'ő',
1415
+ 'OElig' => 'Œ',
1416
+ 'oelig' => 'œ',
1417
+ 'Omacr' => 'Ō',
1418
+ 'omacr' => 'ō',
1419
+ 'Racute' => 'Ŕ',
1420
+ 'racute' => 'ŕ',
1421
+ 'Rcaron' => 'Ř',
1422
+ 'rcaron' => 'ř',
1423
+ 'Rcedil' => 'Ŗ',
1424
+ 'rcedil' => 'ŗ',
1425
+ 'Sacute' => 'Ś',
1426
+ 'sacute' => 'ś',
1427
+ 'Scaron' => 'Š',
1428
+ 'scaron' => 'š',
1429
+ 'Scedil' => 'Ş',
1430
+ 'scedil' => 'ş',
1431
+ 'Scirc' => 'Ŝ',
1432
+ 'scirc' => 'ŝ',
1433
+ 'Tcaron' => 'Ť',
1434
+ 'tcaron' => 'ť',
1435
+ 'Tcedil' => 'Ţ',
1436
+ 'tcedil' => 'ţ',
1437
+ 'Tstrok' => 'Ŧ',
1438
+ 'tstrok' => 'ŧ',
1439
+ 'Ubreve' => 'Ŭ',
1440
+ 'ubreve' => 'ŭ',
1441
+ 'Udblac' => 'Ű',
1442
+ 'udblac' => 'ű',
1443
+ 'Umacr' => 'Ū',
1444
+ 'umacr' => 'ū',
1445
+ 'Uogon' => 'Ų',
1446
+ 'uogon' => 'ų',
1447
+ 'Uring' => 'Ů',
1448
+ 'uring' => 'ů',
1449
+ 'Utilde' => 'Ũ',
1450
+ 'utilde' => 'ũ',
1451
+ 'Wcirc' => 'Ŵ',
1452
+ 'wcirc' => 'ŵ',
1453
+ 'Ycirc' => 'Ŷ',
1454
+ 'ycirc' => 'ŷ',
1455
+ 'Yuml' => 'Ÿ',
1456
+ 'Zacute' => 'Ź',
1457
+ 'zacute' => 'ź',
1458
+ 'Zcaron' => 'Ž',
1459
+ 'zcaron' => 'ž',
1460
+ 'Zdot' => 'Ż',
1461
+ 'zdot' => 'ż',
1462
+ 'apos' => ''',
1463
+ 'ast' => '*',
1464
+ 'brvbar' => '¦',
1465
+ 'bsol' => '\',
1466
+ 'cent' => '¢',
1467
+ 'colon' => ':',
1468
+ 'comma' => ',',
1469
+ 'commat' => '@',
1470
+ 'copy' => '©',
1471
+ 'curren' => '¤',
1472
+ 'darr' => '↓',
1473
+ 'deg' => '°',
1474
+ 'divide' => '÷',
1475
+ 'dollar' => '$',
1476
+ 'equals' => '=',
1477
+ 'excl' => '!',
1478
+ 'frac12' => '½',
1479
+ 'frac14' => '¼',
1480
+ 'frac18' => '⅛',
1481
+ 'frac34' => '¾',
1482
+ 'frac38' => '⅜',
1483
+ 'frac58' => '⅝',
1484
+ 'frac78' => '⅞',
1485
+ 'gt' => '>',
1486
+ 'half' => '½',
1487
+ 'horbar' => '―',
1488
+ 'hyphen' => '‐',
1489
+ 'iexcl' => '¡',
1490
+ 'iquest' => '¿',
1491
+ 'laquo' => '«',
1492
+ 'larr' => '←',
1493
+ 'lcub' => '{',
1494
+ 'ldquo' => '“',
1495
+ 'lowbar' => '_',
1496
+ 'lpar' => '(',
1497
+ 'lsqb' => '[',
1498
+ 'lsquo' => '‘',
1499
+ 'micro' => 'µ',
1500
+ 'middot' => '·',
1501
+ 'nbsp' => ' ',
1502
+ 'not' => '¬',
1503
+ 'num' => '#',
1504
+ 'ohm' => 'Ω',
1505
+ 'ordf' => 'ª',
1506
+ 'ordm' => 'º',
1507
+ 'para' => '¶',
1508
+ 'percnt' => '%',
1509
+ 'period' => '.',
1510
+ 'plus' => '+',
1511
+ 'plusmn' => '±',
1512
+ 'pound' => '£',
1513
+ 'quest' => '?',
1514
+ 'quot' => '"',
1515
+ 'raquo' => '»',
1516
+ 'rarr' => '→',
1517
+ 'rcub' => '}',
1518
+ 'rdquo' => '”',
1519
+ 'reg' => '®',
1520
+ 'rpar' => ')',
1521
+ 'rsqb' => ']',
1522
+ 'rsquo' => '’',
1523
+ 'sect' => '§',
1524
+ 'semi' => ';',
1525
+ 'shy' => '­',
1526
+ 'sol' => '/',
1527
+ 'sung' => '♪',
1528
+ 'sup1' => '¹',
1529
+ 'sup2' => '²',
1530
+ 'sup3' => '³',
1531
+ 'times' => '×',
1532
+ 'trade' => '™',
1533
+ 'uarr' => '↑',
1534
+ 'verbar' => '|',
1535
+ 'yen' => '¥',
1536
+ 'blank' => '␣',
1537
+ 'blk12' => '▒',
1538
+ 'blk14' => '░',
1539
+ 'blk34' => '▓',
1540
+ 'block' => '█',
1541
+ 'bull' => '•',
1542
+ 'caret' => '⁁',
1543
+ 'check' => '✓',
1544
+ 'cir' => '○',
1545
+ 'clubs' => '♣',
1546
+ 'copysr' => '℗',
1547
+ 'cross' => '✗',
1548
+ 'Dagger' => '‡',
1549
+ 'dagger' => '†',
1550
+ 'dash' => '‐',
1551
+ 'diams' => '♦',
1552
+ 'dlcrop' => '⌍',
1553
+ 'drcrop' => '⌌',
1554
+ 'dtri' => '▿',
1555
+ 'dtrif' => '▾',
1556
+ 'emsp' => ' ',
1557
+ 'emsp13' => ' ',
1558
+ 'emsp14' => ' ',
1559
+ 'ensp' => ' ',
1560
+ 'female' => '♀',
1561
+ 'ffilig' => 'ffi',
1562
+ 'fflig' => 'ff',
1563
+ 'ffllig' => 'ffl',
1564
+ 'filig' => 'fi',
1565
+ 'flat' => '♭',
1566
+ 'fllig' => 'fl',
1567
+ 'frac13' => '⅓',
1568
+ 'frac15' => '⅕',
1569
+ 'frac16' => '⅙',
1570
+ 'frac23' => '⅔',
1571
+ 'frac25' => '⅖',
1572
+ 'frac35' => '⅗',
1573
+ 'frac45' => '⅘',
1574
+ 'frac56' => '⅚',
1575
+ 'hairsp' => ' ',
1576
+ 'hearts' => '♥',
1577
+ 'hellip' => '…',
1578
+ 'hybull' => '⁃',
1579
+ 'incare' => '℅',
1580
+ 'ldquor' => '„',
1581
+ 'lhblk' => '▄',
1582
+ 'loz' => '◊',
1583
+ 'lozf' => '⧫',
1584
+ 'lsquor' => '‚',
1585
+ 'ltri' => '◃',
1586
+ 'ltrif' => '◂',
1587
+ 'male' => '♂',
1588
+ 'malt' => '✠',
1589
+ 'marker' => '▮',
1590
+ 'mdash' => '—',
1591
+ 'mldr' => '…',
1592
+ 'natur' => '♮',
1593
+ 'ndash' => '–',
1594
+ 'nldr' => '‥',
1595
+ 'numsp' => ' ',
1596
+ 'phone' => '☎',
1597
+ 'puncsp' => ' ',
1598
+ 'rdquor' => '”',
1599
+ 'rect' => '▭',
1600
+ 'rsquor' => '’',
1601
+ 'rtri' => '▹',
1602
+ 'rtrif' => '▸',
1603
+ 'rx' => '℞',
1604
+ 'sext' => '✶',
1605
+ 'sharp' => '♯',
1606
+ 'spades' => '♠',
1607
+ 'squ' => '□',
1608
+ 'squf' => '▪',
1609
+ 'star' => '☆',
1610
+ 'starf' => '★',
1611
+ 'target' => '⌖',
1612
+ 'telrec' => '⌕',
1613
+ 'thinsp' => ' ',
1614
+ 'uhblk' => '▀',
1615
+ 'ulcrop' => '⌏',
1616
+ 'urcrop' => '⌎',
1617
+ 'utri' => '▵',
1618
+ 'utrif' => '▴',
1619
+ 'vellip' => '⋮',
1620
+ 'af' => '⁡',
1621
+ 'aopf' => '𝕒',
1622
+ 'asympeq' => '≍',
1623
+ 'bopf' => '𝕓',
1624
+ 'copf' => '𝕔',
1625
+ 'Cross' => '⨯',
1626
+ 'DD' => 'ⅅ',
1627
+ 'dd' => 'ⅆ',
1628
+ 'dopf' => '𝕕',
1629
+ 'DownArrowBar' => '⤓',
1630
+ 'DownBreve' => '̑',
1631
+ 'DownLeftRightVector' => '⥐',
1632
+ 'DownLeftTeeVector' => '⥞',
1633
+ 'DownLeftVectorBar' => '⥖',
1634
+ 'DownRightTeeVector' => '⥟',
1635
+ 'DownRightVectorBar' => '⥗',
1636
+ 'ee' => 'ⅇ',
1637
+ 'EmptySmallSquare' => '◻',
1638
+ 'EmptyVerySmallSquare' => '▫',
1639
+ 'eopf' => '𝕖',
1640
+ 'Equal' => '⩵',
1641
+ 'FilledSmallSquare' => '◼',
1642
+ 'FilledVerySmallSquare' => '▪',
1643
+ 'fopf' => '𝕗',
1644
+ 'gopf' => '𝕘',
1645
+ 'GreaterGreater' => '⪢',
1646
+ 'Hat' => '^',
1647
+ 'hopf' => '𝕙',
1648
+ 'HorizontalLine' => '─',
1649
+ 'ic' => '⁣',
1650
+ 'ii' => 'ⅈ',
1651
+ 'iopf' => '𝕚',
1652
+ 'it' => '⁢',
1653
+ 'jopf' => '𝕛',
1654
+ 'kopf' => '𝕜',
1655
+ 'larrb' => '⇤',
1656
+ 'LeftDownTeeVector' => '⥡',
1657
+ 'LeftDownVectorBar' => '⥙',
1658
+ 'LeftRightVector' => '⥎',
1659
+ 'LeftTeeVector' => '⥚',
1660
+ 'LeftTriangleBar' => '⧏',
1661
+ 'LeftUpDownVector' => '⥑',
1662
+ 'LeftUpTeeVector' => '⥠',
1663
+ 'LeftUpVectorBar' => '⥘',
1664
+ 'LeftVectorBar' => '⥒',
1665
+ 'LessLess' => '⪡',
1666
+ 'lopf' => '𝕝',
1667
+ 'mapstodown' => '↧',
1668
+ 'mapstoleft' => '↤',
1669
+ 'mapstoup' => '↥',
1670
+ 'MediumSpace' => ' ',
1671
+ 'mopf' => '𝕞',
1672
+ 'nbump' => '≎̸',
1673
+ 'nbumpe' => '≏̸',
1674
+ 'nesim' => '≂̸',
1675
+ 'NewLine' => '
',
1676
+ 'NoBreak' => '⁠',
1677
+ 'nopf' => '𝕟',
1678
+ 'NotCupCap' => '≭',
1679
+ 'NotHumpEqual' => '≏̸',
1680
+ 'NotLeftTriangleBar' => '⧏̸',
1681
+ 'NotNestedGreaterGreater' => '⪢̸',
1682
+ 'NotNestedLessLess' => '⪡̸',
1683
+ 'NotRightTriangleBar' => '⧐̸',
1684
+ 'NotSquareSubset' => '⊏̸',
1685
+ 'NotSquareSuperset' => '⊐̸',
1686
+ 'NotSucceedsTilde' => '≿̸',
1687
+ 'oopf' => '𝕠',
1688
+ 'OverBar' => '¯',
1689
+ 'OverBrace' => '︷',
1690
+ 'OverBracket' => '⎴',
1691
+ 'OverParenthesis' => '︵',
1692
+ 'planckh' => 'ℎ',
1693
+ 'popf' => '𝕡',
1694
+ 'Product' => '∏',
1695
+ 'qopf' => '𝕢',
1696
+ 'rarrb' => '⇥',
1697
+ 'RightDownTeeVector' => '⥝',
1698
+ 'RightDownVectorBar' => '⥕',
1699
+ 'RightTeeVector' => '⥛',
1700
+ 'RightTriangleBar' => '⧐',
1701
+ 'RightUpDownVector' => '⥏',
1702
+ 'RightUpTeeVector' => '⥜',
1703
+ 'RightUpVectorBar' => '⥔',
1704
+ 'RightVectorBar' => '⥓',
1705
+ 'ropf' => '𝕣',
1706
+ 'RoundImplies' => '⥰',
1707
+ 'RuleDelayed' => '⧴',
1708
+ 'sopf' => '𝕤',
1709
+ 'Tab' => '	',
1710
+ 'ThickSpace' => '   ',
1711
+ 'topf' => '𝕥',
1712
+ 'UnderBar' => '̲',
1713
+ 'UnderBrace' => '︸',
1714
+ 'UnderBracket' => '⎵',
1715
+ 'UnderParenthesis' => '︶',
1716
+ 'uopf' => '𝕦',
1717
+ 'UpArrowBar' => '⤒',
1718
+ 'Upsilon' => 'Υ',
1719
+ 'VerticalLine' => '|',
1720
+ 'VerticalSeparator' => '❘',
1721
+ 'vopf' => '𝕧',
1722
+ 'wopf' => '𝕨',
1723
+ 'xopf' => '𝕩',
1724
+ 'yopf' => '𝕪',
1725
+ 'ZeroWidthSpace' => '​',
1726
+ 'zopf' => '𝕫',
1727
+ 'angle' => '∠',
1728
+ 'ApplyFunction' => '⁡',
1729
+ 'approx' => '≈',
1730
+ 'approxeq' => '≊',
1731
+ 'Assign' => '≔',
1732
+ 'backcong' => '≌',
1733
+ 'backepsilon' => '϶',
1734
+ 'backprime' => '‵',
1735
+ 'backsim' => '∽',
1736
+ 'backsimeq' => '⋍',
1737
+ 'Backslash' => '∖',
1738
+ 'barwedge' => '⌅',
1739
+ 'Because' => '∵',
1740
+ 'because' => '∵',
1741
+ 'Bernoullis' => 'ℬ',
1742
+ 'between' => '≬',
1743
+ 'bigcap' => '⋂',
1744
+ 'bigcirc' => '◯',
1745
+ 'bigcup' => '⋃',
1746
+ 'bigodot' => '⨀',
1747
+ 'bigoplus' => '⨁',
1748
+ 'bigotimes' => '⨂',
1749
+ 'bigsqcup' => '⨆',
1750
+ 'bigstar' => '★',
1751
+ 'bigtriangledown' => '▽',
1752
+ 'bigtriangleup' => '△',
1753
+ 'biguplus' => '⨄',
1754
+ 'bigvee' => '⋁',
1755
+ 'bigwedge' => '⋀',
1756
+ 'bkarow' => '⤍',
1757
+ 'blacklozenge' => '⧫',
1758
+ 'blacksquare' => '▪',
1759
+ 'blacktriangle' => '▴',
1760
+ 'blacktriangledown' => '▾',
1761
+ 'blacktriangleleft' => '◂',
1762
+ 'blacktriangleright' => '▸',
1763
+ 'bot' => '⊥',
1764
+ 'boxminus' => '⊟',
1765
+ 'boxplus' => '⊞',
1766
+ 'boxtimes' => '⊠',
1767
+ 'Breve' => '˘',
1768
+ 'bullet' => '•',
1769
+ 'Bumpeq' => '≎',
1770
+ 'bumpeq' => '≏',
1771
+ 'CapitalDifferentialD' => 'ⅅ',
1772
+ 'Cayleys' => 'ℭ',
1773
+ 'Cedilla' => '¸',
1774
+ 'CenterDot' => '·',
1775
+ 'centerdot' => '·',
1776
+ 'checkmark' => '✓',
1777
+ 'circeq' => '≗',
1778
+ 'circlearrowleft' => '↺',
1779
+ 'circlearrowright' => '↻',
1780
+ 'circledast' => '⊛',
1781
+ 'circledcirc' => '⊚',
1782
+ 'circleddash' => '⊝',
1783
+ 'CircleDot' => '⊙',
1784
+ 'circledR' => '®',
1785
+ 'circledS' => 'Ⓢ',
1786
+ 'CircleMinus' => '⊖',
1787
+ 'CirclePlus' => '⊕',
1788
+ 'CircleTimes' => '⊗',
1789
+ 'ClockwiseContourIntegral' => '∲',
1790
+ 'CloseCurlyDoubleQuote' => '”',
1791
+ 'CloseCurlyQuote' => '’',
1792
+ 'clubsuit' => '♣',
1793
+ 'coloneq' => '≔',
1794
+ 'complement' => '∁',
1795
+ 'complexes' => 'ℂ',
1796
+ 'Congruent' => '≡',
1797
+ 'ContourIntegral' => '∮',
1798
+ 'Coproduct' => '∐',
1799
+ 'CounterClockwiseContourIntegral' => '∳',
1800
+ 'CupCap' => '≍',
1801
+ 'curlyeqprec' => '⋞',
1802
+ 'curlyeqsucc' => '⋟',
1803
+ 'curlyvee' => '⋎',
1804
+ 'curlywedge' => '⋏',
1805
+ 'curvearrowleft' => '↶',
1806
+ 'curvearrowright' => '↷',
1807
+ 'dbkarow' => '⤏',
1808
+ 'ddagger' => '‡',
1809
+ 'ddotseq' => '⩷',
1810
+ 'Del' => '∇',
1811
+ 'DiacriticalAcute' => '´',
1812
+ 'DiacriticalDot' => '˙',
1813
+ 'DiacriticalDoubleAcute' => '˝',
1814
+ 'DiacriticalGrave' => '`',
1815
+ 'DiacriticalTilde' => '˜',
1816
+ 'Diamond' => '⋄',
1817
+ 'diamond' => '⋄',
1818
+ 'diamondsuit' => '♦',
1819
+ 'DifferentialD' => 'ⅆ',
1820
+ 'digamma' => 'ϝ',
1821
+ 'div' => '÷',
1822
+ 'divideontimes' => '⋇',
1823
+ 'doteq' => '≐',
1824
+ 'doteqdot' => '≑',
1825
+ 'DotEqual' => '≐',
1826
+ 'dotminus' => '∸',
1827
+ 'dotplus' => '∔',
1828
+ 'dotsquare' => '⊡',
1829
+ 'doublebarwedge' => '⌆',
1830
+ 'DoubleContourIntegral' => '∯',
1831
+ 'DoubleDot' => '¨',
1832
+ 'DoubleDownArrow' => '⇓',
1833
+ 'DoubleLeftArrow' => '⇐',
1834
+ 'DoubleLeftRightArrow' => '⇔',
1835
+ 'DoubleLeftTee' => '⫤',
1836
+ 'DoubleLongLeftArrow' => '⟸',
1837
+ 'DoubleLongLeftRightArrow' => '⟺',
1838
+ 'DoubleLongRightArrow' => '⟹',
1839
+ 'DoubleRightArrow' => '⇒',
1840
+ 'DoubleRightTee' => '⊨',
1841
+ 'DoubleUpArrow' => '⇑',
1842
+ 'DoubleUpDownArrow' => '⇕',
1843
+ 'DoubleVerticalBar' => '∥',
1844
+ 'DownArrow' => '↓',
1845
+ 'Downarrow' => '⇓',
1846
+ 'downarrow' => '↓',
1847
+ 'DownArrowUpArrow' => '⇵',
1848
+ 'downdownarrows' => '⇊',
1849
+ 'downharpoonleft' => '⇃',
1850
+ 'downharpoonright' => '⇂',
1851
+ 'DownLeftVector' => '↽',
1852
+ 'DownRightVector' => '⇁',
1853
+ 'DownTee' => '⊤',
1854
+ 'DownTeeArrow' => '↧',
1855
+ 'drbkarow' => '⤐',
1856
+ 'Element' => '∈',
1857
+ 'emptyset' => '∅',
1858
+ 'eqcirc' => '≖',
1859
+ 'eqcolon' => '≕',
1860
+ 'eqsim' => '≂',
1861
+ 'eqslantgtr' => '⪖',
1862
+ 'eqslantless' => '⪕',
1863
+ 'EqualTilde' => '≂',
1864
+ 'Equilibrium' => '⇌',
1865
+ 'Exists' => '∃',
1866
+ 'expectation' => 'ℰ',
1867
+ 'ExponentialE' => 'ⅇ',
1868
+ 'exponentiale' => 'ⅇ',
1869
+ 'fallingdotseq' => '≒',
1870
+ 'ForAll' => '∀',
1871
+ 'Fouriertrf' => 'ℱ',
1872
+ 'geq' => '≥',
1873
+ 'geqq' => '≧',
1874
+ 'geqslant' => '⩾',
1875
+ 'gg' => '≫',
1876
+ 'ggg' => '⋙',
1877
+ 'gnapprox' => '⪊',
1878
+ 'gneq' => '⪈',
1879
+ 'gneqq' => '≩',
1880
+ 'GreaterEqual' => '≥',
1881
+ 'GreaterEqualLess' => '⋛',
1882
+ 'GreaterFullEqual' => '≧',
1883
+ 'GreaterLess' => '≷',
1884
+ 'GreaterSlantEqual' => '⩾',
1885
+ 'GreaterTilde' => '≳',
1886
+ 'gtrapprox' => '⪆',
1887
+ 'gtrdot' => '⋗',
1888
+ 'gtreqless' => '⋛',
1889
+ 'gtreqqless' => '⪌',
1890
+ 'gtrless' => '≷',
1891
+ 'gtrsim' => '≳',
1892
+ 'gvertneqq' => '≩︀',
1893
+ 'Hacek' => 'ˇ',
1894
+ 'hbar' => 'ℏ',
1895
+ 'heartsuit' => '♥',
1896
+ 'HilbertSpace' => 'ℋ',
1897
+ 'hksearow' => '⤥',
1898
+ 'hkswarow' => '⤦',
1899
+ 'hookleftarrow' => '↩',
1900
+ 'hookrightarrow' => '↪',
1901
+ 'hslash' => 'ℏ',
1902
+ 'HumpDownHump' => '≎',
1903
+ 'HumpEqual' => '≏',
1904
+ 'iiiint' => '⨌',
1905
+ 'iiint' => '∭',
1906
+ 'Im' => 'ℑ',
1907
+ 'ImaginaryI' => 'ⅈ',
1908
+ 'imagline' => 'ℐ',
1909
+ 'imagpart' => 'ℑ',
1910
+ 'Implies' => '⇒',
1911
+ 'in' => '∈',
1912
+ 'integers' => 'ℤ',
1913
+ 'Integral' => '∫',
1914
+ 'intercal' => '⊺',
1915
+ 'Intersection' => '⋂',
1916
+ 'intprod' => '⨼',
1917
+ 'InvisibleComma' => '⁣',
1918
+ 'InvisibleTimes' => '⁢',
1919
+ 'langle' => '〈',
1920
+ 'Laplacetrf' => 'ℒ',
1921
+ 'lbrace' => '{',
1922
+ 'lbrack' => '[',
1923
+ 'LeftAngleBracket' => '〈',
1924
+ 'LeftArrow' => '←',
1925
+ 'Leftarrow' => '⇐',
1926
+ 'leftarrow' => '←',
1927
+ 'LeftArrowBar' => '⇤',
1928
+ 'LeftArrowRightArrow' => '⇆',
1929
+ 'leftarrowtail' => '↢',
1930
+ 'LeftCeiling' => '⌈',
1931
+ 'LeftDoubleBracket' => '〚',
1932
+ 'LeftDownVector' => '⇃',
1933
+ 'LeftFloor' => '⌊',
1934
+ 'leftharpoondown' => '↽',
1935
+ 'leftharpoonup' => '↼',
1936
+ 'leftleftarrows' => '⇇',
1937
+ 'LeftRightArrow' => '↔',
1938
+ 'Leftrightarrow' => '⇔',
1939
+ 'leftrightarrow' => '↔',
1940
+ 'leftrightarrows' => '⇆',
1941
+ 'leftrightharpoons' => '⇋',
1942
+ 'leftrightsquigarrow' => '↭',
1943
+ 'LeftTee' => '⊣',
1944
+ 'LeftTeeArrow' => '↤',
1945
+ 'leftthreetimes' => '⋋',
1946
+ 'LeftTriangle' => '⊲',
1947
+ 'LeftTriangleEqual' => '⊴',
1948
+ 'LeftUpVector' => '↿',
1949
+ 'LeftVector' => '↼',
1950
+ 'leq' => '≤',
1951
+ 'leqq' => '≦',
1952
+ 'leqslant' => '⩽',
1953
+ 'lessapprox' => '⪅',
1954
+ 'lessdot' => '⋖',
1955
+ 'lesseqgtr' => '⋚',
1956
+ 'lesseqqgtr' => '⪋',
1957
+ 'LessEqualGreater' => '⋚',
1958
+ 'LessFullEqual' => '≦',
1959
+ 'LessGreater' => '≶',
1960
+ 'lessgtr' => '≶',
1961
+ 'lesssim' => '≲',
1962
+ 'LessSlantEqual' => '⩽',
1963
+ 'LessTilde' => '≲',
1964
+ 'll' => '≪',
1965
+ 'llcorner' => '⌞',
1966
+ 'Lleftarrow' => '⇚',
1967
+ 'lmoustache' => '⎰',
1968
+ 'lnapprox' => '⪉',
1969
+ 'lneq' => '⪇',
1970
+ 'lneqq' => '≨',
1971
+ 'LongLeftArrow' => '⟵',
1972
+ 'Longleftarrow' => '⟸',
1973
+ 'longleftarrow' => '⟵',
1974
+ 'LongLeftRightArrow' => '⟷',
1975
+ 'Longleftrightarrow' => '⟺',
1976
+ 'longleftrightarrow' => '⟷',
1977
+ 'longmapsto' => '⟼',
1978
+ 'LongRightArrow' => '⟶',
1979
+ 'Longrightarrow' => '⟹',
1980
+ 'longrightarrow' => '⟶',
1981
+ 'looparrowleft' => '↫',
1982
+ 'looparrowright' => '↬',
1983
+ 'LowerLeftArrow' => '↙',
1984
+ 'LowerRightArrow' => '↘',
1985
+ 'lozenge' => '◊',
1986
+ 'lrcorner' => '⌟',
1987
+ 'Lsh' => '↰',
1988
+ 'lvertneqq' => '≨︀',
1989
+ 'maltese' => '✠',
1990
+ 'mapsto' => '↦',
1991
+ 'measuredangle' => '∡',
1992
+ 'Mellintrf' => 'ℳ',
1993
+ 'MinusPlus' => '∓',
1994
+ 'mp' => '∓',
1995
+ 'multimap' => '⊸',
1996
+ 'napprox' => '≉',
1997
+ 'natural' => '♮',
1998
+ 'naturals' => 'ℕ',
1999
+ 'nearrow' => '↗',
2000
+ 'NegativeMediumSpace' => '​',
2001
+ 'NegativeThickSpace' => '​',
2002
+ 'NegativeThinSpace' => '​',
2003
+ 'NegativeVeryThinSpace' => '​',
2004
+ 'NestedGreaterGreater' => '≫',
2005
+ 'NestedLessLess' => '≪',
2006
+ 'nexists' => '∄',
2007
+ 'ngeq' => '≱',
2008
+ 'ngeqq' => '≧̸',
2009
+ 'ngeqslant' => '⩾̸',
2010
+ 'ngtr' => '≯',
2011
+ 'nLeftarrow' => '⇍',
2012
+ 'nleftarrow' => '↚',
2013
+ 'nLeftrightarrow' => '⇎',
2014
+ 'nleftrightarrow' => '↮',
2015
+ 'nleq' => '≰',
2016
+ 'nleqq' => '≦̸',
2017
+ 'nleqslant' => '⩽̸',
2018
+ 'nless' => '≮',
2019
+ 'NonBreakingSpace' => ' ',
2020
+ 'NotCongruent' => '≢',
2021
+ 'NotDoubleVerticalBar' => '∦',
2022
+ 'NotElement' => '∉',
2023
+ 'NotEqual' => '≠',
2024
+ 'NotEqualTilde' => '≂̸',
2025
+ 'NotExists' => '∄',
2026
+ 'NotGreater' => '≯',
2027
+ 'NotGreaterEqual' => '≱',
2028
+ 'NotGreaterFullEqual' => '≦̸',
2029
+ 'NotGreaterGreater' => '≫̸',
2030
+ 'NotGreaterLess' => '≹',
2031
+ 'NotGreaterSlantEqual' => '⩾̸',
2032
+ 'NotGreaterTilde' => '≵',
2033
+ 'NotHumpDownHump' => '≎̸',
2034
+ 'NotLeftTriangle' => '⋪',
2035
+ 'NotLeftTriangleEqual' => '⋬',
2036
+ 'NotLess' => '≮',
2037
+ 'NotLessEqual' => '≰',
2038
+ 'NotLessGreater' => '≸',
2039
+ 'NotLessLess' => '≪̸',
2040
+ 'NotLessSlantEqual' => '⩽̸',
2041
+ 'NotLessTilde' => '≴',
2042
+ 'NotPrecedes' => '⊀',
2043
+ 'NotPrecedesEqual' => '⪯̸',
2044
+ 'NotPrecedesSlantEqual' => '⋠',
2045
+ 'NotReverseElement' => '∌',
2046
+ 'NotRightTriangle' => '⋫',
2047
+ 'NotRightTriangleEqual' => '⋭',
2048
+ 'NotSquareSubsetEqual' => '⋢',
2049
+ 'NotSquareSupersetEqual' => '⋣',
2050
+ 'NotSubset' => '⊂⃒',
2051
+ 'NotSubsetEqual' => '⊈',
2052
+ 'NotSucceeds' => '⊁',
2053
+ 'NotSucceedsEqual' => '⪰̸',
2054
+ 'NotSucceedsSlantEqual' => '⋡',
2055
+ 'NotSuperset' => '⊃⃒',
2056
+ 'NotSupersetEqual' => '⊉',
2057
+ 'NotTilde' => '≁',
2058
+ 'NotTildeEqual' => '≄',
2059
+ 'NotTildeFullEqual' => '≇',
2060
+ 'NotTildeTilde' => '≉',
2061
+ 'NotVerticalBar' => '∤',
2062
+ 'nparallel' => '∦',
2063
+ 'nprec' => '⊀',
2064
+ 'npreceq' => '⪯̸',
2065
+ 'nRightarrow' => '⇏',
2066
+ 'nrightarrow' => '↛',
2067
+ 'nshortmid' => '∤',
2068
+ 'nshortparallel' => '∦',
2069
+ 'nsimeq' => '≄',
2070
+ 'nsubset' => '⊂⃒',
2071
+ 'nsubseteq' => '⊈',
2072
+ 'nsubseteqq' => '⫅̸',
2073
+ 'nsucc' => '⊁',
2074
+ 'nsucceq' => '⪰̸',
2075
+ 'nsupset' => '⊃⃒',
2076
+ 'nsupseteq' => '⊉',
2077
+ 'nsupseteqq' => '⫆̸',
2078
+ 'ntriangleleft' => '⋪',
2079
+ 'ntrianglelefteq' => '⋬',
2080
+ 'ntriangleright' => '⋫',
2081
+ 'ntrianglerighteq' => '⋭',
2082
+ 'nwarrow' => '↖',
2083
+ 'oint' => '∮',
2084
+ 'OpenCurlyDoubleQuote' => '“',
2085
+ 'OpenCurlyQuote' => '‘',
2086
+ 'orderof' => 'ℴ',
2087
+ 'parallel' => '∥',
2088
+ 'PartialD' => '∂',
2089
+ 'pitchfork' => '⋔',
2090
+ 'PlusMinus' => '±',
2091
+ 'pm' => '±',
2092
+ 'Poincareplane' => 'ℌ',
2093
+ 'prec' => '≺',
2094
+ 'precapprox' => '⪷',
2095
+ 'preccurlyeq' => '≼',
2096
+ 'Precedes' => '≺',
2097
+ 'PrecedesEqual' => '⪯',
2098
+ 'PrecedesSlantEqual' => '≼',
2099
+ 'PrecedesTilde' => '≾',
2100
+ 'preceq' => '⪯',
2101
+ 'precnapprox' => '⪹',
2102
+ 'precneqq' => '⪵',
2103
+ 'precnsim' => '⋨',
2104
+ 'precsim' => '≾',
2105
+ 'primes' => 'ℙ',
2106
+ 'Proportion' => '∷',
2107
+ 'Proportional' => '∝',
2108
+ 'propto' => '∝',
2109
+ 'quaternions' => 'ℍ',
2110
+ 'questeq' => '≟',
2111
+ 'rangle' => '〉',
2112
+ 'rationals' => 'ℚ',
2113
+ 'rbrace' => '}',
2114
+ 'rbrack' => ']',
2115
+ 'Re' => 'ℜ',
2116
+ 'realine' => 'ℛ',
2117
+ 'realpart' => 'ℜ',
2118
+ 'reals' => 'ℝ',
2119
+ 'ReverseElement' => '∋',
2120
+ 'ReverseEquilibrium' => '⇋',
2121
+ 'ReverseUpEquilibrium' => '⥯',
2122
+ 'RightAngleBracket' => '〉',
2123
+ 'RightArrow' => '→',
2124
+ 'Rightarrow' => '⇒',
2125
+ 'rightarrow' => '→',
2126
+ 'RightArrowBar' => '⇥',
2127
+ 'RightArrowLeftArrow' => '⇄',
2128
+ 'rightarrowtail' => '↣',
2129
+ 'RightCeiling' => '⌉',
2130
+ 'RightDoubleBracket' => '〛',
2131
+ 'RightDownVector' => '⇂',
2132
+ 'RightFloor' => '⌋',
2133
+ 'rightharpoondown' => '⇁',
2134
+ 'rightharpoonup' => '⇀',
2135
+ 'rightleftarrows' => '⇄',
2136
+ 'rightleftharpoons' => '⇌',
2137
+ 'rightrightarrows' => '⇉',
2138
+ 'rightsquigarrow' => '↝',
2139
+ 'RightTee' => '⊢',
2140
+ 'RightTeeArrow' => '↦',
2141
+ 'rightthreetimes' => '⋌',
2142
+ 'RightTriangle' => '⊳',
2143
+ 'RightTriangleEqual' => '⊵',
2144
+ 'RightUpVector' => '↾',
2145
+ 'RightVector' => '⇀',
2146
+ 'risingdotseq' => '≓',
2147
+ 'rmoustache' => '⎱',
2148
+ 'Rrightarrow' => '⇛',
2149
+ 'Rsh' => '↱',
2150
+ 'searrow' => '↘',
2151
+ 'setminus' => '∖',
2152
+ 'ShortDownArrow' => '↓',
2153
+ 'ShortLeftArrow' => '←',
2154
+ 'shortmid' => '∣',
2155
+ 'shortparallel' => '∥',
2156
+ 'ShortRightArrow' => '→',
2157
+ 'ShortUpArrow' => '↑',
2158
+ 'simeq' => '≃',
2159
+ 'SmallCircle' => '∘',
2160
+ 'smallsetminus' => '∖',
2161
+ 'spadesuit' => '♠',
2162
+ 'Sqrt' => '√',
2163
+ 'sqsubset' => '⊏',
2164
+ 'sqsubseteq' => '⊑',
2165
+ 'sqsupset' => '⊐',
2166
+ 'sqsupseteq' => '⊒',
2167
+ 'Square' => '□',
2168
+ 'SquareIntersection' => '⊓',
2169
+ 'SquareSubset' => '⊏',
2170
+ 'SquareSubsetEqual' => '⊑',
2171
+ 'SquareSuperset' => '⊐',
2172
+ 'SquareSupersetEqual' => '⊒',
2173
+ 'SquareUnion' => '⊔',
2174
+ 'Star' => '⋆',
2175
+ 'straightepsilon' => 'ϵ',
2176
+ 'straightphi' => 'ϕ',
2177
+ 'Subset' => '⋐',
2178
+ 'subset' => '⊂',
2179
+ 'subseteq' => '⊆',
2180
+ 'subseteqq' => '⫅',
2181
+ 'SubsetEqual' => '⊆',
2182
+ 'subsetneq' => '⊊',
2183
+ 'subsetneqq' => '⫋',
2184
+ 'succ' => '≻',
2185
+ 'succapprox' => '⪸',
2186
+ 'succcurlyeq' => '≽',
2187
+ 'Succeeds' => '≻',
2188
+ 'SucceedsEqual' => '⪰',
2189
+ 'SucceedsSlantEqual' => '≽',
2190
+ 'SucceedsTilde' => '≿',
2191
+ 'succeq' => '⪰',
2192
+ 'succnapprox' => '⪺',
2193
+ 'succneqq' => '⪶',
2194
+ 'succnsim' => '⋩',
2195
+ 'succsim' => '≿',
2196
+ 'SuchThat' => '∋',
2197
+ 'Sum' => '∑',
2198
+ 'Superset' => '⊃',
2199
+ 'SupersetEqual' => '⊇',
2200
+ 'Supset' => '⋑',
2201
+ 'supset' => '⊃',
2202
+ 'supseteq' => '⊇',
2203
+ 'supseteqq' => '⫆',
2204
+ 'supsetneq' => '⊋',
2205
+ 'supsetneqq' => '⫌',
2206
+ 'swarrow' => '↙',
2207
+ 'Therefore' => '∴',
2208
+ 'therefore' => '∴',
2209
+ 'thickapprox' => '≈',
2210
+ 'thicksim' => '∼',
2211
+ 'ThinSpace' => ' ',
2212
+ 'Tilde' => '∼',
2213
+ 'TildeEqual' => '≃',
2214
+ 'TildeFullEqual' => '≅',
2215
+ 'TildeTilde' => '≈',
2216
+ 'toea' => '⤨',
2217
+ 'tosa' => '⤩',
2218
+ 'triangle' => '▵',
2219
+ 'triangledown' => '▿',
2220
+ 'triangleleft' => '◃',
2221
+ 'trianglelefteq' => '⊴',
2222
+ 'triangleq' => '≜',
2223
+ 'triangleright' => '▹',
2224
+ 'trianglerighteq' => '⊵',
2225
+ 'TripleDot' => '⃛',
2226
+ 'twoheadleftarrow' => '↞',
2227
+ 'twoheadrightarrow' => '↠',
2228
+ 'ulcorner' => '⌜',
2229
+ 'Union' => '⋃',
2230
+ 'UnionPlus' => '⊎',
2231
+ 'UpArrow' => '↑',
2232
+ 'Uparrow' => '⇑',
2233
+ 'uparrow' => '↑',
2234
+ 'UpArrowDownArrow' => '⇅',
2235
+ 'UpDownArrow' => '↕',
2236
+ 'Updownarrow' => '⇕',
2237
+ 'updownarrow' => '↕',
2238
+ 'UpEquilibrium' => '⥮',
2239
+ 'upharpoonleft' => '↿',
2240
+ 'upharpoonright' => '↾',
2241
+ 'UpperLeftArrow' => '↖',
2242
+ 'UpperRightArrow' => '↗',
2243
+ 'upsilon' => 'υ',
2244
+ 'UpTee' => '⊥',
2245
+ 'UpTeeArrow' => '↥',
2246
+ 'upuparrows' => '⇈',
2247
+ 'urcorner' => '⌝',
2248
+ 'varepsilon' => 'ε',
2249
+ 'varkappa' => 'ϰ',
2250
+ 'varnothing' => '∅',
2251
+ 'varphi' => 'φ',
2252
+ 'varpi' => 'ϖ',
2253
+ 'varpropto' => '∝',
2254
+ 'varrho' => 'ϱ',
2255
+ 'varsigma' => 'ς',
2256
+ 'varsubsetneq' => '⊊︀',
2257
+ 'varsubsetneqq' => '⫋︀',
2258
+ 'varsupsetneq' => '⊋︀',
2259
+ 'varsupsetneqq' => '⫌︀',
2260
+ 'vartheta' => 'ϑ',
2261
+ 'vartriangleleft' => '⊲',
2262
+ 'vartriangleright' => '⊳',
2263
+ 'Vee' => '⋁',
2264
+ 'vee' => '∨',
2265
+ 'Vert' => '‖',
2266
+ 'vert' => '|',
2267
+ 'VerticalBar' => '∣',
2268
+ 'VerticalTilde' => '≀',
2269
+ 'VeryThinSpace' => ' ',
2270
+ 'Wedge' => '⋀',
2271
+ 'wedge' => '∧',
2272
+ 'wp' => '℘',
2273
+ 'wr' => '≀',
2274
+ 'zeetrf' => 'ℨ'
2275
+ }
2276
+#:startdoc:
2277
+
2278
+# Converts XHTML+MathML named entities in string to Numeric Character References
2279
+#
2280
+# :call-seq:
2281
+# string.to_ncr -> string
2282
+#
2283
+ def to_ncr
2284
+ self.gsub(/&(?:(lt|gt|amp|quot|apos)|[a-zA-Z0-9]+);/){|s| $1 ? s : s.convert_to_ncr}
2285
+ end
2286
+
2287
+# Converts XHTML+MathML named entities in string to Numeric Character References
2288
+#
2289
+# :call-seq:
2290
+# string.to_ncr! -> str or nil
2291
+#
2292
+# Substitution is done in-place.
2293
+#
2294
+ def to_ncr!
2295
+ self.gsub!(/&(?:(lt|gt|amp|quot|apos)|[a-zA-Z0-9]+);/){|s| $1 ? s : s.convert_to_ncr}
2296
+ end
2297
+
2298
+# Converts XHTML+MathML named entities in string to UTF-8
2299
+#
2300
+# :call-seq:
2301
+# string.to_utf8 -> string
2302
+#
2303
+ def to_utf8
2304
+ self.gsub(/&(?:(lt|gt|amp|quot|apos)|[a-zA-Z0-9]+);/){|s| $1 ? s : s.convert_to_utf8}
2305
+ end
2306
+
2307
+# Converts XHTML+MathML named entities in string to UTF-8
2308
+#
2309
+# :call-seq:
2310
+# string.to_ncr! -> str or nil
2311
+#
2312
+# Substitution is done in-place.
2313
+#
2314
+ def to_utf8!
2315
+ self.gsub!(/&(?:(lt|gt|amp|quot|apos)|[a-zA-Z0-9]+);/){|s| $1 ? s : s.convert_to_utf8}
2316
+ end
2317
+
2318
+ protected
2319
+
2320
+ def convert_to_ncr #:nodoc:
2321
+ self =~ /^&([a-zA-Z0-9]+);$/
2322
+ name = $1
2323
+ return MATHML_ENTITIES.has_key?(name) ? MATHML_ENTITIES[name] : "&" + name + ";"
2324
+ end
2325
+
2326
+ def convert_to_utf8 #:nodoc:
2327
+ self =~ /^&([a-zA-Z0-9]+);$/
2328
+ name = $1
2329
+ return MATHML_ENTITIES.has_key?(name) ? MATHML_ENTITIES[name].split(';').collect {|s| s.gsub(/^&#x([A-F0-9]+)$/, '\1').hex }.pack('U*') : "&" + name + ";"
2330
+ end
2331
+
2332
+
2333
+end
2334
+
2335
+require 'rexml/element'
2336
+module REXML #:nodoc:
2337
+ class Element
2338
+
2339
+# Convert XHTML+MathML Named Entities in a REXML::Element to Numeric Character References
2340
+#
2341
+# :call-seq:
2342
+# tree.to_ncr -> REXML::Element
2343
+#
2344
+# REXML, typically, converts NCRs to utf-8 characters, which is what you'll see when you
2345
+# access the resulting REXML document.
2346
+#
2347
+# Note that this method needs to traverse the entire tree, converting text nodes and attributes
2348
+# for each element. This can be SLOW. It will often be faster to serialize to a string and then
2349
+# use String.to_ncr instead.
2350
+#
2351
+ def to_ncr
2352
+ self.each_element { |el|
2353
+ el.texts.each_index {|i|
2354
+ el.texts[i].value = el.texts[i].to_s.to_ncr
2355
+ }
2356
+ el.attributes.each { |name,val|
2357
+ el.attributes[name] = val.to_ncr
2358
+ }
2359
+ el.to_ncr if el.has_elements?
2360
+ }
2361
+ return self
2362
+ end
2363
+
2364
+# Convert XHTML+MathML Named Entities in a REXML::Element to UTF-8
2365
+#
2366
+# :call-seq:
2367
+# tree.to_utf8 -> REXML::Element
2368
+#
2369
+# Note that this method needs to traverse the entire tree, converting text nodes and attributes
2370
+# for each element. This can be SLOW. It will often be faster to serialize to a string and then
2371
+# use String.to_utf8 instead.
2372
+#
2373
+ def to_utf8
2374
+ self.each_element { |el|
2375
+ el.texts.each_index {|i|
2376
+ el.texts[i].value = el.texts[i].to_s.to_utf8
2377
+ }
2378
+ el.attributes.each { |name,val|
2379
+ el.attributes[name] = val.to_utf8
2380
+ }
2381
+ el.to_utf8 if el.has_elements?
2382
+ }
2383
+ return self
2384
+ end
2385
+
2386
+ end
2387
+end
2388
+
2389
+module HTML5 #:nodoc: all
2390
+ module TreeWalkers
2391
+
2392
+ private
2393
+
2394
+ class << self
2395
+ def [](name)
2396
+ case name.to_s.downcase
2397
+ when 'rexml'
2398
+ require 'html5/treewalkers/rexml'
2399
+ REXML::TreeWalker
2400
+ when 'rexml2'
2401
+ REXML2::TreeWalker
2402
+ else
2403
+ raise "Unknown TreeWalker #{name}"
2404
+ end
2405
+ end
2406
+
2407
+ alias :get_tree_walker :[]
2408
+ end
2409
+
2410
+ module REXML2
2411
+ class TreeWalker < HTML5::TreeWalkers::NonRecursiveTreeWalker
2412
+
2413
+ private
2414
+
2415
+ def node_details(node)
2416
+ case node
2417
+ when ::REXML::Document
2418
+ [:DOCUMENT]
2419
+ when ::REXML::Element
2420
+ if !node.name
2421
+ [:DOCUMENT_FRAGMENT]
2422
+ else
2423
+ [:ELEMENT, node.name,
2424
+ node.attributes.map {|name,value| [name,value.to_utf8]},
2425
+ node.has_elements? || node.has_text?]
2426
+ end
2427
+ when ::REXML::Text
2428
+ [:TEXT, node.value.to_utf8]
2429
+ when ::REXML::Comment
2430
+ [:COMMENT, node.string]
2431
+ when ::REXML::DocType
2432
+ [:DOCTYPE, node.name, node.public, node.system]
2433
+ when ::REXML::XMLDecl
2434
+ [nil]
2435
+ else
2436
+ [:UNKNOWN, node.class.inspect]
2437
+ end
2438
+ end
2439
+
2440
+ def first_child(node)
2441
+ node.children.first
2442
+ end
2443
+
2444
+ def next_sibling(node)
2445
+ node.next_sibling
2446
+ end
2447
+
2448
+ def parent(node)
2449
+ node.parent
2450
+ end
2451
+ end
2452
+ end
2453
+ end
2454
+end
...
...