| <!DOCTYPE html> |
| <html> |
| <head> |
| <meta charset="utf-8"> |
| <title>Stretching operators along the block axis</title> |
| <link rel="stylesheet" type="text/css" href="/fonts/ahem.css" /> |
| <link rel="help" href="https://w3c.github.io/mathml-core/#dfn-algorithm-for-stretching-operators-along-the-block-axis"> |
| <meta name="assert" content=""> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/mathml/support/fonts.js"></script> |
| <style> |
| math { |
| font: 25px/1 Ahem; |
| } |
| @font-face { |
| font-family: stretchy; |
| src: url("/fonts/math/stretchy.woff"); |
| } |
| mo { |
| font-family: stretchy; |
| } |
| </style> |
| <script> |
| setup({ explicit_done: true }); |
| window.addEventListener("load", () => { loadAllFonts().then(runTests); }); |
| |
| function runTests() { |
| |
| var epsilon = 2; |
| var emToPx = 25; |
| var element; |
| |
| test(function() { |
| element = document.getElementById("horizontal_arrow"); |
| assert_approx_equals(element.getBoundingClientRect().height, 1 * emToPx, epsilon, "horizontal characters don't stretch vertically"); |
| |
| element = document.getElementById("vertical_arrow"); |
| assert_approx_equals(element.getBoundingClientRect().height, 6 * emToPx, epsilon, "vertical characters stretch vertically"); |
| }, `Taking into account stretch axis.`); |
| |
| test(function() { |
| element = document.getElementById("non_stretchy_horizontal_arrow"); |
| assert_approx_equals(element.getBoundingClientRect().height, 1 * emToPx, epsilon, "horizontal characters don't stretch vertically"); |
| |
| element = document.getElementById("non_stretchy_vertical_arrow"); |
| assert_approx_equals(element.getBoundingClientRect().height, 1 * emToPx, epsilon, "vertical characters stretch vertically"); |
| }, `Taking into account stretchy property.`); |
| |
| test(function() { |
| // There are only stretchy operators : the maximum of their base sizes |
| // is used as the target size. |
| let tallest_base_size = 2 * emToPx; |
| |
| element = document.getElementById("small_vertical"); |
| assert_approx_equals(element.getBoundingClientRect().width, .5 * emToPx, epsilon, "small width"); |
| assert_approx_equals(element.getBoundingClientRect().height, tallest_base_size, epsilon, "height is the max(.5em, 1em, 2em)"); |
| |
| element = document.getElementById("medium_vertical"); |
| assert_approx_equals(element.getBoundingClientRect().width, 1 * emToPx, epsilon, "normal width"); |
| assert_approx_equals(element.getBoundingClientRect().height, tallest_base_size, epsilon, "height is the max(.5em, 1em, 2em)"); |
| |
| element = document.getElementById("big_vertical"); |
| assert_approx_equals(element.getBoundingClientRect().width, 2 * emToPx, epsilon, "large width"); |
| assert_approx_equals(element.getBoundingClientRect().height, tallest_base_size, epsilon, "height is the max(.5em, 1em, 2em)"); |
| |
| }, `Only operators with a stretchy property and block stretch axis.`); |
| |
| test(function() { |
| // There are non-stretchy operators : the maximum of their base sizes |
| // is used as the target size. In any case, operators remain at least |
| // as large as their base size. |
| |
| element = document.getElementById("smaller_op"); |
| assert_approx_equals(element.getBoundingClientRect().width, .5 * emToPx, epsilon, "small width"); |
| assert_approx_equals(element.getBoundingClientRect().height, 1.5 * emToPx, epsilon, "height is the max(.5em, 1em)"); |
| |
| element = document.getElementById("bigger_op"); |
| assert_approx_equals(element.getBoundingClientRect().width, 2 * emToPx, epsilon, "large width"); |
| assert_approx_equals(element.getBoundingClientRect().height, 2 * emToPx, epsilon, "height is the max(1em, 2em)"); |
| |
| }, `Operators smaller and larger than non-stretchy siblings.`); |
| |
| test(function() { |
| element = document.getElementById("core_operator_1"); |
| assert_approx_equals(element.getBoundingClientRect().height, 6 * emToPx, epsilon, "mrow"); |
| |
| element = document.getElementById("core_operator_2"); |
| assert_approx_equals(element.getBoundingClientRect().height, 6 * emToPx, epsilon, "munder"); |
| |
| element = document.getElementById("core_operator_3"); |
| assert_approx_equals(element.getBoundingClientRect().height, 6 * emToPx, epsilon, "mover"); |
| |
| element = document.getElementById("core_operator_4"); |
| assert_approx_equals(element.getBoundingClientRect().height, 6 * emToPx, epsilon, "mundeover"); |
| |
| element = document.getElementById("core_operator_5"); |
| assert_approx_equals(element.getBoundingClientRect().height, 6 * emToPx, epsilon, "complex nesting"); |
| }, `Embellished operators`); |
| |
| done(); |
| } |
| </script> |
| </head> |
| <body> |
| <div id="log"></div> |
| <p> |
| <math> |
| <mrow> |
| <mspace width="1em" height="3em" depth="3em" style="background: blue"/> |
| <mo id="horizontal_arrow" stretchy="true">⥚</mo> |
| <mo id="vertical_arrow" stretchy="true">⥜</mo> |
| <mo id="non_stretchy_horizontal_arrow" stretchy="false">⥚</mo> |
| <mo id="non_stretchy_vertical_arrow" stretchy="false">⥜</mo> |
| </mrow> |
| </math> |
| </p> |
| <p> |
| <math> |
| <mrow> |
| <!-- This contains only vertical stretchy operators. --> |
| <mo style="font-size: 50%" id="small_vertical" stretchy="true">⥜</mo> |
| <mo style="font-size: 200%" id="big_vertical" stretchy="true">⥜</mo> |
| <mo style="font-size: 100%" id="medium_vertical" stretchy="true">⥜</mo> |
| </mrow> |
| </math> |
| </p> |
| <p> |
| <math> |
| <mrow> |
| <mspace style="background: blue" width="1em" height=".75em"/> |
| <mo style="font-size: 50%" id="smaller_op" stretchy="true">⥜</mo> |
| <mspace style="background: blue" width="1em" height="1.5em"/> |
| <mo style="font-size: 200%" id="bigger_op" stretchy="true">⥜</mo> |
| <mspace style="background: blue" width="1em" height="1em"/> |
| </mrow> |
| </math> |
| </p> |
| <p> |
| <math> |
| <mrow> |
| <mspace width="1em" height="3em" depth="3em" style="background: blue"/> |
| <mrow><mo id="core_operator_1" stretchy="true">⥜</mo></mrow> |
| <munder> |
| <mo id="core_operator_2" stretchy="true">⥜</mo> |
| <mspace></mspace> |
| </munder> |
| <mover> |
| <mo id="core_operator_3" stretchy="true">⥜</mo> |
| <mspace></mspace> |
| </mover> |
| <munderover> |
| <mo id="core_operator_4" stretchy="true">⥜</mo> |
| <mspace></mspace> |
| <mspace></mspace> |
| </munderover> |
| <mrow> |
| <mspace></mspace> |
| <munderover> |
| <mover> |
| <munder> |
| <mrow> |
| <mo id="core_operator_5" stretchy="true">⥜</mo> |
| </mrow> |
| <mspace></mspace> |
| </munder> |
| <mspace></mspace> |
| </mover> |
| <mspace></mspace> |
| <mspace></mspace> |
| </munderover> |
| </mrow> |
| </mrow> |
| </math> |
| </p> |
| </body> |
| </html> |