diff options
Diffstat (limited to 'platform/www/lib/plugins/styling/admin.php')
-rw-r--r-- | platform/www/lib/plugins/styling/admin.php | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/platform/www/lib/plugins/styling/admin.php b/platform/www/lib/plugins/styling/admin.php new file mode 100644 index 0000000..d454422 --- /dev/null +++ b/platform/www/lib/plugins/styling/admin.php @@ -0,0 +1,224 @@ +<?php +/** + * DokuWiki Plugin styling (Admin Component) + * + * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html + * @author Andreas Gohr <andi@splitbrain.org> + */ +class admin_plugin_styling extends DokuWiki_Admin_Plugin +{ + + public $ispopup = false; + + /** + * @return int sort number in admin menu + */ + public function getMenuSort() + { + return 1000; + } + + /** + * @return bool true if only access for superuser, false is for superusers and moderators + */ + public function forAdminOnly() + { + return true; + } + + /** + * handle the different actions (also called from ajax) + */ + public function handle() + { + global $INPUT; + $run = $INPUT->extract('run')->str('run'); + if (!$run) return; + $run = 'run'.ucfirst($run); + $this->$run(); + } + + /** + * Render HTML output, e.g. helpful text and a form + */ + public function html() + { + $class = 'nopopup'; + if ($this->ispopup) $class = 'ispopup page'; + + echo '<div id="plugin__styling" class="'.$class.'">'; + ptln('<h1>'.$this->getLang('menu').'</h1>'); + $this->form(); + echo '</div>'; + } + + /** + * Create the actual editing form + */ + public function form() + { + global $conf; + global $ID; + + $styleUtil = new \dokuwiki\StyleUtils($conf['template'], true, true); + $styleini = $styleUtil->cssStyleini(); + $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="'.$this->colorType($value).'" name="tpl['.hsc($key).']" id="tpl__'.hsc($key).'" + value="'.hsc($this->colorValue($value)).'" 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> '; + #FIXME only if preview.ini exists: + echo '<button type="submit" name="run[reset]">'.$this->getLang('btn_reset').'</button>'; + echo '</p>'; + + echo '<p>'; + echo '<button type="submit" name="run[save]" class="primary">'.$this->getLang('btn_save').'</button>'; + echo '</p>'; + + echo '<p>'; + #FIXME only if local.ini exists: + echo '<button type="submit" name="run[revert]">'.$this->getLang('btn_revert').'</button>'; + echo '</p>'; + + echo '</form>'; + + echo tpl_locale_xhtml('style'); + } + } + + /** + * Adjust three char color codes to the 6 char one supported by browser's color input + * + * @param string $value + * @return string + */ + protected function colorValue($value) + { + if (preg_match('/^#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])$/', $value, $match)) { + return '#' . $match[1] . $match[1] . $match[2] . $match[2] . $match[3] . $match[3]; + } + return $value; + } + + /** + * Decide the input type based on the value + * + * @param string $value + * @return string color|text + */ + protected function colorType($value) + { + if (preg_match('/^#([0-9a-fA-F]{3}){1,2}$/', $value)) { + return 'color'; + } else { + return 'text'; + } + } + + /** + * saves the preview.ini (alos called from ajax directly) + */ + public function runPreview() + { + global $conf; + $ini = $conf['cachedir'].'/preview.ini'; + io_saveFile($ini, $this->makeini()); + } + + /** + * deletes the preview.ini + */ + protected function runReset() + { + global $conf; + $ini = $conf['cachedir'].'/preview.ini'; + io_saveFile($ini, ''); + } + + /** + * deletes the local style.ini replacements + */ + protected function runRevert() + { + $this->replaceIni(''); + $this->runReset(); + } + + /** + * save the local style.ini replacements + */ + protected function runSave() + { + $this->replaceIni($this->makeini()); + $this->runReset(); + } + + /** + * create the replacement part of a style.ini from submitted data + * + * @return string + */ + protected function makeini() + { + global $INPUT; + + $ini = "[replacements]\n"; + $ini .= ";These overwrites have been generated from the Template styling Admin interface\n"; + $ini .= ";Any values in this section will be overwritten by that tool again\n"; + foreach ($INPUT->arr('tpl') as $key => $val) { + $ini .= $key.' = "'.addslashes($val).'"'."\n"; + } + + return $ini; + } + + /** + * replaces the replacement parts in the local ini + * + * @param string $new the new ini contents + */ + protected function replaceIni($new) + { + global $conf; + $ini = DOKU_CONF."tpl/".$conf['template']."/style.ini"; + if (file_exists($ini)) { + $old = io_readFile($ini); + $old = preg_replace('/\[replacements\]\n.*?(\n\[.*]|$)/s', '\\1', $old); + $old = trim($old); + } else { + $old = ''; + } + + io_makeFileDir($ini); + io_saveFile($ini, "$old\n\n$new"); + } +} + +// vim:ts=4:sw=4:et: |