'LatexMathML Text Formatter', 'version' => '0.9.1', 'summary' => 'Replaces $latexformula$ with inline MathML', 'author' = '7u83', 'autoload' => true, 'singular' => true, 'href' => 'https://git.planix.org/7u83/processwire-TextformatterLatexMathML', 'requires' => array('ProcessWire>=3.0.0'), ); } public function format(&$str) { // Regular expression to match LaTeX formulas within $ symbols $latexPattern = '/(?loadHTML(''.$inputString.'', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); // Create a DOMXPath object to navigate the DOMDocument $xpath = new \DOMXPath($dom); // Find all

,

, ... elements $elements = $xpath->query('//p | //div | //span | //strong | //b | //i | //em'); $nodesForReplacement = array(); // Iterate through the elements and create and arraz of nodes to modify foreach ($elements as $element) { foreach ($element->childNodes as $node) { if ($node->nodeType === XML_TEXT_NODE) { // convert $formula$ to mathml $modifiedValue = preg_replace_callback($latexPattern, array($this,'convertToMathML'), $node->nodeValue); // unescape esaped $-signs $modifiedValue = str_replace('\$', '$',$modifiedValue); // Save the node and its modified content for later replacement $nodesForReplacement[] = array( 'node' => $node, 'modifiedValue' => $modifiedValue ); } } } // Replace the nodes foreach ($nodesForReplacement as $replacement) { $fragment = $dom->createDocumentFragment(); $fragment->appendXML($replacement['modifiedValue']); $replacement['node']->parentNode->replaceChild($fragment, $replacement['node']); } // Output the modified HTML $str = str_replace(array('','') , '' , $dom->saveHTML($dom->documentElement)); } // Define a callback function to convert the matched formula to MathML function convertToMathML($matches) { $cache = wire('cache'); // $matches[1] contains the matched substring within '$' $formula = $matches[1]; $cn = "TFLatexMathML$formula"; $mathml = base64_decode($cache->get($cn)); if ($mathml) return $mathml; $mathml = $this->convertFormulaToMathML($formula); $cache->save($cn,base64_encode($mathml)); // Return the processed result as the replacement return $mathml; } // Function to convert a formula to MathML function convertFormulaToMathML($formula) { $command = 'latexmlmath --quiet -'; $inputString = '$'.$formula.'$'; // Construct the full command with the input string $fullCommand = sprintf('echo %s | %s', escapeshellarg($inputString), $command); // Execute the command and capture the output $output = shell_exec($fullCommand); return $output; } }