[ Index ] |
|
Code source de SPIP 1.8.3 |
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('"', '"', $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('<', '<', 117 str_replace('>', '>', 118 ereg_replace('[&]([A-Za-z0-9]*[^A-Za-z0-9;])', 119 "&\\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('’',"'",$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ère balise non refermée : ") . 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 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Thu Feb 22 22:27:47 2007 | par Balluche grâce à PHPXref 0.7 |