refactor: extract css utils to an autoloaded class
The goal is to make the css replacement accessible in other contexts, for example for the manifest.
This commit is contained in:
parent
ff1e4eaee6
commit
fb1f9089ad
|
@ -0,0 +1,107 @@
|
|||
<?php
|
||||
|
||||
namespace dokuwiki;
|
||||
|
||||
class StyleUtils
|
||||
{
|
||||
/**
|
||||
* Load style ini contents
|
||||
*
|
||||
* Loads and merges style.ini files from template and config and prepares
|
||||
* the stylesheet modes
|
||||
*
|
||||
* @author Andreas Gohr <andi@splitbrain.org>
|
||||
*
|
||||
* @param string $tpl the used template
|
||||
* @param bool $preview load preview replacements
|
||||
* @return array with keys 'stylesheets' and 'replacements'
|
||||
*/
|
||||
public function cssStyleini($tpl, $preview=false) {
|
||||
global $conf;
|
||||
|
||||
$stylesheets = array(); // mode, file => base
|
||||
// guaranteed placeholder => value
|
||||
$replacements = array(
|
||||
'__text__' => "#000",
|
||||
'__background__' => "#fff",
|
||||
'__text_alt__' => "#999",
|
||||
'__background_alt__' => "#eee",
|
||||
'__text_neu__' => "#666",
|
||||
'__background_neu__' => "#ddd",
|
||||
'__border__' => "#ccc",
|
||||
'__highlight__' => "#ff9",
|
||||
'__link__' => "#00f",
|
||||
);
|
||||
|
||||
// load template's style.ini
|
||||
$incbase = tpl_incdir($tpl);
|
||||
$webbase = tpl_basedir($tpl);
|
||||
$ini = $incbase.'style.ini';
|
||||
if(file_exists($ini)){
|
||||
$data = parse_ini_file($ini, true);
|
||||
|
||||
// stylesheets
|
||||
if(is_array($data['stylesheets'])) foreach($data['stylesheets'] as $file => $mode){
|
||||
$stylesheets[$mode][$incbase.$file] = $webbase;
|
||||
}
|
||||
|
||||
// replacements
|
||||
if(is_array($data['replacements'])){
|
||||
$replacements = array_merge($replacements, $this->cssFixreplacementurls($data['replacements'],$webbase));
|
||||
}
|
||||
}
|
||||
|
||||
// load configs's style.ini
|
||||
$webbase = DOKU_BASE;
|
||||
$ini = DOKU_CONF."tpl/$tpl/style.ini";
|
||||
$incbase = dirname($ini).'/';
|
||||
if(file_exists($ini)){
|
||||
$data = parse_ini_file($ini, true);
|
||||
|
||||
// stylesheets
|
||||
if(isset($data['stylesheets']) && is_array($data['stylesheets'])) foreach($data['stylesheets'] as $file => $mode){
|
||||
$stylesheets[$mode][$incbase.$file] = $webbase;
|
||||
}
|
||||
|
||||
// replacements
|
||||
if(isset($data['replacements']) && is_array($data['replacements'])){
|
||||
$replacements = array_merge($replacements, $this->cssFixreplacementurls($data['replacements'],$webbase));
|
||||
}
|
||||
}
|
||||
|
||||
// allow replacement overwrites in preview mode
|
||||
if($preview) {
|
||||
$webbase = DOKU_BASE;
|
||||
$ini = $conf['cachedir'].'/preview.ini';
|
||||
if(file_exists($ini)) {
|
||||
$data = parse_ini_file($ini, true);
|
||||
// replacements
|
||||
if(is_array($data['replacements'])) {
|
||||
$replacements = array_merge($replacements, $this->cssFixreplacementurls($data['replacements'], $webbase));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return array(
|
||||
'stylesheets' => $stylesheets,
|
||||
'replacements' => $replacements
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Amend paths used in replacement relative urls, refer FS#2879
|
||||
*
|
||||
* @author Chris Smith <chris@jalakai.co.uk>
|
||||
*
|
||||
* @param array $replacements with key-value pairs
|
||||
* @param string $location
|
||||
* @return array
|
||||
*/
|
||||
protected function cssFixreplacementurls($replacements, $location) {
|
||||
foreach($replacements as $key => $value) {
|
||||
$replacements[$key] = preg_replace('#(url\([ \'"]*)(?!/|data:|http://|https://| |\'|")#','\\1'.$location,$value);
|
||||
}
|
||||
return $replacements;
|
||||
}
|
||||
}
|
|
@ -82,6 +82,7 @@ function load_autoload($name){
|
|||
'RemoteAPI' => DOKU_INC.'inc/remote.php',
|
||||
'RemoteAPICore' => DOKU_INC.'inc/RemoteAPICore.php',
|
||||
'Subscription' => DOKU_INC.'inc/subscription.php',
|
||||
'StyleUtil' => DOKU_INC.'inc/StyleUtil.php',
|
||||
|
||||
'DokuWiki_Action_Plugin' => DOKU_PLUGIN.'action.php',
|
||||
'DokuWiki_Admin_Plugin' => DOKU_PLUGIN.'admin.php',
|
||||
|
|
103
lib/exe/css.php
103
lib/exe/css.php
|
@ -45,7 +45,8 @@ function css_out(){
|
|||
if(!$tpl) $tpl = $conf['template'];
|
||||
|
||||
// load style.ini
|
||||
$styleini = css_styleini($tpl, $INPUT->bool('preview'));
|
||||
$styleUtil = new \dokuwiki\StyleUtils();
|
||||
$styleini = $styleUtil->cssStyleini($tpl, $INPUT->bool('preview'));
|
||||
|
||||
// cache influencers
|
||||
$tplinc = tpl_incdir($tpl);
|
||||
|
@ -264,106 +265,6 @@ function css_applystyle($css, $replacements) {
|
|||
return $css;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load style ini contents
|
||||
*
|
||||
* Loads and merges style.ini files from template and config and prepares
|
||||
* the stylesheet modes
|
||||
*
|
||||
* @author Andreas Gohr <andi@splitbrain.org>
|
||||
*
|
||||
* @param string $tpl the used template
|
||||
* @param bool $preview load preview replacements
|
||||
* @return array with keys 'stylesheets' and 'replacements'
|
||||
*/
|
||||
function css_styleini($tpl, $preview=false) {
|
||||
global $conf;
|
||||
|
||||
$stylesheets = array(); // mode, file => base
|
||||
// guaranteed placeholder => value
|
||||
$replacements = array(
|
||||
'__text__' => "#000",
|
||||
'__background__' => "#fff",
|
||||
'__text_alt__' => "#999",
|
||||
'__background_alt__' => "#eee",
|
||||
'__text_neu__' => "#666",
|
||||
'__background_neu__' => "#ddd",
|
||||
'__border__' => "#ccc",
|
||||
'__highlight__' => "#ff9",
|
||||
'__link__' => "#00f",
|
||||
);
|
||||
|
||||
// load template's style.ini
|
||||
$incbase = tpl_incdir($tpl);
|
||||
$webbase = tpl_basedir($tpl);
|
||||
$ini = $incbase.'style.ini';
|
||||
if(file_exists($ini)){
|
||||
$data = parse_ini_file($ini, true);
|
||||
|
||||
// stylesheets
|
||||
if(is_array($data['stylesheets'])) foreach($data['stylesheets'] as $file => $mode){
|
||||
$stylesheets[$mode][$incbase.$file] = $webbase;
|
||||
}
|
||||
|
||||
// replacements
|
||||
if(is_array($data['replacements'])){
|
||||
$replacements = array_merge($replacements, css_fixreplacementurls($data['replacements'],$webbase));
|
||||
}
|
||||
}
|
||||
|
||||
// load configs's style.ini
|
||||
$webbase = DOKU_BASE;
|
||||
$ini = DOKU_CONF."tpl/$tpl/style.ini";
|
||||
$incbase = dirname($ini).'/';
|
||||
if(file_exists($ini)){
|
||||
$data = parse_ini_file($ini, true);
|
||||
|
||||
// stylesheets
|
||||
if(isset($data['stylesheets']) && is_array($data['stylesheets'])) foreach($data['stylesheets'] as $file => $mode){
|
||||
$stylesheets[$mode][$incbase.$file] = $webbase;
|
||||
}
|
||||
|
||||
// replacements
|
||||
if(isset($data['replacements']) && is_array($data['replacements'])){
|
||||
$replacements = array_merge($replacements, css_fixreplacementurls($data['replacements'],$webbase));
|
||||
}
|
||||
}
|
||||
|
||||
// allow replacement overwrites in preview mode
|
||||
if($preview) {
|
||||
$webbase = DOKU_BASE;
|
||||
$ini = $conf['cachedir'].'/preview.ini';
|
||||
if(file_exists($ini)) {
|
||||
$data = parse_ini_file($ini, true);
|
||||
// replacements
|
||||
if(is_array($data['replacements'])) {
|
||||
$replacements = array_merge($replacements, css_fixreplacementurls($data['replacements'], $webbase));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return array(
|
||||
'stylesheets' => $stylesheets,
|
||||
'replacements' => $replacements
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Amend paths used in replacement relative urls, refer FS#2879
|
||||
*
|
||||
* @author Chris Smith <chris@jalakai.co.uk>
|
||||
*
|
||||
* @param array $replacements with key-value pairs
|
||||
* @param string $location
|
||||
* @return array
|
||||
*/
|
||||
function css_fixreplacementurls($replacements, $location) {
|
||||
foreach($replacements as $key => $value) {
|
||||
$replacements[$key] = preg_replace('#(url\([ \'"]*)(?!/|data:|http://|https://| |\'|")#','\\1'.$location,$value);
|
||||
}
|
||||
return $replacements;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper for the files, content and mediatype for the event CSS_STYLES_INCLUDED
|
||||
*
|
||||
|
|
|
@ -57,9 +57,9 @@ class admin_plugin_styling extends DokuWiki_Admin_Plugin {
|
|||
public function form() {
|
||||
global $conf;
|
||||
global $ID;
|
||||
define('SIMPLE_TEST', 1); // hack, ideally certain functions should be moved out of css.php
|
||||
require_once(DOKU_INC.'lib/exe/css.php');
|
||||
$styleini = css_styleini($conf['template'], true);
|
||||
|
||||
$styleUtil = new \dokuwiki\StyleUtils();
|
||||
$styleini = $styleUtil->cssStyleini($conf['template'], true);
|
||||
$replacements = $styleini['replacements'];
|
||||
|
||||
if($this->ispopup) {
|
||||
|
|
Loading…
Reference in New Issue