From 0687cdc3d8d3afeff6ba304b68af60e5a35f0574 Mon Sep 17 00:00:00 2001 From: Xavier Ripoll Date: Wed, 10 Oct 2018 17:09:01 +0200 Subject: [PATCH] MOODLE-556: Fixed bugs in Math package revealed by tests --- library/HTMLPurifier/HTMLModule/Math.php | 79 +++++++++++++++++------- 1 file changed, 55 insertions(+), 24 deletions(-) diff --git a/library/HTMLPurifier/HTMLModule/Math.php b/library/HTMLPurifier/HTMLModule/Math.php index 4f5d9f55..4b1f6ee6 100644 --- a/library/HTMLPurifier/HTMLModule/Math.php +++ b/library/HTMLPurifier/HTMLModule/Math.php @@ -36,6 +36,23 @@ class HTMLPurifier_HTMLModule_Math extends HTMLPurifier_HTMLModule // Prefix used for xlink attrs; is not specified by the MathML DTD $E['XLINK.prefix'] = 'xlink'; + $proprietary_att_wrs = array( + 'wrs:valign' => 'CDATA', + 'wrs:columnalign' => 'CDATA', + 'wrs:positionable' => 'CDATA', + 'wrs:linecolor' => 'CDATA', + 'wrs:baseline' => 'CDATA', + 'wrs:reserved' => 'CDATA', + 'wrs:decimalseparators' => 'CDATA' + // TODO: Add xmlns:wrs + ); + + $proprietary_att_dsi = array( + 'xmlns:dsi' => 'Bool#http://www.dessci.com/mathml', + 'dsi:background' => 'CDATA', + 'dsi:color' => 'CDATA' + ); + /***************************************************************** * DTD code * Code from the DTD ported and adapted @@ -52,20 +69,25 @@ class HTMLPurifier_HTMLModule_Math extends HTMLPurifier_HTMLModule $E['DefEncAtt'] = array( 'encoding' => 'CDATA', - 'definitionURL' => 'CDATA' + 'definitionurl' => 'CDATA' ); - $E['CommonAtt'] = array( - 'xmlns:mml' => 'Bool#http://www.w3.org/1998/Math/MathML', - $E['XLINK.prefix'] . ':href' => 'CDATA', - $E['XLINK.prefix'] . ':type' => 'CDATA', - 'xml:lang' => 'CDATA', - 'xml:space' => 'Enum#default,preserve', - 'id' => 'CDATA', // MathML allows multiple elements with same ID - 'xref' => 'CDATA', - 'class' => 'CDATA', - 'href' => 'CDATA', - 'other' => 'CDATA', + $E['CommonAtt'] = array_merge( + array( + 'xmlns' => 'Bool#http://www.w3.org/1998/Math/MathML', + $E['XLINK.prefix'] . ':href' => 'CDATA', + $E['XLINK.prefix'] . ':type' => 'CDATA', + 'xml:lang' => 'CDATA', + 'xml:space' => 'Enum#default,preserve', + 'id' => 'CDATA', // MathML allows multiple elements with same ID + 'xref' => 'CDATA', + 'class' => 'CDATA', + 'style' => 'CDATA', + 'href' => 'CDATA', + 'other' => 'CDATA', + ), + $proprietary_att_wrs, + $proprietary_att_dsi ); // These two sets of attrs appear commonly together. @@ -78,7 +100,7 @@ class HTMLPurifier_HTMLModule_Math extends HTMLPurifier_HTMLModule $this->addElement( 'cn', $default_display, - 'Custom: #PCDATA|mglyph|sep|' . $E['PresentationExpression'], + 'Custom: (#PCDATA|mglyph|sep|' . $E['PresentationExpression'] . ')*', array(), array_merge( $CDEAtt, @@ -92,7 +114,7 @@ class HTMLPurifier_HTMLModule_Math extends HTMLPurifier_HTMLModule $this->addElement( 'ci', $default_display, - 'Custom: #PCDATA|mglyph|' . $E['PresentationExpression'], + 'Custom: (#PCDATA|mglyph|' . $E['PresentationExpression'] . ')*', array(), array_merge( $CDEAtt, @@ -105,7 +127,7 @@ class HTMLPurifier_HTMLModule_Math extends HTMLPurifier_HTMLModule $this->addElement( 'csymbol', $default_display, - 'Custom: #PCDATA|mglyph|' . $E['PresentationExpression'], + 'Custom: (#PCDATA|mglyph|' . $E['PresentationExpression'] . ')*', array(), array_merge( $CDEAtt, @@ -169,6 +191,7 @@ class HTMLPurifier_HTMLModule_Math extends HTMLPurifier_HTMLModule '|' . $E['lambda.mmlclass'] . '|' . $E['nary-functional.mmlclass'] . '|' . $E['binary-arith.mmlclass'] . + '|' . $E['unary-arith.mmlclass'] . '|' . $E['nary-minmax.mmlclass'] . '|' . $E['nary-arith.mmlclass'] . '|' . $E['nary-logical.mmlclass'] . @@ -240,7 +263,8 @@ class HTMLPurifier_HTMLModule_Math extends HTMLPurifier_HTMLModule $this->addElement( 'cbytes', $default_display, - 'Custom: (#PCDATA)', + // The * is not in the DTD but we add it to allow empty tag + 'Custom: (#PCDATA)*', array(), $CDEAtt ); @@ -248,7 +272,8 @@ class HTMLPurifier_HTMLModule_Math extends HTMLPurifier_HTMLModule $this->addElement( 'cs', $default_display, - 'Custom: (#PCDATA)', + // The * is not in the DTD but we add it to allow empty tag + 'Custom: (#PCDATA)*', array(), $CDEAtt ); @@ -1401,7 +1426,7 @@ class HTMLPurifier_HTMLModule_Math extends HTMLPurifier_HTMLModule $E['MathExpression'] = $E['ContExp'] . '|' . $E['PresentationExpression']; - $E['ImpliedMrow'] = '(' . $E['MathExpression'] . ')'; + $E['ImpliedMrow'] = '(' . $E['MathExpression'] . ')*'; $E['TableRowExpression'] = 'mtr|mlabeledtr'; $E['TableCellExpression'] = 'mtd'; $E['MstackExpression'] = $E['MathExpression'] . @@ -1500,7 +1525,7 @@ class HTMLPurifier_HTMLModule_Math extends HTMLPurifier_HTMLModule ',badbreak', 'lineleading' => $E['length'], 'linebreakstyle' => 'Enum#before,after,duplicate' . - 'infixlinebreakstyle', + ',infixlinebreakstyle', 'linebreakmultchar' => 'CDATA', 'indentalign' => 'Enum#left,center,right,auto,id', 'indentshift' => $E['length'], @@ -1719,6 +1744,10 @@ class HTMLPurifier_HTMLModule_Math extends HTMLPurifier_HTMLModule 'bevelled' => 'Enum#true,false', 'charalign' => 'Enum#left,center,right', 'charspacing' => 'CDATA', + 'close' => 'CDATA', + 'columnalign' => 'CDATA', + 'columnlines' => 'CDATA', + 'columnspacing' => 'CDATA', 'columnspan' => $E['positive-integer'], 'columnwidth' => 'CDATA', 'crossout' => 'CDATA', @@ -1992,6 +2021,7 @@ class HTMLPurifier_HTMLModule_Math extends HTMLPurifier_HTMLModule 'frame' => $E['linestyle'], 'framespacing' => 'CDATA', 'equalrows' => 'Enum#true,false', + 'equalcolumns' => 'Enum#true,false', 'displaystyle' => 'Enum#true,false', 'side' => 'Enum#left,right,leftoverlap,rightoverlap', 'minlabelspacing' => $E['length'] @@ -2080,7 +2110,7 @@ class HTMLPurifier_HTMLModule_Math extends HTMLPurifier_HTMLModule $this->addElement( 'msgroup', $default_display, - 'Custom: (' . $E['MstackExpression'] . ')', + 'Custom: (' . $E['MstackExpression'] . ')*', array(), $E['msgroup.attributes'] ); @@ -2088,7 +2118,7 @@ class HTMLPurifier_HTMLModule_Math extends HTMLPurifier_HTMLModule $this->addElement( 'msrow', $default_display, - 'Custom: (' . $E['MsrowExpression'] . ')', + 'Custom: (' . $E['MsrowExpression'] . ')*', array(), array_merge( $CCPAtt, @@ -2187,7 +2217,8 @@ class HTMLPurifier_HTMLModule_Math extends HTMLPurifier_HTMLModule $this->addElement( 'annotation', $default_display, - 'Custom: (#PCDATA)', + // The * is not in the DTD but we add it to allow empty tag + 'Custom: (#PCDATA)*', array(), $E['annotation.attributes'] ); @@ -2195,7 +2226,7 @@ class HTMLPurifier_HTMLModule_Math extends HTMLPurifier_HTMLModule $this->addElement( 'annotation-xml', $default_display, - 'Custom: (' . $E['MathExpression'] . ')*', + 'Custom: ((' . $E['MathExpression'] . ')*)', array(), $E['annotation.attributes'] ); @@ -2203,7 +2234,7 @@ class HTMLPurifier_HTMLModule_Math extends HTMLPurifier_HTMLModule $this->addElement( 'semantics', $default_display, - 'Custom: (' . $E['MathExpression'] . + 'Custom: ((' . $E['MathExpression'] . '),(annotation|annotation-xml)*)', array(), array_merge(