diff --git a/TextformatterLatexMathML.module b/TextformatterLatexMathML.module
new file mode 100644
index 0000000..a0a7bec
--- /dev/null
+++ b/TextformatterLatexMathML.module
@@ -0,0 +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;
+ }
+}
+