source: spip-zone/_plugins_/jeux/jeux/diag_echecs.php @ 54465

Last change on this file since 54465 was 54465, checked in by fredjust@…, 8 years ago

ajout du parametre truecolor=non enregistrement en 24bit

File size: 11.4 KB
Line 
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
13Insere un diagramme de positions d’echecs 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
22separateurs obligatoires : [diag_echecs]
23separateurs optionnels   : [titre], [texte], [config]
24
25Attention :
26- La librairie GD doit etre installee sur le serveur.
27
28La position doit etre decrite sous forme de notation FEN, ou bien en utilisant la forme "classique".
29Exemples :
30        classique : B:Rg1,Dd1,Ta1,e1,Pa2,f6/N:Rb8,Pa6,f5
31        FEN       : r1bqkbnr/pp2pppp/2n5/2p1P3/3p4/2P2N2/PP1P1PPP/RNBQKB1R
32
33Notation "classique" : la description de la position blanche commence par "B:", celle de la position noire par "N:", et les deux sont separees par un "/".
34Il est possible de n'indiquer qu'une couleur (B ou N) pour la description. L'ordre dans cette derniere est indifferent.
35Les majuscules ne sont pas non plus obligatoires
36
37Cases en surbrillance : on peut utiliser "/sv" pour mettre du vert, "/sb" pour du bleu, "/sj" pour du jaune et "/sr" pour du rouge.
38Attention : pour utiliser cette fonctionnalite, il faut obligatoirement utiliser la notation "classique".
39
40Retournement 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
42Exemples 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
60Parametres [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*/
72require("diag_echecs_init.php");
73require("diag_echecs_inc.php");
74
75// creation du diagramme d'echecs
76function 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        // ************* case en surbrillance *************
82        $caserouge = jeux_config('rouge');
83        $casebleu = jeux_config('bleu');
84        $casevert = jeux_config('vert');
85        $casejaune = jeux_config('jaune');
86       
87        $bordure = intval(jeux_config('bordure'));
88        $board_size = intval(jeux_config('board_size'));
89        $font = intval(jeux_config('police'));
90        $img = jeux_config('img_img');
91       
92        // dechiffre le code source du diagramme place dans $position
93        $position = preg_replace("/\s*[\r\n]+\s*/", '/', trim($position));
94        $position = preg_replace(",\/+,", '/', trim($position));
95
96        // quelle est la notation !?   
97        $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]+)) *(.*),';
98        if ( preg_match($masque, $position, $table) ) {
99          $position = FEN2classic($position);                   // FEN
100          $table = explode("/", $position);
101        } else {
102          $position = preg_replace(",\s,","",$position);                // CLASSIC
103          $position = strtolower($position);
104          $table = explode("/",$position);
105          if (count($table)<2) return "Erreur dans la syntaxe [explode table classic]";
106        }
107       
108        // image en cache
109        global $jeux_config;
110        $md5 = md5($position.serialize($jeux_config));
111        $fichier_dest = sous_repertoire(_DIR_VAR, "cache-jeux") . 'echiq_'.$md5 . jeux_config('img_suffix');
112        list(,,,$size) = @getimagesize($fichier_dest);
113        $image = "<img class=\"no_image_filtrer \" src=\"$fichier_dest\" alt=\"$position\" title=\"$position\" border=\"0\" $size/><br>\n";
114        // pas de recalcul de l'image pendant 12 heures si le fichier existe deja
115        if (file_exists($fichier_dest) 
116                        AND ($GLOBALS['var_mode'] != 'recalcul') AND ($GLOBALS['var_mode'] != 'calcul') 
117                        AND (time()-@filemtime($fichier_dest) < 12*3600))
118                 return $image;
119
120        $chessboard = image_echiquier();
121
122// *********************       
123        //for ($i=0 ; $i<count($table) ; $i++)  if ( $table[$i] == "r" ) $flip = true;
124        if (in_array('r', $table)) $flip = true;
125       
126
127        // *************** CASE A COLORIER *************************
128        if (strlen($casebleu)>0 )       {
129                $lescases=explode(",",$casebleu);
130                        for ($j=0 ; $j<count($lescases) ; $j++) {
131                                $square=$lescases[$j];
132                                $hilite = "hbleu";
133                                diag_echecs_hilite_square($chessboard,$square,$hilite,$flip);
134                        }
135                }
136        if (strlen($caserouge)>0 )      {
137                $lescases=explode(",",$caserouge);
138                        for ($j=0 ; $j<count($lescases) ; $j++) {
139                                $square=$lescases[$j];
140                                $hilite = "hrouge";
141                                diag_echecs_hilite_square($chessboard,$square,$hilite,$flip);
142                        }
143                }
144        if (strlen($casevert)>0 )       {
145                $lescases=explode(",",$casevert);
146                        for ($j=0 ; $j<count($lescases) ; $j++) {
147                                $square=$lescases[$j];
148                                $hilite = "hvert";
149                                diag_echecs_hilite_square($chessboard,$square,$hilite,$flip);
150                        }
151                }
152        if (strlen($casejaune)>0 )      {
153                $lescases=explode(",",$casejaune);
154                        for ($j=0 ; $j<count($lescases) ; $j++) {
155                                $square=$lescases[$j];
156                                $hilite = "hjaune";
157                                diag_echecs_hilite_square($chessboard,$square,$hilite,$flip);
158                        }
159                }
160        for ($i=0 ; $i<count($table) ; $i++) {
161          $sub_table = preg_split("/[:,]/",$table[$i]);
162          switch($sub_table[0]) {
163                case "b" : $side = "w";break;
164                case "n" : $side = "b";break;
165                case "sr" : $side = "-"; $hilite = "hrouge"; break;
166                case "sv" : $side = "-"; $hilite = "hvert"; break;
167                case "sb" : $side = "-"; $hilite = "hbleu"; break;
168                case "sj" : $side = "-"; $hilite = "hjaune"; break;
169                case "r" : $side = "-"; $flip = true; break; /* Ne sert qu'a eviter des erreurs ;) */
170                default : return "Erreur dans la syntaxe [couleur]";
171          }
172          /* Ici j'ai change car sinon il est impossible de commencer la */
173          /* description de la position par un pion sans 'p' */
174          /* et cela pose probleme pour la partie hilite qui elle ne */
175          /* comporte pas de piece */
176          if (strlen($sub_table[1])==2) $name = "p";
177          elseif (strlen($sub_table[1])==3) $name = substr($sub_table[1],0,1);
178          else {
179                if ( (strlen($sub_table[1])==0) && $sub_table[0]!="r" ) {
180                  echo "<p>$sub_table[1]</p>";
181                  return "Erreur dans la syntaxe [piece]";
182                }
183          }
184       
185          for ($j=1 ; $j<count($sub_table) ; $j++) {
186                switch(strlen($sub_table[$j])) {
187                  case 2 :
188                        $square = substr($sub_table[$j],0,2);
189                        break;
190                  case 3 :
191                        $name = substr($sub_table[$j],0,1);
192                        $square = substr($sub_table[$j],1,2);
193                        break;
194                  default :
195                        die("Erreur dans la syntaxe (pos) !");
196                }
197                if ($side!="-") diag_echecs_put_piece($chessboard,$side,$name,$square,$flip);
198                 else diag_echecs_hilite_square($chessboard,$square,$hilite,$flip);
199          }
200        }
201
202        /* Faut-il envoyer un en-tete (cas d'une image "nue"), ou l'image
203est-elle destinee a etre incluse dans une page Web ? Laisser la
204variable a "true" dans le premier cas, la mettre a "false" dans le
205second */
206        /*      if ($hdr) header(jeux_config('img_header'); */
207       
208        if (jeux_config('coords')) {
209          $fond = $jeux_couleurs[jeux_config('fond')];
210          $big_chessboard = imagecreatetruecolor($board_size+2*$bordure+$taille,$board_size+2*$bordure+$taille);
211          $bg_color = imagecolorallocate($big_chessboard,$fond[0],$fond[1],$fond[2]);
212          //imagecolortransparent($big_chessboard,$bg_color);
213          imagefill($big_chessboard,0,0,$bg_color);                     
214          imagecopy($big_chessboard,$chessboard,$taille,0,0,0,$board_size+2*$bordure,$board_size+2*$bordure);
215          $width = imagefontwidth($font);
216          $height = imagefontheight($font);
217          $center = intval($taille/2);
218          for ($i=1 ; $i<=8 ; $i++) {
219                $empty_coord = imagecreatetruecolor($taille,$taille);
220                $bg_color = imagecolorallocate($empty_coord,$fond[0],$fond[1],$fond[2]);
221                //imagecolortransparent($empty_coord,$bg_color);
222                imagefill($empty_coord,0,0,$bg_color);                         
223                $font_color = imagecolorallocate($empty_coord,0,0,0);
224                if (!$flip) {
225                  imagechar($empty_coord,$font,($taille-$width)/2,($taille-$height)/2+$bordure,9-$i,$font_color);
226                } else {
227                  imagechar($empty_coord,$font,($taille-$width)/2,($taille-$height)/2+$bordure,$i,$font_color);
228                }
229                imagecopy($big_chessboard,$empty_coord,0,($i-1)*$taille,0,0,$taille,$taille);
230          }
231          for ($i=1 ; $i<=8 ; $i++) {
232                $empty_coord = imagecreatetruecolor($taille,$taille);
233                $bg_color = imagecolorallocate($empty_coord,$fond[0],$fond[1],$fond[2]);
234                //imagecolortransparent($empty_coord,$bg_color);
235                imagefill($empty_coord,0,0,$bg_color);
236                $font_color = imagecolorallocate($empty_coord,0,0,0);
237                if (!$flip) {
238                  imagechar($empty_coord,$font,($taille-$width)/2+$bordure,($taille-$height)/2,$diag_echecs_globales['number2letter'][$i],$font_color);
239                } else {
240                  imagechar($empty_coord,$font,($taille-$width)/2+$bordure,($taille-$height)/2,$diag_echecs_globales['number2letter'][9-$i],$font_color);
241                }
242                imagecopy($big_chessboard,$empty_coord,$i*$taille,8*$taille+2*$bordure,0,0,$taille,$taille);
243          }
244         $chessboard = $big_chessboard;
245        } // if (jeux_config('coords'))
246       
247        // ************* redimensionement final *************
248        if (strlen(jeux_config('redim'))>0) {
249                if (jeux_config('coords')) { $nbcases=9; } else { $nbcases=8; }
250                $newsize = intval(jeux_config('redim'))*$nbcases+2*$bordure;
251                if ($newsize>639) {$newsize=640;}; // taille maximale pour éviter les confusion taille de case et taille de l'image
252                $img_finale = imagecreatetruecolor($newsize,$newsize);
253                imagecopyresampled($img_finale,$chessboard,0,0,0,0,$newsize,$newsize,$taille*$nbcases+2*$bordure,$taille*$nbcases+2*$bordure);
254                // converti l'image en 256 couleurs si truecolor=non
255                if (!jeux_config('truecolor')) { imagetruecolortopalette($img_finale,false,256); };     
256                $img($img_finale, $fichier_dest);
257        }
258        else {
259                // converti l'image en 256 couleurs si truecolor=non
260                if (!jeux_config('truecolor')) { imagetruecolortopalette($chessboard,false,256); };     
261                $img($chessboard, $fichier_dest);
262        }
263       
264        return $image;
265}
266
267// decode un diagramme d'echecs, pas de formulaire
268function jeux_diag_echecs($texte, $indexJeux, $form=true) { 
269        // qq initialisations
270        $html = false;
271       
272        // decodage du texte
273        $tableau = jeux_split_texte('diag_echecs', $texte);
274        diag_echecs_config_supplementaire();
275        foreach($tableau as $i => $valeur) if ($i & 1) {
276         if ($valeur==_JEUX_TITRE) $html .= "<div class=\"jeux_titre diag_echecs_titre\">{$tableau[$i+1]}</div>";
277          elseif ($valeur==_JEUX_DIAG_ECHECS) $html .= calcul_diagramme_echecs($tableau[$i+1], $indexJeux);
278          elseif ($valeur==_JEUX_TEXTE) $html .= $tableau[$i+1];
279        }
280       
281        return $html;
282}
283?>
Note: See TracBrowser for help on using the repository browser.