[ Index ]
 

Code source de SPIP 1.8.3

Accédez au Source d'autres logiciels libres | Soutenez Angelica Josefina !

title

Body

[fermer]

/ecrire/ -> inc_spip_sax.php (source)

   1  <?php
   2  
   3  /***************************************************************************\
   4   *  SPIP, Systeme de publication pour l'internet                           *
   5   *                                                                         *
   6   *  Copyright (c) 2001-2005                                                *
   7   *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
   8   *                                                                         *
   9   *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
  10   *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
  11  \***************************************************************************/
  12  
  13  
  14  //
  15  // Ce fichier ne sera execute qu'une fois
  16  if (defined("INC_PHRASEUR_XML")) return;
  17  define("INC__PHRASEUR_XML", "1");
  18  
  19  
  20  class PhraseurXML {
  21  
  22  function debutElement($parser, $name, $attrs)
  23  {
  24    global $phraseur_xml;
  25    $depth = &$phraseur_xml->depth;
  26    $contenu = &$phraseur_xml->contenu;
  27    $ouvrant = &$phraseur_xml->ouvrant;
  28    $reperes = &$phraseur_xml->reperes;
  29    $res = &$phraseur_xml->res;
  30  
  31    $t = $ouvrant[$depth];
  32    // espace initial signifie: deja integree au resultat
  33    if ($t && $t[0] != ' ')
  34      {
  35        $res .= '<' . $t . '>';
  36        $ouvrant[$depth] = ' ' . $t;
  37      }
  38    $t = $contenu[$depth];
  39    // n'indenter que s'il y a un separateur avant
  40    $res .= ereg_replace("[\n\t ]+$",  "\n$depth", $t);
  41    $contenu[$depth] = "";
  42    $att = '';
  43    $sep = ' ';
  44    foreach ($attrs as $k => $v) {
  45      $delim = strpos($v, "'") === false ? "'" : '"';
  46      $att .= $sep .  $k . "=" . $delim
  47        . str_replace('"',  '&quot;', $phraseur_xml->translate_entities($v))
  48        . $delim;
  49      $sep = "\n $depth";
  50      }
  51    $depth .= '  ';
  52    $contenu[$depth] = "";
  53    $ouvrant[$depth] = $name . $att;
  54    $reperes[$depth] = xml_get_current_line_number($parser);
  55  }
  56  
  57  function finElement($parser, $name)
  58  {
  59    global $phraseur_xml;
  60    $depth = &$phraseur_xml->depth;
  61    $contenu = &$phraseur_xml->contenu;
  62    $ouvrant = &$phraseur_xml->ouvrant;
  63    $res = &$phraseur_xml->res;
  64  
  65    $ouv = $ouvrant[$depth];
  66    if ($ouv[0] != ' ')
  67        $ouvrant[$depth] = ' ' . $ouv;
  68    else $ouv= "";
  69    $t = $contenu[$depth];
  70    $depth = substr($depth, 2);
  71    $t = ereg_replace("[\n\t ]+$", "\n" . $depth, $t);
  72    // fusion <balise></balise> en <balise /> sauf pour qq unes qui hallucinent
  73    if ($t || ($name == 'a') || ($name == 'textarea'))
  74      $res .= ($ouv ? ('<' . $ouv . '>') : '') . $t . "</" . $name . ">";
  75    else
  76      $res .= ($ouv ? ('<' . $ouv  . ' />') : ("</" .  $name . ">"));
  77  }
  78  
  79  function textElement($parser, $data)
  80  {
  81    global $phraseur_xml;
  82    $depth = &$phraseur_xml->depth;
  83    $contenu = &$phraseur_xml->contenu;
  84    $contenu[$depth] .= $phraseur_xml->translate_entities($data);
  85  }
  86  
  87  function PiElement($parser, $target, $data)
  88  {
  89    global $phraseur_xml, $xml_parser;
  90    $depth = &$phraseur_xml->depth;
  91    $contenu = &$phraseur_xml->contenu;
  92    if (strtolower($target) != "php")
  93      $contenu[$depth] .= $data;
  94    else {
  95        ob_start();
  96        eval($data);
  97        $data = ob_get_contents();
  98        ob_end_clean();
  99        $contenu[$depth] .= $data;
 100    }
 101  }
 102  
 103  
 104  function defautElement($parser, $data)
 105  {
 106    global $phraseur_xml;
 107    $depth = &$phraseur_xml->depth;
 108    $contenu = &$phraseur_xml->contenu;
 109  
 110    $contenu[$depth] .= $data;
 111  }
 112  
 113   function translate_entities($data)
 114   {
 115     return
 116      str_replace('<', '&lt;', 
 117          str_replace('>', '&gt;', 
 118                  ereg_replace('[&]([A-Za-z0-9]*[^A-Za-z0-9;])',
 119                       "&amp;\\1",
 120                       $data)));
 121   }
 122  
 123  function xml_parsefile($xml_parser, $file)
 124  {
 125    if (!($fp = fopen($file, "r"))) {
 126     die("Impossible d'ouvrir le fichier XML");
 127    }
 128    while ($data = fread($fp, 4096)) {
 129      if (!xml_parse($xml_parser, str_replace('&#8217;',"'",$data), feof($fp))) {
 130        return (sprintf("erreur XML : %s ligne %d",
 131                xml_error_string(xml_get_error_code($xml_parser)),
 132                xml_get_current_line_number($xml_parser)));
 133      }
 134    }
 135    return "";
 136  }
 137  
 138  function xml_parsestring($xml_parser, $data)
 139  {
 140      global $phraseur_xml;
 141      $r = "";
 142      if (!xml_parse($xml_parser, $data, true)) {
 143        // ne pas commencer le message par un "<" (cf spip_sax)
 144        $r = xml_error_string(xml_get_error_code($xml_parser)) .
 145          _L(" ligne ") .
 146          xml_get_current_line_number($xml_parser) .
 147          _L(" colonne ") .
 148          xml_get_current_column_number($xml_parser) .
 149          '<br />' .
 150          _L("derni&egrave;re balise non referm&eacute;e&nbsp;: ") .
 151          "<tt>" .
 152          $phraseur_xml->ouvrant[$phraseur_xml->depth] .
 153          "</tt>" .
 154          _L(" ligne ") .
 155          $phraseur_xml->reperes[$phraseur_xml->depth];
 156  
 157      } else $r = $phraseur_xml->res;
 158  
 159      xml_parser_free($xml_parser);
 160      return $r;
 161  }
 162  
 163  var $depth = "";
 164  var $res = "";
 165  var $contenu = array();
 166  var $ouvrant = array();
 167  var $reperes = array();
 168  }
 169  
 170  // xml_set_objet a utiliser a terme
 171  global $phraseur_xml, $xml_parser;
 172  $phraseur_xml = new PhraseurXML();
 173  
 174  $xml_parser = xml_parser_create(lire_meta('charset'));
 175  xml_set_element_handler($xml_parser,
 176              array($phraseur_xml, "debutElement"),
 177              array($phraseur_xml, "finElement"));
 178  xml_set_character_data_handler($xml_parser, array($phraseur_xml, "textElement"));
 179  xml_set_processing_instruction_handler($xml_parser, array($phraseur_xml, 'PiElement'));
 180  xml_set_default_handler($xml_parser, array($phraseur_xml, "defautElement"));
 181  xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
 182  
 183  function spip_sax($page)
 184  {
 185      global $phraseur_xml, $xml_parser, $xhtml_error;
 186      $res = $phraseur_xml->xml_parsestring($xml_parser, $page);
 187      if ($res[0] != '<')
 188        $xhtml_error = $res;
 189      else
 190        $page = $res;
 191      return $page;
 192  }
 193  
 194  // exemple d'appel en ligne de commande:
 195  #$error = $phraseur_xml->xml_parsefile($xml_parser, $_SERVER['argv'][1]);
 196  
 197  ?>


Généré le : Thu Feb 22 22:27:47 2007 par Balluche grâce à PHPXref 0.7