xref: /dokuwiki/inc/Ui/Editor.php (revision dccd6b2bba7367e4d1d2d7aa84c9f9d15584b593)
125dd2a2fSSatoshi Sahara<?php
225dd2a2fSSatoshi Sahara
325dd2a2fSSatoshi Saharanamespace dokuwiki\Ui;
425dd2a2fSSatoshi Sahara
579a2d784SGerrit Uitslaguse dokuwiki\Draft;
625dd2a2fSSatoshi Saharause dokuwiki\Extension\Event;
725dd2a2fSSatoshi Saharause dokuwiki\Form\Form;
825dd2a2fSSatoshi Sahara
925dd2a2fSSatoshi Sahara/**
1025dd2a2fSSatoshi Sahara * DokuWiki Page Editor
1125dd2a2fSSatoshi Sahara *
1225dd2a2fSSatoshi Sahara * @package dokuwiki\Ui
1325dd2a2fSSatoshi Sahara */
1425dd2a2fSSatoshi Saharaclass Editor extends Ui
1525dd2a2fSSatoshi Sahara{
1625dd2a2fSSatoshi Sahara    /**
1725dd2a2fSSatoshi Sahara     * Display the Edit Window
1825dd2a2fSSatoshi Sahara     * preprocess edit form data
1925dd2a2fSSatoshi Sahara     *
20e2d055f5SAndreas Gohr     * @return void
2125dd2a2fSSatoshi Sahara     * @author   Andreas Gohr <andi@splitbrain.org>
2225dd2a2fSSatoshi Sahara     *
2309e982a8SSatoshi Sahara     * @triggers EDIT_FORM_ADDTEXTAREA
2425dd2a2fSSatoshi Sahara     */
2525dd2a2fSSatoshi Sahara    public function show()
2625dd2a2fSSatoshi Sahara    {
2725dd2a2fSSatoshi Sahara        global $INPUT;
2825dd2a2fSSatoshi Sahara        global $ID;
2925dd2a2fSSatoshi Sahara        global $REV;
3025dd2a2fSSatoshi Sahara        global $DATE;
3125dd2a2fSSatoshi Sahara        global $PRE;
3225dd2a2fSSatoshi Sahara        global $SUF;
3325dd2a2fSSatoshi Sahara        global $INFO;
3425dd2a2fSSatoshi Sahara        global $SUM;
3525dd2a2fSSatoshi Sahara        global $lang;
3625dd2a2fSSatoshi Sahara        global $conf;
3725dd2a2fSSatoshi Sahara        global $TEXT;
3825dd2a2fSSatoshi Sahara
3925dd2a2fSSatoshi Sahara        global $license;
4025dd2a2fSSatoshi Sahara
4125dd2a2fSSatoshi Sahara        if ($INPUT->has('changecheck')) {
4225dd2a2fSSatoshi Sahara            $check = $INPUT->str('changecheck');
4325dd2a2fSSatoshi Sahara        } elseif (!$INFO['exists']) {
4425dd2a2fSSatoshi Sahara            // $TEXT has been loaded from page template
4525dd2a2fSSatoshi Sahara            $check = md5('');
4625dd2a2fSSatoshi Sahara        } else {
4725dd2a2fSSatoshi Sahara            $check = md5($TEXT);
4825dd2a2fSSatoshi Sahara        }
4925dd2a2fSSatoshi Sahara        $mod = (md5($TEXT) !== $check);
5025dd2a2fSSatoshi Sahara
5125dd2a2fSSatoshi Sahara        $wr = $INFO['writable'] && !$INFO['locked'];
5225dd2a2fSSatoshi Sahara
5325dd2a2fSSatoshi Sahara        // intro locale text (edit, rditrev, or read)
5425dd2a2fSSatoshi Sahara        if ($wr) {
5525dd2a2fSSatoshi Sahara            $intro = ($REV) ? 'editrev' : 'edit';
5625dd2a2fSSatoshi Sahara        } else {
5725dd2a2fSSatoshi Sahara            // check pseudo action 'source'
5825dd2a2fSSatoshi Sahara            if (!actionOK('source')) {
5925dd2a2fSSatoshi Sahara                msg('Command disabled: source', -1);
6025dd2a2fSSatoshi Sahara                return;
6125dd2a2fSSatoshi Sahara            }
6225dd2a2fSSatoshi Sahara            $intro = 'read';
6325dd2a2fSSatoshi Sahara        }
6425dd2a2fSSatoshi Sahara
6525dd2a2fSSatoshi Sahara        // create the Editor form
661e6e7b77SSatoshi Sahara        $form = new Form(['id' => 'dw__editform']);
6725dd2a2fSSatoshi Sahara        $form->setHiddenField('id', $ID);
6825dd2a2fSSatoshi Sahara        $form->setHiddenField('rev', $REV);
6925dd2a2fSSatoshi Sahara        $form->setHiddenField('date', $DATE);
7025dd2a2fSSatoshi Sahara        $form->setHiddenField('prefix', $PRE . '.');
7125dd2a2fSSatoshi Sahara        $form->setHiddenField('suffix', $SUF);
7225dd2a2fSSatoshi Sahara        $form->setHiddenField('changecheck', $check);
7325dd2a2fSSatoshi Sahara
74bafe7468SSatoshi Sahara        // prepare data for EDIT_FORM_ALTERNATE event
75e2d055f5SAndreas Gohr        $data = [
7625dd2a2fSSatoshi Sahara            'form' => $form,
7725dd2a2fSSatoshi Sahara            'wr' => $wr,
7825dd2a2fSSatoshi Sahara            'media_manager' => true,
7925dd2a2fSSatoshi Sahara            'target' => ($INPUT->has('target') && $wr) ? $INPUT->str('target') : 'section',
80e2d055f5SAndreas Gohr            'intro_locale' => $intro
81e2d055f5SAndreas Gohr        ];
8225dd2a2fSSatoshi Sahara
8325dd2a2fSSatoshi Sahara        if ($data['target'] !== 'section') {
8425dd2a2fSSatoshi Sahara            // Only emit event if page is writable, section edit data is valid and
8525dd2a2fSSatoshi Sahara            // edit target is not section.
8609e982a8SSatoshi Sahara            Event::createAndTrigger('EDIT_FORM_ADDTEXTAREA', $data, [$this, 'addTextarea'], true);
8725dd2a2fSSatoshi Sahara        } else {
8825dd2a2fSSatoshi Sahara            $this->addTextarea($data);
8925dd2a2fSSatoshi Sahara        }
9025dd2a2fSSatoshi Sahara
9125dd2a2fSSatoshi Sahara        $form->setHiddenField('target', $data['target']);
9225dd2a2fSSatoshi Sahara
9325dd2a2fSSatoshi Sahara        if ($INPUT->has('hid')) {
9425dd2a2fSSatoshi Sahara            $form->setHiddenField('hid', $INPUT->str('hid'));
9525dd2a2fSSatoshi Sahara        }
9625dd2a2fSSatoshi Sahara        if ($INPUT->has('codeblockOffset')) {
9725dd2a2fSSatoshi Sahara            $form->setHiddenField('codeblockOffset', $INPUT->str('codeblockOffset'));
9825dd2a2fSSatoshi Sahara        }
9925dd2a2fSSatoshi Sahara
10025dd2a2fSSatoshi Sahara        $form->addTagOpen('div')->id('wiki__editbar')->addClass('editBar');
10125dd2a2fSSatoshi Sahara
10225dd2a2fSSatoshi Sahara        $form->addTagOpen('div')->id('size__ctl');
10325dd2a2fSSatoshi Sahara        $form->addTagClose('div');
10425dd2a2fSSatoshi Sahara
10525dd2a2fSSatoshi Sahara        if ($wr) {
10625dd2a2fSSatoshi Sahara            // add edit buttons: save, preview, cancel
10725dd2a2fSSatoshi Sahara            $form->addTagOpen('div')->addClass('editButtons');
10825dd2a2fSSatoshi Sahara            $form->addButton('do[save]', $lang['btn_save'])->attr('type', 'submit')
10925dd2a2fSSatoshi Sahara                ->attrs(['accesskey' => 's', 'tabindex' => '4'])
11025dd2a2fSSatoshi Sahara                ->id('edbtn__save');
11125dd2a2fSSatoshi Sahara            $form->addButton('do[preview]', $lang['btn_preview'])->attr('type', 'submit')
11225dd2a2fSSatoshi Sahara                ->attrs(['accesskey' => 'p', 'tabindex' => '5'])
11325dd2a2fSSatoshi Sahara                ->id('edbtn__preview');
11425dd2a2fSSatoshi Sahara            $form->addButton('do[cancel]', $lang['btn_cancel'])->attr('type', 'submit')
11525dd2a2fSSatoshi Sahara                ->attrs(['tabindex' => '6']);
11625dd2a2fSSatoshi Sahara            $form->addTagClose('div'); // close div editButtons class
11725dd2a2fSSatoshi Sahara
11825dd2a2fSSatoshi Sahara            // add a textbox for edit summary
11925dd2a2fSSatoshi Sahara            $form->addTagOpen('div')->addClass('summary');
12025dd2a2fSSatoshi Sahara            $input = $form->addTextInput('summary', $lang['summary'])
12125dd2a2fSSatoshi Sahara                ->attrs(['size' => '50', 'tabindex' => '2'])
12225dd2a2fSSatoshi Sahara                ->id('edit__summary')->addClass('edit')
12325dd2a2fSSatoshi Sahara                ->val($SUM);
12425dd2a2fSSatoshi Sahara            $input->getLabel()->attr('class', 'nowrap');
12525dd2a2fSSatoshi Sahara
12625dd2a2fSSatoshi Sahara            // adds a checkbox for minor edits for logged in users
12783f8872cSSatoshi Sahara            if ($conf['useacl'] && $INPUT->server->str('REMOTE_USER')) {
128628d5475SSatoshi Sahara                $form->addHTML(' ');
12925dd2a2fSSatoshi Sahara                $form->addCheckbox('minor', $lang['minoredit'])->id('edit__minoredit')->addClass('nowrap')->val('1');
13025dd2a2fSSatoshi Sahara            }
13125dd2a2fSSatoshi Sahara            $form->addTagClose('div'); // close div summary class
13225dd2a2fSSatoshi Sahara        }
13325dd2a2fSSatoshi Sahara
13425dd2a2fSSatoshi Sahara        $form->addTagClose('div'); // close div editBar class
13525dd2a2fSSatoshi Sahara
13625dd2a2fSSatoshi Sahara        // license note
13725dd2a2fSSatoshi Sahara        if ($wr && $conf['license']) {
138e2d055f5SAndreas Gohr            $attr = [
139bafe7468SSatoshi Sahara                'href' => $license[$conf['license']]['url'],
140bafe7468SSatoshi Sahara                'rel' => 'license',
141bafe7468SSatoshi Sahara                'class' => 'urlextern',
142e2d055f5SAndreas Gohr                'target' => $conf['target']['extern'] ?: ''
143e2d055f5SAndreas Gohr            ];
14425dd2a2fSSatoshi Sahara            $form->addTagOpen('div')->addClass('license');
14525dd2a2fSSatoshi Sahara            $form->addHTML($lang['licenseok']
146*dccd6b2bSAndreas Gohr                . ' <a ' . buildAttributes($attr, true) . '>' . $license[$conf['license']]['name'] . '</a>');
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
153e2d055f5SAndreas Gohr            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">';
17479a2d784SGerrit Uitslag        $draft = new 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     *
18809e982a8SSatoshi Sahara     * the default action for EDIT_FORM_ADDTEXTAREA
18925dd2a2fSSatoshi Sahara     *
19079a2d784SGerrit Uitslag     * @param array{wr: bool, media_manager: bool, target: string, intro_locale: string, form: Form} $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
201e2d055f5SAndreas Gohr        $attr = ['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
20725dd2a2fSSatoshi Sahara        $data['form']->addTextarea('wikitext', '')->attrs($attr)->val($TEXT)
20825dd2a2fSSatoshi Sahara            ->id('wiki__text')->addClass('edit');
20925dd2a2fSSatoshi Sahara    }
21025dd2a2fSSatoshi Sahara}
211