htmlparser.nim 69 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079
  1. #
  2. #
  3. # Nim's Runtime Library
  4. # (c) Copyright 2013 Andreas Rumpf
  5. #
  6. # See the file "copying.txt", included in this
  7. # distribution, for details about the copyright.
  8. #
  9. ## **NOTE**: The behaviour might change in future versions as it is not
  10. ## clear what "*wild* HTML the real world uses" really implies.
  11. ##
  12. ## It can be used to parse a wild HTML document and output it as valid XHTML
  13. ## document (well, if you are lucky):
  14. ##
  15. ## .. code-block:: Nim
  16. ##
  17. ## echo loadHtml("mydirty.html")
  18. ##
  19. ## Every tag in the resulting tree is in lower case.
  20. ##
  21. ## **Note:** The resulting `XmlNode` already uses the `clientData` field,
  22. ## so it cannot be used by clients of this library.
  23. ##
  24. ## Example: Transforming hyperlinks
  25. ## ================================
  26. ##
  27. ## This code demonstrates how you can iterate over all the tags in an HTML file
  28. ## and write back the modified version. In this case we look for hyperlinks
  29. ## ending with the extension `.rst` and convert them to `.html`.
  30. ##
  31. ## .. code-block:: Nim
  32. ## :test:
  33. ##
  34. ## import std/htmlparser
  35. ## import std/xmltree # To use '$' for XmlNode
  36. ## import std/strtabs # To access XmlAttributes
  37. ## import std/os # To use splitFile
  38. ## import std/strutils # To use cmpIgnoreCase
  39. ##
  40. ## proc transformHyperlinks() =
  41. ## let html = loadHtml("input.html")
  42. ##
  43. ## for a in html.findAll("a"):
  44. ## if a.attrs.hasKey "href":
  45. ## let (dir, filename, ext) = splitFile(a.attrs["href"])
  46. ## if cmpIgnoreCase(ext, ".rst") == 0:
  47. ## a.attrs["href"] = dir / filename & ".html"
  48. ##
  49. ## writeFile("output.html", $html)
  50. import strutils, streams, parsexml, xmltree, unicode, strtabs
  51. when defined(nimPreviewSlimSystem):
  52. import std/syncio
  53. type
  54. HtmlTag* = enum ## list of all supported HTML tags; order will always be
  55. ## alphabetically
  56. tagUnknown, ## unknown HTML element
  57. tagA, ## the HTML `a` element
  58. tagAbbr, ## the deprecated HTML `abbr` element
  59. tagAcronym, ## the HTML `acronym` element
  60. tagAddress, ## the HTML `address` element
  61. tagApplet, ## the deprecated HTML `applet` element
  62. tagArea, ## the HTML `area` element
  63. tagArticle, ## the HTML `article` element
  64. tagAside, ## the HTML `aside` element
  65. tagAudio, ## the HTML `audio` element
  66. tagB, ## the HTML `b` element
  67. tagBase, ## the HTML `base` element
  68. tagBdi, ## the HTML `bdi` element
  69. tagBdo, ## the deprecated HTML `dbo` element
  70. tagBasefont, ## the deprecated HTML `basefont` element
  71. tagBig, ## the HTML `big` element
  72. tagBlockquote, ## the HTML `blockquote` element
  73. tagBody, ## the HTML `body` element
  74. tagBr, ## the HTML `br` element
  75. tagButton, ## the HTML `button` element
  76. tagCanvas, ## the HTML `canvas` element
  77. tagCaption, ## the HTML `caption` element
  78. tagCenter, ## the deprecated HTML `center` element
  79. tagCite, ## the HTML `cite` element
  80. tagCode, ## the HTML `code` element
  81. tagCol, ## the HTML `col` element
  82. tagColgroup, ## the HTML `colgroup` element
  83. tagCommand, ## the HTML `command` element
  84. tagDatalist, ## the HTML `datalist` element
  85. tagDd, ## the HTML `dd` element
  86. tagDel, ## the HTML `del` element
  87. tagDetails, ## the HTML `details` element
  88. tagDfn, ## the HTML `dfn` element
  89. tagDialog, ## the HTML `dialog` element
  90. tagDiv, ## the HTML `div` element
  91. tagDir, ## the deprecated HTLM `dir` element
  92. tagDl, ## the HTML `dl` element
  93. tagDt, ## the HTML `dt` element
  94. tagEm, ## the HTML `em` element
  95. tagEmbed, ## the HTML `embed` element
  96. tagFieldset, ## the HTML `fieldset` element
  97. tagFigcaption, ## the HTML `figcaption` element
  98. tagFigure, ## the HTML `figure` element
  99. tagFont, ## the deprecated HTML `font` element
  100. tagFooter, ## the HTML `footer` element
  101. tagForm, ## the HTML `form` element
  102. tagFrame, ## the HTML `frame` element
  103. tagFrameset, ## the deprecated HTML `frameset` element
  104. tagH1, ## the HTML `h1` element
  105. tagH2, ## the HTML `h2` element
  106. tagH3, ## the HTML `h3` element
  107. tagH4, ## the HTML `h4` element
  108. tagH5, ## the HTML `h5` element
  109. tagH6, ## the HTML `h6` element
  110. tagHead, ## the HTML `head` element
  111. tagHeader, ## the HTML `header` element
  112. tagHgroup, ## the HTML `hgroup` element
  113. tagHtml, ## the HTML `html` element
  114. tagHr, ## the HTML `hr` element
  115. tagI, ## the HTML `i` element
  116. tagIframe, ## the deprecated HTML `iframe` element
  117. tagImg, ## the HTML `img` element
  118. tagInput, ## the HTML `input` element
  119. tagIns, ## the HTML `ins` element
  120. tagIsindex, ## the deprecated HTML `isindex` element
  121. tagKbd, ## the HTML `kbd` element
  122. tagKeygen, ## the HTML `keygen` element
  123. tagLabel, ## the HTML `label` element
  124. tagLegend, ## the HTML `legend` element
  125. tagLi, ## the HTML `li` element
  126. tagLink, ## the HTML `link` element
  127. tagMap, ## the HTML `map` element
  128. tagMark, ## the HTML `mark` element
  129. tagMenu, ## the deprecated HTML `menu` element
  130. tagMeta, ## the HTML `meta` element
  131. tagMeter, ## the HTML `meter` element
  132. tagNav, ## the HTML `nav` element
  133. tagNobr, ## the deprecated HTML `nobr` element
  134. tagNoframes, ## the deprecated HTML `noframes` element
  135. tagNoscript, ## the HTML `noscript` element
  136. tagObject, ## the HTML `object` element
  137. tagOl, ## the HTML `ol` element
  138. tagOptgroup, ## the HTML `optgroup` element
  139. tagOption, ## the HTML `option` element
  140. tagOutput, ## the HTML `output` element
  141. tagP, ## the HTML `p` element
  142. tagParam, ## the HTML `param` element
  143. tagPre, ## the HTML `pre` element
  144. tagProgress, ## the HTML `progress` element
  145. tagQ, ## the HTML `q` element
  146. tagRp, ## the HTML `rp` element
  147. tagRt, ## the HTML `rt` element
  148. tagRuby, ## the HTML `ruby` element
  149. tagS, ## the deprecated HTML `s` element
  150. tagSamp, ## the HTML `samp` element
  151. tagScript, ## the HTML `script` element
  152. tagSection, ## the HTML `section` element
  153. tagSelect, ## the HTML `select` element
  154. tagSmall, ## the HTML `small` element
  155. tagSource, ## the HTML `source` element
  156. tagSpan, ## the HTML `span` element
  157. tagStrike, ## the deprecated HTML `strike` element
  158. tagStrong, ## the HTML `strong` element
  159. tagStyle, ## the HTML `style` element
  160. tagSub, ## the HTML `sub` element
  161. tagSummary, ## the HTML `summary` element
  162. tagSup, ## the HTML `sup` element
  163. tagTable, ## the HTML `table` element
  164. tagTbody, ## the HTML `tbody` element
  165. tagTd, ## the HTML `td` element
  166. tagTextarea, ## the HTML `textarea` element
  167. tagTfoot, ## the HTML `tfoot` element
  168. tagTh, ## the HTML `th` element
  169. tagThead, ## the HTML `thead` element
  170. tagTime, ## the HTML `time` element
  171. tagTitle, ## the HTML `title` element
  172. tagTr, ## the HTML `tr` element
  173. tagTrack, ## the HTML `track` element
  174. tagTt, ## the HTML `tt` element
  175. tagU, ## the deprecated HTML `u` element
  176. tagUl, ## the HTML `ul` element
  177. tagVar, ## the HTML `var` element
  178. tagVideo, ## the HTML `video` element
  179. tagWbr ## the HTML `wbr` element
  180. const
  181. tagToStr* = [
  182. "a", "abbr", "acronym", "address", "applet", "area", "article",
  183. "aside", "audio",
  184. "b", "base", "basefont", "bdi", "bdo", "big", "blockquote", "body",
  185. "br", "button", "canvas", "caption", "center", "cite", "code",
  186. "col", "colgroup", "command",
  187. "datalist", "dd", "del", "details", "dfn", "dialog", "div",
  188. "dir", "dl", "dt", "em", "embed", "fieldset",
  189. "figcaption", "figure", "font", "footer",
  190. "form", "frame", "frameset", "h1", "h2", "h3",
  191. "h4", "h5", "h6", "head", "header", "hgroup", "html", "hr",
  192. "i", "iframe", "img", "input", "ins", "isindex",
  193. "kbd", "keygen", "label", "legend", "li", "link", "map", "mark",
  194. "menu", "meta", "meter", "nav", "nobr", "noframes", "noscript",
  195. "object", "ol",
  196. "optgroup", "option", "output", "p", "param", "pre", "progress", "q",
  197. "rp", "rt", "ruby", "s", "samp", "script", "section", "select", "small",
  198. "source", "span", "strike", "strong", "style",
  199. "sub", "summary", "sup", "table",
  200. "tbody", "td", "textarea", "tfoot", "th", "thead", "time",
  201. "title", "tr", "track", "tt", "u", "ul", "var", "video", "wbr"]
  202. InlineTags* = {tagA, tagAbbr, tagAcronym, tagApplet, tagB, tagBasefont,
  203. tagBdo, tagBig, tagBr, tagButton, tagCite, tagCode, tagDel, tagDfn,
  204. tagEm, tagFont, tagI, tagImg, tagIns, tagInput, tagIframe, tagKbd,
  205. tagLabel, tagMap, tagObject, tagQ, tagSamp, tagScript, tagSelect,
  206. tagSmall, tagSpan, tagStrong, tagSub, tagSup, tagTextarea, tagTt,
  207. tagVar, tagApplet, tagBasefont, tagFont, tagIframe, tagU, tagS,
  208. tagStrike, tagWbr}
  209. BlockTags* = {tagAddress, tagBlockquote, tagCenter, tagDel, tagDir, tagDiv,
  210. tagDl, tagFieldset, tagForm, tagH1, tagH2, tagH3, tagH4,
  211. tagH5, tagH6, tagHr, tagIns, tagIsindex, tagMenu, tagNoframes, tagNoscript,
  212. tagOl, tagP, tagPre, tagTable, tagUl, tagCenter, tagDir, tagIsindex,
  213. tagMenu, tagNoframes}
  214. SingleTags* = {tagArea, tagBase, tagBasefont,
  215. tagBr, tagCol, tagFrame, tagHr, tagImg, tagIsindex,
  216. tagLink, tagMeta, tagParam, tagWbr, tagSource}
  217. proc allLower(s: string): bool =
  218. for c in s:
  219. if c < 'a' or c > 'z': return false
  220. return true
  221. proc toHtmlTag(s: string): HtmlTag =
  222. case s
  223. of "a": tagA
  224. of "abbr": tagAbbr
  225. of "acronym": tagAcronym
  226. of "address": tagAddress
  227. of "applet": tagApplet
  228. of "area": tagArea
  229. of "article": tagArticle
  230. of "aside": tagAside
  231. of "audio": tagAudio
  232. of "b": tagB
  233. of "base": tagBase
  234. of "basefont": tagBasefont
  235. of "bdi": tagBdi
  236. of "bdo": tagBdo
  237. of "big": tagBig
  238. of "blockquote": tagBlockquote
  239. of "body": tagBody
  240. of "br": tagBr
  241. of "button": tagButton
  242. of "canvas": tagCanvas
  243. of "caption": tagCaption
  244. of "center": tagCenter
  245. of "cite": tagCite
  246. of "code": tagCode
  247. of "col": tagCol
  248. of "colgroup": tagColgroup
  249. of "command": tagCommand
  250. of "datalist": tagDatalist
  251. of "dd": tagDd
  252. of "del": tagDel
  253. of "details": tagDetails
  254. of "dfn": tagDfn
  255. of "dialog": tagDialog
  256. of "div": tagDiv
  257. of "dir": tagDir
  258. of "dl": tagDl
  259. of "dt": tagDt
  260. of "em": tagEm
  261. of "embed": tagEmbed
  262. of "fieldset": tagFieldset
  263. of "figcaption": tagFigcaption
  264. of "figure": tagFigure
  265. of "font": tagFont
  266. of "footer": tagFooter
  267. of "form": tagForm
  268. of "frame": tagFrame
  269. of "frameset": tagFrameset
  270. of "h1": tagH1
  271. of "h2": tagH2
  272. of "h3": tagH3
  273. of "h4": tagH4
  274. of "h5": tagH5
  275. of "h6": tagH6
  276. of "head": tagHead
  277. of "header": tagHeader
  278. of "hgroup": tagHgroup
  279. of "html": tagHtml
  280. of "hr": tagHr
  281. of "i": tagI
  282. of "iframe": tagIframe
  283. of "img": tagImg
  284. of "input": tagInput
  285. of "ins": tagIns
  286. of "isindex": tagIsindex
  287. of "kbd": tagKbd
  288. of "keygen": tagKeygen
  289. of "label": tagLabel
  290. of "legend": tagLegend
  291. of "li": tagLi
  292. of "link": tagLink
  293. of "map": tagMap
  294. of "mark": tagMark
  295. of "menu": tagMenu
  296. of "meta": tagMeta
  297. of "meter": tagMeter
  298. of "nav": tagNav
  299. of "nobr": tagNobr
  300. of "noframes": tagNoframes
  301. of "noscript": tagNoscript
  302. of "object": tagObject
  303. of "ol": tagOl
  304. of "optgroup": tagOptgroup
  305. of "option": tagOption
  306. of "output": tagOutput
  307. of "p": tagP
  308. of "param": tagParam
  309. of "pre": tagPre
  310. of "progress": tagProgress
  311. of "q": tagQ
  312. of "rp": tagRp
  313. of "rt": tagRt
  314. of "ruby": tagRuby
  315. of "s": tagS
  316. of "samp": tagSamp
  317. of "script": tagScript
  318. of "section": tagSection
  319. of "select": tagSelect
  320. of "small": tagSmall
  321. of "source": tagSource
  322. of "span": tagSpan
  323. of "strike": tagStrike
  324. of "strong": tagStrong
  325. of "style": tagStyle
  326. of "sub": tagSub
  327. of "summary": tagSummary
  328. of "sup": tagSup
  329. of "table": tagTable
  330. of "tbody": tagTbody
  331. of "td": tagTd
  332. of "textarea": tagTextarea
  333. of "tfoot": tagTfoot
  334. of "th": tagTh
  335. of "thead": tagThead
  336. of "time": tagTime
  337. of "title": tagTitle
  338. of "tr": tagTr
  339. of "track": tagTrack
  340. of "tt": tagTt
  341. of "u": tagU
  342. of "ul": tagUl
  343. of "var": tagVar
  344. of "video": tagVideo
  345. of "wbr": tagWbr
  346. else: tagUnknown
  347. proc htmlTag*(n: XmlNode): HtmlTag =
  348. ## Gets `n`'s tag as a `HtmlTag`.
  349. if n.clientData == 0:
  350. n.clientData = toHtmlTag(n.tag).ord
  351. result = HtmlTag(n.clientData)
  352. proc htmlTag*(s: string): HtmlTag =
  353. ## Converts `s` to a `HtmlTag`. If `s` is no HTML tag, `tagUnknown` is
  354. ## returned.
  355. let s = if allLower(s): s else: toLowerAscii(s)
  356. result = toHtmlTag(s)
  357. proc runeToEntity*(rune: Rune): string =
  358. ## converts a Rune to its numeric HTML entity equivalent.
  359. runnableExamples:
  360. import std/unicode
  361. doAssert runeToEntity(Rune(0)) == ""
  362. doAssert runeToEntity(Rune(-1)) == ""
  363. doAssert runeToEntity("Ü".runeAt(0)) == "#220"
  364. doAssert runeToEntity("∈".runeAt(0)) == "#8712"
  365. if rune.ord <= 0: result = ""
  366. else: result = '#' & $rune.ord
  367. proc entityToRune*(entity: string): Rune =
  368. ## Converts an HTML entity name like `&Uuml;` or values like `&#220;`
  369. ## or `&#x000DC;` to its UTF-8 equivalent.
  370. ## Rune(0) is returned if the entity name is unknown.
  371. runnableExamples:
  372. import std/unicode
  373. doAssert entityToRune("") == Rune(0)
  374. doAssert entityToRune("a") == Rune(0)
  375. doAssert entityToRune("gt") == ">".runeAt(0)
  376. doAssert entityToRune("Uuml") == "Ü".runeAt(0)
  377. doAssert entityToRune("quest") == "?".runeAt(0)
  378. doAssert entityToRune("#x0003F") == "?".runeAt(0)
  379. if entity.len < 2: return # smallest entity has length 2
  380. if entity[0] == '#':
  381. var runeValue = 0
  382. case entity[1]
  383. of '0'..'9':
  384. try: runeValue = parseInt(entity[1..^1])
  385. except ValueError: discard
  386. of 'x', 'X': # not case sensitive here
  387. try: runeValue = parseHexInt(entity[2..^1])
  388. except ValueError: discard
  389. else: discard # other entities are not defined with prefix `#`
  390. if runeValue notin 0..0x10FFFF: runeValue = 0 # only return legal values
  391. return Rune(runeValue)
  392. case entity # entity names are case sensitive
  393. of "Tab": Rune(0x00009)
  394. of "NewLine": Rune(0x0000A)
  395. of "excl": Rune(0x00021)
  396. of "quot", "QUOT": Rune(0x00022)
  397. of "num": Rune(0x00023)
  398. of "dollar": Rune(0x00024)
  399. of "percnt": Rune(0x00025)
  400. of "amp", "AMP": Rune(0x00026)
  401. of "apos": Rune(0x00027)
  402. of "lpar": Rune(0x00028)
  403. of "rpar": Rune(0x00029)
  404. of "ast", "midast": Rune(0x0002A)
  405. of "plus": Rune(0x0002B)
  406. of "comma": Rune(0x0002C)
  407. of "period": Rune(0x0002E)
  408. of "sol": Rune(0x0002F)
  409. of "colon": Rune(0x0003A)
  410. of "semi": Rune(0x0003B)
  411. of "lt", "LT": Rune(0x0003C)
  412. of "equals": Rune(0x0003D)
  413. of "gt", "GT": Rune(0x0003E)
  414. of "quest": Rune(0x0003F)
  415. of "commat": Rune(0x00040)
  416. of "lsqb", "lbrack": Rune(0x0005B)
  417. of "bsol": Rune(0x0005C)
  418. of "rsqb", "rbrack": Rune(0x0005D)
  419. of "Hat": Rune(0x0005E)
  420. of "lowbar": Rune(0x0005F)
  421. of "grave", "DiacriticalGrave": Rune(0x00060)
  422. of "lcub", "lbrace": Rune(0x0007B)
  423. of "verbar", "vert", "VerticalLine": Rune(0x0007C)
  424. of "rcub", "rbrace": Rune(0x0007D)
  425. of "nbsp", "NonBreakingSpace": Rune(0x000A0)
  426. of "iexcl": Rune(0x000A1)
  427. of "cent": Rune(0x000A2)
  428. of "pound": Rune(0x000A3)
  429. of "curren": Rune(0x000A4)
  430. of "yen": Rune(0x000A5)
  431. of "brvbar": Rune(0x000A6)
  432. of "sect": Rune(0x000A7)
  433. of "Dot", "die", "DoubleDot", "uml": Rune(0x000A8)
  434. of "copy", "COPY": Rune(0x000A9)
  435. of "ordf": Rune(0x000AA)
  436. of "laquo": Rune(0x000AB)
  437. of "not": Rune(0x000AC)
  438. of "shy": Rune(0x000AD)
  439. of "reg", "circledR", "REG": Rune(0x000AE)
  440. of "macr", "OverBar", "strns": Rune(0x000AF)
  441. of "deg": Rune(0x000B0)
  442. of "plusmn", "pm", "PlusMinus": Rune(0x000B1)
  443. of "sup2": Rune(0x000B2)
  444. of "sup3": Rune(0x000B3)
  445. of "acute", "DiacriticalAcute": Rune(0x000B4)
  446. of "micro": Rune(0x000B5)
  447. of "para": Rune(0x000B6)
  448. of "middot", "centerdot", "CenterDot": Rune(0x000B7)
  449. of "cedil", "Cedilla": Rune(0x000B8)
  450. of "sup1": Rune(0x000B9)
  451. of "ordm": Rune(0x000BA)
  452. of "raquo": Rune(0x000BB)
  453. of "frac14": Rune(0x000BC)
  454. of "frac12", "half": Rune(0x000BD)
  455. of "frac34": Rune(0x000BE)
  456. of "iquest": Rune(0x000BF)
  457. of "Agrave": Rune(0x000C0)
  458. of "Aacute": Rune(0x000C1)
  459. of "Acirc": Rune(0x000C2)
  460. of "Atilde": Rune(0x000C3)
  461. of "Auml": Rune(0x000C4)
  462. of "Aring": Rune(0x000C5)
  463. of "AElig": Rune(0x000C6)
  464. of "Ccedil": Rune(0x000C7)
  465. of "Egrave": Rune(0x000C8)
  466. of "Eacute": Rune(0x000C9)
  467. of "Ecirc": Rune(0x000CA)
  468. of "Euml": Rune(0x000CB)
  469. of "Igrave": Rune(0x000CC)
  470. of "Iacute": Rune(0x000CD)
  471. of "Icirc": Rune(0x000CE)
  472. of "Iuml": Rune(0x000CF)
  473. of "ETH": Rune(0x000D0)
  474. of "Ntilde": Rune(0x000D1)
  475. of "Ograve": Rune(0x000D2)
  476. of "Oacute": Rune(0x000D3)
  477. of "Ocirc": Rune(0x000D4)
  478. of "Otilde": Rune(0x000D5)
  479. of "Ouml": Rune(0x000D6)
  480. of "times": Rune(0x000D7)
  481. of "Oslash": Rune(0x000D8)
  482. of "Ugrave": Rune(0x000D9)
  483. of "Uacute": Rune(0x000DA)
  484. of "Ucirc": Rune(0x000DB)
  485. of "Uuml": Rune(0x000DC)
  486. of "Yacute": Rune(0x000DD)
  487. of "THORN": Rune(0x000DE)
  488. of "szlig": Rune(0x000DF)
  489. of "agrave": Rune(0x000E0)
  490. of "aacute": Rune(0x000E1)
  491. of "acirc": Rune(0x000E2)
  492. of "atilde": Rune(0x000E3)
  493. of "auml": Rune(0x000E4)
  494. of "aring": Rune(0x000E5)
  495. of "aelig": Rune(0x000E6)
  496. of "ccedil": Rune(0x000E7)
  497. of "egrave": Rune(0x000E8)
  498. of "eacute": Rune(0x000E9)
  499. of "ecirc": Rune(0x000EA)
  500. of "euml": Rune(0x000EB)
  501. of "igrave": Rune(0x000EC)
  502. of "iacute": Rune(0x000ED)
  503. of "icirc": Rune(0x000EE)
  504. of "iuml": Rune(0x000EF)
  505. of "eth": Rune(0x000F0)
  506. of "ntilde": Rune(0x000F1)
  507. of "ograve": Rune(0x000F2)
  508. of "oacute": Rune(0x000F3)
  509. of "ocirc": Rune(0x000F4)
  510. of "otilde": Rune(0x000F5)
  511. of "ouml": Rune(0x000F6)
  512. of "divide", "div": Rune(0x000F7)
  513. of "oslash": Rune(0x000F8)
  514. of "ugrave": Rune(0x000F9)
  515. of "uacute": Rune(0x000FA)
  516. of "ucirc": Rune(0x000FB)
  517. of "uuml": Rune(0x000FC)
  518. of "yacute": Rune(0x000FD)
  519. of "thorn": Rune(0x000FE)
  520. of "yuml": Rune(0x000FF)
  521. of "Amacr": Rune(0x00100)
  522. of "amacr": Rune(0x00101)
  523. of "Abreve": Rune(0x00102)
  524. of "abreve": Rune(0x00103)
  525. of "Aogon": Rune(0x00104)
  526. of "aogon": Rune(0x00105)
  527. of "Cacute": Rune(0x00106)
  528. of "cacute": Rune(0x00107)
  529. of "Ccirc": Rune(0x00108)
  530. of "ccirc": Rune(0x00109)
  531. of "Cdot": Rune(0x0010A)
  532. of "cdot": Rune(0x0010B)
  533. of "Ccaron": Rune(0x0010C)
  534. of "ccaron": Rune(0x0010D)
  535. of "Dcaron": Rune(0x0010E)
  536. of "dcaron": Rune(0x0010F)
  537. of "Dstrok": Rune(0x00110)
  538. of "dstrok": Rune(0x00111)
  539. of "Emacr": Rune(0x00112)
  540. of "emacr": Rune(0x00113)
  541. of "Edot": Rune(0x00116)
  542. of "edot": Rune(0x00117)
  543. of "Eogon": Rune(0x00118)
  544. of "eogon": Rune(0x00119)
  545. of "Ecaron": Rune(0x0011A)
  546. of "ecaron": Rune(0x0011B)
  547. of "Gcirc": Rune(0x0011C)
  548. of "gcirc": Rune(0x0011D)
  549. of "Gbreve": Rune(0x0011E)
  550. of "gbreve": Rune(0x0011F)
  551. of "Gdot": Rune(0x00120)
  552. of "gdot": Rune(0x00121)
  553. of "Gcedil": Rune(0x00122)
  554. of "Hcirc": Rune(0x00124)
  555. of "hcirc": Rune(0x00125)
  556. of "Hstrok": Rune(0x00126)
  557. of "hstrok": Rune(0x00127)
  558. of "Itilde": Rune(0x00128)
  559. of "itilde": Rune(0x00129)
  560. of "Imacr": Rune(0x0012A)
  561. of "imacr": Rune(0x0012B)
  562. of "Iogon": Rune(0x0012E)
  563. of "iogon": Rune(0x0012F)
  564. of "Idot": Rune(0x00130)
  565. of "imath", "inodot": Rune(0x00131)
  566. of "IJlig": Rune(0x00132)
  567. of "ijlig": Rune(0x00133)
  568. of "Jcirc": Rune(0x00134)
  569. of "jcirc": Rune(0x00135)
  570. of "Kcedil": Rune(0x00136)
  571. of "kcedil": Rune(0x00137)
  572. of "kgreen": Rune(0x00138)
  573. of "Lacute": Rune(0x00139)
  574. of "lacute": Rune(0x0013A)
  575. of "Lcedil": Rune(0x0013B)
  576. of "lcedil": Rune(0x0013C)
  577. of "Lcaron": Rune(0x0013D)
  578. of "lcaron": Rune(0x0013E)
  579. of "Lmidot": Rune(0x0013F)
  580. of "lmidot": Rune(0x00140)
  581. of "Lstrok": Rune(0x00141)
  582. of "lstrok": Rune(0x00142)
  583. of "Nacute": Rune(0x00143)
  584. of "nacute": Rune(0x00144)
  585. of "Ncedil": Rune(0x00145)
  586. of "ncedil": Rune(0x00146)
  587. of "Ncaron": Rune(0x00147)
  588. of "ncaron": Rune(0x00148)
  589. of "napos": Rune(0x00149)
  590. of "ENG": Rune(0x0014A)
  591. of "eng": Rune(0x0014B)
  592. of "Omacr": Rune(0x0014C)
  593. of "omacr": Rune(0x0014D)
  594. of "Odblac": Rune(0x00150)
  595. of "odblac": Rune(0x00151)
  596. of "OElig": Rune(0x00152)
  597. of "oelig": Rune(0x00153)
  598. of "Racute": Rune(0x00154)
  599. of "racute": Rune(0x00155)
  600. of "Rcedil": Rune(0x00156)
  601. of "rcedil": Rune(0x00157)
  602. of "Rcaron": Rune(0x00158)
  603. of "rcaron": Rune(0x00159)
  604. of "Sacute": Rune(0x0015A)
  605. of "sacute": Rune(0x0015B)
  606. of "Scirc": Rune(0x0015C)
  607. of "scirc": Rune(0x0015D)
  608. of "Scedil": Rune(0x0015E)
  609. of "scedil": Rune(0x0015F)
  610. of "Scaron": Rune(0x00160)
  611. of "scaron": Rune(0x00161)
  612. of "Tcedil": Rune(0x00162)
  613. of "tcedil": Rune(0x00163)
  614. of "Tcaron": Rune(0x00164)
  615. of "tcaron": Rune(0x00165)
  616. of "Tstrok": Rune(0x00166)
  617. of "tstrok": Rune(0x00167)
  618. of "Utilde": Rune(0x00168)
  619. of "utilde": Rune(0x00169)
  620. of "Umacr": Rune(0x0016A)
  621. of "umacr": Rune(0x0016B)
  622. of "Ubreve": Rune(0x0016C)
  623. of "ubreve": Rune(0x0016D)
  624. of "Uring": Rune(0x0016E)
  625. of "uring": Rune(0x0016F)
  626. of "Udblac": Rune(0x00170)
  627. of "udblac": Rune(0x00171)
  628. of "Uogon": Rune(0x00172)
  629. of "uogon": Rune(0x00173)
  630. of "Wcirc": Rune(0x00174)
  631. of "wcirc": Rune(0x00175)
  632. of "Ycirc": Rune(0x00176)
  633. of "ycirc": Rune(0x00177)
  634. of "Yuml": Rune(0x00178)
  635. of "Zacute": Rune(0x00179)
  636. of "zacute": Rune(0x0017A)
  637. of "Zdot": Rune(0x0017B)
  638. of "zdot": Rune(0x0017C)
  639. of "Zcaron": Rune(0x0017D)
  640. of "zcaron": Rune(0x0017E)
  641. of "fnof": Rune(0x00192)
  642. of "imped": Rune(0x001B5)
  643. of "gacute": Rune(0x001F5)
  644. of "jmath": Rune(0x00237)
  645. of "circ": Rune(0x002C6)
  646. of "caron", "Hacek": Rune(0x002C7)
  647. of "breve", "Breve": Rune(0x002D8)
  648. of "dot", "DiacriticalDot": Rune(0x002D9)
  649. of "ring": Rune(0x002DA)
  650. of "ogon": Rune(0x002DB)
  651. of "tilde", "DiacriticalTilde": Rune(0x002DC)
  652. of "dblac", "DiacriticalDoubleAcute": Rune(0x002DD)
  653. of "DownBreve": Rune(0x00311)
  654. of "UnderBar": Rune(0x00332)
  655. of "Alpha": Rune(0x00391)
  656. of "Beta": Rune(0x00392)
  657. of "Gamma": Rune(0x00393)
  658. of "Delta": Rune(0x00394)
  659. of "Epsilon": Rune(0x00395)
  660. of "Zeta": Rune(0x00396)
  661. of "Eta": Rune(0x00397)
  662. of "Theta": Rune(0x00398)
  663. of "Iota": Rune(0x00399)
  664. of "Kappa": Rune(0x0039A)
  665. of "Lambda": Rune(0x0039B)
  666. of "Mu": Rune(0x0039C)
  667. of "Nu": Rune(0x0039D)
  668. of "Xi": Rune(0x0039E)
  669. of "Omicron": Rune(0x0039F)
  670. of "Pi": Rune(0x003A0)
  671. of "Rho": Rune(0x003A1)
  672. of "Sigma": Rune(0x003A3)
  673. of "Tau": Rune(0x003A4)
  674. of "Upsilon": Rune(0x003A5)
  675. of "Phi": Rune(0x003A6)
  676. of "Chi": Rune(0x003A7)
  677. of "Psi": Rune(0x003A8)
  678. of "Omega": Rune(0x003A9)
  679. of "alpha": Rune(0x003B1)
  680. of "beta": Rune(0x003B2)
  681. of "gamma": Rune(0x003B3)
  682. of "delta": Rune(0x003B4)
  683. of "epsiv", "varepsilon", "epsilon": Rune(0x003B5)
  684. of "zeta": Rune(0x003B6)
  685. of "eta": Rune(0x003B7)
  686. of "theta": Rune(0x003B8)
  687. of "iota": Rune(0x003B9)
  688. of "kappa": Rune(0x003BA)
  689. of "lambda": Rune(0x003BB)
  690. of "mu": Rune(0x003BC)
  691. of "nu": Rune(0x003BD)
  692. of "xi": Rune(0x003BE)
  693. of "omicron": Rune(0x003BF)
  694. of "pi": Rune(0x003C0)
  695. of "rho": Rune(0x003C1)
  696. of "sigmav", "varsigma", "sigmaf": Rune(0x003C2)
  697. of "sigma": Rune(0x003C3)
  698. of "tau": Rune(0x003C4)
  699. of "upsi", "upsilon": Rune(0x003C5)
  700. of "phi", "phiv", "varphi": Rune(0x003C6)
  701. of "chi": Rune(0x003C7)
  702. of "psi": Rune(0x003C8)
  703. of "omega": Rune(0x003C9)
  704. of "thetav", "vartheta", "thetasym": Rune(0x003D1)
  705. of "Upsi", "upsih": Rune(0x003D2)
  706. of "straightphi": Rune(0x003D5)
  707. of "piv", "varpi": Rune(0x003D6)
  708. of "Gammad": Rune(0x003DC)
  709. of "gammad", "digamma": Rune(0x003DD)
  710. of "kappav", "varkappa": Rune(0x003F0)
  711. of "rhov", "varrho": Rune(0x003F1)
  712. of "epsi", "straightepsilon": Rune(0x003F5)
  713. of "bepsi", "backepsilon": Rune(0x003F6)
  714. of "IOcy": Rune(0x00401)
  715. of "DJcy": Rune(0x00402)
  716. of "GJcy": Rune(0x00403)
  717. of "Jukcy": Rune(0x00404)
  718. of "DScy": Rune(0x00405)
  719. of "Iukcy": Rune(0x00406)
  720. of "YIcy": Rune(0x00407)
  721. of "Jsercy": Rune(0x00408)
  722. of "LJcy": Rune(0x00409)
  723. of "NJcy": Rune(0x0040A)
  724. of "TSHcy": Rune(0x0040B)
  725. of "KJcy": Rune(0x0040C)
  726. of "Ubrcy": Rune(0x0040E)
  727. of "DZcy": Rune(0x0040F)
  728. of "Acy": Rune(0x00410)
  729. of "Bcy": Rune(0x00411)
  730. of "Vcy": Rune(0x00412)
  731. of "Gcy": Rune(0x00413)
  732. of "Dcy": Rune(0x00414)
  733. of "IEcy": Rune(0x00415)
  734. of "ZHcy": Rune(0x00416)
  735. of "Zcy": Rune(0x00417)
  736. of "Icy": Rune(0x00418)
  737. of "Jcy": Rune(0x00419)
  738. of "Kcy": Rune(0x0041A)
  739. of "Lcy": Rune(0x0041B)
  740. of "Mcy": Rune(0x0041C)
  741. of "Ncy": Rune(0x0041D)
  742. of "Ocy": Rune(0x0041E)
  743. of "Pcy": Rune(0x0041F)
  744. of "Rcy": Rune(0x00420)
  745. of "Scy": Rune(0x00421)
  746. of "Tcy": Rune(0x00422)
  747. of "Ucy": Rune(0x00423)
  748. of "Fcy": Rune(0x00424)
  749. of "KHcy": Rune(0x00425)
  750. of "TScy": Rune(0x00426)
  751. of "CHcy": Rune(0x00427)
  752. of "SHcy": Rune(0x00428)
  753. of "SHCHcy": Rune(0x00429)
  754. of "HARDcy": Rune(0x0042A)
  755. of "Ycy": Rune(0x0042B)
  756. of "SOFTcy": Rune(0x0042C)
  757. of "Ecy": Rune(0x0042D)
  758. of "YUcy": Rune(0x0042E)
  759. of "YAcy": Rune(0x0042F)
  760. of "acy": Rune(0x00430)
  761. of "bcy": Rune(0x00431)
  762. of "vcy": Rune(0x00432)
  763. of "gcy": Rune(0x00433)
  764. of "dcy": Rune(0x00434)
  765. of "iecy": Rune(0x00435)
  766. of "zhcy": Rune(0x00436)
  767. of "zcy": Rune(0x00437)
  768. of "icy": Rune(0x00438)
  769. of "jcy": Rune(0x00439)
  770. of "kcy": Rune(0x0043A)
  771. of "lcy": Rune(0x0043B)
  772. of "mcy": Rune(0x0043C)
  773. of "ncy": Rune(0x0043D)
  774. of "ocy": Rune(0x0043E)
  775. of "pcy": Rune(0x0043F)
  776. of "rcy": Rune(0x00440)
  777. of "scy": Rune(0x00441)
  778. of "tcy": Rune(0x00442)
  779. of "ucy": Rune(0x00443)
  780. of "fcy": Rune(0x00444)
  781. of "khcy": Rune(0x00445)
  782. of "tscy": Rune(0x00446)
  783. of "chcy": Rune(0x00447)
  784. of "shcy": Rune(0x00448)
  785. of "shchcy": Rune(0x00449)
  786. of "hardcy": Rune(0x0044A)
  787. of "ycy": Rune(0x0044B)
  788. of "softcy": Rune(0x0044C)
  789. of "ecy": Rune(0x0044D)
  790. of "yucy": Rune(0x0044E)
  791. of "yacy": Rune(0x0044F)
  792. of "iocy": Rune(0x00451)
  793. of "djcy": Rune(0x00452)
  794. of "gjcy": Rune(0x00453)
  795. of "jukcy": Rune(0x00454)
  796. of "dscy": Rune(0x00455)
  797. of "iukcy": Rune(0x00456)
  798. of "yicy": Rune(0x00457)
  799. of "jsercy": Rune(0x00458)
  800. of "ljcy": Rune(0x00459)
  801. of "njcy": Rune(0x0045A)
  802. of "tshcy": Rune(0x0045B)
  803. of "kjcy": Rune(0x0045C)
  804. of "ubrcy": Rune(0x0045E)
  805. of "dzcy": Rune(0x0045F)
  806. of "ensp": Rune(0x02002)
  807. of "emsp": Rune(0x02003)
  808. of "emsp13": Rune(0x02004)
  809. of "emsp14": Rune(0x02005)
  810. of "numsp": Rune(0x02007)
  811. of "puncsp": Rune(0x02008)
  812. of "thinsp", "ThinSpace": Rune(0x02009)
  813. of "hairsp", "VeryThinSpace": Rune(0x0200A)
  814. of "ZeroWidthSpace", "NegativeVeryThinSpace", "NegativeThinSpace",
  815. "NegativeMediumSpace", "NegativeThickSpace": Rune(0x0200B)
  816. of "zwnj": Rune(0x0200C)
  817. of "zwj": Rune(0x0200D)
  818. of "lrm": Rune(0x0200E)
  819. of "rlm": Rune(0x0200F)
  820. of "hyphen", "dash": Rune(0x02010)
  821. of "ndash": Rune(0x02013)
  822. of "mdash": Rune(0x02014)
  823. of "horbar": Rune(0x02015)
  824. of "Verbar", "Vert": Rune(0x02016)
  825. of "lsquo", "OpenCurlyQuote": Rune(0x02018)
  826. of "rsquo", "rsquor", "CloseCurlyQuote": Rune(0x02019)
  827. of "lsquor", "sbquo": Rune(0x0201A)
  828. of "ldquo", "OpenCurlyDoubleQuote": Rune(0x0201C)
  829. of "rdquo", "rdquor", "CloseCurlyDoubleQuote": Rune(0x0201D)
  830. of "ldquor", "bdquo": Rune(0x0201E)
  831. of "dagger": Rune(0x02020)
  832. of "Dagger", "ddagger": Rune(0x02021)
  833. of "bull", "bullet": Rune(0x02022)
  834. of "nldr": Rune(0x02025)
  835. of "hellip", "mldr": Rune(0x02026)
  836. of "permil": Rune(0x02030)
  837. of "pertenk": Rune(0x02031)
  838. of "prime": Rune(0x02032)
  839. of "Prime": Rune(0x02033)
  840. of "tprime": Rune(0x02034)
  841. of "bprime", "backprime": Rune(0x02035)
  842. of "lsaquo": Rune(0x02039)
  843. of "rsaquo": Rune(0x0203A)
  844. of "oline": Rune(0x0203E)
  845. of "caret": Rune(0x02041)
  846. of "hybull": Rune(0x02043)
  847. of "frasl": Rune(0x02044)
  848. of "bsemi": Rune(0x0204F)
  849. of "qprime": Rune(0x02057)
  850. of "MediumSpace": Rune(0x0205F)
  851. of "NoBreak": Rune(0x02060)
  852. of "ApplyFunction", "af": Rune(0x02061)
  853. of "InvisibleTimes", "it": Rune(0x02062)
  854. of "InvisibleComma", "ic": Rune(0x02063)
  855. of "euro": Rune(0x020AC)
  856. of "tdot", "TripleDot": Rune(0x020DB)
  857. of "DotDot": Rune(0x020DC)
  858. of "Copf", "complexes": Rune(0x02102)
  859. of "incare": Rune(0x02105)
  860. of "gscr": Rune(0x0210A)
  861. of "hamilt", "HilbertSpace", "Hscr": Rune(0x0210B)
  862. of "Hfr", "Poincareplane": Rune(0x0210C)
  863. of "quaternions", "Hopf": Rune(0x0210D)
  864. of "planckh": Rune(0x0210E)
  865. of "planck", "hbar", "plankv", "hslash": Rune(0x0210F)
  866. of "Iscr", "imagline": Rune(0x02110)
  867. of "image", "Im", "imagpart", "Ifr": Rune(0x02111)
  868. of "Lscr", "lagran", "Laplacetrf": Rune(0x02112)
  869. of "ell": Rune(0x02113)
  870. of "Nopf", "naturals": Rune(0x02115)
  871. of "numero": Rune(0x02116)
  872. of "copysr": Rune(0x02117)
  873. of "weierp", "wp": Rune(0x02118)
  874. of "Popf", "primes": Rune(0x02119)
  875. of "rationals", "Qopf": Rune(0x0211A)
  876. of "Rscr", "realine": Rune(0x0211B)
  877. of "real", "Re", "realpart", "Rfr": Rune(0x0211C)
  878. of "reals", "Ropf": Rune(0x0211D)
  879. of "rx": Rune(0x0211E)
  880. of "trade", "TRADE": Rune(0x02122)
  881. of "integers", "Zopf": Rune(0x02124)
  882. of "ohm": Rune(0x02126)
  883. of "mho": Rune(0x02127)
  884. of "Zfr", "zeetrf": Rune(0x02128)
  885. of "iiota": Rune(0x02129)
  886. of "angst": Rune(0x0212B)
  887. of "bernou", "Bernoullis", "Bscr": Rune(0x0212C)
  888. of "Cfr", "Cayleys": Rune(0x0212D)
  889. of "escr": Rune(0x0212F)
  890. of "Escr", "expectation": Rune(0x02130)
  891. of "Fscr", "Fouriertrf": Rune(0x02131)
  892. of "phmmat", "Mellintrf", "Mscr": Rune(0x02133)
  893. of "order", "orderof", "oscr": Rune(0x02134)
  894. of "alefsym", "aleph": Rune(0x02135)
  895. of "beth": Rune(0x02136)
  896. of "gimel": Rune(0x02137)
  897. of "daleth": Rune(0x02138)
  898. of "CapitalDifferentialD", "DD": Rune(0x02145)
  899. of "DifferentialD", "dd": Rune(0x02146)
  900. of "ExponentialE", "exponentiale", "ee": Rune(0x02147)
  901. of "ImaginaryI", "ii": Rune(0x02148)
  902. of "frac13": Rune(0x02153)
  903. of "frac23": Rune(0x02154)
  904. of "frac15": Rune(0x02155)
  905. of "frac25": Rune(0x02156)
  906. of "frac35": Rune(0x02157)
  907. of "frac45": Rune(0x02158)
  908. of "frac16": Rune(0x02159)
  909. of "frac56": Rune(0x0215A)
  910. of "frac18": Rune(0x0215B)
  911. of "frac38": Rune(0x0215C)
  912. of "frac58": Rune(0x0215D)
  913. of "frac78": Rune(0x0215E)
  914. of "larr", "leftarrow", "LeftArrow", "slarr",
  915. "ShortLeftArrow": Rune(0x02190)
  916. of "uarr", "uparrow", "UpArrow", "ShortUpArrow": Rune(0x02191)
  917. of "rarr", "rightarrow", "RightArrow", "srarr",
  918. "ShortRightArrow": Rune(0x02192)
  919. of "darr", "downarrow", "DownArrow",
  920. "ShortDownArrow": Rune(0x02193)
  921. of "harr", "leftrightarrow", "LeftRightArrow": Rune(0x02194)
  922. of "varr", "updownarrow", "UpDownArrow": Rune(0x02195)
  923. of "nwarr", "UpperLeftArrow", "nwarrow": Rune(0x02196)
  924. of "nearr", "UpperRightArrow", "nearrow": Rune(0x02197)
  925. of "searr", "searrow", "LowerRightArrow": Rune(0x02198)
  926. of "swarr", "swarrow", "LowerLeftArrow": Rune(0x02199)
  927. of "nlarr", "nleftarrow": Rune(0x0219A)
  928. of "nrarr", "nrightarrow": Rune(0x0219B)
  929. of "rarrw", "rightsquigarrow": Rune(0x0219D)
  930. of "Larr", "twoheadleftarrow": Rune(0x0219E)
  931. of "Uarr": Rune(0x0219F)
  932. of "Rarr", "twoheadrightarrow": Rune(0x021A0)
  933. of "Darr": Rune(0x021A1)
  934. of "larrtl", "leftarrowtail": Rune(0x021A2)
  935. of "rarrtl", "rightarrowtail": Rune(0x021A3)
  936. of "LeftTeeArrow", "mapstoleft": Rune(0x021A4)
  937. of "UpTeeArrow", "mapstoup": Rune(0x021A5)
  938. of "map", "RightTeeArrow", "mapsto": Rune(0x021A6)
  939. of "DownTeeArrow", "mapstodown": Rune(0x021A7)
  940. of "larrhk", "hookleftarrow": Rune(0x021A9)
  941. of "rarrhk", "hookrightarrow": Rune(0x021AA)
  942. of "larrlp", "looparrowleft": Rune(0x021AB)
  943. of "rarrlp", "looparrowright": Rune(0x021AC)
  944. of "harrw", "leftrightsquigarrow": Rune(0x021AD)
  945. of "nharr", "nleftrightarrow": Rune(0x021AE)
  946. of "lsh", "Lsh": Rune(0x021B0)
  947. of "rsh", "Rsh": Rune(0x021B1)
  948. of "ldsh": Rune(0x021B2)
  949. of "rdsh": Rune(0x021B3)
  950. of "crarr": Rune(0x021B5)
  951. of "cularr", "curvearrowleft": Rune(0x021B6)
  952. of "curarr", "curvearrowright": Rune(0x021B7)
  953. of "olarr", "circlearrowleft": Rune(0x021BA)
  954. of "orarr", "circlearrowright": Rune(0x021BB)
  955. of "lharu", "LeftVector", "leftharpoonup": Rune(0x021BC)
  956. of "lhard", "leftharpoondown", "DownLeftVector": Rune(0x021BD)
  957. of "uharr", "upharpoonright", "RightUpVector": Rune(0x021BE)
  958. of "uharl", "upharpoonleft", "LeftUpVector": Rune(0x021BF)
  959. of "rharu", "RightVector", "rightharpoonup": Rune(0x021C0)
  960. of "rhard", "rightharpoondown", "DownRightVector": Rune(0x021C1)
  961. of "dharr", "RightDownVector", "downharpoonright": Rune(0x021C2)
  962. of "dharl", "LeftDownVector", "downharpoonleft": Rune(0x021C3)
  963. of "rlarr", "rightleftarrows", "RightArrowLeftArrow": Rune(0x021C4)
  964. of "udarr", "UpArrowDownArrow": Rune(0x021C5)
  965. of "lrarr", "leftrightarrows", "LeftArrowRightArrow": Rune(0x021C6)
  966. of "llarr", "leftleftarrows": Rune(0x021C7)
  967. of "uuarr", "upuparrows": Rune(0x021C8)
  968. of "rrarr", "rightrightarrows": Rune(0x021C9)
  969. of "ddarr", "downdownarrows": Rune(0x021CA)
  970. of "lrhar", "ReverseEquilibrium",
  971. "leftrightharpoons": Rune(0x021CB)
  972. of "rlhar", "rightleftharpoons", "Equilibrium": Rune(0x021CC)
  973. of "nlArr", "nLeftarrow": Rune(0x021CD)
  974. of "nhArr", "nLeftrightarrow": Rune(0x021CE)
  975. of "nrArr", "nRightarrow": Rune(0x021CF)
  976. of "lArr", "Leftarrow", "DoubleLeftArrow": Rune(0x021D0)
  977. of "uArr", "Uparrow", "DoubleUpArrow": Rune(0x021D1)
  978. of "rArr", "Rightarrow", "Implies",
  979. "DoubleRightArrow": Rune(0x021D2)
  980. of "dArr", "Downarrow", "DoubleDownArrow": Rune(0x021D3)
  981. of "hArr", "Leftrightarrow", "DoubleLeftRightArrow",
  982. "iff": Rune(0x021D4)
  983. of "vArr", "Updownarrow", "DoubleUpDownArrow": Rune(0x021D5)
  984. of "nwArr": Rune(0x021D6)
  985. of "neArr": Rune(0x021D7)
  986. of "seArr": Rune(0x021D8)
  987. of "swArr": Rune(0x021D9)
  988. of "lAarr", "Lleftarrow": Rune(0x021DA)
  989. of "rAarr", "Rrightarrow": Rune(0x021DB)
  990. of "zigrarr": Rune(0x021DD)
  991. of "larrb", "LeftArrowBar": Rune(0x021E4)
  992. of "rarrb", "RightArrowBar": Rune(0x021E5)
  993. of "duarr", "DownArrowUpArrow": Rune(0x021F5)
  994. of "loarr": Rune(0x021FD)
  995. of "roarr": Rune(0x021FE)
  996. of "hoarr": Rune(0x021FF)
  997. of "forall", "ForAll": Rune(0x02200)
  998. of "comp", "complement": Rune(0x02201)
  999. of "part", "PartialD": Rune(0x02202)
  1000. of "exist", "Exists": Rune(0x02203)
  1001. of "nexist", "NotExists", "nexists": Rune(0x02204)
  1002. of "empty", "emptyset", "emptyv", "varnothing": Rune(0x02205)
  1003. of "nabla", "Del": Rune(0x02207)
  1004. of "isin", "isinv", "Element", "in": Rune(0x02208)
  1005. of "notin", "NotElement", "notinva": Rune(0x02209)
  1006. of "niv", "ReverseElement", "ni", "SuchThat": Rune(0x0220B)
  1007. of "notni", "notniva", "NotReverseElement": Rune(0x0220C)
  1008. of "prod", "Product": Rune(0x0220F)
  1009. of "coprod", "Coproduct": Rune(0x02210)
  1010. of "sum", "Sum": Rune(0x02211)
  1011. of "minus": Rune(0x02212)
  1012. of "mnplus", "mp", "MinusPlus": Rune(0x02213)
  1013. of "plusdo", "dotplus": Rune(0x02214)
  1014. of "setmn", "setminus", "Backslash", "ssetmn",
  1015. "smallsetminus": Rune(0x02216)
  1016. of "lowast": Rune(0x02217)
  1017. of "compfn", "SmallCircle": Rune(0x02218)
  1018. of "radic", "Sqrt": Rune(0x0221A)
  1019. of "prop", "propto", "Proportional", "vprop",
  1020. "varpropto": Rune(0x0221D)
  1021. of "infin": Rune(0x0221E)
  1022. of "angrt": Rune(0x0221F)
  1023. of "ang", "angle": Rune(0x02220)
  1024. of "angmsd", "measuredangle": Rune(0x02221)
  1025. of "angsph": Rune(0x02222)
  1026. of "mid", "VerticalBar", "smid", "shortmid": Rune(0x02223)
  1027. of "nmid", "NotVerticalBar", "nsmid", "nshortmid": Rune(0x02224)
  1028. of "par", "parallel", "DoubleVerticalBar", "spar",
  1029. "shortparallel": Rune(0x02225)
  1030. of "npar", "nparallel", "NotDoubleVerticalBar", "nspar",
  1031. "nshortparallel": Rune(0x02226)
  1032. of "and", "wedge": Rune(0x02227)
  1033. of "or", "vee": Rune(0x02228)
  1034. of "cap": Rune(0x02229)
  1035. of "cup": Rune(0x0222A)
  1036. of "int", "Integral": Rune(0x0222B)
  1037. of "Int": Rune(0x0222C)
  1038. of "tint", "iiint": Rune(0x0222D)
  1039. of "conint", "oint", "ContourIntegral": Rune(0x0222E)
  1040. of "Conint", "DoubleContourIntegral": Rune(0x0222F)
  1041. of "Cconint": Rune(0x02230)
  1042. of "cwint": Rune(0x02231)
  1043. of "cwconint", "ClockwiseContourIntegral": Rune(0x02232)
  1044. of "awconint", "CounterClockwiseContourIntegral": Rune(0x02233)
  1045. of "there4", "therefore", "Therefore": Rune(0x02234)
  1046. of "becaus", "because", "Because": Rune(0x02235)
  1047. of "ratio": Rune(0x02236)
  1048. of "Colon", "Proportion": Rune(0x02237)
  1049. of "minusd", "dotminus": Rune(0x02238)
  1050. of "mDDot": Rune(0x0223A)
  1051. of "homtht": Rune(0x0223B)
  1052. of "sim", "Tilde", "thksim", "thicksim": Rune(0x0223C)
  1053. of "bsim", "backsim": Rune(0x0223D)
  1054. of "ac", "mstpos": Rune(0x0223E)
  1055. of "acd": Rune(0x0223F)
  1056. of "wreath", "VerticalTilde", "wr": Rune(0x02240)
  1057. of "nsim", "NotTilde": Rune(0x02241)
  1058. of "esim", "EqualTilde", "eqsim": Rune(0x02242)
  1059. of "sime", "TildeEqual", "simeq": Rune(0x02243)
  1060. of "nsime", "nsimeq", "NotTildeEqual": Rune(0x02244)
  1061. of "cong", "TildeFullEqual": Rune(0x02245)
  1062. of "simne": Rune(0x02246)
  1063. of "ncong", "NotTildeFullEqual": Rune(0x02247)
  1064. of "asymp", "ap", "TildeTilde", "approx", "thkap",
  1065. "thickapprox": Rune(0x02248)
  1066. of "nap", "NotTildeTilde", "napprox": Rune(0x02249)
  1067. of "ape", "approxeq": Rune(0x0224A)
  1068. of "apid": Rune(0x0224B)
  1069. of "bcong", "backcong": Rune(0x0224C)
  1070. of "asympeq", "CupCap": Rune(0x0224D)
  1071. of "bump", "HumpDownHump", "Bumpeq": Rune(0x0224E)
  1072. of "bumpe", "HumpEqual", "bumpeq": Rune(0x0224F)
  1073. of "esdot", "DotEqual", "doteq": Rune(0x02250)
  1074. of "eDot", "doteqdot": Rune(0x02251)
  1075. of "efDot", "fallingdotseq": Rune(0x02252)
  1076. of "erDot", "risingdotseq": Rune(0x02253)
  1077. of "colone", "coloneq", "Assign": Rune(0x02254)
  1078. of "ecolon", "eqcolon": Rune(0x02255)
  1079. of "ecir", "eqcirc": Rune(0x02256)
  1080. of "cire", "circeq": Rune(0x02257)
  1081. of "wedgeq": Rune(0x02259)
  1082. of "veeeq": Rune(0x0225A)
  1083. of "trie", "triangleq": Rune(0x0225C)
  1084. of "equest", "questeq": Rune(0x0225F)
  1085. of "ne", "NotEqual": Rune(0x02260)
  1086. of "equiv", "Congruent": Rune(0x02261)
  1087. of "nequiv", "NotCongruent": Rune(0x02262)
  1088. of "le", "leq": Rune(0x02264)
  1089. of "ge", "GreaterEqual", "geq": Rune(0x02265)
  1090. of "lE", "LessFullEqual", "leqq": Rune(0x02266)
  1091. of "gE", "GreaterFullEqual", "geqq": Rune(0x02267)
  1092. of "lnE", "lneqq": Rune(0x02268)
  1093. of "gnE", "gneqq": Rune(0x02269)
  1094. of "Lt", "NestedLessLess", "ll": Rune(0x0226A)
  1095. of "Gt", "NestedGreaterGreater", "gg": Rune(0x0226B)
  1096. of "twixt", "between": Rune(0x0226C)
  1097. of "NotCupCap": Rune(0x0226D)
  1098. of "nlt", "NotLess", "nless": Rune(0x0226E)
  1099. of "ngt", "NotGreater", "ngtr": Rune(0x0226F)
  1100. of "nle", "NotLessEqual", "nleq": Rune(0x02270)
  1101. of "nge", "NotGreaterEqual", "ngeq": Rune(0x02271)
  1102. of "lsim", "LessTilde", "lesssim": Rune(0x02272)
  1103. of "gsim", "gtrsim", "GreaterTilde": Rune(0x02273)
  1104. of "nlsim", "NotLessTilde": Rune(0x02274)
  1105. of "ngsim", "NotGreaterTilde": Rune(0x02275)
  1106. of "lg", "lessgtr", "LessGreater": Rune(0x02276)
  1107. of "gl", "gtrless", "GreaterLess": Rune(0x02277)
  1108. of "ntlg", "NotLessGreater": Rune(0x02278)
  1109. of "ntgl", "NotGreaterLess": Rune(0x02279)
  1110. of "pr", "Precedes", "prec": Rune(0x0227A)
  1111. of "sc", "Succeeds", "succ": Rune(0x0227B)
  1112. of "prcue", "PrecedesSlantEqual", "preccurlyeq": Rune(0x0227C)
  1113. of "sccue", "SucceedsSlantEqual", "succcurlyeq": Rune(0x0227D)
  1114. of "prsim", "precsim", "PrecedesTilde": Rune(0x0227E)
  1115. of "scsim", "succsim", "SucceedsTilde": Rune(0x0227F)
  1116. of "npr", "nprec", "NotPrecedes": Rune(0x02280)
  1117. of "nsc", "nsucc", "NotSucceeds": Rune(0x02281)
  1118. of "sub", "subset": Rune(0x02282)
  1119. of "sup", "supset", "Superset": Rune(0x02283)
  1120. of "nsub": Rune(0x02284)
  1121. of "nsup": Rune(0x02285)
  1122. of "sube", "SubsetEqual", "subseteq": Rune(0x02286)
  1123. of "supe", "supseteq", "SupersetEqual": Rune(0x02287)
  1124. of "nsube", "nsubseteq", "NotSubsetEqual": Rune(0x02288)
  1125. of "nsupe", "nsupseteq", "NotSupersetEqual": Rune(0x02289)
  1126. of "subne", "subsetneq": Rune(0x0228A)
  1127. of "supne", "supsetneq": Rune(0x0228B)
  1128. of "cupdot": Rune(0x0228D)
  1129. of "uplus", "UnionPlus": Rune(0x0228E)
  1130. of "sqsub", "SquareSubset", "sqsubset": Rune(0x0228F)
  1131. of "sqsup", "SquareSuperset", "sqsupset": Rune(0x02290)
  1132. of "sqsube", "SquareSubsetEqual", "sqsubseteq": Rune(0x02291)
  1133. of "sqsupe", "SquareSupersetEqual", "sqsupseteq": Rune(0x02292)
  1134. of "sqcap", "SquareIntersection": Rune(0x02293)
  1135. of "sqcup", "SquareUnion": Rune(0x02294)
  1136. of "oplus", "CirclePlus": Rune(0x02295)
  1137. of "ominus", "CircleMinus": Rune(0x02296)
  1138. of "otimes", "CircleTimes": Rune(0x02297)
  1139. of "osol": Rune(0x02298)
  1140. of "odot", "CircleDot": Rune(0x02299)
  1141. of "ocir", "circledcirc": Rune(0x0229A)
  1142. of "oast", "circledast": Rune(0x0229B)
  1143. of "odash", "circleddash": Rune(0x0229D)
  1144. of "plusb", "boxplus": Rune(0x0229E)
  1145. of "minusb", "boxminus": Rune(0x0229F)
  1146. of "timesb", "boxtimes": Rune(0x022A0)
  1147. of "sdotb", "dotsquare": Rune(0x022A1)
  1148. of "vdash", "RightTee": Rune(0x022A2)
  1149. of "dashv", "LeftTee": Rune(0x022A3)
  1150. of "top", "DownTee": Rune(0x022A4)
  1151. of "bottom", "bot", "perp", "UpTee": Rune(0x022A5)
  1152. of "models": Rune(0x022A7)
  1153. of "vDash", "DoubleRightTee": Rune(0x022A8)
  1154. of "Vdash": Rune(0x022A9)
  1155. of "Vvdash": Rune(0x022AA)
  1156. of "VDash": Rune(0x022AB)
  1157. of "nvdash": Rune(0x022AC)
  1158. of "nvDash": Rune(0x022AD)
  1159. of "nVdash": Rune(0x022AE)
  1160. of "nVDash": Rune(0x022AF)
  1161. of "prurel": Rune(0x022B0)
  1162. of "vltri", "vartriangleleft", "LeftTriangle": Rune(0x022B2)
  1163. of "vrtri", "vartriangleright", "RightTriangle": Rune(0x022B3)
  1164. of "ltrie", "trianglelefteq", "LeftTriangleEqual": Rune(0x022B4)
  1165. of "rtrie", "trianglerighteq", "RightTriangleEqual": Rune(0x022B5)
  1166. of "origof": Rune(0x022B6)
  1167. of "imof": Rune(0x022B7)
  1168. of "mumap", "multimap": Rune(0x022B8)
  1169. of "hercon": Rune(0x022B9)
  1170. of "intcal", "intercal": Rune(0x022BA)
  1171. of "veebar": Rune(0x022BB)
  1172. of "barvee": Rune(0x022BD)
  1173. of "angrtvb": Rune(0x022BE)
  1174. of "lrtri": Rune(0x022BF)
  1175. of "xwedge", "Wedge", "bigwedge": Rune(0x022C0)
  1176. of "xvee", "Vee", "bigvee": Rune(0x022C1)
  1177. of "xcap", "Intersection", "bigcap": Rune(0x022C2)
  1178. of "xcup", "Union", "bigcup": Rune(0x022C3)
  1179. of "diam", "diamond", "Diamond": Rune(0x022C4)
  1180. of "sdot": Rune(0x022C5)
  1181. of "sstarf", "Star": Rune(0x022C6)
  1182. of "divonx", "divideontimes": Rune(0x022C7)
  1183. of "bowtie": Rune(0x022C8)
  1184. of "ltimes": Rune(0x022C9)
  1185. of "rtimes": Rune(0x022CA)
  1186. of "lthree", "leftthreetimes": Rune(0x022CB)
  1187. of "rthree", "rightthreetimes": Rune(0x022CC)
  1188. of "bsime", "backsimeq": Rune(0x022CD)
  1189. of "cuvee", "curlyvee": Rune(0x022CE)
  1190. of "cuwed", "curlywedge": Rune(0x022CF)
  1191. of "Sub", "Subset": Rune(0x022D0)
  1192. of "Sup", "Supset": Rune(0x022D1)
  1193. of "Cap": Rune(0x022D2)
  1194. of "Cup": Rune(0x022D3)
  1195. of "fork", "pitchfork": Rune(0x022D4)
  1196. of "epar": Rune(0x022D5)
  1197. of "ltdot", "lessdot": Rune(0x022D6)
  1198. of "gtdot", "gtrdot": Rune(0x022D7)
  1199. of "Ll": Rune(0x022D8)
  1200. of "Gg", "ggg": Rune(0x022D9)
  1201. of "leg", "LessEqualGreater", "lesseqgtr": Rune(0x022DA)
  1202. of "gel", "gtreqless", "GreaterEqualLess": Rune(0x022DB)
  1203. of "cuepr", "curlyeqprec": Rune(0x022DE)
  1204. of "cuesc", "curlyeqsucc": Rune(0x022DF)
  1205. of "nprcue", "NotPrecedesSlantEqual": Rune(0x022E0)
  1206. of "nsccue", "NotSucceedsSlantEqual": Rune(0x022E1)
  1207. of "nsqsube", "NotSquareSubsetEqual": Rune(0x022E2)
  1208. of "nsqsupe", "NotSquareSupersetEqual": Rune(0x022E3)
  1209. of "lnsim": Rune(0x022E6)
  1210. of "gnsim": Rune(0x022E7)
  1211. of "prnsim", "precnsim": Rune(0x022E8)
  1212. of "scnsim", "succnsim": Rune(0x022E9)
  1213. of "nltri", "ntriangleleft", "NotLeftTriangle": Rune(0x022EA)
  1214. of "nrtri", "ntriangleright", "NotRightTriangle": Rune(0x022EB)
  1215. of "nltrie", "ntrianglelefteq",
  1216. "NotLeftTriangleEqual": Rune(0x022EC)
  1217. of "nrtrie", "ntrianglerighteq",
  1218. "NotRightTriangleEqual": Rune(0x022ED)
  1219. of "vellip": Rune(0x022EE)
  1220. of "ctdot": Rune(0x022EF)
  1221. of "utdot": Rune(0x022F0)
  1222. of "dtdot": Rune(0x022F1)
  1223. of "disin": Rune(0x022F2)
  1224. of "isinsv": Rune(0x022F3)
  1225. of "isins": Rune(0x022F4)
  1226. of "isindot": Rune(0x022F5)
  1227. of "notinvc": Rune(0x022F6)
  1228. of "notinvb": Rune(0x022F7)
  1229. of "isinE": Rune(0x022F9)
  1230. of "nisd": Rune(0x022FA)
  1231. of "xnis": Rune(0x022FB)
  1232. of "nis": Rune(0x022FC)
  1233. of "notnivc": Rune(0x022FD)
  1234. of "notnivb": Rune(0x022FE)
  1235. of "barwed", "barwedge": Rune(0x02305)
  1236. of "Barwed", "doublebarwedge": Rune(0x02306)
  1237. of "lceil", "LeftCeiling": Rune(0x02308)
  1238. of "rceil", "RightCeiling": Rune(0x02309)
  1239. of "lfloor", "LeftFloor": Rune(0x0230A)
  1240. of "rfloor", "RightFloor": Rune(0x0230B)
  1241. of "drcrop": Rune(0x0230C)
  1242. of "dlcrop": Rune(0x0230D)
  1243. of "urcrop": Rune(0x0230E)
  1244. of "ulcrop": Rune(0x0230F)
  1245. of "bnot": Rune(0x02310)
  1246. of "profline": Rune(0x02312)
  1247. of "profsurf": Rune(0x02313)
  1248. of "telrec": Rune(0x02315)
  1249. of "target": Rune(0x02316)
  1250. of "ulcorn", "ulcorner": Rune(0x0231C)
  1251. of "urcorn", "urcorner": Rune(0x0231D)
  1252. of "dlcorn", "llcorner": Rune(0x0231E)
  1253. of "drcorn", "lrcorner": Rune(0x0231F)
  1254. of "frown", "sfrown": Rune(0x02322)
  1255. of "smile", "ssmile": Rune(0x02323)
  1256. of "cylcty": Rune(0x0232D)
  1257. of "profalar": Rune(0x0232E)
  1258. of "topbot": Rune(0x02336)
  1259. of "ovbar": Rune(0x0233D)
  1260. of "solbar": Rune(0x0233F)
  1261. of "angzarr": Rune(0x0237C)
  1262. of "lmoust", "lmoustache": Rune(0x023B0)
  1263. of "rmoust", "rmoustache": Rune(0x023B1)
  1264. of "tbrk", "OverBracket": Rune(0x023B4)
  1265. of "bbrk", "UnderBracket": Rune(0x023B5)
  1266. of "bbrktbrk": Rune(0x023B6)
  1267. of "OverParenthesis": Rune(0x023DC)
  1268. of "UnderParenthesis": Rune(0x023DD)
  1269. of "OverBrace": Rune(0x023DE)
  1270. of "UnderBrace": Rune(0x023DF)
  1271. of "trpezium": Rune(0x023E2)
  1272. of "elinters": Rune(0x023E7)
  1273. of "blank": Rune(0x02423)
  1274. of "oS", "circledS": Rune(0x024C8)
  1275. of "boxh", "HorizontalLine": Rune(0x02500)
  1276. of "boxv": Rune(0x02502)
  1277. of "boxdr": Rune(0x0250C)
  1278. of "boxdl": Rune(0x02510)
  1279. of "boxur": Rune(0x02514)
  1280. of "boxul": Rune(0x02518)
  1281. of "boxvr": Rune(0x0251C)
  1282. of "boxvl": Rune(0x02524)
  1283. of "boxhd": Rune(0x0252C)
  1284. of "boxhu": Rune(0x02534)
  1285. of "boxvh": Rune(0x0253C)
  1286. of "boxH": Rune(0x02550)
  1287. of "boxV": Rune(0x02551)
  1288. of "boxdR": Rune(0x02552)
  1289. of "boxDr": Rune(0x02553)
  1290. of "boxDR": Rune(0x02554)
  1291. of "boxdL": Rune(0x02555)
  1292. of "boxDl": Rune(0x02556)
  1293. of "boxDL": Rune(0x02557)
  1294. of "boxuR": Rune(0x02558)
  1295. of "boxUr": Rune(0x02559)
  1296. of "boxUR": Rune(0x0255A)
  1297. of "boxuL": Rune(0x0255B)
  1298. of "boxUl": Rune(0x0255C)
  1299. of "boxUL": Rune(0x0255D)
  1300. of "boxvR": Rune(0x0255E)
  1301. of "boxVr": Rune(0x0255F)
  1302. of "boxVR": Rune(0x02560)
  1303. of "boxvL": Rune(0x02561)
  1304. of "boxVl": Rune(0x02562)
  1305. of "boxVL": Rune(0x02563)
  1306. of "boxHd": Rune(0x02564)
  1307. of "boxhD": Rune(0x02565)
  1308. of "boxHD": Rune(0x02566)
  1309. of "boxHu": Rune(0x02567)
  1310. of "boxhU": Rune(0x02568)
  1311. of "boxHU": Rune(0x02569)
  1312. of "boxvH": Rune(0x0256A)
  1313. of "boxVh": Rune(0x0256B)
  1314. of "boxVH": Rune(0x0256C)
  1315. of "uhblk": Rune(0x02580)
  1316. of "lhblk": Rune(0x02584)
  1317. of "block": Rune(0x02588)
  1318. of "blk14": Rune(0x02591)
  1319. of "blk12": Rune(0x02592)
  1320. of "blk34": Rune(0x02593)
  1321. of "squ", "square", "Square": Rune(0x025A1)
  1322. of "squf", "squarf", "blacksquare",
  1323. "FilledVerySmallSquare": Rune(0x025AA)
  1324. of "EmptyVerySmallSquare": Rune(0x025AB)
  1325. of "rect": Rune(0x025AD)
  1326. of "marker": Rune(0x025AE)
  1327. of "fltns": Rune(0x025B1)
  1328. of "xutri", "bigtriangleup": Rune(0x025B3)
  1329. of "utrif", "blacktriangle": Rune(0x025B4)
  1330. of "utri", "triangle": Rune(0x025B5)
  1331. of "rtrif", "blacktriangleright": Rune(0x025B8)
  1332. of "rtri", "triangleright": Rune(0x025B9)
  1333. of "xdtri", "bigtriangledown": Rune(0x025BD)
  1334. of "dtrif", "blacktriangledown": Rune(0x025BE)
  1335. of "dtri", "triangledown": Rune(0x025BF)
  1336. of "ltrif", "blacktriangleleft": Rune(0x025C2)
  1337. of "ltri", "triangleleft": Rune(0x025C3)
  1338. of "loz", "lozenge": Rune(0x025CA)
  1339. of "cir": Rune(0x025CB)
  1340. of "tridot": Rune(0x025EC)
  1341. of "xcirc", "bigcirc": Rune(0x025EF)
  1342. of "ultri": Rune(0x025F8)
  1343. of "urtri": Rune(0x025F9)
  1344. of "lltri": Rune(0x025FA)
  1345. of "EmptySmallSquare": Rune(0x025FB)
  1346. of "FilledSmallSquare": Rune(0x025FC)
  1347. of "starf", "bigstar": Rune(0x02605)
  1348. of "star": Rune(0x02606)
  1349. of "phone": Rune(0x0260E)
  1350. of "female": Rune(0x02640)
  1351. of "male": Rune(0x02642)
  1352. of "spades", "spadesuit": Rune(0x02660)
  1353. of "clubs", "clubsuit": Rune(0x02663)
  1354. of "hearts", "heartsuit": Rune(0x02665)
  1355. of "diams", "diamondsuit": Rune(0x02666)
  1356. of "sung": Rune(0x0266A)
  1357. of "flat": Rune(0x0266D)
  1358. of "natur", "natural": Rune(0x0266E)
  1359. of "sharp": Rune(0x0266F)
  1360. of "check", "checkmark": Rune(0x02713)
  1361. of "cross": Rune(0x02717)
  1362. of "malt", "maltese": Rune(0x02720)
  1363. of "sext": Rune(0x02736)
  1364. of "VerticalSeparator": Rune(0x02758)
  1365. of "lbbrk": Rune(0x02772)
  1366. of "rbbrk": Rune(0x02773)
  1367. of "lobrk", "LeftDoubleBracket": Rune(0x027E6)
  1368. of "robrk", "RightDoubleBracket": Rune(0x027E7)
  1369. of "lang", "LeftAngleBracket", "langle": Rune(0x027E8)
  1370. of "rang", "RightAngleBracket", "rangle": Rune(0x027E9)
  1371. of "Lang": Rune(0x027EA)
  1372. of "Rang": Rune(0x027EB)
  1373. of "loang": Rune(0x027EC)
  1374. of "roang": Rune(0x027ED)
  1375. of "xlarr", "longleftarrow", "LongLeftArrow": Rune(0x027F5)
  1376. of "xrarr", "longrightarrow", "LongRightArrow": Rune(0x027F6)
  1377. of "xharr", "longleftrightarrow",
  1378. "LongLeftRightArrow": Rune(0x027F7)
  1379. of "xlArr", "Longleftarrow", "DoubleLongLeftArrow": Rune(0x027F8)
  1380. of "xrArr", "Longrightarrow", "DoubleLongRightArrow": Rune(0x027F9)
  1381. of "xhArr", "Longleftrightarrow",
  1382. "DoubleLongLeftRightArrow": Rune(0x027FA)
  1383. of "xmap", "longmapsto": Rune(0x027FC)
  1384. of "dzigrarr": Rune(0x027FF)
  1385. of "nvlArr": Rune(0x02902)
  1386. of "nvrArr": Rune(0x02903)
  1387. of "nvHarr": Rune(0x02904)
  1388. of "Map": Rune(0x02905)
  1389. of "lbarr": Rune(0x0290C)
  1390. of "rbarr", "bkarow": Rune(0x0290D)
  1391. of "lBarr": Rune(0x0290E)
  1392. of "rBarr", "dbkarow": Rune(0x0290F)
  1393. of "RBarr", "drbkarow": Rune(0x02910)
  1394. of "DDotrahd": Rune(0x02911)
  1395. of "UpArrowBar": Rune(0x02912)
  1396. of "DownArrowBar": Rune(0x02913)
  1397. of "Rarrtl": Rune(0x02916)
  1398. of "latail": Rune(0x02919)
  1399. of "ratail": Rune(0x0291A)
  1400. of "lAtail": Rune(0x0291B)
  1401. of "rAtail": Rune(0x0291C)
  1402. of "larrfs": Rune(0x0291D)
  1403. of "rarrfs": Rune(0x0291E)
  1404. of "larrbfs": Rune(0x0291F)
  1405. of "rarrbfs": Rune(0x02920)
  1406. of "nwarhk": Rune(0x02923)
  1407. of "nearhk": Rune(0x02924)
  1408. of "searhk", "hksearow": Rune(0x02925)
  1409. of "swarhk", "hkswarow": Rune(0x02926)
  1410. of "nwnear": Rune(0x02927)
  1411. of "nesear", "toea": Rune(0x02928)
  1412. of "seswar", "tosa": Rune(0x02929)
  1413. of "swnwar": Rune(0x0292A)
  1414. of "rarrc": Rune(0x02933)
  1415. of "cudarrr": Rune(0x02935)
  1416. of "ldca": Rune(0x02936)
  1417. of "rdca": Rune(0x02937)
  1418. of "cudarrl": Rune(0x02938)
  1419. of "larrpl": Rune(0x02939)
  1420. of "curarrm": Rune(0x0293C)
  1421. of "cularrp": Rune(0x0293D)
  1422. of "rarrpl": Rune(0x02945)
  1423. of "harrcir": Rune(0x02948)
  1424. of "Uarrocir": Rune(0x02949)
  1425. of "lurdshar": Rune(0x0294A)
  1426. of "ldrushar": Rune(0x0294B)
  1427. of "LeftRightVector": Rune(0x0294E)
  1428. of "RightUpDownVector": Rune(0x0294F)
  1429. of "DownLeftRightVector": Rune(0x02950)
  1430. of "LeftUpDownVector": Rune(0x02951)
  1431. of "LeftVectorBar": Rune(0x02952)
  1432. of "RightVectorBar": Rune(0x02953)
  1433. of "RightUpVectorBar": Rune(0x02954)
  1434. of "RightDownVectorBar": Rune(0x02955)
  1435. of "DownLeftVectorBar": Rune(0x02956)
  1436. of "DownRightVectorBar": Rune(0x02957)
  1437. of "LeftUpVectorBar": Rune(0x02958)
  1438. of "LeftDownVectorBar": Rune(0x02959)
  1439. of "LeftTeeVector": Rune(0x0295A)
  1440. of "RightTeeVector": Rune(0x0295B)
  1441. of "RightUpTeeVector": Rune(0x0295C)
  1442. of "RightDownTeeVector": Rune(0x0295D)
  1443. of "DownLeftTeeVector": Rune(0x0295E)
  1444. of "DownRightTeeVector": Rune(0x0295F)
  1445. of "LeftUpTeeVector": Rune(0x02960)
  1446. of "LeftDownTeeVector": Rune(0x02961)
  1447. of "lHar": Rune(0x02962)
  1448. of "uHar": Rune(0x02963)
  1449. of "rHar": Rune(0x02964)
  1450. of "dHar": Rune(0x02965)
  1451. of "luruhar": Rune(0x02966)
  1452. of "ldrdhar": Rune(0x02967)
  1453. of "ruluhar": Rune(0x02968)
  1454. of "rdldhar": Rune(0x02969)
  1455. of "lharul": Rune(0x0296A)
  1456. of "llhard": Rune(0x0296B)
  1457. of "rharul": Rune(0x0296C)
  1458. of "lrhard": Rune(0x0296D)
  1459. of "udhar", "UpEquilibrium": Rune(0x0296E)
  1460. of "duhar", "ReverseUpEquilibrium": Rune(0x0296F)
  1461. of "RoundImplies": Rune(0x02970)
  1462. of "erarr": Rune(0x02971)
  1463. of "simrarr": Rune(0x02972)
  1464. of "larrsim": Rune(0x02973)
  1465. of "rarrsim": Rune(0x02974)
  1466. of "rarrap": Rune(0x02975)
  1467. of "ltlarr": Rune(0x02976)
  1468. of "gtrarr": Rune(0x02978)
  1469. of "subrarr": Rune(0x02979)
  1470. of "suplarr": Rune(0x0297B)
  1471. of "lfisht": Rune(0x0297C)
  1472. of "rfisht": Rune(0x0297D)
  1473. of "ufisht": Rune(0x0297E)
  1474. of "dfisht": Rune(0x0297F)
  1475. of "lopar": Rune(0x02985)
  1476. of "ropar": Rune(0x02986)
  1477. of "lbrke": Rune(0x0298B)
  1478. of "rbrke": Rune(0x0298C)
  1479. of "lbrkslu": Rune(0x0298D)
  1480. of "rbrksld": Rune(0x0298E)
  1481. of "lbrksld": Rune(0x0298F)
  1482. of "rbrkslu": Rune(0x02990)
  1483. of "langd": Rune(0x02991)
  1484. of "rangd": Rune(0x02992)
  1485. of "lparlt": Rune(0x02993)
  1486. of "rpargt": Rune(0x02994)
  1487. of "gtlPar": Rune(0x02995)
  1488. of "ltrPar": Rune(0x02996)
  1489. of "vzigzag": Rune(0x0299A)
  1490. of "vangrt": Rune(0x0299C)
  1491. of "angrtvbd": Rune(0x0299D)
  1492. of "ange": Rune(0x029A4)
  1493. of "range": Rune(0x029A5)
  1494. of "dwangle": Rune(0x029A6)
  1495. of "uwangle": Rune(0x029A7)
  1496. of "angmsdaa": Rune(0x029A8)
  1497. of "angmsdab": Rune(0x029A9)
  1498. of "angmsdac": Rune(0x029AA)
  1499. of "angmsdad": Rune(0x029AB)
  1500. of "angmsdae": Rune(0x029AC)
  1501. of "angmsdaf": Rune(0x029AD)
  1502. of "angmsdag": Rune(0x029AE)
  1503. of "angmsdah": Rune(0x029AF)
  1504. of "bemptyv": Rune(0x029B0)
  1505. of "demptyv": Rune(0x029B1)
  1506. of "cemptyv": Rune(0x029B2)
  1507. of "raemptyv": Rune(0x029B3)
  1508. of "laemptyv": Rune(0x029B4)
  1509. of "ohbar": Rune(0x029B5)
  1510. of "omid": Rune(0x029B6)
  1511. of "opar": Rune(0x029B7)
  1512. of "operp": Rune(0x029B9)
  1513. of "olcross": Rune(0x029BB)
  1514. of "odsold": Rune(0x029BC)
  1515. of "olcir": Rune(0x029BE)
  1516. of "ofcir": Rune(0x029BF)
  1517. of "olt": Rune(0x029C0)
  1518. of "ogt": Rune(0x029C1)
  1519. of "cirscir": Rune(0x029C2)
  1520. of "cirE": Rune(0x029C3)
  1521. of "solb": Rune(0x029C4)
  1522. of "bsolb": Rune(0x029C5)
  1523. of "boxbox": Rune(0x029C9)
  1524. of "trisb": Rune(0x029CD)
  1525. of "rtriltri": Rune(0x029CE)
  1526. of "LeftTriangleBar": Rune(0x029CF)
  1527. of "RightTriangleBar": Rune(0x029D0)
  1528. of "race": Rune(0x029DA)
  1529. of "iinfin": Rune(0x029DC)
  1530. of "infintie": Rune(0x029DD)
  1531. of "nvinfin": Rune(0x029DE)
  1532. of "eparsl": Rune(0x029E3)
  1533. of "smeparsl": Rune(0x029E4)
  1534. of "eqvparsl": Rune(0x029E5)
  1535. of "lozf", "blacklozenge": Rune(0x029EB)
  1536. of "RuleDelayed": Rune(0x029F4)
  1537. of "dsol": Rune(0x029F6)
  1538. of "xodot", "bigodot": Rune(0x02A00)
  1539. of "xoplus", "bigoplus": Rune(0x02A01)
  1540. of "xotime", "bigotimes": Rune(0x02A02)
  1541. of "xuplus", "biguplus": Rune(0x02A04)
  1542. of "xsqcup", "bigsqcup": Rune(0x02A06)
  1543. of "qint", "iiiint": Rune(0x02A0C)
  1544. of "fpartint": Rune(0x02A0D)
  1545. of "cirfnint": Rune(0x02A10)
  1546. of "awint": Rune(0x02A11)
  1547. of "rppolint": Rune(0x02A12)
  1548. of "scpolint": Rune(0x02A13)
  1549. of "npolint": Rune(0x02A14)
  1550. of "pointint": Rune(0x02A15)
  1551. of "quatint": Rune(0x02A16)
  1552. of "intlarhk": Rune(0x02A17)
  1553. of "pluscir": Rune(0x02A22)
  1554. of "plusacir": Rune(0x02A23)
  1555. of "simplus": Rune(0x02A24)
  1556. of "plusdu": Rune(0x02A25)
  1557. of "plussim": Rune(0x02A26)
  1558. of "plustwo": Rune(0x02A27)
  1559. of "mcomma": Rune(0x02A29)
  1560. of "minusdu": Rune(0x02A2A)
  1561. of "loplus": Rune(0x02A2D)
  1562. of "roplus": Rune(0x02A2E)
  1563. of "Cross": Rune(0x02A2F)
  1564. of "timesd": Rune(0x02A30)
  1565. of "timesbar": Rune(0x02A31)
  1566. of "smashp": Rune(0x02A33)
  1567. of "lotimes": Rune(0x02A34)
  1568. of "rotimes": Rune(0x02A35)
  1569. of "otimesas": Rune(0x02A36)
  1570. of "Otimes": Rune(0x02A37)
  1571. of "odiv": Rune(0x02A38)
  1572. of "triplus": Rune(0x02A39)
  1573. of "triminus": Rune(0x02A3A)
  1574. of "tritime": Rune(0x02A3B)
  1575. of "iprod", "intprod": Rune(0x02A3C)
  1576. of "amalg": Rune(0x02A3F)
  1577. of "capdot": Rune(0x02A40)
  1578. of "ncup": Rune(0x02A42)
  1579. of "ncap": Rune(0x02A43)
  1580. of "capand": Rune(0x02A44)
  1581. of "cupor": Rune(0x02A45)
  1582. of "cupcap": Rune(0x02A46)
  1583. of "capcup": Rune(0x02A47)
  1584. of "cupbrcap": Rune(0x02A48)
  1585. of "capbrcup": Rune(0x02A49)
  1586. of "cupcup": Rune(0x02A4A)
  1587. of "capcap": Rune(0x02A4B)
  1588. of "ccups": Rune(0x02A4C)
  1589. of "ccaps": Rune(0x02A4D)
  1590. of "ccupssm": Rune(0x02A50)
  1591. of "And": Rune(0x02A53)
  1592. of "Or": Rune(0x02A54)
  1593. of "andand": Rune(0x02A55)
  1594. of "oror": Rune(0x02A56)
  1595. of "orslope": Rune(0x02A57)
  1596. of "andslope": Rune(0x02A58)
  1597. of "andv": Rune(0x02A5A)
  1598. of "orv": Rune(0x02A5B)
  1599. of "andd": Rune(0x02A5C)
  1600. of "ord": Rune(0x02A5D)
  1601. of "wedbar": Rune(0x02A5F)
  1602. of "sdote": Rune(0x02A66)
  1603. of "simdot": Rune(0x02A6A)
  1604. of "congdot": Rune(0x02A6D)
  1605. of "easter": Rune(0x02A6E)
  1606. of "apacir": Rune(0x02A6F)
  1607. of "apE": Rune(0x02A70)
  1608. of "eplus": Rune(0x02A71)
  1609. of "pluse": Rune(0x02A72)
  1610. of "Esim": Rune(0x02A73)
  1611. of "Colone": Rune(0x02A74)
  1612. of "Equal": Rune(0x02A75)
  1613. of "eDDot", "ddotseq": Rune(0x02A77)
  1614. of "equivDD": Rune(0x02A78)
  1615. of "ltcir": Rune(0x02A79)
  1616. of "gtcir": Rune(0x02A7A)
  1617. of "ltquest": Rune(0x02A7B)
  1618. of "gtquest": Rune(0x02A7C)
  1619. of "les", "LessSlantEqual", "leqslant": Rune(0x02A7D)
  1620. of "ges", "GreaterSlantEqual", "geqslant": Rune(0x02A7E)
  1621. of "lesdot": Rune(0x02A7F)
  1622. of "gesdot": Rune(0x02A80)
  1623. of "lesdoto": Rune(0x02A81)
  1624. of "gesdoto": Rune(0x02A82)
  1625. of "lesdotor": Rune(0x02A83)
  1626. of "gesdotol": Rune(0x02A84)
  1627. of "lap", "lessapprox": Rune(0x02A85)
  1628. of "gap", "gtrapprox": Rune(0x02A86)
  1629. of "lne", "lneq": Rune(0x02A87)
  1630. of "gne", "gneq": Rune(0x02A88)
  1631. of "lnap", "lnapprox": Rune(0x02A89)
  1632. of "gnap", "gnapprox": Rune(0x02A8A)
  1633. of "lEg", "lesseqqgtr": Rune(0x02A8B)
  1634. of "gEl", "gtreqqless": Rune(0x02A8C)
  1635. of "lsime": Rune(0x02A8D)
  1636. of "gsime": Rune(0x02A8E)
  1637. of "lsimg": Rune(0x02A8F)
  1638. of "gsiml": Rune(0x02A90)
  1639. of "lgE": Rune(0x02A91)
  1640. of "glE": Rune(0x02A92)
  1641. of "lesges": Rune(0x02A93)
  1642. of "gesles": Rune(0x02A94)
  1643. of "els", "eqslantless": Rune(0x02A95)
  1644. of "egs", "eqslantgtr": Rune(0x02A96)
  1645. of "elsdot": Rune(0x02A97)
  1646. of "egsdot": Rune(0x02A98)
  1647. of "el": Rune(0x02A99)
  1648. of "eg": Rune(0x02A9A)
  1649. of "siml": Rune(0x02A9D)
  1650. of "simg": Rune(0x02A9E)
  1651. of "simlE": Rune(0x02A9F)
  1652. of "simgE": Rune(0x02AA0)
  1653. of "LessLess": Rune(0x02AA1)
  1654. of "GreaterGreater": Rune(0x02AA2)
  1655. of "glj": Rune(0x02AA4)
  1656. of "gla": Rune(0x02AA5)
  1657. of "ltcc": Rune(0x02AA6)
  1658. of "gtcc": Rune(0x02AA7)
  1659. of "lescc": Rune(0x02AA8)
  1660. of "gescc": Rune(0x02AA9)
  1661. of "smt": Rune(0x02AAA)
  1662. of "lat": Rune(0x02AAB)
  1663. of "smte": Rune(0x02AAC)
  1664. of "late": Rune(0x02AAD)
  1665. of "bumpE": Rune(0x02AAE)
  1666. of "pre", "preceq", "PrecedesEqual": Rune(0x02AAF)
  1667. of "sce", "succeq", "SucceedsEqual": Rune(0x02AB0)
  1668. of "prE": Rune(0x02AB3)
  1669. of "scE": Rune(0x02AB4)
  1670. of "prnE", "precneqq": Rune(0x02AB5)
  1671. of "scnE", "succneqq": Rune(0x02AB6)
  1672. of "prap", "precapprox": Rune(0x02AB7)
  1673. of "scap", "succapprox": Rune(0x02AB8)
  1674. of "prnap", "precnapprox": Rune(0x02AB9)
  1675. of "scnap", "succnapprox": Rune(0x02ABA)
  1676. of "Pr": Rune(0x02ABB)
  1677. of "Sc": Rune(0x02ABC)
  1678. of "subdot": Rune(0x02ABD)
  1679. of "supdot": Rune(0x02ABE)
  1680. of "subplus": Rune(0x02ABF)
  1681. of "supplus": Rune(0x02AC0)
  1682. of "submult": Rune(0x02AC1)
  1683. of "supmult": Rune(0x02AC2)
  1684. of "subedot": Rune(0x02AC3)
  1685. of "supedot": Rune(0x02AC4)
  1686. of "subE", "subseteqq": Rune(0x02AC5)
  1687. of "supE", "supseteqq": Rune(0x02AC6)
  1688. of "subsim": Rune(0x02AC7)
  1689. of "supsim": Rune(0x02AC8)
  1690. of "subnE", "subsetneqq": Rune(0x02ACB)
  1691. of "supnE", "supsetneqq": Rune(0x02ACC)
  1692. of "csub": Rune(0x02ACF)
  1693. of "csup": Rune(0x02AD0)
  1694. of "csube": Rune(0x02AD1)
  1695. of "csupe": Rune(0x02AD2)
  1696. of "subsup": Rune(0x02AD3)
  1697. of "supsub": Rune(0x02AD4)
  1698. of "subsub": Rune(0x02AD5)
  1699. of "supsup": Rune(0x02AD6)
  1700. of "suphsub": Rune(0x02AD7)
  1701. of "supdsub": Rune(0x02AD8)
  1702. of "forkv": Rune(0x02AD9)
  1703. of "topfork": Rune(0x02ADA)
  1704. of "mlcp": Rune(0x02ADB)
  1705. of "Dashv", "DoubleLeftTee": Rune(0x02AE4)
  1706. of "Vdashl": Rune(0x02AE6)
  1707. of "Barv": Rune(0x02AE7)
  1708. of "vBar": Rune(0x02AE8)
  1709. of "vBarv": Rune(0x02AE9)
  1710. of "Vbar": Rune(0x02AEB)
  1711. of "Not": Rune(0x02AEC)
  1712. of "bNot": Rune(0x02AED)
  1713. of "rnmid": Rune(0x02AEE)
  1714. of "cirmid": Rune(0x02AEF)
  1715. of "midcir": Rune(0x02AF0)
  1716. of "topcir": Rune(0x02AF1)
  1717. of "nhpar": Rune(0x02AF2)
  1718. of "parsim": Rune(0x02AF3)
  1719. of "parsl": Rune(0x02AFD)
  1720. of "fflig": Rune(0x0FB00)
  1721. of "filig": Rune(0x0FB01)
  1722. of "fllig": Rune(0x0FB02)
  1723. of "ffilig": Rune(0x0FB03)
  1724. of "ffllig": Rune(0x0FB04)
  1725. of "Ascr": Rune(0x1D49C)
  1726. of "Cscr": Rune(0x1D49E)
  1727. of "Dscr": Rune(0x1D49F)
  1728. of "Gscr": Rune(0x1D4A2)
  1729. of "Jscr": Rune(0x1D4A5)
  1730. of "Kscr": Rune(0x1D4A6)
  1731. of "Nscr": Rune(0x1D4A9)
  1732. of "Oscr": Rune(0x1D4AA)
  1733. of "Pscr": Rune(0x1D4AB)
  1734. of "Qscr": Rune(0x1D4AC)
  1735. of "Sscr": Rune(0x1D4AE)
  1736. of "Tscr": Rune(0x1D4AF)
  1737. of "Uscr": Rune(0x1D4B0)
  1738. of "Vscr": Rune(0x1D4B1)
  1739. of "Wscr": Rune(0x1D4B2)
  1740. of "Xscr": Rune(0x1D4B3)
  1741. of "Yscr": Rune(0x1D4B4)
  1742. of "Zscr": Rune(0x1D4B5)
  1743. of "ascr": Rune(0x1D4B6)
  1744. of "bscr": Rune(0x1D4B7)
  1745. of "cscr": Rune(0x1D4B8)
  1746. of "dscr": Rune(0x1D4B9)
  1747. of "fscr": Rune(0x1D4BB)
  1748. of "hscr": Rune(0x1D4BD)
  1749. of "iscr": Rune(0x1D4BE)
  1750. of "jscr": Rune(0x1D4BF)
  1751. of "kscr": Rune(0x1D4C0)
  1752. of "lscr": Rune(0x1D4C1)
  1753. of "mscr": Rune(0x1D4C2)
  1754. of "nscr": Rune(0x1D4C3)
  1755. of "pscr": Rune(0x1D4C5)
  1756. of "qscr": Rune(0x1D4C6)
  1757. of "rscr": Rune(0x1D4C7)
  1758. of "sscr": Rune(0x1D4C8)
  1759. of "tscr": Rune(0x1D4C9)
  1760. of "uscr": Rune(0x1D4CA)
  1761. of "vscr": Rune(0x1D4CB)
  1762. of "wscr": Rune(0x1D4CC)
  1763. of "xscr": Rune(0x1D4CD)
  1764. of "yscr": Rune(0x1D4CE)
  1765. of "zscr": Rune(0x1D4CF)
  1766. of "Afr": Rune(0x1D504)
  1767. of "Bfr": Rune(0x1D505)
  1768. of "Dfr": Rune(0x1D507)
  1769. of "Efr": Rune(0x1D508)
  1770. of "Ffr": Rune(0x1D509)
  1771. of "Gfr": Rune(0x1D50A)
  1772. of "Jfr": Rune(0x1D50D)
  1773. of "Kfr": Rune(0x1D50E)
  1774. of "Lfr": Rune(0x1D50F)
  1775. of "Mfr": Rune(0x1D510)
  1776. of "Nfr": Rune(0x1D511)
  1777. of "Ofr": Rune(0x1D512)
  1778. of "Pfr": Rune(0x1D513)
  1779. of "Qfr": Rune(0x1D514)
  1780. of "Sfr": Rune(0x1D516)
  1781. of "Tfr": Rune(0x1D517)
  1782. of "Ufr": Rune(0x1D518)
  1783. of "Vfr": Rune(0x1D519)
  1784. of "Wfr": Rune(0x1D51A)
  1785. of "Xfr": Rune(0x1D51B)
  1786. of "Yfr": Rune(0x1D51C)
  1787. of "afr": Rune(0x1D51E)
  1788. of "bfr": Rune(0x1D51F)
  1789. of "cfr": Rune(0x1D520)
  1790. of "dfr": Rune(0x1D521)
  1791. of "efr": Rune(0x1D522)
  1792. of "ffr": Rune(0x1D523)
  1793. of "gfr": Rune(0x1D524)
  1794. of "hfr": Rune(0x1D525)
  1795. of "ifr": Rune(0x1D526)
  1796. of "jfr": Rune(0x1D527)
  1797. of "kfr": Rune(0x1D528)
  1798. of "lfr": Rune(0x1D529)
  1799. of "mfr": Rune(0x1D52A)
  1800. of "nfr": Rune(0x1D52B)
  1801. of "ofr": Rune(0x1D52C)
  1802. of "pfr": Rune(0x1D52D)
  1803. of "qfr": Rune(0x1D52E)
  1804. of "rfr": Rune(0x1D52F)
  1805. of "sfr": Rune(0x1D530)
  1806. of "tfr": Rune(0x1D531)
  1807. of "ufr": Rune(0x1D532)
  1808. of "vfr": Rune(0x1D533)
  1809. of "wfr": Rune(0x1D534)
  1810. of "xfr": Rune(0x1D535)
  1811. of "yfr": Rune(0x1D536)
  1812. of "zfr": Rune(0x1D537)
  1813. of "Aopf": Rune(0x1D538)
  1814. of "Bopf": Rune(0x1D539)
  1815. of "Dopf": Rune(0x1D53B)
  1816. of "Eopf": Rune(0x1D53C)
  1817. of "Fopf": Rune(0x1D53D)
  1818. of "Gopf": Rune(0x1D53E)
  1819. of "Iopf": Rune(0x1D540)
  1820. of "Jopf": Rune(0x1D541)
  1821. of "Kopf": Rune(0x1D542)
  1822. of "Lopf": Rune(0x1D543)
  1823. of "Mopf": Rune(0x1D544)
  1824. of "Oopf": Rune(0x1D546)
  1825. of "Sopf": Rune(0x1D54A)
  1826. of "Topf": Rune(0x1D54B)
  1827. of "Uopf": Rune(0x1D54C)
  1828. of "Vopf": Rune(0x1D54D)
  1829. of "Wopf": Rune(0x1D54E)
  1830. of "Xopf": Rune(0x1D54F)
  1831. of "Yopf": Rune(0x1D550)
  1832. of "aopf": Rune(0x1D552)
  1833. of "bopf": Rune(0x1D553)
  1834. of "copf": Rune(0x1D554)
  1835. of "dopf": Rune(0x1D555)
  1836. of "eopf": Rune(0x1D556)
  1837. of "fopf": Rune(0x1D557)
  1838. of "gopf": Rune(0x1D558)
  1839. of "hopf": Rune(0x1D559)
  1840. of "iopf": Rune(0x1D55A)
  1841. of "jopf": Rune(0x1D55B)
  1842. of "kopf": Rune(0x1D55C)
  1843. of "lopf": Rune(0x1D55D)
  1844. of "mopf": Rune(0x1D55E)
  1845. of "nopf": Rune(0x1D55F)
  1846. of "oopf": Rune(0x1D560)
  1847. of "popf": Rune(0x1D561)
  1848. of "qopf": Rune(0x1D562)
  1849. of "ropf": Rune(0x1D563)
  1850. of "sopf": Rune(0x1D564)
  1851. of "topf": Rune(0x1D565)
  1852. of "uopf": Rune(0x1D566)
  1853. of "vopf": Rune(0x1D567)
  1854. of "wopf": Rune(0x1D568)
  1855. of "xopf": Rune(0x1D569)
  1856. of "yopf": Rune(0x1D56A)
  1857. of "zopf": Rune(0x1D56B)
  1858. else: Rune(0)
  1859. proc entityToUtf8*(entity: string): string =
  1860. ## Converts an HTML entity name like `&Uuml;` or values like `&#220;`
  1861. ## or `&#x000DC;` to its UTF-8 equivalent.
  1862. ## "" is returned if the entity name is unknown. The HTML parser
  1863. ## already converts entities to UTF-8.
  1864. runnableExamples:
  1865. const sigma = "Σ"
  1866. doAssert entityToUtf8("") == ""
  1867. doAssert entityToUtf8("a") == ""
  1868. doAssert entityToUtf8("gt") == ">"
  1869. doAssert entityToUtf8("Uuml") == "Ü"
  1870. doAssert entityToUtf8("quest") == "?"
  1871. doAssert entityToUtf8("#63") == "?"
  1872. doAssert entityToUtf8("Sigma") == sigma
  1873. doAssert entityToUtf8("#931") == sigma
  1874. doAssert entityToUtf8("#0931") == sigma
  1875. doAssert entityToUtf8("#x3A3") == sigma
  1876. doAssert entityToUtf8("#x03A3") == sigma
  1877. doAssert entityToUtf8("#x3a3") == sigma
  1878. doAssert entityToUtf8("#X3a3") == sigma
  1879. let rune = entityToRune(entity)
  1880. if rune.ord <= 0: result = ""
  1881. else: result = toUTF8(rune)
  1882. proc addNode(father, son: XmlNode) =
  1883. if son != nil: add(father, son)
  1884. proc parse(x: var XmlParser, errors: var seq[string]): XmlNode {.gcsafe.}
  1885. proc expected(x: var XmlParser, n: XmlNode): string =
  1886. result = errorMsg(x, "</" & n.tag & "> expected")
  1887. template elemName(x: untyped): untyped = rawData(x)
  1888. template adderr(x: untyped) =
  1889. errors.add(x)
  1890. proc untilElementEnd(x: var XmlParser, result: XmlNode,
  1891. errors: var seq[string]) =
  1892. # we parsed e.g. `<br>` and don't really expect a `</br>`:
  1893. if result.htmlTag in SingleTags:
  1894. if x.kind != xmlElementEnd or cmpIgnoreCase(x.elemName, result.tag) != 0:
  1895. return
  1896. while true:
  1897. case x.kind
  1898. of xmlElementStart, xmlElementOpen:
  1899. case result.htmlTag
  1900. of tagP, tagInput, tagOption:
  1901. # some tags are common to have no `</end>`, like `<li>` but
  1902. # allow `<p>` in `<dd>`, `<dt>` and `<li>` in next case
  1903. if htmlTag(x.elemName) in {tagLi, tagP, tagDt, tagDd, tagInput,
  1904. tagOption}:
  1905. adderr(expected(x, result))
  1906. break
  1907. of tagDd, tagDt, tagLi:
  1908. if htmlTag(x.elemName) in {tagLi, tagDt, tagDd, tagInput,
  1909. tagOption}:
  1910. adderr(expected(x, result))
  1911. break
  1912. of tagTd, tagTh:
  1913. if htmlTag(x.elemName) in {tagTr, tagTd, tagTh, tagTfoot, tagThead}:
  1914. adderr(expected(x, result))
  1915. break
  1916. of tagTr:
  1917. if htmlTag(x.elemName) == tagTr:
  1918. adderr(expected(x, result))
  1919. break
  1920. of tagOptgroup:
  1921. if htmlTag(x.elemName) in {tagOption, tagOptgroup}:
  1922. adderr(expected(x, result))
  1923. break
  1924. else: discard
  1925. result.addNode(parse(x, errors))
  1926. of xmlElementEnd:
  1927. if cmpIgnoreCase(x.elemName, result.tag) != 0:
  1928. #echo "5; expected: ", result.htmltag, " ", x.elemName
  1929. adderr(expected(x, result))
  1930. # this seems to do better match error corrections in browsers:
  1931. while x.kind in {xmlElementEnd, xmlWhitespace}:
  1932. if x.kind == xmlElementEnd and cmpIgnoreCase(x.elemName,
  1933. result.tag) == 0:
  1934. break
  1935. next(x)
  1936. next(x)
  1937. break
  1938. of xmlEof:
  1939. adderr(expected(x, result))
  1940. break
  1941. else:
  1942. result.addNode(parse(x, errors))
  1943. proc parse(x: var XmlParser, errors: var seq[string]): XmlNode =
  1944. case x.kind
  1945. of xmlComment:
  1946. result = newComment(x.rawData)
  1947. next(x)
  1948. of xmlCharData, xmlWhitespace:
  1949. result = newText(x.rawData)
  1950. next(x)
  1951. of xmlPI, xmlSpecial:
  1952. # we just ignore processing instructions for now
  1953. next(x)
  1954. of xmlError:
  1955. adderr(errorMsg(x))
  1956. next(x)
  1957. of xmlElementStart:
  1958. result = newElement(toLowerAscii(x.elemName))
  1959. next(x)
  1960. untilElementEnd(x, result, errors)
  1961. of xmlElementEnd:
  1962. adderr(errorMsg(x, "unexpected ending tag: " & x.elemName))
  1963. of xmlElementOpen:
  1964. result = newElement(toLowerAscii(x.elemName))
  1965. next(x)
  1966. result.attrs = newStringTable()
  1967. while true:
  1968. case x.kind
  1969. of xmlAttribute:
  1970. result.attrs[x.rawData] = x.rawData2
  1971. next(x)
  1972. of xmlElementClose:
  1973. next(x)
  1974. break
  1975. of xmlError:
  1976. adderr(errorMsg(x))
  1977. next(x)
  1978. break
  1979. else:
  1980. adderr(errorMsg(x, "'>' expected"))
  1981. next(x)
  1982. break
  1983. untilElementEnd(x, result, errors)
  1984. of xmlAttribute, xmlElementClose:
  1985. adderr(errorMsg(x, "<some_tag> expected"))
  1986. next(x)
  1987. of xmlCData:
  1988. result = newCData(x.rawData)
  1989. next(x)
  1990. of xmlEntity:
  1991. var u = entityToUtf8(x.rawData)
  1992. if u.len != 0: result = newText(u)
  1993. next(x)
  1994. of xmlEof: discard
  1995. proc parseHtml*(s: Stream, filename: string,
  1996. errors: var seq[string]): XmlNode =
  1997. ## Parses the XML from stream `s` and returns a `XmlNode`. Every
  1998. ## occurred parsing error is added to the `errors` sequence.
  1999. var x: XmlParser
  2000. open(x, s, filename, {reportComments, reportWhitespace, allowUnquotedAttribs,
  2001. allowEmptyAttribs})
  2002. next(x)
  2003. # skip the DOCTYPE:
  2004. if x.kind == xmlSpecial: next(x)
  2005. result = newElement("document")
  2006. result.addNode(parse(x, errors))
  2007. #if x.kind != xmlEof:
  2008. # adderr(errorMsg(x, "EOF expected"))
  2009. while x.kind != xmlEof:
  2010. var oldPos = x.bufpos # little hack to see if we made any progress
  2011. result.addNode(parse(x, errors))
  2012. if x.bufpos == oldPos:
  2013. # force progress!
  2014. next(x)
  2015. close(x)
  2016. if result.len == 1:
  2017. result = result[0]
  2018. proc parseHtml*(s: Stream): XmlNode =
  2019. ## Parses the HTML from stream `s` and returns a `XmlNode`. All parsing
  2020. ## errors are ignored.
  2021. var errors: seq[string] = @[]
  2022. result = parseHtml(s, "unknown_html_doc", errors)
  2023. proc parseHtml*(html: string): XmlNode =
  2024. ## Parses the HTML from string `html` and returns a `XmlNode`. All parsing
  2025. ## errors are ignored.
  2026. parseHtml(newStringStream(html))
  2027. proc loadHtml*(path: string, errors: var seq[string]): XmlNode =
  2028. ## Loads and parses HTML from file specified by `path`, and returns
  2029. ## a `XmlNode`. Every occurred parsing error is added to
  2030. ## the `errors` sequence.
  2031. var s = newFileStream(path, fmRead)
  2032. if s == nil: raise newException(IOError, "Unable to read file: " & path)
  2033. result = parseHtml(s, path, errors)
  2034. proc loadHtml*(path: string): XmlNode =
  2035. ## Loads and parses HTML from file specified by `path`, and returns
  2036. ## a `XmlNode`. All parsing errors are ignored.
  2037. var errors: seq[string] = @[]
  2038. result = loadHtml(path, errors)
  2039. when not defined(testing) and isMainModule:
  2040. import os
  2041. var errors: seq[string] = @[]
  2042. var x = loadHtml(paramStr(1), errors)
  2043. for e in items(errors): echo e
  2044. var f: File
  2045. if open(f, "test.txt", fmWrite):
  2046. f.write($x)
  2047. f.close()
  2048. else:
  2049. quit("cannot write test.txt")