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; } } // // Définition des balises // /** * 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; } /** * 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; } /** * 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; } /** * 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; } /** * 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; } /** * 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; } /** * 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; } /** * 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; } /** * 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 * ``` *
(#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', array('champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION') ); erreur_squelette($msg, $p); return $p; } // s'il n'y a pas de mode_partie, c'est qu'on se trouve // 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') ); erreur_squelette($msg, $p); } return $p; } // a priori 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)) { $key = key($_contexte); if (is_numeric($key)) { array_shift($_contexte); $__modele = interprete_argument_balise(1, $p); } } 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)); $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; } /** * 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 ? } /** * 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') ); erreur_squelette($msg, $p); } else { $p->code = "(isset(\$Numrows['$b']['grand_total']) ? \$Numrows['$b']['grand_total'] : \$Numrows['$b']['total'])"; $p->boucles[$b]->numrows = true; $p->interdire_scripts = false; } return $p; } /** * Compile la balise `#SELF` qui retourne l’URL de la page appelée. * * Cette URL est nettoyée des variables propres à l’exécution de SPIP * tel que `var_mode`. * * @note * Attention dans un `INCLURE()` ou une balise dynamique, on n'a pas le droit de * mettre en cache `#SELF` car il peut correspondre à une autre page (attaque XSS) * (Dans ce cas faire