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');
}
Example #2
0
/**
 * 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;
}
Example #4
0
/**
 * 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;
    }
}