xref: /dokuwiki/inc/Ui/Editor.php (revision 25dd2a2f8414f14b5ac77197ceb29a21b9c4749e)
1*25dd2a2fSSatoshi Sahara<?php
2*25dd2a2fSSatoshi Sahara
3*25dd2a2fSSatoshi Saharanamespace dokuwiki\Ui;
4*25dd2a2fSSatoshi Sahara
5*25dd2a2fSSatoshi Saharause dokuwiki\Extension\Event;
6*25dd2a2fSSatoshi Saharause dokuwiki\Form\Form;
7*25dd2a2fSSatoshi Sahara
8*25dd2a2fSSatoshi Sahara/**
9*25dd2a2fSSatoshi Sahara * DokuWiki Page Editor
10*25dd2a2fSSatoshi Sahara *
11*25dd2a2fSSatoshi Sahara * @package dokuwiki\Ui
12*25dd2a2fSSatoshi Sahara */
13*25dd2a2fSSatoshi Saharaclass Editor extends Ui
14*25dd2a2fSSatoshi Sahara{
15*25dd2a2fSSatoshi Sahara    /**
16*25dd2a2fSSatoshi Sahara     * Display the Edit Window
17*25dd2a2fSSatoshi Sahara     * preprocess edit form data
18*25dd2a2fSSatoshi Sahara     *
19*25dd2a2fSSatoshi Sahara     * @author   Andreas Gohr <andi@splitbrain.org>
20*25dd2a2fSSatoshi Sahara     *
21*25dd2a2fSSatoshi Sahara     * @triggers HTML_EDIT_FORMSELECTION
22*25dd2a2fSSatoshi Sahara     * @triggers HTML_EDITFORM_OUTPUT
23*25dd2a2fSSatoshi Sahara     * @return void
24*25dd2a2fSSatoshi Sahara     */
25*25dd2a2fSSatoshi Sahara    public function show()
26*25dd2a2fSSatoshi Sahara    {
27*25dd2a2fSSatoshi Sahara        global $INPUT;
28*25dd2a2fSSatoshi Sahara        global $ID;
29*25dd2a2fSSatoshi Sahara        global $REV;
30*25dd2a2fSSatoshi Sahara        global $DATE;
31*25dd2a2fSSatoshi Sahara        global $PRE;
32*25dd2a2fSSatoshi Sahara        global $SUF;
33*25dd2a2fSSatoshi Sahara        global $INFO;
34*25dd2a2fSSatoshi Sahara        global $SUM;
35*25dd2a2fSSatoshi Sahara        global $lang;
36*25dd2a2fSSatoshi Sahara        global $conf;
37*25dd2a2fSSatoshi Sahara        global $TEXT;
38*25dd2a2fSSatoshi Sahara
39*25dd2a2fSSatoshi Sahara        global $license;
40*25dd2a2fSSatoshi Sahara
41*25dd2a2fSSatoshi Sahara        if ($INPUT->has('changecheck')) {
42*25dd2a2fSSatoshi Sahara            $check = $INPUT->str('changecheck');
43*25dd2a2fSSatoshi Sahara        } elseif (!$INFO['exists']) {
44*25dd2a2fSSatoshi Sahara            // $TEXT has been loaded from page template
45*25dd2a2fSSatoshi Sahara            $check = md5('');
46*25dd2a2fSSatoshi Sahara        } else {
47*25dd2a2fSSatoshi Sahara            $check = md5($TEXT);
48*25dd2a2fSSatoshi Sahara        }
49*25dd2a2fSSatoshi Sahara        $mod = (md5($TEXT) !== $check);
50*25dd2a2fSSatoshi Sahara
51*25dd2a2fSSatoshi Sahara        $wr = $INFO['writable'] && !$INFO['locked'];
52*25dd2a2fSSatoshi Sahara
53*25dd2a2fSSatoshi Sahara        // intro locale text (edit, rditrev, or read)
54*25dd2a2fSSatoshi Sahara        if ($wr) {
55*25dd2a2fSSatoshi Sahara            $intro = ($REV) ? 'editrev' : 'edit';
56*25dd2a2fSSatoshi Sahara        } else {
57*25dd2a2fSSatoshi Sahara            // check pseudo action 'source'
58*25dd2a2fSSatoshi Sahara            if (!actionOK('source')) {
59*25dd2a2fSSatoshi Sahara                msg('Command disabled: source', -1);
60*25dd2a2fSSatoshi Sahara                return;
61*25dd2a2fSSatoshi Sahara            }
62*25dd2a2fSSatoshi Sahara            $intro = 'read';
63*25dd2a2fSSatoshi Sahara        }
64*25dd2a2fSSatoshi Sahara
65*25dd2a2fSSatoshi Sahara        // create the Editor form
66*25dd2a2fSSatoshi Sahara        $form = new Form(['action' => wl($ID), 'id' => 'dw__editform']);
67*25dd2a2fSSatoshi Sahara        $form->setHiddenField('id', $ID);
68*25dd2a2fSSatoshi Sahara        $form->setHiddenField('rev', $REV);
69*25dd2a2fSSatoshi Sahara        $form->setHiddenField('date', $DATE);
70*25dd2a2fSSatoshi Sahara        $form->setHiddenField('prefix', $PRE .'.');
71*25dd2a2fSSatoshi Sahara        $form->setHiddenField('suffix', $SUF);
72*25dd2a2fSSatoshi Sahara        $form->setHiddenField('changecheck', $check);
73*25dd2a2fSSatoshi Sahara
74*25dd2a2fSSatoshi Sahara        // prepare data for HTML_EDIT_FORMSELECTION event
75*25dd2a2fSSatoshi Sahara        $data = array(
76*25dd2a2fSSatoshi Sahara            'form' => $form,
77*25dd2a2fSSatoshi Sahara            'wr'   => $wr,
78*25dd2a2fSSatoshi Sahara            'media_manager' => true,
79*25dd2a2fSSatoshi Sahara            'target' => ($INPUT->has('target') && $wr) ? $INPUT->str('target') : 'section',
80*25dd2a2fSSatoshi Sahara            'intro_locale' => $intro,
81*25dd2a2fSSatoshi Sahara        );
82*25dd2a2fSSatoshi Sahara
83*25dd2a2fSSatoshi Sahara        if ($data['target'] !== 'section') {
84*25dd2a2fSSatoshi Sahara            // Only emit event if page is writable, section edit data is valid and
85*25dd2a2fSSatoshi Sahara            // edit target is not section.
86*25dd2a2fSSatoshi Sahara            Event::createAndTrigger('HTML_EDIT_FORMSELECTION', $data, [$this,'addTextarea'], true);
87*25dd2a2fSSatoshi Sahara        } else {
88*25dd2a2fSSatoshi Sahara            $this->addTextarea($data);
89*25dd2a2fSSatoshi Sahara        }
90*25dd2a2fSSatoshi Sahara
91*25dd2a2fSSatoshi Sahara        $form->setHiddenField('target', $data['target']);
92*25dd2a2fSSatoshi Sahara
93*25dd2a2fSSatoshi Sahara        if ($INPUT->has('hid')) {
94*25dd2a2fSSatoshi Sahara            $form->setHiddenField('hid', $INPUT->str('hid'));
95*25dd2a2fSSatoshi Sahara        }
96*25dd2a2fSSatoshi Sahara        if ($INPUT->has('codeblockOffset')) {
97*25dd2a2fSSatoshi Sahara            $form->setHiddenField('codeblockOffset', $INPUT->str('codeblockOffset'));
98*25dd2a2fSSatoshi Sahara        }
99*25dd2a2fSSatoshi Sahara
100*25dd2a2fSSatoshi Sahara        $form->addTagOpen('div')->id('wiki__editbar')->addClass('editBar');
101*25dd2a2fSSatoshi Sahara
102*25dd2a2fSSatoshi Sahara        $form->addTagOpen('div')->id('size__ctl');
103*25dd2a2fSSatoshi Sahara        $form->addTagClose('div');
104*25dd2a2fSSatoshi Sahara
105*25dd2a2fSSatoshi Sahara        if ($wr) {
106*25dd2a2fSSatoshi Sahara            // add edit buttons: save, preview, cancel
107*25dd2a2fSSatoshi Sahara            $form->addTagOpen('div')->addClass('editButtons');
108*25dd2a2fSSatoshi Sahara            $form->addButton('do[save]', $lang['btn_save'])->attr('type', 'submit')
109*25dd2a2fSSatoshi Sahara                ->attrs(['accesskey' => 's', 'tabindex' => '4'])
110*25dd2a2fSSatoshi Sahara                ->id('edbtn__save');
111*25dd2a2fSSatoshi Sahara            $form->addButton('do[preview]', $lang['btn_preview'])->attr('type', 'submit')
112*25dd2a2fSSatoshi Sahara                ->attrs(['accesskey' => 'p', 'tabindex' => '5'])
113*25dd2a2fSSatoshi Sahara                ->id('edbtn__preview');
114*25dd2a2fSSatoshi Sahara            $form->addButton('do[cancel]', $lang['btn_cancel'])->attr('type', 'submit')
115*25dd2a2fSSatoshi Sahara                ->attrs(['tabindex' => '6']);
116*25dd2a2fSSatoshi Sahara            $form->addTagClose('div'); // close div editButtons class
117*25dd2a2fSSatoshi Sahara
118*25dd2a2fSSatoshi Sahara            // add a textbox for edit summary
119*25dd2a2fSSatoshi Sahara            $form->addTagOpen('div')->addClass('summary');
120*25dd2a2fSSatoshi Sahara            $input = $form->addTextInput('summary', $lang['summary'])
121*25dd2a2fSSatoshi Sahara                ->attrs(['size' => '50', 'tabindex' => '2'])
122*25dd2a2fSSatoshi Sahara                ->id('edit__summary')->addClass('edit')
123*25dd2a2fSSatoshi Sahara                ->val($SUM);
124*25dd2a2fSSatoshi Sahara            $input->getLabel()->attr('class', 'nowrap');
125*25dd2a2fSSatoshi Sahara
126*25dd2a2fSSatoshi Sahara            // adds a checkbox for minor edits for logged in users
127*25dd2a2fSSatoshi Sahara            if ($conf['useacl'] && $_SERVER['REMOTE_USER']) {
128*25dd2a2fSSatoshi Sahara                $form->addCheckbox('minor', $lang['minoredit'])->id('edit__minoredit')->addClass('nowrap')->val('1');
129*25dd2a2fSSatoshi Sahara            }
130*25dd2a2fSSatoshi Sahara            $form->addTagClose('div'); // close div summary class
131*25dd2a2fSSatoshi Sahara        }
132*25dd2a2fSSatoshi Sahara
133*25dd2a2fSSatoshi Sahara        $form->addTagClose('div'); // close div editBar class
134*25dd2a2fSSatoshi Sahara
135*25dd2a2fSSatoshi Sahara        // license note
136*25dd2a2fSSatoshi Sahara        if ($wr && $conf['license']) {
137*25dd2a2fSSatoshi Sahara            $form->addTagOpen('div')->addClass('license');
138*25dd2a2fSSatoshi Sahara            $form->addHTML($lang['licenseok']
139*25dd2a2fSSatoshi Sahara                .' <a href="'.$license[$conf['license']]['url'].'" rel="license" class="urlextern"'
140*25dd2a2fSSatoshi Sahara                . ($conf['target']['extern']) ? ' target="'.$conf['target']['extern'].'">' : '>'
141*25dd2a2fSSatoshi Sahara                . $license[$conf['license']]['name'].'</a>'
142*25dd2a2fSSatoshi Sahara            );
143*25dd2a2fSSatoshi Sahara            $form->addTagClose('div');
144*25dd2a2fSSatoshi Sahara        }
145*25dd2a2fSSatoshi Sahara
146*25dd2a2fSSatoshi Sahara        // start editor html output
147*25dd2a2fSSatoshi Sahara        if ($wr) {
148*25dd2a2fSSatoshi Sahara            // sets changed to true when previewed
149*25dd2a2fSSatoshi Sahara            echo '<script>/*<![CDATA[*/'. DOKU_LF;
150*25dd2a2fSSatoshi Sahara            echo 'textChanged = ' . ($mod ? 'true' : 'false');
151*25dd2a2fSSatoshi Sahara            echo '/*!]]>*/</script>' . DOKU_LF;
152*25dd2a2fSSatoshi Sahara        }
153*25dd2a2fSSatoshi Sahara
154*25dd2a2fSSatoshi Sahara        // print intro locale text (edit, rditrev, or read.txt)
155*25dd2a2fSSatoshi Sahara        if (isset($data['intro_locale'])) {
156*25dd2a2fSSatoshi Sahara            echo p_locale_xhtml($data['intro_locale']);
157*25dd2a2fSSatoshi Sahara        }
158*25dd2a2fSSatoshi Sahara
159*25dd2a2fSSatoshi Sahara        echo '<div class="editBox" role="application">';
160*25dd2a2fSSatoshi Sahara
161*25dd2a2fSSatoshi Sahara        echo '<div class="toolbar group">';
162*25dd2a2fSSatoshi Sahara        echo '<div id="tool__bar" class="tool__bar">';
163*25dd2a2fSSatoshi Sahara        if ($wr && $data['media_manager']) {
164*25dd2a2fSSatoshi Sahara            echo '<a href="'.DOKU_BASE.'lib/exe/mediamanager.php?ns='.$INFO['namespace'].'" target="_blank">';
165*25dd2a2fSSatoshi Sahara            echo $lang['mediaselect'];
166*25dd2a2fSSatoshi Sahara            echo '</a>';
167*25dd2a2fSSatoshi Sahara        }
168*25dd2a2fSSatoshi Sahara        echo '</div>';
169*25dd2a2fSSatoshi Sahara        echo '</div>';
170*25dd2a2fSSatoshi Sahara
171*25dd2a2fSSatoshi Sahara        echo '<div id="draft__status" class="draft__status">';
172*25dd2a2fSSatoshi Sahara        $draft = new \dokuwiki\Draft($ID, $INFO['client']);
173*25dd2a2fSSatoshi Sahara        if ($draft->isDraftAvailable()) {
174*25dd2a2fSSatoshi Sahara            echo $draft->getDraftMessage();
175*25dd2a2fSSatoshi Sahara        }
176*25dd2a2fSSatoshi Sahara        echo '</div>'.DOKU_LF;
177*25dd2a2fSSatoshi Sahara
178*25dd2a2fSSatoshi Sahara        // emit HTML_EDITFORM_OUTPUT event, print the form
179*25dd2a2fSSatoshi Sahara        Event::createAndTrigger('HTML_EDITFORM_OUTPUT', $form, 'html_form_output', false);
180*25dd2a2fSSatoshi Sahara
181*25dd2a2fSSatoshi Sahara        echo '</div>'.DOKU_LF; // close div editBox class
182*25dd2a2fSSatoshi Sahara    }
183*25dd2a2fSSatoshi Sahara
184*25dd2a2fSSatoshi Sahara    /**
185*25dd2a2fSSatoshi Sahara     * Display the default edit form (textarea)
186*25dd2a2fSSatoshi Sahara     *
187*25dd2a2fSSatoshi Sahara     * the default action for HTML_EDIT_FORMSELECTION.
188*25dd2a2fSSatoshi Sahara     *
189*25dd2a2fSSatoshi Sahara     * @param mixed[] $data
190*25dd2a2fSSatoshi Sahara     */
191*25dd2a2fSSatoshi Sahara    public function addTextarea(&$data)
192*25dd2a2fSSatoshi Sahara    {
193*25dd2a2fSSatoshi Sahara        global $TEXT;
194*25dd2a2fSSatoshi Sahara
195*25dd2a2fSSatoshi Sahara        if ($data['target'] !== 'section') {
196*25dd2a2fSSatoshi Sahara            msg('No editor for edit target '. hsc($pdata['target']) .' found.', -1);
197*25dd2a2fSSatoshi Sahara        }
198*25dd2a2fSSatoshi Sahara
199*25dd2a2fSSatoshi Sahara        // set textarea attributes
200*25dd2a2fSSatoshi Sahara        $attr = array('tabindex' => '1');
201*25dd2a2fSSatoshi Sahara        if (!$data['wr']) $attr['readonly'] = 'readonly';
202*25dd2a2fSSatoshi Sahara        $attr['dir']  = 'auto';
203*25dd2a2fSSatoshi Sahara        $attr['cols'] = '80';
204*25dd2a2fSSatoshi Sahara        $attr['rows'] = '10';
205*25dd2a2fSSatoshi Sahara
206*25dd2a2fSSatoshi Sahara        $data['form']->addTextarea('wikitext','')->attrs($attr)->val($TEXT)
207*25dd2a2fSSatoshi Sahara                ->id('wiki__text')->addClass('edit');
208*25dd2a2fSSatoshi Sahara    }
209*25dd2a2fSSatoshi Sahara
210*25dd2a2fSSatoshi Sahara}
211