source: spip-zone/_plugins_/couteau_suisse/outils/decoration.php @ 43327

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

Décorations : [43218] avait bêtement cassé les classes...
Merci à Pierrot !

File size: 7.3 KB
Line 
1<?php
2
3/*
4        Cet outil 'decoration' permet aux redacteurs d'un site spip de d'appliquer des styles aux textes SPIP
5        Attention : seules les balises en minuscules sont reconnues.
6        Doc : http://www.spip-contrib.net/?article2427
7*/
8
9// cette fonction est appelee automatiquement a chaque affichage de la page privee du Couteau Suisse
10function decoration_installe() {
11        if(!defined('_decoration_BALISES')) return;
12cs_log("decoration_installe()");
13        // on decode les balises entrees dans la config
14        $deco_balises = preg_split("/[\r\n]+/", trim(_decoration_BALISES));
15        $aide = $trouve = $remplace = $alias = $auto_balises = $auto_remplace = $BT = array();
16        foreach ($deco_balises as $balise) {
17                if (preg_match('/(span|div|auto)\.([^.]+)\.(class|lang)\s*=(.+)$/', $balise, $regs)) {
18                        // les class/lang
19                        list($auto, $div, $racc, $attr, $valeur) = array($regs[1]=='auto', $regs[1], trim($regs[2]), trim($regs[3]), trim($regs[4]));
20                        if (defined('_SPIP20100') && $attr=='lang') {
21                                // Pour SPIP>=2.1 on utilise l'astuce <multi>[XX]...</multi> pour beneficier ensuite de la typo appropriee
22                                $BT[] = array($racc, true, $div);
23                                $aide[] = $racc; 
24                                $trouve[] = "<$racc>"; $trouve[] = "</$racc>";
25                                $remplace[] = $a = "<multi>[$valeur]"; 
26                                $remplace[] = $b = "</multi>";
27                        } else {
28                                $attr="$attr=\"$valeur\"";
29                                $BT[] = array($racc, $auto, $div);
30                                if ($auto) {
31                                        $auto_balises[] = $racc;
32                                        $auto_remplace[$racc] = "$attr>";
33                                } else {
34                                        $aide[] = $racc;
35                                        $trouve[] = "<$racc>"; $trouve[] = "</$racc>"; $trouve[] = "<$racc/>";
36                                        $remplace[] = $a = "<$div $attr>";
37                                        $remplace[] = $b = "</$div>"; $remplace[] = $a.$b;
38                                }
39                        }
40                } elseif (preg_match('/(span|div|auto)\.([^=]+)=(.+)$/', $balise, $regs)) {
41                        // les styles inline
42                        list($auto, $div, $racc, $style) = array($regs[1]=='auto', $regs[1], trim($regs[2]), trim($regs[3]));
43                        $BT[] = array($racc, $auto, $div);
44                        $attr="style=\"$style\"";
45                        if ($auto) {
46                                $auto_balises[] = $racc;
47                                $auto_remplace[$racc] = "$attr>";
48                        } else {
49                                $aide[] = $racc;
50                                $trouve[] = "<$racc>"; $trouve[] = "</$racc>"; $trouve[] = "<$racc/>";
51                                $remplace[] = $a = "<$div $attr>";
52                                $remplace[] = $b = "</$div>"; $remplace[] = $a.$b;
53                        }
54                } elseif (preg_match('/([^=]+)=(.+)$/', $balise, $regs)) {
55                        // les alias
56                        $alias[trim($regs[1])] = trim($regs[2]);
57                }
58        }
59        // ajout des alias qu'on a trouves
60        foreach ($alias as $a=>$v)
61                if(($i=array_search("<$v>", $trouve, true))!==false) {
62                        $aide[] = $a; $trouve[] = "<$a>"; $trouve[] = "</$a>"; $trouve[] = "<$a/>";
63                        $remplace[] = $remplace[$i]; $remplace[] = $remplace[$i+1]; $remplace[] = $remplace[$i+2];
64                } elseif(array_search($v, $auto_balises, true)!==false) {
65                        $auto_balises[] = $a;
66                        $auto_remplace[$a] = $auto_remplace[$v];
67                }
68        // liste des balises disponibles
69        $aide = array_merge($aide, $auto_balises);
70        // protection $auto_balises pour la future regExpr
71        array_walk($auto_balises, 'cs_preg_quote');
72        // renvoi des donnees compilees
73        return array( 'decoration'=> array(
74                // balises fixes a trouver
75                $trouve,
76                // remplacement des balises fixes
77                $remplace,
78                // RegExpr pour les balises automatiques
79                count($auto_balises)?',<('.join('|', $auto_balises).')>(.*?)</\1>,ms':'',
80                // association pour les balises automatiques
81                $auto_remplace,
82                // balises disponibles
83                $BT),
84                // aide
85                'decoration_racc' => $aide,
86        );
87}
88
89// liste des nouveaux raccourcis ajoutes par l'outil
90// si cette fonction n'existe pas, le plugin cherche alors  _T('couteauprive:un_outil:aide');
91function decoration_raccourcis() {
92        $racc = cs_lire_data_outil('decoration', 'decoration_racc');
93        return _T('couteauprive:decoration:aide', array('liste' => '<b>'.join('</b>, <b>', $racc).'</b>'));
94}
95
96function decoration_callback($matches) {
97        global $deco_balises;
98        return cs_block($matches[2])
99                        ?'<div ' . $deco_balises[3][$matches[1]] . $matches[2] . '</div>'
100                        :'<span ' . $deco_balises[3][$matches[1]] . $matches[2] . '</span>';
101}
102
103// cette fonction n'est pas appelee dans les balises html : html|code|cadre|frame|script
104function decoration_rempl($texte) {
105        if (strpos($texte, '<')===false) return $texte;
106        // reecrire les raccourcis du type <balise   />
107        $texte = preg_replace(', +/>,', '/>', $texte);
108        global $deco_balises;
109        // balises fixes, facile : on remplace tout d'un coup !
110        $texte = str_replace($deco_balises[0], $deco_balises[1], $texte);
111        // balises automatiques, plus long : il faut un callback pour analyser l'interieur du texte
112        return strlen($deco_balises[2])
113                ?preg_replace_callback($deco_balises[2], 'decoration_callback', $texte)
114                :$texte;
115}
116
117// fonction pipeline
118function decoration_pre_typo($texte) {
119        if (strpos($texte, '<')===false || !defined('_decoration_BALISES')) return $texte;
120        // pour les callbacks
121        global $deco_balises;
122        // lecture des balises et des remplacements
123        $deco_balises = cs_lire_data_outil('decoration');
124        // on remplace apres echappement
125        $texte = cs_echappe_balises('', 'decoration_rempl', $texte);
126        // menage
127        unset($deco_balises);
128        return $texte;
129}
130
131// cette fonction renvoie une ligne de tableau entre <tr></tr> afin de l'inserer dans la Barre Typo V2, si elle est presente
132function decoration_BarreTypo($tr) {
133        $balises = cs_lire_data_outil('decoration');
134        $res = array();
135        foreach($balises[4] as $v) {
136                $tmp = $v[1]?"('<$v[0]>','</$v[0]>'":"_etendu('<$v[0]>','</$v[0]>','<$v[0]/>'";
137                $res[] = "<a href=\"javascript:barre_raccourci$tmp,@@champ@@)\"><span class=\"cs_BT\">$v[0]</span></a>";
138        }
139        $res = join(' ', $res); 
140        return $tr.'<tr><td><p style="margin:0; line-height:1.8em;">'._T('couteauprive:decoration:nom')."&nbsp;$res</p></td></tr>";
141}
142
143// les 2 fonctions suivantes inserent les boutons pour le plugin Porte Plume, s'il est present (SPIP>=2.0)
144function decoration_PP_pre_charger($flux) {
145        $balises = cs_lire_data_outil('decoration');
146        $max = count($balises[4]);
147        $r = array();
148        foreach($balises[4] as $b) {
149                $id = 'decoration_'.$b[0];
150                $r[] = array(
151                                "id" => $id,
152                                "name" => _T('couteau:pp_decoration_inserer', array('racc'=>$b[0], 'balise'=>$b[2])),
153                                "className" => $id,
154                                "selectionType" => $b[2]=='div'?"line":"word",
155                                // $b[1] est vrai si la balise <racc/> est interdite
156                                "replaceWith" => "function(h){ return outil_decoration(h.selection, '$b[0]', '$b[2]', '".($b[1]?'':"<$b[0]/>")."'); }",
157                                "display" => true);
158        }
159        $r = array(
160                "id"    => 'cs_decoration_drop',
161                "name"  => _T('couteau:pp_decoration_inserer_drop'),
162                "className"     => 'cs_decoration_drop',
163                "replaceWith"   => '',
164                "display"       => true,
165                "dropMenu"      => $r,
166
167        );
168        foreach(cs_pp_liste_barres('decoration') as $b) {
169                $flux[$b]->ajouterApres('stroke_through', $r);
170                $flux[$b]->ajouterFonction("function outil_decoration(sel, racc, balise, defaut) {
171                        if(sel) {
172                                r='<'+racc+'>'+sel+'</'+racc+'>';
173                                return balise=='span'?r.replace(/(\\n\\n|\\r\\n\\r\\n|\\r\\r)/g,'</'+racc+'>\$1<'+racc+'>'):r;
174                        }
175                        return defaut;
176                }");
177        }
178        return $flux;
179}
180function decoration_PP_icones($flux){
181        $balises = cs_lire_data_outil('decoration');
182        // icones utilisees. Attention : mettre les drop-boutons en premier !!
183        $flux['cs_decoration_drop'] = 'decoration_div.png';
184        foreach($balises[4] as $b) {
185                $id = 'decoration_'.$b[0];
186                $flux[$id] = find_in_path("icones_barre/{$id}.png")?$id.'.png'
187                        :"decoration_{$b[2]}.png";
188        }
189        return $flux;
190}
191
192?>
Note: See TracBrowser for help on using the repository browser.