Browse Source

Grosse mise à jour ici.

- Nouveau jeu : points à relier :-)
- explicitation en partie privée des configs pour chaque jeux, inline ou en base
- refonte de la gestion de la hiérarchie des configuration
- extension de la gestion des couleurs
- meilleure gestion du javascript en partie privée
- nouvelles options pour les jeux : aleatoire / transparence /
- quelques bricoles et correction de bugs
svn/root/trunk
patrice4@laposte.net 3 years ago
parent
commit
f0a20bc0b8
  1. 11
      jeux.css.html
  2. 2
      jeux/devinettes.php
  3. 5
      jeux/mots_croises.php
  4. 2
      jeux/multi_jeux.php
  5. 57
      jeux/pendu.php
  6. 93
      jeux/qcm.php
  7. 2
      jeux/saisies.php
  8. 2
      jeux/sudoku.php
  9. 4
      jeux/trous.php
  10. 32
      jeux_config.php
  11. 37
      jeux_fonctions.php
  12. 354
      jeux_pipelines.php
  13. 308
      jeux_utils.php
  14. 118
      lang/jeu_fr.php
  15. 256
      lang/jeux_fr.php
  16. 4
      modeles/jeu.html
  17. 3
      paquet.xml
  18. 50
      prive/objets/contenu/jeu.html
  19. 186
      prive/objets/liste/jeux.html

11
jeux.css.html

@ -212,11 +212,20 @@ table.jeux_grille td{
display:none;
}
.jeux_copyright {
text-align:right;
font-size:smaller;
}
.jeux_copyright:before {
content:"© ";
}
.jeux_decaler_config {
margin: 1em 0 0.8em 2em !important;
line-height: 100%;
}
.jeux_decaler_config p {
margin-bottom: 0.8em !important;
}

2
jeux/devinettes.php

@ -75,7 +75,7 @@ function devinettes_reponse($texte, $id) {
return $texte?"<div class=\"devinettes_reponse\">$texte</div>":'';
}
// configuration par defaut : jeu_{mon_jeu}_init()
// configuration par defaut : jeux_{mon_jeu}_init()
function jeux_devinettes_init() {
return "
reponse=oui // afficher la reponse ?

5
jeux/mots_croises.php

@ -93,8 +93,7 @@ function affichage_grille_mc($tableau_grille, $indexJeux, $form, $solution=false
$classnoir = ' class="jeux_noir' . ($ligne==$hauteur?($colonne==$largeur?' jeux_bas jeux_droite':' jeux_bas'):($colonne==$largeur?' jeux_droite':'')) . '"';
// s'il s'agit d'un noir
if ($cellule == "*") {
$noires = $jeux_couleurs[jeux_config('fondnoir')];
$noires = "rgb($noires[0], $noires[1], $noires[2])";
$noires = jeux_rgb(jeux_config('fondnoir'));
$grille .= "\t\t<td$classnoir style=\"background-color:$noires; color:$noires;\">*</td>\n";
}
else if ($solution)
@ -210,7 +209,7 @@ function affichage_definitions($horizontal, $vertical) {
return $liste_horizontal.$liste_vertical;
}
// configuration par defaut : jeu_{mon_jeu}_init()
// configuration par defaut : jeux_{mon_jeu}_init()
function jeux_mots_croises_init() {
return "
solution=oui // Afficher la solution ?

2
jeux/multi_jeux.php

@ -40,7 +40,7 @@ Exemple de syntaxe dans l'article :
// Separateur pour l'enregistrement en base des resultats longs
@define('_SEP_BASE_MULTI_JEUX', '<br />');
// configuration par defaut : jeu_{mon_jeu}_init()
// configuration par defaut : jeux_{mon_jeu}_init()
function jeux_multi_jeux_init() {
return "
bouton_corriger=corriger // fond utilise pour le bouton 'Corriger' (non ou 0 : pas de bouton)

57
jeux/pendu.php

@ -57,11 +57,11 @@ function pendu_pendu($js, $indexJeux) {
for($i=0; $i<=$nb_images-1; $i++)
$images .= "<img class=\"no_image_filtrer pendu_image\" name=\"pict{$indexJeux}_$i\" src=\"$path".$images_init[$i]."\" />";
$regles = jeux_config('regle')?'<div class="jeux_regle">'.definir_puce()._T('pendu:regle').'</div>' : '';
$js = echappe_html("$js
$js = echappe_html(protege_js_modeles("$js
pendu_init($indexJeux);
// --></script>", 'JEUX', true);
// --></script>"), 'JEUX', true);
// scripts autorises ?
if ((!_DIR_RESTREINT && $GLOBALS["filtrer_javascript"]!=1) || ($GLOBALS["filtrer_javascript"]==-1)) $js = _T('jeux:erreur_scripts');
// if ((!_DIR_RESTREINT && $GLOBALS["filtrer_javascript"]!=1) || ($GLOBALS["filtrer_javascript"]==-1)) $js = _T('jeux:erreur_scripts');
return '<table class="pendu" border=0><tr><td align="center">'
. "<div align=\"center\"><div class=\"pendu_images\" align=center>$images</div><br/>\n$proposition</div></td>"
@ -84,48 +84,49 @@ function affiche_un_clavier_dist($indexJeux, $alphabet=false) {
return "\n<table class=\"pendu_clavier\" border=0><tr><td class=\"pendu_clavier\" >$clav</td></tr></table>";
}
// configuration par defaut : jeu_{mon_jeu}_init()
// configuration par defaut : jeux_{mon_jeu}_init()
function jeux_pendu_init() {
return "
pendu=1 // dessin du pendu a utiliser dans : /jeux/img/pendu?
regle=non // Afficher la regle du jeu ?
indices=non // Afficher les premieres et dernieres lettres?
pendu=1 // dessin du pendu &agrave; utiliser dans : /jeux/img/pendu?
regle=non // Afficher la r&egrave;gle du jeu ?
indices=non // Afficher les premi&egrave;res et derni&egrave;res lettres?
alphabet=latin1 // Utiliser un clavier latin simple
";
}
// fonction principale
function jeux_pendu($texte, $indexJeux, $form=true) {
function jeux_pendu($texte, $indexJeux, $form = true) {
$html = false;
// parcourir tous les #SEPARATEURS
// parcourir tous les #SEPARATEURS et initialiser la config
$tableau = jeux_split_texte('pendu', $texte);
// initialisation des images de pendu
$path = find_in_path('img/pendu'.jeux_config('pendu')).'/';
lire_fichier ($path.'config.ini', $images);
jeux_config_init($images);
$i=1; $c=0; $js2=false;
lire_fichier($path . 'config.ini', $images);
jeux_config_ecrase($images);
$extremes = jeux_config('indices')?'true':'false'; // Affiche-t-on les lettres extremes?
$js="\n\tpendu_Extremes[$indexJeux]=$extremes;\n\tpendu_Paths[$indexJeux]='$path';\n\tpendu_Images[$indexJeux]=new Array(\n\t";
while(jeux_config($i)) {
$images = preg_split('/\s*,\s*/', jeux_config($i++));
$j=1;
$js2[]= " new Array('".join("','",$images)."')";
$c = max($x, count($images));
} $i-=2;
jeux_config_set('nb_images',$c);
$js .= join(",\n\t",$js2) . "\n\t);\n\tnb_pendu_Images[$indexJeux]=$c;\n\tnb_Pendus[$indexJeux]=$i;";
$js = "\n\tpendu_Extremes[$indexJeux] = $extremes;\n\tpendu_Paths[$indexJeux] = '$path';\n\tpendu_Images[$indexJeux] = new Array(\n\t";
$i = 1; $nb = 0; $js2 = array();
while($images = jeux_config($i++)) {
$images = preg_split('/\s*,\s*/', trim($images, ','));
$j = 1;
$js2[] = " new Array('" . join("','", $images) . "')";
$nb = max($nb, count($images));
}
$i -= 2;
jeux_config_set('nb_images', $nb);
$js .= join(",\n\t",$js2) . "\n\t);\n\tnb_pendu_Images[$indexJeux] = $nb;\n\tnb_Pendus[$indexJeux] = $i;";
foreach($tableau as $i => $valeur) if ($i & 1) {
if ($valeur==_JEUX_TITRE) $html .= pendu_titre($tableau[$i+1]);
elseif ($valeur==_JEUX_PENDU) $mots = jeux_liste_mots(jeux_majuscules($tableau[$i+1]));
elseif ($valeur==_JEUX_TEXTE) $html .= $tableau[$i+1];
elseif ($valeur==_JEUX_COPYRIGHT) $html .= '<div class="jeux_copyright">' . $tableau[$i+1] . '</div>';
if ($valeur == _JEUX_TITRE) $html .= pendu_titre($tableau[$i+1]);
elseif ($valeur == _JEUX_PENDU) $mots = jeux_liste_mots(jeux_majuscules($tableau[$i+1]));
elseif ($valeur == _JEUX_TEXTE) $html .= $tableau[$i+1];
elseif ($valeur == _JEUX_COPYRIGHT) $html .= '<div class="jeux_copyright">' . $tableau[$i+1] . '</div>';
}
$js .= "\n\tpendu_Mots[$indexJeux]=new Array('".join("','",$mots)."');";
$html .= pendu_pendu($js, $indexJeux);
return $form
?jeux_form_debut('pendu', $indexJeux).$html.jeux_form_fin()
:$html;
? jeux_form_debut('pendu', $indexJeux).$html.jeux_form_fin()
: $html;
}

93
jeux/qcm.php

@ -61,7 +61,7 @@ La gestion des points et des precisions est toujours possible :
*/
// configuration par defaut : jeu_{mon_jeu}_init()
// configuration par defaut : jeux_{mon_jeu}_init()
function jeux_qcm_init() {
return "
trou=auto // taille du trou affiche en cas de proposition unique
@ -71,17 +71,21 @@ function jeux_qcm_init() {
points=oui // affiche eventuellement les points dans les questions
max_radios=5 // nombre maximal de boutons radios affiches avant le choix d'une liste deroulante
colonnes=1 // nombre de boutons par ligne
aleatoire=non // les questions ne sont pas melangees. Si la valeur est un nombre, alors il s'agit du nombre de questions presentees
// suivre_invalideur=non // si les questions sont melangees, alors pour invalider les caches lies la condition de syntaxe : objet/id_objet
bouton_corriger=corriger // fond utilise pour le bouton 'Corriger'
bouton_refaire=recommencer // fond utilise pour le bouton 'Reset'
// transparence=non // le fond des images est-il traite par transparence ?
";
}
// cette fonction remplit le tableau $qcms sur la question $indexQCM
// remplir le tableau $qcms sur la question $indexQCM
function qcm_analyse_le_qcm(&$qcms, $qcm, $indexQCM, $isQRM) {
// init
isset($qcms['qrm']) || $qcms['qrm'] = false;
isset($qcms[$indexQCM]['nbpropositions']) || $qcms[$indexQCM]['nbpropositions'] = 0;
$qcms[$indexQCM]['index'] = $indexQCM;
$qcms[$indexQCM]['qrm'] = $isQRM;
$qcms['qrm'] |= $isQRM;
$lignes = preg_split('/[\r\n]+/', $qcm);
@ -115,7 +119,7 @@ function qcm_analyse_le_qcm(&$qcms, $qcm, $indexQCM, $isQRM) {
// la precision eventuelle...
$qcms[$indexQCM]['precisions'][$indexProposition] = trim($precision);
// cas d'un trou (ou d'une proposition non numerotee !)
if ($indexProposition==0) {
if ($indexProposition == 0) {
$qcms[$indexQCM]['maxScore'] = $qcms[$indexQCM]['points'][0] =
$qcms[$indexQCM]['points'][0]===false?1:$qcms[$indexQCM]['points'][0];
$qcms[$indexQCM]['propositions'] = jeux_liste_mots($qcms[$indexQCM]['propositions'][0]);
@ -139,7 +143,9 @@ function qcm_analyse_le_qcm(&$qcms, $qcm, $indexQCM, $isQRM) {
elseif($p>0) $qcms[$indexQCM]['maxScore'] += $p;
}
// les reponses fausses deviennent negatives dans le cas de reponses multiples
if ($isQRM) foreach($qcms[$indexQCM]['points'] as $p=>$v) if ($v===false) $qcms[$indexQCM]['points'][$p] = -1;
if ($isQRM)
foreach($qcms[$indexQCM]['points'] as $p=>$v)
if ($v===false) $qcms[$indexQCM]['points'][$p] = -1;
break;
default : break;
@ -161,6 +167,10 @@ function qcm_affiche_la_question(&$qcms, $indexJeux, $indexQCM, $gestionPoints)
if (!$qcms[$indexQCM]['nbpropositions'] || !$qcms[$indexQCM]['maxScore'])
return '<div class="jeux_question">'.definir_puce()._T('jeux:erreur_syntaxe').'</div>';
// constances surchargeables
if(!defined('_JEUX_ESPACE_QCM')) define('_JEUX_ESPACE_QCM', '<span class="jeux_espace"> &nbsp; </span>');
if(!defined('_JEUX_ALINEA_QCM')) define('_JEUX_ALINEA_QCM', '<span class="jeux_alinea"><br /></span>');
// Initialisation du code a retourner
list($idInput, $nameInput) = jeux_idname($indexJeux, $indexQCM, 'Q');
$question = trim(str_replace('&nbsp;', ' ', $qcms[$indexQCM]['question']));
@ -180,23 +190,28 @@ function qcm_affiche_la_question(&$qcms, $indexJeux, $indexQCM, $gestionPoints)
$codeHTML .= "\n<div class='qcm_proposition'>";
if ($trou) {
// jeu a trous
if (($sizeInput = intval(jeux_config('trou'))) == 0)
foreach($qcms[$indexQCM]['propositions'] as $mot) $sizeInput = max($sizeInput, strlen($mot));
$prop = jeux_minuscules($temp);
$codeHTML .= " &nbsp; &nbsp; &nbsp;<input name='$nameInput' id='$idInput' class='jeux_input qcm_input' size='$sizeInput' type='text' /> ";
$codeHTML .= " &nbsp; &nbsp; &nbsp;<input name='$nameInput' id='$idInput' class='jeux_input qcm_input' size='$sizeInput' type='text' > ";
} elseif ($qrm) {
// cases a cocher
foreach($qcms[$indexQCM]['propositions'] as $i=>$valeur)
$codeHTML .= "<input type='checkbox' class='jeux_cocher qcm_cocher' name='{$nameInput}[]' value='$i' id='{$idInput}-$i' /><label for='{$idInput}-$i'><span></span>&nbsp;" . $valeur.'</label>' . ($i % $nbcol?' &nbsp; ':'<br />');
// S'il y a trop de choix, utiliser une liste a la place des boutons radio
$codeHTML .= "<input type='checkbox' class='jeux_cocher qcm_cocher' name='{$nameInput}[]' value='$i' id='{$idInput}-$i' >"
. "<label for='{$idInput}-$i'><span></span>&nbsp;" . $valeur . '</label>'
. ($i % $nbcol?_JEUX_ESPACE_QCM:_JEUX_ALINEA_QCM);
} elseif ($qcms[$indexQCM]['nbpropositions']>jeux_config('max_radios')) {
// S'il y a trop de choix, utiliser une liste a la place des boutons radio
$codeHTML .= "<select name='$nameInput' id='$idInput' class='qcm_select'><option value=''>"._T('jeux:votre_choix').'</option>';
foreach($qcms[$indexQCM]['propositions'] as $i=>$valeur) $codeHTML.="<option value='$i'>$valeur</option>";
$codeHTML .= '</select>';
} else {
// boutons radio
foreach($qcms[$indexQCM]['propositions'] as $i=>$valeur)
$codeHTML .= "<input type='radio' class='jeux_radio qcm_radio' name='$nameInput' value='$i' id='{$idInput}-$i' /><label for='{$idInput}-$i'><span></span>&nbsp;$valeur</label>" . ($i % $nbcol?' &nbsp; ':'<br />');
$codeHTML .= "<input type='radio' class='jeux_radio qcm_radio' name='$nameInput' value='$i' id='{$idInput}-$i' >"
. "<label for='{$idInput}-$i'><span></span>&nbsp;$valeur</label>"
. ($i % $nbcol?_JEUX_ESPACE_QCM:_JEUX_ALINEA_QCM);
}
$codeHTML .= '</div><br /></div>';
@ -211,12 +226,14 @@ function qcm_affiche_la_question(&$qcms, $indexJeux, $indexQCM, $gestionPoints)
$pointsR = false;
if (is_array($reponse)) {
foreach($reponse as $r)
if(($p=$qcms[$indexQCM]['points'][$r])!==false) $pointsR += $p;
if (($p=$qcms[$indexQCM]['points'][$r]) !== false)
$pointsR += $p;
} else {
if(($p=$qcms[$indexQCM]['points'][$trou?0:$reponse])!==false) $pointsR += $p;
if (($p=$qcms[$indexQCM]['points'][$trou?0:$reponse]) !== false)
$pointsR += $p;
}
$intro = $trou?_T('jeux:votre_reponse'):_T('jeux:votre_choix');
$intro = $trou ? _T('jeux:votre_reponse') : _T('jeux:votre_choix');
if (!$qrm) {
// ici : une question a reponse simple
@ -229,13 +246,14 @@ function qcm_affiche_la_question(&$qcms, $indexJeux, $indexQCM, $gestionPoints)
// bonne reponse
$bonneReponse = ($trou && jeux_in_liste($reponse, $qcms[$indexQCM]['propositions']))
|| (isset($qcms[$indexQCM]['bonnesreponses'][$reponse])
and $qcms[$indexQCM]['bonnesreponses'][$reponse]==1);
&& $qcms[$indexQCM]['bonnesreponses'][$reponse] == 1);
// si ce n'est pas un trou, donner les points de la reponse quoiqu'il arrive
if (!$trou || $bonneReponse) $qcms['score_du_qcm'] += $pointsR;
// renseigner le resultat detaille
$qcms['score_detaille'][] = $trou?"T$indexQCM_1:$reponse:".($bonneReponse?$pointsR:'0')
:"Q$indexQCM_1:R$reponse:$pointsR";
$qcms['score_detaille'][] = $trou
? "T$indexQCM_1:$reponse:" . ($bonneReponse?$pointsR:'0')
: "Q$indexQCM_1:R$reponse:$pointsR";
if($affiche_correction) {
// reponse juste ou fausse ?
@ -243,7 +261,9 @@ function qcm_affiche_la_question(&$qcms, $indexJeux, $indexQCM, $gestionPoints)
._T('jeux:reponse'.($bonneReponse?'Juste':'Fausse')).'</span></div>';
// les precisions eventuelles
$prec = $qcms[$indexQCM]['precisions'][$trou?0:$reponse];
if (strlen($prec)) $codeHTML.="<div class=\"qcm_precision\">$prec</div>";
// si c'est un trou, la precision n'est affichee que si la reponse est correcte
$affichage = strlen($prec) && ($trou ? $bonneReponse : true);
if ($affichage) $codeHTML.="<div class=\"qcm_precision\">$prec</div>";
}
} else foreach($reponse as $r) {
// ici : une question a reponses multiples
@ -281,21 +301,22 @@ function qcm_affiche_la_question(&$qcms, $indexJeux, $indexQCM, $gestionPoints)
if (jeux_config('solution')) {
if (!$qrm && !$bonneReponse) {
// s'occuper d'abord des qcm et des trous
$codeHTML.='<div class="qcm_reponse">'._T('jeux:bonneReponse').'&nbsp;';
if ($trou) $codeHTML.="'".join("' "._T('info_ou')."' ", $qcms[$indexQCM]['propositions'])."'";
$codeHTML .= '<div class="qcm_reponse">'._T('jeux:bonneReponse').'&nbsp;';
if ($trou)
$codeHTML .= "'" . join("' "._T('jeux:ou')." '", jeux_filtre_preg($qcms[$indexQCM]['propositions'])) . "'";
else {
$temp=array();
$temp = array();
foreach($qcms[$indexQCM]['bonnesreponses'] as $i=>$val) if ($qcms[$indexQCM]['bonnesreponses'][$i]==1) {
$prec = $qcms[$indexQCM]['precisions'][$i];
$temp[] = $qcms[$indexQCM]['propositions'][$i]
. (strlen($prec)?"<div class=\"qcm_precision\">$prec</div>":'<br />');
}
$codeHTML.=join(''._T('info_ou').' ', $temp);
$codeHTML .= join(' '._T('jeux:ou').' ', jeux_filtre_preg($temp));
}
$codeHTML.='</div>';
} elseif($qrm && $qrm_score<>$qcms[$indexQCM]['maxScore']) {
// s'occuper ensuite des qrm
$temp=array();
$temp = array();
foreach($qcms[$indexQCM]['bonnesreponses'] as $i=>$val) {
if (!is_array($reponse) || !in_array($i, $reponse)) {
$prec = $qcms[$indexQCM]['precisions'][$i];
@ -314,11 +335,14 @@ function qcm_affiche_la_question(&$qcms, $indexJeux, $indexQCM, $gestionPoints)
return $codeHTML;
}
// remplacer les balises d'attente <ATTENTE_QCM>ii</ATTENTE_QCM>
// par le code complet de la question et de ses propositions
function qcm_inserer_les_qcm(&$qcms, $indexJeux, &$chaine, $gestionPoints) {
if (preg_match(',<ATTENTE_QCM>(\d+)</ATTENTE_QCM>,', $chaine, $regs)) {
$indexQCM = intval($regs[1]);
$indexQCM = $qcms['ordreQuestions'][intval($regs[1])];
list($texteAvant, $texteApres) = explode($regs[0], $chaine, 2);
$chaine = $texteAvant.jeux_rem('QCM-DEBUT', $indexQCM)
$chaine = $texteAvant
. jeux_rem('QCM-DEBUT', $indexQCM)
. qcm_affiche_la_question($qcms, $indexJeux, $indexQCM, $gestionPoints)
. jeux_rem('QCM-FIN', $indexQCM)
. qcm_inserer_les_qcm($qcms, $indexJeux, $texteApres, $gestionPoints);
@ -360,6 +384,23 @@ function jeux_qcm($texte, $indexJeux, $form=true) {
// si un qrm a ete insere ou si certaines questions ne valent pas 1 point, afficher les points
$gestionPoints = $qcms['qrm'] || $qcms['pointsTrouves'];
// stocker l'ordre des questions, eventuellement aleatoires
if (jeux_form_correction($indexJeux)) {
$qcms['ordreQuestions'] = explode('/', base64_decode(_request('ordreQ' . $indexJeux)));
$ordre = '';
// pouvoir invalider le cache des articles a chaque correction si les questions sont aleatoires
// TODO : config plus fine ? parametre "suivre_invalideur=article/2145" ?
if (jeux_config('aleatoire')) { // (jeux_config('suivre_invalideur')) {
include_spip('inc/invalideur');
// suivre_invalideur("id='" . jeux_config('suivre_invalideur') . "'");
suivre_invalideur('article');
}
} else {
$qcms['ordreQuestions'] = range(0, $indexQCM-1);
if (jeux_config('aleatoire')) shuffle($qcms['ordreQuestions']);
$ordre = "\n<input type='hidden' name='ordreQ$indexJeux' value='" . base64_encode(join('/', $qcms['ordreQuestions'])) . "' >";
}
// reinserer les qcms mis en forme
$texte = qcm_inserer_les_qcm($qcms, $indexJeux, $html, $gestionPoints);
@ -369,18 +410,20 @@ function jeux_qcm($texte, $indexJeux, $form=true) {
if (jeux_form_correction($indexJeux)) {
// mode correction
$pied = jeux_afficher_score($qcms['score_du_qcm'], $qcms['totalScore'], $id_jeu, join(', ', $qcms['score_detaille']), $categ_score);
if($form) $pied .= jeux_bouton(jeux_config('bouton_refaire'), $id_jeu, $indexJeux);
if($form)
$pied .= jeux_bouton(jeux_config('bouton_refaire'), $id_jeu, $indexJeux);
} else {
// mode formulaire
if($form) {
$pied = '<br />' . jeux_bouton(jeux_config('bouton_corriger'), $id_jeu) . jeux_form_fin();
$tete .= jeux_form_debut('qcm', $indexJeux, '', 'post', self());
$tete .= jeux_form_debut('qcm', $indexJeux, '', 'post', self(), $ordre);
}
}
// ajout du javascript s'il faut afficher une par une
$js = jeux_config('une_par_une')?'<script type="text/javascript">qcm_affichage_une_par_une();</script>':'';
return $tete.$texte.$pied.'</div>'.$js;
return $tete . $texte . $pied . '</div>' . $js;
}
?>

2
jeux/saisies.php

@ -74,7 +74,7 @@ Les autres parametres :
*/
// configuration par defaut : jeu_{mon_jeu}_init()
// configuration par defaut : jeux_{mon_jeu}_init()
function jeux_saisies_init() {
return "
bouton_corriger=valider // fond utilise pour le bouton 'Valider'

2
jeux/sudoku.php

@ -178,7 +178,7 @@ function calcul_erreurs_sudoku($tableau_sudoku, $solution, $indexJeux) {
. '</div><br />';
}
// configuration par defaut : jeu_{mon_jeu}_init()
// configuration par defaut : jeux_{mon_jeu}_init()
function jeux_sudoku_init() {
return "
solution=oui // Afficher la solution ?

4
jeux/trous.php

@ -64,7 +64,7 @@ expression ne soit pas une expression reguliere
*/
// configuration par defaut : jeu_{mon_jeu}_init()
// configuration par defaut : jeux_{mon_jeu}_init()
function jeux_trous_init() {
return "
taille=auto // taille des trous
@ -135,7 +135,7 @@ function trous_liste_reponses($mots) {
$reponses = array(); $etc = '';
foreach ($mots as $mot) {
if(substr($mot,0,1)===',') $etc = 'etc.';
else $reponses[] = strpos($mot, '/M')===($len=strlen($mot)-2) ?substr($mot,0,$len):$mot;
else $reponses[] = strpos($mot, '/M')===($len=strlen($mot)-2) ? substr($mot,0,$len) : $mot;
}
return join(' / ', $reponses) . $etc;
}

32
jeux_config.php

@ -41,6 +41,9 @@ define('_JEUX_KAKURO', 'kakuro');
define('_JEUX_QCM', 'qcm');
define('_JEUX_QRM', 'qrm');
define('_JEUX_QUIZ', 'quiz');
define('_JEUX_RELIER', 'relier');
define('_JEUX_GAUCHE', 'gauche');
define('_JEUX_DROITE', 'droite');
define('_JEUX_CHARADE', 'charade');
define('_JEUX_DEVINETTE', 'devinette');
define('_JEUX_TROU', 'trou');
@ -73,13 +76,14 @@ $jeux_caracteristiques = array(
// 'kakuro' => array(_JEUX_TITRE, _JEUX_TEXTE, _JEUX_KAKURO, _JEUX_SOLUTION, _JEUX_CONFIG),
'mots_croises' => array(_JEUX_TITRE, _JEUX_TEXTE, _JEUX_COPYRIGHT, _JEUX_HORIZONTAL, _JEUX_VERTICAL, _JEUX_SOLUTION, _JEUX_CONFIG),
'qcm' => array(_JEUX_TITRE, _JEUX_TEXTE, _JEUX_COPYRIGHT, _JEUX_QCM, _JEUX_QRM, _JEUX_QUIZ, _JEUX_CONFIG, _JEUX_SCORE),
'textes' => array(_JEUX_TITRE, _JEUX_TEXTE, _JEUX_COPYRIGHT, _JEUX_POESIE, _JEUX_CITATION, _JEUX_BLAGUE, _JEUX_AUTEUR, _JEUX_RECUEIL),
'textes' => array(_JEUX_TITRE, _JEUX_TEXTE, _JEUX_COPYRIGHT, _JEUX_POESIE, _JEUX_CITATION, _JEUX_BLAGUE, _JEUX_AUTEUR, _JEUX_RECUEIL, _JEUX_CONFIG),
'devinettes' => array(_JEUX_TITRE, _JEUX_TEXTE, _JEUX_COPYRIGHT, _JEUX_DEVINETTE, _JEUX_CHARADE, _JEUX_REPONSE, _JEUX_CONFIG),
'trous' => array(_JEUX_TITRE, _JEUX_TEXTE, _JEUX_COPYRIGHT, _JEUX_TROU, _JEUX_CONFIG, _JEUX_SCORE),
'pendu' => array(_JEUX_TITRE, _JEUX_TEXTE, _JEUX_COPYRIGHT, _JEUX_PENDU, _JEUX_CONFIG),
'diag_echecs' => array(_JEUX_TITRE, _JEUX_TEXTE, _JEUX_COPYRIGHT, _JEUX_DIAG_ECHECS, _JEUX_COLORATION, _JEUX_CONFIG),
'chesstuff' => array(_JEUX_CHESSSTUFF, _JEUX_CONFIG),
'saisies' => array(_JEUX_TITRE, _JEUX_TEXTE, _JEUX_COPYRIGHT, _JEUX_LABEL, _JEUX_SAISIE, _JEUX_CONFIG),
'relier' => array(_JEUX_TITRE, _JEUX_TEXTE, _JEUX_COPYRIGHT, _JEUX_GAUCHE, _JEUX_DROITE, _JEUX_SOLUTION, _JEUX_CONFIG),
),
// liste des signatures caracteristiques d'un jeu.
@ -102,6 +106,7 @@ $jeux_caracteristiques = array(
'diag_echecs' => array(_JEUX_DIAG_ECHECS),
'chesstuff' => array(_JEUX_CHESSSTUFF),
'saisies' => array(_JEUX_SAISIE),
'relier' => array(_JEUX_GAUCHE, _JEUX_DROITE),
),
// nom court a donner aux jeux
@ -118,6 +123,7 @@ $jeux_caracteristiques = array(
'diag_echecs' => _L('Echecs'),
'chesstuff' => _L('Echecs'),
'saisies' => _L('Saisies'),
'relier' => _L('Points à relier'),
),
);
@ -135,9 +141,9 @@ unset($temp);
// ca peut toujours servir pour les controles...
// dossiers : jeux/style/ et jeux/javascript/
global $jeux_header_prive, $jeux_javascript_prive;
$jeux_header_prive = array('jeux','qcm', 'mots_croises', 'sudoku', 'pendu', 'trous');
$jeux_header_prive = array('jeux','qcm', 'mots_croises', 'sudoku', 'pendu', 'trous', 'relier');
// mots_croises.js suffit car sudoku.js est a priori l'exacte copie
$jeux_javascript_prive = array('jeux', 'qcm', 'pendu', 'mots_croises');
$jeux_javascript_prive = array('jeux', 'qcm', 'pendu', 'mots_croises', 'relier');
// Codes RGB des couleurs predefinies a utiliser pour certains parametres apres la balise [config]
global $jeux_couleurs;
@ -162,8 +168,28 @@ $jeux_couleurs = array(
'brun' => array(224,183,153),
'jauneclair' => array(247,235,211),
'brunclair' => array(255,243,217),
'rouge' => array(230,0,0),
'red' => array(230,0,0),
);
function jeux_rgbArray($couleur) {
global $jeux_couleurs;
if(isset($jeux_couleurs[$couleur]))
return $jeux_couleurs[$couleur];
include_spip('inc/filtres_images_mini');
$c = str_replace('html:', '', $couleur); // forcer une couleur html
$c = _couleur_hex_to_dec($c);
return $jeux_couleurs[$couleur] = array($c['red'], $c['green'], $c['blue']);
}
function jeux_rgb($couleur, $rgb=true) {
list($a, $b, $c) = jeux_rgbArray($couleur);
if($rgb) return "rgb($a, $b, $c)";
include_spip('inc/filtres_images_mini');
return _couleur_dec_to_hex($a, $b, $c);
}
global $scoreMULTIJEUX; $scoreMULTIJEUX = array();
// renvoie un tableau de lettres

37
jeux_fonctions.php

@ -115,11 +115,12 @@ function balise_TEXTE_JEU_dist($p) {
return $p;
}
// renvoie la configuration interne d'un jeu
function balise_CONFIG_INTERNE_dist($p) {
// renvoie la configuration interne complete du jeu
// si un parametre existe, alors la valeur de configuration est retournee
function balise_CONFIG_JEU_dist($p) {
$texte = champ_sql('texte', $p);
$param = interprete_argument_balise(1, $p);
$p->code = "jeux_trouver_configuration_interne($texte, ".($param?$param:"''").')';
$p->code = "jeux_trouver_configuration_complete($texte" . ($param ? ", $param" : '') . ')';
return $p;
}
@ -148,8 +149,9 @@ function table_jeux_caracteristiques() {
$res = _T('jeu:explication_modules')
. "\n\n| {{"._T('jeux:jeux').'}} | {{'._T('public:signatures_petition').'}} | {{'._T('jeu:label_options').'}} | {{'._T('spip:icone_configuration_site').'}} |';
foreach($jeux_caracteristiques['TYPES'] as $j=>$t) {
include_spip('jeux/'.$j);
$config = function_exists($f='jeux_'.$j.'_init')?trim($f()):'';
//include_spip('jeux/'.$j);
//$config = function_exists($f = 'jeux_'.$j.'_init') ? trim($f()) : '';
$config = jeux_trouver_configuration_defaut($j);
$res .= "\n|$t|&#91;"
. join("]<br />&#91;", $jeux_caracteristiques['SIGNATURES'][$j]) . ']|['
. join("]<br />&#91;", array_diff($jeux_caracteristiques['SEPARATEURS'][$j], $jeux_caracteristiques['SIGNATURES'][$j])) . ']|'
@ -201,4 +203,29 @@ function filtre_resultat_intermediaire($texte, $code='score', $index=0) {
}
}
// retourne la configuration de tous les jeux trouves dans le texte de l'article
function jeux_configuration_jeux_inline($id_article) {
include_spip('public/assembler');
return recuperer_fond('fonds/article_jeu_config', array('id_article' => $id_article));
}
// filtre isolant le texte inline de jeux eventuels entre les balises <jeux/>
// retour : tableau des textes de jeux inline trouves dans le texte initial
function jeux_isoler_les_jeux($texte) {
$tableau = array();
while(true) {
$texte = trim($texte);
// pas/plus de jeu ?
if(!strlen($texte) || strpos($texte, _JEUX_DEBUT)===false || strpos($texte, _JEUX_FIN)===false)
return $tableau;
// isoler le jeu...
list($texteAvant, $suite) = explode(_JEUX_DEBUT, $texte, 2);
list($texte, $texteApres) = explode(_JEUX_FIN, $suite, 2);
$res = jeux_trouver_configuration_complete($texte);
if ($res)
$tableau[] = code_echappement($texte);
$texte = $texteApres;
}
}
?>

354
jeux_pipelines.php

@ -1,171 +1,183 @@
<?php
#ini_set('display_errors','1'); error_reporting(E_ALL ^ (E_NOTICE | E_WARNING));
if (!defined("_ECRIRE_INC_VERSION")) return;
#---------------------------------------------------#
# Plugin : Jeux #
# Auteur : Patrice Vanneufville, 2006 #
# Gestion des scores : Maieul Rouquette, 2007 #
# Contact : patrice¡.!vanneufville¡@!laposte¡.!net #
# Licence : GPL #
#--------------------------------------------------------------------------#
# Documentation : https://contrib.spip.net/Des-jeux-dans-vos-articles #
#--------------------------------------------------------------------------#
include_spip('jeux_utils');
// tableau de parametres exploitables par les plugins
global $jeux_config;
// debut d'indexage des jeux presents sur la page
global $debut_index_jeux;
// fonction pre-traitement, pipeline pre_propre
// insertion de quelques balises de reconnaissance
// $texte_brut est vrai si le texte est issu d'un jeu en base : le traitement en est simplifie.
function jeux_pre_propre($texte, $texte_brut=false) {
// commencer par isoler le jeu
if(!strlen($texte)) return '';
if($texte_brut)
// texte brut d'un jeu en base
$texteAvant = $texteApres = '';
else {
// contenu d'un article normal
if(strpos($texte, _JEUX_DEBUT)===false || strpos($texte, _JEUX_FIN)===false) return $texte;
// isoler le jeu...
list($texteAvant, $suite) = explode(_JEUX_DEBUT, $texte, 2);
list($texte, $texteApres) = explode(_JEUX_FIN, $suite, 2);
}
// s'il n'est pas present dans un formulaire envoye,
// l'identifiant du jeu est choisi au hasard...
// ca peut servir en cas d'affichage de plusieurs articles par page.
// en passant tous les jeux en ajax, ce ne sera plus la peine.
// cet identifiant pourrait etre remplace par l'id_jeu d'un jeu present en base
global $debut_index_jeux;
if(!isset($debut_index_jeux))
$debut_index_jeux = _request('debut_index_jeux')?_request('debut_index_jeux'):rand(10000, 99999);
// creer un index d'affichage, servant a differencier plusieurs jeux sur une page en l'absence d'AJAX
static $indexJeux = null;
if(isset($indexJeux)) ++$indexJeux;
else $indexJeux = $debut_index_jeux;
// en cas de formulaire CVT ajax, le jeu est toujours unique et son $indexJeux est deja connu
$indexJeuxReel = (_request('var_ajax')=='form' && _request('jeu_cvt')=='oui' && _request('index_jeux'))
?_request('index_jeux'):$indexJeux;
// ...decoder le texte obtenu en fonction des signatures et inclure le jeu
$liste = jeux_liste_les_jeux($texte);
jeux_decode_les_jeux($texte, $indexJeuxReel);
// calcul des fichiers necessaires pour le header
if(count($liste)) {
// on oblige qd meme jeux.css et jeux.js si un jeu est detecte
$header = jeux_stylesheet_html('jeux') ."\n". jeux_javascript('jeux') . "\n";
// css et js des jeux detectes
foreach($liste as $jeu) $header .= jeux_stylesheet($jeu) . "\n";
foreach($liste as $jeu) $header .= jeux_javascript($jeu) . "\n";
$header = htmlentities(preg_replace(",\n+,", "||", trim($header)));
$header = jeux_rem('JEUX-HEAD', count($liste), base64_encode($header));
} else $header = '';
return $texteAvant . $header
. jeux_rem('PLUGIN-DEBUT', $indexJeuxReel, join('/', $liste))
. "<div id='JEU$indexJeuxReel' class='jeux_global'>$texte</div>"
# . "<div id='JEU$indexJeuxReel' class='jeux_global ajax'>$texte</div>"
. jeux_rem('PLUGIN-FIN', $indexJeuxReel)
. jeux_pre_propre($texteApres);
}
// fonction post-traitement, pipeline post_propre
// les jeux sont reellement decryptes
function jeux_post_propre($texte) {
$texte = echappe_retour($texte, 'JEUX');
$sep1 = '['._JEUX_POST.'|'; $sep2 = '@@]';
if (strpos($texte, $sep1)===false || strpos($texte, $sep2)===false) return $texte;
// isoler les parametres...
list($texteAvant, $suite) = explode($sep1, $texte, 2);
list($texte, $texteApres) = explode($sep2, $suite, 2);
list($fonc, $texteJeu, $indexJeux) = explode('|', $texte, 3);
if (function_exists($fonc)) $texte = $fonc($texteJeu, $indexJeux);
return $texteAvant.$texte.jeux_post_propre($texteApres);
}
// pipeline header_prive
function jeux_header_prive($flux){
include_spip('public/assembler');
include_spip('jeux_utils');
global $jeux_header_prive, $jeux_javascript_prive;
$flux .= _JEUX_HEAD1
. "<link rel='stylesheet' href='../spip.php?page=jeux.css' type='text/css' media='projection, screen' />"
. "<link rel='stylesheet' href='".find_in_path('prive/jeux_prive.css')."' type='text/css' media='projection, screen' />";
foreach($jeux_header_prive as $s) $flux .= jeux_stylesheet($s);
foreach($jeux_javascript_prive as $s) $flux .= jeux_javascript($s);
return $flux;
}
// pipeline insert_head
function jeux_insert_head($flux){
include_spip('jeux_utils');
return $flux . _JEUX_HEAD2;
}
// Le pipeline affichage_final, execute a chaque hit sur toute la page
// Recherche tous les "title=JEUX-HEAD(...)" --> et incorporation a la place de _JEUX_HEAD2
// dans <head> des fichiers js et css necessaires.
function jeux_affichage_final($flux) {
preg_match_all(",'JEUX-HEAD-#[0-9]+ `([^>]*)`',", $flux, $matches, PREG_SET_ORDER);
if(!count($matches)) return $flux;
$liste = array(_JEUX_HEAD2);
foreach ($matches as $val) $liste = array_merge($liste, explode('||', base64_decode($val[1])));
$liste = array_unique($liste);
$header = html_entity_decode(join("\n",$liste));
return str_replace(_JEUX_HEAD2, $header."\n\n", $flux);
}
/**
* Optimiser la base de donnees en supprimant les liens orphelins
* de l'objet vers quelqu'un et de quelqu'un vers l'objet.
*
* @param int $n
* @return int
*/
function jeux_optimiser_base_disparus($flux){
include_spip('action/editer_liens');
$flux['data'] += objet_optimiser_liens(array('jeux'=>'*'),'*');
// Supprimer les résultats sans auteurs
$res = sql_select ("spip_jeux_resultats.id_resultat AS id","spip_jeux_resultats LEFT JOIN spip_auteurs ON spip_jeux_resultats.id_auteur = spip_auteurs.id_auteur","spip_auteurs.id_auteur IS NULL");
$flux['data'] += optimiser_sansref('spip_jeux_resultats','id_resultat',$res);
// Supprimer les résultats sans jeux
$res = sql_select ("spip_jeux_resultats.id_resultat AS id","spip_jeux_resultats LEFT JOIN spip_jeux ON spip_jeux_resultats.id_jeu = spip_jeux.id_jeu","spip_jeux.id_jeu IS NULL");
$flux['data'] += optimiser_sansref('spip_jeux_resultats','id_resultat',$res);
return $flux;
}
// Afficher liens vers les résultats de l'auteur
function jeux_affiche_gauche($flux){
if ($flux['args']['exec'] == 'auteur') {
$flux['data'].= boite_ouvrir('','info');
$flux['data'].= '<a href="'.generer_url_ecrire('jeux_resultats','id_auteur='.$flux['args']['id_auteur']).'">'._T('jeux:voir_resultats').'</a>';
$flux['data'].= boite_fermer();
}
if ($flux['args']['exec'] == 'infos_perso') {
$flux['data'].= boite_ouvrir('','info');
$flux['data'].= '<a href="'.generer_url_ecrire('jeux_resultats','id_auteur='.$GLOBALS['auteur_session']['id_auteur']).'">'._T('jeux:voir_resultats').'</a>';
$flux['data'].= boite_fermer();
}
return $flux;
}
?>
<?php
#ini_set('display_errors','1'); error_reporting(E_ALL ^ (E_NOTICE | E_WARNING));
if (!defined("_ECRIRE_INC_VERSION")) return;
#---------------------------------------------------#
# Plugin : Jeux #
# Auteur : Patrice Vanneufville, 2006 #
# Gestion des scores : Maieul Rouquette, 2007 #
# Contact : patrice¡.!vanneufville¡@!laposte¡.!net #
# Licence : GPL #
#--------------------------------------------------------------------------#
# Documentation : https://contrib.spip.net/Des-jeux-dans-vos-articles #
#--------------------------------------------------------------------------#
include_spip('jeux_utils');
// tableau de parametres exploitables par les plugins
global $jeux_config;
// debut d'indexage des jeux presents sur la page
global $debut_index_jeux;
// fonction pre-traitement, pipeline pre_propre
// insertion de quelques balises de reconnaissance
// $texte_brut est vrai si le texte est issu d'un jeu en base : le traitement en est simplifie.
function jeux_pre_propre($texte, $texte_brut=false) {
// commencer par isoler le jeu
if(!strlen($texte)) return '';
if($texte_brut)
// texte brut d'un jeu en base
$texteAvant = $texteApres = '';
else {
// contenu d'un article normal
if(strpos($texte, _JEUX_DEBUT)===false || strpos($texte, _JEUX_FIN)===false) return $texte;
// isoler le jeu...
list($texteAvant, $suite) = explode(_JEUX_DEBUT, $texte, 2);
list($texte, $texteApres) = explode(_JEUX_FIN, $suite, 2);
}
// s'il n'est pas present dans un formulaire envoye,
// l'identifiant du jeu est choisi au hasard...
// ca peut servir en cas d'affichage de plusieurs articles par page.
// en passant tous les jeux en ajax, ce ne sera plus la peine.
// cet identifiant pourrait etre remplace par l'id_jeu d'un jeu present en base
global $debut_index_jeux;
if(!isset($debut_index_jeux))
$debut_index_jeux = _request('debut_index_jeux')?_request('debut_index_jeux'):rand(10000, 99999);
// creer un index d'affichage, servant a differencier plusieurs jeux sur une page en l'absence d'AJAX
static $indexJeux = null;
if(isset($indexJeux)) ++$indexJeux;
else $indexJeux = $debut_index_jeux;
// en cas de formulaire CVT ajax, le jeu est toujours unique et son $indexJeux est deja connu
$indexJeuxReel = (_request('var_ajax')=='form' && _request('jeu_cvt')=='oui' && _request('index_jeux'))
?_request('index_jeux'):$indexJeux;
// ...decoder le texte obtenu en fonction des signatures et inclure le jeu
$liste = jeux_liste_les_jeux($texte);
jeux_decode_les_jeux($texte, $indexJeuxReel);
// calcul des fichiers necessaires pour le header
if(count($liste)) {
// on oblige qd meme jeux.css et jeux.js si un jeu est detecte
$header = jeux_stylesheet_html('jeux') ."\n". jeux_javascript('jeux') . "\n";
// css et js des jeux detectes
foreach($liste as $jeu) $header .= jeux_stylesheet($jeu) . "\n";
foreach($liste as $jeu) $header .= jeux_javascript($jeu) . "\n";
$header = htmlentities(preg_replace(",\n+,", "||", trim($header)));
$header = jeux_rem('JEUX-HEAD', count($liste), base64_encode($header));
} else $header = '';
return $texteAvant . $header
. jeux_rem('PLUGIN-DEBUT', $indexJeuxReel, join('/', $liste))
. "<div id='JEU$indexJeuxReel' class='jeux_global'>$texte</div>"
# . "<div id='JEU$indexJeuxReel' class='jeux_global ajax'>$texte</div>"
. jeux_rem('PLUGIN-FIN', $indexJeuxReel)
. jeux_pre_propre($texteApres);
}
// fonction post-traitement, pipeline post_propre
// les jeux sont reellement decryptes
function jeux_post_propre($texte) {
$texte = echappe_retour($texte, 'JEUX');
$sep1 = '['._JEUX_POST.'|'; $sep2 = '@@]';
if (strpos($texte, $sep1)===false || strpos($texte, $sep2)===false) return $texte;
// isoler les parametres...
list($texteAvant, $suite) = explode($sep1, $texte, 2);
list($texte, $texteApres) = explode($sep2, $suite, 2);
list($fonc, $texteJeu, $indexJeux) = explode('|', $texte, 3);
if (function_exists($fonc)) $texte = $fonc($texteJeu, $indexJeux);
return $texteAvant.$texte.jeux_post_propre($texteApres);
}
// pipeline ramasse-miettes permet de recuperer le HTML propre *après* la reinsertion des modeles
// les scripts de jeux (base ou inline) sont empeches en partie privee, il a fallu les echapper.
// textwheel >= 1.3.5
function jeux_post_echappe_html_propre($texte) {
return echappe_retour($texte, 'JEUX_SCRIPTS');
}
// pipeline header_prive
function jeux_header_prive($flux){
include_spip('public/assembler');
include_spip('jeux_utils');
global $jeux_header_prive, $jeux_javascript_prive;
$flux .= _JEUX_HEAD1
. "<link rel='stylesheet' href='../spip.php?page=jeux.css' type='text/css' media='projection, screen' />"
. "<link rel='stylesheet' href='".find_in_path('prive/jeux_prive.css')."' type='text/css' media='projection, screen' />";
foreach($jeux_header_prive as $s) $flux .= jeux_stylesheet($s);
foreach($jeux_javascript_prive as $s) $flux .= jeux_javascript($s);
return $flux;
}
// pipeline insert_head
function jeux_insert_head($flux){
include_spip('jeux_utils');
return $flux . _JEUX_HEAD2;
}
// Le pipeline affichage_final, execute a chaque hit sur toute la page
// Recherche tous les "title=JEUX-HEAD(...)" --> et incorporation a la place de _JEUX_HEAD2
// dans <head> des fichiers js et css necessaires.
function jeux_affichage_final($flux) {
preg_match_all(",'JEUX-HEAD-#[0-9]+ `([^>]*)`',", $flux, $matches, PREG_SET_ORDER);
if(!count($matches)) return $flux;
$liste = array(_JEUX_HEAD2);
foreach ($matches as $val) $liste = array_merge($liste, explode('||', base64_decode($val[1])));
$liste = array_unique($liste);
$header = html_entity_decode(join("\n",$liste));
return str_replace(_JEUX_HEAD2, $header."\n\n", $flux);
}
/**
* Optimiser la base de donnees en supprimant les liens orphelins
* de l'objet vers quelqu'un et de quelqu'un vers l'objet.
*
* @param int $n
* @return int
*/
function jeux_optimiser_base_disparus($flux){
include_spip('action/editer_liens');
$flux['data'] += objet_optimiser_liens(array('jeux'=>'*'),'*');
// Supprimer les résultats sans auteurs
$res = sql_select ("spip_jeux_resultats.id_resultat AS id","spip_jeux_resultats LEFT JOIN spip_auteurs ON spip_jeux_resultats.id_auteur = spip_auteurs.id_auteur","spip_auteurs.id_auteur IS NULL");
$flux['data'] += optimiser_sansref('spip_jeux_resultats','id_resultat',$res);
// Supprimer les résultats sans jeux
$res = sql_select ("spip_jeux_resultats.id_resultat AS id","spip_jeux_resultats LEFT JOIN spip_jeux ON spip_jeux_resultats.id_jeu = spip_jeux.id_jeu","spip_jeux.id_jeu IS NULL");
$flux['data'] += optimiser_sansref('spip_jeux_resultats','id_resultat',$res);
return $flux;
}
// Afficher liens vers les résultats de l'auteur
function jeux_affiche_gauche($flux){
if ($flux['args']['exec'] == 'auteur') {
$flux['data'].= boite_ouvrir('','info');
$flux['data'].= '<a href="'.generer_url_ecrire('jeux_resultats','id_auteur='.$flux['args']['id_auteur']).'">'._T('jeux:voir_resultats').'</a>';
$flux['data'].= boite_fermer();
}
if ($flux['args']['exec'] == 'infos_perso') {
$flux['data'].= boite_ouvrir('','info');
$flux['data'].= '<a href="'.generer_url_ecrire('jeux_resultats','id_auteur='.$GLOBALS['auteur_session']['id_auteur']).'">'._T('jeux:voir_resultats').'</a>';
$flux['data'].= boite_fermer();
}
return $flux;
}
// Afficher liens vers les résultats de l'auteur
function jeux_affiche_milieu($flux){
if ($flux['args']['exec'] == 'article') {
$flux['data'].= jeux_configuration_jeux_inline($flux['args']['id_article']);
}
return $flux;
}
?>

308
jeux_utils.php

@ -14,46 +14,59 @@ include_spip('jeux_config');
// 4 fonctions pour traiter la valeur du parametre de configuration place apres le separateur [config]
global $jeux_config;
function jeux_config($param, $config=false) {
function jeux_config($param, $config = false) {
global $jeux_config;
$p = ($config===false?$jeux_config:$config);
$param = jeux_verif_param_config($param);
$p = $config === false ? $jeux_config : $config;
$p = isset($p[$param]) ? trim($p[$param]) : "";
if (in_array($p, array('true', 'vrai', 'oui', 'yes', 'on', '1', 'si', 'ja', strtolower(_T('item_oui'))))) return true;
if (in_array($p, array('true', 'vrai', 'oui', 'yes', 'on', '1', 'si', 'ja', strtolower(_T('item_oui'))))) return true;
if (in_array($p, array('false', 'faux', 'non', 'no', 'off', '0', 'nein', strtolower(_T('item_non'))))) return false;
if(strncmp($p,'"',1)===0) $p = str_replace('"', '', $p);
$p = trim($p, '"');
return $p;
}
function jeux_config_tout() {
global $jeux_config;
return $jeux_config;
}
function jeux_config_set($param, $valeur) {
global $jeux_config;
if ($param!='') $jeux_config[$param] = $valeur;
}
function jeux_config_init($texte, $ecrase=false) {
global $jeux_config;
$lignes = preg_split("/[\r\n]+/", $texte);
foreach ($lignes as $ligne) {
if ($regs = jeux_parse_ligne_config($ligne)) {
list($p, $v) = array($regs[1], $regs[2]);
// au moment de la config initiale, preferer les valeurs de CFG
if(!$ecrase && !isset($jeux_config[$p])) {
if(function_exists('lire_config'))
$jeux_config[$p] = lire_config('jeux/cfg_'.$p, NULL);
else $jeux_config[$p] = $v;
$param = jeux_verif_param_config($param);
if ($param != '')
$jeux_config[$param] = trim($valeur);
}
// alimente la globale $jeux_config, tout en preferant les valeurs de la configuration CFG du plugin
// le texte est une liste de config de type : param = valeur
// $ecrase : forcer a ecraser la config eventuellement existante
function jeux_config_init($texte_config, $ecrase = false) {
global $jeux_config;
// configuration CFG
$config_CFG = jeux_configuration_generale(true);
$parametres = jeux_parse_section_config($texte_config);
foreach ($parametres as $p) {
// array($ligne epuree, $param_original, $param, $valeur)
list( , , $p_base, $valeur) = $p;
// au moment de la config initiale, preferer les valeurs de CFG
if (!$ecrase && !isset($jeux_config[$p_base]))
$jeux_config[$p_base] = isset($config_CFG[$p_base]) ? $config_CFG[$p_base] : $valeur;
if ($ecrase || !isset($jeux_config[$p_base]))
$jeux_config[$p_base] = $valeur;
}
if ($ecrase || !isset($jeux_config[$p])) $jeux_config[$p] = $v;
}
}
}
function jeux_config_ecrase($texte) {
jeux_config_init($texte, true);
// ecrase les parametres de la globale $jeux_config;
function jeux_config_ecrase($texte_config) {
jeux_config_init($texte_config, true);
}
// reinitialise la globale $jeux_config;
function jeux_config_reset() {
global $jeux_config;
$jeux_config = false;
$jeux_config = array();
}
// splitte le texte du jeu avec les separateurs concernes
@ -61,65 +74,77 @@ function jeux_config_reset() {
function jeux_split_texte($jeu, &$texte) {
global $jeux_caracteristiques;
jeux_config_reset();
if (function_exists($init = 'jeux_'.$jeu.'_init')) jeux_config_init($init());
$texte = '['._JEUX_TEXTE.']'.trim($texte).' ';
$expr = '/(\['.join('\]|\[', $jeux_caracteristiques['SEPARATEURS'][$jeu]).'\])/';
if (function_exists($init = 'jeux_' .$jeu . '_init'))
jeux_config_init($init());
$texte = '[' . _JEUX_TEXTE . ']' . trim($texte) . ' ';
$expr = '/(\[' . join('\]|\[', $jeux_caracteristiques['SEPARATEURS'][$jeu]) . '\])/';
$tableau = preg_split($expr, $texte, -1, PREG_SPLIT_DELIM_CAPTURE);
// foreach($tableau as $i => $valeur) $tableau[$i] = preg_replace('/^\[(.*)\]$/', '\\1', trim($valeur));
foreach($tableau as $i => $valeur)
if (($i & 1) && preg_match('/^\[(.*)\]$/', trim($valeur), $reg)) {
$tableau[$i] = strtolower(trim($reg[1]));
if ($reg[1] == _JEUX_CONFIG && $i+1 < count($tableau)) jeux_config_ecrase($tableau[$i+1]);
if ($reg[1] == _JEUX_CONFIG && $i+1 < count($tableau))
jeux_config_ecrase($tableau[$i+1]);
}
return $tableau;
}
// transforme un texte en listes html
function jeux_listes($texte) {
$tableau = preg_split("/[\r\n]+/", trim($texte));
$tableau = preg_split('/[\r\n]+/', trim($texte));
foreach ($tableau as $i=>$valeur)
if (($valeur = trim($valeur)) != '') $tableau[$i] = "<li>$valeur</li>\n";
if (($valeur = trim($valeur)) != '')
$tableau[$i] = "<li>$valeur</li>\n";
$texte = implode('', $tableau);
return "<ol>$texte</ol>";
}
// retourne un tableau de mots ou d'expressions a partir d'un texte
function jeux_liste_mots($texte) {
function jeux_liste_mots($texte, $unique = true) {
// corrections typo eventuelles
$texte = str_replace(array('&#8217;','&laquo;&nbsp;','&nbsp;&raquo;','&laquo; ',' &raquo;'), array("'",'"','"','"','"'), echappe_retour($texte));
$texte = str_replace(
array('&#8217;','&laquo;&nbsp;','&nbsp;&raquo;','&laquo; ',' &raquo;','&nbsp;?','&nbsp;!','&nbsp;;'),
array("'",'"','"','"','"','?','!',';'), echappe_retour($texte));
$texte = filtrer_entites(trim($texte));
$split = explode('"', $texte);
$c = count($split);
$split2 = array();
for($i=0; $i<$c; $i++) if (strlen($s = trim($split[$i]))){
for($i=0; $i<$c; $i++) if (strlen($s = trim($split[$i]))) {
if (($i & 1) && ($i != $c-1)) {
// on touche pas au texte entre deux ""
$split2[] = $s;
} else {
// on rassemble tous les separateurs : ,;.\s\t\n
// on rassemble tous les separateurs : ,;\s\t\n
$temp = str_replace(array(' ?', ' !', ' ;'), array('?', '!', ';'), $s);
$temp = preg_replace('/[,;\s\t\n\r]+/'.($GLOBALS['meta']['charset']=='utf-8'?'u':''), '@SEP@', $temp);
$temp = str_replace('+', ' ', $temp);
$split2 = array_merge($split2, explode('@SEP@', $temp));
$temp = array_filter(explode('@SEP@', $temp));
$split2 = array_merge($split2, $temp);
}
}
return array_unique($split2);
return $unique ? array_unique($split2) : $split2;
}
function jeux_majuscules($texte) {
return init_mb_string()?mb_strtoupper($texte,$GLOBALS['meta']['charset']):strtoupper($texte);
}
function jeux_minuscules($texte) {
return init_mb_string()?mb_strtolower($texte,$GLOBALS['meta']['charset']):strtolower($texte);
}
// verifie si le $texte est bien dans la $liste de bonnes reponses
// les expression regulieres sont egalement traitees
function jeux_in_liste($texte, $liste=array()) {
$texte = filtrer_entites($texte);
$texte_m = jeux_minuscules($texte);
foreach($liste as $expr) {
// interpretation des expressions regulieres grace aux virgules : ,un +mot,i
if(strncmp($expr,',',1)===0) {
if(strncmp($expr, ',', 1)===0 && ($pos = strripos($expr, ','))>0) {
if($GLOBALS['meta']['charset']=='utf-8' && strpos($expr, 'u', ++$pos)===false) $expr .= 'u';
if(preg_match($expr, $texte)) return true;
} elseif(strpos($expr, '/M')===($len=strlen($expr)-2)) {
if(substr($expr,0,$len)===$texte) return true;
if(substr($expr, 0, $len)===$texte) return true;
} else {
$expr = jeux_minuscules($expr);
// corriger_typo peut eviter un pb d'apostrophe par exemple
@ -130,6 +155,13 @@ function jeux_in_liste($texte, $liste=array()) {
return false;
}
function jeux_filtre_preg($array) {
foreach($array as $key => $value)
if(strncmp($value, ',', 1)===0 && ($pos = strripos($value, ','))>0)
$array[$key] = substr($value, 1, --$pos);
return $array;
}
// retourne la boite de score et ajoute le resultat en base
function jeux_afficher_score($score, $total, $id_jeu=false, $resultat_long='', $categories='') {
global $scoreMULTIJEUX;
@ -184,7 +216,7 @@ function jeux_bouton_rejouer() { return jeux_bouton('rejouer'); }
function jeux_liste_les_jeux(&$texte) {
global $jeux_caracteristiques;
$liste = array();
foreach($jeux_caracteristiques['SIGNATURES'] as $jeu=>$signatures) {
foreach($jeux_caracteristiques['SIGNATURES'] as $jeu => $signatures) {
$ok = false;
foreach($signatures as $s) $ok |= (strpos($texte, "[$s]")!==false);
if ($ok) $liste[] = $jeu;
@ -193,8 +225,8 @@ function jeux_liste_les_jeux(&$texte) {
}
// decode les jeux si les modules jeux/lejeu.php sont presents
// retourne la liste des jeux trouves et inclut la bibliotheque si $indexJeux existe
function jeux_decode_les_jeux(&$texte, $indexJeux=NULL) {
// retourne la liste unique des jeux trouves et inclut la bibliotheque si $indexJeux existe
function jeux_decode_les_jeux(&$texte, $indexJeux = NULL) {
global $jeux_caracteristiques, $scoreMULTIJEUX;
$liste = array();
foreach($jeux_caracteristiques['SIGNATURES'] as $jeu=>$signatures) {
@ -217,7 +249,7 @@ function jeux_decode_les_jeux(&$texte, $indexJeux=NULL) {
function jeux_trouver_nom($texte) {
global $jeux_caracteristiques;
$liste = jeux_liste_les_jeux($texte);
foreach($liste as $i=>$jeu)
foreach($liste as $i => $jeu)
$liste[$i] = $jeux_caracteristiques['TYPES'][$jeu];
return join(', ', $liste);
}
@ -231,7 +263,8 @@ function jeux_trouver_titre_public($texte) {
$texte = jeux_sans_balise($texte);
$titre_public = false;
// cas particulier des multi-jeux
if($p=strpos($texte,'['._JEUX_MULTI_JEUX.']')) $texte = substr($texte,0,$p);
if($p = strpos($texte,'['._JEUX_MULTI_JEUX.']'))
$texte = substr($texte,0,$p);
// parcourir tous les #SEPARATEURS
$tableau = jeux_split_texte('la_totale', $texte);
foreach($tableau as $i => $valeur) if ($i & 1) {
@ -240,75 +273,161 @@ function jeux_trouver_titre_public($texte) {
return $titre_public;
}
// retourne la configuration interne, si le separateur [config] est present
// si strlen($param)>0 alors la valeur d'un parametre en particulier est renvoyee
// si $param=='' alors un tableau associatif est renvoye
function jeux_trouver_configuration_interne($texte, $param=false) {
// appel de la balise #CONFIG_INTERNE
// si $param est une chaine non vide, alors la valeur d'un parametre en particulier est retournee
// si $param === '' alors un tableau associatif est retourne
// si $param === false alors un texte HTML est retourne
function jeux_trouver_configuration_complete($texte_jeu, $param = false) {
global $jeux_caracteristiques;
if(strpos($texte_jeu, _JEUX_DEBUT)!==false)
return "Balise &lt;JEUX/&gt; trouv&eacute;e => Pas encore trait&eacute; !";
$liste_jeux = jeux_liste_les_jeux($texte_jeu);
if(!count($liste_jeux)) return "Aucun jeu trouv&eacute;, sauf errer ?" . print_r($texte_jeu, 1);
$nb_jeux = count($liste_jeux);
// ici un texte de jeu est fourni
// $nom_jeu = jeux_trouver_nom($texte_jeu);
$config_interne = jeux_trouver_configuration_interne($texte_jeu, false, true);
$config_defaut = jeux_trouver_configuration_defaut($liste_jeux[0], true);
//return print_r($config_defaut, 1);
// verification des parametres de la configuration interne
$config_interne = explode('<br/>', $config_interne);
foreach ($config_interne as &$ligne) {
// array(param, valeur, param original, ligne epuree)
$arr = jeux_parse_ligne_config($ligne);
if($arr[0] && $arr[3] && !isset($config_defaut[$arr[0]]))
$ligne = '/* ' . _T('jeux:erreur_inconnu') . ' : ' . $ligne . ' */';
}
sort($config_interne);
$config_interne = join('<br/>', $config_interne);
$config_defaut = jeux_trouver_configuration_defaut($liste_jeux[0], false);
return '<p><strong>' . _T('jeux:titre_config_defaut')
. ' <small>(' . $jeux_caracteristiques['TYPES'][$liste_jeux[0]] . ')</small> :'
. '</strong></p><p class="jeux_decaler_config">' . $config_defaut . '</p>'
. ($config_interne ? '<p><strong>' . _T('jeux:titre_config_interne')
. ' :</strong></p><p class="jeux_decaler_config">' . $config_interne . '</p>' : '');
}
// retourne la configuration interne d'un texte de jeu, si le separateur [config] est present
// si une option generale de configuration est cochee, elle prendra le dessus (sauf si $ignorer_CFG == true)
// si strlen($param) > 0 alors la valeur d'un parametre en particulier est retournee
// si $param === '' alors un tableau associatif est retourne
// si $param === false alors un texte HTML est retourne
function jeux_trouver_configuration_interne($texte, $param = false, $ignorer_CFG = false) {
$texte = jeux_sans_balise($texte);
$configuration_interne = array();
$affiche_config_interne = array();
$ok_param = false;
$config_CFG = jeux_configuration_generale(true);
// cas particulier des multi-jeux
if($p=strpos($texte,'['._JEUX_MULTI_JEUX.']')) $texte = substr($texte,0,$p);
if($p = strpos($texte,'['._JEUX_MULTI_JEUX.']'))
$texte = substr($texte, 0, $p);
// parcourir tous les #SEPARATEURS
$tableau = jeux_split_texte('la_totale', $texte);
foreach($tableau as $i => $valeur) if ($i & 1) {
if ($valeur==_JEUX_CONFIG) {
$lignes = preg_split(",[\r\n]+,", $tableau[$i+1]);
foreach ($lignes as $ligne) if(strlen($ligne = trim($ligne))) {
$configuration_interne[] = $ligne = preg_replace(',\s*=\s*,', ' = ', $ligne);
if($param!==false) {
list(,$k, $v) = jeux_parse_ligne_config($ligne);
if($param==='') $ok_param[$k] = $v;
elseif($k == $param) $ok_param = $v;
if ($valeur ==_JEUX_CONFIG) {
$parametres = jeux_parse_section_config($tableau[$i+1]);
foreach ($parametres as $p) {
// array($ligne epuree, $param_original, $param, $valeur, $ligne_originale)
list($ligne, $p_user, $p_base, $valeur, $ligneOrig) = $p;
if($p_base !== false) {
// la configuration generale passe avant !
if (!$ignorer_CFG && isset($config_CFG[$p_base]) && $valeur != $config_CFG[$p_base]) {
$valeur = $config_CFG[$p_base];
$ligne = "/* CFG */ $p_user = $valeur";
}
if ($param === '') {
$ok_param[$p_base] = $valeur;
} elseif ($param === false) {
$affiche_config_interne[] = $ligne;
} else {
$param = jeux_verif_param_config($param);
if($p_base == $param) $ok_param = $valeur;
}
} else {
$affiche_config_interne[] = '/* ' . _T('jeux:erreur_syntaxe') . ' : ' . $ligneOrig . ' */';
}
}
}
}
if($param!==false) return $ok_param;
sort($configuration_interne);
return $configuration_interne;
if ($param === false) {
sort($affiche_config_interne);
return join('<br/>', $affiche_config_interne);
}
return $ok_param;
}
// retourne la configuration par defaut d'un jeu
function jeux_trouver_configuration_defaut($jeu) {
if (!function_exists($fonc = 'jeux_'.$jeu))
include_spip('jeux/'.$jeu);
if (function_exists($init = $fonc.'_init'))
return jeux_trouver_configuration_interne('['._JEUX_CONFIG.']'.$init());
// retourne la configuration par defaut d'un type jeu
function jeux_trouver_configuration_defaut($type_jeu, $type_array = false) {
if (!function_exists($fonc = 'jeux_'.$type_jeu))
include_spip('jeux/' . $type_jeu);
if (function_exists($init = $fonc . '_init'))
return jeux_trouver_configuration_interne('['._JEUX_CONFIG.']' . $init(), $type_array ? '' : false);
return false;
}
// retourne la configuration generale du plugin (options par defaut gerees par CFG)
function jeux_configuration_generale($jeu='') {
if(function_exists('lire_config') && is_array($liste_cfg2 = lire_config('jeux'))) {
// retour un array() si $type_array est true
function jeux_configuration_generale($type_array = false) {
$affiche_cfg = array();
if(function_exists('lire_config') && is_array($liste_cfg = lire_config('jeux'))) {
// liste des options disponibles par CFG
$adr = generer_url_ecrire('cfg', 'cfg=jeux');
foreach($liste_cfg2 as $o=>$v) if(preg_match(',^cfg_(.*)$,', $o, $regs)) {
if($v===true || $v==='on') $v = strtolower(_T('item_oui'));
elseif($v===false) $v = strtolower(_T('item_non'));
$options_cfg[$regs[1]] = "[<a href='$adr'>CFG</a>] $regs[1] = $v";
foreach($liste_cfg as $o => $v) {
$o = jeux_verif_param_config(preg_replace(',^cfg_,', '', $o));
if($v === true || $v === 'on')
$v = strtolower(_T('item_oui'));
elseif($v === false || $v === 'off')
$v = strtolower(_T('item_non'));
$affiche_cfg[$o] = $type_array ? $v : "$o = $v";
}
}
if($jeu=='') return $configuration_generale;
// renvoyer la config par defaut du premier jeu decele
$defaut = jeux_trouver_configuration_defaut($jeu);
foreach($defaut as $ligne) {
if ($regs = jeux_parse_ligne_config($ligne)) {
// ajout de l'option si CFG ne l'a pas deja
$configuration_generale[] = isset($options_cfg[$regs[1]])?$options_cfg[$regs[1]]:"$regs[1] = $regs[2]";
if($type_array)
return $affiche_cfg;
if(!$affiche_cfg)
$affiche_cfg = array(_T('jeux:jeu_vide'));
return '[' . _JEUX_CONFIG . "]<br/>" . join("<br/>", $affiche_cfg);
}
// decoder une ligne de config (retrait des comentaires facon PHP et mise en forme du parametre)
// retour : array(param, valeur, param original, ligne epuree)
function jeux_parse_ligne_config($ligne) {
$ligne = preg_replace(',\/\*(.*?)\*\/,', '', $ligne);
$ligne = trim(preg_replace(',\/\/(.*)$,', '', $ligne));
$arr = explode('=', $ligne, 2);
if (count($arr) != 2) return array(false, false, false, strlen($ligne)? '/* ' . $ligne . '*/' : false);
$arr[0] = trim($arr[0]); $arr[1] = trim($arr[1]);
return array(jeux_verif_param_config($arr[0]), $arr[1], $arr[0], $arr[0] . ' = ' . $arr[1]);
}
// decoder une section de config
// retourne le tableau des parametres : array[] = array($ligne epuree, $param_original, $param, $valeur, $ligne_originale)
function jeux_parse_section_config($texte_config) {
$arr_config = array();
$texte_config = preg_split('/[\r\n]+/', $texte_config);
foreach ($texte_config as $ligne) {
// array(param, valeur, param original, ligne epuree)
$arr = jeux_parse_ligne_config($ligne);
if(strlen($arr[3])) {
if ($arr[0])
$arr_config[] = array($arr[3], $arr[2], $arr[0], $arr[1], $ligne);
else
$arr_config[] = array($arr[3], false, false, false, $ligne);
}
}
sort($configuration_generale);
return $configuration_generale;
return $arr_config;
}
// decoder une ligne de config (retrait des comentaires facon PHP)
function jeux_parse_ligne_config($ligne) {
$ligne = preg_replace(',\/\*(.*)\*\/,','', $ligne);
$ligne = trim(preg_replace(',\/\/(.*)$,','', $ligne));
if (!preg_match('/([^=\s]+)\s*=\s*(.+)$/', $ligne, $regs)) return false;
return $regs;
// le parametre de config d'un jeu est insensible a la casse et ne comporte ni espace ni accent
function jeux_verif_param_config($param) {
include_spip('inc/charsets');
return strtolower(translitteration(str_replace(' ', '', $param)));
}
// pour placer des commentaires
function jeux_rem($rem, $index=false, $jeu='', $balise='div') {
return code_echappement("<$balise class='jeux_rem' title='".$rem.($index!==false?'-#'.$index:'').(strlen($jeu)?" `".$jeu."`":'')."'></$balise>");
@ -354,9 +473,12 @@ function jeux_idname($indexJeux, $index=-1, $prefixe='', $index2=-1, $prefixe2='
// renvoie la reponse trimee du formulaire (NULL si n'existe pas)
function jeux_form_reponse($indexJeux, $index=-1, $prefixe='', $index2=-1, $prefixe2='') {
$reponse = _request('reponses'.str_replace('.','_',$indexJeux));
if($index>=0 && is_array($reponse)) $reponse = isset($reponse[$prefixe.$index])?$reponse[$prefixe.$index]:NULL;
if($index2>=0 && is_array($reponse)) $reponse = isset($reponse[$prefixe2.$index2])?$reponse[$prefixe2.$index2]:NULL;
if(is_string($reponse) && strlen($reponse)) $reponse = trim($reponse);
if($index>=0 && is_array($reponse))
$reponse = isset($reponse[$prefixe.$index])?$reponse[$prefixe.$index]:NULL;
if($index2>=0 && is_array($reponse))
$reponse = isset($reponse[$prefixe2.$index2])?$reponse[$prefixe2.$index2]:NULL;
if(is_string($reponse) && strlen($reponse))
$reponse = trim($reponse);
return $reponse;
}
@ -366,14 +488,14 @@ function jeux_form_correction($indexJeux) {
}
// deux fonctions qui encadrent un jeu dans un formulaire
function jeux_form_debut($name, $indexJeux, $class="", $method="post", $action="") {
function jeux_form_debut($name, $indexJeux, $class="", $method="post", $action="", $insert="") {
$id_jeu = intval(jeux_config('id_jeu'));
$cvt = jeux_config('jeu_cvt')?'oui':'non';
$hidden = "<div><input type='hidden' name='id_jeu' value='$id_jeu' />\n"
."<input type='hidden' name='debut_index_jeux' value='$GLOBALS[debut_index_jeux]' />\n"
."<input type='hidden' name='index_jeux' value='$indexJeux' />\n"
."<input type='hidden' name='correction$indexJeux' value='1' /></div>\n";
if(jeux_config('jeu_cvt')) return $hidden;
."<input type='hidden' name='correction$indexJeux' value='1' />$insert</div>\n";
if (jeux_config('jeu_cvt')) return $hidden;
if (strlen($name)) $name=" id='$name$indexJeux'";
if (strlen($class)) $class=" class='$class'";
if (strlen($method)) $method=" method='$method'";

118
lang/jeu_fr.php

@ -1,59 +1,59 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
// Fichier source, a modifier dans https://git.spip.net/spip-contrib-extensions/jeux.git
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// D
'doc_jeux' => 'Documentation générale',
'doc_scores' => 'Documentation sur les scores',
// E
'explication_developpement' => '<b>Attention</b> : partie du plugin en cours de développement. Merci de rapporter les bugs éventuels et/ou de contribuer aux améliorations.',
'explication_jeu_edit' => 'Le titre privé sert simplement à identifier le jeu en partie privée.<br />Le contenu du jeu doit suivre la syntaxe décrite dans <a href=\'https://contrib.spip.net/Des-jeux-dans-vos-articles\'>la documentation</a> du plugin.<br />Ici les balises <jeux> et </jeux> sont inutiles.',
'explication_modules' => 'Voici la liste des modules présents sur ce site.
- Les signatures sont les séparateurs indispensables qui permettent l’identification du jeu par le compilateur.
- Les séparateurs optionnels sont par définition, au choix de l’auteur du jeu.
- La configuration montre ici les paramètres utilisés par défaut, mais que l’on peut modifier dans la section [config].
Veuillez vous reporter à la documentation du plugin pour bien maîtriser les différents séparateurs.',
// I
'icone_creer_jeu' => 'Créer un jeu',
'icone_modifier_jeu' => 'Modifier le jeu',
'info_1_jeu' => 'Un jeu créé',
'info_1_jeu_inline' => 'Un jeu « inline »',
'info_1_resultat' => 'Un résultat',
'info_aucun_jeu' => 'Aucun jeu créé',
'info_aucun_jeu_inline' => 'Aucun jeu « inline »',
'info_aucun_resultat' => 'Aucun résultat',
'info_nb_jeux' => '@nb@ jeux créés',
'info_nb_jeux_inline' => '@nb@ jeux « inline »',
'info_nb_resultats' => '@nb@ résultats',
'info_texte' => 'Texte',
'info_type_resultat' => 'Type de résultat',
// L
'label_date' => 'Date',
'label_detail' => 'Détail : ',
'label_nb_resultats' => 'Nombre de résultats',
'label_nom' => 'Auteur',