Subversion Repositories Sites.tela-botanica.org

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4 david 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
?>