Fossil SCM

Applied a patch by forum user vor0nwe to allow the WYSIWYG wiki page editor to work in the face of the new CSP restrictions on inline JavaScript. The patch and explicit license for inclusion in Fossil are here: https://fossil-scm.org/forum/forumpost/6985a4754e

wyoung 2018-10-10 19:49 trunk
Commit 543cdd4770efd184a81e6aa29280f42a5cba2977190dca3adcf436cd3c139cda
2 files changed +1 -1 +63 -41
+1 -1
--- src/wiki.c
+++ src/wiki.c
@@ -611,11 +611,11 @@
611611
}
612612
@ <input type="submit" name="preview" value="Preview Your Changes" />
613613
}else{
614614
/* Wysiwyg editing */
615615
Blob html, temp;
616
- form_begin("onsubmit='wysiwygSubmit()'", "%R/wikiedit");
616
+ form_begin("", "%R/wikiedit");
617617
@ <div>
618618
@ <input type="hidden" name="wysiwyg" value="1" />
619619
blob_zero(&temp);
620620
wiki_convert(&wiki, &temp, 0);
621621
blob_zero(&html);
622622
--- src/wiki.c
+++ src/wiki.c
@@ -611,11 +611,11 @@
611 }
612 @ <input type="submit" name="preview" value="Preview Your Changes" />
613 }else{
614 /* Wysiwyg editing */
615 Blob html, temp;
616 form_begin("onsubmit='wysiwygSubmit()'", "%R/wikiedit");
617 @ <div>
618 @ <input type="hidden" name="wysiwyg" value="1" />
619 blob_zero(&temp);
620 wiki_convert(&wiki, &temp, 0);
621 blob_zero(&html);
622
--- src/wiki.c
+++ src/wiki.c
@@ -611,11 +611,11 @@
611 }
612 @ <input type="submit" name="preview" value="Preview Your Changes" />
613 }else{
614 /* Wysiwyg editing */
615 Blob html, temp;
616 form_begin("", "%R/wikiedit");
617 @ <div>
618 @ <input type="hidden" name="wysiwyg" value="1" />
619 blob_zero(&temp);
620 wiki_convert(&wiki, &temp, 0);
621 blob_zero(&html);
622
+63 -41
--- src/wysiwyg.c
+++ src/wysiwyg.c
@@ -49,17 +49,16 @@
4949
@ #editMode label { cursor: pointer; }
5050
@ </style>
5151
5252
@ <input id="wysiwygValue" type="hidden" name="%s(zId)">
5353
@ <div id="editModeDiv">Edit mode:
54
- @ <select id="editMode" size=1 onchange="setDocMode(this.selectedIndex)">
54
+ @ <select id="editMode" size=1>
5555
@ <option value="0">WYSIWYG</option>
5656
@ <option value="1">Raw HTML</option>
5757
@ </select></div>
5858
@ <div id="toolBar1">
59
- @ <select onchange="formatDoc('formatblock',this[this.selectedIndex].value);
60
- @ this.selectedIndex=0;">
59
+ @ <select class="format" data-format="formatblock">
6160
@ <option selected>- formatting -</option>
6261
@ <option value="h1">Title 1 &lt;h1&gt;</option>
6362
@ <option value="h2">Title 2 &lt;h2&gt;</option>
6463
@ <option value="h3">Title 3 &lt;h3&gt;</option>
6564
@ <option value="h4">Title 4 &lt;h4&gt;</option>
@@ -66,52 +65,48 @@
6665
@ <option value="h5">Title 5 &lt;h5&gt;</option>
6766
@ <option value="h6">Subtitle &lt;h6&gt;</option>
6867
@ <option value="p">Paragraph &lt;p&gt;</option>
6968
@ <option value="pre">Preformatted &lt;pre&gt;</option>
7069
@ </select>
71
- @ <select onchange="formatDoc('fontname',this[this.selectedIndex].value);
72
- @ this.selectedIndex=0;">
70
+ @ <select class="format" data-format="fontname">
7371
@ <option class="heading" selected>- font -</option>
7472
@ <option>Arial</option>
7573
@ <option>Arial Black</option>
7674
@ <option>Courier New</option>
7775
@ <option>Times New Roman</option>
7876
@ </select>
79
- @ <select onchange="formatDoc('fontsize',this[this.selectedIndex].value);
80
- @ this.selectedIndex=0;">
77
+ @ <select class="format" data-format="fontsize">
8178
@ <option class="heading" selected>- size -</option>
8279
@ <option value="1">Very small</option>
8380
@ <option value="2">A bit small</option>
8481
@ <option value="3">Normal</option>
8582
@ <option value="4">Medium-large</option>
8683
@ <option value="5">Big</option>
8784
@ <option value="6">Very big</option>
8885
@ <option value="7">Maximum</option>
8986
@ </select>
90
- @ <select onchange="formatDoc('forecolor',this[this.selectedIndex].value);
91
- @ this.selectedIndex=0;">
87
+ @ <select class="format" data-format="forecolor">
9288
@ <option class="heading" selected>- color -</option>
9389
@ <option value="red">Red</option>
9490
@ <option value="blue">Blue</option>
9591
@ <option value="green">Green</option>
9692
@ <option value="black">Black</option>
9793
@ </select>
9894
@ </div>
9995
@ <div id="toolBar2">
100
- @ <img class="intLink" title="Undo" onclick="formatDoc('undo');"
96
+ @ <img class="intLink" title="Undo" data-format="undo"
10197
@ src="data:image/gif;base64,R0lGODlhFgAWAOMKADljwliE33mOrpGjuYKl8aezxqPD+7
10298
@ /I19DV3NHa7P///////////////////////yH5BAEKAA8ALAAAAAAWABYAAARR8MlJq704680
10399
@ 7TkaYeJJBnES4EeUJvIGapWYAC0CsocQ7SDlWJkAkCA6ToMYWIARGQF3mRQVIEjkkSVLIbSfE
104100
@ whdRIH4fh/DZMICe3/C4nBQBADs=">
105101
106
- @ <img class="intLink" title="Redo" onclick="formatDoc('redo');"
102
+ @ <img class="intLink" title="Redo" data-format="redo"
107103
@ src="data:image/gif;base64,R0lGODlhFgAWAMIHAB1ChDljwl9vj1iE34Kl8aPD+7/I1/
108104
@ ///yH5BAEKAAcALAAAAAAWABYAAANKeLrc/jDKSesyphi7SiEgsVXZEATDICqBVJjpqWZt9Na
109105
@ EDNbQK1wCQsxlYnxMAImhyDoFAElJasRRvAZVRqqQXUy7Cgx4TC6bswkAOw==">
110106
111
- @ <img class="intLink" title="Remove formatting"
112
- @ onclick="formatDoc('removeFormat')"
107
+ @ <img class="intLink" title="Remove formatting" data-format="removeFormat"
113108
@ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AA
114109
@ AABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOxAAADsQBlSsOGwA
115110
@ AAAd0SU1FB9oECQMCKPI8CIIAAAAIdEVYdENvbW1lbnQA9syWvwAAAuhJREFUOMtjYBgFxAB5
116111
@ 01ZWBvVaL2nHnlmk6mXCJbF69zU+Hz/9fB5O1lx+bg45qhl8/fYr5it3XrP/YWTUvvvk3VeqG
117112
@ Xz70TvbJy8+Wv39+2/Hz19/mGwjZzuTYjALuoBv9jImaXHeyD3H7kU8fPj2ICML8z92dlbtMz
@@ -126,98 +121,87 @@
126121
@ b/mZm0JcT5Lj+89+Ybm6zz95oMh7s4XbygN3Sluq4Mj5K8iKMgP4f0////fv77//8nLy+7MCc
127122
@ XmyYDAwODS9jM9tcvPypd35pne3ljdjvj26+H2dhYpuENikgfvQeXNmSl3tqepxXsqhXPyc66
128123
@ 6s+fv1fMdKR3TK72zpix8nTc7bdfhfkEeVbC9KhbK/9iYWHiErbu6MWbY/7//8/4//9/pgOnH
129124
@ 6jGVazvFDRtq2VgiBIZrUTIBgCk+ivHvuEKwAAAAABJRU5ErkJggg==">
130125
131
- @ <img class="intLink" title="Bold" onclick="formatDoc('bold');"
126
+ @ <img class="intLink" title="Bold" data-format="bold"
132127
@ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB
133128
@ YAQAInhI+pa+H9mJy0LhdgtrxzDG5WGFVk6aXqyk6Y9kXvKKNuLbb6zgMFADs=" />
134129
135
- @ <img class="intLink" title="Italic" onclick="formatDoc('italic');"
130
+ @ <img class="intLink" title="Italic" data-format="italic"
136131
@ src="data:image/gif;base64,R0lGODlhFgAWAKEDAAAAAF9vj5WIbf///yH5BAEAAAMALA
137132
@ AAAAAWABYAAAIjnI+py+0Po5x0gXvruEKHrF2BB1YiCWgbMFIYpsbyTNd2UwAAOw==" />
138133
139
- @ <img class="intLink" title="Underline" onclick="formatDoc('underline');"
134
+ @ <img class="intLink" title="Underline" data-format="underline"
140135
@ src="data:image/gif;base64,R0lGODlhFgAWAKECAAAAAF9vj////////yH5BAEAAAIALA
141136
@ AAAAAWABYAAAIrlI+py+0Po5zUgAsEzvEeL4Ea15EiJJ5PSqJmuwKBEKgxVuXWtun+DwxCCgA
142137
@ 7" />
143138
144
- @ <img class="intLink" title="Left align"
145
- @ onclick="formatDoc('justifyleft');"
139
+ @ <img class="intLink" title="Left align" data-format="justifyleft"
146140
@ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB
147141
@ YAQAIghI+py+0Po5y02ouz3jL4D4JMGELkGYxo+qzl4nKyXAAAOw==" />
148142
149
- @ <img class="intLink" title="Center align"
150
- @ onclick="formatDoc('justifycenter');"
143
+ @ <img class="intLink" title="Center align" data-format="justifycenter"
151144
@ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB
152145
@ YAQAIfhI+py+0Po5y02ouz3jL4D4JOGI7kaZ5Bqn4sycVbAQA7" />
153146
154
- @ <img class="intLink" title="Right align"
155
- @ onclick="formatDoc('justifyright');"
147
+ @ <img class="intLink" title="Right align" data-format="justifyright"
156148
@ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB
157149
@ YAQAIghI+py+0Po5y02ouz3jL4D4JQGDLkGYxouqzl43JyVgAAOw==" />
158150
@ <img class="intLink" title="Numbered list"
159
- @ onclick="formatDoc('insertorderedlist');"
151
+ @ data-format="insertorderedlist"
160152
@ src="data:image/gif;base64,R0lGODlhFgAWAMIGAAAAADljwliE35GjuaezxtHa7P////
161153
@ ///yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKSespwjoRFvggCBUBoTFBeq6QIAysQnRHaEO
162154
@ zyaZ07Lu9lUBnC0UGQU1K52s6n5oEADs=" />
163155
164
- @ <img class="intLink" title="Dotted list"
165
- @ onclick="formatDoc('insertunorderedlist');"
156
+ @ <img class="intLink" title="Dotted list"
157
+ @ data-format="insertunorderedlist"
166158
@ src="data:image/gif;base64,R0lGODlhFgAWAMIGAAAAAB1ChF9vj1iE33mOrqezxv////
167159
@ ///yH5BAEAAAcALAAAAAAWABYAAAMyeLrc/jDKSesppNhGRlBAKIZRERBbqm6YtnbfMY7lud6
168160
@ 4UwiuKnigGQliQuWOyKQykgAAOw==" />
169161
170
- @ <img class="intLink" title="Quote"
171
- @ onclick="formatDoc('formatblock','blockquote');"
162
+ @ <img class="intLink" title="Quote" data-format="formatblock"
172163
@ src="data:image/gif;base64,R0lGODlhFgAWAIQXAC1NqjFRjkBgmT9nqUJnsk9xrFJ7u2
173164
@ R9qmKBt1iGzHmOrm6Sz4OXw3Odz4Cl2ZSnw6KxyqO306K63bG70bTB0rDI3bvI4P/////////
174165
@ //////////////////////////yH5BAEKAB8ALAAAAAAWABYAAAVP4CeOZGmeaKqubEs2Cekk
175166
@ ErvEI1zZuOgYFlakECEZFi0GgTGKEBATFmJAVXweVOoKEQgABB9IQDCmrLpjETrQQlhHjINrT
176167
@ q/b7/i8fp8PAQA7" />
177168
178
- @ <img class="intLink" title="Delete indentation"
179
- @ onclick="formatDoc('outdent');"
169
+ @ <img class="intLink" title="Delete indentation" data-format="outdent"
180170
@ src="data:image/gif;base64,R0lGODlhFgAWAMIHAAAAADljwliE35GjuaezxtDV3NHa7P
181171
@ ///yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKCQG9F2i7u8agQgyK1z2EIBil+TWqEMxhMcz
182172
@ sYVJ3e4ahk+sFnAgtxSQDqWw6n5cEADs=" />
183173
184
- @ <img class="intLink" title="Add indentation"
185
- @ onclick="formatDoc('indent');"
174
+ @ <img class="intLink" title="Add indentation" data-format="indent"
186175
@ src="data:image/gif;base64,R0lGODlhFgAWAOMIAAAAADljwl9vj1iE35GjuaezxtDV3N
187176
@ Ha7P///////////////////////////////yH5BAEAAAgALAAAAAAWABYAAAQ7EMlJq704650
188177
@ B/x8gemMpgugwHJNZXodKsO5oqUOgo5KhBwWESyMQsCRDHu9VOyk5TM9zSpFSr9gsJwIAOw==">
189178
190
- @ <img class="intLink" title="Hyperlink"
191
- @ onclick="var sLnk=prompt('Target URL:','');
192
- @ if(sLnk&&sLnk!=''){formatDoc('createlink',sLnk)}"
179
+ @ <img class="intLink" title="Hyperlink" data-format="createlink"
193180
@ src="data:image/gif;base64,R0lGODlhFgAWAOMKAB1ChDRLY19vj3mOrpGjuaezxrCztb
194181
@ /I19Ha7Pv8/f///////////////////////yH5BAEKAA8ALAAAAAAWABYAAARY8MlJq704682
195182
@ 7/2BYIQVhHg9pEgVGIklyDEUBy/RlE4FQF4dCj2AQXAiJQDCWQCAEBwIioEMQBgSAFhDAGghG
196183
@ i9XgHAhMNoSZgJkJei33UESv2+/4vD4TAQA7" />
197184
198185
#if 0 /* Cut/Copy/Paste requires special browser permissions for security
199186
** reasons. So omit these buttons */
200
- @ <img class="intLink" title="Cut"
201
- @ onclick="formatDoc('cut');"
187
+ @ <img class="intLink" title="Cut" data-format="cut"
202188
@ src="data:image/gif;base64,R0lGODlhFgAWAIQSAB1ChBFNsRJTySJYwjljwkxwl19vj1
203189
@ dusYODhl6MnHmOrpqbmpGjuaezxrCztcDCxL/I18rL1P/////////////////////////////
204190
@ //////////////////////////yH5BAEAAB8ALAAAAAAWABYAAAVu4CeOZGmeaKqubDs6TNnE
205191
@ bGNApNG0kbGMi5trwcA9GArXh+FAfBAw5UexUDAQESkRsfhJPwaH4YsEGAAJGisRGAQY7UCC9
206192
@ ZAXBB+74LGCRxIEHwAHdWooDgGJcwpxDisQBQRjIgkDCVlfmZqbmiEAOw==" />
207193
208
- @ <img class="intLink" title="Copy"
209
- @ onclick="formatDoc('copy');"
194
+ @ <img class="intLink" title="Copy" data-format="copy"
210195
@ src="data:image/gif;base64,R0lGODlhFgAWAIQcAB1ChBFNsTRLYyJYwjljwl9vj1iE31
211196
@ iGzF6MnHWX9HOdz5GjuYCl2YKl8ZOt4qezxqK63aK/9KPD+7DI3b/I17LM/MrL1MLY9NHa7OP
212197
@ s++bx/Pv8/f///////////////yH5BAEAAB8ALAAAAAAWABYAAAWG4CeOZGmeaKqubOum1SQ/
213198
@ kPVOW749BeVSus2CgrCxHptLBbOQxCSNCCaF1GUqwQbBd0JGJAyGJJiobE+LnCaDcXAaEoxhQ
214199
@ ACgNw0FQx9kP+wmaRgYFBQNeAoGihCAJQsCkJAKOhgXEw8BLQYciooHf5o7EA+kC40qBKkAAA
215200
@ Grpy+wsbKzIiEAOw==" />
216201
217
- @ <img class="intLink" title="Paste"
218
- @ onclick="formatDoc('paste');"
202
+ @ <img class="intLink" title="Paste" data-format="paste"
219203
@ src="data:image/gif;base64,R0lGODlhFgAWAIQUAD04KTRLY2tXQF9vj414WZWIbXmOrp
220204
@ qbmpGjudClFaezxsa0cb/I1+3YitHa7PrkIPHvbuPs+/fvrvv8/f/////////////////////
221205
@ //////////////////////////yH5BAEAAB8ALAAAAAAWABYAAAWN4CeOZGmeaKqubGsusPvB
222206
@ SyFJjVDs6nJLB0khR4AkBCmfsCGBQAoCwjF5gwquVykSFbwZE+AwIBV0GhFog2EwIDchjwRiQ
223207
@ o9E2Fx4XD5R+B0DDAEnBXBhBhN2DgwDAQFjJYVhCQYRfgoIDGiQJAWTCQMRiwwMfgicnVcAAA
@@ -224,20 +208,58 @@
224208
@ MOaK+bLAOrtLUyt7i5uiUhADs=" />
225209
#endif
226210
227211
@ </div>
228212
@ <div id="wysiwygBox"
229
- @ style="resize:both; overflow:auto; width: %d(w)em; height: %d(h)em;"
213
+ @ style="resize:both;overflow:auto;width:95%%;min-height:%d(h)em;"
230214
@ contenteditable="true">%s(zContent)</div>
231215
@ <script nonce="%h(style_nonce())">
232216
@ var oDoc;
233217
@
234218
@ /* Initialize the document editor */
235219
@ function initDoc() {
220
+ @ initEventHandlers();
236221
@ oDoc = document.getElementById("wysiwygBox");
237222
@ if (!isWysiwyg()) { setDocMode(true); }
238223
@ }
224
+ @
225
+ @ function initEventHandlers() {
226
+ @ document.querySelector('form').onsubmit = wysiwygSubmit;
227
+ @ document.querySelector('#editMode').onchange = function() {
228
+ @ setDocMode(this.selectedIndex)
229
+ @ };
230
+ @ var controls = document.querySelectorAll('select.format');
231
+ @ for(var i = 0; i < controls.length; i++) {
232
+ @ controls[i].onchange = handleDropDown;
233
+ @ }
234
+ @ controls = document.querySelectorAll('.intLink');
235
+ @ for(i = 0; i < controls.length; i++) {
236
+ @ controls[i].onclick = handleFormatButton;
237
+ @ }
238
+ @
239
+ @ function handleDropDown() {
240
+ @ formatDoc(this.dataset.format,this[this.selectedIndex].value);
241
+ @ this.selectedIndex = 0;
242
+ @ }
243
+ @
244
+ @ function handleFormatButton() {
245
+ @ var extra;
246
+ @ switch (this.dataset.format) {
247
+ @ case 'createlink':
248
+ @ var sLnk = prompt('Target URL:','');
249
+ @ if(sLnk && sLnk != '')
250
+ @ {
251
+ @ extra = sLnk;
252
+ @ }
253
+ @ break;
254
+ @ case 'formatblock':
255
+ @ extra = 'blockquote';
256
+ @ break;
257
+ @ }
258
+ @ formatDoc(this.dataset.format, extra);
259
+ @ }
260
+ @ }
239261
@
240262
@ /* Return true if the document editor is in WYSIWYG mode. Return
241263
@ ** false if it is in Markup mode */
242264
@ function isWysiwyg() {
243265
@ return document.getElementById("editMode").selectedIndex==0;
244266
--- src/wysiwyg.c
+++ src/wysiwyg.c
@@ -49,17 +49,16 @@
49 @ #editMode label { cursor: pointer; }
50 @ </style>
51
52 @ <input id="wysiwygValue" type="hidden" name="%s(zId)">
53 @ <div id="editModeDiv">Edit mode:
54 @ <select id="editMode" size=1 onchange="setDocMode(this.selectedIndex)">
55 @ <option value="0">WYSIWYG</option>
56 @ <option value="1">Raw HTML</option>
57 @ </select></div>
58 @ <div id="toolBar1">
59 @ <select onchange="formatDoc('formatblock',this[this.selectedIndex].value);
60 @ this.selectedIndex=0;">
61 @ <option selected>- formatting -</option>
62 @ <option value="h1">Title 1 &lt;h1&gt;</option>
63 @ <option value="h2">Title 2 &lt;h2&gt;</option>
64 @ <option value="h3">Title 3 &lt;h3&gt;</option>
65 @ <option value="h4">Title 4 &lt;h4&gt;</option>
@@ -66,52 +65,48 @@
66 @ <option value="h5">Title 5 &lt;h5&gt;</option>
67 @ <option value="h6">Subtitle &lt;h6&gt;</option>
68 @ <option value="p">Paragraph &lt;p&gt;</option>
69 @ <option value="pre">Preformatted &lt;pre&gt;</option>
70 @ </select>
71 @ <select onchange="formatDoc('fontname',this[this.selectedIndex].value);
72 @ this.selectedIndex=0;">
73 @ <option class="heading" selected>- font -</option>
74 @ <option>Arial</option>
75 @ <option>Arial Black</option>
76 @ <option>Courier New</option>
77 @ <option>Times New Roman</option>
78 @ </select>
79 @ <select onchange="formatDoc('fontsize',this[this.selectedIndex].value);
80 @ this.selectedIndex=0;">
81 @ <option class="heading" selected>- size -</option>
82 @ <option value="1">Very small</option>
83 @ <option value="2">A bit small</option>
84 @ <option value="3">Normal</option>
85 @ <option value="4">Medium-large</option>
86 @ <option value="5">Big</option>
87 @ <option value="6">Very big</option>
88 @ <option value="7">Maximum</option>
89 @ </select>
90 @ <select onchange="formatDoc('forecolor',this[this.selectedIndex].value);
91 @ this.selectedIndex=0;">
92 @ <option class="heading" selected>- color -</option>
93 @ <option value="red">Red</option>
94 @ <option value="blue">Blue</option>
95 @ <option value="green">Green</option>
96 @ <option value="black">Black</option>
97 @ </select>
98 @ </div>
99 @ <div id="toolBar2">
100 @ <img class="intLink" title="Undo" onclick="formatDoc('undo');"
101 @ src="data:image/gif;base64,R0lGODlhFgAWAOMKADljwliE33mOrpGjuYKl8aezxqPD+7
102 @ /I19DV3NHa7P///////////////////////yH5BAEKAA8ALAAAAAAWABYAAARR8MlJq704680
103 @ 7TkaYeJJBnES4EeUJvIGapWYAC0CsocQ7SDlWJkAkCA6ToMYWIARGQF3mRQVIEjkkSVLIbSfE
104 @ whdRIH4fh/DZMICe3/C4nBQBADs=">
105
106 @ <img class="intLink" title="Redo" onclick="formatDoc('redo');"
107 @ src="data:image/gif;base64,R0lGODlhFgAWAMIHAB1ChDljwl9vj1iE34Kl8aPD+7/I1/
108 @ ///yH5BAEKAAcALAAAAAAWABYAAANKeLrc/jDKSesyphi7SiEgsVXZEATDICqBVJjpqWZt9Na
109 @ EDNbQK1wCQsxlYnxMAImhyDoFAElJasRRvAZVRqqQXUy7Cgx4TC6bswkAOw==">
110
111 @ <img class="intLink" title="Remove formatting"
112 @ onclick="formatDoc('removeFormat')"
113 @ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AA
114 @ AABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOxAAADsQBlSsOGwA
115 @ AAAd0SU1FB9oECQMCKPI8CIIAAAAIdEVYdENvbW1lbnQA9syWvwAAAuhJREFUOMtjYBgFxAB5
116 @ 01ZWBvVaL2nHnlmk6mXCJbF69zU+Hz/9fB5O1lx+bg45qhl8/fYr5it3XrP/YWTUvvvk3VeqG
117 @ Xz70TvbJy8+Wv39+2/Hz19/mGwjZzuTYjALuoBv9jImaXHeyD3H7kU8fPj2ICML8z92dlbtMz
@@ -126,98 +121,87 @@
126 @ b/mZm0JcT5Lj+89+Ybm6zz95oMh7s4XbygN3Sluq4Mj5K8iKMgP4f0////fv77//8nLy+7MCc
127 @ XmyYDAwODS9jM9tcvPypd35pne3ljdjvj26+H2dhYpuENikgfvQeXNmSl3tqepxXsqhXPyc66
128 @ 6s+fv1fMdKR3TK72zpix8nTc7bdfhfkEeVbC9KhbK/9iYWHiErbu6MWbY/7//8/4//9/pgOnH
129 @ 6jGVazvFDRtq2VgiBIZrUTIBgCk+ivHvuEKwAAAAABJRU5ErkJggg==">
130
131 @ <img class="intLink" title="Bold" onclick="formatDoc('bold');"
132 @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB
133 @ YAQAInhI+pa+H9mJy0LhdgtrxzDG5WGFVk6aXqyk6Y9kXvKKNuLbb6zgMFADs=" />
134
135 @ <img class="intLink" title="Italic" onclick="formatDoc('italic');"
136 @ src="data:image/gif;base64,R0lGODlhFgAWAKEDAAAAAF9vj5WIbf///yH5BAEAAAMALA
137 @ AAAAAWABYAAAIjnI+py+0Po5x0gXvruEKHrF2BB1YiCWgbMFIYpsbyTNd2UwAAOw==" />
138
139 @ <img class="intLink" title="Underline" onclick="formatDoc('underline');"
140 @ src="data:image/gif;base64,R0lGODlhFgAWAKECAAAAAF9vj////////yH5BAEAAAIALA
141 @ AAAAAWABYAAAIrlI+py+0Po5zUgAsEzvEeL4Ea15EiJJ5PSqJmuwKBEKgxVuXWtun+DwxCCgA
142 @ 7" />
143
144 @ <img class="intLink" title="Left align"
145 @ onclick="formatDoc('justifyleft');"
146 @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB
147 @ YAQAIghI+py+0Po5y02ouz3jL4D4JMGELkGYxo+qzl4nKyXAAAOw==" />
148
149 @ <img class="intLink" title="Center align"
150 @ onclick="formatDoc('justifycenter');"
151 @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB
152 @ YAQAIfhI+py+0Po5y02ouz3jL4D4JOGI7kaZ5Bqn4sycVbAQA7" />
153
154 @ <img class="intLink" title="Right align"
155 @ onclick="formatDoc('justifyright');"
156 @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB
157 @ YAQAIghI+py+0Po5y02ouz3jL4D4JQGDLkGYxouqzl43JyVgAAOw==" />
158 @ <img class="intLink" title="Numbered list"
159 @ onclick="formatDoc('insertorderedlist');"
160 @ src="data:image/gif;base64,R0lGODlhFgAWAMIGAAAAADljwliE35GjuaezxtHa7P////
161 @ ///yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKSespwjoRFvggCBUBoTFBeq6QIAysQnRHaEO
162 @ zyaZ07Lu9lUBnC0UGQU1K52s6n5oEADs=" />
163
164 @ <img class="intLink" title="Dotted list"
165 @ onclick="formatDoc('insertunorderedlist');"
166 @ src="data:image/gif;base64,R0lGODlhFgAWAMIGAAAAAB1ChF9vj1iE33mOrqezxv////
167 @ ///yH5BAEAAAcALAAAAAAWABYAAAMyeLrc/jDKSesppNhGRlBAKIZRERBbqm6YtnbfMY7lud6
168 @ 4UwiuKnigGQliQuWOyKQykgAAOw==" />
169
170 @ <img class="intLink" title="Quote"
171 @ onclick="formatDoc('formatblock','blockquote');"
172 @ src="data:image/gif;base64,R0lGODlhFgAWAIQXAC1NqjFRjkBgmT9nqUJnsk9xrFJ7u2
173 @ R9qmKBt1iGzHmOrm6Sz4OXw3Odz4Cl2ZSnw6KxyqO306K63bG70bTB0rDI3bvI4P/////////
174 @ //////////////////////////yH5BAEKAB8ALAAAAAAWABYAAAVP4CeOZGmeaKqubEs2Cekk
175 @ ErvEI1zZuOgYFlakECEZFi0GgTGKEBATFmJAVXweVOoKEQgABB9IQDCmrLpjETrQQlhHjINrT
176 @ q/b7/i8fp8PAQA7" />
177
178 @ <img class="intLink" title="Delete indentation"
179 @ onclick="formatDoc('outdent');"
180 @ src="data:image/gif;base64,R0lGODlhFgAWAMIHAAAAADljwliE35GjuaezxtDV3NHa7P
181 @ ///yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKCQG9F2i7u8agQgyK1z2EIBil+TWqEMxhMcz
182 @ sYVJ3e4ahk+sFnAgtxSQDqWw6n5cEADs=" />
183
184 @ <img class="intLink" title="Add indentation"
185 @ onclick="formatDoc('indent');"
186 @ src="data:image/gif;base64,R0lGODlhFgAWAOMIAAAAADljwl9vj1iE35GjuaezxtDV3N
187 @ Ha7P///////////////////////////////yH5BAEAAAgALAAAAAAWABYAAAQ7EMlJq704650
188 @ B/x8gemMpgugwHJNZXodKsO5oqUOgo5KhBwWESyMQsCRDHu9VOyk5TM9zSpFSr9gsJwIAOw==">
189
190 @ <img class="intLink" title="Hyperlink"
191 @ onclick="var sLnk=prompt('Target URL:','');
192 @ if(sLnk&&sLnk!=''){formatDoc('createlink',sLnk)}"
193 @ src="data:image/gif;base64,R0lGODlhFgAWAOMKAB1ChDRLY19vj3mOrpGjuaezxrCztb
194 @ /I19Ha7Pv8/f///////////////////////yH5BAEKAA8ALAAAAAAWABYAAARY8MlJq704682
195 @ 7/2BYIQVhHg9pEgVGIklyDEUBy/RlE4FQF4dCj2AQXAiJQDCWQCAEBwIioEMQBgSAFhDAGghG
196 @ i9XgHAhMNoSZgJkJei33UESv2+/4vD4TAQA7" />
197
198 #if 0 /* Cut/Copy/Paste requires special browser permissions for security
199 ** reasons. So omit these buttons */
200 @ <img class="intLink" title="Cut"
201 @ onclick="formatDoc('cut');"
202 @ src="data:image/gif;base64,R0lGODlhFgAWAIQSAB1ChBFNsRJTySJYwjljwkxwl19vj1
203 @ dusYODhl6MnHmOrpqbmpGjuaezxrCztcDCxL/I18rL1P/////////////////////////////
204 @ //////////////////////////yH5BAEAAB8ALAAAAAAWABYAAAVu4CeOZGmeaKqubDs6TNnE
205 @ bGNApNG0kbGMi5trwcA9GArXh+FAfBAw5UexUDAQESkRsfhJPwaH4YsEGAAJGisRGAQY7UCC9
206 @ ZAXBB+74LGCRxIEHwAHdWooDgGJcwpxDisQBQRjIgkDCVlfmZqbmiEAOw==" />
207
208 @ <img class="intLink" title="Copy"
209 @ onclick="formatDoc('copy');"
210 @ src="data:image/gif;base64,R0lGODlhFgAWAIQcAB1ChBFNsTRLYyJYwjljwl9vj1iE31
211 @ iGzF6MnHWX9HOdz5GjuYCl2YKl8ZOt4qezxqK63aK/9KPD+7DI3b/I17LM/MrL1MLY9NHa7OP
212 @ s++bx/Pv8/f///////////////yH5BAEAAB8ALAAAAAAWABYAAAWG4CeOZGmeaKqubOum1SQ/
213 @ kPVOW749BeVSus2CgrCxHptLBbOQxCSNCCaF1GUqwQbBd0JGJAyGJJiobE+LnCaDcXAaEoxhQ
214 @ ACgNw0FQx9kP+wmaRgYFBQNeAoGihCAJQsCkJAKOhgXEw8BLQYciooHf5o7EA+kC40qBKkAAA
215 @ Grpy+wsbKzIiEAOw==" />
216
217 @ <img class="intLink" title="Paste"
218 @ onclick="formatDoc('paste');"
219 @ src="data:image/gif;base64,R0lGODlhFgAWAIQUAD04KTRLY2tXQF9vj414WZWIbXmOrp
220 @ qbmpGjudClFaezxsa0cb/I1+3YitHa7PrkIPHvbuPs+/fvrvv8/f/////////////////////
221 @ //////////////////////////yH5BAEAAB8ALAAAAAAWABYAAAWN4CeOZGmeaKqubGsusPvB
222 @ SyFJjVDs6nJLB0khR4AkBCmfsCGBQAoCwjF5gwquVykSFbwZE+AwIBV0GhFog2EwIDchjwRiQ
223 @ o9E2Fx4XD5R+B0DDAEnBXBhBhN2DgwDAQFjJYVhCQYRfgoIDGiQJAWTCQMRiwwMfgicnVcAAA
@@ -224,20 +208,58 @@
224 @ MOaK+bLAOrtLUyt7i5uiUhADs=" />
225 #endif
226
227 @ </div>
228 @ <div id="wysiwygBox"
229 @ style="resize:both; overflow:auto; width: %d(w)em; height: %d(h)em;"
230 @ contenteditable="true">%s(zContent)</div>
231 @ <script nonce="%h(style_nonce())">
232 @ var oDoc;
233 @
234 @ /* Initialize the document editor */
235 @ function initDoc() {
 
236 @ oDoc = document.getElementById("wysiwygBox");
237 @ if (!isWysiwyg()) { setDocMode(true); }
238 @ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
239 @
240 @ /* Return true if the document editor is in WYSIWYG mode. Return
241 @ ** false if it is in Markup mode */
242 @ function isWysiwyg() {
243 @ return document.getElementById("editMode").selectedIndex==0;
244
--- src/wysiwyg.c
+++ src/wysiwyg.c
@@ -49,17 +49,16 @@
49 @ #editMode label { cursor: pointer; }
50 @ </style>
51
52 @ <input id="wysiwygValue" type="hidden" name="%s(zId)">
53 @ <div id="editModeDiv">Edit mode:
54 @ <select id="editMode" size=1>
55 @ <option value="0">WYSIWYG</option>
56 @ <option value="1">Raw HTML</option>
57 @ </select></div>
58 @ <div id="toolBar1">
59 @ <select class="format" data-format="formatblock">
 
60 @ <option selected>- formatting -</option>
61 @ <option value="h1">Title 1 &lt;h1&gt;</option>
62 @ <option value="h2">Title 2 &lt;h2&gt;</option>
63 @ <option value="h3">Title 3 &lt;h3&gt;</option>
64 @ <option value="h4">Title 4 &lt;h4&gt;</option>
@@ -66,52 +65,48 @@
65 @ <option value="h5">Title 5 &lt;h5&gt;</option>
66 @ <option value="h6">Subtitle &lt;h6&gt;</option>
67 @ <option value="p">Paragraph &lt;p&gt;</option>
68 @ <option value="pre">Preformatted &lt;pre&gt;</option>
69 @ </select>
70 @ <select class="format" data-format="fontname">
 
71 @ <option class="heading" selected>- font -</option>
72 @ <option>Arial</option>
73 @ <option>Arial Black</option>
74 @ <option>Courier New</option>
75 @ <option>Times New Roman</option>
76 @ </select>
77 @ <select class="format" data-format="fontsize">
 
78 @ <option class="heading" selected>- size -</option>
79 @ <option value="1">Very small</option>
80 @ <option value="2">A bit small</option>
81 @ <option value="3">Normal</option>
82 @ <option value="4">Medium-large</option>
83 @ <option value="5">Big</option>
84 @ <option value="6">Very big</option>
85 @ <option value="7">Maximum</option>
86 @ </select>
87 @ <select class="format" data-format="forecolor">
 
88 @ <option class="heading" selected>- color -</option>
89 @ <option value="red">Red</option>
90 @ <option value="blue">Blue</option>
91 @ <option value="green">Green</option>
92 @ <option value="black">Black</option>
93 @ </select>
94 @ </div>
95 @ <div id="toolBar2">
96 @ <img class="intLink" title="Undo" data-format="undo"
97 @ src="data:image/gif;base64,R0lGODlhFgAWAOMKADljwliE33mOrpGjuYKl8aezxqPD+7
98 @ /I19DV3NHa7P///////////////////////yH5BAEKAA8ALAAAAAAWABYAAARR8MlJq704680
99 @ 7TkaYeJJBnES4EeUJvIGapWYAC0CsocQ7SDlWJkAkCA6ToMYWIARGQF3mRQVIEjkkSVLIbSfE
100 @ whdRIH4fh/DZMICe3/C4nBQBADs=">
101
102 @ <img class="intLink" title="Redo" data-format="redo"
103 @ src="data:image/gif;base64,R0lGODlhFgAWAMIHAB1ChDljwl9vj1iE34Kl8aPD+7/I1/
104 @ ///yH5BAEKAAcALAAAAAAWABYAAANKeLrc/jDKSesyphi7SiEgsVXZEATDICqBVJjpqWZt9Na
105 @ EDNbQK1wCQsxlYnxMAImhyDoFAElJasRRvAZVRqqQXUy7Cgx4TC6bswkAOw==">
106
107 @ <img class="intLink" title="Remove formatting" data-format="removeFormat"
 
108 @ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AA
109 @ AABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOxAAADsQBlSsOGwA
110 @ AAAd0SU1FB9oECQMCKPI8CIIAAAAIdEVYdENvbW1lbnQA9syWvwAAAuhJREFUOMtjYBgFxAB5
111 @ 01ZWBvVaL2nHnlmk6mXCJbF69zU+Hz/9fB5O1lx+bg45qhl8/fYr5it3XrP/YWTUvvvk3VeqG
112 @ Xz70TvbJy8+Wv39+2/Hz19/mGwjZzuTYjALuoBv9jImaXHeyD3H7kU8fPj2ICML8z92dlbtMz
@@ -126,98 +121,87 @@
121 @ b/mZm0JcT5Lj+89+Ybm6zz95oMh7s4XbygN3Sluq4Mj5K8iKMgP4f0////fv77//8nLy+7MCc
122 @ XmyYDAwODS9jM9tcvPypd35pne3ljdjvj26+H2dhYpuENikgfvQeXNmSl3tqepxXsqhXPyc66
123 @ 6s+fv1fMdKR3TK72zpix8nTc7bdfhfkEeVbC9KhbK/9iYWHiErbu6MWbY/7//8/4//9/pgOnH
124 @ 6jGVazvFDRtq2VgiBIZrUTIBgCk+ivHvuEKwAAAAABJRU5ErkJggg==">
125
126 @ <img class="intLink" title="Bold" data-format="bold"
127 @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB
128 @ YAQAInhI+pa+H9mJy0LhdgtrxzDG5WGFVk6aXqyk6Y9kXvKKNuLbb6zgMFADs=" />
129
130 @ <img class="intLink" title="Italic" data-format="italic"
131 @ src="data:image/gif;base64,R0lGODlhFgAWAKEDAAAAAF9vj5WIbf///yH5BAEAAAMALA
132 @ AAAAAWABYAAAIjnI+py+0Po5x0gXvruEKHrF2BB1YiCWgbMFIYpsbyTNd2UwAAOw==" />
133
134 @ <img class="intLink" title="Underline" data-format="underline"
135 @ src="data:image/gif;base64,R0lGODlhFgAWAKECAAAAAF9vj////////yH5BAEAAAIALA
136 @ AAAAAWABYAAAIrlI+py+0Po5zUgAsEzvEeL4Ea15EiJJ5PSqJmuwKBEKgxVuXWtun+DwxCCgA
137 @ 7" />
138
139 @ <img class="intLink" title="Left align" data-format="justifyleft"
 
140 @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB
141 @ YAQAIghI+py+0Po5y02ouz3jL4D4JMGELkGYxo+qzl4nKyXAAAOw==" />
142
143 @ <img class="intLink" title="Center align" data-format="justifycenter"
 
144 @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB
145 @ YAQAIfhI+py+0Po5y02ouz3jL4D4JOGI7kaZ5Bqn4sycVbAQA7" />
146
147 @ <img class="intLink" title="Right align" data-format="justifyright"
 
148 @ src="data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB
149 @ YAQAIghI+py+0Po5y02ouz3jL4D4JQGDLkGYxouqzl43JyVgAAOw==" />
150 @ <img class="intLink" title="Numbered list"
151 @ data-format="insertorderedlist"
152 @ src="data:image/gif;base64,R0lGODlhFgAWAMIGAAAAADljwliE35GjuaezxtHa7P////
153 @ ///yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKSespwjoRFvggCBUBoTFBeq6QIAysQnRHaEO
154 @ zyaZ07Lu9lUBnC0UGQU1K52s6n5oEADs=" />
155
156 @ <img class="intLink" title="Dotted list"
157 @ data-format="insertunorderedlist"
158 @ src="data:image/gif;base64,R0lGODlhFgAWAMIGAAAAAB1ChF9vj1iE33mOrqezxv////
159 @ ///yH5BAEAAAcALAAAAAAWABYAAAMyeLrc/jDKSesppNhGRlBAKIZRERBbqm6YtnbfMY7lud6
160 @ 4UwiuKnigGQliQuWOyKQykgAAOw==" />
161
162 @ <img class="intLink" title="Quote" data-format="formatblock"
 
163 @ src="data:image/gif;base64,R0lGODlhFgAWAIQXAC1NqjFRjkBgmT9nqUJnsk9xrFJ7u2
164 @ R9qmKBt1iGzHmOrm6Sz4OXw3Odz4Cl2ZSnw6KxyqO306K63bG70bTB0rDI3bvI4P/////////
165 @ //////////////////////////yH5BAEKAB8ALAAAAAAWABYAAAVP4CeOZGmeaKqubEs2Cekk
166 @ ErvEI1zZuOgYFlakECEZFi0GgTGKEBATFmJAVXweVOoKEQgABB9IQDCmrLpjETrQQlhHjINrT
167 @ q/b7/i8fp8PAQA7" />
168
169 @ <img class="intLink" title="Delete indentation" data-format="outdent"
 
170 @ src="data:image/gif;base64,R0lGODlhFgAWAMIHAAAAADljwliE35GjuaezxtDV3NHa7P
171 @ ///yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKCQG9F2i7u8agQgyK1z2EIBil+TWqEMxhMcz
172 @ sYVJ3e4ahk+sFnAgtxSQDqWw6n5cEADs=" />
173
174 @ <img class="intLink" title="Add indentation" data-format="indent"
 
175 @ src="data:image/gif;base64,R0lGODlhFgAWAOMIAAAAADljwl9vj1iE35GjuaezxtDV3N
176 @ Ha7P///////////////////////////////yH5BAEAAAgALAAAAAAWABYAAAQ7EMlJq704650
177 @ B/x8gemMpgugwHJNZXodKsO5oqUOgo5KhBwWESyMQsCRDHu9VOyk5TM9zSpFSr9gsJwIAOw==">
178
179 @ <img class="intLink" title="Hyperlink" data-format="createlink"
 
 
180 @ src="data:image/gif;base64,R0lGODlhFgAWAOMKAB1ChDRLY19vj3mOrpGjuaezxrCztb
181 @ /I19Ha7Pv8/f///////////////////////yH5BAEKAA8ALAAAAAAWABYAAARY8MlJq704682
182 @ 7/2BYIQVhHg9pEgVGIklyDEUBy/RlE4FQF4dCj2AQXAiJQDCWQCAEBwIioEMQBgSAFhDAGghG
183 @ i9XgHAhMNoSZgJkJei33UESv2+/4vD4TAQA7" />
184
185 #if 0 /* Cut/Copy/Paste requires special browser permissions for security
186 ** reasons. So omit these buttons */
187 @ <img class="intLink" title="Cut" data-format="cut"
 
188 @ src="data:image/gif;base64,R0lGODlhFgAWAIQSAB1ChBFNsRJTySJYwjljwkxwl19vj1
189 @ dusYODhl6MnHmOrpqbmpGjuaezxrCztcDCxL/I18rL1P/////////////////////////////
190 @ //////////////////////////yH5BAEAAB8ALAAAAAAWABYAAAVu4CeOZGmeaKqubDs6TNnE
191 @ bGNApNG0kbGMi5trwcA9GArXh+FAfBAw5UexUDAQESkRsfhJPwaH4YsEGAAJGisRGAQY7UCC9
192 @ ZAXBB+74LGCRxIEHwAHdWooDgGJcwpxDisQBQRjIgkDCVlfmZqbmiEAOw==" />
193
194 @ <img class="intLink" title="Copy" data-format="copy"
 
195 @ src="data:image/gif;base64,R0lGODlhFgAWAIQcAB1ChBFNsTRLYyJYwjljwl9vj1iE31
196 @ iGzF6MnHWX9HOdz5GjuYCl2YKl8ZOt4qezxqK63aK/9KPD+7DI3b/I17LM/MrL1MLY9NHa7OP
197 @ s++bx/Pv8/f///////////////yH5BAEAAB8ALAAAAAAWABYAAAWG4CeOZGmeaKqubOum1SQ/
198 @ kPVOW749BeVSus2CgrCxHptLBbOQxCSNCCaF1GUqwQbBd0JGJAyGJJiobE+LnCaDcXAaEoxhQ
199 @ ACgNw0FQx9kP+wmaRgYFBQNeAoGihCAJQsCkJAKOhgXEw8BLQYciooHf5o7EA+kC40qBKkAAA
200 @ Grpy+wsbKzIiEAOw==" />
201
202 @ <img class="intLink" title="Paste" data-format="paste"
 
203 @ src="data:image/gif;base64,R0lGODlhFgAWAIQUAD04KTRLY2tXQF9vj414WZWIbXmOrp
204 @ qbmpGjudClFaezxsa0cb/I1+3YitHa7PrkIPHvbuPs+/fvrvv8/f/////////////////////
205 @ //////////////////////////yH5BAEAAB8ALAAAAAAWABYAAAWN4CeOZGmeaKqubGsusPvB
206 @ SyFJjVDs6nJLB0khR4AkBCmfsCGBQAoCwjF5gwquVykSFbwZE+AwIBV0GhFog2EwIDchjwRiQ
207 @ o9E2Fx4XD5R+B0DDAEnBXBhBhN2DgwDAQFjJYVhCQYRfgoIDGiQJAWTCQMRiwwMfgicnVcAAA
@@ -224,20 +208,58 @@
208 @ MOaK+bLAOrtLUyt7i5uiUhADs=" />
209 #endif
210
211 @ </div>
212 @ <div id="wysiwygBox"
213 @ style="resize:both;overflow:auto;width:95%%;min-height:%d(h)em;"
214 @ contenteditable="true">%s(zContent)</div>
215 @ <script nonce="%h(style_nonce())">
216 @ var oDoc;
217 @
218 @ /* Initialize the document editor */
219 @ function initDoc() {
220 @ initEventHandlers();
221 @ oDoc = document.getElementById("wysiwygBox");
222 @ if (!isWysiwyg()) { setDocMode(true); }
223 @ }
224 @
225 @ function initEventHandlers() {
226 @ document.querySelector('form').onsubmit = wysiwygSubmit;
227 @ document.querySelector('#editMode').onchange = function() {
228 @ setDocMode(this.selectedIndex)
229 @ };
230 @ var controls = document.querySelectorAll('select.format');
231 @ for(var i = 0; i < controls.length; i++) {
232 @ controls[i].onchange = handleDropDown;
233 @ }
234 @ controls = document.querySelectorAll('.intLink');
235 @ for(i = 0; i < controls.length; i++) {
236 @ controls[i].onclick = handleFormatButton;
237 @ }
238 @
239 @ function handleDropDown() {
240 @ formatDoc(this.dataset.format,this[this.selectedIndex].value);
241 @ this.selectedIndex = 0;
242 @ }
243 @
244 @ function handleFormatButton() {
245 @ var extra;
246 @ switch (this.dataset.format) {
247 @ case 'createlink':
248 @ var sLnk = prompt('Target URL:','');
249 @ if(sLnk && sLnk != '')
250 @ {
251 @ extra = sLnk;
252 @ }
253 @ break;
254 @ case 'formatblock':
255 @ extra = 'blockquote';
256 @ break;
257 @ }
258 @ formatDoc(this.dataset.format, extra);
259 @ }
260 @ }
261 @
262 @ /* Return true if the document editor is in WYSIWYG mode. Return
263 @ ** false if it is in Markup mode */
264 @ function isWysiwyg() {
265 @ return document.getElementById("editMode").selectedIndex==0;
266

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button