adva_cms 0.0.1

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