<?php
# extensión para MediaWiki “Eval”
# “Eval” MediaWiki extension
# Para activar la extensión, inclúyela en tu archivo "LocalSettings.php"
# con: include("extensions/eval.php");
# To activate the extension, include it from your "LocalSettings.php" file
# with: include("extensions/eval.php");
$wgExtensionFunctions[] = "wfEvalExtension";
function wfEvalExtension() {
global $wgParser;
$wgParser->setHook( "eval", "renderEval" );
}
function strpbrk($pajar,$agujas)
{
$m=FALSE;
for($i==0;$i<strlen($agujas);$i++)
{
$n=strpos($pajar,$agujas[$i]);
#print("<!-- Comprobando «".$pajar."», «".$agujas."» [".$i."] «".$agujas[$i]."» «".$m."» «".$n."» -->\n");
if((($n<$m)||($m===FALSE))&&($n!==FALSE)) $m=$n;
}
#print ("<!-- «$m"."» «$n"."» -->");
return $m;
}
function parseEvalC($evalv,$prm="r")
{
$evalv["error"]=0;
switch ($evalv["op"])
{
case "+": $evalv[$prm]=$evalv["p1"]+$evalv["p2"]; break;
case "-": $evalv[$prm]=$evalv["p1"]-$evalv["p2"]; break;
case "*": $evalv[$prm]=$evalv["p1"]*$evalv["p2"]; break;
case "/": $evalv[$prm]=$evalv["p1"]/$evalv["p2"]; break;
default:
$evalv["error"]=2;
}
return $evalv;
}
function parseEvalP($evalv,$prm="p1")
{
switch($evalv["t"][0])
{
case "0":case "1":case "2":case "3":case "4":case "5":
case "6":case "7":case "8":case "9":case ".":case "e":
// Busca la posición del operador
$n=strpbrk($evalv["t"],'+-*/');
if($n===FALSE) $n=strlen($evalv["t"]);
#print("<!-- Posición del operador: ".$n." -->\n");
// Copia el parámetro (hasta el operador, excluido)
$evalv[$prm]=substr($evalv["t"],0,$n);
#print("<!-- Copiando parámetro: prm= $evalv[$prm] -->\n<!-- Eliminando parámetro: \$evalv[t]=".$evalv["t"]." -> ");
// Elimina el parámetro del texto a procesar
$evalv["t"]=substr($evalv["t"],$n);
#print($evalv["t"]." -->\n");
break;
case "+":case "-": $evalv[$prm]=0; break; //Si no se especifica, antes de un más o un menos hay un 0
case "*":case "/": $evalv[$prm]=1; break; //Si no se especifica, antes de un más o un menos hay un 1
case "(":
#print("<!-- Sacando paréntesis: «".$evalv["t"]."»->«");
$evalv["t"]=substr($evalv["t"],1);
#print($evalv["t"]."» -->\n<!-- Procesando paréntesis, inicio: p1=«".$evalv["p1"]."», op=«".$evalv["op"]."», p2=«".$evalv["p2"]."», error=«".$evalv["error"]."», t=«".$evalv["t"]."» -->\n");
$eval2=parseEval($evalv);
$evalv["t"]=substr($eval2["t"],1); // Copia el texto a procesar, sin el paréntesis...
$evalv[$prm]=$eval2["r"];
#print("<!-- Procesando paréntesis, fin: (evalv:) p1=«".$evalv["p1"]."», op=«".$evalv["op"]."», p2=«".$evalv["p2"]."», error==«".$evalv["error"]."», t=«".$evalv["t"]."» -->\n");
#print("<!-- Procesando paréntesis, fin: (eval2:) p1=«".$eval2["p1"]."», op=«".$eval2["op"]."», p2=«".$eval2["p2"]."», error=«".$eval2["error"]."», t=«".$eval2["t"]."» -->\n");
break;
// case "{":
// break;
default:
$evalv["error"]=1;
}
return $evalv;
}
function parseEvalO($evalv)
{
$evalv["op"]=substr($evalv["t"],0,1); // Copia el operador
$evalv["t"]=substr($evalv["t"],1); // Elimina el operador del texto a procesar
return $evalv;
}
function parseEval($evalv)
{
// Toma el primer objeto.
$evalv=parseEvalP($evalv);
#print("<!-- [76]: (\$evalv:) p1=«".$evalv["p1"]."», op=«".$evalv["op"]."», p2=«".$evalv["p2"]."», error=«".$evalv["error"]."», t=«".$evalv["t"]."» -->\n");
if($evalv["error"]>0) return $evalv;
do
{
$evalv=parseEvalO($evalv); // Toma el operador
#print("<!-- [81]: (\$evalv:) p1=«".$evalv["p1"]."», op=«".$evalv["op"]."», p2=«".$evalv["p2"]."», error=«".$evalv["error"]."», t=«".$evalv["t"]."» -->\n");
if($evalv["error"]>0) return $evalv;
$evalv=parseEvalP($evalv,"p2"); // Toma el segundo parámetro.
#print("<!-- [84]: (\$evalv:) p1=«".$evalv["p1"]."», op=«".$evalv["op"]."», p2=«".$evalv["p2"]."», error=«".$evalv["error"]."», t=«".$evalv["t"]."» -->\n");
if($evalv["error"]>0) return $evalv;
$evalv=parseEvalC($evalv,"p1"); // Calcula el resultado, y lo almacena en el primer parámetro
#print("<!-- [87]: (\$evalv:) p1=«".$evalv["p1"]."», op=«".$evalv["op"]."», p2=«".$evalv["p2"]."», error=«".$evalv["error"]."», t=«".$evalv["t"]."» -->\n");
if($evalv["error"]>0) return $evalv;
} while ((strlen($evalv["t"])>0)&&($evalv["t"][0]!=")"));
$evalv["r"]=$evalv["p1"];
return $evalv;
}
function renderEval( $eniro, $argv )
{
global $wgOut;
$e["t"]=$wgOut->parse($eniro,false); $e["error"]=0;
$eliro=parseEval($e);
if($eliro["error"]>0) return "<!-- Eval: Error # ".$eliro["error"]." -->";
return $eliro["r"];
}
?>