function html_3002936b70d02a85d3d71dc952115155($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) { if (isset($Pile[0]["doublons"]) and is_array($Pile[0]["doublons"])) { $doublons = nettoyer_env_doublons($Pile[0]["doublons"]); } $connect = ''; $page = '<' . '?php header("X-Spip-Cache: 604800"); ?' . '>' . '<' . '?php header("' . 'Content-Type: text/css; charset=utf-8' . '"); ?' . '>' . '<' . '?php header("' . 'Vary: Accept-Encoding' . '"); ?' . '>' . barre_outils_css_icones('') . ' /* roue ajax */ .ajaxLoad{ position:relative; } .ajaxLoad:after { content:""; display:block; width:40px; height:40px; border:1px solid #eee; background:#fff url(\'' . protocole_implicite(url_absolue(find_in_path('images/searching.gif'))) . '\') center no-repeat; position:absolute; left:50%; top:50%; margin-left:-20px; margin-top:-20px; } .fullscreen .ajaxLoad:after { position:fixed; left:75%; } '; return analyse_resultat_skel('html_3002936b70d02a85d3d71dc952115155', $Cache, $page, 'plugins-dist/porte_plume/barre_outils_icones.css.html'); }
/** * Ajoute les boutons d'administration de la page s'ils n'y sont pas déjà * * Insère la feuille de style selon les normes, dans le `<head>` * puis les boutons. * * Feuilles de style admin : d'abord la CSS officielle, puis la perso * * @param string $contenu * Contenu HTML de la page qui va être envoyée au navigateur * @return string * Contenu HTML, avec boutons d'administrations et sa CSS **/ function affiche_boutons_admin($contenu) { include_spip('inc/filtres'); // Inserer le css d'admin $css = "<link rel='stylesheet' href='" . protocole_implicite(url_absolue(direction_css(find_in_path('spip_admin.css')))) . "' type='text/css' />\n"; if ($f = find_in_path('spip_admin_perso.css')) { $css .= "<link rel='stylesheet' href='" . protocole_implicite(url_absolue(direction_css($f))) . "' type='text/css' />\n"; } ($pos = stripos($contenu, '</head>')) || ($pos = stripos($contenu, '<body>')) || ($pos = 0); $contenu = substr_replace($contenu, $css, $pos, 0); // Inserer la balise #FORMULAIRE_ADMIN, en float $boutons_admin = inclure_balise_dynamique(balise_FORMULAIRE_ADMIN_dyn('spip-admin-float'), false); ($pos = strripos($contenu, '</body>')) || ($pos = strripos($contenu, '</html>')) || ($pos = strlen($contenu)); $contenu = substr_replace($contenu, $boutons_admin, $pos, 0); return $contenu; }
/** * Transformer toutes les URLs relatives image,js en url absolues qui pointent sur le domaine statique * on applique pas a l'URL de la CSS, car on envoie un header http link qui permet au navigateur de la pre-fetch * sur le meme domaine, sans avoir a faire de requete DNS * @param string $flux * @return string */ function compresseur_affichage_final($flux) { if (isset($GLOBALS['meta']['url_statique_ressources']) and isset($GLOBALS['html']) and $GLOBALS['html'] and $url_statique = $GLOBALS['meta']['url_statique_ressources']) { $url_statique = rtrim(protocole_implicite($url_statique), "/") . "/"; $flux = preg_replace(",(href|src)=([\"'])([^/][^:\"']*[.](?:png|gif|jpg|js)(?:\\?[0-9]+)?)\\2,Uims", "\\1=\\2" . $url_statique . "\\3\\2", $flux); // prefetching // <link rel="dns-prefetch" href="//host_name_to_prefetch.com"> if (($p = strpos($url_statique, "/", 2)) !== false) { $url_statique = substr($url_statique, 0, $p); $link = "<link rel=\"dns-prefetch\" href=\"{$url_statique}\">"; if ($p = stripos($flux, "</title>")) { $flux = substr_replace($flux, "\n" . $link, $p + 8, 0); } } } return $flux; }
/** * Resoudre et inliner les @import * ceux-ci ne peuvent etre presents qu'en debut de CSS et on ne veut pas changer l'ordre des directives * * @param string $contenu * @param string $url_base * @return string */ function css_resolve_atimport($contenu, $url_base) { // vite si rien a faire if (strpos($contenu, "@import") === false) { return $contenu; } $imports_non_resolvables = array(); preg_match_all(",@import ([^;]*);,UmsS", $contenu, $matches, PREG_SET_ORDER); if ($matches and count($matches)) { foreach ($matches as $m) { $url = $media = $erreur = ""; if (preg_match(",^\\s*url\\s*\\(\\s*['\"]?([^'\"]*)['\"]?\\s*\\),Ums", $m[1], $r)) { $url = $r[1]; $media = trim(substr($m[1], strlen($r[0]))); } elseif (preg_match(",^\\s*['\"]([^'\"]+)['\"],Ums", $m[1], $r)) { $url = $r[1]; $media = trim(substr($m[1], strlen($r[0]))); } if (!$url) { $erreur = "Compresseur : <tt>" . $m[0] . ";</tt> non resolu dans <tt>{$url_base}</tt>"; } else { $url = suivre_lien($url_base, $url); // url relative ? $root = protocole_implicite($GLOBALS['meta']['adresse_site'] . "/"); if (strncmp($url, $root, strlen($root)) == 0) { $url = _DIR_RACINE . substr($url, strlen($root)); } else { // si l'url a un protocole http(s):// on ne considère qu'on ne peut pas // résoudre le stockage. Par exemple // @import url(https://fonts.googleapis.com/css?family=Ubuntu); // retournant un contenu différent en fonction navigateur // tous les @import restant seront remontes en tete de CSS en fin de concatenation if (preg_match(',^https?://,', $url)) { $url = ""; } else { // protocole implicite // $url = "http:{$url}"; } } if ($url) { // on renvoit dans la boucle pour que le fichier inclus // soit aussi processe (@import, url absolue etc...) $css = compresseur_callback_prepare_css($url); if ($css == $url or !lire_fichier($css, $contenu_imported)) { $erreur = "Compresseur : url {$url} de <tt>" . $m[0] . ";</tt> non resolu dans <tt>{$url_base}</tt>"; } else { if ($media) { $contenu_imported = "@media {$media}{\n{$contenu_imported}\n}\n"; } $contenu = str_replace($m[0], $contenu_imported, $contenu); } } } if ($erreur) { $contenu = str_replace($m[0], "/* erreur @ import " . $m[1] . "*/", $contenu); erreur_squelette($erreur); } } } return $contenu; }
/** * Remplacer l'URL du site par une url de ressource genre static.example.org * qui evite les echanges de cookie pour les ressources images * (peut aussi etre l'URL d'un CDN ou autre provider de ressources statiques) * * @param string $contenu * @param string $url_base * @param string $filename * @return mixed */ function css_url_statique_ressources($contenu, $url_base, $filename) { if (isset($GLOBALS['meta']['url_statique_ressources']) and $url_statique = $GLOBALS['meta']['url_statique_ressources']) { $url_statique = rtrim(protocole_implicite($url_statique), "/") . "/"; $url_site = rtrim(protocole_implicite($GLOBALS['meta']['adresse_site']), "/") . "/"; $contenu = str_replace($url_site, $url_statique, $contenu); } return $contenu; }
/** * Crée le code CSS pour les images des icones des barres d'outils * * S'appuie sur la description des jeux de barres disponibles et cherche * une fonction barre_outils_($barre)_icones pour chaque barre et * l'exécute si existe, attendant alors en retour un tableau de couples : * nom de l'outil => nom de l'image * * @pipeline_appel porte_plume_lien_classe_vers_icone * * @return string Déclaration CSS des icones */ function barre_outils_css_icones() { // recuperer la liste, extraire les icones $css = ""; // liste des barres if (!($barres = barre_outils_liste())) { return null; } // liste des classes css et leur correspondance avec une icone $classe2icone = array(); foreach ($barres as $barre) { include_spip('barre_outils/' . $barre); if ($f = charger_fonction($barre . '_icones', 'barre_outils', true)) { if (is_array($icones = $f())) { $classe2icone = array_merge($classe2icone, $icones); } } } /** * Permettre aux plugins d'étendre les icones connues du porte plume * * On passe la liste des icones connues au pipeline pour ceux qui * ajoutent de simples icones à des barres existantes * * @pipeline_appel porte_plume_lien_classe_vers_icone * @var array $classe2icone * Couples identifiant de bouton => nom de l'image (ou tableau) * Dans le cas d'un tableau, cela indique une sprite : (nom de l'image , position haut, position bas) * Exemple : 'outil_header1' => array('spt-v1.png','-10px -226px') */ $classe2icone = pipeline('porte_plume_lien_classe_vers_icone', $classe2icone); // passage en css foreach ($classe2icone as $n => $i) { $pos = ""; if (is_array($i)) { $pos = "background-position:" . end($i); $i = reset($i); } if (file_exists($i)) { $file = $i; } else { $file = find_in_path("icones_barre/{$i}"); } if ($file) { $css .= "\n.markItUp .{$n}>a>em {background-image:url(" . protocole_implicite(url_absolue($file)) . ");{$pos}}"; } } return $css; }
/** * Transformer du LESS en CSS * Peut prendre en entree * - un fichier .css ou .less : * [(#CHEMIN{messtyles.less.css}|less_css)] * la sortie est un chemin vers un fichier CSS * - des styles inline, * pour appliquer dans une feulle less calculee : * #FILTRE{less_css} * la sortie est du style inline * * @param string $source * @return string */ function less_css($source) { static $chemin = null; // Si on n'importe pas, est-ce un fichier ? if (!preg_match(',[\\s{}],', $source) and preg_match(',\\.(less|css)$,i', $source, $r) and file_exists($source)) { static $done = array(); // ne pas essayer de compiler deux fois le meme fichier dans le meme hit // si on a echoue une fois, on echouera pareil if (isset($done[$source])) { return $done[$source]; } if (is_null($chemin)) { $chemin = _chemin(); $chemin = md5(serialize($chemin)); } // url de base de la source // qui se trouvera dans la css car url absolue des images // il faut que la css generee en depende $url_base_source = protocole_implicite(url_absolue($source)); $f = basename($source, $r[0]); $f = sous_repertoire(_DIR_VAR, 'cache-less') . preg_replace(",(.*?)(_rtl|_ltr)?\$,", "\\1-cssify-" . substr(md5("{$url_base_source}-lesscss-{$chemin}"), 0, 7) . "\\2", $f, 1) . '.css'; # si la feuille compilee est plus recente que la feuille source # l'utiliser sans rien faire, sauf si recalcul explicite $changed = false; if (@filemtime($f) < @filemtime($source)) { $changed = true; } if (!$changed and (!defined('_VAR_MODE') or _VAR_MODE != 'recalcul')) { return $f; } if (!lire_fichier($source, $contenu)) { return $source; } # compiler le LESS si besoin (ne pas generer une erreur si source vide if (!$contenu) { $contenu = "/* Source {$source} : vide */\n"; } else { $contenu = lesscss_compile($contenu, array('file' => $source)); } // si erreur de compilation on renvoit un commentaire, et il y a deja eu un log if (!$contenu) { $contenu = "/* Compilation {$source} : vide */\n"; } # passer la css en url absolue # plus la peine : le parser CSS resoud les ULRs absolues des images en meme temps qu'il les cherche dans le path # $contenu = urls_absolues_css($contenu, $url_base_source); // ecrire le fichier destination, en cas d'echec renvoyer la source // on ecrit sur un fichier if (ecrire_fichier($f . ".last", $contenu, true)) { if ($changed or md5_file($f) != md5_file($f . ".last")) { @copy($f . ".last", $f); // eviter que PHP ne reserve le vieux timestamp if (version_compare(PHP_VERSION, '5.3.0') >= 0) { clearstatcache(true, $f); } else { clearstatcache(); } } return $done[$source] = $f; } else { return $done[$source] = $source; } } $source = lesscss_compile($source); if (!$source) { return "/* Erreur compilation LESS : cf less.log */"; } else { return $source; } }