You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
jeux/jeux_fonctions.php

240 lines
9.1 KiB
PHP

<?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('base/jeux_tables');
include_spip('jeux_utils');
// tableau de parametres exploitables par les plugins
global $jeux_config;
// filtre retournant un lien cliquable si $nb!=0, sinon un simple tiret
function jeux_lien_jeu($nb='0', $exec='', $id_jeu=0) {
$lien = generer_url_ecrire($exec,'id_jeu='.$id_jeu);
return $nb=='0'?'-':"<a href='$lien'>$nb</a>";
}
// filtre qui evite d'afficher le resultat obtenu par certains plugins
// grace aux espions : <div title='PLUGIN-DEBUT'></div> et <div title='PLUGIN-FIN'></div>
// ou : <div title='PLUGIN-DEBUT-#xxxx'></div> et <div title='PLUGIN-FIN-#xxxx'></div>
// ou xxxx est le numero d'identification du plugin.
if (!function_exists("pas_de_plugin")) {
function pas_de_plugin($texte){
$texte = preg_replace(",<div[^<]+['\"]JEUX-HEAD-#[0-9]+[^>]+></div>,", '', $texte);
return preg_replace(",<div[^<]+['\"]PLUGIN-DEBUT(-#[0-9]*)?.*<[^<]+['\"]PLUGIN-FIN\\1?[^>]+></div>,UmsS", '', $texte);
}
}
// filtre qui retire le code source des jeux du texte original
function pas_de_balise_jeux($texte) {
if(strpos($texte, _JEUX_DEBUT)===false) return $texte;
return preg_replace(','.preg_quote(_JEUX_DEBUT).'.*?'.preg_quote(_JEUX_FIN).',UimsS', '', $texte);
}
// aide le Couteau Suisse a calculer la balise #INTRODUCTION
$GLOBALS['cs_introduire'][] = 'pas_de_balise_jeux';
// ajoute l'id_jeu du jeu a sa config interne et traite le jeu grace a propre()
// ce filtre doit agir sur #TEXTE* sans balises <jeux/>
// dans le cas d'un formulaire CVT, il faut egalement $jeuCVT='oui' et $indexJeux
function traite_contenu_jeu($texte, $id_jeu, $jeuCVT='non', $indexJeux=0) {
return propre(str_replace(_JEUX_FIN, "[config]jeu_cvt=$jeuCVT\nindex_jeux=$indexJeux\nid_jeu=$id_jeu"._JEUX_FIN, $texte));
}
// complete la config d'un jeu brut non encore decode
function ajoute_config_jeu($texte, $config=array()) {
// separateurs inutiles ici, le texte est celui d'un seul jeu
$texte = str_replace(array(_JEUX_DEBUT, _JEUX_FIN), '', $texte);
if(!is_array($config)) return $texte . "\n["._JEUX_CONFIG.']' . $config;
array_walk($config, function(&$v, $k) { $v = trim($k) . '=' . trim($v); });
return $texte . '['._JEUX_CONFIG.']' . implode("\n", $config);
}
// fonction de traitement appelant directement une fonction de pipeline
function jeux_traitement_pre_propre($texte, $texte_brut=false) {
include_spip('jeux_pipelines');
return jeux_pre_propre($texte, $texte_brut);
}
// renvoie le titre public du jeu que l'on peut trouver grace au separateur [titre]
function titre_jeu($texte) {
include_spip('jeux_utils');
return jeux_trouver_titre_public($texte);
}
// renvoie le type du jeu
function type_jeu($texte) {
include_spip('jeux_utils');
return jeux_trouver_nom($texte);
}
// retourne un tableau id_jeu des modeles <jeuXX> trouves dans un texte brut
function modeles_jeu($texte) {
$texte = echappe_html($texte, '', true); // protection des balises <html/>, <code/>, etc.
if(preg_match_all(',<jeu\s*(\d+)>,i', $texte, $regs)) return $regs[1];
return array();
}
/* Quelques balises "raccourcis" */
// extraction du titre public (table 'jeux' seulement)
// #TITRE_PUBLIC equivalent a : #CONTENU*|titre_jeu
function balise_TITRE_PUBLIC_dist($p) {
if($p->id_boucle) {
$id = $p->boucles[$p->id_boucle]->id_table;
if($id == 'jeux') {
$contenu = champ_sql('contenu', $p);
$p->code = "titre_jeu($contenu)";
return $p;
}
$p->code = champ_sql('titre_public', $p);
return $p;
}
// verifier s'il existe deja un champ titre_public dans la table utilisee
$original = champ_sql('titre_public', $p);
$contenu = champ_sql('contenu', $p);
$p->code = "(strlen($original)?$original:titre_jeu($contenu))";
return $p;
}
// interpretation du texte d'un jeu present en base apres avoir complete sa config interne
// utilisation : #TEXTE_JEU{key1, value1, key2, value2,...}
// qui creera avant l'interpretation du jeu une nouvelle section [config]key1=value1, key2=value2, etc.
// parametre necessaire aux jeux en base : id_jeu
// parametre necessaires aux jeux affiches en CVT : jeu_cvt='oui' et index_jeux
function balise_TEXTE_JEU_dist($p) {
$id_jeu = champ_sql('id_jeu', $p);
$texte = champ_sql('texte', $p);
$args = ''; $n = 1;
while($k = interprete_argument_balise($n++, $p))
if($v = interprete_argument_balise($n++, $p)) $args .= " . \"\\n\" . $k . '=' . $v";
// ajout des parametres trouves en argument a la config interne du jeu
// puis lancement du decodage du jeu, c'est mieux de le faire au plus tot.
$p->code = "jeux_traitement_pre_propre(ajoute_config_jeu($texte, 'id_jeu = ' . intval($id_jeu)$args), true)";
// le traitement de la balise #TEXTE_JEU fera le reste.
return $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_complete($texte" . ($param ? ", $param" : '') . ')';
return $p;
}
// traduction longue du type de resultat
function balise_TYPE_RESULTAT_LONG_dist($p) {
$type = champ_sql('type_resultat', $p);
$p->code = "_T('jeux:resultat2_'.$type)";
return $p;
}
// traduction courte du type de resultat
function balise_TYPE_RESULTAT_COURT_dist($p) {
$type = champ_sql('type_resultat', $p);
$p->code = "_T('jeux:resultat_'.$type)";
return $p;
}
function balise_NETTOYER_URI_dist($p) {
$p->code = 'nettoyer_uri()';
$p->interdire_scripts = false;
return $p;
}
function table_jeux_caracteristiques() {
global $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()) : '';
$config = jeux_trouver_configuration_defaut($j);
$res .= "\n|$t|&#91;"
. implode("]<br />&#91;", $jeux_caracteristiques['SIGNATURES'][$j]) . ']|['
. implode("]<br />&#91;", array_diff($jeux_caracteristiques['SEPARATEURS'][$j], $jeux_caracteristiques['SIGNATURES'][$j])) . ']|'
. preg_replace(array(',//.*,', ',[\n\r]+,'), array('', '<br />'), $config) . '|';
}
return propre($res);
}
/**
* Construit un lien horizontal
*
* @example
* <:jeux:chaine|jeux_icone_horizontale{#URL_ECRIRE{xx},#CHEMIN_IMAGE{jeu-16.png}}:>
*
* @param string $texte Le texte du lien
* @param string $lien L'url du lien
* @param string $image Le chemin vers l'image (16px) à afficher
* @return string Code HTML du lien
**/
function jeux_icone_horizontale($texte, $lien, $image){
return icone_base($lien, $texte, $image, "", "horizontale", "");
}
/*
filtre interpretant le resultat long d'un jeu multiple
exemples d'utilisation :
[(#RESULTAT_LONG|resultat_intermediaire{nb})]
[(#RESULTAT_LONG|resultat_intermediaire{score,1})]
$index doit commencer a 1
valeurs reconnues pour $code :
score => renvoie le score intermediaire
total => renvoie le total intermediaire
detail => renvoie le resultat long intermediaire
nb => renvoie le nombre de sous-jeux
*/
function filtre_resultat_intermediaire($texte, $code='score', $index=0) {
include_spip('jeux/multi_jeux');
$nb = count($t = explode(_SEP_BASE_MULTI_JEUX, $texte));
if($nb<2) return '';
if($code=='nb') return $nb-1;
if($index<1 || $index>$nb) return 'ERR';
switch($code) {
case 'score': case 'total':
$t = array_pop($t);
$t = explode('/', $t, 2);
$t = explode(',', $t[$code=='score'?0:1]);
return trim($t[$index-1]);
case 'detail': return $t[$index-1];
}
}
// 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;
}
}
?>