'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;
}
}