From fa13018a9ef63c633e78da253106867d6bac8a78 Mon Sep 17 00:00:00 2001
From: "cedric@yterium.com" <>
Date: Mon, 29 Jul 2019 12:40:49 +0000
Subject: [PATCH] Refonte des modeles document : * on declare le routeur de
 modele medias_modeles_styliser qui redirige les raccourcis img, doc et emb
 selon la regle suivante    - le nouveal modele correspond au champ media du
 document : image, audio, video, file    - si une declinaison correspondant au
 raccourci initial (_img, _doc ou _emb) existe on la prend      -> un modele
 file_emb.html reprend le mecanisme d'embed generique selon
 extension+mime-type de l'ancien modele emb.html * les 4 modeles de base
 image, audio, video, file et les declinaisons file_emb sont toutes en
 <figure></figure> * les styles en dur float sont supprimes, on ne garde qu'un
 width:{largeur}px sur l'element <figure> qui permet d'avoir un conteneur
 ajuste   - il se contourne facilement par un min-width:100%; ou un width:auto
 !important; * spip_doc_titre, spip_doc_descriptif et spip_doc_credits sont
 regroupes dans le figcaption.spip_doc_legende * les modeles historiques doc,
 img et emb disparaissent. Les eventuels modeles surcharges dans squelettes/
 sont ignores * les 3 modeles image, audio et video ajoutent des conditions
 sur leur boucle, pour etre sur qu'on a bien a faire avec le bon type de
 media, et sinon renvoient vers le modele file * le mode du document n'est
 plus considere dans aucun modele dans le format de l'affichage qui n'en
 depend donc plus du tout

En pratique donc <emb>, <img> et <doc> sont equivalents pour les medias audio, video, image (et consistent a afficher/embed le media par defaut)
Pour les autres types de media <doc> affiche le lien vers le document avec une vignette + legende, et <emb> affiche un traitement differencie en fonction du mime type
On peut utiliser le raccourci <fileXX> pour n'importe quel media
Si on utilise <imageXX> ou <audioXX> ou <videoXX> sur un media inaproprie ca affichera le contenu de <fileXX>
---
 .gitattributes                                | 17 ++---
 base/medias.php                               |  3 +-
 medias_fonctions.php                          | 29 ++++++++
 modeles/audio.html                            | 45 +++++++-----
 modeles/doc.html                              | 48 ------------
 modeles/doc_legende.html                      | 38 ----------
 modeles/emb_mp4.html                          |  1 -
 modeles/file.html                             | 40 ++++++++++
 modeles/{emb.html => file_emb.html}           |  2 +-
 ...ication.html => file_emb_application.html} | 28 +++----
 ...b_fonctions.php => file_emb_fonctions.php} |  6 +-
 modeles/file_emb_text.html                    | 12 +++
 modeles/file_emb_text_csv.html                | 11 +++
 modeles/file_emb_text_html.html               | 12 +++
 modeles/image.html                            | 73 +++++++------------
 modeles/img.html                              | 53 --------------
 modeles/text.html                             |  6 --
 modeles/text_csv.html                         |  3 -
 modeles/text_html.html                        |  6 --
 modeles/video.html                            | 23 +++---
 20 files changed, 200 insertions(+), 256 deletions(-)
 delete mode 100644 modeles/doc.html
 delete mode 100644 modeles/doc_legende.html
 delete mode 100644 modeles/emb_mp4.html
 create mode 100644 modeles/file.html
 rename modeles/{emb.html => file_emb.html} (56%)
 rename modeles/{application.html => file_emb_application.html} (68%)
 rename modeles/{emb_fonctions.php => file_emb_fonctions.php} (70%)
 create mode 100644 modeles/file_emb_text.html
 create mode 100644 modeles/file_emb_text_csv.html
 create mode 100644 modeles/file_emb_text_html.html
 delete mode 100644 modeles/img.html
 delete mode 100644 modeles/text.html
 delete mode 100644 modeles/text_csv.html
 delete mode 100644 modeles/text_html.html

diff --git a/.gitattributes b/.gitattributes
index 68dd429a..9edc820f 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -278,22 +278,19 @@ metadata/image.php -text
 metadata/svg.php -text
 metadata/swf.php -text
 metadata/video.php -text
-modeles/application.html -text
 modeles/audio.html -text
-modeles/doc.html -text
-modeles/doc_legende.html -text
 modeles/document_case.html -text
 modeles/document_case_fonctions.php -text
 modeles/document_desc.html -text
 modeles/document_desc_fonctions.php -text
-modeles/emb.html -text
-modeles/emb_fonctions.php -text
-modeles/emb_mp4.html -text
+modeles/file.html -text
+modeles/file_emb.html -text
+modeles/file_emb_application.html -text
+modeles/file_emb_fonctions.php -text
+modeles/file_emb_text.html -text
+modeles/file_emb_text_csv.html -text
+modeles/file_emb_text_html.html -text
 modeles/image.html -text
-modeles/img.html -text
-modeles/text.html -text
-modeles/text_csv.html -text
-modeles/text_html.html -text
 modeles/video.html -text
 prive/objets/contenu/portfolio_document.html -text
 prive/objets/editer/colonne_document.html -text
diff --git a/base/medias.php b/base/medias.php
index 75434779..63b31165 100644
--- a/base/medias.php
+++ b/base/medias.php
@@ -213,7 +213,8 @@ function medias_declarer_tables_objets_sql($tables) {
 			'fichier',
 			'distant'
 		),
-		'modeles' => array('document', 'doc', 'img', 'emb', 'image', 'video', 'text', 'audio', 'application'),
+		'modeles' => array('document', 'doc', 'img', 'emb', 'image', 'video', 'audio', 'file'),
+		'modeles_styliser' => 'medias_modeles_styliser',
 	);
 
 	// jointures sur les forum pour tous les objets
diff --git a/medias_fonctions.php b/medias_fonctions.php
index 17d7f85a..b5b89e53 100644
--- a/medias_fonctions.php
+++ b/medias_fonctions.php
@@ -53,6 +53,35 @@ if (isset($_SERVER['REQUEST_METHOD'])
 	exit;
 }
 
+/**
+ * Styliser le modele media : reroute les <img> <doc> <emb> vers <image>, <audio>, <video>, <file> selon le media du document
+ * si le document n'est pas trouve c'est <file> qui s'applique
+ * @param $modele
+ * @param $id
+ * @return string
+ */
+function medias_modeles_styliser($modele, $id) {
+	switch($modele) {
+		case 'img':
+		case 'doc':
+		case 'emb':
+			$m = 'file';
+			if ($doc = sql_fetsel('id_document,media', 'spip_documents', 'id_document='.intval($id))) {
+				$m = $doc['media']; // image, audio, video, file
+			}
+			if (trouve_modele("{$m}_{$modele}")) {
+				// on peut decliner file_emb qui sera utilisable soit par <docXX|emb> soit par <embXX>
+				// permet d'embed explicitement des fichiers exotiques qui sinon seraient de simples liens a telecharger
+				// tels que text/csv, text/html, text
+				$m = "{$m}_{$modele}";
+			}
+			$modele = $m;
+			break;
+	}
+	return $modele;
+}
+
+
 /**
  * Retourne la taille en octet d'une valeur de configuration php
  *
diff --git a/modeles/audio.html b/modeles/audio.html
index 41b3e1a0..c8118b4c 100644
--- a/modeles/audio.html
+++ b/modeles/audio.html
@@ -1,23 +1,34 @@
-<BOUCLE_tous (DOCUMENTS types_documents) {id_document=#ID} {tout}>
+[(#REM)
+
+	Modele pour les sons
+  Filtrer en acceptant uniquement les extensions jouables par le player ?
+
+]<BOUCLE_audio(DOCUMENTS types_documents) {media=audio} {id_document=#ENV{id,#ENV{id_document}}} {inclus=embed} {tout}>
 #SET{largeur,#ENV{largeur, #LARGEUR|?{#LARGEUR,400}}|max{120}}
 #SET{duree,#ENV{duree,#DUREE}}[(#SET{duree,[(#GET{duree}|intval|?{[(#GET{duree}|intval)],''})]})]
-<div	class='spip_document_#ID_DOCUMENT spip_document_audio spip_documents[ spip_documents_(#ENV{align})]'
-	style='[(#ENV{align}|match{^(left|right)$}|oui)float:#ENV{align};][width:(#GET{largeur})px]'>
+<figure class='spip_document_#ID_DOCUMENT spip_documents spip_document_audio[ spip_documents_(#ENV{align})]'[ style='width:(#GET{largeur})px;']>
 	[(#LOGO_DOCUMENT{vignette}|image_reduire{#GET{largeur},0}|vider_attribut{class})]
-<div class="audio-wrapper"[ style='width:(#GET{largeur})px;max-width:100%;']>
-	<audio class="mejs mejs-#ID_DOCUMENT [ mejs-(#ENV{skin})]"
-	       data-id="[(#VAL{mejs-#ID_DOCUMENT}|concat{#ENV{skin}}|md5)]"
-	       src="#FICHIER"
-	       type="#MIME_TYPE"
-		   preload="none"
-	       data-mejsoptions='{"alwaysShowControls": true[,"loop":(#ENV{loop}|?{true,false})],"audioWidth":"100%"[,"audioHeight":"(#ENV{hauteur})"][,"startVolume":"(#ENV{volume})"][,"duration":(#GET{duree})]}'
-	       controls="controls"
-				 [autoplay="autoplay"(#ENV{autoplay}|oui)]></audio>
-</div>
-[<div class='#EDIT{titre} spip_doc_titre'><strong>(#TITRE)</strong></div>]
-[<div class='#EDIT{descriptif} spip_doc_descriptif'>(#DESCRIPTIF|PtoBR)[(#NOTES|PtoBR)]</div>]
+  <div class="audio-wrapper"[ style='width:(#GET{largeur})px;max-width:100%;']>
+  	<audio class="mejs mejs-#ID_DOCUMENT [ mejs-(#ENV{skin})]"
+  	       data-id="[(#VAL{mejs-#ID_DOCUMENT}|concat{#ENV{skin}}|md5)]"
+  	       src="#FICHIER"
+  	       type="#MIME_TYPE"
+  	       preload="none"
+  	       data-mejsoptions='{"alwaysShowControls": true[,"loop":(#ENV{loop}|?{true,false})],"audioWidth":"100%"[,"audioHeight":"(#ENV{hauteur})"][,"startVolume":"(#ENV{volume})"][,"duration":(#GET{duree})]}'
+  	       controls="controls"
+  				 [autoplay="autoplay"(#ENV{autoplay}|oui)]></audio>
+  </div>
+[(#TITRE|trim|sinon{#DESCRIPTIF|trim}|sinon{#CREDITS|trim}|oui)
+  <figcaption class='spip_doc_legende'>
+    [<div class='spip_doc_titre #EDIT{titre}'><strong>(#TITRE|propre|ptobr)</strong></div>]
+    [<div class='spip_doc_descriptif #EDIT{descriptif}'>(#DESCRIPTIF|propre|PtoBR)[(#NOTES|PtoBR)]</div>]
+    [<div class='spip_doc_credits  #EDIT{credits}'>(#CREDITS|propre|PtoBR)</div>]
+  </figcaption>
+]
 [<script>/*<!\[CDATA\[*/var mejspath='[(#CHEMIN{lib/mejs/mediaelement-and-player.min.js}|timestamp)]',mejscss='[(#CHEMIN{lib/mejs/mediaelementplayer.min.css}|timestamp)]';
 (#INCLURE{javascript/mejs-init.min.js})/*\]\]>*/</script>]
 [(#ENV{skin}|oui)[<style>(#INCLURE{#CHEMIN{css/mejs-skin-#ENV{skin}.css}|sinon{#CHEMIN{lib/mejs/mejs-skins.css}}|url_absolue_css})</style>]]
-</div>
-</BOUCLE_tous>
\ No newline at end of file
+</figure>
+</BOUCLE_audio>
+<INCLURE{fond=modeles/file,env} />
+<//B_audio>
diff --git a/modeles/doc.html b/modeles/doc.html
deleted file mode 100644
index 022adb6a..00000000
--- a/modeles/doc.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<BOUCLE_doc (DOCUMENTS) {id_document} {tout}>
-[<!--(#REM)
-
-	Modele pour <doc> en dl/dt/dd
-	cf. http://pompage.net/pompe/listesdefinitions/
-
-	La largeur de la legende est egale a la largeur de l'image
-	avec un minimum de 120px, et un maximum de 350px.
-
-	Dans le cas d'une simple image (mode=image), on affiche
-	le document lui-meme, sans lien de telechargement
--->]
-[(#ENV{mode_force,#MODE}|=={image}|oui)
-	#SET{fichier,#URL_DOCUMENT}
-	#SET{width,#LARGEUR}
-	#SET{height,#HAUTEUR}
-	#SET{url,#ENV{lien}}
-]
-[(#ENV{mode_force,#MODE}|=={image}|non)
-	[(#SET{fichier,[(#LOGO_DOCUMENT|extraire_attribut{src})]})]
-	[(#SET{width,[(#LOGO_DOCUMENT|extraire_attribut{width})]})]
-	[(#SET{height,[(#LOGO_DOCUMENT|extraire_attribut{height})]})]
-	#SET{url,#ENV{lien,#URL_DOCUMENT}}
-][<!--(#REM)
-
-
-	Si largeur ou hauteur fournit en parametre, redimensionner
-
--->][
-(#ENV{largeur,0}|ou{#ENV{hauteur,0}})
-	#SET{fichier,#GET{fichier}|image_reduire{#ENV{largeur,0},#ENV{hauteur,0}}}
-	#SET{width,#GET{fichier}|largeur}
-	#SET{height,#GET{fichier}|hauteur}
-	#SET{fichier,#GET{fichier}|extraire_attribut{src}}
-]
-[(#SET{title,[(#TYPE_DOCUMENT) - [(#TAILLE|taille_en_octets)]]})]
-[(#MEDIA|=={image}|oui) #SET{title,#TITRE|sinon{#GET{title}}]
-<dl class='spip_document_#ID_DOCUMENT spip_documents[ spip_documents_(#ENV{align})][ (#ENV{class})] spip_lien_ok'[
-	style='float:(#ENV{align}|match{left|right});']>
-<dt>[<a href="(#GET{url})"[
-	class="(#ENV{lien_class})"] title='[(#GET{title}|attribut_html)]'[
-	(#ENV{lien}|?{'',type="#MIME_TYPE"})]>]<img src='#GET{fichier}' width='#GET{width}' height='#GET{height}' alt='' />[(#GET{url}|?{</a>})]</dt>[
-<dt class='#EDIT{titre} spip_doc_titre'[ style='width:(#GET{width}|min{350}|max{120})px;']><strong>(#TITRE)</strong></dt>][
-<dd class='#EDIT{descriptif} spip_doc_descriptif'[ style='width:(#GET{width}|min{350}|max{120})px;']>(#DESCRIPTIF|PtoBR)[(#NOTES|PtoBR)]</dd>]
-</dl>
-
-</BOUCLE_doc>
-#FILTRE{trim}
\ No newline at end of file
diff --git a/modeles/doc_legende.html b/modeles/doc_legende.html
deleted file mode 100644
index beb92788..00000000
--- a/modeles/doc_legende.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<BOUCLE_doc (DOCUMENTS) {id_document} {tout}>
-[(#REM)
-
-	Modele pour <doc> en dl/dt/dd
-	cf. http://pompage.net/pompe/listesdefinitions/
-
-	La largeur de la legende est egale a la largeur de l'image
-	avec un minimum de 120px, et un maximum de 350px.
-
-	Dans le cas d'une simple image (mode=image), on affiche
-	le document lui-meme, sans lien de telechargement
-]
-[(#MODE|=={image}|oui)
-	#SET{fichier,#URL_DOCUMENT}
-	#SET{width,#LARGEUR}
-	#SET{height,#HAUTEUR}
-	#SET{url,#ENV{lien}}
-]
-[(#MODE|=={image}|oui)
-	[(#SET{fichier,[(#LOGO_DOCUMENT|extraire_attribut{src})]})]
-	[(#SET{width,[(#LOGO_DOCUMENT|extraire_attribut{width})]})]
-	[(#SET{height,[(#LOGO_DOCUMENT|extraire_attribut{height})]})]
-	#SET{url,#ENV{lien,#URL_DOCUMENT}}
-][(#ENV{largeur,0}|ou{#ENV{hauteur,0}})
-#SET{fichier,#GET{fichier}|image_reduire{#ENV{largeur,0},#ENV{hauteur,0}}}
-#SET{width,#GET{fichier}|largeur}
-#SET{height,#GET{fichier}|hauteur}
-#SET{fichier,#GET{fichier}|extraire_attribut{src}}
-]
-<dl class='spip_document_#ID_DOCUMENT spip_documents_legende[ spip_documents_(#ENV{align})][ (#ENV{class})] spip_lien_ok'[ style='float:(#ENV{align}|match{left|right});']>
-[<dt class='#EDIT{titre} titre'>(#TITRE|sinon{#FICHIER})</dt>]
-<dd class='vignette'>[<a href="(#GET{url})"[ class="(#ENV{lien_class})"] title='#TYPE_DOCUMENT - [(#TAILLE|taille_en_octets|texte_backend)]'[ (#ENV{lien}|?{'',type="#MIME_TYPE"})]>]<img src='#GET{fichier}' width='#GET{width}' height='#GET{height}' alt='' />[(#GET{url}|?{</a>})]</dd>
-<dd class='type'>#TYPE_DOCUMENT</dd>
-<dd class='taille'>[(#LARGEUR|ou{#HAUTEUR}|oui)[
-(#VAL{info_largeur_vignette}|_T{#ARRAY{largeur_vignette,#LARGEUR,hauteur_vignette,#HAUTEUR}})
-] - ][(#TAILLE|taille_en_octets|texte_backend)]</dd>
-</dl>
-</BOUCLE_doc>
diff --git a/modeles/emb_mp4.html b/modeles/emb_mp4.html
deleted file mode 100644
index 97af8c35..00000000
--- a/modeles/emb_mp4.html
+++ /dev/null
@@ -1 +0,0 @@
-<INCLURE{fond=modeles/video,env} />
\ No newline at end of file
diff --git a/modeles/file.html b/modeles/file.html
new file mode 100644
index 00000000..89e44fb7
--- /dev/null
+++ b/modeles/file.html
@@ -0,0 +1,40 @@
+<BOUCLE_file (DOCUMENTS) {id_document=#ENV{id,#ENV{id_document}}} {tout}>
+[(#MEDIA|=={image}|oui)
+	#SET{fichier,#URL_DOCUMENT}
+	#SET{width,#LARGEUR}
+	#SET{height,#HAUTEUR}
+	#SET{url,#ENV{lien}}
+][(#MEDIA|=={image}|non)
+	#SET{image,#LOGO_DOCUMENT}
+	[(#SET{fichier,[(#GET{image}|extraire_attribut{src})]})]
+	[(#SET{width,[(#GET{image}|extraire_attribut{width})]})]
+	[(#SET{height,[(#GET{image}|extraire_attribut{height})]})]
+	#SET{url,#ENV{lien,#URL_DOCUMENT}}
+][<!--(#REM)
+
+
+	Si largeur ou hauteur fournit en parametre, redimensionner
+
+-->][
+(#ENV{largeur,0}|ou{#ENV{hauteur,0}})
+	#SET{fichier,#GET{fichier}|image_reduire{#ENV{largeur,0},#ENV{hauteur,0}}}
+	#SET{width,#GET{fichier}|largeur}
+	#SET{height,#GET{fichier}|hauteur}
+	#SET{fichier,#GET{fichier}|extraire_attribut{src}}
+]
+[(#SET{title,[(#TYPE_DOCUMENT) - [(#TAILLE|taille_en_octets)]]})]
+[(#MEDIA|=={image}|oui) #SET{title,#TITRE|sinon{#GET{title}}]
+<figure class='spip_document_#ID_DOCUMENT spip_documents spip_document_file[ spip_documents_(#ENV{align})][ (#ENV{class})] spip_lien_ok' [ style='width:(#GET{width}|max{120})px;']>
+[<a href="(#GET{url})"[
+	class="(#ENV{lien_class})"] title='[(#GET{title}|attribut_html)]'[
+	(#ENV{lien}|?{'',type="#MIME_TYPE"})]>]<img src='#GET{fichier}' width='#GET{width}' height='#GET{height}' alt='' />[(#GET{url}|?{</a>})]
+[(#TITRE|trim|sinon{#DESCRIPTIF|trim}|sinon{#CREDITS|trim}|oui)
+  <figcaption class='spip_doc_legende'>
+    [<div class='spip_doc_titre #EDIT{titre}'><strong>(#TITRE|propre|ptobr)</strong></div>]
+    [<div class='spip_doc_descriptif #EDIT{descriptif}'>(#DESCRIPTIF|propre|PtoBR)[(#NOTES|PtoBR)]</div>]
+    [<div class='spip_doc_credits  #EDIT{credits}'>(#CREDITS|propre|PtoBR)</div>]
+  </figcaption>
+]
+</figure>
+</BOUCLE_file>
+#FILTRE{trim}
\ No newline at end of file
diff --git a/modeles/emb.html b/modeles/file_emb.html
similarity index 56%
rename from modeles/emb.html
rename to modeles/file_emb.html
index 4fbea470..7f9f7331 100644
--- a/modeles/emb.html
+++ b/modeles/file_emb.html
@@ -1,3 +1,3 @@
-<BOUCLE_ext(DOCUMENTS types_documents) {id_document} {tout}>
+<BOUCLE_ext(DOCUMENTS types_documents) {id_document=#ENV{id,#ENV{id_document}}} {tout}>
 <INCLURE{fond=modeles/#EXTENSION|trouver_modele_emb{#MIME_TYPE}}{id=#ID_DOCUMENT}{env}{emb=' '}/>
 </BOUCLE_ext>
diff --git a/modeles/application.html b/modeles/file_emb_application.html
similarity index 68%
rename from modeles/application.html
rename to modeles/file_emb_application.html
index f1d69638..12fd8440 100644
--- a/modeles/application.html
+++ b/modeles/file_emb_application.html
@@ -1,4 +1,4 @@
-<BOUCLE_tous (DOCUMENTS types_documents) {id_document=#ID} {tout}>[
+<BOUCLE_application(DOCUMENTS types_documents) {id_document=#ENV{id,#ENV{id_document}}} {inclus=embed} {mode?} {tout}>[
 (#REM) on trouvera plusieurs variable de hauteur/largeur
 - les balises #HAUTEUR et #LARGEUR
 - #ENV{hauteur} et {largeur} correspondant <emb|hauteur=xx...>
@@ -10,10 +10,8 @@
  (#ENV{controls}=={PlayButton}|?{#SET{largeur,40},''})][
  (#ENV{controls}=={PositionSlider}|?{#SET{hauteur,25},''})][
  (#ENV{controls}=={PositionSlider}|?{#SET{largeur,#GET{largeur}|moins{40}},''})
-][(#INCLUS|=={embed}|?{[(#ENV{controls,''}|non)
-<div class='spip_document_#ID_DOCUMENT spip_document_application spip_documents[ spip_documents_(#ENV{align})]'[
-style='[(#ENV{align}|match{^(left|right)$}|oui)float:#ENV{align};] (#ENV{align,center}|=={center}|non)[width:(#GET{largeur}|max{120})px]']>
-]})
+][(#ENV{controls,''}|non)
+<figure class='spip_document_#ID_DOCUMENT spip_documents spip_document_application[ spip_documents_(#ENV{align})]'>
 ][(#EXTENSION|=={swf}|oui)
 <object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' 
  codebase='http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=#ENV{version,'6,0,0,0'}' 
@@ -31,17 +29,21 @@ style='[(#ENV{align}|match{^(left|right)$}|oui)float:#ENV{align};] (#ENV{align,c
 </object>
 #SET{done,1}
 ][(#GET{done,0}|non)
-[(#INCLUS|=={embed}|oui)
 <object width='#GET{largeur}' height='#GET{hauteur}'>
 <param name='movie' value='#URL_DOCUMENT' />
 <param name='src' value='#URL_DOCUMENT' />
 [(#ENV*|env_to_params)]
 <embed src='#URL_DOCUMENT' [(#ENV*|env_to_attributs)] width='#GET{largeur}' height='#GET{hauteur}'></embed></object>
-
-][(#INCLUS|=={image}|oui)
-[(#INCLURE{fond=modeles/img}{id_document}{align=#ENV{align}}{embed=oui}{lien=#ENV{lien}}{lien_class=#ENV{lien_class}})]
+][(#ENV{controls,''}|non)
+	[(#TITRE|trim|sinon{#DESCRIPTIF|trim}|sinon{#CREDITS|trim}|oui)
+	  <figcaption class='spip_doc_legende'>
+	    [<div class='spip_doc_titre #EDIT{titre}'><strong>(#TITRE|propre|ptobr)</strong></div>]
+	    [<div class='spip_doc_descriptif #EDIT{descriptif}'>(#DESCRIPTIF|propre|PtoBR)[(#NOTES|PtoBR)]</div>]
+	    [<div class='spip_doc_credits  #EDIT{credits}'>(#CREDITS|propre|PtoBR)</div>]
+	  </figcaption>
+	]
+</figure>
 ]
-][(#INCLUS|=={embed}|oui)[(#ENV{controls,''}|non)
-[<div class='#EDIT{titre} spip_doc_titre'><strong>(#TITRE)</strong></div>][<div class='#EDIT{descriptif} spip_doc_descriptif'>(#DESCRIPTIF|PtoBR)[(#NOTES|PtoBR)]</div>]</div>
-]]
-</BOUCLE_tous>
+</BOUCLE_application>
+<INCLURE{fond=modeles/file,env} />
+<//B_application>
diff --git a/modeles/emb_fonctions.php b/modeles/file_emb_fonctions.php
similarity index 70%
rename from modeles/emb_fonctions.php
rename to modeles/file_emb_fonctions.php
index 98385298..49ab418e 100644
--- a/modeles/emb_fonctions.php
+++ b/modeles/file_emb_fonctions.php
@@ -18,13 +18,13 @@ if (!defined('_ECRIRE_INC_VERSION')) {
  * @return mixed
  */
 function trouver_modele_emb($extension, $mime_type) {
-	if ($extension and trouve_modele($fond = 'emb_' . $extension)) {
+	if ($extension and trouve_modele($fond = 'file_emb_' . $extension)) {
 		return $fond;
 	}
-	$fond = preg_replace(',\W,', '_', $mime_type);
+	$fond = 'file_emb_' . preg_replace(',\W,', '_', $mime_type);
 	if (trouve_modele($fond)) {
 		return $fond;
 	} else {
-		return preg_replace(',\W.*$,', '', $mime_type);
+		return 'file_emb_' . preg_replace(',\W.*$,', '', $mime_type);
 	}
 }
diff --git a/modeles/file_emb_text.html b/modeles/file_emb_text.html
new file mode 100644
index 00000000..11cfc1b2
--- /dev/null
+++ b/modeles/file_emb_text.html
@@ -0,0 +1,12 @@
+<BOUCLE_text (DOCUMENTS types_documents) {id_document=#ENV{id,#ENV{id_document}}} {tout}
+	>[<figure class='spip_document_#ID_DOCUMENT spip_documents spip_document_text[ spip_documents_(#ENV{align})]'
+><pre>(#FICHIER|contenu_document{#ENV{charset,auto}}|echapper_tags)</pre>
+[(#TITRE|trim|sinon{#DESCRIPTIF|trim}|sinon{#CREDITS|trim}|oui)
+  <figcaption class='spip_doc_legende'>
+    [<div class='spip_doc_titre #EDIT{titre}'><strong>(#TITRE|propre|ptobr)</strong></div>]
+    [<div class='spip_doc_descriptif #EDIT{descriptif}'>(#DESCRIPTIF|propre|PtoBR)[(#NOTES|PtoBR)]</div>]
+    [<div class='spip_doc_credits  #EDIT{credits}'>(#CREDITS|propre|PtoBR)</div>]
+  </figcaption>
+]
+</figure>
+]</BOUCLE_text>
diff --git a/modeles/file_emb_text_csv.html b/modeles/file_emb_text_csv.html
new file mode 100644
index 00000000..f5b96e31
--- /dev/null
+++ b/modeles/file_emb_text_csv.html
@@ -0,0 +1,11 @@
+<BOUCLE_tous (DOCUMENTS types_documents) {id_document=#ID} {tout}
+	><figure class='spip_document_#ID_DOCUMENT spip_documents spip_document_text[ spip_documents_(#ENV{align})]'>
+[(#FICHIER|contenu_document{#ENV{charset,auto}}|appliquer_filtre{#MIME_TYPE})]
+[(#TITRE|trim|sinon{#DESCRIPTIF|trim}|sinon{#CREDITS|trim}|oui)
+  <figcaption class='spip_doc_legende'>
+    [<div class='spip_doc_titre #EDIT{titre}'><strong>(#TITRE|propre|ptobr)</strong></div>]
+    [<div class='spip_doc_descriptif #EDIT{descriptif}'>(#DESCRIPTIF|propre|PtoBR)[(#NOTES|PtoBR)]</div>]
+    [<div class='spip_doc_credits  #EDIT{credits}'>(#CREDITS|propre|PtoBR)</div>]
+  </figcaption>
+]</figure>
+</BOUCLE_tous>
diff --git a/modeles/file_emb_text_html.html b/modeles/file_emb_text_html.html
new file mode 100644
index 00000000..1b9d5256
--- /dev/null
+++ b/modeles/file_emb_text_html.html
@@ -0,0 +1,12 @@
+<BOUCLE_texthtml (DOCUMENTS types_documents) {id_document=#ID} {tout}
+	>[<figure class='spip_document_#ID_DOCUMENT spip_documents spip_document_text_html[ spip_documents_(#ENV{align})]'
+><object data="(#URL_DOCUMENT)" width="100%" height="400"><a href="#URL_DOCUMENT">#FICHIER</a></object>
+[(#TITRE|trim|sinon{#DESCRIPTIF|trim}|sinon{#CREDITS|trim}|oui)
+  <figcaption class='spip_doc_legende'>
+    [<div class='spip_doc_titre #EDIT{titre}'><strong>(#TITRE|propre|ptobr)</strong></div>]
+    [<div class='spip_doc_descriptif #EDIT{descriptif}'>(#DESCRIPTIF|propre|PtoBR)[(#NOTES|PtoBR)]</div>]
+    [<div class='spip_doc_credits  #EDIT{credits}'>(#CREDITS|propre|PtoBR)</div>]
+  </figcaption>
+]
+</figure>
+]</BOUCLE_texthtml>
diff --git a/modeles/image.html b/modeles/image.html
index 5ced491d..438f0ca8 100644
--- a/modeles/image.html
+++ b/modeles/image.html
@@ -1,49 +1,28 @@
-<BOUCLE_tous (DOCUMENTS types_documents) {id_document=#ID} {tout}>[
+[(#REM)
 
-(#REM) Cas <imageXX>	: equivalent a <imgXX> pour une image en mode image
+	Modele pour les images
 
-][(#INCLUS|=={image}|et{#ENV{emb,''}|non}|oui)
-<span class='spip_document_#ID_DOCUMENT spip_documents[ spip_documents_(#ENV{align})][ (#ENV{class})] spip_lien_ok'[
-	 style='float:(#ENV{align}|match{left|right});']>[
-	<a href="(#ENV{lien})"[
-		class="(#ENV{lien_class})"]>]<img src='#URL_DOCUMENT'[
-		width="(#LARGEUR|?{#LARGEUR})"][
-		height="(#HAUTEUR|?{#HAUTEUR})"][
-		title="(#TITRE|attribut_html)"]
-		alt="[(#TITRE|attribut_html)]" />[(#ENV{lien}|?{</a>})]</span>
-][
-
-(#REM) Cas <embXX> : on est appele ici avec emb=' ' : on veut la legende
-equivalent a un <docXX> pour une image en mode image
-
-][(#INCLUS|=={image}|et{#ENV{emb,''}|oui}|oui)
-#SET{fichier,#URL_DOCUMENT}
-#SET{width,#LARGEUR}
-#SET{height,#HAUTEUR}
-#SET{url,#ENV{lien}}
-<dl class='spip_document_#ID_DOCUMENT spip_documents[ spip_documents_(#ENV{align})][ (#ENV{class})] spip_lien_ok'[
-			style='float:(#ENV{align}|match{left|right});[width:(#GET{width}|max{120})]px;']>
-<dt>[<a href="(#GET{url})"[ class="(#ENV{lien_class})"] title='#TYPE_DOCUMENT - [(#TAILLE|taille_en_octets|texte_backend)]'[ type="(#ENV{lien}|?{#ENV{lien_mime},#MIME_TYPE})"]>]<img src='#GET{fichier}' width='#GET{width}' height='#GET{height}' alt='' />[(#GET{url}|?{</a>})]</dt>[
-<dt class='#EDIT{titre} spip_doc_titre'[ style='width:(#GET{width}|min{350}|max{120})px;']><strong>(#TITRE)</strong></dt>][
-<dd class='#EDIT{descriptif} spip_doc_descriptif'[ style='width:(#GET{width}|min{350}|max{120})px;']>(#DESCRIPTIF|PtoBR)[(#NOTES|PtoBR)]</dd>]
-</dl>
-][
-
-(#REM) Cas des images qu'il faut embed (svg)
-][
-(#INCLUS|=={embed}|oui)
-<div class='spip_document_#ID_DOCUMENT spip_documents[ spip_documents_(#ENV{align})]'[
-style='[(#ENV{align}|match{^(left|right)$}|?{' '})float:#ENV{align};] (#ENV{align,center}|=={center}|?{'',' '})']>
-<object	data='#URL_DOCUMENT' 
-	type='#MIME_TYPE'[
-	width='(#ENV{largeur}?{'', #LARGEUR})'][
-	height='(#ENV{hauteur}?{'', #HAUTEUR})']
-	[(#ENV*|env_to_attributs)] >
-	<param name='src' value='#URL_DOCUMENT' />
-	[(#ID_DOCUMENT|appliquer_filtre{#MIME_TYPE})]
-</object>[
-<div class='#EDIT{titre} spip_doc_titre'><strong>(#TITRE)</strong></div>
-][
-<div class='#EDIT{descriptif} spip_doc_descriptif'>(#DESCRIPTIF|PtoBR)[(#NOTES|PtoBR)]</div>
-]</div>]
-</BOUCLE_tous>
+]
+<BOUCLE_image (DOCUMENTS) {media=image} {id_document=#ENV{id,#ENV{id_document}}} {inclus=image} {mode?} {tout}>
+[(#SET{autolien,#LARGEUR|>={800}|ou{#HAUTEUR|>={800}}|oui})]
+[(#SET{image,[(#ENV{largeur}|ou{#ENV{hauteur}}|?{
+		[(#FICHIER|image_reduire{#ENV{largeur,10000},#ENV{hauteur,10000}})],
+		[<img src='(#URL_DOCUMENT)'[ width="(#LARGEUR)"][ height="(#HAUTEUR)"]/>]})]})]
+[(#TITRE|oui)#SET{image,#GET{image}|inserer_attribut{alt,#TITRE}|inserer_attribut{title,#TITRE}}]
+#SET{largeur,#GET{image}|largeur}
+<figure class='spip_document_#ID_DOCUMENT spip_documents spip_document_image[ spip_documents_(#ENV{align}|sinon{center})][ (#ENV{class})] spip_lien_ok' [ style='width:(#GET{largeur})px;']>
+[<a href="(#ENV{lien})"[ class="(#ENV{lien_class})"]>]
+[(#ENV{lien}|non|et{#GET{autolien}})<a href="#URL_DOCUMENT" class="mediabox" type="#MIME_TYPE">]
+		#GET{image}
+[(#ENV{lien}|ou{#GET{autolien}}|?{</a>})]
+[(#TITRE|trim|sinon{#DESCRIPTIF|trim}|sinon{#CREDITS|trim}|oui)
+<figcaption class='spip_doc_legende'>
+	[<div class='spip_doc_titre #EDIT{titre}'><strong>(#TITRE|propre|ptobr)</strong></div>]
+	[<div class='spip_doc_descriptif #EDIT{descriptif}'>(#DESCRIPTIF|propre|PtoBR)[(#NOTES|PtoBR)]</div>]
+	[<div class='spip_doc_credits  #EDIT{credits}'>(#CREDITS|propre|PtoBR)</div>]
+</figcaption>
+]
+</figure>
+</BOUCLE_image>
+<INCLURE{fond=modeles/file,env} />
+<//B_image>
diff --git a/modeles/img.html b/modeles/img.html
deleted file mode 100644
index 0ef76e60..00000000
--- a/modeles/img.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<BOUCLE_document (DOCUMENTS) {id_document} {mode?} {tout}>
-[(#REM)
-
-	Modele pour <img>
-
-	Si on est en mode "image" ou "vignette", ou appele avec embed=oui,
-	on affiche l'image complete ; sinon le logo
-
-	Si un lien est passe #ENV{lien} on ajoute le a href
-	ou on truque le #URL_DOCUMENT
-	
-	Si une code de langue est passe #ENV{langue} ex: <img12|langue=en>
-	on ajoute l'attribut lang la balise img et eventuellement sur la balise a
-	
-	Dans le cas mode "image ou vignette", le contenu de l'attribut 
-	alt et title se construit selon le schema suivant : 
-	- prend la valeur de alt passe en environnement par le biais 
-	d'un parametre sur la balise ex: <img12|alt=xxx>
-	- sinon on prend le titre
-	- sinon si #ENV{lien} est passe on prend #ENV{lien} ou Document si lien vers #URL_DOCUMENT
-	- sinon alt vide
-	
-	Dans le cas mode "document", le contenu de l'attribut 
-	alt et title se construit selon le meme schema a ceci pres
-	qu'on ajoute #TYPE_DOCUMENT - #TAILLE
-	sauf si #ENV{lien} est passe	
-
-]
-[(#SET{
-	image,
-		#ENV{mode_force,#MODE}|match{'image|vignette'}
-		|sinon{#ENV{embed}}
-		|oui
-})][
-
-	(#REM) image complete ?
-
-][(#GET{image})
-<span class='spip_document_#ID_DOCUMENT spip_documents[ spip_documents_(#ENV{align})][ (#ENV{class})] spip_lien_ok'[
- style='float:(#ENV{align}|match{left|right});']>
-[<a href="(#ENV{lien})"[ class="(#ENV{lien_class})"]>]<img src='#URL_DOCUMENT'[ width="(#LARGEUR)"][ height="(#HAUTEUR)"] alt="[(#TITRE|texte_backend)]"[ title="(#TITRE|texte_backend)"] />[(#ENV{lien}|?{</a>})]</span>
-][
-
-	(#REM) sinon logo document + lien + alt + title etc
-
-][(#GET{image}|non)
-	[(#SET{fichier,[(#LOGO_DOCUMENT|extraire_attribut{src})]})]
-	[(#SET{width,[(#LOGO_DOCUMENT|extraire_attribut{width})]})]
-	[(#SET{height,[(#LOGO_DOCUMENT|extraire_attribut{height})]})]
-<span class='spip_document_#ID_DOCUMENT spip_documents[ spip_documents_(#ENV{align})][ (#ENV{class})] spip_lien_ok'[
- style='float:(#ENV{align}|match{left|right});[ width:(#GET{width})px;]']><a href="[(#ENV{lien}|sinon{#URL_DOCUMENT})]"[
- (#ENV{lien}|?{'',type="#MIME_TYPE"})][ title="(#TITRE|texte_backend)"]><img src='#GET{fichier}' width='#GET{width}' height='#GET{height}' alt='[(#TITRE|strlen|?{#TITRE {#TYPE_DOCUMENT},#TYPE_DOCUMENT}|attribut_html)]' /></a></span>
-]</BOUCLE_document>
diff --git a/modeles/text.html b/modeles/text.html
deleted file mode 100644
index d8d3ffcc..00000000
--- a/modeles/text.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<BOUCLE_tous (DOCUMENTS types_documents) {id_document=#ID} {tout}
-	>[<div class='spip_document_#ID_DOCUMENT spip_documents[ spip_documents_(#ENV{align})]'
-><pre>(#FICHIER|contenu_document{#ENV{charset,auto}}|echapper_tags)</pre>
-[<div class='#EDIT{titre} spip_doc_titre'><strong>(#TITRE)</strong></div>][<div class='#EDIT{descriptif} spip_doc_descriptif'>(#DESCRIPTIF|PtoBR)[(#NOTES|PtoBR)]</div>]
-</div>
-]</BOUCLE_tous>
diff --git a/modeles/text_csv.html b/modeles/text_csv.html
deleted file mode 100644
index 8cd7d95b..00000000
--- a/modeles/text_csv.html
+++ /dev/null
@@ -1,3 +0,0 @@
-<BOUCLE_tous (DOCUMENTS types_documents) {id_document=#ID} {tout}
-	>[(#FICHIER|contenu_document{#ENV{charset,auto}}|appliquer_filtre{#MIME_TYPE}
-)]</BOUCLE_tous>
diff --git a/modeles/text_html.html b/modeles/text_html.html
deleted file mode 100644
index 4e877439..00000000
--- a/modeles/text_html.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<BOUCLE_tous (DOCUMENTS types_documents) {id_document=#ID} {tout}
-	>[<div class='spip_document_#ID_DOCUMENT spip_documents[ spip_documents_(#ENV{align})]'
-><object data="(#URL_DOCUMENT)" width="100%" height="400"><a href="#URL_DOCUMENT">#FICHIER</a></object>
-[<div class='#EDIT{titre} spip_doc_titre'><strong>(#TITRE)</strong></div>][<div class='#EDIT{descriptif} spip_doc_descriptif'>(#DESCRIPTIF|PtoBR)[(#NOTES|PtoBR)]</div>]
-</div>
-]</BOUCLE_tous>
diff --git a/modeles/video.html b/modeles/video.html
index 3ca25e9e..aac36556 100644
--- a/modeles/video.html
+++ b/modeles/video.html
@@ -1,4 +1,4 @@
-<BOUCLE_tous(DOCUMENTS types_documents) {id_document=#ID} {tout}>[
+<BOUCLE_video(DOCUMENTS types_documents) {media=video} {id_document=#ENV{id,#ENV{id_document}}} {inclus=embed} {tout}>[
 (#REM) on trouvera plusieurs variable de hauteur/largeur
 - les balises #HAUTEUR et #LARGEUR
 - #ENV{hauteur} et {largeur} correspondant <emb|hauteur=xx...>
@@ -8,9 +8,8 @@
 #SET{largeur,#ENV{largeur, #LARGEUR|?{#LARGEUR,480}}|max{120}}
 #SET{hauteur,#ENV{hauteur, #HAUTEUR|?{#HAUTEUR,300}}|max{75}}
 #SET{duree,#ENV{duree,#DUREE}}[(#SET{duree,[(#GET{duree}|intval|?{[(#GET{duree}|intval)],''})]})]
-<div class='spip_document_#ID_DOCUMENT spip_document_video spip_documents[ spip_documents_(#ENV{align})]'
-	style='[(#ENV{align}|match{^(left|right)$}|oui)float:#ENV{align};][width:(#GET{largeur})px]'>
-<div class="video-intrinsic-wrapper" style='height:0;width:100%;padding-bottom:[(#GET{hauteur}|div{#GET{largeur}}|mult{100}|round{2})]%;position:relative;'>
+<figure class='spip_document_#ID_DOCUMENT spip_documents spip_document_video[ spip_documents_(#ENV{align})]'[ style='width:(#GET{largeur})px;']>
+<div class="video-intrinsic-wrapper" style='height:0;width:#GET{largeur}px;max-width:100%;padding-bottom:[(#GET{hauteur}|div{#GET{largeur}}|mult{100}|round{2})]%;position:relative;'>
 	<div class="video-wrapper" style="position: absolute;top:0;left:0;width:100%;height:100%;">
 		<video class="mejs mejs-#ID_DOCUMENT[ mejs-(#ENV{skin})]"
 				data-id="[(#VAL{mejs-#ID_DOCUMENT}|concat{#ENV{skin}}|md5)]"
@@ -39,10 +38,16 @@
 		</video>
 	</div>
 </div>
-[<div class='#EDIT{titre} spip_doc_titre'><strong>(#TITRE)</strong></div>]
-[<div class='#EDIT{descriptif} spip_doc_descriptif'>(#DESCRIPTIF|PtoBR)[(#NOTES|PtoBR)]</div>]
-[<script>/*<!\[CDATA\[*/var mejspath='[(#CHEMIN{lib/mejs/mediaelement-and-player.min.js}|timestamp)]',mejscss='[(#CHEMIN{lib/mejs/mediaelementplayer.min.css}|timestamp)]';
+[(#TITRE|trim|sinon{#DESCRIPTIF|trim}|sinon{#CREDITS|trim}|oui)
+  <figcaption class='spip_doc_legende'>
+    [<div class='spip_doc_titre #EDIT{titre}'><strong>(#TITRE|propre|ptobr)</strong></div>]
+    [<div class='spip_doc_descriptif #EDIT{descriptif}'>(#DESCRIPTIF|propre|PtoBR)[(#NOTES|PtoBR)]</div>]
+    [<div class='spip_doc_credits  #EDIT{credits}'>(#CREDITS|propre|PtoBR)</div>]
+  </figcaption>
+][<script>/*<!\[CDATA\[*/var mejspath='[(#CHEMIN{lib/mejs/mediaelement-and-player.min.js}|timestamp)]',mejscss='[(#CHEMIN{lib/mejs/mediaelementplayer.min.css}|timestamp)]';
 (#INCLURE{javascript/mejs-init.min.js})/*\]\]>*/</script>]
 [(#ENV{skin}|oui)[<style>(#INCLURE{#CHEMIN{css/mejs-skin-#ENV{skin}.css}|url_absolue_css})</style>]]
-</div>
-</BOUCLE_tous>
\ No newline at end of file
+</figure>
+</BOUCLE_video>
+<INCLURE{fond=modeles/file,env} />
+<//B_video>
-- 
GitLab