213 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			213 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?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');
 | |
|     }
 | |
| 
 | |
| }
 |