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