You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

545 lines
15 KiB

7 years ago
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>
3 years ago
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>
3 years ago
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>
3 years ago
7 years ago
7 years ago
7 years ago
7 years ago
#4506 : on revoit le markup des modeles document pour supprimer le max-width en dur (!16) #4506 : on revoit le markup des modeles document pour supprimer le `max-width` en dur - on ajoute un div conteneur qui porte les classes `spip_document*` - le `<figure>` porte une classe `spip_doc_inner` - les classes au pluriel `spip_documents_*` sont doublees d'un renommage au singulier `spip_document_*` comme cela a été fait pour `spip_logo` - on supprime le `max-width` en dur Avec ça les modèles doc tombent a peu près bien par défaut sur un squelette stylé pour les anciens modèles doc, sauf audio et video dont le player ne se centre pas et quelques petits cas limites - il suffit d'**ajouter** les règles CSS suivantes pour adapter un squelette aux nouveaux modèles : ``` .spip_document { display: flex; justify-content: center;align-items: center} .spip_doc_inner{ margin:0 auto;text-align: center;max-width: 100%;} .spip_doc_inner>* {margin-left: auto;margin-right: auto;} .spip_document .spip_doc_lien { display: inline-block; } .spip_doc_legende { display: block; max-width: 25em; } ``` On note que ces règles ne ciblent que des classes présentes sur les nouveaux modèles, et peuvent donc être ajoutées à tout squelette sans casser l'affichage sur les versions précédentes de SPIP, ou avec le plugin de compatibilité qui rétablit les anciens modèles. Co-authored-by: Cerdic <cedric@yterium.com> Reviewed-on: https://git.spip.net/spip/medias/pulls/16 Co-Authored-By: cerdic <cedric@yterium.com> Co-Committed-By: cerdic <cedric@yterium.com>
10 months ago
#4506 : on revoit le markup des modeles document pour supprimer le max-width en dur (!16) #4506 : on revoit le markup des modeles document pour supprimer le `max-width` en dur - on ajoute un div conteneur qui porte les classes `spip_document*` - le `<figure>` porte une classe `spip_doc_inner` - les classes au pluriel `spip_documents_*` sont doublees d'un renommage au singulier `spip_document_*` comme cela a été fait pour `spip_logo` - on supprime le `max-width` en dur Avec ça les modèles doc tombent a peu près bien par défaut sur un squelette stylé pour les anciens modèles doc, sauf audio et video dont le player ne se centre pas et quelques petits cas limites - il suffit d'**ajouter** les règles CSS suivantes pour adapter un squelette aux nouveaux modèles : ``` .spip_document { display: flex; justify-content: center;align-items: center} .spip_doc_inner{ margin:0 auto;text-align: center;max-width: 100%;} .spip_doc_inner>* {margin-left: auto;margin-right: auto;} .spip_document .spip_doc_lien { display: inline-block; } .spip_doc_legende { display: block; max-width: 25em; } ``` On note que ces règles ne ciblent que des classes présentes sur les nouveaux modèles, et peuvent donc être ajoutées à tout squelette sans casser l'affichage sur les versions précédentes de SPIP, ou avec le plugin de compatibilité qui rétablit les anciens modèles. Co-authored-by: Cerdic <cedric@yterium.com> Reviewed-on: https://git.spip.net/spip/medias/pulls/16 Co-Authored-By: cerdic <cedric@yterium.com> Co-Committed-By: cerdic <cedric@yterium.com>
10 months ago
#4506 : on revoit le markup des modeles document pour supprimer le max-width en dur (!16) #4506 : on revoit le markup des modeles document pour supprimer le `max-width` en dur - on ajoute un div conteneur qui porte les classes `spip_document*` - le `<figure>` porte une classe `spip_doc_inner` - les classes au pluriel `spip_documents_*` sont doublees d'un renommage au singulier `spip_document_*` comme cela a été fait pour `spip_logo` - on supprime le `max-width` en dur Avec ça les modèles doc tombent a peu près bien par défaut sur un squelette stylé pour les anciens modèles doc, sauf audio et video dont le player ne se centre pas et quelques petits cas limites - il suffit d'**ajouter** les règles CSS suivantes pour adapter un squelette aux nouveaux modèles : ``` .spip_document { display: flex; justify-content: center;align-items: center} .spip_doc_inner{ margin:0 auto;text-align: center;max-width: 100%;} .spip_doc_inner>* {margin-left: auto;margin-right: auto;} .spip_document .spip_doc_lien { display: inline-block; } .spip_doc_legende { display: block; max-width: 25em; } ``` On note que ces règles ne ciblent que des classes présentes sur les nouveaux modèles, et peuvent donc être ajoutées à tout squelette sans casser l'affichage sur les versions précédentes de SPIP, ou avec le plugin de compatibilité qui rétablit les anciens modèles. Co-authored-by: Cerdic <cedric@yterium.com> Reviewed-on: https://git.spip.net/spip/medias/pulls/16 Co-Authored-By: cerdic <cedric@yterium.com> Co-Committed-By: cerdic <cedric@yterium.com>
10 months ago
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Système de publication pour l'internet *
  4. * *
  5. * Copyright © avec tendresse depuis 2001 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribué sous licence GNU/GPL. *
  9. * Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. /**
  12. * Fonctions utiles pour les squelettes et déclarations de boucle
  13. * pour le compilateur
  14. *
  15. * @package SPIP\Medias\Fonctions
  16. **/
  17. // sécurité
  18. if (!defined('_ECRIRE_INC_VERSION')) {
  19. return;
  20. }
  21. // nettoyer les zip abandonnes par l'utilisateur
  22. if (
  23. isset($GLOBALS['visiteur_session']['zip_to_clean'])
  24. and test_espace_prive()
  25. and isset($_SERVER['REQUEST_METHOD'])
  26. and $_SERVER['REQUEST_METHOD'] !== 'POST'
  27. ) {
  28. $zip_to_clean = unserialize($GLOBALS['visiteur_session']['zip_to_clean']);
  29. if ($zip_to_clean) {
  30. foreach ($zip_to_clean as $zip) {
  31. if (@file_exists($zip)) {
  32. @unlink($zip);
  33. }
  34. }
  35. }
  36. session_set('zip_to_clean');
  37. }
  38. // capturer un formulaire POST plus grand que post_max_size
  39. // on genere un minipres car on ne peut rien faire de mieux
  40. if (
  41. isset($_SERVER['REQUEST_METHOD'])
  42. and $_SERVER['REQUEST_METHOD'] == 'POST'
  43. and empty($_POST)
  44. and isset($_SERVER['CONTENT_TYPE'])
  45. and strlen($_SERVER['CONTENT_TYPE']) > 0
  46. and strncmp($_SERVER['CONTENT_TYPE'], 'multipart/form-data', 19) == 0
  47. and $_SERVER['CONTENT_LENGTH'] > medias_inigetoctets('post_max_size')
  48. ) {
  49. include_spip('inc/minipres');
  50. echo minipres(_T('medias:upload_limit', ['max' => ini_get('post_max_size')]));
  51. exit;
  52. }
  53. /**
  54. * Styliser le modele media : reroute les <img> <doc> <emb> vers <image>, <audio>, <video>, <file> selon le media du document
  55. * si le document n'est pas trouve c'est <file> qui s'applique
  56. * @param $modele
  57. * @param $id
  58. * @return string
  59. */
  60. function medias_modeles_styliser($modele, $id) {
  61. if (defined('_COMPORTEMENT_HISTORIQUE_IMG_DOC_EMB') and _COMPORTEMENT_HISTORIQUE_IMG_DOC_EMB) {
  62. return $modele;
  63. }
  64. switch ($modele) {
  65. case 'img':
  66. case 'doc':
  67. case 'emb':
  68. $m = 'file';
  69. if ($doc = sql_fetsel('id_document,media', 'spip_documents', 'id_document=' . intval($id))) {
  70. $m = $doc['media']; // image, audio, video, file
  71. }
  72. if (trouve_modele("{$m}_{$modele}")) {
  73. // on peut decliner file_emb qui sera utilisable soit par <docXX|emb> soit par <embXX>
  74. // permet d'embed explicitement des fichiers exotiques qui sinon seraient de simples liens a telecharger
  75. // tels que text/csv, text/html, text
  76. $m = "{$m}_{$modele}";
  77. }
  78. $modele = $m;
  79. break;
  80. }
  81. return $modele;
  82. }
  83. /**
  84. * Retourne la taille en octet d'une valeur de configuration php
  85. *
  86. * @param string $var
  87. * Clé de configuration ; valeur récupérée par `ini_get()`. Exemple `post_max_size`
  88. * @return int|string
  89. * Taille en octet, sinon chaine vide.
  90. **/
  91. function medias_inigetoctets($var) {
  92. $last = '';
  93. $val = trim(@ini_get($var));
  94. if (is_numeric($val)) {
  95. return $val;
  96. }
  97. // en octet si "32M"
  98. if ($val != '') {
  99. $last = strtolower($val[strlen($val) - 1]);
  100. $val = substr($val, 0, -1);
  101. }
  102. switch ($last) { // The 'G' modifier is available since PHP 5.1.0
  103. case 'g':
  104. $val *= 1024 * 1024 * 1024;
  105. break;
  106. case 'm':
  107. $val *= 1024 * 1024;
  108. break;
  109. case 'k':
  110. $val *= 1024;
  111. break;
  112. }
  113. return $val;
  114. }
  115. /**
  116. * Afficher la puce de statut pour les documents
  117. *
  118. * @param int $id_document
  119. * Identifiant du document
  120. * @param string $statut
  121. * Statut du document
  122. * @return string
  123. * Code HTML de l'image de puce
  124. */
  125. function medias_puce_statut_document($id_document, $statut) {
  126. if ($statut == 'publie') {
  127. $puce = 'puce-verte.gif';
  128. } else {
  129. if ($statut == 'prepa') {
  130. $puce = 'puce-blanche.gif';
  131. } else {
  132. if ($statut == 'poubelle') {
  133. $puce = 'puce-poubelle.gif';
  134. } else {
  135. $puce = 'puce-blanche.gif';
  136. }
  137. }
  138. }
  139. return http_img_pack($puce, $statut, "class='puce'");
  140. }
  141. /**
  142. * Compile la boucle `DOCUMENTS` qui retourne une liste de documents multimédia
  143. *
  144. * `<BOUCLE(DOCUMENTS)>`
  145. *
  146. * @param string $id_boucle
  147. * Identifiant de la boucle
  148. * @param array $boucles
  149. * AST du squelette
  150. * @return string
  151. * Code PHP compilé de la boucle
  152. **/
  153. function boucle_DOCUMENTS($id_boucle, &$boucles) {
  154. $boucle = &$boucles[$id_boucle];
  155. $id_table = $boucle->id_table;
  156. // on ne veut pas des fichiers de taille nulle,
  157. // sauf s'ils sont distants (taille inconnue)
  158. array_unshift($boucle->where, ["'($id_table.taille > 0 OR $id_table.distant=\\'oui\\')'"]);
  159. /**
  160. * N'afficher que les modes de documents que l'on accepte
  161. * Utiliser le "pipeline medias_documents_visibles" pour en ajouter
  162. */
  163. if (
  164. !isset($boucle->modificateur['criteres']['mode'])
  165. and !isset($boucle->modificateur['tout'])
  166. ) {
  167. $modes = pipeline('medias_documents_visibles', ['image', 'document']);
  168. $f = sql_serveur('quote', $boucle->sql_serveur, true);
  169. $modes = addslashes(join(',', array_map($f, array_unique($modes))));
  170. array_unshift($boucle->where, ["'IN'", "'$id_table.mode'", "'($modes)'"]);
  171. }
  172. return calculer_boucle($id_boucle, $boucles);
  173. }
  174. /**
  175. * critere {orphelins} selectionne les documents sans liens avec un objet editorial
  176. *
  177. * @param string $idb
  178. * @param object $boucles
  179. * @param object $crit
  180. */
  181. function critere_DOCUMENTS_orphelins_dist($idb, &$boucles, $crit) {
  182. $boucle = &$boucles[$idb];
  183. $cond = $crit->cond;
  184. $not = $crit->not ? '' : 'NOT';
  185. $select = sql_get_select('DISTINCT id_document', 'spip_documents_liens as oooo');
  186. $where = "'" . $boucle->id_table . ".id_document $not IN ($select)'";
  187. if ($cond) {
  188. $_quoi = '@$Pile[0]["orphelins"]';
  189. $where = "($_quoi)?$where:''";
  190. }
  191. $boucle->where[] = $where;
  192. }
  193. /**
  194. * critere {portrait} qui selectionne
  195. * - les documents dont les dimensions sont connues
  196. * - les documents dont la hauteur est superieure a la largeur
  197. *
  198. * {!portrait} exclus ces documents
  199. *
  200. * @param string $idb
  201. * @param object $boucles
  202. * @param object $crit
  203. */
  204. function critere_DOCUMENTS_portrait_dist($idb, &$boucles, $crit) {
  205. $boucle = &$boucles[$idb];
  206. $table = $boucle->id_table;
  207. $not = ($crit->not ? 'NOT ' : '');
  208. $boucle->where[] = "'$not($table.largeur>0 AND $table.hauteur > $table.largeur)'";
  209. }
  210. /**
  211. * critere {paysage} qui selectionne
  212. * - les documents dont les dimensions sont connues
  213. * - les documents dont la hauteur est inferieure a la largeur
  214. *
  215. * {!paysage} exclus ces documents
  216. *
  217. * @param string $idb
  218. * @param object $boucles
  219. * @param object $crit
  220. */
  221. function critere_DOCUMENTS_paysage_dist($idb, &$boucles, $crit) {
  222. $boucle = &$boucles[$idb];
  223. $table = $boucle->id_table;
  224. $not = ($crit->not ? 'NOT ' : '');
  225. $boucle->where[] = "'$not($table.largeur>0 AND $table.largeur > $table.hauteur)'";
  226. }
  227. /**
  228. * critere {carre} qui selectionne
  229. * - les documents dont les dimensions sont connues
  230. * - les documents dont la hauteur est egale a la largeur
  231. *
  232. * {!carre} exclus ces documents
  233. *
  234. * @param string $idb
  235. * @param object $boucles
  236. * @param object $crit
  237. */
  238. function critere_DOCUMENTS_carre_dist($idb, &$boucles, $crit) {
  239. $boucle = &$boucles[$idb];
  240. $table = $boucle->id_table;
  241. $not = ($crit->not ? 'NOT ' : '');
  242. $boucle->where[] = "'$not($table.largeur>0 AND $table.largeur = $table.hauteur)'";
  243. }
  244. /**
  245. * Calcule la vignette d'une extension (l'image du type de fichier)
  246. *
  247. * Utile dans une boucle DOCUMENTS pour afficher une vignette du type
  248. * du document (balise `#EXTENSION`) alors que ce document a déjà une vignette
  249. * personnalisée (affichable par `#LOGO_DOCUMENT`).
  250. *
  251. * @example
  252. * `[(#EXTENSION|vignette)]` produit une balise `<img ... />`
  253. * `[(#EXTENSION|vignette{true})]` retourne le chemin de l'image
  254. *
  255. * @param string $extension
  256. * L'extension du fichier, exemple : png ou pdf
  257. * @param bool $get_chemin
  258. * false pour obtenir une balise img de l'image,
  259. * true pour obtenir seulement le chemin du fichier
  260. * @return string
  261. * Balise HTML <img...> ou chemin du fichier
  262. **/
  263. function filtre_vignette_dist($extension = 'defaut', $get_chemin = false) {
  264. static $vignette = false;
  265. static $balise_img = false;
  266. if (!$vignette) {
  267. $vignette = charger_fonction('vignette', 'inc');
  268. $balise_img = charger_filtre('balise_img');
  269. }
  270. $fichier = $vignette($extension, false);
  271. // retourne simplement le chemin du fichier
  272. if ($get_chemin) {
  273. return $fichier;
  274. }
  275. // retourne une balise <img ... />
  276. return $balise_img($fichier);
  277. }
  278. /**
  279. * Determiner les methodes upload en fonction du env de inc-upload_document
  280. *
  281. * @param string|array $env
  282. * @return array
  283. */
  284. function medias_lister_methodes_upload($env) {
  285. if (is_string($env)) {
  286. $env = unserialize($env);
  287. }
  288. $methodes = [];
  289. // méthodes d'upload disponibles
  290. $methodes = [];
  291. $methodes['upload'] = ['label_lien' => _T('medias:bouton_download_local'),'label_bouton' => _T('bouton_upload')];
  292. if ((isset($env['mediatheque']) and $env['mediatheque'])) {
  293. $methodes['mediatheque'] = ['label_lien' => _T('medias:bouton_download_par_mediatheque'),'label_bouton' => _T('medias:bouton_attacher_document')];
  294. }
  295. if ((isset($env['proposer_ftp']) and $env['proposer_ftp'])) {
  296. $methodes['ftp'] = ['label_lien' => _T('medias:bouton_download_par_ftp'),'label_bouton' => _T('bouton_choisir')];
  297. }
  298. $methodes['distant'] = ['label_lien' => _T('medias:bouton_download_sur_le_web'),'label_bouton' => _T('bouton_choisir')];
  299. // pipeline pour les méthodes d'upload
  300. $objet = isset($env['objet']) ? $env['objet'] : '';
  301. $id_objet = isset($env['id_objet']) ? $env['id_objet'] : '';
  302. $methodes = pipeline(
  303. 'medias_methodes_upload',
  304. [
  305. 'args' => ['objet' => $objet, 'id_objet' => $id_objet],
  306. 'data' => $methodes
  307. ]
  308. );
  309. return $methodes;
  310. }
  311. function duree_en_secondes($duree, $precis = false) {
  312. $out = '';
  313. $heures = $minutes = 0;
  314. if ($duree > 3600) {
  315. $heures = intval(floor($duree / 3600));
  316. $duree -= $heures * 3600;
  317. }
  318. if ($duree > 60) {
  319. $minutes = intval(floor($duree / 60));
  320. $duree -= $minutes * 60;
  321. }
  322. if ($heures > 0 or $minutes > 0) {
  323. $out = _T('date_fmt_heures_minutes', ['h' => $heures, 'm' => $minutes]);
  324. if (!$heures) {
  325. $out = preg_replace(',^0[^\d]+,Uims', '', $out);
  326. }
  327. }
  328. if (!$heures or $precis) {
  329. $out .= intval($duree) . 's';
  330. }
  331. return $out;
  332. }
  333. /**
  334. * Trouver le fond pour embarquer un document
  335. * - avec une extension
  336. * - avec un mime_type donne
  337. *
  338. * => modeles/{modele_base}_emb_html.html si il existe
  339. * => modeles/{modele_base}_text_html.html si il existe,
  340. * => modeles/{modele_base}_text.html si il existe,
  341. * => modeles/{modele_base}.html sinon
  342. *
  343. * @param $extension
  344. * @param $mime_type
  345. * @return mixed
  346. */
  347. function medias_trouver_modele_emb($extension, $mime_type, $modele_base = 'file') {
  348. if ($extension and trouve_modele($fond = $modele_base . '_emb_' . $extension)) {
  349. return $fond;
  350. }
  351. $fond = $modele_base . '_emb_' . preg_replace(',\W,', '_', $mime_type);
  352. if (trouve_modele($fond)) {
  353. return $fond;
  354. }
  355. $fond = $modele_base . '_emb_' . preg_replace(',\W.*$,', '', $mime_type);
  356. if (trouve_modele($fond)) {
  357. return $fond;
  358. }
  359. return $modele_base;
  360. }
  361. /**
  362. * Liste les classes standards des modèles de documents SPIP.
  363. *
  364. * @note
  365. * le nomage au pluriel est historique.
  366. * préférer au singulier pour toute nouvelle classe.
  367. *
  368. * @param int $id_document
  369. * @param string $media
  370. * @param array $env
  371. * @param array $get
  372. * @return string
  373. */
  374. function filtre_medias_modele_document_standard_classes_dist($Pile, $id_document, $media) {
  375. $env = $Pile[0];
  376. $var = $Pile['vars'] ?? [];
  377. $classes = [];
  378. $classes[] = "spip_document_$id_document";
  379. $classes[] = 'spip_document';
  380. $classes[] = 'spip_documents';
  381. $classes[] = "spip_document_$media";
  382. if (!empty($env['align'])) {
  383. $classes[] = 'spip_documents_' . $env['align'];
  384. $classes[] = 'spip_document_' . $env['align'];
  385. } elseif ($media === 'image') {
  386. $classes[] = 'spip_documents_center';
  387. $classes[] = 'spip_document_center';
  388. }
  389. if (!empty($var['legende'])) {
  390. $classes[] = 'spip_document_avec_legende';
  391. }
  392. if (!empty($env['class'])) {
  393. $classes[] = $env['class'];
  394. }
  395. return implode(' ', $classes);
  396. }
  397. /**
  398. * Liste les attributs data standards des modèles de documents SPIP.
  399. *
  400. * @param int $id_document
  401. * @param string $media
  402. * @param array $env
  403. * @param array $get
  404. * @return string
  405. */
  406. function filtre_medias_modele_document_standard_attributs_dist($Pile, $id_document, $media) {
  407. $var = $Pile['vars'] ?? [];
  408. $attrs = [];
  409. if (!empty($var['legende'])) {
  410. $len = spip_strlen(textebrut($var['legende']));
  411. // des x. "x" = 32 caratères, "xx" => 64, "xxx" => 128, etc...
  412. $lenx = medias_str_repeat_log($len, 2, 'x', 4);
  413. $attrs['data-legende-len'] = $len;
  414. $attrs['data-legende-lenx'] = $lenx;
  415. }
  416. $res = '';
  417. foreach ($attrs as $attr => $value) {
  418. $res .= "$attr=\"" . attribut_html($value) . '"';
  419. };
  420. return $res;
  421. }
  422. /**
  423. * Retourne une chaine répétée d'autant de fois le logarithme
  424. *
  425. * @example medias_str_repeat_log(124, 2)
  426. *
  427. * Avec $base = 2 et $remove = 0
  428. *
  429. * 0 =>
  430. * 2 => x
  431. * 4 => xx
  432. * 8 => xxx
  433. * 16 => xxxx
  434. * 32 => xxxxx
  435. * 64 => xxxxxx
  436. *
  437. * @example medias_str_repeat_log(124, 2, "x", 4)
  438. *
  439. * Avec $base = 2 et $remove = 4
  440. *
  441. * 0 =>
  442. * 2 =>
  443. * 4 =>
  444. * 8 =>
  445. * 16 =>
  446. * 32 => x
  447. * 64 => xx
  448. *
  449. * @note
  450. * L'inverse (nb caractères => valeur) est donc `pow($base, $nb_char)`
  451. *
  452. * En partant du nombre de "x" on retrouve la fourchette du nombre de départ.
  453. * Si $base = 2 et $remove = 4 :
  454. *
  455. * - "xxx" = 2 ^ (strlen("xxx") + 4) = 2 ^ (3 + 4) = 128
  456. * - "xxxxx" = 2 ^ (5 + 4) = 512
  457. * x = 32,
  458. * xx = 64
  459. * xxx = 128
  460. * xxxx = 256
  461. * xxxxx = 512
  462. * ...
  463. *
  464. * Ce qui veut dire que "xxx" provient d'une valeur entre 128 et 255.
  465. *
  466. * @note
  467. * C'est surtout utile pour une sélection en CSS (car CSS ne permet pas de sélecteur "lower than" ou "greater than") :
  468. *
  469. * ```spip
  470. * <div class='demo' data-demo-lenx='[(#TEXTE|textebrut|spip_strlen|medias_str_repeat_log{2,x,4})]'>...</div>`
  471. * ```
  472. *
  473. * ```css
  474. * .demo[data-demo-lenx^="xxxx"] {
  475. * // le contenu fait au moins 256 caractères
  476. * }
  477. * .demo:not([data-demo-lenx^="xxxx"]) {
  478. * // le contenu fait au moins 256 caractères
  479. * }
  480. * ```
  481. *
  482. * @param float $num
  483. * @param float $log
  484. * @param string $pad_string
  485. * @param int $remove : Nombre de caractères à enlever.
  486. *
  487. * @return string Des x
  488. */
  489. function medias_str_repeat_log($num, $base = 2, $string = 'x', $remove = 0) {
  490. $pad = str_repeat($string, (int)log($num, $base));
  491. return substr($pad, $remove);
  492. }