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?>