summaryrefslogtreecommitdiff
path: root/lib/exe/css.php
diff options
context:
space:
mode:
authorAndreas Gohr <andi@splitbrain.org>2013-08-02 21:59:16 +0200
committerAndreas Gohr <andi@splitbrain.org>2013-08-02 21:59:16 +0200
commit9b81fefec2f6a24c9585f505b42350849a5a045e (patch)
tree387442db7be9ebb48fb1aa51708dd4b0d45f80ec /lib/exe/css.php
parent395e7d8e1e303ae87be5d88abc67947b89e1a5a4 (diff)
parent72a66eb76026e69cd4554035a010693d6ae017ad (diff)
downloadrpg-9b81fefec2f6a24c9585f505b42350849a5a045e.tar.gz
rpg-9b81fefec2f6a24c9585f505b42350849a5a045e.tar.bz2
Merge branch 'less'
* less: check less compilation for errors removed possibility to have rtl.less files in plugins switched to LESS variables in rest of template's css files unlessified and lessified a few more css fixed broken structure removed debug statement. sorry convert ini replacements to less vars first make sure calculations are correct lessified more files lessyfied another one lessyfied the first of template's CSS files fixed ini replacement to less variables stuff added missing lessc library add LESS support Conflicts: inc/load.php lib/tpl/dokuwiki/css/basic.less
Diffstat (limited to 'lib/exe/css.php')
-rw-r--r--lib/exe/css.php82
1 files changed, 80 insertions, 2 deletions
diff --git a/lib/exe/css.php b/lib/exe/css.php
index 768c8eda4..83972d407 100644
--- a/lib/exe/css.php
+++ b/lib/exe/css.php
@@ -131,6 +131,8 @@ function css_out(){
// load files
$css_content = '';
foreach($files[$mediatype] as $file => $location){
+ $display = str_replace(fullpath(DOKU_INC), '', fullpath($file));
+ $css_content .= "\n/* XXXXXXXXX $display XXXXXXXXX */\n";
$css_content .= css_loadfile($file, $location);
}
switch ($mediatype) {
@@ -154,7 +156,10 @@ function css_out(){
// apply style replacements
$css = css_applystyle($css,$tplinc);
- // place all @import statements at the top of the file
+ // parse less
+ $css = css_parseless($css);
+
+ // place all remaining @import statements at the top of the file
$css = css_moveimports($css);
// compress whitespace and comments
@@ -172,16 +177,87 @@ function css_out(){
}
/**
+ * Uses phpless to parse LESS in our CSS
+ *
+ * most of this function is error handling to show a nice useful error when
+ * LESS compilation fails
+ *
+ * @param $css
+ * @return string
+ */
+function css_parseless($css) {
+ $less = new lessc();
+ try {
+ return $less->compile($css);
+ } catch(Exception $e) {
+ // get exception message
+ $msg = str_replace(array("\n", "\r", "'"), array(), $e->getMessage());
+
+ // try to use line number to find affected file
+ if(preg_match('/line: (\d+)$/', $msg, $m)){
+ $msg = substr($msg, 0, -1* strlen($m[0])); //remove useless linenumber
+ $lno = $m[1];
+
+ // walk upwards to last include
+ $lines = explode("\n", $css);
+ $count = count($lines);
+ for($i=$lno-1; $i>=0; $i--){
+ if(preg_match('/\/(\* XXXXXXXXX )(.*?)( XXXXXXXXX \*)\//', $lines[$i], $m)){
+ // we found it, add info to message
+ $msg .= ' in '.$m[2].' at line '.($lno-$i);
+ break;
+ }
+ }
+ }
+
+ // something went wrong
+ $error = 'A fatal error occured during compilation of the CSS files. '.
+ 'If you recently installed a new plugin or template it '.
+ 'might be broken and you should try disabling it again. ['.$msg.']';
+
+ echo ".dokuwiki:before {
+ content: '$error';
+ background-color: red;
+ display: block;
+ background-color: #fcc;
+ border-color: #ebb;
+ color: #000;
+ padding: 0.5em;
+ }";
+
+ exit;
+ }
+}
+
+/**
* Does placeholder replacements in the style according to
* the ones defined in a templates style.ini file
*
+ * This also adds the ini defined placeholders as less variables
+ * (sans the surrounding __ and with a ini_ prefix)
+ *
* @author Andreas Gohr <andi@splitbrain.org>
*/
function css_applystyle($css,$tplinc){
$styleini = css_styleini($tplinc);
if($styleini){
- $css = strtr($css,$styleini['replacements']);
+ // we convert ini replacements to LESS variable names
+ // and build a list of variable: value; pairs
+ $less = '';
+ foreach($styleini['replacements'] as $key => $value){
+ $lkey = trim($key, '_');
+ $lkey = '@ini_'.$lkey;
+ $less .= "$lkey: $value;\n";
+
+ $styleini['replacements'][$key] = $lkey;
+ }
+
+ // we now replace all old ini replacements with LESS variables
+ $css = strtr($css, $styleini['replacements']);
+
+ // now prepend the list of LESS variables as the very first thing
+ $css = $less.$css;
}
return $css;
}
@@ -333,9 +409,11 @@ function css_pluginstyles($mediatype='screen'){
$plugins = plugin_list();
foreach ($plugins as $p){
$list[DOKU_PLUGIN."$p/$mediatype.css"] = DOKU_BASE."lib/plugins/$p/";
+ $list[DOKU_PLUGIN."$p/$mediatype.less"] = DOKU_BASE."lib/plugins/$p/";
// alternative for screen.css
if ($mediatype=='screen') {
$list[DOKU_PLUGIN."$p/style.css"] = DOKU_BASE."lib/plugins/$p/";
+ $list[DOKU_PLUGIN."$p/style.less"] = DOKU_BASE."lib/plugins/$p/";
}
// @deprecated 2012-04-09: rtl will cease to be a mode of its own,
// please use "[dir=rtl]" in any css file in all, screen or print mode instead