mirror of
https://github.com/YunoHost-Apps/spip_ynh.git
synced 2024-09-03 20:25:59 +02:00
176 lines
5.6 KiB
PHP
176 lines
5.6 KiB
PHP
<?php
|
|
|
|
/***************************************************************************\
|
|
* SPIP, Systeme de publication pour l'internet *
|
|
* *
|
|
* Copyright (c) 2001-2014 *
|
|
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
|
|
* *
|
|
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
|
|
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
|
|
\***************************************************************************/
|
|
|
|
if (!defined('_ECRIRE_INC_VERSION')) return;
|
|
|
|
// http://doc.spip.org/@spip_xml_load
|
|
function spip_xml_load($fichier, $strict=true, $clean=true, $taille_max = 1048576, $datas='', $profondeur = -1){
|
|
$contenu = "";
|
|
if (preg_match(",^(http|ftp)://,",$fichier)){
|
|
include_spip('inc/distant');
|
|
$contenu = recuperer_page($fichier,false,false,$taille_max, $datas);
|
|
}
|
|
else lire_fichier ($fichier, $contenu);
|
|
$arbre = array();
|
|
if ($contenu)
|
|
$arbre = spip_xml_parse($contenu, $strict, $clean, $profondeur);
|
|
|
|
return count($arbre)?$arbre:false;
|
|
}
|
|
|
|
if (!defined('_SPIP_XML_TAG_SPLIT')) define('_SPIP_XML_TAG_SPLIT', "{<([^:>][^>]*?)>}sS");
|
|
// http://doc.spip.org/@spip_xml_parse
|
|
function spip_xml_parse(&$texte, $strict=true, $clean=true, $profondeur = -1){
|
|
$out = array();
|
|
// enlever les commentaires
|
|
$charset = 'AUTO';
|
|
if ($clean===true){
|
|
if (preg_match(",<\?xml\s(.*?)encoding=['\"]?(.*?)['\"]?(\s(.*))?\?>,im",$texte,$regs))
|
|
$charset = $regs[2];
|
|
$texte = preg_replace(',<!--(.*?)-->,is','',$texte);
|
|
$texte = preg_replace(',<\?(.*?)\?>,is','',$texte);
|
|
include_spip('inc/charsets');
|
|
$clean = $charset;
|
|
//$texte = importer_charset($texte,$charset);
|
|
}
|
|
if (is_string($clean)) $charset = $clean;
|
|
$txt = $texte;
|
|
|
|
// tant qu'il y a des tags
|
|
$chars = preg_split(_SPIP_XML_TAG_SPLIT,$txt,2,PREG_SPLIT_DELIM_CAPTURE);
|
|
while(count($chars)>=2){
|
|
// tag ouvrant
|
|
//$chars = preg_split("{<([^>]*?)>}s",$txt,2,PREG_SPLIT_DELIM_CAPTURE);
|
|
|
|
// $before doit etre vide ou des espaces uniquements!
|
|
$before = trim($chars[0]);
|
|
|
|
if (strlen($before)>0)
|
|
return importer_charset($texte,$charset);//$texte; // before non vide, donc on est dans du texte
|
|
|
|
$tag = rtrim($chars[1]);
|
|
$txt = $chars[2];
|
|
|
|
if (strncmp($tag,'![CDATA[',8)==0) return importer_charset($texte,$charset);//$texte;
|
|
if(substr($tag,-1)=='/'){ // self closing tag
|
|
$tag = rtrim(substr($tag,0,strlen($tag)-1));
|
|
$out[$tag][]="";
|
|
}
|
|
else{
|
|
$closing_tag = preg_split(",\s|\t|\n|\r,",trim($tag));
|
|
$closing_tag=reset($closing_tag);
|
|
// tag fermant
|
|
$ncclos = strlen("</$closing_tag>");
|
|
$p = strpos($txt,"</$closing_tag>");
|
|
if ($p!==FALSE AND (strpos($txt,"<")<$p)){
|
|
$nclose =0; $nopen = 0;
|
|
$d = 0;
|
|
while (
|
|
$p!==FALSE
|
|
AND ($morceau = substr($txt,$d,$p-$d))
|
|
AND (($nopen+=preg_match_all("{<".preg_quote($closing_tag)."(\s*>|\s[^>]*[^/>]>)}is",$morceau,$matches,PREG_SET_ORDER))>$nclose)
|
|
){
|
|
$nclose++;
|
|
$d=$p+$ncclos;
|
|
$p = strpos($txt,"</$closing_tag>",$d);
|
|
}
|
|
}
|
|
if ($p===FALSE){
|
|
if ($strict){
|
|
$out[$tag][]="erreur : tag fermant $tag manquant::$txt";
|
|
return $out;
|
|
}
|
|
else return importer_charset($texte,$charset);//$texte // un tag qui constitue du texte a reporter dans $before
|
|
}
|
|
$content = substr($txt,0,$p);
|
|
$txt = substr($txt,$p+$ncclos);
|
|
if ($profondeur==0 OR strpos($content,"<")===FALSE) // eviter une recursion si pas utile
|
|
$out[$tag][] = importer_charset($content,$charset);//$content;
|
|
else
|
|
$out[$tag][]=spip_xml_parse($content, $strict, $clean, $profondeur-1);
|
|
}
|
|
$chars = preg_split(_SPIP_XML_TAG_SPLIT,$txt,2,PREG_SPLIT_DELIM_CAPTURE);
|
|
}
|
|
if (count($out)&&(strlen(trim($txt))==0))
|
|
return $out;
|
|
else
|
|
return importer_charset($texte,$charset);//$texte;
|
|
}
|
|
|
|
// http://doc.spip.org/@spip_xml_aplatit
|
|
function spip_xml_aplatit($arbre,$separateur = " "){
|
|
$s = "";
|
|
if (is_array($arbre))
|
|
foreach($arbre as $tag=>$feuille){
|
|
if (is_array($feuille)){
|
|
if ($tag!==intval($tag)){
|
|
$f = spip_xml_aplatit($feuille, $separateur);
|
|
if (strlen($f)) {
|
|
$tagf = explode(" ",$tag);
|
|
$tagf = $tagf[0];
|
|
$s.="<$tag>$f</$tagf>";
|
|
}
|
|
else $s.="<$tag />";
|
|
}
|
|
else
|
|
$s.=spip_xml_aplatit($feuille);
|
|
$s .= $separateur;
|
|
}
|
|
else
|
|
$s.="$feuille$separateur";
|
|
}
|
|
return strlen($separateur) ? substr($s, 0, -strlen($separateur)) : $s;
|
|
}
|
|
|
|
// http://doc.spip.org/@spip_xml_tagname
|
|
function spip_xml_tagname($tag){
|
|
if (preg_match(',^([a-z][\w:]*),i',$tag,$reg))
|
|
return $reg[1];
|
|
return "";
|
|
}
|
|
// http://doc.spip.org/@spip_xml_decompose_tag
|
|
function spip_xml_decompose_tag($tag){
|
|
$tagname = spip_xml_tagname($tag);
|
|
$liste = array();
|
|
$p=strpos($tag,' ');
|
|
$tag = substr($tag,$p);
|
|
$p=strpos($tag,'=');
|
|
while($p!==false){
|
|
$attr = trim(substr($tag,0,$p));
|
|
$tag = ltrim(substr($tag,$p+1));
|
|
$quote = $tag{0};
|
|
$p=strpos($tag,$quote,1);
|
|
$cont = substr($tag,1,$p-1);
|
|
$liste[$attr] = $cont;
|
|
$tag = substr($tag,$p+1);
|
|
$p=strpos($tag,'=');
|
|
}
|
|
return array($tagname,$liste);
|
|
}
|
|
|
|
// http://doc.spip.org/@spip_xml_match_nodes
|
|
function spip_xml_match_nodes($regexp,&$arbre,&$matches,$init=true){
|
|
if ($init)
|
|
$matches = array();
|
|
if(is_array($arbre) && count($arbre))
|
|
foreach(array_keys($arbre) as $tag){
|
|
if (preg_match($regexp,$tag))
|
|
$matches[$tag] = &$arbre[$tag];
|
|
if (is_array($arbre[$tag]))
|
|
foreach(array_keys($arbre[$tag]) as $occurences)
|
|
spip_xml_match_nodes($regexp,$arbre[$tag][$occurences],$matches,false);
|
|
}
|
|
return (count($matches));
|
|
}
|
|
|
|
|
|
?>
|