/** * Produire un fichier statique a partir d'un squelette dynamique * Permet ensuite a apache de le servir en statique sans repasser * par spip.php a chaque hit sur le fichier * si le format (css ou js) est passe dans contexte['format'], on l'utilise * sinon on regarde si le fond finit par .css ou .js * sinon on utilie "html" * * @param string $fond * @param array $contexte * @param array $options * @param string $connect * @return string */ function produire_fond_statique($fond, $contexte = array(), $options = array(), $connect = '') { if (isset($contexte['format'])) { $extension = $contexte['format']; unset($contexte['format']); } else { $extension = "html"; if (preg_match(',[.](css|js|json)$,', $fond, $m)) { $extension = $m[1]; } } // recuperer le contenu produit par le squelette $options['raw'] = true; $cache = recuperer_fond($fond, $contexte, $options, $connect); // calculer le nom de la css $dir_var = sous_repertoire(_DIR_VAR, 'cache-' . $extension); $nom_safe = preg_replace(",\\W,", '_', str_replace('.', '_', $fond)); $filename = $dir_var . $extension . "dyn-{$nom_safe}-" . substr(md5($fond . serialize($contexte) . $connect), 0, 8) . ".{$extension}"; // mettre a jour le fichier si il n'existe pas // ou trop ancien // le dernier fichier produit est toujours suffixe par .last // et recopie sur le fichier cible uniquement si il change if (!file_exists($filename) or !file_exists($filename . ".last") or isset($cache['lastmodified']) and $cache['lastmodified'] and filemtime($filename . ".last") < $cache['lastmodified'] or defined('_VAR_MODE') and _VAR_MODE == 'recalcul') { $contenu = $cache['texte']; // passer les urls en absolu si c'est une css if ($extension == "css") { $contenu = urls_absolues_css($contenu, test_espace_prive() ? generer_url_ecrire('accueil') : generer_url_public($fond)); } // ne pas insérer de commentaire si c'est du json if ($extension != "json") { $comment = "/* #PRODUIRE{fond={$fond}"; foreach ($contexte as $k => $v) { $comment .= ",{$k}={$v}"; } // pas de date dans le commentaire car sinon ca invalide le md5 et force la maj // mais on peut mettre un md5 du contenu, ce qui donne un aperu rapide si la feuille a change ou non $comment .= "}\n md5:" . md5($contenu) . " */\n"; } // et ecrire le fichier ecrire_fichier($filename . ".last", $comment . $contenu); // regarder si on recopie if (!file_exists($filename) or md5_file($filename) !== md5_file($filename . ".last")) { @copy($filename . ".last", $filename); spip_clearstatcache(true, $filename); // eviter que PHP ne reserve le vieux timestamp } } return $filename; }
/** * Produire un fichier statique a partir d'un squelette dynamique * Permet ensuite a apache de le servir en statique sans repasser * par spip.php a chaque hit sur le fichier * si le format (css ou js) est passe dans contexte['format'], on l'utilise * sinon on regarde si le fond finit par .css ou .js * sinon on utilie "html" * * @param string $fond * @param array $contexte * @param array $options * @param string $connect * @return string */ function produire_fond_statique($fond, $contexte=array(), $options = array(), $connect=''){ if (isset($contexte['format'])){ $extension = $contexte['format']; unset($contexte['format']); } else { $extension = "html"; if (preg_match(',[.](css|js)$,',$fond,$m)) $extension = $m[1]; } // recuperer le contenu produit par le squelette $options['raw'] = true; $cache = recuperer_fond($fond,$contexte,$options,$connect); // calculer le nom de la css $dir_var = sous_repertoire (_DIR_VAR, 'cache-'.$extension); $filename = $dir_var . $extension."dyn-".md5($fond.serialize($contexte).$connect) .".$extension"; // mettre a jour le fichier si il n'existe pas // ou trop ancien if (!file_exists($filename) OR filemtime($filename)<$cache['lastmodified']){ $contenu = $cache['texte']; // passer les urls en absolu si c'est une css if ($extension=="css") $contenu = urls_absolues_css($contenu, generer_url_public($fond)); $comment = "/* #PRODUIRE{fond=$fond"; foreach($contexte as $k=>$v) $comment .= ",$k=$v"; $comment .="} le ".date("Y-m-d H:i:s")." */\n"; // et ecrire le fichier ecrire_fichier($filename,$comment.$contenu); } return $filename; }
/** * Produire un fichier statique a partir d'un squelette dynamique * Permet ensuite a apache de le servir en statique sans repasser * par spip.php a chaque hit sur le fichier * si le format (css ou js) est passe dans contexte['format'], on l'utilise * sinon on regarde si le fond finit par .css ou .js * sinon on utilie "html" * * @param string $fond * @param array $contexte * @param array $options * @param string $connect * @return string */ function produire_fond_statique($fond, $contexte = array(), $options = array(), $connect = '') { if (isset($contexte['format'])) { $extension = $contexte['format']; unset($contexte['format']); } else { $extension = "html"; if (preg_match(',[.](css|js|json)$,', $fond, $m)) { $extension = $m[1]; } } // recuperer le contenu produit par le squelette $options['raw'] = true; $cache = recuperer_fond($fond, $contexte, $options, $connect); // calculer le nom de la css $dir_var = sous_repertoire(_DIR_VAR, 'cache-' . $extension); $nom_safe = preg_replace(",\\W,", '_', str_replace('.', '_', $fond)); $filename = $dir_var . $extension . "dyn-{$nom_safe}-" . substr(md5($fond . serialize($contexte) . $connect), 0, 8) . ".{$extension}"; // mettre a jour le fichier si il n'existe pas // ou trop ancien if (!file_exists($filename) or isset($cache['lastmodified']) and $cache['lastmodified'] and filemtime($filename) < $cache['lastmodified'] or defined('_VAR_MODE') and _VAR_MODE == 'recalcul') { $contenu = $cache['texte']; // passer les urls en absolu si c'est une css if ($extension == "css") { $contenu = urls_absolues_css($contenu, test_espace_prive() ? generer_url_ecrire('accueil') : generer_url_public($fond)); } // ne pas insérer de commentaire si c'est du json if ($extension != "json") { $comment = "/* #PRODUIRE{fond={$fond}"; foreach ($contexte as $k => $v) { $comment .= ",{$k}={$v}"; } $comment .= "} le " . date("Y-m-d H:i:s") . " */\n"; } // et ecrire le fichier ecrire_fichier($filename, $comment . $contenu); } return $filename; }
function url_absolue_css ($css) { if (!preg_match(',\.css$,i', $css, $r)) return $css; $url_absolue_css = url_absolue($css); $f = basename($css,'.css'); $f = sous_repertoire (_DIR_VAR, 'cache-css') . preg_replace(",(.*?)(_rtl|_ltr)?$,","\\1-urlabs-" . substr(md5("$css-urlabs"), 0,4) . "\\2",$f) . '.css'; if ((@filemtime($f) > @filemtime($css)) AND ($GLOBALS['var_mode'] != 'recalcul')) return $f; if ($url_absolue_css==$css){ if (strncmp($GLOBALS['meta']['adresse_site'],$css,$l=strlen($GLOBALS['meta']['adresse_site']))!=0 OR !lire_fichier(_DIR_RACINE . substr($css,$l), $contenu)){ include_spip('inc/distant'); if (!$contenu = recuperer_page($css)) return $css; } } elseif (!lire_fichier($css, $contenu)) return $css; // passer les url relatives a la css d'origine en url absolues $contenu = urls_absolues_css($contenu, $css); // ecrire la css if (!ecrire_fichier($f, $contenu)) return $css; return $f; }
$ok = false; } lire_fichier(dirname(__FILE__) . "/css/expected_highest_screen.css", $expected); $compacte = minifier_css($css_code, array('media' => 'screen', 'template' => 'highest')); if (rtrim($compacte) != rtrim($expected)) { erreur("minifier_css(array('media'=>'screen','template'=>'highest'))", $compacte, $expected); $ok = false; } lire_fichier(dirname(__FILE__) . "/css/source_simple.css", $css_code); lire_fichier(dirname(__FILE__) . "/css/expected_simple.css", $expected); $compacte = minifier_css($css_code, 'screen'); if (rtrim($compacte) != rtrim($expected)) { erreur("minifier_css('screen')", $compacte, $expected); $ok = false; } lire_fichier(dirname(__FILE__) . "/css/expected_url_abs.css", $expected); lire_fichier(dirname(__FILE__) . "/css/source_url_abs.css", $source); $compacte = urls_absolues_css($source, "http://example.org/squelettes/source.css"); if (rtrim($compacte) != rtrim($expected)) { erreur("urls_absolues_css()", $compacte, $expected); $ok = false; } if ($ok) { echo "OK"; } function erreur($titre, $result, $expected) { echo "Erreur {$titre}<br />"; echo "<tt>Resultat:</tt><pre>{$result}</pre>"; echo "<tt>Attendu :</tt><pre>{$expected}</pre>"; }