--- /dev/null
+<?php\r
+ \r
+/* Trois ou quatre balises pour creer des blocs depliables : \r
+\r
+#BLOC_TITRE / {une_URL} si ajax, {un_numero} si bloc numerote, {visible} si bloc deplie /\r
+Mon titre\r
+#BLOC_RESUME / facultatif /\r
+Mon resume qui disparait si on clique\r
+#BLOC_DEBUT\r
+Mon bloc depliable / qui est aussi l'emplacement pour l'Ajax si le fragment est donne /\r
+#BLOC_FIN\r
+\r
+*/\r
+\r
+@define('_BLOC_TITRE_H', 'h4');\r
+\r
+// Pour la balise suivante, l'ordre des arguments importe peu\r
+// Un bloc replie, titre simple : #BLOC_TITRE\r
+// Un bloc replie AJAX : #BLOC_TITRE{fragment} (fragment est une URLs)\r
+// Un bloc replie numerote : #BLOC_TITRE{numero} (numero est un nombre entier)\r
+// Un bloc deplie ou replie : ajouter l'argument 'visible' ou 'invisible' : #BLOC_TITRE{visible}\r
+// Par defaut : les blocs sont replies\r
+function balise_BLOC_TITRE($p) {\r
+ // Les arguments : 'visible' ou 'invisible', un numero, une URL\r
+ $p->code = "blocs_balises('titre', array(".blocs_arguments($p).'))';\r
+ $p->interdire_scripts = false;\r
+ return $p;\r
+}\r
+\r
+function blocs_arguments(&$p) {\r
+ $i = 0; $args = array();\r
+ while(($a = interprete_argument_balise(++$i,$p)) != NULL) $args[] = $a;\r
+ return join(",", $args);\r
+}\r
+\r
+// 3 balises obsoletes\r
+function balise_BLOC_TITRE_NUM(&$p) {return balise_BLOC_TITRE($p);}\r
+function balise_BLOC_VISIBLE_TITRE_NUM(&$p) {return balise_BLOC_VISIBLE_TITRE($p);}\r
+function balise_BLOC_VISIBLE_TITRE(&$p) {\r
+ // Produire le premier argument {visible}\r
+ $texte = new Texte; $texte->type='texte'; $texte->texte='visible';\r
+ array_unshift($p->param, array(0=>NULL, 1=>array(0=>$texte)));\r
+ return balise_BLOC_TITRE($p);\r
+}\r
+\r
+function balise_BLOC_RESUME($p) {\r
+ $p->code = "blocs_balises('resume')";\r
+ $p->interdire_scripts = false;\r
+ return $p;\r
+}\r
+\r
+function balise_BLOC_DEBUT($p) {\r
+ $p->code = "blocs_balises('debut', array(".blocs_arguments($p).'))';\r
+ $p->interdire_scripts = false;\r
+ return $p;\r
+}\r
+\r
+function balise_BLOC_FIN($p) {\r
+ $p->code = "blocs_balises('fin')";\r
+ $p->interdire_scripts = false;\r
+ return $p;\r
+}\r
+\r
+function balise_BLOC_TITRE_DEBUT($p) {\r
+ $p->code = "blocs_balises('titre_debut', array(".blocs_arguments($p).'))';\r
+ $p->interdire_scripts = false;\r
+ return $p;\r
+}\r
+\r
+function balise_BLOC_TITRE_FIN($p) {\r
+ $p->code = "blocs_balises('titre_fin')";\r
+ $p->interdire_scripts = false;\r
+ return $p;\r
+}\r
+\r
+// Renvoie un code JQuery pour deplier un bloc au chargement de la page.\r
+// Exemple pour deplier le 5eme bloc : #BLOC_DEPLIER{4} (l'index commence a zero)\r
+function balise_BLOC_DEPLIER($p) {\r
+ $eq = interprete_argument_balise(1, $p);\r
+ $p->code = "bloc_deplier_script(intval($eq))";\r
+ $p->interdire_scripts = false;\r
+ return $p;\r
+}\r
+// Renvoie un code JQuery pour deplier un bloc numerote au chargement de la page.\r
+// Exemple pour deplier le bloc .cs_bloc4 : #BLOC_DEPLIER_NUM{4}\r
+function balise_BLOC_DEPLIER_NUM($p) {\r
+ $eq = interprete_argument_balise(1, $p);\r
+ $p->code = "bloc_num_deplier_script(intval($eq))";\r
+ $p->interdire_scripts = false;\r
+ return $p;\r
+}\r
+\r
+// Renvoie un code JQuery pour courcuiter la variable configurant les blocs uniques\r
+// Argument : oui/non ou 0/1\r
+function balise_BLOC_UNIQUE($p) {\r
+ $arg = interprete_argument_balise(1, $p);\r
+ $p->code = "bloc_unique_script($arg)";\r
+ $p->interdire_scripts = false;\r
+ return $p;\r
+}\r
+\r
+// fonction (SPIP>=2.0) pour le calcul de la balise #BLOC_DEPLIER\r
+function bloc_deplier_script($num=0) {\r
+ return $num<0?'':http_script("jQuery(document).ready(function() { jQuery('"._BLOC_TITRE_H.".blocs_titre').eq($num).click(); });");\r
+}\r
+// fonction (SPIP>=2.0) pour le calcul de la balise #BLOC_DEPLIER_NUM\r
+function bloc_num_deplier_script($num=-1) {\r
+ return $num<0?'':http_script("jQuery(document).ready(function() { jQuery('div.cs_bloc$num').children('.blocs_titre').eq(0).click(); });");\r
+}\r
+// fonction (SPIP>=2.0) pour le calcul de la balise #BLOC_UNIQUE\r
+function bloc_unique_script($num=1) {\r
+ $num = ($num==='oui' || intval($num)>0)?1:0;\r
+ return http_script("var blocs_replier_tout = $num;");\r
+}\r
+\r
+// fonction pour le calcul des balises de type #BLOC_XXX\r
+// $args ne sert que pour #BLOC_TITRE et contient les arguments de la balise sous forme de tableau\r
+function blocs_balises($type, $args=array()) {\r
+ // statut binaire : bit1=ajax bit2=titre bit3=resume bit4=debut\r
+ // 2 = ajax (20 si distant) ; 1 = titre pas d'ajax (10 si distant); idem negatif = bloc visible\r
+ static $bloc_stade;\r
+ $k=isset($bloc_stade)?count($bloc_stade):0;\r
+ $stade=$k?abs($bloc_stade[--$k]):0;\r
+ $distant = $replie = 1; $id = $numero = '';\r
+ switch($type) {\r
+ case 'titre_debut':\r
+ // id pour le bloc distant\r
+ $id = ' id="cs_bloc_id_' . array_shift($args) . '"';\r
+ $distant = 10;\r
+ case 'titre':\r
+ foreach($args as $a) { \r
+ if(is_numeric($a=trim($a))) $numero = ' cs_bloc'.$a; \r
+ elseif($a=='visible') $replie = -1;\r
+ elseif($a=='invisible') $replie = 1;\r
+ elseif(strlen($a)) $fragment = $a;\r
+ }\r
+ if (isset($fragment)){\r
+ $ajax=' blocs_ajax ';\r
+ $bloc_stade[]=2*$distant*$replie;\r
+ } else {\r
+ $fragment="javascript:;";\r
+ $ajax='';\r
+ $bloc_stade[]=1*$distant*$replie;\r
+ }\r
+ $replie = $replie>0?' blocs_replie':'';\r
+ return "<div class=\"cs_blocs$numero\"><"._BLOC_TITRE_H." class=\"blocs_titre$replie$ajax\"$id><a href=\"$fragment\">";\r
+ case 'resume':\r
+ $class=$bloc_stade[$k]>0?'':' blocs_invisible blocs_slide';\r
+ if($stade<1 || $stade>2) // on DOIT arriver de titre\r
+ die("Erreur : #BLOC_RESUME sans #BLOC_TITRE ($stade)");\r
+ $bloc_stade[$k]=$bloc_stade[$k]>0?3:-3; // 3 = resume\r
+ return "</a></"._BLOC_TITRE_H."><div class=\"blocs_resume$class\">";\r
+ case 'debut':\r
+ if(count($args)) {\r
+ // debut d'un bloc depliable a distance\r
+ foreach($args as $a) { \r
+ if($a=='visible') $replie = -1;\r
+ elseif($a=='invisible') $replie = 1;\r
+ elseif(strlen($a)) $id = " cs_bloc_id_$a";\r
+ }\r
+ $bloc_stade[]=11;\r
+ $class = $replie>0?' blocs_invisible blocs_slide':'';\r
+ return "<div class=\"blocs_destination$class$id\">";\r
+ }\r
+ $class=$bloc_stade[$k]<0?'':' blocs_invisible blocs_slide';\r
+ $bloc_stade[$k]=$bloc_stade[$k]>0?4:-4; // 4=debut\r
+ if($stade == 3) // on arrive du resume, fermer la div resume seulement\r
+ return "</div><div class=\"blocs_destination$class\">";\r
+ else {\r
+ if($stade<1 || $stade>2) // on DOIT arriver de titre\r
+ die("Erreur : #BLOC_DEBUT sans #BLOC_TITRE ($stade)");\r
+ return '</a></'._BLOC_TITRE_H."><div class=\"blocs_destination$class\">";\r
+ }\r
+ case 'titre_fin':\r
+ $k=isset($bloc_stade)?abs(array_pop($bloc_stade)):0;\r
+ if($k==10 || $k==20) // on DOIT arriver de #BLOC_TITRE_DEBUT\r
+ return '</a></'._BLOC_TITRE_H.'></div>';\r
+ die("Erreur : #BLOC_TITRE_FIN sans #BLOC_TITRE_DEBUT ($k)");\r
+ case 'fin':\r
+ $k=isset($bloc_stade)?abs(array_pop($bloc_stade)):0;\r
+ switch($k) {\r
+ case 4:return "</div></div>";\r
+ case 11:return "</div>";\r
+ default:die("Erreur : #BLOC_FIN sans #BLOC_DEBUT ($k)");\r
+ }\r
+\r
+ }\r
+}\r
+\r
+?>
\ No newline at end of file