[SPIP] ~maj v2.1.25-->2.1.26
[velocampus/web/www.git] / www / plugins / auto / couteau_suisse / couteau_suisse / outils / couleurs.php
1 <?php
2
3 /*
4 Cet outil en couleurs permet aux redacteurs d'un site spip de d'appliquer facilement des couleurs aux textes SPIP
5 Utilisation pour le redacteur :
6 [rouge]Lorem ipsum dolor sit amet[/rouge]
7 [red]Lorem ipsum dolor sit amet[/red]
8 Les balises anglaises sont les couleurs utilisees dans les feuilles de style.
9 Attention : seules les balises en minuscules sont reconnues.
10 */
11 /*
12 +----------------------------------+
13 Nom de l'outil : Couleurs dans vos textes
14 +----------------------------------+
15 Date : Vendredi 11 août 2003
16 Idee originale : Aurelien PIERARD : aurelien.pierard(a)dsaf.pm.gouv.fr
17 Serieuse refonte et integration au Couteau Suisse : Patrice Vanneufville, mars 2007
18 Doc : http://www.spip-contrib.net/?article2427
19 +-------------------------------------+
20
21 */
22
23 function couleurs_constantes() {
24 return array(array(
25 array('noir', 'rouge', 'marron', 'vert', 'vert olive', 'bleu marine', 'violet', 'gris', 'argent', 'vert clair', 'bleu', 'fuchia', 'bleu clair', 'blanc', 'bleu azur', 'beige', 'brun', 'bleu violet', 'brun clair', 'rose clair', 'vert fonce', 'orange fonce', 'mauve fonce', 'bleu ciel', 'or', 'ivoire', 'orange', 'lavande', 'rose', 'prune', 'saumon', 'neige', 'turquoise', 'jaune paille', 'jaune'),
26 array('black', 'red', 'maroon', 'green', 'olive', 'navy', 'purple', 'gray', 'silver', 'chartreuse', 'blue', 'fuchsia', 'aqua', 'white', 'azure', 'bisque', 'brown', 'blueviolet', 'chocolate', 'cornsilk', 'darkgreen', 'darkorange', 'darkorchid', 'deepskyblue', 'gold', 'ivory', 'orange', 'lavender', 'pink', 'plum', 'salmon', 'snow', 'turquoise', 'wheat', 'yellow') ),
27 array('aliceblue'=>'F0F8FF','antiquewhite'=>'FAEBD7','aqua'=>'00FFFF','aquamarine'=>'7FFFD4','azure'=>'F0FFFF','beige'=>'F5F5DC','bisque'=>'FFE4C4','black'=>'000000','blanchedalmond'=>'FFEBCD','blue'=>'0000FF','blueviolet'=>'8A2BE2','brown'=>'A52A2A','burlywood'=>'DEB887','cadetblue'=>'5F9EA0','chartreuse'=>'7FFF00','chocolate'=>'D2691E','coral'=>'FF7F50','cornflowerblue'=>'6495ED','cornsilk'=>'FFF8DC','crimson'=>'DC143C','cyan'=>'00FFFF','darkblue'=>'00008B','darkcyan'=>'008B8B','darkgoldenrod'=>'B8860B','darkgray'=>'A9A9A9','darkgreen'=>'006400','darkkhaki'=>'BDB76B','darkmagenta'=>'8B008B','darkolivegreen'=>'556B2F','darkorange'=>'FF8C00','darkorchid'=>'9932CC','darkred'=>'8B0000','darksalmon'=>'E9967A','darkseagreen'=>'8FBC8F','darkslateblue'=>'483D8B','darkturqoise'=>'00CED1','darkslategray'=>'2F4F4F','darkviolet'=>'9400D3','deeppink'=>'FF1493','deepskyblue'=>'00BFFF','dimgray'=>'696969','dodgerblue'=>'1E90FF','firebrick'=>'B22222','floralwhite'=>'FFFAF0','forestgreen'=>'228B22','fuchsia'=>'FF00FF','gainsboro'=>'DCDCDC','ghostwhite'=>'F8F8FF','gold'=>'FFD700','goldenrod'=>'DAA520','gray'=>'808080','green'=>'008000','greenyellow'=>'ADFF2F','honeydew'=>'F0FFF0','hotpink'=>'FF69B4','indianred'=>'CD5C5C','indigo'=>'4B0082','ivory'=>'FFFFF0','khaki'=>'F0E68C','lavender'=>'E6E6FA','lavenderblush'=>'FFF0F5','lawngreen'=>'7CFC00','lemonchiffon'=>'FFFACD','lightblue'=>'ADD8E6','lightcoral'=>'F08080','lightcyan'=>'E0FFFF','lightgoldenrodyellow'=>'FAFAD2','lightgreen'=>'90EE90','lightgrey'=>'D3D3D3','lightpink'=>'FFB6C1','lightsalmon'=>'FFA07A','lightseagreen'=>'20B2AA','lightskyblue'=>'87CEFA','lightslategray'=>'778899','lisghtsteelblue'=>'B0C4DE','lightyellow'=>'FFFFE0','lime'=>'00FF00','limegreen'=>'32CD32','linen'=>'FAF0E6','magenta'=>'FF00FF','maroon'=>'800000','mediumaquamarine'=>'66CDAA','mediumblue'=>'0000CD','mediumorchid'=>'BA55D3','mediumpurple'=>'9370DB','mediumseagreen'=>'3CB371','mediumslateblue'=>'7B68EE','mediumspringgreen'=>'00FA9A','mediumturquoise'=>'48D1CC','mediumvioletred'=>'C71585','midnightblue'=>'191970','mintcream'=>'F5FFFA','mistyrose'=>'FFE4E1','moccasin'=>'FFE4B5','navajowhite'=>'FFDEAD','navy'=>'000080','navyblue'=>'9FAFDF','oldlace'=>'FDF5E6','olive'=>'808000','olivedrab'=>'6B8E23','orange'=>'FFA500','orangered'=>'FF4500','orchid'=>'DA70D6','palegoldenrod'=>'EEE8AA','palegreen'=>'98FB98','paleturquoise'=>'AFEEEE','palevioletred'=>'DB7093','papayawhip'=>'FFEFD5','peachpuff'=>'FFDAB9','peru'=>'CD853F','pink'=>'FFC0CB','plum'=>'DDA0DD','powderblue'=>'B0E0E6','purple'=>'800080','red'=>'FF0000','rosybrown'=>'BC8F8F','royalblue'=>'4169E1','saddlebrown'=>'8B4513','salmon'=>'FA8072','sandybrown'=>'F4A460','seagreen'=>'2E8B57','seashell'=>'FFF5EE','sienna'=>'A0522D','silver'=>'C0C0C0','skyblue'=>'87CEEB','slateblue'=>'6A5ACD','snow'=>'FFFAFA','springgreen'=>'00FF7F','steelblue'=>'4682B4','tan'=>'D2B48C','teal'=>'008080','thistle'=>'D8BFD8','tomato'=>'FF6347','turquoise'=>'40E0D0','violet'=>'EE82EE','wheat'=>'F5DEB3','white'=>'FFFFFF','whitesmoke'=>'F5F5F5','yellow'=>'FFFF00','yellowgreen'=>'9ACD32') );
28 }
29
30 // cette fonction appelee automatiquement a chaque affichage de la page privee du Couteau Suisse renvoie un tableau
31 function couleurs_installe_dist() {
32 cs_log("couleurs_installe_dist()");
33
34 list($couleurs, $html) = couleurs_constantes();
35 foreach ($couleurs[0] as $c=>$val)
36 $couleurs[2][$val] = isset($html[$couleurs[1][$c]])?'#'.$html[$couleurs[1][$c]]:$couleurs[1][$c];
37
38 if (_COULEURS_SET===1) {
39 $perso = preg_replace('^\s*(=|,)\s*^','\1', trim(_COULEURS_PERSO));
40 $perso = explode(',', $perso);
41 $couleurs_perso = array();
42 foreach($perso as $p) {
43 list($a, $b) = explode('=', $p, 2);
44 $b = isset($html[$b])?'#'.$html[$b]:$b;
45 if (strlen($a) && strlen($b)) {
46 if(in_array($b, $couleurs[0])) $b = $couleurs[2][$b];
47 $couleurs_perso[$a] = $b;
48 } elseif (strlen($a)) {
49 $b=in_array($a, $couleurs[0])?$couleurs[2][$a]:$a;
50 $couleurs_perso[$a] = $b;
51 }
52 }
53 $couleurs[2] = $couleurs_perso;
54 $couleurs[0] = join('|', array_keys($couleurs_perso));
55 $aide = array_keys($couleurs_perso);
56 } else {
57 $aide = array_merge($couleurs[0], $couleurs[1]);
58 $couleurs[0] = join('|', $couleurs[0]);
59 $couleurs[1] = join('|', $couleurs[1]);
60 }
61
62 if(defined('_DIR_PLUGIN_PORTE_PLUME')) {
63 foreach(array('texte','fond') as $x) {
64 $texte = _T('couteau:pp_couleur_icone_'.$x);
65 foreach ($couleurs[2] as $i=>$c) {
66 // icone de la couleur $i
67 $color = isset($html[$c])?$html[$c]:str_replace('#','',$c);
68 $couleurs[4]['couleur_'.$x.'_'.str_replace(' ','_',$i)] = array($texte, $color);
69 }
70 }
71 }
72 return array($couleurs, 'racc'=>$aide);
73 }
74
75 // creation d'icone pour le plugin porte-plume
76 function couleurs_creer_icone_barre($texte, $color) {
77 static $icones_barre;
78 rep_icones_barre($icones_barre);
79 $img = image_typo($texte, 'couleur='.$color, 'taille=12', 'police=dustismo_bold.ttf');
80 $nom = basename($src = extraire_attribut($img, 'src'));
81 @copy($src, $icones_barre.$nom);
82 return $nom;
83 }
84
85 // liste des nouveaux raccourcis ajoutes par l'outil
86 // si cette fonction n'existe pas, le plugin cherche alors _T('couteauprive:un_outil:aide');
87 function couleurs_raccourcis() {
88 $racc = cs_lire_data_outil('couleurs', 'racc');
89 return _T('couteauprive:couleurs:aide', array(
90 'liste' => '<b>'.join('</b>, <b>', $racc).'</b>',
91 'fond' => _COULEURS_FONDS==1?_T('couteauprive:couleurs_fonds'):'',
92 ));
93 }
94
95 // callbacks
96 function couleurs_texte_callback($matches) {
97 global $outil_couleurs;
98 return "<span style=\"color:{$outil_couleurs[2][$matches[1]]};\">";
99 }
100 function couleurs_fond_callback($matches) {
101 global $outil_couleurs;
102 return "<span style=\"background-color:{$outil_couleurs[2][$matches[2]]};\">";
103 }
104
105 // cette fonction n'est pas appelee dans les balises html : html|code|cadre|frame|script
106 function couleurs_rempl($texte) {
107 if (strpos($texte, '[')===false || strpos($texte, '/')===false) return $texte;
108 // pour les callbacks
109 global $outil_couleurs;
110
111 // voila, on remplace tous les raccourcis $outil_couleurs[0] (balises francaises ou personnalisees)...
112 $texte = preg_replace_callback(",\[($outil_couleurs[0])\],", 'couleurs_texte_callback', $texte);
113 if(_COULEURS_FONDS===1) {
114 $texte = preg_replace_callback(",\[(bg|fond)\s+($outil_couleurs[0])\],", 'couleurs_fond_callback', $texte);
115 $texte = preg_replace(",\[/(fond|bg)\],", '</span>', $texte);
116 $texte = preg_replace(",\[/(bg|fond)\s+($outil_couleurs[0])\],", '</span>', $texte);
117 }
118 // cas des 36 couleurs css
119 if(_COULEURS_SET===0) {
120 // raccourcis anglais, plus facile...
121 $texte = preg_replace(",\[($outil_couleurs[1])\],", '<span style="color:$1;">', $texte);
122 if(_COULEURS_FONDS===1)
123 $texte = preg_replace(",\[(bg|fond)\s+($outil_couleurs[1])\],", '<span style="background-color:$2;">', $texte);
124 // et toutes les balises de fin...
125 $texte = preg_replace(",\[/(bg|fond)?\s*(couleur|$outil_couleurs[0]|color|$outil_couleurs[1])\],", '</span>', $texte);
126 }
127 // cas des couleurs personnalisees
128 elseif(_COULEURS_SET===1) {
129 // et toutes les balises de fin...
130 $texte = preg_replace(",\[/(couleur|$outil_couleurs[0]|color|)\],", '</span>', $texte);
131 }
132 // patch de conformite : les <span> doivent etre inclus dans les paragraphes
133 while (preg_match(",(<span style=\"(background-)?color:[^;]+;\">)([^<]*)\n[\n]+,Sms", $texte, $regs))
134 $texte = str_replace($regs[0], "$regs[1]$regs[3]</span>\n\n$regs[1]", $texte);
135 return $texte;
136 }
137
138 function couleurs_pre_typo($texte) {
139 if (strpos($texte, '[')===false || strpos($texte, '/')===false) return $texte;
140 // pour les callbacks
141 global $outil_couleurs;
142 // lecture des raccoucis de couleur
143 $outil_couleurs = cs_lire_data_outil('couleurs');
144 // appeler couleurs_rempl() une fois que certaines balises ont ete protegees
145 $texte = cs_echappe_balises('', 'couleurs_rempl', $texte);
146 // menage
147 unset($outil_couleurs);
148 // retour
149 return $texte;
150 }
151
152 // cette fonction renvoie une ligne de tableau entre <tr></tr> afin de l'inserer dans la Barre Typo V2, si elle est presente
153 function couleurs_BarreTypo($tr) {
154 $couleurs = cs_lire_data_outil('couleurs');
155 $r1 = $r2 = array();
156 foreach($couleurs[2] as $i=>$v)
157 $r1[] = "<a title=\"$i\" href=\"javascript:barre_raccourci('[$i]','[/$i]',@@champ@@)\"><span class=\"cs_BT cs_BTg\" style=\"color:$v;\">A</span></a>";
158 $r1 = join(' ', $r1);
159 if(_COULEURS_FONDS===1) {
160 foreach($couleurs[2] as $i=>$v)
161 $r2[] = "<a title=\"fond $i\" href=\"javascript:barre_raccourci('[fond $i]','[/fond $i]',@@champ@@)\"><span class=\"cs_BT cs_BTg\" style=\"color:$v;\">F</span></a>";
162 $r2 = ' '._T('couteauprive:fonds').' '.join(' ', $r2).'';
163 } else $r2='';
164 return $tr.'<tr><td><p style="margin:0; line-height:1.9em;">'._T('couteauprive:couleurs:nom')."&nbsp;$r1$r2</div></td></tr>";
165 }
166
167 // les 2 fonctions suivantes inserent les boutons pour le plugin Porte Plume, s'il est present (SPIP>=2.0)
168 function couleurs_PP_pre_charger($flux) {
169 $couleurs = cs_lire_data_outil('couleurs');
170 $r1 = $r2 = array();
171 foreach($couleurs[2] as $i=>$v) {
172 $id = 'couleur_texte_'.str_replace(' ','_',$i);
173 $r1[] = array(
174 "id" => $id,
175 "name" => _T('couteau:pp_couleur_texte', array('couleur'=>$i)),
176 "className" => $id,
177 "openWith" => "[$i]",
178 "closeWith" => "[/$i]",
179 "selectionType" => "word",
180 "display" => true);
181 }
182 if(_COULEURS_FONDS===1) foreach($couleurs[2] as $i=>$v) {
183 $id = 'couleur_fond_'.str_replace(' ','_',$i);
184 $r2[] = array(
185 "id" => $id,
186 "name" => _T('couteau:pp_couleur_fond', array('couleur'=>$i)),
187 "className" => $id,
188 "openWith" => "[fond $i]",
189 "closeWith" => "[/fond $i]",
190 "selectionType" => "word",
191 "display" => true);
192 }
193
194 $a = array(
195 "id" => 'cs_couleur_texte',
196 "name" => _T('couteau:colorer_texte'),
197 "className" => 'cs_couleur_texte',
198 "replaceWith" => '',
199 "display" => true,
200 "dropMenu" => $r1,
201 );
202 foreach($barres = cs_pp_liste_barres('couleurs') as $b)
203 $flux[$b]->ajouterApres('stroke_through', $a);
204 if(!count($r2)) return $flux;
205
206 $a = array(
207 "id" => 'cs_couleur_fond',
208 "name" => _T('couteau:colorer_fond'),
209 "className" => 'cs_couleur_fond',
210 "replaceWith" => '',
211 "display" => true,
212 "dropMenu" => $r2,
213 );
214 foreach($barres as $b)
215 $flux[$b]->ajouterApres('cs_couleur_texte', $a);
216 return $flux;
217 }
218 function couleurs_PP_icones($flux) {
219 $couleurs = cs_lire_data_outil('couleurs');
220 // icones utilisees. Attention : mettre les drop-boutons en premier !!
221 $flux['cs_couleur_texte'] = couleurs_creer_icone_barre(_T('couteau:pp_couleur_icone_texte'), '00BFFF');
222 $flux['cs_couleur_fond'] = couleurs_creer_icone_barre(_T('couteau:pp_couleur_icone_fond'), '00BFFF');
223 foreach($couleurs[4] as $i=>$v) $flux[$i] = couleurs_creer_icone_barre($v[0], $v[1]);
224 return $flux;
225 }
226
227 function couleurs_nettoyer_raccourcis($texte) {
228 $couleurs = cs_lire_data_outil('couleurs');
229 $couleurs = _COULEURS_SET===0?"$couleurs[0]|$couleurs[1]":$couleurs[0];
230 return preg_replace(",\[/?(bg|fond)?\s*($couleurs|couleur|color)\],i", '', $texte);
231 }
232
233 // pipeline maison permettant l'interpretation de la description d'un outil
234 function couleurs_pre_description_outil($flux) {
235 if($flux['outil']==='couleurs') $flux['texte'] = str_replace(
236 array('@_CS_EXEMPLE_COULEURS@', '@_CS_EXEMPLE_COULEURS2@', '@_CS_EXEMPLE_COULEURS3@'),
237 array(!$flux['actif']?'@_CS_FOO@':'<br /><span style="font-weight:normal; font-size:85%;"><span style="background-color:black; color:white;">black/noir</span>, <span style="background-color:red;">red/rouge</span>, <span style="background-color:maroon;">maroon/marron</span>, <span style="background-color:green;">green/vert</span>, <span style="background-color:olive;">olive/vert&nbsp;olive</span>, <span style="background-color:navy; color:white;">navy/bleu&nbsp;marine</span>, <span style="background-color:purple;">purple/violet</span>, <span style="background-color:gray;">gray/gris</span>, <span style="background-color:silver;">silver/argent</span>, <span style="background-color:chartreuse;">chartreuse/vert&nbsp;clair</span>, <span style="background-color:blue;">blue/bleu</span>, <span style="background-color:fuchsia;">fuchsia/fuchia</span>, <span style="background-color:aqua;">aqua/bleu&nbsp;clair</span>, <span style="background-color:white;">white/blanc</span>, <span style="background-color:azure;">azure/bleu&nbsp;azur</span>, <span style="background-color:bisque;">bisque/beige</span>, <span style="background-color:brown;">brown/brun</span>, <span style="background-color:blueviolet;">blueviolet/bleu&nbsp;violet</span>, <span style="background-color:chocolate;">chocolate/brun&nbsp;clair</span>, <span style="background-color:cornsilk;">cornsilk/rose&nbsp;clair</span>, <span style="background-color:darkgreen;">darkgreen/vert&nbsp;fonce</span>, <span style="background-color:darkorange;">darkorange/orange&nbsp;fonce</span>, <span style="background-color:darkorchid;">darkorchid/mauve&nbsp;fonce</span>, <span style="background-color:deepskyblue;">deepskyblue/bleu&nbsp;ciel</span>, <span style="background-color:gold;">gold/or</span>, <span style="background-color:ivory;">ivory/ivoire</span>, <span style="background-color:orange;">orange/orange</span>, <span style="background-color:lavender;">lavender/lavande</span>, <span style="background-color:pink;">pink/rose</span>, <span style="background-color:plum;">plum/prune</span>, <span style="background-color:salmon;">salmon/saumon</span>, <span style="background-color:snow;">snow/neige</span>, <span style="background-color:turquoise;">turquoise/turquoise</span>, <span style="background-color:wheat;">wheat/jaune&nbsp;paille</span>, <span style="background-color:yellow;">yellow/jaune</span></span><span style="font-size:50%;"><br />&nbsp;</span>',
238 "\n-* <code>Lorem ipsum [rouge]dolor[/rouge] sit amet</code>\n-* <code>Lorem ipsum [red]dolor[/red] sit amet</code>.",
239 "\n-* <code>Lorem ipsum [fond rouge]dolor[/fond rouge] sit amet</code>\n-* <code>Lorem ipsum [bg red]dolor[/bg red] sit amet</code>.",
240 ), $flux['texte']);
241 return $flux;
242 }
243
244 ?>