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