You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
9.1 KiB
239 lines
9.1 KiB
<?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|[" |
|
. implode("]<br />[", $jeux_caracteristiques['SIGNATURES'][$j]) . ']|[' |
|
. implode("]<br />[", 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; |
|
} |
|
} |
|
|
|
?>
|
|
|