125dd2a2fSSatoshi Sahara<?php 225dd2a2fSSatoshi Sahara 325dd2a2fSSatoshi Saharanamespace dokuwiki\Ui; 425dd2a2fSSatoshi Sahara 5*79a2d784SGerrit Uitslaguse dokuwiki\Draft; 625dd2a2fSSatoshi Saharause dokuwiki\Extension\Event; 725dd2a2fSSatoshi Saharause dokuwiki\Form\Form; 825dd2a2fSSatoshi Sahara 925dd2a2fSSatoshi Sahara/** 1025dd2a2fSSatoshi Sahara * DokuWiki Page Editor 1125dd2a2fSSatoshi Sahara * 1225dd2a2fSSatoshi Sahara * @package dokuwiki\Ui 1325dd2a2fSSatoshi Sahara */ 1425dd2a2fSSatoshi Saharaclass Editor extends Ui 1525dd2a2fSSatoshi Sahara{ 1625dd2a2fSSatoshi Sahara /** 1725dd2a2fSSatoshi Sahara * Display the Edit Window 1825dd2a2fSSatoshi Sahara * preprocess edit form data 1925dd2a2fSSatoshi Sahara * 2025dd2a2fSSatoshi Sahara * @author Andreas Gohr <andi@splitbrain.org> 2125dd2a2fSSatoshi Sahara * 2209e982a8SSatoshi Sahara * @triggers EDIT_FORM_ADDTEXTAREA 2325dd2a2fSSatoshi Sahara * @return void 2425dd2a2fSSatoshi Sahara */ 2525dd2a2fSSatoshi Sahara public function show() 2625dd2a2fSSatoshi Sahara { 2725dd2a2fSSatoshi Sahara global $INPUT; 2825dd2a2fSSatoshi Sahara global $ID; 2925dd2a2fSSatoshi Sahara global $REV; 3025dd2a2fSSatoshi Sahara global $DATE; 3125dd2a2fSSatoshi Sahara global $PRE; 3225dd2a2fSSatoshi Sahara global $SUF; 3325dd2a2fSSatoshi Sahara global $INFO; 3425dd2a2fSSatoshi Sahara global $SUM; 3525dd2a2fSSatoshi Sahara global $lang; 3625dd2a2fSSatoshi Sahara global $conf; 3725dd2a2fSSatoshi Sahara global $TEXT; 3825dd2a2fSSatoshi Sahara 3925dd2a2fSSatoshi Sahara global $license; 4025dd2a2fSSatoshi Sahara 4125dd2a2fSSatoshi Sahara if ($INPUT->has('changecheck')) { 4225dd2a2fSSatoshi Sahara $check = $INPUT->str('changecheck'); 4325dd2a2fSSatoshi Sahara } elseif (!$INFO['exists']) { 4425dd2a2fSSatoshi Sahara // $TEXT has been loaded from page template 4525dd2a2fSSatoshi Sahara $check = md5(''); 4625dd2a2fSSatoshi Sahara } else { 4725dd2a2fSSatoshi Sahara $check = md5($TEXT); 4825dd2a2fSSatoshi Sahara } 4925dd2a2fSSatoshi Sahara $mod = (md5($TEXT) !== $check); 5025dd2a2fSSatoshi Sahara 5125dd2a2fSSatoshi Sahara $wr = $INFO['writable'] && !$INFO['locked']; 5225dd2a2fSSatoshi Sahara 5325dd2a2fSSatoshi Sahara // intro locale text (edit, rditrev, or read) 5425dd2a2fSSatoshi Sahara if ($wr) { 5525dd2a2fSSatoshi Sahara $intro = ($REV) ? 'editrev' : 'edit'; 5625dd2a2fSSatoshi Sahara } else { 5725dd2a2fSSatoshi Sahara // check pseudo action 'source' 5825dd2a2fSSatoshi Sahara if (!actionOK('source')) { 5925dd2a2fSSatoshi Sahara msg('Command disabled: source', -1); 6025dd2a2fSSatoshi Sahara return; 6125dd2a2fSSatoshi Sahara } 6225dd2a2fSSatoshi Sahara $intro = 'read'; 6325dd2a2fSSatoshi Sahara } 6425dd2a2fSSatoshi Sahara 6525dd2a2fSSatoshi Sahara // create the Editor form 661e6e7b77SSatoshi Sahara $form = new Form(['id' => 'dw__editform']); 6725dd2a2fSSatoshi Sahara $form->setHiddenField('id', $ID); 6825dd2a2fSSatoshi Sahara $form->setHiddenField('rev', $REV); 6925dd2a2fSSatoshi Sahara $form->setHiddenField('date', $DATE); 7025dd2a2fSSatoshi Sahara $form->setHiddenField('prefix', $PRE .'.'); 7125dd2a2fSSatoshi Sahara $form->setHiddenField('suffix', $SUF); 7225dd2a2fSSatoshi Sahara $form->setHiddenField('changecheck', $check); 7325dd2a2fSSatoshi Sahara 74bafe7468SSatoshi Sahara // prepare data for EDIT_FORM_ALTERNATE event 7525dd2a2fSSatoshi Sahara $data = array( 7625dd2a2fSSatoshi Sahara 'form' => $form, 7725dd2a2fSSatoshi Sahara 'wr' => $wr, 7825dd2a2fSSatoshi Sahara 'media_manager' => true, 7925dd2a2fSSatoshi Sahara 'target' => ($INPUT->has('target') && $wr) ? $INPUT->str('target') : 'section', 8025dd2a2fSSatoshi Sahara 'intro_locale' => $intro, 8125dd2a2fSSatoshi Sahara ); 8225dd2a2fSSatoshi Sahara 8325dd2a2fSSatoshi Sahara if ($data['target'] !== 'section') { 8425dd2a2fSSatoshi Sahara // Only emit event if page is writable, section edit data is valid and 8525dd2a2fSSatoshi Sahara // edit target is not section. 8609e982a8SSatoshi Sahara Event::createAndTrigger('EDIT_FORM_ADDTEXTAREA', $data, [$this,'addTextarea'], true); 8725dd2a2fSSatoshi Sahara } else { 8825dd2a2fSSatoshi Sahara $this->addTextarea($data); 8925dd2a2fSSatoshi Sahara } 9025dd2a2fSSatoshi Sahara 9125dd2a2fSSatoshi Sahara $form->setHiddenField('target', $data['target']); 9225dd2a2fSSatoshi Sahara 9325dd2a2fSSatoshi Sahara if ($INPUT->has('hid')) { 9425dd2a2fSSatoshi Sahara $form->setHiddenField('hid', $INPUT->str('hid')); 9525dd2a2fSSatoshi Sahara } 9625dd2a2fSSatoshi Sahara if ($INPUT->has('codeblockOffset')) { 9725dd2a2fSSatoshi Sahara $form->setHiddenField('codeblockOffset', $INPUT->str('codeblockOffset')); 9825dd2a2fSSatoshi Sahara } 9925dd2a2fSSatoshi Sahara 10025dd2a2fSSatoshi Sahara $form->addTagOpen('div')->id('wiki__editbar')->addClass('editBar'); 10125dd2a2fSSatoshi Sahara 10225dd2a2fSSatoshi Sahara $form->addTagOpen('div')->id('size__ctl'); 10325dd2a2fSSatoshi Sahara $form->addTagClose('div'); 10425dd2a2fSSatoshi Sahara 10525dd2a2fSSatoshi Sahara if ($wr) { 10625dd2a2fSSatoshi Sahara // add edit buttons: save, preview, cancel 10725dd2a2fSSatoshi Sahara $form->addTagOpen('div')->addClass('editButtons'); 10825dd2a2fSSatoshi Sahara $form->addButton('do[save]', $lang['btn_save'])->attr('type', 'submit') 10925dd2a2fSSatoshi Sahara ->attrs(['accesskey' => 's', 'tabindex' => '4']) 11025dd2a2fSSatoshi Sahara ->id('edbtn__save'); 11125dd2a2fSSatoshi Sahara $form->addButton('do[preview]', $lang['btn_preview'])->attr('type', 'submit') 11225dd2a2fSSatoshi Sahara ->attrs(['accesskey' => 'p', 'tabindex' => '5']) 11325dd2a2fSSatoshi Sahara ->id('edbtn__preview'); 11425dd2a2fSSatoshi Sahara $form->addButton('do[cancel]', $lang['btn_cancel'])->attr('type', 'submit') 11525dd2a2fSSatoshi Sahara ->attrs(['tabindex' => '6']); 11625dd2a2fSSatoshi Sahara $form->addTagClose('div'); // close div editButtons class 11725dd2a2fSSatoshi Sahara 11825dd2a2fSSatoshi Sahara // add a textbox for edit summary 11925dd2a2fSSatoshi Sahara $form->addTagOpen('div')->addClass('summary'); 12025dd2a2fSSatoshi Sahara $input = $form->addTextInput('summary', $lang['summary']) 12125dd2a2fSSatoshi Sahara ->attrs(['size' => '50', 'tabindex' => '2']) 12225dd2a2fSSatoshi Sahara ->id('edit__summary')->addClass('edit') 12325dd2a2fSSatoshi Sahara ->val($SUM); 12425dd2a2fSSatoshi Sahara $input->getLabel()->attr('class', 'nowrap'); 12525dd2a2fSSatoshi Sahara 12625dd2a2fSSatoshi Sahara // adds a checkbox for minor edits for logged in users 12783f8872cSSatoshi Sahara if ($conf['useacl'] && $INPUT->server->str('REMOTE_USER')) { 128628d5475SSatoshi Sahara $form->addHTML(' '); 12925dd2a2fSSatoshi Sahara $form->addCheckbox('minor', $lang['minoredit'])->id('edit__minoredit')->addClass('nowrap')->val('1'); 13025dd2a2fSSatoshi Sahara } 13125dd2a2fSSatoshi Sahara $form->addTagClose('div'); // close div summary class 13225dd2a2fSSatoshi Sahara } 13325dd2a2fSSatoshi Sahara 13425dd2a2fSSatoshi Sahara $form->addTagClose('div'); // close div editBar class 13525dd2a2fSSatoshi Sahara 13625dd2a2fSSatoshi Sahara // license note 13725dd2a2fSSatoshi Sahara if ($wr && $conf['license']) { 138bafe7468SSatoshi Sahara $attr = array( 139bafe7468SSatoshi Sahara 'href' => $license[$conf['license']]['url'], 140bafe7468SSatoshi Sahara 'rel' => 'license', 141bafe7468SSatoshi Sahara 'class' => 'urlextern', 142*79a2d784SGerrit Uitslag 'target' => $conf['target']['extern'] ?: '', 143bafe7468SSatoshi Sahara ); 14425dd2a2fSSatoshi Sahara $form->addTagOpen('div')->addClass('license'); 14525dd2a2fSSatoshi Sahara $form->addHTML($lang['licenseok'] 146bafe7468SSatoshi Sahara .' <a '.buildAttributes($attr, true).'>'.$license[$conf['license']]['name'].'</a>' 14725dd2a2fSSatoshi Sahara ); 14825dd2a2fSSatoshi Sahara $form->addTagClose('div'); 14925dd2a2fSSatoshi Sahara } 15025dd2a2fSSatoshi Sahara 15125dd2a2fSSatoshi Sahara // start editor html output 15225dd2a2fSSatoshi Sahara if ($wr) { 15325dd2a2fSSatoshi Sahara // sets changed to true when previewed 154628d5475SSatoshi Sahara echo '<script>/*<![CDATA[*/'.'textChanged = '. ($mod ? 'true' : 'false') .'/*!]]>*/</script>'; 15525dd2a2fSSatoshi Sahara } 15625dd2a2fSSatoshi Sahara 15725dd2a2fSSatoshi Sahara // print intro locale text (edit, rditrev, or read.txt) 15825dd2a2fSSatoshi Sahara if (isset($data['intro_locale'])) { 15925dd2a2fSSatoshi Sahara echo p_locale_xhtml($data['intro_locale']); 16025dd2a2fSSatoshi Sahara } 16125dd2a2fSSatoshi Sahara 16225dd2a2fSSatoshi Sahara echo '<div class="editBox" role="application">'; 16325dd2a2fSSatoshi Sahara 16425dd2a2fSSatoshi Sahara echo '<div class="toolbar group">'; 16525dd2a2fSSatoshi Sahara echo '<div id="tool__bar" class="tool__bar">'; 16625dd2a2fSSatoshi Sahara if ($wr && $data['media_manager']) { 16725dd2a2fSSatoshi Sahara echo '<a href="'.DOKU_BASE.'lib/exe/mediamanager.php?ns='.$INFO['namespace'].'" target="_blank">'; 16825dd2a2fSSatoshi Sahara echo $lang['mediaselect']; 16925dd2a2fSSatoshi Sahara echo '</a>'; 17025dd2a2fSSatoshi Sahara } 17125dd2a2fSSatoshi Sahara echo '</div>'; 17225dd2a2fSSatoshi Sahara echo '</div>'; 17325dd2a2fSSatoshi Sahara 17425dd2a2fSSatoshi Sahara echo '<div id="draft__status" class="draft__status">'; 175*79a2d784SGerrit Uitslag $draft = new Draft($ID, $INFO['client']); 17625dd2a2fSSatoshi Sahara if ($draft->isDraftAvailable()) { 17725dd2a2fSSatoshi Sahara echo $draft->getDraftMessage(); 17825dd2a2fSSatoshi Sahara } 179628d5475SSatoshi Sahara echo '</div>'; 18025dd2a2fSSatoshi Sahara 181c6977b3aSSatoshi Sahara echo $form->toHTML('Edit'); 18225dd2a2fSSatoshi Sahara 183628d5475SSatoshi Sahara echo '</div>'; // close div editBox class 18425dd2a2fSSatoshi Sahara } 18525dd2a2fSSatoshi Sahara 18625dd2a2fSSatoshi Sahara /** 18725dd2a2fSSatoshi Sahara * Display the default edit form (textarea) 18825dd2a2fSSatoshi Sahara * 18909e982a8SSatoshi Sahara * the default action for EDIT_FORM_ADDTEXTAREA 19025dd2a2fSSatoshi Sahara * 191*79a2d784SGerrit Uitslag * @param array{wr: bool, media_manager: bool, target: string, intro_locale: string, form: Form} $data 19225dd2a2fSSatoshi Sahara */ 19325dd2a2fSSatoshi Sahara public function addTextarea(&$data) 19425dd2a2fSSatoshi Sahara { 19525dd2a2fSSatoshi Sahara global $TEXT; 19625dd2a2fSSatoshi Sahara 19725dd2a2fSSatoshi Sahara if ($data['target'] !== 'section') { 19808a430f7SSatoshi Sahara msg('No editor for edit target '. hsc($data['target']) .' found.', -1); 19925dd2a2fSSatoshi Sahara } 20025dd2a2fSSatoshi Sahara 20125dd2a2fSSatoshi Sahara // set textarea attributes 20225dd2a2fSSatoshi Sahara $attr = array('tabindex' => '1'); 20325dd2a2fSSatoshi Sahara if (!$data['wr']) $attr['readonly'] = 'readonly'; 20425dd2a2fSSatoshi Sahara $attr['dir'] = 'auto'; 20525dd2a2fSSatoshi Sahara $attr['cols'] = '80'; 20625dd2a2fSSatoshi Sahara $attr['rows'] = '10'; 20725dd2a2fSSatoshi Sahara 20825dd2a2fSSatoshi Sahara $data['form']->addTextarea('wikitext','')->attrs($attr)->val($TEXT) 20925dd2a2fSSatoshi Sahara ->id('wiki__text')->addClass('edit'); 21025dd2a2fSSatoshi Sahara } 21125dd2a2fSSatoshi Sahara 21225dd2a2fSSatoshi Sahara} 213