| 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 |