123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- <?php
- namespace dokuwiki\Ui;
- use dokuwiki\Draft;
- use dokuwiki\Extension\Event;
- use dokuwiki\Form\Form;
- /**
- * DokuWiki Page Editor
- *
- * @package dokuwiki\Ui
- */
- class Editor extends Ui
- {
- /**
- * Display the Edit Window
- * preprocess edit form data
- *
- * @author Andreas Gohr <andi@splitbrain.org>
- *
- * @triggers EDIT_FORM_ADDTEXTAREA
- * @return void
- */
- public function show()
- {
- global $INPUT;
- global $ID;
- global $REV;
- global $DATE;
- global $PRE;
- global $SUF;
- global $INFO;
- global $SUM;
- global $lang;
- global $conf;
- global $TEXT;
- global $license;
- if ($INPUT->has('changecheck')) {
- $check = $INPUT->str('changecheck');
- } elseif (!$INFO['exists']) {
- // $TEXT has been loaded from page template
- $check = md5('');
- } else {
- $check = md5($TEXT);
- }
- $mod = (md5($TEXT) !== $check);
- $wr = $INFO['writable'] && !$INFO['locked'];
- // intro locale text (edit, rditrev, or read)
- if ($wr) {
- $intro = ($REV) ? 'editrev' : 'edit';
- } else {
- // check pseudo action 'source'
- if (!actionOK('source')) {
- msg('Command disabled: source', -1);
- return;
- }
- $intro = 'read';
- }
- // create the Editor form
- $form = new Form(['id' => 'dw__editform']);
- $form->setHiddenField('id', $ID);
- $form->setHiddenField('rev', $REV);
- $form->setHiddenField('date', $DATE);
- $form->setHiddenField('prefix', $PRE .'.');
- $form->setHiddenField('suffix', $SUF);
- $form->setHiddenField('changecheck', $check);
- // prepare data for EDIT_FORM_ALTERNATE event
- $data = array(
- 'form' => $form,
- 'wr' => $wr,
- 'media_manager' => true,
- 'target' => ($INPUT->has('target') && $wr) ? $INPUT->str('target') : 'section',
- 'intro_locale' => $intro,
- );
- if ($data['target'] !== 'section') {
- // Only emit event if page is writable, section edit data is valid and
- // edit target is not section.
- Event::createAndTrigger('EDIT_FORM_ADDTEXTAREA', $data, [$this,'addTextarea'], true);
- } else {
- $this->addTextarea($data);
- }
- $form->setHiddenField('target', $data['target']);
- if ($INPUT->has('hid')) {
- $form->setHiddenField('hid', $INPUT->str('hid'));
- }
- if ($INPUT->has('codeblockOffset')) {
- $form->setHiddenField('codeblockOffset', $INPUT->str('codeblockOffset'));
- }
- $form->addTagOpen('div')->id('wiki__editbar')->addClass('editBar');
- $form->addTagOpen('div')->id('size__ctl');
- $form->addTagClose('div');
- if ($wr) {
- // add edit buttons: save, preview, cancel
- $form->addTagOpen('div')->addClass('editButtons');
- $form->addButton('do[save]', $lang['btn_save'])->attr('type', 'submit')
- ->attrs(['accesskey' => 's', 'tabindex' => '4'])
- ->id('edbtn__save');
- $form->addButton('do[preview]', $lang['btn_preview'])->attr('type', 'submit')
- ->attrs(['accesskey' => 'p', 'tabindex' => '5'])
- ->id('edbtn__preview');
- $form->addButton('do[cancel]', $lang['btn_cancel'])->attr('type', 'submit')
- ->attrs(['tabindex' => '6']);
- $form->addTagClose('div'); // close div editButtons class
- // add a textbox for edit summary
- $form->addTagOpen('div')->addClass('summary');
- $input = $form->addTextInput('summary', $lang['summary'])
- ->attrs(['size' => '50', 'tabindex' => '2'])
- ->id('edit__summary')->addClass('edit')
- ->val($SUM);
- $input->getLabel()->attr('class', 'nowrap');
- // adds a checkbox for minor edits for logged in users
- if ($conf['useacl'] && $INPUT->server->str('REMOTE_USER')) {
- $form->addHTML(' ');
- $form->addCheckbox('minor', $lang['minoredit'])->id('edit__minoredit')->addClass('nowrap')->val('1');
- }
- $form->addTagClose('div'); // close div summary class
- }
- $form->addTagClose('div'); // close div editBar class
- // license note
- if ($wr && $conf['license']) {
- $attr = array(
- 'href' => $license[$conf['license']]['url'],
- 'rel' => 'license',
- 'class' => 'urlextern',
- 'target' => $conf['target']['extern'] ?: '',
- );
- $form->addTagOpen('div')->addClass('license');
- $form->addHTML($lang['licenseok']
- .' <a '.buildAttributes($attr, true).'>'.$license[$conf['license']]['name'].'</a>'
- );
- $form->addTagClose('div');
- }
- // start editor html output
- if ($wr) {
- // sets changed to true when previewed
- echo '<script>/*<![CDATA[*/'.'textChanged = '. ($mod ? 'true' : 'false') .'/*!]]>*/</script>';
- }
- // print intro locale text (edit, rditrev, or read.txt)
- if (isset($data['intro_locale'])) {
- echo p_locale_xhtml($data['intro_locale']);
- }
- echo '<div class="editBox" role="application">';
- echo '<div class="toolbar group">';
- echo '<div id="tool__bar" class="tool__bar">';
- if ($wr && $data['media_manager']) {
- echo '<a href="'.DOKU_BASE.'lib/exe/mediamanager.php?ns='.$INFO['namespace'].'" target="_blank">';
- echo $lang['mediaselect'];
- echo '</a>';
- }
- echo '</div>';
- echo '</div>';
- echo '<div id="draft__status" class="draft__status">';
- $draft = new Draft($ID, $INFO['client']);
- if ($draft->isDraftAvailable()) {
- echo $draft->getDraftMessage();
- }
- echo '</div>';
- echo $form->toHTML('Edit');
- echo '</div>'; // close div editBox class
- }
- /**
- * Display the default edit form (textarea)
- *
- * the default action for EDIT_FORM_ADDTEXTAREA
- *
- * @param array{wr: bool, media_manager: bool, target: string, intro_locale: string, form: Form} $data
- */
- public function addTextarea(&$data)
- {
- global $TEXT;
- if ($data['target'] !== 'section') {
- msg('No editor for edit target '. hsc($data['target']) .' found.', -1);
- }
- // set textarea attributes
- $attr = array('tabindex' => '1');
- if (!$data['wr']) $attr['readonly'] = 'readonly';
- $attr['dir'] = 'auto';
- $attr['cols'] = '80';
- $attr['rows'] = '10';
- $data['form']->addTextarea('wikitext','')->attrs($attr)->val($TEXT)
- ->id('wiki__text')->addClass('edit');
- }
- }
|