From f6234b4f43b26c124e85748f0a331db57d4f4586 Mon Sep 17 00:00:00 2001
From: divinatus <milykim@hotmail.fr>
Date: Mon, 5 Feb 2024 15:06:29 +0100
Subject: [PATCH] =?UTF-8?q?AJout=20d=C3=A9pendances=20M=C3=A9ta+=20et=20sq?=
 =?UTF-8?q?uelette=20par=20rubrique?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../metasplus/CHANGELOG.md                    |  11 +
 design_system_dependences/metasplus/TODO.md   |  19 ++
 .../formulaires/configurer_metasplus.php      |  49 +++++
 .../metasplus/inclure/metasplus/auteur.html   |   9 +
 .../metasplus/inclure/metasplus/dist.html     | 207 ++++++++++++++++++
 .../inclure/metasplus/evenement.html          |   8 +
 .../metasplus/inclure/metasplus/inc-dist.html | 186 ++++++++++++++++
 .../metasplus/lang/metasplus.xml              |  12 +
 .../metasplus/lang/metasplus_en.php           |  34 +++
 .../metasplus/lang/metasplus_fr.php           |  32 +++
 .../metasplus/lang/paquet-metasplus.xml       |  12 +
 .../metasplus/lang/paquet-metasplus_en.php    |  15 ++
 .../metasplus/lang/paquet-metasplus_fr.php    |  13 ++
 .../metasplus/metasplus_administrations.php   |  70 ++++++
 .../metasplus/metasplus_autorisations.php     |  44 ++++
 .../metasplus/metasplus_fonctions.php         | 161 ++++++++++++++
 .../metasplus_identifier_contexte.html        |  16 ++
 .../metasplus/metasplus_pipelines.php         | 148 +++++++++++++
 .../metasplus/opengraph-150.png               | Bin 0 -> 10808 bytes
 .../metasplus/opengraph-xx.svg                |   5 +
 .../metasplus/paquet.xml                      |  25 +++
 .../contenu/configurer_metasplus.html         |   4 +
 .../squelettes/contenu/metasplus_previsu.html |  57 +++++
 .../inclure/metasplus_bouton_previsu.html     |  18 ++
 .../spip/images/metasplus_previsu-16.png      | Bin 0 -> 1437 bytes
 .../spip/images/metasplus_previsu-24.png      | Bin 0 -> 10610 bytes
 .../spip/images/metasplus_previsu-32.png      | Bin 0 -> 1889 bytes
 .../spip/images/metasplus_previsu-xx.svg      |   6 +
 .../squelettes_par_rubrique/.gitignore        |   7 +
 .../squelettes_par_rubrique/composer.json     |  18 ++
 .../lang/paquet-squelettes_par_rubrique.xml   |  61 ++++++
 .../paquet-squelettes_par_rubrique_de.php     |  15 ++
 .../paquet-squelettes_par_rubrique_en.php     |  15 ++
 .../paquet-squelettes_par_rubrique_eo.php     |  15 ++
 .../paquet-squelettes_par_rubrique_es.php     |  15 ++
 .../paquet-squelettes_par_rubrique_fa.php     |  15 ++
 .../paquet-squelettes_par_rubrique_fr.php     |  13 ++
 .../paquet-squelettes_par_rubrique_fr_fem.php |  15 ++
 .../paquet-squelettes_par_rubrique_fr_tu.php  |  15 ++
 .../paquet-squelettes_par_rubrique_it.php     |  15 ++
 .../paquet-squelettes_par_rubrique_lb.php     |  15 ++
 .../paquet-squelettes_par_rubrique_nl.php     |  15 ++
 ...quet-squelettes_par_rubrique_oc_ni_mis.php |  15 ++
 .../paquet-squelettes_par_rubrique_pt.php     |  15 ++
 .../paquet-squelettes_par_rubrique_pt_br.php  |  15 ++
 .../paquet-squelettes_par_rubrique_ru.php     |  15 ++
 .../paquet-squelettes_par_rubrique_sk.php     |  15 ++
 .../paquet-squelettes_par_rubrique_uk.php     |  15 ++
 .../squelettes_par_rubrique/paquet.xml        |  15 ++
 .../squelettes_par_rubrique/phpcs.xml.dist    |  15 ++
 .../phpstan-baseline.neon                     |  12 +
 .../squelettes_par_rubrique/phpstan.neon.dist |  12 +
 .../squelettes_par_rubrique-xx.svg            |   5 +
 .../squelettes_par_rubrique_options.php       | 107 +++++++++
 54 files changed, 1666 insertions(+)
 create mode 100644 design_system_dependences/metasplus/CHANGELOG.md
 create mode 100644 design_system_dependences/metasplus/TODO.md
 create mode 100644 design_system_dependences/metasplus/formulaires/configurer_metasplus.php
 create mode 100644 design_system_dependences/metasplus/inclure/metasplus/auteur.html
 create mode 100644 design_system_dependences/metasplus/inclure/metasplus/dist.html
 create mode 100644 design_system_dependences/metasplus/inclure/metasplus/evenement.html
 create mode 100644 design_system_dependences/metasplus/inclure/metasplus/inc-dist.html
 create mode 100644 design_system_dependences/metasplus/lang/metasplus.xml
 create mode 100644 design_system_dependences/metasplus/lang/metasplus_en.php
 create mode 100644 design_system_dependences/metasplus/lang/metasplus_fr.php
 create mode 100644 design_system_dependences/metasplus/lang/paquet-metasplus.xml
 create mode 100644 design_system_dependences/metasplus/lang/paquet-metasplus_en.php
 create mode 100644 design_system_dependences/metasplus/lang/paquet-metasplus_fr.php
 create mode 100644 design_system_dependences/metasplus/metasplus_administrations.php
 create mode 100644 design_system_dependences/metasplus/metasplus_autorisations.php
 create mode 100644 design_system_dependences/metasplus/metasplus_fonctions.php
 create mode 100644 design_system_dependences/metasplus/metasplus_identifier_contexte.html
 create mode 100644 design_system_dependences/metasplus/metasplus_pipelines.php
 create mode 100644 design_system_dependences/metasplus/opengraph-150.png
 create mode 100644 design_system_dependences/metasplus/opengraph-xx.svg
 create mode 100644 design_system_dependences/metasplus/paquet.xml
 create mode 100644 design_system_dependences/metasplus/prive/squelettes/contenu/configurer_metasplus.html
 create mode 100644 design_system_dependences/metasplus/prive/squelettes/contenu/metasplus_previsu.html
 create mode 100644 design_system_dependences/metasplus/prive/squelettes/inclure/metasplus_bouton_previsu.html
 create mode 100644 design_system_dependences/metasplus/prive/themes/spip/images/metasplus_previsu-16.png
 create mode 100644 design_system_dependences/metasplus/prive/themes/spip/images/metasplus_previsu-24.png
 create mode 100644 design_system_dependences/metasplus/prive/themes/spip/images/metasplus_previsu-32.png
 create mode 100644 design_system_dependences/metasplus/prive/themes/spip/images/metasplus_previsu-xx.svg
 create mode 100644 design_system_dependences/squelettes_par_rubrique/.gitignore
 create mode 100644 design_system_dependences/squelettes_par_rubrique/composer.json
 create mode 100644 design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique.xml
 create mode 100644 design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_de.php
 create mode 100644 design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_en.php
 create mode 100644 design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_eo.php
 create mode 100644 design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_es.php
 create mode 100644 design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_fa.php
 create mode 100644 design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_fr.php
 create mode 100644 design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_fr_fem.php
 create mode 100644 design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_fr_tu.php
 create mode 100644 design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_it.php
 create mode 100644 design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_lb.php
 create mode 100644 design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_nl.php
 create mode 100644 design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_oc_ni_mis.php
 create mode 100644 design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_pt.php
 create mode 100644 design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_pt_br.php
 create mode 100644 design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_ru.php
 create mode 100644 design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_sk.php
 create mode 100644 design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_uk.php
 create mode 100644 design_system_dependences/squelettes_par_rubrique/paquet.xml
 create mode 100644 design_system_dependences/squelettes_par_rubrique/phpcs.xml.dist
 create mode 100644 design_system_dependences/squelettes_par_rubrique/phpstan-baseline.neon
 create mode 100644 design_system_dependences/squelettes_par_rubrique/phpstan.neon.dist
 create mode 100644 design_system_dependences/squelettes_par_rubrique/squelettes_par_rubrique-xx.svg
 create mode 100644 design_system_dependences/squelettes_par_rubrique/squelettes_par_rubrique_options.php

diff --git a/design_system_dependences/metasplus/CHANGELOG.md b/design_system_dependences/metasplus/CHANGELOG.md
new file mode 100644
index 0000000..335371f
--- /dev/null
+++ b/design_system_dependences/metasplus/CHANGELOG.md
@@ -0,0 +1,11 @@
+# Changelog
+
+## 2.4.5 - 2023-06-15
+
+### Added
+
+- Un changelog
+
+### Fixed
+
+- #24 Notice php en moins, à piori levée sur la page d'accueil
\ No newline at end of file
diff --git a/design_system_dependences/metasplus/TODO.md b/design_system_dependences/metasplus/TODO.md
new file mode 100644
index 0000000..71f3b5e
--- /dev/null
+++ b/design_system_dependences/metasplus/TODO.md
@@ -0,0 +1,19 @@
+# Plugin Métas+ : choses à faire
+
+## Open graph
+
+### Propriétés
+
+article:section : rubriques
+
+## Twitter
+
+### propriétés
+
+twitter:site : en fonction des plugins installés, il y a peut-être moyen de renseigner le compte twitter
+
+
+## Dublin Core
+
+Lire la doc !
+Prendre le plugin dublin core comme référence aussi.
\ No newline at end of file
diff --git a/design_system_dependences/metasplus/formulaires/configurer_metasplus.php b/design_system_dependences/metasplus/formulaires/configurer_metasplus.php
new file mode 100644
index 0000000..48a2148
--- /dev/null
+++ b/design_system_dependences/metasplus/formulaires/configurer_metasplus.php
@@ -0,0 +1,49 @@
+<?php
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+function formulaires_configurer_metasplus_charger_dist() {
+	// Chargement automatique
+	$valeurs = cvtconf_formulaires_configurer_recense('configurer_metasplus', array());
+
+	// Compat bigup
+	$valeurs['_bigup_rechercher_fichiers'] = true;
+
+	return $valeurs;
+}
+
+function formulaires_configurer_metasplus_traiter_dist() {
+
+	include_spip('inc/cvt_configurer');
+	//refuser_traiter_formulaire_ajax();
+
+	$retours = array();
+
+	// Enregistrement de l'image
+	if ($documents = $_FILES) {
+		$mode = 'auto';
+		include_spip('action/editer_liens');
+		$ajouter_document = charger_fonction('ajouter_documents', 'action');
+		if (
+			$document = $ajouter_document(0, $documents, null, 0, $mode)
+			and $id_document = intval($document[0])
+		) {
+			sql_updateq('spip_documents',array('statut' => 'publie'), 'id_document='.intval($id_document));
+			set_request('id_doc_logo',$id_document);
+		}
+	}
+
+	// Enregistrement de la configuration
+	$trace = cvtconf_formulaires_configurer_enregistre('configurer_metasplus', array());
+	$retours['message_ok'] = _T('config_info_enregistree') . $trace;
+
+	// Si on traite le logo, on force une redirection
+	if (isset($id_document)) {
+		$retours['redirect'] = parametre_url(self(), 'id_document', $id_document, '&');
+	}
+
+	$retours['editable'] = true;
+
+	return $retours;
+}
diff --git a/design_system_dependences/metasplus/inclure/metasplus/auteur.html b/design_system_dependences/metasplus/inclure/metasplus/auteur.html
new file mode 100644
index 0000000..1c729e2
--- /dev/null
+++ b/design_system_dependences/metasplus/inclure/metasplus/auteur.html
@@ -0,0 +1,9 @@
+[(#REM)
+
+	Métas+ : variante pour les auteurs
+
+]
+<INCLURE{fond=inclure/metasplus/dist,
+	og-type=profile,
+	desc=#INFO_BIO{auteur,#ENV{id_auteur}},
+	env} />
\ No newline at end of file
diff --git a/design_system_dependences/metasplus/inclure/metasplus/dist.html b/design_system_dependences/metasplus/inclure/metasplus/dist.html
new file mode 100644
index 0000000..4ba9e60
--- /dev/null
+++ b/design_system_dependences/metasplus/inclure/metasplus/dist.html
@@ -0,0 +1,207 @@
+[(#ENV{var_mode}|=={debug}|oui)#HTTP_HEADER{Content-Type:text/html}][(#ENV{debug}|oui)#HTTP_HEADER{Content-Type:text/plain}]
+[(#REM)
+
+	Métas+ : ce squelette génère les métas pour Dublin Core, Open Graph et Twitter.
+
+	Pour déboguer sur spip.php?page=inclure/metasplus/dist :
+	- var_mode=debug pour le débug normal (sql, etc.)
+	- debug=oui pour avoir un simple retour texte
+
+	Il s'agit du squelette par défaut inclus automatiquement dans le <head>, il tente de générer au mieux les informations des pages.
+
+	Ce squelette récupére les valeurs *brutes* sans appliquer aucun filtre comme |textebrut, |attribut_html ou autre.
+	Ces filtres sont appliqués en aval dans le squelette inclus : inc-dist.tml
+
+	On peut lui transmettre certaines valeurs à prendre en priorité par rapport à la récupération automatique.
+
+	Il est possible de créer des variantes pour des pages précises : inclure/metasplus/{page}.html
+	Plusieurs possibilités pour le contenu des variantes :
+	- vide = pas de métas (voir aussi la constante _METASPLUS_PAGES_EXCLUES)
+	- inclure ce squelette en ne transmettant *que* les paramètres à modifier
+	- inclure inc-dist.html en transmettant *tous* les paramètres
+	- tout faire à la main
+
+	Précisions :
+		- Sur une page d'objet, on met og-type = article par défaut
+		- Sur une page lambda, on omet volontairement le titre et la description puisqu'on ne les connait pas, twitter et facebook se rabattent sur les metas <title> et <description>.
+
+	Format des logos : https://goo.gl/L4StmD
+		- Twitter  : taille min 440 x 220
+		             taille recommandée 506 x 253
+		             taille max 1024 x 512
+		             poids max 5 Mo
+		             ratio 2:1
+		- Facebook : pas de taille min
+		             taille recommandée > 600 x 315 ou 1200 x 630 (hidpi)
+		             poids max 8 Mo
+		             ratio 1.91:1
+
+	Contexte : 
+		- type-page
+		- objet
+		- id_objet
+		- id_patate
+
+	Paramètres :
+		- debug :      'Oui' quand on débogue le squelette
+		               spip.php?page=inclure/metasplus/dist&objet=truc&id_objet=N&debug=oui
+		- titre :      Titre de la ressource
+		- desc :       Description
+		- langue :     Langue au format iso. ex. fr
+		- territoire : Complète la langue pour former le duet langue_territoire, ex. UK
+			             Si rien n'est renseigné, on tente un lang_LANG
+		- date :       Date de publication au format Y-m-d
+		- maj :        Date de mise à jour au format Y-m-d
+		- url :        URL de la ressource
+		- auteurs :    Soit un tableau linéaires
+		               Soit des auteurs séparés par des virgules
+		- logos :      Soit un tableau de tableaux associatifs avec URL et alt
+		               #LISTE{#ARRAY{url,...,alt...},#ARRAY{url,...,alt...}}
+		               Soit des URLs séparées par des virgules
+		- mots :       Soit un tableau linéaire
+		               Soit des mots-clés séparés par des virgules
+		- og-type :    (open graph) Type de la ressource : article, profile, book, etc.
+		- dc-type :    (dublin core) Type de la ressource : Text, Event, PhysicalObject, etc.
+
+	Paramètres dépréciés :
+		- auteur => auteurs
+		- logo => logos
+		- lang => langue
+]
+
+[(#REM)
+
+	=======================================
+	1. Récupération automatique des valeurs
+	=======================================
+
+]
+
+[(#REM)
+
+	Cas 1 : Page d'un objet éditorial
+
+]
+<BOUCLE_objet(CONDITION) {si #ENV{objet}|et{#ENV{id_objet}}}>
+#SET{og-type_auto,    article}
+#SET{dc-type_auto,    Text}
+#SET{titre_auto,      #INFO_TITRE{#ENV{objet},#ENV{id_objet}}|concat{" – ",#NOM_SITE_SPIP}}
+#SET{desc_auto,       #INFO_INTRODUCTION{#ENV{objet},#ENV{id_objet}}
+	|sinon{#INFO_DESCRIPTIF{#ENV{objet},#ENV{id_objet}}}
+	|sinon{#INFO_CHAPO{#ENV{objet},#ENV{id_objet}}}
+	|sinon{#INFO_TEXTE{#ENV{objet},#ENV{id_objet}}}}
+#SET{url_auto,        #INFO_URL{#ENV{objet},#ENV{id_objet}}}
+#SET{date_auto,       #INFO_DATE{#ENV{objet},#ENV{id_objet}}}
+#SET{maj_auto,        #INFO_MAJ{#ENV{objet},#ENV{id_objet}}}
+#SET{langue_auto,     #INFO_LANG{#ENV{objet},#ENV{id_objet}}|sinon{#LANG}}
+#SET{territoire_auto, ''}
+
+[(#REM) Les auteurs ]
+#SET{auteurs_auto,#ARRAY}
+<BOUCLE_auteurs_objet(AUTEURS)
+	{objet}
+	{id_objet}
+	{par nom}
+	{si #ENV{auteurs}|non}
+	{si #CONFIG{metasplus/masquer_auteurs}|non}
+>
+#SET{auteurs_auto, #GET{auteurs_auto}|push{#NOM}}
+</BOUCLE_auteurs_objet>
+#SET{auteurs_auto, #NOM_SITE_SPIP}
+<//B_auteurs_objet>
+
+[(#REM) Les mots-clés ]
+#SET{mots_auto,#ARRAY}
+<BOUCLE_mots_objet(MOTS)
+	{objet}
+	{id_objet}
+	{par titre}
+	{si #ENV{mots}|non}
+>
+#SET{mots_auto, #GET{mots_auto}|push{#TITRE}}
+</BOUCLE_mots_objet>
+
+[(#REM) Les images : logo de l'objet puis images liées ]
+<BOUCLE_logo_objet(CONDITION){si #ENV{logos}|non}>
+#SET{id_rubrique,#INFO_ID_RUBRIQUE{#ENV{objet},#ENV{id_objet}}}
+#SET{logo_objet, #ENV{objet}|id_table_objet|quete_logo{on,#ENV{id_objet},#GET{id_rubrique,0},0}}
+#SET{logos_auto, #GET{logo_objet}|?{#LISTE{#ARRAY{url,#GET{logo_objet/src}}},#ARRAY}}
+#SET{fichier_logo,#GET{logo_objet/src}|replace{#VAL{_NOM_PERMANENTS_ACCESSIBLES}|constant}|replace{'\.\./'}|supprimer_timestamp}
+#SET{par,#SPIP_VERSION|floatval|>{3.1}|?{rang_lien,largeur}}
+#SET{defaut_tri,#ARRAY{
+	rang_lien, 1,
+	largeur, -1,
+}}
+<BOUCLE_images_objet(DOCUMENTS)
+	{objet}
+	{id_objet}
+	{media = image}
+	{extension != svg}
+	{fichier != #GET{fichier_logo}}
+	{tri #GET{par}, #GET{defaut_tri}}
+	{0,#GET{logos_auto}|?{2,3}}
+	{!par largeur}
+	{tout}
+>
+#SET{logos_auto, #GET{logos_auto}|push{#ARRAY{
+	url, #FICHIER,
+	alt, #TITRE|sinon{#DESCRIPTIF}|couper{80},
+}}}
+</BOUCLE_images_objet>
+</BOUCLE_logo_objet>
+</BOUCLE_objet>
+
+
+[(#REM)
+
+	Cas 2 : Page lambda
+
+]
+#SET{og-type_auto,    website}
+#SET{dc-type_auto,    Text}
+#SET{titre_auto,      #ENV{type-page,sommaire}|=={sommaire}|?{#NOM_SITE_SPIP|concat{" - ",#SLOGAN_SITE_SPIP}}}
+#SET{desc_auto,       #ENV{type-page,sommaire}|=={sommaire}|?{#DESCRIPTIF_SITE_SPIP}}
+#SET{url_auto,        #ENV{type-page,sommaire}|=={sommaire}|?{#URL_SITE_SPIP,#URL_PAGE{#ENV{type-page}}}}
+#SET{date_auto,       #DATE}
+#SET{maj_auto,        ''}
+#SET{langue_auto,     #LANG}
+#SET{territoire_auto, ''}
+#SET{auteurs_auto,    #NOM_SITE_SPIP}
+#SET{mots_auto,       ''}
+<//B_objet>
+
+[(#REM)
+
+	Cas 1 et 2 : compléments
+	Pas de logo ? On prend celui configuré par défaut, sinon celui du site
+
+]
+[(#ENV{logos}|non|et{#GET{logos_auto}|non}|oui)
+#SET{logos_auto,#INFO_FICHIER{document,#CONFIG{metasplus/id_doc_logo}}|sinon{#LOGO_SITE_SPIP|extraire_attribut{src}}}
+]
+
+[(#REM)
+
+	====================
+	2. Code des metas
+	====================
+
+]
+<INCLURE{
+	fond=inclure/metasplus/inc-dist,
+	titre=#ENV{titre,#GET{titre_auto}},
+	desc=#ENV{desc,#GET{desc_auto}},
+	url=#ENV{url,#GET{url_auto}},
+	date=#ENV{date,#GET{date_auto}},
+	maj=#ENV{maj,#GET{maj_auto}},
+	langue=#ENV{langue,#GET{langue_auto}},
+	territoire=#ENV{territoire,#GET{territoire_auto}},
+	og-type=#ENV{og-type,#GET{og-type_auto}},
+	dc-type=#ENV{dc-type,#GET{dc-type_auto}},
+	logos=#ENV{logos,#GET{logos_auto}},
+	auteurs=#ENV{auteurs,#GET{auteurs_auto}},
+	mots=#ENV{mots,#GET{mots_auto}},
+	env,
+}/>
+
+#FILTRE{trim}
diff --git a/design_system_dependences/metasplus/inclure/metasplus/evenement.html b/design_system_dependences/metasplus/inclure/metasplus/evenement.html
new file mode 100644
index 0000000..5033f6d
--- /dev/null
+++ b/design_system_dependences/metasplus/inclure/metasplus/evenement.html
@@ -0,0 +1,8 @@
+[(#REM)
+
+	Métas+ : variante pour les évènements
+
+]
+<INCLURE{fond=inclure/metasplus/dist,
+	dc-type=Event,
+	env} />
\ No newline at end of file
diff --git a/design_system_dependences/metasplus/inclure/metasplus/inc-dist.html b/design_system_dependences/metasplus/inclure/metasplus/inc-dist.html
new file mode 100644
index 0000000..8dd8be9
--- /dev/null
+++ b/design_system_dependences/metasplus/inclure/metasplus/inc-dist.html
@@ -0,0 +1,186 @@
+[(#REM)
+
+	Métas+ : ce squelette contient le code des métas pour Dublin Core, Open Graph et Twitter.
+	Ici aucune requête SQL, on doit recevoir toutes les données.
+	Il est inclus dans inclure/metasplus/dist.html, voir ce dernier pour les explications et les paramètres.
+
+]
+[(#REM)
+
+
+	============================================
+	1) Normalisation et vérification des valeurs
+	============================================
+
+
+]
+#SET{titre,      #ENV{titre}|trim|html_entity_decode|supprimer_tags|textebrut}
+#SET{desc,       #ENV{desc}|trim|html_entity_decode|supprimer_tags|textebrut}
+#SET{url,        #ENV{url}|trim}
+#SET{date,       #ENV{date}|trim}
+#SET{maj,        #ENV{maj}|trim}
+#SET{lang,       #ENV{langue}|trim}
+#SET{og-type,    #ENV{og-type}|trim}
+#SET{dc-type,    #ENV{dc-type}|trim}
+#SET{territoire, #ENV{territoire}|=={en}|?{uk,#ENV{territoire,#ENV{langue}}}|strtoupper|trim}
+#SET{locale,     #ENV{langue}|concat{_,#GET{territoire}}|trim}
+#SET{couper,     200}
+#SET{dimensions, #ARRAY{
+	opengraph, 1200:630,
+	twitter,   506:253,
+}}
+[(#REM)
+	auteurs
+]
+#SET{auteurs,#ARRAY}
+<BOUCLE_normaliser_auteurs(DATA){source table, #ENV{auteurs}|is_array|?{#ENV{auteurs},#ENV{auteurs}|explode{','}}|array_filter}>
+#SET{auteurs,#GET{auteurs}|push{#VALEUR|trim|html_entity_decode|supprimer_tags|textebrut}}
+</BOUCLE_normaliser_auteurs>
+[(#REM)
+	mots-clés
+]
+#SET{mots,#ARRAY}
+<BOUCLE_normaliser_mots(DATA){source table, #ENV{mots}|is_array|?{#ENV{mots},#ENV{mots}|explode{','}}|array_filter}>
+#SET{mots,#GET{mots}|push{#VALEUR|trim|html_entity_decode|supprimer_tags|textebrut}}
+</BOUCLE_normaliser_mots>
+[(#REM)
+	Logos
+]
+#SET{logos,#ARRAY}
+<BOUCLE_normaliser_logos(DATA){source table, #ENV{logos}|is_array|?{#ENV{logos},#ENV{logos}|explode{','}}|array_filter}>
+#SET{valeur,#VALEUR|is_array|?{
+	#ARRAY{
+		url, #VAL{#VALEUR{url}|supprimer_timestamp},
+		alt, #VAL{#VALEUR{alt}|trim|supprimer_tags|textebrut},
+	},
+	#ARRAY{url,#VALEUR|supprimer_timestamp}
+}|array_filter}
+[(#CHEMIN{#GET{valeur/url}}|oui)
+#SET{logos,#GET{logos}|push{#GET{valeur}}}
+]
+</BOUCLE_normaliser_logos>
+[(#REM)
+
+
+	============================
+	2) Affichage des métadonnées
+	============================
+
+
+]
+[(#REM)
+
+	===========
+	Dublin Core
+	===========
+
+	http://dublincore.org
+
+]
+<BOUCLE_dublincore(CONDITION) {si #CONFIG{metasplus/dublincore}}>
+<!-- Dublin Core -->
+<link rel="schema.DC" href="https://purl.org/dc/elements/1.1/" />
+<link rel="schema.DCTERMS" href="https://purl.org/dc/terms/" />
+<meta name="DC.Format" content="text/html" />
+[<meta name="DC.Type" content="(#GET{dc-type})" />]
+[<meta name="DC.Language" content="(#GET{lang})" />]
+[<meta name="DC.Title" lang="#GET{lang}" content="(#GET{titre}|attribut_html)" />]
+[<meta name="DC.Description.Abstract" lang="#GET{lang}" content="(#GET{desc}|couper{#GET{couper},'…'}|attribut_html)" />]
+[<meta name="DC.Date" content="(#GET{date}|affdate{Y-m-d})" />]
+[<meta name="DC.Date.Modified" content="(#GET{maj}|affdate{Y-m-d})" />]
+[<meta name="DC.Identifier" content="(#GET{url}|url_absolue)" />]
+[<meta name="DC.Publisher" content="(#NOM_SITE_SPIP|attribut_html)" />]
+[<meta name="DC.Source" content="(#URL_SITE_SPIP)" />]
+<BOUCLE_auteurs_dublincore(DATA){source table, #GET{auteurs}}>
+[<meta name="DC.Creator" content="(#VALEUR|attribut_html)" />]
+</BOUCLE_auteurs_dublincore>
+<BOUCLE_mots_dublincore(DATA) {source table, #GET{mots}}>
+[<meta name="DC.Subject" content="(#VALEUR|attribut_html)" />]
+</BOUCLE_mots_dublincore>
+</BOUCLE_dublincore>
+[(#REM)
+
+	==========
+	Open Graph
+	==========
+
+	http://ogp.me
+	https://developers.facebook.com/docs/sharing/opengraph/object-properties
+	https://developers.facebook.com/docs/sharing/webmasters/images
+	https://developers.facebook.com/tools/debug/
+
+]
+<BOUCLE_opengraph(CONDITION) {si #CONFIG{metasplus/opengraph}}>
+<!-- Open Graph -->
+[(#GET{logos}|count|oui)
+<meta property="og:rich_attachment" content="true" />
+]
+[<meta property="og:site_name" content="(#NOM_SITE_SPIP|attribut_html)" />]
+[<meta property="og:type" content="(#GET{og-type}|attribut_html)" />]
+[<meta property="og:title" content="(#GET{titre}|attribut_html)" />]
+[<meta property="og:locale" content="(#GET{locale})" />]
+[<meta property="og:url" content="(#GET{url}|url_absolue)" />]
+[<meta property="og:description" content="(#GET{desc}|couper{#GET{couper},'…'}|attribut_html)" />]
+#SET{largeur,#GET{dimensions/opengraph}|explode{:}|table_valeur{0}}
+#SET{hauteur,#GET{dimensions/opengraph}|explode{:}|table_valeur{1}}
+<BOUCLE_logos_opengraph(DATA) {source table, #GET{logos}}>
+#SET{src, #VALEUR{url}|image_recadre{#GET{dimensions/opengraph},-,focus}
+	|image_reduire{#GET{largeur},#GET{hauteur}}
+	|extraire_attribut{src}
+	|sinon{#VALEUR{url}}
+	|supprimer_timestamp}
+[(#VAL{finfo_file}|function_exists|oui)
+#SET{finfo,#EVAL{FILEINFO_MIME_TYPE}|finfo_open}
+#SET{mimetype,#GET{finfo}|finfo_file{#GET{src}}}
+]
+[<meta property="og:image" content="(#GET{src}|url_absolue)" />]
+[<meta property="og:image:width" content="(#GET{src}|largeur)" />]
+[<meta property="og:image:height" content="(#GET{src}|hauteur)" />]
+[<meta property="og:image:type" content="(#GET{mimetype})" />]
+[<meta property="og:image:alt" content="(#VALEUR{alt}|couper{80}|attribut_html)" />]
+</BOUCLE_logos_opengraph>
+<BOUCLE_article_opengraph(CONDITION) {si #GET{og-type}|=={article}}>
+[<meta property="article:published_time" content="(#GET{date}|affdate{Y-m-d})" />]
+[<meta property="article:modified_time" content="(#GET{maj}|affdate{Y-m-d})" />]
+<BOUCLE_auteurs_opengraph(DATA){source table, #GET{auteurs}}>
+[<meta property="article:author" content="(#VALEUR|attribut_html)" />]
+</BOUCLE_auteurs_opengraph>
+<BOUCLE_mots_opengraph(DATA) {source table, #GET{mots}}>
+[<meta property="article:tag" content="(#VALEUR|attribut_html)" />]
+</BOUCLE_mots_opengraph>
+</BOUCLE_article_opengraph>
+[(#REM) Si plugin facebook, on envoie la méta fb:app_id ]
+[<meta property="fb:app_id" content="(#CONFIG{facebook/cle})" />]
+</BOUCLE_opengraph>
+[(#REM)
+
+	============
+	Twitter Card
+	============
+
+	https://dev.twitter.com/cards/types/summary
+	https://dev.twitter.com/cards/types/summary-large-image
+	https://cards-dev.twitter.com/validator
+
+]
+<BOUCLE_twitter(CONDITION) {si #CONFIG{metasplus/twitter}}>
+<!-- Twitter Card -->
+<meta name="twitter:card" content="[(#GET{logos}|count|?{summary_large_image,summary})]" />
+[<meta name="twitter:title" content="(#GET{titre}|attribut_html)" />]
+[<meta name="twitter:description" content="(#GET{desc}|couper{#GET{couper},'…'}|attribut_html)" />]
+<meta name="twitter:dnt" content="on" />
+[<meta name="twitter:url" content="(#GET{url}|url_absolue)" />]
+#SET{largeur,#GET{dimensions/twitter}|explode{:}|table_valeur{0}}
+#SET{hauteur,#GET{dimensions/twitter}|explode{:}|table_valeur{1}}
+<BOUCLE_images_twitter(DATA) {source table, #GET{logos}} {0,1}>
+#SET{src, #VALEUR{url}|image_recadre{#GET{dimensions/twitter},-,focus}
+	|image_reduire{#GET{largeur},#GET{hauteur}}
+	|extraire_attribut{src}
+	|sinon{#VALEUR{url}}
+	|timestamp}
+[<meta name="twitter:image" content="(#GET{src}|url_absolue)" />]
+[<meta property="twitter:image:alt" content="(#VALEUR{alt}|couper{80}|attribut_html)" />]
+</BOUCLE_images_twitter>
+</BOUCLE_twitter>
+
+#FILTRE{trim}
diff --git a/design_system_dependences/metasplus/lang/metasplus.xml b/design_system_dependences/metasplus/lang/metasplus.xml
new file mode 100644
index 0000000..8c288b6
--- /dev/null
+++ b/design_system_dependences/metasplus/lang/metasplus.xml
@@ -0,0 +1,12 @@
+<traduction
+	module="metasplus"
+	id="metasplus--metasplus-23d39"
+	gestionnaire="salvatore"
+	url="https://trad.spip.net"
+	source="https://git.spip.net/spip-contrib-extensions/metasplus.git"
+	reference="fr">
+	<langue code="en" url="https://trad.spip.net/tradlang_module/metasplus?lang_cible=en" total="15" traduits="15" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="raphael" lien="https://trad.spip.net/auteur/raphael-7042" />
+	</langue>
+	<langue code="fr" url="https://trad.spip.net/tradlang_module/metasplus?lang_cible=fr" total="15" traduits="15" relire="0" modifs="0" nouveaux="0" pourcent="100.00" />
+</traduction>
diff --git a/design_system_dependences/metasplus/lang/metasplus_en.php b/design_system_dependences/metasplus/lang/metasplus_en.php
new file mode 100644
index 0000000..34b808a
--- /dev/null
+++ b/design_system_dependences/metasplus/lang/metasplus_en.php
@@ -0,0 +1,34 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/metasplus?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// E
+	'explication_id_doc_logo' => 'Allows you to use an image of your choice instead of the SPIP site logo (properties "og:image" and "twitter:image", recommended format: 1,91:1)',
+	'explication_masquer_auteurs' => 'Check this option if you do not want to publish the names of the content writers: the site name will be used instead.',
+
+	// I
+	'icone_previsu' => 'Meta+ Overview',
+	'icone_previsu_title' => 'Overview of Dublin Core, Open Graph and Twitter metadata.',
+
+	// L
+	'label_case_masquer_auteurs' => 'Use the name of the site as the author of the content',
+	'label_dublincore' => 'Dublin Core',
+	'label_masquer_auteurs' => 'Authors',
+	'label_opengraph' => 'Open Graph',
+	'label_previsu_fond' => 'Background used',
+	'label_previsu_objet' => 'Editorial object',
+	'label_reseaux' => 'Check the meta to be included',
+	'label_twitter' => 'Twitter',
+	'logo_bis' => 'Site image',
+
+	// T
+	'titre_config_metasplus' => 'Configure Meta +',
+	'titre_previsu' => 'Overview of Dublin Core, Open Graph and Twitter metadata.'
+);
diff --git a/design_system_dependences/metasplus/lang/metasplus_fr.php b/design_system_dependences/metasplus/lang/metasplus_fr.php
new file mode 100644
index 0000000..7e7e541
--- /dev/null
+++ b/design_system_dependences/metasplus/lang/metasplus_fr.php
@@ -0,0 +1,32 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans https://git.spip.net/spip-contrib-extensions/metasplus.git
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// E
+	'explication_id_doc_logo' => 'Permet d’utiliser une image de votre choix à la place du logo du site SPIP (propriétés "og:image" et "twitter:image", format conseillé : 1,91:1)',
+	'explication_masquer_auteurs' => 'Cochez cette option si vous ne souhaitez pas diffuser le nom des rédacteurs des contenus : le nom du site sera utilisé à la place.',
+
+	// I
+	'icone_previsu' => 'Aperçu des métas+',
+	'icone_previsu_title' => 'Aperçu des métadonnées Dublin Core, Open Graph et Twitter.',
+
+	// L
+	'label_case_masquer_auteurs' => 'Utiliser le nom du site comme auteur des contenus',
+	'label_dublincore' => 'Dublin Core',
+	'label_masquer_auteurs' => 'Auteurs',
+	'label_opengraph' => 'Open Graph',
+	'label_previsu_fond' => 'Fond utilisé',
+	'label_previsu_objet' => 'Objet éditorial',
+	'label_reseaux' => 'Cochez les métas à inclure',
+	'label_twitter' => 'Twitter',
+	'logo_bis' => 'Image du site',
+
+	// T
+	'titre_config_metasplus' => 'Configurer Métas +',
+	'titre_previsu' => 'Aperçu des métadonnées Dublin Core, Open Graph et Twitter.'
+);
diff --git a/design_system_dependences/metasplus/lang/paquet-metasplus.xml b/design_system_dependences/metasplus/lang/paquet-metasplus.xml
new file mode 100644
index 0000000..2387ee3
--- /dev/null
+++ b/design_system_dependences/metasplus/lang/paquet-metasplus.xml
@@ -0,0 +1,12 @@
+<traduction
+	module="paquet-metasplus"
+	id="paquet-metasplus--metasplus-23d39"
+	gestionnaire="salvatore"
+	url="https://trad.spip.net"
+	source="https://git.spip.net/spip-contrib-extensions/metasplus.git"
+	reference="fr">
+	<langue code="en" url="https://trad.spip.net/tradlang_module/paquet-metasplus?lang_cible=en" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="raphael" lien="https://trad.spip.net/auteur/raphael-7042" />
+	</langue>
+	<langue code="fr" url="https://trad.spip.net/tradlang_module/paquet-metasplus?lang_cible=fr" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00" />
+</traduction>
diff --git a/design_system_dependences/metasplus/lang/paquet-metasplus_en.php b/design_system_dependences/metasplus/lang/paquet-metasplus_en.php
new file mode 100644
index 0000000..8463b8c
--- /dev/null
+++ b/design_system_dependences/metasplus/lang/paquet-metasplus_en.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-metasplus?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// M
+	'metasplus_description' => 'Improve the indexing of your articles in search engines and their display on social networks with Dublin Core, Open Graph and Twitter Card metadata.',
+	'metasplus_slogan' => 'Metadata for Open Graph, Duclin Core and Twitter'
+);
diff --git a/design_system_dependences/metasplus/lang/paquet-metasplus_fr.php b/design_system_dependences/metasplus/lang/paquet-metasplus_fr.php
new file mode 100644
index 0000000..66cf875
--- /dev/null
+++ b/design_system_dependences/metasplus/lang/paquet-metasplus_fr.php
@@ -0,0 +1,13 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans https://git.spip.net/spip-contrib-extensions/metasplus.git
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// M
+	'metasplus_description' => 'Améliorez l’indexation de vos articles dans les moteurs et leur affichage sur les réseaux sociaux grâce aux métadonnées Dublin Core, Open Graph et Twitter Card.',
+	'metasplus_slogan' => 'Métadonnées pour Open Graph, Duclin Core et Twitter'
+);
diff --git a/design_system_dependences/metasplus/metasplus_administrations.php b/design_system_dependences/metasplus/metasplus_administrations.php
new file mode 100644
index 0000000..50ced8d
--- /dev/null
+++ b/design_system_dependences/metasplus/metasplus_administrations.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Fichier gérant l'installation et désinstallation du plugin Métas+
+ *
+ * @plugin     Métas+
+ * @copyright  2018
+ * @author     Tetue, Erational, Tcharlss
+ * @licence    GNU/GPL
+ * @package    SPIP\Metas+\Installation
+ */
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Fonction d'installation et de mise à jour du plugin Métas+.
+ *
+ * @param string $nom_meta_base_version
+ *     Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
+ * @param string $version_cible
+ *     Version du schéma de données dans ce plugin (déclaré dans paquet.xml)
+ * @return void
+**/
+function metasplus_upgrade($nom_meta_base_version, $version_cible) {
+	$maj = array();
+
+	// 1ère installation : passe la config en opt-in
+	$maj['create'] = array(
+		array('metasplus_maj_create'),
+	);
+	
+	include_spip('base/upgrade');
+	maj_plugin($nom_meta_base_version, $version_cible, $maj);
+}
+
+
+/**
+ * Fonction de désinstallation du plugin Métas+.
+ *
+ * @param string $nom_meta_base_version
+ *     Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP
+ * @return void
+**/
+function metasplus_vider_tables($nom_meta_base_version) {
+	effacer_meta($nom_meta_base_version);
+}
+
+
+/**
+ * Fonction privée pour la mise à jour create (1ère installation)
+ * On passe la config des protocoles en opt-in
+ *
+ * @return Void
+ */
+function metasplus_maj_create(){
+	include_spip('inc/config');
+	$config = lire_config('metasplus');
+	$protocoles = array('dublincore', 'opengraph', 'twitter');
+	foreach($protocoles as $protocole) {
+		if (empty($config[$protocole])) {
+			$config[$protocole] = 'on';
+		} else {
+			unset($config[$protocole]);
+		}
+	}
+	ecrire_config('metasplus', $config);
+}
\ No newline at end of file
diff --git a/design_system_dependences/metasplus/metasplus_autorisations.php b/design_system_dependences/metasplus/metasplus_autorisations.php
new file mode 100644
index 0000000..4cc69cc
--- /dev/null
+++ b/design_system_dependences/metasplus/metasplus_autorisations.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Définit les autorisations du plugin Métas+
+ *
+ * @plugin     Métas+
+ * @copyright  2016-2018
+ * @author     Tetue, Erational, Tcharlss
+ * @licence    GNU/GPL
+ * @package    SPIP\Metas+\Autorisations
+ */
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Fonction d'appel pour le pipeline
+ * @pipeline autoriser */
+function metasplus_autoriser() {
+}
+
+
+/**
+ * Autorisation de prévisualiser les métas+ d'un objet
+ *
+ * Il faut être admin et avoir le droit de modifier l'objet
+ *
+ * @param  string $faire Action demandée
+ * @param  string $type  Type d'objet sur lequel appliquer l'action
+ * @param  int    $id    Identifiant de l'objet
+ * @param  array  $qui   Description de l'auteur demandant l'autorisation
+ * @param  array  $opt   Options de cette autorisation
+ * @return bool          true s'il a le droit, false sinon
+**/
+function autoriser_previsualiser_metasplus_dist($faire, $type, $id, $qui, $opt){
+
+	$is_admin = ($qui['statut'] == '0minirezo');
+	$autoriser_modifier = autoriser('modifier', $type, $id, $qui, $opt);
+	$autoriser = ($is_admin and $autoriser_modifier);
+
+	return $autoriser;
+}
\ No newline at end of file
diff --git a/design_system_dependences/metasplus/metasplus_fonctions.php b/design_system_dependences/metasplus/metasplus_fonctions.php
new file mode 100644
index 0000000..d73bd73
--- /dev/null
+++ b/design_system_dependences/metasplus/metasplus_fonctions.php
@@ -0,0 +1,161 @@
+<?php
+/**
+ * Fonctions utiles au plugin Métas+
+ *
+ * @plugin     Métas+
+ * @copyright  2016-2018
+ * @author     Tetue, Erational, Tcharlss
+ * @licence    GNU/GPL
+ * @package    SPIP\Metas+\Fonctions
+ */
+
+/**
+ * Retrouver le contexte d'après l'URL : type de page, objet éventuel
+ *
+ * @Note
+ * Il n'est pas recommandé d'utiliser $GLOBALS['contexte],
+ * donc on utilise la fonction qui décode l'URL
+ * et retourne un tableau linéaire avec les bonnes infos :
+ * [0]            => page (le fond)
+ * [1][id_patate] => identifiant si page d'un objet
+ * [1][erreur]    => erreur éventuelle (404)
+ *
+ * @param string $url
+ * @return array
+ *   Tableau associatif :
+ *   array{
+ *     type-page: string  (type de page),
+ *     erreur:    bool    (true si page ou décodage en erreur),
+ *     objet:     string  (type d'objet éventuel),
+ *     id_objet:  int     (numéro d'objet éventuel),
+ *     id_patate: int     (numéro d'objet éventuel)
+ *   }
+ */
+function metasplus_identifier_contexte($url) {
+
+	// Decoder_url nous donne quelques infos sur la page actuelle
+	// type-page n'est rempli que pour les objets éditoriaux
+	$decoder_url = charger_fonction('decoder_url', 'urls');
+	$decodage    = $decoder_url($url);
+	$type_page   = (!empty($decodage[0]) ? $decodage[0] : '');
+	$erreur      = (isset($decodage[1]['erreur']) ? true : false);
+
+	// On retourne au minimum le type de page et l'erreur
+	$contexte = array(
+		'type-page' => $type_page,
+		'erreur'    => $erreur,
+	);
+
+	// On complète les infos pour repérer la page d'accueil, les pages autonomes,
+	// et donner des choses complémentaires sur l'éventuel objet.
+	if (!$erreur) {
+
+		// S'agit-il d'une page autonome ? (?page=truc)
+		$query_page    = (defined('_SPIP_PAGE') ? _SPIP_PAGE : 'page');
+		$page_autonome = _request($query_page);
+
+		// Soit c'est la page d'un objet
+		if ($type_page) {
+			include_spip('base/objets');
+			$cle_objet = id_table_objet($type_page);
+			$id_objet = (isset($decodage[1][$cle_objet]) ? intval($decodage[1][$cle_objet]) : 0);
+			if ($id_objet) {
+				$contexte['objet']    = $type_page;
+				$contexte['id_objet'] = $id_objet;
+				$contexte[$cle_objet] = $id_objet; // ça peut servir
+			}
+
+		// Soit c'est une page autonome ?page=truc
+		} elseif ($page_autonome) {
+			$contexte['type-page'] = $page_autonome;
+
+		// Soit c'est la page d'accueil
+		} else {
+			$contexte['type-page'] = 'sommaire';
+
+			// Exception pour le plugin multidomaines : on est dans une rubrique
+			// TODO : faire un pipeline
+			if (test_plugin_actif('multidomaines')) {
+				$multidomaines = lire_config('multidomaines');
+				foreach ($multidomaines as $id_rubrique => $domaine) {
+					if ($domaine['url'] && rtrim($url, '/') == $domaine['url']) {
+						$contexte['type-page']  = 'rubrique';
+						$contexte['erreur']     = false;
+						$contexte['objet']      = 'rubrique';
+						$contexte['id_objet']   = $id_rubrique;
+						$contexte['id_article'] = $id_rubrique;
+						$contexte['url']        = $url;
+					}
+				}
+			}
+		}
+	}
+
+	return $contexte;
+}
+
+
+/**
+ * Sélectionner le squelette des métadonnées pour un type de page
+ *
+ * On cherche dans l'ordre :
+ *
+ * - 1) inclure/metaplus/<type-page>-<composition>.html
+ * - 2) inclure/metaplus/<type-page>.html
+ * - 3) inclure/metaplus/dist.html
+ *
+ * @param array $contexte
+ *     Contexte de la page, avec le type de page, le type d'objet etc.
+ * @return string
+ *     Le fond
+ */
+function metasplus_selectionner_fond($contexte) {
+
+	include_spip('inc/utils');
+
+	$fond             = '';
+	$type_page        = (!empty($contexte['type-page']) ? $contexte['type-page'] : '');
+	$objet            = (!empty($contexte['objet']) ? $contexte['objet'] : '');
+	$id_objet         = (!empty($contexte['id_objet']) ? intval($contexte['id_objet']) : '');
+	$composition      = '';
+	$racine           = 'inclure/metasplus/';
+	$fond_defaut      = $racine . 'dist';
+	$fond_page        = $racine . $type_page;
+	$fond_composition = '';
+
+	if (
+		test_plugin_actif('compositions')
+		and $objet
+		and $id_objet
+		and include_spip('compositions_fonctions')
+		and $composition = compositions_determiner($objet, $id_objet)
+	) {
+		$fond_composition = $fond_page . '-' . $composition;
+	}
+
+	// En priorité, le fond de la composition du type de page
+	if ($composition and find_in_path($fond_composition.'.html')) {
+		$fond = $fond_composition;
+	// Sinon le fond du type de page
+	} elseif (find_in_path($fond_page.'.html')) {
+		$fond = $fond_page;
+	// Sinon le fond générique
+	} elseif (find_in_path($fond_defaut.'.html')) {
+		$fond = $fond_defaut;
+	}
+
+	return $fond;
+}
+
+/**
+ * @param array $args
+ * @param \Spip\Bigup\Formulaire $formulaire
+ * @return \Spip\Bigup\Formulaire
+ */
+function inc_bigup_medias_formulaire_configurer_metasplus_dist($args, $formulaire) {
+	$formulaire->preparer_input_class(
+		'bigup', // 'file' pour rendre automatique.
+		['previsualiser' => true]
+	);
+	return $formulaire;
+}
diff --git a/design_system_dependences/metasplus/metasplus_identifier_contexte.html b/design_system_dependences/metasplus/metasplus_identifier_contexte.html
new file mode 100644
index 0000000..40f1cf8
--- /dev/null
+++ b/design_system_dependences/metasplus/metasplus_identifier_contexte.html
@@ -0,0 +1,16 @@
+[(#REM)
+
+	Squelette technique pour retrouver le contexte correspondant à une URL.
+	Cf. pipeline affichage_final
+
+	Renvoie le contexte sous forme de tableau associatif sérialisé :
+	- type-page : le type de la page
+	- objet : le type d'objet le cas échéant
+	- id_objet : son identifiant
+	- id_patate : idem, mais avec le nom de sa clé primaire
+	- erreur : 'true' si la page est en erreur
+
+	Paramètres :
+	- url : url à décoder, par défaut l'url courante.
+
+][(#ENV{url,#SELF}|url_absolue|metasplus_identifier_contexte|serialize)]
\ No newline at end of file
diff --git a/design_system_dependences/metasplus/metasplus_pipelines.php b/design_system_dependences/metasplus/metasplus_pipelines.php
new file mode 100644
index 0000000..e2b5db7
--- /dev/null
+++ b/design_system_dependences/metasplus/metasplus_pipelines.php
@@ -0,0 +1,148 @@
+<?php
+/**
+ * Utilisations de pipelines par le plugin Métas+
+ *
+ * @plugin     Métas+
+ * @copyright  2016-2018
+ * @author     Tetue, Erational, Tcharlss
+ * @licence    GNU/GPL
+ * @package    SPIP\Metas+\Pipelines
+ */
+
+// Sécurité
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+
+/**
+ * Effectuer des traitements juste avant l'envoi des pages publiques.
+ *
+ * => Ajout des métadonnéess Open Graph, Dublin Core et Twitter
+ * dans le <head> public de certaines pages.
+ *
+ * @Note : on retrouve les informations du contexte de la page
+ * au moyen d'un squelette pour bénéficier de la mise en cache
+ * et éviter des requêtes SQL à chaque hit via decoder_url().
+ *
+ * @uses metasplus_identifier_contexte()
+ * @uses metasplus_selectionner_fond()
+ * 
+ * @param $flux
+ * @return mixed
+ */
+function metasplus_affichage_final($flux) {
+
+	include_spip('inc/config');
+	include_spip('inc/utils'); // pour self()
+
+	// Tests préliminaires avant d'inclure éventuellement les métas
+	if (
+		// C'est du HTML et on est pas dans le privé
+		$GLOBALS['html']
+		and !test_espace_prive()
+		// Il y a un <head>
+		and $pos_head = strpos($flux, '</head>')
+		// Au moins un protocole est activé
+		and $config = lire_config('metasplus')
+		and !empty($config)
+		// Le contexte est retrouvé
+		and $url = self()
+		and $contexte = recuperer_fond('metasplus_identifier_contexte', array('url' => $url))
+		// On est pas en var_mode=inclure (plantage de unserialize)
+		and !strpos( $contexte, 'inclure_blocs')
+		and is_array($contexte = unserialize($contexte))
+		// On a une page sans erreur
+		and !empty($contexte['type-page'])
+		and $contexte['erreur'] === false
+		// La page n'est pas exclue
+		and is_array($pages_exclues = (
+			(defined('_METASPLUS_PAGES_EXCLUES') and _METASPLUS_PAGES_EXCLUES) ?
+				explode(',', _METASPLUS_PAGES_EXCLUES) :
+				array()
+		))
+		and (!in_array($contexte['type-page'], $pages_exclues))
+		// Ce n'est pas une page d'un pseudo fichier (ex. robots.txt.html)
+		and !strpos($contexte['type-page'], '.')
+	) {
+
+		// Trouver le squelette à utiliser
+		include_spip('metasplus_fonctions');
+		$fond = metasplus_selectionner_fond($contexte);
+
+		// Si le squelette n'est pas vide, on ajoute son contenu à la fin du head
+		// On complète avec le contexte par défaut qui peut contenir des query strings et cie
+		$contexte_defaut = ((isset($GLOBALS['contexte']) and is_array($GLOBALS['contexte'])) ? $GLOBALS['contexte'] : array());
+		$full_contexte = array_merge($contexte_defaut, $contexte);
+		if (
+			$fond
+			and $metas = recuperer_fond($fond, $full_contexte)
+		) {
+			$metas = "<!-- Plugin Métas + -->\n$metas\n";
+			$flux = substr_replace($flux, $metas, $pos_head, 0);
+		}
+	}
+
+	return $flux;
+}
+
+
+/**
+ * pipeline post_edition pour supprimer la meta metasplus/id_doc_logo
+ * quand on supprime l'image dans le formulaire de configuration
+ *
+ * @param $flux
+ * @return $flux
+ * @author tofulm
+ */
+function metasplus_post_edition($flux) {
+	if (
+		isset($flux['args']['table'])
+		and $flux['args']['table'] === 'spip_documents'
+		and isset($flux['args']['operation'])
+		and $flux['args']['operation'] === 'supprimer_document'
+		and isset($flux['args']['action'])
+		and $flux['args']['action'] === 'supprimer_document'
+		and include_spip('inc/config')
+		and $flux['args']['id_objet'] == lire_config('metasplus/id_doc_logo')
+	) {
+		effacer_config('metasplus/id_doc_logo');
+	}
+	return $flux;
+}
+
+
+/**
+ * Gérer les informations affichées dans l’espace privé
+ * dans le cadre d’information des objets SPIP
+ *
+ * => Ajout du bouton de prévisualisation des métas+
+ *
+ * @param $flux
+ * @return $flux
+ * @author tofulm
+ */
+function metasplus_boite_infos($flux) {
+
+	if (
+		$objet = $flux['args']['type']
+		and $id_objet = $flux['args']['id']
+		and autoriser('previsualiser_metasplus', $objet, $id_objet)
+		and objet_info($objet,'page')
+	) {
+		include_spip('base/objets');
+		include_spip('inc/filtres');
+		$type_page = objet_info($objet, 'page');
+		$id_table_objet = id_table_objet($objet);
+		$contexte = array(
+			'type-page'      => $type_page,
+			'objet'          => $objet,
+			'id_objet'       => $id_objet,
+			$id_table_objet  => $id_objet,
+		);
+		$fond_previsu = recuperer_fond('prive/squelettes/inclure/metasplus_bouton_previsu', $contexte);
+		$flux['data'] .= $fond_previsu;
+	}
+
+	return $flux;
+}
diff --git a/design_system_dependences/metasplus/opengraph-150.png b/design_system_dependences/metasplus/opengraph-150.png
new file mode 100644
index 0000000000000000000000000000000000000000..2bb1c2e0cb5e6ed187a2e9d513da943bd955c307
GIT binary patch
literal 10808
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

literal 0
HcmV?d00001

diff --git a/design_system_dependences/metasplus/opengraph-xx.svg b/design_system_dependences/metasplus/opengraph-xx.svg
new file mode 100644
index 0000000..c788af7
--- /dev/null
+++ b/design_system_dependences/metasplus/opengraph-xx.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
+  <path d="M57.2 41.1c-.9 0-1.7.2-2.4.5-.3-.2-.5-.4-1-.6V19.4L31.9 6.7 13.6 17.5l-.9-.6c0-3.2-2.6-5.8-5.8-5.8C3.6 11.2 1 13.8 1 17s2.6 5.8 5.8 5.8c.9 0 1.7-.2 2.4-.5.3.2.7.4.9.5v21.8L32 57.3l18.5-10.8c.3.2.5.3.8.5 0 3.2 2.6 5.8 5.8 5.8 3.2 0 5.8-2.6 5.8-5.8.1-3.3-2.5-5.9-5.7-5.9" fill="#b8c6c9"/>
+  <path d="M32 53.7l18.7-10.9V21.3L32 10.4l-18.7 11v21.4L32 53.7m27.8-6.8c0 1.5-1.2 2.7-2.6 2.7-1.5 0-2.6-1.2-2.6-2.7 0-1.5 1.2-2.7 2.6-2.7 1.4.1 2.6 1.3 2.6 2.7M4.2 17c0-1.5 1.2-2.7 2.6-2.7 1.5 0 2.6 1.2 2.6 2.7s-1.2 2.7-2.6 2.7-2.6-1.2-2.6-2.7" fill="#759bc5"/>
+  <path d="M57.2 48.5c-.9 0-1.6-.7-1.6-1.6 0-.9.7-1.6 1.6-1.6.9 0 1.6.7 1.6 1.6 0 .9-.7 1.6-1.6 1.6zm-21.6 1.8c1.7-2.5 3.8-6.1 5-10.4 2.7.6 5.2 1.4 7.9 2.8l-12.9 7.6zM22.5 25.6c-.4 1.7-.7 3.6-.8 5.6h-7.5v-8.6c2.8 1.4 5.6 2.4 8.3 3zm-15.7-7c-.9 0-1.6-.7-1.6-1.6 0-.9.7-1.6 1.6-1.6.9 0 1.6.7 1.6 1.6 0 .9-.7 1.6-1.6 1.6zM28 14c-1.7 2.4-3.7 5.8-5 10-2.5-.5-4.9-1.4-7.4-2.7L28 14zm4.7 23.5v-2c1.4-.3 2.5-1.3 2.8-2.7h4.9c-.1 1.8-.3 3.6-.7 5.2-2.2-.3-4.5-.5-7-.5zm0 1.7c2.4 0 4.5.2 6.5.5-1.7 5.5-4.7 9.9-6.5 12V39.2zm-9.7 1c1.2 4.1 3.2 7.5 5 9.9l-12.7-7.3c1.5-.8 4.2-1.8 7.7-2.6zm5.5-7.4c.3 1.3 1.4 2.4 2.7 2.7v2c-2.4 0-4.8.3-7.2.7-.4-1.7-.7-3.5-.7-5.4h5.2zm2.7-6.3v2c-1.3.3-2.4 1.3-2.7 2.7h-5.2c.1-1.9.3-3.6.7-5.3 2.2.3 4.6.5 7.2.6zm0-13.1v11.3c-2.5 0-4.7-.2-6.7-.5 1.7-5.6 4.9-9.9 6.7-11.9v1.1zm9.4 10.5c-1.3-4.2-3.3-7.7-5-10.1l13 7.6c-1.6.6-4.3 1.7-8 2.5zm-7.9-10.5v-1.1c1.7 2.1 4.8 6.3 6.5 11.9-2.1.4-4.3.6-6.5.6V13.4zM32 33.9c-1.1 0-1.9-.9-1.9-1.9 0-1.1.9-1.9 1.9-1.9 1.1 0 1.9.9 1.9 1.9 0 1-.9 1.9-1.9 1.9zm-.8 17.9c-1.8-2-5-6.2-6.7-11.9 2.2-.4 4.4-.6 6.7-.7v12.6zm4.3-20.7c-.3-1.3-1.4-2.4-2.8-2.7v-2c2.3 0 4.6-.2 6.9-.6.4 1.7.7 3.5.7 5.3h-4.8zm13.9 0h-7.7c-.1-2-.4-3.8-.8-5.6 4-.8 7.1-2 8.5-2.8v8.4zm-35.1 1.7h7.5c.1 2 .3 3.9.7 5.7-3.8.8-6.5 2-8.2 2.8v-8.5zM41 38.3c.4-1.7.6-3.6.7-5.5h7.8v8.6c-2.7-1.5-5.6-2.5-8.5-3.1zm16.2 4.9c-1 0-1.9.4-2.6 1-1-.6-2-1.2-3-1.7V20.7L31.9 9.2l-18.5 11c-1-.6-2-1.2-3.1-1.8.1-.4.2-.8.2-1.2 0-2-1.7-3.7-3.7-3.7s-3.7 1.7-3.7 3.7 1.7 3.7 3.7 3.7c1 0 1.8-.4 2.5-1 1 .6 2.1 1.2 2.8 1.7v22L31.9 55l18.8-11 3 1.8c-.1.4-.2.8-.2 1.2 0 2 1.7 3.7 3.7 3.7s3.7-1.7 3.7-3.7-1.7-3.8-3.7-3.8z" fill="#343532"/>
+</svg>
diff --git a/design_system_dependences/metasplus/paquet.xml b/design_system_dependences/metasplus/paquet.xml
new file mode 100644
index 0000000..50cdd2c
--- /dev/null
+++ b/design_system_dependences/metasplus/paquet.xml
@@ -0,0 +1,25 @@
+<paquet
+	prefix="metasplus"
+	categorie="divers"
+	version="2.4.5"
+	schema="1.0.0"
+	etat="stable"
+	compatibilite="[3.1.0;4.2.*]"
+	logo="opengraph-150.png"
+	documentation="https://contrib.spip.net/4969"
+>
+
+	<nom>Métas +</nom>
+	<!-- Métadonnées pour booster vos articles -->
+
+	<auteur lien="http://spip.tetue.net">tetue</auteur>
+	<auteur lien="https://www.erational.org">erational</auteur>
+	<auteur lien="https://www.bravecassine.com">tcharlss</auteur>
+
+	<pipeline nom="affichage_final" inclure="metasplus_pipelines.php" />
+	<pipeline nom="post_edition" inclure="metasplus_pipelines.php" />
+	<pipeline nom="boite_infos" inclure="metasplus_pipelines.php" />
+	<pipeline nom="autoriser" inclure="metasplus_autorisations.php" />
+
+	<utilise nom="composition" compatibilite="[3.7.0;[" />
+</paquet>
diff --git a/design_system_dependences/metasplus/prive/squelettes/contenu/configurer_metasplus.html b/design_system_dependences/metasplus/prive/squelettes/contenu/configurer_metasplus.html
new file mode 100644
index 0000000..f47fb93
--- /dev/null
+++ b/design_system_dependences/metasplus/prive/squelettes/contenu/configurer_metasplus.html
@@ -0,0 +1,4 @@
+[(#AUTORISER{configurer,metasplus}|sinon_interdire_acces)]
+<div class="ajax">
+#FORMULAIRE_CONFIGURER_METASPLUS
+</div>
\ No newline at end of file
diff --git a/design_system_dependences/metasplus/prive/squelettes/contenu/metasplus_previsu.html b/design_system_dependences/metasplus/prive/squelettes/contenu/metasplus_previsu.html
new file mode 100644
index 0000000..20dfe2c
--- /dev/null
+++ b/design_system_dependences/metasplus/prive/squelettes/contenu/metasplus_previsu.html
@@ -0,0 +1,57 @@
+[(#REM)
+
+	Page de prévisualisation des métadonnées d'un objet éditorial
+
+	Paramètres :
+		**obligatoire
+
+		- **page : type de page
+		- **objet : type d'objet
+		- **id_objet : id de l'objet
+		- **id_patate : id de l'objet
+
+]
+#SET{cle_objet,   #ENV{objet}|id_table_objet}
+#SET{contexte,    #ARRAY{type-page,#ENV{page},objet,#ENV{objet},id_objet,#ENV{id_objet}}}
+#SET{fond,        #GET{contexte}|metasplus_selectionner_fond}
+#SET{texte_objet, #ENV{objet}|objet_info{texte_objet}|_T}
+#SET{redirect,    #ENV{id_objet}|generer_url_entite{#ENV{objet}}}
+
+<h1 class="grostitre"><:metasplus:titre_previsu:></h1>
+
+<p class="notice">Dans cette prévisualisation, les URLs pointent vers le privé, mais rassurez-vous, elles sont correctes dans les pages publiques.</p>
+
+#BOITE_OUVRIR{'',info}
+[(#GET{redirect}|icone_verticale{[(#ENV{objet}|objet_info{texte_retour}|_T)],#ENV{objet}|objet_info{icone_objet},'',right retour metasplus})]
+<dl>
+	<dt><:metasplus:label_previsu_objet:> :</dt>
+	<dd>
+		<:titre_cadre_numero_objet{objet=#GET{texte_objet}}|spip_strtolower|ucfirst|replace{':',''}:>[(#ENV{id_objet})][ : «&nbsp;(#INFO_TITRE{#ENV{objet},#ENV{id_objet}})&nbsp;»]
+	</dd>
+	<dt><:metasplus:label_previsu_fond:> :</dt>
+	<dd><code>#GET{fond}.html</code></dd>
+</dl>
+#BOITE_FERMER
+
+#BOITE_OUVRIR{'',simple metasplus}
+[(#PLUGIN{coloration_code}|non)<pre><code>]
+[(#GET{fond}|recuperer_fond{
+	#ARRAY{
+		type-page,#ENV{page},
+		objet,#ENV{objet},
+		id_objet,#ENV{id_objet},
+		#GET{cle_objet},#ENV{id_objet},
+	}}
+	|appliquer_filtre{
+		#PLUGIN{coloration_code}|?{coloration_code_color,htmlentities},
+		#PLUGIN{coloration_code}|?{spip,#EVAL{null}}
+	}
+	|replace{'^\s+',''}
+)]
+[(#PLUGIN{coloration_code}|non)</code></pre>]
+#BOITE_FERMER
+
+<style>
+	code.html {display:block;overflow-x:auto}
+	.box.simple.metasplus{overflow-x:auto}
+</style>
\ No newline at end of file
diff --git a/design_system_dependences/metasplus/prive/squelettes/inclure/metasplus_bouton_previsu.html b/design_system_dependences/metasplus/prive/squelettes/inclure/metasplus_bouton_previsu.html
new file mode 100644
index 0000000..1d830d6
--- /dev/null
+++ b/design_system_dependences/metasplus/prive/squelettes/inclure/metasplus_bouton_previsu.html
@@ -0,0 +1,18 @@
+[(#REM)
+
+	Lien de prévisualisation des métas+
+
+	Nb : hack pas joli pour ajouter la classe mediabox sur le lien.
+]
+
+[(#URL_ECRIRE{metasplus_previsu}
+	|parametre_url{page,#ENV{type-page}}
+	|parametre_url{objet,#ENV{objet}}
+	|parametre_url{id_objet,#ENV{id_objet}}
+	|parametre_url{var_zajax,contenu}
+	|icone_horizontale{
+		<:metasplus:icone_previsu:>,
+		'metasplus_previsu-24',
+	}
+	|inserer_attribut{title,<:metasplus:icone_previsu_title:>}
+	|replace{'<a','<a class="mediabox"'})]
\ No newline at end of file
diff --git a/design_system_dependences/metasplus/prive/themes/spip/images/metasplus_previsu-16.png b/design_system_dependences/metasplus/prive/themes/spip/images/metasplus_previsu-16.png
new file mode 100644
index 0000000000000000000000000000000000000000..58dfec6e3fbb3a189d56bc3570e99d20d8da1012
GIT binary patch
literal 1437
zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7BuiW)N`mv#O3D+9QW+dm
z@{>{(JaZG%Q-e|yQz{EjrrIztFe_z-M3hAM`dB6B=jtVb)aX^@7BGN-jeSKyVsdtB
zi9%9pdS;%j()-=}l@u~lY?Z=IeGPmIoKrJ0J*tXQgRA^PlB=?lEmM^2?G$V(tSWK~
za#KqZ6)JLb@`|l0Y?Z*~TICg6frRyy6u?SKvTc<hj*9RNP;kyKN>wn`Gtf;oFf&vz
zGto0NF|ahT)KM@pFf`CNG}1RP*EKY-GBvj{FjRm7B|8P1qLehNAQv~NT}3Hrwn`Z#
zB?VUc`sL;2dgaD?`9<mahL)C=`UXb&Mn<|tDQUXJm3bwJ6}oxF$}kgLQj3#|G7CyF
z^YauyCMG83mzLNnDM5{`$Sr^yn^z1CrsVuw{ffi_eM3D1ke48S%`Nct#ji9s7p}Uv
zBq$Z(UaSTehg24%>IbD3=a&{Grv{~_DTCZpVC7ttnpl!w6q28x0}I7~jQo=P;*9(P
z1?ON>Jwt`?%)FHR@?x-hUtcTFyyB9?yyR3*7h9!@+ycGK%oHnUS64?%M@uJDOAA*+
zLsuh57Xvd#b7vD1Lo-K9Cld>pUYGpj(%jU%5}4i;gkEQydO=A66dYDAsYRJ(sVQzn
z`MC;UFI#2ec8euW^PqZDaJ$73r(S(K1si=(#3DsBOeo034a5YeNl^N<Q$QsA)Vvg1
zr6MJJyW>%u*BKa?1U+3GLn>|^3HHtq4ivG?fA-YaQ(g0NulMvOjk_K5x0GB~i4b(u
z)l%9qW!nmCd(oH2Tm_f#My!>8#h%RO;??UE8=|uA&7v?@@0BY$q^C}p;5W;v^8MGd
zCdN(L-s1BTE6(hFf4BJgozEQtOs^Z8N}J+N`}N)KdHZ<IZbqf~`yZBR9_CV9u<BPt
z=v3yGHSZRmdpP;{u75K>CjPtnFRAjQK&a?t%|#Vw<oEqM^yj;f8uw+7rI#x#|H{ps
z>sj+J@aUcGi)R0ij5{>ZmUH=Jna6udLz~;$qBJ;cr5r6BE+%bp;ATsZV0%=>Ql-)p
zVbYTtJ<0Rh;_BOpw{zSkxz`FRM+w~AZC>!Zip_VUMP47zNz*pr<NVI~mlFJZ9tQqn
z)w?g{?j!d0#y-i?W8#096i?Rt3Xu<5dH2TD3}>U6$NJ`S&Pd}^eATf$;allK_b!gv
zjB96`H5G4ctkS#SByyL1_rlj!8oU;_7KcT<<*w|yw@>b7oow{Bt-Uu&+Zwp`%>1pi
z{BYL}qi-%28)okA*!*0-qyIDaqW_N?X3VU8{#-)b&MVcM=k7`CJJF)~ueN+No|bwr
zqc3@5(8MIO-<J7{jkmJ@WID6a=X%DwpV2(`tF^8*y>W5;GH+*z-!-mNOhM94S~Gv2
zFF7aWr&2#h!$y1;-_+O>W~;(dU%g8BzryCv?QZL~fa?kWC)L<j%0JnE|ClHv8-rS-
VpySOIiY}l6)6><@Wt~$(698nG7Q+Al

literal 0
HcmV?d00001

diff --git a/design_system_dependences/metasplus/prive/themes/spip/images/metasplus_previsu-24.png b/design_system_dependences/metasplus/prive/themes/spip/images/metasplus_previsu-24.png
new file mode 100644
index 0000000000000000000000000000000000000000..7b89999d3051ade0e7a6ba4543a86167e1f671c4
GIT binary patch
literal 10610
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

literal 0
HcmV?d00001

diff --git a/design_system_dependences/metasplus/prive/themes/spip/images/metasplus_previsu-32.png b/design_system_dependences/metasplus/prive/themes/spip/images/metasplus_previsu-32.png
new file mode 100644
index 0000000000000000000000000000000000000000..d33340feba4612d8fd013ae1e61094c636b90d1c
GIT binary patch
literal 1889
zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}k|nMYCBgY=CFO}lsSJ)O
z`AMk?p1FzXsX?iUDV2pMQ*9U+n3Xa^B1$5BeXNr6bM+EIYV;~{3m8Da#=fE;F*!T6
zL?J0PJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRu#Dg
zxv3?I3Kh9IdBs*0wn|`gt@4VkK*IV;3ScEA*|tg$M@9GsC^+XAr7D=}8R#Y(m>DXV
zndljs7+9KE>L?f)7#ips8tEID>lzwZnVMS}7%D)4lAVH0QA(Oskc%7CuA-DQTcwPW
zk^(Dz{qpj1y>er{{GxPyLrY6beFGzXBO~3Slr-Jq%Dj@q3f;V7Wta&rsl~}fnFS@8
z`FRQ;6BCp2OG|8(l%U2|<QBk<%`1imQ*wT;ennz|zM-B0$V(8v<`($+;#ZoR3s+rS
z5|oN?FIIz#Ln;eW^@CE2^Gl18Q-e~|ltFGPuyQU+O)SYT3dzsUfrVl~Mt(_taYlZD
zf^)E`o}of`W?o8uc`;bMudkJ7UU5lcUUI6Zi>*>cZh>BAW{Q=mk*k}VlYxb)rG=xR
zp{tRliLtYzqlKffrL&2Ni-7@5uS<S%X>Mv>2~2MaLa!xGy`ZE33Jxom)S}F?)D*X(
z{9FaFm#s2!yTuHrc~HG6xZProQ?I_Af{i{XVv!;mCKTl224aHKBq)8_DIgMlYF>)1
zQjwCq-M8q@xeN@<S3O-ELn>~)3BQ{y5-#%p>|AU4*&BL2J}PcBJL?`S*sQxH;FtK6
zsLm^0Q!?%>Sa8*2(snJgx7D))yft-8!h-{nR;a0cz1!vF6n`t|!$RLX686(fvy$wt
z-JQA9_WQY<GV>gsDJ?cT#Lu0(Gqd{r&%5`3&NVJKRb;ug*>Fv<Hlqe(L^*?$q<wK-
zg+s<I_Ib}4lS;!<r51Nf*j(IH%x_yb&)nvZ@B8&hy0@-h)Lx`+RnS@U;<V-Slx@#{
z-u_o@!|8ikNI0iWt|0G#fkn#MA{qDIhj-qm8)fe3^FAUP6fS0TLGq`--Hi+HvMk!a
zc<amLsyAYn8`>5~6|FlwA?-)nq?_A1PyVpCkh|HPJkge;{q#!vWxwXj{ozPWHS;kx
zcb8l{@m$4@-vwcfA6SAFx(ovqoYrMuC}lfma=(NrL28DVn!vgh4yC@jPTTzcve*6J
z8Wqvz`1sSa6_rvvn@Wy3KDsDl6+NAOBMZaA>D{bpGv}<>GSTObvRclS{rg0ps;#KM
z|K2>OHP>@l&r!=sTPLJ0ut~WX!>u=Q_MEr~u@;_h%jVq(SoHUS-yPp`Y*HVR^Ci^!
z<g$)=i%L&nyLA3iL5%pcRH0z2pp_!?&YgMC{-Sazt0wa~$$z^{+w4!KWY;WayDgQa
zp(AD1mb;Sk#Vqp+a)Gl7xFjFg)mk$D())HX#jioaZ{9zqz3Gde+<9MLwu*bN_^(WH
zy^PPNIvd*UPgJ_6T>pLP$zETn!WjO`o6k>Cn~`Tyd)wM%O^g^rf~8GSyIJ7R_dirR
z&xD*`wR*Kd+4FsiVmSEM@7dLAbRgK|mC1C$Y$2xwFAIMvzkh1I)9iBb&8eQtb!Rqm
zHJlJm?5pcjZjbi-n%Gs&As2Z6URjgaWlff8UdOj7w|~6*-QMX%ozlq<kw?zm?*01X
z)$)VUMY@&eO&lMY3Mi@VTI@Vy_RL-XD&3dpMzen^JNxOAyoGf4qW_;1>f~jQemf>>
zabXYtex8_vFHUfj<>b4Z{^vhoQAx7T>8pIZ_Bi|9uifnU_Ka%EB*~egAu|lj|GwD1
z?wkjEug`>~KQ8H<m^Wclim%_D!0TscYhNu@dJ!HP`s)m<$aC{9J{d*l#hS4m4c>G7
zC)iF@dgA@s;akhJSYx?<?X*`}*|iKGZ-41qxNqIL^xn><Q!~#mn4^AQr0}1`eyvj`
zBH33xxF4N<cf<74XR({7UAYA>Uw^iG&!uyll|()p`{&L1`SVq^+|yTDwY{Ntp3k@2
z_tWP2&5enhbQx`HL^%tXmVcjCystt*k^AJLfDqsR`#p_<Q@FKdJ+6KC2>X>D!t~(~
e^AG<9Muz=50{adBtvCy+^gLbtT-G@yGywq0LH6+g

literal 0
HcmV?d00001

diff --git a/design_system_dependences/metasplus/prive/themes/spip/images/metasplus_previsu-xx.svg b/design_system_dependences/metasplus/prive/themes/spip/images/metasplus_previsu-xx.svg
new file mode 100644
index 0000000..2faeff8
--- /dev/null
+++ b/design_system_dependences/metasplus/prive/themes/spip/images/metasplus_previsu-xx.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
+  <path fill="#fff" d="M49.7 18.5H4.9v27h44.8l9-13.5z"/>
+  <path fill="#666" d="M2.9 49.4H51.8l10.9-16.3c.4-.7.4-1.5 0-2.1L51.8 14.6H2.9c-1.1 0-1.9.9-1.9 1.9v31c0 1 .9 1.9 1.9 1.9zm2-30.9h44.8l9 13.5-9 13.5H4.9v-27z"/>
+  <path fill="#666" d="M47.4 35.7c2.1 0 3.7-1.7 3.7-3.7s-1.7-3.7-3.7-3.7c-2.1 0-3.7 1.7-3.7 3.7s1.7 3.7 3.7 3.7z"/>
+  <path fill="#1d83d4" d="M29.4 29.6l-1.5 4.8H32l-.9 4.2h-4.6l-1.6 5h-4.6l1.6-5h-4l-1.6 5h-4.6l1.6-5H9l.9-4.2h4.6l1.5-4.8h-4.1l.9-4.2h4.6l1.6-5h4.7l-1.6 5h4l1.6-5h4.6l-1.6 5H35l-.9 4.2h-4.7zm-4.6 0h-4l-1.5 4.8h4l1.5-4.8z" />
+</svg>
diff --git a/design_system_dependences/squelettes_par_rubrique/.gitignore b/design_system_dependences/squelettes_par_rubrique/.gitignore
new file mode 100644
index 0000000..f6fb500
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/.gitignore
@@ -0,0 +1,7 @@
+/vendor/
+/composer.phar
+/composer.lock
+/phpcs.xml
+/phpstan.neon
+/.php_cs.cache
+/.php_cs.txt
diff --git a/design_system_dependences/squelettes_par_rubrique/composer.json b/design_system_dependences/squelettes_par_rubrique/composer.json
new file mode 100644
index 0000000..2163e8d
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/composer.json
@@ -0,0 +1,18 @@
+{
+    "require": {
+        "php": "^7.4 || ^8.0"
+    },
+    "require-dev": {
+        "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1",
+        "phpstan/phpstan": "^1.4",
+        "spip/coding-standards": "^1.2"
+    },
+    "config": {
+        "allow-plugins": {
+            "dealerdirect/phpcodesniffer-composer-installer": true
+        },
+        "platform": {
+            "php": "7.4.27"
+        }
+    }
+}
diff --git a/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique.xml b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique.xml
new file mode 100644
index 0000000..583b8f8
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique.xml
@@ -0,0 +1,61 @@
+<traduction
+	module="paquet-squelettes_par_rubrique"
+	id="paquet-squelettes_par_rubrique--squelettes_par_rubrique-5b74d"
+	gestionnaire="salvatore"
+	url="https://trad.spip.net"
+	source="https://git.spip.net/spip/squelettes_par_rubrique.git"
+	reference="fr">
+	<langue code="ar" url="https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=ar" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="George" lien="https://trad.spip.net/auteur/جورج-قندلفت" />
+	</langue>
+	<langue code="de" url="https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=de" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="klaus++" lien="https://trad.spip.net/auteur/klaus" />
+	</langue>
+	<langue code="en" url="https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=en" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="kent1" lien="https://trad.spip.net/auteur/kent1" />
+	</langue>
+	<langue code="eo" url="https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=eo" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="gpl" lien="https://trad.spip.net/auteur/gpl" />
+	</langue>
+	<langue code="es" url="https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=es" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="dani" lien="https://trad.spip.net/auteur/dani" />
+	</langue>
+	<langue code="fa" url="https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=fa" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Davood Hossein" lien="https://trad.spip.net/auteur/davood-hossein" />
+	</langue>
+	<langue code="fr" url="https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=fr" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00" />
+	<langue code="fr_fem" url="https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=fr_fem" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="denisb" lien="https://trad.spip.net/auteur/denisb" />
+	</langue>
+	<langue code="fr_tu" url="https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=fr_tu" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Cerf" lien="https://trad.spip.net/auteur/cerf" />
+	</langue>
+	<langue code="it" url="https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=it" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="phante" lien="https://trad.spip.net/auteur/phante" />
+	</langue>
+	<langue code="lb" url="https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=lb" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Jim Wanderscheid" lien="https://trad.spip.net/auteur/jwander" />
+	</langue>
+	<langue code="nl" url="https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=nl" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Suske" lien="https://trad.spip.net/auteur/suske" />
+	</langue>
+	<langue code="oc_ni_mis" url="https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=oc_ni_mis" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="sylvain" lien="https://trad.spip.net/auteur/sylvain" />
+	</langue>
+	<langue code="pt" url="https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=pt" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Cláudia Anjos Lopes" lien="https://trad.spip.net/auteur/claudia_a_lopes" />
+	</langue>
+	<langue code="pt_br" url="https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=pt_br" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="Ricardo Porto" lien="https://trad.spip.net/auteur/ricardo-porto" />
+	</langue>
+	<langue code="ru" url="https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=ru" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="olly" lien="https://trad.spip.net/auteur/olly" />
+		<traducteur nom="Serge Markitanenko" lien="https://trad.spip.net/auteur/serge-markitanenko" />
+	</langue>
+	<langue code="sk" url="https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=sk" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="jaro" lien="https://trad.spip.net/auteur/jaro" />
+	</langue>
+	<langue code="uk" url="https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=uk" total="2" traduits="2" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
+		<traducteur nom="olly" lien="https://trad.spip.net/auteur/olly" />
+	</langue>
+</traduction>
diff --git a/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_de.php b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_de.php
new file mode 100644
index 0000000..35f8d3b
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_de.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=de
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'squelettes_par_rubrique_description' => 'Unterstützung der Skelette mit Rubriknummer und/oder Sprachcode als Namenszusatz: (-23.html, =23.html, et .en.html)',
+	'squelettes_par_rubrique_slogan' => 'Unterstützung von Skeletten mit Namenszusatz in SPIP'
+);
diff --git a/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_en.php b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_en.php
new file mode 100644
index 0000000..57fc9f0
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_en.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=en
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'squelettes_par_rubrique_description' => 'Support of suffixed templates by section number and/or by language code : (-23.html, =23.html, and .en.html)',
+	'squelettes_par_rubrique_slogan' => 'Support of suffixed templates in SPIP'
+);
diff --git a/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_eo.php b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_eo.php
new file mode 100644
index 0000000..a855683
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_eo.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=eo
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'squelettes_par_rubrique_description' => 'Subteno por la skeletoj sufiksitaj per rubrikonumero kaj lingvokodo (ekz., -23.html, =23.html, kaj .eo.html)',
+	'squelettes_par_rubrique_slogan' => 'Subteno por la sufiksitaj skeletoj en SPIP'
+);
diff --git a/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_es.php b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_es.php
new file mode 100644
index 0000000..b284f04
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_es.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=es
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'squelettes_par_rubrique_description' => 'Implementación de esqueletos con sufijo por numero de sección y/o por código de idioma: (-23.html, =23.html, y .en.html)',
+	'squelettes_par_rubrique_slogan' => 'Implementación de esqueletos con sufijos de SPIP'
+);
diff --git a/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_fa.php b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_fa.php
new file mode 100644
index 0000000..17fff10
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_fa.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=fa
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'squelettes_par_rubrique_description' => 'پشتيبان اسكلت‌هاي پسوندي توسط تعدادي بخش و/يا توسط كدر زبان :  (-23.html, =23.html, et .en.html)  ',
+	'squelettes_par_rubrique_slogan' => 'پشتيباني از اسكليت‌هاي  پسوندي در اسپيپ '
+);
diff --git a/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_fr.php b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_fr.php
new file mode 100644
index 0000000..50895ed
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_fr.php
@@ -0,0 +1,13 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// Fichier source, a modifier dans https://git.spip.net/spip/squelettes_par_rubrique.git
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'squelettes_par_rubrique_description' => 'Support des squelettes suffixés par numéro de rubrique et/ou par code de langue : (-23.html, =23.html, et .en.html)',
+	'squelettes_par_rubrique_slogan' => 'Support des squelettes suffixés dans SPIP'
+);
diff --git a/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_fr_fem.php b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_fr_fem.php
new file mode 100644
index 0000000..88200c2
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_fr_fem.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=fr_fem
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'squelettes_par_rubrique_description' => 'Support des squelettes suffixés par numéro de rubrique et/ou par code de langue : (-23.html, =23.html, et .en.html)',
+	'squelettes_par_rubrique_slogan' => 'Support des squelettes suffixés dans SPIP'
+);
diff --git a/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_fr_tu.php b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_fr_tu.php
new file mode 100644
index 0000000..1aba5b0
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_fr_tu.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=fr_tu
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'squelettes_par_rubrique_description' => 'Support des squelettes suffixés par numéro de rubrique et/ou par code de langue : (-23.html, =23.html, et .en.html)',
+	'squelettes_par_rubrique_slogan' => 'Support des squelettes suffixés dans SPIP'
+);
diff --git a/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_it.php b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_it.php
new file mode 100644
index 0000000..e63e032
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_it.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=it
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'squelettes_par_rubrique_description' => 'Supporto dei modelli con suffisso numero di sezione e/o il codice della lingua: (-23.html, =23.html, et .en.html)',
+	'squelettes_par_rubrique_slogan' => 'Supporto di modelli con suffisso in SPIP'
+);
diff --git a/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_lb.php b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_lb.php
new file mode 100644
index 0000000..4f74a23
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_lb.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=lb
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'squelettes_par_rubrique_description' => 'Ënnerstëtzung vun de Skeletter mat engem Suffix fir d’Rubrik an/oder d’Sprooch: (-23.html, =23.html, an .en.html)',
+	'squelettes_par_rubrique_slogan' => 'Ënnerstëtzung fir Skeletter mat Suffix am SPIP'
+);
diff --git a/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_nl.php b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_nl.php
new file mode 100644
index 0000000..5f83309
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_nl.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=nl
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'squelettes_par_rubrique_description' => 'Ondersteuning van de suffix ingewijden skeletten (met rubrieknummers en / of taal-code: -23.html, =23.html   en .en.html)',
+	'squelettes_par_rubrique_slogan' => 'Ondersteuning van suffix ingewijden skeletten in SPIP '
+);
diff --git a/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_oc_ni_mis.php b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_oc_ni_mis.php
new file mode 100644
index 0000000..119b61e
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_oc_ni_mis.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=oc_ni_mis
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'squelettes_par_rubrique_description' => 'Supouòrt dei esquèletrou sufissat per un nùmero de rùbrica e/o per un code de lenga : (-23.html, =23.html, e .en.html)',
+	'squelettes_par_rubrique_slogan' => 'Supouòrt dei esquèletrou sufissat en SPIP'
+);
diff --git a/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_pt.php b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_pt.php
new file mode 100644
index 0000000..84c9043
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_pt.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=pt
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'squelettes_par_rubrique_description' => 'Apoio dos modelos com sufixo por número de rubrica e/ou por código de idioma : (-23.html, =23.html, et .en.html)',
+	'squelettes_par_rubrique_slogan' => 'Apoio de modelos com sufixo em SPIP'
+);
diff --git a/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_pt_br.php b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_pt_br.php
new file mode 100644
index 0000000..1318e64
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_pt_br.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=pt_br
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'squelettes_par_rubrique_description' => 'Suporte aos gabaritos com sufixo do númeor da seção e/ou por código de idioma: (-23.html, =23.html, et .en.html)',
+	'squelettes_par_rubrique_slogan' => 'Suporte aos gabaritos com sufixo do SPIP'
+);
diff --git a/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_ru.php b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_ru.php
new file mode 100644
index 0000000..e6ce756
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_ru.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=ru
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'squelettes_par_rubrique_description' => 'Позволяет задавать отдельные шаблоны по номеру раздела, статьи, а также языковой версии: (-23.html, =23.html, и .en.html)',
+	'squelettes_par_rubrique_slogan' => 'Номерные шаблоны для SPIP'
+);
diff --git a/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_sk.php b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_sk.php
new file mode 100644
index 0000000..262b2f9
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_sk.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=sk
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'squelettes_par_rubrique_description' => 'Podpora šablón pripojených vo forme prípony podľa čísla rubriky a/lebo kódu jazyka: (-23.html, =23.html a .en.html)',
+	'squelettes_par_rubrique_slogan' => 'Podpora pripojených šablón v SPIPe'
+);
diff --git a/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_uk.php b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_uk.php
new file mode 100644
index 0000000..1ef9544
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/lang/paquet-squelettes_par_rubrique_uk.php
@@ -0,0 +1,15 @@
+<?php
+// This is a SPIP language file  --  Ceci est un fichier langue de SPIP
+// extrait automatiquement de https://trad.spip.net/tradlang_module/paquet-squelettes_par_rubrique?lang_cible=uk
+// ** ne pas modifier le fichier **
+
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+$GLOBALS[$GLOBALS['idx_lang']] = array(
+
+	// S
+	'squelettes_par_rubrique_description' => 'Дозволяє задавати окремі шаблони за номером рубріки, статті, а також мовної версії: (-23.html, =23.html, и .en.html)',
+	'squelettes_par_rubrique_slogan' => 'Шаблони за номерами для SPIP'
+);
diff --git a/design_system_dependences/squelettes_par_rubrique/paquet.xml b/design_system_dependences/squelettes_par_rubrique/paquet.xml
new file mode 100644
index 0000000..feda398
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/paquet.xml
@@ -0,0 +1,15 @@
+<paquet
+	prefix="squelettes_par_rubrique"
+	categorie="outil"
+	version="2.0.1"
+	etat="stable"
+	compatibilite="[4.1.0;4.2.*]"
+	logo="squelettes_par_rubrique-32.png"
+	documentation="https://www.spip.net/3445"
+>
+
+	<nom>Squelettes par Rubrique</nom>
+	<!-- Support des squelettes suffixés dans SPIP -->
+
+	<auteur>Collectif SPIP</auteur>
+</paquet>
diff --git a/design_system_dependences/squelettes_par_rubrique/phpcs.xml.dist b/design_system_dependences/squelettes_par_rubrique/phpcs.xml.dist
new file mode 100644
index 0000000..d75d301
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/phpcs.xml.dist
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<ruleset>
+    <file>.</file>
+    <exclude-pattern>vendor/*</exclude-pattern>
+    <exclude-pattern>lang/*</exclude-pattern>
+    <exclude-pattern>lib/*</exclude-pattern>
+
+    <rule ref="SPIP41"/>
+
+    <config name="ignore_warnings_on_exit" value="1"/>
+    <arg name="cache" value=".php_cs.cache"/>
+    <arg name="report-full" value=".php_cs.txt"/>
+    <arg name="report-summary"/>
+    <arg value="s"/>
+</ruleset>
diff --git a/design_system_dependences/squelettes_par_rubrique/phpstan-baseline.neon b/design_system_dependences/squelettes_par_rubrique/phpstan-baseline.neon
new file mode 100644
index 0000000..36f4dac
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/phpstan-baseline.neon
@@ -0,0 +1,12 @@
+parameters:
+	ignoreErrors:
+		-
+			message: "#^Function lang_select not found\\.$#"
+			count: 2
+			path: squelettes_par_rubrique_options.php
+
+		-
+			message: "#^Function quete_parent not found\\.$#"
+			count: 1
+			path: squelettes_par_rubrique_options.php
+
diff --git a/design_system_dependences/squelettes_par_rubrique/phpstan.neon.dist b/design_system_dependences/squelettes_par_rubrique/phpstan.neon.dist
new file mode 100644
index 0000000..9cd9a27
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/phpstan.neon.dist
@@ -0,0 +1,12 @@
+includes:
+	- phpstan-baseline.neon
+
+parameters:
+    paths:
+        - .
+    excludePaths:
+        analyseAndScan:
+            - vendor
+            - lang
+            - lib
+    level: 0
diff --git a/design_system_dependences/squelettes_par_rubrique/squelettes_par_rubrique-xx.svg b/design_system_dependences/squelettes_par_rubrique/squelettes_par_rubrique-xx.svg
new file mode 100644
index 0000000..f26c948
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/squelettes_par_rubrique-xx.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
+  <path fill="#fff" d="M30.8 18.6v-5.3H10.7V56h48V18.6z"/>
+  <path d="M26.8 50.6h-16V13.3h14.9l5.3 5.3h22.5v10.7h5.3V16c0-1.5-1.2-2.7-2.7-2.7h-23L27.8 8H8c-1.5 0-2.7 1.2-2.7 2.7v42.6C5.3 54.8 6.5 56 8 56h18.8v-5.4z" fill="#666"/>
+  <path d="M55.2 44.6l-1.9 6.1h5.2l-1.1 5.4h-5.9l-2 6.3h-5.9l2-6.3h-5.1l-2 6.3h-5.9l2-6.3h-5.3l1.1-5.4h5.9l1.9-6.1H33l1.1-5.4H40l2-6.3h6l-2 6.3h5.1l2-6.3H59l-2 6.3h5.3l-1.1 5.4h-6zm-5.9 0h-5.1l-1.9 6.1h5.1l1.9-6.1z" fill="#1d83d4"/>
+</svg>
\ No newline at end of file
diff --git a/design_system_dependences/squelettes_par_rubrique/squelettes_par_rubrique_options.php b/design_system_dependences/squelettes_par_rubrique/squelettes_par_rubrique_options.php
new file mode 100644
index 0000000..01ec0f9
--- /dev/null
+++ b/design_system_dependences/squelettes_par_rubrique/squelettes_par_rubrique_options.php
@@ -0,0 +1,107 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Système de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright © avec tendresse depuis 2001                                 *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribué sous licence GNU/GPL.     *
+ *  Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+/**
+ * Déclarations de pipelines
+ *
+ * @package SPIP\SquelettesParRubrique\Pipelines
+ **/
+if (!defined('_ECRIRE_INC_VERSION')) {
+	return;
+}
+
+if (!isset($GLOBALS['spip_pipeline']['styliser'])) {
+	$GLOBALS['spip_pipeline']['styliser'] = '';
+}
+
+// Ajoute à la fin du pipeline styliser la recherche de squelettes par rubriques et par langue
+$GLOBALS['spip_pipeline']['styliser'] .= '||squelettes_par_rubrique_styliser_par_rubrique|squelettes_par_rubrique_styliser_par_langue';
+
+/**
+ * Cherche un squelette par rubrique squelette-XX.html ou squelette=XX.html
+ *
+ * Options de recherche de squelette par le styliseur, appelé par le pipeline 'styliser'
+ *
+ * @pipeline styliser
+ *
+ * @param array $flux Données du pipeline
+ * @return array       Données du pipeline
+ */
+function squelettes_par_rubrique_styliser_par_rubrique($flux) {
+
+	// uniquement si un squelette a ete trouve
+	if ($squelette = $flux['data']) {
+		$ext = $flux['args']['ext'];
+
+		// On selectionne, dans l'ordre :
+		// fond=10
+		if ($id_rubrique = $flux['args']['id_rubrique']) {
+			$f = "$squelette=$id_rubrique";
+			if (@file_exists("$f.$ext")) {
+				$squelette = $f;
+			} else {
+				$maxiter = 10000; // on ne remonte pas au dela en profondeur
+				// fond-10 fond-<rubriques parentes>
+				do {
+					$f = "$squelette-$id_rubrique";
+					if (@file_exists("$f.$ext")) {
+						$squelette = $f;
+						break;
+					}
+				} while (
+					$maxiter--
+					and $id_rubrique = quete_parent($id_rubrique)
+					// se proteger des references circulaires
+					and $id_rubrique != $flux['args']['id_rubrique']
+				);
+			}
+			// sauver le squelette
+			$flux['data'] = $squelette;
+		}
+	}
+
+	return $flux;
+}
+
+
+/**
+ * Cherche l'existence un squelette par langue squelette.en.html
+ *
+ * Options de recherche de squelette par le styliseur, appelé par le pipeline 'styliser'
+ *
+ * @pipeline styliser
+ *
+ * @param array $flux Données du pipeline
+ * @return array       Données du pipeline
+ */
+function squelettes_par_rubrique_styliser_par_langue($flux) {
+
+	// uniquement si un squelette a ete trouve
+	if ($squelette = $flux['data']) {
+		$ext = $flux['args']['ext'];
+
+		// Affiner par lang
+		if ($lang = $flux['args']['lang']) {
+			$l = lang_select($lang);
+			$f = "$squelette." . $GLOBALS['spip_lang'];
+			if ($l) {
+				lang_select();
+			}
+			if (@file_exists("$f.$ext")) {
+				// sauver le squelette
+				$flux['data'] = $f;
+			}
+		}
+	}
+
+	return $flux;
+}
-- 
GitLab