mathematical 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (263) hide show
  1. checksums.yaml +4 -4
  2. data/ext/mathematical/extconf.rb +14 -0
  3. data/ext/mathematical/itex2MML.h +63 -0
  4. data/ext/mathematical/lasemrender.c +257 -0
  5. data/ext/mathematical/lex.yy.c +6548 -0
  6. data/ext/mathematical/lsm.c +31 -0
  7. data/ext/mathematical/lsm.h +39 -0
  8. data/ext/mathematical/lsmattributes.c +279 -0
  9. data/ext/mathematical/lsmattributes.h +75 -0
  10. data/ext/mathematical/lsmcairo.c +598 -0
  11. data/ext/mathematical/lsmcairo.h +51 -0
  12. data/ext/mathematical/lsmdebug.c +183 -0
  13. data/ext/mathematical/lsmdebug.h +73 -0
  14. data/ext/mathematical/lsmdom.h +43 -0
  15. data/ext/mathematical/lsmdomcharacterdata.c +114 -0
  16. data/ext/mathematical/lsmdomcharacterdata.h +59 -0
  17. data/ext/mathematical/lsmdomdocument.c +255 -0
  18. data/ext/mathematical/lsmdomdocument.h +75 -0
  19. data/ext/mathematical/lsmdomdocumentfragment.c +81 -0
  20. data/ext/mathematical/lsmdomdocumentfragment.h +55 -0
  21. data/ext/mathematical/lsmdomelement.c +148 -0
  22. data/ext/mathematical/lsmdomelement.h +62 -0
  23. data/ext/mathematical/lsmdomentities.c +2166 -0
  24. data/ext/mathematical/lsmdomentities.h +35 -0
  25. data/ext/mathematical/lsmdomenumtypes.c +99 -0
  26. data/ext/mathematical/lsmdomenumtypes.h +26 -0
  27. data/ext/mathematical/lsmdomimplementation.c +82 -0
  28. data/ext/mathematical/lsmdomimplementation.h +41 -0
  29. data/ext/mathematical/lsmdomnamednodemap.c +118 -0
  30. data/ext/mathematical/lsmdomnamednodemap.h +64 -0
  31. data/ext/mathematical/lsmdomnode.c +737 -0
  32. data/ext/mathematical/lsmdomnode.h +122 -0
  33. data/ext/mathematical/lsmdomnodelist.c +70 -0
  34. data/ext/mathematical/lsmdomnodelist.h +58 -0
  35. data/ext/mathematical/lsmdomparser.c +461 -0
  36. data/ext/mathematical/lsmdomparser.h +54 -0
  37. data/ext/mathematical/lsmdomtext.c +82 -0
  38. data/ext/mathematical/lsmdomtext.h +55 -0
  39. data/ext/mathematical/lsmdomtypes.h +44 -0
  40. data/ext/mathematical/lsmdomview.c +422 -0
  41. data/ext/mathematical/lsmdomview.h +94 -0
  42. data/ext/mathematical/lsmitex.c +76 -0
  43. data/ext/mathematical/lsmitex.h +36 -0
  44. data/ext/mathematical/lsmmathml.h +66 -0
  45. data/ext/mathematical/lsmmathmlactionelement.c +93 -0
  46. data/ext/mathematical/lsmmathmlactionelement.h +57 -0
  47. data/ext/mathematical/lsmmathmlaligngroupelement.c +102 -0
  48. data/ext/mathematical/lsmmathmlaligngroupelement.h +56 -0
  49. data/ext/mathematical/lsmmathmlalignmarkelement.c +102 -0
  50. data/ext/mathematical/lsmmathmlalignmarkelement.h +56 -0
  51. data/ext/mathematical/lsmmathmlattributes.c +197 -0
  52. data/ext/mathematical/lsmmathmlattributes.h +126 -0
  53. data/ext/mathematical/lsmmathmldocument.c +304 -0
  54. data/ext/mathematical/lsmmathmldocument.h +61 -0
  55. data/ext/mathematical/lsmmathmlelement.c +491 -0
  56. data/ext/mathematical/lsmmathmlelement.h +107 -0
  57. data/ext/mathematical/lsmmathmlenums.c +429 -0
  58. data/ext/mathematical/lsmmathmlenums.h +182 -0
  59. data/ext/mathematical/lsmmathmlenumtypes.c +666 -0
  60. data/ext/mathematical/lsmmathmlenumtypes.h +90 -0
  61. data/ext/mathematical/lsmmathmlerrorelement.c +58 -0
  62. data/ext/mathematical/lsmmathmlerrorelement.h +56 -0
  63. data/ext/mathematical/lsmmathmlfencedelement.c +178 -0
  64. data/ext/mathematical/lsmmathmlfencedelement.h +65 -0
  65. data/ext/mathematical/lsmmathmlfractionelement.c +253 -0
  66. data/ext/mathematical/lsmmathmlfractionelement.h +62 -0
  67. data/ext/mathematical/lsmmathmlglyphtableams.c +597 -0
  68. data/ext/mathematical/lsmmathmlglyphtableams.h +45 -0
  69. data/ext/mathematical/lsmmathmlitexelement.c +187 -0
  70. data/ext/mathematical/lsmmathmlitexelement.h +60 -0
  71. data/ext/mathematical/lsmmathmllayoututils.c +191 -0
  72. data/ext/mathematical/lsmmathmllayoututils.h +58 -0
  73. data/ext/mathematical/lsmmathmlmathelement.c +204 -0
  74. data/ext/mathematical/lsmmathmlmathelement.h +81 -0
  75. data/ext/mathematical/lsmmathmloperatordictionary.c +3332 -0
  76. data/ext/mathematical/lsmmathmloperatordictionary.h +54 -0
  77. data/ext/mathematical/lsmmathmloperatorelement.c +307 -0
  78. data/ext/mathematical/lsmmathmloperatorelement.h +73 -0
  79. data/ext/mathematical/lsmmathmlpaddedelement.c +58 -0
  80. data/ext/mathematical/lsmmathmlpaddedelement.h +56 -0
  81. data/ext/mathematical/lsmmathmlphantomelement.c +71 -0
  82. data/ext/mathematical/lsmmathmlphantomelement.h +56 -0
  83. data/ext/mathematical/lsmmathmlpresentationcontainer.c +43 -0
  84. data/ext/mathematical/lsmmathmlpresentationcontainer.h +54 -0
  85. data/ext/mathematical/lsmmathmlpresentationtoken.c +303 -0
  86. data/ext/mathematical/lsmmathmlpresentationtoken.h +83 -0
  87. data/ext/mathematical/lsmmathmlradicalelement.c +266 -0
  88. data/ext/mathematical/lsmmathmlradicalelement.h +71 -0
  89. data/ext/mathematical/lsmmathmlrowelement.c +58 -0
  90. data/ext/mathematical/lsmmathmlrowelement.h +56 -0
  91. data/ext/mathematical/lsmmathmlscriptelement.c +282 -0
  92. data/ext/mathematical/lsmmathmlscriptelement.h +78 -0
  93. data/ext/mathematical/lsmmathmlsemanticselement.c +84 -0
  94. data/ext/mathematical/lsmmathmlsemanticselement.h +56 -0
  95. data/ext/mathematical/lsmmathmlspaceelement.c +142 -0
  96. data/ext/mathematical/lsmmathmlspaceelement.h +60 -0
  97. data/ext/mathematical/lsmmathmlstringelement.c +123 -0
  98. data/ext/mathematical/lsmmathmlstringelement.h +58 -0
  99. data/ext/mathematical/lsmmathmlstyle.c +130 -0
  100. data/ext/mathematical/lsmmathmlstyle.h +81 -0
  101. data/ext/mathematical/lsmmathmlstyleelement.c +307 -0
  102. data/ext/mathematical/lsmmathmlstyleelement.h +87 -0
  103. data/ext/mathematical/lsmmathmltablecellelement.c +122 -0
  104. data/ext/mathematical/lsmmathmltablecellelement.h +62 -0
  105. data/ext/mathematical/lsmmathmltableelement.c +545 -0
  106. data/ext/mathematical/lsmmathmltableelement.h +78 -0
  107. data/ext/mathematical/lsmmathmltablerowelement.c +120 -0
  108. data/ext/mathematical/lsmmathmltablerowelement.h +64 -0
  109. data/ext/mathematical/lsmmathmltraits.c +819 -0
  110. data/ext/mathematical/lsmmathmltraits.h +119 -0
  111. data/ext/mathematical/lsmmathmltypes.h +66 -0
  112. data/ext/mathematical/lsmmathmlunderoverelement.c +485 -0
  113. data/ext/mathematical/lsmmathmlunderoverelement.h +82 -0
  114. data/ext/mathematical/lsmmathmlutils.c +170 -0
  115. data/ext/mathematical/lsmmathmlutils.h +50 -0
  116. data/ext/mathematical/lsmmathmlview.c +1048 -0
  117. data/ext/mathematical/lsmmathmlview.h +164 -0
  118. data/ext/mathematical/lsmproperties.c +418 -0
  119. data/ext/mathematical/lsmproperties.h +85 -0
  120. data/ext/mathematical/lsmstr.c +231 -0
  121. data/ext/mathematical/lsmstr.h +114 -0
  122. data/ext/mathematical/lsmsvg.h +67 -0
  123. data/ext/mathematical/lsmsvgaelement.c +73 -0
  124. data/ext/mathematical/lsmsvgaelement.h +55 -0
  125. data/ext/mathematical/lsmsvgattributes.h +118 -0
  126. data/ext/mathematical/lsmsvgcircleelement.c +153 -0
  127. data/ext/mathematical/lsmsvgcircleelement.h +59 -0
  128. data/ext/mathematical/lsmsvgclippathelement.c +134 -0
  129. data/ext/mathematical/lsmsvgclippathelement.h +59 -0
  130. data/ext/mathematical/lsmsvgcolors.c +212 -0
  131. data/ext/mathematical/lsmsvgcolors.h +39 -0
  132. data/ext/mathematical/lsmsvgdefselement.c +74 -0
  133. data/ext/mathematical/lsmsvgdefselement.h +55 -0
  134. data/ext/mathematical/lsmsvgdocument.c +288 -0
  135. data/ext/mathematical/lsmsvgdocument.h +64 -0
  136. data/ext/mathematical/lsmsvgelement.c +373 -0
  137. data/ext/mathematical/lsmsvgelement.h +81 -0
  138. data/ext/mathematical/lsmsvgellipseelement.c +158 -0
  139. data/ext/mathematical/lsmsvgellipseelement.h +60 -0
  140. data/ext/mathematical/lsmsvgenums.c +544 -0
  141. data/ext/mathematical/lsmsvgenums.h +357 -0
  142. data/ext/mathematical/lsmsvgenumtypes.c +1083 -0
  143. data/ext/mathematical/lsmsvgenumtypes.h +111 -0
  144. data/ext/mathematical/lsmsvgfilterblend.c +105 -0
  145. data/ext/mathematical/lsmsvgfilterblend.h +58 -0
  146. data/ext/mathematical/lsmsvgfiltercomposite.c +109 -0
  147. data/ext/mathematical/lsmsvgfiltercomposite.h +58 -0
  148. data/ext/mathematical/lsmsvgfilterelement.c +266 -0
  149. data/ext/mathematical/lsmsvgfilterelement.h +66 -0
  150. data/ext/mathematical/lsmsvgfilterflood.c +86 -0
  151. data/ext/mathematical/lsmsvgfilterflood.h +55 -0
  152. data/ext/mathematical/lsmsvgfiltergaussianblur.c +114 -0
  153. data/ext/mathematical/lsmsvgfiltergaussianblur.h +57 -0
  154. data/ext/mathematical/lsmsvgfiltermerge.c +98 -0
  155. data/ext/mathematical/lsmsvgfiltermerge.h +55 -0
  156. data/ext/mathematical/lsmsvgfiltermergenode.c +87 -0
  157. data/ext/mathematical/lsmsvgfiltermergenode.h +57 -0
  158. data/ext/mathematical/lsmsvgfilteroffset.c +112 -0
  159. data/ext/mathematical/lsmsvgfilteroffset.h +58 -0
  160. data/ext/mathematical/lsmsvgfilterprimitive.c +168 -0
  161. data/ext/mathematical/lsmsvgfilterprimitive.h +66 -0
  162. data/ext/mathematical/lsmsvgfilterspecularlighting.c +127 -0
  163. data/ext/mathematical/lsmsvgfilterspecularlighting.h +60 -0
  164. data/ext/mathematical/lsmsvgfiltersurface.c +455 -0
  165. data/ext/mathematical/lsmsvgfiltersurface.h +66 -0
  166. data/ext/mathematical/lsmsvgfiltertile.c +102 -0
  167. data/ext/mathematical/lsmsvgfiltertile.h +57 -0
  168. data/ext/mathematical/lsmsvggelement.c +73 -0
  169. data/ext/mathematical/lsmsvggelement.h +55 -0
  170. data/ext/mathematical/lsmsvggradientelement.c +151 -0
  171. data/ext/mathematical/lsmsvggradientelement.h +68 -0
  172. data/ext/mathematical/lsmsvgimageelement.c +261 -0
  173. data/ext/mathematical/lsmsvgimageelement.h +67 -0
  174. data/ext/mathematical/lsmsvglength.c +152 -0
  175. data/ext/mathematical/lsmsvglength.h +65 -0
  176. data/ext/mathematical/lsmsvglineargradientelement.c +271 -0
  177. data/ext/mathematical/lsmsvglineargradientelement.h +60 -0
  178. data/ext/mathematical/lsmsvglineelement.c +153 -0
  179. data/ext/mathematical/lsmsvglineelement.h +60 -0
  180. data/ext/mathematical/lsmsvgmarkerelement.c +266 -0
  181. data/ext/mathematical/lsmsvgmarkerelement.h +74 -0
  182. data/ext/mathematical/lsmsvgmaskelement.c +232 -0
  183. data/ext/mathematical/lsmsvgmaskelement.h +64 -0
  184. data/ext/mathematical/lsmsvgmatrix.c +205 -0
  185. data/ext/mathematical/lsmsvgmatrix.h +59 -0
  186. data/ext/mathematical/lsmsvgpathelement.c +115 -0
  187. data/ext/mathematical/lsmsvgpathelement.h +59 -0
  188. data/ext/mathematical/lsmsvgpatternelement.c +398 -0
  189. data/ext/mathematical/lsmsvgpatternelement.h +69 -0
  190. data/ext/mathematical/lsmsvgpolygonelement.c +106 -0
  191. data/ext/mathematical/lsmsvgpolygonelement.h +57 -0
  192. data/ext/mathematical/lsmsvgpolylineelement.c +106 -0
  193. data/ext/mathematical/lsmsvgpolylineelement.h +57 -0
  194. data/ext/mathematical/lsmsvgradialgradientelement.c +323 -0
  195. data/ext/mathematical/lsmsvgradialgradientelement.h +61 -0
  196. data/ext/mathematical/lsmsvgrectelement.c +184 -0
  197. data/ext/mathematical/lsmsvgrectelement.h +62 -0
  198. data/ext/mathematical/lsmsvgstopelement.c +106 -0
  199. data/ext/mathematical/lsmsvgstopelement.h +57 -0
  200. data/ext/mathematical/lsmsvgstyle.c +560 -0
  201. data/ext/mathematical/lsmsvgstyle.h +217 -0
  202. data/ext/mathematical/lsmsvgsvgelement.c +260 -0
  203. data/ext/mathematical/lsmsvgsvgelement.h +71 -0
  204. data/ext/mathematical/lsmsvgswitchelement.c +103 -0
  205. data/ext/mathematical/lsmsvgswitchelement.h +55 -0
  206. data/ext/mathematical/lsmsvgsymbolelement.c +74 -0
  207. data/ext/mathematical/lsmsvgsymbolelement.h +55 -0
  208. data/ext/mathematical/lsmsvgtextelement.c +203 -0
  209. data/ext/mathematical/lsmsvgtextelement.h +60 -0
  210. data/ext/mathematical/lsmsvgtraits.c +1232 -0
  211. data/ext/mathematical/lsmsvgtraits.h +104 -0
  212. data/ext/mathematical/lsmsvgtransformable.c +106 -0
  213. data/ext/mathematical/lsmsvgtransformable.h +54 -0
  214. data/ext/mathematical/lsmsvgtspanelement.c +174 -0
  215. data/ext/mathematical/lsmsvgtspanelement.h +60 -0
  216. data/ext/mathematical/lsmsvgtypes.h +77 -0
  217. data/ext/mathematical/lsmsvguseelement.c +237 -0
  218. data/ext/mathematical/lsmsvguseelement.h +69 -0
  219. data/ext/mathematical/lsmsvgview.c +2583 -0
  220. data/ext/mathematical/lsmsvgview.h +179 -0
  221. data/ext/mathematical/lsmtraits.c +119 -0
  222. data/ext/mathematical/lsmtraits.h +49 -0
  223. data/ext/mathematical/lsmtypes.h +36 -0
  224. data/ext/mathematical/lsmutils.c +54 -0
  225. data/ext/mathematical/lsmutils.h +56 -0
  226. data/ext/mathematical/mathematical.c +145 -0
  227. data/ext/mathematical/y.tab.c +6179 -0
  228. data/ext/mathematical/y.tab.h +389 -0
  229. data/lib/mathematical/version.rb +1 -1
  230. data/mathematical.gemspec +8 -6
  231. data/test/mathematical/basic_test.rb +9 -0
  232. data/test/mathematical/fixtures/after/brackets_display.html +1 -0
  233. data/test/mathematical/fixtures/after/compliance_accents.html +17 -0
  234. data/test/mathematical/fixtures/after/compliance_arrows.html +71 -0
  235. data/test/mathematical/fixtures/after/compliance_colors.html +4 -0
  236. data/test/mathematical/fixtures/after/compliance_greek_letters.html +42 -0
  237. data/test/mathematical/fixtures/after/compliance_large_math.html +19 -0
  238. data/test/mathematical/fixtures/after/compliance_log_symbols.html +34 -0
  239. data/test/mathematical/fixtures/after/compliance_operators.html +262 -0
  240. data/test/mathematical/fixtures/after/dollar_sign_inline.html +1 -0
  241. data/test/mathematical/fixtures/after/equation_display.html +1 -0
  242. data/test/mathematical/fixtures/after/multiple_dollar_inline.html +1 -0
  243. data/test/mathematical/fixtures/after/parens_inline.html +1 -0
  244. data/test/mathematical/fixtures/before/brackets_display.text +1 -0
  245. data/test/mathematical/fixtures/before/compliance_accents.text +17 -0
  246. data/test/mathematical/fixtures/before/compliance_arrows.text +71 -0
  247. data/test/mathematical/fixtures/before/compliance_colors.text +4 -0
  248. data/test/mathematical/fixtures/before/compliance_greek_letters.text +42 -0
  249. data/test/mathematical/fixtures/before/compliance_large_math.text +19 -0
  250. data/test/mathematical/fixtures/before/compliance_log_symbols.text +34 -0
  251. data/test/mathematical/fixtures/before/compliance_operators.text +262 -0
  252. data/test/mathematical/fixtures/before/dollar_sign_inline.text +1 -0
  253. data/test/mathematical/fixtures/before/equation_display.text +1 -0
  254. data/test/mathematical/fixtures/before/multiple_dollar_inline.text +1 -0
  255. data/test/mathematical/fixtures/before/parens_inline.text +1 -0
  256. data/test/mathematical/fixtures/performance/big_file.text +1767 -0
  257. data/test/mathematical/fixtures_test.rb +45 -0
  258. data/test/mathematical/maliciousness_test.rb +45 -0
  259. data/test/mathematical/performance_test.rb +15 -0
  260. data/test/test_helper.rb +5 -0
  261. metadata +301 -14
  262. data/lib/mathematical.bundle +0 -0
  263. data/lib/mathematical/mathematical.bundle +0 -0
@@ -0,0 +1,253 @@
1
+ /* Lasem
2
+ *
3
+ * Copyright © 2007-2008 Emmanuel Pacaud
4
+ *
5
+ * This library is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2 of the License, or (at your option) any later version.
9
+ *
10
+ * This library is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ * Lesser General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Lesser General
16
+ * Public License along with this library; if not, write to the
17
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18
+ * Boston, MA 02111-1307, USA.
19
+ *
20
+ * Author:
21
+ * Emmanuel Pacaud <emmanuel@gnome.org>
22
+ */
23
+
24
+ #include <lsmmathmlfractionelement.h>
25
+ #include <lsmmathmlview.h>
26
+
27
+ static GObjectClass *parent_class;
28
+
29
+ /* LsmDomNode implementation */
30
+
31
+ static const char *
32
+ lsm_mathml_fraction_element_get_node_name (LsmDomNode *node)
33
+ {
34
+ return "mfrac";
35
+ }
36
+
37
+ static gboolean
38
+ lsm_mathml_fraction_element_can_append_child (LsmDomNode *self, LsmDomNode *child)
39
+ {
40
+ return (LSM_IS_MATHML_ELEMENT (child) &&
41
+ (self->first_child == NULL ||
42
+ self->first_child->next_sibling == NULL));
43
+ }
44
+
45
+ /* LsmMathmlElement implementation */
46
+
47
+ static void
48
+ lsm_mathml_fraction_element_update (LsmMathmlElement *self, LsmMathmlStyle *style)
49
+ {
50
+ LsmMathmlFractionElement *fraction = LSM_MATHML_FRACTION_ELEMENT (self);
51
+ LsmMathmlLength length;
52
+
53
+ length.unit = LSM_MATHML_UNIT_PT;
54
+
55
+ length.value = style->line_thickness;
56
+ style->line_thickness = lsm_mathml_length_attribute_normalize (&fraction->line_thickness,
57
+ style->line_thickness,
58
+ &length, style);
59
+
60
+ fraction->display = style->display;
61
+ }
62
+
63
+ static gboolean
64
+ lsm_mathml_fraction_element_update_children (LsmMathmlElement *self, LsmMathmlStyle *style)
65
+ {
66
+ if (style->display == LSM_MATHML_DISPLAY_INLINE)
67
+ lsm_mathml_style_change_script_level (style, +1);
68
+ else
69
+ style->display = LSM_MATHML_DISPLAY_INLINE;
70
+
71
+ return LSM_MATHML_ELEMENT_CLASS (parent_class)->update_children (self, style);
72
+ }
73
+
74
+ static const LsmMathmlBbox *
75
+ lsm_mathml_fraction_element_measure (LsmMathmlElement *self, LsmMathmlView *view, const LsmMathmlBbox *bbox)
76
+ {
77
+ LsmMathmlFractionElement *fraction = LSM_MATHML_FRACTION_ELEMENT (self);
78
+ LsmDomNode *node;
79
+ const LsmMathmlBbox *child_bbox;
80
+ double h_space;
81
+ double v_space;
82
+ double length, dividend_offset, divisor_offset;
83
+
84
+ fraction->axis_offset = lsm_mathml_view_measure_axis_offset (view, self->style.math_size);
85
+
86
+ if (fraction->display == LSM_MATHML_DISPLAY_INLINE)
87
+ v_space = self->style.math_size * LSM_MATHML_SPACE_EM_VERY_THIN;
88
+ else
89
+ v_space = self->style.math_size * LSM_MATHML_SPACE_EM_MEDIUM;
90
+ h_space = self->style.math_size * LSM_MATHML_SPACE_EM_VERY_THIN;
91
+
92
+ self->bbox.is_defined = TRUE;
93
+ self->bbox.depth = - (fraction->axis_offset - v_space - 0.5 * fraction->line_thickness.value);
94
+
95
+ self->bbox.width = 0.0;
96
+ self->bbox.height = fraction->axis_offset + v_space + 0.5 * fraction->line_thickness.value;
97
+
98
+ node = LSM_DOM_NODE (self)->first_child;
99
+
100
+ if (node == NULL)
101
+ return &self->bbox;
102
+
103
+ child_bbox = lsm_mathml_element_measure (LSM_MATHML_ELEMENT (node), view, NULL);
104
+ lsm_mathml_view_get_font_metrics (view, &LSM_MATHML_ELEMENT (node)->style, NULL, &length);
105
+
106
+ if (fraction->display == LSM_MATHML_DISPLAY_INLINE)
107
+ length *= 0.5;
108
+
109
+ if (child_bbox->depth < length)
110
+ dividend_offset = length - child_bbox->depth;
111
+ else
112
+ dividend_offset = 0.0;
113
+
114
+ lsm_mathml_bbox_add_over (&self->bbox, child_bbox);
115
+
116
+ node = node->next_sibling;
117
+
118
+ if (node == NULL)
119
+ return &self->bbox;
120
+
121
+ child_bbox = lsm_mathml_element_measure (LSM_MATHML_ELEMENT (node), view, NULL);
122
+ lsm_mathml_view_get_font_metrics (view, &LSM_MATHML_ELEMENT (node)->style, &length, NULL);
123
+ if (child_bbox->height < length)
124
+ divisor_offset = length - child_bbox->height;
125
+ else
126
+ divisor_offset = 0.0;
127
+
128
+ lsm_mathml_bbox_add_under (&self->bbox, child_bbox);
129
+
130
+ self->bbox.height += dividend_offset;
131
+ self->bbox.depth += divisor_offset;
132
+ self->bbox.width += 2.0 * h_space;
133
+
134
+ return &self->bbox;
135
+ }
136
+
137
+ static void
138
+ lsm_mathml_fraction_element_layout (LsmMathmlElement *self, LsmMathmlView *view,
139
+ double x, double y, const LsmMathmlBbox *bbox)
140
+ {
141
+ LsmDomNode *node;
142
+ const LsmMathmlBbox *child_bbox;
143
+
144
+ node = LSM_DOM_NODE (self)->first_child;
145
+
146
+ if (node != NULL) {
147
+ child_bbox = lsm_mathml_element_get_bbox (LSM_MATHML_ELEMENT (node));
148
+ lsm_mathml_element_layout (LSM_MATHML_ELEMENT (node), view,
149
+ x + (bbox->width - child_bbox->width) / 2.0,
150
+ y - self->bbox.height + child_bbox->height,
151
+ child_bbox);
152
+
153
+ node = node->next_sibling;
154
+ if (node != NULL) {
155
+ child_bbox = lsm_mathml_element_get_bbox (LSM_MATHML_ELEMENT (node));
156
+ lsm_mathml_element_layout (LSM_MATHML_ELEMENT (node), view,
157
+ x + (bbox->width - child_bbox->width) / 2.0,
158
+ y + self->bbox.depth - child_bbox->depth,
159
+ child_bbox);
160
+ }
161
+ }
162
+ }
163
+
164
+ static void
165
+ lsm_mathml_fraction_element_render (LsmMathmlElement *self, LsmMathmlView *view)
166
+ {
167
+ LsmMathmlFractionElement *fraction = LSM_MATHML_FRACTION_ELEMENT (self);
168
+ double h_space;
169
+
170
+ h_space = self->style.math_size * LSM_MATHML_SPACE_EM_VERY_THIN;
171
+
172
+ lsm_mathml_view_show_fraction_line (view, &self->style,
173
+ self->x + h_space,
174
+ self->y - fraction->axis_offset,
175
+ self->bbox.width - 2.0 * h_space,
176
+ fraction->line_thickness.value);
177
+
178
+ LSM_MATHML_ELEMENT_CLASS (parent_class)->render (self, view);
179
+ }
180
+
181
+ static LsmMathmlOperatorElement *
182
+ lsm_mathml_fraction_element_get_embellished_core (const LsmMathmlElement *self)
183
+ {
184
+ if (LSM_DOM_NODE (self)->first_child != NULL)
185
+ return lsm_mathml_element_get_embellished_core (LSM_MATHML_ELEMENT (LSM_DOM_NODE (self)->first_child));
186
+
187
+ return NULL;
188
+ }
189
+
190
+ /* LsmMathmlFraction implementation */
191
+
192
+ static const gboolean bevelled_default = FALSE;
193
+
194
+ LsmDomNode *
195
+ lsm_mathml_fraction_element_new (void)
196
+ {
197
+ return g_object_new (LSM_TYPE_MATHML_FRACTION_ELEMENT, NULL);
198
+ }
199
+
200
+ static const LsmMathmlLength length_default = {1.0, LSM_MATHML_UNIT_NONE};
201
+
202
+ static void
203
+ lsm_mathml_fraction_element_init (LsmMathmlFractionElement *self)
204
+ {
205
+ self->axis_offset = 0.0;
206
+
207
+ self->bevelled.value = bevelled_default;
208
+ self->line_thickness.length = length_default;
209
+ }
210
+
211
+ /* LsmMathmlFractionElement class */
212
+
213
+ static const LsmAttributeInfos _attribute_infos[] = {
214
+ {
215
+ .name = "bevelled",
216
+ .attribute_offset = offsetof (LsmMathmlFractionElement, bevelled),
217
+ .trait_class = &lsm_mathml_boolean_trait_class,
218
+ .trait_default = &bevelled_default
219
+ },
220
+ {
221
+ .name = "linethickness",
222
+ .attribute_offset = offsetof (LsmMathmlFractionElement, line_thickness),
223
+ .trait_class = &lsm_mathml_length_trait_class,
224
+ .trait_default = &length_default
225
+ },
226
+ };
227
+
228
+ static void
229
+ lsm_mathml_fraction_element_class_init (LsmMathmlFractionElementClass *fraction_class)
230
+ {
231
+ LsmDomNodeClass *d_node_class = LSM_DOM_NODE_CLASS (fraction_class);
232
+ LsmMathmlElementClass *m_element_class = LSM_MATHML_ELEMENT_CLASS (fraction_class);
233
+
234
+ parent_class = g_type_class_peek_parent (fraction_class);
235
+
236
+ d_node_class->get_node_name = lsm_mathml_fraction_element_get_node_name;
237
+ d_node_class->can_append_child = lsm_mathml_fraction_element_can_append_child;
238
+
239
+ m_element_class->update = lsm_mathml_fraction_element_update;
240
+ m_element_class->update_children = lsm_mathml_fraction_element_update_children;
241
+ m_element_class->measure = lsm_mathml_fraction_element_measure;
242
+ m_element_class->layout = lsm_mathml_fraction_element_layout;
243
+ m_element_class->render = lsm_mathml_fraction_element_render;
244
+ m_element_class->get_embellished_core = lsm_mathml_fraction_element_get_embellished_core;
245
+ m_element_class->is_inferred_row = NULL;
246
+ m_element_class->attribute_manager = lsm_attribute_manager_duplicate (m_element_class->attribute_manager);
247
+
248
+ lsm_attribute_manager_add_attributes (m_element_class->attribute_manager,
249
+ G_N_ELEMENTS (_attribute_infos),
250
+ _attribute_infos);
251
+ }
252
+
253
+ G_DEFINE_TYPE (LsmMathmlFractionElement, lsm_mathml_fraction_element, LSM_TYPE_MATHML_ELEMENT)
@@ -0,0 +1,62 @@
1
+ /* Lasem
2
+ *
3
+ * Copyright © 2007-2008 Emmanuel Pacaud
4
+ *
5
+ * This library is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2 of the License, or (at your option) any later version.
9
+ *
10
+ * This library is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ * Lesser General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Lesser General
16
+ * Public License along with this library; if not, write to the
17
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18
+ * Boston, MA 02111-1307, USA.
19
+ *
20
+ * Author:
21
+ * Emmanuel Pacaud <emmanuel@gnome.org>
22
+ */
23
+
24
+ #ifndef LSM_MATHML_FRACTION_ELEMENT_H
25
+ #define LSM_MATHML_FRACTION_ELEMENT_H
26
+
27
+ #include <lsmmathmltypes.h>
28
+ #include <lsmmathmlpresentationcontainer.h>
29
+
30
+ G_BEGIN_DECLS
31
+
32
+ #define LSM_TYPE_MATHML_FRACTION_ELEMENT (lsm_mathml_fraction_element_get_type ())
33
+ #define LSM_MATHML_FRACTION_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LSM_TYPE_MATHML_FRACTION_ELEMENT, LsmMathmlFractionElement))
34
+ #define LSM_MATHML_FRACTION_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LSM_TYPE_MATHML_FRACTION_ELEMENT, LsmMathmlFractionElementClass))
35
+ #define LSM_IS_MATHML_FRACTION_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LSM_TYPE_MATHML_FRACTION_ELEMENT))
36
+ #define LSM_IS_MATHML_FRACTION_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LSM_TYPE_MATHML_FRACTION_ELEMENT))
37
+ #define LSM_MATHML_FRACTION_ELEMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), LSM_TYPE_MATHML_FRACTION_ELEMENT, LsmMathmlFractionElementClass))
38
+
39
+ typedef struct _LsmMathmlFractionElementClass LsmMathmlFractionElementClass;
40
+
41
+ struct _LsmMathmlFractionElement {
42
+ LsmMathmlElement presentation_container;
43
+
44
+ LsmMathmlLengthAttribute line_thickness;
45
+ LsmMathmlBooleanAttribute bevelled;
46
+
47
+ LsmMathmlDisplay display;
48
+ double axis_offset;
49
+ };
50
+
51
+ struct _LsmMathmlFractionElementClass {
52
+ LsmMathmlElementClass parent_class;
53
+ };
54
+
55
+ GType lsm_mathml_fraction_element_get_type (void);
56
+
57
+ LsmDomNode *lsm_mathml_fraction_element_new (void);
58
+
59
+ G_END_DECLS
60
+
61
+ #endif
62
+
@@ -0,0 +1,597 @@
1
+ /* Lasem
2
+ *
3
+ * Copyright © 2007-2008 Emmanuel Pacaud
4
+ *
5
+ * This library is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2 of the License, or (at your option) any later version.
9
+ *
10
+ * This library is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ * Lesser General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Lesser General
16
+ * Public License along with this library; if not, write to the
17
+ * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18
+ * Boston, MA 02111-1307, USA.
19
+ *
20
+ * Author:
21
+ * Emmanuel Pacaud <emmanuel@gnome.org>
22
+ */
23
+
24
+ #include <lsmdebug.h>
25
+ #include <lsmmathmlglyphtableams.h>
26
+ #include <string.h>
27
+ #include <math.h>
28
+
29
+ const LsmMathmlOperatorGlyph AMS_table[] = {
30
+ {
31
+ LSM_MATHML_RADICAL_UTF8, /* radical */
32
+ LSM_MATHML_GLYPH_FLAG_STRETCH_VERTICAL |
33
+ LSM_MATHML_GLYPH_FLAG_TYPE_SIZED,
34
+ {LSM_MATHML_FONT_CMEX10, "t"},
35
+ {LSM_MATHML_FONT_ERROR, ""},
36
+ {LSM_MATHML_FONT_CMEX10, "v"},
37
+ {LSM_MATHML_FONT_CMEX10, "u"},
38
+ 4,
39
+ {
40
+ {LSM_MATHML_FONT_CMEX10, "p"},
41
+ {LSM_MATHML_FONT_CMEX10, "q"},
42
+ {LSM_MATHML_FONT_CMEX10, "r"},
43
+ {LSM_MATHML_FONT_CMEX10, "s"}
44
+ }
45
+ },
46
+ {
47
+ "(",
48
+ LSM_MATHML_GLYPH_FLAG_STRETCH_VERTICAL |
49
+ LSM_MATHML_GLYPH_FLAG_TYPE_SIZED |
50
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS,
51
+ {LSM_MATHML_FONT_CMEX10, "0"},
52
+ {LSM_MATHML_FONT_ERROR, ""},
53
+ {LSM_MATHML_FONT_CMEX10, "@"},
54
+ {LSM_MATHML_FONT_CMEX10, "B"},
55
+ 5,
56
+ {
57
+ {LSM_MATHML_FONT_CMR10, "("},
58
+ {LSM_MATHML_FONT_CMEX10, "\xc2\xa1"},
59
+ {LSM_MATHML_FONT_CMEX10, "\xc2\xb3"},
60
+ {LSM_MATHML_FONT_CMEX10, "\xc2\xb5"},
61
+ {LSM_MATHML_FONT_CMEX10, "\xc3\x83"}
62
+ }
63
+ },
64
+ {
65
+ ")",
66
+ LSM_MATHML_GLYPH_FLAG_STRETCH_VERTICAL |
67
+ LSM_MATHML_GLYPH_FLAG_TYPE_SIZED |
68
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS,
69
+ {LSM_MATHML_FONT_CMEX10, "1"},
70
+ {LSM_MATHML_FONT_ERROR, ""},
71
+ {LSM_MATHML_FONT_CMEX10, "A"},
72
+ {LSM_MATHML_FONT_CMEX10, "C"},
73
+ 5,
74
+ {
75
+ {LSM_MATHML_FONT_CMR10, ")"},
76
+ {LSM_MATHML_FONT_CMEX10, "\xc2\xa2"},
77
+ {LSM_MATHML_FONT_CMEX10, "\xc2\xb4"},
78
+ {LSM_MATHML_FONT_CMEX10, "\xc2\xb6"},
79
+ {LSM_MATHML_FONT_CMEX10, "!"}
80
+ }
81
+ },
82
+ {
83
+ "{",
84
+ LSM_MATHML_GLYPH_FLAG_STRETCH_VERTICAL |
85
+ LSM_MATHML_GLYPH_FLAG_TYPE_SIZED |
86
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS,
87
+ {LSM_MATHML_FONT_CMEX10, "8"},
88
+ {LSM_MATHML_FONT_CMEX10, "<"},
89
+ {LSM_MATHML_FONT_CMEX10, ":"},
90
+ {LSM_MATHML_FONT_CMEX10, ">"},
91
+ 5,
92
+ {
93
+ {LSM_MATHML_FONT_CMSY10, "f"},
94
+ {LSM_MATHML_FONT_CMEX10, "\xc2\xa9"},
95
+ {LSM_MATHML_FONT_CMEX10, "n"},
96
+ {LSM_MATHML_FONT_CMEX10, "\xc2\xbd"},
97
+ {LSM_MATHML_FONT_CMEX10, "("}
98
+ }
99
+ },
100
+ {
101
+ "}",
102
+ LSM_MATHML_GLYPH_FLAG_STRETCH_VERTICAL |
103
+ LSM_MATHML_GLYPH_FLAG_TYPE_SIZED |
104
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS,
105
+ {LSM_MATHML_FONT_CMEX10, "9"},
106
+ {LSM_MATHML_FONT_CMEX10, "="},
107
+ {LSM_MATHML_FONT_CMEX10, ";"},
108
+ {LSM_MATHML_FONT_CMEX10, ">"},
109
+ 5,
110
+ {
111
+ {LSM_MATHML_FONT_CMSY10, "g"},
112
+ {LSM_MATHML_FONT_CMEX10, "\xc2\xaa"},
113
+ {LSM_MATHML_FONT_CMEX10, "o"},
114
+ {LSM_MATHML_FONT_CMEX10, "\xc2\xbe"},
115
+ {LSM_MATHML_FONT_CMEX10, ")"}
116
+ }
117
+ },
118
+ {
119
+ "[",
120
+ LSM_MATHML_GLYPH_FLAG_STRETCH_VERTICAL |
121
+ LSM_MATHML_GLYPH_FLAG_TYPE_SIZED |
122
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS,
123
+ {LSM_MATHML_FONT_CMEX10, "2"},
124
+ {LSM_MATHML_FONT_ERROR, ""},
125
+ {LSM_MATHML_FONT_CMEX10, "4"},
126
+ {LSM_MATHML_FONT_CMEX10, "6"},
127
+ 3,
128
+ {
129
+ {LSM_MATHML_FONT_CMR10, "["},
130
+ {LSM_MATHML_FONT_CMEX10, "\xc2\xa3"},
131
+ {LSM_MATHML_FONT_CMEX10, "h"},
132
+ {LSM_MATHML_FONT_ERROR, ""},
133
+ {LSM_MATHML_FONT_ERROR, ""}
134
+ }
135
+ },
136
+ {
137
+ "]",
138
+ LSM_MATHML_GLYPH_FLAG_STRETCH_VERTICAL |
139
+ LSM_MATHML_GLYPH_FLAG_TYPE_SIZED |
140
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS,
141
+ {LSM_MATHML_FONT_CMEX10, "3"},
142
+ {LSM_MATHML_FONT_ERROR, ""},
143
+ {LSM_MATHML_FONT_CMEX10, "5"},
144
+ {LSM_MATHML_FONT_CMEX10, "7"},
145
+ 3,
146
+ {
147
+ {LSM_MATHML_FONT_CMR10, "]"},
148
+ {LSM_MATHML_FONT_CMEX10, "\xc2\xa4"},
149
+ {LSM_MATHML_FONT_CMEX10, "i"},
150
+ {LSM_MATHML_FONT_ERROR, ""},
151
+ {LSM_MATHML_FONT_ERROR, ""}
152
+ }
153
+ },
154
+ {
155
+ "\xe2\x8c\xa9", /* 〈 */
156
+ LSM_MATHML_GLYPH_FLAG_STRETCH_VERTICAL |
157
+ LSM_MATHML_GLYPH_FLAG_TYPE_SIZED |
158
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS,
159
+ {LSM_MATHML_FONT_ERROR, ""},
160
+ {LSM_MATHML_FONT_ERROR, ""},
161
+ {LSM_MATHML_FONT_ERROR, ""},
162
+ {LSM_MATHML_FONT_ERROR, ""},
163
+ 3,
164
+ {
165
+ {LSM_MATHML_FONT_CMEX10, "D"},
166
+ {LSM_MATHML_FONT_CMEX10, "\xc2\xbf"},
167
+ {LSM_MATHML_FONT_CMEX10, "*"},
168
+ {LSM_MATHML_FONT_ERROR, ""},
169
+ {LSM_MATHML_FONT_ERROR, ""}
170
+ }
171
+ },
172
+ {
173
+ "\xe2\x8c\xaa", /* 〉 */
174
+ LSM_MATHML_GLYPH_FLAG_STRETCH_VERTICAL |
175
+ LSM_MATHML_GLYPH_FLAG_TYPE_SIZED |
176
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS,
177
+ {LSM_MATHML_FONT_ERROR, ""},
178
+ {LSM_MATHML_FONT_ERROR, ""},
179
+ {LSM_MATHML_FONT_ERROR, ""},
180
+ {LSM_MATHML_FONT_ERROR, ""},
181
+ 3,
182
+ {
183
+ {LSM_MATHML_FONT_CMEX10, "E"},
184
+ {LSM_MATHML_FONT_CMEX10, "\xc3\x80"},
185
+ {LSM_MATHML_FONT_CMEX10, "+"},
186
+ {LSM_MATHML_FONT_ERROR, ""},
187
+ {LSM_MATHML_FONT_ERROR, ""}
188
+ }
189
+ },
190
+ {
191
+ "\xe2\x88\x91" /* ∑ */,
192
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS | LSM_MATHML_GLYPH_FLAG_HAS_LARGE_VERSION,
193
+ {LSM_MATHML_FONT_ERROR, ""},
194
+ {LSM_MATHML_FONT_ERROR, ""},
195
+ {LSM_MATHML_FONT_ERROR, ""},
196
+ {LSM_MATHML_FONT_ERROR, ""},
197
+ 2,
198
+ {
199
+ {LSM_MATHML_FONT_CMEX10, "P"},
200
+ {LSM_MATHML_FONT_CMEX10, "X"}
201
+ }
202
+ },
203
+ {
204
+ "\xe2\x88\x8f" /* ∏ */,
205
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS | LSM_MATHML_GLYPH_FLAG_HAS_LARGE_VERSION,
206
+ {LSM_MATHML_FONT_ERROR, ""},
207
+ {LSM_MATHML_FONT_ERROR, ""},
208
+ {LSM_MATHML_FONT_ERROR, ""},
209
+ {LSM_MATHML_FONT_ERROR, ""},
210
+ 2,
211
+ {
212
+ {LSM_MATHML_FONT_CMEX10, "Q"},
213
+ {LSM_MATHML_FONT_CMEX10, "Y"}
214
+ }
215
+ },
216
+ {
217
+ "\xe2\x88\x90" /* ∐ */,
218
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS | LSM_MATHML_GLYPH_FLAG_HAS_LARGE_VERSION,
219
+ {LSM_MATHML_FONT_ERROR, ""},
220
+ {LSM_MATHML_FONT_ERROR, ""},
221
+ {LSM_MATHML_FONT_ERROR, ""},
222
+ {LSM_MATHML_FONT_ERROR, ""},
223
+ 2,
224
+ {
225
+ {LSM_MATHML_FONT_CMEX10, "`"},
226
+ {LSM_MATHML_FONT_CMEX10, "a"}
227
+ }
228
+ },
229
+ {
230
+ "\xe2\x8b\x81" /* ∨ - bigvee */,
231
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS | LSM_MATHML_GLYPH_FLAG_HAS_LARGE_VERSION,
232
+ {LSM_MATHML_FONT_ERROR, ""},
233
+ {LSM_MATHML_FONT_ERROR, ""},
234
+ {LSM_MATHML_FONT_ERROR, ""},
235
+ {LSM_MATHML_FONT_ERROR, ""},
236
+ 2,
237
+ {
238
+ {LSM_MATHML_FONT_CMSY10, "_"},
239
+ {LSM_MATHML_FONT_CMEX10, "W"}
240
+ }
241
+ },
242
+ {
243
+ "\xe2\x8b\x80" /* ∧ - bigwedge */,
244
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS | LSM_MATHML_GLYPH_FLAG_HAS_LARGE_VERSION,
245
+ {LSM_MATHML_FONT_ERROR, ""},
246
+ {LSM_MATHML_FONT_ERROR, ""},
247
+ {LSM_MATHML_FONT_ERROR, ""},
248
+ {LSM_MATHML_FONT_ERROR, ""},
249
+ 2,
250
+ {
251
+ {LSM_MATHML_FONT_CMSY10, "^"},
252
+ {LSM_MATHML_FONT_CMEX10, "V"}
253
+ }
254
+ },
255
+ {
256
+ "\xe2\x88\xa8" /* ∨ */,
257
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS | LSM_MATHML_GLYPH_FLAG_HAS_LARGE_VERSION,
258
+ {LSM_MATHML_FONT_ERROR, ""},
259
+ {LSM_MATHML_FONT_ERROR, ""},
260
+ {LSM_MATHML_FONT_ERROR, ""},
261
+ {LSM_MATHML_FONT_ERROR, ""},
262
+ 2,
263
+ {
264
+ {LSM_MATHML_FONT_CMSY10, "_"},
265
+ {LSM_MATHML_FONT_CMEX10, "W"}
266
+ }
267
+ },
268
+ {
269
+ "\xe2\x88\xa7" /* ∧ */,
270
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS | LSM_MATHML_GLYPH_FLAG_HAS_LARGE_VERSION,
271
+ {LSM_MATHML_FONT_ERROR, ""},
272
+ {LSM_MATHML_FONT_ERROR, ""},
273
+ {LSM_MATHML_FONT_ERROR, ""},
274
+ {LSM_MATHML_FONT_ERROR, ""},
275
+ 2,
276
+ {
277
+ {LSM_MATHML_FONT_CMSY10, "^"},
278
+ {LSM_MATHML_FONT_CMEX10, "V"}
279
+ }
280
+ },
281
+ {
282
+ "\xe2\x88\xa9" /* ⋂ - cap*/,
283
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS | LSM_MATHML_GLYPH_FLAG_HAS_LARGE_VERSION,
284
+ {LSM_MATHML_FONT_ERROR, ""},
285
+ {LSM_MATHML_FONT_ERROR, ""},
286
+ {LSM_MATHML_FONT_ERROR, ""},
287
+ {LSM_MATHML_FONT_ERROR, ""},
288
+ 2,
289
+ {
290
+ {LSM_MATHML_FONT_CMSY10, "\\"},
291
+ {LSM_MATHML_FONT_CMEX10, "\\"}
292
+ }
293
+ },
294
+ {
295
+ "\xe2\x88\xaa" /* ⋃ - cup */,
296
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS | LSM_MATHML_GLYPH_FLAG_HAS_LARGE_VERSION,
297
+ {LSM_MATHML_FONT_ERROR, ""},
298
+ {LSM_MATHML_FONT_ERROR, ""},
299
+ {LSM_MATHML_FONT_ERROR, ""},
300
+ {LSM_MATHML_FONT_ERROR, ""},
301
+ 2,
302
+ {
303
+ {LSM_MATHML_FONT_CMSY10, "["},
304
+ {LSM_MATHML_FONT_CMEX10, "["}
305
+ }
306
+ },
307
+ {
308
+ "\xe2\x8b\x82" /* ⋂ - bigcap */,
309
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS | LSM_MATHML_GLYPH_FLAG_HAS_LARGE_VERSION,
310
+ {LSM_MATHML_FONT_ERROR, ""},
311
+ {LSM_MATHML_FONT_ERROR, ""},
312
+ {LSM_MATHML_FONT_ERROR, ""},
313
+ {LSM_MATHML_FONT_ERROR, ""},
314
+ 2,
315
+ {
316
+ {LSM_MATHML_FONT_CMSY10, "\\"},
317
+ {LSM_MATHML_FONT_CMEX10, "\\"}
318
+ }
319
+ },
320
+ {
321
+ "\xe2\x8b\x83" /* ⋃ - bigcup */,
322
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS | LSM_MATHML_GLYPH_FLAG_HAS_LARGE_VERSION,
323
+ {LSM_MATHML_FONT_ERROR, ""},
324
+ {LSM_MATHML_FONT_ERROR, ""},
325
+ {LSM_MATHML_FONT_ERROR, ""},
326
+ {LSM_MATHML_FONT_ERROR, ""},
327
+ 2,
328
+ {
329
+ {LSM_MATHML_FONT_CMSY10, "["},
330
+ {LSM_MATHML_FONT_CMEX10, "["}
331
+ }
332
+ },
333
+ {
334
+ "\xe2\x88\xab" /* ∫ */,
335
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS | LSM_MATHML_GLYPH_FLAG_HAS_LARGE_VERSION |
336
+ LSM_MATHML_GLYPH_FLAG_STRETCH_VERTICAL |
337
+ LSM_MATHML_GLYPH_FLAG_INTEGRAL_SLANT,
338
+ {LSM_MATHML_FONT_ERROR, ""},
339
+ {LSM_MATHML_FONT_ERROR, ""},
340
+ {LSM_MATHML_FONT_ERROR, ""},
341
+ {LSM_MATHML_FONT_ERROR, ""},
342
+ 2,
343
+ {
344
+ {LSM_MATHML_FONT_CMEX10, "R"},
345
+ {LSM_MATHML_FONT_CMEX10, "Z"}
346
+ }
347
+ },
348
+ {
349
+ "\xe2\x88\xac" /* ∬ */,
350
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS | LSM_MATHML_GLYPH_FLAG_HAS_LARGE_VERSION |
351
+ LSM_MATHML_GLYPH_FLAG_INTEGRAL_SLANT,
352
+ {LSM_MATHML_FONT_ERROR, ""},
353
+ {LSM_MATHML_FONT_ERROR, ""},
354
+ {LSM_MATHML_FONT_ERROR, ""},
355
+ {LSM_MATHML_FONT_ERROR, ""},
356
+ 2,
357
+ {
358
+ {LSM_MATHML_FONT_CMEX10, "RR"},
359
+ {LSM_MATHML_FONT_CMEX10, "ZZ"}
360
+ }
361
+ },
362
+ {
363
+ "\xe2\x88\xad" /* ∭ */,
364
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS | LSM_MATHML_GLYPH_FLAG_HAS_LARGE_VERSION |
365
+ LSM_MATHML_GLYPH_FLAG_INTEGRAL_SLANT,
366
+ {LSM_MATHML_FONT_ERROR, ""},
367
+ {LSM_MATHML_FONT_ERROR, ""},
368
+ {LSM_MATHML_FONT_ERROR, ""},
369
+ {LSM_MATHML_FONT_ERROR, ""},
370
+ 2,
371
+ {
372
+ {LSM_MATHML_FONT_CMEX10, "RRR"},
373
+ {LSM_MATHML_FONT_CMEX10, "ZZZ"}
374
+ }
375
+ },
376
+ {
377
+ "\xe2\x88\xae" /* ∮ */,
378
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS | LSM_MATHML_GLYPH_FLAG_HAS_LARGE_VERSION |
379
+ LSM_MATHML_GLYPH_FLAG_INTEGRAL_SLANT,
380
+ {LSM_MATHML_FONT_ERROR, ""},
381
+ {LSM_MATHML_FONT_ERROR, ""},
382
+ {LSM_MATHML_FONT_ERROR, ""},
383
+ {LSM_MATHML_FONT_ERROR, ""},
384
+ 2,
385
+ {
386
+ {LSM_MATHML_FONT_CMEX10, "H"},
387
+ {LSM_MATHML_FONT_CMEX10, "I"}
388
+ }
389
+ },
390
+ {
391
+ "\xe2\x85\x86" /* d */,
392
+ 0,
393
+ {LSM_MATHML_FONT_ERROR, ""},
394
+ {LSM_MATHML_FONT_ERROR, ""},
395
+ {LSM_MATHML_FONT_ERROR, ""},
396
+ {LSM_MATHML_FONT_ERROR, ""},
397
+ 1,
398
+ {
399
+ {LSM_MATHML_FONT_CMMI10, "d"}
400
+ }
401
+ },
402
+ {
403
+ "\xe2\x85\x88" /* i */,
404
+ 0,
405
+ {LSM_MATHML_FONT_ERROR, ""},
406
+ {LSM_MATHML_FONT_ERROR, ""},
407
+ {LSM_MATHML_FONT_ERROR, ""},
408
+ {LSM_MATHML_FONT_ERROR, ""},
409
+ 1,
410
+ {
411
+ {LSM_MATHML_FONT_CMMI10, "i"}
412
+ }
413
+ },
414
+ {
415
+ "\xf0\x9d\x95\x9b" /* j */,
416
+ 0,
417
+ {LSM_MATHML_FONT_ERROR, ""},
418
+ {LSM_MATHML_FONT_ERROR, ""},
419
+ {LSM_MATHML_FONT_ERROR, ""},
420
+ {LSM_MATHML_FONT_ERROR, ""},
421
+ 1,
422
+ {
423
+ {LSM_MATHML_FONT_CMMI10, "j"}
424
+ }
425
+ },
426
+ {
427
+ "\xcc\xb2" /* _ */,
428
+ LSM_MATHML_GLYPH_FLAG_STRETCH_HORIZONTAL,
429
+ {LSM_MATHML_FONT_ERROR, ""},
430
+ {LSM_MATHML_FONT_ERROR, ""},
431
+ {LSM_MATHML_FONT_ERROR, ""},
432
+ {LSM_MATHML_FONT_ERROR, ""},
433
+ 1,
434
+ {
435
+ {LSM_MATHML_FONT_DEFAULT, "\xcc\xb2"}
436
+ }
437
+ },
438
+ {
439
+ "\xc2\xaf" /* hor */,
440
+ LSM_MATHML_GLYPH_FLAG_STRETCH_HORIZONTAL,
441
+ {LSM_MATHML_FONT_ERROR, ""},
442
+ {LSM_MATHML_FONT_ERROR, ""},
443
+ {LSM_MATHML_FONT_ERROR, ""},
444
+ {LSM_MATHML_FONT_ERROR, ""},
445
+ 1,
446
+ {
447
+ {LSM_MATHML_FONT_DEFAULT, "\xc2\xaf"}
448
+ }
449
+ },
450
+ {
451
+ "\xef\xb8\xb8" /* ︸ */,
452
+ LSM_MATHML_GLYPH_FLAG_STRETCH_HORIZONTAL,
453
+ {LSM_MATHML_FONT_ERROR, ""},
454
+ {LSM_MATHML_FONT_ERROR, ""},
455
+ {LSM_MATHML_FONT_ERROR, ""},
456
+ {LSM_MATHML_FONT_ERROR, ""},
457
+ 1,
458
+ {
459
+ {LSM_MATHML_FONT_DEFAULT, "\xef\xb8\xb8"}
460
+ }
461
+ },
462
+ {
463
+ "\xef\xb8\xb7" /* ︷ */,
464
+ LSM_MATHML_GLYPH_FLAG_STRETCH_HORIZONTAL,
465
+ {LSM_MATHML_FONT_ERROR, ""},
466
+ {LSM_MATHML_FONT_ERROR, ""},
467
+ {LSM_MATHML_FONT_ERROR, ""},
468
+ {LSM_MATHML_FONT_ERROR, ""},
469
+ 1,
470
+ {
471
+ {LSM_MATHML_FONT_DEFAULT, "\xef\xb8\xb7"}
472
+ }
473
+ },
474
+ {
475
+ "\xcd\x9c" /* ˜ */,
476
+ LSM_MATHML_GLYPH_FLAG_STRETCH_HORIZONTAL,
477
+ {LSM_MATHML_FONT_ERROR, ""},
478
+ {LSM_MATHML_FONT_ERROR, ""},
479
+ {LSM_MATHML_FONT_ERROR, ""},
480
+ {LSM_MATHML_FONT_ERROR, ""},
481
+ 3,
482
+ {
483
+ {LSM_MATHML_FONT_CMEX10, "e"},
484
+ {LSM_MATHML_FONT_CMEX10, "f"},
485
+ {LSM_MATHML_FONT_CMEX10, "g"}
486
+ }
487
+ },
488
+ {
489
+ "\xe2\x86\x92", /* → */
490
+ LSM_MATHML_GLYPH_FLAG_STRETCH_HORIZONTAL,
491
+ {LSM_MATHML_FONT_ERROR, ""},
492
+ {LSM_MATHML_FONT_ERROR, ""},
493
+ {LSM_MATHML_FONT_ERROR, ""},
494
+ {LSM_MATHML_FONT_ERROR, ""},
495
+ 1,
496
+ {
497
+ {LSM_MATHML_FONT_DEFAULT, "\xe2\x86\x92"}
498
+ }
499
+ },
500
+ {
501
+ "\xe2\x86\x90", /* ← */
502
+ LSM_MATHML_GLYPH_FLAG_STRETCH_HORIZONTAL,
503
+ {LSM_MATHML_FONT_ERROR, ""},
504
+ {LSM_MATHML_FONT_ERROR, ""},
505
+ {LSM_MATHML_FONT_ERROR, ""},
506
+ {LSM_MATHML_FONT_ERROR, ""},
507
+ 1,
508
+ {
509
+ {LSM_MATHML_FONT_DEFAULT, "\xe2\x86\x90"}
510
+ }
511
+ },
512
+ {
513
+ "\xe2\x86\x91", /* ↑ */
514
+ LSM_MATHML_GLYPH_FLAG_STRETCH_VERTICAL,
515
+ {LSM_MATHML_FONT_ERROR, ""},
516
+ {LSM_MATHML_FONT_ERROR, ""},
517
+ {LSM_MATHML_FONT_ERROR, ""},
518
+ {LSM_MATHML_FONT_ERROR, ""},
519
+ 1,
520
+ {
521
+ {LSM_MATHML_FONT_DEFAULT, "\xe2\x86\x91"}
522
+ }
523
+ },
524
+ {
525
+ "\xe2\x86\x93", /* ↓ */
526
+ LSM_MATHML_GLYPH_FLAG_STRETCH_VERTICAL,
527
+ {LSM_MATHML_FONT_ERROR, ""},
528
+ {LSM_MATHML_FONT_ERROR, ""},
529
+ {LSM_MATHML_FONT_ERROR, ""},
530
+ {LSM_MATHML_FONT_ERROR, ""},
531
+ 1,
532
+ {
533
+ {LSM_MATHML_FONT_DEFAULT, "\xe2\x86\x93"}
534
+ }
535
+ },
536
+ {
537
+ "-",
538
+ 0,
539
+ {LSM_MATHML_FONT_ERROR, ""},
540
+ {LSM_MATHML_FONT_ERROR, ""},
541
+ {LSM_MATHML_FONT_ERROR, ""},
542
+ {LSM_MATHML_FONT_ERROR, ""},
543
+ 1,
544
+ {
545
+ {LSM_MATHML_FONT_DEFAULT, "\xe2\x88\x92"}
546
+ }
547
+ },
548
+ {
549
+ "|",
550
+ LSM_MATHML_GLYPH_FLAG_STRETCH_VERTICAL,
551
+ {LSM_MATHML_FONT_ERROR, ""},
552
+ {LSM_MATHML_FONT_ERROR, ""},
553
+ {LSM_MATHML_FONT_ERROR, ""},
554
+ {LSM_MATHML_FONT_ERROR, ""},
555
+ 1,
556
+ {
557
+ {LSM_MATHML_FONT_DEFAULT, "|"}
558
+ }
559
+ }
560
+ };
561
+
562
+ static GHashTable *
563
+ _get_glyph_table (void)
564
+ {
565
+ static GHashTable *glyph_table = NULL;
566
+ unsigned int i;
567
+
568
+ if (glyph_table != NULL)
569
+ return glyph_table;
570
+
571
+ glyph_table = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL);
572
+
573
+ for (i = 0; i < G_N_ELEMENTS (AMS_table); i++)
574
+ g_hash_table_insert (glyph_table, (void *) AMS_table[i].utf8, (void *) &AMS_table[i]);
575
+
576
+ return glyph_table;
577
+ }
578
+
579
+ const LsmMathmlOperatorGlyph *
580
+ lsm_mathml_glyph_table_find_operator_glyph (const char *text)
581
+ {
582
+ return g_hash_table_lookup (_get_glyph_table (), text);
583
+ }
584
+
585
+ double
586
+ lsm_mathml_glyph_table_get_operator_slant (const char *text)
587
+ {
588
+ const LsmMathmlOperatorGlyph *glyph;
589
+
590
+ glyph = g_hash_table_lookup (_get_glyph_table (), text);
591
+
592
+ if (glyph != NULL)
593
+ if (glyph->flags & LSM_MATHML_GLYPH_FLAG_INTEGRAL_SLANT)
594
+ return -12.0 / 180.0 * M_PI;
595
+
596
+ return 0.0;
597
+ }