/** * Create the actual editing form */ 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); $replacements = $styleini['replacements']; if ($this->ispopup) { $target = DOKU_BASE . 'lib/plugins/styling/popup.php'; } else { $target = wl($ID, array('do' => 'admin', 'page' => 'styling')); } if (empty($replacements)) { echo '<p class="error">' . $this->getLang('error') . '</p>'; } else { echo $this->locale_xhtml('intro'); echo '<form class="styling" method="post" action="' . $target . '">'; echo '<table><tbody>'; foreach ($replacements as $key => $value) { $name = tpl_getLang($key); if (empty($name)) { $name = $this->getLang($key); } if (empty($name)) { $name = $key; } echo '<tr>'; echo '<td><label for="tpl__' . hsc($key) . '">' . $name . '</label></td>'; echo '<td><input type="text" name="tpl[' . hsc($key) . ']" id="tpl__' . hsc($key) . '" value="' . hsc($value) . '" ' . $this->colorClass($key) . ' dir="ltr" /></td>'; echo '</tr>'; } echo '</tbody></table>'; echo '<p>'; echo '<button type="submit" name="run[preview]" class="btn_preview primary">' . $this->getLang('btn_preview') . '</button> '; echo '<button type="submit" name="run[reset]">' . $this->getLang('btn_reset') . '</button>'; #FIXME only if preview.ini exists echo '</p>'; echo '<p>'; echo '<button type="submit" name="run[save]" class="primary">' . $this->getLang('btn_save') . '</button>'; echo '</p>'; echo '<p>'; echo '<button type="submit" name="run[revert]">' . $this->getLang('btn_revert') . '</button>'; #FIXME only if local.ini exists echo '</p>'; echo '</form>'; echo tpl_locale_xhtml('style'); } }
/** * Load all the style sheets and apply the needed replacements * @param $plugin_name * @param $format * @param $template * @return string */ public function load($plugin_name, $format, $template) { global $conf; //reusue the CSS dispatcher functions without triggering the main function define('SIMPLE_TEST', 1); require_once DOKU_INC . 'lib/exe/css.php'; // Always only use small letters in format $format = strtolower($format); // prepare CSS files $files = array_merge(array(DOKU_INC . 'lib/styles/screen.css' => DOKU_BASE . 'lib/styles/', DOKU_INC . 'lib/styles/print.css' => DOKU_BASE . 'lib/styles/'), css_pluginstyles('all'), $this->css_pluginFormatStyles($format), array(DOKU_PLUGIN . $plugin_name . '/conf/style.css' => DOKU_BASE . 'lib/plugins/' . $plugin_name . '/conf/', DOKU_PLUGIN . $plugin_name . '/tpl/' . $template . '/style.css' => DOKU_BASE . 'lib/plugins/' . $plugin_name . '/tpl/' . $template . '/', DOKU_PLUGIN . $plugin_name . '/conf/style.local.css' => DOKU_BASE . 'lib/plugins/' . $plugin_name . '/conf/')); $css = ''; foreach ($files as $file => $location) { $display = str_replace(fullpath(DOKU_INC), '', fullpath($file)); $css_content = "\n/* XXXXXXXXX {$display} XXXXXXXXX */\n"; $css_content = css_loadfile($file, $location); if (strpos($file, 'screen.css') !== false) { $css .= "\n@media screen {\n" . $css_content . "\n}\n"; } else { if (strpos($file, 'style.css') !== false) { $css .= "\n@media screen {\n" . $css_content . "\n}\n"; } else { if (strpos($file, $format . '.css') !== false) { $css .= "\n@media print {\n" . $css_content . "\n}\n"; } else { if (strpos($file, 'print.css') !== false) { $css .= "\n@media print {\n" . $css_content . "\n}\n"; } else { $css .= $css_content; } } } } } if (function_exists('css_parseless')) { // apply pattern replacements $styleini = css_styleini($conf['template']); $css = css_applystyle($css, $styleini['replacements']); // parse less $css = css_parseless($css); } else { // @deprecated 2013-12-19: fix backward compatibility $css = css_applystyle($css, DOKU_INC . 'lib/tpl/' . $conf['template'] . '/'); } return $css; }
/** * Output all needed Styles * * @author Andreas Gohr <*****@*****.**> */ function css_out() { global $conf; global $lang; global $config_cascade; global $INPUT; if ($INPUT->str('s') == 'feed') { $mediatypes = array('feed'); $type = 'feed'; } else { $mediatypes = array('screen', 'all', 'print'); $type = ''; } // decide from where to get the template $tpl = trim(preg_replace('/[^\\w-]+/', '', $INPUT->str('t'))); if (!$tpl) { $tpl = $conf['template']; } // The generated script depends on some dynamic options $cache = new cache('styles' . $_SERVER['HTTP_HOST'] . $_SERVER['SERVER_PORT'] . $INPUT->int('preview') . DOKU_BASE . $tpl . $type, '.css'); // load styl.ini $styleini = css_styleini($tpl, $INPUT->bool('preview')); // cache influencers $tplinc = tpl_incdir($tpl); $cache_files = getConfigFiles('main'); $cache_files[] = $tplinc . 'style.ini'; $cache_files[] = DOKU_CONF . "tpl/{$tpl}/style.ini"; $cache_files[] = __FILE__; if ($INPUT->bool('preview')) { $cache_files[] = $conf['cachedir'] . '/preview.ini'; } // Array of needed files and their web locations, the latter ones // are needed to fix relative paths in the stylesheets $files = array(); foreach ($mediatypes as $mediatype) { $files[$mediatype] = array(); // load core styles $files[$mediatype][DOKU_INC . 'lib/styles/' . $mediatype . '.css'] = DOKU_BASE . 'lib/styles/'; // load jQuery-UI theme if ($mediatype == 'screen') { $files[$mediatype][DOKU_INC . 'lib/scripts/jquery/jquery-ui-theme/smoothness.css'] = DOKU_BASE . 'lib/scripts/jquery/jquery-ui-theme/'; } // load plugin styles $files[$mediatype] = array_merge($files[$mediatype], css_pluginstyles($mediatype)); // load template styles if (isset($styleini['stylesheets'][$mediatype])) { $files[$mediatype] = array_merge($files[$mediatype], $styleini['stylesheets'][$mediatype]); } // load user styles if (!empty($config_cascade['userstyle'][$mediatype])) { foreach ($config_cascade['userstyle'][$mediatype] as $userstyle) { $files[$mediatype][$userstyle] = DOKU_BASE; } } $cache_files = array_merge($cache_files, array_keys($files[$mediatype])); } // check cache age & handle conditional request // This may exit if a cache can be used http_cached($cache->cache, $cache->useCache(array('files' => $cache_files))); // start output buffering ob_start(); // build the stylesheet foreach ($mediatypes as $mediatype) { // print the default classes for interwiki links and file downloads if ($mediatype == 'screen') { print '@media screen {'; css_interwiki(); css_filetypes(); print '}'; } // 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) { case 'screen': print NL . '@media screen { /* START screen styles */' . NL . $css_content . NL . '} /* /@media END screen styles */' . NL; break; case 'print': print NL . '@media print { /* START print styles */' . NL . $css_content . NL . '} /* /@media END print styles */' . NL; break; case 'all': case 'feed': default: print NL . '/* START rest styles */ ' . NL . $css_content . NL . '/* END rest styles */' . NL; break; } } // end output buffering and get contents $css = ob_get_contents(); ob_end_clean(); // strip any source maps stripsourcemaps($css); // apply style replacements $css = css_applystyle($css, $styleini['replacements']); // parse less $css = css_parseless($css); // compress whitespace and comments if ($conf['compress']) { $css = css_compress($css); } // embed small images right into the stylesheet if ($conf['cssdatauri']) { $base = preg_quote(DOKU_BASE, '#'); $css = preg_replace_callback('#(url\\([ \'"]*)(' . $base . ')(.*?(?:\\.(png|gif)))#i', 'css_datauri', $css); } http_cached_finish($cache->cache, $css); }
/** * Load all the style sheets and apply the needed replacements */ protected function load_css() { global $conf; //reusue the CSS dispatcher functions without triggering the main function define('SIMPLE_TEST', 1); require_once DOKU_INC . 'lib/exe/css.php'; // prepare CSS files $files = array_merge(array(DOKU_INC . 'lib/styles/screen.css' => DOKU_BASE . 'lib/styles/', DOKU_INC . 'lib/styles/print.css' => DOKU_BASE . 'lib/styles/'), css_pluginstyles('all'), $this->css_pluginPDFstyles(), array(DOKU_PLUGIN . 'dw2pdf/conf/style.css' => DOKU_BASE . 'lib/plugins/dw2pdf/conf/', DOKU_PLUGIN . 'dw2pdf/tpl/' . $this->tpl . '/style.css' => DOKU_BASE . 'lib/plugins/dw2pdf/tpl/' . $this->tpl . '/', DOKU_PLUGIN . 'dw2pdf/conf/style.local.css' => DOKU_BASE . 'lib/plugins/dw2pdf/conf/')); $css = ''; foreach ($files as $file => $location) { $display = str_replace(fullpath(DOKU_INC), '', fullpath($file)); $css .= "\n/* XXXXXXXXX {$display} XXXXXXXXX */\n"; $css .= css_loadfile($file, $location); } if (function_exists('css_parseless')) { // apply pattern replacements $styleini = css_styleini($conf['template']); $css = css_applystyle($css, $styleini['replacements']); // parse less $css = css_parseless($css); } else { // @deprecated 2013-12-19: fix backward compatibility $css = css_applystyle($css, DOKU_INC . 'lib/tpl/' . $conf['template'] . '/'); } return $css; }
/** * Output all needed Styles * * @author Andreas Gohr <*****@*****.**> */ function epub_css_out($path) { global $conf; global $lang; global $config_cascade; global $INPUT; $mediatypes = array('screen', 'all'); $type = ''; // decide from where to get the template $tpl = trim(preg_replace('/[^\\w-]+/', '', $INPUT->str('t'))); if (!$tpl) { $tpl = $conf['template']; } // load styl.ini $styleini = css_styleini($tpl); // if old 'default' userstyle setting exists, make it 'screen' userstyle for backwards compatibility if (isset($config_cascade['userstyle']['default'])) { $config_cascade['userstyle']['screen'] = $config_cascade['userstyle']['default']; } // Array of needed files and their web locations, the latter ones // are needed to fix relative paths in the stylesheets $files = array(); foreach ($mediatypes as $mediatype) { $files[$mediatype] = array(); // load core styles $files[$mediatype][DOKU_INC . 'lib/styles/' . $mediatype . '.css'] = DOKU_BASE . 'lib/styles/'; // load jQuery-UI theme if ($mediatype == 'screen') { $files[$mediatype][DOKU_INC . 'lib/scripts/jquery/jquery-ui-theme/smoothness.css'] = DOKU_BASE . 'lib/scripts/jquery/jquery-ui-theme/'; } // load plugin styles $files[$mediatype] = array_merge($files[$mediatype], css_pluginstyles($mediatype)); // load template styles if (isset($styleini['stylesheets'][$mediatype])) { $files[$mediatype] = array_merge($files[$mediatype], $styleini['stylesheets'][$mediatype]); } // load user styles if (isset($config_cascade['userstyle'][$mediatype])) { $files[$mediatype][$config_cascade['userstyle'][$mediatype]] = DOKU_BASE; } } $css = ""; // build the stylesheet foreach ($mediatypes as $mediatype) { // print the default classes for interwiki links and file downloads if ($mediatype == 'screen') { $css .= '@media screen {'; css_interwiki($css); css_filetypes($css); $css .= '}'; } // 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) { case 'screen': $css .= NL . '@media screen { /* START screen styles */' . NL . $css_content . NL . '} /* /@media END screen styles */' . NL; break; case 'all': default: $css .= NL . '/* START rest styles */ ' . NL . $css_content . NL . '/* END rest styles */' . NL; break; } } // apply style replacements $css .= css_applystyle($css, $styleini['replacements']); // parse less $css = css_parseless($css); // embed small images right into the stylesheet if ($conf['cssdatauri']) { $base = preg_quote(DOKU_BASE, '#'); $css = preg_replace_callback('#(url\\([ \'"]*)(' . $base . ')(.*?(?:\\.(png|gif)))#i', 'css_datauri', $css); } io_saveFile($path . 'Styles/style.css', $css); }
/** * Does placeholder replacements in the style according to * the ones defined in a templates style.ini file * * @author Andreas Gohr <*****@*****.**> */ function css_applystyle($css, $tplinc) { $styleini = css_styleini($tplinc); if ($styleini) { $css = strtr($css, $styleini['replacements']); } return $css; }
tr:hover td { border: 1px solid #ccc; } .color { padding: 0.25em 1em; border: 1px #000 solid; } </style> </head> <body> <?php // get merged style.ini define('SIMPLE_TEST', true); // hack to prevent css output and headers require_once DOKU_INC . 'lib/exe/css.php'; $ini = css_styleini($conf['template']); if ($ini) { echo '<table>'; echo "<caption>" . htmlspecialchars($conf['template']) . "'s style.ini</caption>"; foreach ($ini['replacements'] as $key => $val) { echo '<tr>'; echo '<td>' . htmlspecialchars($key) . '</td>'; echo '<td>' . htmlspecialchars($val) . '</td>'; echo '<td>'; if (preg_match('/^#[0-f]{3,6}$/i', $val)) { echo '<div class="color" style="background-color:' . $val . ';"> </div>'; } echo '</td>'; echo '</tr>'; } echo '</table>';
tr:hover td { border: 1px solid #ccc; } .color { padding: 0.25em 1em; border: 1px #000 solid; } </style> </head> <body> <?php // get merged style.ini define('SIMPLE_TEST', true); // hack to prevent css output and headers require_once DOKU_INC . 'lib/exe/css.php'; $ini = css_styleini(tpl_incdir()); if ($ini) { echo '<table>'; echo "<caption>" . htmlspecialchars($conf['template']) . "'s style.ini</caption>"; foreach ($ini['replacements'] as $key => $val) { echo '<tr>'; echo '<td>' . htmlspecialchars($key) . '</td>'; echo '<td>' . htmlspecialchars($val) . '</td>'; echo '<td>'; if (preg_match('/^#[0-f]{3,6}$/i', $val)) { echo '<div class="color" style="background-color:' . $val . ';"> </div>'; } echo '</td>'; echo '</tr>'; } echo '</table>';