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

219 lines
6.1 KiB
PHP

<?php
/**
* Plugin SkelEditor
* Editeur de squelette en ligne
* (c) depuis 2007 Collectif SPIP
* Licence GPL-v3
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Tester avec _request si on est dans l'edition de skeleditor et si oui, retourne l'extension du nom du fichier
*
* @return string
*/
function test_skeleditor_edition() {
$exec = _request('exec');
$filename = _request('f');
if (
$exec == 'skeleditor'
and $filename
and $infos = pathinfo($filename)
and $extension = $infos['extension']
) {
return $extension;
} else {
return false;
}
}
/**
* Produit les css dans le header_prive si nécessaire
*
* @param string $flux
* @return string
*/
function skeleditor_insert_head_css($flux) {
$extension = test_skeleditor_edition();
if ($extension) {
static $done = false;
if (!$done) {
$done = true;
$type = 'css';
$css = skeleditor_dir($extension, $type);
$flux .= $css;
}
}
return $flux;
}
/**
* Produit les js dans le header_prive si nécessaire
*
* @param string $flux
* @return string
*/
function skeleditor_insert_head($flux) {
/*
$extension = test_skeleditor_edition();
if($extension) {
$type = "js";
$script = skeleditor_dir($extension, $type);
$flux = skeleditor_insert_head_css($flux); // au cas ou il n'est pas implemente
$flux .= $script;
}*/
return $flux;
}
// pas de compresseur si var_inclure
if (_request('var_mode') == 'inclure') {
define('_INTERDIRE_COMPACTE_HEAD', true);
}
function skeleditor_extraire_css($texte) {
$url_base = url_de_base();
$url_page = substr(generer_url_public('A'), 0, -1);
$dir = preg_quote($url_page, ',') . '|' . preg_quote(preg_replace(",^$url_base,", _DIR_RACINE, $url_page), ',');
$css = [];
// trouver toutes les css pour les afficher dans le bouton
// repris du compresseur
foreach (extraire_balises($texte, 'link') as $s) {
if (
extraire_attribut($s, 'rel') === 'stylesheet'
and (!($type = extraire_attribut($s, 'type'))
or $type == 'text/css')
and !strlen(strip_tags($s))
and $src = preg_replace(",^$url_base,", _DIR_RACINE, extraire_attribut($s, 'href'))
and (
// regarder si c'est du format spip.php?page=xxx
preg_match(',^(' . $dir . ')(.*)$,', $src, $r)
or (
// ou si c'est un fichier
// enlever un timestamp eventuel derriere un nom de fichier statique
$src2 = skeleditor_trouver_source($src)
// verifier qu'il n'y a pas de ../ ni / au debut (securite)
and !preg_match(',(^/|\.\.),', substr($src2, strlen(_DIR_RACINE)))
// et si il est lisible
and @is_readable($src2)
)
)
) {
if ($r) {
$css[$s] = explode(
'&',
str_replace('&amp;', '&', $r[2]),
2
);
} else {
// var_dump($src2);
$file = preg_replace(',[?]\d+$,', '', $src2);
if (strncmp($file, _DIR_VAR, strlen(_DIR_VAR)) == 0) {
lire_fichier($file, $c);
if (preg_match(',^\/\*\s*(#@.*)\s*\*\/,Uims', $c, $m)) {
$inc = explode('#@', $m[1]);
$inc = array_map('trim', $inc);
$inc = array_filter($inc);
foreach ($inc as $i) {
if (!in_array($i, $css)) {
$css["$s:$i"] = $i;
}
}
}
} else {
$css[$s] = $file;
}
}
}
}
return $css;
}
function skeleditor_trouver_source($src) {
$source_file = explode('?', $src);
$source_file = reset($source_file);
// est-ce un fichier (less|scss) cssifié
// dans ce cas on l'ouvre et on lit les premieres lignes qui contiennent la reference aux fichiers compiles
if (
strpos($source_file, '-cssify-')
and preg_match('#/cache-(less|scss)/.*-cssify-[\w\d-]*.css#s', $source_file)
) {
$start = file_get_contents($source_file, false, null, 0, 2048);
if (strpos($start, '#@') !== false) {
$start = explode('#@', $start);
array_shift($start);
$file = reset($start);
$file = explode("\n", $file);
$file = reset($file);
if (file_exists($file)) {
if (strpos($file, _ROOT_RACINE) === 0) {
$file = substr($file, strlen(_ROOT_RACINE));
}
return $file;
}
}
}
return $source_file;
}
function skeleditor_affichage_final($texte) {
if (
isset($_COOKIE['spip_admin'])
and $GLOBALS['html']
and isset($GLOBALS['visiteur_session']['statut'])
and $GLOBALS['visiteur_session']['statut']
and intval($GLOBALS['visiteur_session']['statut']) < '1comite'
and include_spip('inc/autoriser')
and autoriser('skeleditor')
) {
if ((defined('_VAR_INCLURE') and _VAR_INCLURE) or (isset($GLOBALS['var_inclure']) and $GLOBALS['var_inclure'])) {
$retour = self();
$url = generer_url_ecrire('skeleditor', 'retour=' . $retour . '&f=');
$inserer = "<script type='text/javascript'>jQuery(function(){jQuery('.inclure_blocs h6:first-child').each(function(){
jQuery(this).html(\"<a class='sepopin' href='$url\"+jQuery(this).html()+\"'>\"+jQuery(this).html()+'<'+'/a>');
});"
//."jQuery('a.sepopin').click(function(){if (jQuery.modalbox) jQuery.modalbox(parametre_url(this.href,'var_zajax','contenu'));return false;});"
. '});</script><style>.spip-admin-boutons {display:block;float:left;margin-right:10px; max-height:300px; overflow:auto;} .spip-admin-boutons a{display:block;opacity:0.7;} .spip-admin-boutons:hover,.spip-admin-boutons a:hover {opacity:1.0;}</style>
</body>';
$texte = preg_replace(',</body>,', $inserer, $texte);
$css = skeleditor_extraire_css($texte);
$lienplus = [];
foreach ($css as $src) {
// si c'est un skel, le trouver
if (is_array($src)) {
$src = find_in_path($src[0] . '.' . _EXTENSION_SQUELETTES);
}
if ($src) {
$lienplus[] = "<a href='$url" . urlencode($src) . "'"
. '>' . basename($src) . '<\/a>';
}
}
if (count($lienplus)) {
$lienplus = implode('', $lienplus);
$lienplus = "<span class='spip-admin-boutons' id='inclure'>$lienplus<\/span>";
};
} else {
$lienplus = "<a href='" . parametre_url(self(), 'var_mode', 'inclure') . "' class='spip-admin-boutons' "
. "id='inclure'>" . _T('skeleditor:squelettes') . '<\/a>';
}
if ($lienplus) {
$inserer = "<script type='text/javascript'>/*<![CDATA[*/jQuery(function(){jQuery('#spip-admin').append(\"$lienplus\");});/*]]>*/</script></body>";
}
$texte = preg_replace(',</body>,', $inserer, $texte);
}
return $texte;
}