1*25dd2a2fSSatoshi Sahara<?php 2*25dd2a2fSSatoshi Sahara 3*25dd2a2fSSatoshi Saharanamespace dokuwiki\Ui; 4*25dd2a2fSSatoshi Sahara 5*25dd2a2fSSatoshi Saharause dokuwiki\Extension\Event; 6*25dd2a2fSSatoshi Saharause dokuwiki\Form\Form; 7*25dd2a2fSSatoshi Sahara 8*25dd2a2fSSatoshi Sahara/** 9*25dd2a2fSSatoshi Sahara * DokuWiki Page Editor 10*25dd2a2fSSatoshi Sahara * 11*25dd2a2fSSatoshi Sahara * @package dokuwiki\Ui 12*25dd2a2fSSatoshi Sahara */ 13*25dd2a2fSSatoshi Saharaclass Editor extends Ui 14*25dd2a2fSSatoshi Sahara{ 15*25dd2a2fSSatoshi Sahara /** 16*25dd2a2fSSatoshi Sahara * Display the Edit Window 17*25dd2a2fSSatoshi Sahara * preprocess edit form data 18*25dd2a2fSSatoshi Sahara * 19*25dd2a2fSSatoshi Sahara * @author Andreas Gohr <andi@splitbrain.org> 20*25dd2a2fSSatoshi Sahara * 21*25dd2a2fSSatoshi Sahara * @triggers HTML_EDIT_FORMSELECTION 22*25dd2a2fSSatoshi Sahara * @triggers HTML_EDITFORM_OUTPUT 23*25dd2a2fSSatoshi Sahara * @return void 24*25dd2a2fSSatoshi Sahara */ 25*25dd2a2fSSatoshi Sahara public function show() 26*25dd2a2fSSatoshi Sahara { 27*25dd2a2fSSatoshi Sahara global $INPUT; 28*25dd2a2fSSatoshi Sahara global $ID; 29*25dd2a2fSSatoshi Sahara global $REV; 30*25dd2a2fSSatoshi Sahara global $DATE; 31*25dd2a2fSSatoshi Sahara global $PRE; 32*25dd2a2fSSatoshi Sahara global $SUF; 33*25dd2a2fSSatoshi Sahara global $INFO; 34*25dd2a2fSSatoshi Sahara global $SUM; 35*25dd2a2fSSatoshi Sahara global $lang; 36*25dd2a2fSSatoshi Sahara global $conf; 37*25dd2a2fSSatoshi Sahara global $TEXT; 38*25dd2a2fSSatoshi Sahara 39*25dd2a2fSSatoshi Sahara global $license; 40*25dd2a2fSSatoshi Sahara 41*25dd2a2fSSatoshi Sahara if ($INPUT->has('changecheck')) { 42*25dd2a2fSSatoshi Sahara $check = $INPUT->str('changecheck'); 43*25dd2a2fSSatoshi Sahara } elseif (!$INFO['exists']) { 44*25dd2a2fSSatoshi Sahara // $TEXT has been loaded from page template 45*25dd2a2fSSatoshi Sahara $check = md5(''); 46*25dd2a2fSSatoshi Sahara } else { 47*25dd2a2fSSatoshi Sahara $check = md5($TEXT); 48*25dd2a2fSSatoshi Sahara } 49*25dd2a2fSSatoshi Sahara $mod = (md5($TEXT) !== $check); 50*25dd2a2fSSatoshi Sahara 51*25dd2a2fSSatoshi Sahara $wr = $INFO['writable'] && !$INFO['locked']; 52*25dd2a2fSSatoshi Sahara 53*25dd2a2fSSatoshi Sahara // intro locale text (edit, rditrev, or read) 54*25dd2a2fSSatoshi Sahara if ($wr) { 55*25dd2a2fSSatoshi Sahara $intro = ($REV) ? 'editrev' : 'edit'; 56*25dd2a2fSSatoshi Sahara } else { 57*25dd2a2fSSatoshi Sahara // check pseudo action 'source' 58*25dd2a2fSSatoshi Sahara if (!actionOK('source')) { 59*25dd2a2fSSatoshi Sahara msg('Command disabled: source', -1); 60*25dd2a2fSSatoshi Sahara return; 61*25dd2a2fSSatoshi Sahara } 62*25dd2a2fSSatoshi Sahara $intro = 'read'; 63*25dd2a2fSSatoshi Sahara } 64*25dd2a2fSSatoshi Sahara 65*25dd2a2fSSatoshi Sahara // create the Editor form 66*25dd2a2fSSatoshi Sahara $form = new Form(['action' => wl($ID), 'id' => 'dw__editform']); 67*25dd2a2fSSatoshi Sahara $form->setHiddenField('id', $ID); 68*25dd2a2fSSatoshi Sahara $form->setHiddenField('rev', $REV); 69*25dd2a2fSSatoshi Sahara $form->setHiddenField('date', $DATE); 70*25dd2a2fSSatoshi Sahara $form->setHiddenField('prefix', $PRE .'.'); 71*25dd2a2fSSatoshi Sahara $form->setHiddenField('suffix', $SUF); 72*25dd2a2fSSatoshi Sahara $form->setHiddenField('changecheck', $check); 73*25dd2a2fSSatoshi Sahara 74*25dd2a2fSSatoshi Sahara // prepare data for HTML_EDIT_FORMSELECTION event 75*25dd2a2fSSatoshi Sahara $data = array( 76*25dd2a2fSSatoshi Sahara 'form' => $form, 77*25dd2a2fSSatoshi Sahara 'wr' => $wr, 78*25dd2a2fSSatoshi Sahara 'media_manager' => true, 79*25dd2a2fSSatoshi Sahara 'target' => ($INPUT->has('target') && $wr) ? $INPUT->str('target') : 'section', 80*25dd2a2fSSatoshi Sahara 'intro_locale' => $intro, 81*25dd2a2fSSatoshi Sahara ); 82*25dd2a2fSSatoshi Sahara 83*25dd2a2fSSatoshi Sahara if ($data['target'] !== 'section') { 84*25dd2a2fSSatoshi Sahara // Only emit event if page is writable, section edit data is valid and 85*25dd2a2fSSatoshi Sahara // edit target is not section. 86*25dd2a2fSSatoshi Sahara Event::createAndTrigger('HTML_EDIT_FORMSELECTION', $data, [$this,'addTextarea'], true); 87*25dd2a2fSSatoshi Sahara } else { 88*25dd2a2fSSatoshi Sahara $this->addTextarea($data); 89*25dd2a2fSSatoshi Sahara } 90*25dd2a2fSSatoshi Sahara 91*25dd2a2fSSatoshi Sahara $form->setHiddenField('target', $data['target']); 92*25dd2a2fSSatoshi Sahara 93*25dd2a2fSSatoshi Sahara if ($INPUT->has('hid')) { 94*25dd2a2fSSatoshi Sahara $form->setHiddenField('hid', $INPUT->str('hid')); 95*25dd2a2fSSatoshi Sahara } 96*25dd2a2fSSatoshi Sahara if ($INPUT->has('codeblockOffset')) { 97*25dd2a2fSSatoshi Sahara $form->setHiddenField('codeblockOffset', $INPUT->str('codeblockOffset')); 98*25dd2a2fSSatoshi Sahara } 99*25dd2a2fSSatoshi Sahara 100*25dd2a2fSSatoshi Sahara $form->addTagOpen('div')->id('wiki__editbar')->addClass('editBar'); 101*25dd2a2fSSatoshi Sahara 102*25dd2a2fSSatoshi Sahara $form->addTagOpen('div')->id('size__ctl'); 103*25dd2a2fSSatoshi Sahara $form->addTagClose('div'); 104*25dd2a2fSSatoshi Sahara 105*25dd2a2fSSatoshi Sahara if ($wr) { 106*25dd2a2fSSatoshi Sahara // add edit buttons: save, preview, cancel 107*25dd2a2fSSatoshi Sahara $form->addTagOpen('div')->addClass('editButtons'); 108*25dd2a2fSSatoshi Sahara $form->addButton('do[save]', $lang['btn_save'])->attr('type', 'submit') 109*25dd2a2fSSatoshi Sahara ->attrs(['accesskey' => 's', 'tabindex' => '4']) 110*25dd2a2fSSatoshi Sahara ->id('edbtn__save'); 111*25dd2a2fSSatoshi Sahara $form->addButton('do[preview]', $lang['btn_preview'])->attr('type', 'submit') 112*25dd2a2fSSatoshi Sahara ->attrs(['accesskey' => 'p', 'tabindex' => '5']) 113*25dd2a2fSSatoshi Sahara ->id('edbtn__preview'); 114*25dd2a2fSSatoshi Sahara $form->addButton('do[cancel]', $lang['btn_cancel'])->attr('type', 'submit') 115*25dd2a2fSSatoshi Sahara ->attrs(['tabindex' => '6']); 116*25dd2a2fSSatoshi Sahara $form->addTagClose('div'); // close div editButtons class 117*25dd2a2fSSatoshi Sahara 118*25dd2a2fSSatoshi Sahara // add a textbox for edit summary 119*25dd2a2fSSatoshi Sahara $form->addTagOpen('div')->addClass('summary'); 120*25dd2a2fSSatoshi Sahara $input = $form->addTextInput('summary', $lang['summary']) 121*25dd2a2fSSatoshi Sahara ->attrs(['size' => '50', 'tabindex' => '2']) 122*25dd2a2fSSatoshi Sahara ->id('edit__summary')->addClass('edit') 123*25dd2a2fSSatoshi Sahara ->val($SUM); 124*25dd2a2fSSatoshi Sahara $input->getLabel()->attr('class', 'nowrap'); 125*25dd2a2fSSatoshi Sahara 126*25dd2a2fSSatoshi Sahara // adds a checkbox for minor edits for logged in users 127*25dd2a2fSSatoshi Sahara if ($conf['useacl'] && $_SERVER['REMOTE_USER']) { 128*25dd2a2fSSatoshi Sahara $form->addCheckbox('minor', $lang['minoredit'])->id('edit__minoredit')->addClass('nowrap')->val('1'); 129*25dd2a2fSSatoshi Sahara } 130*25dd2a2fSSatoshi Sahara $form->addTagClose('div'); // close div summary class 131*25dd2a2fSSatoshi Sahara } 132*25dd2a2fSSatoshi Sahara 133*25dd2a2fSSatoshi Sahara $form->addTagClose('div'); // close div editBar class 134*25dd2a2fSSatoshi Sahara 135*25dd2a2fSSatoshi Sahara // license note 136*25dd2a2fSSatoshi Sahara if ($wr && $conf['license']) { 137*25dd2a2fSSatoshi Sahara $form->addTagOpen('div')->addClass('license'); 138*25dd2a2fSSatoshi Sahara $form->addHTML($lang['licenseok'] 139*25dd2a2fSSatoshi Sahara .' <a href="'.$license[$conf['license']]['url'].'" rel="license" class="urlextern"' 140*25dd2a2fSSatoshi Sahara . ($conf['target']['extern']) ? ' target="'.$conf['target']['extern'].'">' : '>' 141*25dd2a2fSSatoshi Sahara . $license[$conf['license']]['name'].'</a>' 142*25dd2a2fSSatoshi Sahara ); 143*25dd2a2fSSatoshi Sahara $form->addTagClose('div'); 144*25dd2a2fSSatoshi Sahara } 145*25dd2a2fSSatoshi Sahara 146*25dd2a2fSSatoshi Sahara // start editor html output 147*25dd2a2fSSatoshi Sahara if ($wr) { 148*25dd2a2fSSatoshi Sahara // sets changed to true when previewed 149*25dd2a2fSSatoshi Sahara echo '<script>/*<![CDATA[*/'. DOKU_LF; 150*25dd2a2fSSatoshi Sahara echo 'textChanged = ' . ($mod ? 'true' : 'false'); 151*25dd2a2fSSatoshi Sahara echo '/*!]]>*/</script>' . DOKU_LF; 152*25dd2a2fSSatoshi Sahara } 153*25dd2a2fSSatoshi Sahara 154*25dd2a2fSSatoshi Sahara // print intro locale text (edit, rditrev, or read.txt) 155*25dd2a2fSSatoshi Sahara if (isset($data['intro_locale'])) { 156*25dd2a2fSSatoshi Sahara echo p_locale_xhtml($data['intro_locale']); 157*25dd2a2fSSatoshi Sahara } 158*25dd2a2fSSatoshi Sahara 159*25dd2a2fSSatoshi Sahara echo '<div class="editBox" role="application">'; 160*25dd2a2fSSatoshi Sahara 161*25dd2a2fSSatoshi Sahara echo '<div class="toolbar group">'; 162*25dd2a2fSSatoshi Sahara echo '<div id="tool__bar" class="tool__bar">'; 163*25dd2a2fSSatoshi Sahara if ($wr && $data['media_manager']) { 164*25dd2a2fSSatoshi Sahara echo '<a href="'.DOKU_BASE.'lib/exe/mediamanager.php?ns='.$INFO['namespace'].'" target="_blank">'; 165*25dd2a2fSSatoshi Sahara echo $lang['mediaselect']; 166*25dd2a2fSSatoshi Sahara echo '</a>'; 167*25dd2a2fSSatoshi Sahara } 168*25dd2a2fSSatoshi Sahara echo '</div>'; 169*25dd2a2fSSatoshi Sahara echo '</div>'; 170*25dd2a2fSSatoshi Sahara 171*25dd2a2fSSatoshi Sahara echo '<div id="draft__status" class="draft__status">'; 172*25dd2a2fSSatoshi Sahara $draft = new \dokuwiki\Draft($ID, $INFO['client']); 173*25dd2a2fSSatoshi Sahara if ($draft->isDraftAvailable()) { 174*25dd2a2fSSatoshi Sahara echo $draft->getDraftMessage(); 175*25dd2a2fSSatoshi Sahara } 176*25dd2a2fSSatoshi Sahara echo '</div>'.DOKU_LF; 177*25dd2a2fSSatoshi Sahara 178*25dd2a2fSSatoshi Sahara // emit HTML_EDITFORM_OUTPUT event, print the form 179*25dd2a2fSSatoshi Sahara Event::createAndTrigger('HTML_EDITFORM_OUTPUT', $form, 'html_form_output', false); 180*25dd2a2fSSatoshi Sahara 181*25dd2a2fSSatoshi Sahara echo '</div>'.DOKU_LF; // close div editBox class 182*25dd2a2fSSatoshi Sahara } 183*25dd2a2fSSatoshi Sahara 184*25dd2a2fSSatoshi Sahara /** 185*25dd2a2fSSatoshi Sahara * Display the default edit form (textarea) 186*25dd2a2fSSatoshi Sahara * 187*25dd2a2fSSatoshi Sahara * the default action for HTML_EDIT_FORMSELECTION. 188*25dd2a2fSSatoshi Sahara * 189*25dd2a2fSSatoshi Sahara * @param mixed[] $data 190*25dd2a2fSSatoshi Sahara */ 191*25dd2a2fSSatoshi Sahara public function addTextarea(&$data) 192*25dd2a2fSSatoshi Sahara { 193*25dd2a2fSSatoshi Sahara global $TEXT; 194*25dd2a2fSSatoshi Sahara 195*25dd2a2fSSatoshi Sahara if ($data['target'] !== 'section') { 196*25dd2a2fSSatoshi Sahara msg('No editor for edit target '. hsc($pdata['target']) .' found.', -1); 197*25dd2a2fSSatoshi Sahara } 198*25dd2a2fSSatoshi Sahara 199*25dd2a2fSSatoshi Sahara // set textarea attributes 200*25dd2a2fSSatoshi Sahara $attr = array('tabindex' => '1'); 201*25dd2a2fSSatoshi Sahara if (!$data['wr']) $attr['readonly'] = 'readonly'; 202*25dd2a2fSSatoshi Sahara $attr['dir'] = 'auto'; 203*25dd2a2fSSatoshi Sahara $attr['cols'] = '80'; 204*25dd2a2fSSatoshi Sahara $attr['rows'] = '10'; 205*25dd2a2fSSatoshi Sahara 206*25dd2a2fSSatoshi Sahara $data['form']->addTextarea('wikitext','')->attrs($attr)->val($TEXT) 207*25dd2a2fSSatoshi Sahara ->id('wiki__text')->addClass('edit'); 208*25dd2a2fSSatoshi Sahara } 209*25dd2a2fSSatoshi Sahara 210*25dd2a2fSSatoshi Sahara} 211