HTML.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853
  1. var Utils = require("../Utils.js");
  2. /**
  3. * HTML operations.
  4. *
  5. * @author n1474335 [n1474335@gmail.com]
  6. * @copyright Crown Copyright 2016
  7. * @license Apache-2.0
  8. *
  9. * @namespace
  10. */
  11. var HTML = module.exports = {
  12. /**
  13. * @constant
  14. * @default
  15. */
  16. CONVERT_ALL: false,
  17. /**
  18. * @constant
  19. * @default
  20. */
  21. CONVERT_OPTIONS: ["Named entities where possible", "Numeric entities", "Hex entities"],
  22. /**
  23. * To HTML Entity operation.
  24. *
  25. * @param {string} input
  26. * @param {Object[]} args
  27. * @returns {string}
  28. */
  29. runToEntity: function(input, args) {
  30. var convertAll = args[0],
  31. numeric = args[1] === "Numeric entities",
  32. hexa = args[1] === "Hex entities";
  33. var charcodes = Utils.strToCharcode(input);
  34. var output = "";
  35. for (var i = 0; i < charcodes.length; i++) {
  36. if (convertAll && numeric) {
  37. output += "&#" + charcodes[i] + ";";
  38. } else if (convertAll && hexa) {
  39. output += "&#x" + Utils.hex(charcodes[i]) + ";";
  40. } else if (convertAll) {
  41. output += HTML._byteToEntity[charcodes[i]] || "&#" + charcodes[i] + ";";
  42. } else if (numeric) {
  43. if (charcodes[i] > 255 || HTML._byteToEntity.hasOwnProperty(charcodes[i])) {
  44. output += "&#" + charcodes[i] + ";";
  45. } else {
  46. output += Utils.chr(charcodes[i]);
  47. }
  48. } else if (hexa) {
  49. if (charcodes[i] > 255 || HTML._byteToEntity.hasOwnProperty(charcodes[i])) {
  50. output += "&#x" + Utils.hex(charcodes[i]) + ";";
  51. } else {
  52. output += Utils.chr(charcodes[i]);
  53. }
  54. } else {
  55. output += HTML._byteToEntity[charcodes[i]] || (
  56. charcodes[i] > 255 ?
  57. "&#" + charcodes[i] + ";" :
  58. Utils.chr(charcodes[i])
  59. );
  60. }
  61. }
  62. return output;
  63. },
  64. /**
  65. * From HTML Entity operation.
  66. *
  67. * @param {string} input
  68. * @param {Object[]} args
  69. * @returns {string}
  70. */
  71. runFromEntity: function(input, args) {
  72. var regex = /&(#?x?[a-zA-Z0-9]{1,8});/g,
  73. output = "",
  74. m,
  75. i = 0;
  76. while ((m = regex.exec(input))) {
  77. // Add up to match
  78. for (; i < m.index;)
  79. output += input[i++];
  80. // Add match
  81. var bite = HTML._entityToByte[m[1]];
  82. if (bite) {
  83. output += Utils.chr(bite);
  84. } else if (!bite && m[1][0] === "#" && m[1].length > 1 && /^#\d{1,5}$/.test(m[1])) {
  85. // Numeric entity (e.g. &#10;)
  86. var num = m[1].slice(1, m[1].length);
  87. output += Utils.chr(parseInt(num, 10));
  88. } else if (!bite && m[1][0] === "#" && m[1].length > 3 && /^#x[\dA-F]{2,8}$/i.test(m[1])) {
  89. // Hex entity (e.g. &#x3A;)
  90. var hex = m[1].slice(2, m[1].length);
  91. output += Utils.chr(parseInt(hex, 16));
  92. } else {
  93. // Not a valid entity, print as normal
  94. for (; i < regex.lastIndex;)
  95. output += input[i++];
  96. }
  97. i = regex.lastIndex;
  98. }
  99. // Add all after final match
  100. for (; i < input.length;)
  101. output += input[i++];
  102. return output;
  103. },
  104. /**
  105. * @constant
  106. * @default
  107. */
  108. REMOVE_INDENTATION: true,
  109. /**
  110. * @constant
  111. * @default
  112. */
  113. REMOVE_LINE_BREAKS: true,
  114. /**
  115. * Strip HTML tags operation.
  116. *
  117. * @param {string} input
  118. * @param {Object[]} args
  119. * @returns {string}
  120. */
  121. runStripTags: function(input, args) {
  122. var removeIndentation = args[0],
  123. removeLineBreaks = args[1];
  124. input = Utils.stripHtmlTags(input);
  125. if (removeIndentation) {
  126. input = input.replace(/\n[ \f\t]+/g, "\n");
  127. }
  128. if (removeLineBreaks) {
  129. input = input.replace(/^\s*\n/, "") // first line
  130. .replace(/(\n\s*){2,}/g, "\n"); // all others
  131. }
  132. return input;
  133. },
  134. /**
  135. * Parse colour code operation.
  136. *
  137. * @param {string} input
  138. * @param {Object[]} args
  139. * @returns {html}
  140. */
  141. runParseColourCode: function(input, args) {
  142. var m = null,
  143. r = 0, g = 0, b = 0, a = 1;
  144. // Read in the input
  145. if ((m = input.match(/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/i))) {
  146. // Hex - #d9edf7
  147. r = parseInt(m[1], 16);
  148. g = parseInt(m[2], 16);
  149. b = parseInt(m[3], 16);
  150. } else if ((m = input.match(/rgba?\((\d{1,3}(?:\.\d+)?),\s?(\d{1,3}(?:\.\d+)?),\s?(\d{1,3}(?:\.\d+)?)(?:,\s?(\d(?:\.\d+)?))?\)/i))) {
  151. // RGB or RGBA - rgb(217,237,247) or rgba(217,237,247,1)
  152. r = parseFloat(m[1]);
  153. g = parseFloat(m[2]);
  154. b = parseFloat(m[3]);
  155. a = m[4] ? parseFloat(m[4]) : 1;
  156. } else if ((m = input.match(/hsla?\((\d{1,3}(?:\.\d+)?),\s?(\d{1,3}(?:\.\d+)?)%,\s?(\d{1,3}(?:\.\d+)?)%(?:,\s?(\d(?:\.\d+)?))?\)/i))) {
  157. // HSL or HSLA - hsl(200, 65%, 91%) or hsla(200, 65%, 91%, 1)
  158. var h_ = parseFloat(m[1]) / 360,
  159. s_ = parseFloat(m[2]) / 100,
  160. l_ = parseFloat(m[3]) / 100,
  161. rgb_ = HTML._hslToRgb(h_, s_, l_);
  162. r = rgb_[0];
  163. g = rgb_[1];
  164. b = rgb_[2];
  165. a = m[4] ? parseFloat(m[4]) : 1;
  166. } else if ((m = input.match(/cmyk\((\d(?:\.\d+)?),\s?(\d(?:\.\d+)?),\s?(\d(?:\.\d+)?),\s?(\d(?:\.\d+)?)\)/i))) {
  167. // CMYK - cmyk(0.12, 0.04, 0.00, 0.03)
  168. var c_ = parseFloat(m[1]),
  169. m_ = parseFloat(m[2]),
  170. y_ = parseFloat(m[3]),
  171. k_ = parseFloat(m[4]);
  172. r = Math.round(255 * (1 - c_) * (1 - k_));
  173. g = Math.round(255 * (1 - m_) * (1 - k_));
  174. b = Math.round(255 * (1 - y_) * (1 - k_));
  175. }
  176. var hsl_ = HTML._rgbToHsl(r, g, b),
  177. h = Math.round(hsl_[0] * 360),
  178. s = Math.round(hsl_[1] * 100),
  179. l = Math.round(hsl_[2] * 100),
  180. k = 1 - Math.max(r/255, g/255, b/255),
  181. c = (1 - r/255 - k) / (1 - k),
  182. m = (1 - g/255 - k) / (1 - k), // eslint-disable-line no-redeclare
  183. y = (1 - b/255 - k) / (1 - k);
  184. c = isNaN(c) ? "0" : c.toFixed(2);
  185. m = isNaN(m) ? "0" : m.toFixed(2);
  186. y = isNaN(y) ? "0" : y.toFixed(2);
  187. k = k.toFixed(2);
  188. var hex = "#" +
  189. Utils.padLeft(Math.round(r).toString(16), 2) +
  190. Utils.padLeft(Math.round(g).toString(16), 2) +
  191. Utils.padLeft(Math.round(b).toString(16), 2),
  192. rgb = "rgb(" + r + ", " + g + ", " + b + ")",
  193. rgba = "rgba(" + r + ", " + g + ", " + b + ", " + a + ")",
  194. hsl = "hsl(" + h + ", " + s + "%, " + l + "%)",
  195. hsla = "hsla(" + h + ", " + s + "%, " + l + "%, " + a + ")",
  196. cmyk = "cmyk(" + c + ", " + m + ", " + y + ", " + k + ")";
  197. // Generate output
  198. return "<div id='colorpicker' style='display: inline-block'></div>" +
  199. "Hex: " + hex + "\n" +
  200. "RGB: " + rgb + "\n" +
  201. "RGBA: " + rgba + "\n" +
  202. "HSL: " + hsl + "\n" +
  203. "HSLA: " + hsla + "\n" +
  204. "CMYK: " + cmyk +
  205. "<script>\
  206. $('#colorpicker').colorpicker({\
  207. format: 'rgba',\
  208. color: '" + rgba + "',\
  209. container: true,\
  210. inline: true,\
  211. }).on('changeColor', function(e) {\
  212. var color = e.color.toRGB();\
  213. document.getElementById('input-text').value = 'rgba(' +\
  214. color.r + ', ' + color.g + ', ' + color.b + ', ' + color.a + ')';\
  215. window.app.autoBake();\
  216. });\
  217. </script>";
  218. },
  219. /**
  220. * Converts an HSL color value to RGB. Conversion formula
  221. * adapted from http://en.wikipedia.org/wiki/HSL_colorSpace.
  222. * Assumes h, s, and l are contained in the set [0, 1] and
  223. * returns r, g, and b in the set [0, 255].
  224. *
  225. * @private
  226. * @author Mohsen (http://stackoverflow.com/a/9493060)
  227. *
  228. * @param {number} h - The hue
  229. * @param {number} s - The saturation
  230. * @param {number} l - The lightness
  231. * @return {Array} The RGB representation
  232. */
  233. _hslToRgb: function(h, s, l){
  234. var r, g, b;
  235. if (s === 0){
  236. r = g = b = l; // achromatic
  237. } else {
  238. var hue2rgb = function hue2rgb(p, q, t) {
  239. if (t < 0) t += 1;
  240. if (t > 1) t -= 1;
  241. if (t < 1/6) return p + (q - p) * 6 * t;
  242. if (t < 1/2) return q;
  243. if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
  244. return p;
  245. };
  246. var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
  247. var p = 2 * l - q;
  248. r = hue2rgb(p, q, h + 1/3);
  249. g = hue2rgb(p, q, h);
  250. b = hue2rgb(p, q, h - 1/3);
  251. }
  252. return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
  253. },
  254. /**
  255. * Converts an RGB color value to HSL. Conversion formula
  256. * adapted from http://en.wikipedia.org/wiki/HSL_colorSpace.
  257. * Assumes r, g, and b are contained in the set [0, 255] and
  258. * returns h, s, and l in the set [0, 1].
  259. *
  260. * @private
  261. * @author Mohsen (http://stackoverflow.com/a/9493060)
  262. *
  263. * @param {number} r - The red color value
  264. * @param {number} g - The green color value
  265. * @param {number} b - The blue color value
  266. * @return {Array} The HSL representation
  267. */
  268. _rgbToHsl: function(r, g, b) {
  269. r /= 255; g /= 255; b /= 255;
  270. var max = Math.max(r, g, b),
  271. min = Math.min(r, g, b),
  272. h, s, l = (max + min) / 2;
  273. if (max === min) {
  274. h = s = 0; // achromatic
  275. } else {
  276. var d = max - min;
  277. s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
  278. switch (max) {
  279. case r: h = (g - b) / d + (g < b ? 6 : 0); break;
  280. case g: h = (b - r) / d + 2; break;
  281. case b: h = (r - g) / d + 4; break;
  282. }
  283. h /= 6;
  284. }
  285. return [h, s, l];
  286. },
  287. /**
  288. * Lookup table to translate byte values to their HTML entity codes.
  289. *
  290. * @private
  291. * @constant
  292. */
  293. _byteToEntity: {
  294. 34 : "&quot;",
  295. 38 : "&amp;",
  296. 39 : "&apos;",
  297. 60 : "&lt;",
  298. 62 : "&gt;",
  299. 160 : "&nbsp;",
  300. 161 : "&iexcl;",
  301. 162 : "&cent;",
  302. 163 : "&pound;",
  303. 164 : "&curren;",
  304. 165 : "&yen;",
  305. 166 : "&brvbar;",
  306. 167 : "&sect;",
  307. 168 : "&uml;",
  308. 169 : "&copy;",
  309. 170 : "&ordf;",
  310. 171 : "&laquo;",
  311. 172 : "&not;",
  312. 173 : "&shy;",
  313. 174 : "&reg;",
  314. 175 : "&macr;",
  315. 176 : "&deg;",
  316. 177 : "&plusmn;",
  317. 178 : "&sup2;",
  318. 179 : "&sup3;",
  319. 180 : "&acute;",
  320. 181 : "&micro;",
  321. 182 : "&para;",
  322. 183 : "&middot;",
  323. 184 : "&cedil;",
  324. 185 : "&sup1;",
  325. 186 : "&ordm;",
  326. 187 : "&raquo;",
  327. 188 : "&frac14;",
  328. 189 : "&frac12;",
  329. 190 : "&frac34;",
  330. 191 : "&iquest;",
  331. 192 : "&Agrave;",
  332. 193 : "&Aacute;",
  333. 194 : "&Acirc;",
  334. 195 : "&Atilde;",
  335. 196 : "&Auml;",
  336. 197 : "&Aring;",
  337. 198 : "&AElig;",
  338. 199 : "&Ccedil;",
  339. 200 : "&Egrave;",
  340. 201 : "&Eacute;",
  341. 202 : "&Ecirc;",
  342. 203 : "&Euml;",
  343. 204 : "&Igrave;",
  344. 205 : "&Iacute;",
  345. 206 : "&Icirc;",
  346. 207 : "&Iuml;",
  347. 208 : "&ETH;",
  348. 209 : "&Ntilde;",
  349. 210 : "&Ograve;",
  350. 211 : "&Oacute;",
  351. 212 : "&Ocirc;",
  352. 213 : "&Otilde;",
  353. 214 : "&Ouml;",
  354. 215 : "&times;",
  355. 216 : "&Oslash;",
  356. 217 : "&Ugrave;",
  357. 218 : "&Uacute;",
  358. 219 : "&Ucirc;",
  359. 220 : "&Uuml;",
  360. 221 : "&Yacute;",
  361. 222 : "&THORN;",
  362. 223 : "&szlig;",
  363. 224 : "&agrave;",
  364. 225 : "&aacute;",
  365. 226 : "&acirc;",
  366. 227 : "&atilde;",
  367. 228 : "&auml;",
  368. 229 : "&aring;",
  369. 230 : "&aelig;",
  370. 231 : "&ccedil;",
  371. 232 : "&egrave;",
  372. 233 : "&eacute;",
  373. 234 : "&ecirc;",
  374. 235 : "&euml;",
  375. 236 : "&igrave;",
  376. 237 : "&iacute;",
  377. 238 : "&icirc;",
  378. 239 : "&iuml;",
  379. 240 : "&eth;",
  380. 241 : "&ntilde;",
  381. 242 : "&ograve;",
  382. 243 : "&oacute;",
  383. 244 : "&ocirc;",
  384. 245 : "&otilde;",
  385. 246 : "&ouml;",
  386. 247 : "&divide;",
  387. 248 : "&oslash;",
  388. 249 : "&ugrave;",
  389. 250 : "&uacute;",
  390. 251 : "&ucirc;",
  391. 252 : "&uuml;",
  392. 253 : "&yacute;",
  393. 254 : "&thorn;",
  394. 255 : "&yuml;",
  395. 338 : "&OElig;",
  396. 339 : "&oelig;",
  397. 352 : "&Scaron;",
  398. 353 : "&scaron;",
  399. 376 : "&Yuml;",
  400. 402 : "&fnof;",
  401. 710 : "&circ;",
  402. 732 : "&tilde;",
  403. 913 : "&Alpha;",
  404. 914 : "&Beta;",
  405. 915 : "&Gamma;",
  406. 916 : "&Delta;",
  407. 917 : "&Epsilon;",
  408. 918 : "&Zeta;",
  409. 919 : "&Eta;",
  410. 920 : "&Theta;",
  411. 921 : "&Iota;",
  412. 922 : "&Kappa;",
  413. 923 : "&Lambda;",
  414. 924 : "&Mu;",
  415. 925 : "&Nu;",
  416. 926 : "&Xi;",
  417. 927 : "&Omicron;",
  418. 928 : "&Pi;",
  419. 929 : "&Rho;",
  420. 931 : "&Sigma;",
  421. 932 : "&Tau;",
  422. 933 : "&Upsilon;",
  423. 934 : "&Phi;",
  424. 935 : "&Chi;",
  425. 936 : "&Psi;",
  426. 937 : "&Omega;",
  427. 945 : "&alpha;",
  428. 946 : "&beta;",
  429. 947 : "&gamma;",
  430. 948 : "&delta;",
  431. 949 : "&epsilon;",
  432. 950 : "&zeta;",
  433. 951 : "&eta;",
  434. 952 : "&theta;",
  435. 953 : "&iota;",
  436. 954 : "&kappa;",
  437. 955 : "&lambda;",
  438. 956 : "&mu;",
  439. 957 : "&nu;",
  440. 958 : "&xi;",
  441. 959 : "&omicron;",
  442. 960 : "&pi;",
  443. 961 : "&rho;",
  444. 962 : "&sigmaf;",
  445. 963 : "&sigma;",
  446. 964 : "&tau;",
  447. 965 : "&upsilon;",
  448. 966 : "&phi;",
  449. 967 : "&chi;",
  450. 968 : "&psi;",
  451. 969 : "&omega;",
  452. 977 : "&thetasym;",
  453. 978 : "&upsih;",
  454. 982 : "&piv;",
  455. 8194 : "&ensp;",
  456. 8195 : "&emsp;",
  457. 8201 : "&thinsp;",
  458. 8204 : "&zwnj;",
  459. 8205 : "&zwj;",
  460. 8206 : "&lrm;",
  461. 8207 : "&rlm;",
  462. 8211 : "&ndash;",
  463. 8212 : "&mdash;",
  464. 8216 : "&lsquo;",
  465. 8217 : "&rsquo;",
  466. 8218 : "&sbquo;",
  467. 8220 : "&ldquo;",
  468. 8221 : "&rdquo;",
  469. 8222 : "&bdquo;",
  470. 8224 : "&dagger;",
  471. 8225 : "&Dagger;",
  472. 8226 : "&bull;",
  473. 8230 : "&hellip;",
  474. 8240 : "&permil;",
  475. 8242 : "&prime;",
  476. 8243 : "&Prime;",
  477. 8249 : "&lsaquo;",
  478. 8250 : "&rsaquo;",
  479. 8254 : "&oline;",
  480. 8260 : "&frasl;",
  481. 8364 : "&euro;",
  482. 8465 : "&image;",
  483. 8472 : "&weierp;",
  484. 8476 : "&real;",
  485. 8482 : "&trade;",
  486. 8501 : "&alefsym;",
  487. 8592 : "&larr;",
  488. 8593 : "&uarr;",
  489. 8594 : "&rarr;",
  490. 8595 : "&darr;",
  491. 8596 : "&harr;",
  492. 8629 : "&crarr;",
  493. 8656 : "&lArr;",
  494. 8657 : "&uArr;",
  495. 8658 : "&rArr;",
  496. 8659 : "&dArr;",
  497. 8660 : "&hArr;",
  498. 8704 : "&forall;",
  499. 8706 : "&part;",
  500. 8707 : "&exist;",
  501. 8709 : "&empty;",
  502. 8711 : "&nabla;",
  503. 8712 : "&isin;",
  504. 8713 : "&notin;",
  505. 8715 : "&ni;",
  506. 8719 : "&prod;",
  507. 8721 : "&sum;",
  508. 8722 : "&minus;",
  509. 8727 : "&lowast;",
  510. 8730 : "&radic;",
  511. 8733 : "&prop;",
  512. 8734 : "&infin;",
  513. 8736 : "&ang;",
  514. 8743 : "&and;",
  515. 8744 : "&or;",
  516. 8745 : "&cap;",
  517. 8746 : "&cup;",
  518. 8747 : "&int;",
  519. 8756 : "&there4;",
  520. 8764 : "&sim;",
  521. 8773 : "&cong;",
  522. 8776 : "&asymp;",
  523. 8800 : "&ne;",
  524. 8801 : "&equiv;",
  525. 8804 : "&le;",
  526. 8805 : "&ge;",
  527. 8834 : "&sub;",
  528. 8835 : "&sup;",
  529. 8836 : "&nsub;",
  530. 8838 : "&sube;",
  531. 8839 : "&supe;",
  532. 8853 : "&oplus;",
  533. 8855 : "&otimes;",
  534. 8869 : "&perp;",
  535. 8901 : "&sdot;",
  536. 8942 : "&vellip;",
  537. 8968 : "&lceil;",
  538. 8969 : "&rceil;",
  539. 8970 : "&lfloor;",
  540. 8971 : "&rfloor;",
  541. 9001 : "&lang;",
  542. 9002 : "&rang;",
  543. 9674 : "&loz;",
  544. 9824 : "&spades;",
  545. 9827 : "&clubs;",
  546. 9829 : "&hearts;",
  547. 9830 : "&diams;",
  548. },
  549. /**
  550. * Lookup table to translate HTML entity codes to their byte values.
  551. *
  552. * @private
  553. * @constant
  554. */
  555. _entityToByte : {
  556. "quot" : 34,
  557. "amp" : 38,
  558. "apos" : 39,
  559. "lt" : 60,
  560. "gt" : 62,
  561. "nbsp" : 160,
  562. "iexcl" : 161,
  563. "cent" : 162,
  564. "pound" : 163,
  565. "curren" : 164,
  566. "yen" : 165,
  567. "brvbar" : 166,
  568. "sect" : 167,
  569. "uml" : 168,
  570. "copy" : 169,
  571. "ordf" : 170,
  572. "laquo" : 171,
  573. "not" : 172,
  574. "shy" : 173,
  575. "reg" : 174,
  576. "macr" : 175,
  577. "deg" : 176,
  578. "plusmn" : 177,
  579. "sup2" : 178,
  580. "sup3" : 179,
  581. "acute" : 180,
  582. "micro" : 181,
  583. "para" : 182,
  584. "middot" : 183,
  585. "cedil" : 184,
  586. "sup1" : 185,
  587. "ordm" : 186,
  588. "raquo" : 187,
  589. "frac14" : 188,
  590. "frac12" : 189,
  591. "frac34" : 190,
  592. "iquest" : 191,
  593. "Agrave" : 192,
  594. "Aacute" : 193,
  595. "Acirc" : 194,
  596. "Atilde" : 195,
  597. "Auml" : 196,
  598. "Aring" : 197,
  599. "AElig" : 198,
  600. "Ccedil" : 199,
  601. "Egrave" : 200,
  602. "Eacute" : 201,
  603. "Ecirc" : 202,
  604. "Euml" : 203,
  605. "Igrave" : 204,
  606. "Iacute" : 205,
  607. "Icirc" : 206,
  608. "Iuml" : 207,
  609. "ETH" : 208,
  610. "Ntilde" : 209,
  611. "Ograve" : 210,
  612. "Oacute" : 211,
  613. "Ocirc" : 212,
  614. "Otilde" : 213,
  615. "Ouml" : 214,
  616. "times" : 215,
  617. "Oslash" : 216,
  618. "Ugrave" : 217,
  619. "Uacute" : 218,
  620. "Ucirc" : 219,
  621. "Uuml" : 220,
  622. "Yacute" : 221,
  623. "THORN" : 222,
  624. "szlig" : 223,
  625. "agrave" : 224,
  626. "aacute" : 225,
  627. "acirc" : 226,
  628. "atilde" : 227,
  629. "auml" : 228,
  630. "aring" : 229,
  631. "aelig" : 230,
  632. "ccedil" : 231,
  633. "egrave" : 232,
  634. "eacute" : 233,
  635. "ecirc" : 234,
  636. "euml" : 235,
  637. "igrave" : 236,
  638. "iacute" : 237,
  639. "icirc" : 238,
  640. "iuml" : 239,
  641. "eth" : 240,
  642. "ntilde" : 241,
  643. "ograve" : 242,
  644. "oacute" : 243,
  645. "ocirc" : 244,
  646. "otilde" : 245,
  647. "ouml" : 246,
  648. "divide" : 247,
  649. "oslash" : 248,
  650. "ugrave" : 249,
  651. "uacute" : 250,
  652. "ucirc" : 251,
  653. "uuml" : 252,
  654. "yacute" : 253,
  655. "thorn" : 254,
  656. "yuml" : 255,
  657. "OElig" : 338,
  658. "oelig" : 339,
  659. "Scaron" : 352,
  660. "scaron" : 353,
  661. "Yuml" : 376,
  662. "fnof" : 402,
  663. "circ" : 710,
  664. "tilde" : 732,
  665. "Alpha" : 913,
  666. "Beta" : 914,
  667. "Gamma" : 915,
  668. "Delta" : 916,
  669. "Epsilon" : 917,
  670. "Zeta" : 918,
  671. "Eta" : 919,
  672. "Theta" : 920,
  673. "Iota" : 921,
  674. "Kappa" : 922,
  675. "Lambda" : 923,
  676. "Mu" : 924,
  677. "Nu" : 925,
  678. "Xi" : 926,
  679. "Omicron" : 927,
  680. "Pi" : 928,
  681. "Rho" : 929,
  682. "Sigma" : 931,
  683. "Tau" : 932,
  684. "Upsilon" : 933,
  685. "Phi" : 934,
  686. "Chi" : 935,
  687. "Psi" : 936,
  688. "Omega" : 937,
  689. "alpha" : 945,
  690. "beta" : 946,
  691. "gamma" : 947,
  692. "delta" : 948,
  693. "epsilon" : 949,
  694. "zeta" : 950,
  695. "eta" : 951,
  696. "theta" : 952,
  697. "iota" : 953,
  698. "kappa" : 954,
  699. "lambda" : 955,
  700. "mu" : 956,
  701. "nu" : 957,
  702. "xi" : 958,
  703. "omicron" : 959,
  704. "pi" : 960,
  705. "rho" : 961,
  706. "sigmaf" : 962,
  707. "sigma" : 963,
  708. "tau" : 964,
  709. "upsilon" : 965,
  710. "phi" : 966,
  711. "chi" : 967,
  712. "psi" : 968,
  713. "omega" : 969,
  714. "thetasym" : 977,
  715. "upsih" : 978,
  716. "piv" : 982,
  717. "ensp" : 8194,
  718. "emsp" : 8195,
  719. "thinsp" : 8201,
  720. "zwnj" : 8204,
  721. "zwj" : 8205,
  722. "lrm" : 8206,
  723. "rlm" : 8207,
  724. "ndash" : 8211,
  725. "mdash" : 8212,
  726. "lsquo" : 8216,
  727. "rsquo" : 8217,
  728. "sbquo" : 8218,
  729. "ldquo" : 8220,
  730. "rdquo" : 8221,
  731. "bdquo" : 8222,
  732. "dagger" : 8224,
  733. "Dagger" : 8225,
  734. "bull" : 8226,
  735. "hellip" : 8230,
  736. "permil" : 8240,
  737. "prime" : 8242,
  738. "Prime" : 8243,
  739. "lsaquo" : 8249,
  740. "rsaquo" : 8250,
  741. "oline" : 8254,
  742. "frasl" : 8260,
  743. "euro" : 8364,
  744. "image" : 8465,
  745. "weierp" : 8472,
  746. "real" : 8476,
  747. "trade" : 8482,
  748. "alefsym" : 8501,
  749. "larr" : 8592,
  750. "uarr" : 8593,
  751. "rarr" : 8594,
  752. "darr" : 8595,
  753. "harr" : 8596,
  754. "crarr" : 8629,
  755. "lArr" : 8656,
  756. "uArr" : 8657,
  757. "rArr" : 8658,
  758. "dArr" : 8659,
  759. "hArr" : 8660,
  760. "forall" : 8704,
  761. "part" : 8706,
  762. "exist" : 8707,
  763. "empty" : 8709,
  764. "nabla" : 8711,
  765. "isin" : 8712,
  766. "notin" : 8713,
  767. "ni" : 8715,
  768. "prod" : 8719,
  769. "sum" : 8721,
  770. "minus" : 8722,
  771. "lowast" : 8727,
  772. "radic" : 8730,
  773. "prop" : 8733,
  774. "infin" : 8734,
  775. "ang" : 8736,
  776. "and" : 8743,
  777. "or" : 8744,
  778. "cap" : 8745,
  779. "cup" : 8746,
  780. "int" : 8747,
  781. "there4" : 8756,
  782. "sim" : 8764,
  783. "cong" : 8773,
  784. "asymp" : 8776,
  785. "ne" : 8800,
  786. "equiv" : 8801,
  787. "le" : 8804,
  788. "ge" : 8805,
  789. "sub" : 8834,
  790. "sup" : 8835,
  791. "nsub" : 8836,
  792. "sube" : 8838,
  793. "supe" : 8839,
  794. "oplus" : 8853,
  795. "otimes" : 8855,
  796. "perp" : 8869,
  797. "sdot" : 8901,
  798. "vellip" : 8942,
  799. "lceil" : 8968,
  800. "rceil" : 8969,
  801. "lfloor" : 8970,
  802. "rfloor" : 8971,
  803. "lang" : 9001,
  804. "rang" : 9002,
  805. "loz" : 9674,
  806. "spades" : 9824,
  807. "clubs" : 9827,
  808. "hearts" : 9829,
  809. "diams" : 9830,
  810. },
  811. };