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

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

bricoles de code

File size: 9.1 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        $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
163est-elle destinee a etre incluse dans une page Web ? Laisser la
164variable a "true" dans le premier cas, la mettre a "false" dans le
165second */
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
209function 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?>
Note: See TracBrowser for help on using the repository browser.