From 4835d7a7a5bd56b0f782f1ba6802c5a365a516d0 Mon Sep 17 00:00:00 2001 From: "Committo,Ergo:sum" <esj@rezo.net> Date: Fri, 7 Sep 2007 21:50:28 +0000 Subject: [PATCH] =?UTF-8?q?Eclater=20le=20fichier=20balises.php,=20en=20en?= =?UTF-8?q?levant=20surtout=20les=20balises=20qui=20pose=20un=20pb=20en=20?= =?UTF-8?q?compilation=20distante.=20Leur=20code=20n'a=20pas=20chang=C3=A9?= =?UTF-8?q?=20dans=20ce=20d=C3=A9pot.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitattributes | 2 + ecrire/balise/logo_.php | 141 +++++++++++++++++ ecrire/balise/url_.php | 172 +++++++++++++++++++++ ecrire/public/balises.php | 284 +---------------------------------- ecrire/public/references.php | 8 +- 5 files changed, 322 insertions(+), 285 deletions(-) create mode 100644 ecrire/balise/logo_.php create mode 100644 ecrire/balise/url_.php diff --git a/.gitattributes b/.gitattributes index ea50ac54c6..30b22a98e8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -413,6 +413,8 @@ ecrire/action/tester_taille.php -text ecrire/action/tourner.php -text ecrire/action/virtualiser.php -text ecrire/balise/index.php -text +ecrire/balise/logo_.php -text +ecrire/balise/url_.php -text ecrire/base/admin_repair.php -text ecrire/base/convert_sql_utf8.php -text ecrire/base/convert_utf8.php -text diff --git a/ecrire/balise/logo_.php b/ecrire/balise/logo_.php new file mode 100644 index 0000000000..ff408b2cba --- /dev/null +++ b/ecrire/balise/logo_.php @@ -0,0 +1,141 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2007 * + * 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; + +// +// Fonction des balises #LOGO_XXXX +// (les balises portant ce type de nom sont traitees en bloc ici) +// + +function balise_logo__dist ($p) { + + preg_match(",^LOGO_([A-Z]+)(_.*)?$,i", $p->nom_champ, $regs); + $type_objet = $regs[1]; + $suite_logo = @$regs[2]; + + // cas de #LOGO_SITE_SPIP + if (preg_match(",^_SPIP(.*)$,", $suite_logo, $regs)) { + $type_objet = 'SITE'; + $suite_logo = $regs[1]; + $_id_objet = "\"'0'\""; + $id_objet = 'id_syndic'; # parait faux mais donne bien "siteNN" + } else { + if ($type_objet == 'SITE') + $id_objet = "id_syndic"; + else + $id_objet = "id_".strtolower($type_objet); + $_id_objet = champ_sql($id_objet, $p); + } + + // analyser les faux filtres + $flag_fichier = $flag_stop = $flag_lien_auto = $code_lien = $filtres = $align = $lien = $params = ''; + + if (is_array($p->fonctions)) { + foreach($p->fonctions as $couple) { + if (!$flag_stop) { + $nom = trim($couple[0]); + + // double || signifie "on passe aux vrais filtres" + if ($nom == '') { + if ($couple[1]) { + $params = $couple[1]; // recuperer #LOGO_DOCUMENT{20,30} + array_shift($p->param); + } + else + $flag_stop = true; + } else { + // faux filtres + array_shift($p->param); + switch($nom) { + case 'left': + case 'right': + case 'center': + case 'top': + case 'bottom': + $align = $nom; + break; + + case 'lien': + $flag_lien_auto = 'oui'; + $flag_stop = true; # apres |lien : vrais filtres + break; + + case 'fichier': + $flag_fichier = 1; + $flag_stop = true; # apres |fichier : vrais filtres + break; + + default: + $lien = $nom; + $flag_stop = true; # apres |#URL... : vrais filtres + break; + } + } + } + } + } + + // + // Preparer le code du lien + // + // 1. filtre |lien + if ($flag_lien_auto AND !$lien) + $code_lien = '($lien = generer_url_'.$type_objet.'('.$_id_objet.')) ? $lien : ""'; + // 2. lien indique en clair (avec des balises : imprimer#ID_ARTICLE.html) + else if ($lien) { + $code_lien = "'".texte_script(trim($lien))."'"; + while (preg_match(",^([^#]*)#([A-Za-z_]+)(.*)$,", $code_lien, $match)) { + $c = new Champ(); + $c->nom_champ = $match[2]; + $c->id_boucle = $p->id_boucle; + $c->boucles = &$p->boucles; + $c->descr = $p->descr; + $c = calculer_champ($c); + $code_lien = str_replace('#'.$match[2], "'.".$c.".'", $code_lien); + } + // supprimer les '' disgracieux + $code_lien = preg_replace("@^''\.|\.''$@", "", $code_lien); + } + + if ($flag_fichier) + $code_lien = "'',''" ; + else { + if (!$code_lien) + $code_lien = "''"; + $code_lien .= ", '". $align . "'"; + } + + // cas des documents + if ($type_objet == 'DOCUMENT') { + $p->code = "calcule_logo_document($_id_objet, '" . + $p->descr['documents'] . + '\', $doublons, '. intval($flag_fichier).", $code_lien, '". + // #LOGO_DOCUMENT{x,y} donne la taille maxi + texte_script($params) + ."')"; + } + else { + $p->code = "affiche_logos(calcule_logo('$id_objet', '" . + (($suite_logo == '_SURVOL') ? 'off' : + (($suite_logo == '_NORMAL') ? 'on' : 'ON')) . + "', $_id_objet," . + (($suite_logo == '_RUBRIQUE') ? + champ_sql("id_rubrique", $p) : + (($type_objet == 'RUBRIQUE') ? "quete_parent($_id_objet)" : "''")) . + ", '$flag_fichier'), $code_lien)"; + } + + $p->interdire_scripts = false; + return $p; +} +?> diff --git a/ecrire/balise/url_.php b/ecrire/balise/url_.php new file mode 100644 index 0000000000..56a775d967 --- /dev/null +++ b/ecrire/balise/url_.php @@ -0,0 +1,172 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2007 * + * 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; + +function balise_URL__dist($p) { + + if ($f = charger_fonction($p->nom_champ, 'balise', true)) + return $f($p); + else return NULL; +} + +// http://doc.spip.org/@balise_URL_SITE_SPIP_dist +function balise_URL_SITE_SPIP_dist($p) { + $p->code = "sinon(\$GLOBALS['meta']['adresse_site'],'.')"; + $p->code = "htmlspecialchars(".$p->code.")"; + $p->interdire_scripts = false; + return $p; +} + +// http://doc.spip.org/@balise_URL_ARTICLE_dist +function balise_URL_ARTICLE_dist($p) { + + // Cas particulier des boucles (SYNDIC_ARTICLES) + if ($p->type_requete == 'syndic_articles') { + $p->code = champ_sql('url', $p); + } else $p->code = generer_generer_url('article', $p); + + $p->interdire_scripts = false; + return $p; +} + +// http://doc.spip.org/@balise_URL_AUTEUR_dist +function balise_URL_AUTEUR_dist($p) { + + $p->code = generer_generer_url('auteur', $p); + $p->interdire_scripts = false; + return $p; +} + +// http://doc.spip.org/@balise_URL_RUBRIQUE_dist +function balise_URL_RUBRIQUE_dist($p) { + + $p->code = generer_generer_url('rubrique', $p); + $p->interdire_scripts = false; + return $p; +} + +// http://doc.spip.org/@balise_URL_BREVE_dist +function balise_URL_BREVE_dist($p) { + + $p->code = generer_generer_url('breve', $p); + $p->interdire_scripts = false; + return $p; +} + +// http://doc.spip.org/@balise_URL_MOT_dist +function balise_URL_MOT_dist($p) { + + $p->code = generer_generer_url('mot', $p); + $p->interdire_scripts = false; + return $p; +} + +// http://doc.spip.org/@balise_URL_FORUM_dist +function balise_URL_FORUM_dist($p) { + + $p->code = generer_generer_url('forum', $p); + $p->interdire_scripts = false; + return $p; +} + +// http://doc.spip.org/@balise_URL_DOCUMENT_dist +function balise_URL_DOCUMENT_dist($p) { + + $p->code = generer_generer_url('document', $p); + $p->interdire_scripts = false; + return $p; +} + +# URL_SITE est une donnee "brute" tiree de la base de donnees +# URL_SYNDIC correspond a l'adresse de son backend. +# Il n'existe pas de balise pour afficher generer_url_site($id_syndic), +# a part [(#ID_SYNDIC|generer_url_site)] + + +// +// #URL_PAGE{backend} -> backend.php3 ou ?page=backend selon les cas +// Pour les pages qui commencent par "spip_", il faut eventuellement +// aller chercher spip_action.php?action=xxxx +// +// http://doc.spip.org/@balise_URL_PAGE_dist +function balise_URL_PAGE_dist($p) { + + if ($p->boucles[$p->id_boucle]->sql_serveur) { + $p->code = 'generer_url_public("404")'; + return $p; + } + + $p->code = interprete_argument_balise(1,$p); + $args = interprete_argument_balise(2,$p); + if ($args != "''" && $args!==NULL) + $p->code .= ','.$args; + + // autres filtres (???) + array_shift($p->param); + + $p->code = 'generer_url_public(' . $p->code .')'; + + #$p->interdire_scripts = true; + return $p; +} + +// +// #URL_ECRIRE{naviguer} -> ecrire/?exec=naviguer +// +// http://doc.spip.org/@balise_URL_ECRIRE_dist +function balise_URL_ECRIRE_dist($p) { + + if ($p->boucles[$p->id_boucle]->sql_serveur) { + $p->code = 'generer_url_public("404")'; + return $p; + } + + $p->code = interprete_argument_balise(1,$p); + $args = interprete_argument_balise(2,$p); + if ($args != "''" && $args!==NULL) + $p->code .= ','.$args; + + // autres filtres (???) + array_shift($p->param); + + $p->code = 'generer_url_ecrire(' . $p->code .')'; + + #$p->interdire_scripts = true; + return $p; +} + +// +// #URL_ACTION_AUTEUR{converser,arg,redirect} -> ecrire/?action=converser&arg=arg&hash=xxx&redirect=redirect +// +// http://doc.spip.org/@balise_URL_ACTION_AUTEUR_dist +function balise_URL_ACTION_AUTEUR_dist($p) { + + if ($p->boucles[$p->id_boucle]->sql_serveur) { + $p->code = 'generer_url_public("404")'; + return $p; + } + + $p->code = interprete_argument_balise(1,$p); + $args = interprete_argument_balise(2,$p); + if ($args != "''" && $args!==NULL) + $p->code .= ".'\",\"'.".$args; + $redirect = interprete_argument_balise(3,$p); + if ($redirect != "''" && $redirect!==NULL) + $p->code .= ".'\",\"'.".$redirect; + + $p->code = "'<"."?php echo generer_action_auteur(\"'." . $p->code .".'\"); ?>'"; + + $p->interdire_scripts = false; + return $p; +} +?> diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php index d42991db34..f69b5e1b82 100644 --- a/ecrire/public/balises.php +++ b/ecrire/public/balises.php @@ -10,7 +10,6 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ - // // Ce fichier regroupe la quasi totalite des definitions de #BALISES de spip // Pour chaque balise, il est possible de surcharger, dans mes_fonctions, @@ -26,9 +25,9 @@ if (!defined("_ECRIRE_INC_VERSION")) return; function interprete_argument_balise($n,$p) { if (($p->param) && (!$p->param[0][0]) && (count($p->param[0])>$n)) return calculer_liste($p->param[0][$n], - $p->descr, - $p->boucles, - $p->id_boucle); + $p->descr, + $p->boucles, + $p->id_boucle); else return NULL; } @@ -161,78 +160,6 @@ function balise_SPIP_VERSION_dist($p) { return $p; } -// http://doc.spip.org/@balise_URL_SITE_SPIP_dist -function balise_URL_SITE_SPIP_dist($p) { - $p->code = "sinon(\$GLOBALS['meta']['adresse_site'],'.')"; - $p->code = "htmlspecialchars(".$p->code.")"; - $p->interdire_scripts = false; - return $p; -} - -// http://doc.spip.org/@balise_URL_ARTICLE_dist -function balise_URL_ARTICLE_dist($p) { - - // Cas particulier des boucles (SYNDIC_ARTICLES) - if ($p->type_requete == 'syndic_articles') { - $p->code = champ_sql('url', $p); - } else $p->code = generer_generer_url('article', $p); - - $p->interdire_scripts = false; - return $p; -} - -// http://doc.spip.org/@balise_URL_AUTEUR_dist -function balise_URL_AUTEUR_dist($p) { - - $p->code = generer_generer_url('auteur', $p); - $p->interdire_scripts = false; - return $p; -} - -// http://doc.spip.org/@balise_URL_RUBRIQUE_dist -function balise_URL_RUBRIQUE_dist($p) { - - $p->code = generer_generer_url('rubrique', $p); - $p->interdire_scripts = false; - return $p; -} - -// http://doc.spip.org/@balise_URL_BREVE_dist -function balise_URL_BREVE_dist($p) { - - $p->code = generer_generer_url('breve', $p); - $p->interdire_scripts = false; - return $p; -} - -// http://doc.spip.org/@balise_URL_MOT_dist -function balise_URL_MOT_dist($p) { - - $p->code = generer_generer_url('mot', $p); - $p->interdire_scripts = false; - return $p; -} - -// http://doc.spip.org/@balise_URL_FORUM_dist -function balise_URL_FORUM_dist($p) { - - $p->code = generer_generer_url('forum', $p); - $p->interdire_scripts = false; - return $p; -} - -// http://doc.spip.org/@balise_URL_DOCUMENT_dist -function balise_URL_DOCUMENT_dist($p) { - - $p->code = generer_generer_url('document', $p); - $p->interdire_scripts = false; - return $p; -} - -# URL_SITE est une donnee "brute" tiree de la base de donnees -# URL_SYNDIC correspond a l'adresse de son backend. -# Il n'existe pas de balise pour afficher generer_url_site($id_syndic), -# a part [(#ID_SYNDIC|generer_url_site)] // #NOM_SITE affiche le nom du site, ou sinon l'URL ou le titre de l'objet // http://doc.spip.org/@balise_NOM_SITE_dist @@ -648,134 +575,6 @@ function balise_GRAND_TOTAL_dist($p) { } - -// -// Fonction commune aux balises #LOGO_XXXX -// (les balises portant ce type de nom sont traitees en bloc ici) -// -// http://doc.spip.org/@calculer_balise_logo_dist -function calculer_balise_logo_dist ($p) { - - preg_match(",^LOGO_([A-Z]+)(_.*)?$,i", $p->nom_champ, $regs); - $type_objet = $regs[1]; - $suite_logo = @$regs[2]; - - // cas de #LOGO_SITE_SPIP - if (preg_match(",^_SPIP(.*)$,", $suite_logo, $regs)) { - $type_objet = 'SITE'; - $suite_logo = $regs[1]; - $_id_objet = "\"'0'\""; - $id_objet = 'id_syndic'; # parait faux mais donne bien "siteNN" - } else { - if ($type_objet == 'SITE') - $id_objet = "id_syndic"; - else - $id_objet = "id_".strtolower($type_objet); - $_id_objet = champ_sql($id_objet, $p); - } - - // analyser les faux filtres - $flag_fichier = $flag_stop = $flag_lien_auto = $code_lien = $filtres = $align = $lien = $params = ''; - - if (is_array($p->fonctions)) { - foreach($p->fonctions as $couple) { - if (!$flag_stop) { - $nom = trim($couple[0]); - - // double || signifie "on passe aux vrais filtres" - if ($nom == '') { - if ($couple[1]) { - $params = $couple[1]; // recuperer #LOGO_DOCUMENT{20,30} - array_shift($p->param); - } - else - $flag_stop = true; - } else { - // faux filtres - array_shift($p->param); - switch($nom) { - case 'left': - case 'right': - case 'center': - case 'top': - case 'bottom': - $align = $nom; - break; - - case 'lien': - $flag_lien_auto = 'oui'; - $flag_stop = true; # apres |lien : vrais filtres - break; - - case 'fichier': - $flag_fichier = 1; - $flag_stop = true; # apres |fichier : vrais filtres - break; - - default: - $lien = $nom; - $flag_stop = true; # apres |#URL... : vrais filtres - break; - } - } - } - } - } - - // - // Preparer le code du lien - // - // 1. filtre |lien - if ($flag_lien_auto AND !$lien) - $code_lien = '($lien = generer_url_'.$type_objet.'('.$_id_objet.')) ? $lien : ""'; - // 2. lien indique en clair (avec des balises : imprimer#ID_ARTICLE.html) - else if ($lien) { - $code_lien = "'".texte_script(trim($lien))."'"; - while (preg_match(",^([^#]*)#([A-Za-z_]+)(.*)$,", $code_lien, $match)) { - $c = new Champ(); - $c->nom_champ = $match[2]; - $c->id_boucle = $p->id_boucle; - $c->boucles = &$p->boucles; - $c->descr = $p->descr; - $c = calculer_champ($c); - $code_lien = str_replace('#'.$match[2], "'.".$c.".'", $code_lien); - } - // supprimer les '' disgracieux - $code_lien = preg_replace("@^''\.|\.''$@", "", $code_lien); - } - - if ($flag_fichier) - $code_lien = "'',''" ; - else { - if (!$code_lien) - $code_lien = "''"; - $code_lien .= ", '". $align . "'"; - } - - // cas des documents - if ($type_objet == 'DOCUMENT') { - $p->code = "calcule_logo_document($_id_objet, '" . - $p->descr['documents'] . - '\', $doublons, '. intval($flag_fichier).", $code_lien, '". - // #LOGO_DOCUMENT{x,y} donne la taille maxi - texte_script($params) - ."')"; - } - else { - $p->code = "affiche_logos(calcule_logo('$id_objet', '" . - (($suite_logo == '_SURVOL') ? 'off' : - (($suite_logo == '_NORMAL') ? 'on' : 'ON')) . - "', $_id_objet," . - (($suite_logo == '_RUBRIQUE') ? - champ_sql("id_rubrique", $p) : - (($type_objet == 'RUBRIQUE') ? "quete_parent($_id_objet)" : "''")) . - ", '$flag_fichier'), $code_lien)"; - } - - $p->interdire_scripts = false; - return $p; -} - // #EXTRA // [(#EXTRA|extra{isbn})] // ou [(#EXTRA|isbn)] (ce dernier applique les filtres definis dans mes_options) @@ -891,83 +690,6 @@ function balise_SELF_dist($p) { } -// -// #URL_PAGE{backend} -> backend.php3 ou ?page=backend selon les cas -// Pour les pages qui commencent par "spip_", il faut eventuellement -// aller chercher spip_action.php?action=xxxx -// -// http://doc.spip.org/@balise_URL_PAGE_dist -function balise_URL_PAGE_dist($p) { - - if ($p->boucles[$p->id_boucle]->sql_serveur) { - $p->code = 'generer_url_public("404")'; - return $p; - } - - $p->code = interprete_argument_balise(1,$p); - $args = interprete_argument_balise(2,$p); - if ($args != "''" && $args!==NULL) - $p->code .= ','.$args; - - // autres filtres (???) - array_shift($p->param); - - $p->code = 'generer_url_public(' . $p->code .')'; - - #$p->interdire_scripts = true; - return $p; -} - -// -// #URL_ECRIRE{naviguer} -> ecrire/?exec=naviguer -// -// http://doc.spip.org/@balise_URL_ECRIRE_dist -function balise_URL_ECRIRE_dist($p) { - - if ($p->boucles[$p->id_boucle]->sql_serveur) { - $p->code = 'generer_url_public("404")'; - return $p; - } - - $p->code = interprete_argument_balise(1,$p); - $args = interprete_argument_balise(2,$p); - if ($args != "''" && $args!==NULL) - $p->code .= ','.$args; - - // autres filtres (???) - array_shift($p->param); - - $p->code = 'generer_url_ecrire(' . $p->code .')'; - - #$p->interdire_scripts = true; - return $p; -} - -// -// #URL_ACTION_AUTEUR{converser,arg,redirect} -> ecrire/?action=converser&arg=arg&hash=xxx&redirect=redirect -// -// http://doc.spip.org/@balise_URL_ACTION_AUTEUR_dist -function balise_URL_ACTION_AUTEUR_dist($p) { - - if ($p->boucles[$p->id_boucle]->sql_serveur) { - $p->code = 'generer_url_public("404")'; - return $p; - } - - $p->code = interprete_argument_balise(1,$p); - $args = interprete_argument_balise(2,$p); - if ($args != "''" && $args!==NULL) - $p->code .= ".'\",\"'.".$args; - $redirect = interprete_argument_balise(3,$p); - if ($redirect != "''" && $redirect!==NULL) - $p->code .= ".'\",\"'.".$redirect; - - $p->code = "'<"."?php echo generer_action_auteur(\"'." . $p->code .".'\"); ?>'"; - - $p->interdire_scripts = false; - return $p; -} - // // #CHEMIN{fichier} -> find_in_path(fichier) // diff --git a/ecrire/public/references.php b/ecrire/public/references.php index 43fd80d24a..5b869eb1c4 100644 --- a/ecrire/public/references.php +++ b/ecrire/public/references.php @@ -163,14 +163,14 @@ function calculer_balise($nom, $p) { return $res; } - // S'agit-il d'un logo ? Une fonction speciale les traite tous - if (strncmp('LOGO_', $nom,5)==0) { - if (!function_exists($f = 'calculer_balise_logo')) $f .= '_dist'; + // Certaines des balises comportant un _ sont generiques + if ($f = strpos($nom, '_') + AND $f = charger_fonction(substr($nom,0,$f), 'balise', true)) { $res = $f($p); if ($res !== NULL) return $res; } - + spip_log("bal $nom"); // ca pourrait etre un champ SQL homonyme, $p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle); -- GitLab