*/ class DecoratorMath extends Decorator { const NOT_IN_EQUATION = 1000; const IN_EQUATION = 1001; private $state; private $equation; /** * Class constructor. * @param archive Will receive the content of the document. */ function __construct($decorator) { parent::__construct($decorator); $this->state = DecoratorMath::NOT_IN_EQUATION; } /** * Receives mathematic formula from Mathjax plugin. * Sometimes a formula is split across several calls. * Formula is finished when any other command is called. */ function mathjax_content($formula) { if ($this->state == DecoratorMath::NOT_IN_EQUATION) { $this->equation = $formula; $this->state = DecoratorMath::IN_EQUATION; } else { $this->equation = $this->equation.$formula; } } /** * Sometimes a formula is split across several calls. * Formula is finished when any other command is called. */ function any_command() { if ($this->state == DecoratorMath::IN_EQUATION) { $this->decorator->mathjax_content($this->processEquation($this->equation)); $this->state = DecoratorMath::NOT_IN_EQUATION; } } /** * Transforms the equation according to the rendering rules. * - Formula surrounded (inline) by $ ... $ is transformed to \( ... \) * - Formula surrounded by $$ ... $$ or \[ ... \] is surrounded with \begin{equation} ... \end{equation} * - Formula containing any amsmath command is left as is. * @param String $equation The equation. * @return String The escaped equation. */ private function processEquation($equation) { if (substr( $equation, 0, 2 ) === "$$" || substr( $equation, 0, 2 ) === '\\[') { return $this->processDisplayEquation($equation); } else if (substr( $equation, 0, 1 ) === "$") { return $this->processInlineEquation($equation); } else { return $this->processAmsMathEquation($equation); } } private function processDisplayEquation($equation) { $trimmedEquation = substr($equation, 2, strlen($equation) - 4); $trimmedEquation = trim($trimmedEquation); $trimmedEquation = $this->removeTagCommand($trimmedEquation); return "\\begin{equation}\r\n $trimmedEquation\r\n\\end{equation}\r\n"; } private function processInlineEquation($equation) { $trimmedEquation = trim($this->removeTagCommand($equation), '$ '); return '\\('.$trimmedEquation.'\\)'; } private function processAmsMathEquation($equation) { return $equation; } /** * The tag command, although supported in Mathjax, it is not well handled by the 'equation' * environment. * @param String $equation The equation. * @return String The escaped equation. */ private function removeTagCommand($equation) { return preg_replace('/\\\\tag\{[^}]+\}/', '', $equation); } }