'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'), ); } function smartQuotesGermanHTML($html) { $doc = new \DOMDocument(); libxml_use_internal_errors(true); // Verhindert Warnungen bei schlechtem HTML $doc->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); $xpath = new \DOMXPath($doc); foreach ($xpath->query('//text()') as $textNode) { $text = $textNode->nodeValue; $r = $this->replaceQuotesInText($text); $textNode->nodeValue = $r; //this->replaceQuotesInText($text); } // Nur extrahieren, weil DOMDocument etc. einfügt $bodyNode = $doc->getElementsByTagName('body')->item(0); $innerHTML = ''; foreach ($bodyNode->childNodes as $child) { $innerHTML .= $doc->saveHTML($child); } return $innerHTML; } function replaceQuotesInText($text) { static $isOpen = true; $result = ''; $len = mb_strlen($text); for ($i = 0; $i < $len; $i++) { $char = mb_substr($text, $i, 1); if ($char === '"') { $result .= $isOpen ? '„' : '“'; $isOpen = !$isOpen; } else { $result .= $char; } } return $result; } public function format(&$str) { # $str = $this->smartQuotesGermanHTML($str); # return; // 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); $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'); # $cache->deleteAll(); // $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 -'; # $command = '/usr/local/bin/katex --format mathml'; # $inputString = '$'.$formula.'$'; $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); $output = str_replace(' xmlns="http://www.w3.org/1998/Math/MathML"', '', $output); return $output; } }