@@ -392,6 +392,48 @@ abstract class Package_Generic_XHTML extends Format_Abstract_XHTML {
392392 //phd
393393 'phd:toc ' => 'format_phd_toc ' ,
394394
395+ // MathML (namespace http://www.w3.org/1998/Math/MathML)
396+ 'mml:math ' => 'format_mml_element ' ,
397+ // Token
398+ 'mml:mi ' => 'format_mml_element ' ,
399+ 'mml:mn ' => 'format_mml_element ' ,
400+ 'mml:mo ' => 'format_mml_element ' ,
401+ 'mml:mtext ' => 'format_mml_element ' ,
402+ 'mml:mspace ' => 'format_mml_element ' ,
403+ 'mml:ms ' => 'format_mml_element ' ,
404+ // Layout
405+ 'mml:mrow ' => 'format_mml_element ' ,
406+ 'mml:mfrac ' => 'format_mml_element ' ,
407+ 'mml:msqrt ' => 'format_mml_element ' ,
408+ 'mml:mroot ' => 'format_mml_element ' ,
409+ 'mml:mstyle ' => 'format_mml_element ' ,
410+ 'mml:merror ' => 'format_mml_element ' ,
411+ 'mml:mpadded ' => 'format_mml_element ' ,
412+ 'mml:mphantom ' => 'format_mml_element ' ,
413+ 'mml:mfenced ' => 'format_mml_element ' ,
414+ 'mml:menclose ' => 'format_mml_element ' ,
415+ // Scripts and limits
416+ 'mml:msub ' => 'format_mml_element ' ,
417+ 'mml:msup ' => 'format_mml_element ' ,
418+ 'mml:msubsup ' => 'format_mml_element ' ,
419+ 'mml:munder ' => 'format_mml_element ' ,
420+ 'mml:mover ' => 'format_mml_element ' ,
421+ 'mml:munderover ' => 'format_mml_element ' ,
422+ 'mml:mmultiscripts ' => 'format_mml_element ' ,
423+ 'mml:mprescripts ' => 'format_mml_element ' ,
424+ 'mml:none ' => 'format_mml_element ' ,
425+ // Tables
426+ 'mml:mtable ' => 'format_mml_element ' ,
427+ 'mml:mtr ' => 'format_mml_element ' ,
428+ 'mml:mtd ' => 'format_mml_element ' ,
429+ 'mml:mlabeledtr ' => 'format_mml_element ' ,
430+ // Semantics
431+ 'mml:semantics ' => 'format_mml_element ' ,
432+ 'mml:annotation ' => 'format_mml_element ' ,
433+ 'mml:annotation-xml ' => 'format_mml_element ' ,
434+ // Actions
435+ 'mml:maction ' => 'format_mml_element ' ,
436+
395437 ); /* }}} */
396438
397439 private $ mytextmap = array (
@@ -631,6 +673,37 @@ function format_phd_toc($open, $name, $attrs, $props) {
631673 ) . "</div> \n" ;
632674 }
633675
676+ /**
677+ * Handle MathML elements (mml:* namespace).
678+ * Strips the "mml:" prefix and outputs the HTML5 local name.
679+ */
680+ public function format_mml_element ($ open , $ name , $ attrs , $ props ) {
681+ $ localName = substr ($ name , 4 );
682+
683+ if ($ open ) {
684+ $ attrStr = '' ;
685+
686+ // Add xmlns on the <math> root element for XHTML compatibility
687+ if ($ localName === 'math ' ) {
688+ $ attrStr .= ' xmlns=" ' . Reader::XMLNS_MATHML . '" ' ;
689+ }
690+
691+ // Preserve MathML attributes (stored under XMLNS_DOCBOOK as they have no namespace)
692+ foreach ($ attrs [Reader::XMLNS_DOCBOOK ] as $ attr => $ val ) {
693+ $ attrStr .= ' ' . $ attr . '=" ' . $ this ->TEXT ($ val ) . '" ' ;
694+ }
695+
696+ // Preserve xml:id as id
697+ if (isset ($ attrs [Reader::XMLNS_XML ]["id " ])) {
698+ $ attrStr .= ' id=" ' . $ attrs [Reader::XMLNS_XML ]["id " ] . '" ' ;
699+ }
700+
701+ return '< ' . $ localName . $ attrStr . ($ props ["empty " ] ? '/> ' : '> ' );
702+ }
703+
704+ return '</ ' . $ localName . '> ' ;
705+ }
706+
634707 public function createLink ($ for , &$ desc = null , $ type = Format::SDESC ) {
635708 $ retval = null ;
636709 if (isset ($ this ->indexes [$ for ])) {
0 commit comments