hyhyhy 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (576) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +4 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +184 -0
  9. data/Rakefile +2 -0
  10. data/bin/hyhyhy +59 -0
  11. data/hyhyhy.gemspec +29 -0
  12. data/lib/hyhyhy.rb +101 -0
  13. data/lib/hyhyhy/config.rb +29 -0
  14. data/lib/hyhyhy/frames.rb +108 -0
  15. data/lib/hyhyhy/logger.rb +40 -0
  16. data/lib/hyhyhy/parser.rb +9 -0
  17. data/lib/hyhyhy/structure/.bowerrc +5 -0
  18. data/lib/hyhyhy/structure/.hyhyhy +5 -0
  19. data/lib/hyhyhy/structure/README.md +0 -0
  20. data/lib/hyhyhy/structure/_assets/javascripts/main.js +395 -0
  21. data/lib/hyhyhy/structure/_assets/stylesheets/main.css +520 -0
  22. data/lib/hyhyhy/structure/_includes/bootstrap/.bower.json +47 -0
  23. data/lib/hyhyhy/structure/_includes/bootstrap/Gruntfile.js +472 -0
  24. data/lib/hyhyhy/structure/_includes/bootstrap/LICENSE +21 -0
  25. data/lib/hyhyhy/structure/_includes/bootstrap/README.md +129 -0
  26. data/lib/hyhyhy/structure/_includes/bootstrap/bower.json +38 -0
  27. data/lib/hyhyhy/structure/_includes/bootstrap/dist/css/bootstrap-theme.css +470 -0
  28. data/lib/hyhyhy/structure/_includes/bootstrap/dist/css/bootstrap-theme.css.map +1 -0
  29. data/lib/hyhyhy/structure/_includes/bootstrap/dist/css/bootstrap-theme.min.css +5 -0
  30. data/lib/hyhyhy/structure/_includes/bootstrap/dist/css/bootstrap.css +6332 -0
  31. data/lib/hyhyhy/structure/_includes/bootstrap/dist/css/bootstrap.css.map +1 -0
  32. data/lib/hyhyhy/structure/_includes/bootstrap/dist/css/bootstrap.min.css +5 -0
  33. data/lib/hyhyhy/structure/_includes/bootstrap/dist/fonts/glyphicons-halflings-regular.eot +0 -0
  34. data/lib/hyhyhy/structure/_includes/bootstrap/dist/fonts/glyphicons-halflings-regular.svg +229 -0
  35. data/lib/hyhyhy/structure/_includes/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
  36. data/lib/hyhyhy/structure/_includes/bootstrap/dist/fonts/glyphicons-halflings-regular.woff +0 -0
  37. data/lib/hyhyhy/structure/_includes/bootstrap/dist/js/bootstrap.js +2320 -0
  38. data/lib/hyhyhy/structure/_includes/bootstrap/dist/js/bootstrap.min.js +7 -0
  39. data/lib/hyhyhy/structure/_includes/bootstrap/dist/js/npm.js +13 -0
  40. data/lib/hyhyhy/structure/_includes/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
  41. data/lib/hyhyhy/structure/_includes/bootstrap/fonts/glyphicons-halflings-regular.svg +229 -0
  42. data/lib/hyhyhy/structure/_includes/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
  43. data/lib/hyhyhy/structure/_includes/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
  44. data/lib/hyhyhy/structure/_includes/bootstrap/grunt/.jshintrc +7 -0
  45. data/lib/hyhyhy/structure/_includes/bootstrap/grunt/bs-commonjs-generator.js +23 -0
  46. data/lib/hyhyhy/structure/_includes/bootstrap/grunt/bs-lessdoc-parser.js +238 -0
  47. data/lib/hyhyhy/structure/_includes/bootstrap/grunt/bs-raw-files-generator.js +46 -0
  48. data/lib/hyhyhy/structure/_includes/bootstrap/grunt/configBridge.json +44 -0
  49. data/lib/hyhyhy/structure/_includes/bootstrap/grunt/sauce_browsers.yml +82 -0
  50. data/lib/hyhyhy/structure/_includes/bootstrap/js/.jscsrc +34 -0
  51. data/lib/hyhyhy/structure/_includes/bootstrap/js/.jshintrc +15 -0
  52. data/lib/hyhyhy/structure/_includes/bootstrap/js/affix.js +162 -0
  53. data/lib/hyhyhy/structure/_includes/bootstrap/js/alert.js +94 -0
  54. data/lib/hyhyhy/structure/_includes/bootstrap/js/button.js +116 -0
  55. data/lib/hyhyhy/structure/_includes/bootstrap/js/carousel.js +240 -0
  56. data/lib/hyhyhy/structure/_includes/bootstrap/js/collapse.js +211 -0
  57. data/lib/hyhyhy/structure/_includes/bootstrap/js/dropdown.js +161 -0
  58. data/lib/hyhyhy/structure/_includes/bootstrap/js/modal.js +324 -0
  59. data/lib/hyhyhy/structure/_includes/bootstrap/js/popover.js +119 -0
  60. data/lib/hyhyhy/structure/_includes/bootstrap/js/scrollspy.js +175 -0
  61. data/lib/hyhyhy/structure/_includes/bootstrap/js/tab.js +153 -0
  62. data/lib/hyhyhy/structure/_includes/bootstrap/js/tooltip.js +478 -0
  63. data/lib/hyhyhy/structure/_includes/bootstrap/js/transition.js +59 -0
  64. data/lib/hyhyhy/structure/_includes/bootstrap/less/.csscomb.json +304 -0
  65. data/lib/hyhyhy/structure/_includes/bootstrap/less/.csslintrc +19 -0
  66. data/lib/hyhyhy/structure/_includes/bootstrap/less/alerts.less +68 -0
  67. data/lib/hyhyhy/structure/_includes/bootstrap/less/badges.less +61 -0
  68. data/lib/hyhyhy/structure/_includes/bootstrap/less/bootstrap.less +50 -0
  69. data/lib/hyhyhy/structure/_includes/bootstrap/less/breadcrumbs.less +26 -0
  70. data/lib/hyhyhy/structure/_includes/bootstrap/less/button-groups.less +243 -0
  71. data/lib/hyhyhy/structure/_includes/bootstrap/less/buttons.less +160 -0
  72. data/lib/hyhyhy/structure/_includes/bootstrap/less/carousel.less +267 -0
  73. data/lib/hyhyhy/structure/_includes/bootstrap/less/close.less +33 -0
  74. data/lib/hyhyhy/structure/_includes/bootstrap/less/code.less +69 -0
  75. data/lib/hyhyhy/structure/_includes/bootstrap/less/component-animations.less +34 -0
  76. data/lib/hyhyhy/structure/_includes/bootstrap/less/dropdowns.less +213 -0
  77. data/lib/hyhyhy/structure/_includes/bootstrap/less/forms.less +546 -0
  78. data/lib/hyhyhy/structure/_includes/bootstrap/less/glyphicons.less +234 -0
  79. data/lib/hyhyhy/structure/_includes/bootstrap/less/grid.less +84 -0
  80. data/lib/hyhyhy/structure/_includes/bootstrap/less/input-groups.less +166 -0
  81. data/lib/hyhyhy/structure/_includes/bootstrap/less/jumbotron.less +49 -0
  82. data/lib/hyhyhy/structure/_includes/bootstrap/less/labels.less +64 -0
  83. data/lib/hyhyhy/structure/_includes/bootstrap/less/list-group.less +124 -0
  84. data/lib/hyhyhy/structure/_includes/bootstrap/less/media.less +47 -0
  85. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins.less +39 -0
  86. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/alerts.less +14 -0
  87. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/background-variant.less +8 -0
  88. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/border-radius.less +18 -0
  89. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/buttons.less +52 -0
  90. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/center-block.less +7 -0
  91. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/clearfix.less +22 -0
  92. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/forms.less +85 -0
  93. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/gradients.less +59 -0
  94. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/grid-framework.less +91 -0
  95. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/grid.less +122 -0
  96. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/hide-text.less +21 -0
  97. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/image.less +33 -0
  98. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/labels.less +12 -0
  99. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/list-group.less +29 -0
  100. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/nav-divider.less +10 -0
  101. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/nav-vertical-align.less +9 -0
  102. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/opacity.less +8 -0
  103. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/pagination.less +23 -0
  104. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/panels.less +24 -0
  105. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/progress-bar.less +10 -0
  106. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/reset-filter.less +8 -0
  107. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/resize.less +6 -0
  108. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/responsive-visibility.less +15 -0
  109. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/size.less +10 -0
  110. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/tab-focus.less +9 -0
  111. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/table-row.less +28 -0
  112. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/text-emphasis.less +8 -0
  113. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/text-overflow.less +8 -0
  114. data/lib/hyhyhy/structure/_includes/bootstrap/less/mixins/vendor-prefixes.less +227 -0
  115. data/lib/hyhyhy/structure/_includes/bootstrap/less/modals.less +148 -0
  116. data/lib/hyhyhy/structure/_includes/bootstrap/less/navbar.less +660 -0
  117. data/lib/hyhyhy/structure/_includes/bootstrap/less/navs.less +244 -0
  118. data/lib/hyhyhy/structure/_includes/bootstrap/less/normalize.less +427 -0
  119. data/lib/hyhyhy/structure/_includes/bootstrap/less/pager.less +54 -0
  120. data/lib/hyhyhy/structure/_includes/bootstrap/less/pagination.less +88 -0
  121. data/lib/hyhyhy/structure/_includes/bootstrap/less/panels.less +261 -0
  122. data/lib/hyhyhy/structure/_includes/bootstrap/less/popovers.less +135 -0
  123. data/lib/hyhyhy/structure/_includes/bootstrap/less/print.less +107 -0
  124. data/lib/hyhyhy/structure/_includes/bootstrap/less/progress-bars.less +87 -0
  125. data/lib/hyhyhy/structure/_includes/bootstrap/less/responsive-embed.less +35 -0
  126. data/lib/hyhyhy/structure/_includes/bootstrap/less/responsive-utilities.less +194 -0
  127. data/lib/hyhyhy/structure/_includes/bootstrap/less/scaffolding.less +150 -0
  128. data/lib/hyhyhy/structure/_includes/bootstrap/less/tables.less +234 -0
  129. data/lib/hyhyhy/structure/_includes/bootstrap/less/theme.less +272 -0
  130. data/lib/hyhyhy/structure/_includes/bootstrap/less/thumbnails.less +36 -0
  131. data/lib/hyhyhy/structure/_includes/bootstrap/less/tooltip.less +103 -0
  132. data/lib/hyhyhy/structure/_includes/bootstrap/less/type.less +302 -0
  133. data/lib/hyhyhy/structure/_includes/bootstrap/less/utilities.less +56 -0
  134. data/lib/hyhyhy/structure/_includes/bootstrap/less/variables.less +856 -0
  135. data/lib/hyhyhy/structure/_includes/bootstrap/less/wells.less +29 -0
  136. data/lib/hyhyhy/structure/_includes/bootstrap/package.json +82 -0
  137. data/lib/hyhyhy/structure/_includes/bower.json +9 -0
  138. data/lib/hyhyhy/structure/_includes/d3/.bower.json +37 -0
  139. data/lib/hyhyhy/structure/_includes/d3/CONTRIBUTING.md +25 -0
  140. data/lib/hyhyhy/structure/_includes/d3/LICENSE +26 -0
  141. data/lib/hyhyhy/structure/_includes/d3/README.md +9 -0
  142. data/lib/hyhyhy/structure/_includes/d3/bower.json +26 -0
  143. data/lib/hyhyhy/structure/_includes/d3/d3.js +9470 -0
  144. data/lib/hyhyhy/structure/_includes/d3/d3.min.js +5 -0
  145. data/lib/hyhyhy/structure/_includes/jquery/.bower.json +38 -0
  146. data/lib/hyhyhy/structure/_includes/jquery/MIT-LICENSE.txt +21 -0
  147. data/lib/hyhyhy/structure/_includes/jquery/bower.json +27 -0
  148. data/lib/hyhyhy/structure/_includes/jquery/dist/jquery.js +9190 -0
  149. data/lib/hyhyhy/structure/_includes/jquery/dist/jquery.min.js +5 -0
  150. data/lib/hyhyhy/structure/_includes/jquery/dist/jquery.min.map +1 -0
  151. data/lib/hyhyhy/structure/_includes/jquery/src/ajax.js +806 -0
  152. data/lib/hyhyhy/structure/_includes/jquery/src/ajax/jsonp.js +89 -0
  153. data/lib/hyhyhy/structure/_includes/jquery/src/ajax/load.js +75 -0
  154. data/lib/hyhyhy/structure/_includes/jquery/src/ajax/parseJSON.js +13 -0
  155. data/lib/hyhyhy/structure/_includes/jquery/src/ajax/parseXML.js +28 -0
  156. data/lib/hyhyhy/structure/_includes/jquery/src/ajax/script.js +64 -0
  157. data/lib/hyhyhy/structure/_includes/jquery/src/ajax/var/nonce.js +5 -0
  158. data/lib/hyhyhy/structure/_includes/jquery/src/ajax/var/rquery.js +3 -0
  159. data/lib/hyhyhy/structure/_includes/jquery/src/ajax/xhr.js +135 -0
  160. data/lib/hyhyhy/structure/_includes/jquery/src/attributes.js +11 -0
  161. data/lib/hyhyhy/structure/_includes/jquery/src/attributes/attr.js +143 -0
  162. data/lib/hyhyhy/structure/_includes/jquery/src/attributes/classes.js +158 -0
  163. data/lib/hyhyhy/structure/_includes/jquery/src/attributes/prop.js +96 -0
  164. data/lib/hyhyhy/structure/_includes/jquery/src/attributes/support.js +35 -0
  165. data/lib/hyhyhy/structure/_includes/jquery/src/attributes/val.js +163 -0
  166. data/lib/hyhyhy/structure/_includes/jquery/src/callbacks.js +205 -0
  167. data/lib/hyhyhy/structure/_includes/jquery/src/core.js +498 -0
  168. data/lib/hyhyhy/structure/_includes/jquery/src/core/access.js +60 -0
  169. data/lib/hyhyhy/structure/_includes/jquery/src/core/init.js +123 -0
  170. data/lib/hyhyhy/structure/_includes/jquery/src/core/parseHTML.js +39 -0
  171. data/lib/hyhyhy/structure/_includes/jquery/src/core/ready.js +97 -0
  172. data/lib/hyhyhy/structure/_includes/jquery/src/core/var/rsingleTag.js +4 -0
  173. data/lib/hyhyhy/structure/_includes/jquery/src/css.js +451 -0
  174. data/lib/hyhyhy/structure/_includes/jquery/src/css/addGetHookIf.js +24 -0
  175. data/lib/hyhyhy/structure/_includes/jquery/src/css/curCSS.js +57 -0
  176. data/lib/hyhyhy/structure/_includes/jquery/src/css/defaultDisplay.js +70 -0
  177. data/lib/hyhyhy/structure/_includes/jquery/src/css/hiddenVisibleSelectors.js +15 -0
  178. data/lib/hyhyhy/structure/_includes/jquery/src/css/support.js +91 -0
  179. data/lib/hyhyhy/structure/_includes/jquery/src/css/swap.js +28 -0
  180. data/lib/hyhyhy/structure/_includes/jquery/src/css/var/cssExpand.js +3 -0
  181. data/lib/hyhyhy/structure/_includes/jquery/src/css/var/getStyles.js +5 -0
  182. data/lib/hyhyhy/structure/_includes/jquery/src/css/var/isHidden.js +13 -0
  183. data/lib/hyhyhy/structure/_includes/jquery/src/css/var/rmargin.js +3 -0
  184. data/lib/hyhyhy/structure/_includes/jquery/src/css/var/rnumnonpx.js +5 -0
  185. data/lib/hyhyhy/structure/_includes/jquery/src/data.js +179 -0
  186. data/lib/hyhyhy/structure/_includes/jquery/src/data/Data.js +181 -0
  187. data/lib/hyhyhy/structure/_includes/jquery/src/data/accepts.js +20 -0
  188. data/lib/hyhyhy/structure/_includes/jquery/src/data/var/data_priv.js +5 -0
  189. data/lib/hyhyhy/structure/_includes/jquery/src/data/var/data_user.js +5 -0
  190. data/lib/hyhyhy/structure/_includes/jquery/src/deferred.js +149 -0
  191. data/lib/hyhyhy/structure/_includes/jquery/src/deprecated.js +13 -0
  192. data/lib/hyhyhy/structure/_includes/jquery/src/dimensions.js +50 -0
  193. data/lib/hyhyhy/structure/_includes/jquery/src/effects.js +649 -0
  194. data/lib/hyhyhy/structure/_includes/jquery/src/effects/Tween.js +114 -0
  195. data/lib/hyhyhy/structure/_includes/jquery/src/effects/animatedSelector.js +13 -0
  196. data/lib/hyhyhy/structure/_includes/jquery/src/event.js +868 -0
  197. data/lib/hyhyhy/structure/_includes/jquery/src/event/alias.js +39 -0
  198. data/lib/hyhyhy/structure/_includes/jquery/src/event/support.js +9 -0
  199. data/lib/hyhyhy/structure/_includes/jquery/src/exports/amd.js +24 -0
  200. data/lib/hyhyhy/structure/_includes/jquery/src/exports/global.js +32 -0
  201. data/lib/hyhyhy/structure/_includes/jquery/src/intro.js +44 -0
  202. data/lib/hyhyhy/structure/_includes/jquery/src/jquery.js +36 -0
  203. data/lib/hyhyhy/structure/_includes/jquery/src/manipulation.js +582 -0
  204. data/lib/hyhyhy/structure/_includes/jquery/src/manipulation/_evalUrl.js +18 -0
  205. data/lib/hyhyhy/structure/_includes/jquery/src/manipulation/support.js +31 -0
  206. data/lib/hyhyhy/structure/_includes/jquery/src/manipulation/var/rcheckableType.js +3 -0
  207. data/lib/hyhyhy/structure/_includes/jquery/src/offset.js +204 -0
  208. data/lib/hyhyhy/structure/_includes/jquery/src/outro.js +1 -0
  209. data/lib/hyhyhy/structure/_includes/jquery/src/queue.js +142 -0
  210. data/lib/hyhyhy/structure/_includes/jquery/src/queue/delay.js +22 -0
  211. data/lib/hyhyhy/structure/_includes/jquery/src/selector-native.js +172 -0
  212. data/lib/hyhyhy/structure/_includes/jquery/src/selector-sizzle.js +14 -0
  213. data/lib/hyhyhy/structure/_includes/jquery/src/selector.js +1 -0
  214. data/lib/hyhyhy/structure/_includes/jquery/src/serialize.js +111 -0
  215. data/lib/hyhyhy/structure/_includes/jquery/src/sizzle/dist/sizzle.js +2044 -0
  216. data/lib/hyhyhy/structure/_includes/jquery/src/sizzle/dist/sizzle.min.js +3 -0
  217. data/lib/hyhyhy/structure/_includes/jquery/src/sizzle/dist/sizzle.min.map +1 -0
  218. data/lib/hyhyhy/structure/_includes/jquery/src/traversing.js +200 -0
  219. data/lib/hyhyhy/structure/_includes/jquery/src/traversing/findFilter.js +100 -0
  220. data/lib/hyhyhy/structure/_includes/jquery/src/traversing/var/rneedsContext.js +6 -0
  221. data/lib/hyhyhy/structure/_includes/jquery/src/var/arr.js +3 -0
  222. data/lib/hyhyhy/structure/_includes/jquery/src/var/class2type.js +4 -0
  223. data/lib/hyhyhy/structure/_includes/jquery/src/var/concat.js +5 -0
  224. data/lib/hyhyhy/structure/_includes/jquery/src/var/hasOwn.js +5 -0
  225. data/lib/hyhyhy/structure/_includes/jquery/src/var/indexOf.js +5 -0
  226. data/lib/hyhyhy/structure/_includes/jquery/src/var/pnum.js +3 -0
  227. data/lib/hyhyhy/structure/_includes/jquery/src/var/push.js +5 -0
  228. data/lib/hyhyhy/structure/_includes/jquery/src/var/rnotwhite.js +3 -0
  229. data/lib/hyhyhy/structure/_includes/jquery/src/var/slice.js +5 -0
  230. data/lib/hyhyhy/structure/_includes/jquery/src/var/strundefined.js +3 -0
  231. data/lib/hyhyhy/structure/_includes/jquery/src/var/support.js +4 -0
  232. data/lib/hyhyhy/structure/_includes/jquery/src/var/toString.js +5 -0
  233. data/lib/hyhyhy/structure/_includes/jquery/src/wrap.js +78 -0
  234. data/lib/hyhyhy/structure/_includes/katex/.arcconfig +4 -0
  235. data/lib/hyhyhy/structure/_includes/katex/.bower.json +14 -0
  236. data/lib/hyhyhy/structure/_includes/katex/.gitignore +5 -0
  237. data/lib/hyhyhy/structure/_includes/katex/.hyhyhy +10 -0
  238. data/lib/hyhyhy/structure/_includes/katex/.jshintrc +67 -0
  239. data/lib/hyhyhy/structure/_includes/katex/.travis.yml +4 -0
  240. data/lib/hyhyhy/structure/_includes/katex/CONTRIBUTING.md +112 -0
  241. data/lib/hyhyhy/structure/_includes/katex/LICENSE.txt +21 -0
  242. data/lib/hyhyhy/structure/_includes/katex/Makefile +61 -0
  243. data/lib/hyhyhy/structure/_includes/katex/README.md +50 -0
  244. data/lib/hyhyhy/structure/_includes/katex/cli.js +15 -0
  245. data/lib/hyhyhy/structure/_includes/katex/dockers/HuxleyTests/Dockerfile +13 -0
  246. data/lib/hyhyhy/structure/_includes/katex/dockers/HuxleyTests/README.md +29 -0
  247. data/lib/hyhyhy/structure/_includes/katex/dockers/MathJaxFonts/Dockerfile +34 -0
  248. data/lib/hyhyhy/structure/_includes/katex/dockers/MathJaxFonts/README.md +55 -0
  249. data/lib/hyhyhy/structure/_includes/katex/dockers/MathJaxFonts/copy_fonts.sh +47 -0
  250. data/lib/hyhyhy/structure/_includes/katex/katex.js +54 -0
  251. data/lib/hyhyhy/structure/_includes/katex/lint_blacklist.txt +8 -0
  252. data/lib/hyhyhy/structure/_includes/katex/metrics/README.md +21 -0
  253. data/lib/hyhyhy/structure/_includes/katex/metrics/extract_tfms.py +94 -0
  254. data/lib/hyhyhy/structure/_includes/katex/metrics/extract_ttfs.py +75 -0
  255. data/lib/hyhyhy/structure/_includes/katex/metrics/mapping.pl +997 -0
  256. data/lib/hyhyhy/structure/_includes/katex/metrics/parse_tfm.py +201 -0
  257. data/lib/hyhyhy/structure/_includes/katex/metrics/replace_line.py +17 -0
  258. data/lib/hyhyhy/structure/_includes/katex/package.json +30 -0
  259. data/lib/hyhyhy/structure/_includes/katex/server.js +77 -0
  260. data/lib/hyhyhy/structure/_includes/katex/src/Lexer.js +190 -0
  261. data/lib/hyhyhy/structure/_includes/katex/src/Options.js +85 -0
  262. data/lib/hyhyhy/structure/_includes/katex/src/ParseError.js +40 -0
  263. data/lib/hyhyhy/structure/_includes/katex/src/Parser.js +639 -0
  264. data/lib/hyhyhy/structure/_includes/katex/src/Style.js +126 -0
  265. data/lib/hyhyhy/structure/_includes/katex/src/buildCommon.js +271 -0
  266. data/lib/hyhyhy/structure/_includes/katex/src/buildTree.js +1167 -0
  267. data/lib/hyhyhy/structure/_includes/katex/src/delimiter.js +541 -0
  268. data/lib/hyhyhy/structure/_includes/katex/src/domTree.js +241 -0
  269. data/lib/hyhyhy/structure/_includes/katex/src/fontMetrics.js +129 -0
  270. data/lib/hyhyhy/structure/_includes/katex/src/functions.js +539 -0
  271. data/lib/hyhyhy/structure/_includes/katex/src/parseTree.js +17 -0
  272. data/lib/hyhyhy/structure/_includes/katex/src/symbols.js +1006 -0
  273. data/lib/hyhyhy/structure/_includes/katex/src/utils.js +97 -0
  274. data/lib/hyhyhy/structure/_includes/katex/static/fonts.less +73 -0
  275. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_AMS-Regular.eot +0 -0
  276. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_AMS-Regular.ttf +0 -0
  277. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_AMS-Regular.woff +0 -0
  278. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  279. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Caligraphic-Bold.eot +0 -0
  280. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  281. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  282. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  283. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Caligraphic-Regular.eot +0 -0
  284. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  285. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  286. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  287. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Fraktur-Bold.eot +0 -0
  288. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  289. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  290. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  291. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Fraktur-Regular.eot +0 -0
  292. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  293. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  294. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  295. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Greek-Bold.woff2 +0 -0
  296. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Greek-BoldItalic.woff2 +0 -0
  297. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Greek-Italic.woff2 +0 -0
  298. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Greek-Regular.woff2 +0 -0
  299. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Main-Bold.eot +0 -0
  300. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Main-Bold.ttf +0 -0
  301. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Main-Bold.woff +0 -0
  302. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Main-Bold.woff2 +0 -0
  303. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Main-Italic.eot +0 -0
  304. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Main-Italic.ttf +0 -0
  305. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Main-Italic.woff +0 -0
  306. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Main-Italic.woff2 +0 -0
  307. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Main-Regular.eot +0 -0
  308. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Main-Regular.ttf +0 -0
  309. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Main-Regular.woff +0 -0
  310. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Main-Regular.woff2 +0 -0
  311. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Math-BoldItalic.eot +0 -0
  312. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  313. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  314. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  315. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Math-Italic.eot +0 -0
  316. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Math-Italic.ttf +0 -0
  317. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Math-Italic.woff +0 -0
  318. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Math-Italic.woff2 +0 -0
  319. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Math-Regular.eot +0 -0
  320. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Math-Regular.ttf +0 -0
  321. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Math-Regular.woff +0 -0
  322. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Math-Regular.woff2 +0 -0
  323. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_SansSerif-Bold.eot +0 -0
  324. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  325. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  326. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  327. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_SansSerif-Italic.eot +0 -0
  328. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  329. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  330. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  331. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_SansSerif-Regular.eot +0 -0
  332. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  333. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  334. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  335. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Script-Regular.eot +0 -0
  336. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Script-Regular.ttf +0 -0
  337. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Script-Regular.woff +0 -0
  338. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Script-Regular.woff2 +0 -0
  339. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Size1-Regular.eot +0 -0
  340. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Size1-Regular.ttf +0 -0
  341. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Size1-Regular.woff +0 -0
  342. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  343. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Size2-Regular.eot +0 -0
  344. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Size2-Regular.ttf +0 -0
  345. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Size2-Regular.woff +0 -0
  346. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  347. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Size3-Regular.eot +0 -0
  348. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Size3-Regular.ttf +0 -0
  349. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Size3-Regular.woff +0 -0
  350. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  351. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Size4-Regular.eot +0 -0
  352. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Size4-Regular.ttf +0 -0
  353. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Size4-Regular.woff +0 -0
  354. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  355. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Typewriter-Regular.eot +0 -0
  356. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  357. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  358. data/lib/hyhyhy/structure/_includes/katex/static/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  359. data/lib/hyhyhy/structure/_includes/katex/static/index.html +17 -0
  360. data/lib/hyhyhy/structure/_includes/katex/static/katex.less +430 -0
  361. data/lib/hyhyhy/structure/_includes/katex/static/main.css +12 -0
  362. data/lib/hyhyhy/structure/_includes/katex/static/main.js +42 -0
  363. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfile.json +199 -0
  364. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Accents.hux/firefox-1.png +0 -0
  365. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Accents.record.json +5 -0
  366. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Baseline.hux/firefox-1.png +0 -0
  367. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Baseline.record.json +5 -0
  368. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/BasicTest.hux/firefox-1.png +0 -0
  369. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/BasicTest.record.json +5 -0
  370. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/BinomTest.hux/firefox-1.png +0 -0
  371. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/BinomTest.record.json +5 -0
  372. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Colors.hux/firefox-1.png +0 -0
  373. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Colors.record.json +5 -0
  374. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/DeepFontSizing.hux/firefox-1.png +0 -0
  375. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/DeepFontSizing.record.json +5 -0
  376. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/DelimiterSizing.hux/firefox-1.png +0 -0
  377. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/DelimiterSizing.record.json +5 -0
  378. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/DisplayStyle.hux/firefox-1.png +0 -0
  379. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/DisplayStyle.record.json +5 -0
  380. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Exponents.hux/firefox-1.png +0 -0
  381. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Exponents.record.json +5 -0
  382. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/FractionTest.hux/firefox-1.png +0 -0
  383. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/FractionTest.record.json +5 -0
  384. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Functions.hux/firefox-1.png +0 -0
  385. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Functions.record.json +5 -0
  386. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/GreekLetters.hux/firefox-1.png +0 -0
  387. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/GreekLetters.record.json +5 -0
  388. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/KaTeX.hux/firefox-1.png +0 -0
  389. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/KaTeX.record.json +5 -0
  390. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Lap.hux/firefox-1.png +0 -0
  391. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Lap.record.json +5 -0
  392. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/LeftRight.hux/firefox-1.png +0 -0
  393. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/LeftRight.record.json +5 -0
  394. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/LeftRightListStyling.hux/firefox-1.png +0 -0
  395. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/LeftRightListStyling.record.json +5 -0
  396. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/LeftRightStyleSizing.hux/firefox-1.png +0 -0
  397. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/LeftRightStyleSizing.record.json +5 -0
  398. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/NestedFractions.hux/firefox-1.png +0 -0
  399. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/NestedFractions.record.json +5 -0
  400. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/NullDelimiterInteraction.hux/firefox-1.png +0 -0
  401. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/NullDelimiterInteraction.record.json +5 -0
  402. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/OpLimits.hux/firefox-1.png +0 -0
  403. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/OpLimits.record.json +5 -0
  404. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Overline.hux/firefox-1.png +0 -0
  405. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Overline.record.json +5 -0
  406. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/PrimeSpacing.hux/firefox-1.png +0 -0
  407. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/PrimeSpacing.record.json +5 -0
  408. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/RlapBug.hux/firefox-1.png +0 -0
  409. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/RlapBug.record.json +5 -0
  410. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Rule.hux/firefox-1.png +0 -0
  411. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Rule.record.json +5 -0
  412. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Sizing.hux/firefox-1.png +0 -0
  413. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Sizing.record.json +5 -0
  414. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/SizingBaseline.hux/firefox-1.png +0 -0
  415. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/SizingBaseline.record.json +5 -0
  416. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Spacing.hux/firefox-1.png +0 -0
  417. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Spacing.record.json +5 -0
  418. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Sqrt.hux/firefox-1.png +0 -0
  419. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Sqrt.record.json +5 -0
  420. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/SupSubCharacterBox.hux/firefox-1.png +0 -0
  421. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/SupSubCharacterBox.record.json +5 -0
  422. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/SupSubHorizSpacing.hux/firefox-1.png +0 -0
  423. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/SupSubHorizSpacing.record.json +5 -0
  424. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/SupSubOffsets.hux/firefox-1.png +0 -0
  425. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/SupSubOffsets.record.json +5 -0
  426. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Text.hux/firefox-1.png +0 -0
  427. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/Text.record.json +5 -0
  428. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/VerticalSpacing.hux/firefox-1.png +0 -0
  429. data/lib/hyhyhy/structure/_includes/katex/test/huxley/Huxleyfolder/VerticalSpacing.record.json +5 -0
  430. data/lib/hyhyhy/structure/_includes/katex/test/huxley/test.html +30 -0
  431. data/lib/hyhyhy/structure/_includes/katex/test/jasmine/MIT.LICENSE +20 -0
  432. data/lib/hyhyhy/structure/_includes/katex/test/jasmine/boot.js +120 -0
  433. data/lib/hyhyhy/structure/_includes/katex/test/jasmine/console.js +166 -0
  434. data/lib/hyhyhy/structure/_includes/katex/test/jasmine/jasmine-html.js +390 -0
  435. data/lib/hyhyhy/structure/_includes/katex/test/jasmine/jasmine.css +61 -0
  436. data/lib/hyhyhy/structure/_includes/katex/test/jasmine/jasmine.js +2593 -0
  437. data/lib/hyhyhy/structure/_includes/katex/test/jasmine/jasmine_favicon.png +0 -0
  438. data/lib/hyhyhy/structure/_includes/katex/test/katex-spec.js +1179 -0
  439. data/lib/hyhyhy/structure/_includes/katex/test/test.html +12 -0
  440. data/lib/hyhyhy/structure/_includes/metrics-graphics/.bower.json +61 -0
  441. data/lib/hyhyhy/structure/_includes/metrics-graphics/.hyhyhy +17 -0
  442. data/lib/hyhyhy/structure/_includes/metrics-graphics/LICENSE +362 -0
  443. data/lib/hyhyhy/structure/_includes/metrics-graphics/README.md +70 -0
  444. data/lib/hyhyhy/structure/_includes/metrics-graphics/bower.json +50 -0
  445. data/lib/hyhyhy/structure/_includes/metrics-graphics/css/metricsgraphics-demo-dark.css +640 -0
  446. data/lib/hyhyhy/structure/_includes/metrics-graphics/css/metricsgraphics-demo.css +176 -0
  447. data/lib/hyhyhy/structure/_includes/metrics-graphics/css/metricsgraphics.css +344 -0
  448. data/lib/hyhyhy/structure/_includes/metrics-graphics/images/missing-data-dark.png +0 -0
  449. data/lib/hyhyhy/structure/_includes/metrics-graphics/images/missing-data.png +0 -0
  450. data/lib/hyhyhy/structure/_includes/metrics-graphics/js/metricsgraphics.min.js +590 -0
  451. data/lib/hyhyhy/structure/_includes/metrics-graphics/package.json +35 -0
  452. data/lib/hyhyhy/structure/_includes/prism/.bower.json +34 -0
  453. data/lib/hyhyhy/structure/_includes/prism/.hyhyhy +33 -0
  454. data/lib/hyhyhy/structure/_includes/prism/LICENSE +21 -0
  455. data/lib/hyhyhy/structure/_includes/prism/README.md +22 -0
  456. data/lib/hyhyhy/structure/_includes/prism/bower.json +26 -0
  457. data/lib/hyhyhy/structure/_includes/prism/components.js +233 -0
  458. data/lib/hyhyhy/structure/_includes/prism/components/prism-apacheconf.js +46 -0
  459. data/lib/hyhyhy/structure/_includes/prism/components/prism-apacheconf.min.js +1 -0
  460. data/lib/hyhyhy/structure/_includes/prism/components/prism-aspnet.js +49 -0
  461. data/lib/hyhyhy/structure/_includes/prism/components/prism-aspnet.min.js +1 -0
  462. data/lib/hyhyhy/structure/_includes/prism/components/prism-autohotkey.js +27 -0
  463. data/lib/hyhyhy/structure/_includes/prism/components/prism-autohotkey.min.js +1 -0
  464. data/lib/hyhyhy/structure/_includes/prism/components/prism-bash.js +24 -0
  465. data/lib/hyhyhy/structure/_includes/prism/components/prism-bash.min.js +1 -0
  466. data/lib/hyhyhy/structure/_includes/prism/components/prism-c.js +26 -0
  467. data/lib/hyhyhy/structure/_includes/prism/components/prism-c.min.js +1 -0
  468. data/lib/hyhyhy/structure/_includes/prism/components/prism-clike.js +32 -0
  469. data/lib/hyhyhy/structure/_includes/prism/components/prism-clike.min.js +1 -0
  470. data/lib/hyhyhy/structure/_includes/prism/components/prism-coffeescript.js +18 -0
  471. data/lib/hyhyhy/structure/_includes/prism/components/prism-coffeescript.min.js +1 -0
  472. data/lib/hyhyhy/structure/_includes/prism/components/prism-core.js +424 -0
  473. data/lib/hyhyhy/structure/_includes/prism/components/prism-core.min.js +1 -0
  474. data/lib/hyhyhy/structure/_includes/prism/components/prism-cpp.js +12 -0
  475. data/lib/hyhyhy/structure/_includes/prism/components/prism-cpp.min.js +1 -0
  476. data/lib/hyhyhy/structure/_includes/prism/components/prism-csharp.js +6 -0
  477. data/lib/hyhyhy/structure/_includes/prism/components/prism-csharp.min.js +1 -0
  478. data/lib/hyhyhy/structure/_includes/prism/components/prism-css-extras.js +15 -0
  479. data/lib/hyhyhy/structure/_includes/prism/components/prism-css-extras.min.js +1 -0
  480. data/lib/hyhyhy/structure/_includes/prism/components/prism-css.js +50 -0
  481. data/lib/hyhyhy/structure/_includes/prism/components/prism-css.min.js +1 -0
  482. data/lib/hyhyhy/structure/_includes/prism/components/prism-gherkin.js +13 -0
  483. data/lib/hyhyhy/structure/_includes/prism/components/prism-gherkin.min.js +1 -0
  484. data/lib/hyhyhy/structure/_includes/prism/components/prism-git.js +68 -0
  485. data/lib/hyhyhy/structure/_includes/prism/components/prism-git.min.js +1 -0
  486. data/lib/hyhyhy/structure/_includes/prism/components/prism-go.js +9 -0
  487. data/lib/hyhyhy/structure/_includes/prism/components/prism-go.min.js +1 -0
  488. data/lib/hyhyhy/structure/_includes/prism/components/prism-groovy.js +43 -0
  489. data/lib/hyhyhy/structure/_includes/prism/components/prism-groovy.min.js +1 -0
  490. data/lib/hyhyhy/structure/_includes/prism/components/prism-handlebars.js +92 -0
  491. data/lib/hyhyhy/structure/_includes/prism/components/prism-handlebars.min.js +1 -0
  492. data/lib/hyhyhy/structure/_includes/prism/components/prism-haskell.js +32 -0
  493. data/lib/hyhyhy/structure/_includes/prism/components/prism-haskell.min.js +1 -0
  494. data/lib/hyhyhy/structure/_includes/prism/components/prism-http.js +44 -0
  495. data/lib/hyhyhy/structure/_includes/prism/components/prism-http.min.js +1 -0
  496. data/lib/hyhyhy/structure/_includes/prism/components/prism-ini.js +11 -0
  497. data/lib/hyhyhy/structure/_includes/prism/components/prism-ini.min.js +1 -0
  498. data/lib/hyhyhy/structure/_includes/prism/components/prism-java.js +8 -0
  499. data/lib/hyhyhy/structure/_includes/prism/components/prism-java.min.js +1 -0
  500. data/lib/hyhyhy/structure/_includes/prism/components/prism-javascript.js +27 -0
  501. data/lib/hyhyhy/structure/_includes/prism/components/prism-javascript.min.js +1 -0
  502. data/lib/hyhyhy/structure/_includes/prism/components/prism-latex.js +6 -0
  503. data/lib/hyhyhy/structure/_includes/prism/components/prism-latex.min.js +1 -0
  504. data/lib/hyhyhy/structure/_includes/prism/components/prism-markup.js +41 -0
  505. data/lib/hyhyhy/structure/_includes/prism/components/prism-markup.min.js +1 -0
  506. data/lib/hyhyhy/structure/_includes/prism/components/prism-nasm.js +20 -0
  507. data/lib/hyhyhy/structure/_includes/prism/components/prism-nasm.min.js +1 -0
  508. data/lib/hyhyhy/structure/_includes/prism/components/prism-nsis.js +19 -0
  509. data/lib/hyhyhy/structure/_includes/prism/components/prism-nsis.min.js +5 -0
  510. data/lib/hyhyhy/structure/_includes/prism/components/prism-objectivec.js +5 -0
  511. data/lib/hyhyhy/structure/_includes/prism/components/prism-objectivec.min.js +1 -0
  512. data/lib/hyhyhy/structure/_includes/prism/components/prism-perl.js +112 -0
  513. data/lib/hyhyhy/structure/_includes/prism/components/prism-perl.min.js +1 -0
  514. data/lib/hyhyhy/structure/_includes/prism/components/prism-php-extras.js +11 -0
  515. data/lib/hyhyhy/structure/_includes/prism/components/prism-php-extras.min.js +1 -0
  516. data/lib/hyhyhy/structure/_includes/prism/components/prism-php.js +99 -0
  517. data/lib/hyhyhy/structure/_includes/prism/components/prism-php.min.js +1 -0
  518. data/lib/hyhyhy/structure/_includes/prism/components/prism-python.js +14 -0
  519. data/lib/hyhyhy/structure/_includes/prism/components/prism-python.min.js +1 -0
  520. data/lib/hyhyhy/structure/_includes/prism/components/prism-rip.js +29 -0
  521. data/lib/hyhyhy/structure/_includes/prism/components/prism-rip.min.js +1 -0
  522. data/lib/hyhyhy/structure/_includes/prism/components/prism-ruby.js +21 -0
  523. data/lib/hyhyhy/structure/_includes/prism/components/prism-ruby.min.js +1 -0
  524. data/lib/hyhyhy/structure/_includes/prism/components/prism-scala.js +8 -0
  525. data/lib/hyhyhy/structure/_includes/prism/components/prism-scala.min.js +1 -0
  526. data/lib/hyhyhy/structure/_includes/prism/components/prism-scheme-min.js +1 -0
  527. data/lib/hyhyhy/structure/_includes/prism/components/prism-scheme.js +24 -0
  528. data/lib/hyhyhy/structure/_includes/prism/components/prism-scss.js +36 -0
  529. data/lib/hyhyhy/structure/_includes/prism/components/prism-scss.min.js +1 -0
  530. data/lib/hyhyhy/structure/_includes/prism/components/prism-sql.js +17 -0
  531. data/lib/hyhyhy/structure/_includes/prism/components/prism-sql.min.js +1 -0
  532. data/lib/hyhyhy/structure/_includes/prism/components/prism-swift.js +8 -0
  533. data/lib/hyhyhy/structure/_includes/prism/components/prism-swift.min.js +1 -0
  534. data/lib/hyhyhy/structure/_includes/prism/components/prism-twig.js +46 -0
  535. data/lib/hyhyhy/structure/_includes/prism/components/prism-twig.min.js +1 -0
  536. data/lib/hyhyhy/structure/_includes/prism/gulpfile.js +48 -0
  537. data/lib/hyhyhy/structure/_includes/prism/package.json +27 -0
  538. data/lib/hyhyhy/structure/_includes/prism/plugins/autolinker/prism-autolinker.css +3 -0
  539. data/lib/hyhyhy/structure/_includes/prism/plugins/autolinker/prism-autolinker.js +66 -0
  540. data/lib/hyhyhy/structure/_includes/prism/plugins/autolinker/prism-autolinker.min.js +1 -0
  541. data/lib/hyhyhy/structure/_includes/prism/plugins/file-highlight/prism-file-highlight.js +54 -0
  542. data/lib/hyhyhy/structure/_includes/prism/plugins/file-highlight/prism-file-highlight.min.js +1 -0
  543. data/lib/hyhyhy/structure/_includes/prism/plugins/ie8/prism-ie8.css +3 -0
  544. data/lib/hyhyhy/structure/_includes/prism/plugins/ie8/prism-ie8.js +42 -0
  545. data/lib/hyhyhy/structure/_includes/prism/plugins/ie8/prism-ie8.min.js +1 -0
  546. data/lib/hyhyhy/structure/_includes/prism/plugins/line-highlight/prism-line-highlight.css +47 -0
  547. data/lib/hyhyhy/structure/_includes/prism/plugins/line-highlight/prism-line-highlight.js +109 -0
  548. data/lib/hyhyhy/structure/_includes/prism/plugins/line-highlight/prism-line-highlight.min.js +1 -0
  549. data/lib/hyhyhy/structure/_includes/prism/plugins/line-numbers/prism-line-numbers.css +40 -0
  550. data/lib/hyhyhy/structure/_includes/prism/plugins/line-numbers/prism-line-numbers.js +24 -0
  551. data/lib/hyhyhy/structure/_includes/prism/plugins/line-numbers/prism-line-numbers.min.js +1 -0
  552. data/lib/hyhyhy/structure/_includes/prism/plugins/show-invisibles/prism-show-invisibles.css +17 -0
  553. data/lib/hyhyhy/structure/_includes/prism/plugins/show-invisibles/prism-show-invisibles.js +15 -0
  554. data/lib/hyhyhy/structure/_includes/prism/plugins/show-invisibles/prism-show-invisibles.min.js +1 -0
  555. data/lib/hyhyhy/structure/_includes/prism/plugins/show-language/prism-show-language.css +21 -0
  556. data/lib/hyhyhy/structure/_includes/prism/plugins/show-language/prism-show-language.js +16 -0
  557. data/lib/hyhyhy/structure/_includes/prism/plugins/show-language/prism-show-language.min.css +1 -0
  558. data/lib/hyhyhy/structure/_includes/prism/plugins/show-language/prism-show-language.min.js +1 -0
  559. data/lib/hyhyhy/structure/_includes/prism/plugins/wpd/prism-wpd.css +11 -0
  560. data/lib/hyhyhy/structure/_includes/prism/plugins/wpd/prism-wpd.js +163 -0
  561. data/lib/hyhyhy/structure/_includes/prism/plugins/wpd/prism-wpd.min.js +1 -0
  562. data/lib/hyhyhy/structure/_includes/prism/prism.js +662 -0
  563. data/lib/hyhyhy/structure/_includes/prism/themes/prism-coy.css +210 -0
  564. data/lib/hyhyhy/structure/_includes/prism/themes/prism-dark.css +122 -0
  565. data/lib/hyhyhy/structure/_includes/prism/themes/prism-funky.css +111 -0
  566. data/lib/hyhyhy/structure/_includes/prism/themes/prism-okaidia.css +114 -0
  567. data/lib/hyhyhy/structure/_includes/prism/themes/prism-tomorrow.css +115 -0
  568. data/lib/hyhyhy/structure/_includes/prism/themes/prism-twilight.css +195 -0
  569. data/lib/hyhyhy/structure/_includes/prism/themes/prism.css +131 -0
  570. data/lib/hyhyhy/structure/_includes/prism/vendor/promise.js +5 -0
  571. data/lib/hyhyhy/structure/_layouts/default.erb +41 -0
  572. data/lib/hyhyhy/structure/_slides/1.introduction.md +36 -0
  573. data/lib/hyhyhy/structure/_slides/2.packages.md +52 -0
  574. data/lib/hyhyhy/structure/_slides/3.usage.md +146 -0
  575. data/lib/hyhyhy/version.rb +5 -0
  576. metadata +747 -0
@@ -0,0 +1,126 @@
1
+ /**
2
+ * This file contains information and classes for the various kinds of styles
3
+ * used in TeX. It provides a generic `Style` class, which holds information
4
+ * about a specific style. It then provides instances of all the different kinds
5
+ * of styles possible, and provides functions to move between them and get
6
+ * information about them.
7
+ */
8
+
9
+ /**
10
+ * The main style class. Contains a unique id for the style, a size (which is
11
+ * the same for cramped and uncramped version of a style), a cramped flag, and a
12
+ * size multiplier, which gives the size difference between a style and
13
+ * textstyle.
14
+ */
15
+ function Style(id, size, multiplier, cramped) {
16
+ this.id = id;
17
+ this.size = size;
18
+ this.cramped = cramped;
19
+ this.sizeMultiplier = multiplier;
20
+ }
21
+
22
+ /**
23
+ * Get the style of a superscript given a base in the current style.
24
+ */
25
+ Style.prototype.sup = function() {
26
+ return styles[sup[this.id]];
27
+ };
28
+
29
+ /**
30
+ * Get the style of a subscript given a base in the current style.
31
+ */
32
+ Style.prototype.sub = function() {
33
+ return styles[sub[this.id]];
34
+ };
35
+
36
+ /**
37
+ * Get the style of a fraction numerator given the fraction in the current
38
+ * style.
39
+ */
40
+ Style.prototype.fracNum = function() {
41
+ return styles[fracNum[this.id]];
42
+ };
43
+
44
+ /**
45
+ * Get the style of a fraction denominator given the fraction in the current
46
+ * style.
47
+ */
48
+ Style.prototype.fracDen = function() {
49
+ return styles[fracDen[this.id]];
50
+ };
51
+
52
+ /**
53
+ * Get the cramped version of a style (in particular, cramping a cramped style
54
+ * doesn't change the style).
55
+ */
56
+ Style.prototype.cramp = function() {
57
+ return styles[cramp[this.id]];
58
+ };
59
+
60
+ /**
61
+ * HTML class name, like "displaystyle cramped"
62
+ */
63
+ Style.prototype.cls = function() {
64
+ return sizeNames[this.size] + (this.cramped ? " cramped" : " uncramped");
65
+ };
66
+
67
+ /**
68
+ * HTML Reset class name, like "reset-textstyle"
69
+ */
70
+ Style.prototype.reset = function() {
71
+ return resetNames[this.size];
72
+ };
73
+
74
+ // IDs of the different styles
75
+ var D = 0;
76
+ var Dc = 1;
77
+ var T = 2;
78
+ var Tc = 3;
79
+ var S = 4;
80
+ var Sc = 5;
81
+ var SS = 6;
82
+ var SSc = 7;
83
+
84
+ // String names for the different sizes
85
+ var sizeNames = [
86
+ "displaystyle textstyle",
87
+ "textstyle",
88
+ "scriptstyle",
89
+ "scriptscriptstyle"
90
+ ];
91
+
92
+ // Reset names for the different sizes
93
+ var resetNames = [
94
+ "reset-textstyle",
95
+ "reset-textstyle",
96
+ "reset-scriptstyle",
97
+ "reset-scriptscriptstyle"
98
+ ];
99
+
100
+ // Instances of the different styles
101
+ var styles = [
102
+ new Style(D, 0, 1.0, false),
103
+ new Style(Dc, 0, 1.0, true),
104
+ new Style(T, 1, 1.0, false),
105
+ new Style(Tc, 1, 1.0, true),
106
+ new Style(S, 2, 0.7, false),
107
+ new Style(Sc, 2, 0.7, true),
108
+ new Style(SS, 3, 0.5, false),
109
+ new Style(SSc, 3, 0.5, true)
110
+ ];
111
+
112
+ // Lookup tables for switching from one style to another
113
+ var sup = [S, Sc, S, Sc, SS, SSc, SS, SSc];
114
+ var sub = [Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc];
115
+ var fracNum = [T, Tc, S, Sc, SS, SSc, SS, SSc];
116
+ var fracDen = [Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc];
117
+ var cramp = [Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc];
118
+
119
+ // We only export some of the styles. Also, we don't export the `Style` class so
120
+ // no more styles can be generated.
121
+ module.exports = {
122
+ DISPLAY: styles[D],
123
+ TEXT: styles[T],
124
+ SCRIPT: styles[S],
125
+ SCRIPTSCRIPT: styles[SS]
126
+ };
@@ -0,0 +1,271 @@
1
+ /**
2
+ * This module contains general functions that can be used for building
3
+ * different kinds of domTree nodes in a consistent manner.
4
+ */
5
+
6
+ var domTree = require("./domTree");
7
+ var fontMetrics = require("./fontMetrics");
8
+ var symbols = require("./symbols");
9
+
10
+ /**
11
+ * Makes a symbolNode after translation via the list of symbols in symbols.js.
12
+ * Correctly pulls out metrics for the character, and optionally takes a list of
13
+ * classes to be attached to the node.
14
+ */
15
+ var makeSymbol = function(value, style, mode, color, classes) {
16
+ // Replace the value with its replaced value from symbol.js
17
+ if (symbols[mode][value] && symbols[mode][value].replace) {
18
+ value = symbols[mode][value].replace;
19
+ }
20
+
21
+ var metrics = fontMetrics.getCharacterMetrics(value, style);
22
+
23
+ var symbolNode;
24
+ if (metrics) {
25
+ symbolNode = new domTree.symbolNode(
26
+ value, metrics.height, metrics.depth, metrics.italic, metrics.skew,
27
+ classes);
28
+ } else {
29
+ // TODO(emily): Figure out a good way to only print this in development
30
+ typeof console !== "undefined" && console.warn(
31
+ "No character metrics for '" + value + "' in style '" +
32
+ style + "'");
33
+ symbolNode = new domTree.symbolNode(value, 0, 0, 0, 0, classes);
34
+ }
35
+
36
+ if (color) {
37
+ symbolNode.style.color = color;
38
+ }
39
+
40
+ return symbolNode;
41
+ };
42
+
43
+ /**
44
+ * Makes a symbol in the italic math font.
45
+ */
46
+ var mathit = function(value, mode, color, classes) {
47
+ return makeSymbol(
48
+ value, "Math-Italic", mode, color, classes.concat(["mathit"]));
49
+ };
50
+
51
+ /**
52
+ * Makes a symbol in the upright roman font.
53
+ */
54
+ var mathrm = function(value, mode, color, classes) {
55
+ // Decide what font to render the symbol in by its entry in the symbols
56
+ // table.
57
+ if (symbols[mode][value].font === "main") {
58
+ return makeSymbol(value, "Main-Regular", mode, color, classes);
59
+ } else {
60
+ return makeSymbol(
61
+ value, "AMS-Regular", mode, color, classes.concat(["amsrm"]));
62
+ }
63
+ };
64
+
65
+ /**
66
+ * Calculate the height, depth, and maxFontSize of an element based on its
67
+ * children.
68
+ */
69
+ var sizeElementFromChildren = function(elem) {
70
+ var height = 0;
71
+ var depth = 0;
72
+ var maxFontSize = 0;
73
+
74
+ if (elem.children) {
75
+ for (var i = 0; i < elem.children.length; i++) {
76
+ if (elem.children[i].height > height) {
77
+ height = elem.children[i].height;
78
+ }
79
+ if (elem.children[i].depth > depth) {
80
+ depth = elem.children[i].depth;
81
+ }
82
+ if (elem.children[i].maxFontSize > maxFontSize) {
83
+ maxFontSize = elem.children[i].maxFontSize;
84
+ }
85
+ }
86
+ }
87
+
88
+ elem.height = height;
89
+ elem.depth = depth;
90
+ elem.maxFontSize = maxFontSize;
91
+ };
92
+
93
+ /**
94
+ * Makes a span with the given list of classes, list of children, and color.
95
+ */
96
+ var makeSpan = function(classes, children, color) {
97
+ var span = new domTree.span(classes, children);
98
+
99
+ sizeElementFromChildren(span);
100
+
101
+ if (color) {
102
+ span.style.color = color;
103
+ }
104
+
105
+ return span;
106
+ };
107
+
108
+ /**
109
+ * Makes a document fragment with the given list of children.
110
+ */
111
+ var makeFragment = function(children) {
112
+ var fragment = new domTree.documentFragment(children);
113
+
114
+ sizeElementFromChildren(fragment);
115
+
116
+ return fragment;
117
+ };
118
+
119
+ /**
120
+ * Makes an element placed in each of the vlist elements to ensure that each
121
+ * element has the same max font size. To do this, we create a zero-width space
122
+ * with the correct font size.
123
+ */
124
+ var makeFontSizer = function(options, fontSize) {
125
+ var fontSizeInner = makeSpan([], [new domTree.symbolNode("\u200b")]);
126
+ fontSizeInner.style.fontSize = (fontSize / options.style.sizeMultiplier) + "em";
127
+
128
+ var fontSizer = makeSpan(
129
+ ["fontsize-ensurer", "reset-" + options.size, "size5"],
130
+ [fontSizeInner]);
131
+
132
+ return fontSizer;
133
+ };
134
+
135
+ /**
136
+ * Makes a vertical list by stacking elements and kerns on top of each other.
137
+ * Allows for many different ways of specifying the positioning method.
138
+ *
139
+ * Arguments:
140
+ * - children: A list of child or kern nodes to be stacked on top of each other
141
+ * (i.e. the first element will be at the bottom, and the last at
142
+ * the top). Element nodes are specified as
143
+ * {type: "elem", elem: node}
144
+ * while kern nodes are specified as
145
+ * {type: "kern", size: size}
146
+ * - positionType: The method by which the vlist should be positioned. Valid
147
+ * values are:
148
+ * - "individualShift": The children list only contains elem
149
+ * nodes, and each node contains an extra
150
+ * "shift" value of how much it should be
151
+ * shifted (note that shifting is always
152
+ * moving downwards). positionData is
153
+ * ignored.
154
+ * - "top": The positionData specifies the topmost point of
155
+ * the vlist (note this is expected to be a height,
156
+ * so positive values move up)
157
+ * - "bottom": The positionData specifies the bottommost point
158
+ * of the vlist (note this is expected to be a
159
+ * depth, so positive values move down
160
+ * - "shift": The vlist will be positioned such that its
161
+ * baseline is positionData away from the baseline
162
+ * of the first child. Positive values move
163
+ * downwards.
164
+ * - "firstBaseline": The vlist will be positioned such that
165
+ * its baseline is aligned with the
166
+ * baseline of the first child.
167
+ * positionData is ignored. (this is
168
+ * equivalent to "shift" with
169
+ * positionData=0)
170
+ * - positionData: Data used in different ways depending on positionType
171
+ * - options: An Options object
172
+ *
173
+ */
174
+ var makeVList = function(children, positionType, positionData, options) {
175
+ var depth;
176
+ var currPos;
177
+ var i;
178
+ if (positionType === "individualShift") {
179
+ var oldChildren = children;
180
+ children = [oldChildren[0]];
181
+
182
+ // Add in kerns to the list of children to get each element to be
183
+ // shifted to the correct specified shift
184
+ depth = -oldChildren[0].shift - oldChildren[0].elem.depth;
185
+ currPos = depth;
186
+ for (i = 1; i < oldChildren.length; i++) {
187
+ var diff = -oldChildren[i].shift - currPos -
188
+ oldChildren[i].elem.depth;
189
+ var size = diff -
190
+ (oldChildren[i - 1].elem.height +
191
+ oldChildren[i - 1].elem.depth);
192
+
193
+ currPos = currPos + diff;
194
+
195
+ children.push({type: "kern", size: size});
196
+ children.push(oldChildren[i]);
197
+ }
198
+ } else if (positionType === "top") {
199
+ // We always start at the bottom, so calculate the bottom by adding up
200
+ // all the sizes
201
+ var bottom = positionData;
202
+ for (i = 0; i < children.length; i++) {
203
+ if (children[i].type === "kern") {
204
+ bottom -= children[i].size;
205
+ } else {
206
+ bottom -= children[i].elem.height + children[i].elem.depth;
207
+ }
208
+ }
209
+ depth = bottom;
210
+ } else if (positionType === "bottom") {
211
+ depth = -positionData;
212
+ } else if (positionType === "shift") {
213
+ depth = -children[0].elem.depth - positionData;
214
+ } else if (positionType === "firstBaseline") {
215
+ depth = -children[0].elem.depth;
216
+ } else {
217
+ depth = 0;
218
+ }
219
+
220
+ // Make the fontSizer
221
+ var maxFontSize = 0;
222
+ for (i = 0; i < children.length; i++) {
223
+ if (children[i].type === "elem") {
224
+ maxFontSize = Math.max(maxFontSize, children[i].elem.maxFontSize);
225
+ }
226
+ }
227
+ var fontSizer = makeFontSizer(options, maxFontSize);
228
+
229
+ // Create a new list of actual children at the correct offsets
230
+ var realChildren = [];
231
+ currPos = depth;
232
+ for (i = 0; i < children.length; i++) {
233
+ if (children[i].type === "kern") {
234
+ currPos += children[i].size;
235
+ } else {
236
+ var child = children[i].elem;
237
+
238
+ var shift = -child.depth - currPos;
239
+ currPos += child.height + child.depth;
240
+
241
+ var childWrap = makeSpan([], [fontSizer, child]);
242
+ childWrap.height -= shift;
243
+ childWrap.depth += shift;
244
+ childWrap.style.top = shift + "em";
245
+
246
+ realChildren.push(childWrap);
247
+ }
248
+ }
249
+
250
+ // Add in an element at the end with no offset to fix the calculation of
251
+ // baselines in some browsers (namely IE, sometimes safari)
252
+ var baselineFix = makeSpan(
253
+ ["baseline-fix"], [fontSizer, new domTree.symbolNode("\u200b")]);
254
+ realChildren.push(baselineFix);
255
+
256
+ var vlist = makeSpan(["vlist"], realChildren);
257
+ // Fix the final height and depth, in case there were kerns at the ends
258
+ // since the makeSpan calculation won't take that in to account.
259
+ vlist.height = Math.max(currPos, vlist.height);
260
+ vlist.depth = Math.max(-depth, vlist.depth);
261
+ return vlist;
262
+ };
263
+
264
+ module.exports = {
265
+ makeSymbol: makeSymbol,
266
+ mathit: mathit,
267
+ mathrm: mathrm,
268
+ makeSpan: makeSpan,
269
+ makeFragment: makeFragment,
270
+ makeVList: makeVList
271
+ };
@@ -0,0 +1,1167 @@
1
+ /**
2
+ * This file does the main work of building a domTree structure from a parse
3
+ * tree. The entry point is the `buildTree` function, which takes a parse tree.
4
+ * Then, the buildExpression, buildGroup, and various groupTypes functions are
5
+ * called, to produce a final tree.
6
+ */
7
+
8
+ var Options = require("./Options");
9
+ var ParseError = require("./ParseError");
10
+ var Style = require("./Style");
11
+
12
+ var buildCommon = require("./buildCommon");
13
+ var delimiter = require("./delimiter");
14
+ var domTree = require("./domTree");
15
+ var fontMetrics = require("./fontMetrics");
16
+ var utils = require("./utils");
17
+
18
+ var makeSpan = buildCommon.makeSpan;
19
+
20
+ /**
21
+ * Take a list of nodes, build them in order, and return a list of the built
22
+ * nodes. This function handles the `prev` node correctly, and passes the
23
+ * previous element from the list as the prev of the next element.
24
+ */
25
+ var buildExpression = function(expression, options, prev) {
26
+ var groups = [];
27
+ for (var i = 0; i < expression.length; i++) {
28
+ var group = expression[i];
29
+ groups.push(buildGroup(group, options, prev));
30
+ prev = group;
31
+ }
32
+ return groups;
33
+ };
34
+
35
+ // List of types used by getTypeOfGroup
36
+ var groupToType = {
37
+ mathord: "mord",
38
+ textord: "mord",
39
+ bin: "mbin",
40
+ rel: "mrel",
41
+ text: "mord",
42
+ open: "mopen",
43
+ close: "mclose",
44
+ inner: "minner",
45
+ frac: "minner",
46
+ spacing: "mord",
47
+ punct: "mpunct",
48
+ ordgroup: "mord",
49
+ op: "mop",
50
+ katex: "mord",
51
+ overline: "mord",
52
+ rule: "mord",
53
+ leftright: "minner",
54
+ sqrt: "mord",
55
+ accent: "mord"
56
+ };
57
+
58
+ /**
59
+ * Gets the final math type of an expression, given its group type. This type is
60
+ * used to determine spacing between elements, and affects bin elements by
61
+ * causing them to change depending on what types are around them. This type
62
+ * must be attached to the outermost node of an element as a CSS class so that
63
+ * spacing with its surrounding elements works correctly.
64
+ *
65
+ * Some elements can be mapped one-to-one from group type to math type, and
66
+ * those are listed in the `groupToType` table.
67
+ *
68
+ * Others (usually elements that wrap around other elements) often have
69
+ * recursive definitions, and thus call `getTypeOfGroup` on their inner
70
+ * elements.
71
+ */
72
+ var getTypeOfGroup = function(group) {
73
+ if (group == null) {
74
+ // Like when typesetting $^3$
75
+ return groupToType.mathord;
76
+ } else if (group.type === "supsub") {
77
+ return getTypeOfGroup(group.value.base);
78
+ } else if (group.type === "llap" || group.type === "rlap") {
79
+ return getTypeOfGroup(group.value);
80
+ } else if (group.type === "color") {
81
+ return getTypeOfGroup(group.value.value);
82
+ } else if (group.type === "sizing") {
83
+ return getTypeOfGroup(group.value.value);
84
+ } else if (group.type === "styling") {
85
+ return getTypeOfGroup(group.value.value);
86
+ } else if (group.type === "delimsizing") {
87
+ return groupToType[group.value.delimType];
88
+ } else {
89
+ return groupToType[group.type];
90
+ }
91
+ };
92
+
93
+ /**
94
+ * Sometimes, groups perform special rules when they have superscripts or
95
+ * subscripts attached to them. This function lets the `supsub` group know that
96
+ * its inner element should handle the superscripts and subscripts instead of
97
+ * handling them itself.
98
+ */
99
+ var shouldHandleSupSub = function(group, options) {
100
+ if (!group) {
101
+ return false;
102
+ } else if (group.type === "op") {
103
+ // Operators handle supsubs differently when they have limits
104
+ // (e.g. `\displaystyle\sum_2^3`)
105
+ return group.value.limits && options.style.size === Style.DISPLAY.size;
106
+ } else if (group.type === "accent") {
107
+ return isCharacterBox(group.value.base);
108
+ } else {
109
+ return null;
110
+ }
111
+ };
112
+
113
+ /**
114
+ * Sometimes we want to pull out the innermost element of a group. In most
115
+ * cases, this will just be the group itself, but when ordgroups and colors have
116
+ * a single element, we want to pull that out.
117
+ */
118
+ var getBaseElem = function(group) {
119
+ if (!group) {
120
+ return false;
121
+ } else if (group.type === "ordgroup") {
122
+ if (group.value.length === 1) {
123
+ return getBaseElem(group.value[0]);
124
+ } else {
125
+ return group;
126
+ }
127
+ } else if (group.type === "color") {
128
+ if (group.value.value.length === 1) {
129
+ return getBaseElem(group.value.value[0]);
130
+ } else {
131
+ return group;
132
+ }
133
+ } else {
134
+ return group;
135
+ }
136
+ };
137
+
138
+ /**
139
+ * TeXbook algorithms often reference "character boxes", which are simply groups
140
+ * with a single character in them. To decide if something is a character box,
141
+ * we find its innermost group, and see if it is a single character.
142
+ */
143
+ var isCharacterBox = function(group) {
144
+ var baseElem = getBaseElem(group);
145
+
146
+ // These are all they types of groups which hold single characters
147
+ return baseElem.type === "mathord" ||
148
+ baseElem.type === "textord" ||
149
+ baseElem.type === "bin" ||
150
+ baseElem.type === "rel" ||
151
+ baseElem.type === "inner" ||
152
+ baseElem.type === "open" ||
153
+ baseElem.type === "close" ||
154
+ baseElem.type === "punct";
155
+ };
156
+
157
+ /**
158
+ * This is a map of group types to the function used to handle that type.
159
+ * Simpler types come at the beginning, while complicated types come afterwards.
160
+ */
161
+ var groupTypes = {
162
+ mathord: function(group, options, prev) {
163
+ return buildCommon.mathit(
164
+ group.value, group.mode, options.getColor(), ["mord"]);
165
+ },
166
+
167
+ textord: function(group, options, prev) {
168
+ return buildCommon.mathrm(
169
+ group.value, group.mode, options.getColor(), ["mord"]);
170
+ },
171
+
172
+ bin: function(group, options, prev) {
173
+ var className = "mbin";
174
+ // Pull out the most recent element. Do some special handling to find
175
+ // things at the end of a \color group. Note that we don't use the same
176
+ // logic for ordgroups (which count as ords).
177
+ var prevAtom = prev;
178
+ while (prevAtom && prevAtom.type == "color") {
179
+ var atoms = prevAtom.value.value;
180
+ prevAtom = atoms[atoms.length - 1];
181
+ }
182
+ // See TeXbook pg. 442-446, Rules 5 and 6, and the text before Rule 19.
183
+ // Here, we determine whether the bin should turn into an ord. We
184
+ // currently only apply Rule 5.
185
+ if (!prev || utils.contains(["mbin", "mopen", "mrel", "mop", "mpunct"],
186
+ getTypeOfGroup(prevAtom))) {
187
+ group.type = "textord";
188
+ className = "mord";
189
+ }
190
+
191
+ return buildCommon.mathrm(
192
+ group.value, group.mode, options.getColor(), [className]);
193
+ },
194
+
195
+ rel: function(group, options, prev) {
196
+ return buildCommon.mathrm(
197
+ group.value, group.mode, options.getColor(), ["mrel"]);
198
+ },
199
+
200
+ open: function(group, options, prev) {
201
+ return buildCommon.mathrm(
202
+ group.value, group.mode, options.getColor(), ["mopen"]);
203
+ },
204
+
205
+ close: function(group, options, prev) {
206
+ return buildCommon.mathrm(
207
+ group.value, group.mode, options.getColor(), ["mclose"]);
208
+ },
209
+
210
+ inner: function(group, options, prev) {
211
+ return buildCommon.mathrm(
212
+ group.value, group.mode, options.getColor(), ["minner"]);
213
+ },
214
+
215
+ punct: function(group, options, prev) {
216
+ return buildCommon.mathrm(
217
+ group.value, group.mode, options.getColor(), ["mpunct"]);
218
+ },
219
+
220
+ ordgroup: function(group, options, prev) {
221
+ return makeSpan(
222
+ ["mord", options.style.cls()],
223
+ buildExpression(group.value, options.reset())
224
+ );
225
+ },
226
+
227
+ text: function(group, options, prev) {
228
+ return makeSpan(["text", "mord", options.style.cls()],
229
+ buildExpression(group.value.body, options.reset()));
230
+ },
231
+
232
+ color: function(group, options, prev) {
233
+ var elements = buildExpression(
234
+ group.value.value,
235
+ options.withColor(group.value.color),
236
+ prev
237
+ );
238
+
239
+ // \color isn't supposed to affect the type of the elements it contains.
240
+ // To accomplish this, we wrap the results in a fragment, so the inner
241
+ // elements will be able to directly interact with their neighbors. For
242
+ // example, `\color{red}{2 +} 3` has the same spacing as `2 + 3`
243
+ return new buildCommon.makeFragment(elements);
244
+ },
245
+
246
+ supsub: function(group, options, prev) {
247
+ // Superscript and subscripts are handled in the TeXbook on page
248
+ // 445-446, rules 18(a-f).
249
+
250
+ // Here is where we defer to the inner group if it should handle
251
+ // superscripts and subscripts itself.
252
+ if (shouldHandleSupSub(group.value.base, options)) {
253
+ return groupTypes[group.value.base.type](group, options, prev);
254
+ }
255
+
256
+ var base = buildGroup(group.value.base, options.reset());
257
+ var supmid, submid, sup, sub;
258
+
259
+ if (group.value.sup) {
260
+ sup = buildGroup(group.value.sup,
261
+ options.withStyle(options.style.sup()));
262
+ supmid = makeSpan(
263
+ [options.style.reset(), options.style.sup().cls()], [sup]);
264
+ }
265
+
266
+ if (group.value.sub) {
267
+ sub = buildGroup(group.value.sub,
268
+ options.withStyle(options.style.sub()));
269
+ submid = makeSpan(
270
+ [options.style.reset(), options.style.sub().cls()], [sub]);
271
+ }
272
+
273
+ // Rule 18a
274
+ var supShift, subShift;
275
+ if (isCharacterBox(group.value.base)) {
276
+ supShift = 0;
277
+ subShift = 0;
278
+ } else {
279
+ supShift = base.height - fontMetrics.metrics.supDrop;
280
+ subShift = base.depth + fontMetrics.metrics.subDrop;
281
+ }
282
+
283
+ // Rule 18c
284
+ var minSupShift;
285
+ if (options.style === Style.DISPLAY) {
286
+ minSupShift = fontMetrics.metrics.sup1;
287
+ } else if (options.style.cramped) {
288
+ minSupShift = fontMetrics.metrics.sup3;
289
+ } else {
290
+ minSupShift = fontMetrics.metrics.sup2;
291
+ }
292
+
293
+ // scriptspace is a font-size-independent size, so scale it
294
+ // appropriately
295
+ var multiplier = Style.TEXT.sizeMultiplier *
296
+ options.style.sizeMultiplier;
297
+ var scriptspace =
298
+ (0.5 / fontMetrics.metrics.ptPerEm) / multiplier + "em";
299
+
300
+ var supsub;
301
+ if (!group.value.sup) {
302
+ // Rule 18b
303
+ subShift = Math.max(
304
+ subShift, fontMetrics.metrics.sub1,
305
+ sub.height - 0.8 * fontMetrics.metrics.xHeight);
306
+
307
+ supsub = buildCommon.makeVList([
308
+ {type: "elem", elem: submid}
309
+ ], "shift", subShift, options);
310
+
311
+ supsub.children[0].style.marginRight = scriptspace;
312
+
313
+ // Subscripts shouldn't be shifted by the base's italic correction.
314
+ // Account for that by shifting the subscript back the appropriate
315
+ // amount. Note we only do this when the base is a single symbol.
316
+ if (base instanceof domTree.symbolNode) {
317
+ supsub.children[0].style.marginLeft = -base.italic + "em";
318
+ }
319
+ } else if (!group.value.sub) {
320
+ // Rule 18c, d
321
+ supShift = Math.max(supShift, minSupShift,
322
+ sup.depth + 0.25 * fontMetrics.metrics.xHeight);
323
+
324
+ supsub = buildCommon.makeVList([
325
+ {type: "elem", elem: supmid}
326
+ ], "shift", -supShift, options);
327
+
328
+ supsub.children[0].style.marginRight = scriptspace;
329
+ } else {
330
+ supShift = Math.max(
331
+ supShift, minSupShift,
332
+ sup.depth + 0.25 * fontMetrics.metrics.xHeight);
333
+ subShift = Math.max(subShift, fontMetrics.metrics.sub2);
334
+
335
+ var ruleWidth = fontMetrics.metrics.defaultRuleThickness;
336
+
337
+ // Rule 18e
338
+ if ((supShift - sup.depth) - (sub.height - subShift) <
339
+ 4 * ruleWidth) {
340
+ subShift = 4 * ruleWidth - (supShift - sup.depth) + sub.height;
341
+ var psi = 0.8 * fontMetrics.metrics.xHeight -
342
+ (supShift - sup.depth);
343
+ if (psi > 0) {
344
+ supShift += psi;
345
+ subShift -= psi;
346
+ }
347
+ }
348
+
349
+ supsub = buildCommon.makeVList([
350
+ {type: "elem", elem: submid, shift: subShift},
351
+ {type: "elem", elem: supmid, shift: -supShift}
352
+ ], "individualShift", null, options);
353
+
354
+ // See comment above about subscripts not being shifted
355
+ if (base instanceof domTree.symbolNode) {
356
+ supsub.children[0].style.marginLeft = -base.italic + "em";
357
+ }
358
+
359
+ supsub.children[0].style.marginRight = scriptspace;
360
+ supsub.children[1].style.marginRight = scriptspace;
361
+ }
362
+
363
+ return makeSpan([getTypeOfGroup(group.value.base)],
364
+ [base, supsub]);
365
+ },
366
+
367
+ genfrac: function(group, options, prev) {
368
+ // Fractions are handled in the TeXbook on pages 444-445, rules 15(a-e).
369
+ // Figure out what style this fraction should be in based on the
370
+ // function used
371
+ var fstyle = options.style;
372
+ if (group.value.size === "display") {
373
+ fstyle = Style.DISPLAY;
374
+ } else if (group.value.size === "text") {
375
+ fstyle = Style.TEXT;
376
+ }
377
+
378
+ var nstyle = fstyle.fracNum();
379
+ var dstyle = fstyle.fracDen();
380
+
381
+ var numer = buildGroup(group.value.numer, options.withStyle(nstyle));
382
+ var numerreset = makeSpan([fstyle.reset(), nstyle.cls()], [numer]);
383
+
384
+ var denom = buildGroup(group.value.denom, options.withStyle(dstyle));
385
+ var denomreset = makeSpan([fstyle.reset(), dstyle.cls()], [denom]);
386
+
387
+ var ruleWidth;
388
+ if (group.value.hasBarLine) {
389
+ ruleWidth = fontMetrics.metrics.defaultRuleThickness /
390
+ options.style.sizeMultiplier;
391
+ } else {
392
+ ruleWidth = 0;
393
+ }
394
+
395
+ // Rule 15b
396
+ var numShift;
397
+ var clearance;
398
+ var denomShift;
399
+ if (fstyle.size === Style.DISPLAY.size) {
400
+ numShift = fontMetrics.metrics.num1;
401
+ if (ruleWidth > 0) {
402
+ clearance = 3 * ruleWidth;
403
+ } else {
404
+ clearance = 7 * fontMetrics.metrics.defaultRuleThickness;
405
+ }
406
+ denomShift = fontMetrics.metrics.denom1;
407
+ } else {
408
+ if (ruleWidth > 0) {
409
+ numShift = fontMetrics.metrics.num2;
410
+ clearance = ruleWidth;
411
+ } else {
412
+ numShift = fontMetrics.metrics.num3;
413
+ clearance = 3 * fontMetrics.metrics.defaultRuleThickness;
414
+ }
415
+ denomShift = fontMetrics.metrics.denom2;
416
+ }
417
+
418
+ var frac;
419
+ if (ruleWidth === 0) {
420
+ // Rule 15c
421
+ var candiateClearance =
422
+ (numShift - numer.depth) - (denom.height - denomShift);
423
+ if (candiateClearance < clearance) {
424
+ numShift += 0.5 * (clearance - candiateClearance);
425
+ denomShift += 0.5 * (clearance - candiateClearance);
426
+ }
427
+
428
+ frac = buildCommon.makeVList([
429
+ {type: "elem", elem: denomreset, shift: denomShift},
430
+ {type: "elem", elem: numerreset, shift: -numShift}
431
+ ], "individualShift", null, options);
432
+ } else {
433
+ // Rule 15d
434
+ var axisHeight = fontMetrics.metrics.axisHeight;
435
+
436
+ if ((numShift - numer.depth) - (axisHeight + 0.5 * ruleWidth)
437
+ < clearance) {
438
+ numShift +=
439
+ clearance - ((numShift - numer.depth) -
440
+ (axisHeight + 0.5 * ruleWidth));
441
+ }
442
+
443
+ if ((axisHeight - 0.5 * ruleWidth) - (denom.height - denomShift)
444
+ < clearance) {
445
+ denomShift +=
446
+ clearance - ((axisHeight - 0.5 * ruleWidth) -
447
+ (denom.height - denomShift));
448
+ }
449
+
450
+ var mid = makeSpan(
451
+ [options.style.reset(), Style.TEXT.cls(), "frac-line"]);
452
+ // Manually set the height of the line because its height is
453
+ // created in CSS
454
+ mid.height = ruleWidth;
455
+
456
+ var midShift = -(axisHeight - 0.5 * ruleWidth);
457
+
458
+ frac = buildCommon.makeVList([
459
+ {type: "elem", elem: denomreset, shift: denomShift},
460
+ {type: "elem", elem: mid, shift: midShift},
461
+ {type: "elem", elem: numerreset, shift: -numShift}
462
+ ], "individualShift", null, options);
463
+ }
464
+
465
+ // Since we manually change the style sometimes (with \dfrac or \tfrac),
466
+ // account for the possible size change here.
467
+ frac.height *= fstyle.sizeMultiplier / options.style.sizeMultiplier;
468
+ frac.depth *= fstyle.sizeMultiplier / options.style.sizeMultiplier;
469
+
470
+ // Rule 15e
471
+ var innerChildren = [makeSpan(["mfrac"], [frac])];
472
+
473
+ var delimSize;
474
+ if (fstyle.size === Style.DISPLAY.size) {
475
+ delimSize = fontMetrics.metrics.delim1;
476
+ } else {
477
+ delimSize = fontMetrics.metrics.getDelim2(fstyle);
478
+ }
479
+
480
+ if (group.value.leftDelim != null) {
481
+ innerChildren.unshift(
482
+ delimiter.customSizedDelim(
483
+ group.value.leftDelim, delimSize, true,
484
+ options.withStyle(fstyle), group.mode)
485
+ );
486
+ }
487
+ if (group.value.rightDelim != null) {
488
+ innerChildren.push(
489
+ delimiter.customSizedDelim(
490
+ group.value.rightDelim, delimSize, true,
491
+ options.withStyle(fstyle), group.mode)
492
+ );
493
+ }
494
+
495
+ return makeSpan(
496
+ ["minner", options.style.reset(), fstyle.cls()],
497
+ innerChildren,
498
+ options.getColor());
499
+ },
500
+
501
+ spacing: function(group, options, prev) {
502
+ if (group.value === "\\ " || group.value === "\\space" ||
503
+ group.value === " " || group.value === "~") {
504
+ // Spaces are generated by adding an actual space. Each of these
505
+ // things has an entry in the symbols table, so these will be turned
506
+ // into appropriate outputs.
507
+ return makeSpan(
508
+ ["mord", "mspace"],
509
+ [buildCommon.mathrm(group.value, group.mode)]
510
+ );
511
+ } else {
512
+ // Other kinds of spaces are of arbitrary width. We use CSS to
513
+ // generate these.
514
+ var spacingClassMap = {
515
+ "\\qquad": "qquad",
516
+ "\\quad": "quad",
517
+ "\\enspace": "enspace",
518
+ "\\;": "thickspace",
519
+ "\\:": "mediumspace",
520
+ "\\,": "thinspace",
521
+ "\\!": "negativethinspace"
522
+ };
523
+
524
+ return makeSpan(
525
+ ["mord", "mspace", spacingClassMap[group.value]]);
526
+ }
527
+ },
528
+
529
+ llap: function(group, options, prev) {
530
+ var inner = makeSpan(
531
+ ["inner"], [buildGroup(group.value.body, options.reset())]);
532
+ var fix = makeSpan(["fix"], []);
533
+ return makeSpan(
534
+ ["llap", options.style.cls()], [inner, fix]);
535
+ },
536
+
537
+ rlap: function(group, options, prev) {
538
+ var inner = makeSpan(
539
+ ["inner"], [buildGroup(group.value.body, options.reset())]);
540
+ var fix = makeSpan(["fix"], []);
541
+ return makeSpan(
542
+ ["rlap", options.style.cls()], [inner, fix]);
543
+ },
544
+
545
+ op: function(group, options, prev) {
546
+ // Operators are handled in the TeXbook pg. 443-444, rule 13(a).
547
+ var supGroup;
548
+ var subGroup;
549
+ var hasLimits = false;
550
+ if (group.type === "supsub" ) {
551
+ // If we have limits, supsub will pass us its group to handle. Pull
552
+ // out the superscript and subscript and set the group to the op in
553
+ // its base.
554
+ supGroup = group.value.sup;
555
+ subGroup = group.value.sub;
556
+ group = group.value.base;
557
+ hasLimits = true;
558
+ }
559
+
560
+ // Most operators have a large successor symbol, but these don't.
561
+ var noSuccessor = [
562
+ "\\smallint"
563
+ ];
564
+
565
+ var large = false;
566
+ if (options.style.size === Style.DISPLAY.size &&
567
+ group.value.symbol &&
568
+ !utils.contains(noSuccessor, group.value.body)) {
569
+
570
+ // Most symbol operators get larger in displaystyle (rule 13)
571
+ large = true;
572
+ }
573
+
574
+ var base;
575
+ var baseShift = 0;
576
+ var slant = 0;
577
+ if (group.value.symbol) {
578
+ // If this is a symbol, create the symbol.
579
+ var style = large ? "Size2-Regular" : "Size1-Regular";
580
+ base = buildCommon.makeSymbol(
581
+ group.value.body, style, "math", options.getColor(),
582
+ ["op-symbol", large ? "large-op" : "small-op", "mop"]);
583
+
584
+ // Shift the symbol so its center lies on the axis (rule 13). It
585
+ // appears that our fonts have the centers of the symbols already
586
+ // almost on the axis, so these numbers are very small. Note we
587
+ // don't actually apply this here, but instead it is used either in
588
+ // the vlist creation or separately when there are no limits.
589
+ baseShift = (base.height - base.depth) / 2 -
590
+ fontMetrics.metrics.axisHeight *
591
+ options.style.sizeMultiplier;
592
+
593
+ // The slant of the symbol is just its italic correction.
594
+ slant = base.italic;
595
+ } else {
596
+ // Otherwise, this is a text operator. Build the text from the
597
+ // operator's name.
598
+ // TODO(emily): Add a space in the middle of some of these
599
+ // operators, like \limsup
600
+ var output = [];
601
+ for (var i = 1; i < group.value.body.length; i++) {
602
+ output.push(buildCommon.mathrm(group.value.body[i], group.mode));
603
+ }
604
+ base = makeSpan(["mop"], output, options.getColor());
605
+ }
606
+
607
+ if (hasLimits) {
608
+ // IE 8 clips \int if it is in a display: inline-block. We wrap it
609
+ // in a new span so it is an inline, and works.
610
+ base = makeSpan([], [base]);
611
+
612
+ var supmid, supKern, submid, subKern;
613
+ // We manually have to handle the superscripts and subscripts. This,
614
+ // aside from the kern calculations, is copied from supsub.
615
+ if (supGroup) {
616
+ var sup = buildGroup(
617
+ supGroup, options.withStyle(options.style.sup()));
618
+ supmid = makeSpan(
619
+ [options.style.reset(), options.style.sup().cls()], [sup]);
620
+
621
+ supKern = Math.max(
622
+ fontMetrics.metrics.bigOpSpacing1,
623
+ fontMetrics.metrics.bigOpSpacing3 - sup.depth);
624
+ }
625
+
626
+ if (subGroup) {
627
+ var sub = buildGroup(
628
+ subGroup, options.withStyle(options.style.sub()));
629
+ submid = makeSpan(
630
+ [options.style.reset(), options.style.sub().cls()],
631
+ [sub]);
632
+
633
+ subKern = Math.max(
634
+ fontMetrics.metrics.bigOpSpacing2,
635
+ fontMetrics.metrics.bigOpSpacing4 - sub.height);
636
+ }
637
+
638
+ // Build the final group as a vlist of the possible subscript, base,
639
+ // and possible superscript.
640
+ var finalGroup, top, bottom;
641
+ if (!supGroup) {
642
+ top = base.height - baseShift;
643
+
644
+ finalGroup = buildCommon.makeVList([
645
+ {type: "kern", size: fontMetrics.metrics.bigOpSpacing5},
646
+ {type: "elem", elem: submid},
647
+ {type: "kern", size: subKern},
648
+ {type: "elem", elem: base}
649
+ ], "top", top, options);
650
+
651
+ // Here, we shift the limits by the slant of the symbol. Note
652
+ // that we are supposed to shift the limits by 1/2 of the slant,
653
+ // but since we are centering the limits adding a full slant of
654
+ // margin will shift by 1/2 that.
655
+ finalGroup.children[0].style.marginLeft = -slant + "em";
656
+ } else if (!subGroup) {
657
+ bottom = base.depth + baseShift;
658
+
659
+ finalGroup = buildCommon.makeVList([
660
+ {type: "elem", elem: base},
661
+ {type: "kern", size: supKern},
662
+ {type: "elem", elem: supmid},
663
+ {type: "kern", size: fontMetrics.metrics.bigOpSpacing5}
664
+ ], "bottom", bottom, options);
665
+
666
+ // See comment above about slants
667
+ finalGroup.children[1].style.marginLeft = slant + "em";
668
+ } else if (!supGroup && !subGroup) {
669
+ // This case probably shouldn't occur (this would mean the
670
+ // supsub was sending us a group with no superscript or
671
+ // subscript) but be safe.
672
+ return base;
673
+ } else {
674
+ bottom = fontMetrics.metrics.bigOpSpacing5 +
675
+ submid.height + submid.depth +
676
+ subKern +
677
+ base.depth + baseShift;
678
+
679
+ finalGroup = buildCommon.makeVList([
680
+ {type: "kern", size: fontMetrics.metrics.bigOpSpacing5},
681
+ {type: "elem", elem: submid},
682
+ {type: "kern", size: subKern},
683
+ {type: "elem", elem: base},
684
+ {type: "kern", size: supKern},
685
+ {type: "elem", elem: supmid},
686
+ {type: "kern", size: fontMetrics.metrics.bigOpSpacing5}
687
+ ], "bottom", bottom, options);
688
+
689
+ // See comment above about slants
690
+ finalGroup.children[0].style.marginLeft = -slant + "em";
691
+ finalGroup.children[2].style.marginLeft = slant + "em";
692
+ }
693
+
694
+ return makeSpan(["mop", "op-limits"], [finalGroup]);
695
+ } else {
696
+ if (group.value.symbol) {
697
+ base.style.top = baseShift + "em";
698
+ }
699
+
700
+ return base;
701
+ }
702
+ },
703
+
704
+ katex: function(group, options, prev) {
705
+ // The KaTeX logo. The offsets for the K and a were chosen to look
706
+ // good, but the offsets for the T, E, and X were taken from the
707
+ // definition of \TeX in TeX (see TeXbook pg. 356)
708
+ var k = makeSpan(
709
+ ["k"], [buildCommon.mathrm("K", group.mode)]);
710
+ var a = makeSpan(
711
+ ["a"], [buildCommon.mathrm("A", group.mode)]);
712
+
713
+ a.height = (a.height + 0.2) * 0.75;
714
+ a.depth = (a.height - 0.2) * 0.75;
715
+
716
+ var t = makeSpan(
717
+ ["t"], [buildCommon.mathrm("T", group.mode)]);
718
+ var e = makeSpan(
719
+ ["e"], [buildCommon.mathrm("E", group.mode)]);
720
+
721
+ e.height = (e.height - 0.2155);
722
+ e.depth = (e.depth + 0.2155);
723
+
724
+ var x = makeSpan(
725
+ ["x"], [buildCommon.mathrm("X", group.mode)]);
726
+
727
+ return makeSpan(
728
+ ["katex-logo"], [k, a, t, e, x], options.getColor());
729
+ },
730
+
731
+ overline: function(group, options, prev) {
732
+ // Overlines are handled in the TeXbook pg 443, Rule 9.
733
+
734
+ // Build the inner group in the cramped style.
735
+ var innerGroup = buildGroup(group.value.body,
736
+ options.withStyle(options.style.cramp()));
737
+
738
+ var ruleWidth = fontMetrics.metrics.defaultRuleThickness /
739
+ options.style.sizeMultiplier;
740
+
741
+ // Create the line above the body
742
+ var line = makeSpan(
743
+ [options.style.reset(), Style.TEXT.cls(), "overline-line"]);
744
+ line.height = ruleWidth;
745
+ line.maxFontSize = 1.0;
746
+
747
+ // Generate the vlist, with the appropriate kerns
748
+ var vlist = buildCommon.makeVList([
749
+ {type: "elem", elem: innerGroup},
750
+ {type: "kern", size: 3 * ruleWidth},
751
+ {type: "elem", elem: line},
752
+ {type: "kern", size: ruleWidth}
753
+ ], "firstBaseline", null, options);
754
+
755
+ return makeSpan(["overline", "mord"], [vlist], options.getColor());
756
+ },
757
+
758
+ sqrt: function(group, options, prev) {
759
+ // Square roots are handled in the TeXbook pg. 443, Rule 11.
760
+
761
+ // First, we do the same steps as in overline to build the inner group
762
+ // and line
763
+ var inner = buildGroup(group.value.body,
764
+ options.withStyle(options.style.cramp()));
765
+
766
+ var ruleWidth = fontMetrics.metrics.defaultRuleThickness /
767
+ options.style.sizeMultiplier;
768
+
769
+ var line = makeSpan(
770
+ [options.style.reset(), Style.TEXT.cls(), "sqrt-line"], [],
771
+ options.getColor());
772
+ line.height = ruleWidth;
773
+ line.maxFontSize = 1.0;
774
+
775
+ var phi = ruleWidth;
776
+ if (options.style.id < Style.TEXT.id) {
777
+ phi = fontMetrics.metrics.xHeight;
778
+ }
779
+
780
+ // Calculate the clearance between the body and line
781
+ var lineClearance = ruleWidth + phi / 4;
782
+
783
+ var innerHeight =
784
+ (inner.height + inner.depth) * options.style.sizeMultiplier;
785
+ var minDelimiterHeight = innerHeight + lineClearance + ruleWidth;
786
+
787
+ // Create a \surd delimiter of the required minimum size
788
+ var delim = makeSpan(["sqrt-sign"], [
789
+ delimiter.customSizedDelim("\\surd", minDelimiterHeight,
790
+ false, options, group.mode)],
791
+ options.getColor());
792
+
793
+ var delimDepth = (delim.height + delim.depth) - ruleWidth;
794
+
795
+ // Adjust the clearance based on the delimiter size
796
+ if (delimDepth > inner.height + inner.depth + lineClearance) {
797
+ lineClearance =
798
+ (lineClearance + delimDepth - inner.height - inner.depth) / 2;
799
+ }
800
+
801
+ // Shift the delimiter so that its top lines up with the top of the line
802
+ var delimShift = -(inner.height + lineClearance + ruleWidth) + delim.height;
803
+ delim.style.top = delimShift + "em";
804
+ delim.height -= delimShift;
805
+ delim.depth += delimShift;
806
+
807
+ // We add a special case here, because even when `inner` is empty, we
808
+ // still get a line. So, we use a simple heuristic to decide if we
809
+ // should omit the body entirely. (note this doesn't work for something
810
+ // like `\sqrt{\rlap{x}}`, but if someone is doing that they deserve for
811
+ // it not to work.
812
+ var body;
813
+ if (inner.height === 0 && inner.depth === 0) {
814
+ body = makeSpan();
815
+ } else {
816
+ body = buildCommon.makeVList([
817
+ {type: "elem", elem: inner},
818
+ {type: "kern", size: lineClearance},
819
+ {type: "elem", elem: line},
820
+ {type: "kern", size: ruleWidth}
821
+ ], "firstBaseline", null, options);
822
+ }
823
+
824
+ return makeSpan(["sqrt", "mord"], [delim, body]);
825
+ },
826
+
827
+ sizing: function(group, options, prev) {
828
+ // Handle sizing operators like \Huge. Real TeX doesn't actually allow
829
+ // these functions inside of math expressions, so we do some special
830
+ // handling.
831
+ var inner = buildExpression(group.value.value,
832
+ options.withSize(group.value.size), prev);
833
+
834
+ var span = makeSpan(["mord"],
835
+ [makeSpan(["sizing", "reset-" + options.size, group.value.size,
836
+ options.style.cls()],
837
+ inner)]);
838
+
839
+ // Calculate the correct maxFontSize manually
840
+ var fontSize = sizingMultiplier[group.value.size];
841
+ span.maxFontSize = fontSize * options.style.sizeMultiplier;
842
+
843
+ return span;
844
+ },
845
+
846
+ styling: function(group, options, prev) {
847
+ // Style changes are handled in the TeXbook on pg. 442, Rule 3.
848
+
849
+ // Figure out what style we're changing to.
850
+ var style = {
851
+ "display": Style.DISPLAY,
852
+ "text": Style.TEXT,
853
+ "script": Style.SCRIPT,
854
+ "scriptscript": Style.SCRIPTSCRIPT
855
+ };
856
+
857
+ var newStyle = style[group.value.style];
858
+
859
+ // Build the inner expression in the new style.
860
+ var inner = buildExpression(
861
+ group.value.value, options.withStyle(newStyle), prev);
862
+
863
+ return makeSpan([options.style.reset(), newStyle.cls()], inner);
864
+ },
865
+
866
+ delimsizing: function(group, options, prev) {
867
+ var delim = group.value.value;
868
+
869
+ if (delim === ".") {
870
+ // Empty delimiters still count as elements, even though they don't
871
+ // show anything.
872
+ return makeSpan([groupToType[group.value.delimType]]);
873
+ }
874
+
875
+ // Use delimiter.sizedDelim to generate the delimiter.
876
+ return makeSpan(
877
+ [groupToType[group.value.delimType]],
878
+ [delimiter.sizedDelim(
879
+ delim, group.value.size, options, group.mode)]);
880
+ },
881
+
882
+ leftright: function(group, options, prev) {
883
+ // Build the inner expression
884
+ var inner = buildExpression(group.value.body, options.reset());
885
+
886
+ var innerHeight = 0;
887
+ var innerDepth = 0;
888
+
889
+ // Calculate its height and depth
890
+ for (var i = 0; i < inner.length; i++) {
891
+ innerHeight = Math.max(inner[i].height, innerHeight);
892
+ innerDepth = Math.max(inner[i].depth, innerDepth);
893
+ }
894
+
895
+ // The size of delimiters is the same, regardless of what style we are
896
+ // in. Thus, to correctly calculate the size of delimiter we need around
897
+ // a group, we scale down the inner size based on the size.
898
+ innerHeight *= options.style.sizeMultiplier;
899
+ innerDepth *= options.style.sizeMultiplier;
900
+
901
+ var leftDelim;
902
+ if (group.value.left === ".") {
903
+ // Empty delimiters in \left and \right make null delimiter spaces.
904
+ leftDelim = makeSpan(["nulldelimiter"]);
905
+ } else {
906
+ // Otherwise, use leftRightDelim to generate the correct sized
907
+ // delimiter.
908
+ leftDelim = delimiter.leftRightDelim(
909
+ group.value.left, innerHeight, innerDepth, options,
910
+ group.mode);
911
+ }
912
+ // Add it to the beginning of the expression
913
+ inner.unshift(leftDelim);
914
+
915
+ var rightDelim;
916
+ // Same for the right delimiter
917
+ if (group.value.right === ".") {
918
+ rightDelim = makeSpan(["nulldelimiter"]);
919
+ } else {
920
+ rightDelim = delimiter.leftRightDelim(
921
+ group.value.right, innerHeight, innerDepth, options,
922
+ group.mode);
923
+ }
924
+ // Add it to the end of the expression.
925
+ inner.push(rightDelim);
926
+
927
+ return makeSpan(
928
+ ["minner", options.style.cls()], inner, options.getColor());
929
+ },
930
+
931
+ rule: function(group, options, prev) {
932
+ // Make an empty span for the rule
933
+ var rule = makeSpan(["mord", "rule"], [], options.getColor());
934
+
935
+ // Calculate the shift, width, and height of the rule, and account for units
936
+ var shift = 0;
937
+ if (group.value.shift) {
938
+ shift = group.value.shift.number;
939
+ if (group.value.shift.unit === "ex") {
940
+ shift *= fontMetrics.metrics.xHeight;
941
+ }
942
+ }
943
+
944
+ var width = group.value.width.number;
945
+ if (group.value.width.unit === "ex") {
946
+ width *= fontMetrics.metrics.xHeight;
947
+ }
948
+
949
+ var height = group.value.height.number;
950
+ if (group.value.height.unit === "ex") {
951
+ height *= fontMetrics.metrics.xHeight;
952
+ }
953
+
954
+ // The sizes of rules are absolute, so make it larger if we are in a
955
+ // smaller style.
956
+ shift /= options.style.sizeMultiplier;
957
+ width /= options.style.sizeMultiplier;
958
+ height /= options.style.sizeMultiplier;
959
+
960
+ // Style the rule to the right size
961
+ rule.style.borderRightWidth = width + "em";
962
+ rule.style.borderTopWidth = height + "em";
963
+ rule.style.bottom = shift + "em";
964
+
965
+ // Record the height and width
966
+ rule.width = width;
967
+ rule.height = height + shift;
968
+ rule.depth = -shift;
969
+
970
+ return rule;
971
+ },
972
+
973
+ accent: function(group, options, prev) {
974
+ // Accents are handled in the TeXbook pg. 443, rule 12.
975
+ var base = group.value.base;
976
+
977
+ var supsubGroup;
978
+ if (group.type === "supsub") {
979
+ // If our base is a character box, and we have superscripts and
980
+ // subscripts, the supsub will defer to us. In particular, we want
981
+ // to attach the superscripts and subscripts to the inner body (so
982
+ // that the position of the superscripts and subscripts won't be
983
+ // affected by the height of the accent). We accomplish this by
984
+ // sticking the base of the accent into the base of the supsub, and
985
+ // rendering that, while keeping track of where the accent is.
986
+
987
+ // The supsub group is the group that was passed in
988
+ var supsub = group;
989
+ // The real accent group is the base of the supsub group
990
+ group = supsub.value.base;
991
+ // The character box is the base of the accent group
992
+ base = group.value.base;
993
+ // Stick the character box into the base of the supsub group
994
+ supsub.value.base = base;
995
+
996
+ // Rerender the supsub group with its new base, and store that
997
+ // result.
998
+ supsubGroup = buildGroup(
999
+ supsub, options.reset(), prev);
1000
+ }
1001
+
1002
+ // Build the base group
1003
+ var body = buildGroup(
1004
+ base, options.withStyle(options.style.cramp()));
1005
+
1006
+ // Calculate the skew of the accent. This is based on the line "If the
1007
+ // nucleus is not a single character, let s = 0; otherwise set s to the
1008
+ // kern amount for the nucleus followed by the \skewchar of its font."
1009
+ // Note that our skew metrics are just the kern between each character
1010
+ // and the skewchar.
1011
+ var skew;
1012
+ if (isCharacterBox(base)) {
1013
+ // If the base is a character box, then we want the skew of the
1014
+ // innermost character. To do that, we find the innermost character:
1015
+ var baseChar = getBaseElem(base);
1016
+ // Then, we render its group to get the symbol inside it
1017
+ var baseGroup = buildGroup(
1018
+ baseChar, options.withStyle(options.style.cramp()));
1019
+ // Finally, we pull the skew off of the symbol.
1020
+ skew = baseGroup.skew;
1021
+ // Note that we now throw away baseGroup, because the layers we
1022
+ // removed with getBaseElem might contain things like \color which
1023
+ // we can't get rid of.
1024
+ // TODO(emily): Find a better way to get the skew
1025
+ } else {
1026
+ skew = 0;
1027
+ }
1028
+
1029
+ // calculate the amount of space between the body and the accent
1030
+ var clearance = Math.min(body.height, fontMetrics.metrics.xHeight);
1031
+
1032
+ // Build the accent
1033
+ var accent = buildCommon.makeSymbol(
1034
+ group.value.accent, "Main-Regular", "math", options.getColor());
1035
+ // Remove the italic correction of the accent, because it only serves to
1036
+ // shift the accent over to a place we don't want.
1037
+ accent.italic = 0;
1038
+
1039
+ // The \vec character that the fonts use is a combining character, and
1040
+ // thus shows up much too far to the left. To account for this, we add a
1041
+ // specific class which shifts the accent over to where we want it.
1042
+ // TODO(emily): Fix this in a better way, like by changing the font
1043
+ var vecClass = group.value.accent === "\\vec" ? "accent-vec" : null;
1044
+
1045
+ var accentBody = makeSpan(["accent-body", vecClass], [
1046
+ makeSpan([], [accent])]);
1047
+
1048
+ accentBody = buildCommon.makeVList([
1049
+ {type: "elem", elem: body},
1050
+ {type: "kern", size: -clearance},
1051
+ {type: "elem", elem: accentBody}
1052
+ ], "firstBaseline", null, options);
1053
+
1054
+ // Shift the accent over by the skew. Note we shift by twice the skew
1055
+ // because we are centering the accent, so by adding 2*skew to the left,
1056
+ // we shift it to the right by 1*skew.
1057
+ accentBody.children[1].style.marginLeft = 2 * skew + "em";
1058
+
1059
+ var accentWrap = makeSpan(["mord", "accent"], [accentBody]);
1060
+
1061
+ if (supsubGroup) {
1062
+ // Here, we replace the "base" child of the supsub with our newly
1063
+ // generated accent.
1064
+ supsubGroup.children[0] = accentWrap;
1065
+
1066
+ // Since we don't rerun the height calculation after replacing the
1067
+ // accent, we manually recalculate height.
1068
+ supsubGroup.height = Math.max(accentWrap.height, supsubGroup.height);
1069
+
1070
+ // Accents should always be ords, even when their innards are not.
1071
+ supsubGroup.classes[0] = "mord";
1072
+
1073
+ return supsubGroup;
1074
+ } else {
1075
+ return accentWrap;
1076
+ }
1077
+ }
1078
+ };
1079
+
1080
+ var sizingMultiplier = {
1081
+ size1: 0.5,
1082
+ size2: 0.7,
1083
+ size3: 0.8,
1084
+ size4: 0.9,
1085
+ size5: 1.0,
1086
+ size6: 1.2,
1087
+ size7: 1.44,
1088
+ size8: 1.73,
1089
+ size9: 2.07,
1090
+ size10: 2.49
1091
+ };
1092
+
1093
+ /**
1094
+ * buildGroup is the function that takes a group and calls the correct groupType
1095
+ * function for it. It also handles the interaction of size and style changes
1096
+ * between parents and children.
1097
+ */
1098
+ var buildGroup = function(group, options, prev) {
1099
+ if (!group) {
1100
+ return makeSpan();
1101
+ }
1102
+
1103
+ if (groupTypes[group.type]) {
1104
+ // Call the groupTypes function
1105
+ var groupNode = groupTypes[group.type](group, options, prev);
1106
+ var multiplier;
1107
+
1108
+ // If the style changed between the parent and the current group,
1109
+ // account for the size difference
1110
+ if (options.style !== options.parentStyle) {
1111
+ multiplier = options.style.sizeMultiplier /
1112
+ options.parentStyle.sizeMultiplier;
1113
+
1114
+ groupNode.height *= multiplier;
1115
+ groupNode.depth *= multiplier;
1116
+ }
1117
+
1118
+ // If the size changed between the parent and the current group, account
1119
+ // for that size difference.
1120
+ if (options.size !== options.parentSize) {
1121
+ multiplier = sizingMultiplier[options.size] /
1122
+ sizingMultiplier[options.parentSize];
1123
+
1124
+ groupNode.height *= multiplier;
1125
+ groupNode.depth *= multiplier;
1126
+ }
1127
+
1128
+ return groupNode;
1129
+ } else {
1130
+ throw new ParseError(
1131
+ "Got group of unknown type: '" + group.type + "'");
1132
+ }
1133
+ };
1134
+
1135
+ /**
1136
+ * Take an entire parse tree, and build it into an appropriate set of nodes.
1137
+ */
1138
+ var buildTree = function(tree) {
1139
+ // Setup the default options
1140
+ var options = new Options(Style.TEXT, "size5", "");
1141
+
1142
+ // Build the expression contained in the tree
1143
+ var expression = buildExpression(tree, options);
1144
+ var body = makeSpan(["base", options.style.cls()], expression);
1145
+
1146
+ // Add struts, which ensure that the top of the HTML element falls at the
1147
+ // height of the expression, and the bottom of the HTML element falls at the
1148
+ // depth of the expression.
1149
+ var topStrut = makeSpan(["strut"]);
1150
+ var bottomStrut = makeSpan(["strut", "bottom"]);
1151
+
1152
+ topStrut.style.height = body.height + "em";
1153
+ bottomStrut.style.height = (body.height + body.depth) + "em";
1154
+ // We'd like to use `vertical-align: top` but in IE 9 this lowers the
1155
+ // baseline of the box to the bottom of this strut (instead staying in the
1156
+ // normal place) so we use an absolute value for vertical-align instead
1157
+ bottomStrut.style.verticalAlign = -body.depth + "em";
1158
+
1159
+ // Wrap the struts and body together
1160
+ var katexNode = makeSpan(["katex"], [
1161
+ makeSpan(["katex-inner"], [topStrut, bottomStrut, body])
1162
+ ]);
1163
+
1164
+ return katexNode;
1165
+ };
1166
+
1167
+ module.exports = buildTree;