#!/usr/bin/php -qC - las notas van a un div id=notas que debe contener un
*/ setlocale(LC_ALL,"es_ES"); ini_set("pcre.backtrack_limit",10000000); // esto pasa, pero porqué no lo hago mejor? echo "Recuerda que tabcont debe tener un
    dentro o este prg se cargará otra
      que este en otro sitio\n"; $mh=$argv[2] or $mh=3; $xh=$argv[3] or $xh=6; if (! $b1=$b=@file_get_contents($argv[1],"r")) die("No encuentro ".$argv[1].", ¿has puesto el path completo?\n"); // si el tabcont lleva class eval, evalua el buffer if (preg_match('/id="?tabcont"?.*?class="?eval"?/',$b)) { ob_start(); eval("?>$b"); $b=ob_get_contents(); ob_end_clean(); } $b=preg_replace('||s','',$b); // elimino comentarios preg_match_all("|]*)>(.*?)|s", // cojo los headers del cuerpo preg_replace(array('|.*?]*?id="cuerpo"[^<]*?>|s', // elimino la cabecera: solo queda el cuerpo '|]*?id="rellecuerpo"[^<]*?>.*|s', // parto de que rellecuerpo es obligatorio ), array('','',),$b), $m); $ma=array('c' => $m); // cuerpo preg_match_all("|]*)>(.*?)|s", // cojo los headers después de rellecuerpo preg_replace('|.*?]*?id="rellecuerpo"[^<]*?>|s','',$b),$m); // dejo a partir de rellecuerpo $ma['l']=$m; // listas $b=$b1; // recupero el buffer por si modificado por eval, comens, etc $ac='0'; $ids=array(); $toc=""; $pad=''; // los hx del cuerpo serán class=toc y los del final toc_nc que normalmente no se displayará foreach ($ma as $ty => $m) { foreach($m[0] as $i => $h) { //quita cambios de linea y espacios repe, quita los name=_t, quita los ^ $n2=preg_replace('+]*?name="_t[^>]*?"> *+','', preg_replace('/\s+/',' ', preg_replace('+]*>\^+','%%\1',$m[3][$i]))); // quita los posibles links que tenga y los name=. $n=preg_replace('+]*?href=[^>]*?>(.*?)+','\1', preg_replace('+]*?name="[^>]*?"> *+','', preg_replace('+ *%%a?+','',$n2))); if ($n == '') continue; // saca el id para el href $id=preg_replace('/ /','', preg_replace('+([^ ][^ ][^ ]).*?( |\\n|$)+','\1', preg_replace('/[^ a-zA-Z0-9]/','', preg_replace('+<[^>]*>+','',$n)))); while (!(array_search($id,$ids) === false)) $id.='bis'; $cc=$m[1][$i]; $ids[]=$id; $aids[$cc]=$id; if ($entoc=!preg_match('/class="?notoc"?/',$m[2][$i])) { if ($ty == 'c') $clas="class=\"toc_$cc\""; else $clas="class=\"toc_nc\""; if ($cc == $ac) $toc.="$pad
    1. "; else { if ($cc > $ac) { $pad=str_repeat(' ',$cc-$mh); $toc.="$pad
        \n$pad
      1. "; } else { for (; $cc <$ac; $ac--) { $toc.="$pad
      \n"; $pad=str_repeat(' ',$ac-$mh-1); } $toc.="$pad
    2. "; } $iac=$ac=$cc; } } $n2=preg_replace('+ *%%a+'," ^",$n2); $n3=preg_replace('+ *%%+'," ^",$n2); if ($entoc) { if ($n3 != $n2) $tg=""; else $tg=''; $toc.="$tg$n
    3. \n"; } // porque no gasto un str_replace? $b=preg_replace('+'.preg_quote($h).'+',"$n3",$b,1); } } // cierra las listas abiertas for ($cc=$mh; $cc <=$ac; $cc ++) { $toc.="$pad
    \n"; $pad=@str_repeat(' ',$cc-$mh-1); } // saco el sangrado del div preg_match('|( *)]*?id="?tabcont"?|s',$b,$m); // lo pongo $toc=preg_replace('|\n|',"\n".$m[1],$toc); // pongo el toc, por que dos replaces? $b=preg_replace('%(]*?id="?tabcont"?[^>]*?>.*?)()%s','\1'.$toc.'\2', /* este replace es el que produce el cargarse una lista de otro sitio, se arregla haciendo al principio: if (preg_match('%]*?id="?tabcont"?[^>]*?>.*?%s',$b,$m) and preg_match('%
      .*
    %s',$m[0])) { hacer lo del tabcont, cerrar antes de las notas */ preg_replace('%(]*?id="?tabcont"?[^>]*?>.*?)()%s','\1\3',$b)); // femod $b=preg_replace('%( title="femod">)[^<]*%',"\${1}".strftime("%d %B %Y"),$b); // ahora las notas // coje notas nuevas o viejas, si hay mira a ver si existe el div id=notas if (preg_match_all('+(<(nota)>|<(sup)>+s',$b,$nts) and // este preg_match puede fallar, pues si "notas" no contuviera un dl, pero hubiese uno despues, pasaria como en el toc preg_match('|]*?id="?notas"?[^>]*?>.*?([ ]*)
    (.*?)
    .*?|s',$b,$lnt) ) { // print_r($lnt); // sangrado del div $sep=$lnt[1]; // hay ya notas? las meto en un array con la numeración original if (preg_match_all('|
    (.*?)|s',$lnt[2],$lnts)) { //print_r($lnts); $ents=array(); foreach($lnts[1] as $i => $int) $ents[$int]=$lnts[2][$i]; //print_r($ents); } $notas=''; // print_r($nts); foreach($nts[0] as $i => $nth) { $c=$i+1; if ($nts[2][$i]) // es nota nueva $s=$nts[5][$i]; else $s=$ents[$nts[4][$i]]; // cojo la vieja // pongo la nota $notas.="$sep
    $c
    $s
    \n"; // cambio la nota (nueva o vieja) por la nueva (renumerada), el tmp es preciso por la renumeración $b=str_replace($nth,"$c",$b); //echo $b; } // quito los tmp $b=str_replace('','',$b); // ahora pongo las notas donde toca // para evitar que una nota tenga un \1 $uni=uniqid('lasnotas'); $b=preg_replace('|(]*?id="?notas"?[^>]*?>.*?
    ).*?(
    .*?)|s','\1'.$uni.'\2',$b); $b=str_replace($uni,"\n$notas$sep",$b); } // avisos $b=preg_replace('%(.*?)%','',$b); if (preg_match_all('%%',$b,$m)) foreach($m[1] as $av) echo " ***** aviso ***** $av\n"; if ($b == $b1) die("No he hecho nada\n"); rename($argv[1],"$argv[1]~"); fwrite($fp=fopen($argv[1],"w"),$b); fclose($fp); if ($st=@stat("$argv[1]~")) chmod($argv[1],$st['mode']); ?>