xref: /dokuwiki/inc/Ui/Editor.php (revision bafe7468838e1a41c911d3063438406b732fa55c)
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*bafe7468SSatoshi Sahara     * @triggers EDIT_FORM_ALTERNATE
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
73*bafe7468SSatoshi 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*bafe7468SSatoshi Sahara            Event::createAndTrigger('EDIT_FORM_ALTERNATE', $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']) {
137*bafe7468SSatoshi Sahara            $attr = array(
138*bafe7468SSatoshi Sahara                'href'   => $license[$conf['license']]['url'],
139*bafe7468SSatoshi Sahara                'rel'    => 'license',
140*bafe7468SSatoshi Sahara                'class'  => 'urlextern',
141*bafe7468SSatoshi Sahara                'target' => $conf['target']['extern'] ? $conf['target']['extern'] : '',
142*bafe7468SSatoshi Sahara            );
14325dd2a2fSSatoshi Sahara            $form->addTagOpen('div')->addClass('license');
14425dd2a2fSSatoshi Sahara            $form->addHTML($lang['licenseok']
145*bafe7468SSatoshi 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*bafe7468SSatoshi Sahara     * the default action for EDIT_FORM_ALTERNATE.
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