Extension:Eval/eval.php

From MediaWiki.org
Jump to navigation Jump to search
<?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"];
 }

?>