summaryrefslogtreecommitdiff
path: root/examples/includes/ASCIIMathPHP-2.0
diff options
context:
space:
mode:
authorJohn Koleszar <jkoleszar@google.com>2010-05-18 11:58:33 -0400
committerJohn Koleszar <jkoleszar@google.com>2010-05-18 11:58:33 -0400
commit0ea50ce9cb4b65eee6afa1d041fe8beb5abda667 (patch)
tree1f3b9019f28bc56fd3156f96e5a9653a983ee61b /examples/includes/ASCIIMathPHP-2.0
downloadlibvpx-0ea50ce9cb4b65eee6afa1d041fe8beb5abda667.tar
libvpx-0ea50ce9cb4b65eee6afa1d041fe8beb5abda667.tar.gz
libvpx-0ea50ce9cb4b65eee6afa1d041fe8beb5abda667.tar.bz2
libvpx-0ea50ce9cb4b65eee6afa1d041fe8beb5abda667.zip
Initial WebM release
Diffstat (limited to 'examples/includes/ASCIIMathPHP-2.0')
-rw-r--r--examples/includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.cfg.php218
-rw-r--r--examples/includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.class.php1119
-rw-r--r--examples/includes/ASCIIMathPHP-2.0/htmlMathML.js86
3 files changed, 1423 insertions, 0 deletions
diff --git a/examples/includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.cfg.php b/examples/includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.cfg.php
new file mode 100644
index 000000000..06f7979d9
--- /dev/null
+++ b/examples/includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.cfg.php
@@ -0,0 +1,218 @@
+<?php
+
+$symbol_arr = array(
+
+// Greek symbols
+'alpha' => array( 'input'=>'alpha','tag'=>'mi', 'output'=>'&#' . hexdec('03B1') . ';'),
+'beta' => array( 'input'=>'beta','tag'=>'mi', 'output'=>'&#' . hexdec('03B2') . ';'),
+'chi' => array( 'input'=>'chi','tag'=>'mi', 'output'=>'&#' . hexdec('03C7') . ';'),
+'delta' => array( 'input'=>'delta','tag'=>'mi', 'output'=>'&#' . hexdec('03B4') . ';'),
+'Delta' => array( 'input'=>'Delta','tag'=>'mo', 'output'=>'&#' . hexdec('0394') . ';'),
+'epsi' => array( 'input'=>'epsi','tag'=>'mi', 'output'=>'&#' . hexdec('03B5') . ';'),
+'varepsilon' => array( 'input'=>'varepsilon','tag'=>'mi', 'output'=>'&#' . hexdec('025B') . ';'),
+'eta' => array( 'input'=>'eta','tag'=>'mi', 'output'=>'&#' . hexdec('03B7') . ';'),
+'gamma' => array( 'input'=>'gamma','tag'=>'mi', 'output'=>'&#' . hexdec('03B3') . ';'),
+'Gamma' => array( 'input'=>'Gamma','tag'=>'mi', 'output'=>'&#' . hexdec('0393') . ';'),
+'iota' => array( 'input'=>'iota','tag'=>'mi', 'output'=>'&#' . hexdec('03B9') . ';'),
+'kappa' => array( 'input'=>'kappa','tag'=>'mi', 'output'=>'&#' . hexdec('03BA') . ';'),
+'lambda' => array( 'input'=>'lambda','tag'=>'mi', 'output'=>'&#' . hexdec('03BB') . ';'),
+'Lambda' => array( 'input'=>'Lambda','tag'=>'mo', 'output'=>'&#' . hexdec('039B') . ';'),
+'mu' => array( 'input'=>'mu','tag'=>'mi', 'output'=>'&#' . hexdec('03BC') . ';'),
+'nu' => array( 'input'=>'nu','tag'=>'mi', 'output'=>'&#' . hexdec('03BD') . ';'),
+'omega' => array( 'input'=>'omega','tag'=>'mi', 'output'=>'&#' . hexdec('03C9') . ';'),
+'Omega' => array( 'input'=>'Omega','tag'=>'mo', 'output'=>'&#' . hexdec('03A9') . ';'),
+'phi' => array( 'input'=>'phi','tag'=>'mi', 'output'=>'&#' . hexdec('03C6') . ';'),
+'varphi' => array( 'input'=>'varphi','tag'=>'mi', 'output'=>'&#' . hexdec('03D5') . ';'),
+'Phi' => array( 'input'=>'Phi','tag'=>'mo', 'output'=>'&#' . hexdec('03A6') . ';'),
+'pi' => array( 'input'=>'pi','tag'=>'mi', 'output'=>'&#' . hexdec('03C0') . ';'),
+'Pi' => array( 'input'=>'Pi','tag'=>'mo', 'output'=>'&#' . hexdec('03A0') . ';'),
+'psi' => array( 'input'=>'psi','tag'=>'mi', 'output'=>'&#' . hexdec('03C8') . ';'),
+'rho' => array( 'input'=>'rho','tag'=>'mi', 'output'=>'&#' . hexdec('03C1') . ';'),
+'sigma' => array( 'input'=>'sigma','tag'=>'mi', 'output'=>'&#' . hexdec('03C3') . ';'),
+'Sigma' => array( 'input'=>'Sigma','tag'=>'mo', 'output'=>'&#' . hexdec('03A3') . ';'),
+'tau' => array( 'input'=>'tau','tag'=>'mi', 'output'=>'&#' . hexdec('03C4') . ';'),
+'theta' => array( 'input'=>'theta','tag'=>'mi', 'output'=>'&#' . hexdec('03B8') . ';'),
+'vartheta' => array( 'input'=>'vartheta','tag'=>'mi', 'output'=>'&#' . hexdec('03D1') . ';'),
+'Theta' => array( 'input'=>'Theta','tag'=>'mo', 'output'=>'&#' . hexdec('0398') . ';'),
+'upsilon' => array( 'input'=>'upsilon','tag'=>'mi', 'output'=>'&#' . hexdec('03C5') . ';'),
+'xi' => array( 'input'=>'xi','tag'=>'mi', 'output'=>'&#' . hexdec('03BE') . ';'),
+'Xi' => array( 'input'=>'alpha','tag'=>'mo', 'output'=>'&#' . hexdec('039E') . ';'),
+'zeta' => array( 'input'=>'zeta','tag'=>'mi', 'output'=>'&#' . hexdec('03B6') . ';'),
+
+// Binary operation symbols
+'*' => array( 'input'=>'*','tag'=>'mo', 'output'=>'&#' . hexdec('22C5') . ';'),
+'**' => array( 'input'=>'**','tag'=>'mo', 'output'=>'&#' . hexdec('22C6') . ';'),
+'//' => array( 'input'=>'//','tag'=>'mo', 'output'=>'/'),
+'\\\\' => array( 'input'=>'\\\\','tag'=>'mo', 'output'=>'\\'),
+'xx' => array( 'input'=>'xx','tag'=>'mo', 'output'=>'&#' . hexdec('00D7') . ';'),
+'-:' => array( 'input'=>'-:','tag'=>'mo', 'output'=>'&#' . hexdec('00F7') . ';'),
+'@' => array( 'input'=>'@','tag'=>'mo', 'output'=>'&#' . hexdec('2218') . ';'),
+'o+' => array( 'input'=>'o+','tag'=>'mo', 'output'=>'&#' . hexdec('2295') . ';'),
+'ox' => array( 'input'=>'ox','tag'=>'mo', 'output'=>'&#' . hexdec('2297') . ';'),
+'sum' => array( 'input'=>'sum','tag'=>'mo', 'output'=>'&#' . hexdec('2211') . ';', 'underover'=>TRUE),
+'prod' => array( 'input'=>'prod','tag'=>'mo', 'output'=>'&#' . hexdec('220F') . ';', 'underover'=>TRUE),
+'^^' => array( 'input'=>'^^','tag'=>'mo', 'output'=>'&#' . hexdec('2227') . ';'),
+'^^^' => array( 'input'=>'^^^','tag'=>'mo', 'output'=>'&#' . hexdec('22C0') . ';', 'underover'=>TRUE),
+'vv' => array( 'input'=>'vv','tag'=>'mo', 'output'=>'&#' . hexdec('2228') . ';'),
+'vvv' => array( 'input'=>'vvv','tag'=>'mo', 'output'=>'&#' . hexdec('22C1') . ';', 'underover'=>TRUE),
+'nn' => array( 'input'=>'nn','tag'=>'mo', 'output'=>'&#' . hexdec('2229') . ';'),
+'nnn' => array( 'input'=>'nnn','tag'=>'mo', 'output'=>'&#' . hexdec('22C5') . ';', 'underover'=>TRUE),
+'uu' => array( 'input'=>'uu','tag'=>'mo', 'output'=>'&#' . hexdec('222A') . ';'),
+'uuu' => array( 'input'=>'uuu','tag'=>'mo', 'output'=>'&#' . hexdec('22C3') . ';', 'underover'=>TRUE),
+
+// Binary relation symbols
+'!=' => array( 'input'=>'!=','tag'=>'mo', 'output'=>'&#' . hexdec('2260') . ';'),
+':=' => array( 'input'=>':=','tag'=>'mo', 'output'=>':=' ), /* 2005-06-05 wes */
+'<' => array( 'input'=>'<','tag'=>'mo', 'output'=>'&lt;'),
+'lt' => array( 'input'=>'lt','tag'=>'mo', 'output'=>'&lt;'), /* 2005-06-05 wes */
+'<=' => array( 'input'=>'<=','tag'=>'mo', 'output'=>'&#' . hexdec('2264') . ';'),
+'lt=' => array( 'input'=>'lt=','tag'=>'mo', 'output'=>'&#' . hexdec('2264') . ';'),
+'le' => array( 'input'=>'le','tag'=>'mo', 'output'=>'&#' . hexdec('2264') . ';'), /* 2005-06-05 wes */
+'>' => array( 'input'=>'>','tag'=>'mo', 'output'=>'&gt;'),
+'>=' => array( 'input'=>'>=','tag'=>'mo', 'output'=>'&#' . hexdec('2265') . ';'),
+'qeq' => array( 'input'=>'geq','tag'=>'mo', 'output'=>'&#' . hexdec('2265') . ';'),
+'-<' => array( 'input'=>'-<','tag'=>'mo', 'output'=>'&#' . hexdec('227A') . ';'),
+'-lt' => array( 'input'=>'-lt','tag'=>'mo', 'output'=>'&#' . hexdec('227A') . ';'),
+'>-' => array( 'input'=>'>-','tag'=>'mo', 'output'=>'&#' . hexdec('227B') . ';'),
+'in' => array( 'input'=>'in','tag'=>'mo', 'output'=>'&#' . hexdec('2208') . ';'),
+'!in' => array( 'input'=>'!in','tag'=>'mo', 'output'=>'&#' . hexdec('2209') . ';'),
+'sub' => array( 'input'=>'sub','tag'=>'mo', 'output'=>'&#' . hexdec('2282') . ';'),
+'sup' => array( 'input'=>'sup','tag'=>'mo', 'output'=>'&#' . hexdec('2283') . ';'),
+'sube' => array( 'input'=>'sube','tag'=>'mo', 'output'=>'&#' . hexdec('2286') . ';'),
+'supe' => array( 'input'=>'supe','tag'=>'mo', 'output'=>'&#' . hexdec('2287') . ';'),
+'-=' => array( 'input'=>'-=','tag'=>'mo', 'output'=>'&#' . hexdec('2261') . ';'),
+'~=' => array( 'input'=>'~=','tag'=>'mo', 'output'=>'&#' . hexdec('2245') . ';'),
+'~~' => array( 'input'=>'~~','tag'=>'mo', 'output'=>'&#' . hexdec('2248') . ';'),
+'prop' => array( 'input'=>'prop','tag'=>'mo', 'output'=>'&#' . hexdec('221D') . ';'),
+
+// Logical symbols
+'and' => array( 'input'=>'and','tag'=>'mtext', 'output'=>'and', 'space'=>'1ex'),
+'or' => array( 'input'=>'or','tag'=>'mtext', 'output'=>'or', 'space'=>'1ex'),
+'not' => array( 'input'=>'not','tag'=>'mo', 'output'=>'&#' . hexdec('00AC') . ';'),
+'=>' => array( 'input'=>'=>','tag'=>'mo', 'output'=>'&#' . hexdec('21D2') . ';'),
+'if' => array( 'input'=>'if','tag'=>'mo', 'output'=>'if', 'space'=>'1ex'),
+'iff' => array( 'input'=>'iff','tag'=>'mo', 'output'=>'&#' . hexdec('21D4') . ';'),
+'<=>' => array( 'input'=>'iff','tag'=>'mo', 'output'=>'&#' . hexdec('21D4') . ';'), /* 2005-06-07 wes */
+'AA' => array( 'input'=>'AA','tag'=>'mo', 'output'=>'&#' . hexdec('2200') . ';'),
+'EE' => array( 'input'=>'EE','tag'=>'mo', 'output'=>'&#' . hexdec('2203') . ';'),
+'_|_' => array( 'input'=>'_|_','tag'=>'mo', 'output'=>'&#' . hexdec('22A5') . ';'),
+'TT' => array( 'input'=>'TT','tag'=>'mo', 'output'=>'&#' . hexdec('22A4') . ';'),
+'|-' => array( 'input'=>'|-','tag'=>'mo', 'output'=>'&#' . hexdec('22A2') . ';'),
+'|=' => array( 'input'=>'|=','tag'=>'mo', 'output'=>'&#' . hexdec('22A8') . ';'),
+
+// Miscellaneous symbols
+'ang' => array('input'=>'ang','tag'=>'mo','output'=>'&#' . hexdec('2220') . ';'),
+'deg' => array('input'=>'deg','tag'=>'mo','output'=>'&#' . hexdec('00B0') . ';'),
+'int' => array( 'input'=>'int','tag'=>'mo', 'output'=>'&#' . hexdec('222B') . ';'),
+'dx' => array( 'input'=>'dx','tag'=>'mi', 'output'=>'{:d x:}', 'definition'=>TRUE), /* 2005-06-11 wes */
+'dy' => array( 'input'=>'dy','tag'=>'mi', 'output'=>'{:d y:}', 'definition'=>TRUE), /* 2005-06-11 wes */
+'dz' => array( 'input'=>'dz','tag'=>'mi', 'output'=>'{:d z:}', 'definition'=>TRUE), /* 2005-06-11 wes */
+'dt' => array( 'input'=>'dt','tag'=>'mi', 'output'=>'{:d t:}', 'definition'=>TRUE), /* 2005-06-11 wes */
+'oint' => array( 'input'=>'oint','tag'=>'mo', 'output'=>'&#' . hexdec('222E') . ';'),
+'del' => array( 'input'=>'del','tag'=>'mo', 'output'=>'&#' . hexdec('2202') . ';'),
+'grad' => array( 'input'=>'grad','tag'=>'mo', 'output'=>'&#' . hexdec('2207') . ';'),
+'+-' => array( 'input'=>'+-','tag'=>'mo', 'output'=>'&#' . hexdec('00B1') . ';'),
+'O/' => array( 'input'=>'0/','tag'=>'mo', 'output'=>'&#' . hexdec('2205') . ';'),
+'oo' => array( 'input'=>'oo','tag'=>'mo', 'output'=>'&#' . hexdec('221E') . ';'),
+'aleph' => array( 'input'=>'aleph','tag'=>'mo', 'output'=>'&#' . hexdec('2135') . ';'),
+'...' => array( 'input'=>'int','tag'=>'mo', 'output'=>'...'),
+'~' => array( 'input'=>'!~','tag'=>'mo', 'output'=>'&#' . hexdec('0020') . ';'),
+'\\ ' => array( 'input'=>'~','tag'=>'mo', 'output'=>'&#' . hexdec('00A0') . ';'),
+'quad' => array( 'input'=>'quad','tag'=>'mo', 'output'=>'&#' . hexdec('00A0') . ';&#' . hexdec('00A0') . ';'),
+'qquad' => array( 'input'=>'qquad','tag'=>'mo', 'output'=> '&#' . hexdec('00A0') . ';&#' . hexdec('00A0') . ';&#' . hexdec('00A0') . ';'),
+'cdots' => array( 'input'=>'cdots','tag'=>'mo', 'output'=>'&#' . hexdec('22EF') . ';'),
+'vdots' => array( 'input'=>'vdots','tag'=>'mo', 'output'=>'&#' . hexdec('22EE') . ';'), /* 2005-06-11 wes */
+'ddots' => array( 'input'=>'ddots','tag'=>'mo', 'output'=>'&#' . hexdec('22F1') . ';'), /* 2005-06-11 wes */
+'diamond' => array( 'input'=>'diamond','tag'=>'mo', 'output'=>'&#' . hexdec('22C4') . ';'),
+'square' => array( 'input'=>'square','tag'=>'mo', 'output'=>'&#' . hexdec('25A1') . ';'),
+'|_' => array( 'input'=>'|_','tag'=>'mo', 'output'=>'&#' . hexdec('230A') . ';'),
+'_|' => array( 'input'=>'_|','tag'=>'mo', 'output'=>'&#' . hexdec('230B') . ';'),
+'|~' => array( 'input'=>'|~','tag'=>'mo', 'output'=>'&#' . hexdec('2308') . ';'),
+'~|' => array( 'input'=>'~|','tag'=>'mo', 'output'=>'&#' . hexdec('2309') . ';'),
+'CC' => array( 'input'=>'CC','tag'=>'mo', 'output'=>'&#' . hexdec('2102') . ';'),
+'NN' => array( 'input'=>'NN','tag'=>'mo', 'output'=>'&#' . hexdec('2115') . ';'),
+'QQ' => array( 'input'=>'QQ','tag'=>'mo', 'output'=>'&#' . hexdec('211A') . ';'),
+'RR' => array( 'input'=>'RR','tag'=>'mo', 'output'=>'&#' . hexdec('211D') . ';'),
+'ZZ' => array( 'input'=>'ZZ','tag'=>'mo', 'output'=>'&#' . hexdec('2124') . ';'),
+
+// Standard functions
+'lim' => array( 'input'=>'lim','tag'=>'mo', 'output'=>'lim', 'underover'=>TRUE),
+'Lim' => array( 'input'=>'Lim','tag'=>'mo', 'output'=>'Lim', 'underover'=>TRUE), /* 2005-06-11 wes */
+'sin' => array( 'input'=>'sin','tag'=>'mo', 'output'=>'sin', 'unary'=>TRUE, 'func'=>TRUE),
+'cos' => array( 'input'=>'cos', 'tag'=>'mo', 'output'=>'cos', 'unary'=>TRUE, 'func'=>TRUE),
+'tan' => array( 'input'=>'tan', 'tag'=>'mo', 'output'=>'tan', 'unary'=>TRUE, 'func'=>TRUE),
+'arcsin' => array( 'input'=>'arcsin','tag'=>'mo', 'output'=>'arcsin', 'unary'=>TRUE, 'func'=>TRUE), //2006-9-7 DL
+'arccos' => array( 'input'=>'arccos', 'tag'=>'mo', 'output'=>'arccos', 'unary'=>TRUE, 'func'=>TRUE), //2006-9-7 DL
+'arctan' => array( 'input'=>'arctan', 'tag'=>'mo', 'output'=>'arctan', 'unary'=>TRUE, 'func'=>TRUE), //2006-9-7 DL
+'sinh' => array( 'input'=>'sinh','tag'=>'mo', 'output'=>'sinh', 'unary'=>TRUE, 'func'=>TRUE),
+'cosh' => array( 'input'=>'cosh', 'tag'=>'mo', 'output'=>'cosh', 'unary'=>TRUE, 'func'=>TRUE),
+'tanh' => array( 'input'=>'tanh', 'tag'=>'mo', 'output'=>'tanh', 'unary'=>TRUE, 'func'=>TRUE),
+'cot' => array( 'input'=>'cot','tag'=>'mo', 'output'=>'cot', 'unary'=>TRUE, 'func'=>TRUE),
+'sec' => array( 'input'=>'sec', 'tag'=>'mo', 'output'=>'sec', 'unary'=>TRUE, 'func'=>TRUE),
+'csc' => array( 'input'=>'csc', 'tag'=>'mo', 'output'=>'csc', 'unary'=>TRUE, 'func'=>TRUE),
+'coth' => array( 'input'=>'coth','tag'=>'mo', 'output'=>'coth', 'unary'=>TRUE, 'func'=>TRUE),
+'sech' => array( 'input'=>'sech', 'tag'=>'mo', 'output'=>'sech', 'unary'=>TRUE, 'func'=>TRUE),
+'csch' => array( 'input'=>'csch', 'tag'=>'mo', 'output'=>'csch', 'unary'=>TRUE, 'func'=>TRUE),
+'log' => array( 'input'=>'log', 'tag'=>'mo', 'output'=>'log', 'unary'=>TRUE, 'func'=>TRUE),
+'ln' => array( 'input'=>'ln', 'tag'=>'mo', 'output'=>'ln', 'unary'=>TRUE, 'func'=>TRUE),
+'det' => array( 'input'=>'det', 'tag'=>'mo', 'output'=>'det', 'unary'=>TRUE, 'func'=>TRUE),
+'dim' => array( 'input'=>'dim', 'tag'=>'mo', 'output'=>'dim'),
+'mod' => array( 'input'=>'mod', 'tag'=>'mo', 'output'=>'mod'),
+'gcd' => array( 'input'=>'gcd', 'tag'=>'mo', 'output'=>'gcd', 'unary'=>TRUE, 'func'=>TRUE),
+'lcm' => array( 'input'=>'lcm', 'tag'=>'mo', 'output'=>'lcm', 'unary'=>TRUE, 'func'=>TRUE),
+'lub' => array( 'input'=>'lub', 'tag'=>'mo', 'output'=>'lub'), /* 2005-06-11 wes */
+'glb' => array( 'input'=>'glb', 'tag'=>'mo', 'output'=>'glb'), /* 2005-06-11 wes */
+'min' => array( 'input'=>'min', 'tag'=>'mo', 'output'=>'min', 'underover'=>TRUE), /* 2005-06-11 wes */
+'max' => array( 'input'=>'max', 'tag'=>'mo', 'output'=>'max', 'underover'=>TRUE), /* 2005-06-11 wes */
+'f' => array( 'input'=>'f','tag'=>'mi', 'output'=>'f', 'unary'=>TRUE, 'func'=>TRUE), //2006-9-7 DL
+'g' => array( 'input'=>'g', 'tag'=>'mi', 'output'=>'g', 'unary'=>TRUE, 'func'=>TRUE), //2006-9-7 DL
+
+// Arrows
+'uarr' => array( 'input'=>'uarr', 'tag'=>'mo', 'output'=>'&#' . hexdec('2191') . ';'),
+'darr' => array( 'input'=>'darr', 'tag'=>'mo', 'output'=>'&#' . hexdec('2193') . ';'),
+'rarr' => array( 'input'=>'rarr', 'tag'=>'mo', 'output'=>'&#' . hexdec('2192') . ';'),
+'->' => array( 'input'=>'->', 'tag'=>'mo', 'output'=>'&#' . hexdec('2192') . ';'),
+'|->' => array( 'input'=>'|->', 'tag'=>'mo', 'output'=>'&#' . hexdec('21A6') . ';'), /* 2005-06-11 wes */
+'larr' => array( 'input'=>'larr', 'tag'=>'mo', 'output'=>'&#' . hexdec('2190') . ';'),
+'harr' => array( 'input'=>'harr', 'tag'=>'mo', 'output'=>'&#' . hexdec('2194') . ';'),
+'rArr' => array( 'input'=>'rArr', 'tag'=>'mo', 'output'=>'&#' . hexdec('21D2') . ';'),
+'lArr' => array( 'input'=>'lArr', 'tag'=>'mo', 'output'=>'&#' . hexdec('21D0') . ';'),
+'hArr' => array( 'input'=>'hArr', 'tag'=>'mo', 'output'=>'&#' . hexdec('21D4') . ';'),
+
+// Commands with argument
+'sqrt' => array( 'input'=>'sqrt', 'tag'=>'msqrt', 'output'=>'sqrt', 'unary'=>TRUE ),
+'root' => array( 'input'=>'root', 'tag'=>'mroot', 'output'=>'root', 'binary'=>TRUE ),
+'frac' => array( 'input'=>'frac', 'tag'=>'mfrac', 'output'=>'/', 'binary'=>TRUE),
+'/' => array( 'input'=>'/', 'tag'=>'mfrac', 'output'=>'/', 'infix'=>TRUE),
+'_' => array( 'input'=>'_', 'tag'=>'msub', 'output'=>'_', 'infix'=>TRUE),
+'^' => array( 'input'=>'^', 'tag'=>'msup', 'output'=>'^', 'infix'=>TRUE),
+'hat' => array( 'input'=>'hat', 'tag'=>'mover', 'output'=>'&#' . hexdec('005E') . ';', 'unary'=>TRUE, 'acc'=>TRUE),
+'bar' => array( 'input'=>'bar', 'tag'=>'mover', 'output'=>'&#' . hexdec('00AF') . ';', 'unary'=>TRUE, 'acc'=>TRUE),
+'vec' => array( 'input'=>'vec', 'tag'=>'mover', 'output'=>'&#' . hexdec('2192') . ';', 'unary'=>TRUE, 'acc'=>TRUE),
+'dot' => array( 'input'=>'dot', 'tag'=>'mover', 'output'=>'.', 'unary'=>TRUE, 'acc'=>TRUE),
+'ddot' => array( 'input'=>'ddot', 'tag'=>'mover', 'output'=>'..', 'unary'=>TRUE, 'acc'=>TRUE),
+'ul' => array( 'input'=>'ul', 'tag'=>'munder', 'output'=>'&#' . hexdec('0332') . ';', 'unary'=>TRUE, 'acc'=>TRUE),
+'avec' => array( 'input'=>'avec', 'tag'=>'munder', 'output'=>'~', 'unary'=>TRUE, 'acc'=>TRUE),
+'text' => array( 'input'=>'text', 'tag'=>'mtext', 'output'=>'text', 'unary'=>TRUE),
+'mbox' => array( 'input'=>'mbox', 'tag'=>'mtext', 'output'=>'mbox', 'unary'=>TRUE),
+'"' => array( 'input'=>'"', 'tag'=>'mtext','output'=>'mbox', 'unary'=>TRUE),
+
+/* 2005-06-05 wes: added stackrel */
+'stackrel' => array( 'input'=>'stackrel', 'tag'=>'mover', 'output'=>'stackrel', 'binary'=>TRUE),
+
+// Grouping brackets
+'(' => array( 'input'=>'(', 'tag'=>'mo', 'output'=>'(', 'left_bracket'=>TRUE),
+')' => array( 'input'=>')', 'tag'=>'mo', 'output'=>')', 'right_bracket'=>TRUE),
+'[' => array( 'input'=>'[', 'tag'=>'mo', 'output'=>'[', 'left_bracket'=>TRUE),
+']' => array( 'input'=>']', 'tag'=>'mo', 'output'=>']', 'right_bracket'=>TRUE),
+'{' => array( 'input'=>'{', 'tag'=>'mo', 'output'=>'{', 'left_bracket'=>TRUE),
+'}' => array( 'input'=>'}', 'tag'=>'mo', 'output'=>'}', 'right_bracket'=>TRUE),
+'(:' => array( 'input'=>'(:', 'tag'=>'mo', 'output'=>'&#' . hexdec('2329') . ';', 'left_bracket'=>TRUE),
+':)' => array( 'input'=>':)', 'tag'=>'mo', 'output'=>'&#' . hexdec('232A') . ';', 'right_bracket'=>TRUE),
+'{:' => array( 'input'=>'{:', 'tag'=>'mo', 'output'=>'{:', 'left_bracket'=>TRUE, 'invisible'=>TRUE),
+':}' => array( 'input'=>':}', 'tag'=>'mo', 'output'=>':}', 'right_bracket'=>TRUE ,'invisible'=>TRUE),
+'<<' => array( 'input'=>'<<', 'tag'=>'mo', 'output'=>'&#' . hexdec('2329') . ';', 'left_bracket'=>TRUE), // 2005-06-07 wes
+'>>' => array( 'input'=>'>>', 'tag'=>'mo', 'output'=>'&#' . hexdec('232A') . ';', 'right_bracket'=>TRUE) // 2005-06-07 wes
+);
+
+?> \ No newline at end of file
diff --git a/examples/includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.class.php b/examples/includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.class.php
new file mode 100644
index 000000000..5fb10600c
--- /dev/null
+++ b/examples/includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.class.php
@@ -0,0 +1,1119 @@
+<?php
+
+/****
+ * ASCIIMathPHP and associated classes:
+ * -- XMLNode
+ * -- MathMLNode extends XMLNode
+ *
+ * These classes are a PHP port of ASCIIMath
+ * Version 1.3 Feb 19 2004, (c) Peter Jipsen http://www.chapman.edu/~jipsen
+ *
+ * ASCIIMathPHP Version 1.11, 26 April 2006, (c) Kee-Lin Steven Chan (kc56@cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License (at http://www.gnu.org/copyleft/gpl.html)
+ * for more details.
+ *
+ * ChangeLog
+ *
+ * Ver 2.0
+ * -- PHP5 only version of ASCIIMathPHP
+ *
+ * Ver 1.12.1
+ * -- Included the missing setCurrExpr() method
+ *
+ * Ver 1.12
+ * -- Added changes that David Lippman <DLippman@pierce.ctc.edu> made to bring ASCIIMathPHP up to
+ * ASCIIMath 1.4.7 functionality.
+ * -- Added parseIntExpr, for intermediate expression parsing rule, allowing x^2/x^3 to render as (x^2)/(x^3)
+ * -- Added quotes as another way of designating text; "hello" is equivalent to text(hello)
+ * -- Added FUNC designator to allow sin, cos, etc to act as functions, so sin(x)/x renders as {sin(x)}/x
+ *
+ * Ver 1.11
+ * -- Fixed bug that stopped script execution for incomplete expressions
+ * -- Changed the algorithm for parsing expressions so that it matches the longest string possible (greedy)
+ *
+ * Ver 1.10
+ * -- Added definition support
+ * -- Added stackrel support
+ * -- Added a bunch of different symbols etc. >>, << and definitions like dx, dy, dz etc.
+ *
+ * Ver 1.02
+ * -- Fixed bug with mbox and text
+ * -- Fixed spacing bug with mbox and text
+ *
+ * Ver 1.01
+ * -- Fixed Bug that did not parse symbols greater than a single character
+ * correctly when appearing at end of expression.
+ *
+ ***/
+
+class XMLNode
+{
+ // Private variables
+ var $_id;
+ var $_name;
+ var $_content;
+ var $_mt_elem_flg;
+ var $_attr_arr;
+ var $_child_arr;
+ var $_nmspc;
+ var $_nmspc_alias;
+ var $_parent_id;
+ var $_parent_node;
+
+ function XMLNode($id = NULL)
+ {
+ $this->_id = isset($id) ? $id : md5(uniqid(rand(),1));
+ $this->_name = '';
+ $this->_content = '';
+ $this->_mt_elem_flg = FALSE;
+ $this->_attr_arr = array();
+ $this->_child_arr = array();
+ $this->_nmspc = '';
+ $this->_nmspc_alias = '';
+ $this->_parent_id = FALSE;
+ $this->_parent_node = NULL;
+ }
+
+ function addChild(&$node)
+ {
+ $this->_child_arr[$node->getId()] = $node;
+ $node->setParentId($this->_id);
+ $node->setParentNode($this);
+ }
+
+ function addChildArr(&$node_arr)
+ {
+ $key_arr = array_keys($node_arr);
+ $num_key = count($key_arr);
+
+ for ($i = 0; $i < $num_key; $i++) {
+ $node = $node_arr[$key_arr[$i]];
+ $this->addChild($node);
+ }
+ }
+
+ function insertChildBefore($idx,&$node)
+ {
+ $key_arr = array_keys($this->_child_arr);
+ $num_key = count($key_arr);
+ $tmp_arr = arry();
+
+ for ($i = 0;$i < $num_key;$i++) {
+ if ($i == $idx) {
+ $tmp_arr[$node->getId()] = $node;
+ }
+ $tmp_arr[$key_arr[$i]] = $this->_child_arr[$key_arr[$i]];
+ }
+ $this->_child_arr = $tmp_arr;
+ }
+
+ function insertChildAfter($idx,&$node)
+ {
+ $key_arr = array_keys($this->_child_arr);
+ $num_key = count($key_arr);
+ $tmp_arr = arry();
+
+ for ($i = 0;$i < $num_key;$i++) {
+ $tmp_arr[$key_arr[$i]] = $this->_child_arr[$key_arr[$i]];
+ if ($i == $idx) {
+ $tmp_arr[$node->getId()] = $node;
+ }
+ }
+ $this->_child_arr = $tmp_arr;
+ }
+
+ function setId($id)
+ {
+ $this->_id = $id;
+ }
+
+ function setName($name)
+ {
+ $this->_name = $name;
+ }
+
+ function setNamepace($nmspc)
+ {
+ $this->_nmspc = $nmspc;
+ }
+
+ function setNamespaceAlias($nmspc_alias)
+ {
+ $this->_nmspc_alias = $nmspc_alias;
+ }
+
+ function setContent($content)
+ {
+ $this->_content = $content;
+ }
+
+ function setEmptyElem($mt_elem_flg)
+ {
+ $this->_mt_elem_flg = $mt_elem_flg;
+ }
+
+ function setAttr($attr_nm,$attr_val)
+ {
+ $this->_attr_arr[$attr_nm] = $attr_val;
+ }
+
+ function setAttrArr($attr_arr)
+ {
+ $this->_attr_arr = $attr_arr;
+ }
+
+ function setParentId($id)
+ {
+ $this->_parent_id = $id;
+ }
+
+ function setParentNode(&$node)
+ {
+ $this->_parent_node = $node;
+ }
+
+ function getId()
+ {
+ return($this->_id);
+ }
+
+ function getName()
+ {
+ return($this->_name);
+ }
+
+ function getNamespace()
+ {
+ return($this->_nmspc);
+ }
+
+ function getNamespaceAlias()
+ {
+ return($this->_nmspc_alias);
+ }
+
+ function getContent()
+ {
+ return($this->_content);
+ }
+
+ function getAttr($attr_nm)
+ {
+ if (isset($this->_attr_arr[$attr_nm])) {
+ return($this->_attr_arr[$attr_nm]);
+ } else {
+ return(NULL);
+ }
+ }
+
+ function getAttrArr()
+ {
+ return($this->_attr_arr);
+ }
+
+ function getParentId()
+ {
+ return($this->parent_id);
+ }
+
+ function getParentNode()
+ {
+ return($this->_parent_node);
+ }
+
+ function getChild($id)
+ {
+ if (isset($this->_child_arr[$id])) {
+ return($this->_child_arr[$id]);
+ } else {
+ return(FALSE);
+ }
+ }
+
+ function getFirstChild()
+ {
+ $id_arr = array_keys($this->_child_arr);
+ $num_child = count($id_arr);
+
+ if ($num_child > 0) {
+ return($this->_child_arr[$id_arr[0]]);
+ } else {
+ return(FALSE);
+ }
+ }
+
+ function getLastChild()
+ {
+ $id_arr = array_keys($this->_child_arr);
+ $num_child = count($id_arr);
+
+ if ($num_child > 0) {
+ return($this->_child_arr[$id_arr[$num_child - 1]]);
+ } else {
+ return(FALSE);
+ }
+ }
+
+ function getChildByIdx($idx)
+ {
+ $id_arr = array_keys($this->_child_arr);
+
+ if (isset($this->_child_arr[$id_arr[$idx]])) {
+ return($this->_child_arr[$id_arr[$idx]]);
+ } else {
+ return(FALSE);
+ }
+ }
+
+ function getNumChild()
+ {
+ return(count($this->_child_arr));
+ }
+
+ function removeChild($id)
+ {
+ unset($this->_child_arr[$id]);
+ }
+
+ function removeChildByIdx($idx)
+ {
+ $key_arr = array_keys($this->_child_arr);
+ unset($this->_child_arr[$key_arr[$idx]]);
+ }
+
+ function removeFirstChild()
+ {
+ $key_arr = array_keys($this->_child_arr);
+ unset($this->_child_arr[$key_arr[0]]);
+ }
+
+ function removeLastChild()
+ {
+ $key_arr = array_keys($this->_child_arr);
+ unset($this->_child_arr[$key_arr[count($key_arr)-1]]);
+ }
+
+ function dumpXML($indent_str = "\t")
+ {
+ $attr_txt = $this->_dumpAttr();
+ $name = $this->_dumpName();
+ $xmlns = $this->_dumpXmlns();
+ $lvl = $this->_getCurrentLevel();
+ $indent = str_pad('',$lvl,$indent_str);
+
+ if ($this->_mt_elem_flg) {
+ $tag = "$indent<$name$xmlns$attr_txt />";
+ return($tag);
+ } else {
+ $key_arr = array_keys($this->_child_arr);
+ $num_child = count($key_arr);
+
+ $tag = "$indent<$name$xmlns$attr_txt>$this->_content";
+
+ for ($i = 0;$i < $num_child;$i++) {
+ $node = $this->_child_arr[$key_arr[$i]];
+
+ $child_txt = $node->dumpXML($indent_str);
+ $tag .= "\n$child_txt";
+ }
+
+ $tag .= ($num_child > 0 ? "\n$indent</$name>" : "</$name>");
+ return($tag);
+ }
+ }
+
+ function _dumpAttr()
+ {
+ $id_arr = array_keys($this->_attr_arr);
+ $id_arr_cnt = count($id_arr);
+ $attr_txt = '';
+
+ for($i = 0;$i < $id_arr_cnt;$i++) {
+ $key = $id_arr[$i];
+ $attr_txt .= " $key=\"{$this->_attr_arr[$key]}\"";
+ }
+
+ return($attr_txt);
+ }
+
+ function _dumpName()
+ {
+ $alias = $this->getNamespaceAlias();
+ if ($alias == '') {
+ return($this->getName());
+ } else {
+ return("$alias:" . $this->getName());
+ }
+ }
+
+ function _dumpXmlns()
+ {
+ $nmspc = $this->getNamespace();
+ $alias = $this->getNamespaceAlias();
+
+ if ($nmspc != '') {
+ if ($alias == '') {
+ return(" xmlns=\"" . $nmspc . "\"");
+ } else {
+ return(" xmlns:$alias=\"" . $nmspc . "\"");
+ }
+ } else {
+ return('');
+ }
+ }
+
+ function _getCurrentLevel()
+ {
+ if ($this->_parent_id === FALSE) {
+ return(0);
+ } else {
+ $node = $this->getParentNode();
+ $lvl = $node->_getCurrentLevel();
+ $lvl++;
+ return($lvl);
+ }
+ }
+}
+
+class MathMLNode extends XMLNode
+{
+ function MathMLNode($id = NULL)
+ {
+ parent::XMLNode($id);
+ }
+
+ function removeBrackets()
+ {
+ if ($this->_name == 'mrow') {
+ if ($c_node_0 = $this->getFirstChild()) {
+ $c_node_0->isLeftBracket() ? $this->removeFirstChild() : 0;
+ }
+
+ if ($c_node_0 = $this->getLastChild()) {
+ $c_node_0->isRightBracket() ? $this->removeLastChild() : 0;
+ }
+ }
+ }
+
+ function isLeftBracket()
+ {
+ switch ($this->_content) {
+ case '{':
+ case '[':
+ case '(':
+ return(TRUE);
+ break;
+ }
+ return(FALSE);
+ }
+
+ function isRightBracket()
+ {
+ switch ($this->_content) {
+ case '}':
+ case ']':
+ case ')':
+ return(TRUE);
+ break;
+ }
+ return(FALSE);
+ }
+}
+
+class ASCIIMathPHP
+{
+ var $_expr;
+ var $_curr_expr;
+ var $_prev_expr;
+ var $_symbol_arr;
+ var $_node_arr;
+ var $_node_cntr;
+
+ function ASCIIMathPHP($symbol_arr,$expr = NULL)
+ {
+ $this->_symbol_arr = $symbol_arr;
+ if (isset($expr)) {
+ $this->setExpr($expr);
+ }
+ }
+
+ /**
+ * Returns an empty node (containing a non-breaking space) 26-Apr-2006
+ *
+ * Used when an expression is incomplete
+ *
+ * @return object
+ *
+ * @access private
+ */
+ function emptyNode()
+ {
+ $tmp_node = $this->createNode();
+ $tmp_node->setName('mn');
+ $tmp_node->setContent('&#' . hexdec('200B') . ';');
+ return $tmp_node;
+ }
+
+ function pushExpr($prefix) // 2005-06-11 wes
+ {
+ $this->_curr_expr = $prefix . $this->_curr_expr;
+ }
+
+ function setExpr($expr)
+ {
+ $this->_expr = $expr;
+ $this->_curr_expr = $expr;
+ $this->_prev_expr = $expr;
+
+ $this->_node_arr = array();
+ $this->_node_cntr = 0;
+ }
+
+ function genMathML($attr_arr = NULL)
+ {
+ // <math> node
+ $node_0 = $this->createNode();
+ $node_0->setName('math');
+ $node_0->setNamepace('http://www.w3.org/1998/Math/MathML');
+
+ // <mstyle> node
+ if (isset($attr_arr)) {
+ $node_1 = $this->createNode();
+ $node_1->setName('mstyle');
+ $node_1->setAttrArr($attr_arr);
+
+ $node_arr = $this->parseExpr();
+
+ $node_1->addChildArr($node_arr);
+ $node_0->addChild($node_1);
+ } else {
+ $node_arr = $this->parseExpr();
+ $node_0->addChildArr($node_arr);
+ }
+
+ return TRUE;
+ }
+
+ /*
+ function mergeNodeArr(&$node_arr_0,&$node_arr_1)
+ {
+ $key_arr_0 = array_keys($node_arr_0);
+ $key_arr_1 = array_keys($node_arr_1);
+
+ $num_key_0 = count($key_arr_0);
+ $num_key_1 = count($key_arr_1);
+
+ $merge_arr = array();
+
+ for ($i = 0;$i < $num_key_0;$i++) {
+ $merge_arr[$key_arr_0[$i]] = $node_arr_0[$key_arr_0[$i]];
+ }
+
+ for ($j = 0;$j < $num_key_1;$i++) {
+ $merge_arr[$key_arr_1[$i]] = $node_arr_1[$key_arr_1[$i]];
+ }
+
+ return($merge_arr);
+ }
+ */
+
+ //Broken out of parseExpr Sept 7, 2006 David Lippman for
+ //ASCIIMathML 1.4.7 compatibility
+ function parseIntExpr()
+ {
+ $sym_0 = $this->getSymbol();
+ $node_0 = $this->parseSmplExpr();
+ $sym = $this->getSymbol();
+
+ if (isset($sym['infix']) && $sym['input'] != '/') {
+ $this->chopExpr($sym['symlen']);
+ $node_1 = $this->parseSmplExpr();
+
+ if ($node_1 === FALSE) { //show box in place of missing argument
+ $node_1 = $this->emptyNode();//??
+ } else {
+ $node_1->removeBrackets();
+ }
+
+ // If 'sub' -- subscript
+ if ($sym['input'] == '_') {
+
+ $sym_1 = $this->getSymbol();
+
+ // If 'sup' -- superscript
+ if ($sym_1['input'] == '^') {
+ $this->chopExpr($sym_1['symlen']);
+ $node_2 = $this->parseSmplExpr();
+ $node_2->removeBrackets();
+
+ $node_3 = $this->createNode();
+ $node_3->setName(isset($sym_0['underover']) ? 'munderover' : 'msubsup');
+ $node_3->addChild($node_0);
+ $node_3->addChild($node_1);
+ $node_3->addChild($node_2);
+
+ $node_4 = $this->createNode();
+ $node_4->setName('mrow');
+ $node_4->addChild($node_3);
+
+ return $node_4;
+ } else {
+ $node_2 = $this->createNode();
+ $node_2->setName(isset($sym_0['underover']) ? 'munder' : 'msub');
+ $node_2->addChild($node_0);
+ $node_2->addChild($node_1);
+
+ return $node_2;
+ }
+ } else {
+ $node_2 = $this->createNode();
+ $node_2->setName($sym['tag']);
+ $node_2->addChild($node_0);
+ $node_2->addChild($node_1);
+
+ return($node_2);
+ }
+ } elseif ($node_0 !== FALSE) {
+ return($node_0);
+ } else {
+ return $this->emptyNode();
+ }
+
+ }
+
+ function parseExpr()
+ {
+ // Child/Fragment array
+ $node_arr = array();
+
+ // Deal whole expressions like 'ax + by + c = 0' etc.
+ do {
+ $sym_0 = $this->getSymbol();
+ $node_0 = $this->parseIntExpr();
+ $sym = $this->getSymbol();
+ // var_dump($sym);
+
+ if (isset($sym['infix']) && $sym['input'] == '/') {
+ $this->chopExpr($sym['symlen']);
+ $node_1 = $this->parseIntExpr();
+
+ if ($node_1 === FALSE) { //should show box in place of missing argument
+ $node_1 = $this->emptyNode();
+ continue;
+ }
+
+ $node_1->removeBrackets();
+
+ // If 'div' -- divide
+ $node_0->removeBrackets();
+ $node_2 = $this->createNode();
+ $node_2->setName($sym['tag']);
+ $node_2->addChild($node_0);
+ $node_2->addChild($node_1);
+ $node_arr[$node_2->getId()] = $node_2;
+
+ } elseif ($node_0 !== FALSE) {
+ $node_arr[$node_0->getId()] = $node_0;
+ }
+ } while (!isset($sym['right_bracket']) && $sym !== FALSE && $sym['output'] != '');
+
+ //var_dump($sym);
+ // Possibly to deal with matrices
+ if (isset($sym['right_bracket'])) {
+ $node_cnt = count($node_arr);
+ $key_node_arr = array_keys($node_arr);
+
+ if ($node_cnt > 1) {
+ $node_5 = $node_arr[$key_node_arr[$node_cnt-1]];
+ $node_6 = $node_arr[$key_node_arr[$node_cnt-2]];
+ } else {
+ $node_5 = FALSE;
+ $node_6 = FALSE;
+ }
+
+ // Dealing with matrices
+ if ($node_5 !== FALSE && $node_6 !== FALSE &&
+ $node_cnt > 1 &&
+ $node_5->getName() == 'mrow' &&
+ $node_6->getName() == 'mo' &&
+ $node_6->getContent() == ',') {
+
+ // Checking if Node 5 has a LastChild
+ if ($node_7 = $node_5->getLastChild()) {
+ $node_7_cntnt = $node_7->getContent();
+ } else {
+ $node_7_cntnt = FALSE;
+ }
+
+ // If there is a right bracket
+ if ($node_7 !== FALSE && ($node_7_cntnt == ']' || $node_7_cntnt == ')')) {
+
+ // Checking if Node 5 has a firstChild
+ if ($node_8 = $node_5->getFirstChild()) {
+ $node_8_cntnt = $node_8->getContent();
+ } else {
+ $node_8_cntnt = FALSE;
+ }
+
+ // If there is a matching left bracket
+ if ($node_8 !== FALSE &&
+ (($node_8_cntnt == '(' && $node_7_cntnt == ')' && $sym['output'] != '}') ||
+ ($node_8_cntnt == '[' && $node_7_cntnt == ']'))) {
+
+ $is_mtrx_flg = TRUE;
+ $comma_pos_arr = array();
+
+ $i = 0;
+
+ while ($i < $node_cnt && $is_mtrx_flg) {
+ $tmp_node = $node_arr[$key_node_arr[$i]];
+
+ if($tmp_node_first = $tmp_node->getFirstChild()) {
+ $tnfc = $tmp_node_first->getContent();
+ } else {
+ $tnfc = FALSE;
+ }
+
+ if($tmp_node_last = $tmp_node->getLastChild()) {
+ $tnlc = $tmp_node_last->getContent();
+ } else {
+ $tnlc = FALSE;
+ }
+
+ if (isset($key_node_arr[$i+1])) {
+ $next_tmp_node = $node_arr[$key_node_arr[$i+1]];
+ $ntnn = $next_tmp_node->getName();
+ $ntnc = $next_tmp_node->getContent();
+ } else {
+ $ntnn = FALSE;
+ $ntnc = FALSE;
+ }
+
+ // Checking each node in node array for matrix criteria
+ if ($is_mtrx_flg) {
+ $is_mtrx_flg = $tmp_node->getName() == 'mrow' &&
+ ($i == $node_cnt-1 || $ntnn == 'mo' && $ntnc == ',') &&
+ $tnfc == $node_8_cntnt && $tnlc == $node_7_cntnt;
+ }
+
+ if ($is_mtrx_flg) {
+ for ($j = 0;$j < $tmp_node->getNumChild();$j++) {
+ $tmp_c_node = $tmp_node->getChildByIdx($j);
+
+ if ($tmp_c_node->getContent() == ',') {
+ $comma_pos_arr[$i][] = $j;
+ }
+ }
+ }
+
+ if ($is_mtrx_flg && $i > 1) {
+
+ $cnt_cpan = isset($comma_pos_arr[$i]) ? count($comma_pos_arr[$i]) : NULL;
+ $cnt_cpap = isset($comma_pos_arr[$i-2]) ? count($comma_pos_arr[$i-2]) : NULL;
+ $is_mtrx_flg = $cnt_cpan == $cnt_cpap;
+ }
+
+ $i += 2;
+ }
+
+ // If the node passes the matrix tests
+ if ($is_mtrx_flg) {
+ $tab_node_arr = array();
+
+ for ($i = 0;$i < $node_cnt;$i += 2) {
+ $tmp_key_node_arr = array_keys($node_arr);
+ if (!($tmp_node = $node_arr[$tmp_key_node_arr[0]])) {
+ break;
+ }
+ $num_child = $tmp_node->getNumChild();
+ $k = 0;
+
+ $tmp_node->removeFirstChild();
+
+ $row_node_arr = array();
+ $row_frag_node_arr = array();
+
+ for ($j = 1;$j < ($num_child-1);$j++) {
+ if (isset($comma_pos_arr[$i][$k]) &&
+ $j == $comma_pos_arr[$i][$k]) {
+
+ $tmp_node->removeFirstChild();
+
+ $tmp_c_node = $this->createNode();
+ $tmp_c_node->setName('mtd');
+ $tmp_c_node->addChildArr($row_frag_node_arr);
+ $row_frag_node_arr = array();
+
+ $row_node_arr[$tmp_c_node->getId()] = $tmp_c_node;
+
+ $k++;
+ } else {
+
+ if ($tmp_c_node = $tmp_node->getFirstChild()) {
+ $row_frag_node_arr[$tmp_c_node->getId()] = $tmp_c_node;
+ $tmp_node->removeFirstChild();
+ }
+ }
+ }
+
+ $tmp_c_node = $this->createNode();
+ $tmp_c_node->setName('mtd');
+ $tmp_c_node->addChildArr($row_frag_node_arr);
+
+ $row_node_arr[$tmp_c_node->getId()] = $tmp_c_node;
+
+ if (count($node_arr) > 2) {
+ $tmp_key_node_arr = array_keys($node_arr);
+ unset($node_arr[$tmp_key_node_arr[0]]);
+ unset($node_arr[$tmp_key_node_arr[1]]);
+ }
+
+ $tmp_c_node = $this->createNode();
+ $tmp_c_node->setName('mtr');
+ $tmp_c_node->addChildArr($row_node_arr);
+
+ $tab_node_arr[$tmp_c_node->getId()] = $tmp_c_node;
+ }
+
+ $tmp_c_node = $this->createNode();
+ $tmp_c_node->setName('mtable');
+ $tmp_c_node->addChildArr($tab_node_arr);
+
+ if (isset($sym['invisible'])) {
+ $tmp_c_node->setAttr('columnalign','left');
+ }
+
+ $key_node_arr = array_keys($node_arr);
+ $tmp_c_node->setId($key_node_arr[0]);
+
+ $node_arr[$tmp_c_node->getId()] = $tmp_c_node;
+ }
+ }
+ }
+ }
+
+ $this->chopExpr($sym['symlen']);
+ if (!isset($sym['invisible'])) {
+ $node_7 = $this->createNode();
+ $node_7->setName('mo');
+ $node_7->setContent($sym['output']);
+ $node_arr[$node_7->getId()] = $node_7;
+ }
+ }
+
+ return($node_arr);
+ }
+
+ function parseSmplExpr()
+ {
+ $sym = $this->getSymbol();
+
+ if (!$sym || isset($sym['right_bracket'])) //return FALSE;
+ return $this->emptyNode();
+
+ $this->chopExpr($sym['symlen']);
+
+ // 2005-06-11 wes: add definition type support
+ if(isset($sym['definition'])) {
+ $this->pushExpr($sym['output']);
+ $sym = $this->getSymbol();
+ $this->chopExpr($sym['symlen']);
+ }
+
+ if (isset($sym['left_bracket'])) {
+ $node_arr = $this->parseExpr();
+
+ if (isset($sym['invisible'])) {
+ $node_0 = $this->createNode();
+ $node_0->setName('mrow');
+ $node_0->addChildArr($node_arr);
+
+ return($node_0);
+ } else {
+ $node_0 = $this->createNode();
+ $node_0->setName('mo');
+ $node_0->setContent($sym['output']);
+
+ $node_1 = $this->createNode();
+ $node_1->setName('mrow');
+ $node_1->addChild($node_0);
+ $node_1->addChildArr($node_arr);
+
+ return($node_1);
+ }
+ } elseif (isset($sym['unary'])) {
+
+ if ($sym['input'] == 'sqrt') {
+ $node_0 = $this->parseSmplExpr();
+ $node_0->removeBrackets();
+
+ $node_1 = $this->createNode();
+ $node_1->setName($sym['tag']);
+ $node_1->addChild($node_0);
+
+ return($node_1);
+ } elseif (isset($sym['func'])) { //added 2006-9-7 David Lippman
+ $expr = ltrim($this->getCurrExpr());
+ $st = $expr{0};
+ $node_0 = $this->parseSmplExpr();
+ //$node_0->removeBrackets();
+ if ($st=='^' || $st == '_' || $st=='/' || $st=='|' || $st==',') {
+ $node_1 = $this->createNode();
+ $node_1->setName($sym['tag']);
+ $node_1->setContent($sym['output']);
+ $this->setCurrExpr($expr);
+ return($node_1);
+ } else {
+ $node_1 = $this->createNode();
+ $node_1->setName('mrow');
+ $node_2 = $this->createNode();
+ $node_2->setName($sym['tag']);
+ $node_2->setContent($sym['output']);
+ $node_1->addChild($node_2);
+ $node_1->addChild($node_0);
+ return($node_1);
+ }
+ } elseif ($sym['input'] == 'text' || $sym['input'] == 'mbox' || $sym['input'] == '"') {
+ $expr = ltrim($this->getCurrExpr());
+ if ($sym['input']=='"') {
+ $end_brckt = '"';
+ $txt = substr($expr,0,strpos($expr,$end_brckt));
+ } else {
+ switch($expr{0}) {
+ case '(':
+ $end_brckt = ')';
+ break;
+ case '[':
+ $end_brckt = ']';
+ break;
+ case '{':
+ $end_brckt = '}';
+ break;
+ default:
+ $end_brckt = chr(11); // A character that will never be matched.
+ break;
+ }
+ $txt = substr($expr,1,strpos($expr,$end_brckt)-1);
+ }
+
+ //$txt = substr($expr,1,strpos($expr,$end_brckt)-1);
+ $len = strlen($txt);
+
+ $node_0 = $this->createNode();
+ $node_0->setName('mrow');
+
+ if ($len > 0) {
+ if ($txt{0} == " ") {
+ $node_1 = $this->createNode();
+ $node_1->setName('mspace');
+ $node_1->setAttr('width','1ex');
+
+ $node_0->addChild($node_1);
+ }
+
+ $node_3 = $this->createNode();
+ $node_3->setName($sym['tag']);
+ $node_3->setContent(trim($txt));
+
+ $node_0->addChild($node_3);
+
+ if ($len > 1 && $txt{$len-1} == " ") {
+ $node_2 = $this->createNode();
+ $node_2->setName('mspace');
+ $node_2->setAttr('width','1ex');
+
+ $node_0->addChild($node_2);
+ }
+
+ $this->chopExpr($len+2);
+ }
+ return($node_0);
+
+ } elseif (isset($sym['acc'])) {
+ $node_0 = $this->parseSmplExpr();
+ $node_0->removeBrackets();
+
+ $node_1 = $this->createNode();
+ $node_1->setName($sym['tag']);
+ $node_1->addChild($node_0);
+
+ $node_2 = $this->createNode();
+ $node_2->setName('mo');
+ $node_2->setContent($sym['output']);
+
+ $node_1->addChild($node_2);
+ return($node_1);
+ } else {
+ // Font change commands -- to complete
+ }
+ } elseif (isset($sym['binary'])) {
+ $node_arr = array();
+
+ $node_0 = $this->parseSmplExpr();
+ $node_0->removeBrackets();
+
+ $node_1 = $this->parseSmplExpr();
+ $node_1->removeBrackets();
+
+ /* 2005-06-05 wes: added stackrel */
+ if ($sym['input'] == 'root' || $sym['input'] == 'stackrel') {
+ $node_arr[$node_1->getId()] = $node_1;
+ $node_arr[$node_0->getId()] = $node_0;
+ } elseif ($sym['input'] == 'frac') {
+ $node_arr[$node_0->getId()] = $node_0;
+ $node_arr[$node_1->getId()] = $node_1;
+ }
+
+ $node_2 = $this->createNode();
+ $node_2->setName($sym['tag']);
+ $node_2->addChildArr($node_arr);
+
+ return($node_2);
+ } elseif (isset($sym['infix'])) {
+ $node_0 = $this->createNode();
+ $node_0->setName('mo');
+ $node_0->setContent($sym['output']);
+
+ return($node_0);
+ } elseif (isset($sym['space'])) {
+ $node_0 = $this->createNode();
+ $node_0->setName('mrow');
+
+ $node_1 = $this->createNode();
+ $node_1->setName('mspace');
+ $node_1->setAttr('width',$sym['space']);
+
+ $node_2 = $this->createNode();
+ $node_2->setName($sym['tag']);
+ $node_2->setContent($sym['output']);
+
+ $node_3 = $this->createNode();
+ $node_3->setName('mspace');
+ $node_3->setAttr('width',$sym['space']);
+
+ $node_0->addChild($node_1);
+ $node_0->addChild($node_2);
+ $node_0->addChild($node_3);
+
+ return($node_0);
+ } else {
+
+ // A constant
+ $node_0 = $this->createNode();
+ $node_0->setName($sym['tag']);
+ $node_0->setContent($sym['output']);
+ return($node_0);
+ }
+
+ // Return an empty node
+ return $this->emptyNode();
+ }
+
+ function getMathML()
+ {
+ $root = $this->_node_arr[0];
+ return($root->dumpXML());
+ }
+
+ function getCurrExpr()
+ {
+ return($this->_curr_expr);
+ }
+
+ function setCurrExpr($str)
+ {
+ $this->_curr_expr = $str;
+ }
+
+ function getExpr()
+ {
+ return($this->_expr);
+ }
+
+ function getPrevExpr()
+ {
+ return($this->_prev_expr);
+ }
+
+ function createNode()
+ {
+ $node = new MathMLNode($this->_node_cntr);
+ // $node->setNamespaceAlias('m');
+ $this->_node_arr[$this->_node_cntr] = $node;
+ $this->_node_cntr++;
+ return($node);
+ }
+
+ /**
+ * Gets the largest symbol in the expression (greedy). Changed from non-greedy 26-Apr-2006
+ *
+ * @parameter boolean[optional] Chop original string?
+ *
+ * @return mixed
+ *
+ * @access private
+ */
+ function getSymbol($chop_flg = FALSE)
+ {
+ // Implemented a reverse symbol matcher.
+ // Instead of going front to back, it goes back to front. Steven 26-Apr-2006
+ $chr_cnt = strlen($this->_curr_expr);
+
+ if ($chr_cnt == 0) return FALSE;
+
+ for ($i = $chr_cnt; $i > 0; $i--) {
+ $sym_0 = substr($this->_curr_expr,0,$i);
+
+ // Reading string for numeric values
+ if (is_numeric($sym_0)) {
+
+ if ($chop_flg) $this->chopExpr($i);
+ return array('input'=>$sym_0, 'tag'=>'mn', 'output'=>$sym_0, 'symlen'=>$i);
+
+ } elseif (isset($this->_symbol_arr[$sym_0])) {
+
+ if ($chop_flg) $this->chopExpr($i);
+ $sym_arr = $this->_symbol_arr[$sym_0];
+ $sym_arr['symlen'] = $i;
+ return $sym_arr;
+ }
+ }
+
+ // Reading string for alphabetic constants and the minus sign
+ $char = $this->_curr_expr{0};
+ $len_left = $chop_flg ? $this->chopExpr(1) : strlen($this->_curr_expr)-1;
+
+ // Deals with expressions of length 1
+ if ($len_left == 0 && isset($this->_symbol_arr[$char])) {
+ $sym_arr = $this->_symbol_arr[$char];
+ $sym_arr['symlen'] = 1;
+ return $sym_arr;
+ } else {
+ $tag = preg_match('/[a-z]/i',$char) ? 'mi' : 'mo';
+ return array('input'=>$char, 'tag'=>$tag, 'output'=>$char, 'symlen'=>1);
+ }
+ }
+
+ function chopExpr($strlen)
+ {
+ $this->_prev_expr = $this->_curr_expr;
+
+ if ($strlen == strlen($this->_curr_expr)) {
+ $this->_curr_expr = '';
+ return(0);
+ } else {
+ $this->_curr_expr = ltrim(substr($this->_curr_expr,$strlen));
+ return(strlen($this->_curr_expr));
+ }
+ }
+}
+?> \ No newline at end of file
diff --git a/examples/includes/ASCIIMathPHP-2.0/htmlMathML.js b/examples/includes/ASCIIMathPHP-2.0/htmlMathML.js
new file mode 100644
index 000000000..f81a1d234
--- /dev/null
+++ b/examples/includes/ASCIIMathPHP-2.0/htmlMathML.js
@@ -0,0 +1,86 @@
+/* March 19, 2004 MathHTML (c) Peter Jipsen http://www.chapman.edu/~jipsen
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+(at http://www.gnu.org/copyleft/gpl.html) for more details.*/
+
+function convertMath(node) {// for Gecko
+ if (node.nodeType==1) {
+ var newnode =
+ document.createElementNS("http://www.w3.org/1998/Math/MathML",
+ node.nodeName.toLowerCase());
+ for(var i=0; i < node.attributes.length; i++) {
+ if (node.attributes[i].nodeName == 'displaystyle') {
+ newnode.setAttribute(node.attributes[i].nodeName,node.attributes[i].nodeValue);
+ }
+ }
+ for (var i=0; i<node.childNodes.length; i++) {
+ var st = node.childNodes[i].nodeValue;
+ if (st==null || st.slice(0,1)!=" " && st.slice(0,1)!="\n")
+ newnode.appendChild(convertMath(node.childNodes[i]));
+ }
+ return newnode;
+ }
+ else return node;
+}
+function convert() {
+
+ if (document.createElementNS) {
+ var mmlnode = document.getElementsByTagName("span");
+
+ for (var i=0; i<mmlnode.length; i++) {
+ var tmp_node = mmlnode[i];
+ if (tmp_node.className == 'asciimath') {
+ tmp_node.replaceChild(convertMath(tmp_node.firstChild),tmp_node.firstChild);
+ /*
+ for (var j=0;j<tmp_node.childNodes.length;j++) {
+ if (tmp_node.childNodes[j].nodeType != 3) {
+
+ }
+ }
+ */
+ }
+ }
+ } else {
+ var st,node,newnode;
+ var mmlnode = document.getElementsByTagName("math");
+
+ for (var i=0; i<mmlnode.length; i++) {
+ var str = "";
+ node = mmlnode[i];
+ while (node.nodeName!="/MATH" && node.nextSibling) {
+ st = node.nodeName.toLowerCase();
+ if (st=="#text") {
+ str += node.nodeValue;
+ } else {
+ str += (st.slice(0,1)=="/" ? "</m:"+st.slice(1) : "<m:"+st);
+ if (st.slice(0,1)!="/") {
+ for(var j=0; j < node.attributes.length; j++) {
+ if (node.attributes[j].nodeValue!="italic" &&
+ node.attributes[j].nodeValue!="" &&
+ node.attributes[j].nodeValue!="inherit" &&
+ node.attributes[j].nodeValue!=undefined) {
+ str += " "+node.attributes[j].nodeName+"="+
+ "\""+node.attributes[j].nodeValue+"\"";
+ }
+ }
+ }
+ str += ">";
+ }
+ node = node.nextSibling;
+ node.parentNode.removeChild(node.previousSibling);
+ }
+
+ if (str != '') {
+ str += "</m:math>";
+ newnode = document.createElement("span");
+ node.parentNode.replaceChild(newnode,node);
+ newnode.innerHTML = str;
+ }
+ }
+ }
+} \ No newline at end of file