1<?php 2 3namespace dokuwiki; 4 5class StyleUtils 6{ 7 /** 8 * Load style ini contents 9 * 10 * Loads and merges style.ini files from template and config and prepares 11 * the stylesheet modes 12 * 13 * @author Andreas Gohr <andi@splitbrain.org> 14 * 15 * @param string $tpl the used template 16 * @param bool $preview load preview replacements 17 * @return array with keys 'stylesheets' and 'replacements' 18 */ 19 public function cssStyleini($tpl, $preview=false) { 20 global $conf; 21 22 $stylesheets = array(); // mode, file => base 23 // guaranteed placeholder => value 24 $replacements = array( 25 '__text__' => "#000", 26 '__background__' => "#fff", 27 '__text_alt__' => "#999", 28 '__background_alt__' => "#eee", 29 '__text_neu__' => "#666", 30 '__background_neu__' => "#ddd", 31 '__border__' => "#ccc", 32 '__highlight__' => "#ff9", 33 '__link__' => "#00f", 34 ); 35 36 // load template's style.ini 37 $incbase = tpl_incdir($tpl); 38 $webbase = tpl_basedir($tpl); 39 $ini = $incbase.'style.ini'; 40 if(file_exists($ini)){ 41 $data = parse_ini_file($ini, true); 42 43 // stylesheets 44 if(is_array($data['stylesheets'])) foreach($data['stylesheets'] as $file => $mode){ 45 $stylesheets[$mode][$incbase.$file] = $webbase; 46 } 47 48 // replacements 49 if(is_array($data['replacements'])){ 50 $replacements = array_merge($replacements, $this->cssFixreplacementurls($data['replacements'],$webbase)); 51 } 52 } 53 54 // load configs's style.ini 55 $webbase = DOKU_BASE; 56 $ini = DOKU_CONF."tpl/$tpl/style.ini"; 57 $incbase = dirname($ini).'/'; 58 if(file_exists($ini)){ 59 $data = parse_ini_file($ini, true); 60 61 // stylesheets 62 if(isset($data['stylesheets']) && is_array($data['stylesheets'])) foreach($data['stylesheets'] as $file => $mode){ 63 $stylesheets[$mode][$incbase.$file] = $webbase; 64 } 65 66 // replacements 67 if(isset($data['replacements']) && is_array($data['replacements'])){ 68 $replacements = array_merge($replacements, $this->cssFixreplacementurls($data['replacements'],$webbase)); 69 } 70 } 71 72 // allow replacement overwrites in preview mode 73 if($preview) { 74 $webbase = DOKU_BASE; 75 $ini = $conf['cachedir'].'/preview.ini'; 76 if(file_exists($ini)) { 77 $data = parse_ini_file($ini, true); 78 // replacements 79 if(is_array($data['replacements'])) { 80 $replacements = array_merge($replacements, $this->cssFixreplacementurls($data['replacements'], $webbase)); 81 } 82 } 83 } 84 85 return array( 86 'stylesheets' => $stylesheets, 87 'replacements' => $replacements 88 ); 89 } 90 91 92 /** 93 * Amend paths used in replacement relative urls, refer FS#2879 94 * 95 * @author Chris Smith <chris@jalakai.co.uk> 96 * 97 * @param array $replacements with key-value pairs 98 * @param string $location 99 * @return array 100 */ 101 protected function cssFixreplacementurls($replacements, $location) { 102 foreach($replacements as $key => $value) { 103 $replacements[$key] = preg_replace('#(url\([ \'"]*)(?!/|data:|http://|https://| |\'|")#','\\1'.$location,$value); 104 } 105 return $replacements; 106 } 107} 108