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, 'id_parent = $id_parent; $debut = substr($texte, 0, $p); $milieu = substr($texte, $p); if (!ereg("^", $milieu, $match)) { include_ecrire ("inc_presentation.php3"); install_debut_html("Boucle incorrecte"); echo '

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 = ""; $p = strpos($milieu, $s); if ((!$p) && (substr($milieu, 0, strlen($s)) != $s)) die("

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 = ""; $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, ''); } ?>