190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber<?php 290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/**** 490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * ASCIIMathPHP and associated classes: 590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * -- XMLNode 690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * -- MathMLNode extends XMLNode 790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * These classes are a PHP port of ASCIIMath 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Version 1.3 Feb 19 2004, (c) Peter Jipsen http://www.chapman.edu/~jipsen 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * ASCIIMathPHP Version 1.11, 26 April 2006, (c) Kee-Lin Steven Chan (kc56@cornell.edu) 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * This program is free software; you can redistribute it and/or modify 1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * it under the terms of the GNU General Public License as published by 1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * the Free Software Foundation; either version 2 of the License, or (at 1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * your option) any later version. 1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * This program is distributed in the hope that it will be useful, 1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * but WITHOUT ANY WARRANTY; without even the implied warranty of 2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * General Public License (at http://www.gnu.org/copyleft/gpl.html) 2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * for more details. 2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * ChangeLog 2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Ver 2.0 2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * -- PHP5 only version of ASCIIMathPHP 2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Ver 1.12.1 3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * -- Included the missing setCurrExpr() method 3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Ver 1.12 3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * -- Added changes that David Lippman <DLippman@pierce.ctc.edu> made to bring ASCIIMathPHP up to 3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * ASCIIMath 1.4.7 functionality. 3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * -- Added parseIntExpr, for intermediate expression parsing rule, allowing x^2/x^3 to render as (x^2)/(x^3) 3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * -- Added quotes as another way of designating text; "hello" is equivalent to text(hello) 3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * -- Added FUNC designator to allow sin, cos, etc to act as functions, so sin(x)/x renders as {sin(x)}/x 3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Ver 1.11 4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * -- Fixed bug that stopped script execution for incomplete expressions 4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * -- Changed the algorithm for parsing expressions so that it matches the longest string possible (greedy) 4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Ver 1.10 4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * -- Added definition support 4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * -- Added stackrel support 4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * -- Added a bunch of different symbols etc. >>, << and definitions like dx, dy, dz etc. 4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Ver 1.02 4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * -- Fixed bug with mbox and text 5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * -- Fixed spacing bug with mbox and text 5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Ver 1.01 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * -- Fixed Bug that did not parse symbols greater than a single character 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * correctly when appearing at end of expression. 5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ***/ 5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberclass XMLNode 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Private variables 6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber var $_id; 6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber var $_name; 6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber var $_content; 6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber var $_mt_elem_flg; 6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber var $_attr_arr; 6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber var $_child_arr; 6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber var $_nmspc; 6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber var $_nmspc_alias; 6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber var $_parent_id; 7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber var $_parent_node; 7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function XMLNode($id = NULL) 7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_id = isset($id) ? $id : md5(uniqid(rand(),1)); 7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_name = ''; 7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_content = ''; 7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_mt_elem_flg = FALSE; 7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_attr_arr = array(); 7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_child_arr = array(); 8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_nmspc = ''; 8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_nmspc_alias = ''; 8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_parent_id = FALSE; 8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_parent_node = NULL; 8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function addChild(&$node) 8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_child_arr[$node->getId()] = $node; 8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node->setParentId($this->_id); 9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node->setParentNode($this); 9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function addChildArr(&$node_arr) 9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $key_arr = array_keys($node_arr); 9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $num_key = count($key_arr); 9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for ($i = 0; $i < $num_key; $i++) { 9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node = $node_arr[$key_arr[$i]]; 10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->addChild($node); 10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function insertChildBefore($idx,&$node) 10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $key_arr = array_keys($this->_child_arr); 10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $num_key = count($key_arr); 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_arr = arry(); 10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for ($i = 0;$i < $num_key;$i++) { 11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($i == $idx) { 11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_arr[$node->getId()] = $node; 11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_arr[$key_arr[$i]] = $this->_child_arr[$key_arr[$i]]; 11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_child_arr = $tmp_arr; 11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function insertChildAfter($idx,&$node) 12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $key_arr = array_keys($this->_child_arr); 12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $num_key = count($key_arr); 12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_arr = arry(); 12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for ($i = 0;$i < $num_key;$i++) { 12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_arr[$key_arr[$i]] = $this->_child_arr[$key_arr[$i]]; 12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($i == $idx) { 12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_arr[$node->getId()] = $node; 12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_child_arr = $tmp_arr; 13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function setId($id) 13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_id = $id; 13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function setName($name) 14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_name = $name; 14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function setNamepace($nmspc) 14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_nmspc = $nmspc; 14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function setNamespaceAlias($nmspc_alias) 15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_nmspc_alias = $nmspc_alias; 15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function setContent($content) 15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_content = $content; 15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function setEmptyElem($mt_elem_flg) 16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_mt_elem_flg = $mt_elem_flg; 16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function setAttr($attr_nm,$attr_val) 16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_attr_arr[$attr_nm] = $attr_val; 16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function setAttrArr($attr_arr) 17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_attr_arr = $attr_arr; 17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 17490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function setParentId($id) 17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_parent_id = $id; 17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function setParentNode(&$node) 18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_parent_node = $node; 18290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 18390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getId() 18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($this->_id); 18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getName() 19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($this->_name); 19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getNamespace() 19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($this->_nmspc); 19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getNamespaceAlias() 20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($this->_nmspc_alias); 20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getContent() 20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($this->_content); 20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getAttr($attr_nm) 21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (isset($this->_attr_arr[$attr_nm])) { 21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($this->_attr_arr[$attr_nm]); 21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return(NULL); 21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getAttrArr() 21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($this->_attr_arr); 22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getParentId() 22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($this->parent_id); 22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getParentNode() 22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($this->_parent_node); 23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getChild($id) 23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (isset($this->_child_arr[$id])) { 23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($this->_child_arr[$id]); 23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return(FALSE); 23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getFirstChild() 24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $id_arr = array_keys($this->_child_arr); 24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $num_child = count($id_arr); 24690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($num_child > 0) { 24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($this->_child_arr[$id_arr[0]]); 24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return(FALSE); 25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getLastChild() 25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $id_arr = array_keys($this->_child_arr); 25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $num_child = count($id_arr); 25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($num_child > 0) { 26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($this->_child_arr[$id_arr[$num_child - 1]]); 26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return(FALSE); 26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getChildByIdx($idx) 26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $id_arr = array_keys($this->_child_arr); 26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (isset($this->_child_arr[$id_arr[$idx]])) { 27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($this->_child_arr[$id_arr[$idx]]); 27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return(FALSE); 27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getNumChild() 27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return(count($this->_child_arr)); 28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function removeChild($id) 28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unset($this->_child_arr[$id]); 28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function removeChildByIdx($idx) 28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $key_arr = array_keys($this->_child_arr); 29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unset($this->_child_arr[$key_arr[$idx]]); 29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function removeFirstChild() 29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $key_arr = array_keys($this->_child_arr); 29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unset($this->_child_arr[$key_arr[0]]); 29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function removeLastChild() 30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $key_arr = array_keys($this->_child_arr); 30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unset($this->_child_arr[$key_arr[count($key_arr)-1]]); 30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function dumpXML($indent_str = "\t") 30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $attr_txt = $this->_dumpAttr(); 30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $name = $this->_dumpName(); 30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $xmlns = $this->_dumpXmlns(); 31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $lvl = $this->_getCurrentLevel(); 31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $indent = str_pad('',$lvl,$indent_str); 31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($this->_mt_elem_flg) { 31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tag = "$indent<$name$xmlns$attr_txt />"; 31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($tag); 31690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 31790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $key_arr = array_keys($this->_child_arr); 31890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $num_child = count($key_arr); 31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 32090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tag = "$indent<$name$xmlns$attr_txt>$this->_content"; 32190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 32290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for ($i = 0;$i < $num_child;$i++) { 32390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node = $this->_child_arr[$key_arr[$i]]; 32490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 32590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $child_txt = $node->dumpXML($indent_str); 32690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tag .= "\n$child_txt"; 32790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 32890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 32990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tag .= ($num_child > 0 ? "\n$indent</$name>" : "</$name>"); 33090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($tag); 33190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 33290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 33390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 33490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function _dumpAttr() 33590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 33690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $id_arr = array_keys($this->_attr_arr); 33790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $id_arr_cnt = count($id_arr); 33890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $attr_txt = ''; 33990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 34090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for($i = 0;$i < $id_arr_cnt;$i++) { 34190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $key = $id_arr[$i]; 34290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $attr_txt .= " $key=\"{$this->_attr_arr[$key]}\""; 34390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 34590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($attr_txt); 34690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 34890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function _dumpName() 34990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $alias = $this->getNamespaceAlias(); 35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($alias == '') { 35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($this->getName()); 35390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return("$alias:" . $this->getName()); 35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 35690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 35790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 35890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function _dumpXmlns() 35990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 36090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $nmspc = $this->getNamespace(); 36190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $alias = $this->getNamespaceAlias(); 36290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 36390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($nmspc != '') { 36490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($alias == '') { 36590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return(" xmlns=\"" . $nmspc . "\""); 36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return(" xmlns:$alias=\"" . $nmspc . "\""); 36890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 37090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return(''); 37190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function _getCurrentLevel() 37590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 37690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($this->_parent_id === FALSE) { 37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return(0); 37890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node = $this->getParentNode(); 38090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $lvl = $node->_getCurrentLevel(); 38190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $lvl++; 38290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($lvl); 38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 38490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 38590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 38690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 38790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberclass MathMLNode extends XMLNode 38890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 38990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function MathMLNode($id = NULL) 39090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 39190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber parent::XMLNode($id); 39290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 39390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 39490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function removeBrackets() 39590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($this->_name == 'mrow') { 39790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($c_node_0 = $this->getFirstChild()) { 39890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $c_node_0->isLeftBracket() ? $this->removeFirstChild() : 0; 39990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 40190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($c_node_0 = $this->getLastChild()) { 40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $c_node_0->isRightBracket() ? $this->removeLastChild() : 0; 40390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 40690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function isLeftBracket() 40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber switch ($this->_content) { 41090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case '{': 41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case '[': 41290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case '(': 41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return(TRUE); 41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return(FALSE); 41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function isRightBracket() 42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber switch ($this->_content) { 42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case '}': 42390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case ']': 42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case ')': 42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return(TRUE); 42690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return(FALSE); 42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberclass ASCIIMathPHP 43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{ 43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber var $_expr; 43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber var $_curr_expr; 43690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber var $_prev_expr; 43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber var $_symbol_arr; 43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber var $_node_arr; 43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber var $_node_cntr; 44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function ASCIIMathPHP($symbol_arr,$expr = NULL) 44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_symbol_arr = $symbol_arr; 44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (isset($expr)) { 44590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->setExpr($expr); 44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /** 45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Returns an empty node (containing a non-breaking space) 26-Apr-2006 45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Used when an expression is incomplete 45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * @return object 45590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * @access private 45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function emptyNode() 45990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 46090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_node = $this->createNode(); 46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_node->setName('mn'); 46290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_node->setContent('&#' . hexdec('200B') . ';'); 46390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $tmp_node; 46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 46590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 46690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function pushExpr($prefix) // 2005-06-11 wes 46790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 46890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_curr_expr = $prefix . $this->_curr_expr; 46990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 47090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 47190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function setExpr($expr) 47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 47390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_expr = $expr; 47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_curr_expr = $expr; 47590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_prev_expr = $expr; 47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 47790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_node_arr = array(); 47890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_node_cntr = 0; 47990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 48090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 48190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function genMathML($attr_arr = NULL) 48290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 48390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // <math> node 48490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0 = $this->createNode(); 48590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->setName('math'); 48690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->setNamepace('http://www.w3.org/1998/Math/MathML'); 48790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 48890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // <mstyle> node 48990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (isset($attr_arr)) { 49090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1 = $this->createNode(); 49190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->setName('mstyle'); 49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->setAttrArr($attr_arr); 49390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 49490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_arr = $this->parseExpr(); 49590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 49690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->addChildArr($node_arr); 49790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->addChild($node_1); 49890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 49990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_arr = $this->parseExpr(); 50090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->addChildArr($node_arr); 50190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 50290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 50390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return TRUE; 50490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 50590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 50690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* 50790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function mergeNodeArr(&$node_arr_0,&$node_arr_1) 50890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 50990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $key_arr_0 = array_keys($node_arr_0); 51090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $key_arr_1 = array_keys($node_arr_1); 51190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 51290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $num_key_0 = count($key_arr_0); 51390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $num_key_1 = count($key_arr_1); 51490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 51590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $merge_arr = array(); 51690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 51790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for ($i = 0;$i < $num_key_0;$i++) { 51890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $merge_arr[$key_arr_0[$i]] = $node_arr_0[$key_arr_0[$i]]; 51990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 52090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 52190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for ($j = 0;$j < $num_key_1;$i++) { 52290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $merge_arr[$key_arr_1[$i]] = $node_arr_1[$key_arr_1[$i]]; 52390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 52490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 52590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($merge_arr); 52690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 52790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 52890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 52990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber //Broken out of parseExpr Sept 7, 2006 David Lippman for 53090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber //ASCIIMathML 1.4.7 compatibility 53190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function parseIntExpr() 53290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 53390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $sym_0 = $this->getSymbol(); 53490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0 = $this->parseSmplExpr(); 53590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $sym = $this->getSymbol(); 53690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 53790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (isset($sym['infix']) && $sym['input'] != '/') { 53890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->chopExpr($sym['symlen']); 53990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1 = $this->parseSmplExpr(); 54090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 54190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($node_1 === FALSE) { //show box in place of missing argument 54290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1 = $this->emptyNode();//?? 54390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 54490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->removeBrackets(); 54590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 54690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 54790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // If 'sub' -- subscript 54890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($sym['input'] == '_') { 54990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 55090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $sym_1 = $this->getSymbol(); 55190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 55290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // If 'sup' -- superscript 55390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($sym_1['input'] == '^') { 55490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->chopExpr($sym_1['symlen']); 55590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2 = $this->parseSmplExpr(); 55690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->removeBrackets(); 55790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 55890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_3 = $this->createNode(); 55990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_3->setName(isset($sym_0['underover']) ? 'munderover' : 'msubsup'); 56090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_3->addChild($node_0); 56190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_3->addChild($node_1); 56290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_3->addChild($node_2); 56390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 56490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_4 = $this->createNode(); 56590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_4->setName('mrow'); 56690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_4->addChild($node_3); 56790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 56890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $node_4; 56990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 57090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2 = $this->createNode(); 57190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->setName(isset($sym_0['underover']) ? 'munder' : 'msub'); 57290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->addChild($node_0); 57390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->addChild($node_1); 57490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 57590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $node_2; 57690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 57790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 57890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2 = $this->createNode(); 57990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->setName($sym['tag']); 58090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->addChild($node_0); 58190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->addChild($node_1); 58290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 58390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($node_2); 58490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 58590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } elseif ($node_0 !== FALSE) { 58690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($node_0); 58790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 58890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $this->emptyNode(); 58990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 59090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 59190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 59290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 59390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function parseExpr() 59490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 59590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Child/Fragment array 59690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_arr = array(); 59790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 59890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Deal whole expressions like 'ax + by + c = 0' etc. 59990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber do { 60090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $sym_0 = $this->getSymbol(); 60190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0 = $this->parseIntExpr(); 60290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $sym = $this->getSymbol(); 60390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // var_dump($sym); 60490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 60590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (isset($sym['infix']) && $sym['input'] == '/') { 60690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->chopExpr($sym['symlen']); 60790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1 = $this->parseIntExpr(); 60890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 60990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($node_1 === FALSE) { //should show box in place of missing argument 61090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1 = $this->emptyNode(); 61190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber continue; 61290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 61390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 61490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->removeBrackets(); 61590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 61690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // If 'div' -- divide 61790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->removeBrackets(); 61890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2 = $this->createNode(); 61990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->setName($sym['tag']); 62090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->addChild($node_0); 62190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->addChild($node_1); 62290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_arr[$node_2->getId()] = $node_2; 62390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 62490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } elseif ($node_0 !== FALSE) { 62590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_arr[$node_0->getId()] = $node_0; 62690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 62790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } while (!isset($sym['right_bracket']) && $sym !== FALSE && $sym['output'] != ''); 62890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 62990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber //var_dump($sym); 63090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Possibly to deal with matrices 63190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (isset($sym['right_bracket'])) { 63290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_cnt = count($node_arr); 63390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $key_node_arr = array_keys($node_arr); 63490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 63590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($node_cnt > 1) { 63690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_5 = $node_arr[$key_node_arr[$node_cnt-1]]; 63790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_6 = $node_arr[$key_node_arr[$node_cnt-2]]; 63890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 63990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_5 = FALSE; 64090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_6 = FALSE; 64190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 64290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 64390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Dealing with matrices 64490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($node_5 !== FALSE && $node_6 !== FALSE && 64590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_cnt > 1 && 64690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_5->getName() == 'mrow' && 64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_6->getName() == 'mo' && 64890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_6->getContent() == ',') { 64990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 65090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Checking if Node 5 has a LastChild 65190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($node_7 = $node_5->getLastChild()) { 65290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_7_cntnt = $node_7->getContent(); 65390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 65490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_7_cntnt = FALSE; 65590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 65690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 65790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // If there is a right bracket 65890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($node_7 !== FALSE && ($node_7_cntnt == ']' || $node_7_cntnt == ')')) { 65990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 66090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Checking if Node 5 has a firstChild 66190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($node_8 = $node_5->getFirstChild()) { 66290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_8_cntnt = $node_8->getContent(); 66390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 66490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_8_cntnt = FALSE; 66590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 66690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 66790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // If there is a matching left bracket 66890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($node_8 !== FALSE && 66990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber (($node_8_cntnt == '(' && $node_7_cntnt == ')' && $sym['output'] != '}') || 67090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ($node_8_cntnt == '[' && $node_7_cntnt == ']'))) { 67190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 67290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $is_mtrx_flg = TRUE; 67390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $comma_pos_arr = array(); 67490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 67590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $i = 0; 67690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 67790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber while ($i < $node_cnt && $is_mtrx_flg) { 67890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_node = $node_arr[$key_node_arr[$i]]; 67990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 68090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if($tmp_node_first = $tmp_node->getFirstChild()) { 68190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tnfc = $tmp_node_first->getContent(); 68290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 68390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tnfc = FALSE; 68490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 68590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 68690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if($tmp_node_last = $tmp_node->getLastChild()) { 68790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tnlc = $tmp_node_last->getContent(); 68890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 68990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tnlc = FALSE; 69090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 69190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 69290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (isset($key_node_arr[$i+1])) { 69390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $next_tmp_node = $node_arr[$key_node_arr[$i+1]]; 69490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $ntnn = $next_tmp_node->getName(); 69590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $ntnc = $next_tmp_node->getContent(); 69690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 69790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $ntnn = FALSE; 69890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $ntnc = FALSE; 69990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 70090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 70190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Checking each node in node array for matrix criteria 70290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($is_mtrx_flg) { 70390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $is_mtrx_flg = $tmp_node->getName() == 'mrow' && 70490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber ($i == $node_cnt-1 || $ntnn == 'mo' && $ntnc == ',') && 70590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tnfc == $node_8_cntnt && $tnlc == $node_7_cntnt; 70690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 70790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 70890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($is_mtrx_flg) { 70990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for ($j = 0;$j < $tmp_node->getNumChild();$j++) { 71090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_c_node = $tmp_node->getChildByIdx($j); 71190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 71290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($tmp_c_node->getContent() == ',') { 71390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $comma_pos_arr[$i][] = $j; 71490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 71590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 71690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 71790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 71890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($is_mtrx_flg && $i > 1) { 71990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 72090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $cnt_cpan = isset($comma_pos_arr[$i]) ? count($comma_pos_arr[$i]) : NULL; 72190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $cnt_cpap = isset($comma_pos_arr[$i-2]) ? count($comma_pos_arr[$i-2]) : NULL; 72290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $is_mtrx_flg = $cnt_cpan == $cnt_cpap; 72390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 72490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 72590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $i += 2; 72690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 72790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 72890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // If the node passes the matrix tests 72990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($is_mtrx_flg) { 73090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tab_node_arr = array(); 73190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 73290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for ($i = 0;$i < $node_cnt;$i += 2) { 73390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_key_node_arr = array_keys($node_arr); 73490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!($tmp_node = $node_arr[$tmp_key_node_arr[0]])) { 73590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 73690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 73790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $num_child = $tmp_node->getNumChild(); 73890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $k = 0; 73990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 74090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_node->removeFirstChild(); 74190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 74290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $row_node_arr = array(); 74390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $row_frag_node_arr = array(); 74490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 74590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for ($j = 1;$j < ($num_child-1);$j++) { 74690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (isset($comma_pos_arr[$i][$k]) && 74790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $j == $comma_pos_arr[$i][$k]) { 74890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 74990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_node->removeFirstChild(); 75090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 75190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_c_node = $this->createNode(); 75290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_c_node->setName('mtd'); 75390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_c_node->addChildArr($row_frag_node_arr); 75490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $row_frag_node_arr = array(); 75590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 75690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $row_node_arr[$tmp_c_node->getId()] = $tmp_c_node; 75790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 75890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $k++; 75990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 76090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 76190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($tmp_c_node = $tmp_node->getFirstChild()) { 76290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $row_frag_node_arr[$tmp_c_node->getId()] = $tmp_c_node; 76390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_node->removeFirstChild(); 76490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 76590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 76690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 76790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 76890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_c_node = $this->createNode(); 76990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_c_node->setName('mtd'); 77090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_c_node->addChildArr($row_frag_node_arr); 77190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 77290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $row_node_arr[$tmp_c_node->getId()] = $tmp_c_node; 77390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 77490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (count($node_arr) > 2) { 77590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_key_node_arr = array_keys($node_arr); 77690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unset($node_arr[$tmp_key_node_arr[0]]); 77790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber unset($node_arr[$tmp_key_node_arr[1]]); 77890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 77990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 78090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_c_node = $this->createNode(); 78190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_c_node->setName('mtr'); 78290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_c_node->addChildArr($row_node_arr); 78390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 78490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tab_node_arr[$tmp_c_node->getId()] = $tmp_c_node; 78590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 78690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 78790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_c_node = $this->createNode(); 78890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_c_node->setName('mtable'); 78990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_c_node->addChildArr($tab_node_arr); 79090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 79190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (isset($sym['invisible'])) { 79290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_c_node->setAttr('columnalign','left'); 79390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 79490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 79590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $key_node_arr = array_keys($node_arr); 79690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tmp_c_node->setId($key_node_arr[0]); 79790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 79890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_arr[$tmp_c_node->getId()] = $tmp_c_node; 79990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 80090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 80190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 80290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 80390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 80490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->chopExpr($sym['symlen']); 80590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!isset($sym['invisible'])) { 80690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_7 = $this->createNode(); 80790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_7->setName('mo'); 80890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_7->setContent($sym['output']); 80990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_arr[$node_7->getId()] = $node_7; 81090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 81190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 81290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 81390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($node_arr); 81490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 81590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 81690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function parseSmplExpr() 81790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 81890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $sym = $this->getSymbol(); 81990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 82090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (!$sym || isset($sym['right_bracket'])) //return FALSE; 82190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $this->emptyNode(); 82290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 82390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->chopExpr($sym['symlen']); 82490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 82590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // 2005-06-11 wes: add definition type support 82690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if(isset($sym['definition'])) { 82790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->pushExpr($sym['output']); 82890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $sym = $this->getSymbol(); 82990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->chopExpr($sym['symlen']); 83090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 83190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 83290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (isset($sym['left_bracket'])) { 83390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_arr = $this->parseExpr(); 83490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 83590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (isset($sym['invisible'])) { 83690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0 = $this->createNode(); 83790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->setName('mrow'); 83890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->addChildArr($node_arr); 83990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 84090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($node_0); 84190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 84290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0 = $this->createNode(); 84390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->setName('mo'); 84490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->setContent($sym['output']); 84590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 84690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1 = $this->createNode(); 84790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->setName('mrow'); 84890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->addChild($node_0); 84990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->addChildArr($node_arr); 85090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 85190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($node_1); 85290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 85390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } elseif (isset($sym['unary'])) { 85490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 85590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($sym['input'] == 'sqrt') { 85690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0 = $this->parseSmplExpr(); 85790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->removeBrackets(); 85890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 85990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1 = $this->createNode(); 86090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->setName($sym['tag']); 86190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->addChild($node_0); 86290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 86390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($node_1); 86490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } elseif (isset($sym['func'])) { //added 2006-9-7 David Lippman 86590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $expr = ltrim($this->getCurrExpr()); 86690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $st = $expr{0}; 86790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0 = $this->parseSmplExpr(); 86890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber //$node_0->removeBrackets(); 86990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($st=='^' || $st == '_' || $st=='/' || $st=='|' || $st==',') { 87090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1 = $this->createNode(); 87190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->setName($sym['tag']); 87290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->setContent($sym['output']); 87390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->setCurrExpr($expr); 87490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($node_1); 87590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 87690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1 = $this->createNode(); 87790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->setName('mrow'); 87890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2 = $this->createNode(); 87990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->setName($sym['tag']); 88090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->setContent($sym['output']); 88190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->addChild($node_2); 88290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->addChild($node_0); 88390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($node_1); 88490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 88590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } elseif ($sym['input'] == 'text' || $sym['input'] == 'mbox' || $sym['input'] == '"') { 88690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $expr = ltrim($this->getCurrExpr()); 88790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($sym['input']=='"') { 88890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $end_brckt = '"'; 88990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $txt = substr($expr,0,strpos($expr,$end_brckt)); 89090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 89190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber switch($expr{0}) { 89290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case '(': 89390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $end_brckt = ')'; 89490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 89590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case '[': 89690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $end_brckt = ']'; 89790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 89890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber case '{': 89990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $end_brckt = '}'; 90090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 90190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber default: 90290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $end_brckt = chr(11); // A character that will never be matched. 90390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber break; 90490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 90590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $txt = substr($expr,1,strpos($expr,$end_brckt)-1); 90690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 90790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 90890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber //$txt = substr($expr,1,strpos($expr,$end_brckt)-1); 90990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $len = strlen($txt); 91090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 91190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0 = $this->createNode(); 91290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->setName('mrow'); 91390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 91490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($len > 0) { 91590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($txt{0} == " ") { 91690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1 = $this->createNode(); 91790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->setName('mspace'); 91890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->setAttr('width','1ex'); 91990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 92090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->addChild($node_1); 92190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 92290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 92390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_3 = $this->createNode(); 92490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_3->setName($sym['tag']); 92590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_3->setContent(trim($txt)); 92690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 92790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->addChild($node_3); 92890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 92990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($len > 1 && $txt{$len-1} == " ") { 93090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2 = $this->createNode(); 93190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->setName('mspace'); 93290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->setAttr('width','1ex'); 93390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 93490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->addChild($node_2); 93590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 93690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 93790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->chopExpr($len+2); 93890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 93990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($node_0); 94090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 94190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } elseif (isset($sym['acc'])) { 94290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0 = $this->parseSmplExpr(); 94390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->removeBrackets(); 94490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 94590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1 = $this->createNode(); 94690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->setName($sym['tag']); 94790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->addChild($node_0); 94890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 94990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2 = $this->createNode(); 95090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->setName('mo'); 95190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->setContent($sym['output']); 95290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 95390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->addChild($node_2); 95490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($node_1); 95590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 95690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Font change commands -- to complete 95790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 95890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } elseif (isset($sym['binary'])) { 95990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_arr = array(); 96090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 96190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0 = $this->parseSmplExpr(); 96290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->removeBrackets(); 96390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 96490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1 = $this->parseSmplExpr(); 96590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->removeBrackets(); 96690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 96790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /* 2005-06-05 wes: added stackrel */ 96890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($sym['input'] == 'root' || $sym['input'] == 'stackrel') { 96990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_arr[$node_1->getId()] = $node_1; 97090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_arr[$node_0->getId()] = $node_0; 97190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } elseif ($sym['input'] == 'frac') { 97290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_arr[$node_0->getId()] = $node_0; 97390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_arr[$node_1->getId()] = $node_1; 97490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 97590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 97690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2 = $this->createNode(); 97790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->setName($sym['tag']); 97890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->addChildArr($node_arr); 97990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 98090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($node_2); 98190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } elseif (isset($sym['infix'])) { 98290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0 = $this->createNode(); 98390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->setName('mo'); 98490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->setContent($sym['output']); 98590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 98690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($node_0); 98790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } elseif (isset($sym['space'])) { 98890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0 = $this->createNode(); 98990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->setName('mrow'); 99090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 99190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1 = $this->createNode(); 99290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->setName('mspace'); 99390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_1->setAttr('width',$sym['space']); 99490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 99590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2 = $this->createNode(); 99690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->setName($sym['tag']); 99790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_2->setContent($sym['output']); 99890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 99990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_3 = $this->createNode(); 100090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_3->setName('mspace'); 100190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_3->setAttr('width',$sym['space']); 100290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 100390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->addChild($node_1); 100490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->addChild($node_2); 100590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->addChild($node_3); 100690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 100790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($node_0); 100890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 100990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 101090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // A constant 101190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0 = $this->createNode(); 101290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->setName($sym['tag']); 101390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node_0->setContent($sym['output']); 101490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($node_0); 101590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 101690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 101790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Return an empty node 101890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $this->emptyNode(); 101990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 102090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 102190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getMathML() 102290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 102390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $root = $this->_node_arr[0]; 102490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($root->dumpXML()); 102590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 102690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 102790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getCurrExpr() 102890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 102990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($this->_curr_expr); 103090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 103190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 103290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function setCurrExpr($str) 103390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 103490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_curr_expr = $str; 103590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 103690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 103790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getExpr() 103890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 103990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($this->_expr); 104090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 104190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 104290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getPrevExpr() 104390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 104490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($this->_prev_expr); 104590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 104690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 104790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function createNode() 104890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 104990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $node = new MathMLNode($this->_node_cntr); 105090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // $node->setNamespaceAlias('m'); 105190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_node_arr[$this->_node_cntr] = $node; 105290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_node_cntr++; 105390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return($node); 105490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 105590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 105690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber /** 105790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * Gets the largest symbol in the expression (greedy). Changed from non-greedy 26-Apr-2006 105890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 105990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * @parameter boolean[optional] Chop original string? 106090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 106190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * @return mixed 106290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 106390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * @access private 106490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 106590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function getSymbol($chop_flg = FALSE) 106690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 106790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Implemented a reverse symbol matcher. 106890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Instead of going front to back, it goes back to front. Steven 26-Apr-2006 106990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $chr_cnt = strlen($this->_curr_expr); 107090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 107190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($chr_cnt == 0) return FALSE; 107290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 107390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber for ($i = $chr_cnt; $i > 0; $i--) { 107490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $sym_0 = substr($this->_curr_expr,0,$i); 107590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 107690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Reading string for numeric values 107790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if (is_numeric($sym_0)) { 107890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 107990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($chop_flg) $this->chopExpr($i); 108090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return array('input'=>$sym_0, 'tag'=>'mn', 'output'=>$sym_0, 'symlen'=>$i); 108190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 108290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } elseif (isset($this->_symbol_arr[$sym_0])) { 108390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 108490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($chop_flg) $this->chopExpr($i); 108590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $sym_arr = $this->_symbol_arr[$sym_0]; 108690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $sym_arr['symlen'] = $i; 108790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $sym_arr; 108890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 108990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 109090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 109190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Reading string for alphabetic constants and the minus sign 109290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $char = $this->_curr_expr{0}; 109390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $len_left = $chop_flg ? $this->chopExpr(1) : strlen($this->_curr_expr)-1; 109490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 109590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber // Deals with expressions of length 1 109690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($len_left == 0 && isset($this->_symbol_arr[$char])) { 109790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $sym_arr = $this->_symbol_arr[$char]; 109890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $sym_arr['symlen'] = 1; 109990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return $sym_arr; 110090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 110190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $tag = preg_match('/[a-z]/i',$char) ? 'mi' : 'mo'; 110290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return array('input'=>$char, 'tag'=>$tag, 'output'=>$char, 'symlen'=>1); 110390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 110490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 110590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 110690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber function chopExpr($strlen) 110790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber { 110890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_prev_expr = $this->_curr_expr; 110990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 111090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber if ($strlen == strlen($this->_curr_expr)) { 111190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_curr_expr = ''; 111290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return(0); 111390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } else { 111490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber $this->_curr_expr = ltrim(substr($this->_curr_expr,$strlen)); 111590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber return(strlen($this->_curr_expr)); 111690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 111790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber } 111890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 111990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber?>