embellished-operator-003.html (12577B)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Embellished operators</title> 6 <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> 7 <link rel="help" href="https://w3c.github.io/mathml-core/#embellished-operators"> 8 <link rel="help" href="https://w3c.github.io/mathml-core/#definition-of-space-like-elements"> 9 <link rel="help" href="https://w3c.github.io/mathml-core/#layout-of-mrow"> 10 <meta name="assert" content="Verify definition of embellished operators"> 11 <script src="/resources/testharness.js"></script> 12 <script src="/resources/testharnessreport.js"></script> 13 <script src="/mathml/support/feature-detection.js"></script> 14 <script src="/mathml/support/box-navigation.js"></script> 15 <style> 16 /* Default spacing of operator 'X' is 0.2777777777777778em so quite different 17 from the measured/specified 0em and 1em. */ 18 math, math * { 19 font: 25px/1 Ahem; 20 } 21 mn { 22 color: black; 23 } 24 mtext.space-like { 25 color: lightblue !important; 26 } 27 .testedElement mo { 28 color: yellow !important; 29 } 30 .testedElement, .testedElement * { 31 color: blue !important; 32 background: blue !important; 33 } 34 .oof1 { 35 position: absolute; 36 } 37 .oof2 { 38 position: fixed; 39 } 40 .nobox { 41 display: none; 42 } 43 .allChildrenVisible > *:not(.nobox) { 44 display: inline math; 45 } 46 </style> 47 <script> 48 function spaceBeforeElement(element) { 49 var mnBefore = previousInFlowSibling(element); 50 return element.getBoundingClientRect().left - mnBefore.getBoundingClientRect().right; 51 } 52 53 setup({ explicit_done: true }); 54 window.addEventListener("load", runTests); 55 56 function runTests() { 57 var epsilon = 1; 58 var emToPx = 25; 59 60 ["maction", "semantics"].forEach(tag => { 61 test(function() { 62 assert_true(MathMLFeatureDetection.has_operator_spacing()); 63 var element = document.getElementsByTagName(tag)[0]; 64 assert_approx_equals(spaceBeforeElement(element), 2 * emToPx, epsilon); 65 }, `${tag} (embellished operator)`); 66 67 test(function() { 68 assert_true(MathMLFeatureDetection.has_operator_spacing()); 69 var element = document.getElementsByTagName(tag)[1]; 70 assert_approx_equals(spaceBeforeElement(element), 2 * emToPx, epsilon); 71 }, `${tag} (embellished operator, from in-flow children)`); 72 73 test(function() { 74 assert_true(MathMLFeatureDetection.has_operator_spacing()); 75 var element = document.getElementsByTagName(tag)[2]; 76 assert_approx_equals(spaceBeforeElement(element), 0, epsilon); 77 }, `${tag} (not embellished operator)`); 78 79 test(function() { 80 assert_true(MathMLFeatureDetection.has_operator_spacing()); 81 var element = document.getElementsByTagName(tag)[3]; 82 assert_approx_equals(spaceBeforeElement(element), 0, epsilon); 83 }, `${tag} (not embellished operator, from in-flow children)`); 84 85 test(function() { 86 assert_true(MathMLFeatureDetection.has_operator_spacing()); 87 var element = document.getElementsByTagName(tag)[4]; 88 assert_approx_equals(spaceBeforeElement(element), 0, epsilon); 89 }, `${tag} (not embellished operator, empty)`); 90 91 test(function() { 92 assert_true(MathMLFeatureDetection.has_operator_spacing()); 93 var element = document.getElementsByTagName(tag)[5]; 94 assert_approx_equals(spaceBeforeElement(element), 2 * emToPx, epsilon); 95 }, `${tag} (embellished operator, one child)`); 96 97 test(function() { 98 assert_true(MathMLFeatureDetection.has_operator_spacing()); 99 var element = document.getElementsByTagName(tag)[6]; 100 assert_approx_equals(spaceBeforeElement(element), 2 * emToPx, epsilon); 101 }, `${tag} (embellished operator, complex)`); 102 }); 103 done(); 104 } 105 </script> 106 </head> 107 <body> 108 <div id="log"></div> 109 <!-- <semantics> or <maction> are embellished operators if their children 110 consist (in any order) of one embellished operator and zero or more 111 space-like elements. --> 112 <p> 113 <math> 114 <mn>X</mn> 115 <maction class="testedElement" actiontype="statusline"> 116 <mo lspace="2em" rspace="0em">X</mo> 117 <mn>STATUS MESSAGE</mn> 118 </maction> 119 <mn>X</mn> 120 </math> 121 </p> 122 <p> 123 <math> 124 <mn>X</mn> 125 <semantics class="testedElement"> 126 <mo lspace="2em" rspace="0em">X</mo> 127 <annotation>TEXT ANNOTATION</annotation> 128 <mn>X</mn> 129 </semantics> 130 <mn>X</mn> 131 </math> 132 </p> 133 134 <!-- Only in-flow children affect determination of embellished operators. --> 135 <p> 136 <math> 137 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 138 <mn>X</mn> 139 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 140 <maction class="testedElement" actiontype="statusline"> 141 <mo lspace="2em" rspace="0em">X</mo> 142 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 143 <mn>STATUS MESSAGE</mn> 144 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 145 </maction> 146 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 147 <mn>X</mn> 148 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 149 </math> 150 </p> 151 <p> 152 <math> 153 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 154 <mn>X</mn> 155 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 156 <semantics class="testedElement"> 157 <mo lspace="2em" rspace="0em">X</mo> 158 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 159 <annotation>TEXT ANNOTATION</annotation> 160 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 161 <mn>X</mn> 162 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 163 </semantics> 164 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 165 <mn>X</mn> 166 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 167 </math> 168 </p> 169 170 <!-- <semantics> or <maction> are not embellished 171 operators if their first in-flow child is not an embellished operator --> 172 <p> 173 <math> 174 <mn>X</mn> 175 <msub class="testedElement"> 176 <mn>X</mn> 177 <mo lspace="2em" rspace="0em">X</mo> 178 </msub> 179 <mn>X</mn> 180 </math> 181 </p> 182 <p> 183 <math> 184 <mn>X</mn> 185 <msup class="testedElement"> 186 <mn>X</mn> 187 <mo lspace="2em" rspace="0em">X</mo> 188 </msup> 189 <mn>X</mn> 190 </math> 191 </p> 192 <p> 193 <math> 194 <mn>X</mn> 195 <msubsup class="testedElement"> 196 <mn>X</mn> 197 <mo lspace="2em" rspace="0em">X</mo> 198 <mn>X</mn> 199 </msubsup> 200 <mn>X</mn> 201 </math> 202 </p> 203 <p> 204 <math> 205 <mn>X</mn> 206 <munder class="testedElement"> 207 <mn>X</mn> 208 <mo lspace="2em" rspace="0em">X</mo> 209 </munder> 210 <mn>X</mn> 211 </math> 212 </p> 213 <p> 214 <math> 215 <mn>X</mn> 216 <mover class="testedElement"> 217 <mn>X</mn> 218 <mo lspace="2em" rspace="0em">X</mo> 219 </mover> 220 <mn>X</mn> 221 </math> 222 </p> 223 <p> 224 <math> 225 <mn>X</mn> 226 <munderover class="testedElement"> 227 <mn>X</mn> 228 <mo lspace="2em" rspace="0em">X</mo> 229 </munderover> 230 <mn>X</mn> 231 </math> 232 </p> 233 <p> 234 <math> 235 <mn>X</mn> 236 <mmultiscripts class="testedElement"> 237 <mn>X</mn> 238 <mo lspace="2em" rspace="0em">X</mo> 239 <mn>X</mn> 240 <mn>X</mn> 241 <mn>X</mn> 242 </mmultiscripts> 243 <mn>X</mn> 244 </math> 245 </p> 246 <p> 247 <math> 248 <mn>X</mn> 249 <mfrac class="testedElement"> 250 <mn>X</mn> 251 <mo lspace="2em" rspace="0em">X</mo> 252 </mfrac> 253 <mn>X</mn> 254 </math> 255 </p> 256 <p> 257 <math> 258 <mn>X</mn> 259 <maction class="testedElement" actiontype="statusline"> 260 <mn>X</mn> 261 <mo lspace="2em" rspace="0em">STATUS MESSAGE</mo> 262 </maction> 263 <mn>X</mn> 264 </math> 265 </p> 266 <p> 267 <math> 268 <mn>X</mn> 269 <semantics class="testedElement"> 270 <mrow> 271 <mn>X</mn> 272 <mo lspace="2em" rspace="0em">X</mo> 273 </mrow> 274 <annotation>TEXT ANNOTATION</annotation> 275 </semantics> 276 <mn>X</mn> 277 </math> 278 </p> 279 280 <!-- Only in-flow children affect determination of embellished operators. --> 281 <p> 282 <math> 283 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 284 <mn>X</mn> 285 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 286 <maction class="testedElement" actiontype="statusline"> 287 <mn>X</mn> 288 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 289 <mo lspace="2em" rspace="0em">STATUS MESSAGE</mo> 290 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 291 </maction> 292 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 293 <mn>X</mn> 294 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 295 </math> 296 </p> 297 <p> 298 <math> 299 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 300 <mn>X</mn> 301 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 302 <semantics class="testedElement"> 303 <mrow> 304 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 305 <mn>X</mn> 306 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 307 <mo lspace="2em" rspace="0em">X</mo> 308 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 309 </mrow> 310 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 311 <annotation>TEXT ANNOTATION</annotation> 312 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 313 </semantics> 314 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 315 <mn>X</mn> 316 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 317 </math> 318 </p> 319 320 <!-- Empty <maction> and <semantics> (invalid in MathML3). --> 321 <p> 322 <math> 323 <mn>X</mn> 324 <maction class="testedElement"> 325 </maction> 326 <mn>X</mn> 327 </math> 328 </p> 329 <p> 330 <math> 331 <mn>X</mn> 332 <semantics class="testedElement"> 333 </semantics> 334 <mn>X</mn> 335 </math> 336 </p> 337 338 <!-- One-child <maction> and <semantics> (invalid in MathML3). --> 339 <p> 340 <math> 341 <mn>X</mn> 342 <maction class="testedElement"> 343 <mo lspace="2em" rspace="0em">X</mo> 344 </maction> 345 <mn>X</mn> 346 </math> 347 </p> 348 <p> 349 <math> 350 <mn>X</mn> 351 <semantics class="testedElement"> 352 <mo lspace="2em" rspace="0em">X</mo> 353 </semantics> 354 <mn>X</mn> 355 </math> 356 </p> 357 358 <!-- Complex structure (invalid in MathML3). --> 359 <p> 360 <math> 361 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 362 <mn>X</mn> 363 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 364 <maction class="testedElement allChildrenVisible"> 365 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 366 <mo lspace="2em" rspace="0em">X</mo> 367 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 368 <mtext class="space-like">X</mtext> 369 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 370 </maction> 371 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 372 <mn>X</mn> 373 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 374 </math> 375 </p> 376 <p> 377 <math> 378 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 379 <mn>X</mn> 380 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 381 <semantics class="testedElement allChildrenVisible"> 382 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 383 <mo lspace="2em" rspace="0em">X</mo> 384 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 385 <mtext class="space-like">X</mtext> 386 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 387 </semantics> 388 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 389 <mn>X</mn> 390 <mn class="oof1">0</mn><mn class="oof2">1</mn><mn class="nobox">2</mn> 391 </math> 392 </p> 393 </body> 394 </html>