Extension:Eval/eval.php
From MediaWiki.org
<?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"]; } ?>
