X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=www%2Fecrire%2Fpublic%2Fbalises.php;h=61dec244f1e17aabae705e13a81d115470ad2733;hb=4f443dce95ff6f8221c189880a70c74ce1c1f238;hp=a7c63e63debbc3967070190fb374aa73c5d08044;hpb=4a628e9b277d3617535f99d663ca79fa2e891177;p=lhc%2Fweb%2Fwww.git diff --git a/www/ecrire/public/balises.php b/www/ecrire/public/balises.php index a7c63e63..61dec244 100644 --- a/www/ecrire/public/balises.php +++ b/www/ecrire/public/balises.php @@ -3,361 +3,857 @@ /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * - * Copyright (c) 2001-2016 * + * Copyright (c) 2001-2017 * * 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. * \***************************************************************************/ -// Ce fichier regroupe la quasi totalite des definitions de #BALISES de spip -// Pour chaque balise, il est possible de surcharger, dans mes_fonctions, -// la fonction balise_TOTO_dist par une fonction balise_TOTO() respectant la -// meme API : -// elle recoit en entree un objet de classe CHAMP, le modifie et le retourne. -// Cette classe est definie dans public/interfaces +/** + * Ce fichier regroupe la quasi totalité des définitions de `#BALISES` de SPIP. + * + * Pour chaque balise, il est possible de surcharger, dans son fichier + * mes_fonctions.php, la fonction `balise_TOTO_dist()` par une fonction + * `balise_TOTO()` respectant la même API : elle reçoit en entrée un objet + * de classe `Champ`, le modifie et le retourne. Cette classe est définie + * dans public/interfaces. + * + * Des balises dites «dynamiques» sont également déclarées dans le + * répertoire ecrire/balise/ + * + * @package SPIP\Core\Compilateur\Balises + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} -// http://doc.spip.org/@interprete_argument_balise -function interprete_argument_balise($n,$p) { - if (($p->param) && (!$p->param[0][0]) && (count($p->param[0])>$n)) +/** + * Retourne le code PHP d'un argument de balise s'il est présent + * + * @uses calculer_liste() + * @example + * ``` + * // Retourne le premier argument de la balise + * // #BALISE{premier,deuxieme} + * $arg = interprete_argument_balise(1,$p); + * ``` + * + * @param int $n + * Numéro de l'argument + * @param Champ $p + * Pile au niveau de la balise + * @return string|null + * Code PHP si cet argument est présent, sinon null + **/ +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); - else - return NULL; + } else { + return null; + } } + + // -// Definition des balises +// Définition des balises // -// http://doc.spip.org/@balise_NOM_SITE_SPIP_dist + +/** + * Compile la balise `#NOM_SITE_SPIP` retournant le nom du site + * + * @balise + * @link http://www.spip.net/4622 + * + * @param Champ $p + * Pile au niveau de la balise + * @return Champ + * Pile complétée par le code à générer + **/ function balise_NOM_SITE_SPIP_dist($p) { $p->code = "\$GLOBALS['meta']['nom_site']"; + #$p->interdire_scripts = true; return $p; } -// http://doc.spip.org/@balise_EMAIL_WEBMASTER_dist +/** + * Compile la balise `#EMAIL_WEBMASTER` retournant l'adresse courriel + * du webmestre + * + * @balise + * @link http://www.spip.net/4586 + * + * @param Champ $p + * Pile au niveau de la balise + * @return Champ + * Pile complétée par le code à générer + **/ function balise_EMAIL_WEBMASTER_dist($p) { $p->code = "\$GLOBALS['meta']['email_webmaster']"; + #$p->interdire_scripts = true; return $p; } -// http://doc.spip.org/@balise_DESCRIPTIF_SITE_SPIP_dist +/** + * Compile la balise `#DESCRIPTIF_SITE_SPIP` qui retourne le descriptif + * du site ! + * + * @balise + * @link http://www.spip.net/4338 + * + * @param Champ $p + * Pile au niveau de la balise + * @return Champ + * Pile complétée par le code à générer + **/ function balise_DESCRIPTIF_SITE_SPIP_dist($p) { $p->code = "\$GLOBALS['meta']['descriptif_site']"; + #$p->interdire_scripts = true; return $p; } -// http://doc.spip.org/@balise_CHARSET_dist + +/** + * Compile la balise `#CHARSET` qui retourne le nom du jeu de caractères + * utilisé par le site tel que `utf-8` + * + * @balise + * @link http://www.spip.net/4331 + * @example + * ``` + * + * ``` + * + * @param Champ $p + * Pile au niveau de la balise + * @return Champ + * Pile complétée par le code à générer + **/ function balise_CHARSET_dist($p) { $p->code = "\$GLOBALS['meta']['charset']"; + #$p->interdire_scripts = true; return $p; } -// http://doc.spip.org/@balise_LANG_LEFT_dist +/** + * Compile la balise `#LANG_LEFT` retournant 'left' si la langue s'écrit + * de gauche à droite, sinon 'right' + * + * @note + * Peut servir à l'écriture de code CSS dans un squelette, mais + * pour inclure un fichier css, il vaut mieux utiliser le filtre + * `direction_css` si on le souhaite sensible à la langue utilisé. + * + * @balise + * @link http://www.spip.net/4625 + * @see lang_dir() + * @see balise_LANG_RIGHT_dist() + * @see balise_LANG_DIR_dist() + * @see direction_css() + * + * @param Champ $p + * Pile au niveau de la balise + * @return Champ + * Pile complétée par le code à générer + **/ function balise_LANG_LEFT_dist($p) { $_lang = champ_sql('lang', $p); $p->code = "lang_dir($_lang, 'left','right')"; $p->interdire_scripts = false; + return $p; } -// http://doc.spip.org/@balise_LANG_RIGHT_dist +/** + * Compile la balise `#LANG_RIGHT` retournant 'right' si la langue s'écrit + * de gauche à droite, sinon 'left' + * + * @balise + * @link http://www.spip.net/4625 + * @see lang_dir() + * @see balise_LANG_LEFT_dist() + * @see balise_LANG_DIR_dist() + * @see direction_css() + * + * @param Champ $p + * Pile au niveau de la balise + * @return Champ + * Pile complétée par le code à générer + **/ function balise_LANG_RIGHT_dist($p) { $_lang = champ_sql('lang', $p); $p->code = "lang_dir($_lang, 'right','left')"; $p->interdire_scripts = false; + return $p; } -// http://doc.spip.org/@balise_LANG_DIR_dist +/** + * Compile la balise `#LANG_DIR` retournant 'ltr' si la langue s'écrit + * de gauche à droite, sinon 'rtl' + * + * @balise + * @link http://www.spip.net/4625 + * @see lang_dir() + * @see balise_LANG_LEFT_dist() + * @see balise_LANG_RIGHT_dist() + * @example + * ``` + * + * ``` + * + * @param Champ $p + * Pile au niveau de la balise + * @return Champ + * Pile complétée par le code à générer + **/ function balise_LANG_DIR_dist($p) { $_lang = champ_sql('lang', $p); $p->code = "lang_dir($_lang, 'ltr','rtl')"; $p->interdire_scripts = false; + return $p; } -// http://doc.spip.org/@balise_PUCE_dist + +/** + * Compile la balise `#PUCE` affichant une puce + * + * @balise + * @link http://www.spip.net/4628 + * @see definir_puce() + * + * @param Champ $p + * Pile au niveau de la balise + * @return Champ + * Pile complétée par le code à générer + **/ function balise_PUCE_dist($p) { $p->code = "definir_puce()"; $p->interdire_scripts = false; + return $p; } -// #DATE -// Cette fonction sait aller chercher dans le contexte general -// quand #DATE est en dehors des boucles -// http://www.spip.net/fr_article1971.html -// http://doc.spip.org/@balise_DATE_dist -function balise_DATE_dist ($p) { + +/** + * Compile la balise `#DATE` qui retourne la date de mise en ligne + * + * Cette balise retourne soit le champ `date` d'une table si elle est + * utilisée dans une boucle, sinon la date de calcul du squelette. + * + * @balise + * @link http://www.spip.net/4336 Balise DATE + * @link http://www.spip.net/1971 La gestion des dates + * @example + * ``` + *
- * #NOM_SITE
- *
+ * ```
+ * #NOM_SITE
+ * ```
*
* @param Champ $p
- * Pile au niveau de la balise
+ * Pile au niveau de la balise
* @return Champ
- * Pile complétée par le code à générer
-**/
+ * Pile complétée par le code à générer
+ **/
function balise_NOM_SITE_dist($p) {
if (!$p->etoile) {
$p->code = "supprimer_numero(calculer_url(" .
- champ_sql('url_site',$p) ."," .
- champ_sql('nom_site',$p) .
- ", 'titre', \$connect, false))";
- } else
- $p->code = champ_sql('nom_site',$p);
+ champ_sql('url_site', $p) . "," .
+ champ_sql('nom_site', $p) .
+ ", 'titre', \$connect, false))";
+ } else {
+ $p->code = champ_sql('nom_site', $p);
+ }
$p->interdire_scripts = true;
+
return $p;
}
-// http://doc.spip.org/@balise_NOTES_dist
+
+/**
+ * Compile la balise `#NOTE` qui affiche les notes de bas de page
+ *
+ * @balise
+ * @link http://www.spip.net/3964
+ * @see calculer_notes()
+ *
+ * @param Champ $p
+ * Pile au niveau de la balise
+ * @return Champ
+ * Pile complétée par le code à générer
+ **/
function balise_NOTES_dist($p) {
// Recuperer les notes
$p->code = 'calculer_notes()';
+
#$p->interdire_scripts = true;
return $p;
}
-// http://doc.spip.org/@balise_RECHERCHE_dist
+
+/**
+ * Compile la balise `#RECHERCHE` qui retourne le terme de recherche demandé
+ *
+ * Retourne un terme demandé en recherche, en le prenant dans _request()
+ * sous la clé `recherche`.
+ *
+ * @balise
+ * @example
+ * ```
+ * (#PAGINATION{prive})
] + * ``` + * + * @param Champ $p + * Pile au niveau de la balise + * @param string $liste + * Afficher ou non les liens de pagination (variable de type `string` + * car code à faire écrire au compilateur) : + * - `true` pour les afficher + * - `false` pour afficher uniquement l'ancre. + * @return Champ + * Pile complétée par le code à générer + */ +function balise_PAGINATION_dist($p, $liste = 'true') { $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere']; // s'il n'y a pas de nom de boucle, on ne peut pas paginer if ($b === '') { - $msg = array('zbug_champ_hors_boucle', + $msg = array( + 'zbug_champ_hors_boucle', array('champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION') - ); + ); erreur_squelette($msg, $p); + return $p; } @@ -571,11 +1143,13 @@ function balise_PAGINATION_dist($p, $liste='true') { // dans un boucle recursive ou qu'on a oublie le critere {pagination} if (!$p->boucles[$b]->mode_partie) { if (!$p->boucles[$b]->table_optionnelle) { - $msg = array('zbug_pagination_sans_critere', - array('champ' => '#PAGINATION') - ); + $msg = array( + 'zbug_pagination_sans_critere', + array('champ' => '#PAGINATION') + ); erreur_squelette($msg, $p); } + return $p; } @@ -583,53 +1157,91 @@ function balise_PAGINATION_dist($p, $liste='true') { // si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise // si true, les arguments simples (sans truc=chose) vont degager $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false); - if (count($_contexte)){ - list($key,$val) = each($_contexte); - if (is_numeric($key)){ + if (count($_contexte)) { + list($key, $val) = each($_contexte); + if (is_numeric($key)) { array_shift($_contexte); - $__modele = interprete_argument_balise(1,$p); + $__modele = interprete_argument_balise(1, $p); } } - if (count($_contexte)){ - $code_contexte = implode(',',$_contexte); - } - else + if (count($_contexte)) { + $code_contexte = implode(',', $_contexte); + } else { $code_contexte = ''; + } $connect = $p->boucles[$b]->sql_serveur; $pas = $p->boucles[$b]->total_parties; $f_pagination = chercher_filtre('pagination'); $type = $p->boucles[$b]->modificateur['debut_nom']; - $modif = ($type[0]!=="'") ? "'debut'.$type" - : ("'debut" .substr($type,1)); + $modif = ($type[0] !== "'") ? "'debut'.$type" + : ("'debut" . substr($type, 1)); - $p->code = sprintf(CODE_PAGINATION, $f_pagination, $b, $type, $modif, $pas, $liste, ((isset($__modele) and $__modele) ? $__modele : "''"), _q($connect), $code_contexte); + $p->code = sprintf(CODE_PAGINATION, $f_pagination, $b, $type, $modif, $pas, $liste, + ((isset($__modele) and $__modele) ? $__modele : "''"), _q($connect), $code_contexte); $p->boucles[$b]->numrows = true; $p->interdire_scripts = false; + return $p; } -// N'afficher que l'ancre de la pagination (au-dessus, par exemple, alors -// qu'on mettra les liens en-dessous de la liste paginee) -// http://doc.spip.org/@balise_ANCRE_PAGINATION_dist +/** + * Compile la balise `#ANCRE_PAGINATION` chargée d'afficher l'ancre + * de la pagination + * + * Cette ancre peut ainsi être placée au-dessus la liste des éléments + * de la boucle alors qu'on mettra les liens de pagination en-dessous de + * cette liste paginée. + * + * Cette balise nécessite le critère `pagination` sur la boucle où elle + * est utilisée. + * + * @balise + * @link http://www.spip.net/3367 Le système de pagination + * @link http://www.spip.net/4328 Balise ANCRE_PAGINATION + * @see critere_pagination_dist() + * @see balise_PAGINATION_dist() + * + * @param Champ $p + * Pile au niveau de la balise + * @return Champ + * Pile complétée par le code à générer + **/ function balise_ANCRE_PAGINATION_dist($p) { - if ($f = charger_fonction('PAGINATION', 'balise', true)) - return $f($p, $liste='false'); - else return NULL; // ou une erreur ? + if ($f = charger_fonction('PAGINATION', 'balise', true)) { + return $f($p, $liste = 'false'); + } else { + return null; + } // ou une erreur ? } -// equivalent a #TOTAL_BOUCLE sauf pour les boucles paginees, ou elle -// indique le nombre total d'articles repondant aux criteres hors pagination -// http://doc.spip.org/@balise_GRAND_TOTAL_dist + +/** + * Compile la balise `#GRAND_TOTAL` qui retourne le nombre total de résultats + * d'une boucle + * + * Cette balise set équivalente à `#TOTAL_BOUCLE` sauf pour les boucles paginées. + * Dans ce cas elle indique le nombre total d'éléments répondant aux critères + * hors pagination. + * + * @balise + * @see balise_GRAND_TOTAL_dist() + * + * @param Champ $p + * Pile au niveau de la balise + * @return Champ + * Pile complétée par le code à générer + **/ function balise_GRAND_TOTAL_dist($p) { $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere']; if ($b === '' || !isset($p->boucles[$b])) { - $msg = array('zbug_champ_hors_boucle', - array('champ' => "#$b" . 'TOTAL_BOUCLE') - ); + $msg = array( + 'zbug_champ_hors_boucle', + array('champ' => "#$b" . 'TOTAL_BOUCLE') + ); erreur_squelette($msg, $p); } else { $p->code = "(isset(\$Numrows['$b']['grand_total']) @@ -637,43 +1249,107 @@ function balise_GRAND_TOTAL_dist($p) { $p->boucles[$b]->numrows = true; $p->interdire_scripts = false; } + return $p; } -// Reference a l'URL de la page courante -// Attention dans un INCLURE() ou une balise dynamique on n'a pas le droit de -// mettre en cache #SELF car il peut correspondre a une autre page (attaque XSS) -// (Dans ce cas faire