[SPIP] +2.1.12
[velocampus/web/www.git] / www / plugins / auto / noiZetier / inc / noizetier.php
diff --git a/www/plugins/auto/noiZetier/inc/noizetier.php b/www/plugins/auto/noiZetier/inc/noizetier.php
new file mode 100644 (file)
index 0000000..98be4bb
--- /dev/null
@@ -0,0 +1,762 @@
+<?php\r
+\r
+// Sécurité\r
+if (!defined("_ECRIRE_INC_VERSION")) return;\r
+\r
+define('_CACHE_AJAX_NOISETTES', 'noisettes_ajax.php');\r
+define('_CACHE_CONTEXTE_NOISETTES', 'noisettes_contextes.php');\r
+define('_CACHE_DESCRIPTIONS_NOISETTES', 'noisettes_descriptions.php');\r
+define('_CACHE_INCLUSIONS_NOISETTES', 'noisettes_inclusions.php');\r
+\r
+// Pour compatibilité avec PHP4\r
+\r
+if (!function_exists('array_intersect_key'))\r
+{\r
+       function array_intersect_key($isec, $keys)\r
+       {\r
+               $argc = func_num_args();\r
+               if ($argc > 2)\r
+               {\r
+                       for ($i = 1; !empty($isec) && $i < $argc; $i++)\r
+                       {\r
+                               $arr = func_get_arg($i);\r
+                               foreach (array_keys($isec) as $key)\r
+                               {\r
+                                       if (!isset($arr[$key]))\r
+                                       {\r
+                                               unset($isec[$key]);\r
+                                       }\r
+                               }\r
+                       }\r
+                       return $isec;\r
+               }\r
+               else\r
+               {\r
+                       $res = array();\r
+                       foreach (array_keys($isec) as $key)\r
+                       {\r
+                               if (isset($keys[$key]))\r
+                               {\r
+                                       $res[$key] = $isec[$key];\r
+                               }\r
+                       }\r
+                       return $res;\r
+               }\r
+       }\r
+}\r
+\r
+/**\r
+ * Lister les noisettes disponibles dans les dossiers noisettes/\r
+ *\r
+ * @staticvar array $liste_noisettes\r
+ * @param text $type\r
+ * @return array\r
+ */\r
+function noizetier_lister_noisettes($type='tout'){\r
+       static $liste_noisettes = array();\r
+       if ($type == 'tout') {\r
+               return noizetier_obtenir_infos_noisettes();\r
+       }\r
+       if (isset($liste_noisettes[$type])) {\r
+               return $liste_noisettes[$type];\r
+       }\r
+       \r
+       $noisettes = noizetier_obtenir_infos_noisettes();\r
+       if ($type == '') {\r
+               $match = "^[^-]*$";\r
+       } else {\r
+               $match = $type."-[^-]*$";\r
+       }\r
+       \r
+       foreach($noisettes as $noisette => $description) {\r
+               if (preg_match("/$match/", $noisette)) {\r
+                       $liste_noisettes[$type][$noisette] = $description;\r
+               }\r
+       }\r
+       \r
+       return $liste_noisettes[$type];\r
+}\r
+\r
+\r
+\r
+/**\r
+ * Obtenir les infos de toutes les noisettes disponibles dans les dossiers noisettes/\r
+ * On utilise un cache php pour alleger le calcul.\r
+ *\r
+ * @param \r
+ * @return \r
+**/\r
+function noizetier_obtenir_infos_noisettes() {\r
+       static $noisettes = false;\r
+       \r
+       // seulement 1 fois par appel, on lit ou calcule tous les contextes\r
+       if ($noisettes === false) {\r
+               // lire le cache des descriptions sauvées\r
+               lire_fichier_securise(_DIR_CACHE . _CACHE_DESCRIPTIONS_NOISETTES, $noisettes);\r
+               $noisettes = @unserialize($noisettes);\r
+               // s'il en mode recalcul, on recalcule toutes les descriptions des noisettes trouvees.\r
+               // ou si le cache est désactivé\r
+               if (!$noisettes or (_request('var_mode') == 'recalcul') or (defined('_NO_CACHE') and _NO_CACHE!=0)) {\r
+                       $noisettes = noizetier_obtenir_infos_noisettes_direct();\r
+                       ecrire_fichier_securise(_DIR_CACHE . _CACHE_DESCRIPTIONS_NOISETTES, serialize($noisettes));\r
+               }\r
+       }\r
+       \r
+       return $noisettes;\r
+}\r
+\r
+\r
+/**\r
+ * Obtenir les infos de toutes les noisettes disponibles dans les dossiers noisettes/\r
+ * C'est un GROS calcul lorsqu'il est a faire.\r
+ *\r
+ * @return array\r
+ */\r
+function noizetier_obtenir_infos_noisettes_direct(){\r
+\r
+       $liste_noisettes = array();\r
+               \r
+       $match = "[^-]*[.]html$";\r
+       $liste = find_all_in_path('noisettes/', $match);\r
+               \r
+       if (count($liste)){\r
+               foreach($liste as $squelette=>$chemin) {\r
+                       $noisette = preg_replace(',[.]html$,i', '', $squelette);\r
+                       $dossier = str_replace($squelette, '', $chemin);\r
+                       // On ne garde que les squelettes ayant un fichier YAML de config\r
+                       if (file_exists("$dossier$noisette.yaml")\r
+                               AND ($infos_noisette = noizetier_charger_infos_noisette_yaml($dossier.$noisette))\r
+                       ){\r
+                               $liste_noisettes[$noisette] = $infos_noisette;\r
+                       }\r
+               }\r
+       }\r
+       \r
+       // supprimer de la liste les noisettes necissant un plugin qui n'est pas actif\r
+       foreach ($liste_noisettes as $noisette => $infos_noisette)\r
+               if (isset($infos_noisette['necessite']))\r
+                       foreach ($infos_noisette['necessite'] as $plugin)\r
+                               if (!defined('_DIR_PLUGIN_'.strtoupper($plugin)))\r
+                                       unset($liste_noisettes[$noisette]);\r
+       \r
+       return $liste_noisettes;\r
+}\r
+\r
+\r
+/**\r
+ * Charger les informations contenues dans le YAML d'une noisette\r
+ *\r
+ * @param string $noisette\r
+ * @param string $info\r
+ * @return array\r
+ */\r
+function noizetier_charger_infos_noisette_yaml($noisette, $info=""){\r
+               // on peut appeler avec le nom du squelette\r
+               $fichier = preg_replace(',[.]html$,i','',$noisette).".yaml";\r
+               include_spip('inc/yaml');\r
+               include_spip('inc/texte');\r
+               $infos_noisette = array();\r
+               if ($infos_noisette = yaml_charger_inclusions(yaml_decode_file($fichier))) {\r
+                       if (isset($infos_noisette['nom']))\r
+                               $infos_noisette['nom'] = _T_ou_typo($infos_noisette['nom']);\r
+                       if (isset($infos_noisette['description']))\r
+                               $infos_noisette['description'] = _T_ou_typo($infos_noisette['description']);\r
+                       if (isset($infos_noisette['icon']))\r
+                               $infos_noisette['icon'] = $infos_noisette['icon'];\r
+                               \r
+                       if (!isset($infos_noisette['parametres']))\r
+                               $infos_noisette['parametres'] = array();\r
+                               \r
+                       // contexte\r
+                       if (!isset($infos_noisette['contexte'])) {\r
+                               $infos_noisette['contexte'] = array();\r
+                       }\r
+                       if (is_string($infos_noisette['contexte'])) {\r
+                               $infos_noisette['contexte'] = array($infos_noisette['contexte']);\r
+                       }\r
+                       \r
+                       // ajax\r
+                       if (!isset($infos_noisette['ajax'])) {\r
+                               $infos_noisette['ajax'] = 'oui';\r
+                       }\r
+                       // inclusion\r
+                       if (!isset($infos_noisette['inclusion'])) {\r
+                               $infos_noisette['inclusion'] = 'statique';\r
+                       }\r
+               }\r
+\r
+               if (!$info)\r
+                       return $infos_noisette;\r
+               else \r
+                       return isset($infos_noisette[$info]) ? $infos_noisette[$info] : "";\r
+}\r
+\r
+/**\r
+ * Charger les informations des paramètres d'une noisette\r
+ *\r
+ * @param string $noisette\r
+ * @staticvar array $params_noisettes\r
+ * @return array\r
+ */\r
+function noizetier_charger_parametres_noisette($noisette){\r
+       static $params_noisettes = null;\r
+\r
+       if (is_null($params_noisettes[$noisette])){\r
+               $noisettes = noizetier_lister_noisettes();\r
+               $infos = $noisettes[$noisette];\r
+               $params_noisettes[$noisette] = extrait_parametres_noisette($infos['parametres']);\r
+       }\r
+       return $params_noisettes[$noisette];\r
+}\r
+\r
+/**\r
+ * Charger les informations des contexte pour une noisette\r
+ *\r
+ * @param string $noisette\r
+ * @staticvar array $params_noisettes\r
+ * @return array\r
+ */\r
+function noizetier_charger_contexte_noisette($noisette){\r
+       static $contexte_noisettes = null;\r
+\r
+       if (is_null($contexte_noisettes[$noisette])){\r
+               $noisettes = noizetier_lister_noisettes();\r
+               $contexte_noisettes[$noisette] = $noisettes[$noisette]['contexte'];\r
+       }\r
+       return $contexte_noisettes[$noisette];\r
+}\r
+\r
+\r
+/**\r
+ * Transforme un tableau au format du plugin saisies en un tableau de parametres dont les clés sont les noms des paramètres\r
+ * S'il y a de fieldset, les paramètres sont extraits de son entrée saisies\r
+ *\r
+ * @param string $parametres\r
+ * @return array\r
+ */\r
+function extrait_parametres_noisette($parametres){\r
+       $res = array();\r
+       if (is_array($parametres) && count($parametres)>0) {\r
+               foreach($parametres as $parametre) {\r
+                       if ($parametre['saisie']!='fieldset') {\r
+                               $nom = $parametre['options']['nom'];\r
+                               $res[$nom] = $parametre['options'];\r
+                               $res[$nom]['saisie'] = $parametre['saisie'];\r
+                               if(isset($parametre['verifier']))\r
+                                       $res[$nom]['verifier']=$parametre['verifier'];\r
+                               if(isset($res[$nom]['label']))\r
+                                       $res[$nom]['label'] = _T_ou_typo($res[$nom]['label']);\r
+                               if(isset($res[$nom]['datas']))\r
+                                       foreach($res[$nom]['datas'] as $cle => $valeur)\r
+                                               $res[$nom]['datas'][$cle] = _T_ou_typo($res[$nom]['datas'][$cle]);\r
+                       }\r
+                       else {\r
+                               $res = array_merge($res,extrait_parametres_noisette($parametre['saisies']));\r
+                       }\r
+               }\r
+       }\r
+       return $res;\r
+}\r
+\r
+/**\r
+ * Lister les pages pouvant recevoir des noisettes\r
+ * Par défaut, cette liste est basée sur le contenu du répertoire contenu/\r
+ * Le tableau de résultats peut-être modifié via le pipeline noizetier_lister_pages.\r
+ *\r
+ * @staticvar array $liste_pages\r
+ * @return array\r
+ */\r
+function noizetier_lister_pages(){\r
+       static $liste_pages = null;\r
+\r
+       if (is_null($liste_pages)){\r
+               $liste_pages = array();\r
+               $match = ".+[.]html$";\r
+\r
+               // lister les fonds disponibles dans le répertoire contenu\r
+               $rep = defined('_NOIZETIER_REPERTOIRE_PAGES')?_NOIZETIER_REPERTOIRE_PAGES:'contenu/';\r
+               $liste = find_all_in_path($rep, $match);\r
+               if (count($liste)){\r
+                       foreach($liste as $squelette=>$chemin) {\r
+                               $page = preg_replace(',[.]html$,i', '', $squelette);\r
+                               $dossier = str_replace($squelette, '', $chemin);\r
+                               // Les éléments situés dans prive/contenu sont écartés\r
+                               if (substr($dossier,-14)!='prive/contenu/')\r
+                                       if(count($infos_page = noizetier_charger_infos_page($dossier,$page))>0)\r
+                                               $liste_pages[$page] = $infos_page;\r
+                       }\r
+               }\r
+               \r
+               // Dans le cas de Zpip, il faut supprimer la page 'page.html' et la page 'z_apl.html'\r
+               if (defined('_DIR_PLUGIN_Z')) {\r
+                       unset($liste_pages['page']);\r
+                       unset($liste_pages['z_apl']);\r
+               }\r
+               \r
+               // supprimer de la liste les pages necissant un plugin qui n'est pas actif\r
+               foreach ($liste_pages as $page => $infos_page)\r
+                       if (isset($infos_page['necessite']))\r
+                               foreach ($infos_page['necessite'] as $plugin)\r
+                                       if (!defined('_DIR_PLUGIN_'.strtoupper($plugin)))\r
+                                               unset($liste_pages[$page]);\r
+               \r
+               $liste_pages = pipeline('noizetier_lister_pages',$liste_pages);\r
+               \r
+               // On ajoute les compositions du noizetier\r
+               if(defined('_DIR_PLUGIN_COMPOSITIONS')){\r
+                       $noizetier_compositions = unserialize($GLOBALS['meta']['noizetier_compositions']);\r
+                       // On doit transformer le tableau de [type][compo] en [type-compo]\r
+                       $liste_compos = array();\r
+                       if (is_array($noizetier_compositions)) {\r
+                               foreach($noizetier_compositions as $type => $compos_type)\r
+                                       foreach($compos_type as $compo => $infos_compo) {\r
+                                               $infos_compo['nom'] = typo($infos_compo['nom']);\r
+                                               $infos_compo['description'] = propre($infos_compo['description']);\r
+                                               $infos_compo['icon'] = $infos_compo['icon']!='' ? $infos_compo['icon'] : '';\r
+                                               if (isset($liste_pages[$type]))\r
+                                                       $infos_compo['blocs'] = $liste_pages[$type]['blocs'];\r
+                                               else\r
+                                                       $infos_compo['blocs'] = noizetier_blocs_defaut();\r
+                                               $liste_compos[$type.'-'.$compo] = $infos_compo;\r
+                                               }\r
+                       }\r
+                       $liste_pages = array_merge($liste_pages,$liste_compos);\r
+               }\r
+       }\r
+       return $liste_pages;\r
+}\r
+\r
+/**\r
+ * Charger les informations d'une page, contenues dans un xml de config s'il existe\r
+ *\r
+ * @param string $dossier\r
+ * @param string $page\r
+ * @param string $info\r
+ * @return array\r
+ */\r
+function noizetier_charger_infos_page($dossier,$page, $info=""){\r
+               // on peut appeler avec le nom du squelette\r
+               $page = preg_replace(',[.]html$,i','',$page);\r
+               \r
+               // On autorise le fait que le fichier xml ne soit pas dans le même plugin que le fichier .html\r
+               // Au cas où le fichier .html soit surchargé sans que le fichier .xml ne le soit\r
+               $rep = defined('_NOIZETIER_REPERTOIRE_PAGES')?_NOIZETIER_REPERTOIRE_PAGES:'contenu/';\r
+               $fichier = find_in_path("$rep$page.xml");\r
+               \r
+               include_spip('inc/xml');\r
+               include_spip('inc/texte');\r
+               $infos_page = array();\r
+               // S'il existe un fichier xml de configuration (s'il s'agit d'une composition on utilise l'info de la composition)\r
+               if (file_exists($fichier) AND $xml = spip_xml_load($fichier, false) AND count($xml['page']))\r
+                       $xml = reset($xml['page']);\r
+               elseif (file_exists($fichier) AND $xml = spip_xml_load($fichier, false) AND count($xml['composition']))\r
+                       $xml = reset($xml['composition']);\r
+               else\r
+                       $xml = '';\r
+               if ($xml != '') {\r
+                       $infos_page['nom'] = _T_ou_typo(spip_xml_aplatit($xml['nom']));\r
+                       $infos_page['description'] = isset($xml['description']) ? _T_ou_typo(spip_xml_aplatit($xml['description'])) : '';\r
+                       $infos_page['icon'] = isset($xml['icon']) ? reset($xml['icon']) : '';\r
+                       // Décomposition des blocs\r
+                       if (spip_xml_match_nodes(',^bloc,', $xml, $blocs)){\r
+                               $infos_page['blocs'] = array();\r
+                               foreach (array_keys($blocs) as $bloc){\r
+                                       list($balise, $attributs) = spip_xml_decompose_tag($bloc);\r
+                                       $infos_page['blocs'][$attributs['id']] = array(\r
+                                               'nom' => $attributs['nom'] ? _T($attributs['nom']) : $attributs['id'],\r
+                                               'icon' => isset($attributs['icon']) ? $attributs['icon'] : '',\r
+                                               'description' => _T($attributs['description'])\r
+                                       );\r
+                               }\r
+                       }\r
+                       if (spip_xml_match_nodes(',^necessite,', $xml, $necessites)){\r
+                               $infos_page['necessite'] = array();\r
+                               foreach (array_keys($necessites) as $necessite){\r
+                                       list($balise, $attributs) = spip_xml_decompose_tag($necessite);\r
+                                       $infos_page['necessite'][] = $attributs['id'];\r
+                               }\r
+                       }\r
+               }\r
+               // S'il n'y a pas de fichier XML de configuration\r
+               elseif (defined('_NOIZETIER_LISTER_PAGES_SANS_XML')?_NOIZETIER_LISTER_PAGES_SANS_XML:true) {\r
+                       $infos_page['nom'] = $page;\r
+                       $infos_page['icon'] = 'img/ic_page.png';\r
+               }\r
+               \r
+               // Si les blocs n'ont pas été définis, on applique les blocs par défaut\r
+               if (count($infos_page)>0 AND !isset($infos_page['blocs']))\r
+                       $infos_page['blocs'] = noizetier_blocs_defaut();\r
+               \r
+               // On renvoie les infos\r
+               if (!$info)\r
+                       return $infos_page;\r
+               else \r
+                       return isset($infos_page[$info]) ? $infos_page[$info] : "";\r
+}\r
+\r
+/**\r
+ * Charger les informations d'une page, contenues dans un xml de config s'il existe\r
+ * La liste des blocs par défaut d'une page peut être modifiée via le pipeline noizetier_blocs_defaut.\r
+ *\r
+ * @staticvar array $blocs_defaut\r
+ * @return array\r
+ */\r
+function noizetier_blocs_defaut(){\r
+       static $blocs_defaut = null;\r
+\r
+       if (is_null($blocs_defaut)){\r
+       $blocs_defaut = array (\r
+               'contenu' => array(\r
+                       'nom' => _T('noizetier:nom_bloc_contenu'),\r
+                       'description' => _T('noizetier:description_bloc_contenu'),\r
+                       'icon' => 'img/ic_bloc_contenu.png'\r
+                       ),\r
+               'navigation' => array(\r
+                       'nom' => _T('noizetier:nom_bloc_navigation'),\r
+                       'description' => _T('noizetier:description_bloc_navigation'),\r
+                       'icon' => 'img/ic_bloc_navigation.png'\r
+                       ),\r
+               'extra' => array(\r
+                       'nom' => _T('noizetier:nom_bloc_extra'),\r
+                       'description' => _T('noizetier:description_bloc_extra'),\r
+                       'icon' => 'img/ic_bloc_extra.png'\r
+                       ),\r
+       );\r
+       $blocs_defaut = pipeline('noizetier_blocs_defaut',$blocs_defaut);\r
+       }\r
+       return $blocs_defaut;\r
+}\r
+\r
+/**\r
+ * Supprime de spip_noisettes les noisettes liées à une page\r
+ *\r
+ * @param text $page\r
+ * \r
+ */\r
+function supprimer_noisettes_page_noizetier($page) {\r
+       $type_compo = explode ('-',$page,2);\r
+       $type = $type_compo[0];\r
+       $composition = $type_compo[1];\r
+       \r
+       sql_delete('spip_noisettes','type='.sql_quote($type).'and composition='.sql_quote($composition));\r
+\r
+       // On invalide le cache\r
+       include_spip('inc/invalideur');\r
+       suivre_invalideur($page);\r
+}\r
+\r
+/**\r
+ * Renvoie le type d'une page\r
+ *\r
+ * @param text $page\r
+ * @return text\r
+ */\r
+function noizetier_page_type($page) {\r
+       $type_compo = explode ('-',$page,2);\r
+       return $type_compo[0];\r
+}\r
+\r
+/**\r
+ * Renvoie la composition d'une page\r
+ *\r
+ * @param text $page\r
+ * @return text\r
+ */\r
+function noizetier_page_composition($page) {\r
+       $type_compo = explode ('-',$page,2);\r
+       return $type_compo[1];\r
+}\r
+\r
+/**\r
+ * Liste les blocs pour lesquels il y a des noisettes à insérer.\r
+ *\r
+ * @staticvar array $liste_blocs\r
+ * @return array\r
+ */\r
+function noizetier_lister_blocs_avec_noisettes(){\r
+       static $liste_blocs = null;\r
+       \r
+       if (is_null($liste_blocs)){\r
+               $liste_blocs = array();\r
+               include_spip('base/abstract_sql');\r
+               $resultats = sql_allfetsel (\r
+                       array('bloc', 'type', 'composition'),\r
+                       'spip_noisettes',\r
+                       '1',\r
+                       array('bloc', 'type', 'composition')\r
+               );\r
+               foreach ($resultats as $res) {\r
+                       if ($res['composition'])\r
+                               $liste_blocs[] = $res['bloc'].'/'.$res['type'].'-'.$res['composition'];\r
+                       else\r
+                               $liste_blocs[] = $res['bloc'].'/'.$res['type'];\r
+               }\r
+       }\r
+       return $liste_blocs;\r
+}\r
+\r
+/**\r
+ * Liste d'icônes obtenues en fouillant les répertoires img/ images/ image/ et /img-pack.\r
+ *\r
+ * @staticvar array $liste_icones\r
+ * @return array\r
+ */\r
+function noizetier_lister_icones(){\r
+       static $liste_icones = null;\r
+       \r
+       if (is_null($liste_icones)){\r
+               $match = ".+[.](jpg|jpeg|png|gif)$";\r
+               $liste_icones = array(\r
+                       'img' => find_all_in_path('img/', $match),\r
+                       'img-pack' => find_all_in_path('img-pack/', $match),\r
+                       'image' => find_all_in_path('image/', $match),\r
+                       'images' => find_all_in_path('images/', $match)\r
+               );\r
+       }\r
+       \r
+       return $liste_icones;\r
+}\r
+\r
+\r
+/**\r
+ * Retourne les elements du contexte uniquement\r
+ * utiles a la noisette demande.\r
+ *\r
+ * @param \r
+ * @return \r
+**/\r
+function noizetier_choisir_contexte($noisette, $contexte_entrant, $id_noisette) {\r
+       $contexte_noisette = array_flip(noizetier_obtenir_contexte($noisette));\r
+\r
+       // On transmet toujours l'id_noisette et les variables se terminant par _$id_noisette (utilisées par exemple par Aveline pour la pagination)\r
+       $contexte_min = array('id_noisette' => $id_noisette);\r
+       \r
+       if (isset($contexte_noisette['env'])) {\r
+               return array_merge($contexte_entrant,$contexte_min);\r
+       }\r
+       \r
+       $l = -1 * (strlen($id_noisette)+1);\r
+       foreach ($contexte_entrant as $variable => $valeur)\r
+               if (substr($variable,$l)=='_'.$id_noisette)\r
+                       $contexte_min[$variable] = $valeur;\r
+       \r
+       if (isset($contexte_noisette['aucun'])) {\r
+               return $contexte_min;\r
+       }\r
+       if ($contexte_noisette) {\r
+               return array_merge(array_intersect_key($contexte_entrant, $contexte_noisette),$contexte_min);\r
+       }\r
+       \r
+       return $contexte_entrant;\r
+}\r
+\r
+\r
+\r
+/**\r
+ * Retourne la liste des contextes donc peut avoir besoin une noisette. \r
+ *\r
+ * @param \r
+ * @return \r
+**/\r
+function noizetier_obtenir_contexte($noisette) {\r
+       static $noisettes = false;\r
+       \r
+       // seulement 1 fois par appel, on lit ou calcule tous les contextes\r
+       if ($noisettes === false) {\r
+               // lire le cache des contextes sauves\r
+               lire_fichier_securise(_DIR_CACHE . _CACHE_CONTEXTE_NOISETTES, $noisettes);\r
+               $noisettes = @unserialize($noisettes);\r
+               \r
+               // s'il en mode recalcul, on recalcule tous les contextes des noisettes trouvees.\r
+               if (!$noisettes or (_request('var_mode') == 'recalcul')) {\r
+                       include_spip('inc/noizetier');\r
+                       $infos = noizetier_lister_noisettes();\r
+                       $noisettes = array();\r
+                       foreach ($infos as $cle_noisette => $infos) {\r
+                               $noisettes[$cle_noisette] = ($infos['contexte'] ? $infos['contexte'] : array());\r
+                       }\r
+                       ecrire_fichier_securise(_DIR_CACHE . _CACHE_CONTEXTE_NOISETTES, serialize($noisettes));\r
+               }\r
+       }\r
+\r
+       if (isset($noisettes[$noisette])) {\r
+               return $noisettes[$noisette];\r
+       }\r
+       \r
+       return array();\r
+}\r
+\r
+/**\r
+ * Retourne true ou false pour indiquer si la noisette doit être inclue en ajax \r
+ *\r
+ * @param \r
+ * @return \r
+**/\r
+function noizetier_ajaxifier_noisette($noisette) {\r
+       static $noisettes = false;\r
+       \r
+       // seulement 1 fois par appel, on lit ou calcule tous les contextes\r
+       if ($noisettes === false) {\r
+               // lire le cache des contextes sauves\r
+               lire_fichier_securise(_DIR_CACHE . _CACHE_AJAX_NOISETTES, $noisettes);\r
+               $noisettes = @unserialize($noisettes);\r
+               \r
+               // s'il en mode recalcul, on recalcule tous les contextes des noisettes trouvees.\r
+               if (!$noisettes or (_request('var_mode') == 'recalcul')) {\r
+                       include_spip('inc/noizetier');\r
+                       $infos = noizetier_lister_noisettes();\r
+                       $noisettes = array();\r
+                       foreach ($infos as $cle_noisette => $infos) {\r
+                               $noisettes[$cle_noisette] = ($infos['ajax'] == 'non') ? false : true ;\r
+                       }\r
+                       ecrire_fichier_securise(_DIR_CACHE . _CACHE_AJAX_NOISETTES, serialize($noisettes));\r
+               }\r
+       }\r
+\r
+       if (isset($noisettes[$noisette])) {\r
+               return $noisettes[$noisette];\r
+       }\r
+       \r
+       return true;\r
+}\r
+\r
+/**\r
+ * Retourne true ou false pour indiquer si la noisette doit être inclue dynamiquement\r
+ *\r
+ * @param \r
+ * @return \r
+**/\r
+function noizetier_inclusion_dynamique($noisette) {\r
+       static $noisettes = false;\r
+       \r
+       // seulement 1 fois par appel, on lit ou calcule tous les contextes\r
+       if ($noisettes === false) {\r
+               // lire le cache des contextes sauves\r
+               lire_fichier_securise(_DIR_CACHE . _CACHE_INCLUSIONS_NOISETTES, $noisettes);\r
+               $noisettes = @unserialize($noisettes);\r
+               \r
+               // s'il en mode recalcul, on recalcule tous les contextes des noisettes trouvees.\r
+               if (!$noisettes or (_request('var_mode') == 'recalcul')) {\r
+                       include_spip('inc/noizetier');\r
+                       $infos = noizetier_lister_noisettes();\r
+                       $noisettes = array();\r
+                       foreach ($infos as $cle_noisette => $infos) {\r
+                               $noisettes[$cle_noisette] = ($infos['inclusion'] == 'dynamique') ? true : false ;\r
+                       }\r
+                       ecrire_fichier_securise(_DIR_CACHE . _CACHE_INCLUSIONS_NOISETTES, serialize($noisettes));\r
+               }\r
+       }\r
+\r
+       if (isset($noisettes[$noisette])) {\r
+               return $noisettes[$noisette];\r
+       }\r
+       \r
+       return false;\r
+}\r
+\r
+/**\r
+ * Retourne le tableau des noisettes et des compositions du noizetier pour les exports\r
+ *\r
+ * \r
+ * @return \r
+**/\r
+function noizetier_tableau_export() {\r
+       $data = array();\r
+       \r
+       // On calcule le tableau des noisettes\r
+       $data['noisettes'] = sql_allfetsel(\r
+               'type, composition, bloc, noisette, parametres',\r
+               'spip_noisettes',\r
+               '1',\r
+               '',\r
+               'type, composition, bloc, rang, css'\r
+       );\r
+       \r
+       // On remet au propre les parametres\r
+       foreach ($data['noisettes'] as $cle => $noisette)\r
+               $data['noisettes'][$cle]['parametres'] = unserialize($noisette['parametres']);\r
+       \r
+       // On récupère les compositions du noizetier\r
+       $noizetier_compositions = unserialize($GLOBALS['meta']['noizetier_compositions']);\r
+       if (is_array($noizetier_compositions) AND count($noizetier_compositions)>0)\r
+               $data['noizetier_compositions'] = $noizetier_compositions;\r
+       \r
+       $data = pipeline('noizetier_config_export',$data);\r
+       \r
+       return $data;\r
+}\r
+\r
+/**\r
+ * Importe une configuration de noisettes et de compositions\r
+ *\r
+ * @param text $type_import\r
+ * @param text $import_compos\r
+ * @param array $config\r
+ * @return boolean\r
+ */\r
+function noizetier_importer_configuration($type_import, $import_compos, $config){\r
+       if ($type_import!='remplacer')\r
+               $type_import = 'fusion';\r
+       if ($import_compos!='oui')\r
+               $import_compos = 'non';\r
+       \r
+       $config = pipeline('noizetier_config_import',$config);\r
+       \r
+       // On s'occupe déjà des noisettes\r
+       $noisettes = $config['noisettes'];\r
+       include_spip('base/abstract_sql');\r
+       if (is_array($noisettes) AND count($noisettes)>0) {\r
+               $noisettes_insert = array();\r
+               $rang = 1;\r
+               $page = '';\r
+               if ($type_import=='remplacer')\r
+                       sql_delete('spip_noisettes','1');\r
+               foreach($noisettes as $noisette) {\r
+                       $type = $noisette['type'];\r
+                       $composition = $noisette['composition'];\r
+                       if ($type.'-'.$composition!=$page) {\r
+                               $page = $type.'-'.$composition;\r
+                               $rang = 1;\r
+                               if ($type_import=='fusion')\r
+                                       $rang = sql_getfetsel('rang','spip_noisettes','type='.sql_quote($type).' AND composition='.sql_quote($composition),'','rang DESC') + 1;\r
+                       }\r
+                       else {\r
+                               $rang = $rang + 1;\r
+                       }\r
+                       $noisette['rang']=$rang;\r
+                       $noisette['parametres'] = serialize($noisette['parametres']);\r
+                       $noisettes_insert[] = $noisette;\r
+               }\r
+               $ok = sql_insertq_multi('spip_noisettes',$noisettes_insert);\r
+       }\r
+       \r
+       // On s'occupe des compositions du noizetier\r
+       if ($import_compos=='oui') {\r
+               include_spip('inc/meta');\r
+               $compos_importees = $config['noizetier_compositions'];\r
+               if (is_array($compos_importees) AND count($compos_importees)>0){\r
+                       if ($type_import=='remplacer')\r
+                               effacer_meta('noizetier_compositions');\r
+                       else \r
+                               $noizetier_compositions = unserialize($GLOBALS['meta']['noizetier_compositions']);\r
+                       \r
+                       if (!is_array($noizetier_compositions))\r
+                               $noizetier_compositions = array();\r
+                       \r
+                       foreach($compos_importees as $type => $compos_type)\r
+                               foreach($compos_type as $composition => $info_compo)\r
+                                       $noizetier_compositions[$type][$composition] = $info_compo;\r
+                       \r
+                       ecrire_meta('noizetier_compositions',serialize($noizetier_compositions));\r
+                       ecrire_metas();\r
+               }\r
+       }\r
+       \r
+       // On invalide le cache\r
+       include_spip('inc/invalideur');\r
+       suivre_invalideur('noizetier-import-config');\r
+       \r
+       return $ok;\r
+}\r
+\r
+?>\r