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,164 @@
1
+ /* Lasem
2
+ *
3
+ * Copyright © 2007-2012 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_VIEW_H
25
+ #define LSM_MATHML_VIEW_H
26
+
27
+ #include <lsmdomview.h>
28
+ #include <lsmmathmltypes.h>
29
+ #include <lsmmathmlutils.h>
30
+ #include <lsmmathmlelement.h>
31
+ #include <lsmmathmlpresentationtoken.h>
32
+
33
+ G_BEGIN_DECLS
34
+
35
+ typedef enum {
36
+ LSM_MATHML_GLYPH_FLAG_STRETCH_VERTICAL = 1 << 0,
37
+ LSM_MATHML_GLYPH_FLAG_STRETCH_HORIZONTAL = 1 << 1,
38
+ LSM_MATHML_GLYPH_FLAG_TYPE_SIZED = 1 << 2,
39
+ LSM_MATHML_GLYPH_FLAG_ALIGN_AXIS = 1 << 3,
40
+ LSM_MATHML_GLYPH_FLAG_HAS_LARGE_VERSION = 1 << 4,
41
+ LSM_MATHML_GLYPH_FLAG_INTEGRAL_SLANT = 1 << 5
42
+ } LsmMathmlGlyphFlags;
43
+
44
+ typedef enum {
45
+ LSM_MATHML_FONT_ERROR,
46
+ LSM_MATHML_FONT_DEFAULT,
47
+ LSM_MATHML_FONT_CMR10,
48
+ LSM_MATHML_FONT_CMMI10,
49
+ LSM_MATHML_FONT_CMEX10,
50
+ LSM_MATHML_FONT_CMSY10,
51
+ LSM_MATHML_FONT_SYMBOL
52
+ } LsmMathmlFont;
53
+
54
+ typedef struct {
55
+ LsmMathmlFont font;
56
+ const char utf8[4];
57
+ } LsmMathmlGlyph;
58
+
59
+ typedef struct {
60
+ const char *utf8;
61
+ LsmMathmlGlyphFlags flags;
62
+ LsmMathmlGlyph start_glyph;
63
+ LsmMathmlGlyph middle_glyph;
64
+ LsmMathmlGlyph stop_glyph;
65
+ LsmMathmlGlyph glue_glyph;
66
+ unsigned int n_sized_glyphs;
67
+ LsmMathmlGlyph sized_glyphs[5];
68
+ } LsmMathmlOperatorGlyph;
69
+
70
+ #define LSM_TYPE_MATHML_VIEW (lsm_mathml_view_get_type ())
71
+ #define LSM_MATHML_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LSM_TYPE_MATHML_VIEW, LsmMathmlView))
72
+ #define LSM_MATHML_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LSM_TYPE_MATHML_VIEW, LsmMathmlViewClass))
73
+ #define LSM_IS_MATHML_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LSM_TYPE_MATHML_VIEW))
74
+ #define LSM_IS_MATHML_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LSM_TYPE_MATHML_VIEW))
75
+ #define LSM_MATHML_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), LSM_TYPE_MATHML_VIEW, LsmMathmlViewClass))
76
+
77
+ typedef struct _LsmMathmlViewClass LsmMathmlViewClass;
78
+ typedef struct _LsmMathmlViewPrivate LsmMathmlViewPrivate;
79
+
80
+ struct _LsmMathmlView {
81
+ LsmDomView dom_view;
82
+ };
83
+
84
+ struct _LsmMathmlViewClass {
85
+ LsmDomViewClass dom_view_class;
86
+ };
87
+
88
+ GType lsm_mathml_view_get_type (void);
89
+
90
+ LsmMathmlView * lsm_mathml_view_new (LsmMathmlDocument *document);
91
+
92
+ /* Internal API */
93
+
94
+ double lsm_mathml_view_measure_axis_offset (LsmMathmlView *view, double math_size);
95
+
96
+ void lsm_mathml_view_get_font_metrics (LsmMathmlView *view,
97
+ const LsmMathmlElementStyle *style,
98
+ double *ascent,
99
+ double *descent);
100
+
101
+ void lsm_mathml_view_measure_text (LsmMathmlView *view,
102
+ const LsmMathmlElementStyle *style,
103
+ char const *text,
104
+ LsmMathmlBbox *bbox);
105
+ void lsm_mathml_view_show_text (LsmMathmlView *view,
106
+ const LsmMathmlElementStyle *style,
107
+ double x, double y, const char *text);
108
+
109
+ void lsm_mathml_view_measure_operator (LsmMathmlView *view,
110
+ const LsmMathmlElementStyle *style,
111
+ char const *text,
112
+ gboolean large, gboolean symmetric,
113
+ double axis_offset,
114
+ const LsmMathmlBbox *stretch_bbox,
115
+ LsmMathmlBbox *bbox);
116
+ void lsm_mathml_view_show_operator (LsmMathmlView *view,
117
+ const LsmMathmlElementStyle *style,
118
+ double x, double y, char const *text,
119
+ gboolean large,
120
+ const LsmMathmlBbox *stretch_bbox);
121
+ double lsm_mathml_view_get_operator_slant (LsmMathmlView *view,
122
+ const LsmMathmlElementStyle *style,
123
+ const char *text);
124
+
125
+ void lsm_mathml_view_measure_radical (LsmMathmlView *view,
126
+ const LsmMathmlElementStyle *style,
127
+ const LsmMathmlBbox *stretch_bbox,
128
+ LsmMathmlBbox *bbox,
129
+ double *x_offset, double *y_offset);
130
+ void lsm_mathml_view_show_radical (LsmMathmlView *view,
131
+ const LsmMathmlElementStyle *style,
132
+ double x, double y, double width,
133
+ const LsmMathmlBbox *stretch_bbox);
134
+
135
+ void lsm_mathml_view_show_background (LsmMathmlView *view,
136
+ const LsmMathmlElementStyle *style,
137
+ double x, double y,
138
+ const LsmMathmlBbox *bbox);
139
+ void lsm_mathml_view_show_rectangle (LsmMathmlView *view,
140
+ const LsmMathmlElementStyle *style,
141
+ double x, double y, double width, double height,
142
+ LsmMathmlLine line, double line_width);
143
+ void lsm_mathml_view_show_line (LsmMathmlView *view,
144
+ const LsmMathmlElementStyle *style,
145
+ double x0, double y0, double x1, double y1,
146
+ LsmMathmlLine line, double line_width);
147
+ void lsm_mathml_view_show_fraction_line (LsmMathmlView *view,
148
+ const LsmMathmlElementStyle *style,
149
+ double x, double y,
150
+ double width, double thickness);
151
+
152
+ void lsm_mathml_view_show_bbox (LsmMathmlView *view, double x, double y,
153
+ const LsmMathmlBbox *bbox);
154
+
155
+ void lsm_mathml_view_draw_root (LsmMathmlView *view,
156
+ double x, double y,
157
+ double width, double height,
158
+ double top_width,
159
+ double thickness,
160
+ LsmMathmlColor *color);
161
+
162
+ G_END_DECLS
163
+
164
+ #endif
@@ -0,0 +1,418 @@
1
+ /* Lasem
2
+ *
3
+ * Copyright © 2007-2009 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 <lsmproperties.h>
25
+ #include <lsmdebug.h>
26
+ #include <lsmstr.h>
27
+ #include <string.h>
28
+
29
+ #define PROPERTY_TRAIT(property) ((void *) (((char *) property) + sizeof (LsmProperty)))
30
+ #define PROPERTY_SIZE(trait_class) (trait_class->size + sizeof (LsmProperty))
31
+
32
+ struct _LsmPropertyManager {
33
+ unsigned int n_properties;
34
+ const LsmPropertyInfos *property_infos;
35
+ GHashTable * hash_by_name;
36
+
37
+ /* FIXME: Not thread safe */
38
+ unsigned int * property_check;
39
+ unsigned int property_check_count;
40
+
41
+ gint ref_count;
42
+ };
43
+
44
+ G_DEFINE_BOXED_TYPE (LsmPropertyManager, lsm_property_manager, lsm_property_manager_ref, lsm_property_manager_unref)
45
+
46
+ LsmPropertyManager *
47
+ lsm_property_manager_new (unsigned int n_properties, const LsmPropertyInfos *property_infos)
48
+ {
49
+ LsmPropertyManager *manager;
50
+ guint16 i;
51
+
52
+ g_return_val_if_fail (n_properties > 0, NULL);
53
+ g_return_val_if_fail (property_infos != NULL, NULL);
54
+
55
+ manager = g_new (LsmPropertyManager, 1);
56
+ manager->hash_by_name = g_hash_table_new (g_str_hash, g_str_equal);
57
+ manager->n_properties = n_properties;
58
+ manager->property_infos = property_infos;
59
+ manager->property_check_count = 0;
60
+ manager->property_check = g_new0 (unsigned int, n_properties);
61
+ manager->ref_count = 1;
62
+
63
+ for (i = 0; i < n_properties; i++) {
64
+
65
+ g_assert (property_infos[i].name != NULL);
66
+ g_assert (property_infos[i].trait_class != NULL);
67
+
68
+ g_hash_table_insert (manager->hash_by_name,
69
+ (void *) property_infos[i].name,
70
+ (void *) &property_infos[i]);
71
+ }
72
+
73
+ return manager;
74
+ }
75
+
76
+ LsmPropertyManager *
77
+ lsm_property_manager_ref (LsmPropertyManager *manager)
78
+ {
79
+ g_return_val_if_fail (manager != NULL, NULL);
80
+
81
+ g_atomic_int_inc (&manager->ref_count);
82
+
83
+ return manager;
84
+ }
85
+
86
+ void
87
+ lsm_property_manager_unref (LsmPropertyManager *manager)
88
+ {
89
+ g_return_if_fail (manager != NULL);
90
+
91
+ if (g_atomic_int_dec_and_test (&manager->ref_count)) {
92
+ g_hash_table_unref (manager->hash_by_name);
93
+ g_free (manager->property_check);
94
+ g_free (manager);
95
+ }
96
+ }
97
+
98
+ static void
99
+ property_free (LsmProperty *property, const LsmTraitClass *trait_class)
100
+ {
101
+ if (trait_class != NULL && trait_class->finalize != NULL)
102
+ trait_class->finalize (PROPERTY_TRAIT (property));
103
+
104
+ g_free (property->value);
105
+ g_slice_free1 (PROPERTY_SIZE (trait_class), property);
106
+ }
107
+
108
+ static gboolean
109
+ _set_property (LsmPropertyManager *manager,
110
+ LsmPropertyBag *property_bag,
111
+ const char *name, const char *value)
112
+ {
113
+ LsmProperty *property;
114
+ const LsmPropertyInfos *property_infos;
115
+ const LsmTraitClass *trait_class;
116
+
117
+ property_infos = g_hash_table_lookup (manager->hash_by_name, name);
118
+ if (property_infos == NULL)
119
+ return FALSE;
120
+
121
+ trait_class = property_infos->trait_class;
122
+
123
+ /* We don't check for existing property in the list. The cleanup is done later when
124
+ * applying a property bag. */
125
+
126
+ property = g_slice_alloc0 (PROPERTY_SIZE (trait_class));
127
+ property->id = property_infos->id;
128
+ property->value = g_strdup (value);
129
+
130
+ if (trait_class->init)
131
+ trait_class->init (PROPERTY_TRAIT (property), NULL);
132
+
133
+ if (property->value != NULL && trait_class->from_string) {
134
+ gboolean success;
135
+
136
+ success = trait_class->from_string (PROPERTY_TRAIT (property), (char *) value);
137
+ if (!success) {
138
+ lsm_debug_dom ("[LsmPropertyManager::set_property] Invalid property value %s='%s'",
139
+ name, value);
140
+ property_free (property, property_infos->trait_class);
141
+
142
+ return FALSE;
143
+ }
144
+ }
145
+
146
+ property_bag->properties = g_slist_prepend (property_bag->properties, property);
147
+
148
+ return TRUE;
149
+ }
150
+
151
+ gboolean
152
+ lsm_property_manager_set_property (LsmPropertyManager *manager,
153
+ LsmPropertyBag *property_bag,
154
+ const char *name, const char *value)
155
+ {
156
+ gboolean property_found;
157
+ char *inline_style;
158
+
159
+ g_return_val_if_fail (property_bag != NULL, FALSE);
160
+ g_return_val_if_fail (manager != NULL, FALSE);
161
+ g_return_val_if_fail (name != NULL, FALSE);
162
+
163
+ property_found = _set_property (manager, property_bag, name, value);
164
+ if (property_found)
165
+ return TRUE;
166
+
167
+ if (strcmp (name, "style") != 0)
168
+ return FALSE;
169
+
170
+ inline_style = g_strdup (value);
171
+ if (inline_style == NULL)
172
+ return FALSE;
173
+
174
+ {
175
+ char *end_ptr = inline_style;
176
+ char *name;
177
+ char *value;
178
+
179
+ while (*end_ptr != '\0') {
180
+
181
+ lsm_str_skip_spaces (&end_ptr);
182
+
183
+ name = end_ptr;
184
+
185
+ while (*end_ptr != '\0' && *end_ptr != ':' && !g_ascii_isspace (*end_ptr))
186
+ end_ptr++;
187
+
188
+ if (*end_ptr != '\0') {
189
+ *end_ptr = '\0';
190
+ end_ptr++;
191
+
192
+ lsm_str_skip_colon_and_spaces (&end_ptr);
193
+
194
+ if (*end_ptr != '\0') {
195
+ char old_char;
196
+
197
+ value = end_ptr;
198
+
199
+ while (*end_ptr != ';' && *end_ptr != '\0')
200
+ end_ptr++;
201
+
202
+ old_char = *end_ptr;
203
+ *end_ptr = '\0';
204
+
205
+ lsm_debug_dom ("[LsmPropertyManager::set_property] inline_style %s = %s",
206
+ name, value);
207
+
208
+ _set_property (manager, property_bag, name, value);
209
+
210
+ *end_ptr = old_char;
211
+
212
+ lsm_str_skip_char (&end_ptr, ';');
213
+ }
214
+ }
215
+ }
216
+ g_free (inline_style);
217
+ }
218
+
219
+ return TRUE;
220
+ }
221
+
222
+ const char *
223
+ lsm_property_manager_get_property (LsmPropertyManager *manager,
224
+ LsmPropertyBag *property_bag,
225
+ const char *name)
226
+ {
227
+ LsmProperty *property = NULL;
228
+ const LsmPropertyInfos *property_infos;
229
+ GSList *iter;
230
+
231
+ g_return_val_if_fail (property_bag != NULL, NULL);
232
+ g_return_val_if_fail (manager != NULL, NULL);
233
+
234
+ property_infos = g_hash_table_lookup (manager->hash_by_name, name);
235
+ if (property_infos == NULL)
236
+ return NULL;
237
+
238
+ g_message ("Get property with name %s (%d)", name, property_infos->id);
239
+
240
+ for (iter = property_bag->properties; iter != NULL; iter = iter->next) {
241
+ property = iter->data;
242
+ if (property->id == property_infos->id)
243
+ break;
244
+ }
245
+
246
+ if (property == NULL)
247
+ return NULL;
248
+
249
+ return property->value;
250
+ }
251
+
252
+ void
253
+ lsm_property_manager_clean_properties (LsmPropertyManager *manager,
254
+ LsmPropertyBag *property_bag)
255
+ {
256
+ LsmProperty *property;
257
+ GSList *iter;
258
+
259
+ g_return_if_fail (property_bag != NULL);
260
+ g_return_if_fail (manager != NULL);
261
+
262
+ for (iter = property_bag->properties; iter != NULL; iter = iter->next) {
263
+ property = iter->data;
264
+
265
+ if (property->id < manager->n_properties) {
266
+ const LsmPropertyInfos *property_infos;
267
+
268
+ property_infos = &manager->property_infos[property->id];
269
+ property_free (property, property_infos->trait_class);
270
+ }
271
+ }
272
+
273
+ g_slist_free (property_bag->properties);
274
+ property_bag->properties = NULL;
275
+ }
276
+
277
+ char *
278
+ lsm_property_manager_serialize (LsmPropertyManager *manager,
279
+ LsmPropertyBag *property_bag)
280
+ {
281
+ LsmProperty *property;
282
+ GSList *iter;
283
+ GString *string;
284
+ char *c_string;
285
+ gboolean attribute_found = FALSE;
286
+
287
+ g_return_val_if_fail (property_bag != NULL, NULL);
288
+ g_return_val_if_fail (manager != NULL, NULL);
289
+
290
+ string = g_string_new ("");
291
+
292
+ for (iter = property_bag->properties; iter != NULL; iter = iter->next) {
293
+ property = iter->data;
294
+
295
+ if (property->id < manager->n_properties) {
296
+ const LsmPropertyInfos *property_infos;
297
+
298
+ property_infos = &manager->property_infos[property->id];
299
+ g_string_append_printf (string, "%s=\"%s\"%s",
300
+ property_infos->name,
301
+ property->value,
302
+ iter->next != NULL ? " ": "");
303
+ if (!attribute_found)
304
+ attribute_found = TRUE;
305
+ }
306
+ }
307
+
308
+ if (!attribute_found) {
309
+ g_string_free (string, TRUE);
310
+ return NULL;
311
+ }
312
+
313
+ c_string = string->str;
314
+ g_string_free (string, FALSE);
315
+
316
+ return c_string;
317
+ }
318
+
319
+ void
320
+ lsm_property_manager_apply_property_bag (LsmPropertyManager *manager,
321
+ LsmPropertyBag *bag,
322
+ void *style,
323
+ const void *parent_style)
324
+ {
325
+ LsmProperty *property;
326
+ GSList *iter;
327
+ GSList *previous_iter = NULL;
328
+
329
+ g_return_if_fail (bag != NULL);
330
+ g_return_if_fail (manager != NULL);
331
+
332
+ manager->property_check_count++;
333
+ if (manager->property_check_count == 0) {
334
+ manager->property_check_count++;
335
+ memset (manager->property_check, 0, sizeof (unsigned int) * manager->n_properties);
336
+ }
337
+
338
+ for (iter = bag->properties; iter != NULL;) {
339
+ property = iter->data;
340
+
341
+ if (property->id < manager->n_properties) {
342
+ if (manager->property_check[property->id] != manager->property_check_count) {
343
+ if (g_strcmp0 (property->value, "inherit") != 0)
344
+ *((LsmProperty **) ((char *) style
345
+ + LSM_PROPERTY_ID_TO_OFFSET (property->id))) = property;
346
+ else {
347
+ if (parent_style != NULL)
348
+ *((LsmProperty **) ((char *) style
349
+ + LSM_PROPERTY_ID_TO_OFFSET (property->id))) =
350
+ *((LsmProperty **) ((char *) parent_style
351
+ + LSM_PROPERTY_ID_TO_OFFSET (property->id)));
352
+ }
353
+
354
+ manager->property_check[property->id] = manager->property_check_count;
355
+ previous_iter = iter;
356
+ iter = iter->next;
357
+ } else {
358
+ /* property garbage collector */
359
+ const LsmPropertyInfos *property_infos;
360
+
361
+ property_infos = &manager->property_infos[property->id];
362
+
363
+ lsm_log_dom ("[LsmPropertyManager::apply_property_bag] Garbage collection of %s=%s",
364
+ property_infos->name, property->value);
365
+
366
+ property_free (property, property_infos->trait_class);
367
+
368
+ if (previous_iter == NULL) {
369
+ bag->properties = iter->next;
370
+ g_slist_free_1 (iter);
371
+ iter = bag->properties;
372
+ } else {
373
+ previous_iter->next = iter->next;
374
+ g_slist_free_1 (iter);
375
+ iter = previous_iter->next;
376
+ }
377
+ }
378
+ } else {
379
+ previous_iter = iter;
380
+ iter = iter->next;
381
+ }
382
+ }
383
+ }
384
+
385
+ void lsm_property_manager_init_default_style (LsmPropertyManager *property_manager,
386
+ void *style)
387
+ {
388
+ LsmProperty *property;
389
+ const LsmPropertyInfos *property_infos;
390
+ const LsmTraitClass *trait_class;
391
+ unsigned int i;
392
+
393
+ g_return_if_fail (property_manager != NULL);
394
+
395
+ for (i = 0; i < property_manager->n_properties; i++) {
396
+ property_infos = &property_manager->property_infos[i];
397
+ trait_class = property_infos->trait_class;
398
+
399
+ property = g_slice_alloc0 (PROPERTY_SIZE (trait_class));
400
+ property->id = property_infos->id;
401
+ property->value = g_strdup (property_infos->trait_default);
402
+
403
+ if (trait_class->from_string)
404
+ trait_class->from_string (PROPERTY_TRAIT (property),
405
+ (char *) property_infos->trait_default);
406
+
407
+ *((LsmProperty **) ((char *) style
408
+ + LSM_PROPERTY_ID_TO_OFFSET (property->id))) = property;
409
+ }
410
+ }
411
+
412
+ void
413
+ lsm_property_bag_init (LsmPropertyBag *bag)
414
+ {
415
+ g_return_if_fail (bag != NULL);
416
+
417
+ bag->properties = NULL;
418
+ }