[ Index ]
 

Code source de SPIP 1.8.3

Accédez au Source d'autres logiciels libres | Soutenez Angelica Josefina !

title

Body

[fermer]

/ -> inc-balises.php3 (source)

   1  <?php
   2  
   3  /***************************************************************************\
   4   *  SPIP, Systeme de publication pour l'internet                           *
   5   *                                                                         *
   6   *  Copyright (c) 2001-2005                                                *
   7   *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
   8   *                                                                         *
   9   *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
  10   *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
  11  \***************************************************************************/
  12  
  13  
  14  //
  15  // Ce fichier regroupe la quasi totalite des definitions de #BALISES de spip
  16  // Pour chaque balise, il est possible de surcharger, dans mes_fonctions.php3,
  17  // la fonction balise_TOTO_dist par une fonction balise_TOTO() respectant la
  18  // meme API : 
  19  // elle recoit en entree un objet de classe CHAMP, le modifie et le retourne.
  20  // Cette classe est definie dans inc-compilo-index.php3
  21  //
  22  
  23  // Ce fichier ne sera execute qu'une fois
  24  if (defined("_INC_BALISES")) return;
  25  define("_INC_BALISES", "1");
  26  
  27  
  28  //
  29  // Traitements standard de divers champs
  30  //
  31  function champs_traitements ($p) {
  32      static $traitements = array (
  33          'BIO' => 'traiter_raccourcis(%s)',
  34          'CHAPO' => 'traiter_raccourcis(nettoyer_chapo(%s))',
  35          'DATE' => 'vider_date(%s)',
  36          'DATE_MODIF' => 'vider_date(%s)',
  37          'DATE_NOUVEAUTES' => 'vider_date(%s)',
  38          'DATE_REDAC' => 'vider_date(%s)',
  39          'DESCRIPTIF' => 'traiter_raccourcis(%s)',
  40          'LIEN_TITRE' => 'typo(%s)',
  41          'LIEN_URL' => 'htmlspecialchars(vider_url(%s))',
  42          'MESSAGE' => 'traiter_raccourcis(%s)',
  43          'NOM_SITE_SPIP' => 'typo(%s)',
  44          'NOM_SITE' => 'typo(%s)',
  45          'NOM' => 'typo(%s)',
  46          'PARAMETRES_FORUM' => 'htmlspecialchars(lang_parametres_forum(%s))',
  47          'PS' => 'traiter_raccourcis(%s)',
  48          'SOUSTITRE' => 'typo(%s)',
  49          'SURTITRE' => 'typo(%s)',
  50          'TEXTE' => 'traiter_raccourcis(%s)',
  51          'TITRE' => 'typo(%s)',
  52          'TYPE' => 'typo(%s)',
  53          'URL_ARTICLE' => 'htmlspecialchars(vider_url(%s))',
  54          'URL_BREVE' => 'htmlspecialchars(vider_url(%s))',
  55          'URL_DOCUMENT' => 'htmlspecialchars(vider_url(%s))',
  56          'URL_FORUM' => 'htmlspecialchars(vider_url(%s))',
  57          'URL_MOT' => 'htmlspecialchars(vider_url(%s))',
  58          'URL_RUBRIQUE' => 'htmlspecialchars(vider_url(%s))',
  59          'URL_SITE_SPIP' => 'htmlspecialchars(vider_url(%s))',
  60          'URL_SITE' => 'htmlspecialchars(vider_url(%s))',
  61          'URL_SYNDIC' => 'htmlspecialchars(vider_url(%s))',
  62          'ENV' => 'entites_html(%s)'
  63      );
  64      $ps = $traitements[$p->nom_champ];
  65      if (!$ps) return $p->code;
  66      if ($p->descr['documents']) {
  67          $ps = str_replace('traiter_raccourcis(', 
  68              'traiter_raccourcis_doublon($doublons,',
  69              str_replace('typo(', 'typo_doublon($doublons,', $ps));
  70      }
  71  
  72      // Passer |safehtml sur les boucles "sensibles"
  73      // sauf sur les champs dont on est surs
  74      switch ($p->type_requete) {
  75          case 'forums':
  76          case 'signatures':
  77          case 'syndic_articles':
  78              $champs_surs = array(
  79              'date', 'date_heure', 'statut', 'ip', 'url_article', 'maj', 'idx',
  80              'parametres_forum');
  81              if (!in_array(strtolower($p->nom_champ), $champs_surs)
  82              AND !preg_match(',^ID_,', $p->nom_champ))
  83                  $ps = 'safehtml('.$ps.')';
  84              break;
  85          default:
  86              break;
  87      }
  88  
  89      // on supprime les < IMGnnn > tant qu'on ne rapatrie pas
  90      // les documents distants joints..
  91      // il faudrait aussi corriger les raccourcis d'URL locales
  92      return str_replace('%s',
  93          (!$p->boucles[$p->id_boucle]->sql_serveur ?
  94          $p->code :
  95          ('supprime_img(' . $p->code . ')')),
  96          $ps);
  97  }
  98  
  99  // il faudrait savoir traiter les formulaires en local 
 100  // tout en appelant le serveur SQL distant.
 101  // En attendant, cette fonction permet de refuser une authentification 
 102  // sur qqch qui n'a rien a voir.
 103  
 104  function balise_distante_interdite($p) {
 105      $nom = $p->id_boucle;
 106      if ($p->boucles[$nom]->sql_serveur) {
 107          erreur_squelette($p->nom_champ .' '._T('zbug_distant_interdit'), $nom);
 108      }
 109  }
 110  
 111  //
 112  // Definition des balises
 113  //
 114  function balise_NOM_SITE_SPIP_dist($p) {
 115      $p->code = "lire_meta('nom_site')";
 116      $p->statut = 'html';
 117      return $p;
 118  }
 119  
 120  function balise_EMAIL_WEBMASTER_dist($p) {
 121      $p->code = "lire_meta('email_webmaster')";
 122      $p->statut = 'html';
 123      return $p;
 124  }
 125  
 126  function balise_CHARSET_dist($p) {
 127      $p->code = "lire_meta('charset')";
 128      $p->statut = 'html';
 129      return $p;
 130  }
 131  
 132  function balise_LANG_LEFT_dist($p) {
 133      $_lang = champ_sql('lang', $p);
 134      $p->code = "lang_dir(($_lang ? $_lang : \$GLOBALS['spip_lang']),'left','right')";
 135      $p->statut = 'php';
 136      return $p;
 137  }
 138  
 139  function balise_LANG_RIGHT_dist($p) {
 140      $_lang = champ_sql('lang', $p);
 141      $p->code = "lang_dir(($_lang ? $_lang : \$GLOBALS['spip_lang']),'right','left')";
 142      $p->statut = 'php';
 143      return $p;
 144  }
 145  
 146  function balise_LANG_DIR_dist($p) {
 147      $_lang = champ_sql('lang', $p);
 148      $p->code = "lang_dir(($_lang ? $_lang : \$GLOBALS['spip_lang']),'ltr','rtl')";
 149      $p->statut = 'php';
 150      return $p;
 151  }
 152  
 153  function balise_PUCE_dist($p) {
 154      $_lang = champ_sql('lang', $p);
 155      $p->code = "((lang_dir(($_lang ? $_lang : \$GLOBALS['spip_lang']),false,true) && \$GLOBALS['puce_rtl']) ? \$GLOBALS['puce_rtl'] : \$GLOBALS['puce'])";
 156      $p->statut = 'php';
 157      return $p;
 158  }
 159  
 160  // #DATE
 161  // Cette fonction sait aller chercher dans le contexte general
 162  // quand #DATE est en dehors des boucles
 163  // http://www.spip.net/fr_article1971.html
 164  function balise_DATE_dist ($p) {
 165      $_date = champ_sql('date', $p);
 166      $p->code = "$_date";
 167      $p->statut = 'php';
 168      return $p;
 169  }
 170  
 171  // #DATE_REDAC
 172  // http://www.spip.net/fr_article1971.html
 173  function balise_DATE_REDAC_dist ($p) {
 174      $_date = champ_sql('date_redac', $p);
 175      $p->code = "$_date";
 176      $p->statut = 'php';
 177      return $p;
 178  }
 179  
 180  // #DATE_MODIF
 181  // http://www.spip.net/fr_article1971.html
 182  function balise_DATE_MODIF_dist ($p) {
 183      $_date = champ_sql('date_modif', $p);
 184      $p->code = "$_date";
 185      $p->statut = 'php';
 186      return $p;
 187  }
 188  
 189  // #DATE_NOUVEAUTES
 190  // http://www.spip.net/fr_article1971.html
 191  function balise_DATE_NOUVEAUTES_dist($p) {
 192      $p->code = "((lire_meta('quoi_de_neuf') == 'oui'
 193      AND @file_exists(_DIR_SESSIONS . 'mail.lock')) ?
 194      normaliser_date(@filemtime(_DIR_SESSIONS . 'mail.lock')) :
 195      \"'0000-00-00'\")";
 196      $p->statut = 'php';
 197      return $p;
 198  }
 199  
 200  function balise_DOSSIER_SQUELETTE_dist($p) {
 201      $p->code = "'" . addslashes(dirname($p->descr['sourcefile'])) . "'" ;
 202      $p->statut = 'html';
 203      return $p;
 204  }
 205  
 206  function balise_URL_SITE_SPIP_dist($p) {
 207      $p->code = "lire_meta('adresse_site')";
 208      $p->statut = 'html';
 209      return $p;
 210  }
 211  
 212  
 213  function balise_URL_ARTICLE_dist($p) {
 214      $_type = $p->type_requete;
 215  
 216      // Cas particulier des boucles (SYNDIC_ARTICLES)
 217      if ($_type == 'syndic_articles') {
 218          $p->code = champ_sql('url', $p);
 219      }
 220  
 221      // Cas general : chercher un id_article dans la pile
 222      else {
 223          $_id_article = champ_sql('id_article', $p);
 224          $p->code = "generer_url_article($_id_article)";
 225  
 226          if ($p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash)
 227              $p->code = "url_var_recherche(" . $p->code . ")";
 228      }
 229  
 230      $p->statut = 'php';
 231      return $p;
 232  }
 233  
 234  function balise_URL_RUBRIQUE_dist($p) {
 235      $p->code = "generer_url_rubrique(" . 
 236      champ_sql('id_rubrique',$p) . 
 237      ")" ;
 238      if ($p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash)
 239      $p->code = "url_var_recherche(" . $p->code . ")";
 240  
 241      $p->statut = 'php';
 242      return $p;
 243  }
 244  
 245  function balise_URL_BREVE_dist($p) {
 246      $p->code = "generer_url_breve(" .
 247      champ_sql('id_breve',$p) . 
 248      ")";
 249      if ($p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash)
 250      $p->code = "url_var_recherche(" . $p->code . ")";
 251  
 252      $p->statut = 'php';
 253      return $p;
 254  }
 255  
 256  function balise_URL_MOT_dist($p) {
 257      $p->code = "generer_url_mot(" .
 258      champ_sql('id_mot',$p) .
 259      ")";
 260  
 261      if ($p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash)
 262      $p->code = "url_var_recherche(" . $p->code . ")";
 263  
 264      $p->statut = 'php';
 265      return $p;
 266  }
 267  
 268  # remarque : URL_SITE ne figure pas ici car c'est une donnee 'brute'
 269  # correspondant a l'URL du site reference ; URL_SYNDIC correspond
 270  # pour sa part a l'adresse de son backend.
 271  # Il n'existe pas de balise pour afficher generer_url_site($id_syndic),
 272  # a part [(#ID_SYNDIC|generer_url_site)]
 273  
 274  function balise_URL_FORUM_dist($p) {
 275      $p->code = "generer_url_forum(" .
 276      champ_sql('id_forum',$p) .")";
 277  
 278      if ($p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash)
 279      $p->code = "url_var_recherche(" . $p->code . ")";
 280  
 281      $p->statut = 'php';
 282      return $p;
 283  }
 284  
 285  function balise_URL_DOCUMENT_dist($p) {
 286      $p->code = "generer_url_document(" .
 287      champ_sql('id_document',$p) . ")";
 288  
 289      $p->statut = 'php';
 290      return $p;
 291  }
 292  
 293  function balise_URL_AUTEUR_dist($p) {
 294      $p->code = "generer_url_auteur(" .
 295      champ_sql('id_auteur',$p) .")";
 296      if ($p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash)
 297      $p->code = "url_var_recherche(" . $p->code . ")";
 298  
 299      $p->statut = 'php';
 300      return $p;
 301  }
 302  
 303  function balise_NOTES_dist($p) {
 304      // Recuperer les notes
 305      $p->code = 'calculer_notes()';
 306      $p->statut = 'html';
 307      return $p;
 308  }
 309  
 310  // Qu'afficher en cas d'erreur 404 ?
 311  function balise_ERREUR_AUCUN_dist($p) {
 312      $p->code = '$Pile[0]["erreur_aucun"]';
 313      $p->statut = 'html';
 314      return $p;
 315  }
 316  
 317  function balise_RECHERCHE_dist($p) {
 318      $p->code = 'htmlspecialchars($GLOBALS["recherche"])';
 319      $p->statut = 'php';
 320      return $p;
 321  }
 322  
 323  function balise_COMPTEUR_BOUCLE_dist($p) {
 324      $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
 325      if ($b === '') {
 326          erreur_squelette(
 327              _T('zbug_champ_hors_boucle',
 328                  array('champ' => '#COMPTEUR_BOUCLE')
 329              ), $p->id_boucle);
 330          $p->code = "''";
 331      } else {
 332          $p->code = "\$Numrows['$b']['compteur_boucle']";
 333          $p->statut = 'php';
 334          return $p;
 335      }
 336  }
 337  
 338  function balise_TOTAL_BOUCLE_dist($p) {
 339      $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
 340      if ($b === '') {
 341          erreur_squelette(
 342              _T('zbug_champ_hors_boucle',
 343                  array('champ' => '#TOTAL_BOUCLE')
 344              ), $p->id_boucle);
 345          $p->code = "''";
 346      } else {
 347          $p->code = "\$Numrows['$b']['total']";
 348          $p->boucles[$b]->numrows = true;
 349          $p->statut = 'php';
 350      }
 351      return $p;
 352  }
 353  
 354  function balise_POINTS_dist($p) {
 355      return rindex_pile($p, 'points', 'recherche');
 356  }
 357  
 358  function balise_POPULARITE_ABSOLUE_dist($p) {
 359      $p->code = 'ceil(' .
 360      champ_sql('popularite', $p) .
 361      ')';
 362      $p->statut = 'php';
 363      return $p;
 364  }
 365  
 366  function balise_POPULARITE_SITE_dist($p) {
 367      $p->code = 'ceil(lire_meta(\'popularite_total\'))';
 368      $p->statut = 'php';
 369      return $p;
 370  }
 371  
 372  function balise_POPULARITE_MAX_dist($p) {
 373      $p->code = 'ceil(lire_meta(\'popularite_max\'))';
 374      $p->statut = 'php';
 375      return $p;
 376  }
 377  
 378  function balise_EXPOSE_dist($p) {
 379      $on = "'on'";
 380      $off= "''";
 381  
 382      if ($p->param && !$p->param[0][0]) {
 383          $on =  calculer_liste($p->param[0][1],
 384                      $p->descr,
 385                      $p->boucles,
 386                      $p->id_boucle);
 387  
 388          $off =  calculer_liste($p->param[0][2],
 389                      $p->descr,
 390                      $p->boucles,
 391                      $p->id_boucle);
 392  
 393          // autres filtres
 394          array_shift($p->param);
 395      }
 396      return calculer_balise_expose($p, $on, $off);
 397  }
 398  
 399  // obsolete. utiliser la precedente
 400  
 401  function balise_EXPOSER_dist($p)
 402  {
 403      $on = "'on'";
 404      $off= "''";
 405      if ($a = ($p->fonctions)) {
 406          // Gerer la notation [(#EXPOSER|on,off)]
 407          $onoff = array_shift($a);
 408          ereg("([^,]*)(,(.*))?", $onoff[0], $regs);
 409          $on = "'" . addslashes($regs[1]) . "'";
 410          $off = "'" . addslashes($regs[3]) . "'" ;
 411          // autres filtres
 412          array_shift($p->param);
 413      }
 414      return calculer_balise_expose($p, $on, $off);
 415  }
 416  
 417  function calculer_balise_expose($p, $on, $off)
 418  {
 419      global  $table_primary;
 420      $type_boucle = $p->type_requete;
 421      $primary_key = $table_primary[$type_boucle];
 422      if (!$primary_key) {
 423          erreur_squelette(_T('zbug_champ_hors_boucle',
 424                  array('champ' => '#EXPOSER')
 425              ), $p->id_boucle);
 426  
 427      }
 428  
 429      $p->code = '(calcul_exposer('
 430      .champ_sql($primary_key, $p)
 431      .", '$primary_key', \$Pile[0]) ? $on : $off)";
 432      $p->statut = 'php';
 433      return $p;
 434  }
 435  
 436  //
 437  // Inserer directement un document dans le squelette
 438  //
 439  function balise_EMBED_DOCUMENT_dist($p) {
 440      balise_distante_interdite($p);
 441      $_id_document = champ_sql('id_document',$p);
 442      $p->code = "calcule_embed_document(intval($_id_document), " .
 443        argumenter_balise($p->fonctions, "|") .
 444        ", \$doublons, '" . $p->descr['documents'] . "')";
 445      $p->param = array();
 446      $p->statut = 'html';
 447      return $p;
 448  }
 449  
 450  // Debut et fin de surlignage auto des mots de la recherche
 451  // on insere une balise Span avec une classe sans spec:
 452  // c'est transparent s'il n'y a pas de recherche,
 453  // sinon elles seront remplacees par les fontions de inc_surligne
 454  
 455  function balise_DEBUT_SURLIGNE_dist($p) {
 456      include_ecrire('inc_surligne.php3');
 457      $p->code = "'<" . MARQUEUR_SURLIGNE . "'";
 458      return $p;
 459  }
 460  function balise_FIN_SURLIGNE_dist($p) {
 461      include_ecrire('inc_surligne.php3');
 462      $p->code = "'<" . MARQUEUR_FSURLIGNE . "'";
 463      return $p;
 464  }
 465  
 466  
 467  // #SPIP_CRON
 468  // a documenter
 469  // insere un <div> avec un lien background-image vers les taches de fond.
 470  // Si cette balise est presente sur la page de sommaire, le site ne devrait
 471  // quasiment jamais se trouver ralenti par des taches de fond un peu lentes
 472  // ATTENTION: cette balise efface parfois les boutons admin implicites
 473  function balise_SPIP_CRON_dist ($p) {
 474      $p->code = "'<div style=\\'position: absolute; background-image: url(\"spip_background.php3\"); height: 1px; width: 1px;\\'></div>'";
 475      $p->statut='php';
 476      return $p;
 477  }
 478  
 479  
 480  // #INTRODUCTION
 481  // http://www.spip.net/@introduction
 482  function balise_INTRODUCTION_dist ($p) {
 483      $_type = $p->type_requete;
 484      $_texte = champ_sql('texte', $p);
 485      $_chapo = champ_sql('chapo', $p);
 486      $_descriptif = champ_sql('descriptif', $p);
 487      $p->code = "calcul_introduction('$_type', $_texte, $_chapo, $_descriptif)";
 488  
 489      $p->statut = 'html';
 490      return $p;
 491  }
 492  
 493  
 494  // #LANG
 495  // non documente ?
 496  function balise_LANG_dist ($p) {
 497      $_lang = champ_sql('lang', $p);
 498      $p->code = "($_lang ? $_lang : \$GLOBALS['spip_lang'])";
 499      $p->code = 'htmlentities'.$p->code;
 500      $p->statut = 'php';
 501      return $p;
 502  }
 503  
 504  
 505  // #LESAUTEURS
 506  // les auteurs d'un article (ou d'un article syndique)
 507  // http://www.spip.net/fr_article902.html
 508  // http://www.spip.net/fr_article911.html
 509  function balise_LESAUTEURS_dist ($p) {
 510      // Cherche le champ 'lesauteurs' dans la pile
 511      $_lesauteurs = champ_sql('lesauteurs', $p); 
 512  
 513      // Si le champ n'existe pas (cas de spip_articles), on donne la
 514      // construction speciale sql_auteurs(id_article) ;
 515      // dans le cas contraire on prend le champ 'les_auteurs' (cas de
 516      // spip_syndic_articles)
 517      if ($_lesauteurs AND $_lesauteurs != '$Pile[0][\'lesauteurs\']') {
 518          $p->code = $_lesauteurs;
 519      } else {
 520          $nom = $p->id_boucle;
 521      # On pourrait mieux faire qu'utiliser cette fonction assistante ?
 522          $p->code = "sql_auteurs(" .
 523              champ_sql('id_article', $p) .
 524              ",'" .
 525              $nom .
 526              "','" .
 527              $p->boucles[$nom]->type_requete .
 528              "','" .
 529              $p->boucles[$nom]->sql_serveur .
 530              "')";
 531      }
 532  
 533      $p->statut = 'html';
 534      return $p;
 535  }
 536  
 537  
 538  // #PETITION 
 539  // retourne '' si l'article courant n'a pas de petition 
 540  // le texte de celle-ci sinon (et ' ' si il est vide)
 541  // cf FORMULAIRE_PETITION
 542  
 543  function balise_PETITION_dist ($p) {
 544      $nom = $p->id_boucle;
 545      $p->code = "sql_petitions(" .
 546              champ_sql('id_article', $p) .
 547              ",'" .
 548              $p->boucles[$nom]->type_requete .
 549              "','" .
 550              $nom .
 551              "','" .
 552              $p->boucles[$nom]->sql_serveur .
 553              "', \$Cache)";
 554      $p->statut = 'php';
 555      return $p;
 556  }
 557  
 558  
 559  // #POPULARITE
 560  // http://www.spip.net/fr_article1846.html
 561  function balise_POPULARITE_dist ($p) {
 562      $_popularite = champ_sql('popularite', $p);
 563      $p->code = "(ceil(min(100, 100 * $_popularite
 564      / max(1 , 0 + lire_meta('popularite_max')))))";
 565      $p->statut = 'php';
 566      return $p;
 567  }
 568  
 569  
 570  //
 571  // Fonction commune aux balises #LOGO_XXXX
 572  // (les balises portant ce type de nom sont traitees en bloc ici)
 573  //
 574  function calculer_balise_logo ($p) {
 575  
 576      eregi("^LOGO_([A-Z]+)(_.*)?$", $p->nom_champ, $regs);
 577      $type_objet = $regs[1];
 578      $suite_logo = $regs[2];    
 579      if (ereg("^_SPIP(.*)$", $suite_logo, $regs)) {
 580          $type_objet = 'RUBRIQUE';
 581          $suite_logo = $regs[1];
 582          $_id_objet = "\"'0'\"";
 583      } else {
 584  
 585          if ($type_objet == 'SITE')
 586              $_id_objet = champ_sql("id_syndic", $p);
 587          else
 588              $_id_objet = champ_sql("id_".strtolower($type_objet), $p);
 589      }
 590      // analyser les faux filtres, 
 591      // supprimer ceux qui ont le tort d'etre vrais
 592      $flag_fichier = 0;
 593      $filtres = '';
 594      if (is_array($p->fonctions)) {
 595          foreach($p->fonctions as $couple) {
 596              // eliminer les faux filtres
 597              if (!$flag_stop) {
 598                  array_shift($p->param);
 599                  $nom = $couple[0];
 600                  if (ereg('^(left|right|center|top|bottom)$', $nom))
 601                      $align = $nom;
 602                  else if ($nom == 'lien') {
 603                      $flag_lien_auto = 'oui';
 604                      $flag_stop = true;
 605                  }
 606                  else if ($nom == 'fichier') {
 607                      $flag_fichier = 1;
 608                      $flag_stop = true;
 609                  }
 610                  // double || signifie "on passe aux filtres"
 611                  else if ($nom == '') {
 612                      if (!$params = $couple[1])
 613                          $flag_stop = true;
 614                  }
 615                  else if ($nom) {
 616                      $lien = $nom;
 617                      $flag_stop = true;
 618                  } else {
 619                      
 620                  }
 621              }
 622              // apres un URL ou || ou |fichier ce sont
 623              // des filtres (sauf left...lien...fichier)
 624          }
 625      }
 626  
 627      //
 628      // Preparer le code du lien
 629      //
 630      // 1. filtre |lien
 631      if ($flag_lien_auto AND !$lien)
 632          $code_lien = '($lien = generer_url_'.$type_objet.'('.$_id_objet.')) ? $lien : ""';
 633      // 2. lien indique en clair (avec des balises : imprimer#ID_ARTICLE.html)
 634      else if ($lien) {
 635          $code_lien = "'".texte_script(trim($lien))."'";
 636          while (ereg("^([^#]*)#([A-Za-z_]+)(.*)$", $code_lien, $match)) {
 637              $c = new Champ();
 638              $c->nom_champ = $match[2];
 639              $c->id_boucle = $p->id_boucle;
 640              $c->boucles = &$p->boucles;
 641              $c->descr = $p->descr;
 642              $c = calculer_champ($c);
 643              $code_lien = str_replace('#'.$match[2], "'.".$c.".'", $code_lien);
 644          }
 645          // supprimer les '' disgracieux
 646          $code_lien = ereg_replace("^''\.|\.''$", "", $code_lien);
 647      }
 648  
 649      if ($flag_fichier)
 650          $code_lien = "'',''" ; 
 651      else {
 652          if (!$code_lien)
 653              $code_lien = "''";
 654          $code_lien .= ", '". addslashes($align) . "'";
 655      }
 656  
 657      // cas des documents
 658      if ($type_objet == 'DOCUMENT') {
 659          $p->code = "calcule_logo_document($_id_objet, '" .
 660              $p->descr['documents'] .
 661              '\', $doublons, '. intval($flag_fichier).", $code_lien, '".
 662              // #LOGO_DOCUMENT{x,y} donne la taille maxi
 663              texte_script($params)
 664              ."')";
 665      }
 666      else {
 667        $p->code = "affiche_logos(calcule_logo('$type_objet', '" .
 668          (($suite_logo == '_SURVOL') ? 'off' : 
 669           (($suite_logo == '_NORMAL') ? 'on' : 'ON')) .
 670          "', $_id_objet," .
 671          (($suite_logo == '_RUBRIQUE') ? 
 672           champ_sql("id_rubrique", $p) :
 673           (($type_objet == 'RUBRIQUE') ? "sql_parent($_id_objet)" : "''")) .
 674          ",  '$flag_fichier'), $code_lien)";
 675      }
 676      $p->statut = 'php';
 677      return $p;
 678  }
 679  
 680  // #EXTRA [(#EXTRA|isbn)]
 681  // Champs extra
 682  // Non documentes, en voie d'obsolescence, cf. ecrire/inc_extra.php3
 683  function balise_EXTRA_dist ($p) {
 684      $_extra = champ_sql('extra', $p);
 685      $p->code = $_extra;
 686  
 687      // Gerer la notation [(#EXTRA|isbn)]
 688      if ($p->params) {
 689          include_ecrire ("inc_extra.php3");
 690          list ($key, $champ_extra) = each($p->params);    // le premier filtre
 691          $type_extra = $p->type_requete;
 692          $champ = $champ_extra[1];
 693  
 694      // ci-dessus est sans doute un peu buggue : si on invoque #EXTRA
 695      // depuis un sous-objet sans champ extra d'un objet a champ extra,
 696      // on aura le type_extra du sous-objet (!)
 697          if (extra_champ_valide($type_extra, $champ))
 698          {
 699              array_shift($p->params);
 700  # A quoi ca sert ?
 701  #        $p->code = "extra($p->code, '".addslashes($champ)."')";
 702  
 703  
 704              // Appliquer les filtres definis par le webmestre
 705              $filtres = extra_filtres($type_extra, $champ);
 706              if ($filtres) foreach ($filtres as $f)
 707                  $p->code = "$f($p->code)";
 708          }
 709      }
 710  
 711      $p->statut = 'html';
 712      return $p;
 713  }
 714  
 715  //
 716  // Parametres de reponse a un forum
 717  //
 718  
 719  function balise_PARAMETRES_FORUM_dist($p) {
 720      include_local(find_in_path('inc-formulaire_forum.php3'));
 721      $_id_article = champ_sql('id_article', $p);
 722      $p->code = '
 723          // refus des forums ?
 724          (sql_accepter_forum('.$_id_article.')=="non" OR
 725          (lire_meta("forums_publics") == "non"
 726          AND sql_accepter_forum('.$_id_article.') == ""))
 727          ? "" : // sinon:
 728          ';
 729  
 730      switch ($p->type_requete) {
 731          case 'articles':
 732              $c = '"id_article=".' . champ_sql('id_article', $p);
 733              break;
 734          case 'breves':
 735              $c = '"id_breve=".' . champ_sql('id_breve', $p);
 736              break;
 737          case 'rubriques':
 738              $c = '"id_rubrique=".' . champ_sql('id_rubrique', $p);
 739              break;
 740          case 'syndication':
 741              $c = '"id_syndic=".' . champ_sql('id_syndic', $p);
 742              break;
 743          case 'forums':
 744          default:
 745              $liste_champs = array ("id_article","id_breve","id_rubrique","id_syndic","id_forum");
 746              foreach ($liste_champs as $champ) {
 747                  $x = champ_sql( $champ, $p);
 748                  $c .= (($c) ? ".\n" : "") . "((!$x) ? '' : ('&$champ='.$x))";
 749              }
 750              $c = "substr($c,1)";
 751              break;
 752      }
 753  
 754      // Syntaxe [(#PARAMETRES_FORUM{#SELF})] pour fixer le retour du forum
 755      # note : ce bloc qui sert a recuperer des arguments calcules pourrait
 756      # porter un nom et faire partie de l'API.
 757      if ($p->param && !$p->param[0][0]) {
 758            $retour = array_shift( $p->param );
 759            array_shift($retour);
 760            $retour = calculer_liste($retour[0],
 761                         $p->descr,
 762                         $p->boucles,
 763                         $p->id_boucle);
 764      }
 765      else
 766          $retour = "''";
 767  
 768      // Attention un eventuel &retour=xxx dans l'URL est prioritaire
 769      $c .= '.
 770      (($lien = (_request("retour") ? _request("retour") : '.$retour.')) ? "&retour=".rawurlencode($lien) : "")';
 771  
 772      $p->code .= code_invalideur_forums($p, "(".$c.")");
 773  
 774      $p->statut = 'html';
 775      return $p;
 776  }
 777  
 778  
 779  // Noter l'invalideur de la page contenant ces parametres,
 780  // en cas de premier post sur le forum
 781  function code_invalideur_forums($p, $code) {
 782      include_ecrire ('inc_invalideur.php3');
 783      $type = 'id_forum';
 784      $valeur = "\n\t\tcalcul_index_forum("
 785          // Retournera 4 [$SP] mais force la demande du champ a MySQL
 786          . champ_sql('id_article', $p) . ','
 787          . champ_sql('id_breve', $p) .  ','
 788          . champ_sql('id_rubrique', $p) .','
 789          . champ_sql('id_syndic', $p) .  ")\n\t";
 790  
 791      return ajouter_invalideur($type, $valeur, $code);
 792  }
 793  
 794  // Reference a l'URL de la page courante
 795  // Attention dans un INCLURE() ou une balise dynamique on n'a pas le droit de
 796  // mettre en cache #SELF car il peut correspondre a une autre page (attaque XSS)
 797  // http://www.spip.net/@self
 798  function balise_SELF_dist($p) {
 799      $p->code = 'quote_amp($GLOBALS["clean_link"]->getUrl())';
 800      $p->statut = 'php';
 801      return $p;
 802  }
 803  
 804  
 805  //
 806  // #ENV
 807  // l'"environnement", id est le $contexte (ou $contexte_inclus)
 808  //
 809  // en standard on applique |entites_html, mais si vous utilisez 
 810  // [(#ENV*{toto})] il *faut* vous assurer vous-memes de la securite 
 811  // anti-javascript (par exemple en filtrant avec |safehtml)
 812  //
 813  // La syntaxe #ENV{toto, rempl} renverra 'rempl' si $toto est vide
 814  //
 815  function balise_ENV_dist($p) {
 816  
 817      if ($a = $p->param) {
 818          $sinon = array_shift($a);
 819          if  (!array_shift($sinon)) {
 820            $p->fonctions = $a;
 821            array_shift( $p->param );
 822            $nom = array_shift($sinon);
 823            $nom = ($nom[0]->type=='texte') ? $nom[0]->texte : "";
 824          }
 825      }
 826  
 827      if (!$nom) {
 828          // cas de #ENV sans argument : on retourne le serialize() du tableau
 829          // une belle fonction [(#ENV|affiche_env)] serait pratique
 830          $p->code = 'serialize($Pile[0])';
 831      } else {
 832          // admet deux arguments : nom de variable, valeur par defaut si vide
 833          $p->code = '$Pile[0]["' . addslashes($nom) . '"]';
 834          if ($sinon)
 835              $p->code = 'sinon('. 
 836                $p->code .
 837                compose_filtres_args($p, $sinon, ',') . 
 838                ')';
 839      }
 840      $p->statut = 'html';
 841  
 842      return $p;
 843  }
 844  
 845  ?>


Généré le : Thu Feb 22 22:27:47 2007 par Balluche grâce à PHPXref 0.7