Editor   A
last analyzed

Complexity

Total Complexity 27

Size/Duplication

Total Lines 200
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 8

Importance

Changes 0
Metric Value
dl 0
loc 200
rs 10
c 0
b 0
f 0
wmc 27
lcom 0
cbo 8

2 Methods

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