compresseur_fonctions.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <?php
  2. /***************************************************************************\
  3. * SPIP, Systeme de publication pour l'internet *
  4. * *
  5. * Copyright (c) 2001-2014 *
  6. * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
  7. * *
  8. * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
  9. * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
  10. \***************************************************************************/
  11. /**
  12. * Fonctions et filtres du compresseur
  13. *
  14. * @package SPIP\Compresseur\Fonctions
  15. */
  16. if (!defined("_ECRIRE_INC_VERSION")) return;
  17. /**
  18. * Minifier un fichier JS ou CSS
  19. *
  20. * Si la source est un chemin, on retourne un chemin avec le contenu minifié
  21. * dans _DIR_VAR/cache_$format/
  22. * Si c'est un flux on le renvoit compacté
  23. * Si on ne sait pas compacter, on renvoie ce qu'on a recu
  24. *
  25. * @param string $source
  26. * Contenu à minifier ou chemin vers un fichier dont on veut minifier le contenu
  27. * @param string $format
  28. * Format de la source (js|css).
  29. * @return string
  30. * - Contenu minifié (si la source est un contenu)
  31. * - Chemin vers un fichier ayant le contenu minifié (si source est un fichier)
  32. */
  33. function minifier($source, $format = null) {
  34. if (!$format AND preg_match(',\.(js|css)$,', $source, $r))
  35. $format = $r[1];
  36. include_spip('inc/compresseur_minifier');
  37. if (!function_exists($minifier = 'minifier_'.$format))
  38. return $source;
  39. // Si on n'importe pas, est-ce un fichier ?
  40. if (!preg_match(',[\s{}],', $source)
  41. AND preg_match(',\.'.$format.'$,i', $source, $r)
  42. AND file_exists($source)) {
  43. // si c'est une css, il faut reecrire les url en absolu
  44. if ($format=='css')
  45. $source = url_absolue_css($source);
  46. $f = basename($source,'.'.$format);
  47. $f = sous_repertoire (_DIR_VAR, 'cache-'.$format)
  48. . preg_replace(",(.*?)(_rtl|_ltr)?$,","\\1-minify-"
  49. . substr(md5("$source-minify"), 0,4) . "\\2", $f, 1)
  50. . '.' . $format;
  51. if ((@filemtime($f) > @filemtime($source))
  52. AND (!defined('_VAR_MODE') OR _VAR_MODE != 'recalcul'))
  53. return $f;
  54. if (!lire_fichier($source, $contenu))
  55. return $source;
  56. // traiter le contenu
  57. $contenu = $minifier($contenu);
  58. // ecrire le fichier destination, en cas d'echec renvoyer la source
  59. if (ecrire_fichier($f, $contenu, true))
  60. return $f;
  61. else
  62. return $source;
  63. }
  64. // Sinon simple minification de contenu
  65. return $minifier($source);
  66. }
  67. /**
  68. * Synonyme historique de minifier, pour compatibilite
  69. *
  70. * @deprecated Utiliser minifier()
  71. *
  72. * @param string $source
  73. * @param string $format
  74. * @return string
  75. */
  76. function compacte($source, $format = null){
  77. return minifier($source, $format);
  78. }
  79. /**
  80. * Compacte les éléments CSS et JS d'un <head> HTML
  81. *
  82. * Cette fonction vérifie les réglages du site et traite le compactage
  83. * des css et/ou js d'un <head>
  84. *
  85. * Un fichier .gz est crée pour chaque, qui peut etre utilisé par apache
  86. * et lui éviter de recompresser à chaque hit, avec les directives suivantes :
  87. *
  88. * <IfModule mod_gzip.c>
  89. * mod_gzip_on Yes
  90. * mod_gzip_can_negotiate Yes
  91. * mod_gzip_static_suffix .gz
  92. * AddEncoding gzip .gz
  93. * mod_gzip_item_include file \.(js|css)$
  94. * </IfModule>
  95. *
  96. * @see compacte_head_files()
  97. *
  98. * @param string $flux
  99. * Partie de contenu du head HTML
  100. * @return string
  101. * Partie de contenu du head HTML
  102. */
  103. function compacte_head($flux){
  104. include_spip('inc/compresseur');
  105. if (!defined('_INTERDIRE_COMPACTE_HEAD')){
  106. // dans l'espace prive on compacte toujours, c'est concu pour
  107. if ((!test_espace_prive() AND $GLOBALS['meta']['auto_compress_css'] == 'oui') OR (test_espace_prive() AND !defined('_INTERDIRE_COMPACTE_HEAD_ECRIRE')))
  108. $flux = compacte_head_files($flux,'css');
  109. if ((!test_espace_prive() AND $GLOBALS['meta']['auto_compress_js'] == 'oui') OR (test_espace_prive() AND !defined('_INTERDIRE_COMPACTE_HEAD_ECRIRE')))
  110. $flux = compacte_head_files($flux,'js');
  111. }
  112. return $flux;
  113. }
  114. /**
  115. * Embarquer sous forme URI Scheme un fichier
  116. *
  117. * Une URI Scheme est de la forme data:xxx/yyy;base64,....
  118. *
  119. * Experimental
  120. *
  121. * @filtre embarque_fichier
  122. *
  123. * @staticvar array $mime
  124. * Couples (extension de fichier => type myme)
  125. * @param string $src
  126. * Chemin du fichier
  127. * @param string $base
  128. * Le chemin de base à partir duquel chercher $src
  129. * @param int $maxsize
  130. * Taille maximale des fichiers à traiter
  131. * @return string
  132. * URI Scheme du fichier si la compression est faite,
  133. * URL du fichier sinon (la source)
  134. */
  135. function filtre_embarque_fichier ($src, $base="", $maxsize = 4096) {
  136. static $mime = array();
  137. $extension = substr(strrchr($src,'.'),1);
  138. $filename = $base . $src;
  139. if (!file_exists($filename)
  140. OR filesize($filename)>$maxsize
  141. OR !lire_fichier($filename, $contenu))
  142. return $src;
  143. if (!isset($mime[$extension])){
  144. if (isset($GLOBALS['tables_mime']) AND isset($GLOBALS['tables_mime'][$extension]))
  145. $mime[$extension] = $GLOBALS['tables_mime'][$extension];
  146. }
  147. if (!isset($mime[$extension])){
  148. if (!function_exists("sql_getfetsel"))
  149. include_spip("base/abstract_sql");
  150. $mime[$extension] = sql_getfetsel('mime_type','spip_types_documents','extension='.sql_quote($extension));
  151. }
  152. $base64 = base64_encode($contenu);
  153. $encoded = 'data:'.$mime[$extension].';base64,'.$base64;
  154. return $encoded;
  155. }
  156. /**
  157. * Embarquer le 'src' d'une balise html en URI Scheme
  158. *
  159. * Experimental
  160. *
  161. * @param string $img
  162. * Code HTML d'une image
  163. * @param int $maxsize
  164. * Taille maximale des fichiers à traiter
  165. * @return string
  166. * Code HTML de l'image, avec la source en URI Scheme si cela a été possible.
  167. */
  168. function filtre_embarque_src ($img, $maxsize = 4096){
  169. $src = extraire_attribut($img,'src');
  170. if ($src2=filtre_embarque_fichier($src, "", $maxsize) AND $src2!= $src) {
  171. $img = inserer_attribut($img, 'src', $src2);
  172. }
  173. return $img;
  174. }
  175. ?>