1 | <?php |
---|
2 | |
---|
3 | #---------------------------------------------------# |
---|
4 | # Plugin : jeux , diagrammes d'echecs # |
---|
5 | # Auteur : Patrice Vanneufville, 2006 # |
---|
6 | # Contact : patrice¡.!vanneufville¡@!laposte¡.!net # |
---|
7 | # Licence : GPL # |
---|
8 | #--------------------------------------------------------------------------# |
---|
9 | # Documentation : http://www.spip-contrib.net/Des-jeux-dans-vos-articles # |
---|
10 | #--------------------------------------------------------------------------# |
---|
11 | /* |
---|
12 | |
---|
13 | Insere un diagramme de positions dechecs dans vos articles ! |
---|
14 | ------------------------------------------------------------- |
---|
15 | Module base sur les travaux de: |
---|
16 | François SCHREUER (plugin) |
---|
17 | Olivier BOUVEROT (DIAGOL) |
---|
18 | Patrice PILLOT (notation FEN) |
---|
19 | Andrew TEMPLETON (figures) |
---|
20 | ------------------------------------------------------------- |
---|
21 | |
---|
22 | separateurs obligatoires : [diag_echecs] |
---|
23 | separateurs optionnels : [titre], [texte], [config] |
---|
24 | |
---|
25 | Attention : |
---|
26 | - La librairie GD doit etre installee sur le serveur. |
---|
27 | |
---|
28 | La position doit etre decrite sous forme de notation FEN, ou bien en utilisant la forme "classique". |
---|
29 | Exemples : |
---|
30 | classique : B:Rg1,Dd1,Ta1,e1,Pa2,f6/N:Rb8,Pa6,f5 |
---|
31 | FEN : r1bqkbnr/pp2pppp/2n5/2p1P3/3p4/2P2N2/PP1P1PPP/RNBQKB1R |
---|
32 | |
---|
33 | Notation "classique" : la description de la position blanche commence par "B:", celle de la position noire par "N:", et les deux sont separees par un "/". |
---|
34 | Il est possible de n'indiquer qu'une couleur (B ou N) pour la description. L'ordre dans cette derniere est indifferent. |
---|
35 | Les majuscules ne sont pas non plus obligatoires |
---|
36 | |
---|
37 | Cases en surbrillance : on peut utiliser "/sv" pour mettre du vert, "/sb" pour du bleu, "/sj" pour du jaune et "/sr" pour du rouge. |
---|
38 | Attention : pour utiliser cette fonctionnalite, il faut obligatoirement utiliser la notation "classique". |
---|
39 | |
---|
40 | Retournement de l'echiquier : C'est automatique en utilisant la notation FEN (et si bien entendu le trait est aux Noirs), sinon il suffit d'ajouter "/r" a la description "classique". |
---|
41 | |
---|
42 | Exemples de syntaxe dans l'article : |
---|
43 | ------------------------------------ |
---|
44 | <jeux> |
---|
45 | [diag_echecs] |
---|
46 | B:Rg1,Dd1,Ta1,e1,Pa2,f6/N:Rb8,Pa6,f5 |
---|
47 | [diag_echecs] |
---|
48 | r1bqkbnr/pp2pppp/2n5/2p1P3/3p4/2P2N2/PP1P1PPP/RNBQKB1R |
---|
49 | [config] |
---|
50 | taille=35 |
---|
51 | </jeux> |
---|
52 | <jeux> |
---|
53 | [diag_echecs] |
---|
54 | B:Rb6,pa3,Fh2/N:Rc8/sr:a8/sb:g3,f4,e5,d6,c7,b8 |
---|
55 | [config] |
---|
56 | taille=35 |
---|
57 | noirs=bleu |
---|
58 | </jeux> |
---|
59 | |
---|
60 | Parametres [config] definis par defaut : |
---|
61 | ---------------------------------------- |
---|
62 | taille=29 // Taille des images en pixels (29 ou 35) |
---|
63 | blancs=blanc // Couleur des cases 'blanches' |
---|
64 | noirs=brun // Couleur des cases 'noires' |
---|
65 | fond=blanc // Couleur de fond de la page web |
---|
66 | bordure=2 // Epaisseur de la bordure de l'echiquier, en pixels |
---|
67 | police=5 // Code de la police utilisee pour les coordonnees (1 a 5) |
---|
68 | flip=non // Faut-il retourner l'echiquier ? |
---|
69 | coords=oui // Afficher les coordonnees ? |
---|
70 | |
---|
71 | */ |
---|
72 | require("diag_echecs_init.php"); |
---|
73 | require("diag_echecs_inc.php"); |
---|
74 | |
---|
75 | // creation du diagramme d'echecs |
---|
76 | function calcul_diagramme_echecs($position, $indexJeux) { |
---|
77 | // qq initialisations |
---|
78 | global $diag_echecs_globales, $jeux_couleurs; |
---|
79 | $flip = jeux_config('flip'); |
---|
80 | $taille = intval(jeux_config('taille')); |
---|
81 | $bordure = intval(jeux_config('bordure')); |
---|
82 | $board_size = intval(jeux_config('board_size')); |
---|
83 | $font = intval(jeux_config('police')); |
---|
84 | $img = jeux_config('img_img'); |
---|
85 | |
---|
86 | // dechiffre le code source du diagramme place dans $position |
---|
87 | $position = preg_replace("/\s*[\r\n]+\s*/", '/', trim($position)); |
---|
88 | $position = preg_replace(",\/+,", '/', trim($position)); |
---|
89 | |
---|
90 | // quelle est la notation !? |
---|
91 | $masque=',(([a-zA-Z1-8]+)\/([a-zA-Z1-8]+)\/([a-zA-Z1-8]+)\/([a-zA-Z1-8]+)\/([a-zA-Z1-8]+)\/([a-zA-Z1-8]+)\/([a-zA-Z1-8]+)\/([a-zA-Z1-8]+)) *(.*),'; |
---|
92 | if ( preg_match($masque, $position, $table) ) { |
---|
93 | $position = FEN2classic($position); // FEN |
---|
94 | $table = explode("/", $position); |
---|
95 | } else { |
---|
96 | $position = preg_replace(",\s,","",$position); // CLASSIC |
---|
97 | $position = strtolower($position); |
---|
98 | $table = explode("/",$position); |
---|
99 | if (count($table)<2) return "Erreur dans la syntaxe [explode table classic]"; |
---|
100 | } |
---|
101 | |
---|
102 | // image en cache |
---|
103 | global $jeux_config; |
---|
104 | $md5 = md5($position.serialize($jeux_config)); |
---|
105 | $fichier_dest = sous_repertoire(_DIR_VAR, "cache-jeux") . 'echiq_'.$md5 . jeux_config('img_suffix'); |
---|
106 | list(,,,$size) = @getimagesize($fichier_dest); |
---|
107 | $image = "<img class=\"no_image_filtrer \" src=\"$fichier_dest\" alt=\"$position\" title=\"$position\" border=\"0\" $size/><br>\n"; |
---|
108 | // pas de recalcul de l'image pendant 12 heures si le fichier existe deja |
---|
109 | if (file_exists($fichier_dest) |
---|
110 | AND ($GLOBALS['var_mode'] != 'recalcul') AND ($GLOBALS['var_mode'] != 'calcul') |
---|
111 | AND (time()-@filemtime($fichier_dest) < 12*3600)) |
---|
112 | return $image; |
---|
113 | |
---|
114 | $chessboard = image_echiquier(); |
---|
115 | |
---|
116 | // ********************* |
---|
117 | //for ($i=0 ; $i<count($table) ; $i++) if ( $table[$i] == "r" ) $flip = true; |
---|
118 | if (in_array('r', $table)) $flip = true; |
---|
119 | |
---|
120 | for ($i=0 ; $i<count($table) ; $i++) { |
---|
121 | $sub_table = split("[:,]",$table[$i]); |
---|
122 | switch($sub_table[0]) { |
---|
123 | case "b" : $side = "w";break; |
---|
124 | case "n" : $side = "b";break; |
---|
125 | case "sr" : $side = "-"; $hilite = "hrouge"; break; |
---|
126 | case "sv" : $side = "-"; $hilite = "hvert"; break; |
---|
127 | case "sb" : $side = "-"; $hilite = "hbleu"; break; |
---|
128 | case "sj" : $side = "-"; $hilite = "hjaune"; break; |
---|
129 | case "r" : $side = "-"; $flip = true; break; /* Ne sert qu'a eviter des erreurs ;) */ |
---|
130 | default : return "Erreur dans la syntaxe [couleur]"; |
---|
131 | } |
---|
132 | /* Ici j'ai change car sinon il est impossible de commencer la */ |
---|
133 | /* description de la position par un pion sans 'p' */ |
---|
134 | /* et cela pose probleme pour la partie hilite qui elle ne */ |
---|
135 | /* comporte pas de piece */ |
---|
136 | if (strlen($sub_table[1])==2) $name = "p"; |
---|
137 | elseif (strlen($sub_table[1])==3) $name = substr($sub_table[1],0,1); |
---|
138 | else { |
---|
139 | if ( (strlen($sub_table[1])==0) && $sub_table[0]!="r" ) { |
---|
140 | echo "<p>$sub_table[1]</p>"; |
---|
141 | return "Erreur dans la syntaxe [piece]"; |
---|
142 | } |
---|
143 | } |
---|
144 | |
---|
145 | for ($j=1 ; $j<count($sub_table) ; $j++) { |
---|
146 | switch(strlen($sub_table[$j])) { |
---|
147 | case 2 : |
---|
148 | $square = substr($sub_table[$j],0,2); |
---|
149 | break; |
---|
150 | case 3 : |
---|
151 | $name = substr($sub_table[$j],0,1); |
---|
152 | $square = substr($sub_table[$j],1,2); |
---|
153 | break; |
---|
154 | default : |
---|
155 | die("Erreur dans la syntaxe (pos) !"); |
---|
156 | } |
---|
157 | if ($side!="-") diag_echecs_put_piece($chessboard,$side,$name,$square,$flip); |
---|
158 | else diag_echecs_hilite_square($chessboard,$square,$hilite,$flip); |
---|
159 | } |
---|
160 | } |
---|
161 | |
---|
162 | /* Faut-il envoyer un en-tete (cas d'une image "nue"), ou l'image |
---|
163 | est-elle destinee a etre incluse dans une page Web ? Laisser la |
---|
164 | variable a "true" dans le premier cas, la mettre a "false" dans le |
---|
165 | second */ |
---|
166 | /* if ($hdr) header(jeux_config('img_header'); */ |
---|
167 | |
---|
168 | if (jeux_config('coords')) { |
---|
169 | $fond = $jeux_couleurs[jeux_config('fond')]; |
---|
170 | $big_chessboard = imagecreate($board_size+2*$bordure+$taille,$board_size+2*$bordure+$taille); |
---|
171 | $bg_color = imagecolorallocate($big_chessboard,$fond[0],$fond[1],$fond[2]); |
---|
172 | imagecolortransparent($big_chessboard,$bg_color); |
---|
173 | imagecopy($big_chessboard,$chessboard,$taille,0,0,0,$board_size+2*$bordure,$board_size+2*$bordure); |
---|
174 | $width = imagefontwidth($font); |
---|
175 | $height = imagefontheight($font); |
---|
176 | $center = intval($taille/2); |
---|
177 | for ($i=1 ; $i<=8 ; $i++) { |
---|
178 | $empty_coord = imagecreate($taille,$taille); |
---|
179 | $bg_color = imagecolorallocate($empty_coord,$fond[0],$fond[1],$fond[2]); |
---|
180 | imagecolortransparent($empty_coord,$bg_color); |
---|
181 | $font_color = imagecolorallocate($empty_coord,0,0,0); |
---|
182 | if (!$flip) { |
---|
183 | imagechar($empty_coord,$font,($taille-$width)/2,($taille-$height)/2+$bordure,9-$i,$font_color); |
---|
184 | } else { |
---|
185 | imagechar($empty_coord,$font,($taille-$width)/2,($taille-$height)/2+$bordure,$i,$font_color); |
---|
186 | } |
---|
187 | imagecopy($big_chessboard,$empty_coord,0,($i-1)*$taille,0,0,$taille,$taille); |
---|
188 | } |
---|
189 | for ($i=1 ; $i<=8 ; $i++) { |
---|
190 | $empty_coord = imagecreate($taille,$taille); |
---|
191 | $bg_color = imagecolorallocate($empty_coord,$fond[0],$fond[1],$fond[2]); |
---|
192 | imagecolortransparent($empty_coord,$bg_color); |
---|
193 | $font_color = imagecolorallocate($empty_coord,0,0,0); |
---|
194 | if (!$flip) { |
---|
195 | imagechar($empty_coord,$font,($taille-$width)/2+$bordure,($taille-$height)/2,$diag_echecs_globales['number2letter'][$i],$font_color); |
---|
196 | } else { |
---|
197 | imagechar($empty_coord,$font,($taille-$width)/2+$bordure,($taille-$height)/2,$diag_echecs_globales['number2letter'][9-$i],$font_color); |
---|
198 | } |
---|
199 | imagecopy($big_chessboard,$empty_coord,$i*$taille,8*$taille+2*$bordure,0,0,$taille,$taille); |
---|
200 | } |
---|
201 | $chessboard = $big_chessboard; |
---|
202 | } // if (jeux_config('coords')) |
---|
203 | |
---|
204 | $img($chessboard, $fichier_dest); |
---|
205 | return $image; |
---|
206 | } |
---|
207 | |
---|
208 | // decode un diagramme d'echecs |
---|
209 | function jeux_diag_echecs($texte, $indexJeux) { |
---|
210 | // qq initialisations |
---|
211 | $html = false; |
---|
212 | |
---|
213 | // decodage du texte |
---|
214 | $tableau = jeux_split_texte('diag_echecs', $texte); |
---|
215 | diag_echecs_config_default(); |
---|
216 | diag_echecs_config_supplementaire(); |
---|
217 | foreach($tableau as $i => $valeur) if ($i & 1) { |
---|
218 | if ($valeur==_JEUX_TITRE) $html .= "<p class=\"jeux_titre diag_echecs_titre\">{$tableau[$i+1]}</p>"; |
---|
219 | elseif ($valeur==_JEUX_DIAG_ECHECS) $html .= calcul_diagramme_echecs($tableau[$i+1], $indexJeux); |
---|
220 | elseif ($valeur==_JEUX_TEXTE) $html .= $tableau[$i+1]; |
---|
221 | } |
---|
222 | |
---|
223 | return $html; |
---|
224 | } |
---|
225 | ?> |
---|