-
Notifications
You must be signed in to change notification settings - Fork 0
/
z_pipelines.php
278 lines (248 loc) · 8.75 KB
/
z_pipelines.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2009 *
* 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;
// demander a SPIP de definir 'type' dans le contexte du premier squelette
define('_DEFINIR_CONTEXTE_TYPE',true);
/**
* Inutilise mais permet le chargement de ce fichier avant le decodage des urls
* et l'utilisation de _DEFINIR_CONTEXTE_TYPE
* @param <type> $flux
* @return <type>
*/
function Z_declarer_url_objets($flux){
return $flux;
}
/**
* Fonction Page automatique a partir de contenu/page-xx
*
* @param array $flux
* @return array
*/
function Z_styliser($flux){
$z_blocs = isset($GLOBALS['z_blocs'])?$GLOBALS['z_blocs']:array('structure/principal','structure/secondaire','structure/sous-menu');
$z_contenu = reset($z_blocs); // contenu par defaut
$squelette = $flux['data'];
$fond = $flux['args']['fond'];
$ext = $flux['args']['ext'];
// gerer les squelettes non trouves
// -> router vers les /dist.html
// ou scaffolding ou page automatique les contenus
if (!$squelette){
// si on est sur un ?page=XX non trouve
if ($flux['args']['contexte'][_SPIP_PAGE] == $fond OR $flux['args']['contexte']['type'] == $fond) {
// si c'est un objet spip, associe a une table, utiliser le fond homonyme
if (z_scaffoldable($fond)){
$flux['data'] = substr(find_in_path("objet.$ext"), 0, - strlen(".$ext"));
}
// sinon, brancher sur contenu/page-xx si elle existe
// si on est sur un ?page=XX non trouve
elseif ($flux['args']['contexte'][_SPIP_PAGE] == $fond) {
$base = "$z_contenu/page-".$fond.".".$ext;
if ($base = find_in_path($base)){
$flux['data'] = substr(find_in_path("page.$ext"), 0, - strlen(".$ext"));
}
}
}
// scaffolding :
// si c'est un fond de contenu d'un objet en base
// generer un fond automatique a la volee pour les webmestres
elseif (strncmp($fond, "$z_contenu/", strlen($z_contenu)+1)==0
AND include_spip('inc/autoriser')
AND isset($GLOBALS['visiteur_session']['id_auteur']) // performance
AND autoriser('webmestre')){
$type = substr($fond,strlen($z_contenu)+1);
if ($is = z_scaffoldable($type))
$flux['data'] = z_scaffolding($type,$is[0],$is[1],$is[2],$ext);
}
// sinon, si on demande un fond non trouve dans un des autres blocs
// et si il y a bien un contenu correspondant ou scaffoldable
// se rabbatre sur le dist.html du bloc concerne
else{
if ( $dir = explode('/',$fond)
AND $dir = reset($dir)
AND $dir !== $z_contenu
AND in_array($dir,$z_blocs)){
$type = substr($fond,strlen("$dir/"));
if (find_in_path("$z_contenu/$type.$ext") OR z_scaffoldable($type))
$flux['data'] = substr(find_in_path("$dir/dist.$ext"), 0, - strlen(".$ext"));
}
}
$squelette = $flux['data'];
}
if ($fond=='body' AND substr($squelette,-strlen($fond))==$fond){
if (isset($flux['args']['contexte']['type'])
AND (
(isset($flux['args']['contexte']['composition'])
AND file_exists(($f=$squelette."-".$flux['args']['contexte']['type']."-".$flux['args']['contexte']['composition']).".$ext"))
OR
file_exists(($f=$squelette."-".$flux['args']['contexte']['type']).".$ext")
))
$flux['data'] = $f;
}
// chercher le fond correspondant a la composition
elseif (isset($flux['args']['contexte']['composition'])
AND substr($squelette,-strlen($fond))==$fond
AND $dir = explode('/',$fond)
AND $dir = reset($dir)
AND in_array($dir,$z_blocs)
AND $f=find_in_path($fond."-".$flux['args']['contexte']['composition'].".$ext")){
$flux['data'] = substr($f,0,-strlen(".$ext"));
}
return $flux;
}
/**
* Tester si un type est scaffoldable
* cad si il correspond bien a un objet en base
*
* @staticvar array $scaffoldable
* @param string $type
* @return bool
*/
function z_scaffoldable($type){
static $scaffoldable = array();
if (isset($scaffoldable[$type]))
return $scaffoldable[$type];
if (preg_match(',[^\w],',$type))
return $scaffoldable[$type] = false;
if ($table = table_objet($type)
AND $type == objet_type($table)
AND $trouver_table = charger_fonction('trouver_table','base')
AND
($desc = $trouver_table($table)
OR $desc = $trouver_table($table_sql = $GLOBALS['table_prefix']."_$table"))
)
return $scaffoldable[$type] = array($table,$desc['table'],$desc);
else
return $scaffoldable[$type] = false;
}
/**
* Generer a la volee un fond a partir d'une table de contenu
*
* @param string $type
* @param string $table
* @param string $table_sql
* @param array $desc
* @param string $ext
* @return string
*/
function z_scaffolding($type,$table,$table_sql,$desc,$ext){
include_spip('public/interfaces');
$primary = id_table_objet($type);
if (!$primary AND isset($desc['key']["PRIMARY KEY"])){
$primary = $desc['key']["PRIMARY KEY"];
}
// reperer un titre
$titre = 'titre';
if (isset($GLOBALS['table_titre'][$table])){
$titre = explode(' ',$GLOBALS['table_titre'][$table]);
$titre = explode(',',reset($titre));
$titre = reset($titre);
}
if (isset($desc['field'][$titre])){
unset($desc['field'][$titre]);
$titre="<h1 class='h1 #EDIT{titre}'>#".strtoupper($titre)."</h1>";
}
else $titre="";
// reperer une date
$date = "date";
if (isset($GLOBALS['table_date'][$table]))
$date = $GLOBALS['table_date'][$table];
if (isset($desc['field'][$date])){
unset($desc['field'][$date]);
$date = strtoupper($date);
$date="<p class='info-publi'>[(#$date|nom_jour) ][(#$date|affdate)][, <span class='auteurs'><:par_auteur:> (#LESAUTEURS)</span>]</p>";
}
else $date = "";
$content = array();
foreach($desc['field'] as $champ=>$z){
if (!in_array($champ,array('maj','statut','idx',$primary))){
$content[] = "[<div><strong>$champ</strong><div class='#EDIT{".$champ."} $champ'>(#".strtoupper($champ)."|image_reduire{500,0})</div></div>]";
}
}
$content = implode("\n\t",$content);
$scaffold = "#CACHE{0}
<BOUCLE_contenu($table_sql){".$primary."}>
[(#REM) Fil d'Ariane ]
<p id='hierarchie'><a href='#URL_SITE_SPIP/'><:accueil_site:></a>[ > <strong class='on'>(#TITRE|couper{80})</strong>]</p>
<div class='contenu-principal'>
<div class='cartouche'>
$titre
$date
</div>
$content
</div>
[<div class='notes surlignable'><h2 class='h2 pas_surlignable'><:info_notes:></h2>(#NOTES)</div>]
</BOUCLE_contenu>";
$dir = sous_repertoire(_DIR_CACHE,"scaffold",false);
$dir = sous_repertoire($dir,"contenu",false);
$f = $dir."$type";
ecrire_fichier("$f.$ext",$scaffold);
return $f;
}
/**
* Surcharger les intertires avant que le core ne les utilise
* pour y mettre la class h3
* une seule fois suffit !
*
* @param string $flux
* @return string
*/
function Z_pre_propre($flux){
static $init = false;
if (!$init){
$intertitre = $GLOBALS['debut_intertitre'];
$class = extraire_attribut($GLOBALS['debut_intertitre'],'class');
$class = ($class ? " $class":"");
$GLOBALS['debut_intertitre'] = inserer_attribut($GLOBALS['debut_intertitre'], 'class', "h3$class");
foreach($GLOBALS['spip_raccourcis_typo'] as $k=>$v){
$GLOBALS['spip_raccourcis_typo'][$k] = str_replace($intertitre,$GLOBALS['debut_intertitre'],$GLOBALS['spip_raccourcis_typo'][$k]);
}
$init = true;
}
return $flux;
}
/**
* Ajouter le inc-insert-head du theme si il existe
*
* @param string $flux
* @return string
*/
function Z_insert_head($flux){
if (find_in_path('inc-insert-head.html')){
$flux .= recuperer_fond('inc-insert-head',array());
}
return $flux;
}
//
// fonction standard de calcul de la balise #INTRODUCTION
// mais retourne toujours dans un <p> comme propre
//
// http://doc.spip.org/@filtre_introduction_dist
function filtre_introduction($descriptif, $texte, $longueur, $connect) {
include_spip('public/composer');
$texte = filtre_introduction_dist($descriptif, $texte, $longueur, $connect);
if ($GLOBALS['toujours_paragrapher'] AND strpos($texte,"</p>")===FALSE)
// Fermer les paragraphes ; mais ne pas en creer si un seul
$texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']);
return $texte;
}
/**
* Tester la presence sur une page
* @param <type> $p
* @return <type>
*/
function balise_SI_PAGE_dist($p) {
$_page = interprete_argument_balise(1,$p);
$p->code = "(((\$Pile[0][_SPIP_PAGE]==(\$zp=$_page)) OR (\$Pile[0]['composition']==\$zp AND \$Pile[0]['type']=='page'))?' ':'')";
$p->interdire_scripts = false;
return $p;
}
?>