Browse Source

on bouge

2.1
ben.spip@gmail.com 13 years ago
commit
bac3af033b
  1. 12
      .gitattributes
  2. 34
      LISEZMOI.txt
  3. 38
      SquelettesMots.php
  4. 36
      chercher_squelettes_mots.css
  5. 210
      exec/config_chercher_squelettes_mots.php
  6. 26
      lang/squelettesmots_en.php
  7. 26
      lang/squelettesmots_fr.php
  8. 26
      lang/squelettesmots_it.php
  9. 72
      plugin.xml
  10. 412
      public/parametrer.php
  11. 134
      public/styliser.php
  12. BIN
      spip_death.png

12
.gitattributes

@ -0,0 +1,12 @@
* text=auto !eol
/LISEZMOI.txt -text
/SquelettesMots.php -text
/chercher_squelettes_mots.css -text
exec/config_chercher_squelettes_mots.php -text
lang/squelettesmots_en.php -text
lang/squelettesmots_fr.php -text
lang/squelettesmots_it.php -text
/plugin.xml -text
public/parametrer.php -text
public/styliser.php -text
/spip_death.png -text

34
LISEZMOI.txt

@ -0,0 +1,34 @@
Ce plugin permet de specifier le squelette d'un élément (article,
breves, etc...) ou de tous les éléments d'une rubrique en utilisant
les mots clefs.
Le plugin marche sous forme de "règles" de sélection. Une règle
spécifie:
- un fond de base (le fichier de squelette de base, par exemple
rubrique.html ou article.html)
- un groupe de mot clef (le groupe qui contient les mots clefs qui
spécifient quel squelette utiliser)
- un type d'éléments (le type d'élément affiché par le squelette en
question)
Le plugin permet de sélectionner des squelettes nommés:
- fond=motclef.html pour le squelette d'un élément spécifique
- fond-motclef.html pour le squelette de tous les éléments d'une
rubrique
Un exemple d'utilisation:
1- créer un groupe de mot clef associable aux articles et rubriques, par exemple
"squelettes articles",
2- aller sur la page de configuration du plugin (Configuration, puis
onglets "Configurer Squelettes Mots",
3- créer une règle qui associe:
o le fond article
o le groupe "squelettes articles"
o le type d'élément "articles"
4- créer, par exemple, un mot clef "galerie"
5- vous pouvez alors:
o soit créer un fichier article=galerie.html et associer le mot clef
galerie à des articles individuels
o soit créer un fichier article-galerie.html et associer le mot clef
à une rubrique qui contiendra tous vos articles de galerie.

38
SquelettesMots.php

@ -0,0 +1,38 @@
<?php
// Fichier créé pour SPIP avec un bout de code emprunté à celui ci.
// Distribué sans garantie sous licence GPL./
// Copyright (C) 2006 Pierre ANDREWS
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
$p=explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(__FILE__))));
define('_DIR_PLUGIN_CHERCHER_SQUELETTES',(_DIR_PLUGINS.end($p)));
function SquelettesMots_ajouter_onglets($flux) {
if($flux['args']=='configuration')
$flux['data']['config_chercher_squelettes_mots']=
new Bouton(
'../'._DIR_PLUGIN_CHERCHER_SQUELETTES.'/spip_death.png', 'Configurer Squelettes Mots',
generer_url_ecrire("config_chercher_squelettes_mots"));
return $flux;
}
//TODO: essayer de se passer de cette insertion unilaterale de css ...
function SquelettesMots_header_prive($texte) {
$texte.= '<link rel="stylesheet" type="text/css" href="'._DIR_PLUGIN_CHERCHER_SQUELETTES.'/chercher_squelettes_mots.css" />' . "\n";
return $texte;
}
?>

36
chercher_squelettes_mots.css

@ -0,0 +1,36 @@
fieldset.regle .forml {
display: inline;
margin-right:0.5em;
margin-bottom:1em;
width:auto;
}
fieldset.regle input.forml {
width:7em;
}
fieldset.regle div.possible {
width: 25em;
overflow: hidden;
}
fieldset.regle div.possible ul {
margin: 0;
list-style-type: none;
}
fieldset.regle div.possible ul li {
float: left;
padding-left: 1em;
font-size: small;
color: red;
}
fieldset.regle div.possible ul li a {
color: green;
}
fieldset.regle div.avertissement {
margin: 1em 3em;
color: red;
}

210
exec/config_chercher_squelettes_mots.php

@ -0,0 +1,210 @@
<?php
// Fichier cr‚‚ pour SPIP avec un bout de code emprunt‚ … celui ci.
// Distribu‚ sans garantie sous licence GPL./
// Copyright (C) 2006 Pierre ANDREWS
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
$p=explode(basename(_DIR_PLUGINS)."/",str_replace('\\','/',realpath(dirname(dirname(__FILE__)))));
define('_DIR_PLUGIN_CHERCHER_SQUELETTES',(_DIR_PLUGINS.end($p)));
function exec_config_chercher_squelettes_mots() {
global $connect_statut, $connect_toutes_rubriques;
include_spip("inc/presentation");
include_spip ("base/abstract_sql");
$commencer_page = charger_fonction('commencer_page', 'inc');
echo $commencer_page(_T('squelettesmots:titre_page'), "configuration");
if ($connect_statut != '0minirezo' OR !$connect_toutes_rubriques) {
echo _T('avis_non_acces_page');
exit;
}
if ($connect_statut == '0minirezo' AND $connect_toutes_rubriques ) {
echo '<br><br><br>';
echo gros_titre(_T('squelettesmots:gros_titre'),'',FALSE);
echo barre_onglets("configuration", "config_chercher_squelettes_mots");
/*Affichage*/
echo debut_gauche('',TRUE);
echo debut_boite_info(TRUE);
echo propre(_T('squelettesmots:help'));
echo fin_boite_info(TRUE);
echo debut_droite('',TRUE);
$config = charger_fonction('config', 'inc');
$config();
echo avertissement_config();
echo debut_cadre_relief("".find_in_path('spip_death.png')."", true);
echo '<form action="'.generer_url_ecrire('config_chercher_squelettes_mots').'" method="post">';
$groupes_mots = '';
$select = array('id_groupe','titre');
$from = array('spip_groupes_mots');
// include_ecrire('inc_filtres');
$rez = sql_select($select,$from);
while($row = sql_fetch($rez)) {
$groupes_mots[$row['id_groupe']] = extraire_multi($row['titre']);
}
sql_free($rez);
//TODO: trouver automatiquement ces informations pour toutes les tables avec un jonction sur les mots
$id_tables = array('articles' => 'id_article',
'rubriques' => 'id_rubrique',
'breves' => 'id_breve',
'sites' => 'id_site');
$fonds = unserialize(lire_meta('SquelettesMots:fond_pour_groupe'));
$field_fonds = $_REQUEST['fonds'];
$id_groupes = $_REQUEST['tid_groupe'];
$types = $_REQUEST['type'];
$actif = $_REQUEST['actif'];
/*On transforme les _POST en jolie tableau*/
if($field_fonds) {
$new_fonds = array();
foreach($field_fonds as $index => $fond) {
$index = intval($index);
$fond = addslashes($fond);
if($actif[$index]) {
$id_groupe = intval($id_groupes[$index]);
$type = addslashes($types[$index]);
$new_fonds[$fond] = array($id_groupe,$type,$id_tables[$type]);
}
}
$fonds = $new_fonds;
}
$index = 0;
if (is_array($fonds))
foreach($fonds as $fond => $a) {
list($id_groupe,$type,$id_table) = $a;
$index++;
echo '<fieldset class="regle">';
echo '<legend>'._T('squelettesmots:reglei',array('id'=>$index)).'</legend>';
if(!find_in_path($fond.'.html')) {
echo '<div class="avertissement">';
echo _T('squelettesmots:avertissement',array('squelette'=>'<em>'.$fond.'.html'.'</em>'));
echo '</div>';
}
// echo '<div class="champs">';
echo "<input type=\"checkbox\" class=\"actif\" name=\"actif[$index]\" checked=\"true\"/>";
echo "<label for=\"fond_$index\" class=\"fond\">"._T('squelettesmots:fond')."</label>";
echo "<input type=\"text\" name=\"fonds[$index]\" class=\"forml\" value=\"$fond\" id=\"fond_$index\"/>";
echo "<label for=\"id_groupe_$index\" class=\"id_groupe\">"._T('squelettesmots:groupe')."</label>";
echo "<select name=\"tid_groupe[$index]\" class=\"id_groupe forml\" id=\"id_groupe_$index\">";
foreach($groupes_mots as $id => $titre) {
echo "<option value=\"$id\"".(($id_groupe == $id)?' selected="true"':'').">$titre</option>";
}
echo '</select>';
echo "<label for=\"type_$index\" class=\"type\">"._T('squelettesmots:type')."</label>";
echo "<select name=\"type[$index]\" class=\"type forml\" id=\"type_$index\">";
foreach($id_tables as $t => $x) {
echo "<option value=\"$t\"".(($type == $t)?' selected="true"':'').">$t</option>";
}
echo '</select>';
// echo '</div>';
$select1 = array('titre');
$from1 = array('spip_mots AS mots');
$where1 = array("id_groupe=$id_groupe");
$rez =sql_select($select1,$from1,$where1);
$liste_squel = '<ul>';
$ext = 'html'; //On force a html, c'est pas beau, mais je vois pas la solution actuellement.
$cnt_actif = 0;
$cnt_inactif = 0;
while ($r = sql_fetch($rez)) {
include_spip("inc/charsets");
$n = translitteration(preg_replace('/["\'.\s]/','_',extraire_multi($r['titre'])));
if ($squel = find_in_path("$fond-$n.$ext")) {
$cnt_actif++;
$liste_squel .= "<li><a href=\"$squel\">$fond-$n.$ext</a></li>";
} else {
$cnt_inactif++;
$liste_squel .= "<li>$fond-$n.$ext</li>";
}
if ($squel = find_in_path("$fond=$n.$ext")) {
$cnt_actif++;
$liste_squel .= "<li><a href=\"$squel\">$fond=$n.$ext</a></li>";
} else {
$cnt_inactif++;
$liste_squel .= "<li>$fond=$n.$ext</li>";
}
}
sql_free($rez);
$liste_squel .= '</ul>';
echo '<div class="possible">';
if($cnt_actif+$cnt_inactif > 0) {
echo bouton_block_depliable(_T('squelettesmots:possibilites',array('total_actif' => $cnt_actif, 'total_inactif'=>$cnt_inactif)),false);
echo debut_block_depliable(false,"regle$index");
echo $liste_squel;
echo fin_block();
}
echo '</div>';
echo '</fieldset>';
}
$index++;
echo '<hr/>';
echo '<fieldset class="nouvelle regle">';
echo '<legend>'._T('squelettesmots:nouvelle_regle').'</legend>';
echo "<input type=\"checkbox\" class=\"actif\" name=\"actif[$index]\"/>";
echo "<label for=\"fond_$index\" class=\"fond\">"._T('squelettesmots:fond')."</label>";
echo "<input type=\"text\" name=\"fonds[$index]\" class=\"forml\" value=\"article\"/>";
echo "<label for=\"id_groupe_$index\" class=\"id_groupe\">"._T('squelettesmots:groupe')."</label>";
echo "<select name=\"tid_groupe[$index]\" class=\"id_groupe forml\" id=\"id_groupe_$index\">";
foreach($groupes_mots as $id => $titre) {
echo "<option value=\"$id\">$titre</option>";
}
echo '</select>';
echo "<label for=\"type_$index\" class=\"type\">"._T('squelettesmots:type')."</label>";
echo "<select name=\"type[$index]\" class=\"type forml\" id=\"type_$index\">";
foreach($id_tables as $t => $x) {
echo "<option value=\"$t\">$t</option>";
}
echo '</select>';
echo '</fieldset>';
echo '<div style="text-align: right;"><input type="submit" class="fondo" value="'._T('bouton_valider').'"/></div>';
echo '</form>';
echo fin_cadre_relief(true);
}
ecrire_meta('SquelettesMots:fond_pour_groupe',serialize($fonds));
ecrire_metas();
echo fin_gauche();
echo fin_page();
}
?>

26
lang/squelettesmots_en.php

@ -0,0 +1,26 @@
<?php
$GLOBALS[$GLOBALS['idx_lang']] = array(
'titre_page' => 'Configure the selection of templates',
'gros_titre' => 'Create rules to choose templates based on keywords',
'help' => 'This page is only accessible to administrators. You can create here some rules to choose templates by keywords associated to an element in SPIP.
A rule specify:
-# a basic "fond" (the file that is used as template by default for this element),
-# the keyword group that will contain keywords specifying the template to use,
-# the type of element that this template displays.
The templates will then be named {{fond-keyword.html}}. The plugin search first for a template that match a keyword associated to the element. If not found (and if applicable), the plugin then search for a template matching a keyword associated to one of the subsuming section.
The author then only have to add a keyword from the right group to select the template used.',
'reglei' => 'rule @id@',
'nouvelle_regle' => 'new rule',
'fond' => 'Fond:',
'groupe' => 'Group:',
'type' => 'Type:',
'possibilites' => '@total_actif@ template(s) availlable.',
'avertissement' => 'The template @squelette@ doesn\'t exist. This rule will not work properly if the default template is not present.'
);
?>

26
lang/squelettesmots_fr.php

@ -0,0 +1,26 @@
<?php
$GLOBALS[$GLOBALS['idx_lang']] = array(
'titre_page' => 'Configuration du choix du squelette',
'gros_titre' => 'Cr&eacute;er des r&egrave;gles pour choisir les squelettes en fonction des mots clef',
'help' => 'Cette page n\'est accesible qu\'aux administrateur. Vous pouvez creer des r&egrave;gles pour choisir les squelettes de vos page avec des mots clef.
Une r&egrave;gle sp&eacute;cifie:
-# un fond de base,
-# le groupe de mot clef qui contient les mots pour specifier le squelette,
-# le type de l\'&eacute;l&eacute;ment affich&eacute; par cette page.
Les squelettes seront alors nomm&eacute;s {{fond-mot.html}}. Le plugin va d\'abord chercher pour un squelette qui correspond &agrave; un mot clef attach&eacute; &agrave; l\'&eacute;l&eacute;ment et s\'il n\'en trouve pas, il cherchera un squelette qui correspond &agrave; un des mots clefs d\'une des rubriques parentes.
Les auteurs n\'ont alors plus qu\'&agrave; associer un mot du groupe &agrave; l\'&eacute;l&eacute;ment.',
'reglei' => 'R&egrave;gle @id@',
'nouvelle_regle' => 'Nouvelle r&egrave;gle',
'fond' => 'Fond:',
'groupe' => 'Groupe:',
'type' => 'Type:',
'possibilites' => '@total_actif@ squelette(s).',
'utiliserasquelette' => 'Cet article utilisera le squelette @squelette@',
'avertissement' => 'Attention le squelette @squelette@ n\'existe pas, cette r&egrave;gle ne marchera pas tant que le squelette par d&eacute;faut n\'est pas pr&eacute;sent.'
);
?>

26
lang/squelettesmots_it.php

@ -0,0 +1,26 @@
<?php
$GLOBALS[$GLOBALS['idx_lang']] = array(
'titre_page' => 'Configurazione della scelta di modelli da parole chiave.',
'gros_titre' => 'Creare regole per scegliere i modelli con una parola chiave.',
'help' => 'Solamente gli amministratori possono utilizzare questa pagina. Potete creare regole per la scelta di modelli di pagina con una parola chiave.
Una regola specifica:
-# uno sfondo di base,
-# il gruppo di parole chiave che contiene le parole che specificano il modello,
-# il tipo di elementi visualizzati sulla pagina.
I modelli saranno allora chiamati {{sfondo-parola.html}}. Il plugin cercher&agrave; prima un modello che corrisponda a una delle parole chiave associate all\'elemento. Se non lo trova, cercher&agrave; allora un modello che corrisponda a una parola chiave di una delle rubriche che contengono questo elemento.
Gli autori devono allora solamente associare la parola chiave corretta all\'elemento per scegliere il suo modello.',
'reglei' => 'Regola @id@',
'nouvelle_regle' => 'Nuova regola',
'fond' => 'Sfondo:',
'groupe' => 'Gruppo:',
'type' => 'Tipo:',
'possibilites' => '@total_actif@ modello(i).',
'utiliserasquelette' => 'Questo articolo utilizzer&agrave; il modello @squelette@'
);
?>

72
plugin.xml

@ -0,0 +1,72 @@
<!-- En date du 17 fevrier 2006, des explications sur les plugins se trouvent ici :
http://listes.rezo.net/archives/spip-core/2005-10/msg00002.html -->
<plugin>
<nom> <!-- Nom du plugin -->
<multi>
[fr]
Squelette par mot clef
[en]
Template selection by keyword
[it]
Scelta del modello mediante una parola chiave
</multi>
</nom>
<auteur> <!-- Auteur du plugin -->
Pierre Andrews (Mortimer), d'apr&#232;s un code propos&#233; par D&#233;esse A.
</auteur>
<version>
2.0
</version>
<etat>
dev
</etat>
<description>
<multi>
[fr]
Permet de choisir le squelette en fonction d'un mot clef.
La page de configuration permet de cr&#233;er des r&#232;gles liant:
-* un type d'&#233;l&#233;ment,
-* un groupe de mot clef sp&#233;cifiant le squelette
-* un fond.
Ainsi, les auteurs n'ont plus qu'&#224; associer le bon mot clef &#224;
leur article (par exemple) pour s&#233;lectionner sa mise en page.
[en]
This plugin provides selection of template using keywords.
You can create rules on the configuration page to link:
-* an element type,
-* a group of keyword specifying the template
-* a template base name.
Then, the authors only have to associate a keyword to their article (for example) to
set its layout.
[it]
Questo plugin permette di scegliere un modello mediante una parola chiave.
La pagina di configurazione permette di creare regole per legare:
-* un tipo di elemento,
-* un gruppo di parole chiave per scegliere il modello,
-* un sfondo,
Cos&igrave;, gli autori devono solamente scegliere la parola chiave giusta per cambiare il modello de la pagina che visualizza l'elemento (l'articolo per esempio)
</multi>
</description>
<icon>spip_death.png</icon>
<lien>http://www.spip-contrib.net/Choix-des-squelettes-par-mot-clef</lien>
<prefix>
SquelettesMots
</prefix>
<pipeline>
<nom>ajouter_onglets</nom>
<inclure>SquelettesMots.php</inclure>
</pipeline>
<pipeline>
<nom>header_prive</nom>
<inclure>SquelettesMots.php</inclure>
</pipeline>
<necessite id="spip" version="[2.0.0;]" />
<chemin dir='' />
</plugin>

412
public/parametrer.php

@ -0,0 +1,412 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2008 *
* 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;
//
// Ce fichier calcule une page en executant un squelette.
//
include_spip('base/abstract_sql');
include_spip('inc/lang');
// NB: Ce fichier peut initialiser $dossier_squelettes (old-style)
// donc il faut l'inclure "en globals"
if ($f = find_in_path('mes_fonctions.php')
OR $f = find_in_path('mes_fonctions.php3')) {
global $dossier_squelettes;
include ($f);
}
if (@is_readable(_DIR_TMP."charger_plugins_fonctions.php")){
// chargement optimise precompile
include_once(_DIR_TMP."charger_plugins_fonctions.php");
}
//
// Contexte : lors du calcul d'une page spip etablit le contexte a partir
// des variables $_GET et $_POST, et leur ajoute la date
// Note : pour hacker le contexte depuis le fichier d'appel (page.php),
// il est recommande de modifier $_GET['toto'] (meme si la page est
// appelee avec la methode POST).
//
// http://doc.spip.org/@calculer_contexte
function calculer_contexte() {
$contexte = array();
foreach($_GET as $var => $val) {
if (strpos($var, 'var_') !== 0)
$contexte[$var] = $val;
}
foreach($_POST as $var => $val) {
if (strpos($var, 'var_') !== 0)
$contexte[$var] = $val;
}
if (($a = _request('date')) !== null)
$contexte['date'] = $contexte['date_redac'] = normaliser_date($a);
else
$contexte['date'] = $contexte['date_redac'] = date("Y-m-d H:i:s");
return $contexte;
}
// http://doc.spip.org/@echapper_php_callback
function echapper_php_callback($r) {
static $src = array();
static $dst = array();
// si on recoit un tableau, on est en mode echappement
// on enregistre le code a echapper dans dst, et le code echappe dans src
if (is_array($r)) {
$dst[] = $r[0];
return $src[] = '___'.md5($r[0]).'___';
}
// si on recoit une chaine, on est en mode remplacement
$r = str_replace($src, $dst, $r);
$src = $dst = array(); // raz de la memoire
return $r;
}
// http://doc.spip.org/@analyse_resultat_skel
function analyse_resultat_skel($nom, $cache, $corps, $source='') {
$headers = array();
// Recupere les < ?php header('Xx: y'); ? > pour $page['headers']
// note: on essaie d'attrapper aussi certains de ces entetes codes
// "a la main" dans les squelettes, mais evidemment sans exhaustivite
if (preg_match_all(
'/(<[?]php\s+)@?header\s*\(\s*.([^:]*):\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims',
$corps, $regs, PREG_SET_ORDER))
foreach ($regs as $r) {
$corps = str_replace($r[0], '', $corps);
# $j = Content-Type, et pas content-TYPE.
$j = join('-', array_map('ucwords', explode('-', strtolower($r[2]))));
$headers[$j] = $r[3];
}
// S'agit-il d'un resultat constant ou contenant du code php
$process_ins = (
strpos($corps,'<'.'?') === false
OR strpos(str_replace('<'.'?xml', '', $corps),'<'.'?') === false
)
? 'html'
: 'php';
// traiter #FILTRE{} ?
if (isset($headers['X-Spip-Filtre'])
AND strlen($headers['X-Spip-Filtre'])) {
// proteger les <INCLUDE> et tous les morceaux de php
if ($process_ins == 'php')
$corps = preg_replace_callback(',<[?](\s|php|=).*[?]>,UimsS',
echapper_php_callback, $corps);
foreach (explode('|', $headers['X-Spip-Filtre']) as $filtre) {
$corps = appliquer_filtre($corps, $filtre);
}
// restaurer les echappements
$corps = echapper_php_callback($corps);
unset($headers['X-Spip-Filtre']);
}
return array('texte' => $corps,
'squelette' => $nom,
'source' => $source,
'process_ins' => $process_ins,
'invalideurs' => $cache,
'entetes' => $headers,
'duree' => isset($headers['X-Spip-Cache']) ? intval($headers['X-Spip-Cache']) : 0
);
}
// Calcul de la rubrique associee a la requete
// (selection de squelette specifique par id_rubrique & lang)
// http://doc.spip.org/@quete_rubrique_fond
function quete_rubrique_fond($contexte) {
if (isset($contexte['id_rubrique'])
AND $id = intval($contexte['id_rubrique'])
AND $row = sql_fetsel('id_parent, lang', 'spip_rubriques',"id_rubrique=$id")) {
$lang = isset($row['lang']) ? $row['lang'] : '';
return array ($id, $lang);
}
if (isset($contexte['id_breve'])
AND $id = intval($contexte['id_breve'])
AND $row = sql_fetsel('id_rubrique, lang', 'spip_breves', "id_breve=$id")
AND $id_rubrique_fond = $row['id_rubrique']) {
$lang = isset($row['lang']) ? $row['lang'] : '';
return array($id_rubrique_fond, $lang);
}
if (isset($contexte['id_syndic'])
AND $id = intval($contexte['id_syndic'])
AND $row = sql_fetsel('id_rubrique', 'spip_syndic', "id_syndic=$id")
AND $id_rubrique_fond = $row['id_rubrique']
AND $row = sql_fetsel('id_parent, lang', 'spip_rubriques', "id_rubrique=$id_rubrique_fond")) {
$lang = isset($row['lang']) ? $row['lang'] : '';
return array($id_rubrique_fond, $lang);
}
if (isset($contexte['id_article'])
AND $id = intval($contexte['id_article'])
AND $row = sql_fetsel('id_rubrique, lang', 'spip_articles', "id_article=$id")
AND $id_rubrique_fond = $row['id_rubrique']) {
$lang = isset($row['lang']) ? $row['lang'] : '';
return array($id_rubrique_fond, $lang);
}
}
# retourne le chapeau d'un article, et seulement s'il est publie
// http://doc.spip.org/@quete_chapo
function quete_chapo($id_article, $connect) {
return sql_getfetsel('chapo', 'spip_articles', array("id_article=".intval($id_article), "statut='publie'"), '','','','',$connect);
}
# retourne le parent d'une rubrique
// http://doc.spip.org/@quete_parent
function quete_parent($id_rubrique, $connect='') {
if (!$id_rubrique = intval($id_rubrique))
return 0;
return intval(sql_getfetsel('id_parent','spip_rubriques',"id_rubrique=" . $id_rubrique, '','','','',$connect));
}
# retourne la profondeur d'une rubrique
// http://doc.spip.org/@quete_profondeur
function quete_profondeur($id, $connect='') {
$n = 0;
while ($id) {
$n++;
$id = quete_parent($id, $connect);
}
return $n;
}
# retourne la rubrique d'un article
// http://doc.spip.org/@quete_rubrique
function quete_rubrique($id_article, $serveur) {
return sql_getfetsel('id_rubrique', 'spip_articles',"id_article=" . intval($id_article), '',array(), '', '', $serveur);
}
# retourne le fichier d'un document
// http://doc.spip.org/@quete_fichier
function quete_fichier($id_document, $serveur) {
return sql_getfetsel('fichier', 'spip_documents', ("id_document=" . intval($id_document)), '',array(), '', '', $serveur);
}
// http://doc.spip.org/@quete_petitions
function quete_petitions($id_article, $table, $id_boucle, $serveur, &$cache) {
$retour = sql_getfetsel('texte', 'spip_petitions',("id_article=".intval($id_article)),'',array(),'','', $serveur);
if ($retour === NULL) return '';
# cette page est invalidee par toute petition
$cache['varia']['pet'.$id_article] = 1;
# ne pas retourner '' car le texte sert aussi de presence
return $retour ? $retour : ' ';
}
# retourne le champ 'accepter_forum' d'un article
// http://doc.spip.org/@quete_accepter_forum
function quete_accepter_forum($id_article) {
// si la fonction est appelee en dehors d'une boucle
// article (forum de breves), $id_article est nul
// mais il faut neanmoins accepter l'affichage du forum
// d'ou le 0=>'' (et pas 0=>'non').
static $cache = array(0 => '');
$id_article = intval($id_article);
if (isset($cache[$id_article])) return $cache[$id_article];
return $cache[$id_article] = sql_getfetsel('accepter_forum','spip_articles',"id_article=$id_article");
}
// recuperer une meta sur un site distant (en local il y a plus simple)
// http://doc.spip.org/@quete_meta
function quete_meta($nom, $serveur) {
return sql_getfetsel("valeur", "spip_meta", "nom=" . sql_quote($nom),
'','','','',$serveur);
}
# Determine les parametres d'URL (hors reecriture) et consorts
# En deduit un contexte disant si la page est une redirection ou
# exige un squelette deductible de $fond et du contexte de langue.
# Applique alors le squelette sur le contexte et le nom du cache.
# Retourne un tableau ainsi construit
# 'texte' => la page calculee
# 'process_ins' => 'html' ou 'php' si presence d'un '< ?php'
# 'invalideurs' => les invalideurs de ce cache
# 'entetes' => headers http
# 'duree' => duree de vie du cache
# 'signal' => contexte (les id_* globales)
# En cas d'erreur process_ins est absent et texte est un tableau de 2 chaines
// http://doc.spip.org/@public_parametrer_dist
// smc: fonction a surcharger proprement plutot que tout le fichier ???
function public_parametrer_dist($fond, $local='', $cache='', $connect='') {
// verifier que la fonction assembler est bien chargee (cf. #608)
$assembler = charger_fonction('assembler', 'public');
// et toujours charger les fonctions de generation d'URL.
$renommer_urls= charger_fonction($GLOBALS['type_urls'], 'urls', true);
// distinguer le premier appel des appels par inclusion
if (!is_array($local)) {
include_spip('inc/filtres'); // pour normaliser_date
// ATTENTION, gestion des URLs transformee par le htaccess
// en appelant la fonction $renommee_urls
// 1. $contexte est global car cette fonction le modifie.
// 2. $fond est passe par reference, pour la meme raison
// Bref, les URL dites propres ont une implementation sale.
// Interdit de nettoyer, faut assumer l'histoire.
$GLOBALS['contexte'] = calculer_contexte();
if (!$renommer_urls) {
// compatibilite < 1.9.3
charger_generer_url();
if (function_exists('recuperer_parametres_url'))
$renommer_urls = 'recuperer_parametres_url';
}
if ($renommer_urls)
$renommer_urls($fond, nettoyer_uri());
$local = $GLOBALS['contexte'];
// si le champ chapo commence par '=' c'est une redirection.
// avec un eventuel raccourci Spip
// si le raccourci a un titre il sera pris comme corps du 302
if ($fond == 'article'
AND $id_article = intval($local['id_article'])) {
$m = quete_chapo($id_article, $connect);
if ($m[0]=='=') {
include_spip('inc/texte');
// les navigateurs pataugent si l'URL est vide
if ($url = chapo_redirige(substr($m,1), true))
return array('texte' => "<"
. "?php header('Location: "
. texte_script(str_replace('&amp;', '&', $url))
. "'); echo '"
. addslashes($m[1])
. "'?" . ">",
'process_ins' => 'php');
}
}
}
// Choisir entre $fond-dist.html, $fond=7.html, etc?
$id_rubrique_fond = 0;
// Chercher le fond qui va servir de squelette
if ($r = quete_rubrique_fond($local))
list($id_rubrique_fond, $lang) = $r;
// Si inc-urls ou un appel dynamique veut fixer la langue, la recuperer
if (isset($local['lang']))
$lang = $local['lang'];
if (!isset($lang))
$lang = $GLOBALS['meta']['langue_site'];
$select = ((!isset($GLOBALS['forcer_lang']) OR !$GLOBALS['forcer_lang']) AND $lang <> $GLOBALS['spip_lang']);
if ($select) $select = lang_select($lang);
$styliser = charger_fonction('styliser', 'public');
list($skel,$mime_type, $gram, $sourcefile) =
$styliser($fond, $id_rubrique_fond, $GLOBALS['spip_lang'], $connect,'', $local);
// calcul du nom du squelette
$fonc = $mime_type
. (!$connect ? '' : preg_replace('/\W/',"_", $connect)) . '_'
. md5($GLOBALS['spip_version_code'].' * '.$skel);
$debug = (isset($GLOBALS['var_mode']) && ($GLOBALS['var_mode'] == 'debug'));
// sauver le nom de l'eventuel squelette en cours d'execution
// (recursion possible a cause des modeles)
$courant = $debug ? @$GLOBALS['debug_objets']['courant'] : '';
// si pas deja en memoire (INCLURE a repetition),
// charger le squelette en specifiant les langages cibles et source
// au cas il faudrait le compiler (source posterieure au resultat)
if (!function_exists($fonc)) {
$composer = charger_fonction('composer', 'public');
if ($debug) {
$GLOBALS['debug_objets']['contexte'][$sourcefile] = $local;
$GLOBALS['debug_objets']['courant'] = $fonc;
}
$fonc = $composer($skel, $fonc, $gram, $sourcefile, $connect);
}
// Appliquer le squelette compile' sur le contexte.
// Passer le nom du cache pour produire sa destruction automatique
if ($fonc) {
spip_timer($a = 'calcul page '.rand(0,1000));
$notes = calculer_notes(); // conserver les notes...
$page = $fonc(array('cache' => $cache), array($local));
// ... et les retablir
if ($n = calculer_notes()) spip_log("notes ignorees par $fonc: $n");
$GLOBALS['les_notes'] = $notes;
// spip_log: un joli contexte
$infos = array();
foreach (array_filter($local) as $var => $val) {
if (is_array($val)) $val = "[".join($val)."]";
if (strlen("$val") > 20)
$val = substr("$val", 0,17).'..';
if (strstr($val,' '))
$val = "'$val'";
$infos[] = $var.'='.$val;
}
spip_log("calcul ("
.($profile = spip_timer($a))
.") [$skel] "
. join(', ', $infos)
.' ('.strlen($page['texte']).' octets)'
);
if ($debug)
$GLOBALS['debug_objets']['profile'][$sourcefile] = $profile;
// Si #CACHE{} n'etait pas la, le mettre a $delais
if (!isset($page['entetes']['X-Spip-Cache']))
$page['entetes']['X-Spip-Cache'] = isset($GLOBALS['delais'])?$GLOBALS['delais']:36000;
} else
$page = array();
if ($debug) {
include_spip('public/debug');
debug_dumpfile (strlen($page['texte'])?$page['texte']:" ", $fonc, 'resultat');
$GLOBALS['debug_objets']['courant'] = $courant;
}
$page['contexte'] = $local;
if ($select) lang_select();
// Si un modele contenait #SESSION, on note l'info dans $page
if (isset($GLOBALS['cache_utilise_session'])) {
$page['invalideurs']['session'] = $GLOBALS['cache_utilise_session'];
unset($GLOBALS['cache_utilise_session']);
}
return $page;
}
?>

134
public/styliser.php

@ -0,0 +1,134 @@
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2008 *
* 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;
// Ce fichier doit imperativement definir la fonction ci-dessous:
// Actuellement tous les squelettes se terminent par .html
// pour des raisons historiques, ce qui est trompeur
// http://doc.spip.org/@public_styliser_dist
// smc: fonction a surcharger proprement plutot que tout le fichier, a voir car que cette fonction dans le fichier ???
function public_styliser_dist($fond, $id_rubrique, $lang='', $connect='', $ext='html', $contexte) {
if ($ext=='') $ext='html'; //smc: pb d'init valeur par defaut, on forcele test faute de mieux...
// Trouver un squelette de base dans le chemin
if (!$base = find_in_path("$fond.$ext")) {
// Si pas de squelette regarder si c'est une table
$trouver_table = charger_fonction('trouver_table', 'base');
if (preg_match('/^table:(.*)$/', $fond, $r)
AND $table = $trouver_table($r[1], $connect)
AND include_spip('inc/autoriser')
AND autoriser('webmestre')
) {
$fond = $r[1];
$base = _DIR_TMP . 'table_'.$fond . ".$ext";
if (!file_exists($base)
OR $GLOBALS['var_mode']) {
$vertebrer = charger_fonction('vertebrer', 'public');
ecrire_fichier($base, $vertebrer($table));
}
} else { // on est gentil, mais la ...
include_spip('public/debug');
erreur_squelette(_T('info_erreur_squelette2',
array('fichier'=>"'$fond'")),
$GLOBALS['dossier_squelettes']);
$f = find_in_path(".$ext"); // on ne renvoie rien ici, c'est le resultat vide qui provoquere un 404 si necessaire
return array(substr($f, 0, -strlen(".$ext")), $ext, $ext, $f);
}
}
// supprimer le ".html" pour pouvoir affiner par id_rubrique ou par langue
$squelette = substr($base, 0, - strlen(".$ext"));
// On selectionne, dans l'ordre :
// fond=10
if ($id_rubrique) {
$f = "$squelette=$id_rubrique";
if (@file_exists("$f.$ext"))
$squelette = $f;
else {
// fond-10 fond-<rubriques parentes>
do {
$f = "$squelette-$id_rubrique";
if (@file_exists("$f.$ext")) {
$squelette = $f;
break;
}
} while ($id_rubrique = quete_parent($id_rubrique));
}
}
// smc: on ajoute la recherche des squelettes par mots clefs
if(!$trouve) {
$fonds = unserialize($GLOBALS['meta']['SquelettesMots:fond_pour_groupe']);
if (is_array($fonds) && (list($id_groupe,$table,$id_table) = $fonds[$fond])) {
$trouve = false;
$stop = false;
if (($id = intval($contexte[$id_table])) && ($n = sql_mot_squelette($id,$id_groupe,$table,$id_table))) {
if ($squel = find_in_path("$fond=$n.$ext")) {
$squelette = substr($squel, 0, - strlen(".$ext"));
$trouve = true;
$stop = true;
}
else if ($squel = find_in_path("$fond-$n.$ext")) {
$squelette = substr($squel, 0, - strlen(".$ext"));
$trouve = true;
}
}
if((!$trouve) && (!$stop) && ($n = sql_mot_squelette($id_rub_init,$id_groupe,'rubriques','id_rubrique',true))) {
if ($squel = find_in_path("$fond-$n.$ext")) {
$squelette = substr($squel, 0, - strlen(".$ext"));
}
}
}
}
// fin ajout smc
// Affiner par lang
if ($lang) {
$l = lang_select($lang);
$f = "$squelette.".$GLOBALS['spip_lang'];
if ($l) lang_select();
if (@file_exists("$f.$ext"))
$squelette = $f;
}
return array($squelette, $ext, $ext, "$squelette.$ext");
}
// smc: on ajoute la fonction qui va chercher les mots associŽs aux items dans le groupe qui va bien
function sql_mot_squelette($id,$id_groupe,$table,$id_table,$recurse=false) {
$select1 = array('titre');
$from1 = array('spip_mots AS mots',
"spip_mots_$table AS lien");
while($id > 0) {
$where1 = array("$id_table=$id",
'mots.id_mot=lien.id_mot',
"id_groupe=$id_groupe");
//utilisation nouvelle fonciton spip2.0 optimisee a tester
$r = sql_fetsel($select1,$from1,$where1);
if ($r) {
include_spip("inc/charsets");
include_spip("inc/filtres");
return translitteration(preg_replace('/["\'.\s]/','_',extraire_multi($r['titre'])));
}
if(!$recurse) return '';
$id = quete_parent($id);
}
return '';
}
?>

BIN
spip_death.png

After

Width: 19  |  Height: 24  |  Size: 1.5 KiB

Loading…
Cancel
Save