source: spip-zone/_plugins_/couteau_suisse/outils/cout_fonctions.php @ 79921

Last change on this file since 79921 was 79921, checked in by patfr@…, 6 years ago

+Lame Décoration : possibilité d'ajouter des balises HTML configurables

Exemple : define('_decoration_BALISES_OK', 'quote|p');

+Lame Glossaire : protection élémentaire sur les regexpr (span/div/input) : à voir si c'est suffisant...
+Balise #DEFINED, simplification de rédaction

Exemple : [(#DEFINED{_SPIP30000}|oui) Spip >= 3.0 !]

File size: 5.9 KB
Line 
1<?php
2// Ce fichier contient des fonctions toujours compilees dans tmp/couteau-suisse/mes_fonctions.php
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5// compatibilite SPIP < 2.00
6if(!defined('_SPIP19300')) {
7        // #VAL{x} renvoie 'x' (permet d'appliquer un filtre a une chaine)
8        // Attention #VAL{1,2} renvoie '1', indiquer #VAL{'1,2'}
9        function balise_VAL($p){
10                $p->code = interprete_argument_balise(1,$p);
11                if (!strlen($p->code)) $p->code = "''";
12                $p->interdire_scripts = false;
13                return $p;
14        }
15        if(!function_exists('oui')) { function oui($code) { return $code?' ':''; } }
16        if(!function_exists('non')) { function non($code) { return $code?'':' '; } }
17}
18
19function balise_CHR_dist($p) {
20        if (($v = interprete_argument_balise(1,$p))!==NULL){
21                $p->code = "chr(intval($v))";
22                $p->type = 'php';
23        }
24        return $p;
25}
26
27function balise_DEFINED_dist($p) {
28        if (($v = interprete_argument_balise(1,$p))!==NULL){
29                $p->code = "defined($v)";
30                $p->type = 'php';
31        }
32        return $p;
33}
34
35// fonction appelant une liste de fonctions qui permettent de nettoyer un texte original de ses raccourcis indesirables
36function cs_introduire($texte) {
37        // liste de filtres qui sert a la balise #INTRODUCTION
38        if(!is_array($GLOBALS['cs_introduire'])) return $texte;
39        $liste = array_unique($GLOBALS['cs_introduire']);
40        foreach($liste as $f)
41                if (function_exists($f)) $texte = $f($texte);
42        return $texte;
43}
44
45// Fonction propre() sans paragraphage
46function cs_propre($texte) {
47        include_spip('inc/texte');
48        return trim(PtoBR(propre($texte)));
49}
50
51// Filtre creant un lien <a> sur un texte
52// Exemple d'utilisation : [(#EMAIL*|cs_lien{#NOM})]
53function cs_lien($lien, $texte='') {
54        if(!$lien) return $texte;
55        return cs_propre("[{$texte}->{$lien}]");
56}
57
58// filtre pour ajouter un <span> autour d'un texte
59function cs_span($texte, $attr='') { return "<span $attr>$texte</span>"; }
60
61// raccourci pour afficher le statut d'un auteur
62function cs_auteur_statut($row) {
63        $puce_statut = charger_fonction('puce_statut', 'inc');
64        return $puce_statut(0, $row['statut'], 0, 'auteur');
65}
66
67// Controle (basique!) des 3 balises usuelles p|div|span eventuellement coupees
68// Attention : simple traitement pour des balises non imbriquees
69function cs_safebalises($texte) {
70        $texte = trim($texte);
71        // ouvre/supprime la premiere balise trouvee fermee (attention aux modeles SPIP)
72        if(preg_match(',^(.*)</([a-z]+)>,Ums', $texte, $m) && !preg_match(",<$m[2][ >],", $m[1])) 
73                $texte = strlen($m[1])?"<$m[2]>$texte":trim(substr($texte, strlen($m[2])+3));
74        // referme/supprime la derniere balise laissee ouverte (attention aux modeles SPIP)
75        if(preg_match(',^(.*)[ >]([a-z]+)<,Ums', $rev = strrev($texte), $m) && !preg_match(",>$m[2]/<,", $m[1])) 
76                $texte = strrev(strlen($m[1])?">$m[2]/<$rev":trim(substr($rev, strlen($m[2])+2)));
77        // balises <p|span|div> a traiter
78        foreach(array('span', 'div', 'p') as $b) {
79                // ouvrante manquante
80                if(($fin = strpos($texte, "</$b>")) !== false)
81                        if(!preg_match(",<{$b}[ >],", substr($texte, 0, $fin)))
82                                $texte = "<$b>$texte";
83                // fermante manquante
84                $texte = strrev($texte);
85                if(preg_match(',[ >]'.strrev("<{$b}").',', $texte, $reg)) {
86                        $fin = strpos(substr($texte, 0, $deb = strpos($texte, $reg[0])), strrev("</$b>"));
87                        if($fin===false || $fin>$deb) $texte = strrev("</$b>").$texte;
88                }
89                $texte = strrev($texte);
90        }
91        return $texte;
92}
93
94// fonction de suppression de notes. Utile pour #CS_SOMMAIRE ou #CS_DECOUPE
95function cs_supprime_notes($texte) {
96        return preg_replace(', *\[\[(.*?)\]\],msS', '', $texte);
97}
98
99// filtre appliquant les traitements SPIP d'un champ (et eventuellement d'un type d'objet) sur un texte
100// (voir la fonction champs_traitements($p) dans : public/references.php)
101// => permet d'utiliser les balises etoilees : #TEXTE*|mon_filtre|cs_traitements{TEXTE,articles}
102// ce mecanisme est a preferer au traditionnel #TEXTE*|mon_filtre|propre
103// cs_traitements() consulte simplement la globale $table_des_traitements et applique le traitement adequat
104// $exclusions est une chaine ou un tableau de filtres a exclure du traitement
105function cs_traitements($texte, $nom_champ='NULL', $type_objet='NULL', $exclusions=NULL) {
106        global $table_des_traitements;
107        if(!isset($table_des_traitements[$nom_champ])) return $texte;
108        $ps = $table_des_traitements[$nom_champ];
109        if(is_array($ps)) $ps = $ps[isset($ps[$type_objet]) ? $type_objet : 0];
110        if(!$ps) return $texte;
111        // retirer les filtres a exclure
112        if($exclusions!==NULL) $ps = str_replace($exclusions, 'cs_noop', $ps);
113        // remplacer le placeholder %s par le texte fourni
114        eval('$texte=' . str_replace('%s', '$texte', $ps) . ';');
115        return $texte;
116}
117function cs_noop($t='',$a=NULL,$b=NULL,$c=NULL) { return $t; }
118
119// liste des docs sur contrib.spip (outils actifs)
120function cs_liste_contribs($coupe = 999, $join = "</li><li>") {
121        global $metas_outils;
122        $contribs = array();
123        foreach($metas_outils as $o=>$v) if(isset($v['contrib']) && isset($v['actif']) && $v['actif'])
124                $contribs[] =  '[' . couper(couteauprive_T($o.':nom'), $coupe) . '->' . (is_numeric($v['contrib']) ?_URL_CONTRIB.$v['contrib']:$v['contrib']) . ']';
125        sort($contribs);
126        return '[{{' . couteauprive_T('docgen') . '}}->' . _URL_CONTRIB . '2166]' 
127                . $join . '[{{' . couteauprive_T('docwiki') . '}}->' . _URL_CONTRIB . '2793]'
128                . (count($contribs)?$join.join($join, $contribs):'');
129}
130
131// renvoie un champ d'un objet en base
132function cs_champ_sql($id, $champ='texte', $objet='article') {
133        // Utiliser la bonne requete en fonction de la version de SPIP
134        if(function_exists('sql_getfetsel')) {
135                // SPIP 2.0
136                // TODO : fonctions SPIP pour trouver la table et l'id_objet
137                if($r = sql_getfetsel($champ, 'spip_'.$objet.'s', 'id_'.$objet.'='.intval($id)))
138                        return $r;
139        } else {
140                if($r = spip_query('SELECT '.$champ.' FROM spip_'.$objet.'s WHERE id_'.$objet.'='.intval($id)))
141                        // s'il existe un champ, on le retourne
142                        if($row = spip_fetch_array($r)) return $row[$champ];
143        }
144        // sinon rien !
145        return '';
146}
147
148// recaler un contenu de fond. Exemple : #FILTRE{cs_impossible}
149function cs_impossible($chaine='') { return _T('avis_operation_impossible'); }
150
151?>
Note: See TracBrowser for help on using the repository browser.