xref: /dokuwiki/inc/Ui/Editor.php (revision ce55bf2bd4dc62dcba4a8109becac8b523966cb3)
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')
109*ce55bf2bSTobias Bengfort                ->attrs(['accesskey' => 's'])
11025dd2a2fSSatoshi Sahara                ->id('edbtn__save');
11125dd2a2fSSatoshi Sahara            $form->addButton('do[preview]', $lang['btn_preview'])->attr('type', 'submit')
112*ce55bf2bSTobias Bengfort                ->attrs(['accesskey' => 'p'])
11325dd2a2fSSatoshi Sahara                ->id('edbtn__preview');
114*ce55bf2bSTobias Bengfort            $form->addButton('do[cancel]', $lang['btn_cancel'])->attr('type', 'submit');
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'])
120*ce55bf2bSTobias Bengfort                ->attrs(['size' => '50'])
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']) {
137e2d055f5SAndreas Gohr            $attr = [
138bafe7468SSatoshi Sahara                'href' => $license[$conf['license']]['url'],
139bafe7468SSatoshi Sahara                'rel' => 'license',
140bafe7468SSatoshi Sahara                'class' => 'urlextern',
141e2d055f5SAndreas Gohr                'target' => $conf['target']['extern'] ?: ''
142e2d055f5SAndreas Gohr            ];
14325dd2a2fSSatoshi Sahara            $form->addTagOpen('div')->addClass('license');
14425dd2a2fSSatoshi Sahara            $form->addHTML($lang['licenseok']
145dccd6b2bSAndreas Gohr                . ' <a ' . buildAttributes($attr, true) . '>' . $license[$conf['license']]['name'] . '</a>');
14625dd2a2fSSatoshi Sahara            $form->addTagClose('div');
14725dd2a2fSSatoshi Sahara        }
14825dd2a2fSSatoshi Sahara
14925dd2a2fSSatoshi Sahara        // start editor html output
15025dd2a2fSSatoshi Sahara        if ($wr) {
15125dd2a2fSSatoshi Sahara            // sets changed to true when previewed
152a77ab274SAndreas Gohr            tpl_inlineScript('textChanged = ' . ($mod ? 'true' : 'false') . ';');
15325dd2a2fSSatoshi Sahara        }
15425dd2a2fSSatoshi Sahara
15525dd2a2fSSatoshi Sahara        // print intro locale text (edit, rditrev, or read.txt)
15625dd2a2fSSatoshi Sahara        if (isset($data['intro_locale'])) {
15725dd2a2fSSatoshi Sahara            echo p_locale_xhtml($data['intro_locale']);
15825dd2a2fSSatoshi Sahara        }
15925dd2a2fSSatoshi Sahara
16025dd2a2fSSatoshi Sahara        echo '<div class="editBox" role="application">';
16125dd2a2fSSatoshi Sahara
16225dd2a2fSSatoshi Sahara        echo '<div class="toolbar group">';
16325dd2a2fSSatoshi Sahara        echo '<div id="tool__bar" class="tool__bar">';
16425dd2a2fSSatoshi Sahara        if ($wr && $data['media_manager']) {
16525dd2a2fSSatoshi Sahara            echo '<a href="' . DOKU_BASE . 'lib/exe/mediamanager.php?ns=' . $INFO['namespace'] . '" target="_blank">';
16625dd2a2fSSatoshi Sahara            echo $lang['mediaselect'];
16725dd2a2fSSatoshi Sahara            echo '</a>';
16825dd2a2fSSatoshi Sahara        }
16925dd2a2fSSatoshi Sahara        echo '</div>';
17025dd2a2fSSatoshi Sahara        echo '</div>';
17125dd2a2fSSatoshi Sahara
17225dd2a2fSSatoshi Sahara        echo '<div id="draft__status" class="draft__status">';
17379a2d784SGerrit Uitslag        $draft = new Draft($ID, $INFO['client']);
17425dd2a2fSSatoshi Sahara        if ($draft->isDraftAvailable()) {
17525dd2a2fSSatoshi Sahara            echo $draft->getDraftMessage();
17625dd2a2fSSatoshi Sahara        }
177628d5475SSatoshi Sahara        echo '</div>';
17825dd2a2fSSatoshi Sahara
179c6977b3aSSatoshi Sahara        echo $form->toHTML('Edit');
18025dd2a2fSSatoshi Sahara
181628d5475SSatoshi Sahara        echo '</div>'; // close div editBox class
18225dd2a2fSSatoshi Sahara    }
18325dd2a2fSSatoshi Sahara
18425dd2a2fSSatoshi Sahara    /**
18525dd2a2fSSatoshi Sahara     * Display the default edit form (textarea)
18625dd2a2fSSatoshi Sahara     *
18709e982a8SSatoshi Sahara     * the default action for EDIT_FORM_ADDTEXTAREA
18825dd2a2fSSatoshi Sahara     *
18979a2d784SGerrit Uitslag     * @param array{wr: bool, media_manager: bool, target: string, intro_locale: string, form: Form} $data
19025dd2a2fSSatoshi Sahara     */
19125dd2a2fSSatoshi Sahara    public function addTextarea(&$data)
19225dd2a2fSSatoshi Sahara    {
19325dd2a2fSSatoshi Sahara        global $TEXT;
19425dd2a2fSSatoshi Sahara
19525dd2a2fSSatoshi Sahara        if ($data['target'] !== 'section') {
19608a430f7SSatoshi Sahara            msg('No editor for edit target ' . hsc($data['target']) . ' found.', -1);
19725dd2a2fSSatoshi Sahara        }
19825dd2a2fSSatoshi Sahara
19925dd2a2fSSatoshi Sahara        // set textarea attributes
200*ce55bf2bSTobias Bengfort        $attr = [];
20125dd2a2fSSatoshi Sahara        if (!$data['wr']) $attr['readonly'] = 'readonly';
20225dd2a2fSSatoshi Sahara        $attr['dir'] = 'auto';
20325dd2a2fSSatoshi Sahara        $attr['cols'] = '80';
20425dd2a2fSSatoshi Sahara        $attr['rows'] = '10';
20525dd2a2fSSatoshi Sahara
20625dd2a2fSSatoshi Sahara        $data['form']->addTextarea('wikitext', '')->attrs($attr)->val($TEXT)
20725dd2a2fSSatoshi Sahara            ->id('wiki__text')->addClass('edit');
20825dd2a2fSSatoshi Sahara    }
20925dd2a2fSSatoshi Sahara}
210