OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** | 5 /** |
6 * @fileoverview Speech rules for mathml and mathjax nodes. | 6 * @fileoverview Speech rules for mathml and mathjax nodes. |
7 */ | 7 */ |
8 | 8 |
9 goog.provide('cvox.MathmlStoreRules'); | 9 goog.provide('cvox.MathmlStoreRules'); |
10 | 10 |
11 goog.require('cvox.MathStore'); | 11 goog.require('cvox.MathStore'); |
12 goog.require('cvox.MathmlStore'); | 12 goog.require('cvox.MathmlStore'); |
13 goog.require('cvox.MathmlStoreUtil'); | 13 goog.require('cvox.MathmlStoreUtil'); |
14 goog.require('cvox.StoreUtil'); | 14 goog.require('cvox.StoreUtil'); |
15 | 15 |
16 | 16 |
17 /** | 17 /** |
18 * Rule initialization. | 18 * Rule initialization. |
19 * @constructor | 19 * @constructor |
20 */ | 20 */ |
21 cvox.MathmlStoreRules = function() { | 21 cvox.MathmlStoreRules = function() { |
22 // Custom functions used in the rules. | 22 // Custom functions used in the rules. |
23 cvox.MathmlStoreRules.initCustomFunctions_(); | 23 cvox.MathmlStoreRules.initCustomFunctions_(); |
24 cvox.MathmlStoreRules.initDefaultRules_(); // MathML rules. | 24 cvox.MathmlStoreRules.initDefaultRules_(); // MathML rules. |
25 cvox.MathmlStoreRules.initMathjaxRules_(); // MathJax Rules | 25 cvox.MathmlStoreRules.initMathjaxRules_(); // MathJax Rules |
26 cvox.MathmlStoreRules.initAliases_(); // MathJax Aliases for MathML rules. | 26 cvox.MathmlStoreRules.initAliases_(); // MathJax Aliases for MathML rules. |
27 cvox.MathmlStoreRules.initSpecializationRules_(); // Square, cube, etc. | 27 cvox.MathmlStoreRules.initSpecializationRules_(); // Square, cube, etc. |
28 cvox.MathmlStoreRules.initSemanticRules_(); | 28 cvox.MathmlStoreRules.initSemanticRules_(); |
29 }; | 29 }; |
30 goog.addSingletonGetter(cvox.MathmlStoreRules); | 30 goog.addSingletonGetter(cvox.MathmlStoreRules); |
31 | 31 |
32 | 32 |
33 /** | 33 /** |
34 * @type {cvox.MathStore} | 34 * @type {cvox.MathStore} |
35 */ | 35 */ |
36 cvox.MathmlStoreRules.mathStore = cvox.MathmlStore.getInstance(); | 36 cvox.MathmlStoreRules.mathStore = cvox.MathmlStore.getInstance(); |
37 /** | 37 /** |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 defineDefaultMathmlRule('merror', '[t] ""'); | 104 defineDefaultMathmlRule('merror', '[t] ""'); |
105 defineDefaultMathmlRule('mphantom', '[t] ""'); | 105 defineDefaultMathmlRule('mphantom', '[t] ""'); |
106 | 106 |
107 // Token elements. | 107 // Token elements. |
108 defineDefaultMathmlRule('mtext', '[t] text(); [p] (pause:200)'); | 108 defineDefaultMathmlRule('mtext', '[t] text(); [p] (pause:200)'); |
109 defineDefaultMathmlRule('mi', '[n] text()'); | 109 defineDefaultMathmlRule('mi', '[n] text()'); |
110 defineDefaultMathmlRule('mo', '[n] text() (rate:-0.1)'); | 110 defineDefaultMathmlRule('mo', '[n] text() (rate:-0.1)'); |
111 defineDefaultMathmlRule('mn', '[n] text()'); | 111 defineDefaultMathmlRule('mn', '[n] text()'); |
112 | 112 |
113 // Dealing with fonts. | 113 // Dealing with fonts. |
114 defineRule('mtext-variant', 'default.default', | 114 defineRule( |
| 115 'mtext-variant', 'default.default', |
115 '[t] "begin"; [t] @mathvariant (pause:150);' + | 116 '[t] "begin"; [t] @mathvariant (pause:150);' + |
116 '[t] text() (pause:150); [t] "end"; ' + | 117 '[t] text() (pause:150); [t] "end"; ' + |
117 '[t] @mathvariant (pause:200)', | 118 '[t] @mathvariant (pause:200)', |
118 'self::mathml:mtext', '@mathvariant', '@mathvariant!="normal"'); | 119 'self::mathml:mtext', '@mathvariant', '@mathvariant!="normal"'); |
119 | 120 |
120 defineRule('mi-variant', 'default.default', | 121 defineRule( |
121 '[t] @mathvariant; [n] text()', | 122 'mi-variant', 'default.default', '[t] @mathvariant; [n] text()', |
122 'self::mathml:mi', '@mathvariant', '@mathvariant!="normal"'); | 123 'self::mathml:mi', '@mathvariant', '@mathvariant!="normal"'); |
123 | 124 |
124 defineRuleAlias('mi-variant', 'self::mathml:mn', // mn | 125 defineRuleAlias( |
| 126 'mi-variant', 'self::mathml:mn', // mn |
125 '@mathvariant', '@mathvariant!="normal"'); | 127 '@mathvariant', '@mathvariant!="normal"'); |
126 | 128 |
127 defineRule('mo-variant', 'default.default', | 129 defineRule( |
128 '[t] @mathvariant; [n] text() (rate:-0.1)', | 130 'mo-variant', 'default.default', |
129 'self::mathml:mo', '@mathvariant', '@mathvariant!="normal"'); | 131 '[t] @mathvariant; [n] text() (rate:-0.1)', 'self::mathml:mo', |
| 132 '@mathvariant', '@mathvariant!="normal"'); |
130 | 133 |
131 defineDefaultMathmlRule( | 134 defineDefaultMathmlRule( |
132 'ms', | 135 'ms', '[t] "string" (pitch:0.5, rate:0.5); [t] text()'); |
133 '[t] "string" (pitch:0.5, rate:0.5); [t] text()'); | |
134 | 136 |
135 // Script elements. | 137 // Script elements. |
136 defineDefaultMathmlRule( | 138 defineDefaultMathmlRule( |
137 'msup', '[n] ./*[1]; [t] "super";' + | 139 'msup', |
| 140 '[n] ./*[1]; [t] "super";' + |
138 '[n] ./*[2] (pitch:0.35); [p] (pause:300)'); | 141 '[n] ./*[2] (pitch:0.35); [p] (pause:300)'); |
139 defineDefaultMathmlRule( | 142 defineDefaultMathmlRule( |
140 'msubsup', | 143 'msubsup', |
141 '[n] ./*[1]; [t] "sub"; [n] ./*[2] (pitch:-0.35); [p] (pause:200);' + | 144 '[n] ./*[1]; [t] "sub"; [n] ./*[2] (pitch:-0.35); [p] (pause:200);' + |
142 '[t] "super"; [n] ./*[3] (pitch:0.35); [p] (pause:300)' | 145 '[t] "super"; [n] ./*[3] (pitch:0.35); [p] (pause:300)'); |
143 ); | |
144 defineDefaultMathmlRule( | 146 defineDefaultMathmlRule( |
145 'msub', | 147 'msub', |
146 '[n] ./*[1]; [t] "sub"; [n] ./*[2] (pitch:-0.35); [p] (pause:300)'); | 148 '[n] ./*[1]; [t] "sub"; [n] ./*[2] (pitch:-0.35); [p] (pause:300)'); |
147 defineDefaultMathmlRule( | 149 defineDefaultMathmlRule( |
148 'mover', '[n] ./*[2] (pitch:0.35); [p] (pause:200);' + | 150 'mover', |
| 151 '[n] ./*[2] (pitch:0.35); [p] (pause:200);' + |
149 ' [t] "over"; [n] ./*[1]; [p] (pause:400)'); | 152 ' [t] "over"; [n] ./*[1]; [p] (pause:400)'); |
150 defineDefaultMathmlRule( | 153 defineDefaultMathmlRule( |
151 'munder', | 154 'munder', |
152 '[n] ./*[2] (pitch:-0.35); [t] "under"; [n] ./*[1]; [p] (pause:400)'); | 155 '[n] ./*[2] (pitch:-0.35); [t] "under"; [n] ./*[1]; [p] (pause:400)'); |
153 defineDefaultMathmlRule( | 156 defineDefaultMathmlRule( |
154 'munderover', | 157 'munderover', |
155 '[n] ./*[2] (pitch:-0.35); [t] "under and"; [n] ./*[3] (pitch:0.35);' + | 158 '[n] ./*[2] (pitch:-0.35); [t] "under and"; [n] ./*[3] (pitch:0.35);' + |
156 ' [t] "over"; [n] ./*[1]; [p] (pause:400)'); | 159 ' [t] "over"; [n] ./*[1]; [p] (pause:400)'); |
157 | 160 |
158 // Layout elements. | 161 // Layout elements. |
159 defineDefaultMathmlRule('mrow', '[m] ./*'); | 162 defineDefaultMathmlRule('mrow', '[m] ./*'); |
160 defineDefaultMathmlRule( | 163 defineDefaultMathmlRule( |
161 'msqrt', '[t] "Square root of"; [m] ./* (rate:0.2); [p] (pause:400)'); | 164 'msqrt', '[t] "Square root of"; [m] ./* (rate:0.2); [p] (pause:400)'); |
162 defineDefaultMathmlRule( | 165 defineDefaultMathmlRule( |
163 'mroot', '[t] "root of order"; [n] ./*[2]; [t] "of";' + | 166 'mroot', |
| 167 '[t] "root of order"; [n] ./*[2]; [t] "of";' + |
164 '[n] ./*[1] (rate:0.2); [p] (pause:400)'); | 168 '[n] ./*[1] (rate:0.2); [p] (pause:400)'); |
165 defineDefaultMathmlRule( | 169 defineDefaultMathmlRule( |
166 'mfrac', ' [p] (pause:400); [n] ./*[1] (pitch:0.3);' + | 170 'mfrac', |
| 171 ' [p] (pause:400); [n] ./*[1] (pitch:0.3);' + |
167 ' [t] "divided by"; [n] ./*[2] (pitch:-0.3); [p] (pause:400)'); | 172 ' [t] "divided by"; [n] ./*[2] (pitch:-0.3); [p] (pause:400)'); |
168 defineRule( | 173 defineRule( |
169 'mfrac', 'default.short', '[p] (pause:200); [t] "start frac";' + | 174 'mfrac', 'default.short', |
| 175 '[p] (pause:200); [t] "start frac";' + |
170 '[n] ./*[1] (pitch:0.3); [t] "over"; ' + | 176 '[n] ./*[1] (pitch:0.3); [t] "over"; ' + |
171 '[n] ./*[2] (pitch:-0.3); [p] (pause:400); [t] "end frac"', | 177 '[n] ./*[2] (pitch:-0.3); [p] (pause:400); [t] "end frac"', |
172 'self::mathml:mfrac'); | 178 'self::mathml:mfrac'); |
173 | 179 |
174 | 180 |
175 defineRule( | 181 defineRule( |
176 'mfenced-single', 'default.default', | 182 'mfenced-single', 'default.default', |
177 '[t] concat(substring(@open, 0 div boolean(@open)), ' + | 183 '[t] concat(substring(@open, 0 div boolean(@open)), ' + |
178 'substring("(", 0 div not(boolean(@open)))) (context:"opening"); ' + | 184 'substring("(", 0 div not(boolean(@open)))) (context:"opening"); ' + |
179 '[m] ./* (separator:@separators); ' + | 185 '[m] ./* (separator:@separators); ' + |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 'mtable', 'default.default', | 230 'mtable', 'default.default', |
225 '[t] "matrix"; [m] ./* (ctxtFunc:CTXFnodeCounter,' + | 231 '[t] "matrix"; [m] ./* (ctxtFunc:CTXFnodeCounter,' + |
226 'context:"row",pause:100)', | 232 'context:"row",pause:100)', |
227 'self::mathml:mtable'); | 233 'self::mathml:mtable'); |
228 | 234 |
229 defineRule( | 235 defineRule( |
230 'mtr', 'default.default', | 236 'mtr', 'default.default', |
231 '[m] ./* (ctxtFunc:CTXFnodeCounter,context:"column",pause:100)', | 237 '[m] ./* (ctxtFunc:CTXFnodeCounter,context:"column",pause:100)', |
232 'self::mathml:mtr'); | 238 'self::mathml:mtr'); |
233 | 239 |
234 defineRule( | 240 defineRule('mtd', 'default.default', '[m] ./*', 'self::mathml:mtd'); |
235 'mtd', 'default.default', | |
236 '[m] ./*', 'self::mathml:mtd'); | |
237 | 241 |
238 // Mtable superbrief rules. | 242 // Mtable superbrief rules. |
239 defineRule( | 243 defineRule( |
240 'mtable', 'default.superbrief', | 244 'mtable', 'default.superbrief', |
241 '[t] count(child::mathml:mtr); [t] "by";' + | 245 '[t] count(child::mathml:mtr); [t] "by";' + |
242 '[t] count(child::mathml:mtr[1]/mathml:mtd); [t] "matrix";', | 246 '[t] count(child::mathml:mtr[1]/mathml:mtd); [t] "matrix";', |
243 'self::mathml:mtable'); | 247 'self::mathml:mtable'); |
244 | 248 |
245 // Mtable short rules. | 249 // Mtable short rules. |
246 defineRule( | 250 defineRule( |
247 'mtable', 'default.short', | 251 'mtable', 'default.short', '[t] "matrix"; [m] ./*', |
248 '[t] "matrix"; [m] ./*', | |
249 'self::mathml:mtable'); | 252 'self::mathml:mtable'); |
250 | 253 |
251 defineRule( | 254 defineRule('mtr', 'default.short', '[m] ./*', 'self::mathml:mtr'); |
252 'mtr', 'default.short', | |
253 '[m] ./*', 'self::mathml:mtr'); | |
254 | 255 |
255 defineRule( | 256 defineRule( |
256 'mtd', 'default.short', | 257 'mtd', 'default.short', |
257 '[t] "Element"; [t] count(./preceding-sibling::mathml:mtd)+1;' + | 258 '[t] "Element"; [t] count(./preceding-sibling::mathml:mtd)+1;' + |
258 '[t] count(./parent::mathml:mtr/preceding-sibling::mathml:mtr)+1;' + | 259 '[t] count(./parent::mathml:mtr/preceding-sibling::mathml:mtr)+1;' + |
259 '[p] (pause:500); [m] ./*', | 260 '[p] (pause:500); [m] ./*', |
260 'self::mathml:mtd'); | 261 'self::mathml:mtd'); |
261 | 262 |
262 // Mmultiscripts rules. | 263 // Mmultiscripts rules. |
263 defineRule( | 264 defineRule( |
264 'mmultiscripts-4', 'default.default', | 265 'mmultiscripts-4', 'default.default', |
265 '[n] ./*[1]; [p] (pause:200);' + | 266 '[n] ./*[1]; [p] (pause:200);' + |
266 '[t] "left sub"; [n] ./*[5] (pitch:-0.35); [p] (pause:200);' + | 267 '[t] "left sub"; [n] ./*[5] (pitch:-0.35); [p] (pause:200);' + |
267 '[t] "left super"; [n] ./*[6] (pitch:0.35); [p] (pause:200);' + | 268 '[t] "left super"; [n] ./*[6] (pitch:0.35); [p] (pause:200);' + |
268 '[t] "right sub"; [n] ./*[2] (pitch:-0.35); [p] (pause:200);' + | 269 '[t] "right sub"; [n] ./*[2] (pitch:-0.35); [p] (pause:200);' + |
269 '[t] "right super"; [n] ./*[3] (pitch:0.35); [p] (pause:300);', | 270 '[t] "right super"; [n] ./*[3] (pitch:0.35); [p] (pause:300);', |
270 'self::mathml:mmultiscripts'); | 271 'self::mathml:mmultiscripts'); |
271 defineRule( | 272 defineRule( |
272 'mmultiscripts-3-1', 'default.default', | 273 'mmultiscripts-3-1', 'default.default', |
273 '[n] ./*[1]; [p] (pause:200);' + | 274 '[n] ./*[1]; [p] (pause:200);' + |
274 '[t] "left sub"; [n] ./*[5] (pitch:-0.35); [p] (pause:200);' + | 275 '[t] "left sub"; [n] ./*[5] (pitch:-0.35); [p] (pause:200);' + |
275 '[t] "left super"; [n] ./*[6] (pitch:0.35); [p] (pause:200);' + | 276 '[t] "left super"; [n] ./*[6] (pitch:0.35); [p] (pause:200);' + |
276 '[t] "right super"; [n] ./*[3] (pitch:0.35); [p] (pause:300);', | 277 '[t] "right super"; [n] ./*[3] (pitch:0.35); [p] (pause:300);', |
277 'self::mathml:mmultiscripts', './mathml:none=./*[2]', | 278 'self::mathml:mmultiscripts', './mathml:none=./*[2]', |
278 './mathml:mprescripts=./*[4]'); | 279 './mathml:mprescripts=./*[4]'); |
279 defineRule( | 280 defineRule( |
280 'mmultiscripts-3-2', 'default.default', | 281 'mmultiscripts-3-2', 'default.default', |
281 '[n] ./*[1]; [p] (pause:200);' + | 282 '[n] ./*[1]; [p] (pause:200);' + |
282 '[t] "left sub"; [n] ./*[5] (pitch:-0.35); [p] (pause:200);' + | 283 '[t] "left sub"; [n] ./*[5] (pitch:-0.35); [p] (pause:200);' + |
283 '[t] "left super"; [n] ./*[6] (pitch:0.35); [p] (pause:200);' + | 284 '[t] "left super"; [n] ./*[6] (pitch:0.35); [p] (pause:200);' + |
284 '[t] "right sub"; [n] ./*[2] (pitch:-0.35); [p] (pause:200);', | 285 '[t] "right sub"; [n] ./*[2] (pitch:-0.35); [p] (pause:200);', |
285 'self::mathml:mmultiscripts', './mathml:none=./*[3]', | 286 'self::mathml:mmultiscripts', './mathml:none=./*[3]', |
286 './mathml:mprescripts=./*[4]'); | 287 './mathml:mprescripts=./*[4]'); |
287 defineRule( | 288 defineRule( |
288 'mmultiscripts-3-3', 'default.default', | 289 'mmultiscripts-3-3', 'default.default', |
289 '[n] ./*[1]; [p] (pause:200);' + | 290 '[n] ./*[1]; [p] (pause:200);' + |
290 '[t] "left super"; [n] ./*[6] (pitch:0.35); [p] (pause:200);' + | 291 '[t] "left super"; [n] ./*[6] (pitch:0.35); [p] (pause:200);' + |
291 '[t] "right sub"; [n] ./*[2] (pitch:-0.35); [p] (pause:200);' + | 292 '[t] "right sub"; [n] ./*[2] (pitch:-0.35); [p] (pause:200);' + |
292 '[t] "right super"; [n] ./*[3] (pitch:0.35); [p] (pause:300);', | 293 '[t] "right super"; [n] ./*[3] (pitch:0.35); [p] (pause:300);', |
293 'self::mathml:mmultiscripts', './mathml:none=./*[5]', | 294 'self::mathml:mmultiscripts', './mathml:none=./*[5]', |
294 './mathml:mprescripts=./*[4]'); | 295 './mathml:mprescripts=./*[4]'); |
295 defineRule( | 296 defineRule( |
296 'mmultiscripts-3-4', 'default.default', | 297 'mmultiscripts-3-4', 'default.default', |
297 '[n] ./*[1]; [p] (pause:200);' + | 298 '[n] ./*[1]; [p] (pause:200);' + |
298 '[t] "left sub"; [n] ./*[5] (pitch:-0.35); [p] (pause:200);' + | 299 '[t] "left sub"; [n] ./*[5] (pitch:-0.35); [p] (pause:200);' + |
299 '[t] "right sub"; [n] ./*[2] (pitch:-0.35); [p] (pause:200);' + | 300 '[t] "right sub"; [n] ./*[2] (pitch:-0.35); [p] (pause:200);' + |
300 '[t] "right super"; [n] ./*[3] (pitch:0.35); [p] (pause:300);', | 301 '[t] "right super"; [n] ./*[3] (pitch:0.35); [p] (pause:300);', |
301 'self::mathml:mmultiscripts', './mathml:none=./*[6]', | 302 'self::mathml:mmultiscripts', './mathml:none=./*[6]', |
302 './mathml:mprescripts=./*[4]'); | 303 './mathml:mprescripts=./*[4]'); |
303 defineRule( | 304 defineRule( |
304 'mmultiscripts-2-1', 'default.default', | 305 'mmultiscripts-2-1', 'default.default', |
305 '[n] ./*[1]; [p] (pause:200);' + | 306 '[n] ./*[1]; [p] (pause:200);' + |
306 '[t] "left sub"; [n] ./*[5] (pitch:-0.35); [p] (pause:200);' + | 307 '[t] "left sub"; [n] ./*[5] (pitch:-0.35); [p] (pause:200);' + |
307 '[t] "left super"; [n] ./*[6] (pitch:0.35); [p] (pause:300);', | 308 '[t] "left super"; [n] ./*[6] (pitch:0.35); [p] (pause:300);', |
308 'self::mathml:mmultiscripts', './mathml:none=./*[2]', | 309 'self::mathml:mmultiscripts', './mathml:none=./*[2]', |
309 './mathml:none=./*[3]', './mathml:mprescripts=./*[4]'); | 310 './mathml:none=./*[3]', './mathml:mprescripts=./*[4]'); |
310 defineRule( | 311 defineRule( |
311 'mmultiscripts-1-1', 'default.default', | 312 'mmultiscripts-1-1', 'default.default', |
312 '[n] ./*[1]; [p] (pause:200);' + | 313 '[n] ./*[1]; [p] (pause:200);' + |
313 '[t] "left super"; [n] ./*[6] (pitch:0.35); [p] (pause:300);', | 314 '[t] "left super"; [n] ./*[6] (pitch:0.35); [p] (pause:300);', |
314 'self::mathml:mmultiscripts', './mathml:none=./*[2]', | 315 'self::mathml:mmultiscripts', './mathml:none=./*[2]', |
315 './mathml:none=./*[3]', './mathml:mprescripts=./*[4]', | 316 './mathml:none=./*[3]', './mathml:mprescripts=./*[4]', |
316 './mathml:none=./*[5]'); | 317 './mathml:none=./*[5]'); |
317 defineRule( | 318 defineRule( |
318 'mmultiscripts-1-2', 'default.default', | 319 'mmultiscripts-1-2', 'default.default', |
319 '[n] ./*[1]; [p] (pause:200);' + | 320 '[n] ./*[1]; [p] (pause:200);' + |
320 '[t] "left sub"; [n] ./*[5] (pitch:-0.35); [p] (pause:200);', | 321 '[t] "left sub"; [n] ./*[5] (pitch:-0.35); [p] (pause:200);', |
321 'self::mathml:mmultiscripts', './mathml:none=./*[2]', | 322 'self::mathml:mmultiscripts', './mathml:none=./*[2]', |
322 './mathml:none=./*[3]', './mathml:mprescripts=./*[4]', | 323 './mathml:none=./*[3]', './mathml:mprescripts=./*[4]', |
323 './mathml:none=./*[6]'); | 324 './mathml:none=./*[6]'); |
324 }; | 325 }; |
325 | 326 |
326 | 327 |
327 /** | 328 /** |
328 * Initialize mathJax Rules | 329 * Initialize mathJax Rules |
329 * @private | 330 * @private |
330 */ | 331 */ |
331 cvox.MathmlStoreRules.initMathjaxRules_ = function() { | 332 cvox.MathmlStoreRules.initMathjaxRules_ = function() { |
332 // Initial rule | 333 // Initial rule |
333 defineRule('mj-math', 'default.default', | 334 defineRule( |
334 '[n] ./*[1]/*[1]/*[1]', 'self::span[@class="math"]'); | 335 'mj-math', 'default.default', '[n] ./*[1]/*[1]/*[1]', |
| 336 'self::span[@class="math"]'); |
335 | 337 |
336 // Token Elements | 338 // Token Elements |
337 defineRule( | 339 defineRule( |
338 'mj-leaf', 'default.default', | 340 'mj-leaf', 'default.default', '[n] CQFlookupleaf', |
339 '[n] CQFlookupleaf', 'self::span[@class="mi"]'); | 341 'self::span[@class="mi"]'); |
340 defineRuleAlias('mj-leaf', 'self::span[@class="mo"]'); | 342 defineRuleAlias('mj-leaf', 'self::span[@class="mo"]'); |
341 defineRuleAlias('mj-leaf', 'self::span[@class="mn"]'); | 343 defineRuleAlias('mj-leaf', 'self::span[@class="mn"]'); |
342 defineRuleAlias('mj-leaf', 'self::span[@class="mtext"]'); | 344 defineRuleAlias('mj-leaf', 'self::span[@class="mtext"]'); |
343 defineRule( | 345 defineRule( |
344 'mj-mo-ext', 'default.default', | 346 'mj-mo-ext', 'default.default', '[n] CQFextender', |
345 '[n] CQFextender', 'self::span[@class="mo"]', | 347 'self::span[@class="mo"]', './*[1]/*[1]/text()', './*[1]/*[2]/text()'); |
346 './*[1]/*[1]/text()', './*[1]/*[2]/text()'); | |
347 defineRule( | 348 defineRule( |
348 'mj-texatom', 'default.default', | 349 'mj-texatom', 'default.default', '[n] ./*[1]', |
349 '[n] ./*[1]', 'self::span[@class="texatom"]'); | 350 'self::span[@class="texatom"]'); |
350 | 351 |
351 // Script elements. | 352 // Script elements. |
352 defineRule( | 353 defineRule( |
353 'mj-msubsup', 'default.default', | 354 'mj-msubsup', 'default.default', |
354 '[n] ./*[1]/*[1]/*[1]; [t] "sub"; [n] ./*[1]/*[3]/*[1] (pitch:-0.35);' + | 355 '[n] ./*[1]/*[1]/*[1]; [t] "sub"; [n] ./*[1]/*[3]/*[1] (pitch:-0.35);' + |
355 '[p] (pause:200); [t] "super"; [n] ./*[1]/*[2]/*[1] (pitch:0.35);' + | 356 '[p] (pause:200); [t] "super"; [n] ./*[1]/*[2]/*[1] (pitch:0.35);' + |
356 '[p] (pause:300)', | 357 '[p] (pause:300)', |
357 'self::span[@class="msubsup"]'); | 358 'self::span[@class="msubsup"]'); |
358 defineRule( | 359 defineRule( |
359 'mj-msub', 'default.default', | 360 'mj-msub', 'default.default', |
360 '[n] ./*[1]/*[1]/*[1]; [t] "sub";' + | 361 '[n] ./*[1]/*[1]/*[1]; [t] "sub";' + |
361 '[n] ./*[1]/*[2]/*[1] (pitch:-0.35); [p] (pause:300)', | 362 '[n] ./*[1]/*[2]/*[1] (pitch:-0.35); [p] (pause:300)', |
362 'self::span[@class="msub"]'); | 363 'self::span[@class="msub"]'); |
363 defineRule( | 364 defineRule( |
364 'mj-msup', 'default.default', | 365 'mj-msup', 'default.default', |
365 '[n] ./*[1]/*[1]/*[1]; [t] "super";' + | 366 '[n] ./*[1]/*[1]/*[1]; [t] "super";' + |
366 '[n] ./*[1]/*[2]/*[1] (pitch:0.35); [p] (pause:300)', | 367 '[n] ./*[1]/*[2]/*[1] (pitch:0.35); [p] (pause:300)', |
367 'self::span[@class="msup"]'); | 368 'self::span[@class="msup"]'); |
368 defineRule( | 369 defineRule( |
369 'mj-munderover', 'default.default', | 370 'mj-munderover', 'default.default', |
370 '[n] ./*[1]/*[2]/*[1] (pitch:0.35); [t] "under and";' + | 371 '[n] ./*[1]/*[2]/*[1] (pitch:0.35); [t] "under and";' + |
371 '[n] ./*[1]/*[3]/*[1] (pitch:-0.35); [t] "over";' + | 372 '[n] ./*[1]/*[3]/*[1] (pitch:-0.35); [t] "over";' + |
372 '[n] ./*[1]/*[1]/*[1]; [p] (pause:400)', | 373 '[n] ./*[1]/*[1]/*[1]; [p] (pause:400)', |
373 'self::span[@class="munderover"]'); | 374 'self::span[@class="munderover"]'); |
374 defineRule( | 375 defineRule( |
375 'mj-munder', 'default.default', | 376 'mj-munder', 'default.default', |
376 '[n] ./*[1]/*[2]/*[1] (pitch:0.35); [t] "under";' + | 377 '[n] ./*[1]/*[2]/*[1] (pitch:0.35); [t] "under";' + |
377 '[n] ./*[1]/*[1]/*[1]; [p] (pause:400)', | 378 '[n] ./*[1]/*[1]/*[1]; [p] (pause:400)', |
378 'self::span[@class="munder"]'); | 379 'self::span[@class="munder"]'); |
379 defineRule( | 380 defineRule( |
380 'mj-mover', 'default.default', | 381 'mj-mover', 'default.default', |
381 '[n] ./*[1]/*[2]/*[1] (pitch:0.35); [t] "over";' + | 382 '[n] ./*[1]/*[2]/*[1] (pitch:0.35); [t] "over";' + |
382 '[n] ./*[1]/*[1]/*[1]; [p] (pause:400)', | 383 '[n] ./*[1]/*[1]/*[1]; [p] (pause:400)', |
383 'self::span[@class="mover"]'); | 384 'self::span[@class="mover"]'); |
384 | 385 |
385 | 386 |
386 // Layout elements. | 387 // Layout elements. |
387 defineRule( | 388 defineRule( |
388 'mj-mfrac', 'default.default', | 389 'mj-mfrac', 'default.default', |
389 '[p] (pause:250); [n] ./*[1]/*[1]/*[1] (pitch:0.3); [p] (pause:250);' + | 390 '[p] (pause:250); [n] ./*[1]/*[1]/*[1] (pitch:0.3); [p] (pause:250);' + |
390 ' [t] "divided by"; [n] ./*[1]/*[2]/*[1] (pitch:-0.3);' + | 391 ' [t] "divided by"; [n] ./*[1]/*[2]/*[1] (pitch:-0.3);' + |
391 '[p] (pause:400)', | 392 '[p] (pause:400)', |
392 'self::span[@class="mfrac"]'); | 393 'self::span[@class="mfrac"]'); |
393 defineRule( | 394 defineRule( |
394 'mj-msqrt', 'default.default', | 395 'mj-msqrt', 'default.default', |
395 '[t] "Square root of";' + | 396 '[t] "Square root of";' + |
396 '[n] ./*[1]/*[1]/*[1] (rate:0.2); [p] (pause:400)', | 397 '[n] ./*[1]/*[1]/*[1] (rate:0.2); [p] (pause:400)', |
397 'self::span[@class="msqrt"]'); | 398 'self::span[@class="msqrt"]'); |
398 defineRule( | 399 defineRule( |
399 'mj-mroot', 'default.default', | 400 'mj-mroot', 'default.default', |
400 '[t] "root of order"; [n] ./*[1]/*[4]/*[1]; [t] "of";' + | 401 '[t] "root of order"; [n] ./*[1]/*[4]/*[1]; [t] "of";' + |
401 '[n] ./*[1]/*[1]/*[1] (rate:0.2); [p] (pause:400)', | 402 '[n] ./*[1]/*[1]/*[1] (rate:0.2); [p] (pause:400)', |
402 'self::span[@class="mroot"]'); | 403 'self::span[@class="mroot"]'); |
403 | 404 |
404 defineRule( | 405 defineRule( |
405 'mj-mfenced', 'default.default', | 406 'mj-mfenced', 'default.default', |
406 '[t] "opening"; [n] ./*[1]; ' + | 407 '[t] "opening"; [n] ./*[1]; ' + |
407 '[m] ./*[position()>1 and position()<last()];' + | 408 '[m] ./*[position()>1 and position()<last()];' + |
408 ' [t] "closing"; [n] ./*[last()]', | 409 ' [t] "closing"; [n] ./*[last()]', |
409 'self::span[@class="mfenced"]'); | 410 'self::span[@class="mfenced"]'); |
410 | 411 |
411 // Mtable short rules. | 412 // Mtable short rules. |
412 defineRuleAlias('mj-leaf', 'self::span[@class="mtable"]'); | 413 defineRuleAlias('mj-leaf', 'self::span[@class="mtable"]'); |
413 // Mmultiscripts rules. | 414 // Mmultiscripts rules. |
414 defineRuleAlias('mj-leaf', 'self::span[@class="mmultiscripts"]'); | 415 defineRuleAlias('mj-leaf', 'self::span[@class="mmultiscripts"]'); |
415 }; | 416 }; |
416 | 417 |
417 | 418 |
418 /** | 419 /** |
419 * Initialize mathJax Aliases | 420 * Initialize mathJax Aliases |
420 * @private | 421 * @private |
421 */ | 422 */ |
422 cvox.MathmlStoreRules.initAliases_ = function() { | 423 cvox.MathmlStoreRules.initAliases_ = function() { |
423 // Space elements | 424 // Space elements |
424 defineRuleAlias('mspace', 'self::span[@class="mspace"]'); | 425 defineRuleAlias('mspace', 'self::span[@class="mspace"]'); |
425 defineRuleAlias('mstyle', 'self::span[@class="mstyle"]'); | 426 defineRuleAlias('mstyle', 'self::span[@class="mstyle"]'); |
426 defineRuleAlias('mpadded', 'self::span[@class="mpadded"]'); | 427 defineRuleAlias('mpadded', 'self::span[@class="mpadded"]'); |
427 defineRuleAlias('merror', 'self::span[@class="merror"]'); | 428 defineRuleAlias('merror', 'self::span[@class="merror"]'); |
428 defineRuleAlias('mphantom', 'self::span[@class="mphantom"]'); | 429 defineRuleAlias('mphantom', 'self::span[@class="mphantom"]'); |
429 | 430 |
430 // Token elements. | 431 // Token elements. |
431 defineRuleAlias('ms', 'self::span[@class="ms"]'); | 432 defineRuleAlias('ms', 'self::span[@class="ms"]'); |
432 | 433 |
433 // Layout elements. | 434 // Layout elements. |
434 defineRuleAlias('mrow', 'self::span[@class="mrow"]'); | 435 defineRuleAlias('mrow', 'self::span[@class="mrow"]'); |
435 | 436 |
436 // The following rules fix bugs in MathJax's LaTeX translation. | 437 // The following rules fix bugs in MathJax's LaTeX translation. |
437 defineRuleAlias( | 438 defineRuleAlias('mj-msub', 'self::span[@class="msubsup"]', 'CQFmathmlmsub'); |
438 'mj-msub', 'self::span[@class="msubsup"]', 'CQFmathmlmsub'); | |
439 | 439 |
440 defineRuleAlias( | 440 defineRuleAlias('mj-msup', 'self::span[@class="msubsup"]', 'CQFmathmlmsup'); |
441 'mj-msup', 'self::span[@class="msubsup"]', 'CQFmathmlmsup'); | |
442 | 441 |
443 defineRuleAlias( | 442 defineRuleAlias( |
444 'mj-munder', 'self::span[@class="munderover"]', 'CQFmathmlmunder'); | 443 'mj-munder', 'self::span[@class="munderover"]', 'CQFmathmlmunder'); |
445 | 444 |
446 defineRuleAlias( | 445 defineRuleAlias( |
447 'mj-mover', 'self::span[@class="munderover"]', 'CQFmathmlmover'); | 446 'mj-mover', 'self::span[@class="munderover"]', 'CQFmathmlmover'); |
448 }; | 447 }; |
449 | 448 |
450 | 449 |
451 /** | 450 /** |
452 * Initialize specializations wrt. content of nodes. | 451 * Initialize specializations wrt. content of nodes. |
453 * @private | 452 * @private |
454 */ | 453 */ |
455 cvox.MathmlStoreRules.initSpecializationRules_ = function() { | 454 cvox.MathmlStoreRules.initSpecializationRules_ = function() { |
456 // Some special nodes for square and cube. | 455 // Some special nodes for square and cube. |
457 // MathML | 456 // MathML |
458 defineRule( | 457 defineRule( |
459 'square', 'default.default', | 458 'square', 'default.default', |
460 '[n] ./*[1]; [t] "square" (pitch:0.35); [p] (pause:300)', | 459 '[n] ./*[1]; [t] "square" (pitch:0.35); [p] (pause:300)', |
461 'self::mathml:msup', './*[2][text()=2]'); | 460 'self::mathml:msup', './*[2][text()=2]'); |
462 defineRuleAlias( | 461 defineRuleAlias( |
463 'square', 'self::mathml:msup', | 462 'square', 'self::mathml:msup', './mathml:mrow=./*[2]', |
464 './mathml:mrow=./*[2]', 'count(./*[2]/*)=1', './*[2]/*[1][text()=2]'); | 463 'count(./*[2]/*)=1', './*[2]/*[1][text()=2]'); |
465 | 464 |
466 defineRule( | 465 defineRule( |
467 'cube', 'default.default', | 466 'cube', 'default.default', |
468 '[n] ./*[1]; [t] "cube" (pitch:0.35); [p] (pause:300)', | 467 '[n] ./*[1]; [t] "cube" (pitch:0.35); [p] (pause:300)', |
469 'self::mathml:msup', './*[2][text()=3]'); | 468 'self::mathml:msup', './*[2][text()=3]'); |
470 defineRuleAlias( | 469 defineRuleAlias( |
471 'cube', 'self::mathml:msup', | 470 'cube', 'self::mathml:msup', './mathml:mrow=./*[2]', 'count(./*[2]/*)=1', |
472 './mathml:mrow=./*[2]', 'count(./*[2]/*)=1', './*[2]/*[1][text()=3]'); | 471 './*[2]/*[1][text()=3]'); |
473 | 472 |
474 defineRule( | 473 defineRule( |
475 'square-sub', 'default.default', | 474 'square-sub', 'default.default', |
476 '[n] ./*[1]; [t] "sub"; [n] ./*[2] (pitch:-0.35);' + | 475 '[n] ./*[1]; [t] "sub"; [n] ./*[2] (pitch:-0.35);' + |
477 '[p] (pause:300); [t] "square" (pitch:0.35); [p] (pause:400)', | 476 '[p] (pause:300); [t] "square" (pitch:0.35); [p] (pause:400)', |
478 'self::mathml:msubsup', './*[3][text()=2]'); | 477 'self::mathml:msubsup', './*[3][text()=2]'); |
479 defineRuleAlias( | 478 defineRuleAlias( |
480 'square-sub', 'self::mathml:msubsup', | 479 'square-sub', 'self::mathml:msubsup', './mathml:mrow=./*[3]', |
481 './mathml:mrow=./*[3]', 'count(./*[3]/*)=1', './*[3]/*[1][text()=2]'); | 480 'count(./*[3]/*)=1', './*[3]/*[1][text()=2]'); |
482 | 481 |
483 defineRule( | 482 defineRule( |
484 'cube-sub', 'default.default', | 483 'cube-sub', 'default.default', |
485 '[n] ./*[1]; [t] "sub"; [n] ./*[2] (pitch:-0.35);' + | 484 '[n] ./*[1]; [t] "sub"; [n] ./*[2] (pitch:-0.35);' + |
486 '[p] (pause:300); [t] "cube" (pitch:0.35); [p] (pause:400)', | 485 '[p] (pause:300); [t] "cube" (pitch:0.35); [p] (pause:400)', |
487 'self::mathml:msubsup', './*[3][text()=3]'); | 486 'self::mathml:msubsup', './*[3][text()=3]'); |
488 defineRuleAlias( | 487 defineRuleAlias( |
489 'cube-sub', 'self::mathml:msubsup', | 488 'cube-sub', 'self::mathml:msubsup', './mathml:mrow=./*[3]', |
490 './mathml:mrow=./*[3]', 'count(./*[3]/*)=1', './*[3]/*[1][text()=3]'); | 489 'count(./*[3]/*)=1', './*[3]/*[1][text()=3]'); |
491 | 490 |
492 // MathJax | 491 // MathJax |
493 defineRule( | 492 defineRule( |
494 'mj-square', 'default.default', | 493 'mj-square', 'default.default', |
495 '[n] ./*[1]/*[1]/*[1]; [t] "square" (pitch:0.35); [p] (pause:300)', | 494 '[n] ./*[1]/*[1]/*[1]; [t] "square" (pitch:0.35); [p] (pause:300)', |
496 'self::span[@class="msup"]', './*[1]/*[2]/*[1][text()=2]'); | 495 'self::span[@class="msup"]', './*[1]/*[2]/*[1][text()=2]'); |
497 defineRuleAlias( | 496 defineRuleAlias( |
498 'mj-square', 'self::span[@class="msup"]', | 497 'mj-square', 'self::span[@class="msup"]', |
499 './*[1]/*[2]/*[1]=./*[1]/*[2]/span[@class="mrow"]', | 498 './*[1]/*[2]/*[1]=./*[1]/*[2]/span[@class="mrow"]', |
500 'count(./*[1]/*[2]/*[1]/*)=1', './*[1]/*[2]/*[1]/*[1][text()=2]'); | 499 'count(./*[1]/*[2]/*[1]/*)=1', './*[1]/*[2]/*[1]/*[1][text()=2]'); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 'count(./*[1]/*[2]/*[1]/*)=1', './*[1]/*[2]/*[1]/*[1][text()=3]'); | 542 'count(./*[1]/*[2]/*[1]/*)=1', './*[1]/*[2]/*[1]/*[1][text()=3]'); |
544 }; | 543 }; |
545 | 544 |
546 | 545 |
547 /** | 546 /** |
548 * Initialize mathJax Aliases | 547 * Initialize mathJax Aliases |
549 * @private | 548 * @private |
550 */ | 549 */ |
551 cvox.MathmlStoreRules.initSemanticRules_ = function() { | 550 cvox.MathmlStoreRules.initSemanticRules_ = function() { |
552 // Initial rule | 551 // Initial rule |
553 defineRule( | 552 defineRule('stree', 'default.default', '[n] ./*[1]', 'self::stree'); |
554 'stree', 'default.default', | |
555 '[n] ./*[1]', 'self::stree'); | |
556 | 553 |
557 defineRule( | 554 defineRule( |
558 'multrel', 'default.default', | 555 'multrel', 'default.default', |
559 '[t] "multirelation"; [m] children/* (sepFunc:CTXFcontentIterator)', | 556 '[t] "multirelation"; [m] children/* (sepFunc:CTXFcontentIterator)', |
560 'self::multirel'); | 557 'self::multirel'); |
561 | 558 |
562 defineRule( | 559 defineRule( |
563 'variable-equality', 'default.default', | 560 'variable-equality', 'default.default', |
564 '[t] "equation sequence"; [m] ./children/* ' + | 561 '[t] "equation sequence"; [m] ./children/* ' + |
565 '(context:"part",ctxtFunc:CTXFnodeCounter,separator:./text())', | 562 '(context:"part",ctxtFunc:CTXFnodeCounter,separator:./text())', |
566 'self::relseq[@role="equality"]', 'count(./children/*)>2', | 563 'self::relseq[@role="equality"]', 'count(./children/*)>2', |
567 './children/punct[@role="ellipsis"]');// Make that better! | 564 './children/punct[@role="ellipsis"]'); // Make that better! |
568 | 565 |
569 defineRule( | 566 defineRule( |
570 'multi-equality', 'default.default', | 567 'multi-equality', 'default.default', |
571 '[t] "equation sequence"; [m] ./children/* ' + | 568 '[t] "equation sequence"; [m] ./children/* ' + |
572 '(context:"part",ctxtFunc:CTXFnodeCounter,separator:./text())', | 569 '(context:"part",ctxtFunc:CTXFnodeCounter,separator:./text())', |
573 'self::relseq[@role="equality"]', 'count(./children/*)>2'); | 570 'self::relseq[@role="equality"]', 'count(./children/*)>2'); |
574 | 571 |
575 defineRule( | 572 defineRule( |
576 'multi-equality', 'default.short', | 573 'multi-equality', 'default.short', |
577 '[t] "equation sequence"; [m] ./children/* ' + | 574 '[t] "equation sequence"; [m] ./children/* ' + |
(...skipping 15 matching lines...) Expand all Loading... |
593 './children/identifier or ./children/number'); | 590 './children/identifier or ./children/number'); |
594 | 591 |
595 defineRule( | 592 defineRule( |
596 'simple-equality2', 'default.default', | 593 'simple-equality2', 'default.default', |
597 '[n] children/*[1]; [p] (pause:200); [n] text() (pause:200);' + | 594 '[n] children/*[1]; [p] (pause:200); [n] text() (pause:200);' + |
598 '[n] children/*[2]', | 595 '[n] children/*[2]', |
599 'self::relseq[@role="equality"]', 'count(./children/*)=2', | 596 'self::relseq[@role="equality"]', 'count(./children/*)=2', |
600 './children/function or ./children/appl'); | 597 './children/function or ./children/appl'); |
601 | 598 |
602 defineRule( | 599 defineRule( |
603 'multrel', 'default.default', | 600 'multrel', 'default.default', '[m] children/* (separator:./text())', |
604 '[m] children/* (separator:./text())', | |
605 'self::relseq'); | 601 'self::relseq'); |
606 | 602 |
607 defineRule( | 603 defineRule( |
608 'binary-operation', 'default.default', | 604 'binary-operation', 'default.default', |
609 '[m] children/* (separator:text());', | 605 '[m] children/* (separator:text());', 'self::infixop'); |
610 'self::infixop'); | |
611 | 606 |
612 defineRule( | 607 defineRule( |
613 'variable-addition', 'default.default', | 608 'variable-addition', 'default.default', |
614 '[t] "sum with variable number of summands";' + | 609 '[t] "sum with variable number of summands";' + |
615 '[p] (pause:400); [m] children/* (separator:./text())', | 610 '[p] (pause:400); [m] children/* (separator:./text())', |
616 'self::infixop[@role="addition"]', 'count(children/*)>2', | 611 'self::infixop[@role="addition"]', 'count(children/*)>2', |
617 'children/punct[@role="ellipsis"]');// Make that better! | 612 'children/punct[@role="ellipsis"]'); // Make that better! |
618 | 613 |
619 defineRule( | 614 defineRule( |
620 'multi-addition', 'default.default', | 615 'multi-addition', 'default.default', |
621 '[t] "sum with,"; [t] count(./children/*); [t] ", summands";' + | 616 '[t] "sum with,"; [t] count(./children/*); [t] ", summands";' + |
622 '[p] (pause:400); [m] ./children/* (separator:./text())', | 617 '[p] (pause:400); [m] ./children/* (separator:./text())', |
623 'self::infixop[@role="addition"]', 'count(./children/*)>2'); | 618 'self::infixop[@role="addition"]', 'count(./children/*)>2'); |
624 | 619 |
625 // Prefix Operator | 620 // Prefix Operator |
626 defineRule( | 621 defineRule( |
627 'prefix', 'default.default', | 622 'prefix', 'default.default', |
628 '[t] "prefix"; [n] text(); [t] "of" (pause 150);' + | 623 '[t] "prefix"; [n] text(); [t] "of" (pause 150);' + |
629 '[n] children/*[1]', | 624 '[n] children/*[1]', |
630 'self::prefixop'); | 625 'self::prefixop'); |
631 | 626 |
632 defineRule( | 627 defineRule( |
633 'negative', 'default.default', | 628 'negative', 'default.default', '[t] "negative"; [n] children/*[1]', |
634 '[t] "negative"; [n] children/*[1]', | |
635 'self::prefixop', 'self::prefixop[@role="negative"]'); | 629 'self::prefixop', 'self::prefixop[@role="negative"]'); |
636 | 630 |
637 // Postfix Operator | 631 // Postfix Operator |
638 defineRule( | 632 defineRule( |
639 'postfix', 'default.default', | 633 'postfix', 'default.default', |
640 '[n] children/*[1]; [t] "postfix"; [n] text() (pause 300)', | 634 '[n] children/*[1]; [t] "postfix"; [n] text() (pause 300)', |
641 'self::postfixop'); | 635 'self::postfixop'); |
642 | 636 |
643 defineRule( | 637 defineRule('identifier', 'default.default', '[n] text()', 'self::identifier'); |
644 'identifier', 'default.default', | |
645 '[n] text()', 'self::identifier'); | |
646 | 638 |
647 defineRule( | 639 defineRule('number', 'default.default', '[n] text()', 'self::number'); |
648 'number', 'default.default', | |
649 '[n] text()', 'self::number'); | |
650 | 640 |
651 defineRule( | 641 defineRule( |
652 'fraction', 'default.default', | 642 'fraction', 'default.default', |
653 '[p] (pause:250); [n] children/*[1] (pitch:0.3); [p] (pause:250);' + | 643 '[p] (pause:250); [n] children/*[1] (pitch:0.3); [p] (pause:250);' + |
654 ' [t] "divided by"; [n] children/*[2] (pitch:-0.3); [p] (pause:400)', | 644 ' [t] "divided by"; [n] children/*[2] (pitch:-0.3); [p] (pause:400)', |
655 'self::fraction'); | 645 'self::fraction'); |
656 | 646 |
657 defineRule( | 647 defineRule( |
658 'superscript', 'default.default', | 648 'superscript', 'default.default', |
659 '[n] children/*[1]; [t] "super"; [n] children/*[2] (pitch:0.35);' + | 649 '[n] children/*[1]; [t] "super"; [n] children/*[2] (pitch:0.35);' + |
660 '[p] (pause:300)', | 650 '[p] (pause:300)', |
661 'self::superscript'); | 651 'self::superscript'); |
662 defineRule( | 652 defineRule( |
663 'subscript', 'default.default', | 653 'subscript', 'default.default', |
664 '[n] children/*[1]; [t] "sub"; [n] children/*[2] (pitch:-0.35);' + | 654 '[n] children/*[1]; [t] "sub"; [n] children/*[2] (pitch:-0.35);' + |
665 '[p] (pause:300)', | 655 '[p] (pause:300)', |
666 'self::subscript'); | 656 'self::subscript'); |
667 | 657 |
668 defineRule( | 658 defineRule( |
669 'ellipsis', 'default.default', | 659 'ellipsis', 'default.default', |
670 '[p] (pause:200); [t] "dot dot dot"; [p] (pause:300)', | 660 '[p] (pause:200); [t] "dot dot dot"; [p] (pause:300)', 'self::punct', |
671 'self::punct', 'self::punct[@role="ellipsis"]'); | 661 'self::punct[@role="ellipsis"]'); |
672 | 662 |
673 defineRule( | 663 defineRule( |
674 'fence-single', 'default.default', | 664 'fence-single', 'default.default', '[n] text()', 'self::punct', |
675 '[n] text()', | 665 'self::punct[@role="openfence"]'); |
676 'self::punct', 'self::punct[@role="openfence"]'); | 666 defineRuleAlias( |
677 defineRuleAlias('fence-single', 'self::punct', | 667 'fence-single', 'self::punct', 'self::punct[@role="closefence"]'); |
678 'self::punct[@role="closefence"]'); | 668 defineRuleAlias('fence-single', 'self::punct', 'self::punct[@role="vbar"]'); |
679 defineRuleAlias('fence-single', 'self::punct', | 669 defineRuleAlias( |
680 'self::punct[@role="vbar"]'); | 670 'fence-single', 'self::punct', 'self::punct[@role="application"]'); |
681 defineRuleAlias('fence-single', 'self::punct', | |
682 'self::punct[@role="application"]'); | |
683 | 671 |
684 // TODO (sorge) Refine punctuations further. | 672 // TODO (sorge) Refine punctuations further. |
685 defineRule( | 673 defineRule( |
686 'omit-punct', 'default.default', | 674 'omit-punct', 'default.default', '[p] (pause:200);', 'self::punct'); |
687 '[p] (pause:200);', | |
688 'self::punct'); | |
689 | 675 |
690 defineRule( | 676 defineRule('omit-empty', 'default.default', '', 'self::empty'); |
691 'omit-empty', 'default.default', | |
692 '', | |
693 'self::empty'); | |
694 | 677 |
695 // Fences rules. | 678 // Fences rules. |
696 defineRule( | 679 defineRule( |
697 'fences-open-close', 'default.default', | 680 'fences-open-close', 'default.default', |
698 '[p] (pause:100); [t] "open"; [n] children/*[1]; [p] (pause:200);' + | 681 '[p] (pause:100); [t] "open"; [n] children/*[1]; [p] (pause:200);' + |
699 '[t] "close"', | 682 '[t] "close"', |
700 'self::fenced[@role="leftright"]'); | 683 'self::fenced[@role="leftright"]'); |
701 | 684 |
702 defineRule( | 685 defineRule( |
703 'fences-open-close-in-appl', 'default.default', | 686 'fences-open-close-in-appl', 'default.default', |
704 '[p] (pause:100); [n] children/*[1]; [p] (pause:200);', | 687 '[p] (pause:100); [n] children/*[1]; [p] (pause:200);', |
705 'self::fenced[@role="leftright"]', './parent::children/parent::appl'); | 688 'self::fenced[@role="leftright"]', './parent::children/parent::appl'); |
706 | 689 |
707 defineRule( | 690 defineRule( |
708 'fences-neutral', 'default.default', | 691 'fences-neutral', 'default.default', |
709 '[p] (pause:100); [t] "absolute value of"; [n] children/*[1];' + | 692 '[p] (pause:100); [t] "absolute value of"; [n] children/*[1];' + |
710 '[p] (pause:350);', | 693 '[p] (pause:350);', |
711 'self::fenced', 'self::fenced[@role="neutral"]'); | 694 'self::fenced', 'self::fenced[@role="neutral"]'); |
712 | 695 |
713 defineRule( | 696 defineRule( |
714 'omit-fences', 'default.default', | 697 'omit-fences', 'default.default', |
715 '[p] (pause:500); [n] children/*[1]; [p] (pause:200);', | 698 '[p] (pause:500); [n] children/*[1]; [p] (pause:200);', 'self::fenced'); |
716 'self::fenced'); | |
717 | 699 |
718 // Matrix rules. | 700 // Matrix rules. |
719 defineRule( | 701 defineRule( |
720 'matrix', 'default.default', | 702 'matrix', 'default.default', |
721 '[t] "matrix"; [m] children/* ' + | 703 '[t] "matrix"; [m] children/* ' + |
722 '(ctxtFunc:CTXFnodeCounter,context:"row",pause:100)', | 704 '(ctxtFunc:CTXFnodeCounter,context:"row",pause:100)', |
723 'self::matrix'); | 705 'self::matrix'); |
724 | 706 |
725 defineRule( | 707 defineRule( |
726 'matrix-row', 'default.default', | 708 'matrix-row', 'default.default', |
727 '[m] children/* (ctxtFunc:CTXFnodeCounter,context:"column",pause:100)', | 709 '[m] children/* (ctxtFunc:CTXFnodeCounter,context:"column",pause:100)', |
728 'self::row[@role="matrix"]'); | 710 'self::row[@role="matrix"]'); |
729 | 711 |
730 defineRule( | 712 defineRule( |
731 'matrix-cell', 'default.default', | 713 'matrix-cell', 'default.default', '[n] children/*[1]', |
732 '[n] children/*[1]', 'self::cell[@role="matrix"]'); | 714 'self::cell[@role="matrix"]'); |
733 | 715 |
734 // Vector rules. | 716 // Vector rules. |
735 defineRule( | 717 defineRule( |
736 'vector', 'default.default', | 718 'vector', 'default.default', |
737 '[t] "vector"; [m] children/* ' + | 719 '[t] "vector"; [m] children/* ' + |
738 '(ctxtFunc:CTXFnodeCounter,context:"element",pause:100)', | 720 '(ctxtFunc:CTXFnodeCounter,context:"element",pause:100)', |
739 'self::vector'); | 721 'self::vector'); |
740 | 722 |
741 // Cases rules. | 723 // Cases rules. |
742 defineRule( | 724 defineRule( |
743 'cases', 'default.default', | 725 'cases', 'default.default', |
744 '[t] "case statement"; [m] children/* ' + | 726 '[t] "case statement"; [m] children/* ' + |
745 '(ctxtFunc:CTXFnodeCounter,context:"case",pause:100)', | 727 '(ctxtFunc:CTXFnodeCounter,context:"case",pause:100)', |
746 'self::cases'); | 728 'self::cases'); |
747 | 729 |
748 defineRule( | 730 defineRule( |
749 'cases-row', 'default.default', | 731 'cases-row', 'default.default', '[m] children/*', |
750 '[m] children/*', 'self::row[@role="cases"]'); | 732 'self::row[@role="cases"]'); |
751 | 733 |
752 defineRule( | 734 defineRule( |
753 'cases-cell', 'default.default', | 735 'cases-cell', 'default.default', '[n] children/*[1]', |
754 '[n] children/*[1]', 'self::cell[@role="cases"]'); | 736 'self::cell[@role="cases"]'); |
755 | 737 |
756 defineRule( | 738 defineRule( |
757 'row', 'default.default', | 739 'row', 'default.default', |
758 '[m] ./* (ctxtFunc:CTXFnodeCounter,context:"column",pause:100)', | 740 '[m] ./* (ctxtFunc:CTXFnodeCounter,context:"column",pause:100)', |
759 'self::row"'); | 741 'self::row"'); |
760 | 742 |
761 defineRule( | 743 defineRule( |
762 'cases-end', 'default.default', | 744 'cases-end', 'default.default', |
763 '[t] "case statement"; ' + | 745 '[t] "case statement"; ' + |
764 '[m] children/* (ctxtFunc:CTXFnodeCounter,context:"case",pause:100);' + | 746 '[m] children/* (ctxtFunc:CTXFnodeCounter,context:"case",pause:100);'
+ |
765 '[t] "end cases"', | 747 '[t] "end cases"', |
766 'self::cases', 'following-sibling::*'); | 748 'self::cases', 'following-sibling::*'); |
767 | 749 |
768 // Multiline rules. | 750 // Multiline rules. |
769 defineRule( | 751 defineRule( |
770 'multiline', 'default.default', | 752 'multiline', 'default.default', |
771 '[t] "multiline equation";' + | 753 '[t] "multiline equation";' + |
772 '[m] children/* (ctxtFunc:CTXFnodeCounter,context:"line",pause:100)', | 754 '[m] children/* (ctxtFunc:CTXFnodeCounter,context:"line",pause:100)', |
773 'self::multiline'); | 755 'self::multiline'); |
774 | 756 |
775 defineRule( | 757 defineRule('line', 'default.default', '[m] children/*', 'self::line'); |
776 'line', 'default.default', | |
777 '[m] children/*', 'self::line'); | |
778 | 758 |
779 // Table rules. | 759 // Table rules. |
780 defineRule( | 760 defineRule( |
781 'table', 'default.default', | 761 'table', 'default.default', |
782 '[t] "multiline equation";' + | 762 '[t] "multiline equation";' + |
783 '[m] children/* (ctxtFunc:CTXFnodeCounter,context:"row",pause:200)', | 763 '[m] children/* (ctxtFunc:CTXFnodeCounter,context:"row",pause:200)', |
784 'self::table'); | 764 'self::table'); |
785 | 765 |
786 defineRule( | 766 defineRule( |
787 'table-row', 'default.default', | 767 'table-row', 'default.default', '[m] children/* (pause:100)', |
788 '[m] children/* (pause:100)', 'self::row[@role="table"]'); | 768 'self::row[@role="table"]'); |
789 | 769 |
790 defineRuleAlias( | 770 defineRuleAlias('cases-cell', 'self::cell[@role="table"]'); |
791 'cases-cell', 'self::cell[@role="table"]'); | |
792 | 771 |
793 | 772 |
794 // Rules for punctuated expressions. | 773 // Rules for punctuated expressions. |
795 defineRule( | 774 defineRule( |
796 'end-punct', 'default.default', | 775 'end-punct', 'default.default', '[m] children/*; [p] (pause:300)', |
797 '[m] children/*; [p] (pause:300)', | |
798 'self::punctuated', '@role="endpunct"'); | 776 'self::punctuated', '@role="endpunct"'); |
799 | 777 |
800 defineRule( | 778 defineRule( |
801 'start-punct', 'default.default', | 779 'start-punct', 'default.default', |
802 '[n] content/*[1]; [p] (pause:200); [m] children/*', | 780 '[n] content/*[1]; [p] (pause:200); [m] children/*', 'self::punctuated', |
803 'self::punctuated', '@role="startpunct"'); | 781 '@role="startpunct"'); |
804 | 782 |
805 defineRule( | 783 defineRule( |
806 'integral-punct', 'default.default', | 784 'integral-punct', 'default.default', |
807 '[n] children/*[1] (rate:0.2); [n] children/*[3] (rate:0.2)', | 785 '[n] children/*[1] (rate:0.2); [n] children/*[3] (rate:0.2)', |
808 'self::punctuated', '@role="integral"'); | 786 'self::punctuated', '@role="integral"'); |
809 | 787 |
810 defineRule( | 788 defineRule( |
811 'punctuated', 'default.default', | 789 'punctuated', 'default.default', '[m] children/* (pause:100)', |
812 '[m] children/* (pause:100)', | |
813 'self::punctuated'); | 790 'self::punctuated'); |
814 | 791 |
815 // Function rules | 792 // Function rules |
816 defineRule( | 793 defineRule('function', 'default.default', '[n] text()', 'self::function'); |
817 'function', 'default.default', | |
818 '[n] text()', 'self::function'); | |
819 | 794 |
820 defineRule( | 795 defineRule( |
821 'appl', 'default.default', | 796 'appl', 'default.default', |
822 '[n] children/*[1]; [n] content/*[1]; [n] children/*[2]', 'self::appl'); | 797 '[n] children/*[1]; [n] content/*[1]; [n] children/*[2]', 'self::appl'); |
823 | 798 |
824 // Limit operator rules | 799 // Limit operator rules |
825 defineRule( | 800 defineRule( |
826 'limboth', 'default.default', | 801 'limboth', 'default.default', |
827 '[n] children/*[1]; [t] "from"; [n] children/*[2]; [t] "to";' + | 802 '[n] children/*[1]; [t] "from"; [n] children/*[2]; [t] "to";' + |
828 '[n] children/*[3]', 'self::limboth'); | 803 '[n] children/*[3]', |
| 804 'self::limboth'); |
829 | 805 |
830 defineRule( | 806 defineRule( |
831 'sum-only', 'default.default', | 807 'sum-only', 'default.default', |
832 '[n] children/*[1]; [p] (pause 100); [t] "over"; [n] children/*[2];' + | 808 '[n] children/*[1]; [p] (pause 100); [t] "over"; [n] children/*[2];' + |
833 '[p] (pause 250);', | 809 '[p] (pause 250);', |
834 'self::limboth', 'self::limboth[@role="sum"]'); | 810 'self::limboth', 'self::limboth[@role="sum"]'); |
835 | 811 |
836 defineRule( | 812 defineRule( |
837 'limlower', 'default.default', | 813 'limlower', 'default.default', |
838 '[n] children/*[1]; [t] "over"; [n] children/*[2];', 'self::limlower'); | 814 '[n] children/*[1]; [t] "over"; [n] children/*[2];', 'self::limlower'); |
839 | 815 |
840 defineRule( | 816 defineRule( |
841 'limupper', 'default.default', | 817 'limupper', 'default.default', |
842 '[n] children/*[1]; [t] "under"; [n] children/*[2];', 'self::limupper'); | 818 '[n] children/*[1]; [t] "under"; [n] children/*[2];', 'self::limupper'); |
843 | 819 |
844 // Bigoperator rules | 820 // Bigoperator rules |
845 defineRule( | 821 defineRule('largeop', 'default.default', '[n] text()', 'self::largeop'); |
846 'largeop', 'default.default', | |
847 '[n] text()', 'self::largeop'); | |
848 | 822 |
849 defineRule( | 823 defineRule( |
850 'bigop', 'default.default', | 824 'bigop', 'default.default', |
851 '[n] children/*[1]; [p] (pause 100); [t] "over"; [n] children/*[2];' + | 825 '[n] children/*[1]; [p] (pause 100); [t] "over"; [n] children/*[2];' + |
852 '[p] (pause 250);', | 826 '[p] (pause 250);', |
853 'self::bigop'); | 827 'self::bigop'); |
854 | 828 |
855 | 829 |
856 // Integral rules | 830 // Integral rules |
857 defineRule( | 831 defineRule( |
858 'integral', 'default.default', | 832 'integral', 'default.default', |
859 '[n] children/*[1]; [p] (pause 100); [n] children/*[2]; [p] (pause 200);' + | 833 '[n] children/*[1]; [p] (pause 100); [n] children/*[2]; [p] (pause 200);'
+ |
860 '[n] children/*[3] (rate:0.35);', 'self::integral'); | 834 '[n] children/*[3] (rate:0.35);', |
| 835 'self::integral'); |
861 | 836 |
862 | 837 |
863 defineRule( | 838 defineRule( |
864 'sqrt', 'default.default', | 839 'sqrt', 'default.default', |
865 '[t] "Square root of"; [n] children/*[1] (rate:0.2); [p] (pause:400)', | 840 '[t] "Square root of"; [n] children/*[1] (rate:0.2); [p] (pause:400)', |
866 'self::sqrt'); | 841 'self::sqrt'); |
867 | 842 |
868 defineRule( | 843 defineRule( |
869 'square', 'default.default', | 844 'square', 'default.default', |
870 '[n] children/*[1]; [t] "square" (pitch:0.35); [p] (pause:300)', | 845 '[n] children/*[1]; [t] "square" (pitch:0.35); [p] (pause:300)', |
871 'self::superscript', 'children/*[2][text()=2]'); | 846 'self::superscript', 'children/*[2][text()=2]'); |
872 | 847 |
873 defineRule( | 848 defineRule( |
874 'text-no-mult', 'default.default', | 849 'text-no-mult', 'default.default', |
875 '[n] children/*[1]; [p] (pause:200); [n] children/*[2]', | 850 '[n] children/*[1]; [p] (pause:200); [n] children/*[2]', 'self::infixop', |
876 'self::infixop', 'children/text'); | 851 'children/text'); |
877 }; | 852 }; |
878 | 853 |
879 }); // goog.scope | 854 }); // goog.scope |
OLD | NEW |