texte = $debut; $result[] = $champ; } $champ = new Champ; $champ->nom_champ = $nom_champ; $champ->fonctions = $champs_pretraitement[$nom_champ]; if (!$flag_brut AND $champs_traitement[$nom_champ]) { reset($champs_traitement[$nom_champ]); while (list(, $f) = each($champs_traitement[$nom_champ])) { $champ->fonctions[] = $f; } } if ($champs_posttraitement[$nom_champ]) { reset($champs_posttraitement[$nom_champ]); while (list(, $f) = each($champs_posttraitement[$nom_champ])) { $champ->fonctions[] = $f; } } $champs_count++; $champ->id_champ = $champs_count; $champs[$champs_count] = $champ; $result[] = $champ; $debut = ''; } else { $debut .= substr($texte, 0, $p + strlen($s)); } $texte = substr($texte, $p + strlen($s)); } else { $champ = new Texte; $champ->texte = $debut.$texte; if ($champ->texte) $result[] = $champ; break; } } return $result; } function parser_champs_etendus($texte) { global $champs; global $champs_count; global $champs_valides; global $champs_traitement; global $champs_pretraitement; global $champs_posttraitement; $debut = ''; while ($texte) { $r = ereg('(\[([^\[]*)\(#([a-zA-Z_]+)(\*?)([^])]*)\)([^]]*)\])', $texte, $regs); if ($r) { $cond_avant = $regs[2]; $nom_champ = $regs[3]; $flag_brut = $regs[4]; $fonctions = $regs[5]; $cond_apres = $regs[6]; $s = $regs[1]; $p = strpos($texte, $s); if ($champs_valides[$nom_champ]) { $debut .= substr($texte, 0, $p); if ($debut) { $c = parser_champs($debut); reset($c); while (list(, $val) = each($c)) $result[] = $val; } $champ = new Champ; $champ->nom_champ = $nom_champ; $champ->cond_avant = parser_champs($cond_avant); $champ->cond_apres = parser_champs($cond_apres); $champ->fonctions = $champs_pretraitement[$nom_champ]; if (!$flag_brut AND $champs_traitement[$nom_champ]) { reset($champs_traitement[$nom_champ]); while (list(, $f) = each($champs_traitement[$nom_champ])) { $champ->fonctions[] = $f; } } if ($champs_posttraitement[$nom_champ]) { reset($champs_posttraitement[$nom_champ]); while (list(, $f) = each($champs_posttraitement[$nom_champ])) { $champ->fonctions[] = $f; } } if ($fonctions) { $fonctions = explode('|', ereg_replace("^\|", "", $fonctions)); reset($fonctions); while (list(, $f) = each($fonctions)) $champ->fonctions[] = $f; } $champs_count++; $champ->id_champ = $champs_count; $champs[$champs_count] = $champ; $result[] = $champ; $debut = ''; } else { $debut .= substr($texte, 0, $p + strlen($s)); } $texte = substr($texte, $p + strlen($s)); } else { $c = parser_champs($debut.$texte); reset($c); while (list(, $val) = each($c)) $result[] = $val; break; } } return $result; } function parser_param($params, $result, $idb) { $params2 = Array(); $i = 1; while (ereg("^[ \t\n]*\{[ \t\n]*([^ }])([^\"}]*)([\"}])(.*)$", $params, $args)) { if ($args[3] == "}") { $params = $args[4]; ereg("(.*[^ \t\n])[ \t\n]*$", $args[2], $m); $param = $args[1] . $m[1]; if ($param == 'tout') { $result->tout = true; } else if ($param == 'plat') { $result->plat = true; } else $params2[] = $param; } else { if ($args[1] == '"') { if (!ereg("[ \t\n]*\}(.*)$", $params, $m)) break; else { $params = $m[1]; $result->separateur = ereg_replace("'","\'",$args[2]); } } else { if (!ereg("([^\"]*\"[ \t\n]*)\}(.*)$", $args[4], $m)) break; else { $params = $m[2]; $params2[] = $args[1] . $args[2] . '"' . $m[1]; } } } $i++; } if ($params) { include_ecrire ("inc_presentation.php3"); install_debut_html("Paramètre incorrect"); echo "
$i" . 'e paramètre et suivants ( ' .
entites_html($params) .
') est incorrect dans la boucle ' .
entites_html($idb) .
'.';
install_fin_html();
exit;
}
$result->param = $params2;
}
function parser_boucle($texte, $id_parent) {
// Detecter la boucle
$p = strpos($texte, ' La boucle ' . entites_html($milieu) . ' est incorrecte.';
install_fin_html();
exit;
}
$commande = $match[0];
$id_boucle = $match[1];
$nom = $match[2];
$params = $match[3];
// Decomposer les structures conditionnelles
$s = "";
$p = strpos($debut, $s);
if ($p || (substr($debut, 0, strlen($s)) == $s)) {
$cond_avant = substr($debut, $p + strlen($s));
$debut = substr($debut, 0, $p);
}
$milieu = substr($milieu, strlen($commande));
$s = "BOUCLE$id_boucle: tag fermant manquant
");
$fin = substr($milieu, $p + strlen($s));
$milieu = substr($milieu, 0, $p);
$s = "";
$p = strpos($fin, $s);
if ($p || (substr($fin, 0, strlen($s)) == $s)) {
$cond_fin = substr($fin, 0, $p);
$fin = substr($fin, $p + strlen($s));
}
$s = "/B$id_boucle>";
$p = strpos($fin, $s);
if ($p || (substr($fin, 0, strlen($s)) == $s)) {
$cond_altern = substr($fin, 0, $p);
$fin = substr($fin, $p + strlen($s));
}
$result->commande = $commande;
$result->avant = $debut;
$result->apres = $fin;
$result->id_boucle = ereg_replace("-","_",$id_boucle);
// Déterminer le type de la boucle
$type = strtolower($nom);
if (substr($type, 0, 6) == 'boucle') {
// Récursion: pas de paramètre, donc presque rien à faire
$result->type_requete = 'boucle';
$result->param = substr($nom, 6);
} else {
if ($type == 'sites') $type = 'syndication';
$result->type_requete = $type;
parser_param($params, &$result, $id_boucle);
}
$result->cond_avant = parser_texte($cond_avant, $id_parent);
$result->cond_apres = parser_texte($cond_fin, $id_parent);
$result->cond_altern = parser_texte($cond_altern, $id_parent);
$result->milieu = parser_texte($milieu, $id_boucle);
return $result;
}
function parser_texte($texte, $id_boucle) {
global $boucles;
$i = 0;
while ($texte) {
if (!$boucle = parser_boucle($texte, $id_boucle)) {
$boucle = new Texte;
$boucle->texte = $texte;
if ($c = parser_champs_etendus($boucle->texte)) {
reset($c);
while (list(, $val) = each($c)) {
$result[$i] = $val;
$i++;
}
}
$texte = '';
} else {
if ($c = parser_champs_etendus($boucle->avant)) {
reset($c);
while (list(, $val) = each($c)) {
$result[$i] = $val;
$i++;
}
}
$texte = $boucle->apres;
$boucle->avant = '';
$boucle->apres = '';
$result[$i] = $boucle;
$i++;
if (!$boucles[$boucle->id_boucle])
$boucles[$boucle->id_boucle] = $boucle;
else die ('BOUCLE'.$boucle->id_boucle.': double definition
');
}
}
return $result;
}
function parser($texte) {
global $champs_valides;
global $champs_traitement, $champs_pretraitement, $champs_posttraitement;
//
// Construire un tableau associatif des codes de champ utilisables
//
$c = array('NOM_SITE_SPIP', 'URL_SITE_SPIP', 'EMAIL_WEBMASTER', 'CHARSET',
'ID_ARTICLE', 'ID_RUBRIQUE', 'ID_BREVE', 'ID_FORUM', 'ID_PARENT', 'ID_SECTEUR', 'ID_DOCUMENT', 'ID_TYPE',
'ID_AUTEUR', 'ID_MOT', 'ID_SYNDIC_ARTICLE', 'ID_SYNDIC', 'ID_SIGNATURE', 'ID_GROUPE',
'TITRE', 'SURTITRE', 'SOUSTITRE', 'DESCRIPTIF', 'CHAPO', 'TEXTE', 'PS', 'NOTES', 'INTRODUCTION', 'MESSAGE',
'DATE', 'DATE_REDAC', 'DATE_MODIF', 'DATE_NOUVEAUTES', 'INCLUS',
'LESAUTEURS', 'EMAIL', 'NOM_SITE', 'LIEN_TITRE', 'URL_SITE', 'LIEN_URL', 'NOM', 'BIO', 'TYPE', 'PGP',
'FORMULAIRE_ECRIRE_AUTEUR', 'FORMULAIRE_FORUM', 'FORMULAIRE_SITE', 'PARAMETRES_FORUM', 'FORMULAIRE_RECHERCHE', 'RECHERCHE', 'FORMULAIRE_INSCRIPTION', 'FORMULAIRE_SIGNATURE',
'LOGO_MOT', 'LOGO_RUBRIQUE', 'LOGO_RUBRIQUE_NORMAL', 'LOGO_RUBRIQUE_SURVOL',
'LOGO_AUTEUR', 'LOGO_AUTEUR_NORMAL', 'LOGO_AUTEUR_SURVOL', 'LOGO_SITE', 'LOGO_BREVE', 'LOGO_BREVE_RUBRIQUE', 'LOGO_DOCUMENT',
'LOGO_ARTICLE', 'LOGO_ARTICLE_RUBRIQUE', 'LOGO_ARTICLE_NORMAL', 'LOGO_ARTICLE_SURVOL',
'URL_ARTICLE', 'URL_RUBRIQUE', 'URL_BREVE', 'URL_FORUM', 'URL_SYNDIC', 'URL_MOT', 'URL_DOCUMENT', 'EMBED_DOCUMENT',
'IP', 'VISITES', 'POPULARITE', 'POPULARITE_ABSOLUE', 'POPULARITE_MAX', 'POPULARITE_SITE', 'POINTS', 'COMPTEUR_BOUCLE', 'TOTAL_BOUCLE', 'PETITION',
'LARGEUR', 'HAUTEUR', 'TAILLE', 'EXTENSION',
'DEBUT_SURLIGNE', 'FIN_SURLIGNE', 'TYPE_DOCUMENT', 'EXTENSION_DOCUMENT',
'FORMULAIRE_ADMIN', 'LOGIN_PRIVE', 'LOGIN_PUBLIC', 'URL_LOGOUT', 'PUCE'
);
reset($c);
while (list(, $val) = each($c)) {
unset($champs_traitement[$val]);
unset($champs_pretraitement[$val]);
unset($champs_posttraitement[$val]);
$champs_valides[$val] = $val;
}
//
// Construire un tableau associatif des pre-traitements de champs
//
// Textes utilisateur : ajouter la securite anti-script
$c = array('NOM_SITE_SPIP', 'URL_SITE_SPIP', 'EMAIL_WEBMASTER', 'CHARSET',
'TITRE', 'SURTITRE', 'SOUSTITRE', 'DESCRIPTIF', 'CHAPO', 'TEXTE', 'PS', 'NOTES', 'INTRODUCTION', 'MESSAGE',
'LESAUTEURS', 'EMAIL', 'NOM_SITE', 'LIEN_TITRE', 'URL_SITE', 'LIEN_URL', 'NOM', 'IP', 'BIO', 'TYPE', 'PGP',
'RECHERCHE'
);
reset($c);
while (list(, $val) = each($c)) {
$champs_pretraitement[$val][] = 'trim';
$champs_posttraitement[$val][] = 'interdire_scripts';
}
// Textes courts : ajouter le traitement typographique
$c = array('NOM_SITE_SPIP', 'SURTITRE', 'TITRE', 'SOUSTITRE', 'NOM_SITE', 'LIEN_TITRE', 'NOM');
reset($c);
while (list(, $val) = each($c)) {
$champs_traitement[$val][] = 'typo';
}
// Chapo : ne pas l'afficher si article virtuel
$c = array('CHAPO');
reset($c);
while (list(, $val) = each($c)) {
$champs_traitement[$val][] = 'nettoyer_chapo';
}
// Textes longs : ajouter le traitement typographique + mise en forme
$c = array('DESCRIPTIF', 'CHAPO', 'TEXTE', 'PS', 'BIO', 'MESSAGE');
reset($c);
while (list(, $val) = each($c)) {
$champs_traitement[$val][] = 'traiter_raccourcis';
}
// Dates : ajouter le vidage des dates egales a 00-00-0000
$c = array('DATE', 'DATE_REDAC', 'DATE_MODIF', 'DATE_NOUVEAUTES');
reset($c);
while (list(, $val) = each($c)) {
$champs_traitement[$val][] = 'vider_date';
}
// URL_SITE : vider les url == 'http://'
$c = array('URL_SITE_SPIP', 'URL_SITE', 'LIEN_URL');
reset($c);
while (list(, $val) = each($c)) {
$champs_traitement[$val][] = 'vider_url';
}
// URLs : remplacer les & par &
$c = array('URL_SITE_SPIP', 'URL_SITE', 'LIEN_URL', 'PARAMETRES_FORUM',
'URL_ARTICLE', 'URL_RUBRIQUE', 'URL_BREVE', 'URL_FORUM', 'URL_SYNDIC', 'URL_MOT', 'URL_DOCUMENT');
reset($c);
while (list(, $val) = each($c)) {
$champs_traitement[$val][] = 'htmlspecialchars';
}
// Parser le texte et retourner le tableau racine
return parser_texte($texte, '');
}
?>