1123bc813SAndreas Gohr<?php 2*8553d24dSAndreas Gohruse dokuwiki\Extension\AdminPlugin; 354cc7aa4SAndreas Gohruse dokuwiki\StyleUtils; 4123bc813SAndreas Gohr/** 5123bc813SAndreas Gohr * DokuWiki Plugin styling (Admin Component) 6123bc813SAndreas Gohr * 7123bc813SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 8123bc813SAndreas Gohr * @author Andreas Gohr <andi@splitbrain.org> 9123bc813SAndreas Gohr */ 10*8553d24dSAndreas Gohrclass admin_plugin_styling extends AdminPlugin 1171a75f04SAndreas Gohr{ 12123bc813SAndreas Gohr 136667cd87SAndreas Gohr public $ispopup = false; 146667cd87SAndreas Gohr 15123bc813SAndreas Gohr /** 16123bc813SAndreas Gohr * @return int sort number in admin menu 17123bc813SAndreas Gohr */ 1871a75f04SAndreas Gohr public function getMenuSort() 1971a75f04SAndreas Gohr { 20123bc813SAndreas Gohr return 1000; 21123bc813SAndreas Gohr } 22123bc813SAndreas Gohr 23123bc813SAndreas Gohr /** 24123bc813SAndreas Gohr * @return bool true if only access for superuser, false is for superusers and moderators 25123bc813SAndreas Gohr */ 2671a75f04SAndreas Gohr public function forAdminOnly() 2771a75f04SAndreas Gohr { 28123bc813SAndreas Gohr return true; 29123bc813SAndreas Gohr } 30123bc813SAndreas Gohr 31123bc813SAndreas Gohr /** 32123bc813SAndreas Gohr * handle the different actions (also called from ajax) 33123bc813SAndreas Gohr */ 3471a75f04SAndreas Gohr public function handle() 3571a75f04SAndreas Gohr { 36123bc813SAndreas Gohr global $INPUT; 37123bc813SAndreas Gohr $run = $INPUT->extract('run')->str('run'); 38123bc813SAndreas Gohr if (!$run) return; 3954bcc3a6SAndreas Gohr if(!checkSecurityToken()) return; 4071a75f04SAndreas Gohr $run = 'run'.ucfirst($run); 41123bc813SAndreas Gohr $this->$run(); 42123bc813SAndreas Gohr } 43123bc813SAndreas Gohr 44123bc813SAndreas Gohr /** 45123bc813SAndreas Gohr * Render HTML output, e.g. helpful text and a form 46123bc813SAndreas Gohr */ 4771a75f04SAndreas Gohr public function html() 4871a75f04SAndreas Gohr { 496667cd87SAndreas Gohr $class = 'nopopup'; 50d634152eSAnika Henke if ($this->ispopup) $class = 'ispopup page'; 516667cd87SAndreas Gohr 526667cd87SAndreas Gohr echo '<div id="plugin__styling" class="'.$class.'">'; 536667cd87SAndreas Gohr ptln('<h1>'.$this->getLang('menu').'</h1>'); 546667cd87SAndreas Gohr $this->form(); 55123bc813SAndreas Gohr echo '</div>'; 56123bc813SAndreas Gohr } 57123bc813SAndreas Gohr 58123bc813SAndreas Gohr /** 59123bc813SAndreas Gohr * Create the actual editing form 60123bc813SAndreas Gohr */ 6171a75f04SAndreas Gohr public function form() 6271a75f04SAndreas Gohr { 63123bc813SAndreas Gohr global $conf; 64123bc813SAndreas Gohr global $ID; 65fb1f9089SMichael Große 6654cc7aa4SAndreas Gohr $styleUtil = new StyleUtils($conf['template'], true, true); 674593dbd2SAnna Dabrowska $styleini = $styleUtil->cssStyleini(); 68123bc813SAndreas Gohr $replacements = $styleini['replacements']; 69123bc813SAndreas Gohr 706667cd87SAndreas Gohr if ($this->ispopup) { 716667cd87SAndreas Gohr $target = DOKU_BASE.'lib/plugins/styling/popup.php'; 72123bc813SAndreas Gohr } else { 7354cc7aa4SAndreas Gohr $target = wl($ID, ['do' => 'admin', 'page' => 'styling']); 74123bc813SAndreas Gohr } 75123bc813SAndreas Gohr 76123bc813SAndreas Gohr if (empty($replacements)) { 77123bc813SAndreas Gohr echo '<p class="error">'.$this->getLang('error').'</p>'; 78123bc813SAndreas Gohr } else { 79123bc813SAndreas Gohr echo $this->locale_xhtml('intro'); 80123bc813SAndreas Gohr 81123bc813SAndreas Gohr echo '<form class="styling" method="post" action="'.$target.'">'; 8254bcc3a6SAndreas Gohr formSecurityToken(); 83123bc813SAndreas Gohr 84d634152eSAnika Henke echo '<table><tbody>'; 85123bc813SAndreas Gohr foreach ($replacements as $key => $value) { 86123bc813SAndreas Gohr $name = tpl_getLang($key); 87123bc813SAndreas Gohr if (empty($name)) $name = $this->getLang($key); 88123bc813SAndreas Gohr if (empty($name)) $name = $key; 89123bc813SAndreas Gohr 90123bc813SAndreas Gohr echo '<tr>'; 91147d8f48SAnika Henke echo '<td><label for="tpl__'.hsc($key).'">'.$name.'</label></td>'; 9288c52daaSAndreas Gohr echo '<td><input type="'.$this->colorType($value).'" name="tpl['.hsc($key).']" id="tpl__'.hsc($key).'" 93626992acSMichael Große value="'.hsc($this->colorValue($value)).'" dir="ltr" required="required"/></td>'; 94123bc813SAndreas Gohr echo '</tr>'; 95123bc813SAndreas Gohr } 96d634152eSAnika Henke echo '</tbody></table>'; 97123bc813SAndreas Gohr 98418cb617SAndreas Gohr echo '<p>'; 9964159a61SAndreas Gohr echo '<button type="submit" name="run[preview]" class="btn_preview primary">'. 10064159a61SAndreas Gohr $this->getLang('btn_preview').'</button> '; 10164159a61SAndreas Gohr #FIXME only if preview.ini exists: 10264159a61SAndreas Gohr echo '<button type="submit" name="run[reset]">'.$this->getLang('btn_reset').'</button>'; 103123bc813SAndreas Gohr echo '</p>'; 104123bc813SAndreas Gohr 105418cb617SAndreas Gohr echo '<p>'; 106cf2c8e75SAnika Henke echo '<button type="submit" name="run[save]" class="primary">'.$this->getLang('btn_save').'</button>'; 107123bc813SAndreas Gohr echo '</p>'; 108123bc813SAndreas Gohr 109418cb617SAndreas Gohr echo '<p>'; 11064159a61SAndreas Gohr #FIXME only if local.ini exists: 11164159a61SAndreas Gohr echo '<button type="submit" name="run[revert]">'.$this->getLang('btn_revert').'</button>'; 112123bc813SAndreas Gohr echo '</p>'; 113123bc813SAndreas Gohr 114123bc813SAndreas Gohr echo '</form>'; 115123bc813SAndreas Gohr 116123bc813SAndreas Gohr echo tpl_locale_xhtml('style'); 117123bc813SAndreas Gohr } 118123bc813SAndreas Gohr } 119123bc813SAndreas Gohr 120123bc813SAndreas Gohr /** 1217ef28ec1SAndreas Gohr * Adjust three char color codes to the 6 char one supported by browser's color input 1227ef28ec1SAndreas Gohr * 1237ef28ec1SAndreas Gohr * @param string $value 1247ef28ec1SAndreas Gohr * @return string 1257ef28ec1SAndreas Gohr */ 1267ef28ec1SAndreas Gohr protected function colorValue($value) 1277ef28ec1SAndreas Gohr { 1287ef28ec1SAndreas Gohr if (preg_match('/^#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])$/', $value, $match)) { 1297ef28ec1SAndreas Gohr return '#' . $match[1] . $match[1] . $match[2] . $match[2] . $match[3] . $match[3]; 1307ef28ec1SAndreas Gohr } 1317ef28ec1SAndreas Gohr return $value; 1327ef28ec1SAndreas Gohr } 1337ef28ec1SAndreas Gohr 1347ef28ec1SAndreas Gohr /** 13588c52daaSAndreas Gohr * Decide the input type based on the value 1363465db0cSAndreas Gohr * 13788c52daaSAndreas Gohr * @param string $value 1383465db0cSAndreas Gohr * @return string color|text 139123bc813SAndreas Gohr */ 14088c52daaSAndreas Gohr protected function colorType($value) 14171a75f04SAndreas Gohr { 14288c52daaSAndreas Gohr if (preg_match('/^#([0-9a-fA-F]{3}){1,2}$/', $value)) { 1433465db0cSAndreas Gohr return 'color'; 144123bc813SAndreas Gohr } else { 1453465db0cSAndreas Gohr return 'text'; 146123bc813SAndreas Gohr } 147123bc813SAndreas Gohr } 148123bc813SAndreas Gohr 149123bc813SAndreas Gohr /** 150123bc813SAndreas Gohr * saves the preview.ini (alos called from ajax directly) 151123bc813SAndreas Gohr */ 15271a75f04SAndreas Gohr public function runPreview() 15371a75f04SAndreas Gohr { 154123bc813SAndreas Gohr global $conf; 155123bc813SAndreas Gohr $ini = $conf['cachedir'].'/preview.ini'; 156123bc813SAndreas Gohr io_saveFile($ini, $this->makeini()); 157123bc813SAndreas Gohr } 158123bc813SAndreas Gohr 159123bc813SAndreas Gohr /** 160123bc813SAndreas Gohr * deletes the preview.ini 161123bc813SAndreas Gohr */ 16271a75f04SAndreas Gohr protected function runReset() 16371a75f04SAndreas Gohr { 164123bc813SAndreas Gohr global $conf; 165123bc813SAndreas Gohr $ini = $conf['cachedir'].'/preview.ini'; 166123bc813SAndreas Gohr io_saveFile($ini, ''); 167123bc813SAndreas Gohr } 168123bc813SAndreas Gohr 169123bc813SAndreas Gohr /** 170123bc813SAndreas Gohr * deletes the local style.ini replacements 171123bc813SAndreas Gohr */ 17271a75f04SAndreas Gohr protected function runRevert() 17371a75f04SAndreas Gohr { 17471a75f04SAndreas Gohr $this->replaceIni(''); 17571a75f04SAndreas Gohr $this->runReset(); 176123bc813SAndreas Gohr } 177123bc813SAndreas Gohr 178123bc813SAndreas Gohr /** 179123bc813SAndreas Gohr * save the local style.ini replacements 180123bc813SAndreas Gohr */ 18171a75f04SAndreas Gohr protected function runSave() 18271a75f04SAndreas Gohr { 18371a75f04SAndreas Gohr $this->replaceIni($this->makeini()); 18471a75f04SAndreas Gohr $this->runReset(); 185123bc813SAndreas Gohr } 186123bc813SAndreas Gohr 187123bc813SAndreas Gohr /** 188123bc813SAndreas Gohr * create the replacement part of a style.ini from submitted data 189123bc813SAndreas Gohr * 190123bc813SAndreas Gohr * @return string 191123bc813SAndreas Gohr */ 19271a75f04SAndreas Gohr protected function makeini() 19371a75f04SAndreas Gohr { 194123bc813SAndreas Gohr global $INPUT; 195123bc813SAndreas Gohr 196123bc813SAndreas Gohr $ini = "[replacements]\n"; 197123bc813SAndreas Gohr $ini .= ";These overwrites have been generated from the Template styling Admin interface\n"; 198123bc813SAndreas Gohr $ini .= ";Any values in this section will be overwritten by that tool again\n"; 199123bc813SAndreas Gohr foreach ($INPUT->arr('tpl') as $key => $val) { 200123bc813SAndreas Gohr $ini .= $key.' = "'.addslashes($val).'"'."\n"; 201123bc813SAndreas Gohr } 202123bc813SAndreas Gohr 203123bc813SAndreas Gohr return $ini; 204123bc813SAndreas Gohr } 205123bc813SAndreas Gohr 206123bc813SAndreas Gohr /** 207123bc813SAndreas Gohr * replaces the replacement parts in the local ini 208123bc813SAndreas Gohr * 209123bc813SAndreas Gohr * @param string $new the new ini contents 210123bc813SAndreas Gohr */ 21171a75f04SAndreas Gohr protected function replaceIni($new) 21271a75f04SAndreas Gohr { 213123bc813SAndreas Gohr global $conf; 214123bc813SAndreas Gohr $ini = DOKU_CONF."tpl/".$conf['template']."/style.ini"; 215123bc813SAndreas Gohr if (file_exists($ini)) { 216123bc813SAndreas Gohr $old = io_readFile($ini); 217123bc813SAndreas Gohr $old = preg_replace('/\[replacements\]\n.*?(\n\[.*]|$)/s', '\\1', $old); 218123bc813SAndreas Gohr $old = trim($old); 219123bc813SAndreas Gohr } else { 220123bc813SAndreas Gohr $old = ''; 221123bc813SAndreas Gohr } 222123bc813SAndreas Gohr 223123bc813SAndreas Gohr io_makeFileDir($ini); 224123bc813SAndreas Gohr io_saveFile($ini, "$old\n\n$new"); 225123bc813SAndreas Gohr } 226123bc813SAndreas Gohr} 227123bc813SAndreas Gohr 228123bc813SAndreas Gohr// vim:ts=4:sw=4:et: 229