output = new XMLWriter(); $this->output->openMemory(); $this->output->startDocument('1.0', 'UTF-8'); $this->output->writeDtd('math', '-//W3C//DTD MathML 2.0//EN', 'http://www.w3.org/Math/DTD/mathml2/mathml2.dtd'); $this->output->startElement('math'); $this->output->writeAttribute('xmlns', 'http://www.w3.org/1998/Math/MathML'); foreach ($math->getElements() as $element) { $this->writeElementItem($element); } $this->output->endElement(); $this->output->endDocument(); return $this->output->outputMemory(); } protected function writeElementItem(Element\AbstractElement $element): void { $tagName = $this->getElementTagName($element); // Element\AbstractGroupElement if ($element instanceof Element\AbstractGroupElement) { $this->output->startElement($tagName); foreach ($element->getElements() as $childElement) { $this->writeElementItem($childElement); } $this->output->endElement(); return; } // Element\Superscript if ($element instanceof Element\Superscript) { $this->output->startElement($tagName); $this->writeElementItem($element->getBase()); $this->writeElementItem($element->getSuperscript()); $this->output->endElement(); return; } // Element\Fraction if ($element instanceof Element\Fraction) { $this->output->startElement($tagName); $this->writeElementItem($element->getNumerator()); $this->writeElementItem($element->getDenominator()); $this->output->endElement(); return; } if ($element instanceof Element\Identifier || $element instanceof Element\Numeric || $element instanceof Element\Operator) { $this->output->startElement($tagName); $this->output->text((string) $element->getValue()); $this->output->endElement(); return; } /* throw new NotImplementedException(sprintf( '%s : The class `%s` is not implemented', __METHOD__, get_class($element) )); */ } protected function getElementTagName(Element\AbstractElement $element): string { // Group if ($element instanceof Element\Row) { return 'mrow'; } if ($element instanceof Element\AbstractGroupElement) { /* throw new NotImplementedException(sprintf( '%s : The element of the class `%s` has no tag name', __METHOD__, get_class($element) )); */ } if ($element instanceof Element\Superscript) { return 'msup'; } if ($element instanceof Element\Fraction) { return 'mfrac'; } if ($element instanceof Element\Identifier) { return 'mi'; } if ($element instanceof Element\Numeric) { return 'mn'; } if ($element instanceof Element\Operator) { return 'mo'; } throw new NotImplementedException(sprintf( '%s : The element of the class `%s` has no tag name', __METHOD__, get_class($element) )); } }