From 1dcebd4fc56ab0d6b61714ae32df61bc53694842 Mon Sep 17 00:00:00 2001 From: 7u83 <7u83@mail.ru> Date: Sat, 25 Nov 2023 16:27:47 +0100 Subject: [PATCH] Set version to 0.9.1 --- TextformatterLatexMathML.module | 252 ++++++++++++++++---------------- 1 file changed, 126 insertions(+), 126 deletions(-) diff --git a/TextformatterLatexMathML.module b/TextformatterLatexMathML.module index a0a7bec..6222580 100644 --- a/TextformatterLatexMathML.module +++ b/TextformatterLatexMathML.module @@ -1,126 +1,126 @@ - 'LatexMathML Text Formatter', - 'version' => '1.0.0', - '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; - } -} - + '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; + } +} +