mathematical 1.3.0 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +14 -7
- data/Rakefile +4 -1
- data/ext/mathematical/cairo_callbacks.h +5 -0
- data/ext/mathematical/extconf.rb +34 -8
- data/ext/mathematical/lasem_overrides.c +32 -3
- data/ext/mathematical/lasem_overrides.h +11 -2
- data/ext/mathematical/mathematical.c +27 -26
- data/ext/mathematical/mathematical.h +5 -1
- data/ext/mathematical/mtex2MML/deps/strdup/strdup.c +24 -0
- data/ext/mathematical/mtex2MML/deps/strdup/strdup.h +24 -0
- data/ext/mathematical/mtex2MML/deps/uthash/utarray.h +1 -0
- data/ext/mathematical/mtex2MML/src/{color_definitions.c → colors.c} +2 -3
- data/ext/mathematical/mtex2MML/src/colors.h +23 -0
- data/ext/mathematical/mtex2MML/src/em.c +99 -0
- data/ext/mathematical/mtex2MML/src/em.h +31 -0
- data/ext/mathematical/mtex2MML/src/{parse_extras.c → environment.c} +73 -157
- data/ext/mathematical/mtex2MML/src/environment.h +85 -0
- data/ext/mathematical/mtex2MML/src/{mtex2MML.l → lexer.l} +26 -15
- data/ext/mathematical/mtex2MML/src/main.c +31 -10
- data/ext/mathematical/mtex2MML/src/mtex2MML.h +19 -7
- data/ext/mathematical/mtex2MML/src/{mtex2MML.y → parser.y} +451 -446
- data/ext/mathematical/mtex2MML/src/string_extras.c +4 -3
- data/ext/mathematical/mtex2MML/src/string_extras.h +7 -7
- data/ext/mathematical/mtex2MML/tests/array.c +11 -11
- data/ext/mathematical/mtex2MML/tests/basic.c +14 -13
- data/ext/mathematical/mtex2MML/tests/clar.c +2 -0
- data/ext/mathematical/mtex2MML/tests/clar/fs.h +3 -1
- data/ext/mathematical/mtex2MML/tests/clar/sandbox.h +3 -1
- data/ext/mathematical/mtex2MML/tests/cornercases.c +3 -2
- data/ext/mathematical/mtex2MML/tests/delimiters.c +126 -0
- data/ext/mathematical/mtex2MML/tests/deps/file2str/file2str.c +2 -4
- data/ext/mathematical/mtex2MML/tests/deps/mkdtemp/mkdtemp.c +151 -0
- data/ext/mathematical/mtex2MML/tests/deps/mkdtemp/mkdtemp.h +10 -0
- data/ext/mathematical/mtex2MML/tests/deps/trim/trim.c +4 -1
- data/ext/mathematical/mtex2MML/tests/env.c +35 -34
- data/ext/mathematical/mtex2MML/tests/functions.c +3 -2
- data/ext/mathematical/mtex2MML/tests/helpers.c +6 -4
- data/ext/mathematical/mtex2MML/tests/helpers.h +2 -2
- data/ext/mathematical/mtex2MML/tests/main.c +1 -1
- data/ext/mathematical/mtex2MML/tests/maliciousness.c +35 -9
- data/ext/mathematical/mtex2MML/tests/mathjax.c +202 -202
- data/ext/mathematical/mtex2MML/tests/numbered_equations.c +6 -6
- data/ext/mathematical/mtex2MML/tests/performance.c +39 -0
- data/lib/mathematical.rb +38 -5
- data/lib/mathematical/configuration.rb +19 -0
- data/lib/mathematical/validator.rb +17 -31
- data/lib/mathematical/version.rb +1 -1
- data/mathematical.gemspec +3 -1
- data/test/mathematical/basic_test.rb +60 -7
- data/test/mathematical/corrections_test.rb +1 -1
- data/test/mathematical/delimiters_test.rb +58 -0
- data/test/mathematical/fixtures_test.rb +3 -2
- data/test/mathematical/maliciousness_test.rb +19 -27
- data/test/mathematical/mathjax_test.rb +6 -5
- data/test/mathematical/mathml_test.rb +1 -1
- data/test/mathematical/multiples_test.rb +1 -1
- data/test/mathematical/performance_test.rb +3 -1
- data/test/mathematical/png_test.rb +3 -3
- data/test/test_helper.rb +4 -1
- metadata +35 -21
- data/ext/mathematical/lasem/src/lsmdomenumtypes.c +0 -99
- data/ext/mathematical/lasem/src/lsmdomenumtypes.h +0 -26
- data/ext/mathematical/lasem/src/lsmmathmlenumtypes.c +0 -737
- data/ext/mathematical/lasem/src/lsmmathmlenumtypes.h +0 -93
- data/ext/mathematical/lasem/src/lsmsvgenumtypes.c +0 -1083
- data/ext/mathematical/lasem/src/lsmsvgenumtypes.h +0 -111
- data/ext/mathematical/mtex2MML/Makefile +0 -100
- data/ext/mathematical/mtex2MML/build/libmtex2MML.a +0 -0
- data/ext/mathematical/mtex2MML/build/mtex2MML.h +0 -73
- data/ext/mathematical/mtex2MML/src/lex.yy.c +0 -8845
- data/ext/mathematical/mtex2MML/src/parse_extras.h +0 -111
- data/ext/mathematical/mtex2MML/src/y.tab.c +0 -10178
- data/ext/mathematical/mtex2MML/src/y.tab.h +0 -617
@@ -1,7 +1,6 @@
|
|
1
|
-
#include "
|
2
|
-
#include "../deps/uthash/uthash.h"
|
1
|
+
#include "colors.h"
|
3
2
|
|
4
|
-
void
|
3
|
+
void mtex2MML_create_css_colors(struct css_colors **colors)
|
5
4
|
{
|
6
5
|
const char **n, **h,
|
7
6
|
*names[] = { "\"Apricot\"","\"Aquamarine\"","\"Bittersweet\"",
|
@@ -0,0 +1,23 @@
|
|
1
|
+
#ifndef COLORS_H
|
2
|
+
#define COLORS_H
|
3
|
+
|
4
|
+
#include "../deps/uthash/uthash.h"
|
5
|
+
|
6
|
+
#ifdef __cplusplus
|
7
|
+
extern "C" {
|
8
|
+
#endif
|
9
|
+
|
10
|
+
struct css_colors {
|
11
|
+
char name[22]; /* key */
|
12
|
+
char color[10];
|
13
|
+
UT_hash_handle hh; /* makes this structure hashable */
|
14
|
+
};
|
15
|
+
|
16
|
+
/* Assemble a mapping of color names */
|
17
|
+
void mtex2MML_create_css_colors(struct css_colors **colors);
|
18
|
+
|
19
|
+
#ifdef __cplusplus
|
20
|
+
}
|
21
|
+
#endif
|
22
|
+
|
23
|
+
#endif /* ! COLORS_H */
|
@@ -0,0 +1,99 @@
|
|
1
|
+
#include "em.h"
|
2
|
+
#include <stdio.h>
|
3
|
+
#include <stdlib.h>
|
4
|
+
#include "../deps/strdup/strdup.h"
|
5
|
+
#include "../deps/uthash/utstring.h"
|
6
|
+
|
7
|
+
float mtex2MML_extract_number_from_pxstring(char * str)
|
8
|
+
{
|
9
|
+
float dbl;
|
10
|
+
int match = 0;
|
11
|
+
|
12
|
+
match = sscanf (str, "%*[^-0123456789]%f", &dbl);
|
13
|
+
if (match == 1) {
|
14
|
+
return dbl;
|
15
|
+
}
|
16
|
+
|
17
|
+
/* must not be a float */
|
18
|
+
sscanf (str, "%d", &match);
|
19
|
+
return (float) match;
|
20
|
+
}
|
21
|
+
|
22
|
+
char *mtex2MML_extract_string_from_pxstring(char * str)
|
23
|
+
{
|
24
|
+
char *pixel;
|
25
|
+
float dbl;
|
26
|
+
pixel = malloc(3*sizeof(char));
|
27
|
+
sscanf (str, "%f%s", &dbl, pixel);
|
28
|
+
return pixel;
|
29
|
+
}
|
30
|
+
|
31
|
+
char *mtex2MML_dbl2em(char *str)
|
32
|
+
{
|
33
|
+
float dbl;
|
34
|
+
char *em_str;
|
35
|
+
UT_string *em;
|
36
|
+
utstring_new(em);
|
37
|
+
|
38
|
+
dbl = mtex2MML_extract_number_from_pxstring(str);
|
39
|
+
dbl *= 0.056;
|
40
|
+
|
41
|
+
utstring_printf(em, "%.3fem", dbl);
|
42
|
+
em_str = strdup(utstring_body(em));
|
43
|
+
|
44
|
+
utstring_free(em);
|
45
|
+
|
46
|
+
return em_str;
|
47
|
+
}
|
48
|
+
|
49
|
+
char *mtex2MML_double_pixel(float f, char *pixel)
|
50
|
+
{
|
51
|
+
float dbl;
|
52
|
+
char *em_str;
|
53
|
+
UT_string *em;
|
54
|
+
utstring_new(em);
|
55
|
+
|
56
|
+
dbl = f * 2;
|
57
|
+
utstring_printf(em, "%.3f%s", dbl, pixel);
|
58
|
+
em_str = strdup(utstring_body(em));
|
59
|
+
|
60
|
+
utstring_free(em);
|
61
|
+
|
62
|
+
return em_str;
|
63
|
+
}
|
64
|
+
|
65
|
+
char *mtex2MML_implement_skew(char *base_str, char *em_skew, char *pattern)
|
66
|
+
{
|
67
|
+
char *skew_mathml_str;
|
68
|
+
UT_string *skew_mathml;
|
69
|
+
utstring_new(skew_mathml);
|
70
|
+
|
71
|
+
utstring_printf(skew_mathml, "%s%s%s", "<mrow><mrow><mrow><mover><mrow>", base_str, "<mspace width=\"");
|
72
|
+
utstring_printf(skew_mathml, "%s%s%s", em_skew, "\" /></mrow>", "<mo stretchy=\"false\">");
|
73
|
+
utstring_printf(skew_mathml, "%s%s%s", pattern, "</mo></mover></mrow><mspace width=\"-", em_skew);
|
74
|
+
utstring_printf(skew_mathml, "%s", "\" /></mrow><mrow></mrow></mrow>");
|
75
|
+
|
76
|
+
skew_mathml_str = strdup(utstring_body(skew_mathml));
|
77
|
+
|
78
|
+
utstring_free(skew_mathml);
|
79
|
+
|
80
|
+
return skew_mathml_str;
|
81
|
+
}
|
82
|
+
|
83
|
+
char *mtex2MML_root_pos_to_em(char * str)
|
84
|
+
{
|
85
|
+
float dbl;
|
86
|
+
char *em_str;
|
87
|
+
UT_string *em;
|
88
|
+
utstring_new(em);
|
89
|
+
|
90
|
+
dbl = mtex2MML_extract_number_from_pxstring(str);
|
91
|
+
dbl /= 15;
|
92
|
+
|
93
|
+
utstring_printf(em, "%.3fem", dbl);
|
94
|
+
em_str = strdup(utstring_body(em));
|
95
|
+
|
96
|
+
utstring_free(em);
|
97
|
+
|
98
|
+
return em_str;
|
99
|
+
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#ifndef EM_H
|
2
|
+
#define EM_H
|
3
|
+
|
4
|
+
#ifdef __cplusplus
|
5
|
+
extern "C" {
|
6
|
+
#endif
|
7
|
+
|
8
|
+
/* given a pixel string, retrieve the numeric portion from it */
|
9
|
+
float mtex2MML_extract_number_from_pxstring(char * str);
|
10
|
+
|
11
|
+
/* given a pixel string, retrieve the pixel type portion from it */
|
12
|
+
char *mtex2MML_extract_string_from_pxstring(char * str);
|
13
|
+
|
14
|
+
/* given a number, return it as an em */
|
15
|
+
char *mtex2MML_dbl2em(char *str);
|
16
|
+
|
17
|
+
/* given a number, return it as a root position
|
18
|
+
taken straight from MathJax */
|
19
|
+
char *mtex2MML_root_pos_to_em(char * str);
|
20
|
+
|
21
|
+
/* given a number and a pixel string, return the doubled number */
|
22
|
+
char *mtex2MML_double_pixel(float f, char *pixel);
|
23
|
+
|
24
|
+
/* construct a skew sequence */
|
25
|
+
char *mtex2MML_implement_skew(char *base_str, char *em_skew, char *pattern);
|
26
|
+
|
27
|
+
#ifdef __cplusplus
|
28
|
+
}
|
29
|
+
#endif
|
30
|
+
|
31
|
+
#endif /* ! EM_H */
|
@@ -3,7 +3,8 @@
|
|
3
3
|
#include <string.h>
|
4
4
|
#include <math.h>
|
5
5
|
|
6
|
-
#include "
|
6
|
+
#include "../deps/strdup/strdup.h"
|
7
|
+
#include "environment.h"
|
7
8
|
#include "string_extras.h"
|
8
9
|
|
9
10
|
static const char *BEGIN = "\\begin";
|
@@ -15,9 +16,9 @@ const char *HLINE = "\\hline", *HDASHLINE = "\\hdashline",
|
|
15
16
|
*CR_SEPARATOR = "\\cr",
|
16
17
|
*NEWLINE_SEPARATOR = "\\newline",
|
17
18
|
*EM_PATTERN_BEGIN = "\\[", *EM_PATTERN_END = "]",
|
18
|
-
|
19
|
+
*NOTAG = "\\notag", *NONUMBER = "\\nonumber";
|
19
20
|
|
20
|
-
int
|
21
|
+
int mtex2MML_determine_environment(const char *environment)
|
21
22
|
{
|
22
23
|
if (strstr(environment, "\\end{smallmatrix}") != NULL) {
|
23
24
|
return ENV_SMALLMATRIX;
|
@@ -44,28 +45,27 @@ int determine_environment(const char *environment)
|
|
44
45
|
return OTHER;
|
45
46
|
}
|
46
47
|
|
47
|
-
int
|
48
|
+
int mtex2MML_identify_eqn_number(envType environment_type, char *line)
|
48
49
|
{
|
49
|
-
|
50
|
-
|
50
|
+
/* some environments have labelling for every row.
|
51
|
+
supress it if it has a \notag or \nonumber */
|
51
52
|
if (environment_type == ENV_EQUATION || \
|
52
53
|
environment_type == ENV_ALIGN || \
|
53
54
|
environment_type == ENV_ALIGNAT ||
|
54
55
|
environment_type == ENV_EQNARRAY) {
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
}
|
61
|
-
else {
|
56
|
+
if (line == NULL) {
|
57
|
+
return 1;
|
58
|
+
} else
|
59
|
+
return !(strstr(line, NOTAG) != NULL || \
|
60
|
+
strstr(line, NONUMBER) != NULL);
|
61
|
+
} else {
|
62
62
|
return 0;
|
63
63
|
}
|
64
64
|
}
|
65
65
|
|
66
|
-
void
|
66
|
+
void mtex2MML_env_replacements(UT_array **environment_data_stack, encaseType **encase, const char *environment)
|
67
67
|
{
|
68
|
-
|
68
|
+
/* if not an environment, don't bother going on */
|
69
69
|
if ((strstr(environment, BEGIN) == NULL && strstr(environment, END) == NULL) || strstr(environment, BEGIN_SVG)) {
|
70
70
|
return;
|
71
71
|
}
|
@@ -79,12 +79,12 @@ void env_replacements(UT_array **environment_data_stack, encaseType * encase, co
|
|
79
79
|
*temp = "", **prev_stack_item,
|
80
80
|
*a, *em_str;
|
81
81
|
|
82
|
-
int rowlines_stack_len = 0,
|
82
|
+
unsigned int rowlines_stack_len = 0, eqn = 0, i = 0, insertion_idx = 0;
|
83
83
|
|
84
84
|
char *dupe_environment = strdup(environment);
|
85
85
|
char *line = strtok(dupe_environment, "\n");
|
86
86
|
|
87
|
-
|
87
|
+
/* set up the array stack */
|
88
88
|
utarray_new(array_stack, &ut_str_icd);
|
89
89
|
utarray_new(row_spacing_stack, &ut_str_icd);
|
90
90
|
utarray_new(rowlines_stack, &ut_str_icd);
|
@@ -94,7 +94,7 @@ void env_replacements(UT_array **environment_data_stack, encaseType * encase, co
|
|
94
94
|
utarray_push_back(array_stack, &line);
|
95
95
|
|
96
96
|
if (strstr(line, END) != NULL) {
|
97
|
-
envType environment_type =
|
97
|
+
envType environment_type = mtex2MML_determine_environment(line);
|
98
98
|
|
99
99
|
while (utarray_len(array_stack) > 0) {
|
100
100
|
prev_stack_item = (char **)utarray_back(array_stack);
|
@@ -102,34 +102,34 @@ void env_replacements(UT_array **environment_data_stack, encaseType * encase, co
|
|
102
102
|
rowlines_stack_len = utarray_len(rowlines_stack);
|
103
103
|
at_top = strstr(*prev_stack_item, BEGIN);
|
104
104
|
|
105
|
-
|
105
|
+
/* we've reached the top, but there looks like there might be some data */
|
106
106
|
if (at_top != NULL && strstr(*prev_stack_item, LINE_SEPARATOR) == NULL && \
|
107
107
|
strstr(*prev_stack_item, CR_SEPARATOR) == NULL && \
|
108
108
|
strstr(*prev_stack_item, NEWLINE_SEPARATOR) == NULL) {
|
109
109
|
if (strstr(*prev_stack_item, HLINE) != NULL || strstr(*prev_stack_item, HDASHLINE) != NULL) {
|
110
|
-
*encase = TOPENCLOSE;
|
110
|
+
*encase = (encaseType*)TOPENCLOSE;
|
111
111
|
}
|
112
|
-
|
112
|
+
/* TODO: not super confident this is bulletproof */
|
113
113
|
if (rowlines_stack_len == 0) {
|
114
|
-
eqn =
|
114
|
+
eqn = mtex2MML_identify_eqn_number(environment_type, *prev_stack_item);
|
115
115
|
utarray_push_back(eqn_number_stack, &eqn);
|
116
116
|
}
|
117
117
|
break;
|
118
118
|
}
|
119
119
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
120
|
+
/* these environments are a bit...special. they still use
|
121
|
+
the same line separators, so they tend to mess with "proper"
|
122
|
+
labelled environments, because they exist within \begin{equation}
|
123
|
+
if we find one, erase all the stored row info. */
|
124
124
|
if (strstr(*prev_stack_item, "\\eqalign") != NULL || \
|
125
|
-
|
125
|
+
strstr(*prev_stack_item, "\\split") != NULL) {
|
126
126
|
for (i = rowlines_stack_len; i > 1; i--) {
|
127
127
|
utarray_pop_back(rowlines_stack);
|
128
128
|
utarray_pop_back(eqn_number_stack);
|
129
129
|
}
|
130
130
|
}
|
131
131
|
|
132
|
-
|
132
|
+
/* looking for a hline/hdashline match */
|
133
133
|
if (strstr(*prev_stack_item, HLINE) != NULL) {
|
134
134
|
if (rowlines_stack_len > 0) {
|
135
135
|
utarray_pop_back(rowlines_stack);
|
@@ -147,24 +147,24 @@ void env_replacements(UT_array **environment_data_stack, encaseType * encase, co
|
|
147
147
|
utarray_push_back(rowlines_stack, &a);
|
148
148
|
}
|
149
149
|
|
150
|
-
eqn =
|
150
|
+
eqn = mtex2MML_identify_eqn_number(environment_type, *prev_stack_item);
|
151
151
|
utarray_push_back(eqn_number_stack, &eqn);
|
152
152
|
|
153
|
-
|
153
|
+
/* if there's a line break... */
|
154
154
|
if (strstr(*prev_stack_item, LINE_SEPARATOR) != NULL || \
|
155
155
|
strstr(*prev_stack_item, CR_SEPARATOR) != NULL || \
|
156
156
|
strstr(*prev_stack_item, NEWLINE_SEPARATOR) != NULL) {
|
157
|
-
|
157
|
+
/* ...with an emphasis match, add it... */
|
158
158
|
if ( (tok = strstr(*prev_stack_item, EM_PATTERN_BEGIN)) != NULL) {
|
159
|
-
temp = tok + 2;
|
159
|
+
temp = tok + 2; /* skip the first part ("\[") */
|
160
160
|
if ( (tok = strstr(temp, EM_PATTERN_END)) != NULL) {
|
161
|
-
|
162
|
-
char *s =
|
161
|
+
mtex2MML_remove_last_char(temp);
|
162
|
+
char *s = strdup(temp);
|
163
163
|
utarray_push_back(row_spacing_stack, &s);
|
164
164
|
free(s);
|
165
165
|
}
|
166
166
|
}
|
167
|
-
|
167
|
+
/* ...otherwise, use the default emphasis */
|
168
168
|
else {
|
169
169
|
if (environment_type == ENV_SMALLMATRIX) {
|
170
170
|
em_str = "0.2em";
|
@@ -181,25 +181,25 @@ void env_replacements(UT_array **environment_data_stack, encaseType * encase, co
|
|
181
181
|
}
|
182
182
|
}
|
183
183
|
|
184
|
-
|
184
|
+
/* make sure to pop at the end here; it messes with some references in Travis/Ubuntu for some reason */
|
185
185
|
utarray_pop_back(array_stack);
|
186
186
|
|
187
|
-
|
187
|
+
/* we've reached the top, so stop. */
|
188
188
|
if (at_top != NULL) {
|
189
189
|
break;
|
190
190
|
}
|
191
191
|
}
|
192
192
|
|
193
|
-
|
194
|
-
|
195
|
-
|
193
|
+
/* some environments only have one label for the whole environment,
|
194
|
+
rather than a label per row. in that case, jam a label
|
195
|
+
in the middle. */
|
196
196
|
if (environment_type == ENV_GATHER || environment_type == ENV_MULTLINE) {
|
197
197
|
insertion_idx = ceil(utarray_len(eqn_number_stack) / 2);
|
198
198
|
eqn = 1;
|
199
199
|
utarray_insert(eqn_number_stack, &eqn, insertion_idx);
|
200
200
|
utarray_pop_back(eqn_number_stack);
|
201
201
|
}
|
202
|
-
|
202
|
+
mtex2MML_perform_replacement(environment_data_stack, rowlines_stack, environment_type, eqn_number_stack, row_spacing_stack);
|
203
203
|
|
204
204
|
utarray_clear(row_spacing_stack);
|
205
205
|
utarray_clear(rowlines_stack);
|
@@ -218,27 +218,29 @@ void env_replacements(UT_array **environment_data_stack, encaseType * encase, co
|
|
218
218
|
free(dupe_environment);
|
219
219
|
}
|
220
220
|
|
221
|
-
void
|
221
|
+
void mtex2MML_perform_replacement(UT_array **environment_data_stack, UT_array *rowlines_stack, envType environment_type, UT_array *eqn_number_stack, UT_array *row_spacing_stack)
|
222
222
|
{
|
223
223
|
char *a, *attr_rowlines, *attr_rowspacing;
|
224
224
|
envdata_t env_data;
|
225
225
|
|
226
|
-
|
227
|
-
if (utarray_len(rowlines_stack) != 0)
|
226
|
+
/* we cut the last char because we can always skip the first row */
|
227
|
+
if (utarray_len(rowlines_stack) != 0) {
|
228
228
|
utarray_pop_back(rowlines_stack);
|
229
|
+
}
|
229
230
|
|
230
|
-
if (utarray_len(eqn_number_stack) > 1)
|
231
|
+
if (utarray_len(eqn_number_stack) > 1) {
|
231
232
|
utarray_erase(eqn_number_stack, 0, 1);
|
233
|
+
}
|
232
234
|
|
233
|
-
int line_count = utarray_len(rowlines_stack);
|
235
|
+
unsigned int line_count = utarray_len(rowlines_stack);
|
234
236
|
|
235
|
-
|
237
|
+
/* empty rowlines should be reset */
|
236
238
|
if (line_count == 0) {
|
237
239
|
a = "none";
|
238
240
|
utarray_push_back(rowlines_stack, &a);
|
239
241
|
}
|
240
242
|
|
241
|
-
|
243
|
+
/* given the row_attribute values, construct an attribute list (separated by spaces) */
|
242
244
|
UT_string *l;
|
243
245
|
utstring_new(l);
|
244
246
|
char **o=NULL;
|
@@ -250,10 +252,10 @@ void perform_replacement(UT_array **environment_data_stack, UT_array *rowlines_s
|
|
250
252
|
|
251
253
|
attr_rowlines = utstring_body(l);
|
252
254
|
if (strlen(attr_rowlines) > 0) {
|
253
|
-
|
255
|
+
mtex2MML_remove_last_char(attr_rowlines); /* remove the final space */
|
254
256
|
}
|
255
257
|
|
256
|
-
|
258
|
+
/* given the row_spacing values, construct an attribute list (separated by spaces) */
|
257
259
|
UT_string *s;
|
258
260
|
utstring_new(s);
|
259
261
|
char **p=NULL;
|
@@ -269,7 +271,7 @@ void perform_replacement(UT_array **environment_data_stack, UT_array *rowlines_s
|
|
269
271
|
|
270
272
|
attr_rowspacing = utstring_body(s);
|
271
273
|
if (strlen(attr_rowspacing) > 0) {
|
272
|
-
|
274
|
+
mtex2MML_remove_last_char(attr_rowspacing); /* remove the final space */
|
273
275
|
} else {
|
274
276
|
if (environment_type == ENV_SMALLMATRIX) {
|
275
277
|
attr_rowspacing = "0.2em";
|
@@ -280,7 +282,7 @@ void perform_replacement(UT_array **environment_data_stack, UT_array *rowlines_s
|
|
280
282
|
}
|
281
283
|
}
|
282
284
|
|
283
|
-
|
285
|
+
/* store pertinent metadata */
|
284
286
|
env_data.rowspacing = attr_rowspacing;
|
285
287
|
env_data.rowlines = attr_rowlines;
|
286
288
|
env_data.environment_type = environment_type;
|
@@ -292,23 +294,23 @@ void perform_replacement(UT_array **environment_data_stack, UT_array *rowlines_s
|
|
292
294
|
utstring_free(s);
|
293
295
|
}
|
294
296
|
|
295
|
-
|
297
|
+
char *mtex2MML_vertical_pipe_extract(char *string)
|
296
298
|
{
|
297
299
|
char *dupe = strdup(string);
|
298
300
|
UT_string *columnlines, *border;
|
299
301
|
char *previous_column = "", *attr_columnlines, *attr_border;
|
300
|
-
int i = 0;
|
302
|
+
unsigned int i = 0;
|
301
303
|
|
302
304
|
utstring_new(columnlines);
|
303
305
|
utstring_new(border);
|
304
306
|
|
305
|
-
|
307
|
+
/* the first character (if it exists) determines the frame border */
|
306
308
|
if (strncmp(dupe, "s", 1) == 0) {
|
307
309
|
utstring_printf(columnlines, "%s", "frame=\"solid\" columnlines=\"");
|
308
|
-
|
310
|
+
mtex2MML_remove_first_char(dupe);
|
309
311
|
} else if (strncmp(dupe, "d", 1) == 0) {
|
310
312
|
utstring_printf(columnlines, "%s", "frame=\"dashed\" columnlines=\"");
|
311
|
-
|
313
|
+
mtex2MML_remove_first_char(dupe);
|
312
314
|
} else {
|
313
315
|
utstring_printf(columnlines, "%s", "columnlines=\"");
|
314
316
|
}
|
@@ -323,8 +325,9 @@ const char *vertical_pipe_extract(const char *string)
|
|
323
325
|
previous_column = "d";
|
324
326
|
utstring_printf(border, "%s ", "dashed");
|
325
327
|
} else {
|
326
|
-
|
327
|
-
|
328
|
+
/* we must skip the first blank col only if there is no previous border
|
329
|
+
should a border be considered, eg. "cc", not "c|c" */
|
330
|
+
if (i >= 1) {
|
328
331
|
if (strncmp(previous_column, "s", 1) != 0 && strncmp(previous_column, "d", 1) != 0) {
|
329
332
|
utstring_printf(border, "%s ", "none");
|
330
333
|
}
|
@@ -338,11 +341,11 @@ const char *vertical_pipe_extract(const char *string)
|
|
338
341
|
|
339
342
|
attr_border = utstring_body(border);
|
340
343
|
if (strlen(attr_border) > 0) {
|
341
|
-
|
344
|
+
mtex2MML_remove_last_char(attr_border); /* remove the final space */
|
342
345
|
}
|
343
346
|
utstring_printf(columnlines, "%s", attr_border);
|
344
347
|
|
345
|
-
|
348
|
+
/* an empty string here angers Lasem, so let's remember to add 'none' */
|
346
349
|
if (utstring_len(border) == 0) {
|
347
350
|
utstring_printf(columnlines, "%s", "none");
|
348
351
|
}
|
@@ -355,7 +358,7 @@ const char *vertical_pipe_extract(const char *string)
|
|
355
358
|
return attr_columnlines;
|
356
359
|
}
|
357
360
|
|
358
|
-
|
361
|
+
char *mtex2MML_remove_excess_pipe_chars(char *string)
|
359
362
|
{
|
360
363
|
UT_string *columnalign;
|
361
364
|
utstring_new(columnalign);
|
@@ -376,15 +379,15 @@ const char *remove_excess_pipe_chars(const char *string)
|
|
376
379
|
utstring_free(columnalign);
|
377
380
|
|
378
381
|
if (strlen(attr_columnalign) > 0) {
|
379
|
-
|
382
|
+
mtex2MML_remove_last_char(attr_columnalign); /* remove the final space */
|
380
383
|
}
|
381
384
|
|
382
385
|
return attr_columnalign;
|
383
386
|
}
|
384
387
|
|
385
|
-
|
388
|
+
char *mtex2MML_combine_row_data(UT_array **environment_data_stack)
|
386
389
|
{
|
387
|
-
|
390
|
+
/* if no information was provided, give a standard sizing */
|
388
391
|
if (utarray_len(*environment_data_stack) == 0) {
|
389
392
|
const char* s = "rowspacing=\"0.5ex\" rowlines=\"none\"";
|
390
393
|
char* c = (char*)malloc(strlen(s) + 1);
|
@@ -400,7 +403,7 @@ const char *combine_row_data(UT_array **environment_data_stack)
|
|
400
403
|
UT_string *row_attr_data;
|
401
404
|
utstring_new(row_attr_data);
|
402
405
|
|
403
|
-
|
406
|
+
/* combine the row spacing and row lines data */
|
404
407
|
utstring_printf(row_attr_data, "%s%s\" %s\"", "rowspacing=\"", row_spacing_data, row_lines_data);
|
405
408
|
|
406
409
|
row_attr = strdup(utstring_body(row_attr_data));
|
@@ -411,9 +414,9 @@ const char *combine_row_data(UT_array **environment_data_stack)
|
|
411
414
|
return row_attr;
|
412
415
|
}
|
413
416
|
|
414
|
-
int
|
417
|
+
int mtex2MML_fetch_eqn_number(UT_array **environment_data_stack)
|
415
418
|
{
|
416
|
-
|
419
|
+
/* if no information was provided, expect nothing */
|
417
420
|
if (utarray_len(*environment_data_stack) == 0) {
|
418
421
|
return 0;
|
419
422
|
}
|
@@ -429,94 +432,7 @@ int fetch_eqn_number(UT_array **environment_data_stack)
|
|
429
432
|
return *e;
|
430
433
|
}
|
431
434
|
|
432
|
-
|
433
|
-
{
|
434
|
-
float dbl;
|
435
|
-
int match = 0;
|
436
|
-
|
437
|
-
match = sscanf (str, "%*[^-0123456789]%f", &dbl);
|
438
|
-
if (match == 1) {
|
439
|
-
return dbl;
|
440
|
-
}
|
441
|
-
|
442
|
-
// must not be a float.
|
443
|
-
sscanf (str, "%d", &match);
|
444
|
-
return (float) match;
|
445
|
-
}
|
446
|
-
|
447
|
-
const char *extract_string_from_pxstring(const char * str)
|
448
|
-
{
|
449
|
-
char *pixel;
|
450
|
-
float dbl;
|
451
|
-
pixel = malloc(3*sizeof(char));
|
452
|
-
sscanf (str, "%f%s", &dbl, pixel);
|
453
|
-
return pixel;
|
454
|
-
}
|
455
|
-
|
456
|
-
const char * dbl2em(const char *str)
|
457
|
-
{
|
458
|
-
UT_string *em;
|
459
|
-
utstring_new(em);
|
460
|
-
|
461
|
-
float dbl = extract_number_from_pxstring(str);
|
462
|
-
dbl *= 0.056;
|
463
|
-
|
464
|
-
utstring_printf(em, "%.3fem", dbl);
|
465
|
-
char * em_str = strdup(utstring_body(em));
|
466
|
-
|
467
|
-
utstring_free(em);
|
468
|
-
|
469
|
-
return em_str;
|
470
|
-
}
|
471
|
-
|
472
|
-
const char * double_pixel(float f, char *pixel)
|
473
|
-
{
|
474
|
-
UT_string *em;
|
475
|
-
utstring_new(em);
|
476
|
-
|
477
|
-
float dbl = f * 2;
|
478
|
-
utstring_printf(em, "%.3f%s", dbl, pixel);
|
479
|
-
char * em_str = strdup(utstring_body(em));
|
480
|
-
|
481
|
-
utstring_free(em);
|
482
|
-
|
483
|
-
return em_str;
|
484
|
-
}
|
485
|
-
|
486
|
-
const char * implement_skew(char *base_str, char *em_skew, char *pattern)
|
487
|
-
{
|
488
|
-
UT_string *skew_mathml;
|
489
|
-
utstring_new(skew_mathml);
|
490
|
-
|
491
|
-
utstring_printf(skew_mathml, "%s%s%s", "<mrow><mrow><mrow><mover><mrow>", base_str, "<mspace width=\"");
|
492
|
-
utstring_printf(skew_mathml, "%s%s%s", em_skew, "\" /></mrow>", "<mo stretchy=\"false\">");
|
493
|
-
utstring_printf(skew_mathml, "%s%s%s", pattern, "</mo></mover></mrow><mspace width=\"-", em_skew);
|
494
|
-
utstring_printf(skew_mathml, "%s", "\" /></mrow><mrow></mrow></mrow>");
|
495
|
-
|
496
|
-
char * skew_mathml_str = strdup(utstring_body(skew_mathml));
|
497
|
-
|
498
|
-
utstring_free(skew_mathml);
|
499
|
-
|
500
|
-
return skew_mathml_str;
|
501
|
-
}
|
502
|
-
|
503
|
-
const char * root_pos_to_em(const char * str)
|
504
|
-
{
|
505
|
-
UT_string *em;
|
506
|
-
utstring_new(em);
|
507
|
-
|
508
|
-
float dbl = extract_number_from_pxstring(str);
|
509
|
-
dbl /= 15;
|
510
|
-
|
511
|
-
utstring_printf(em, "%.3fem", dbl);
|
512
|
-
char * em_str = strdup(utstring_body(em));
|
513
|
-
|
514
|
-
utstring_free(em);
|
515
|
-
|
516
|
-
return em_str;
|
517
|
-
}
|
518
|
-
|
519
|
-
envType current_env_type(UT_array **environment_data_stack)
|
435
|
+
envType mtex2MML_current_env_type(UT_array **environment_data_stack)
|
520
436
|
{
|
521
437
|
if (utarray_len(*environment_data_stack) == 0) {
|
522
438
|
return -1;
|
@@ -527,7 +443,7 @@ envType current_env_type(UT_array **environment_data_stack)
|
|
527
443
|
return row_data_elem->environment_type;
|
528
444
|
}
|
529
445
|
|
530
|
-
int
|
446
|
+
int mtex2MML_current_env_line_count(UT_array **environment_data_stack)
|
531
447
|
{
|
532
448
|
if (utarray_len(*environment_data_stack) == 0) {
|
533
449
|
return -1;
|