Rev 7076 | Rev 13310 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5520 | bpr | 1 | /* |
2 | itex2MML 1.3.3 |
||
3 | renamed to "wims_mathml" |
||
4 | Slightly modified for WIMS mathml usage 05/2012 |
||
5 | J.M. Evers, B. Perrin-Riou |
||
8796 | bpr | 6 | |
5520 | bpr | 7 | */ |
8 | |||
9 | #include <cstdio> |
||
10 | #include <string> |
||
8796 | bpr | 11 | #include "wims_mathml.h" |
5520 | bpr | 12 | |
13 | // these C headers are needed to compile on OpenSuSE Linux (and others?) to use atoi/strlen |
||
14 | #include <string.h> |
||
15 | #include <stdlib.h> |
||
16 | #include <sys/time.h> |
||
17 | |||
18 | |||
19 | int use_javascript; |
||
20 | char wims_texfontsize[64]; // is set by cmd-line argument "--tex-size" via wims |
||
21 | char wims_mathml_id[64]; // is set by cmd-line argument "--mathml-id" via wims |
||
22 | |||
23 | const int set_javascript(){ |
||
24 | if(use_javascript == 1){ |
||
25 | return 1; |
||
26 | } |
||
27 | else |
||
28 | { |
||
29 | return 0; |
||
30 | } |
||
31 | } |
||
32 | const char * read_mathml_id(){ |
||
33 | return wims_mathml_id; // wims_mathml.y will use this in first <mstyle id="read_mathml_id()" ... |
||
8796 | bpr | 34 | // the whole mathml-string will get this "id" ; does not interfere (?) with "maction" tag, which is on "sub math level" |
5520 | bpr | 35 | } |
36 | |||
37 | const char * read_fontsize(){ // declared in wims_mathml.h |
||
38 | // in not given : mathsize="110%" |
||
39 | if(strlen(wims_texfontsize) == 0){snprintf(wims_texfontsize,sizeof(wims_texfontsize),"%s","110%");} |
||
40 | return wims_texfontsize; // wims_mathml.y will use this in first <mstyle mathsize="read_fontsize()" ... |
||
41 | } |
||
8796 | bpr | 42 | // count number of substring occurences |
5520 | bpr | 43 | int count_substrings( const std::string & str , const std::string & obj ) { |
44 | int n = 0; |
||
45 | std::string ::size_type position = 0; |
||
46 | while( (position = obj.find( str, position )) != std::string::npos ){ |
||
47 | n++; |
||
48 | position += str.size(); |
||
49 | } |
||
50 | return n; |
||
51 | } |
||
52 | |||
53 | int main (int argc, char ** argv) |
||
54 | { |
||
55 | bool bPrintItex = false; |
||
56 | bool bRawFilter = false; |
||
57 | bool bInline = false; |
||
58 | bool bDisplay = false; |
||
59 | bool bTexString = false; |
||
60 | bool bStop = false; |
||
61 | bool bForbidMarkup = false; |
||
62 | // wims |
||
63 | int MAX_MML_SIZE = 8192; |
||
64 | int i_texstring = 0; |
||
65 | int insize=0; |
||
66 | using namespace std; |
||
67 | std::string itex; |
||
68 | for (int arg = 1; arg < argc; arg++) |
||
69 | { |
||
70 | std::string args = argv[arg]; |
||
71 | |||
72 | if (args == "--version" || args == "-v") |
||
73 | { |
||
74 | fputs("wims_mathml version " ITEX2MML_VERSION "\n" |
||
75 | "See http://golem.ph.utexas.edu/~distler/blog/wims_mathml.html for more information.\n", stdout); |
||
76 | bStop = true; |
||
77 | break; |
||
78 | } |
||
79 | |||
80 | if (args == "--help" || args == "-h"){ |
||
81 | fputs ("usage: wims_mathml [OPTIONS]\n" |
||
82 | "\n" |
||
83 | "wims_mathml filters an input text stream (e.g., an XHTML web page) converting itex expressions\n" |
||
84 | "to MathML. Inline itex expressions are delimited either side by single dollar symbols ($):\n" |
||
85 | "\n" |
||
86 | "\t<p>The parameters $\\alpha$ and $\\beta$ in the function $f(x)$ are defined below.</p>\n" |
||
87 | "\n" |
||
88 | "For normal display of equations, etc., itex expressions can be delimited with double dollar\n" |
||
89 | "symbols ($$) either side or by \\[ to the left and \\] to the right:\n" |
||
90 | "\n" |
||
91 | "\t<p class=\"equation\">\\[\n" |
||
92 | "\t\tf(x) = \\alpha x + \\frac{\\beta}{1+|x|}\n" |
||
93 | "\t\\]</p>\n" |
||
94 | "\n" |
||
95 | "wims_mathml Options:\n" |
||
96 | "\n" |
||
97 | " --raw-filter filter input stream, converting equations as found to MathML [stops on error]\n" |
||
98 | " --inline converts a single itex equation, without any $ symbols, to inline MathML\n" |
||
99 | " --display converts a single itex equation, without any $ symbols, to display-mode MathML\n" |
||
100 | " --forbid-markup forbid markup (more precisely, the '<' and '>' characters) in itex equations\n" |
||
101 | " --print-itex used in conjuction with --inline or --display: prints the itex string\n" |
||
102 | "\n" |
||
103 | "WIMS USAGE:" |
||
104 | " --mathml-id unique random id for every mathml string\n" |
||
105 | " --tex-size base fontsize of the mathml string\n" |
||
106 | " --max-mml-size wims maximum stringlength \n" |
||
107 | " --tex-string the actual math string\n" |
||
108 | "\n" |
||
109 | "For further information, see http://golem.ph.utexas.edu/~distler/blog/wims_mathml.html\n", stdout); |
||
110 | bStop = true; |
||
111 | break; |
||
112 | } |
||
113 | if (args == "--print-itex"){ |
||
114 | bPrintItex = true; |
||
115 | bRawFilter = false; |
||
116 | continue; |
||
117 | } |
||
118 | if (args == "--forbid-markup"){ |
||
119 | bRawFilter = false; |
||
120 | bForbidMarkup = true; |
||
121 | continue; |
||
122 | } |
||
123 | if (args == "--inline"){ |
||
124 | bRawFilter = false; |
||
125 | bInline = true; |
||
126 | bDisplay = false; |
||
127 | continue; |
||
128 | } |
||
129 | if (args == "--display"){ |
||
130 | bRawFilter = false; |
||
131 | bInline = false; |
||
132 | bDisplay = true; |
||
133 | continue; |
||
134 | } |
||
135 | if (args == "--raw-filter"){ |
||
136 | bRawFilter = true; |
||
137 | bPrintItex = false; |
||
138 | bInline = false; |
||
139 | bDisplay = false; |
||
140 | continue; |
||
141 | } |
||
8796 | bpr | 142 | // wims |
5520 | bpr | 143 | if (args == "--use-zoom"){ |
144 | use_javascript = atoi( argv[arg+1] ); |
||
145 | continue; |
||
146 | } |
||
147 | if (args == "--tex-size"){ |
||
148 | snprintf(wims_texfontsize,sizeof(wims_texfontsize),"%s",argv[arg+1]); |
||
149 | continue; |
||
150 | } |
||
151 | if (args == "--max-mml-size"){ |
||
152 | MAX_MML_SIZE = atoi( argv[arg+1]); |
||
153 | continue; |
||
154 | } |
||
155 | if (args == "--tex-string"){ |
||
156 | bPrintItex = false; |
||
157 | bRawFilter = false; |
||
158 | bTexString = true; |
||
159 | bDisplay = false; |
||
160 | i_texstring = arg+1; |
||
161 | break; |
||
162 | } |
||
163 | } |
||
164 | if (bStop) return 0; |
||
5935 | schaersvoo | 165 | /* every mathml-string will have unique id */ |
5520 | bpr | 166 | struct timeval tv; |
167 | struct timezone tz; |
||
168 | struct tm *tm; |
||
169 | gettimeofday(&tv, &tz); |
||
5996 | schaersvoo | 170 | tm=localtime(( const time_t * ) &tv.tv_sec); |
7076 | obado | 171 | snprintf(wims_mathml_id,sizeof(wims_mathml_id),"wims_mathml%ld",long(tv.tv_usec)); |
5520 | bpr | 172 | |
173 | if(bTexString){ // WIMS modification: reads a 'latex string' from commandline, if arg="--tex-string" |
||
174 | char *input; |
||
175 | int dollarcnt = 0; |
||
176 | input = argv[i_texstring]; |
||
177 | while(input != NULL){ |
||
178 | for(int i = 0; i < strlen(input); i++){ |
||
179 | switch(input[i]){ |
||
180 | case '<':itex+= "\\lt ";break; // < \lt |
||
181 | case '>':itex+= "\\gt ";break; // < \gt |
||
182 | case '$':dollarcnt++;break; // ignore $ we put them directly in itex |
||
183 | default:itex+=(char) input[i]; |
||
184 | } |
||
185 | } |
||
186 | i_texstring++;// probably never more than 1 ... |
||
187 | input = argv[i_texstring]; |
||
188 | } |
||
189 | // common error to forget \right. |
||
190 | // this must be done before adding $ around itex |
||
191 | int left = count_substrings("\\left\\" ,itex) + count_substrings("\\left[" ,itex) + count_substrings("\\left(" ,itex) + count_substrings("\\left{" ,itex) + count_substrings("\\left." ,itex) + count_substrings("\\left \\" ,itex) + count_substrings("\\left [" ,itex) + count_substrings("\\left (" ,itex) + count_substrings("\\left {" ,itex) + count_substrings("\\left ." ,itex) ; |
||
192 | int right = count_substrings("\\right\\",itex) + count_substrings("\\right]",itex) + count_substrings("\\right)",itex) + count_substrings("\\right}",itex) + count_substrings("\\right.",itex) + count_substrings("\\right \\",itex) + count_substrings("\\right ]",itex) + count_substrings("\\right )",itex) + count_substrings("\\right }",itex) + count_substrings("\\right .",itex) ; |
||
193 | if( left != right){ |
||
194 | if( left > right){ |
||
195 | for(int i = 0 ; i<left-right;i++){ |
||
196 | itex+=" \\right."; |
||
197 | } |
||
198 | } |
||
199 | else |
||
200 | { |
||
201 | for(int i = 0 ; i<right-left;i++){ |
||
202 | itex="\\left. "+itex; |
||
203 | } |
||
204 | } |
||
205 | } |
||
206 | |||
207 | // finish the math mode with appropriate $-signs |
||
8796 | bpr | 208 | if( dollarcnt > 2 ){ |
5520 | bpr | 209 | bDisplay = true; // use display mode |
210 | itex="$$" + itex; |
||
211 | itex+="$$"; |
||
212 | } |
||
213 | else |
||
214 | { |
||
215 | bInline = true; // use inline mode |
||
216 | itex="$" + itex; |
||
217 | itex+="$"; |
||
218 | } |
||
219 | } |
||
220 | else // standard syntax echo "\frac{1}{2}" | wims_mathml --inline > test.xml |
||
221 | { // nothing changed here... |
||
222 | #define BUFSIZE 1024 |
||
223 | char buffer[BUFSIZE]; |
||
224 | if (bInline) itex += "$"; |
||
225 | if (bDisplay) itex += "$$"; |
||
226 | while (fgets (buffer, BUFSIZE, stdin)) itex += buffer; |
||
227 | if (bInline) itex += "$"; |
||
228 | if (bDisplay) itex += "$$"; |
||
229 | } |
||
230 | |||
231 | if (bPrintItex) |
||
232 | { |
||
233 | fputs (itex.c_str (), stdout); |
||
234 | fputs ("\n", stdout); |
||
235 | fflush (stdout); |
||
236 | } |
||
237 | |||
238 | if (!bInline && !bDisplay) |
||
239 | { |
||
240 | if (bRawFilter) |
||
241 | wims_mathml_filter (itex.c_str(), itex.size()); |
||
242 | else |
||
243 | if (bForbidMarkup) |
||
244 | wims_mathml_strict_html_filter (itex.c_str(), itex.size()); |
||
245 | else |
||
246 | wims_mathml_html_filter (itex.c_str(), itex.size()); |
||
247 | return 0; |
||
248 | } |
||
249 | char * mathml = wims_mathml_parse (itex.c_str(), itex.size() ); |
||
250 | |||
251 | if (mathml) |
||
252 | { |
||
253 | if(bTexString){ // wims usage |
||
254 | if(strlen(mathml) > (MAX_MML_SIZE)){ |
||
5537 | schaersvoo | 255 | fputs("ERROR",stdout); |
5520 | bpr | 256 | } |
257 | else |
||
258 | { |
||
259 | fputs (mathml, stdout); |
||
260 | } |
||
261 | } |
||
262 | else |
||
263 | { |
||
264 | fputs (mathml, stdout); |
||
265 | } |
||
266 | wims_mathml_free_string (mathml); |
||
267 | mathml = 0; |
||
268 | } |
||
269 | else |
||
270 | { |
||
271 | if(bTexString){ // wims usage |
||
5537 | schaersvoo | 272 | fprintf(stdout,"ERROR"); |
5520 | bpr | 273 | } |
274 | else |
||
275 | { |
||
276 | fputs ("wims_mathml: itex parser failed to generate MathML from itex!\n", stderr); |
||
277 | } |
||
278 | } |
||
279 | return 0; |
||
280 | } |