[SPIP] ~version 3.0.16-->3.0.17
authorLudovic CHEVALIER <ludovic.chevalier@heureux-cyclage.org>
Thu, 9 Oct 2014 12:55:30 +0000 (14:55 +0200)
committerLudovic CHEVALIER <ludovic.chevalier@heureux-cyclage.org>
Thu, 9 Oct 2014 12:55:30 +0000 (14:55 +0200)
219 files changed:
www/CHANGELOG.txt
www/INSTALL.txt
www/ecrire/action/editer_article.php
www/ecrire/action/purger.php
www/ecrire/balise/formulaire_admin.php
www/ecrire/base/objets.php
www/ecrire/exec/rechercher.php
www/ecrire/inc/auth.php
www/ecrire/inc/autoriser.php
www/ecrire/inc/cvt_configurer.php
www/ecrire/inc/distant.php
www/ecrire/inc/filtres.php
www/ecrire/inc/filtres_ecrire.php
www/ecrire/inc/filtres_images_lib_mini.php
www/ecrire/inc/genie.php
www/ecrire/inc/lang_liste.php
www/ecrire/inc/pclzip.php
www/ecrire/inc/plugin.php
www/ecrire/inc/precharger_objet.php
www/ecrire/inc/queue.php
www/ecrire/inc/rechercher.php
www/ecrire/inc/rubriques.php
www/ecrire/inc/texte_mini.php
www/ecrire/inc/traduire.php
www/ecrire/inc/utils.php
www/ecrire/inc_version.php
www/ecrire/install/etape_3.php
www/ecrire/iterateur/data.php
www/ecrire/lang/ecrire_fr.php
www/ecrire/lang/spip_fr.php
www/ecrire/lang/spip_my.php
www/ecrire/paquet.xml
www/ecrire/public/assembler.php
www/ecrire/public/balises.php
www/ecrire/public/cacher.php
www/ecrire/public/compiler.php
www/ecrire/public/composer.php
www/ecrire/public/criteres.php
www/ecrire/public/quete.php
www/ecrire/public/sandbox.php
www/ecrire/req/sqlite_fonctions.php
www/htaccess.txt
www/plugins-dist/compagnon/prive/themes/spip/images/compagnon_gris-64.png
www/plugins-dist/compresseur/paquet.xml
www/plugins-dist/dump/prive/themes/spip/images/dump-32.png
www/plugins-dist/filtres_images/apple-touch-icon.png.html
www/plugins-dist/filtres_images/paquet.xml
www/plugins-dist/forum/action/editer_forum.php
www/plugins-dist/forum/formulaires/forum.html
www/plugins-dist/forum/formulaires/forum.php
www/plugins-dist/forum/formulaires/gestion_forum.html [changed mode: 0755->0644]
www/plugins-dist/forum/formulaires/gestion_forum.php [changed mode: 0755->0644]
www/plugins-dist/forum/formulaires/inc-gestion_forum_liste.html [changed mode: 0755->0644]
www/plugins-dist/forum/formulaires/inc-login_forum.html
www/plugins-dist/forum/paquet.xml
www/plugins-dist/forum/prive/modeles/forum.html
www/plugins-dist/forum/prive/objets/liste/controler_forum_cvt.html [changed mode: 0755->0644]
www/plugins-dist/forum/prive/themes/spip/images/forum-statut-off-24.png
www/plugins-dist/forum/prive/themes/spip/images/forum-statut-prop-24.png
www/plugins-dist/forum/prive/themes/spip/images/forum-statut-publie-24.png
www/plugins-dist/forum/prive/themes/spip/images/forum-statut-spam-24.png
www/plugins-dist/forum/prive/themes/spip2/images/comment_48.png [changed mode: 0755->0644]
www/plugins-dist/forum/prive/themes/spip2/images/forum-48.png
www/plugins-dist/forum/prive/themes/spip2/images/forum-statut-off-24.png
www/plugins-dist/forum/prive/themes/spip2/images/forum-statut-prop-24.png
www/plugins-dist/forum/prive/themes/spip2/images/forum-statut-publie-24.png
www/plugins-dist/forum/prive/themes/spip2/images/forum-statut-spam-24.png
www/plugins-dist/jquery_ui/jqueryui_pipelines.php [changed mode: 0755->0644]
www/plugins-dist/mediabox/colorbox/black-greybox/colorbox.css
www/plugins-dist/mediabox/colorbox/black-simple/colorbox.css
www/plugins-dist/mediabox/colorbox/black-striped/colorbox.css
www/plugins-dist/mediabox/colorbox/bootstrap/colorbox.css [changed mode: 0755->0644]
www/plugins-dist/mediabox/colorbox/bootstrap/colorbox_rtl.css [changed mode: 0755->0644]
www/plugins-dist/mediabox/colorbox/demo.jpg
www/plugins-dist/mediabox/colorbox/fancybox/colorbox.css
www/plugins-dist/mediabox/colorbox/thickbox/colorbox.css
www/plugins-dist/mediabox/colorbox/white-shadow/colorbox.css
www/plugins-dist/mediabox/colorbox/white-simple/colorbox.css
www/plugins-dist/mediabox/paquet.xml
www/plugins-dist/medias/modeles/document_case.html
www/plugins-dist/medias/modeles/document_desc.html
www/plugins-dist/medias/paquet.xml
www/plugins-dist/medias/prive/themes/spip/images/media-audio-16.png [changed mode: 0755->0644]
www/plugins-dist/medias/prive/themes/spip/images/media-image-16.png [changed mode: 0755->0644]
www/plugins-dist/medias/prive/themes/spip/images/media-video-16.png [changed mode: 0755->0644]
www/plugins-dist/medias/prive/themes/spip/images/vu-16.png [changed mode: 0755->0644]
www/plugins-dist/medias/prive/themes/spip/images/vu-32.png [changed mode: 0755->0644]
www/plugins-dist/medias/prive/themes/spip2/images/media-audio-16.png [changed mode: 0755->0644]
www/plugins-dist/medias/prive/themes/spip2/images/media-image-16.png [changed mode: 0755->0644]
www/plugins-dist/medias/prive/themes/spip2/images/media-video-16.png [changed mode: 0755->0644]
www/plugins-dist/medias/prive/themes/spip2/images/vu-16.png [changed mode: 0755->0644]
www/plugins-dist/medias/prive/themes/spip2/images/vu-32.png [changed mode: 0755->0644]
www/plugins-dist/mots/action/editer_groupe_mots.php
www/plugins-dist/mots/paquet.xml
www/plugins-dist/petitions/base/petitions.php [changed mode: 0755->0644]
www/plugins-dist/petitions/formulaires/activer_petition_article.html
www/plugins-dist/petitions/paquet.xml
www/plugins-dist/petitions/petitions_administrations.php [changed mode: 0755->0644]
www/plugins-dist/petitions/prive/themes/spip/images/signature-statut-poubelle-24.png
www/plugins-dist/petitions/prive/themes/spip/images/signature-statut-prop-24.png
www/plugins-dist/petitions/prive/themes/spip/images/signature-statut-publie-24.png
www/plugins-dist/petitions/prive/themes/spip2/images/signature-statut-poubelle-24.png
www/plugins-dist/petitions/prive/themes/spip2/images/signature-statut-prop-24.png
www/plugins-dist/petitions/prive/themes/spip2/images/signature-statut-publie-24.png
www/plugins-dist/revisions/afficher_diff/champ.php
www/plugins-dist/revisions/paquet.xml
www/plugins-dist/revisions/prive/objets/liste/versions.html
www/plugins-dist/revisions/prive/themes/spip/images/diff-16.png [changed mode: 0755->0644]
www/plugins-dist/revisions/prive/themes/spip/images/diff-32.png [changed mode: 0755->0644]
www/plugins-dist/revisions/prive/themes/spip/images/revision-32.png [changed mode: 0755->0644]
www/plugins-dist/safehtml/lib/safehtml/classes/HTMLSax3.php [changed mode: 0755->0644]
www/plugins-dist/safehtml/lib/safehtml/classes/HTMLSax3/Decorators.php [changed mode: 0755->0644]
www/plugins-dist/safehtml/lib/safehtml/classes/HTMLSax3/States.php [changed mode: 0755->0644]
www/plugins-dist/safehtml/lib/safehtml/classes/safehtml.php [changed mode: 0755->0644]
www/plugins-dist/safehtml/lib/safehtml/license.txt [changed mode: 0755->0644]
www/plugins-dist/safehtml/lib/safehtml/readme-SPIP.txt [changed mode: 0755->0644]
www/plugins-dist/safehtml/lib/safehtml/readme.txt [changed mode: 0755->0644]
www/plugins-dist/sites/inc/site.php
www/plugins-dist/sites/paquet.xml
www/plugins-dist/sites/prive/themes/spip/images/syndic-statut-dispo-24.png
www/plugins-dist/sites/prive/themes/spip/images/syndic-statut-off-24.png
www/plugins-dist/sites/prive/themes/spip/images/syndic-statut-publie-24.png
www/plugins-dist/sites/prive/themes/spip2/images/syndic-statut-dispo-24.png
www/plugins-dist/sites/prive/themes/spip2/images/syndic-statut-off-24.png
www/plugins-dist/sites/prive/themes/spip2/images/syndic-statut-publie-24.png
www/plugins-dist/statistiques/base/delete_referers.php [changed mode: 0755->0644]
www/plugins-dist/statistiques/exec/base_delete_referers.php [changed mode: 0755->0644]
www/plugins-dist/statistiques/prive/style_prive_plugin_stats.html
www/plugins-dist/statistiques/prive/themes/spip/images/referers-16.png [changed mode: 0755->0644]
www/plugins-dist/statistiques/prive/themes/spip/images/referers-32.png [changed mode: 0755->0644]
www/plugins-dist/statistiques/prive/themes/spip/images/repartition-16.png [changed mode: 0755->0644]
www/plugins-dist/statistiques/prive/themes/spip/images/repartition-32.png [changed mode: 0755->0644]
www/plugins-dist/statistiques/prive/themes/spip/images/zoomin-16.png [changed mode: 0755->0644]
www/plugins-dist/statistiques/prive/themes/spip/images/zoomin-32.png [changed mode: 0755->0644]
www/plugins-dist/statistiques/prive/themes/spip/images/zoomout-16.png [changed mode: 0755->0644]
www/plugins-dist/statistiques/prive/themes/spip/images/zoomout-32.png [changed mode: 0755->0644]
www/plugins-dist/svp/formulaires/charger_plugin_archive.html
www/plugins-dist/svp/formulaires/charger_plugin_archive.php
www/plugins-dist/svp/formulaires/inc-admin_plugin.html [changed mode: 0755->0644]
www/plugins-dist/svp/formulaires/inc-plugins_trouves.html [changed mode: 0755->0644]
www/plugins-dist/svp/formulaires/inc-select_categorie.html [changed mode: 0755->0644]
www/plugins-dist/svp/inc/svp_depoter_distant.php
www/plugins-dist/svp/inc/where_compatible_spip.php [changed mode: 0755->0644]
www/plugins-dist/svp/lang/svp_fr.php
www/plugins-dist/svp/paquet.xml
www/plugins-dist/svp/prive/objets/contenu/depot.html [changed mode: 0755->0644]
www/plugins-dist/svp/prive/objets/contenu/plugin.html [changed mode: 0755->0644]
www/plugins-dist/svp/prive/squelettes/contenu/charger_plugin.html [changed mode: 0755->0644]
www/plugins-dist/svp/prive/squelettes/contenu/depots.html [changed mode: 0755->0644]
www/plugins-dist/svp/prive/squelettes/contenu/svp_admin_plugin.html [changed mode: 0755->0644]
www/plugins-dist/svp/prive/squelettes/inclure/voir_en_ligne_fonctions.php [changed mode: 0755->0644]
www/plugins-dist/svp/prive/squelettes/navigation/charger_plugin.html [changed mode: 0755->0644]
www/plugins-dist/svp/prive/squelettes/navigation/depots.html [changed mode: 0755->0644]
www/plugins-dist/svp/prive/squelettes/navigation/plugin.html [changed mode: 0755->0644]
www/plugins-dist/svp/prive/squelettes/navigation/svp_admin_plugin.html [changed mode: 0755->0644]
www/plugins-dist/svp/prive/themes/spip/images/depot-16.png
www/plugins-dist/svp/prive/themes/spip/images/depot-32.png
www/plugins-dist/svp/prive/themes/spip/images/fond-installe.png
www/plugins-dist/svp/prive/themes/spip/images/fond-verrou.png
www/plugins-dist/textwheel/inc/autoliens.php
www/plugins-dist/textwheel/lib/yaml/sfYaml.php [changed mode: 0755->0644]
www/plugins-dist/textwheel/lib/yaml/sfYamlDumper.php [changed mode: 0755->0644]
www/plugins-dist/textwheel/lib/yaml/sfYamlInline.php [changed mode: 0755->0644]
www/plugins-dist/textwheel/lib/yaml/sfYamlParser.php [changed mode: 0755->0644]
www/plugins-dist/textwheel/paquet.xml
www/plugins-dist/textwheel/wheels/spip/spip.yaml
www/plugins-dist/urls_etendues/action/editer_url.php
www/plugins-dist/urls_etendues/base/urls.php
www/plugins-dist/urls_etendues/formulaires/configurer_urls.php
www/plugins-dist/urls_etendues/formulaires/editer_url_objet.php
www/plugins-dist/urls_etendues/paquet.xml
www/plugins-dist/urls_etendues/prive/objets/liste/urls.html
www/plugins-dist/urls_etendues/urls/arbo.php
www/plugins-dist/urls_etendues/urls/propres.php
www/plugins-dist/urls_etendues/urls/standard.php
www/plugins-dist/urls_etendues/urls_administrations.php
www/plugins-dist/vertebres/public/vertebrer.php [changed mode: 0755->0644]
www/prive/echafaudage/contenu/objet_edit.html
www/prive/echafaudage/contenu/objet_edit.sans_rubrique.html
www/prive/formulaires/configurer_multilinguisme.html
www/prive/formulaires/configurer_multilinguisme.php
www/prive/formulaires/configurer_reducteur.php
www/prive/formulaires/dater.php
www/prive/formulaires/dateur/inc-dateur.html
www/prive/formulaires/editer_auteur.html
www/prive/formulaires/editer_auteur.php
www/prive/formulaires/editer_liens.php
www/prive/formulaires/login.php
www/prive/formulaires/rediriger_article.php
www/prive/formulaires/selecteur/generique.html
www/prive/formulaires/selecteur/generique_fonctions.php
www/prive/formulaires/selecteur/hierarchie-articles.html
www/prive/formulaires/selecteur/hierarchie-rubriques.html
www/prive/formulaires/selecteur/lister.html
www/prive/ical_prive.html
www/prive/javascript/ajaxCallback.js
www/prive/objets/contenu/rubrique-enfants.html
www/prive/objets/infos/auteur.html
www/prive/objets/infos/inc-auteur-rubriques.html [new file with mode: 0644]
www/prive/objets/liste/articles.html
www/prive/objets/liste/auteurs_enligne.html
www/prive/spip_admin.css
www/prive/squelettes/contenu/accueil.html
www/prive/squelettes/contenu/auteur_edit.html
www/prive/squelettes/contenu/synchro.html
www/prive/themes/spip/bando.css.html
www/prive/themes/spip/box_skins.css.html
www/squelettes-dist/css/clear.css [changed mode: 0755->0644]
www/squelettes-dist/css/img/recherche.png
www/squelettes-dist/css/layout.css
www/squelettes-dist/css/reset.css [changed mode: 0755->0644]
www/squelettes-dist/css/spip.css [changed mode: 0755->0644]
www/squelettes-dist/ical.html
www/squelettes-dist/polices/dustismo-license.txt [changed mode: 0755->0644]
www/squelettes-dist/polices/dustismo.ttf [changed mode: 0755->0644]
www/squelettes-dist/polices/dustismo_bold.ttf [changed mode: 0755->0644]
www/squelettes-dist/robots.txt.html
www/squelettes-dist/spip.ico [changed mode: 0755->0644]
www/svn.revision

index 7fab8dd..bab9dfb 100644 (file)
@@ -1,4 +1,145 @@
 
+SPIP-Core spip-3.0.16 -> spip-3.0.17  13 août 2014
+-------------------------------------------------------------
+
+r21270 | cedric    |  (ven. 14 mars 2014) | Ferme #3188 : ne pas echapper le HTML des titre sur la page d'edition
+r21271 | b_b       |  (ven. 14 mars 2014) | En route pour la joie !
+r21272 | cedric    |  (sam. 15 mars 2014) | Bugfix : quand on appelle echappe_html avec autre chose que la preg par defaut definie par la constante _PROTEGE_BLOCS, il ne faut pas echapper automatiquement les <math> et <?...?> car ce peut-être tout à fait hasardeux.1/On refactor le traitement de <math> en l'integrant à _PROTEGE_BLOCS pour eviter le derogatoiremais on conserve en 3.0 le vieil appel derogatoire (pour ne pas risquer de rupture fonctionnelle si jamais _PROTEGE_BLOCS était personalisée) en le conditionnant  à la presence de "code" dans _PROTEGE_BLOCSCet appel est a supprimer en branche 3.12/Concernant l'echappement des <? .. ?>, on le conditionne a la presence de "script" dans _PROTEGE_BLOCS car c'en est une extension qui ne peut pas passer dans la regexp
+r21276 | kent1     |  (lun. 17 mars 2014) | Report de r21275 :Vérifier que la redirection d'article ne redirige pas vers le même article (évite une boucle infinie)
+r21280 | kent1     |  (mar. 18 mars 2014) | report de r21279On essaie de bien faire et on en oublie la moitié, pas de chaine de langue en dur ;)
+r21282 | b_b       |  (mar. 18 mars 2014) | Report de r21281 : permettre les sauts de ligne dans les appels de modèles cf http://core.spip.org/issues/3173
+r21284 | kent1     |  (mer. 19 mars 2014) | Report de r21283Qualité Web - Opquast V2 - 141Une famille générique de police est indiquée comme dernier élément de substitution.
+r21288 | rasta     |  (ven. 28 mars 2014) | Légère amélioration du sélecteur générique : on permet de forcer la racine, càd le démarrage de ce qu'on affiche, à un endroit précis.Pour cela, deux options à envoyer : "forcer_racine_objet" et "forcer_racine_id_objet".Beaucoup mieux que juste forcer un seul "id_secteur" (chose qui était déjà permis), car lorsqu'on ouvre le sélecteur on tombe directement sur le bon contenu, on a pas un secteur tout seul à la racine par exemple.De plus le chemin du sélecteur interdit de remonter plus haut que la racine définie explicitement. C'est plus intelligent et moins confusionnant lorsqu'on veut obliger à sélectionner des contenus précis (ex : vous devez sélectionner des rubriques dans telle branche).
+r21290 | cedric    |  (ven. 28 mars 2014) | parentheses manquantes : le fichier local/config.txt etait vide…
+r21291 | cedric    |  (mar. 01 avril 2014) | ferme #3183 : filtrer_entites doit aussi retablir les &#39; et les &#34; et variantes (il le faisait deja pour les &quot;)
+r21295 | cedric    |  (mer. 09 avril 2014) | Redirection sur formulaire login : ne pas rediriger sur soi même, en faisant attention aux & vs &amp;+ coquille inversion
+r21296 | cedric    |  (jeu. 10 avril 2014) | Quand on fait un hit ajax, on pose un id en JS sur le bloc qui change pour pouvoir le retablir si l'utilisateur utilise le retour en arrière dans l'historique. Mais si après 1 ou plusieurs hits ajax on fait un hit non ajax, on perd cet id posé en JS quand on revient en arrière, et on ne savait plus gérer les retours en arrières suivants. Dans ce cas, on fait une simple redirection JS vers l'URL concernée, pour ne pas casser la navigation dans l'historique.(Yohann)
+r21297 | cedric    |  (jeu. 10 avril 2014) | Amelioration de r21296 : on stocke l'eventuel ajax-id-xx dans le history.state, ainsi lorsque l'id du bloc ajax n'est plus dans le HTML, on essaye de le retrouver avec la class ajax-id-xx. Si un seul bloc correspond, c'est lui et on lui applique le rechargement. Sinon on utilise le window.location.href comme fallback dont on est sur.
+r21298 | cedric    |  (ven. 11 avril 2014) | Un bugfix inespéré : gerer enfin correctement les appels ajax vers les URLs qui ont un argument en moins par rapport à l'URL d'origine Comme on dispose de l'URL d'origine dans le blocfrag, on la parse, et on regarde les arguments qui ne sont pas dans le href qu'on recherche, auquel cas on les ajoute vide sur l'url qu'on va requeter en ajax Resoud par exemple le retour a la page 0 d'une pagination quand on est arrivé sur une URL avec un ?debut_xx
+r21299 | cedric    |  (ven. 11 avril 2014) | lorsque blocfrag dispose d'attributs data-loading-callback et data-loaded-callback on les utilise pour declencher l'animation loading et pour charger le contenu chargé(ajout de points d'entree, aucun changement fonctionnel par defaut)
+r21300 | cedric    |  (ven. 11 avril 2014) | oups ajax-id-xx n'est pas toujours presend, ajaxid peut etre null (Rastapopoulos)
+r21301 | cedric    |  (ven. 11 avril 2014) | echappement insuffisant, la RegExp etait incorrecte et parametre_url ne reperait pas les arguments en tableau
+r21302 | cedric    |  (ven. 11 avril 2014) | ajaxReload accepte un href comme argument au lieu des args (parfois plus simple)
+r21316 | touti     |  (lun. 14 avril 2014) | Report de r21311 et r21312
+r21317 | touti     |  (lun. 14 avril 2014) | report de r21160
+r21319 | b_b       |  (sam. 19 avril 2014) | report de r21318 : introduction d'une constante _LOGO_RUBRIQUE_DESACTIVER_HERITAGE qui permet de désactiver l'héritage des logos pour les rubriques, cf #3179
+r21321 | eric      |  (lun. 21 avril 2014) | Report de r21320.Eviter que la mise en exergue du module de langue dans le title et le texte coincide avec un mot du texte.
+r21323 | eric      |  (lun. 21 avril 2014) | Report de r21322.Il faut aussi tenir compte dans le pattern du cas où plusieurs modules sont passés dans l'item de langue.
+r21331 | b_b       |  (jeu. 01 mai 2014) | Report adapté de r21330 / Fix #3206 : éviter que le logo des rubriques ne cachent leur titre
+r21333 | b_b       |  (jeu. 01 mai 2014) | Report de r21332 / Fix #3189 : dans l'espace privé, réduire les images affichées dans le descriptif des rubriques
+r21336 | cedric    |  (lun. 05 mai 2014) | sur une url article avec un id_mot en query-string, on veut que le bouton d'admin renvoie vers l'article et pas vers l'id_mot.Pour coller au mieux possible, on inverse l'ordre des objets, ce qui fait que plus un objet est "loin du core" moins il est prioritaire, la rubrique etant de toute façon la moins prioritaire de tous.Ca reste approximatif et il faudrait une meilleure solution (peut etre tout simplement avoir un bouton pour chaque objet du contexte et non un seul)
+r21338 | kent1     |  (lun. 05 mai 2014) | Report de c21337 : Ne pas confondre le Kazakh (kk - http://fr.wikipedia.org/wiki/Kazakh) et le Konkani (kok - http://fr.wikipedia.org/wiki/Konkani)
+r21339 | cedric    |  (lun. 05 mai 2014) | quand une valeur est un tableau, bien envoyer tout en tableau pour garder toutes les valeurs (mais il faudrait traiter le cas avec boundary aussi)
+r21340 | cedric    |  (lun. 05 mai 2014) | complement a r21339 : quand une valeur est un tableau l'envoyer correctement y compris si on boundarise les donnees en POST
+r21348 | cedric    |  (jeu. 08 mai 2014) | eviter un warning quand il n'y a pas de session (moderation des forums par mail par exemple)
+r21355 | b_b       |  (ven. 09 mai 2014) | Maj de la config nécessaire en accord avec le trunk (Francky)
+r21362 | kent1     |  (lun. 12 mai 2014) | Report de c21361D'après wikipedia et d'autres personnes bien informées, l'azéri, parfois appelé azerbaïdjanais se dit "Azərbaycan dili"
+r21363 | cedric    |  (lun. 12 mai 2014) | Amelioration de la gestion du Proxy : gestion des echecs, et gestion du https via CONNECTQuand la requête necessite un proxy et qu'elle echoue, il ne faut pas essayer de la relancer en direct via fopen() ou via file_get_contents() car cela produit un timeout sur le firewall éventuelPour faire une requête https à travers un proxy il faut en général passer par un CONNECT initial (https://en.wikipedia.org/wiki/HTTP_tunnel) ce qui n'était pas géré ici. On implémente donc ce dialogue. Par soucis de compatibilité il ne sera pris en charge qu'en cas de ```define('_PROXY_HTTPS_VIA_CONNECT',true);``` dans le fichier mes_options.php. A voir si il faut rendre cette fonctionnalité activable par l'interface et/ou si elle doit être celle active par défaut.
+r21365 | kent1     |  (mar. 13 mai 2014) | Report de c21364Ajoutons le Dari, variante du persan utilisée en Afghanistan notamment (http://fr.wikipedia.org/wiki/Dari)
+r21378 | fil       |  (mar. 03 juin 2014) | report des filtres |set{} et |debug{}, cf. http://core.spip.org/projects/spip/repository/revisions/21376
+r21380 | fil       |  (mar. 03 juin 2014) | compatibilite PHP 5.3 (xdjuj)
+r21382 | b_b       |  (mar. 03 juin 2014) | Report de r21381 : réparer le fait qu'on passe un article en statut proposé lorsqu'un auteur tente de le déplacer dans une rubrique sur laquelle il n'a pas les droits, cf #2523 et #3221
+r21384 | cedric    |  (jeu. 05 juin 2014) | un z-index plus élevé pour le bandeau haut, car on attends que le menu déroulant passe par dessus tous les contenus de la page, y compris une éventuelle carte gis qui contient des elements en z-index=1000
+r21385 | cedric    |  (jeu. 05 juin 2014) | reparer les liens webcal en passant les urls en absolue (les urls relative ne contenaient pas le protocole, donc pas de difference entre les deux liens)
+r21386 | cedric    |  (jeu. 05 juin 2014) | envoyer un filename en .ics pour le contenu ICS aide a l'ouvrir automatiquent avec le bon outil
+r21398 | fil       |  (mar. 10 juin 2014) | report de 21397 _LOG_AVERTISSEMENT sur les boucles lentes (_BOUCLE_PROFILER)
+r21399 | cedric    |  (mar. 10 juin 2014) | le critere {recherche} necessite une cle primaire non composee, generer une erreur si ce n'est pas le cas+ chaine de langue pour ce type d'erreur+ correction erreur critere doublons
+r21400 | cedric    |  (mer. 11 juin 2014) | Ferme #3224 : erreur de parametre_url sur les arguments de la query string qui n'ont pas =xxx(exemple : spip.php?rubrique12 )
+r21402 | b_b       |  (mer. 11 juin 2014) | report de r21401 : respecter le choix des auteurs qui ne souhaitent pas appraître dans la liste des auteurs en ligne cf http://thread.gmane.org/gmane.comp.web.spip.zone/35995
+r21410 | rasta     |  (jeu. 19 juin 2014) | Prendre en compte "racine|0" en plus de "rubrique|0" dans picker_selected(), plus générique et explicite.
+r21414 | b_b       |  (lun. 30 juin 2014) | report de r21413 : bloquer l'accès aux fichiers cachés cf http://archives.rezo.net/archives/spip-dev.mbox/OJPZXTWELE7YCVIWLHHNOTDQBFX2PH4I/
+r21416 | kent1     |  (ven. 04 juil. 2014) | Dates pour le Birman
+r21417 | kent1     |  (ven. 04 juil. 2014) | La langue Ouzbek, à priori c'est comme cela que cela s'écrit... (http://mfa.uz/uz/)
+r21425 | kent1     |  (jeu. 17 juil. 2014) | Meilleure indentation
+r21427 | kent1     |  (jeu. 17 juil. 2014) | Orthographe
+r21429 | marcimat  |  (ven. 18 juil. 2014) | Report de r21428 : Corriger l'utilisation de la librairie graphique Imagick en PHP5. On intègre peu ou prou le patch de Alan Garcia, ticket #3160
+r21432 | marcimat  |  (ven. 18 juil. 2014) | Report de r21431 : fermer #3223Ne pas proposer sur le formulaire d'édition de liens de pouvoir créer ou retirer des liens si on n'a pas le droit d'éditer l'objet concerné.
+r21434 | denisb    |  (sam. 19 juil. 2014) | ecrire/inc/filtres.php : correction de l'appel d'une chaîne de langue. report de r21433.
+r21435 | eric      |  (sam. 19 juil. 2014) | Correction du ticket http://core.spip.org/issues/3240.On supprime les modèles avant l'appel de propre qui ajoutait le titre du doc dans un strong.On utilise pour ce faire la fonction supprimer_img qui malgré son nom supprimer les modèles img, doc et emb.Les autres modèles ne sont pas concernés et peuvent encore générer ce type d'erreur. Nénamoins il est prévu (todo) d'étendre la fonction supprimer_img.
+r21441 | denisb    |  (sam. 19 juil. 2014) | ecrire/inc/pclzip.php : tenir compte du renommage des fonctions gz... par certaines distrib (report de r21440).
+r21443 | b_b       |  (sam. 19 juil. 2014) | report de r21423 : fix sur la balise inclure pour accepter un tableau en premier argument
+r21445 | denisb    |  (dim. 20 juil. 2014) | ecrire/inc/pclzip.php : correction de r21441 (typage des arguments de fonction). report de r21444.
+r21447 | erational |  (dim. 20 juil. 2014) | Multilinguisme: Affiche la langue de l'article si elle diffère de la langue du rédacteur(Rétablit le comportement de SPIP2)Répond partiellement à http://core.spip.org/issues/2746
+r21451 | marcimat  |  (dim. 20 juil. 2014) | Report de r21450 : l'autorisation de créer un article dans une rubrique nécessite de pouvoir créer un article également.
+r21453 | denisb    |  (dim. 20 juil. 2014) | ecrire/inc/precharger_objet.php, ecrire/inc/auth.php : corriger l'utilisation de l'autorisation liée à la constante _STATUT_AUTEUR_RUBRIQUE. (report de r21452)
+r21455 | marcimat  |  (lun. 21 juil. 2014) | Report de r21454 : Restaurer l'animation de la couleur de fond sur les tableaux (exemple sur ajout d'un mot clé à un article), disparue certainement par la robustification de r17078
+r21457 | marcimat  |  (lun. 21 juil. 2014) | Report de r21456 : Poursuivre r21454 : utiliser le même principe sur animateRemove() que sur animateAppend() pour voir la coloration rouge de la ligne tr supprimée (exemple : délier un mot clé d'un article), sinon on ne voit rien !
+r21459 | kent1     |  (ven. 25 juil. 2014) | D'après les exemples de php.net ce n'est pas la variable à mettre ici mais la class Imagickcf : http://php.net/manual/fr/imagick.resizeimage.php#77339Cela évite les erreurs du type : unexpected T_PAAMAYIM_NEKUDOTAYIM blahblabla
+r21463 | rasta     |  (lun. 28 juil. 2014) | Les traitements de balise utilise des fonctions de texte.php, or si on n'utilise pas la fonction dans un squelette mais dans PHP, ce n'est pas forcément chargé.
+r21465 | rasta     |  (mer. 30 juil. 2014) | Un petit test en plus + cosmétique…
+r21470 | cedric    |  (sam. 02 août 2014) | Ferme #2989 : concurrence entre suppression des fichiers charger_p* et la reconstruction provoquee par la suppression de charger_plugins_options.php.On ne supprime que ce dernier qui provoque la mise à jour des autres.
+r21471 | cedric    |  (sam. 02 août 2014) | Ferme #3184 : eviter une erreur fatale lors du processus de maj de SPIP qui peut passer par des états incomplets
+r21472 | cedric    |  (sam. 02 août 2014) | Ferme #3069 : l'autorisation utilisee pour tester le droit de modifier login/pass n'utilisait pas la bonne option. $opt['restreintes'] permet de tester le droit a modifier les rubriques restreintes alors que $opt['email'] permet de tester le droit a modifier le login/email.
+r21477 | cedric    |  (sam. 02 août 2014) | Correction de affdate_debut_fin pour satisfaire les tests http://zone.spip.org/trac/spip-zone/changeset/83995/_core_/tests+ Ferme #3218 : utiliser la date_jour_court sur la date de fin si on a pas forcé l'affichage de l'annee (nicod)
+r21480 | cedric    |  (mar. 05 août 2014) | Eviter d'ouvrir une connexion SQL a chaque appel de cron() alors qu'il n'y a peut etre rien a fairecas notamment (non nominal mais qui peut exister) de define('_DIRECT_CRON_FORCE',true); dans mes_options.php
+r21482 | cedric    |  (mar. 05 août 2014) | Dateur : proposer par defaut dans le datepicker un intervalle de date de -60ans/+40ans c'est plus adapté (notamment dans le cas des dates de naissance). De plus, on peut specifier un attribut data-yearRange sur chaque input pour personaliser l'intervalle au cas par cas, en y utilisant la syntaxe de http://api.jqueryui.com/datepicker/#option-yearRange
+r21487 | cedric    |  (ven. 08 août 2014) | Ferme #3203 : ne pas dévoiler du contenu post-daté par erreur.La mise à jour de la date du prochain article post-datés se faisait à 2 endroits :- lorsqu'on verifiait la validité d'un cache existant- en fin de hitEn conséquence, si on demandait un article A post-daté futur qui n'avait aucun cache alors qu'un autre article B post-daté venait d'être publié, la mise à jour de la date du prochain article post-datés ne se faisait qu'en fin de hit, donc après avoir affiché l'article A, ce qui est une erreur.On apporte les corrections suivantes :- dans la fonction cache_valide() on vérifie systématiquement si il faut mettre date_prochain_postdate a jour, même si on a pas de cache valide, puisque la meta va conditionner ce qu'on va mettre dans le cache, justement- on appelle calculer_prochain_postdate() avec le $check=true pour publier éventuellement les rubriques concernées- dans la fonction calculer_prochain_postdate() on met systematiquement à jour la meta derniere_modif si jamais on modifie date_prochain_postdate
+r21490 | cedric    |  (ven. 08 août 2014) | Ferme #3241 : permettre au plugin autorite de surcharger prive/objets/infos/inc-auteur-rubriques.html pour afficher les rubriques liees aux auteurs non admin (extension de fonctionnalité)
+r21492 | cedric    |  (ven. 08 août 2014) | Ferme #3228 : si plus de 10 langues sélectionnées, un lien "Tout decocher" permet de tout decocher
+r21494 | cedric    |  (ven. 08 août 2014) | Ferme #3227 : la date de redaction/publication doit etre valide selon PHP (mktime). Pour la date de redaction antérieure, on prend en charge les dates improbables dans le passé par un offset de +9000 sur l'année.
+r21497 | cedric    |  (sam. 09 août 2014) | optimisation : memoizer le calcul de ce critere qui est appele plusieurs fois avec les memes arguments dans la page
+r21498 | cedric    |  (dim. 10 août 2014) | Ferme #2013 : dans la declaration du filtrage par statut, on peut suffixer un statut donné par "/auteur" pour que seuls les objets liés à l'auteur connecté soient affichés pour ce statut.Application aux articles, pour lesquels on limite en previsualisation l'affichage des articles en cours de rédaction à ceux de l'auteur connecté.Dans la fonction quete_condition_statut on utilise le nom de table qui prefixe le champ statut pour savoir de quel objet on traite.Ce n'est pas parfait, il faudrait le passer en argument supplémentaire, mais cela suffit en général, et on ne veut pas changer la signature de la fonction dans cette version stable. A noter que si on n'a pas cette information, on ignore le statut considéré pour ne pas risquer de dévoiler de l'information - idem si pas d'auteur connecté.
+r21501 | cedric    |  (dim. 10 août 2014) | #3162 et sans doute d'autres cas : la fonction _sqlite_func_regexp_match doit utiliser le flag u si on est en UTF8 pour matcher correctement les chaines accentuées+ optimisation : quand $quoi est vide (ce qui est souvent le cas sur les requetes SQL), retourner false tout de suite.
+r21502 | cedric    |  (dim. 10 août 2014) | Ferme #3162 (complète r21501) : dans la chaine utilisé pour requeter, remplacer les caracteres transliterables par un joker (. si regexp et _ si LIKE), puisque la requete SQL est utilisée pour extraire ce qui semble matcher, le vrai match étant fait ensuite en PHP, en comparant cette fois bien les chaines translitérées.Dans le cas particulier de SQLite dont les requetes sont sensibles aux accents, on fixe un peu salement en remplaçant aussi les aeiuoc par un joker, ce qui permet de faire matcher une partie des requetes ("bibliotheque" trouvera bien "bibliothèque") mais ce n'est qu'un pis-aller très francophone...
+r21503 | b_b       |  (dim. 10 août 2014) | debug commité par erreur dans r21502
+r21508 | cedric    |  (lun. 11 août 2014) | Ferme #3174 : quand on revient de la config LDAP, il faut initialiser la connexion par un appel à spip_connect_db.Par ailleurs, l'auteur n'est pas obligatoire si on revient de LDAP (double fix donc)
+r21509 | cedric    |  (lun. 11 août 2014) | indentation
+r21510 | cedric    |  (lun. 11 août 2014) | #3064 : Reparer la recherche par id_rubrique dans le selecteur ajax de rubriques
+
+SPIP-plugins-dist spip-3.0.16 -> spip-3.0.17  13 août 2014
+-------------------------------------------------------------
+
+r81358 | b_b       |  (jeu. 13 mars 2014) | report de r81357 : auto n'est pas une valeur prise en compte pour le padding, ferme http://core.spip.org/issues/3177
+r81374 | cedric    |  (ven. 14 mars 2014) | Pour les URL propres : prendre celle qui a un id_parent=0 en priorite.Si elle n'existe qu'avec un id_parent<>0, la reinserer en base avec un id_parent=0 pour eviter les collisions avec d'autres objets
+r81375 | cedric    |  (ven. 14 mars 2014) | Detection de collisions d'URLs :- on ne suffixe que si l'url identique concerne un autre objet (peut etre une url identique du même objet avec un id_parent non nul)- quand on veut piquer une ancienne URL d'un autre objet, il faut que celle plus recente soit bien differente (sinon on arrivait a piquer une URL valide au pretexte que l'objet en avait une autre identique avec un id_parent non nul)- on log mieux les reattribution et reactualisation- quand on suffixe l'URL on reappelle recursivement la fonction url_insert pour refaire tout le test de collision proprement
+r81376 | cedric    |  (ven. 14 mars 2014) | fusionner les colonnes objet/id_objet, puisqu'on ne trie de toute façon que sur l'objet. Ça permet du coup de linker l'objet concerné, ce qui est pratique, et de mieux faire ressortir le parent)
+r81377 | cedric    |  (ven. 14 mars 2014) | version
+r81448 | cedric    |  (mar. 18 mars 2014) | Revert de r80163 car r80130 a ete revert par r80558 (clair, n'est-ce pas ?)
+r81643 | cedric    |  (ven. 28 mars 2014) | BugFix sur les collisions d'URLs propres/arbo qui continuait même après être revenu en URL propre car le décodage des anciennes URLs arbo génére de nouvelles URLs arbos :Quand on decode une url arbo qui est en fait une ancienne URL car on a changé de schema d'URL, il ne faut pas regenerer de nouveaux segments arbo mais rediriger directement vers l'URL dans le nouveau schema.Pour cela on se base sur le nom de la fonction qui appelle urls_arbo_dist : si c'est urls_xx et pas urls_decoder_url : c'est un appel de compatibilité depuis un autre schema.
+r81670 | cedric    |  (lun. 31 mars 2014) | oups, r81643 avait introduit des redirections infinies d'url pour cause de / final différent (Nicolas H.)
+r81698 | cedric    |  (mar. 01 avril 2014) | nettoyer nom_site et descriptif avec filtrer_entites()
+r81730 | rasta     |  (jeu. 03 avril 2014) | Yes merci kent1… :DJe ne sais même pas comment ça pouvait continuer à marcher pour celleux qui utilisent Revisions… car charger_fonction SANS le "true" à la fin = minipres !Par ailleurs si on décide de permettre une fonction plus précise, on ne force pas la valeur du $format, on laisse celui de l'appel.Et par ailleurs de chez ailleurs, c'est dans la branche 3.0 mais pas reporté dans le trunk 3.1 du plugin.
+r82072 | b_b       |  (mer. 23 avril 2014) | report de  http://core.spip.org/projects/spip/repository/revisions/21325Correction de  http://article.gmane.org/gmane.comp.web.spip.devel/65118 : une URL dans un tableau à la SPIP fusionnait à tort la ligne suivante parce que le signe "|" était retiré en amont comme faisant partie de l'auto-lien à produire. On rajoute ce signe comme caractère ne pouvant terminer une URL.
+r82214 | fil       |  (ven. 02 mai 2014) | report de 82213
+r82275 | cedric    |  (ven. 09 mai 2014) | coquille : parenthese manquante…
+r82290 | b_b       |  (ven. 09 mai 2014) | report de r82289 : faute de frappe (Benoit)
+r82323 | cedric    |  (lun. 12 mai 2014) | il ne faut pas tenir compte de $afficher_previsu ni de $retour pour determiner si c'est bien ce formulaire forum qu'on vient de poster
+r82473 | taffit    |  (sam. 17 mai 2014) | 2sSuppression de profils ICC inutiles[ Report de 82425 ]En recherchant les profils ICC sous droit d’auteur restreint, nepermettant pas la modification (et par conséquent en violation avec lalicence GPL), les images suivantes ont été reconnues :   find . -regextype posix-extended -iregex '.*\.(jpg|png)' \              -exec sh -c 'identify -verbose "$0" \           | grep -i copyright && echo "$0"' {} \;Les profils inutiles ont donc été supprimés des images suivantes :    exiftool -icc_profile"-<=" $fichiersChaque image a été vérifiée identique, une à une, à l’image d’origine.Cerise sur le gâteau : environ 3 ko de données binaires inutiles ont étésupprimées de chaque fichier, avec pour conséquence directe unediminution de taille de ces fichiers.
+r82474 | taffit    |  (sam. 17 mai 2014) | Suppression de la propriété svn:executable inutile[ Report de 82427 ]
+r82582 | cedric    |  (lun. 19 mai 2014) | Accesibilité : le lien "modifier" n'est pas un bouton car il ne génère pas de modification immediate du document mais donne seulement accès à un formulaire de modification. Mais du coup il n'est pas dans le même flux de navigation au clavier que les boutons voisins ce qui complique son accès (Armony)On y ajoute un tabindex="0" et role="button" qui devrait améliorer ce problème
+r82863 | cedric    |  (jeu. 05 juin 2014) | envoyer un filename en .ics pour le contenu ICS aide a l'ouvrir automatiquent avec le bon outil
+r82932 | cedric    |  (mar. 10 juin 2014) | securite : ne pas déplacer un thread nul (ne devrait jamais arriver, mais sur une table mal fichue ça fait des dégats)
+r82940 | cedric    |  (mar. 10 juin 2014) | pas de critere recherche sur la table des versions, elle n'a pas de cle primaire unique
+r83048 | cedric    |  (sam. 14 juin 2014) | Ferme http://core.spip.org/issues/3211 - bugfix de r81381 : la globale $type_urls est toujours definie, et vaut 'page' par defaut, ne pas en tenir compte dans ce cas (Suske)
+r83376 | cedric    |  (jeu. 19 juin 2014) | inc/xcache et la fonction Cache de memoization n'existent plus, ils ont été renommés
+r83397 | cedric    |  (ven. 20 juin 2014) | Robustesse : eviter que la mediabox ne casse quand le reset impose un box-sizing (http://spip-grenoble.com/spip/article/knacss-et-la-mediabox-de-spip)
+r83398 | real3t    |  (ven. 20 juin 2014) | Cosmétique de lecture de code
+r83515 | cedric    |  (lun. 30 juin 2014) | Le raccourci "tiret espace" en début de texte ou après 2 retours produit un enchainement <p><br class="manualbr" /> assez malheureux.On bugfix en les ignorant, est-ce qu'il y aurait d'autres cas où l'on produit ce code ? (on suppose qu'un <br /> inséré en dur dans le texte ne doit pas être supprimé)
+r83677 | nicod     |  (jeu. 17 juil. 2014) | report de r83674
+r83688 | marcimat  |  (ven. 18 juil. 2014) | Report de r83687 : Renommer les fonctions d'insertion et de modification des groupes de mots se nomment 'groupe_mots_inserer' et 'groupe_mots_modifier' (utilisent le bon type d'objet). L'ancien nommage est conservé pour ne pas casser les utilisations existantes, tout en devenant dépréciées.Corrige http://core.spip.org/issues/3205
+r83690 | erational |  (ven. 18 juil. 2014) | report de http://zone.spip.org/trac/spip-zone/changeset/83689
+r83691 | erational |  (ven. 18 juil. 2014) | oups ... suppression des reports en trop
+r83693 | erational |  (ven. 18 juil. 2014) | </ul> et ] manquants ..désolé
+r83694 | eric      |  (ven. 18 juil. 2014) | Correction du ticket http://core.spip.org/issues/3215.On renvoie une erreur dans le cas où l'url ne permet pas de récupérer un nom de fichier d'archive.Correction du formulaire qui ne renvoyait jamais les erreurs de saisies.
+r83695 | eric      |  (ven. 18 juil. 2014) | Une micro correction supplémentaire dans le formulaire de chargement d'une archive
+r83696 | eric      |  (ven. 18 juil. 2014) | Améliorer la détection de l'invalidité de l'url de l'archive
+r83698 | erational |  (ven. 18 juil. 2014) | dans le menu configuration, ne plus proposer le format URLs historiques qui n'était plus généré on conserve le fichier urls/standard.php pour ne pas provoquer d'erreur sur les usagers qui ont choisi ce format mais il sera sans doute à supprimer en 3.1ferme le ticket http://core.spip.org/issues/3085
+r83816 | franck    |  (mar. 22 juil. 2014) | Cela ne change rien, mais permet d'avoir les bonnes informations.Spip 3.0.0 était avec "mots" 2.4.6 et "mediabox" 0.8.1, donc les bornes mini ne peuvent pas être moins grande (surtout qu'il n'y avait pas non plus de plug compatible sur la zone).Reste le cas cas de "z" possible que la borne mini soit ok, mais pas moyen de le savoir car la version 1.2.1 n'avait pas de borne max... L'unique chose qui est sûr c'est que la version 1.7.14 indiquant comme quoi elle fonctionnait en spip 3.0.
+r83818 | franck    |  (mar. 22 juil. 2014) | La première version de porte plume qui est compatible avec spip 3.0.0 est la 1.11.5
+r83820 | franck    |  (mar. 22 juil. 2014) | Cela ne change rien, mais donne les bonnes indications.Les bornes mini, doivent être ceux qui sont compatible spip 3.0.0
+r83832 | b_b       |  (mer. 23 juil. 2014) | report de r83831 : ne pas utiliser deux fois la règle User-agent: * dans le robots.txt, cf http://permalink.gmane.org/gmane.comp.web.spip.user/190163
+r83959 | yohann    |  (jeu. 31 juil. 2014) | Tester si les plugins sont actifs
+r84033 | yohann    |  (mar. 05 août 2014) | Report de [84032]
+r84151 | cedric    |  (lun. 11 août 2014) | Ferme http://core.spip.org/issues/3084 : verifier au moment de l'insertion en base si le depot n'y est pas deja, generer une erreur dans le cas contraire
+r84152 | cedric    |  (lun. 11 août 2014) | Ferme http://core.spip.org/issues/2855 en prenant des precautions pour etre sur de ne pas risquer d'echapper une vraie balise html qui contiendrait un < dans un attribut
+r84162 | cedric    |  (lun. 11 août 2014) | complément à r84152 : il ne faut pas echapper le < des commentaires HTML <!-- (d'autres cas oubliés ?)
+r84170 | cedric    |  (mar. 12 août 2014) | En reponse a http://core.spip.org/issues/2884 :Un premier jeu de tests unitaire de propre() construit a partir du comportement existant.Chaque fichier .txt contient du texte avec raccourcis SPIP, et le .html du meme nom contient la sortie attendueCe premier jeu de test est execute en lang en pour eviter la prise en charge de raccourcis typo invasifsTous les tests ne sont pas OK, car quand la sortie constatee ne semblait pas normale, on a corrige la sortie attendue dans le test.Notamment les points suivants :- un <quote> commencant par un retour ligne genere un <p><br /> en debut de blockquote- un retour ligne dans une liste ne genere pas d'autobr- un <p>paragraphe</p> html dans une liste SPIP l'interrompt (confirmer que c'est un bug?)- quelques bugs autour du gras/italique dans le title d'un raccourci lien SPIPA noter aussi les curiosites suivantes, non considerees comme des bugs ici, mais peut etre a discuter :- plusieurs espaces insecables de suite avec le raccourci tilde ou avec &nbsp; sont remplaces par un seul in fine- dans une note, un autolink disparait du title mais pas un lien explicite avec raccourci SPIP- Le raccourci hr - n'interrompt pas une liste au contraire du <p>- le raccourci liste tiret-asterisque-espace genere un li qui commence par un espace, et tiret-asterisque seul genere un li qui commence sans espacemais le raccourci tiret-espace ou tiret tout seul generent une puce suivie d'un espace insecable dans les deux casA partir de ces tests de base, on va decliner des variantes avec- lang fr chaine avec ponctuation dans les differents textes pour verifier la bonne prise en compte/non prise en compte de la typographie- des modeles de type inline et block dans les differents textes pour verifier que cela ne perturbe pas la sortie
+r84179 | cedric    |  (mar. 12 août 2014) | Suite de r84170 : variante des tests avec corrections typographiques
+r84181 | cedric    |  (mer. 13 août 2014) | Suite de r84170 : jeu de tests avec un modele inline du type <textwheel1|inline> pour verifier qu'il est bien interprete la ou il faut uniquement, et ne casse pas le paragraphage
+r84182 | cedric    |  (mer. 13 août 2014) | Corrections sur tests avec modele inline : le modele n'est pas autorise dans un title de lien + coquilles dans le modele des notes
+r84183 | cedric    |  (mer. 13 août 2014) | Suite de r84170 : jeu de tests avec un modele block du type <textwheel1|block> pour verifier qu'il est bien pris en compte la ou il faut, et ne casse pas le paragraphage.On remarque au passage plein de tests casses a cause du bug denonce par http://core.spip.org/issues/2884 : un modele block interrompt les listes ul et ol
+r84190 | cedric    |  (mer. 13 août 2014) | On supprime le dossier tests/ de cette branche stable, car ils sont tous casses et leur reparation est un chantier qui concerne la branche devOn fera eventuellement des reports de bugfix au cas par cas selon l'importanceLes tests ont ete reportes sur la branche dev par r84185 a r84189
+
 SPIP-Core spip-3.0.15 -> spip-3.0.16  13 mars 2014
 -------------------------------------------------------------
 r21232 | cedric    |  (sam. 22 févr. 2014) | Ferme #3143 : pipelines pre_edition et post_edition dans rubrique_instituer
index 9757e15..a6931f7 100644 (file)
@@ -4,7 +4,7 @@
 Rendez-vous avec votre navigateur sur la page ecrire/
 pour commencer l'installation de votre site SPIP.
 
-Votre serveur Web doit offrir php (version > 4.0.8) et MySQL.
+Votre serveur Web doit offrir php (version > 5.1.0) et MySQL ou SQLite.
 
 Pour permettre a SPIP de gerer de belles adresses (URL),
 vous devrez probablement renommer le fichier htaccess.txt
index 7bbb142..09ad864 100644 (file)
@@ -231,10 +231,10 @@ function article_instituer($id_article, $c, $calcul_rub=true) {
                $champs['id_rubrique'] = $id_parent;
 
                // si l'article etait publie
-               // et que le demandeur n'est pas admin de la rubrique
+               // et que le demandeur n'est pas admin de la rubrique de destination
                // repasser l'article en statut 'propose'.
                if ($statut == 'publie'
-               AND !autoriser('publierdans', 'rubrique', $id_rubrique))
+               AND !autoriser('publierdans', 'rubrique', $id_parent))
                        $champs['statut'] = 'prop';
        }
 
index 75acdb9..cc4359c 100644 (file)
@@ -36,12 +36,16 @@ function action_purger_dist($arg=null)
                case 'cache':
                        supprime_invalideurs();
                        @spip_unlink(_CACHE_RUBRIQUES);
-                       @spip_unlink(_CACHE_PIPELINES);
-                       @spip_unlink(_CACHE_PLUGINS_PATH);
-                       @spip_unlink(_CACHE_PLUGINS_OPT);
-                       @spip_unlink(_CACHE_PLUGINS_FCT);
                        @spip_unlink(_CACHE_CHEMIN);
                        @spip_unlink(_DIR_TMP."plugin_xml_cache.gz");
+                       // on ne supprime que _CACHE_PLUGINS_OPT qui declenche la reconstruction des 3
+                       // _CACHE_PIPELINES _CACHE_PLUGINS_PATH et _CACHE_PLUGINS_FCT
+                       // pour eviter des problemes de concurence
+                       // cf http://core.spip.org/issues/2989
+                       //@spip_unlink(_CACHE_PIPELINES);
+                       //@spip_unlink(_CACHE_PLUGINS_PATH);
+                       //@spip_unlink(_CACHE_PLUGINS_FCT);
+                       @spip_unlink(_CACHE_PLUGINS_OPT);
                        purger_repertoire(_DIR_CACHE,array('subdir'=>true));
                        purger_repertoire(_DIR_AIDE);
                        purger_repertoire(_DIR_VAR.'cache-css');
index 0e1354b..31a988c 100644 (file)
@@ -101,6 +101,7 @@ function admin_objet()
        $trouver_table = charger_fonction('trouver_table','base');
        $objets = urls_liste_objets(false);
        $objets = array_diff($objets, array('rubrique'));
+       $objets = array_reverse($objets);
        array_unshift($objets, 'rubrique');
        foreach ($objets as $obj) {
                $type = $obj;
index 5f5394d..aae6be1 100644 (file)
@@ -142,7 +142,7 @@ function lister_tables_objets_sql($table_sql=null, $desc=array()){
                                        array(
                                                'champ' => 'statut',
                                                'publie' => 'publie',
-                                               'previsu' => 'publie,prop,prepa',
+                                               'previsu' => 'publie,prop,prepa/auteur',
                                                'post_date' => 'date',
                                                'exception' => 'statut'
                                        )
index e50229a..3c630ab 100644 (file)
@@ -1,5 +1,4 @@
 <?php
-
 /***************************************************************************\
  *  SPIP, Systeme de publication pour l'internet                           *
  *                                                                         *
@@ -16,79 +15,78 @@ include_spip('inc/actions');
 include_spip('inc/texte');
 
 // http://doc.spip.org/@exec_rechercher_dist
-function exec_rechercher_dist()
-{
+function exec_rechercher_dist(){
        $id = intval(_request('id'));
        $exclus = intval(_request('exclus'));
        $rac = spip_htmlentities(_request('rac'));
        $type = _request('type');
-       $do  = _request('do');
+       $do = _request('do');
        if (preg_match('/^\w*$/', $do))
-         $r = exec_rechercher_args($id, $type, $exclus, $rac, $do);
+               $r = exec_rechercher_args($id, $type, $exclus, $rac, $do);
        else $r = '';
        ajax_retour($r);
 }
 
 // http://doc.spip.org/@exec_rechercher_args
-function exec_rechercher_args($id, $type, $exclus, $rac, $do)
-{
+function exec_rechercher_args($id, $type, $exclus, $rac, $do){
        if (!$do) $do = 'aff';
 
        $where = preg_split(",\s+,", $type);
-       if ($where) {
-               foreach ($where as $k => $v) 
-                       $where[$k] = "'%" . substr(str_replace("%","\%", sql_quote($v)),1,-1) . "%'";
+       if ($where){
+               foreach ($where as $k => $v){
+                       $where[$k] = "'%" . substr(str_replace("%", "\%", sql_quote($v,'','string')), 1, -1) . "%'";
+               }
                $where_titre = ("(titre LIKE " . join(" AND titre LIKE ", $where) . ")");
                $where_desc = ("(descriptif LIKE " . join(" AND descriptif LIKE ", $where) . ")");
-               $where_id = ("(id_rubrique = " . join(" AND id_rubrique = ", $where) . ")");
-               } else {
+               $where_id = ("(id_rubrique = " . intval($type) . ")");
+       } else {
                $where_titre = " 1=2";
                $where_desc = " 1=2";
                $where_id = " 1=2";
        }
 
-       if ($exclus) {
+       if ($exclus){
                include_spip('inc/rubriques');
                $where_exclus = " AND " . sql_in('id_rubrique', calcul_branche_in($exclus), 'NOT');
-       } else  $where_exclus = '';
+       } else  $where_exclus = '';
 
        $res = sql_select("id_rubrique, id_parent, titre", "spip_rubriques", "$where_id$where_exclus");
 
        $points = $rub = array();
 
-       while ($row = sql_fetch($res)) {
+       while ($row = sql_fetch($res)){
                $id_rubrique = $row["id_rubrique"];
-               $rub[$id_rubrique]["titre"] = typo ($row["titre"]);
+               $rub[$id_rubrique]["titre"] = typo($row["titre"]);
                $rub[$id_rubrique]["id_parent"] = $row["id_parent"];
-               $points[$id_rubrique] = $points[$id_rubrique] + 3;
+               $points[$id_rubrique] = $points[$id_rubrique]+3;
        }
        $res = sql_select("id_rubrique, id_parent, titre", "spip_rubriques", "$where_titre$where_exclus");
 
-       while ($row = sql_fetch($res)) {
+       while ($row = sql_fetch($res)){
                $id_rubrique = $row["id_rubrique"];
-               $rub[$id_rubrique]["titre"] = typo ($row["titre"]);
+               $rub[$id_rubrique]["titre"] = typo($row["titre"]);
                $rub[$id_rubrique]["id_parent"] = $row["id_parent"];
                if (isset($points[$id_rubrique]))
-                 $points[$id_rubrique] += 2;
+                       $points[$id_rubrique] += 2;
                else $points[$id_rubrique] = 0;
        }
        $res = sql_select("id_rubrique, id_parent, titre", "spip_rubriques", "$where_desc$where_exclus");
 
-       while ($row = sql_fetch($res)) {
+       while ($row = sql_fetch($res)){
                $id_rubrique = $row["id_rubrique"];
-               $rub[$id_rubrique]["titre"] = typo ($row["titre"]);
+               $rub[$id_rubrique]["titre"] = typo($row["titre"]);
                $rub[$id_rubrique]["id_parent"] = $row["id_parent"];
                if (isset($points[$id_rubrique]))
-                 $points[$id_rubrique] += 1;
+                       $points[$id_rubrique] += 1;
                else $points[$id_rubrique] = 0;
        }
 
-       if ($points) {
+       if ($points){
                arsort($points);
                $style = " style='background-image: url(" . chemin_image('secteur-12.png') . ")'";
-               foreach($rub as $k => $v) {
+               foreach ($rub as $k => $v){
                        $rub[$k]['atts'] = ($v["id_parent"] ? $style : '')
-                       . " class='petite-rubrique'";
+                               . " class='petite-rubrique'";
                }
        }
 
@@ -101,35 +99,34 @@ function exec_rechercher_args($id, $type, $exclus, $rac, $do)
 // ==> attention a composer le message d'erreur avec au moins 2 balises
 
 // http://doc.spip.org/@proposer_item
-function proposer_item ($ids, $titles, $rac, $type, $do)
-{
+function proposer_item($ids, $titles, $rac, $type, $do){
 
        if (!$ids)
                return "<br /><br /><div style='padding: 5px; color: red;'><b>"
-               .spip_htmlentities($type)
-               ."</b> :  "._T('avis_aucun_resultat')."</div>";
+               . spip_htmlentities($type)
+               . "</b> :  " . _T('avis_aucun_resultat') . "</div>";
 
        $ret = '';
        $info = generer_url_ecrire('informer', "type=rubrique&rac=$rac&id=");
 
-       $onClick = "aff_selection(this.firstChild.title,'$rac". "_selection','$info', event)";
+       $onClick = "aff_selection(this.firstChild.title,'$rac" . "_selection','$info', event)";
 
        $ondbClick = "$do(this.firstChild.firstChild.nodeValue,this.firstChild.title,'selection_rubrique', 'id_parent');";
 
-       foreach($ids as $id => $bof) {
-                               
+       foreach ($ids as $id => $bof){
+
                $titre = strtr(str_replace("'", "&#8217;", str_replace('"', "&#34;", textebrut($titles[$id]["titre"]))), "\n\r", "  ");
 
                $ret .= "<div class='highlight off'\nonclick=\"changerhighlight(this); "
-               . $onClick
-               . "\"\nondblclick=\""
-               . $ondbClick
-               . $onClick
-               . " \"><div"
-               . $titles[$id]["atts"]
-               . " title='$id'>&nbsp; "
-               . $titre
-               . "</div></div>";
+                       . $onClick
+                       . "\"\nondblclick=\""
+                       . $ondbClick
+                       . $onClick
+                       . " \"><div"
+                       . $titles[$id]["atts"]
+                       . " title='$id'>&nbsp; "
+                       . $titre
+                       . "</div></div>";
        }
        return $ret;
 }
index f4bc7bd..be9e706 100644 (file)
@@ -246,10 +246,13 @@ function auth_init_droits($row)
        auth_trace($row);
 
        // Administrateurs
-       if ($connect_statut == '0minirezo') {
-               if (is_array($GLOBALS['visiteur_session']['restreint']))
+       if (in_array($connect_statut, explode(',', _STATUT_AUTEUR_RUBRIQUE))) {
+               if (is_array($GLOBALS['visiteur_session']['restreint'])) {
                        $connect_id_rubrique = $GLOBALS['visiteur_session']['restreint'];
-               $connect_toutes_rubriques = !$connect_id_rubrique;
+               }
+               if ($connect_statut == '0minirezo') { 
+                       $connect_toutes_rubriques = !$connect_id_rubrique;
+               }
        }
        // Pour les redacteurs, inc_version a fait l'initialisation minimale
 
index 8474d5c..950ddbd 100644 (file)
@@ -425,7 +425,8 @@ function autoriser_rubrique_creerrubriquedans_dist($faire, $type, $id, $qui, $op
 function autoriser_rubrique_creerarticledans_dist($faire, $type, $id, $qui, $opt) {
        return
                $id
-               AND autoriser('voir','rubrique',$id);
+               AND autoriser('voir','rubrique',$id)
+               AND autoriser('creer', 'article');
 }
 
 
@@ -889,7 +890,8 @@ function liste_rubriques_auteur($id_auteur, $raz=false) {
        }
 
        // Affecter l'auteur session le cas echeant
-       if ($GLOBALS['visiteur_session']['id_auteur'] == $id_auteur)
+       if (isset($GLOBALS['visiteur_session']['id_auteur'])
+         AND $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur)
                $GLOBALS['visiteur_session']['restreint'] = $rubriques;
 
 
index 9c64f5b..432cf26 100644 (file)
@@ -21,17 +21,25 @@ include_spip('inc/config');
  * @return array
  */
 function cvtconf_formulaire_charger($flux){
-       if ($form = $flux['args']['form']
-         AND strncmp($form,'configurer_',11)==0 // un #FORMULAIRE_CONFIGURER_XXX
-               AND !charger_fonction("charger","formulaires/$form/",true) // sans fonction charger()
-               ) {
-
-               $flux['data'] = cvtconf_formulaires_configurer_recense($form);
-               $flux['data']['editable'] = true;
-               if (_request('var_mode')=='configurer' AND autoriser('webmestre')){
-                       if (!_AJAX) var_dump($flux['data']);
-                       // reinjecter pour la trace au traitement
-                       $flux['data']['_hidden'] = "<input type='hidden' name='var_mode' value='configurer' />";
+       if (
+               $form = $flux['args']['form']
+               and strncmp($form,'configurer_',11)==0 // un #FORMULAIRE_CONFIGURER_XXX
+       ) {
+               // Pour tous les formulaires CONFIGURER, ayant une fonction charger ou pas, on teste si autorisé
+               include_spip('inc/autoriser');
+               if (!autoriser('configurer', "_$form")) {
+                       return false;
+               }
+               
+               // S'il n'y a pas de fonction charger(), on génère un contexte automatiquement
+               if (!charger_fonction("charger","formulaires/$form/",true)) {
+                       $flux['data'] = cvtconf_formulaires_configurer_recense($form);
+                       $flux['data']['editable'] = true;
+                       if (_request('var_mode')=='configurer' AND autoriser('webmestre')){
+                               if (!_AJAX) var_dump($flux['data']);
+                               // reinjecter pour la trace au traitement
+                               $flux['data']['_hidden'] = "<input type='hidden' name='var_mode' value='configurer' />";
+                       }
                }
        }
        return $flux;
index d1dbeac..e433095 100644 (file)
@@ -12,7 +12,7 @@
 
 /**
  * Ce fichier gère l'obtention de données distantes
- * 
+ *
  * @package SPIP\Core\Distant
 **/
 if (!defined('_ECRIRE_INC_VERSION')) return;
@@ -22,7 +22,7 @@ if (!defined('_INC_DISTANT_CONTENT_ENCODING')) define('_INC_DISTANT_CONTENT_ENCO
 if (!defined('_INC_DISTANT_USER_AGENT')) define('_INC_DISTANT_USER_AGENT', 'SPIP-' . $GLOBALS['spip_version_affichee'] . " (" . $GLOBALS['home_server'] . ")");
 if (!defined('_INC_DISTANT_MAX_SIZE')) define('_INC_DISTANT_MAX_SIZE',2097152);
 
-define('_REGEXP_COPIE_LOCALE', ',' . 
+define('_REGEXP_COPIE_LOCALE', ',' .
        preg_replace('@^https?:@', 'https?:', $GLOBALS['meta']['adresse_site'])
        . "/?spip.php[?]action=acceder_document.*file=(.*)$,");
 
@@ -151,10 +151,19 @@ function prepare_donnees_post($donnees, $boundary = '') {
                        $chaine = '';
                        if (is_array($donnees)) {
                                foreach ($donnees as $cle => $valeur) {
-                                       $chaine .= "\r\n--$boundary\r\n";
-                                       $chaine .= "Content-Disposition: form-data; name=\"$cle\"\r\n";
-                                       $chaine .= "\r\n";
-                                       $chaine .= $valeur;
+                                       if (is_array($valeur)) {
+                                               foreach ($valeur as $val2) {
+                                                       $chaine .= "\r\n--$boundary\r\n";
+                                                       $chaine .= "Content-Disposition: form-data; name=\"{$cle}[]\"\r\n";
+                                                       $chaine .= "\r\n";
+                                                       $chaine .= $val2;
+                                               }
+                                       } else {
+                                               $chaine .= "\r\n--$boundary\r\n";
+                                               $chaine .= "Content-Disposition: form-data; name=\"$cle\"\r\n";
+                                               $chaine .= "\r\n";
+                                               $chaine .= $valeur;
+                                       }
                                }
                                $chaine .= "\r\n--$boundary\r\n";
                        }
@@ -166,7 +175,7 @@ function prepare_donnees_post($donnees, $boundary = '') {
                                foreach ($donnees as $cle => $valeur) {
                                        if (is_array($valeur)) {
                                                foreach ($valeur as $val2) {
-                                                       $chaine[] = rawurlencode($cle).'='.rawurlencode($val2);
+                                                       $chaine[] = rawurlencode($cle).'[]='.rawurlencode($val2);
                                                }
                                        } else {
                                                $chaine[] = rawurlencode($cle).'='.rawurlencode($valeur);
@@ -256,6 +265,7 @@ function recuperer_lapage($url, $trans = false, $get = 'GET', $taille_max = _INC
                return false;
        }
 
+       $result = '';
        // Sauf en fopen, envoyer le flux d'entree
        // et recuperer les en-tetes de reponses
        if ($fopen)
@@ -264,14 +274,19 @@ function recuperer_lapage($url, $trans = false, $get = 'GET', $taille_max = _INC
                $headers = recuperer_entetes($f, $date_verif);
                if (is_numeric($headers)){
                        fclose($f);
-                       // Chinoisierie inexplicable pour contrer 
+                       // Chinoisierie inexplicable pour contrer
                        // les actions liberticides de l'empire du milieu
                        if ($headers){
                                spip_log("HTTP status $headers pour $url");
                                return false;
                        }
-                       elseif ($result = @file_get_contents($url))
-                               return array('', $result);
+                       $t = @parse_url($url);
+                       $host = $t['host'];
+                       if (!need_proxy($host)
+                               AND $result = @file_get_contents($url)){
+                               // on peuple les headers de vide et on continue
+                               $headers = array('');
+                       }
                        else
                                return false;
                }
@@ -291,9 +306,11 @@ function recuperer_lapage($url, $trans = false, $get = 'GET', $taille_max = _INC
        $gz = preg_match(",\bContent-Encoding: .*gzip,is", $headers) ?
                (_DIR_TMP . md5(uniqid(mt_rand())) . '.tmp.gz') : '';
 
-#      spip_log("entete ($trans $copy $gz)\n$headers"); 
-       $result = recuperer_body($f, $taille_max, $gz ? $gz : ($copy ? $trans : ''));
-       fclose($f);
+#      spip_log("entete ($trans $copy $gz)\n$headers");
+       if (!$result){
+               $result = recuperer_body($f, $taille_max, $gz ? $gz : ($copy ? $trans : ''));
+               fclose($f);
+       }
        if (!$result)
                return array($headers, $result);
 
@@ -480,6 +497,7 @@ function fichier_copie_locale($source){
 #$a['taille'] = intval
 #$a['extension'] = chaine
 #$a['fichier'] = chaine
+#$a['mime_type'] = chaine
 
 // http://doc.spip.org/@recuperer_infos_distantes
 function recuperer_infos_distantes($source, $max = 0, $charger_si_petite_image = true){
@@ -598,6 +616,7 @@ function recuperer_infos_distantes($source, $max = 0, $charger_si_petite_image =
                        $a['titre'] = corriger_caracteres(trim($regs[1]));
                if (!$a['taille']) $a['taille'] = strlen($page); # a peu pres
        }
+       $a['mime_type']=$mime_type;
 
        return $a;
 }
@@ -660,7 +679,8 @@ function init_http($method, $url, $refuse_gz = false, $referer = '', $datas = ""
        $f = lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $refuse_gz, $referer, $datas, $vers, $date);
        if (!$f){
                // fallback : fopen
-               if (!_request('tester_proxy')){
+               if (!need_proxy($host)
+                       AND !_request('tester_proxy')){
                        $f = @fopen($url, "rb");
                        spip_log("connexion vers $url par simple fopen");
                        $fopen = true;
@@ -680,10 +700,19 @@ function lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $
        $http_proxy = need_proxy($host);
        if ($user) $user = urlencode($user[0]) . ":" . urlencode($user[1]);
 
+       $connect = "";
        if ($http_proxy){
-               $path = (($scheme=='ssl') ? 'https://' : "$scheme://")
-                       . (!$user ? '' : "$user@")
-                       . "$host" . (($port!=80) ? ":$port" : "") . $path;
+               if (defined('_PROXY_HTTPS_VIA_CONNECT') AND $scheme=="ssl"){
+                       $path_host = (!$user ? '' : "$user@") . $host . (($port!=80) ? ":$port" : "");
+                       $connect = "CONNECT " .$path_host." $vers\r\n"
+                               ."Host: $path_host\r\n"
+                               ."Proxy-Connection: Keep-Alive\r\n";
+               }
+               else {
+                       $path = (($scheme=='ssl') ? 'https://' : "$scheme://")
+                               . (!$user ? '' : "$user@")
+                               . "$host" . (($port!=80) ? ":$port" : "") . $path;
+               }
                $t2 = @parse_url($http_proxy);
                $first_host = $t2['host'];
                if (!($port = $t2['port'])) $port = 80;
@@ -693,9 +722,34 @@ function lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $
        else
                $first_host = $noproxy . $host;
 
-       $f = @fsockopen($first_host, $port);
-       spip_log("Recuperer $path sur $first_host:$port par $f");
-       if (!$f) return false;
+       if ($connect){
+               $streamContext = stream_context_create(array('ssl' => array('verify_peer' => false, 'allow_self_signed' => true)));
+               $f = @stream_socket_client("tcp://$first_host:$port", $nError, $sError, 10, STREAM_CLIENT_CONNECT, $streamContext);
+               spip_log("Recuperer $path sur $first_host:$port par $f (via CONNECT)","connect");
+               if (!$f) return false;
+               stream_set_timeout($f, 10);
+
+               fputs($f, $connect);
+               fputs($f, "\r\n");
+               $res = fread($f, 1024);
+               if (!$res
+                 OR !count($res = explode(' ',$res))
+                 OR $res[1]!=='200'){
+                       spip_log("Echec CONNECT sur $first_host:$port","connect"._LOG_INFO_IMPORTANTE);
+                       fclose($f);
+                       return false;
+               }
+               // important, car sinon on lit trop vite et les donnees ne sont pas encore dispo
+               stream_set_blocking($f, true);
+               // envoyer le handshake
+               stream_socket_enable_crypto($f, true,   STREAM_CRYPTO_METHOD_SSLv23_CLIENT);
+               spip_log("OK CONNECT sur $first_host:$port","connect");
+       }
+       else {
+               $f = @fsockopen($first_host, $port);
+               spip_log("Recuperer $path sur $first_host:$port par $f");
+               if (!$f) return false;
+       }
 
        $site = $GLOBALS['meta']["adresse_site"];
 
@@ -715,4 +769,3 @@ function lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $
        return $f;
 }
 
-?>
index 220645f..39fe12e 100644 (file)
@@ -189,6 +189,39 @@ function filtrer($filtre) {
        }
 }
 
+/*
+ *
+ * [(#CALCUL|set{toto})] enregistre le résultat de #CALCUL
+ *           dans la variable toto et renvoie vide
+ *
+ * [(#CALCUL|set{toto,1})] enregistre le résultat de #CALCUL
+ *           dans la variable toto et renvoie la valeur
+ *
+ */
+function filtre_set(&$Pile, $val, $key, $continue = null) {
+       $Pile['vars'][$key] = $val;
+       return $continue ? $val : '';
+}
+
+/*
+ * [(#TRUC|debug{avant}|calcul|debug{apres}|etc)] affiche
+ *   la valeur de #TRUC avant et après le calcul
+ */
+function filtre_debug($val, $key=null) {
+       $debug = (
+               is_null($key) ? '' :  (var_export($key,true)." = ")
+       ) . var_export($val, true);
+
+       include_spip('inc/autoriser');
+       if (autoriser('webmestre'))
+               echo "<div class='spip_debug'>\n",$debug,"</div>\n";
+
+       spip_log($debug, 'debug');
+
+       return $val;
+}
+
+
 // fonction generique d'entree des filtres images
 // accepte en entree un texte complet, un img-log (produit par #LOGO_XX),
 // un tag <img ...> complet, ou encore un nom de fichier *local* (passer
@@ -378,7 +411,12 @@ function filtrer_entites($texte) {
        // filtrer
        $texte = html2unicode($texte);
        // remettre le tout dans le charset cible
-       return unicode2charset($texte);
+       $texte = unicode2charset($texte);
+       // cas particulier des " et ' qu'il faut filtrer aussi
+       // (on le faisait deja avec un &quot;)
+       if (strpos($texte,"&#")!==false)
+               $texte = str_replace(array("&#039;","&#39;","&#034;","&#34;"), array("'","'",'"','"'), $texte);
+       return $texte;
 }
 
 // caracteres de controle - http://www.w3.org/TR/REC-xml/#charsets
@@ -470,7 +508,7 @@ function recuperer_numero($texte) {
        if (preg_match(
        ",^[[:space:]]*([0-9]+)([.)]|".chr(194).'?'.chr(176).")[[:space:]]+,S",
        $texte, $regs))
-               return intval($regs[1]);
+               return strval($regs[1]);
        else
                return '';
 }
@@ -1132,6 +1170,10 @@ function affdate_heure($numdate) {
  * @param string $date_fin
  * @param string $horaire
  * @param string $forme
+ *   abbr pour afficher le nom du jour en abbrege (Dim. au lieu de Dimanche)
+ *   annee pour forcer l'affichage de l'annee courante
+ *   jour pour forcer l'affichage du nom du jour
+ *   hcal pour pour avoir un markup microformat abbr
  * @return string
  */
 function affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui', $forme=''){
@@ -1169,7 +1211,7 @@ function affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui', $forme=''){
                        }else{
                                // Le <abbr...>lundi 20 fevrier de 18h00</abbr> a <abbr...>20h00</abbr>
                                if($dtabbr && $dtstart && $dtend)
-                                       $s = spip_ucfirst(_T('date_fmt_jour_heure_debut_fin_abbr',array('jour'=>$s,'heure_debut'=>$hd,'heure_fin'=>$hf,'dtstart'=>$dtstart,'dtend'=>$dtend,'dtabbr'=>$dtabbr)));
+                                       $s = _T('date_fmt_jour_heure_debut_fin_abbr',array('jour'=>spip_ucfirst($s),'heure_debut'=>$hd,'heure_fin'=>$hf,'dtstart'=>$dtstart,'dtend'=>$dtend,'dtabbr'=>$dtabbr));
                                // Le lundi 20 fevrier de 18h00 a 20h00
                                else
                                        $s = spip_ucfirst(_T('date_fmt_jour_heure_debut_fin',array('jour'=>$s,'heure_debut'=>$hd,'heure_fin'=>$hf)));
@@ -1186,7 +1228,7 @@ function affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui', $forme=''){
                if(!$h)
                        $date_debut = jour($d);
                else
-                       $date_debut = $affdate($d);
+                       $date_debut = affdate_jourcourt($d,date("Y",$date_fin));
                $date_fin = $affdate($f);
                if($jour){
                        $nomjour_debut = nom_jour($d,$abbr);
@@ -1204,13 +1246,13 @@ function affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui', $forme=''){
                $s = _T('date_fmt_periode',array('date_debut' => $date_debut,'date_fin'=>$date_fin));
        }
        else {
-               $date_debut = affdate($d);
-               $date_fin = affdate($f);
+               $date_debut = affdate_jourcourt($d,date("Y",$date_fin));
+               $date_fin = $affdate($f);
                if($jour){
                        $nomjour_debut = nom_jour($d,$abbr);
-                       $date_debut = _T('date_fmt_jour_periode',array('nomjour'=>$nomjour_debut,'jour' => $date_debut));
+                       $date_debut = _T('date_fmt_jour',array('nomjour'=>$nomjour_debut,'jour' => $date_debut));
                        $nomjour_fin = nom_jour($f,$abbr);
-                       $date_fin = _T('date_fmt_jour_periode',array('nomjour'=>$nomjour_fin,'jour' => $date_fin));
+                       $date_fin = _T('date_fmt_jour',array('nomjour'=>$nomjour_fin,'jour' => $date_fin));
                }
                if ($h){
                        $date_debut = _T('date_fmt_jour_heure',array('jour'=>$date_debut,'heure'=>$hd)); 
@@ -2275,16 +2317,17 @@ function concat(){
 
 
 // http://doc.spip.org/@charge_scripts
-function charge_scripts($scripts) {
-  $flux = "";
-  $args = is_array($scripts)?$scripts:explode("|",$scripts);
-  foreach($args as $script) {
-    if(preg_match(",^\w+$,",$script)) {
-      $path = find_in_path("javascript/$script.js");
-      if($path) $flux .= spip_file_get_contents($path);
-    }
-  }
-  return $flux;
+// http://doc.spip.org/@charge_scripts
+function charge_scripts($files, $script = true) {
+       $flux = "";
+       foreach(is_array($files)?$files:explode("|",$files) as $file) {
+               if (!is_string($file)) continue;
+               if ($script)
+                       $file = preg_match(",^\w+$,",$file) ? "javascript/$file.js" : '';
+               if ($file) $path = find_in_path($file);
+               if ($path) $flux .= spip_file_get_contents($path);
+       }
+       return $flux;
 }
 
 
@@ -2938,6 +2981,7 @@ function generer_info_entite($id_objet, $type_objet, $info, $etoile=""){
        if (!$etoile
                AND is_array($traitement)
          AND (isset($traitement[$table_sql]) OR isset($traitement[0]))){
+               include_spip('inc/texte');
                $traitement = $traitement[isset($traitement[$table_sql]) ? $table_sql : 0];
                $traitement = str_replace('%s', "'".texte_script($info_generee)."'", $traitement);
                // FIXME: $connect et $Pile[0] font souvent partie des traitements.
index b4b8e13..8d310fb 100644 (file)
@@ -44,7 +44,8 @@ function parametres_css_prive(){
        $args['p'] = substr(md5($GLOBALS['meta']['plugin']),0,4);
        $args['themes'] = implode(',',lister_themes_prives());
        $args['ltr'] = $GLOBALS['spip_lang_left'];
-       $args['md5b'] = md5_boutons_plugins(); // un md5 des menus : si un menu change il faut maj la css
+       // un md5 des menus : si un menu change il faut maj la css
+       $args['md5b'] = (function_exists('md5_boutons_plugins')?md5_boutons_plugins():'');
 
        $c = (is_array($visiteur_session)
                AND is_array($visiteur_session['prefs']))
index a30535e..03620a1 100644 (file)
@@ -750,10 +750,14 @@ function _image_creer_vignette($valeurs, $maxWidth, $maxHeight, $process='AUTO',
                else
                // imagick (php4-imagemagick)
                if ($process == 'imagick') {
+
                        $vignette = "$destination.".$format_sortie;
-                       $handle = imagick_readimage($image);
-                       imagick_resize($handle, $destWidth, $destHeight, IMAGICK_FILTER_LANCZOS, _IMG_IMAGICK_QUALITE / 100);
-                       imagick_write($handle, $vignette);
+
+                       $imagick = new Imagick();
+                       $imagick->readImage($image);
+                       $imagick->resizeImage($destWidth, $destHeight, Imagick::FILTER_LANCZOS, 1 );//, IMAGICK_FILTER_LANCZOS, _IMG_IMAGICK_QUALITE / 100);
+                       $imagick->writeImage($vignette);
+
                        if (!@file_exists($vignette)) {
                                spip_log("echec imagick sur $vignette");
                                return;
index d96b5b9..a688129 100644 (file)
@@ -55,7 +55,7 @@ function inc_genie_dist($taches = array()) {
        include_spip('inc/queue');
 
        if (_request('exec')=='job_queue')
-               return;
+               return false;
 
        $force_jobs = array();
        // l'ancienne facon de lancer une tache cron immediatement
@@ -66,7 +66,7 @@ function inc_genie_dist($taches = array()) {
        
        // et on passe la main a la gestion de la queue !
        // en forcant eventuellement les jobs ajoute a l'instant
-       queue_schedule(count($force_jobs)?$force_jobs:null);
+       return queue_schedule(count($force_jobs)?$force_jobs:null);
 }
 
 //
index 2714222..6be2016 100644 (file)
@@ -31,7 +31,7 @@ $GLOBALS['codes_langues'] = array(
        'as' => "Assamese",
        'ast' => "asturianu",
        'ay' => "Aymara",
-       'az' => "&#1040;&#1079;&#1241;&#1088;&#1073;&#1072;&#1112;&#1209;&#1072;&#1085;",
+       'az' => "Az&#601;rbaycan dili",
        'ba' => "Bashkir",
        'be' => "&#1041;&#1077;&#1083;&#1072;&#1088;&#1091;&#1089;&#1082;&#1110;",
        'ber_tam' => "Tamazigh",
@@ -103,11 +103,12 @@ $GLOBALS['codes_langues'] = array(
        'ja' => "&#26085;&#26412;&#35486;",
        'jv' => "Javanese",
        'ka' => "&#4325;&#4304;&#4320;&#4311;&#4323;&#4314;&#4312;",
-       'kk' => "&#2325;&#2379;&#2306;&#2325;&#2339;&#2368;",
+       'kk' => "&#1179;&#1072;&#1079;&#1072;&#1179;&#32;&#1090;&#1110;&#1083;&#1110;", // Kazakh
        'kl' => "kalaallisut",
        'km' => "Cambodian",
        'kn' => "Kannada",
        'ko' => "&#54620;&#44397;&#50612;",
+       'kok' => "&#2325;&#2379;&#2306;&#2325;&#2339;&#2368;", // Konkani
        'ks' => "Kashmiri",
        'ku' => "&#1705;&#1608;&#1585;&#1583;&#1740;",
        'ky' => "Kirghiz",
@@ -153,6 +154,7 @@ $GLOBALS['codes_langues'] = array(
        'pa' => "Punjabi",
        'pbb' => 'Nasa Yuwe',
        'pl' => "polski",
+       'prs' => "&#1583;&#1585;&#1740;", // ISO-639-3 Dari (Afghanistan)
        'ps' => "&#1662;&#1690;&#1578;&#1608;",
        'pt' => "Portugu&#234;s",
        'pt_br' => "Portugu&#234;s do Brasil",
@@ -203,7 +205,7 @@ $GLOBALS['codes_langues'] = array(
        'ug' => "Uighur",
        'uk' => "&#1091;&#1082;&#1088;&#1072;&#1111;&#1085;&#1089;&#1100;&#1082;&#1072;",
        'ur' => "&#1649;&#1585;&#1583;&#1608;",
-       'uz' => "U'zbek",
+       'uz' => "O'zbekcha",
        'vi' => "Ti&#7871;ng Vi&#7879;t",
        'vo' => "Volapuk",
        'wa' => "walon",
index 1eb1be1..449d3f3 100644 (file)
 //   this software the author can not be responsible.
 //   The use of this software is at the risk of the user.
 //
-// --------------------------------------------------------------------------------
-// $Id: pclzip.php 19990 2012-11-03 12:57:57Z eric@smellup.net $
-// --------------------------------------------------------------------------------
+
+  // personnalisations spip
+  if (!defined('PCLZIP_TEMPORARY_DIR')) {
+    define('PCLZIP_TEMPORARY_DIR', _DIR_TMP);
+  }
+  if (!function_exists('gzopen') && function_exists('gzopen64')) {
+    function gzopen($filename, $mode, $use_include_path = 0) {
+      return gzopen64($filename, $mode, $use_include_path);
+    }
+  }
+  // fin personnalisations spip
 
   // ----- Constants
   if (!defined('PCLZIP_READ_BLOCK_SIZE')) {
@@ -63,7 +71,7 @@
   // define( 'PCLZIP_TEMPORARY_DIR', '/temp/' );
   // define( 'PCLZIP_TEMPORARY_DIR', 'C:/Temp/' );
   if (!defined('PCLZIP_TEMPORARY_DIR')) {
-    define( 'PCLZIP_TEMPORARY_DIR', _DIR_TMP );
+    define( 'PCLZIP_TEMPORARY_DIR', '' );
   }
 
   // ----- Optional threshold ratio for use of temporary files
index c5b09d1..b4265cf 100644 (file)
@@ -503,7 +503,7 @@ function ecrire_plugin_actifs($plugin,$pipe_recherche=false,$operation='raz') {
        $header = strtolower(implode(",",$header));
        ecrire_meta('plugin_header',substr($header,0,900));
        if (!isset($GLOBALS['spip_header_silencieux']) OR !$GLOBALS['spip_header_silencieux'])
-               ecrire_fichier(_DIR_VAR."config.txt", defined('_HEADER_COMPOSED_BY') ? _HEADER_COMPOSED_BY:"Composed-By: SPIP" . ' '. $GLOBALS['spip_version_affichee'] . " @ www.spip.net + " . $header);
+               ecrire_fichier(_DIR_VAR."config.txt", (defined('_HEADER_COMPOSED_BY') ? _HEADER_COMPOSED_BY:"Composed-By: SPIP") . ' '. $GLOBALS['spip_version_affichee'] . " @ www.spip.net + " . $header);
        else
                @unlink(_DIR_VAR."config.txt");
        // generer charger_plugins_chemin.php
index c8707e3..bef3c7c 100644 (file)
@@ -69,7 +69,7 @@ function precharger_objet($type, $id_objet, $id_rubrique=0, $lier_trad=0, $champ
                // autre ==> la derniere rubrique cree
                if (!$row['id_rubrique']) {
                        if ($connect_id_rubrique)
-                               $row['id_rubrique'] = $id_rubrique = $connect_id_rubrique[0]
+                               $row['id_rubrique'] = $id_rubrique = current($connect_id_rubrique)
                        else {
                                $row_rub = sql_fetsel("id_rubrique", "spip_rubriques", "", "", "id_rubrique DESC", 1);
                                $row['id_rubrique'] = $id_rubrique = $row_rub['id_rubrique'];
index a99d432..2639568 100644 (file)
@@ -268,6 +268,7 @@ function queue_start_job($row){
  *
  * @param array $force_jobs
  *   list of id_job to execute when provided
+ * @return null|false
  */
 function queue_schedule($force_jobs = null){
        $time = time();
@@ -283,6 +284,8 @@ function queue_schedule($force_jobs = null){
        }
 
        include_spip('base/abstract_sql');
+       // on ne peut rien faire si pas de connexion SQL
+       if (!spip_connect())  return false;
 
        if (!defined('_JQ_MAX_JOBS_TIME_TO_EXECUTE')){
                $max_time = ini_get('max_execution_time')/2;
@@ -343,6 +346,7 @@ function queue_schedule($force_jobs = null){
        else
                queue_update_next_job_time();
 
+       return true;
 }
 
 /**
index 28bcbc3..e289c73 100644 (file)
@@ -58,14 +58,24 @@ function liste_des_jointures() {
 }
 
 function expression_recherche($recherche, $options) {
+       // ne calculer qu'une seule fois l'expression par hit
+       // (meme si utilisee dans plusieurs boucles)
+       static $expression = array();
+       $key = serialize(array($recherche, $options['preg_flags']));
+       if (isset($expression[$key]))
+               return $expression[$key];
+
        $u = $GLOBALS['meta']['pcre_u'];
+       if ($u AND strpos($options['preg_flags'],$u)===false)
+               $options['preg_flags'] .= $u;
        include_spip('inc/charsets');
-       $recherche = trim(translitteration($recherche));
+       $recherche = trim($recherche);
 
        $is_preg = false;
        if (substr($recherche,0,1)=='/' AND substr($recherche,-1,1)=='/'){
                // c'est une preg
-               $preg = $recherche.$options['preg_flags'];
+               $recherche_trans = translitteration($recherche);
+               $preg = $recherche_trans.$options['preg_flags'];
                $is_preg = true;
        }
        else{
@@ -85,9 +95,10 @@ function expression_recherche($recherche, $options) {
                        // mais on cherche quand même l'expression complète, même si elle
                        // comporte des mots de moins de quatre lettres
                        $recherche = rtrim($recherche.preg_replace(',\s+,'.$u, '|', $recherche_inter), '|');
+                       $recherche_trans = translitteration($recherche);
                }
 
-               $preg = '/'.str_replace('/', '\\/', $recherche).'/' . $options['preg_flags'];
+               $preg = '/'.str_replace('/', '\\/', $recherche_trans).'/' . $options['preg_flags'];
        }
 
        // Si la chaine est inactive, on va utiliser LIKE pour aller plus vite
@@ -101,7 +112,8 @@ function expression_recherche($recherche, $options) {
                        array('(',')','?','[', ']', '+', '*', '/'),
                        array('\(','\)','[?]', '\[', '\]', '\+', '\*', '\/'),
                        $recherche);
-               $recherche_mod = $recherche;
+               $recherche_trans = translitteration($recherche);
+               $recherche_mod = $recherche_trans;
 
                // echapper les % et _
                $q = str_replace(array('%','_'), array('\%', '\_'), trim($recherche));
@@ -132,7 +144,32 @@ function expression_recherche($recherche, $options) {
                $q = sql_quote(trim($recherche, '/'));
        }
 
-       return array($methode, $q, $preg);
+       // tous les caracteres transliterables de $q sont remplaces par un joker
+       // permet de matcher en SQL meme si on est sensible aux accents (SQLite)
+       $q_t = $q;
+       for($i = 0;$i<spip_strlen($q);$i++){
+               $char = spip_substr($q,$i,1);
+               if (!is_ascii($char)
+                 AND $char_t = translitteration($char)
+                 AND $char_t !== $char){
+                       $q_t = str_replace($char,$is_preg?".":"_", $q_t);
+               }
+       }
+
+       $q = $q_t;
+
+       // fix : SQLite 3 est sensible aux accents, on jokerise les caracteres
+       // les plus frequents qui peuvent etre accentues
+       // (oui c'est tres dicustable...)
+       if (isset($GLOBALS['connexions'][$options['serveur']?$options['serveur']:0]['type'])
+         AND strncmp($GLOBALS['connexions'][$options['serveur']?$options['serveur']:0]['type'],'sqlite',6)==0){
+               $q_t = strtr($q,"aeuioc",$is_preg?"......":"______");
+               // si il reste au moins un char significatif...
+               if (preg_match(",[^'%_.],",$q_t))
+                       $q = $q_t;
+       }
+
+       return $expression[$key] = array($methode, $q, $preg);
 }
 
 
index fbab4fc..f707250 100644 (file)
@@ -675,9 +675,16 @@ function calculer_prochain_postdate($check= false) {
        
        if ($t) {
                $t =  $t['date'];
-               ecrire_meta('date_prochain_postdate', strtotime($t));
-       } else
+               if (!isset($GLOBALS['meta']['date_prochain_postdate'])
+                       OR $t<>$GLOBALS['meta']['date_prochain_postdate']){
+                       ecrire_meta('date_prochain_postdate', strtotime($t));
+                       ecrire_meta('derniere_modif', time());
+               }
+       }
+       else {
                effacer_meta('date_prochain_postdate');
+               ecrire_meta('derniere_modif', time());
+       }
 
        spip_log("prochain postdate: $t");
 }
index cdde1f3..f3c2429 100644 (file)
@@ -142,7 +142,21 @@ function traiter_echap_script_dist($regs) {
        return $regs[0];
 }
 
-define('_PROTEGE_BLOCS', ',<(html|code|cadre|frame|script)(\s[^>]*)?>(.*)</\1>,UimsS');
+/**
+ * Traiter les blocs <math></math> echappes par echappe_html
+ * @param $regs
+ * @return string
+ */
+function traiter_echap_math_dist($regs) {
+       // Gestion du TeX
+       if (!function_exists('traiter_math'))
+               include_spip('inc/math');
+
+       $t = traiter_math($regs[0], '');
+       return $t;
+}
+
+define('_PROTEGE_BLOCS', ',<(html|code|cadre|frame|script|math)(\s[^>]*)?>(.*)</\1>,UimsS');
 
 // - pour $source voir commentaire infra (echappe_retour)
 // - pour $no_transform voir le filtre post_autobr dans inc/filtres
@@ -163,7 +177,7 @@ $preg='') {
        }
 
        if (($preg OR strpos($letexte,"<")!==false)
-         AND preg_match_all($preg ? $preg : _PROTEGE_BLOCS, $letexte, $matches, PREG_SET_ORDER))
+         AND preg_match_all($preg ? $preg : _PROTEGE_BLOCS, $letexte, $matches, PREG_SET_ORDER)) {
                foreach ($matches as $regs) {
                        // echappements tels quels ?
                        if ($no_transform) {
@@ -179,23 +193,34 @@ $preg='') {
                        $p = strpos($letexte,$regs[0]);
                        $letexte = substr_replace($letexte,code_echappement($echap, $source, $no_transform),$p,strlen($regs[0]));
                }
+       }
 
        if ($no_transform)
                return $letexte;
 
        // Gestion du TeX
-       if (strpos($letexte, "<math>") !== false) {
-               include_spip('inc/math');
-               $letexte = traiter_math($letexte, $source);
+       // code mort sauf si on a personalise _PROTEGE_BLOCS sans y mettre <math>
+       // eviter la rupture de compat en branche 3.0
+       // a supprimer en branche 3.1
+       if (strpos($preg ? $preg : _PROTEGE_BLOCS,'code')!==false){
+               if (strpos($letexte, "<math>") !== false) {
+                       include_spip('inc/math');
+                       $letexte = traiter_math($letexte, $source);
+               }
        }
 
        // Echapper le php pour faire joli (ici, c'est pas pour la securite)
-       if (strpos($letexte,"<"."?")!==false AND preg_match_all(',<[?].*($|[?]>),UisS',
-       $letexte, $matches, PREG_SET_ORDER))
-       foreach ($matches as $regs) {
-               $letexte = str_replace($regs[0],
-                       code_echappement(highlight_string($regs[0],true), $source),
-                       $letexte);
+       // seulement si on a echappe les <script>
+       // (derogatoire car on ne peut pas faire passer < ? ... ? >
+       // dans une callback autonommee
+       if (strpos($preg ? $preg : _PROTEGE_BLOCS,'script')!==false){
+               if (strpos($letexte,"<"."?")!==false AND preg_match_all(',<[?].*($|[?]>),UisS',
+               $letexte, $matches, PREG_SET_ORDER))
+               foreach ($matches as $regs) {
+                       $letexte = str_replace($regs[0],
+                               code_echappement(highlight_string($regs[0],true), $source),
+                               $letexte);
+               }
        }
 
        return $letexte;
index e178856..1bb4cc9 100644 (file)
@@ -190,7 +190,10 @@ function inc_traduire_dist($ori, $lang) {
                if ($text)  {
                        $classe = 'debug-traduction' . ($module_retenu == 'ecrire' ? '-prive' : '');
                        $text = '<span lang=' . $langue_retenue . ' class=' . $classe . ' title=' . $ori_complet . '(' . $langue_retenue . ')>' . $text . '</span>';
-                       $text = str_replace($module_retenu, "*$module_retenu*", $text);
+                       $text = str_replace(
+                                               array("$module_retenu:", "$module_retenu|"),
+                                               array("*$module_retenu*:", "*$module_retenu*|"),
+                                               $text);
                }
        }
        else {
index b875aa2..f9bee58 100644 (file)
@@ -642,14 +642,17 @@ function action_cron() {
  * @return bool
  */
 function cron ($taches=array(), $taches_old= array()) {
-       // si pas en mode cron force
-       // ou si base inaccessible, laisser tomber.
-       if (!defined('_DIRECT_CRON_FORCE') OR !spip_connect()) return false;
-       spip_log("cron !",'jq'._LOG_DEBUG);
+       // si pas en mode cron force, laisser tomber.
+       if (!defined('_DIRECT_CRON_FORCE')) return false;
        if (!is_array($taches)) $taches = $taches_old; // compat anciens appels
+       // si taches a inserer en base et base inaccessible, laisser tomber
+       // sinon on ne verifie pas la connexion tout de suite, car si ca se trouve
+       // queue_sleep_time_to_next_job() dira qu'il n'y a rien a faire
+       // et on evite d'ouvrir une connexion pour rien (utilisation de _DIRECT_CRON_FORCE dans mes_options.php)
+       if ($taches AND count($taches) AND !spip_connect())  return false;
+       spip_log("cron !",'jq'._LOG_DEBUG);
        if ($genie = charger_fonction('genie', 'inc', true)) {
-               $genie($taches);
-               return true;
+               return $genie($taches);
        }
        return false;
 }
index 869d6fc..7de9fe6 100644 (file)
@@ -290,7 +290,7 @@ $liste_des_authentifications = array(
 // pour specifier les versions de SPIP necessaires
 // il faut s'en tenir a un nombre de decimales fixe
 // ex : 2.0.0, 2.0.0-dev, 2.0.0-beta, 2.0.0-beta2
-$spip_version_branche = "3.0.16";
+$spip_version_branche = "3.0.17";
 // version des signatures de fonctions PHP
 // (= numero SVN de leur derniere modif cassant la compatibilite et/ou necessitant un recalcul des squelettes)
 $spip_version_code = 17873;
index d703716..5c706ff 100644 (file)
@@ -281,8 +281,8 @@ function install_etape_3_dist()
        
        } else { 
                $res = '';
-               list($adresse_db, $login_db, $pass_db, $sel_db, $server_db)
-               = analyse_fichier_connection(_FILE_CONNECT_TMP);
+               list($adresse_db, $login_db, $pass_db, $sel_db, $server_db) = analyse_fichier_connection(_FILE_CONNECT_TMP);
+               $GLOBALS['connexions'][$server_db] = spip_connect_db($adresse_db, $sel_db, $login_db, $pass_db, $sel_db, $server_db);
        }
 
        if (!$res) {
@@ -300,7 +300,7 @@ function install_etape_3_dist()
                  . (defined('_INSTALL_NAME_DB') ? ''
                     : "\n<input type='hidden' name='sel_db' value='$sel_db' />");
 
-               $auteur_obligatoire = !sql_countsel('spip_auteurs','','','',$server_db);
+               $auteur_obligatoire = ($ldap_present?0:!sql_countsel('spip_auteurs','','','',$server_db));
 
                $res =  "<div class='success'><b>"
                . _T('info_base_installee')
index 4bd93c4..46d20ed 100644 (file)
@@ -125,7 +125,7 @@ class IterateurDATA implements Iterator {
        }
 
        /**
-        * Srtocker en cache si possible
+        * Stocker en cache si possible
         * @param  $cle
         * @param  $ttl
         * @return
@@ -145,8 +145,8 @@ class IterateurDATA implements Iterator {
                                'ttl' => $ttl
                        ),
                        3600 + $ttl);
-                       # conserver le cache 1h deplus que la validite demandee,
-                       # pour le cas ou le serveur distant ne repond plus
+                       # conserver le cache 1h de plus que la validite demandee,
+                       # pour le cas ou le serveur distant ne reponde plus
        }
 
        /**
@@ -168,7 +168,7 @@ class IterateurDATA implements Iterator {
                        $this->command['sourcemode'] = $this->command['from'][0];
                }
 
-               // cherchons defferents moyens de creer le tableau de donnees
+               // cherchons differents moyens de creer le tableau de donnees
                // les commandes connues pour l'iterateur DATA
                // sont : {tableau #ARRAY} ; {cle=...} ; {valeur=...}
                
@@ -426,7 +426,7 @@ class IterateurDATA implements Iterator {
 
 
        /**
-        * Grouper les resurltats
+        * Grouper les resultats
         * {fusion /x/y/z}
         * 
        **/
index 77a47bb..3ce31cd 100644 (file)
@@ -519,6 +519,7 @@ exige d’avoir un accès FTP au site Web.</p>',
        'info_redaction_en_cours' => 'EN COURS DE RÉDACTION',
        'info_redirection' => 'Redirection',
        'info_redirection_activee' => 'La redirection est activée.',
+       'info_redirection_boucle' => 'Vous essayez de rediriger l\'article sur lui-même.',
        'info_redirection_desactivee' => 'La redirection a été supprimée.',
        'info_refuses' => 'Vos articles refusés',
        'info_reglage_ldap' => 'Options : <b>Réglage de l’importation LDAP</b>',
@@ -702,6 +703,7 @@ dans une couleur qui indique leur état :',
        'lien_tout_deplier' => 'Tout déplier',
        'lien_tout_replier' => 'Tout replier',
        'lien_tout_supprimer' => 'Tout supprimer',
+       'lien_tout_decocher' => 'Tout décocher',
        'lien_trier_nom' => 'Trier par nom',
        'lien_trier_nombre_articles' => 'Trier par nombre d’articles',
        'lien_trier_statut' => 'Trier par statut',
index d91c55a..7dede6c 100644 (file)
@@ -108,8 +108,8 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'date_fmt_heures_minutes_court' => '@h@h@m@',
        'date_fmt_jour' => '@nomjour@ @jour@',
        'date_fmt_jour_heure' => '@jour@ à @heure@',
-       'date_fmt_jour_heure_debut_fin' => 'le @jour@ de @heure_debut@ à @heure_fin@',
-       'date_fmt_jour_heure_debut_fin_abbr' => 'le @dtstart@@jour@ de @heure_debut@@dtabbr@ à @dtend@@heure_fin@@dtabbr@',
+       'date_fmt_jour_heure_debut_fin' => '@jour@ de @heure_debut@ à @heure_fin@',
+       'date_fmt_jour_heure_debut_fin_abbr' => '@dtstart@@jour@ de @heure_debut@@dtabbr@ à @dtend@@heure_fin@@dtabbr@',
        'date_fmt_jour_mois' => '@jour@ @nommois@',
        'date_fmt_jour_mois_annee' => '@jour@ @nommois@ @annee@',
        'date_fmt_mois_annee' => '@nommois@ @annee@',
@@ -687,6 +687,7 @@ et vous reconnecter au site.
        'zbug_champ_hors_motif' => 'Champ @champ@ hors d’un contexte @motif@',
        'zbug_code' => 'code',
        'zbug_critere_inconnu' => 'Critère inconnu @critere@',
+       'zbug_critere_sur_table_sans_cle_primaire' => '{@critere@} sur une table sans clef primaire atomique',
        'zbug_distant_interdit' => 'Externe interdit', # Contexte : une base de données "externe", pas gérée par SPIP, mais que SPIP 1.8 sait utiliser dans ses boucles -- seul problèmes certaines manipulations sont interdites sur ces bases-là.
        'zbug_doublon_table_sans_cle_primaire' => 'Doublons sur une table sans clef primaire atomique',
        'zbug_doublon_table_sans_index' => 'Doublons sur une table sans index',
index 0f435cf..c315976 100644 (file)
@@ -88,18 +88,18 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'date_aujourdhui' => 'ဒီနေ့',
        'date_avant_jc' => 'B.C.',
        'date_dans' => '@delai@ထဲမှာ',
-       'date_de_mois_1' => '@j@ @nommois@',
-       'date_de_mois_10' => '@j@ @nommois@',
-       'date_de_mois_11' => '@j@ @nommois@',
-       'date_de_mois_12' => '@j@ @nommois@',
-       'date_de_mois_2' => '@j@ @nommois@',
-       'date_de_mois_3' => '@j@ @nommois@',
-       'date_de_mois_4' => '@j@ @nommois@',
-       'date_de_mois_5' => '@j@ @nommois@',
-       'date_de_mois_6' => '@j@ @nommois@',
-       'date_de_mois_7' => '@j@ @nommois@',
-       'date_de_mois_8' => '@j@ @nommois@',
-       'date_de_mois_9' => '@j@ @nommois@',
+       'date_de_mois_1' => '@nommois@ @j@',
+       'date_de_mois_10' => '@nommois@ @j@',
+       'date_de_mois_11' => '@nommois@ @j@',
+       'date_de_mois_12' => '@nommois@ @j@',
+       'date_de_mois_2' => '@nommois@ @j@',
+       'date_de_mois_3' => '@nommois@ @j@',
+       'date_de_mois_4' => '@nommois@ @j@',
+       'date_de_mois_5' => '@nommois@ @j@',
+       'date_de_mois_6' => '@nommois@ @j@',
+       'date_de_mois_7' => '@nommois@ @j@',
+       'date_de_mois_8' => '@nommois@ @j@',
+       'date_de_mois_9' => '@nommois@ @j@',
        'date_demain' => 'မနက်ဖြန်',
        'date_fmt_heures_minutes' => '@h@:@m@',
        'date_fmt_jour_heure' => '@jour@ မှ @heure@',
@@ -141,42 +141,54 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'date_jnum7' => '၇',
        'date_jnum8' => '၈',
        'date_jnum9' => '၉',
-       'date_jour_1' => 'á\80\90á\80\94á\80\84á\80ºá\80¹á\80\82á\80\94ွေ',
-       'date_jour_1_abbr' => 'á\80\94á\80½ေ',
+       'date_jour_1' => 'á\80\90á\80\94á\80\82á\81¤á\80±á\82\8fá\80¼ွေ',
+       'date_jour_1_abbr' => 'á\80±á\82\8fá\80¼ေ',
        'date_jour_1_initiale' => 'န',
-       'date_jour_2' => '​တနင်္လာ',
+       'date_jour_2' => 'တနလၤာ',
        'date_jour_2_abbr' => 'လာ',
        'date_jour_2_initiale' => 'လ',
-       'date_jour_3' => 'á\80¡á\80\84á\80ºá\80¹á\80\82ါ',
+       'date_jour_3' => 'á\80¡á\80\82á\81¤ါ',
        'date_jour_3_abbr' => 'ဂါ',
        'date_jour_3_initiale' => 'ဂ',
-       'date_jour_4' => '​ဗုဒ္ဓဟူး',
+       'date_jour_4' => 'ဗုဒၶဟူး',
        'date_jour_4_abbr' => 'ဟူး',
        'date_jour_4_initiale' => 'ဟ',
-       'date_jour_5' => 'á\80\80á\80¼á\80¬á\80\90á\80\95á\80\90á\80±း',
-       'date_jour_5_abbr' => 'á\80\80á\80¼ာ',
+       'date_jour_5' => 'á\80\80á\81¾á\80\80á\80¬á\80\9eá\80\95á\80±á\80\90း',
+       'date_jour_5_abbr' => 'á\81¾á\80\80ာ',
        'date_jour_5_initiale' => 'က',
-       'date_jour_6' => 'á\80\9eá\80±á\80¬á\80\80á\80¼ာ',
-       'date_jour_6_abbr' => 'á\80\9eá\80±ာ',
+       'date_jour_6' => 'á\80±á\80\9eá\80¬á\81¾á\80\80ာ',
+       'date_jour_6_abbr' => 'á\80±á\80\9eာ',
        'date_jour_6_initiale' => 'သ',
-       'date_jour_7' => 'á\80\85á\80\94á\80±',
-       'date_jour_7_abbr' => 'á\80\94á\80±',
+       'date_jour_7' => 'á\80\85á\80±á\80\94',
+       'date_jour_7_abbr' => 'á\80±á\80\94',
        'date_jour_7_initiale' => 'စ',
        'date_jours' => 'ရက်များ',
        'date_minutes' => 'မိနစ်များ',
        'date_mois' => 'လများ',
-       'date_mois_1' => 'ရန္နဝါရီ',
-       'date_mois_10' => 'အောက်တိုဘာ',
-       'date_mois_11' => 'နိုဝင်ဘာ',
-       'date_mois_12' => 'ဒီဇင်ဘာ',
-       'date_mois_2' => 'ဖေ​​ဖော်ဝါရီ',
-       'date_mois_3' => 'မတ်',
-       'date_mois_4' => 'ဧပြီ',
-       'date_mois_5' => 'မေ',
-       'date_mois_6' => 'ဇွန်',
-       'date_mois_7' => 'ဇူလိုင်',
-       'date_mois_8' => 'ဩဂုတ်',
-       'date_mois_9' => 'စက်တင်ဘာ',
+       'date_mois_1' => 'ျပာသုိ',
+       'date_mois_10' => 'သီတင္းကြ်တ္',
+       'date_mois_10_abbr' => 'ကြ်တ္', 
+       'date_mois_11' => 'တန္ေဆာင္မုန္း',
+       'date_mois_11_abbr' => 'မုန္း', 
+       'date_mois_12' => 'နတ္ေတာ္',
+       'date_mois_12_abbr' => 'နတ္',
+       'date_mois_1_abbr' => 'ျပာ',
+       'date_mois_2' => 'တပုိ႔တြဲ',
+       'date_mois_2_abbr' => 'တြဲ',
+       'date_mois_3' => 'တန္ေပါင္း',
+       'date_mois_3_abbr' => 'ေပါင္း',
+       'date_mois_4' => 'တန္ခူး',
+       'date_mois_4_abbr' => 'ခူး',
+       'date_mois_5' => 'ကဆုန္',
+       'date_mois_5_abbr' => 'ဆုန္',
+       'date_mois_6' => 'နယုန္',
+       'date_mois_6_abbr' => 'ယုန္',
+       'date_mois_7' => 'ဝါဆုိ',
+       'date_mois_7_abbr' => 'ဝါဆုိ',
+       'date_mois_8' => 'ဝါေခါင္',
+       'date_mois_8_abbr' => 'ဝါေခါင္',
+       'date_mois_9' => 'ေတာ္သလင္း',
+       'date_mois_9_abbr' => 'ေတာ္',
        'date_saison_1' => 'ဆောင်းရာသီ',
        'date_saison_2' => 'နွေဦးရာသီ',
        'date_saison_3' => 'နွေရာသီ',
index 3e049e1..b01cc16 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="spip"
        categorie="outil"
-       version="3.0.16-dev"
+       version="3.0.17"
        etat="stable"
        compatibilite="];["
        schema="19268"
index 9c16bfe..34f4fba 100644 (file)
@@ -433,7 +433,7 @@ function inclure_modele($type, $id, $params, $lien, $connect='', $env=array()) {
        $params = array_filter(explode('|', $params));
        if ($params) {
                list(,$soustype) = each($params);
-               $soustype = strtolower($soustype);
+               $soustype = strtolower(trim($soustype));
                if (in_array($soustype,
                array('left', 'right', 'center', 'ajax'))) {
                        list(,$soustype) = each($params);
index 9d01d21..27b8f19 100644 (file)
@@ -1086,7 +1086,7 @@ function balise_INCLURE_dist($p) {
        } elseif (!isset($_contexte[1])) {
                        $msg = array('zbug_balise_sans_argument', array('balise' => ' INCLURE'));
                        erreur_squelette($msg, $p);
-       } else          $p->code = '(($c = find_in_path(' . $_contexte[1] . ')) ? spip_file_get_contents($c) : "")';
+       } else          $p->code = 'charge_scripts(' . $_contexte[1] . ',false)';
 
        $p->interdire_scripts = false; // la securite est assuree par recuperer_fond
        return $p;
index 13380c1..ab8d1d9 100644 (file)
@@ -111,6 +111,15 @@ function gunzip_page(&$page) {
 /// http://doc.spip.org/@cache_valide
 function cache_valide(&$page, $date) {
 
+       // Apparition d'un nouvel article post-date ?
+       if ($GLOBALS['meta']['post_dates'] == 'non'
+         AND isset($GLOBALS['meta']['date_prochain_postdate'])
+         AND time() > $GLOBALS['meta']['date_prochain_postdate']) {
+               spip_log('Un article post-date invalide le cache');
+               include_spip('inc/rubriques');
+               calculer_prochain_postdate(true);
+       }
+
        if (defined('_VAR_NOCACHE') AND _VAR_NOCACHE) return -1;
        if (isset($GLOBALS['meta']['cache_inhib']) AND $_SERVER['REQUEST_TIME']<$GLOBALS['meta']['cache_inhib']) return -1;
        if (defined('_NO_CACHE')) return (_NO_CACHE==0 AND !isset($page['texte']))?1:_NO_CACHE;
@@ -129,17 +138,6 @@ function cache_valide(&$page, $date) {
                AND $date < $GLOBALS['meta']['derniere_modif'])
                        return 1;
 
-               // Apparition d'un nouvel article post-date ?
-               if ($GLOBALS['meta']['post_dates'] == 'non'
-               AND isset($GLOBALS['meta']['date_prochain_postdate'])
-               AND time() > $GLOBALS['meta']['date_prochain_postdate']) {
-                       spip_log('Un article post-date invalide le cache');
-                       include_spip('inc/rubriques');
-                       ecrire_meta('derniere_modif', time());
-                       calculer_prochain_postdate();
-                       return 1;
-               }
-
        }
 
        // Sinon comparer l'age du fichier a sa duree de cache
index 178f7a1..468243f 100644 (file)
@@ -396,7 +396,7 @@ define('CODE_CORPS_BOUCLE', '%s
        }%s
        if (defined("_BOUCLE_PROFILER")
        AND 1000*($timer = (time()+microtime())-$timer) > _BOUCLE_PROFILER)
-               spip_log(intval(1000*$timer)."ms %s","profiler");
+               spip_log(intval(1000*$timer)."ms %s","profiler"._LOG_AVERTISSEMENT);
        return $t0;'
 );
 
index b843858..71aca21 100644 (file)
@@ -276,6 +276,9 @@ function filtre_introduction_dist($descriptif, $texte, $longueur, $connect) {
        // ne pas tenir compte des notes
        if ($notes = charger_fonction('notes', 'inc', true))
                $notes('','empiler');
+       // Supprimer les modèles avant le propre afin d'éviter qu'ils n'ajoutent du texte indésirable
+       // dans l'introduction.
+       $texte = supprime_img($texte, '');
        $texte = propre($texte,$connect);
        if ($notes)
                $notes('','depiler');
index 7108eaf..92b7cc2 100644 (file)
@@ -275,6 +275,11 @@ function critere_recherche_dist($idb, &$boucles, $crit){
 
        $boucle = &$boucles[$idb];
 
+       if (!$boucle->primary OR strpos($boucle->primary, ',')){
+               erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire',array('critere'=>'recherche')), $boucle);
+               return;
+       }
+
        if (isset($crit->param[0]))
                $quoi = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent);
        else
@@ -293,6 +298,7 @@ function critere_recherche_dist($idb, &$boucles, $crit){
        }
        ';
 
+
        $t = $boucle->id_table.'.'.$boucle->primary;
        if (!in_array($t, $boucles[$idb]->select))
                $boucle->select[] = $t; # pour postgres, neuneu ici
@@ -1878,7 +1884,7 @@ function critere_noeud_dist($idb, &$boucles, $crit){
        $primary = $boucle->primary;
 
        if (!$primary OR strpos($primary, ',')){
-               erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), "BOUCLE$idb");
+               erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle);
                return;
        }
        $table = $boucle->type_requete;
index 5283ab5..a5a87c1 100644 (file)
@@ -150,6 +150,11 @@ function quete_condition_postdates($champ_date, $serveur='', $ignore_previsu=fal
  * @return array
  */
 function quete_condition_statut($mstatut,$previsu,$publie, $serveur='', $ignore_previsu=false){
+       static $cond = array();
+       $key = func_get_args();
+       $key = implode("-",$key);
+       if (isset($cond[$key])) return $cond[$key];
+
        $liste = $publie;
        if (defined('_VAR_PREVIEW') AND _VAR_PREVIEW AND !$ignore_previsu)
                $liste = $previsu;
@@ -160,19 +165,52 @@ function quete_condition_statut($mstatut,$previsu,$publie, $serveur='', $ignore_
        }
        // '' => ne rien afficher, '!'=> ne rien filtrer
        if (!strlen($liste))
-               return ($not?"1=1":"'0=1'");
+               return $cond[$key]=($not?"1=1":"'0=1'");
 
        $liste = explode(',',$liste);
+       $where = array();
        foreach($liste as $k=>$v) {
+               // filtrage /auteur pour limiter les objets d'un statut (prepa en general)
+               // a ceux de l'auteur identifie
+               if (strpos($v,"/")!==false){
+                       $v = explode("/",$v);
+                       $filtre = end($v);
+                       $v = reset($v);
+                       $v = preg_replace(",\W,","",$v);
+                       if ($filtre=="auteur"
+                               AND isset($GLOBALS['visiteur_session']['id_auteur'])
+                               AND intval($GLOBALS['visiteur_session']['id_auteur'])
+                               AND (strpos($mstatut,".")!==false)
+                         AND $objet = explode(".",$mstatut)
+                               AND $id_table = reset($objet)
+                         AND $objet = objet_type($id_table)){
+                               $primary = id_table_objet($objet);
+                               $where[] = "($mstatut<>".sql_quote($v)." OR $id_table.$primary IN (".sql_get_select("ssss.id_objet","spip_auteurs_liens AS ssss","ssss.objet=".sql_quote($objet)." AND ssss.id_auteur=".intval($GLOBALS['visiteur_session']['id_auteur']),'','','','',$serveur)."))";
+                       }
+                       // ignorer ce statut si on ne sait pas comment le filtrer
+                       else
+                               $v = "";
+               }
                // securite
                $liste[$k] = preg_replace(",\W,","",$v);
        }
+       $liste = array_filter($liste);
   if (count($liste)==1){
-               return array(($not?'<>':'='), $mstatut, sql_quote(reset($liste),$serveur));
+               $where[] = array('=', $mstatut, sql_quote(reset($liste),$serveur));
   }
   else {
-         return sql_in($mstatut,$liste,$not,$serveur);
+         $where[] = sql_in($mstatut,$liste,$not,$serveur);
   }
+
+       while (count($where)>1){
+               $and = array('AND',array_pop($where),array_pop($where));
+               $where[] = $and;
+       }
+       $cond[$key] = reset($where);
+       if ($not)
+               $cond[$key] = array('NOT',$cond[$key]);
+
+       return $cond[$key];
 }
 
 /**
@@ -249,6 +287,8 @@ function quete_logo($type, $onoff, $id, $id_rubrique, $flag) {
                                        (!$taille ? '' : (" ".$taille[3])));
                        }
                }
+        else if (defined('_LOGO_RUBRIQUE_DESACTIVER_HERITAGE'))
+            return '';
                else if ($id_rubrique) {
                        $type = 'id_rubrique';
                        $id = $id_rubrique;
index 7916929..a742c23 100644 (file)
@@ -48,7 +48,16 @@ function sandbox_composer_filtre($fonc, $code, $arglist, &$p){
        // le filtre est defini sous forme de fonction ou de methode
        // par ex. dans inc_texte, inc_filtres ou mes_fonctions
        elseif ($f = chercher_filtre($fonc)) {
-               $code = "$f($code$arglist)";
+               // cas particulier : le filtre |set doit acceder a la $Pile
+               // proto: filtre_set(&$Pile, $val, $args...)
+               $refl = new ReflectionFunction($f);
+               $refs = $refl->getParameters();
+               if (isset($refs[0]) AND $refs[0]->name == 'Pile') {
+                       $code = "$f(\$Pile,$code$arglist)";
+               }
+               else {
+                       $code = "$f($code$arglist)";
+               }
        }
        // le filtre n'existe pas,
        // on le notifie
index cb15072..5afe581 100644 (file)
@@ -244,7 +244,10 @@ function _sqlite_func_right ($s, $length) {
 
 // http://doc.spip.org/@_sqlite_func_regexp_match
 function _sqlite_func_regexp_match($cherche, $quoi) {
-       $return = preg_match('%'.$cherche.'%', $quoi);
+       // optimiser un cas tres courant avec les requetes en base
+       if (!$quoi AND !strlen($quoi)) return false;
+       $u = $GLOBALS['meta']['pcre_u'];
+       $return = preg_match('%'.$cherche.'%imsS'.$u, $quoi);
        #spip_log("regexp_replace : $quoi, $cherche, $remplace, $return",'sqlite.'._LOG_DEBUG);
        return $return;
 }
index eab46ee..1eb3153 100644 (file)
@@ -111,8 +111,8 @@ RewriteRule ^[^\.]+(\.html)?$               spip.php [QSA,E=url_propre:$0,L]
 ###
 # Divers
 
-# bloquer les acces aux repertoires .svn/ (SPIP, plugins, squelettes...)
-RewriteRule ^(.*/)?\.svn/ - [F]
+# bloquer les acces aux fichiers caches (.svn, .git, etc)
+RewriteRule /\\..*(/.*|$) - [F]
 
 ###
 # Fichiers "standards" (si absents de la racine)
index c9e1c5c..5202594 100644 (file)
Binary files a/www/plugins-dist/compagnon/prive/themes/spip/images/compagnon_gris-64.png and b/www/plugins-dist/compagnon/prive/themes/spip/images/compagnon_gris-64.png differ
index 81b16c8..878d7d0 100644 (file)
@@ -23,5 +23,5 @@
        <pipeline nom="configurer_liste_metas" inclure="compresseur_pipeline.php" />
        <pipeline nom="ieconfig_metas" inclure="compresseur_ieconfig.php" />
 
-       <utilise nom="porte_plume" compatibilite="[1.6.3;[" />
+       <utilise nom="porte_plume" compatibilite="[1.11.5;[" />
 </paquet>
index cd47d4c..8f96497 100644 (file)
Binary files a/www/plugins-dist/dump/prive/themes/spip/images/dump-32.png and b/www/plugins-dist/dump/prive/themes/spip/images/dump-32.png differ
index ed45141..52baced 100644 (file)
@@ -9,7 +9,7 @@ $file="[(#CHEMIN{apple-touch-icon[-(#ENV{size,''})].png}|sinon{[(#LOGO_SITE_SPIP
                |image_passe_partout{[(#ENV{size,57}|intval)],[(#ENV{size,57}|intval)]}
                |image_recadre{[(#ENV{size,57}|intval)],[(#ENV{size,57}|intval)],center}
                |image_aplatir{png,#ffffff}|extraire_attribut{src})]})]";
-if ($cl = filesize(preg_replace(',[?].*$,','',$file))
+if ($cl = filesize(preg_replace(',[?].*$,','',$file)))
        header("Content-Length: ". $cl);
 
 readfile($file);
index a98b513..e26ed83 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="images"
        categorie="multimedia"
-       version="1.1.8"
+       version="1.1.9"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="images/image_filtre-32.png"
index 77c5214..0e89399 100644 (file)
@@ -54,7 +54,7 @@ if(!function_exists('revision_forum')){
                // Modification des id_article etc
                // (non autorise en standard mais utile pour des crayons)
                // on deplace tout le thread {sauf les originaux}.
-               if (count($cles)) {
+               if (count($cles) AND $t) {
                        spip_log("update thread id_thread=$t avec ".var_export($cles,1),'forum.'. _LOG_INFO_IMPORTANTE);
                        sql_updateq("spip_forum", $cles, "id_thread=".intval($t)." AND statut!='original'");
                        // on n'affecte pas $r, car un deplacement ne change pas l'auteur
index d74799b..6b461d7 100644 (file)
@@ -44,7 +44,6 @@
 <p class="spip_bouton"><input type="submit" class="submit" value="<:forum:forum_valider:>" /></p>]
 
 [(#ENV**{afficher_texte}|choixsiegal{'non', '',' '})
-
        <INCLURE{fond=formulaires/inc-login_forum, env} />
 
        <fieldset>
        </li>
 })]
        </ul></fieldset>
+  
+[(#CONFIG{forums_urlref}|!={non}|?{
+       <ul><li class='fieldset'>
+  <fieldset>
+       <legend><:forum:forum_lien_hyper:></legend>
+       <p class='explication'><:forum:forum_page_url:></p>
+       <ul>
+       <li class='editer saisie_nom_site[ (#ENV**{erreurs}|table_valeur{nom_site}|oui)erreur]'>
+        <label for="nom_site"><:forum:forum_titre:></label>
+       [<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{nom_site})</span>]
+       <input type="text" class="text" name="nom_site" id="nom_site" size="40" value="[(#ENV{nom_site})]" />
+    </li>
+       <li class='editer saisie_url_site[ (#ENV**{erreurs}|table_valeur{url_site}|oui)erreur]'>
+      <label for="url_site"><:forum:forum_lien_hyper:></label>
+       [<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{url_site})</span>]
+       <input type="text" class="text url" name="url_site" id="url_site" style="text-align: left;" dir="ltr" size="40" value="[(#ENV{url_site})]" autocapitalize="off" autocorrect="off" />
+    </li>
+    </ul>
+  </fieldset>    
+  </li>
+  </ul>
+})]  
 
 [
        <fieldset>
                <input type="text" class="text" name="nobot" id="nobot_forum" value="#ENV{nobot}" size="10" />
        </p>
        ]
-       <p class="boutons"><input type="submit" class="submit" value="<:forum:forum_voir_avant:>" /></p>
+  <p class="boutons"><input type="submit" class="submit" value="<:forum:forum_voir_avant:>" /></p> 
 ]
 </div>
 </form>
index 6864299..9294d71 100644 (file)
@@ -14,6 +14,22 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 \r
 include_spip('inc/forum');\r
 \r
+\r
+/**\r
+ * Identification du formulaire poste : ne pas tenir compte de la previsu et du retour\r
+ * @param $objet\r
+ * @param $id_objet\r
+ * @param $id_forum\r
+ * @param $ajouter_mot\r
+ * @param $ajouter_groupe\r
+ * @param $afficher_previsu\r
+ * @param $retour\r
+ * @return array\r
+ */\r
+function formulaires_forum_identifier_dist($objet, $id_objet, $id_forum,$ajouter_mot, $ajouter_groupe, $afficher_previsu, $retour){\r
+       return array($objet, $id_objet, $id_forum,$ajouter_mot, $ajouter_groupe);\r
+}\r
+\r
 /**\r
  * Charger l'env du squelette de #FORMULAIRE_FORUM\r
  * @param string $objet\r
old mode 100755 (executable)
new mode 100644 (file)
index 41b1de8..1f3886f
@@ -61,7 +61,7 @@ function formulaires_gestion_forum_traiter_dist($id_forum='', $id_rubrique='', $
        $pagination_ancien = _request('pagination_ancien');
 
        set_request('select_type',$select_type);
-       set_request('voir_staut',$select_statut);
+       set_request('voir_statut',$select_statut);
        
        if ($pagination != $pagination_ancien)
                set_request('debut_forum','');
index d416de8..952dae3 100644 (file)
                        <label for="session_email"><:forum:forum_votre_email:></label>
                        <input type="[(#HTML5|?{email,text})]" class="text email" name="session_email" id="session_email" value="[(#SESSION**{email}|sinon{#SESSION**{session_email}}|entites_html)]" size="40" autocapitalize="off" autocorrect="off" />
                </li>
-[(#CONFIG{forums_urlref}|!={non}|?{
-        <li class='editer saisie_url_site[ (#ENV**{erreurs}|table_valeur{url_site}|oui)erreur]'>
-            <label for="url_site"><:forum:forum_url:></label>
-            [<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{url_site})</span>]
-            <input type="[(#HTML5|?{url,text})]" class="text url" name="url_site" id="url_site" style="text-align: left;" dir="ltr" size="40" value="[(#ENV{url_site})]" autocapitalize="off" autocorrect="off" />
-        </li>
-})]
        </ul>
 ]
-</fieldset>
\ No newline at end of file
+</fieldset>
index 8447333..e0746e1 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="forum"
        categorie="communication"
-       version="1.8.32"
+       version="1.8.34"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="prive/themes/spip/images/forum-32.png"
index 89a1031..e2610ff 100644 (file)
@@ -22,8 +22,8 @@
 #SET{voir,''}
 <BOUCLE_art(ARTICLES){id_article=#OBJET|=={article}|?{#ID_OBJET}}{id_article!=#ENV{id_article,0}}{statut!=''}><div class='reponse_a'><:forum:lien_reponse_article:> <a href='[(#ID_ARTICLE|generer_url_entite{article,'',forum#ID_FORUM, #_forum:STATUT|!={prive}})]'>#TITRE</a>#SET{voir,'</div>'}</BOUCLE_art>
 <BOUCLE_rub(RUBRIQUES){id_rubrique=#OBJET|=={rubrique}|?{#ID_OBJET}}{statut!=''}><div class='reponse_a'><:forum:lien_reponse_rubrique:> <a href='[(#ID_RUBRIQUE|generer_url_entite{rubrique,'',forum#ID_FORUM, #_forum:STATUT|!={prive}})]'>#TITRE</a>#SET{voir,'</div>'}</BOUCLE_rub>
-<BOUCLE_bre(BREVES){id_breve=#OBJET|=={breve}|?{#ID_OBJET}}{statut!=''}><div class='reponse_a'><:forum:lien_reponse_breve_2:> <a href='[(#ID_BREVE|generer_url_entite{breve,'',forum#ID_FORUM, #_forum:STATUT|!={prive}})]'>#TITRE</a>#SET{voir,'</div>'}</BOUCLE_bre>
-<BOUCLE_sit(SYNDIC){id_syndic=#OBJET|=={syndic}|?{#ID_OBJET}}><div class='reponse_a'><:forum:lien_reponse_site_reference:> <a href='[(#ID_SYNDIC|generer_url_entite{site,'','',1}|ancre_url{forum#ID_FORUM})]'>#NOM_SITE</a>#SET{voir,'</div>'}</BOUCLE_sit>
+<BOUCLE_bre(BREVES ?){id_breve=#OBJET|=={breve}|?{#ID_OBJET}}{statut!=''}><div class='reponse_a'><:forum:lien_reponse_breve_2:> <a href='[(#ID_BREVE|generer_url_entite{breve,'',forum#ID_FORUM, #_forum:STATUT|!={prive}})]'>#TITRE</a>#SET{voir,'</div>'}</BOUCLE_bre>
+<BOUCLE_sit(SYNDIC ?){id_syndic=#OBJET|=={syndic}|?{#ID_OBJET}}><div class='reponse_a'><:forum:lien_reponse_site_reference:> <a href='[(#ID_SYNDIC|generer_url_entite{site,'','',1}|ancre_url{forum#ID_FORUM})]'>#NOM_SITE</a>#SET{voir,'</div>'}</BOUCLE_sit>
 <//B_art>
 [(#OBJET|in_array{#LISTE{article,rubrique,breve,syndic}}|non)
 <div class='reponse_a'>[(#OBJET|concat{:lien_reponse_,#OBJET}|_T)] <a href='[(#ID_OBJET|generer_url_entite{#OBJET,'',forum#ID_FORUM, #STATUT|!={prive}})]'>[(#TITRE|?{#TITRE,#NOM})]</a>
index 9a0a1a2..17ddbf1 100644 (file)
Binary files a/www/plugins-dist/forum/prive/themes/spip/images/forum-statut-off-24.png and b/www/plugins-dist/forum/prive/themes/spip/images/forum-statut-off-24.png differ
index f4d307f..4745dfe 100644 (file)
Binary files a/www/plugins-dist/forum/prive/themes/spip/images/forum-statut-prop-24.png and b/www/plugins-dist/forum/prive/themes/spip/images/forum-statut-prop-24.png differ
index a5639d4..1a3f383 100644 (file)
Binary files a/www/plugins-dist/forum/prive/themes/spip/images/forum-statut-publie-24.png and b/www/plugins-dist/forum/prive/themes/spip/images/forum-statut-publie-24.png differ
index 53e6bdd..102517d 100644 (file)
Binary files a/www/plugins-dist/forum/prive/themes/spip/images/forum-statut-spam-24.png and b/www/plugins-dist/forum/prive/themes/spip/images/forum-statut-spam-24.png differ
old mode 100755 (executable)
new mode 100644 (file)
index 69c57b2..a86fcb5
Binary files a/www/plugins-dist/forum/prive/themes/spip2/images/comment_48.png and b/www/plugins-dist/forum/prive/themes/spip2/images/comment_48.png differ
index f4462f0..12af78a 100644 (file)
Binary files a/www/plugins-dist/forum/prive/themes/spip2/images/forum-48.png and b/www/plugins-dist/forum/prive/themes/spip2/images/forum-48.png differ
index 9a0a1a2..17ddbf1 100644 (file)
Binary files a/www/plugins-dist/forum/prive/themes/spip2/images/forum-statut-off-24.png and b/www/plugins-dist/forum/prive/themes/spip2/images/forum-statut-off-24.png differ
index f4d307f..4745dfe 100644 (file)
Binary files a/www/plugins-dist/forum/prive/themes/spip2/images/forum-statut-prop-24.png and b/www/plugins-dist/forum/prive/themes/spip2/images/forum-statut-prop-24.png differ
index a5639d4..1a3f383 100644 (file)
Binary files a/www/plugins-dist/forum/prive/themes/spip2/images/forum-statut-publie-24.png and b/www/plugins-dist/forum/prive/themes/spip2/images/forum-statut-publie-24.png differ
index 53e6bdd..102517d 100644 (file)
Binary files a/www/plugins-dist/forum/prive/themes/spip2/images/forum-statut-spam-24.png and b/www/plugins-dist/forum/prive/themes/spip2/images/forum-statut-spam-24.png differ
index 174f711..8f85df2 100644 (file)
@@ -3,6 +3,7 @@
     The following rules are the styles that are consistant between themes.\r
     Avoid changing this area to maintain compatability with future versions of ColorBox.\r
 */\r
+#colorbox {-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}\r
 #colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:4999; overflow:hidden;}\r
 #cboxOverlay{position:fixed; width:100%; height:100%;}\r
 #cboxMiddleLeft, #cboxBottomLeft{clear:left;}\r
index c10940b..8a7e375 100644 (file)
@@ -3,6 +3,7 @@
     The following rules are the styles that are consistant between themes.\r
     Avoid changing this area to maintain compatability with future versions of ColorBox.\r
 */\r
+#colorbox {-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}\r
 #colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:4999; overflow:hidden;}\r
 #cboxOverlay{position:fixed; width:100%; height:100%;}\r
 #cboxMiddleLeft, #cboxBottomLeft{clear:left;}\r
index cc8f7f0..05c5ea0 100644 (file)
@@ -3,6 +3,7 @@
     The following rules are the styles that are consistant between themes.\r
     Avoid changing this area to maintain compatability with future versions of ColorBox.\r
 */\r
+#colorbox {-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}\r
 #colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:4999; overflow:hidden;}\r
 #cboxOverlay{position:fixed; width:100%; height:100%;}\r
 #cboxMiddleLeft, #cboxBottomLeft{clear:left;}\r
old mode 100755 (executable)
new mode 100644 (file)
index a6389c9..0a68929
@@ -2,6 +2,7 @@
     ColorBox Core Style:\r
     The following CSS is consistent between example themes and should not be altered.\r
 */\r
+#colorbox {-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}\r
 #colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:4999; overflow:hidden;}\r
 #cboxOverlay{position:fixed; width:100%; height:100%;}\r
 #cboxMiddleLeft, #cboxBottomLeft{clear:left;}\r
index c05fc18..a0c31fe 100644 (file)
Binary files a/www/plugins-dist/mediabox/colorbox/demo.jpg and b/www/plugins-dist/mediabox/colorbox/demo.jpg differ
index 902b075..dddaa29 100644 (file)
@@ -3,6 +3,7 @@
     The following rules are the styles that are consistant between themes.\r
     Avoid changing this area to maintain compatability with future versions of ColorBox.\r
 */\r
+#colorbox {-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}\r
 #colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:4999; overflow:hidden;}\r
 #cboxOverlay{position:fixed; width:100%; height:100%;}\r
 #cboxMiddleLeft, #cboxBottomLeft{clear:left;}\r
index 78897ec..4711a26 100644 (file)
@@ -3,6 +3,7 @@
     The following rules are the styles that are consistant between themes.\r
     Avoid changing this area to maintain compatability with future versions of ColorBox.\r
 */\r
+#colorbox {-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}\r
 #colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:4999; overflow:hidden;}\r
 #cboxOverlay{position:fixed; width:100%; height:100%;}\r
 #cboxMiddleLeft, #cboxBottomLeft{clear:left;}\r
index 9e661bd..9e55922 100644 (file)
@@ -3,6 +3,7 @@
     The following rules are the styles that are consistant between themes.\r
     Avoid changing this area to maintain compatability with future versions of ColorBox.\r
 */\r
+#colorbox {-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}\r
 #colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:4999; overflow:hidden;}\r
 #cboxOverlay{position:fixed; width:100%; height:100%;}\r
 #cboxMiddleLeft, #cboxBottomLeft{clear:left;}\r
index ba99b94..f2a70d9 100644 (file)
@@ -3,6 +3,7 @@
     The following rules are the styles that are consistant between themes.\r
     Avoid changing this area to maintain compatability with future versions of ColorBox.\r
 */\r
+#colorbox {-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}\r
 #colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:4999; overflow:hidden;}\r
 #cboxOverlay{position:fixed; width:100%; height:100%;}\r
 #cboxMiddleLeft, #cboxBottomLeft{clear:left;}\r
index 515ccee..478642f 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="mediabox"
        categorie="multimedia"
-       version="0.8.4"
+       version="0.8.5"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="prive/themes/spip/images/mediabox-32.png"
index 4744cd4..bcf52bf 100644 (file)
@@ -40,7 +40,7 @@
                                <BOUCLE_compte(documents_liens){id_document}{0,2} />
                                [(#TOTAL_BOUCLE|=={1}|et{#AUTORISER{modifier,#OBJET,#ID_OBJET}})[(#BOUTON_ACTION{<:medias:bouton_enlever_supprimer_document:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-#ID_DOCUMENT-suppr,#SELF},ajax,<:medias:bouton_enlever_supprimer_document_confirmation:>,'',[(function(){jQuery("#doc(#ID_DOCUMENT)").animateRemove();return true;})()]})]<span>|</span>]
                                [(#ID_OBJET|<{0}|ou{#AUTORISER{modifier,#OBJET,#ID_OBJET}})[(#BOUTON_ACTION{<:medias:bouton_enlever_document:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-#ID_DOCUMENT,#SELF},ajax,'','',[(function(){jQuery("#doc(#ID_DOCUMENT)").animateRemove();return true;})()]})]<span>|</span>]
-                               <a href="#URL_ECRIRE{document_edit,id_document=#ID_DOCUMENT}" target="_blank" class="editbox"><:medias:bouton_modifier_document:></a>
+                               <a href="#URL_ECRIRE{document_edit,id_document=#ID_DOCUMENT}" target="_blank" class="editbox" tabindex="0" role="button"><:medias:bouton_modifier_document:></a>
                                <//B_compte>
                                [(#PIPELINE{document_desc_actions,#ARRAY{args,#ARRAY{id_document,#ID_DOCUMENT,position,document_case},data,''}})]
                        </div>
index 69ffa9d..5897ca0 100644 (file)
@@ -36,7 +36,7 @@
                        <BOUCLE_compte(documents_liens){id_document}{0,2} />
                        [(#TOTAL_BOUCLE|=={1}|et{#AUTORISER{modifier,#OBJET,#ID_OBJET}}|et{#VU|=={non}})[(#BOUTON_ACTION{<:medias:bouton_enlever_supprimer_document:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-#ID_DOCUMENT-suppr-safe,#SELF},ajax,<:medias:bouton_enlever_supprimer_document_confirmation:>,'',[(function(){jQuery("#doc(#ID_DOCUMENT)").animateRemove();return true;})()]})]<span>|</span>]
                        [(#AUTORISER{modifier,#OBJET,#ID_OBJET})[(#BOUTON_ACTION{<:medias:bouton_enlever_document:>,#URL_ACTION_AUTEUR{dissocier_document,#ID_OBJET-#OBJET-#ID_DOCUMENT--safe,#SELF},ajax,'','',[(function(){jQuery("#doc(#ID_DOCUMENT)").animateRemove();return true;})()]})]<span>|</span>]
-                       <a href="#URL_ECRIRE{document_edit,id_document=#ID_DOCUMENT}" target="_blank" class="editbox"><:medias:bouton_modifier_document:></a>
+                       <a href="#URL_ECRIRE{document_edit,id_document=#ID_DOCUMENT}" target="_blank" class="editbox" tabindex="0" role="button"><:medias:bouton_modifier_document:></a>
                        <//B_compte>
                        [(#PIPELINE{document_desc_actions,#ARRAY{args,#ARRAY{id_document,#ID_DOCUMENT,position,document_desc},data,''}})]
                </div>
index 3a78e07..2e73532 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="medias"
        categorie="multimedia"
-       version="2.7.58"
+       version="2.7.59"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="prive/themes/spip/images/portfolio-32.png"
@@ -39,8 +39,8 @@
        <pipeline nom="ieconfig_metas" inclure="medias_ieconfig.php" />
 
        <utilise nom="Z" compatibilite="[1.2.1;[" />
-       <utilise nom="mediabox" compatibilite="[0.5.0;[" />
-       <utilise nom="mots" compatibilite="[2.4.0;[" /> 
+       <utilise nom="mediabox" compatibilite="[0.8.1;[" />
+       <utilise nom="mots" compatibilite="[2.4.6;[" /> 
 
        <menu nom="documents" titre="medias:info_documents" parent="menu_edition" icone="images/portfolio-16.png" />
 
index 9e6d582..ebe0bd3 100644 (file)
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
+/**
+ * Gestion de l'action editer_groupes_mots
+ *
+ * @package SPIP\Mots\Actions
+ */
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/filtres');
 
-// Modification d'un groupe de mots
-// http://doc.spip.org/@action_editer_groupe_mots_dist
+/**
+ * Action d'édition d'un groupe de mots clés dans la base de données dont
+ * l'identifiant du groupe est donné en paramètre de cette fonction ou
+ * en argument de l'action sécurisée
+ *
+ * Si aucun identifiant n'est donné, on crée alors un nouveau groupe de
+ * mots clés.
+ * 
+ * @param null|int $id_groupe
+ *     Identifiant du groupe de mot-clé. En absence utilise l'argument
+ *     de l'action sécurisée.
+ * @return array
+ *     Liste (identifiant du groupe de mot clé, Texte d'erreur éventuel)
+**/
 function action_editer_groupe_mots_dist($id_groupe=null)
 {
        if (is_null($id_groupe)){
@@ -24,22 +41,28 @@ function action_editer_groupe_mots_dist($id_groupe=null)
        }
 
        if (!intval($id_groupe)) {
-               $id_groupe = groupemots_inserer();
+               $id_groupe = groupe_mots_inserer();
        }
 
        if ($id_groupe>0)
-               $err = groupemots_modifier($id_groupe);
+               $err = groupe_mots_modifier($id_groupe);
 
        return array($id_groupe,$err);
 }
 
+
 /**
- * Creer un groupe de mots
+ * Insertion d'un groupe de mots clés
  *
+ * @pipeline_appel pre_insertion
+ * @pipeline_appel post_insertion
+ * 
  * @param string $table
- * @return int 
+ *     Tables sur lesquels des mots de ce groupe pourront être liés
+ * @return int|bool
+ *     Identifiant du nouveau groupe de mots clés.
  */
-function groupemots_inserer($table='') {
+function groupe_mots_inserer($table='') {
        $champs = array(
                'titre' => '',
                'unseul' => 'non',
@@ -75,13 +98,22 @@ function groupemots_inserer($table='') {
        return $id_groupe;
 }
 
+
 /**
  * Modifier un groupe de mot
+ * 
  * @param int $id_groupe
+ *     Identifiant du grope de mots clés à modifier
  * @param array|null $set
- * @return string
+ *     Couples (colonne => valeur) de données à modifier.
+ *     En leur absence, on cherche les données dans les champs éditables
+ *     qui ont été postés
+ * @return string|null
+ *     Chaîne vide si aucune erreur,
+ *     Null si aucun champ à modifier,
+ *     Chaîne contenant un texte d'erreur sinon.
  */
-function groupemots_modifier($id_groupe, $set=null) {
+function groupe_mots_modifier($id_groupe, $set=null) {
        $err = '';
 
        include_spip('inc/modifier');
@@ -117,9 +149,64 @@ function groupemots_modifier($id_groupe, $set=null) {
        return $err;
 }
 
+// Fonctions Dépréciées
+// --------------------
 
-// obsolete
+/**
+ * Créer une révision sur un groupe de mot
+ *
+ * @deprecated Utiliser groupe_mots_modifier()
+ * @see groupe_mots_modifier()
+ * 
+ * @param int $id_groupe
+ *     Identifiant du grope de mots clés à modifier
+ * @param array|null $c
+ *     Couples (colonne => valeur) de données à modifier.
+ *     En leur absence, on cherche les données dans les champs éditables
+ *     qui ont été postés
+ * @return string|null
+ *     Chaîne vide si aucune erreur,
+ *     Null si aucun champ à modifier,
+ *     Chaîne contenant un texte d'erreur sinon.
+ */
 function revision_groupe_mot($id_groupe, $c=false) {
-       return groupemots_modifier($id_groupe,$c);
+       return groupe_mots_modifier($id_groupe,$c);
+}
+
+
+/**
+ * Insertion d'un groupe de mots clés
+ *
+ * @deprecated Utiliser groupe_mots_inserer() ou objet_inserer()
+ * @see groupe_mots_inserer()
+ * 
+ * @param string $table
+ *     Tables sur lesquels des mots de ce groupe pourront être liés
+ * @return int|bool
+ *     Identifiant du nouveau groupe de mots clés.
+ */
+function groupemots_inserer($table='') {
+       return groupe_mots_inserer($table);
+}
+
+/**
+ * Modifier un groupe de mot
+ *
+ * @deprecated Utiliser groupe_mots_modifier() ou objet_modifier()
+ * @see groupe_mots_modifier()
+ * 
+ * @param int $id_groupe
+ *     Identifiant du grope de mots clés à modifier
+ * @param array|null $set
+ *     Couples (colonne => valeur) de données à modifier.
+ *     En leur absence, on cherche les données dans les champs éditables
+ *     qui ont été postés
+ * @return string|null
+ *     Chaîne vide si aucune erreur,
+ *     Null si aucun champ à modifier,
+ *     Chaîne contenant un texte d'erreur sinon.
+ */
+function groupemots_modifier($id_groupe, $set=null) {
+       return groupe_mots_modifier($id_groupe, $set);
 }
 ?>
index ff3677d..52fcea0 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="mots"
        categorie="edition"
-       version="2.4.11"
+       version="2.4.12"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="prive/themes/spip/images/mot-32.png"
old mode 100755 (executable)
new mode 100644 (file)
index 74e2874..8a37bec 100644 (file)
                                ]<select name='change_petition' id='change_petition'>
                                        <option value='off'[ (#GET{petition}|non)selected='selected']>
                                        [(#GET{petition}|?{
-                                               [(#VAL{petitions:bouton_radio_supprimer_petition}|_T)]
+                                               [(#VAL{bouton_radio_supprimer_petition}|_T)]
                                                ,
-                                               [(#VAL{petitions:bouton_radio_pas_petition}|_T)]
+                                               [(#VAL{bouton_radio_pas_petition}|_T)]
                                        })]
                                        </option>
                                        <option value='on'[ (#GET{petition}|oui)selected='selected']>
                                        [(#GET{petition}|?{
-                                               [(#VAL{petitions:bouton_radio_petition_activee}|_T)]
+                                               [(#VAL{bouton_radio_petition_activee}|_T)]
                                                ,
-                                               [(#VAL{petitions:bouton_radio_activer_petition}|_T)]
+                                               [(#VAL{bouton_radio_activer_petition}|_T)]
                                        })]
                                        </option>
                                </select>
index 6b191e5..7804e73 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="petitions"
        categorie="communication"
-       version="1.4.5"
+       version="1.4.6"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="prive/themes/spip/images/petition-32.png"
index 9a0a1a2..17ddbf1 100644 (file)
Binary files a/www/plugins-dist/petitions/prive/themes/spip/images/signature-statut-poubelle-24.png and b/www/plugins-dist/petitions/prive/themes/spip/images/signature-statut-poubelle-24.png differ
index f4d307f..4745dfe 100644 (file)
Binary files a/www/plugins-dist/petitions/prive/themes/spip/images/signature-statut-prop-24.png and b/www/plugins-dist/petitions/prive/themes/spip/images/signature-statut-prop-24.png differ
index a5639d4..1a3f383 100644 (file)
Binary files a/www/plugins-dist/petitions/prive/themes/spip/images/signature-statut-publie-24.png and b/www/plugins-dist/petitions/prive/themes/spip/images/signature-statut-publie-24.png differ
index 9a0a1a2..17ddbf1 100644 (file)
Binary files a/www/plugins-dist/petitions/prive/themes/spip2/images/signature-statut-poubelle-24.png and b/www/plugins-dist/petitions/prive/themes/spip2/images/signature-statut-poubelle-24.png differ
index f4d307f..4745dfe 100644 (file)
Binary files a/www/plugins-dist/petitions/prive/themes/spip2/images/signature-statut-prop-24.png and b/www/plugins-dist/petitions/prive/themes/spip2/images/signature-statut-prop-24.png differ
index a5639d4..1a3f383 100644 (file)
Binary files a/www/plugins-dist/petitions/prive/themes/spip2/images/signature-statut-publie-24.png and b/www/plugins-dist/petitions/prive/themes/spip2/images/signature-statut-publie-24.png differ
index 20a2eab..eff74c9 100644 (file)
@@ -28,8 +28,10 @@ function afficher_diff_champ_dist($champ,$old,$new,$format='diff'){
        if ($old==$new)
                $out = ($format!='complet'?'':$new);
        else {
-               if($f = charger_fonction($champ,'afficher_diff'))
-                       return $f($champ,$old,$new,$format='diff');
+               if($f = charger_fonction($champ,'afficher_diff', true)){
+                       return $f($champ, $old, $new, $format);
+               }
+               
                $diff = new Diff(new DiffTexte);
                $n = preparer_diff($new);
                $o = preparer_diff($old);
index a76ea2f..69b71ba 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="revisions"
        categorie="edition"
-       version="1.7.7"
+       version="1.7.8"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="prive/themes/spip/images/revision-32.png"
index abde33c..c612950 100644 (file)
@@ -18,7 +18,7 @@
                </tr>
        </thead>
        <tbody>
-       <BOUCLE_liste_rev(VERSIONS){id_version>1}{objet!=''}{id_auteur?}{id_objet?}{objet?}{where?}{recherche?}{tri #ENV{par,date},#GET{defaut_tri}}{pagination #ENV{nb,10}}>
+       <BOUCLE_liste_rev(VERSIONS){id_version>1}{objet!=''}{id_auteur?}{id_objet?}{objet?}{where?}{tri #ENV{par,date},#GET{defaut_tri}}{pagination #ENV{nb,10}}>
                <BOUCLE_auteur(AUTEURS){id_auteur}{si #ID_AUTEUR|is_numeric}{tout}>[(#SET{td_auteur,<a href="[(#ID_AUTEUR|generer_url_entite{auteur})]">#NOM</a>})]
                </BOUCLE_auteur>[(#SET{td_auteur,#ID_AUTEUR})]<//B_auteur>
                [(#AUTORISER{voirrevisions, #OBJET, #ID_OBJET}|oui)
index a163a6d..e7d26a7 100644 (file)
@@ -43,7 +43,7 @@ function analyser_site($url) {
 
                if ($t = extraire_balise($header, 'title')) {
                        cdata_echappe_retour($t, $echappe_cdata);
-                       $result['nom_site'] = supprimer_tags($t);
+                       $result['nom_site'] = filtrer_entites(supprimer_tags($t));
                }
                if ($t = extraire_balises($header, 'link')) {
                        cdata_echappe_retour($t, $echappe_cdata);
@@ -65,7 +65,7 @@ function analyser_site($url) {
                if ($a = extraire_balise($header, 'description')
                OR $a = extraire_balise($header, 'tagline')) {
                        cdata_echappe_retour($a, $echappe_cdata);
-                       $result['descriptif'] = supprimer_tags($a);
+                       $result['descriptif'] = filtrer_entites(supprimer_tags($a));
                }
 
                if (preg_match(',<image.*<url.*>(.*)</url>.*</image>,Uims',
index 641e7a7..c1a5ae0 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="sites"
        categorie="edition"
-       version="1.7.12"
+       version="1.7.13"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="prive/themes/spip/images/site-32.png"
index f4d307f..4745dfe 100644 (file)
Binary files a/www/plugins-dist/sites/prive/themes/spip/images/syndic-statut-dispo-24.png and b/www/plugins-dist/sites/prive/themes/spip/images/syndic-statut-dispo-24.png differ
index 9a0a1a2..17ddbf1 100644 (file)
Binary files a/www/plugins-dist/sites/prive/themes/spip/images/syndic-statut-off-24.png and b/www/plugins-dist/sites/prive/themes/spip/images/syndic-statut-off-24.png differ
index a5639d4..1a3f383 100644 (file)
Binary files a/www/plugins-dist/sites/prive/themes/spip/images/syndic-statut-publie-24.png and b/www/plugins-dist/sites/prive/themes/spip/images/syndic-statut-publie-24.png differ
index f4d307f..4745dfe 100644 (file)
Binary files a/www/plugins-dist/sites/prive/themes/spip2/images/syndic-statut-dispo-24.png and b/www/plugins-dist/sites/prive/themes/spip2/images/syndic-statut-dispo-24.png differ
index 9a0a1a2..17ddbf1 100644 (file)
Binary files a/www/plugins-dist/sites/prive/themes/spip2/images/syndic-statut-off-24.png and b/www/plugins-dist/sites/prive/themes/spip2/images/syndic-statut-off-24.png differ
index a5639d4..1a3f383 100644 (file)
Binary files a/www/plugins-dist/sites/prive/themes/spip2/images/syndic-statut-publie-24.png and b/www/plugins-dist/sites/prive/themes/spip2/images/syndic-statut-publie-24.png differ
index 9b3b4e2..ed69458 100644 (file)
@@ -83,7 +83,7 @@ table#visites tr.c_recap th {background-color:#[(#GET{foncee}|couleur_foncer)];c
 .stats_referers .action.plus {text-align:right;font-size:1.5em;font-weight:bold;}
 
 .stats_repartition .couleur_cumul { background: #GET{foncee}; }
-.stats_repartition .couleur_nombre { background: #GET{claire}; }
+.stats_repartition .couleur_nombre { background: [#(#GET{foncee}|couleur_eclaircir)]; }
 .stats_repartition table h3,.stats_repartition table table {margin-bottom: 0;padding-bottom: 0;padding-top: 0;}
 .stats_repartition table h3 {font-size: inherit;margin-bottom: 3px;margin-top:3px;}
 .stats_repartition table {margin: 0;}
index 430e30f..aebed3e 100644 (file)
 
                <p class='explication'><:svp:telecharger_archive_plugin_explication:></p>
                <ul>
-                       <li class="editer_archive haut obligatoire[(#ENV{erreurs/phrase}|oui) erreur]">
-                               <label for="phrase"><:svp:label_archive:></label>
-                               [<span class="erreur_message">(#ENV{erreurs/phrase})</span>]
+                       <li class="editer_archive haut obligatoire[(#ENV{erreurs/archive}|oui) erreur]">
+                               <label for="archive"><:svp:label_archive:></label>
+                               [<span class="erreur_message">(#ENV{erreurs/archive})</span>]
                                <input type="text" name="archive" value="#ENV{archive}" class="text" />
                        </li>
                        <li class="editer_destination[(#ENV{erreurs/destination}|oui) erreur]">
                                <label for="destination"><:svp:label_destination:></label>
-                               [<span class="erreur_message">(#ENV{erreurs/phrase})</span>]
+                               [<span class="erreur_message">(#ENV{erreurs/destination})</span>]
                                <p class='explication'><:svp:explication_destination:></p>
                                <input type="text" name="destination" value="#ENV{destination}" class="text" />
                        </li>
index 93d0f32..57c05ea 100644 (file)
@@ -38,23 +38,29 @@ function formulaires_charger_plugin_archive_verifier_dist(){
        if (!$archive = _request('archive')) {
                $erreurs['archive'] = _T('info_obligatoire');
        } else {
-               // calcul du répertoire de destination
-               if (!$destination = _request('destination')) {
-                       $destination = pathinfo($archive);
-                       $destination = $destination['filename'];
+               // Validité de l'url de l'archive
+               $infos_archive = pathinfo($archive);
+               if (!isset($infos_archive['extension'])) {
+                       $erreurs['archive'] = _T('svp:message_nok_url_archive');
                }
-               $destination = str_replace('../', '', $destination);
-               set_request('destination', $destination);
+               else {
+                       // calcul du répertoire de destination
+                       if (!$destination = _request('destination')) {
+                               $destination = $infos_archive['filename'];
+                       }
+                       $destination = str_replace('../', '', $destination);
+                       set_request('destination', $destination);
 
-               // si la destination existe, on demande confirmation de l'ecrasement.
-               $dir = _DIR_PLUGINS_AUTO . $destination;
-               if (is_dir($dir) and !_request('confirmer')) {
-                       $base = dirname($dir);
-                       $nom = basename($dir);
-                       $backup = "$base/.$nom.bck";
-                       $erreurs['confirmer'] = _T("svp:confirmer_telecharger_dans", array(
-                               'dir' => joli_repertoire($dir),
-                               'dir_backup' => joli_repertoire($backup)));
+                       // si la destination existe, on demande confirmation de l'ecrasement.
+                       $dir = _DIR_PLUGINS_AUTO . $destination;
+                       if (is_dir($dir) and !_request('confirmer')) {
+                               $base = dirname($dir);
+                               $nom = basename($dir);
+                               $backup = "$base/.$nom.bck";
+                               $erreurs['confirmer'] = _T("svp:confirmer_telecharger_dans", array(
+                                       'dir' => joli_repertoire($dir),
+                                       'dir_backup' => joli_repertoire($backup)));
+                       }
                }
        }
 
index 417b21a..2ce2688 100644 (file)
@@ -55,8 +55,9 @@ function svp_ajouter_depot($url, &$erreur='') {
                $erreur = _T('svp:message_nok_xml_non_conforme', array('fichier' => $url));
                return false;
        }
-       
-       $champs = array('titre' => filtrer_entites($infos['depot']['titre']),
+
+       $titre = filtrer_entites($infos['depot']['titre']);
+       $champs = array('titre' => $titre,
                                        'descriptif' => filtrer_entites($infos['depot']['descriptif']),
                                        'type' => $infos['depot']['type'],
                                        'url_serveur' => $infos['depot']['url_serveur'],
@@ -68,11 +69,18 @@ function svp_ajouter_depot($url, &$erreur='') {
                                        'nbr_paquets' => 0,
                                        'nbr_plugins' => 0,
                                        'nbr_autres' => 0);
-       if (!$id_depot = sql_insertq('spip_depots', $champs)) {
-               $erreur = _T('svp:message_nok_sql_insert_depot', array('objet' => $titre));
+
+       // verifier avant l'insertion que le depot n'existe pas deja
+       // car la recuperation pouvant etre longue on risque le probleme en cas de concurrence
+       if (sql_countsel('spip_depots','xml_paquets='.sql_quote($url))){
+               $erreur = _T('svp:message_nok_depot_deja_ajoute', array('url' => $url));
                return false;
        }
-       
+       elseif (!$id_depot = sql_insertq('spip_depots', $champs)) {
+               $erreur = _T('svp:message_nok_sql_insert_depot', array('objet' => "$titre ($url)"));
+               return false;
+       }
+
        // Ajout des paquets dans spip_paquets et actualisation des plugins dans spip_plugins
        $ok = svp_actualiser_paquets($id_depot, $infos['paquets'], $nb_paquets, $nb_plugins, $nb_autres);
        if (!$ok OR ($nb_paquets == 0)) {
index 4a142a5..1758941 100644 (file)
@@ -221,6 +221,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
        'message_nok_plugin_inexistant' => 'Le plugin demandé est inexistant (@plugin@).',
        'message_nok_sql_insert_depot' => 'Erreur SQL lors de l’ajout du dépôt @objet@',
        'message_nok_url_depot_incorrecte' => 'L’adresse « @url@ » est incorrecte',
+       'message_nok_url_archive' => 'L’URL de l\'archive est invalide',
        'message_nok_xml_non_conforme' => 'Le fichier XML « @fichier@ » de description du dépôt n’est pas conforme',
        'message_nok_xml_non_recupere' => 'Le fichier XML « @fichier@ » n’a pas pu être récupéré',
        'message_ok_aucun_plugin_trouve' => 'Aucun plugin ne correspond aux critères choisis.',
index 5d39a2d..496997b 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="svp"
        categorie="maintenance"
-       version="0.80.18"
+       version="0.80.19"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="svp-64.png"
index 7a0f6f9..bb51e7b 100644 (file)
Binary files a/www/plugins-dist/svp/prive/themes/spip/images/depot-16.png and b/www/plugins-dist/svp/prive/themes/spip/images/depot-16.png differ
index 1cef0d1..922557e 100644 (file)
Binary files a/www/plugins-dist/svp/prive/themes/spip/images/depot-32.png and b/www/plugins-dist/svp/prive/themes/spip/images/depot-32.png differ
index 28bd55f..95ffb0b 100644 (file)
Binary files a/www/plugins-dist/svp/prive/themes/spip/images/fond-installe.png and b/www/plugins-dist/svp/prive/themes/spip/images/fond-installe.png differ
index 1ff0503..3ca03c8 100644 (file)
Binary files a/www/plugins-dist/svp/prive/themes/spip/images/fond-verrou.png and b/www/plugins-dist/svp/prive/themes/spip/images/fond-verrou.png differ
index 84d499f..ce6eb6e 100644 (file)
@@ -33,8 +33,9 @@ function tw_traiter_autoliens($r) {
        } else  $protocol = 'http';
        // valider le nom de domaine
        if (!preg_match(_EXTRAIRE_DOMAINE, $l)) return $tout;
-       // supprimer les ponctuations a la fin d'une URL
-       preg_match('/^(.*?)([,.;?]?)$/', $l, $k);
+       // les ponctuations a la fin d'une URL n'en font certainement pas partie
+       // en particulier le "|" quand elles sont dans un tableau a la SPIP
+       preg_match('/^(.*?)([,.;?|]?)$/', $l, $k);
        $url = $protocol.'://'.$k[1];
        $lien = charger_fonction('lien', 'inc');
        // deux fois <html> car inc_lien echappe un coup et restaure ensuite
old mode 100755 (executable)
new mode 100644 (file)
index 35eac21..a3405d8 100644 (file)
@@ -1,7 +1,7 @@
 <paquet
        prefix="tw"
        categorie="edition"
-       version="0.8.23"
+       version="0.8.26"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="textwheel-32.png"
@@ -17,6 +17,6 @@
        <pipeline nom="trig_purger" inclure="inc/textwheel.php" />
        <pipeline nom="pre_echappe_html_propre" action="" />
        <pipeline nom="pre_liens" action="autoliens" inclure="inc/autoliens.php" />
-       <utilise nom="yaml" compatibilite="[1.3;[" />
-       <utilise nom="memoization" compatibilite="[0.9;[" />
+       <utilise nom="yaml" compatibilite="[1.5.1;[" />
+       <utilise nom="memoization" compatibilite="[0.9.8;[" />
 </paquet>
index 1164afc..0d85b83 100644 (file)
@@ -85,6 +85,12 @@ puce:
   is_callback: Y
   priority: -20 # avant !paragraphes
 
+br-inutile:
+  match: "/(^|^\n|\n\n)_ +/S"
+  replace: "$1"
+  if_str: "_ "
+  priority: -20 # avant !paragraphes
+
 br:
   match: "/\n_ +/S"
   replace: "<br class='manualbr' />"
@@ -177,3 +183,15 @@ restaure-tags:
   match: ["\x1\x1", "\x1\x2", "\x1\x3", "\x1\x4"]
   replace: ['{', '}', '_', '-']
   type: str
+
+echappe-chevron-solitaire:
+  # un < qui n'est pas suivi d'une lettre ou d'un / est toujours echappe
+  type: preg
+  match: "/<(?=[^a-z\/!])/Uims"
+  replace: "&lt;"
+
+echappe-chevron-pas-ferme:
+  # un < suivi d'une lettre ou d'un / est echappe si il semble mal ferme
+  type: preg
+  match: "/<([^><\"'!]*)(?=<|$)/Uims"
+  replace: "&lt;$1"
\ No newline at end of file
index 9c94e89..ba4cc95 100644 (file)
@@ -95,8 +95,8 @@ function url_insert(&$set,$confirmer,$separateur){
                $separateur = "-";
 
        // Si l'insertion echoue, c'est une violation d'unicite.
-       $where_urllike = 'url LIKE '.url_sql_quote_like($set['url']);
-       $where_thisurl = $where_urllike." AND id_parent=".intval($set['id_parent']);
+       $where_urllike = 'url LIKE '.url_sql_quote_like($set['url'])." AND NOT(type=".sql_quote($set['type'])." AND id_objet=".intval($set['id_objet']).")";
+       $where_thisurl = $where_urllike.($has_parent?" AND id_parent=".intval($set['id_parent']):"");
        if (
                // si pas de parent defini, il faut que cette url soit unique, independamment de id_parent
                // il faut utiliser un LIKE pour etre case unsensitive en sqlite
@@ -107,12 +107,13 @@ function url_insert(&$set,$confirmer,$separateur){
                if (
                        (!is_dir(_DIR_RACINE.$set['url']) AND !file_exists(_DIR_RACINE.$set['url']))
                        // un vieux url
-                       AND $vieux = sql_fetsel('*', 'spip_urls', $where_thisurl)
+                       AND $vieux = sql_fetsel('*', 'spip_urls', $where_thisurl,'','perma DESC')
                        // qui n'est pas permanente
                        AND !$vieux['perma']
                  // et dont l'objet a une url plus recente
                  AND $courant = sql_fetsel('*', 'spip_urls',
                          'type='.sql_quote($vieux['type']).' AND id_objet='.sql_quote($vieux['id_objet'])
+                         .' AND url<>'.sql_quote($set['url'])
                          .' AND date>'.sql_quote($vieux['date']), '', 'date DESC', 1)
                  ) {
                        if ($confirmer AND !_request('ok2')) {
@@ -124,6 +125,9 @@ function url_insert(&$set,$confirmer,$separateur){
                        // si oui on le chipe
                        sql_updateq('spip_urls', $set, $where_thisurl);
                        sql_updateq('spip_urls', array('date' => date('Y-m-d H:i:s')), $where_thisurl);
+                       spip_log("reattribue url ".$vieux['url']
+                               ." de ".$vieux['type']."#".$vieux['id_objet']." (parent ".$vieux['id_parent'].")"
+                               ." A ".$set['type']."#".$set['id_objet']." (parent ".$set['id_parent'].")","urls"._LOG_INFO_IMPORTANTE);
                }
 
                // Sinon
@@ -135,32 +139,33 @@ function url_insert(&$set,$confirmer,$separateur){
 
                        // il peut etre du a un changement de casse de l'url simplement
                        // pour ce cas, on reecrit systematiquement l'url en plus d'actualiser la date
-                       do {
-                               $where = "type=".sql_quote($set['type'])
-                                                                ." AND id_objet=".intval($set['id_objet'])
-                                                                ." AND id_parent=".intval($set['id_parent'])
-                                                                ." AND url LIKE ";
-                               if (
-                                       !is_dir(_DIR_RACINE.$set['url']) AND !file_exists(_DIR_RACINE.$set['url'])
-                                       AND sql_countsel('spip_urls', $where  .url_sql_quote_like($set['url']))) {
-                                       sql_updateq('spip_urls', array('url'=>$set['url'], 'date' => date('Y-m-d H:i:s')), $where  .url_sql_quote_like($set['url']));
-                                       spip_log("reordonne ".$set['type']." ".$set['id_objet']);
+                       $where = "type=".sql_quote($set['type'])
+                                                        ." AND id_objet=".intval($set['id_objet'])
+                                                        ." AND id_parent=".intval($set['id_parent'])
+                                                        ." AND url LIKE ";
+                       if (
+                               !is_dir(_DIR_RACINE.$set['url']) AND !file_exists(_DIR_RACINE.$set['url'])
+                               AND sql_countsel('spip_urls', $where  .url_sql_quote_like($set['url']))) {
+                               sql_updateq('spip_urls', array('url'=>$set['url'], 'date' => date('Y-m-d H:i:s')), $where  .url_sql_quote_like($set['url']));
+                               spip_log("reordonne ".$set['type']." ".$set['id_objet'],"urls");
+                               $redate = false;
+                       }
+                       else {
+                               $set['url'] .= $separateur.$set['id_objet'];
+                               if (strlen($set['url']) > 200)
+                                       //serveur out ? retourner au mieux
+                                       return false;
+                               elseif (sql_countsel('spip_urls', $where . url_sql_quote_like($set['url']))) {
+                                       sql_updateq('spip_urls', array('url'=>$set['url'], 'date' => date('Y-m-d H:i:s')), $where .url_sql_quote_like($set['url']));
                                        $redate = false;
-                                       continue;
                                }
                                else {
-                                       $set['url'] .= $separateur.$set['id_objet'];
-                                       if (strlen($set['url']) > 200)
-                                               //serveur out ? retourner au mieux
-                                               return false;
-                                       elseif (sql_countsel('spip_urls', $where . url_sql_quote_like($set['url']))) {
-                                               sql_updateq('spip_urls', array('url'=>$set['url'], 'date' => date('Y-m-d H:i:s')), $where .url_sql_quote_like($set['url']));
-                                               $redate = false;
-                                               continue;
-                                       }
+                                       // remettre id_parent et perma comme il faut si besoin
+                                       if (!$has_parent) unset($set['id_parent']);
+                                       if ($perma) $set['perma'] = true;
+                                       return url_insert($set, $confirmer, $separateur);
                                }
-                       } while ($redate AND @sql_insertq('spip_urls', $set) <= 0);
-
+                       }
                }
        }
 
@@ -172,7 +177,7 @@ function url_insert(&$set,$confirmer,$separateur){
        if ($perma)
                sql_update('spip_urls', array('perma' => "($where_thisurl)"), "type=".sql_quote($set['type'])." AND id_objet=".intval($set['id_objet']));
        
-       spip_log("Creation de l'url propre '" . $set['url'] . "' pour ".$set['type']." ".$set['id_objet']." (parent ".$set['id_parent']." perma $perma)","urls");
+       spip_log("Creation de l'url propre '" . $set['url'] . "' pour ".$set['type']." ".$set['id_objet']." (parent ".$set['id_parent']." perma ".($perma?"1":"0").")","urls");
        return true;
 }
 
index 46acc9b..c4245eb 100644 (file)
@@ -35,7 +35,7 @@ function urls_declarer_tables_auxiliaires($tables_auxiliaires){
                "id_parent"     => "bigint(21) DEFAULT '0' NOT NULL",
                "url"                   => "VARCHAR(255) NOT NULL",
                // la table cible
-               "type"                  => "varchar(15) DEFAULT 'article' NOT NULL",
+               "type"                  => "varchar(25) DEFAULT 'article' NOT NULL",
                // l'id dans la table
                "id_objet"              => "bigint(21) NOT NULL",
                // pour connaitre la plus recente.
index 102909e..e4030fa 100644 (file)
@@ -54,7 +54,7 @@ function type_urls_lister(){
        $dispo = array();
        foreach (find_all_in_path('urls/', '\w+\.php$', array()) as $f) {
                $r = basename($f, '.php');
-               if ($r == 'index' OR strncmp('generer_',$r,8)==0) continue;
+               if ($r == 'index' OR strncmp('generer_',$r,8)==0 OR $r=="standard") continue;
                include_once $f;
                $exemple = 'URLS_' . strtoupper($r) . '_EXEMPLE';
                $exemple = defined($exemple) ? constant($exemple) : '?';
index 2aa6873..3dbee8c 100644 (file)
@@ -32,7 +32,7 @@ function formulaires_editer_url_objet_verifier($type,$id){
                $erreurs['url'] = _T('info_obligatoire');
        }
        else {
-               $type_urls = (isset($GLOBALS['type_urls'])?$GLOBALS['type_urls']:$GLOBALS['meta']['type_urls']);
+               $type_urls = ((isset($GLOBALS['type_urls']) AND $GLOBALS['type_urls']!='page')?$GLOBALS['type_urls']:$GLOBALS['meta']['type_urls']);
                if ($type_urls=='arbo' AND strpos($url,'/')!==false){
                        $url = explode('/',$url);
                        if (count($url)>2)
@@ -70,7 +70,7 @@ function formulaires_editer_url_objet_traiter($type,$id){
        // les urls manuelles sont toujours permanentes
        $set = array('url' => _request('url'), 'type' => $type, 'id_objet' => $id, 'perma'=>1);
 
-       $type_urls = (isset($GLOBALS['type_urls'])?$GLOBALS['type_urls']:$GLOBALS['meta']['type_urls']);
+       $type_urls = ((isset($GLOBALS['type_urls']) AND $GLOBALS['type_urls']!='page')?$GLOBALS['type_urls']:$GLOBALS['meta']['type_urls']);
        if (include_spip("urls/$type_urls")
                AND function_exists($renseigner_url = "renseigner_url_$type_urls")
                AND $r = $renseigner_url($type,$id)
index fa4f7f3..edb1c9f 100644 (file)
@@ -1,11 +1,11 @@
 <paquet
        prefix="urls"
        categorie="statistique"
-       version="1.4.16"
+       version="1.4.23"
        etat="stable"
        compatibilite="[3.0.0;3.0.*]"
        logo="prive/themes/spip/images/url-32.png"
-       schema="1.1.3"
+       schema="1.1.4"
 >      
 
        <nom>Urls Etendues</nom>
index 70ed81a..df18e0e 100644 (file)
@@ -4,7 +4,14 @@
        id_objet,1
        type,1
 }})
-]<B_liste_urls>
+]
+[(#VAL{_AJAX}|defined|oui)
+<script type="text/javascript">if (window.jQuery) jQuery(function(){
+       jQuery('#url-#TYPE-#ID_OBJET').html('[(#ID_OBJET|generer_url_entite{#TYPE,'','',#EVAL{true}}|url_absolue|texte_script)]');
+       jQuery('.formulaire_editer_url_objet .reponse_formulaire_ok').remove();})
+</script>
+]
+<B_liste_urls>
 #ANCRE_PAGINATION
 <div class="liste-objets urls">
 <table class='spip liste'>
@@ -13,8 +20,7 @@
                <tr class='first_row'>
                        <th class='perma' scope='col'></th>
                        <th class='url principale' scope='col'>[(#TRI{url,<:urls:label_tri_url:>,ajax})]</th>
-                       <th class='objet' scope='col'>[(#TRI{type,<:urls:info_objet:>,ajax})]</th>
-                       <th class='id' scope='col'><:info_numero_abbreviation:></th>
+                       <th class='objet' scope='col'>[(#TRI{type,<:urls:info_objet:> <:info_numero_abbreviation:>,ajax})]</th>
                        <th class='parent' scope='col'><:urls:info_id_parent:></th>
                        <th class='date secondaire' scope='col'>[(#TRI{date,<:date:>,ajax})]</th>
                        <th class="action"></th>
@@ -25,8 +31,7 @@
                <tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">
                        <td class='perma'>[(#PERMA|?{#CHEMIN_IMAGE{cadenas-16.png}|balise_img})]</td>
                        <td class='url principale'>#URL</td>
-                       <td class='objet'>[(#TYPE|objet_info{texte_objet}|_T)]</td>
-                       <td class='id'>#ID_OBJET</td>
+                       <td class='objet'><a href="[(#ID_OBJET|generer_url_entite{#TYPE})]">[(#TYPE|objet_info{texte_objet}|_T)]&nbsp;#ID_OBJET</a></td>
                        <td class='parent'>[(#ID_PARENT|?{#ID_PARENT})]</td>
                        <td class='date secondaire'>[(#DATE|affdate_jourcourt)]</td>
                        <td class='action'>[(#AUTORISER{modifier,#TYPE,#ID_OBJET})[(#BOUTON_ACTION{[(#CHEMIN_IMAGE{supprimer-12}|balise_img{<:urls:bouton_supprimer_url:>})],[(#URL_ACTION_AUTEUR{supprimer_url,[(#ID_PARENT)-#URL],#SELF})],ajax})]]</td>
@@ -38,7 +43,4 @@
 </div>
 </B_liste_urls>[
 <div class="liste-objets urls caption-wrap"><strong class="caption">(#ENV*{sinon,''})</strong></div>
-]<//B_liste_urls>
-[(#VAL{_AJAX}|defined|oui)
-<script type="text/javascript">if (window.jQuery) jQuery(function(){jQuery('#url-#TYPE-#ID_OBJET').html('[(#ID_OBJET|generer_url_entite{#TYPE,'','',#EVAL{true}}|url_absolue|texte_script)]');})</script>
-]
+]<//B_liste_urls>
\ No newline at end of file
index 4d7aac2..a78e99f 100644 (file)
@@ -76,9 +76,8 @@ defined('CONFIRMER_MODIFIER_URL') || define('CONFIRMER_MODIFIER_URL', false);
  * 
  */
 
-include_spip('inc/xcache');
-if (!function_exists('Cache')) {
-       function Cache(){return null;}
+if (!function_exists('cache_me')) {
+       function cache_me(){return null;}
 }
 
 $config_urls_arbo = isset($GLOBALS['meta']['urls_arbo'])?unserialize($GLOBALS['meta']['urls_arbo']):array();
@@ -276,7 +275,7 @@ function renseigner_url_arbo($type,$id_objet){
 function declarer_url_arbo($type, $id_objet) {
        static $urls=array();
        // utiliser un cache memoire pour aller plus vite
-       if(!is_null($C=Cache())) return$C;
+       if(!is_null($C=cache_me())) return $C;
        
        // Se contenter de cette URL si elle existe ;
        // sauf si on invoque par "voir en ligne" avec droit de modifier l'url
@@ -596,18 +595,35 @@ function urls_arbo_dist($i, $entite, $args='', $ancre='') {
                }
 
                if (count($url_arbo_new)){
-                       foreach($url_arbo_new as $k=>$o)
-                               if ($s = declarer_url_arbo($o['objet'],$o['id_objet']))
-                                       $url_arbo_new[$k] = $s;
-                               else
-                                       $url_arbo_new[$k] = implode('/',$o['segment']);
-                       $url_arbo_new = ltrim(implode('/',$url_arbo_new),'/');
-                       
-                       if ($url_arbo_new!==$url_propre){
-                               $url_redirect = $url_arbo_new;
+                       $caller = debug_backtrace();
+                       $caller = $caller[1]['function'];
+                       // si on est appele par un autre module d'url c'est du decodage d'une ancienne URL
+                       // ne pas regenerer des segments arbo, mais rediriger vers la nouvelle URL
+                       // dans la nouvelle forme
+                       if (strncmp($caller,"urls_",5)==0 AND $caller!=="urls_decoder_url"){
                                // en absolue, car assembler ne gere pas ce cas particulier
                                include_spip('inc/filtres_mini');
-                               $url_redirect = url_absolue($url_redirect);
+                               $col_id = id_table_objet($entite);
+                               $url_new = generer_url_entite($contexte[$col_id],$entite);
+                               // securite contre redirection infinie
+                               if ($url_new!==$url_propre
+                                       AND rtrim($url_new,"/")!==rtrim($url_propre,"/"))
+                                       $url_redirect = url_absolue($url_new);
+                       }
+                       else {
+                               foreach($url_arbo_new as $k=>$o)
+                                       if ($s = declarer_url_arbo($o['objet'],$o['id_objet']))
+                                               $url_arbo_new[$k] = $s;
+                                       else
+                                               $url_arbo_new[$k] = implode('/',$o['segment']);
+                               $url_arbo_new = ltrim(implode('/',$url_arbo_new),'/');
+
+                               if ($url_arbo_new!==$url_propre){
+                                       $url_redirect = $url_arbo_new;
+                                       // en absolue, car assembler ne gere pas ce cas particulier
+                                       include_spip('inc/filtres_mini');
+                                       $url_redirect = url_absolue($url_redirect);
+                               }
                        }
                }
 
index 69884e0..f58e1ef 100644 (file)
@@ -118,20 +118,33 @@ function declarer_url_propre($type, $id_objet) {
 
        // Recuperer une URL propre correspondant a l'objet.
        // mais urls a 1 segment uniquement (pas d'urls /)
-       $row = sql_fetsel("U.url, U.date, U.perma, $champ_titre",
+       // de preference avec id_parent=0, puis perma, puis par date desc
+       $row = sql_fetsel("U.url, U.date, U.id_parent, U.perma, $champ_titre",
                          "$table AS O LEFT JOIN spip_urls AS U ON (U.type='$type' AND U.id_objet=O.$col_id)",
-                         "O.$col_id=$id_objet AND (U.segments IS NULL OR U.segments=1)", '', 'U.date DESC', 1);
+                         "O.$col_id=$id_objet AND (U.segments IS NULL OR U.segments=1)", '', 'U.id_parent=0 DESC, U.perma DESC, U.date DESC', 1);
 
        // en SQLite le left join retourne du vide si il y a une url mais qui ne correspond pas pour la condition sur le segment
        // on verifie donc que l'objet existe bien avant de sortir ou de creer une url pour cet objet
        if (!$row)
-               $row = sql_fetsel("'' as url, '' as date, 0 as perma, $champ_titre",
+               $row = sql_fetsel("'' as url, '' as date, 0 as id_parent, 0 as perma, $champ_titre",
                                  "$table AS O",
                                  "O.$col_id=$id_objet");
+
        if (!$row) return ""; # Quand $id_objet n'est pas un numero connu
 
        $url_propre = $row['url'];
 
+       // si url_propre connue mais avec id_parent non nul, essayer de reinserer tel quel avec id_parent=0
+       if ($url_propre AND $row['id_parent']){
+               include_spip('action/editer_url');
+               $set = array('url' => $url_propre, 'type' => $type, 'id_objet' => $id_objet, 'perma' => $row['perma']);
+               // si on arrive pas a reinserer tel quel, on annule url_propre pour forcer un recalcul d'url
+               if (!url_insert($set,false,_url_propres_sep_id))
+                       $url_propre = "";
+               else
+                       $url_propre = $row['url'] = $set['url'];
+       }
+
        // Se contenter de cette URL si elle existe ;
        // sauf si on invoque par "voir en ligne" avec droit de modifier l'url
 
@@ -393,4 +406,4 @@ function urls_propres_dist($i, $entite, $args='', $ancre='') {
        return array($contexte, $entite, $url_redirect, $is_qs?$entite:null);
 }
 
-?>
+?>
\ No newline at end of file
index 3734086..91e1b7a 100644 (file)
@@ -12,6 +12,8 @@
 
 
 ## type d'URLs obsolete
+## depuis la 3.0.17 on ne la propose plus dans le menu de configuration
+## fichier sans doute à supprimer en 3.1
 
 if (!defined("_ECRIRE_INC_VERSION")) return; // securiser
 
index bd90b70..661938d 100644 (file)
@@ -52,6 +52,9 @@ function urls_upgrade($nom_meta_base_version,$version_cible){
        $maj['1.1.3'] = array(
                array('sql_alter',"table spip_urls ADD perma TINYINT(1) DEFAULT '0' NOT NULL"),
        );
+       $maj['1.1.4'] = array(
+               array('sql_alter',"table spip_urls CHANGE `type` `type` varchar(25) DEFAULT 'article' NOT NULL"),
+       );
 
        include_spip('base/upgrade');
        maj_plugin($nom_meta_base_version, $version_cible, $maj);
old mode 100755 (executable)
new mode 100644 (file)
index 936e446..333173d 100644 (file)
@@ -13,7 +13,7 @@
        ]
        [
                [(#OBJET|objet_info{#ID_OBJET|?{texte_modifier,texte_creer}}|_T)]
-               <h1>(#ENV{titre,#INFO_TITRE{#OBJET,#ID_OBJET}|sinon{<:info_sans_titre:>}})</h1>
+               <h1>(#ENV*{titre,#INFO_TITRE{#OBJET,#ID_OBJET}|sinon{<:info_sans_titre:>}})</h1>
        ]
 </div>
 
index 3cfec3a..0d8f33a 100644 (file)
@@ -12,7 +12,7 @@
        ]
        [
                [(#OBJET|objet_info{#ID_OBJET|?{texte_modifier,texte_creer}}|_T)]
-               <h1>(#ENV{titre,#INFO_TITRE{#OBJET,#ID_OBJET}|sinon{<:info_sans_titre:>}})</h1>
+               <h1>(#ENV*{titre,#INFO_TITRE{#OBJET,#ID_OBJET}|sinon{<:info_sans_titre:>}})</h1>
        ]
 </div>
 
index c99cfa8..bd88bc5 100644 (file)
                        [<li class="fieldset">
                                <fieldset>
                                        <legend><:icone_gestion_langues:></legend>
-                                       <p><:info_multi_langues_choisies:></p>
+                                       <p><:info_multi_langues_choisies:>
+                                               [(#ENV{_nb_langues_selection}|>{10}|oui)
+                                               \(<a href="#" onclick="jQuery('#langues_proposees').find('input\[type=checkbox\]').attr('checked',false);return false;"><:lien_tout_decocher:></a>\)
+                                               ]
+                                       </p>
                                        (#ENV**{_langues,''})
                                        <p><:info_multi_langues_soulignees:></p>
                                </fieldset>
index 88f4e35..a15523a 100644 (file)
@@ -22,6 +22,7 @@ function formulaires_configurer_multilinguisme_charger_dist(){
 
                $selection = (is_null(_request('multi_objets'))?explode(',', $GLOBALS['meta']['langues_multilingue']):_request('langues_auth'));
                $valeurs['_langues'] = saisie_langues_utiles('langues_auth',$selection?$selection:array());
+               $valeurs['_nb_langues_selection'] = count($selection);
        }
 
        return $valeurs;
index 5ad0498..11ebe7a 100644 (file)
@@ -88,7 +88,7 @@ function url_vignette_choix($process){
                                return '';
                        break;
                case 'imagick':
-                       if (!function_exists('imagick_readimage'))
+                       if (!method_exists('Imagick','readImage'))
                                return '';
                        break;
                case 'convert':
index 5ad8828..9b6d65d 100644 (file)
@@ -138,11 +138,12 @@ function formulaires_dater_identifier_dist($objet, $id_objet, $retour='', $optio
 function formulaires_dater_verifier_dist($objet, $id_objet, $retour=''){
        $erreurs = array();
 
-       foreach(array('date','date_redac') as $k)
-               if ($v=_request($k."_jour") AND !dater_recuperer_date_saisie($v))
+       foreach(array('date','date_redac') as $k){
+               if ($v=_request($k."_jour") AND !dater_recuperer_date_saisie($v, $k))
                        $erreurs[$k] = _T('format_date_incorrecte');
                elseif ($v=_request($k."_heure") AND !dater_recuperer_heure_saisie($v))
                        $erreurs[$k] = _T('format_heure_incorrecte');
+       }
 
        if (!_request('date_jour'))
                $erreurs['date'] = _T('info_obligatoire');
@@ -185,7 +186,7 @@ function formulaires_dater_traiter_dist($objet, $id_objet, $retour=''){
                        if (!_request('date_redac_jour') OR _request('sans_redac'))
                                $set['date_redac'] = sql_format_date(0,0,0,0,0,0);
                        else {
-                               if (!$d = dater_recuperer_date_saisie(_request('date_redac_jour')))
+                               if (!$d = dater_recuperer_date_saisie(_request('date_redac_jour'), "date_redac"))
                                        $d = array(date('Y'),date('m'),date('d'));
                                if (!$h = dater_recuperer_heure_saisie(_request('date_redac_heure')))
                                        $h = array(0,0);
@@ -210,15 +211,25 @@ function formulaires_dater_traiter_dist($objet, $id_objet, $retour=''){
 /**
  * Recuperer annee,mois,jour sur la date saisie
  * @param string $post
+ * @param string $quoi
  * @return array
  */
-function dater_recuperer_date_saisie($post) {
+function dater_recuperer_date_saisie($post, $quoi="date") {
        if (!preg_match('#^(?:(?:([0-9]{1,2})[/-])?([0-9]{1,2})[/-])?([0-9]{4}|[0-9]{1,2})#', $post, $regs))
                return '';
-       if ($regs[3]<>'' AND $regs[3] < 1001)
-               $regs[3] += 9000;
+       if ($quoi=="date_redac") {
+               if ($regs[3]<>'' AND $regs[3] < 1001)
+                       $regs[3] += 9000;
+
+               return array($regs[3],$regs[2],$regs[1]);
+       }
+       else {
+               $t = mktime(0,0,0,$regs[2],$regs[1],$regs[3]);
+               // si la date n'est pas valide selon mktime, la refuser
+               if (!$t) return '';
+               return array(date('Y',$t),date('m',$t),date('d',$t));
+       }
 
-       return array($regs[3],$regs[2],$regs[1]);
 }
 
 /**
index 46a6671..e608987 100644 (file)
@@ -30,7 +30,8 @@ function date_picker_options(){
                changeMonth: true,
                changeYear: true,
                showOtherMonths: true,
-               selectOtherMonths: true
+               selectOtherMonths: true,
+               yearRange: "c-60:c+40"
        };
 }
 function date_picker_init(){
@@ -41,6 +42,8 @@ function date_picker_init(){
                                options.minDate = jQuery(this).attr('data-startDate');
                        if (jQuery(this).attr('data-endDate'))
                                options.maxDate = jQuery(this).attr('data-endDate');
+                       if (jQuery(this).attr('data-yearRange'))
+                               options.yearRange = jQuery(this).attr('data-yearRange');
                        jQuery(this)
                                .datepicker(jQuery.extend(date_picker_options(),options))
                                .trigger('datePickerLoaded');
@@ -50,12 +53,13 @@ function date_picker_init(){
 var date_picker_loading;
 if (window.jQuery){
        jQuery(function(){
-               if (jQuery('input.date,input.heure').length && !date_picker_loading){
-                       date_picker_loading = true; // inutile de loader deux fois
-                       jQuery.getScript('#PRODUIRE{fond=formulaires/dateur/jquery.dateur.js}').done(function(){
+               if (jQuery('input.date,input.heure').length
+                       && typeof date_picker_loading=="undefined"){
+                       date_picker_loading = jQuery.getScript('#PRODUIRE{fond=formulaires/dateur/jquery.dateur.js}');
+                       date_picker_loading.done(function(){
                                date_picker_init();
                                onAjaxLoad(date_picker_init);
-                       });
+                       })
                }
        });
 }
index 19bf91f..70d0d56 100644 (file)
                                <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{nom})</span>
                                ][<p class='explication'>(#ENV{id_auteur}|=={#SESSION{id_auteur}}|?{<:entree_nom_pseudo:>,<:entree_nom_pseudo_2:>})</p>]
                                <input type='text' class='text' name='nom' id='nom' placeholder="<:ecrire:item_nouvel_auteur|attribut_html:>" value="[(#ENV**{nom})]" />
-                   </li>
-                   [(#REM)
-                       Modification de l'email
+                       </li>
+                       [(#REM)
+                               Modification de l'email
                                ou message disant que seuls les admins peuvent le modifier
                        ]
-                   <li class="editer editer_email[ (#ENV**{erreurs}|table_valeur{email}|oui)erreur]">
+                       <li class="editer editer_email[ (#ENV**{erreurs}|table_valeur{email}|oui)erreur]">
                                [<label for="email">(#ENV{id_auteur}|=={#SESSION{id_auteur}}|?{<:entree_adresse_email:>,<:entree_adresse_email_2:>})</label>][
                                <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{email})</span>
                                ]<input type='text' class='text' name='email' id='email' value="[(#ENV**{email})]" />
-                   </li>
-                   <li class="editer editer_bio[ (#ENV**{erreurs}|table_valeur{bio}|oui)erreur]">
+                       </li>
+                       <li class="editer editer_bio[ (#ENV**{erreurs}|table_valeur{bio}|oui)erreur]">
                                [<label for="bio">(#ENV{id_auteur}|=={#SESSION{id_auteur}}|?{<:entree_infos_perso:>,<:entree_infos_perso_2:>})</label>][
                                <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{bio})</span>
                                ]<p class="explication"><:entree_biographie:></p>
                                <textarea name='bio' id='bio' rows='4' cols='40'>[(#ENV**{bio})]</textarea>
-                   </li>
-                   [(#REM)
-                       Cle PGP
-                       ]                 
+                       </li>
+                       [(#REM)
+                               Cle PGP
+                       ]
                        <li class="editer editer_pgp[ (#ENV**{erreurs}|table_valeur{pgp}|oui)erreur]">
                                [<label for="pgp">(#ENV{id_auteur}|=={#SESSION{id_auteur}}|?{<:entree_cle_pgp:>,<:entree_cle_pgp_2:>})</label>][
                                <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{pgp})</span>
                                        [<legend>(#ENV{id_auteur}|=={#SESSION{id_auteur}}|?{<:entree_identifiants_connexion:>,<:entree_identifiants_connexion_2:>})</legend>]
                                        [(#REM) Avertissement en cas de modifs de ses propres donnees ]
                                        [(#ENV{config}|table_valeur{edit_login}
-                                         |or{#ENV{config}|table_valeur{edit_pass}}
+                                               |or{#ENV{config}|table_valeur{edit_pass}}
                                                |and{#SESSION{id_auteur}|=={#ENV{id_auteur}}}|oui)
                                                <div class='notice'><:texte_login_precaution:></div>
                                        ]
                                        <ul>
-                                       [(#REM) Un redacteur n'a pas le droit de modifier son login ! ]
-                                       <li class='editer editer_new_login[ (#ENV**{erreurs}|table_valeur{login}|oui)erreur]'>
-                                               [(#ENV{config}|table_valeur{edit_login}|oui)
-                                                       <label for='new_login'><:item_login:></label>[
-                                                       <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{login})</span>
-                                                       ]<p class='explication'>(<:info_login_trop_court_car_pluriel{nb=#EVAL{_LOGIN_TROP_COURT}}:>)</p>
-                                                       <input autocomplete="off" type='text' class='text' name='new_login' id='new_login' value="[(#ENV**{new_login})]" />
-                                               ]
-                                               [(#ENV{config}|table_valeur{edit_login}|non)
-                                                       <label for='login'><:item_login:>
-                                                       </label><p class='explication'>(<:info_non_modifiable:>)</p>
-                                                       <input type='text' class='text' disabled='disabled' name='login' id='login' value="[(#ENV**{login})]" />
-                                               ]                               
-                                       </li>
-                                       [(#ENV{config}|table_valeur{edit_pass}|oui)
-                                       <li class='editer editer_new_pass[ (#ENV**{erreurs}|table_valeur{new_pass}|oui)erreur]'>
-                                               <label for='new_pass'><:entree_nouveau_passe:></label>[
-                                               <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{new_pass})</span>
-                                               ]<p class='explication'>(<:info_passe_trop_court_car_pluriel{nb=#EVAL{_PASS_LONGUEUR_MINI}}:>)</p>
-                                               <input type='password' autocomplete="off" class='password' name='new_pass' id='new_pass' value="" />
-                                       </li>
-                                       <li class='editer editer_new_pass2'>
-                                               <label for='new_pass2'><:info_confirmer_passe:></label>[
-                                               <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{new_pass2})</span>
-                                               ]<input type='password' autocomplete="off" class='password' name='new_pass2' id='new_pass2' value="" />
-                                       </li>]
-                                       </ul>                   
+                                               [(#REM) Un redacteur n'a pas le droit de modifier son login ! ]
+                                               <li class='editer editer_new_login[ (#ENV**{erreurs}|table_valeur{login}|oui)erreur]'>
+                                                       [(#ENV{config}|table_valeur{edit_login}|oui)
+                                                               <label for='new_login'><:item_login:></label>[
+                                                               <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{login})</span>
+                                                               ]<p class='explication'>(<:info_login_trop_court_car_pluriel{nb=#EVAL{_LOGIN_TROP_COURT}}:>)</p>
+                                                               <input autocomplete="off" type='text' class='text' name='new_login' id='new_login' value="[(#ENV**{new_login})]" />
+                                                       ]
+                                                       [(#ENV{config}|table_valeur{edit_login}|non)
+                                                               <label for='login'><:item_login:>
+                                                               </label><p class='explication'>(<:info_non_modifiable:>)</p>
+                                                               <input type='text' class='text' disabled='disabled' name='login' id='login' value="[(#ENV**{login})]" />
+                                                       ]
+                                               </li>
+                                               [(#ENV{config}|table_valeur{edit_pass}|oui)
+                                               <li class='editer editer_new_pass[ (#ENV**{erreurs}|table_valeur{new_pass}|oui)erreur]'>
+                                                       <label for='new_pass'><:entree_nouveau_passe:></label>[
+                                                       <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{new_pass})</span>
+                                                       ]<p class='explication'>(<:info_passe_trop_court_car_pluriel{nb=#EVAL{_PASS_LONGUEUR_MINI}}:>)</p>
+                                                       <input type='password' autocomplete="off" class='password' name='new_pass' id='new_pass' value="" />
+                                               </li>
+                                               <li class='editer editer_new_pass2'>
+                                                       <label for='new_pass2'><:info_confirmer_passe:></label>[
+                                                       <span class='erreur_message'>(#ENV**{erreurs}|table_valeur{new_pass2})</span>
+                                                       ]<input type='password' autocomplete="off" class='password' name='new_pass2' id='new_pass2' value="" />
+                                               </li>]
+                                       </ul>
                                </fieldset>
                        </li>
                </ul>
index 0e1b3fe..37aa374 100644 (file)
@@ -40,7 +40,7 @@ function auteurs_edit_config($row)
        $auth_methode = $row['source'];
        include_spip('inc/auth');
        include_spip('inc/autoriser');
-       $autoriser = autoriser('modifier','auteur',$row['id_auteur'],null, array('restreintes'=>true));
+       $autoriser = autoriser('modifier','auteur',$row['id_auteur'],null, array('email'=>true));
        $config['edit_login'] =
                (auth_autoriser_modifier_login($auth_methode) AND $autoriser);
        $config['edit_pass'] =
index b72ff91..d75c3e4 100644 (file)
@@ -89,7 +89,7 @@ function formulaires_editer_liens_charger_dist($a,$b,$c,$editable=true){
        
        // L'éditabilité :) est définie par un test permanent (par exemple "associermots") ET le 4ème argument
        include_spip('inc/autoriser');
-       $editable = ($editable and autoriser('associer'.$table_source, $objet, $id_objet));
+       $editable = ($editable and autoriser('associer'.$table_source, $objet, $id_objet) and autoriser('modifier',$objet,$id_objet));
        
        if (!$editable AND !count(objet_trouver_liens(array($objet_lien=>'*'),array(($objet_lien==$objet_source?$objet:$objet_source)=>'*'))))
                return false;
index 06a9c06..fe914a5 100644 (file)
@@ -76,11 +76,11 @@ function formulaires_login_charger_dist($cible="",$login="",$prive=null)
                if (isset($res['redirect']) and $res['redirect']){
                        include_spip('inc/headers');
                        # preparer un lien pour quand redirige_formulaire ne fonctionne pas
+                       $m = redirige_formulaire($res['redirect']);
                        $valeurs['_deja_loge'] = inserer_attribut(
                                "<a>" . _T('login_par_ici') . "</a>$m",
                                'href', $res['redirect']
                        );
-                       $m = redirige_formulaire($res['redirect']);
                }
        }
        // en cas d'echec de cookie, inc_auth a renvoye vers le script de
@@ -202,7 +202,7 @@ function formulaires_login_traiter_dist($cible="",$login="",$prive=null){
        }
 
        // Si on est connecte, envoyer vers la destination
-       if ($cible AND ($cible!=self())) {
+       if ($cible AND ($cible!=self('&'))  AND ($cible!=self())) {
                if (!headers_sent() AND !$_GET['var_mode']) {
                        include_spip('inc/headers');
                        $res['redirect'] = $cible;
index d3ad8a7..a210408 100644 (file)
@@ -38,6 +38,15 @@ function formulaires_rediriger_article_charger_dist($id_article,$retour=''){
        return $valeurs;
 }
 
+function formulaires_rediriger_article_verifier_dist($id_article,$retour=''){
+       $erreurs = array();
+
+       if(($redirection = _request('redirection')) == $id_article || $redirection == 'art'.$id_article)
+               $erreurs['redirection'] = _T('info_redirection_boucle');
+
+       return $erreurs;
+}
+
 function formulaires_rediriger_article_traiter_dist($id_article,$retour=''){
 
        $url = preg_replace(",^\s*https?://$,i", "", rtrim(_request('redirection')));
index 635c135..8832219 100644 (file)
@@ -47,10 +47,13 @@ afficher la selection dans un ul class item_picked
 #SET{objet, #ENV{objet,racine}}
 #SET{id_objet, #ENV{id_objet,0}}
 
-[(#REM) Attention si l'objet passé ne fait pas parti des objets adéquats, on va sur la racine ]
+[(#REM)
+       Si l'objet passé ne fait pas parti des objets adéquats, ou si c'est la racine
+       alors on regarde si on doit forcer la racine sur autre chose, et sinon on retombe sur la racine classique
+]
 [(#GET{objet}|table_objet|in_array{#GET{objets/afficher}}|non)
-       #SET{objet, racine}
-       #SET{id_objet, 0}
+       #SET{objet, #ENV{forcer_racine_objet,racine}}
+       #SET{id_objet, #ENV{forcer_racine_id_objet,0}}
 ]
 
 [(#REM) le container item_picker est ici pour etre voisin de item_picked ------]
index a39cf78..7a3e79c 100644 (file)
@@ -87,10 +87,10 @@ function picker_selected($selected, $type=''){
                                $id_objet = intval($captures[2]);
                                
                                // Si on cherche un type et que c'est le bon, on renvoit un tableau que d'identifiants
-                               if (is_string($type) AND $type == $objet AND ($id_objet OR $objet=="rubrique")){
+                               if (is_string($type) AND $type == $objet AND ($id_objet OR in_array($objet, array('racine', 'rubrique')))){
                                        $select[] = $id_objet;
                                }
-                               elseif(!$type AND ($id_objet OR $objet=="rubrique")){
+                               elseif(!$type AND ($id_objet OR in_array($objet, array('racine', 'rubrique')))){
                                        $select[] = array('objet' => $objet, 'id_objet' => $id_objet);
                                }
                        }
index 3cbf77e..e8fb2a9 100644 (file)
@@ -1,7 +1,7 @@
 <BOUCLE_art(ARTICLES){tout}{id_article=#ENV{id_objet}}{statut?}>
        <div class="chemin">
-               <a href="[(#SELF|parametre_url{objet,racine}|parametre_url{id_objet,0})]" class="ajax nohistory">[(#ENV{label_racine,<:info_racine_site:>})]</a><span class="sep divider">
-               &gt; </span><BOUCLE_chemin(HIERARCHIE){tous}{id_rubrique=#ID_RUBRIQUE}><a href="[(#SELF|parametre_url{objet,rubrique}|parametre_url{id_objet,#ID_RUBRIQUE})]" class="ajax nohistory">#TITRE</a><span class="sep divider">
+               [(#ENV{forcer_racine_objet}|=={rubrique}|et{#ENV{forcer_racine_id_objet}|>{0}}|non)<a href="[(#SELF|parametre_url{objet,racine}|parametre_url{id_objet,0})]" class="ajax nohistory">[(#ENV{label_racine,<:info_racine_site:>})]</a><span class="sep divider">
+               &gt; </span>]<BOUCLE_chemin(HIERARCHIE){tous}{!id_rubrique IN [(#ENV{forcer_racine_id_objet,0}|calculer_hierarchie{#EVAL{true}})]}><a href="[(#SELF|parametre_url{objet,rubrique}|parametre_url{id_objet,#ID_RUBRIQUE})]" class="ajax nohistory">#TITRE</a><span class="sep divider">
                &gt; </span></BOUCLE_chemin><h3 class="on">#TITRE</h3>
        </div>
        <div class="liste">
index 390d920..f099691 100644 (file)
@@ -1,7 +1,7 @@
 <BOUCLE_rub(RUBRIQUES){tout}{id_rubrique=#ENV{id_objet}}{statut?}>
        <div class="chemin">
-               <a href="[(#SELF|parametre_url{objet,racine}|parametre_url{id_objet,0})]" class="ajax nohistory">[(#ENV{label_racine,<:info_racine_site:>})]</a><span class="sep divider">
-               &gt; </span><BOUCLE_chemin(HIERARCHIE){id_rubrique}><a href="[(#SELF|parametre_url{id_objet,#ID_RUBRIQUE})]" class="ajax nohistory">#TITRE</a><span class="sep divider">
+               [(#ENV{forcer_racine_objet}|=={rubrique}|et{#ENV{forcer_racine_id_objet}|>{0}}|non)<a href="[(#SELF|parametre_url{objet,racine}|parametre_url{id_objet,0})]" class="ajax nohistory" rel="nofollow"><:info_racine_site:></a><span class="sep divider">
+               &gt; </span>]<BOUCLE_chemin(HIERARCHIE){id_rubrique!=#ID_RUBRIQUE}{!id_rubrique IN [(#ENV{forcer_racine_id_objet,0}|calculer_hierarchie{#EVAL{false}})]}><a href="[(#SELF|parametre_url{id_objet,#ID_RUBRIQUE})]" class="ajax nohistory">#TITRE</a><span class="sep divider">
                &gt; </span></BOUCLE_chemin><h3 class="on">#TITRE</h3>
        </div>
        <div class="liste">
index af20dab..01929de 100644 (file)
@@ -1,12 +1,23 @@
-[(#ENV{quoi}|in_array{#ENV{objets/selectionner}}|ou{#ENV{quoi}|=={racine}|et{#ENV{racine}|oui}})
-[(#SET{titre,[(#ENV{quoi}|=={racine}|?{[(#ENV{label_racine,<:info_racine_site:>})],#INFO_TITRE{#ENV{quoi},#ENV{id_objet}}})]})]
-<a
-       href="#"
-       class="choisir_ici"
-       title="<:bouton_choisir:> : #GET{titre}"
-       onclick="jQuery(this).item_pick('[(#ENV{quoi}|objet_type)]|#ENV{id_objet}','#ENV{name,id_item}','#GET{titre}','#ENV{quoi}');return false;"
-><span><:bouton_choisir:></span></a>
+[(#ENV{quoi}|in_array{#ENV{objets/selectionner}}
+       |et{
+               #ENV{forcer_racine_objet}|!={#ENV{quoi}|objet_type}
+               |ou{#ENV{forcer_racine_id_objet}|!={#ENV{id_objet}}}
+               |ou{#ENV{racine}}
+       }
+       |ou{
+               #ENV{quoi}|=={racine}|et{#ENV{racine}|oui}
+       }
+)
+       [(#SET{titre,[(#ENV{quoi}|=={racine}|?{[(#ENV{label_racine,<:info_racine_site:>})],#INFO_TITRE{#ENV{quoi},#ENV{id_objet}}})]})]
+       <a
+               href="#"
+               class="choisir_ici"
+               title="<:bouton_choisir:> : #GET{titre}"
+               onclick="jQuery(this).item_pick('[(#ENV{quoi}|objet_type)]|#ENV{id_objet}','#ENV{name,id_item}','#GET{titre}','#ENV{quoi}');return false;"
+       ><span><:bouton_choisir:></span></a>
 ]
+
+[(#REM) Pour chaque objet affichable, on cherche s'il peut être enfant de l'objet dans lequel on est ]
 <BOUCLE_objets(POUR){tableau #ENV{objets/afficher}}>
 [(#CHEMIN{formulaires/selecteur/lister-#ENV{quoi}-#VALEUR.html}|oui)
        #SET{bouton_selectionner, #VALEUR|in_array{#ENV{objets/selectionner}}|oui}
index fde2a81..b69b85c 100644 (file)
@@ -2,6 +2,7 @@
 if ('[(#ID_AUTEUR|securiser_acces{#ENV{arg},ical})]' OR /* spip < 1.9 */
        '[(#ID|securiser_acces{#ENV{cle},ical})]') {
 ?>#HTTP_HEADER{Content-Type: text/calendar}
+#HTTP_HEADER{Content-Disposition: attachment; filename=#NOM_SITE_SPIP|textebrut|replace{\W,'_'}|concat{_prive.ics}}
 #CACHE{0}
 BEGIN:VCALENDAR
 CALSCALE:GREGORIAN
index 118fc31..8d5d7a0 100644 (file)
@@ -386,10 +386,17 @@ jQuery.spip.on_ajax_loaded = function(blocfrag,c,href,history) {
                history = false;
        if (history)
                jQuery.spip.setHistoryState(blocfrag);
-       
-       jQuery(blocfrag)
-       .html(c)
-       .endLoading();
+
+       if (jQuery(blocfrag).attr('data-loaded-callback')){
+               var callback = eval(jQuery(blocfrag).attr('data-loaded-callback'));
+               callback.call(blocfrag, c, href, history);
+       }
+       else {
+               jQuery(blocfrag)
+               .html(c)
+               .endLoading();
+       }
+
        if (typeof href != undefined)
                jQuery(blocfrag).attr('data-url',href);
        if (history) {
@@ -430,6 +437,9 @@ jQuery.spip.setHistoryState = function(blocfrag){
                id:blocfrag.attr('id'),
                href: href
        };
+       var ajaxid = blocfrag.attr('class').match(/\bajax-id-[\w-]+\b/);
+       if (ajaxid && ajaxid.length)
+               state["ajaxid"] = ajaxid[0];
        // on remplace la variable qui decrit l'etat courant
        // initialement vide
        // -> elle servira a revenir dans l'etat courant
@@ -443,12 +453,23 @@ jQuery.spip.pushHistoryState = function(href, title){
 }
 
 window.onpopstate = function(popState){
-       if (popState.state && popState.state.id){
-               var blocfrag=jQuery('#'+popState.state.id);
-               if (blocfrag.length && popState.state.href) {
+       if (popState.state && popState.state.href){
+               var blocfrag=false;
+               if (popState.state.id){
+                       blocfrag=jQuery('#'+popState.state.id);
+               }
+               if ((!blocfrag || !blocfrag.length) && popState.state.ajaxid){
+                       blocfrag=jQuery('.ajaxbloc.'+popState.state.ajaxid);
+               }
+               if (blocfrag && blocfrag.length==1) {
                        jQuery.spip.ajaxClick(blocfrag,popState.state.href,{history:false});
                        return true;
                }
+               // si on revient apres avoir rompu la chaine ajax, on a pu perdre l'id #ghsidxx ajoute en JS
+               // dans ce cas on redirige hors ajax
+               else {
+                       window.location.href = popState.state.href;
+               }
        }
 }
 
@@ -468,7 +489,13 @@ window.onpopstate = function(popState){
  */
 jQuery.spip.loadAjax = function(blocfrag,url, href, options){
        var force = options.force || false;
-       jQuery(blocfrag).animateLoading();
+       if (jQuery(blocfrag).attr('data-loading-callback')){
+               var callback = eval(jQuery(blocfrag).attr('data-loading-callback'));
+               callback.call(blocfrag,url,href,options);
+       }
+       else {
+               jQuery(blocfrag).animateLoading();
+       }
        if (jQuery.spip.preloaded_urls[url] && !force) {
                // si on est deja en train de charger ce fragment, revenir plus tard
                if (jQuery.spip.preloaded_urls[url]=="<!--loading-->"){
@@ -506,10 +533,32 @@ jQuery.spip.loadAjax = function(blocfrag,url, href, options){
  * @param string href
  * @param string ajax_env
  */
-jQuery.spip.makeAjaxUrl = function(href,ajax_env){
+jQuery.spip.makeAjaxUrl = function(href,ajax_env,origin){
        var url = href.split('#');
        url[0] = parametre_url(url[0],'var_ajax',1);
        url[0] = parametre_url(url[0],'var_ajax_env',ajax_env);
+
+       // les arguments de origin qui ne sont pas dans href doivent etre explicitement fournis vides dans url
+       if (origin){
+               var p=origin.indexOf('?');
+               if (p!==-1){
+                       // recuperer la base
+                       var args = origin.substring(p+1).split('&');
+                       var val;
+                       var arg;
+                       for(var n=0;n<args.length;n++){
+                               arg = args[n].split('=');
+                               arg = arg[0];
+                               p = arg.indexOf('[');
+                               if (p!==-1)
+                                       arg = arg.substring(0,p);
+                               val = parametre_url(href,arg);
+                               if (typeof val=="undefined")
+                                       url[0] = url[0] + '&' + arg + '=';
+                       }
+               }
+       }
+
        if (url[1])
                url[0] = parametre_url(url[0],'var_ajax_ancre',url[1]);
        return url[0];
@@ -522,13 +571,14 @@ jQuery.spip.makeAjaxUrl = function(href,ajax_env){
  * @param object blocfrag
  * @param object options
  *   callback : fonction appelee apres le rechargement
+ *   href : url to load instead of origin url
  *   args : arguments passes a l'url rechargee (permet une modif du contexte)
  *   history : bool to specify if navigation history is modified by reload or not (false if not provided)
  */
 jQuery.spip.ajaxReload = function(blocfrag, options){
        var ajax_env = blocfrag.attr('data-ajax-env');
        if (!ajax_env || ajax_env==undefined) return;
-       var href = blocfrag.attr('data-url') || blocfrag.attr('data-origin');
+       var href = options.href || blocfrag.attr('data-url') || blocfrag.attr('data-origin');
        if (href && typeof href != undefined){
                options == options || {};
                var callback=options.callback || null;
@@ -536,7 +586,7 @@ jQuery.spip.ajaxReload = function(blocfrag, options){
                var args = options.args || {};
                for (var key in args)
                        href = parametre_url(href,key,args[key]==undefined?'':args[key],'&',args[key]==undefined?false:true);
-               var url = jQuery.spip.makeAjaxUrl(href,ajax_env);
+               var url = jQuery.spip.makeAjaxUrl(href,ajax_env,blocfrag.attr('data-origin'));
                // recharger sans historisation dans l'url
                jQuery.spip.loadAjax(blocfrag, url, href, {force:true, callback:callback, history:history});
                return true;
@@ -565,7 +615,7 @@ jQuery.spip.ajaxClick = function(blocfrag, href, options){
                if ((d.getTime()-ajax_confirm_date)<=2)
                        return false;
        }
-       var url = jQuery.spip.makeAjaxUrl(href,ajax_env);
+       var url = jQuery.spip.makeAjaxUrl(href,ajax_env,blocfrag.attr('data-origin'));
        jQuery.spip.loadAjax(blocfrag, url, href, options);
        return false;
 }
@@ -604,7 +654,7 @@ jQuery.fn.ajaxbloc = function() {
                        .addClass('bind-ajax')
                        .filter('.preload').each(function(){
                                var href = this.href;
-                               var url = jQuery.spip.makeAjaxUrl(href,ajax_env);
+                               var url = jQuery.spip.makeAjaxUrl(href,ajax_env,blocfrag.attr('data-origin'));
                                if (!jQuery.spip.preloaded_urls[url]) {
                                        jQuery.spip.preloaded_urls[url] = '<!--loading-->';
                                        jQuery.ajax({url:url,onAjaxLoad:false,success:function(r){jQuery.spip.preloaded_urls[url]=r;},error:function(){jQuery.spip.preloaded_urls[url]='';}});
@@ -660,6 +710,7 @@ jQuery.fn.followLink = function(){
  * @param string ajaxid
  * @param object options
  *   callback : callback after reloading
+ *   href : url to load instead of origin url
  *   args : {arg:value,...} to pass tu the url
  *   history : bool to specify if navigation history is modified by reload or not (false if not provided)
  */
@@ -722,11 +773,16 @@ jQuery.fn.endLoading = function(hard) {
  */
 jQuery.fn.animateRemove = function(callback){
        if (this.length){
+               var me=this;
                var color = $("<div class='remove'></div>").css('background-color');
-               $(this).addClass('remove').css({backgroundColor: color}).animate({opacity: "0.0"}, 'fast',function(){
-                       $(this).removeClass('remove').css({backgroundColor: ''});
+               var sel=$(this);
+               // if target is a tr, include td childrens cause background color on tr doesn't works in a lot of browsers
+               if (sel.is('tr'))
+                       sel = sel.add('>td',sel);
+               sel.addClass('remove').css({backgroundColor: color}).animate({opacity: "0.0"}, 'fast',function(){
+                       sel.removeClass('remove').css({backgroundColor: ''});
                        if (callback)
-                               callback.apply(this);
+                               callback.apply(me);
                });
        }
        return this; // don't break the chain
@@ -751,7 +807,7 @@ jQuery.fn.animateAppend = function(callback){
                var sel=$(this);
                // if target is a tr, include td childrens cause background color on tr doesn't works in a lot of browsers
                if (sel.is('tr'))
-                       sel.add('>td',sel);
+                       sel = sel.add('>td',sel);
                sel.css('opacity','0.0').addClass('append').css({backgroundColor: color}).animate({opacity: "1.0"}, 1000,function(){
                        sel.animate({backgroundColor: origin}, 3000,function(){
                                sel.removeClass('append').css({backgroundColor: ''});
@@ -809,7 +865,7 @@ function parametre_url(url,c,v,sep,force_vide){
        }
         else
             a=url;
-       var regexp = new RegExp('^(' + c.replace('[]','\[\]') + '\[?\]?)(=.*)?$');
+       var regexp = new RegExp('^(' + c.replace('[]','\\[\\]') + '\\[?\\]?)(=.*)?$');
        var ajouts = [];
        var u = (typeof(v)!=='object')?encodeURIComponent(v):v;
        var na = [];
@@ -822,7 +878,7 @@ function parametre_url(url,c,v,sep,force_vide){
                var r=val.match(regexp);
                if (r && r.length){
                        if (v==null){
-                               return (r.length>2)?r[2].substring(1):'';
+                               return (r.length>2 && typeof r[2]!=='undefined')?r[2].substring(1):'';
                        }
                        // suppression
                        else if (!v.length) {
index efd4142..96c3d20 100644 (file)
@@ -1,4 +1,4 @@
-[(#ID_RUBRIQUE|afficher_enfant_rub)]
+[(#ID_RUBRIQUE|afficher_enfant_rub|image_reduire{245,0})]
 [(#AUTORISER{creerrubriquedans,rubrique,#ID_RUBRIQUE}|oui)
        [(#ID_RUBRIQUE|?{
        [(#URL_ECRIRE{rubrique_edit,new=oui&id_parent=#ID_RUBRIQUE}|icone_verticale{<:icone_creer_sous_rubrique:>,rubrique,new,right clearright})]
index 31e2f15..c1a391b 100644 (file)
                [(#BOUTON_ACTION{<:info_admin_etre_webmestre:>,[(#URL_ACTION_AUTEUR{etre_webmestre,[(#REM|time)],#SELF})]})]
        ]
 ]
-<B_restreint>
-       <div class='liste_rubriques_restreintes'>
-               <:info_admin_gere_rubriques:>
-               <ul class="liste-items rubriques">
-                       <BOUCLE_restreint(RUBRIQUES){id_auteur}{statut==.*}{si #STATUT|=={0minirezo}}{pagination 10}>
-                               <li class="item rubrique"><a href="[(#ID_RUBRIQUE|generer_url_entite{rubrique})]">[(#CHEMIN_IMAGE{rubrique-16.png}|balise_img) ][(#TITRE|sinon{<:info_sans_titre:>})]</a></li>
-                       </BOUCLE_restreint>
-               </ul>
-               [<p class="pagination">(#PAGINATION{prive})</p>]
-       </div>
-</B_restreint>
-[(#STATUT|=={0minirezo}|oui)
-       [<p>(#ID_AUTEUR|=={#SESSION{id_auteur}}|?{<:info_admin_gere_toutes_rubriques_2:>,<:info_admin_gere_toutes_rubriques:>})</p>]
-]
-<//B_restreint>
-</div>
-
+<INCLURE{fond=prive/objets/infos/inc-auteur-rubriques,id_auteur,statut} />
 <div class='nb_elements'>
 <BOUCLE_arts(ARTICLES){id_auteur}{statut!=poubelle}> </BOUCLE_arts>
 [(#STATUT|<>{'6forum'}|?{' ', ''})[<div>(#TOTAL_BOUCLE|singulier_ou_pluriel{info_articles_un,info_articles_nb})</div>]]
diff --git a/www/prive/objets/infos/inc-auteur-rubriques.html b/www/prive/objets/infos/inc-auteur-rubriques.html
new file mode 100644 (file)
index 0000000..960aa7c
--- /dev/null
@@ -0,0 +1,16 @@
+<B_restreint>
+       <div class='liste_rubriques_restreintes'>
+               <:info_admin_gere_rubriques:>
+               <ul class="liste-items rubriques">
+                       <BOUCLE_restreint(RUBRIQUES){id_auteur}{statut==.*}{si #STATUT|=={0minirezo}}{pagination 10}>
+                               <li class="item rubrique"><a href="[(#ID_RUBRIQUE|generer_url_entite{rubrique})]">[(#CHEMIN_IMAGE{rubrique-16.png}|balise_img) ][(#TITRE|sinon{<:info_sans_titre:>})]</a></li>
+                       </BOUCLE_restreint>
+               </ul>
+               [<p class="pagination">(#PAGINATION{prive})</p>]
+       </div>
+</B_restreint>
+[(#STATUT|=={0minirezo}|oui)
+       [<p>(#ID_AUTEUR|=={#SESSION{id_auteur}}|?{<:info_admin_gere_toutes_rubriques_2:>,<:info_admin_gere_toutes_rubriques:>})</p>]
+]
+<//B_restreint>
+</div>
\ No newline at end of file
index 76d524c..6c46897 100644 (file)
@@ -24,7 +24,7 @@
                <tr class="[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]">
                        <td class='statut'>[(#STATUT|puce_statut{article,#ID_ARTICLE,#ID_RUBRIQUE})]</td>
                        <td class='titre principale'>[(#LOGO_ARTICLE|image_reduire{20,26})]<a href="[(#ID_ARTICLE|generer_url_entite{article})]"
-                                                                                                                                                                                                                                                                                                               title="<:info_numero_abbreviation|attribut_html:> #ID_ARTICLE">[(#RANG). ]#TITRE</a></td>
+                                                                                                                                                                                                                                                                                                               title="<:info_numero_abbreviation|attribut_html:> #ID_ARTICLE">[(#RANG). ]#TITRE</a> [(#ENV{lang}|=={#LANG}|non) &#40;#LANG&#41;]</td>
                        <td class='auteur'><BOUCLE_auteurs(AUTEURS){id_article}{', '}><a href="[(#ID_AUTEUR|generer_url_entite{auteur})]">#NOM</a></BOUCLE_auteurs></td>
                        <td class='date secondaire'>[(#DATE|affdate_jourcourt)]</td>
                        <td class='id'>[(#AUTORISER{modifier,article,#ID_ARTICLE}|?{
index 0ec5fe2..0ec68fa 100644 (file)
@@ -4,6 +4,7 @@
 <BOUCLE_enligne(AUTEURS)
        {id_auteur!=#SESSION{id_auteur}}
        {statut IN 1comite,0minirezo}
+       {imessage!=non}
        {en_ligne>#VAL{'Y-m-d H:i:s'}|date{#VAL{'-15 minutes'}|strtotime}}{!par en_ligne}{pagination 10}{', '}><a href="[(#ID_AUTEUR|generer_url_entite{auteur})]">#NOM</a></BOUCLE_enligne>[&nbsp;...
        (#GRAND_TOTAL|>{10}|oui)
        ([(#GRAND_TOTAL|objet_afficher_nb{auteur})])
index e492af8..1d8e1d2 100644 (file)
@@ -51,7 +51,7 @@ a:active.spip-admin-boutons,
        border-bottom:2px solid #FEFF7F !important;
        background:url(images/fond-inclure.png) repeat top left !important;
 }
-.inclure_blocs > h6 {background:#FEFF7F;margin:0;padding:2px;margin-bottom:2px;font-family: Courier;font-size: 0.8em;}
+.inclure_blocs > h6 {background:#FEFF7F;margin:0;padding:2px;margin-bottom:2px;font-family: Courier, "Courier New", monospace;font-size: 0.8em;}
 .inclure_blocs > h6:hover,
 .inclure_blocs.hover {
        background-color: #FDFF1F !important;
index c5ebccf..c09944e 100644 (file)
@@ -38,6 +38,6 @@
 ]
 
 
-[(#REM|afficher_enfant_rub)
+[(#REM|afficher_enfant_rub|image_reduire{245,0})
 <div class='nettoyeur'></div>
 ]
\ No newline at end of file
index 3bca1f8..d380196 100644 (file)
@@ -11,7 +11,7 @@
                [(#GET{retour}|icone_verticale{<:icone_retour:>,auteur,'',left retour[(#ENV{retourajax,''}|oui)ajax preload]})]
                ]
                [[(#ID_AUTEUR|?{<:info_modifier_auteur:>,<:titre_ajouter_un_auteur:>})]
-               <h1>(#ENV{titre,#INFO_NOM{auteur,#ID_AUTEUR}|sinon{<:info_sans_titre:>}})</h1>]
+               <h1>(#ENV*{titre,#INFO_NOM{auteur,#ID_AUTEUR}|sinon{<:info_sans_titre:>}})</h1>]
        </div>
 
        #SET{redirect,#ENV{redirect,#ID_AUTEUR|generer_url_entite{auteur}}}
index ad27e45..f400f75 100644 (file)
 
        #BOITE_OUVRIR{'',raccourcis}
                <p><:ical_texte_public:></p>
-               [(#URL_PAGE{ical}|icone_horizontale{<:ical_methode_http:>,agenda-24.png})]
-               [(#URL_PAGE{ical}|replace{'https?:\/\/','webcal://'}|icone_horizontale{<:ical_methode_webcal:>,agenda-24.png})]
+               [(#URL_PAGE{ical}|url_absolue|icone_horizontale{<:ical_methode_http:>,agenda-24.png})]
+               [(#URL_PAGE{ical}|url_absolue|replace{'https?:\/\/','webcal://'}|icone_horizontale{<:ical_methode_webcal:>,agenda-24.png})]
        #BOITE_FERMER
 
        [(#BOITE_OUVRIR{[(#CHEMIN_IMAGE{cadenas-24.png}|balise_img{'',cadre-icone})],raccourcis})]
                <p><:ical_texte_prive:></p>
                #SET{url,#URL_PAGE{ical_prive,id_auteur=#SESSION{id_auteur}}|parametre_url{arg,#SESSION{id_auteur}|afficher_low_sec{ical}}}
-               [(#GET{url}|icone_horizontale{<:ical_methode_http:>,agenda-24.png})]
-               [(#GET{url}|replace{'https?:\/\/','webcal://'}|icone_horizontale{<:ical_methode_webcal:>,agenda-24.png})]
+               [(#GET{url}|url_absolue|icone_horizontale{<:ical_methode_http:>,agenda-24.png})]
+               [(#GET{url}|url_absolue|replace{'https?:\/\/','webcal://'}|icone_horizontale{<:ical_methode_webcal:>,agenda-24.png})]
        #BOITE_FERMER
 
 #BOITE_FERMER
index a7f1094..3a6cb78 100644 (file)
@@ -15,7 +15,7 @@
 #HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}
 #HTTP_HEADER{Vary: Accept-Encoding}
 
-#bando_haut { /*font-size: 1em;*/ position: relative; z-index: 9;}
+#bando_haut { /*font-size: 1em;*/ position: relative; z-index: 1001;}
 #bando_haut a { text-decoration: none; }
 
 
index d8fa362..4a0f8b5 100644 (file)
@@ -108,7 +108,7 @@ background-color: #fff; color: #4A4A4A;font-size:1.2em; position:relative;}
 
 /* Cas particuliers */
 .simple.sous-rub .inner .hd {padding:0}
-.simple.sous-rub .inner .hd .logo {margin:0;position:absolute;#ENV{right}:0;top:0;z-index:1;}
+.simple.sous-rub .inner .hd .logo {float:#ENV{right};margin:4px 5px 0;margin-#ENV{right}:-5px;}
 .simple.sous-rub .sous-sous-rub {margin-top:0;margin-bottom:0;padding-top:0;padding-bottom:0;}
 
 /* vieilles boites depliables/repliables
old mode 100755 (executable)
new mode 100644 (file)
index 0fe2482..7abb876 100644 (file)
Binary files a/www/squelettes-dist/css/img/recherche.png and b/www/squelettes-dist/css/img/recherche.png differ
index 5260bba..b6f4cf6 100644 (file)
@@ -70,7 +70,7 @@ body,
 .footer,
 .wrapper,
 .content,
-.aside { width: auto !important; margin: auto !important; padding: auto !important; }
+.aside { width: auto !important; margin: auto !important; }
 
 .page { margin: 0; padding: 5%; }
 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index ef14758..3035d3d 100644 (file)
@@ -1,4 +1,5 @@
 #HTTP_HEADER{Content-Type: text/calendar; charset:#CHARSET}
+#HTTP_HEADER{Content-Disposition: attachment; filename=#NOM_SITE_SPIP|textebrut|replace{\W,'_'}|concat{.ics}}
 BEGIN:VCALENDAR
 CALSCALE:GREGORIAN
 PRODID: SPIP http://www.spip.net
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index d91f9c0..317ea07 100644 (file)
@@ -14,8 +14,6 @@ Disallow: /plugins/
 Disallow: /prive/
 Disallow: /squelettes-dist/
 Disallow: /squelettes/
+Crawl-delay: 1
 
-Sitemap: #URL_SITE_SPIP/sitemap.xml
-
-User-agent: *
-Crawl-delay: 1
\ No newline at end of file
+Sitemap: #URL_SITE_SPIP/sitemap.xml
\ No newline at end of file
old mode 100755 (executable)
new mode 100644 (file)
index 7fc1842..859b671 100644 (file)
@@ -1,10 +1,10 @@
 <svn_revision>
 <text_version>
-Origine: svn://trac.rezo.net/spip/tags/spip-3.0.16
-Revision: 21266
-Dernier commit: 2014-03-13 15:30:55 +0100 
+Origine: svn://trac.rezo.net/spip/tags/spip-3.0.17
+Revision: 21515
+Dernier commit: 2014-08-13 14:37:48 +0200 
 </text_version>
-<origine>svn://trac.rezo.net/spip/tags/spip-3.0.16</origine>
-<revision>21266</revision>
-<commit>2014-03-13 15:30:55 +0100 </commit>
+<origine>svn://trac.rezo.net/spip/tags/spip-3.0.17</origine>
+<revision>21515</revision>
+<commit>2014-08-13 14:37:48 +0200 </commit>
 </svn_revision>
\ No newline at end of file