[Aimmath-commit] moodle/lib/t2mml edit.php,NONE,1.1
Brought to you by:
gustav_delius,
npstrick
|
From: <gus...@us...> - 2003-09-21 22:01:07
|
Update of /cvsroot/aimmath/moodle/lib/t2mml
In directory sc8-pr-cvs1:/tmp/cvs-serv26362/lib/t2mml
Added Files:
edit.php
Log Message:
edit.php will be a commented and extended version of editeml.php
--- NEW FILE: edit.php ---
<?
/* This TeX to MathML converter is based on
WeM - Web editeur Mathematique
Copyright 2002 Stephan Semirat
Contact : ad...@ma...
*/
function chercherbf($bo,$bf,$expression) {
$expression=str_replace($bo,"(",$expression);
$expression=str_replace($bf,")",$expression);
$expr=$expression;
$k=0;
$flag=true;
while ($flag==true){
$j=strpos($expr,"(");
$i=strpos($expr,")");
if ($i===false) $i=100000;
if ($j===false) $j=100000;
if ($i<$j) {
$k++;
if ($k==1) $flag=false; else
$expr=substr($expr,$i+1,strlen($expr));
}
if ($i>$j) {
$k--;
$expr=substr($expr,$j+1,strlen($expr));
}
if ($i==$j) {$flag=false;die("i=j");}
}
$expression=substr($expression,0,strlen($expression)-strlen($expr)+$i);
$expression=str_replace("(",$bo,$expression);
$expression=str_replace(")",$bf,$expression);
return $expression;
}
function chercherbo($bo,$bf,$expression) {
$expression=str_replace($bo,"(",$expression);
$expression=str_replace($bf,")",$expression);
$expr=$expression;
$k=0;
$flag=true;
while ($flag==true){
$i=strrpos($expr,"(");
$j=strrpos($expr,")");
if ($i===false) $i=-1;
if ($j===false) $j=-1;
if ($i>$j) {
$k++;
if ($k==1) $flag=false; else
$expr=substr($expr,0,$i);
}
if ($i<$j) {
$k--;
$expr=substr($expr,0,$j);
}
if ($i==$j) {$flag=false;die("probleme de format du texte");}
}
$expression=substr($expression,$i+1,strlen($expression));
$expression=str_replace("(",$bo,$expression);
$expression=str_replace(")",$bf,$expression);
return $expression;
}
function indiceexposant($expr) {
$l=strlen($expr);
$exprr="";
$i=$l-1;
while ($i>=0){
$a=substr($expr,$i,1);
$i--;
$ok=false; $j=$i;
if ((ereg("\^",$a)) || (ereg("\_",$a))) {
$b=substr($expr,$i,1);
$i--;
if ((ereg(">",$b)) || ($b=="}")){
if (substr($expr,$i,1)=="/"){
$numerateur=strrchr(substr($expr,0,$i+2),"<");
$i=$i-strlen($numerateur)+1;
} else {
if ($b==">") $b=strrchr(substr($expr,0,$i+2),"<");
$i=$i-strlen($b)+1;
$balisefin=$b;
if ($b!="}") $balisedebut=str_replace("/","",$b); else $balisedebut="{";
$c=chercherbo($balisedebut,$balisefin,substr($expr,0,$i+1));
$i=$i-strlen($c.$balisedebut);
$c=indiceexposant($c);
if ($balisedebut!="{") $balisedebutN=$balisedebut; else $balisedebutN="<mrow>";
if ($balisefin!="}") $balisefinN=$balisefin; else $balisefinN="</mrow>";
$numerateur=$c;
}
$ok=true;
}
$b=substr($exprr,0,1);
if (ereg("<",$b)) {
$j=strpos($exprr,">");
$b=substr($exprr,0,$j+1);
$balisedebut=$b;
$balisefin=substr($b,0,1)."/".substr($b,1,strlen($b)-1);
$c=indiceexposant(chercherbf($balisedebut,$balisefin,substr($exprr,strlen($balisedebut),strlen($exprr))));
$exprr=substr($exprr,strlen($balisedebut.$c.$balisefin),strlen($exprr));
if (($balisedebut=="<msup>") && (ereg("\_",$a))){
$baliseO="<msubsup>";
$baliseF="</msubsup>";
$balisedebut="";
$balisefin="";
} else {
if (ereg("\_",$a)) {
$baliseO="<msub>";
$baliseF="</msub>";
} else {
$baliseO="<msup>";
$baliseF="</msup>";
}
} $denominateur=$balisedebut.$c.$balisefin;
} else $ok=false;
if ($ok) {
$exprr=$baliseO.$balisedebutN.$numerateur.$balisefinN.$denominateur.$baliseF.$exprr;
$a="";
} else $i=$j;
}
$exprr=$a.$exprr;
}
return $exprr;
}
function editestring($expr) {
while(ereg("\(([^()]*)\)",$expr)){
$expr=preg_replace("/\(([^()]*)\)/","<mrow><mo><parenthese></mo>$1<mo></parenthese></mo></mrow>",$expr);
}
$l=strlen($expr);
//echo "expr=$expr\n ";
$exprr="";
$i=$l-1;
while ($i>=0){
$a=substr($expr,$i,1);
//echo " a=$a ";
$i--;
if ($a==";") {
$texte=false;
$b=strrchr(substr($expr,0,$i+1),"&");
if (ereg("(&#)(.*)([^a-zA-Z]+)",$b)) { $texte=true;}
if ($b=="") {$texte=true;}
if ($texte==true){
$b=strrchr(substr($expr,0,$i+2),"<");
if (!(ereg("<mo",$b))) $a="<mo>".$a."</mo>";
$exprr=$a.$exprr;
$a="";
} else {
$b=strrchr(substr($expr,0,$i+2),"<");
$exprr=$b.$exprr;
$i=$i-strlen($b)+1;
$a="";
}
}
if (ereg("(\+|\-|\(|\)|=|\[|\]|\*|,|\.|:|%)",$a)) {
$b=strrchr(substr($expr,0,$i+2),"<");
if (!(ereg("<mo",$b))) $a="<mo>".$a."</mo>";
$exprr=$a.$exprr;
$a="";
}
if ($a=="|") {
$b=strrchr(substr($expr,0,$i+2),"<");
if (!(ereg("<mo",$b))) $a="<mo>".$a."</mo>";
$exprr="<mo>&#mid;</mo>".$exprr;
$a="";
}
/* if (ereg("\}",$a)) {
$b=chercherbo("{","}",substr($expr,0,$i+1));
$i=$i-strlen($b)-1;
if (($test=="^") || ($test=="_")) $exprr="<mrow>".$b."</mrow>".$exprr; else $exprr="{".$b."}".$exprr;
$a="";
}*/
if (ereg(">",$a)) {
$b=substr($expr,$i,1);
if ($b!="\\") {
$b=strrchr(substr($expr,0,$i+2),"<");
$exprr=$b.$exprr;
$i=$i-strlen($b)+1;
$a="";
}
}
if (ereg("[0-9]",$a)) {
while(ereg("[0-9]|\.|,",substr($expr,$i,1)) && ($i>=0)){
$a=substr($expr,$i,1).$a;
$i--;
}
$b=strrchr(substr($expr,0,$i+2),"<");
if (!(ereg("<mn",$b))) $a="<mn>".$a."</mn>";
$exprr=$a.$exprr;
$a="";
}
if (ereg("[a-zA-Z]",$a)){
$texte=false;
$b=strrchr(substr($expr,0,$i+2),"\\");
if (ereg("(\\\)(.*)([^a-zA-Z]+)",$b)) {$texte=true;}
if ($b=="") {$texte=true;}
if ($texte==true){
$b=strrchr(substr($expr,0,$i+2),"<");
// echo "//b=$b//";
if ((!(ereg("<mi",$b)) && (!(ereg("<mtext",$b)))) || (!($b))) $a="<mi>".$a."</mi>";
$exprr=$a.$exprr;
$a="";
} else {
$commande=substr($b,1,strlen($b));
$c=strrchr(substr($expr,0,$i+2),"<");
if ((!(ereg("<mo",$c))) || (!($c))) {
$i=$i-strlen($b)+1;
if (($commande!="sqrt") && ($commande!="frac")) {
$exprr="<mo>&#".$commande.";</mo>".$exprr;
} else
$exprr="\\".$commande."".$exprr;
} else {
$exprr=str_replace("\\".$commande,"&#".$commande.";",$c).$exprr;
// echo "c=$c\n";
//echo "exprr=$exprr\n";
$i=$i-strlen($c)+1;
//$a=substr($expr,$i,1);
//echo "a=$a\n";
//$a="";
}
$a="";
}
}
if ($a==" "){
$b=substr($expr,$i,1);
if ($b=="\\") {
$exprr="<mspace width=\"1em\"/>".$exprr;
$i--;
} else {
$b=strrchr(substr($expr,0,$i+2),"<");
if (ereg("<mtext",$b)) $exprr=" ".$exprr;
}
$a="";
}
if ($a=="\'"){
$exprr="<mi>\'</mi>".$exprr;
$a="";
}
$exprr=$a.$exprr;
// echo "\n exprr=$exprr\n";
}
return $exprr;
}
function editermaths($message){
$flag=0;
$message=str_replace("&#lt;","<mo>&#lt;</mo>",$message);
$message=str_replace("&#gt;","<mo>&#gt;</mo>",$message);
$message=str_replace("<mo><mo>","<mo>",$message);
$message=str_replace("</mo></mo>","</mo>",$message);
$message=preg_replace("/(\\\){1}(begin)\{(array)\}/","<mtable><mtr columnalign=\"left\"><mtd>",$message);
$message=preg_replace("/(\\\){1}(end)\{(array)\}/","</mtd></mtr>\n</mtable>",$message);
$message=preg_replace("/((\\\){2})(<br \/>)?/","</mtd></mtr>\n<mtr columnalign=\"left\"><mtd>",$message);
$message=preg_replace("/(&)([^#])/","</mtd><mtd>$2",$message);
$message=str_replace("<mtr columnalign=\"left\"><mtd>\n</mtd></mtr>\n</mtable>","</mtable>",$message);
while($flag<2) {
$message=preg_replace("/(\\\){1}(displaystyle)\{([^}{]*)\}/","<mstyle displaystyle=\"true\">$3</mstyle>",$message);
$message=preg_replace("/(\\\){1}(to)/","<mo>\\RightArrow</mo>",$message);
$temp=preg_replace("/(\\\){1}(vec)\{([^}{]*)\}/",
"<mover accent=\"true\"><mrow>$3</mrow> <mo stretchy=\"true\">\\RightArrow</mo></mover>",$message);
if ($message!=$temp) {$message=editermaths($temp);}
$temp=preg_replace("/(\\\){1}(bar|overbar)\{([^}{]*)\}/",
"<mover accent=\"true\"><mrow>$3</mrow> <mo stretchy=\"true\">\\OverBar</mo></mover>",$message);
if ($message!=$temp) {$message=editermaths($temp);}
$temp=preg_replace("/(\\\){1}(overbrace)\{([^}{]*)\}/",
"<mover accent=\"true\"><mrow>$3</mrow> <mo stretchy=\"true\">\\OverBrace</mo></mover>",$message);
if ($message!=$temp) {$message=editermaths($temp);}
$temp=preg_replace("/(\\\){1}(underbrace)\{([^}{]*)\}/",
"<munder accentunder=\"true\"><mrow>$3</mrow> <mo stretchy=\"true\">\\UnderBrace</mo></munder>",$message);
if ($message!=$temp) {$message=editermaths($temp);}
$temp=preg_replace("/(\\\){1}(over)\{([^}{]*)\}\{([^}{]*)\}/",
"<mover><mrow>$3</mrow> <mrow>$4</mrow></mover>",$message);
if ($message!=$temp) {$message=editermaths($temp);}
$temp=preg_replace("/(\\\){1}(under)\{([^}{]*)\}\{([^}{]*)\}/",
"<munder><mrow>$3</mrow> <mrow>$4</mrow></munder>",$message);
if ($message!=$temp) {$message=editermaths($temp);}
$temp=preg_replace("/(\\\){1}(binomial)\{([^}{]*)\}\{([^}{]*)\}/",
"<mrow><mo><parenthese></mo><mfrac linethickness=\"0\"><mrow>$3</mrow><mrow>$4</mrow></mfrac><mo></parenthese></mo></mrow>",$message);
if ($message!=$temp) {$message=editermaths($temp);}
$temp=preg_replace("/(\\\){1}(text)\{([^}{]*)\}/","<mtext>$3</mtext>",$message);
if ($message!=$temp) {$message=editermaths($temp);}
$temp=preg_replace("/(\\\){1}(sqrt)\{([^}{]*)\}/","<msqrt>$3</msqrt>",$message);
if ($message!=$temp) {$message=editermaths($temp);}
$temp=preg_replace("/(\\\){1}(frac)\{([^}{]*)\}\{([^}{]*)\}/","<mfrac><mrow>$3</mrow> <mrow>$4</mrow></mfrac>",$message);
if ($message!=$temp) {$message=editermaths($temp);}
$message=preg_replace("/(\^\{[^}{]*\})(\_\{[^}{]*\})/","$2$1",$message);
$message=preg_replace("/(\^|\_)\{([^}{]*)\}/","$1<mrow>$2</mrow>",$message);
$message=preg_replace("/(\\\){1}(mathfrak)\{([^}{]{1})\}/","\\\\$3fr ",$message);
$message=preg_replace("/(\\\){1}(mathbb)\{([^}{]{1})\}/","\\\\$3opf ",$message);
$message=preg_replace("/(\\\){1}(mathcal)\{([^}{]{1})\}/","\\\\$3scr ",$message);
$message=preg_replace("/(\^.{1})(\_.{1})/","$2$1",$message);
$flag++;
}
$message=preg_replace("/(\{){1}([^{}]+)(\}){1}/e","'{'.editermaths(\"$2\").'}'",$message);
$message=editestring($message);
$message=indiceexposant($message);
// $message=preg_replace("/<msubsup><mo>(&#sum;|&#prod;)<\/mo>([^{}]*)<\/msubsup>/",
// "<munderover><mo>$1</mo>$2</munderover>",$message);
$message=preg_replace("/<mo>&#(sin|arcsin|cos|arccos|tan|arctan|ln|log|lim|min|max|inf|sup);<\/mo>/",
"<mi>$1</mi>",$message);
// $message=preg_replace("/<msub><mi>(lim|min|max|inf|sup)<\/mi>([^{}]*)<\/msub>/e",
// "'<munder><mi>$1</mi>'.chercherbf('<msub>','</msub>',\"$2\").'</munder>'.substr(\"$2\",strlen(chercherbf('<msub>','</msub>',\"$2\"))+7,strlen(\"$2\")).'</msub>'",$message);
$message=str_replace("<br />","",$message);
return $message;
}
function editer($message) {
// replace < and > by their html entities
$message=str_replace("<","&#lt;",$message);
$message=str_replace(">","&#gt;",$message);
// remove empty lines. Note that the pattern is not surrounded by delimiters. Why not?
$message=ereg_replace("(\n|\r){2}","\\1",$message);
// I don't understand (\\\) yet.
// <accolade> will be replaced by { again later
$message=preg_replace("/(\\\){1}(\{)/","<mo><accolade></mo>",$message);
$message=preg_replace("/(\\\){1}(\})/","<mo></accolade></mo>",$message);
// <quote/> will be replaced by ' later
$message=preg_replace("/(\')/","<quote/>",$message);
$message = nl2br($message);
// still have to find out the purpose of these flags. They must be there to make sure the expression to be
// converted is not to complicated and takes too much time.
$flag=0;
while($flag<200) {
$fflag=0;
while((ereg("$",$message)) && ($fflag<5)) {
// equations and displayed equations are converted with editermaths() and then wrapped
// this is the place to also deal with \( and \[
$message=preg_replace("/(\\$){2}([^$]+)(\\$){2}/e","'<div align=\"center\"><math xmlns=\"http://www.w3.org/1998/Math/MathML\"><mstyle displaystyle=\"true\">'.editermaths(\"$2\").'</mstyle></math></div>'",$message);
$message=preg_replace("/(\\$){1}([^$]+)(\\$){1}/e","'<math xmlns=\"http://www.w3.org/1998/Math/MathML\">'.editermaths(\"$2\").'</math>'",$message);
$fflag++;
}
// table environment
$message=preg_replace("/(\\\){1}(begin)\{(ltabular)\}(\[([0-9]*)?\])?(<br \/>)?([^}{]*)(\\\){1}(end)\{(ltabular)\}/",
"\n<table border=\"$5\" width=\"100%\">\n<tr valign=\"center\"><td align=\"center\">\n$7\n</td></tr>\n</table>",$message);
$message=preg_replace("/(\\\){1}(begin)\{(tabular)\}(\[([0-9]*)?\])?(<br \/>)?([^}{]*)(\\\){1}(end)\{(tabular)\}/",
"<table border=\"$5\"><tr valign=\"center\"><td align=\"center\">$7</td></tr>\n</table>",$message);
// inside a table environment \\ at the end of the line should start a new row
// I think we need a safeguard so that this is not used outside a table environment
$message=preg_replace("/((\\\){2})(<br \/>)?/","</td></tr>\n<tr valign=\"center\"><td align=\"center\">",$message);
// inside a table environment & should start a new cell. I don't know what the # is for
$message=preg_replace("/(&)([^#])/","</td><td align=\"center\">$2",$message);
//remove empty table rows
$message=str_replace("<tr valign=\"center\"><td align=\"center\">\n</td></tr>\n</table>","</table>",$message);
// searches for all kinds of theorem style environments and prints their name in bold and the content in italics
// this should be translated to english
$message=preg_replace("/(\\\){1}(begin|debut)\{(théorème|définition|exemple|exemples|proposition|propriété|propriétés|exercice|exercices|démonstration|preuve)( ?[0-9]*)\}([^}{]*)(\\\){1}(end|fin)\{(théorème|définition|exemple|exemples|proposition|propriété|propriétés|exercice|exercices|démonstration|preuve)\}/e",
"'<b>'.ucwords(\"$3\").\"$4.\".'</b><i>'.\"$5\".'</i>'",$message);
$message=preg_replace("/(\\\){1}(color)\[([^}{]*)\]\{([^}{]*)\}/","<font color=\"$3\">$4</font>",$message);
// the following should look for \begin{flushleft} ,flushright,center instead. Also \centering
$message=preg_replace("/(\\\){1}(left)\{([^}{]*)\}/","<div align=\"left\">$3</div>",$message);
$message=preg_replace("/(\\\){1}(right)\{([^}{]*)\}/","<div align=\"right\">$3</div>",$message);
$message=preg_replace("/(\\\){1}(center)\{([^}{]*)\}/","<div align=\"center\">$3</div>",$message);
// text styles
// this should be changed because the tex syntax is {\bf } not \bf{ }
$message=preg_replace("/(\\\){1}(bf)\{([^}{]*)\}/","<b>$3</b>",$message);
$message=preg_replace("/(\\\){1}(it)\{([^}{]*)\}/","<i>$3</i>",$message);
$message=preg_replace("/(\\\){1}(ul)\{([^}{]*)\}/","<u>$3</u>",$message);
$message=preg_replace("/(\\\){1}(chapter)\{([^}{]*)\}/","<h1>$3</h1>",$message);
$message=preg_replace("/(\\\){1}(section)\{([^}{]*)\}/","<h2>$3</h2>",$message);
$message=preg_replace("/(\\\){1}(subsection)\{([^}{]*)\}/","<h3>$3</h3>",$message);
$message=preg_replace("/(\\\){1}(subsubsection)\{([^}{]*)\}/","<h4>$3</h4>",$message);
$message=preg_replace("/(\\\){1}(end)\{(itemize)\}/","</li></ul>",$message);
$message=preg_replace("/(\\\){1}(begin)\{(itemize)\}/","<ul>",$message);
$message=preg_replace("/(\\\){1}(end)\{(enumerate)\}/","</li></ol>",$message);
$message=preg_replace("/(\\\){1}(begin)\{(enumerate|enumerer)\}\[([1|a|A|i|I]?)\]/","<ol type=\"$4\">",$message);
$message=str_replace("\\item","</li><li>",$message);
$flag++;
}
// remove the extra </li> that the above will have introduced
$message=ereg_replace("(<ol type=\")(a|A|1|i|I)(\"><br />\n</li>)","<ol type=\"\\2\"><br />\n",$message);
$message=str_replace("<ul><br />\n</li>","<ul><br />\n",$message);
$message=str_replace("\\quad"," ",$message);
$message=str_replace("\\qquad"," ",$message);
$message=str_replace("&#","&",$message);
// put parentheses, braces and quotes back
$message=str_replace("<parenthese>","(",$message);
$message=str_replace("</parenthese>",")",$message);
$message=str_replace("<accolade>","{",$message);
$message=str_replace("</accolade>","}",$message);
$message=str_replace("<quote/>","'",$message);
// should ad umlauts
$message=preg_replace("/([éèëàçêûïâîôùÀÈÎÔÛÏÂ]{1})/e","htmlentities(\"$1\")",$message);
return $message;
}
?>
|