Fossil SCM

Renamed fossil.page.wikiedit-wysiwyg-legacy.js to fossil.wikiedit-wysiwyg.js so that the excessively long name doesn't cause /dir to have, at most, 2 columns. Removed some dead code and added a tiny bit of docs. Updated changelog per forum request.

stephan 2020-10-10 12:05 trunk
Commit a759842a7adf9d58ee96b4cff8c02ffe288dec53f722967b3971bd8a81b07ee1
D src/fossil.page.wikiedit-wysiwyg-legacy.js
-438
--- a/src/fossil.page.wikiedit-wysiwyg-legacy.js
+++ b/src/fossil.page.wikiedit-wysiwyg-legacy.js
@@ -1,438 +0,0 @@
1
-/**
2
- A slight adaptation of fossil's legacy wysiwyg wiki editor which
3
- makes it usable with the newer editor's edit widget replacement
4
- API.
5
-
6
- Requires: window.fossil, fossil.dom, and that the current page is
7
- /wikiedit. If called from another page it returns without effect.
8
-ditor-widget-swapping API.
9
-*/
10
-(function(F/*fossil object*/){
11
- 'use strict';
12
- if(!F || !F.page || F.page.name!=='wikiedit') return;
13
-
14
- const D = F.dom;
15
-
16
- ////////////////////////////////////////////////////////////////////////
17
- // Install an app-specific stylesheet...
18
- (function(){
19
- const head = document.head || document.querySelector('head'),
20
- styleTag = document.createElement('style'),
21
- styleCSS = `
22
-.intLink { cursor: pointer; }
23
-img.intLink { border: 0; }
24
-#wysiwyg-container {
25
- display: flex;
26
- flex-direction: column;
27
- max-width: 100% /* w/o this, toolbars don't wrap properly! */
28
-}
29
-#wysiwygBox {
30
- border: 1px solid rgba(127,127,127,0.3);
31
- border-radius: 0.25em;
32
- padding: 0.25em 1em;
33
- margin: 0;
34
- overflow: auto;
35
- min-height: 20em;
36
- resize: vertical;
37
-}
38
-#wysiwygEditMode { /* wrapper for radio buttons */
39
- border: 1px solid rgba(127,127,127,0.3);
40
- border-radius: 0.25em;
41
- padding: 0 0.35em 0 0.35em
42
-}
43
-#wysiwygEditMode > * {
44
- vertical-align: text-top;
45
-}
46
-#wysiwygEditMode label { cursor: pointer; }
47
-#wysiwyg-toolbars {
48
- margin: 0 0 0.25em 0;
49
- display: flex;
50
- flex-wrap: wrap;
51
- flex-direction: column;
52
- align-items: flex-start;
53
-}
54
-#wysiwyg-toolbars > * {
55
- margin: 0 0.5em 0.25em 0;
56
-}
57
-#wysiwyg-toolBar1, #wysiwyg-toolBar2 {
58
- margin: 0 0.2em 0.2em 0;
59
- display: flex;
60
- flex-flow: row wrap;
61
-}
62
-#wysiwyg-toolBar1 > * { /* formatting buttons */
63
- vertical-align: middle;
64
- margin: 0 0.25em 0.25em 0;
65
-}
66
-#wysiwyg-toolBar2 > * { /* icons */
67
- border: 1px solid rgba(127,127,127,0.3);
68
- vertical-align: baseline;
69
- ma/* Adapted from https://st
70
- styleTag.type = 'text/css';
71
- D.append(styleTag, styleCSS);
72
- })();
73
-
74
- const outerContainer = D.attr(D.div(), 'id', 'wysiwyg-container'),
75
- toolbars = D.attr(D.div(), 'id', 'wysiwyg-toolbars'),
76
- toolbar1 = D.attr(D.div(), 'id', 'wysiwyg-toolBar1'),
77
- // ^^^ formatting options
78
- toolbar2 = D.attr(D.div(), 'id', 'wysiwyg-toolBar2')
79
- // ^^^^ action icon buttons
80
- ;
81
- D.append(outerContainer, D.append(toolbars, toolbar1, toolbar2));
82
-
83
- /** Returns a function which simplifies adding a list of options
84
- to the given select element. See below for example usage. */
85
- const addOptions = function(select){
86
- return function ff(value, label){
87
- D.option(select, value, label || value);
88
- return ff;
89
- };
90
- };
91
-
92
- ////////////////////////////////////////////////////////////////////////
93
- // Edit mode selection (radio buttons).
94
- const radio0 =
95
- D.attr(
96
- D.input('radio'),
97
- 'name','wysiwyg-mode',
98
- 'id', 'wysiwyg-mode-0',
99
- 'value',0,
100
- 'checked',true),
101
- radio1 = D.attr(
102
- D.input('radio'),
103
- 'id','wysiwyg-mode-1',
104
- 'name','wysiwyg-mode',
105
- 'value',1),
106
- radios = D.append(
107
- D.attr(D.span(), 'id', 'wysiwygEditMode'),
108
- radio0, D.append(
109
- D.attr(D.label(), 'for', 'wysiwyg-mode-0'),
110
- "WYSIWYG"
111
- ),
112
- radio1, D.append(
113
- D.attr(D.label(), 'for', 'wysiwyg-mode-1'),
114
- "Raw HTML"
115
- )
116
- );
117
- D.append(toolbar1, radios);
118
- const radioHandler = function(){setDocMode(+this.value)};
119
- radio0.addEventListener('change',radioHandler, false);
120
- radio1.addEventListener('change',radioHandler, false);
121
-
122
-
123
- ////////////////////////////////////////////////////////////////////////
124
- // Text formatting options...
125
- var select;
126
- select = D.addClass(D.select(), 'format');
127
- select.dataset.format = "formatblock";
128
- D.append(toolbar1, select);
129
- addOptions(select)(
130
- '', '- formatting -')(
131
- "h1", "Title 1 <h1>")(
132
- "h2", "Title 2 <h2>")(
133
- "h3", "Title 3 <h3>")(
134
- "h4", "Title 4 <h4>")(
135
- "h5", "Title 5 <h5>")(
136
- "h6", "Subtitle <h6>")(
137
- "p", "Paragraph <p>")(
138
- "pre", "Preformatted <pre>");
139
-
140
- select = D.addClass(D.select(), 'format');
141
- select.dataset.format = "fontname";
142
- D.append(toolbar1, select);
143
- D.addClass(
144
- D.option(select, '', '- font -'),
145
- "heading"
146
- );
147
- addOptions(select)(
148
- 'Arial')(
149
- 'Arial Black')(
150
- 'Courier New')(
151
- 'Times New Roman');
152
-
153
- select = D.addClass(D.select(), 'format');
154
- D.append(toolbar1, select);
155
- select.dataset.format = "fontsize";
156
- D.addClass(
157
- D.option(select, '', '- size -'),
158
- "heading"
159
- );
160
- addOptions(select)(
161
- "1", "Very small")(
162
- "2", "A bit small")(
163
- "3", "Normal")(
164
- "4", "Medium-large")(
165
- "5", "Big")(
166
- "6", "Very big")(
167
- "7", "Maximum");
168
-
169
- select = D.addClass(D.select(), 'format');
170
- D.append(toolbar1, select);
171
- select.dataset.format = 'forecolor';
172
- D.addClass(
173
- D.option(select, '', '- color -'),
174
- "heading"
175
- );
176
- addOptions(select)(
177
- "red", "Red")(
178
- "blue", "Blue")(
179
- "green", "Green")(
180
- "black", "Black")(
181
- "grey", "Grey")(
182
- "yellow", "Yellow")(
183
- "cyan", "Cyan")(
184
- "magenta", "Magenta");
185
-
186
-
187
- ////////////////////////////////////////////////////////////////////////
188
- // Icon-based toolbar...
189
- /**
190
- Inject the icons...
191
-
192
- mkbuiltins strips anything which looks like a C++-style comment,
193
- even if it's in a string literal, and thus the runs of "/"
194
- characters in the DOM element data attributes have been mangled
195
- to work around that: we simply use \x2f for every 2nd slash.
196
- */
197
- (function f(title,format,src){
198
- const img = D.img();
199
- D.append(toolbar2, img);
200
- D.addClass(img, 'intLink');
201
- D.attr(img, 'title', title);
202
- img.dataset.format = format;
203
- D.attr(img, 'src', 'string'===typeof src ? src : src.join(''));
204
- return f;
205
- })(
206
- 'Undo', 'undo',
207
- ["data:image/gif;base64,R0lGODlhFgAWAOMKADljwliE33mOrpGjuYKl8aezxqPD+7",
208
- "/I19DV3NHa7P/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
209
- "/\x2f/\x2f/\x2f/yH5BAEKAA8ALAAAAAAWABYAAARR8MlJq704680",
210
- "7TkaYeJJBnES4EeUJvIGapWYAC0CsocQ7SDlWJkAkCA6ToMYWIARGQF3mRQVIEjkkSVLIbSfE",
211
- "whdRIH4fh/DZMICe3/C4nBQBADs="]
212
- )(
213
- 'Redo','redo',
214
- ["data:image/gif;base64,R0lGODlhFgAWAMIHAB1ChDljwl9vj1iE34Kl8aPD+7/I1/",
215
- "/\x2f/yH5BAEKAAcALAAAAAAWABYAAANKeLrc/jDKSesyphi7SiEgsVXZEATDICqBVJjpqWZt9Na",
216
- "EDNbQK1wCQsxlYnxMAImhyDoFAElJasRRvAZVRqqQXUy7Cgx4TC6bswkAOw=="]
217
- )(
218
- "Remove formatting",
219
- "removeFormat",
220
- ["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AA",
221
- "AABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOxAAADsQBlSsOGwA",
222
- "AAAd0SU1FB9oECQMCKPI8CIIAAAAIdEVYdENvbW1lbnQA9syWvwAAAuhJREFUOMtjYBgFxAB5",
223
- "01ZWBvVaL2nHnlmk6mXCJbF69zU+Hz/9fB5O1lx+bg45qhl8/fYr5it3XrP/YWTUvvvk3VeqG",
224
- "Xz70TvbJy8+Wv39+2/Hz19/mGwjZzuTYjALuoBv9jImaXHeyD3H7kU8fPj2ICML8z92dlbtMz",
225
- "deiG3fco7J08foH1kurkm3E9iw54YvKwuTuom+LPt/BgbWf3/\x2fsf37/1/c02cCG1lB8f/\x2ff95",
226
- "DZx74MTMzshhoSm6szrQ/a6Ir/Z2RkfEjBxuLYFpDiDi6Af/\x2f/2ckaHBp7+7wmavP5n76+P2C",
227
- "lrLIYl8H9W36auJCbCxM4szMTJac7Kza/\x2f/\x2fR3H1w2cfWAgafPbqs5g7D95++/P1B4+ECK8tA",
228
- "wMDw/1H7159+/7r7ZcvPz4fOHbzEwMDwx8GBgaGnNatfHZx8zqrJ+4VJBh5CQEGOySEua/v3n",
229
- "7hXmqI8WUGBgYGL3vVG7fuPK3i5GD9/fja7ZsMDAzMG/Ze52mZeSj4yu1XEq/ff7W5dvfVAS1",
230
- "lsXc4Db7z8C3r8p7Qjf/\x2f/2dnZGxlqJuyr3rPqQd/Hhyu7oSpYWScylDQsd3kzvnH738wMDzj",
231
- "5GBN1VIWW4c3KDon7VOvm7S3paB9u5qsU5/x5KUnlY+eexQbkLNsErK61+++VnAJcfkyMTIwf",
232
- "fj0QwZbJDKjcETs1Y8evyd48toz8y/ffzv/\x2fvPP4veffxpX77z6l5JewHPu8MqTDAwMDLzyrj",
233
- "b/mZm0JcT5Lj+89+Ybm6zz95oMh7s4XbygN3Sluq4Mj5K8iKMgP4f0/\x2f/\x2ffv77/\x2f8nLy+7MCc",
234
- "XmyYDAwODS9jM9tcvPypd35pne3ljdjvj26+H2dhYpuENikgfvQeXNmSl3tqepxXsqhXPyc66",
235
- "6s+fv1fMdKR3TK72zpix8nTc7bdfhfkEeVbC9KhbK/9iYWHiErbu6MWbY/7/\x2f8/4/\x2f9/pgOnH",
236
- "6jGVazvFDRtq2VgiBIZrUTIBgCk+ivHvuEKwAAAAABJRU5ErkJggg=="]
237
- )(
238
- "Bold",
239
- "bold",
240
- ["data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB",
241
- "YAQAInhI+pa+H9mJy0LhdgtrxzDG5WGFVk6aXqyk6Y9kXvKKNuLbb6zgMFADs="]
242
- )(
243
- "Italic",
244
- "italic",
245
- ["data:image/gif;base64,R0lGODlhFgAWAKEDAAAAAF9vj5WIbf/\x2f/yH5BAEAAAMALA",
246
- "AAAAAWABYAAAIjnI+py+0Po5x0gXvruEKHrF2BB1YiCWgbMFIYpsbyTNd2UwAAOw=="]
247
- )(
248
- "Underline",
249
- "underline",
250
- ["data:image/gif;base64,R0lGODlhFgAWAKECAAAAAF9vj/\x2f/\x2f/\x2f/\x2fyH5BAEAAAIALA",
251
- "AAAAAWABYAAAIrlI+py+0Po5zUgAsEzvEeL4Ea15EiJJ5PSqJmuwKBEKgxVuXWtun+DwxCCgA",
252
- "7"]
253
- )(
254
- "Left align",
255
- "justifyleft",
256
- ["data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB",
257
- "YAQAIghI+py+0Po5y02ouz3jL4D4JMGELkGYxo+qzl4nKyXAAAOw=="]
258
- )(
259
- "Center align",
260
- "justifycenter",
261
- ["data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB",
262
- "YAQAIfhI+py+0Po5y02ouz3jL4D4JOGI7kaZ5Bqn4sycVbAQA7"]
263
- )(
264
- "Right align",
265
- "justifyright",
266
- ["data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB",
267
- "YAQAIghI+py+0Po5y02ouz3jL4D4JQGDLkGYxouqzl43JyVgAAOw=="]
268
- )(
269
- "Numbered list",
270
- "insertorderedlist",
271
- ["data:image/gif;base64,R0lGODlhFgAWAMIGAAAAADljwliE35GjuaezxtHa7P/\x2f/\x2f",
272
- "/\x2f/yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKSespwjoRFvggCBUBoTFBeq6QIAysQnRHaEO",
273
- "zyaZ07Lu9lUBnC0UGQU1K52s6n5oEADs="]
274
- )(
275
- "Dotted list",
276
- "insertunorderedlist",
277
- ["data:image/gif;base64,R0lGODlhFgAWAMIGAAAAAB1ChF9vj1iE33mOrqezxv/\x2f/\x2f",
278
- "/\x2f/yH5BAEAAAcALAAAAAAWABYAAAMyeLrc/jDKSesppNhGRlBAKIZRERBbqm6YtnbfMY7lud6",
279
- "4UwiuKnigGQliQuWOyKQykgAAOw=="]
280
- )(
281
- "Quote",
282
- "formatblock",
283
- ["data:image/gif;base64,R0lGODlhFgAWAIQXAC1NqjFRjkBgmT9nqUJnsk9xrFJ7u2",
284
- "R9qmKBt1iGzHmOrm6Sz4OXw3Odz4Cl2ZSnw6KxyqO306K63bG70bTB0rDI3bvI4P",
285
- "/\x2f/\x2f/\x2f/\x2f/",
286
- "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
287
- "/\x2f/\x2f/\x2fyH5BAEKAB8ALAAAAAAWABYAAAVP4CeOZGmeaKqubEs2Cekk",
288
- "ErvEI1zZuOgYFlakECEZFi0GgTGKEBATFmJAVXweVOoKEQgABB9IQDCmrLpjETrQQlhHjINrT",
289
- "q/b7/i8fp8PAQA7"]
290
- )(
291
- "Delete indentation",
292
- "outdent",
293
- ["data:image/gif;base64,R0lGODlhFgAWAMIHAAAAADljwliE35GjuaezxtDV3NHa7P",
294
- "/\x2f/yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKCQG9F2i7u8agQgyK1z2EIBil+TWqEMxhMcz",
295
- "sYVJ3e4ahk+sFnAgtxSQDqWw6n5cEADs="]
296
- )(
297
- "Add indentation",
298
- "indent",
299
- ["data:image/gif;base64,R0lGODlhFgAWAOMIAAAAADljwl9vj1iE35GjuaezxtDV3N",
300
- "Ha7P/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
301
- "/\x2f/\x2f/yH5BAEAAAgALAAAAAAWABYAAAQ7EMlJq704650",
302
- "B/x8gemMpgugwHJNZXodKsO5oqUOgo5KhBwWESyMQsCRDHu9VOyk5TM9zSpFSr9gsJwIAOw=="
303
- ]
304
- )(
305
- "Hyperlink",
306
- "createlink",
307
- ["data:image/gif;base64,R0lGODlhFgAWAOMKAB1ChDRLY19vj3mOrpGjuaezxrCztb",
308
- "/I19Ha7Pv8/f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
309
- "/yH5BAEKAA8ALAAAAAAWABYAAARY8MlJq704682",
310
- "7/2BYIQVhHg9pEgVGIklyDEUBy/RlE4FQF4dCj2AQXAiJQDCWQCAEBwIioEMQBgSAFhDAGghG",
311
- "i9XgHAhMNoSZgJkJei33UESv2+/4vD4TAQA7"]
312
- )(
313
- "Cut",
314
- "cut",
315
- ["data:image/gif;base64,R0lGODlhFgAWAIQSAB1ChBFNsRJTySJYwjljwkxwl19vj1",
316
- "dusYODhl6MnHmOrpqbmpGjuaezxrCztcDCxL/I18rL1P/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
317
- "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/",
318
- "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
319
- "yH5BAEAAB8ALAAAAAAWABYAAAVu4CeOZGmeaKqubDs6TNnE",
320
- "bGNApNG0kbGMi5trwcA9GArXh+FAfBAw5UexUDAQESkRsfhJPwaH4YsEGAAJGisRGAQY7UCC9",
321
- "ZAXBB+74LGCRxIEHwAHdWooDgGJcwpxDisQBQRjIgkDCVlfmZqbmiEAOw=="]
322
- )(
323
- "Copy",
324
- "copy",
325
- ["data:image/gif;base64,R0lGODlhFgAWAIQcAB1ChBFNsTRLYyJYwjljwl9vj1iE31",
326
- "iGzF6MnHWX9HOdz5GjuYCl2YKl8ZOt4qezxqK63aK/9KPD+7DI3b/I17LM/MrL1MLY9NHa7OP",
327
- "s++bx/Pv8/f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
328
- "/yH5BAEAAB8ALAAAAAAWABYAAAWG4CeOZGmeaKqubOum1SQ/",
329
- "kPVOW749BeVSus2CgrCxHptLBbOQxCSNCCaF1GUqwQbBd0JGJAyGJJiobE+LnCaDcXAaEoxhQ",
330
- "ACgNw0FQx9kP+wmaRgYFBQNeAoGihCAJQsCkJAKOhgXEw8BLQYciooHf5o7EA+kC40qBKkAAA",
331
- "Grpy+wsbKzIiEAOw=="]
332
- )(
333
- /* Paste, when activated via JS, has no effect in some (maybe all)
334
- environments. Activated externally, e.g. keyboard, it works. */
335
- "Paste (does not work in all environments)",
336
- "paste",
337
- ["data:image/gif;base64,R0lGODlhFgAWAIQUAD04KTRLY2tXQF9vj414WZWIbXmOrp",
338
- "qbmpGjudClFaezxsa0cb/I1+3YitHa7PrkIPHvbuPs+/fvrvv8/f/\x2f/\x2f/\x2f",
339
- "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/",
340
- "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
341
- "yH5BAEAAB8ALAAAAAAWABYAAAWN4CeOZGmeaKqubGsusPvB",
342
- "SyFJjVDs6nJLB0khR4AkBCmfsCGBQAoCwjF5gwquVykSFbwZE+AwIBV0GhFog2EwIDchjwRiQ",
343
- "o9E2Fx4XD5R+B0DDAEnBXBhBhN2DgwDAQFjJYVhCQYRfgoIDGiQJAWTCQMRiwwMfgicnVcAAA",
344
- "MOaK+bLAOrtLUyt7i5uiUhADs="]
345
- );
346
-
347
- ////////////////////////////////////////////////////////////////////////
348
- // The main editor area...
349
- const oDoc = D.attr(D.div(), 'id', "wysiwygBox");
350
- D.attr(oDoc, 'contenteditable', 'true');
351
- D.append(outerContainer, oDoc);
352
-
353
- /* Initialize the document editor */
354
- function initDoc() {
355
- initEventHandlers();
356
- if (!isWysiwyg()) { setDocMode(true); }
357
- }
358
-
359
- function initEventHandlers() {
360
- //console.debug("initEventHandlers()");
361
- const handleDropDown = function() {
362
- formatDoc(this.dataset.format,this[this.selectedIndex].value);
363
- this.selectedIndex = 0;
364
- };
365
-
366
- const handleFormatButton = function() {
367
- var extra;
368
- switch (this.dataset.format) {
369
- case 'createlink':
370
- const sLnk = prompt('Target URL:','');
371
- if(sLnk) extra = sLnk;
372
- break;
373
- case 'formatblock':
374
- extra = 'blockquote';
375
- break;
376
- }
377
- formatDoc(this.dataset.format, extra);
378
- };
379
-
380
- var i, controls = outerContainer.querySelectorAll('select.format');
381
- for(i = 0; i < controls.length; i++) {
382
- controls[i].addEventListener('change', handleDropDown, false);;
383
- }
384
- controls = outerContainer.querySelectorAll('.intLink');
385
- for(i = 0; i < controls.length; i++) {
386
- controls[i].addEventListener('click', handleFormatButton, false);
387
- }
388
- }
389
-
390
- /* Return true if the document editor is in WYSIWYG mode. Return
391
- ** false if it is in Markup mode */
392
- function isWysiwyg() {
393
- return radio0.checked;
394
- }
395
-
396
- /* Run the editing command if in WYSIWYG mode */
397
- function formatDoc(sCmd, sValue) {
398
- if (isWysiwy g()){
399
- try {
400
- // First, try the W3C draft standard way, which has
401
- // been working on all non-IE browsers for a while.
402
- // It is also supported by IE11 and higher.
403
- document.execCommand("styleWithCSS", false, false);
404
- } catch (e) {
405
- try {
406
- // For IE9 or IE10, this should work.
407
- document.execCommand("useCSS", 0, true);
408
- } catch (e) {
409
- // OK, that apparently did not work, do nothing.
410
- }
411
- }
412
- document.execCommand(sCmd, false, sValue);
413
- oDoc.focus();
414
- }
415
- }
416
-
417
- /* Change the editing mode. Convert to markup if the argument
418
- ** is true and wysiwyg if the argument is false. */
419
- function setDocMode(bToMarkup, content) {
420
- if(undefined===content){
421
- content = bToMarkup ? oDoc.innerHTML : oDoc.innerText;
422
- }
423
- if(!setDocMode.linebreak){
424
- setDocMode.linebreak = new RegExp("</p><p>","ig");
425
- }
426
- if(!setDocMode.toHide){
427
- setDocMode.toHide = toolbars.querySelectorAll(
428
- '#wysiwyg-toolBar1 > *:not(#wysiwygEditMode), '
429
- +'#wysiwyg-toolBar2');
430
- }
431
- if (bToMarkup) {
432
- /* WYSIWYG -> Markup */
433
- // Legacy did this: content=content.replace(setDocMode.linebreak,"</p>\n\n<p>")
434
- D.append(D.clearElement(oDoc), content)
435
- oDoc.style.whInvoke this routine prior to submitting the HTML content back
436
- ** to the server */
437
- /*functio /* Return true if th=="pre-wrap"){setDocMode(0);}
438
- document.getElementById("wysiwygValue").
--- a/src/fossil.page.wikiedit-wysiwyg-legacy.js
+++ b/src/fossil.page.wikiedit-wysiwyg-legacy.js
@@ -1,438 +0,0 @@
1 /**
2 A slight adaptation of fossil's legacy wysiwyg wiki editor which
3 makes it usable with the newer editor's edit widget replacement
4 API.
5
6 Requires: window.fossil, fossil.dom, and that the current page is
7 /wikiedit. If called from another page it returns without effect.
8 ditor-widget-swapping API.
9 */
10 (function(F/*fossil object*/){
11 'use strict';
12 if(!F || !F.page || F.page.name!=='wikiedit') return;
13
14 const D = F.dom;
15
16 ////////////////////////////////////////////////////////////////////////
17 // Install an app-specific stylesheet...
18 (function(){
19 const head = document.head || document.querySelector('head'),
20 styleTag = document.createElement('style'),
21 styleCSS = `
22 .intLink { cursor: pointer; }
23 img.intLink { border: 0; }
24 #wysiwyg-container {
25 display: flex;
26 flex-direction: column;
27 max-width: 100% /* w/o this, toolbars don't wrap properly! */
28 }
29 #wysiwygBox {
30 border: 1px solid rgba(127,127,127,0.3);
31 border-radius: 0.25em;
32 padding: 0.25em 1em;
33 margin: 0;
34 overflow: auto;
35 min-height: 20em;
36 resize: vertical;
37 }
38 #wysiwygEditMode { /* wrapper for radio buttons */
39 border: 1px solid rgba(127,127,127,0.3);
40 border-radius: 0.25em;
41 padding: 0 0.35em 0 0.35em
42 }
43 #wysiwygEditMode > * {
44 vertical-align: text-top;
45 }
46 #wysiwygEditMode label { cursor: pointer; }
47 #wysiwyg-toolbars {
48 margin: 0 0 0.25em 0;
49 display: flex;
50 flex-wrap: wrap;
51 flex-direction: column;
52 align-items: flex-start;
53 }
54 #wysiwyg-toolbars > * {
55 margin: 0 0.5em 0.25em 0;
56 }
57 #wysiwyg-toolBar1, #wysiwyg-toolBar2 {
58 margin: 0 0.2em 0.2em 0;
59 display: flex;
60 flex-flow: row wrap;
61 }
62 #wysiwyg-toolBar1 > * { /* formatting buttons */
63 vertical-align: middle;
64 margin: 0 0.25em 0.25em 0;
65 }
66 #wysiwyg-toolBar2 > * { /* icons */
67 border: 1px solid rgba(127,127,127,0.3);
68 vertical-align: baseline;
69 ma/* Adapted from https://st
70 styleTag.type = 'text/css';
71 D.append(styleTag, styleCSS);
72 })();
73
74 const outerContainer = D.attr(D.div(), 'id', 'wysiwyg-container'),
75 toolbars = D.attr(D.div(), 'id', 'wysiwyg-toolbars'),
76 toolbar1 = D.attr(D.div(), 'id', 'wysiwyg-toolBar1'),
77 // ^^^ formatting options
78 toolbar2 = D.attr(D.div(), 'id', 'wysiwyg-toolBar2')
79 // ^^^^ action icon buttons
80 ;
81 D.append(outerContainer, D.append(toolbars, toolbar1, toolbar2));
82
83 /** Returns a function which simplifies adding a list of options
84 to the given select element. See below for example usage. */
85 const addOptions = function(select){
86 return function ff(value, label){
87 D.option(select, value, label || value);
88 return ff;
89 };
90 };
91
92 ////////////////////////////////////////////////////////////////////////
93 // Edit mode selection (radio buttons).
94 const radio0 =
95 D.attr(
96 D.input('radio'),
97 'name','wysiwyg-mode',
98 'id', 'wysiwyg-mode-0',
99 'value',0,
100 'checked',true),
101 radio1 = D.attr(
102 D.input('radio'),
103 'id','wysiwyg-mode-1',
104 'name','wysiwyg-mode',
105 'value',1),
106 radios = D.append(
107 D.attr(D.span(), 'id', 'wysiwygEditMode'),
108 radio0, D.append(
109 D.attr(D.label(), 'for', 'wysiwyg-mode-0'),
110 "WYSIWYG"
111 ),
112 radio1, D.append(
113 D.attr(D.label(), 'for', 'wysiwyg-mode-1'),
114 "Raw HTML"
115 )
116 );
117 D.append(toolbar1, radios);
118 const radioHandler = function(){setDocMode(+this.value)};
119 radio0.addEventListener('change',radioHandler, false);
120 radio1.addEventListener('change',radioHandler, false);
121
122
123 ////////////////////////////////////////////////////////////////////////
124 // Text formatting options...
125 var select;
126 select = D.addClass(D.select(), 'format');
127 select.dataset.format = "formatblock";
128 D.append(toolbar1, select);
129 addOptions(select)(
130 '', '- formatting -')(
131 "h1", "Title 1 <h1>")(
132 "h2", "Title 2 <h2>")(
133 "h3", "Title 3 <h3>")(
134 "h4", "Title 4 <h4>")(
135 "h5", "Title 5 <h5>")(
136 "h6", "Subtitle <h6>")(
137 "p", "Paragraph <p>")(
138 "pre", "Preformatted <pre>");
139
140 select = D.addClass(D.select(), 'format');
141 select.dataset.format = "fontname";
142 D.append(toolbar1, select);
143 D.addClass(
144 D.option(select, '', '- font -'),
145 "heading"
146 );
147 addOptions(select)(
148 'Arial')(
149 'Arial Black')(
150 'Courier New')(
151 'Times New Roman');
152
153 select = D.addClass(D.select(), 'format');
154 D.append(toolbar1, select);
155 select.dataset.format = "fontsize";
156 D.addClass(
157 D.option(select, '', '- size -'),
158 "heading"
159 );
160 addOptions(select)(
161 "1", "Very small")(
162 "2", "A bit small")(
163 "3", "Normal")(
164 "4", "Medium-large")(
165 "5", "Big")(
166 "6", "Very big")(
167 "7", "Maximum");
168
169 select = D.addClass(D.select(), 'format');
170 D.append(toolbar1, select);
171 select.dataset.format = 'forecolor';
172 D.addClass(
173 D.option(select, '', '- color -'),
174 "heading"
175 );
176 addOptions(select)(
177 "red", "Red")(
178 "blue", "Blue")(
179 "green", "Green")(
180 "black", "Black")(
181 "grey", "Grey")(
182 "yellow", "Yellow")(
183 "cyan", "Cyan")(
184 "magenta", "Magenta");
185
186
187 ////////////////////////////////////////////////////////////////////////
188 // Icon-based toolbar...
189 /**
190 Inject the icons...
191
192 mkbuiltins strips anything which looks like a C++-style comment,
193 even if it's in a string literal, and thus the runs of "/"
194 characters in the DOM element data attributes have been mangled
195 to work around that: we simply use \x2f for every 2nd slash.
196 */
197 (function f(title,format,src){
198 const img = D.img();
199 D.append(toolbar2, img);
200 D.addClass(img, 'intLink');
201 D.attr(img, 'title', title);
202 img.dataset.format = format;
203 D.attr(img, 'src', 'string'===typeof src ? src : src.join(''));
204 return f;
205 })(
206 'Undo', 'undo',
207 ["data:image/gif;base64,R0lGODlhFgAWAOMKADljwliE33mOrpGjuYKl8aezxqPD+7",
208 "/I19DV3NHa7P/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
209 "/\x2f/\x2f/\x2f/yH5BAEKAA8ALAAAAAAWABYAAARR8MlJq704680",
210 "7TkaYeJJBnES4EeUJvIGapWYAC0CsocQ7SDlWJkAkCA6ToMYWIARGQF3mRQVIEjkkSVLIbSfE",
211 "whdRIH4fh/DZMICe3/C4nBQBADs="]
212 )(
213 'Redo','redo',
214 ["data:image/gif;base64,R0lGODlhFgAWAMIHAB1ChDljwl9vj1iE34Kl8aPD+7/I1/",
215 "/\x2f/yH5BAEKAAcALAAAAAAWABYAAANKeLrc/jDKSesyphi7SiEgsVXZEATDICqBVJjpqWZt9Na",
216 "EDNbQK1wCQsxlYnxMAImhyDoFAElJasRRvAZVRqqQXUy7Cgx4TC6bswkAOw=="]
217 )(
218 "Remove formatting",
219 "removeFormat",
220 ["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AA",
221 "AABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOxAAADsQBlSsOGwA",
222 "AAAd0SU1FB9oECQMCKPI8CIIAAAAIdEVYdENvbW1lbnQA9syWvwAAAuhJREFUOMtjYBgFxAB5",
223 "01ZWBvVaL2nHnlmk6mXCJbF69zU+Hz/9fB5O1lx+bg45qhl8/fYr5it3XrP/YWTUvvvk3VeqG",
224 "Xz70TvbJy8+Wv39+2/Hz19/mGwjZzuTYjALuoBv9jImaXHeyD3H7kU8fPj2ICML8z92dlbtMz",
225 "deiG3fco7J08foH1kurkm3E9iw54YvKwuTuom+LPt/BgbWf3/\x2fsf37/1/c02cCG1lB8f/\x2ff95",
226 "DZx74MTMzshhoSm6szrQ/a6Ir/Z2RkfEjBxuLYFpDiDi6Af/\x2f/2ckaHBp7+7wmavP5n76+P2C",
227 "lrLIYl8H9W36auJCbCxM4szMTJac7Kza/\x2f/\x2fR3H1w2cfWAgafPbqs5g7D95++/P1B4+ECK8tA",
228 "wMDw/1H7159+/7r7ZcvPz4fOHbzEwMDwx8GBgaGnNatfHZx8zqrJ+4VJBh5CQEGOySEua/v3n",
229 "7hXmqI8WUGBgYGL3vVG7fuPK3i5GD9/fja7ZsMDAzMG/Ze52mZeSj4yu1XEq/ff7W5dvfVAS1",
230 "lsXc4Db7z8C3r8p7Qjf/\x2f/2dnZGxlqJuyr3rPqQd/Hhyu7oSpYWScylDQsd3kzvnH738wMDzj",
231 "5GBN1VIWW4c3KDon7VOvm7S3paB9u5qsU5/x5KUnlY+eexQbkLNsErK61+++VnAJcfkyMTIwf",
232 "fj0QwZbJDKjcETs1Y8evyd48toz8y/ffzv/\x2fvPP4veffxpX77z6l5JewHPu8MqTDAwMDLzyrj",
233 "b/mZm0JcT5Lj+89+Ybm6zz95oMh7s4XbygN3Sluq4Mj5K8iKMgP4f0/\x2f/\x2ffv77/\x2f8nLy+7MCc",
234 "XmyYDAwODS9jM9tcvPypd35pne3ljdjvj26+H2dhYpuENikgfvQeXNmSl3tqepxXsqhXPyc66",
235 "6s+fv1fMdKR3TK72zpix8nTc7bdfhfkEeVbC9KhbK/9iYWHiErbu6MWbY/7/\x2f8/4/\x2f9/pgOnH",
236 "6jGVazvFDRtq2VgiBIZrUTIBgCk+ivHvuEKwAAAAABJRU5ErkJggg=="]
237 )(
238 "Bold",
239 "bold",
240 ["data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB",
241 "YAQAInhI+pa+H9mJy0LhdgtrxzDG5WGFVk6aXqyk6Y9kXvKKNuLbb6zgMFADs="]
242 )(
243 "Italic",
244 "italic",
245 ["data:image/gif;base64,R0lGODlhFgAWAKEDAAAAAF9vj5WIbf/\x2f/yH5BAEAAAMALA",
246 "AAAAAWABYAAAIjnI+py+0Po5x0gXvruEKHrF2BB1YiCWgbMFIYpsbyTNd2UwAAOw=="]
247 )(
248 "Underline",
249 "underline",
250 ["data:image/gif;base64,R0lGODlhFgAWAKECAAAAAF9vj/\x2f/\x2f/\x2f/\x2fyH5BAEAAAIALA",
251 "AAAAAWABYAAAIrlI+py+0Po5zUgAsEzvEeL4Ea15EiJJ5PSqJmuwKBEKgxVuXWtun+DwxCCgA",
252 "7"]
253 )(
254 "Left align",
255 "justifyleft",
256 ["data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB",
257 "YAQAIghI+py+0Po5y02ouz3jL4D4JMGELkGYxo+qzl4nKyXAAAOw=="]
258 )(
259 "Center align",
260 "justifycenter",
261 ["data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB",
262 "YAQAIfhI+py+0Po5y02ouz3jL4D4JOGI7kaZ5Bqn4sycVbAQA7"]
263 )(
264 "Right align",
265 "justifyright",
266 ["data:image/gif;base64,R0lGODlhFgAWAID/AMDAwAAAACH5BAEAAAAALAAAAAAWAB",
267 "YAQAIghI+py+0Po5y02ouz3jL4D4JQGDLkGYxouqzl43JyVgAAOw=="]
268 )(
269 "Numbered list",
270 "insertorderedlist",
271 ["data:image/gif;base64,R0lGODlhFgAWAMIGAAAAADljwliE35GjuaezxtHa7P/\x2f/\x2f",
272 "/\x2f/yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKSespwjoRFvggCBUBoTFBeq6QIAysQnRHaEO",
273 "zyaZ07Lu9lUBnC0UGQU1K52s6n5oEADs="]
274 )(
275 "Dotted list",
276 "insertunorderedlist",
277 ["data:image/gif;base64,R0lGODlhFgAWAMIGAAAAAB1ChF9vj1iE33mOrqezxv/\x2f/\x2f",
278 "/\x2f/yH5BAEAAAcALAAAAAAWABYAAAMyeLrc/jDKSesppNhGRlBAKIZRERBbqm6YtnbfMY7lud6",
279 "4UwiuKnigGQliQuWOyKQykgAAOw=="]
280 )(
281 "Quote",
282 "formatblock",
283 ["data:image/gif;base64,R0lGODlhFgAWAIQXAC1NqjFRjkBgmT9nqUJnsk9xrFJ7u2",
284 "R9qmKBt1iGzHmOrm6Sz4OXw3Odz4Cl2ZSnw6KxyqO306K63bG70bTB0rDI3bvI4P",
285 "/\x2f/\x2f/\x2f/\x2f/",
286 "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
287 "/\x2f/\x2f/\x2fyH5BAEKAB8ALAAAAAAWABYAAAVP4CeOZGmeaKqubEs2Cekk",
288 "ErvEI1zZuOgYFlakECEZFi0GgTGKEBATFmJAVXweVOoKEQgABB9IQDCmrLpjETrQQlhHjINrT",
289 "q/b7/i8fp8PAQA7"]
290 )(
291 "Delete indentation",
292 "outdent",
293 ["data:image/gif;base64,R0lGODlhFgAWAMIHAAAAADljwliE35GjuaezxtDV3NHa7P",
294 "/\x2f/yH5BAEAAAcALAAAAAAWABYAAAM2eLrc/jDKCQG9F2i7u8agQgyK1z2EIBil+TWqEMxhMcz",
295 "sYVJ3e4ahk+sFnAgtxSQDqWw6n5cEADs="]
296 )(
297 "Add indentation",
298 "indent",
299 ["data:image/gif;base64,R0lGODlhFgAWAOMIAAAAADljwl9vj1iE35GjuaezxtDV3N",
300 "Ha7P/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
301 "/\x2f/\x2f/yH5BAEAAAgALAAAAAAWABYAAAQ7EMlJq704650",
302 "B/x8gemMpgugwHJNZXodKsO5oqUOgo5KhBwWESyMQsCRDHu9VOyk5TM9zSpFSr9gsJwIAOw=="
303 ]
304 )(
305 "Hyperlink",
306 "createlink",
307 ["data:image/gif;base64,R0lGODlhFgAWAOMKAB1ChDRLY19vj3mOrpGjuaezxrCztb",
308 "/I19Ha7Pv8/f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
309 "/yH5BAEKAA8ALAAAAAAWABYAAARY8MlJq704682",
310 "7/2BYIQVhHg9pEgVGIklyDEUBy/RlE4FQF4dCj2AQXAiJQDCWQCAEBwIioEMQBgSAFhDAGghG",
311 "i9XgHAhMNoSZgJkJei33UESv2+/4vD4TAQA7"]
312 )(
313 "Cut",
314 "cut",
315 ["data:image/gif;base64,R0lGODlhFgAWAIQSAB1ChBFNsRJTySJYwjljwkxwl19vj1",
316 "dusYODhl6MnHmOrpqbmpGjuaezxrCztcDCxL/I18rL1P/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
317 "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/",
318 "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
319 "yH5BAEAAB8ALAAAAAAWABYAAAVu4CeOZGmeaKqubDs6TNnE",
320 "bGNApNG0kbGMi5trwcA9GArXh+FAfBAw5UexUDAQESkRsfhJPwaH4YsEGAAJGisRGAQY7UCC9",
321 "ZAXBB+74LGCRxIEHwAHdWooDgGJcwpxDisQBQRjIgkDCVlfmZqbmiEAOw=="]
322 )(
323 "Copy",
324 "copy",
325 ["data:image/gif;base64,R0lGODlhFgAWAIQcAB1ChBFNsTRLYyJYwjljwl9vj1iE31",
326 "iGzF6MnHWX9HOdz5GjuYCl2YKl8ZOt4qezxqK63aK/9KPD+7DI3b/I17LM/MrL1MLY9NHa7OP",
327 "s++bx/Pv8/f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
328 "/yH5BAEAAB8ALAAAAAAWABYAAAWG4CeOZGmeaKqubOum1SQ/",
329 "kPVOW749BeVSus2CgrCxHptLBbOQxCSNCCaF1GUqwQbBd0JGJAyGJJiobE+LnCaDcXAaEoxhQ",
330 "ACgNw0FQx9kP+wmaRgYFBQNeAoGihCAJQsCkJAKOhgXEw8BLQYciooHf5o7EA+kC40qBKkAAA",
331 "Grpy+wsbKzIiEAOw=="]
332 )(
333 /* Paste, when activated via JS, has no effect in some (maybe all)
334 environments. Activated externally, e.g. keyboard, it works. */
335 "Paste (does not work in all environments)",
336 "paste",
337 ["data:image/gif;base64,R0lGODlhFgAWAIQUAD04KTRLY2tXQF9vj414WZWIbXmOrp",
338 "qbmpGjudClFaezxsa0cb/I1+3YitHa7PrkIPHvbuPs+/fvrvv8/f/\x2f/\x2f/\x2f",
339 "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/",
340 "/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f/\x2f",
341 "yH5BAEAAB8ALAAAAAAWABYAAAWN4CeOZGmeaKqubGsusPvB",
342 "SyFJjVDs6nJLB0khR4AkBCmfsCGBQAoCwjF5gwquVykSFbwZE+AwIBV0GhFog2EwIDchjwRiQ",
343 "o9E2Fx4XD5R+B0DDAEnBXBhBhN2DgwDAQFjJYVhCQYRfgoIDGiQJAWTCQMRiwwMfgicnVcAAA",
344 "MOaK+bLAOrtLUyt7i5uiUhADs="]
345 );
346
347 ////////////////////////////////////////////////////////////////////////
348 // The main editor area...
349 const oDoc = D.attr(D.div(), 'id', "wysiwygBox");
350 D.attr(oDoc, 'contenteditable', 'true');
351 D.append(outerContainer, oDoc);
352
353 /* Initialize the document editor */
354 function initDoc() {
355 initEventHandlers();
356 if (!isWysiwyg()) { setDocMode(true); }
357 }
358
359 function initEventHandlers() {
360 //console.debug("initEventHandlers()");
361 const handleDropDown = function() {
362 formatDoc(this.dataset.format,this[this.selectedIndex].value);
363 this.selectedIndex = 0;
364 };
365
366 const handleFormatButton = function() {
367 var extra;
368 switch (this.dataset.format) {
369 case 'createlink':
370 const sLnk = prompt('Target URL:','');
371 if(sLnk) extra = sLnk;
372 break;
373 case 'formatblock':
374 extra = 'blockquote';
375 break;
376 }
377 formatDoc(this.dataset.format, extra);
378 };
379
380 var i, controls = outerContainer.querySelectorAll('select.format');
381 for(i = 0; i < controls.length; i++) {
382 controls[i].addEventListener('change', handleDropDown, false);;
383 }
384 controls = outerContainer.querySelectorAll('.intLink');
385 for(i = 0; i < controls.length; i++) {
386 controls[i].addEventListener('click', handleFormatButton, false);
387 }
388 }
389
390 /* Return true if the document editor is in WYSIWYG mode. Return
391 ** false if it is in Markup mode */
392 function isWysiwyg() {
393 return radio0.checked;
394 }
395
396 /* Run the editing command if in WYSIWYG mode */
397 function formatDoc(sCmd, sValue) {
398 if (isWysiwy g()){
399 try {
400 // First, try the W3C draft standard way, which has
401 // been working on all non-IE browsers for a while.
402 // It is also supported by IE11 and higher.
403 document.execCommand("styleWithCSS", false, false);
404 } catch (e) {
405 try {
406 // For IE9 or IE10, this should work.
407 document.execCommand("useCSS", 0, true);
408 } catch (e) {
409 // OK, that apparently did not work, do nothing.
410 }
411 }
412 document.execCommand(sCmd, false, sValue);
413 oDoc.focus();
414 }
415 }
416
417 /* Change the editing mode. Convert to markup if the argument
418 ** is true and wysiwyg if the argument is false. */
419 function setDocMode(bToMarkup, content) {
420 if(undefined===content){
421 content = bToMarkup ? oDoc.innerHTML : oDoc.innerText;
422 }
423 if(!setDocMode.linebreak){
424 setDocMode.linebreak = new RegExp("</p><p>","ig");
425 }
426 if(!setDocMode.toHide){
427 setDocMode.toHide = toolbars.querySelectorAll(
428 '#wysiwyg-toolBar1 > *:not(#wysiwygEditMode), '
429 +'#wysiwyg-toolBar2');
430 }
431 if (bToMarkup) {
432 /* WYSIWYG -> Markup */
433 // Legacy did this: content=content.replace(setDocMode.linebreak,"</p>\n\n<p>")
434 D.append(D.clearElement(oDoc), content)
435 oDoc.style.whInvoke this routine prior to submitting the HTML content back
436 ** to the server */
437 /*functio /* Return true if th=="pre-wrap"){setDocMode(0);}
438 document.getElementById("wysiwygValue").
--- a/src/fossil.page.wikiedit-wysiwyg-legacy.js
+++ b/src/fossil.page.wikiedit-wysiwyg-legacy.js
@@ -1,438 +0,0 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/src/fossil.wikiedit-wysiwyg.js
+++ b/src/fossil.wikiedit-wysiwyg.js
@@ -5,7 +5,10 @@
55
66
Requires: window.fossil, fossil.dom, and that the current page is
77
/wikiedit. If called from another page it returns without effect.
8
-ditor-widget-swapping API.
8
+
9
+ Caveat: this is an all-or-nothing solution. That is, once plugged
10
+ in to /wikiedit, it cannot be removed without reloading the page.
11
+ That is a limitation of the current editor-widget-swapping API.
912
*/
1013
(function(F/*fossil object*/){
1114
'use strict';
@@ -66,7 +69,10 @@
6669
#wysiwyg-toolBar2 > * { /* icons */
6770
border: 1px solid rgba(127,127,127,0.3);
6871
vertical-align: baseline;
69
- ma/* Adapted from https://st
72
+ margin: 0.1em;
73
+}
74
+`;
75
+ head.appendChild(styleTag);
7076
styleTag.type = 'text/css';
7177
D.append(styleTag, styleCSS);
7278
})();
@@ -432,7 +438,4 @@
432438
/* WYSIWYG -> Markup */
433439
// Legacy did this: content=content.replace(setDocMode.linebreak,"</p>\n\n<p>")
434440
D.append(D.clearElement(oDoc), content)
435
- oDoc.style.whInvoke this routine prior to submitting the HTML content back
436
- ** to the server */
437
- /*functio /* Return true if th=="pre-wrap"){setDocMode(0);}
438
- document.getElementById("wysiwygValue").
441
+ oDoc.style.wh
--- a/src/fossil.wikiedit-wysiwyg.js
+++ b/src/fossil.wikiedit-wysiwyg.js
@@ -5,7 +5,10 @@
5
6 Requires: window.fossil, fossil.dom, and that the current page is
7 /wikiedit. If called from another page it returns without effect.
8 ditor-widget-swapping API.
 
 
 
9 */
10 (function(F/*fossil object*/){
11 'use strict';
@@ -66,7 +69,10 @@
66 #wysiwyg-toolBar2 > * { /* icons */
67 border: 1px solid rgba(127,127,127,0.3);
68 vertical-align: baseline;
69 ma/* Adapted from https://st
 
 
 
70 styleTag.type = 'text/css';
71 D.append(styleTag, styleCSS);
72 })();
@@ -432,7 +438,4 @@
432 /* WYSIWYG -> Markup */
433 // Legacy did this: content=content.replace(setDocMode.linebreak,"</p>\n\n<p>")
434 D.append(D.clearElement(oDoc), content)
435 oDoc.style.whInvoke this routine prior to submitting the HTML content back
436 ** to the server */
437 /*functio /* Return true if th=="pre-wrap"){setDocMode(0);}
438 document.getElementById("wysiwygValue").
--- a/src/fossil.wikiedit-wysiwyg.js
+++ b/src/fossil.wikiedit-wysiwyg.js
@@ -5,7 +5,10 @@
5
6 Requires: window.fossil, fossil.dom, and that the current page is
7 /wikiedit. If called from another page it returns without effect.
8
9 Caveat: this is an all-or-nothing solution. That is, once plugged
10 in to /wikiedit, it cannot be removed without reloading the page.
11 That is a limitation of the current editor-widget-swapping API.
12 */
13 (function(F/*fossil object*/){
14 'use strict';
@@ -66,7 +69,10 @@
69 #wysiwyg-toolBar2 > * { /* icons */
70 border: 1px solid rgba(127,127,127,0.3);
71 vertical-align: baseline;
72 margin: 0.1em;
73 }
74 `;
75 head.appendChild(styleTag);
76 styleTag.type = 'text/css';
77 D.append(styleTag, styleCSS);
78 })();
@@ -432,7 +438,4 @@
438 /* WYSIWYG -> Markup */
439 // Legacy did this: content=content.replace(setDocMode.linebreak,"</p>\n\n<p>")
440 D.append(D.clearElement(oDoc), content)
441 oDoc.style.wh
 
 
 
+1 -1
--- src/main.mk
+++ src/main.mk
@@ -233,16 +233,16 @@
233233
$(SRCDIR)/fossil.fetch.js \
234234
$(SRCDIR)/fossil.numbered-lines.js \
235235
$(SRCDIR)/fossil.page.fileedit.js \
236236
$(SRCDIR)/fossil.page.forumpost.js \
237237
$(SRCDIR)/fossil.page.pikchrshow.js \
238
- $(SRCDIR)/fossil.page.wikiedit-wysiwyg-legacy.js \
239238
$(SRCDIR)/fossil.page.wikiedit.js \
240239
$(SRCDIR)/fossil.pikchr.js \
241240
$(SRCDIR)/fossil.popupwidget.js \
242241
$(SRCDIR)/fossil.storage.js \
243242
$(SRCDIR)/fossil.tabs.js \
243
+ $(SRCDIR)/fossil.wikiedit-wysiwyg.js \
244244
$(SRCDIR)/graph.js \
245245
$(SRCDIR)/href.js \
246246
$(SRCDIR)/login.js \
247247
$(SRCDIR)/markdown.md \
248248
$(SRCDIR)/menu.js \
249249
--- src/main.mk
+++ src/main.mk
@@ -233,16 +233,16 @@
233 $(SRCDIR)/fossil.fetch.js \
234 $(SRCDIR)/fossil.numbered-lines.js \
235 $(SRCDIR)/fossil.page.fileedit.js \
236 $(SRCDIR)/fossil.page.forumpost.js \
237 $(SRCDIR)/fossil.page.pikchrshow.js \
238 $(SRCDIR)/fossil.page.wikiedit-wysiwyg-legacy.js \
239 $(SRCDIR)/fossil.page.wikiedit.js \
240 $(SRCDIR)/fossil.pikchr.js \
241 $(SRCDIR)/fossil.popupwidget.js \
242 $(SRCDIR)/fossil.storage.js \
243 $(SRCDIR)/fossil.tabs.js \
 
244 $(SRCDIR)/graph.js \
245 $(SRCDIR)/href.js \
246 $(SRCDIR)/login.js \
247 $(SRCDIR)/markdown.md \
248 $(SRCDIR)/menu.js \
249
--- src/main.mk
+++ src/main.mk
@@ -233,16 +233,16 @@
233 $(SRCDIR)/fossil.fetch.js \
234 $(SRCDIR)/fossil.numbered-lines.js \
235 $(SRCDIR)/fossil.page.fileedit.js \
236 $(SRCDIR)/fossil.page.forumpost.js \
237 $(SRCDIR)/fossil.page.pikchrshow.js \
 
238 $(SRCDIR)/fossil.page.wikiedit.js \
239 $(SRCDIR)/fossil.pikchr.js \
240 $(SRCDIR)/fossil.popupwidget.js \
241 $(SRCDIR)/fossil.storage.js \
242 $(SRCDIR)/fossil.tabs.js \
243 $(SRCDIR)/fossil.wikiedit-wysiwyg.js \
244 $(SRCDIR)/graph.js \
245 $(SRCDIR)/href.js \
246 $(SRCDIR)/login.js \
247 $(SRCDIR)/markdown.md \
248 $(SRCDIR)/menu.js \
249
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -645,16 +645,16 @@
645645
$(SRCDIR)/fossil.fetch.js \
646646
$(SRCDIR)/fossil.numbered-lines.js \
647647
$(SRCDIR)/fossil.page.fileedit.js \
648648
$(SRCDIR)/fossil.page.forumpost.js \
649649
$(SRCDIR)/fossil.page.pikchrshow.js \
650
- $(SRCDIR)/fossil.page.wikiedit-wysiwyg-legacy.js \
651650
$(SRCDIR)/fossil.page.wikiedit.js \
652651
$(SRCDIR)/fossil.pikchr.js \
653652
$(SRCDIR)/fossil.popupwidget.js \
654653
$(SRCDIR)/fossil.storage.js \
655654
$(SRCDIR)/fossil.tabs.js \
655
+ $(SRCDIR)/fossil.wikiedit-wysiwyg.js \
656656
$(SRCDIR)/graph.js \
657657
$(SRCDIR)/href.js \
658658
$(SRCDIR)/login.js \
659659
$(SRCDIR)/markdown.md \
660660
$(SRCDIR)/menu.js \
661661
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -645,16 +645,16 @@
645 $(SRCDIR)/fossil.fetch.js \
646 $(SRCDIR)/fossil.numbered-lines.js \
647 $(SRCDIR)/fossil.page.fileedit.js \
648 $(SRCDIR)/fossil.page.forumpost.js \
649 $(SRCDIR)/fossil.page.pikchrshow.js \
650 $(SRCDIR)/fossil.page.wikiedit-wysiwyg-legacy.js \
651 $(SRCDIR)/fossil.page.wikiedit.js \
652 $(SRCDIR)/fossil.pikchr.js \
653 $(SRCDIR)/fossil.popupwidget.js \
654 $(SRCDIR)/fossil.storage.js \
655 $(SRCDIR)/fossil.tabs.js \
 
656 $(SRCDIR)/graph.js \
657 $(SRCDIR)/href.js \
658 $(SRCDIR)/login.js \
659 $(SRCDIR)/markdown.md \
660 $(SRCDIR)/menu.js \
661
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -645,16 +645,16 @@
645 $(SRCDIR)/fossil.fetch.js \
646 $(SRCDIR)/fossil.numbered-lines.js \
647 $(SRCDIR)/fossil.page.fileedit.js \
648 $(SRCDIR)/fossil.page.forumpost.js \
649 $(SRCDIR)/fossil.page.pikchrshow.js \
 
650 $(SRCDIR)/fossil.page.wikiedit.js \
651 $(SRCDIR)/fossil.pikchr.js \
652 $(SRCDIR)/fossil.popupwidget.js \
653 $(SRCDIR)/fossil.storage.js \
654 $(SRCDIR)/fossil.tabs.js \
655 $(SRCDIR)/fossil.wikiedit-wysiwyg.js \
656 $(SRCDIR)/graph.js \
657 $(SRCDIR)/href.js \
658 $(SRCDIR)/login.js \
659 $(SRCDIR)/markdown.md \
660 $(SRCDIR)/menu.js \
661
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -566,16 +566,16 @@
566566
"$(SRCDIR)\fossil.fetch.js" \
567567
"$(SRCDIR)\fossil.numbered-lines.js" \
568568
"$(SRCDIR)\fossil.page.fileedit.js" \
569569
"$(SRCDIR)\fossil.page.forumpost.js" \
570570
"$(SRCDIR)\fossil.page.pikchrshow.js" \
571
- "$(SRCDIR)\fossil.page.wikiedit-wysiwyg-legacy.js" \
572571
"$(SRCDIR)\fossil.page.wikiedit.js" \
573572
"$(SRCDIR)\fossil.pikchr.js" \
574573
"$(SRCDIR)\fossil.popupwidget.js" \
575574
"$(SRCDIR)\fossil.storage.js" \
576575
"$(SRCDIR)\fossil.tabs.js" \
576
+ "$(SRCDIR)\fossil.wikiedit-wysiwyg.js" \
577577
"$(SRCDIR)\graph.js" \
578578
"$(SRCDIR)\href.js" \
579579
"$(SRCDIR)\login.js" \
580580
"$(SRCDIR)\markdown.md" \
581581
"$(SRCDIR)\menu.js" \
@@ -1172,16 +1172,16 @@
11721172
echo "$(SRCDIR)\fossil.fetch.js" >> $@
11731173
echo "$(SRCDIR)\fossil.numbered-lines.js" >> $@
11741174
echo "$(SRCDIR)\fossil.page.fileedit.js" >> $@
11751175
echo "$(SRCDIR)\fossil.page.forumpost.js" >> $@
11761176
echo "$(SRCDIR)\fossil.page.pikchrshow.js" >> $@
1177
- echo "$(SRCDIR)\fossil.page.wikiedit-wysiwyg-legacy.js" >> $@
11781177
echo "$(SRCDIR)\fossil.page.wikiedit.js" >> $@
11791178
echo "$(SRCDIR)\fossil.pikchr.js" >> $@
11801179
echo "$(SRCDIR)\fossil.popupwidget.js" >> $@
11811180
echo "$(SRCDIR)\fossil.storage.js" >> $@
11821181
echo "$(SRCDIR)\fossil.tabs.js" >> $@
1182
+ echo "$(SRCDIR)\fossil.wikiedit-wysiwyg.js" >> $@
11831183
echo "$(SRCDIR)\graph.js" >> $@
11841184
echo "$(SRCDIR)\href.js" >> $@
11851185
echo "$(SRCDIR)\login.js" >> $@
11861186
echo "$(SRCDIR)\markdown.md" >> $@
11871187
echo "$(SRCDIR)\menu.js" >> $@
11881188
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -566,16 +566,16 @@
566 "$(SRCDIR)\fossil.fetch.js" \
567 "$(SRCDIR)\fossil.numbered-lines.js" \
568 "$(SRCDIR)\fossil.page.fileedit.js" \
569 "$(SRCDIR)\fossil.page.forumpost.js" \
570 "$(SRCDIR)\fossil.page.pikchrshow.js" \
571 "$(SRCDIR)\fossil.page.wikiedit-wysiwyg-legacy.js" \
572 "$(SRCDIR)\fossil.page.wikiedit.js" \
573 "$(SRCDIR)\fossil.pikchr.js" \
574 "$(SRCDIR)\fossil.popupwidget.js" \
575 "$(SRCDIR)\fossil.storage.js" \
576 "$(SRCDIR)\fossil.tabs.js" \
 
577 "$(SRCDIR)\graph.js" \
578 "$(SRCDIR)\href.js" \
579 "$(SRCDIR)\login.js" \
580 "$(SRCDIR)\markdown.md" \
581 "$(SRCDIR)\menu.js" \
@@ -1172,16 +1172,16 @@
1172 echo "$(SRCDIR)\fossil.fetch.js" >> $@
1173 echo "$(SRCDIR)\fossil.numbered-lines.js" >> $@
1174 echo "$(SRCDIR)\fossil.page.fileedit.js" >> $@
1175 echo "$(SRCDIR)\fossil.page.forumpost.js" >> $@
1176 echo "$(SRCDIR)\fossil.page.pikchrshow.js" >> $@
1177 echo "$(SRCDIR)\fossil.page.wikiedit-wysiwyg-legacy.js" >> $@
1178 echo "$(SRCDIR)\fossil.page.wikiedit.js" >> $@
1179 echo "$(SRCDIR)\fossil.pikchr.js" >> $@
1180 echo "$(SRCDIR)\fossil.popupwidget.js" >> $@
1181 echo "$(SRCDIR)\fossil.storage.js" >> $@
1182 echo "$(SRCDIR)\fossil.tabs.js" >> $@
 
1183 echo "$(SRCDIR)\graph.js" >> $@
1184 echo "$(SRCDIR)\href.js" >> $@
1185 echo "$(SRCDIR)\login.js" >> $@
1186 echo "$(SRCDIR)\markdown.md" >> $@
1187 echo "$(SRCDIR)\menu.js" >> $@
1188
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -566,16 +566,16 @@
566 "$(SRCDIR)\fossil.fetch.js" \
567 "$(SRCDIR)\fossil.numbered-lines.js" \
568 "$(SRCDIR)\fossil.page.fileedit.js" \
569 "$(SRCDIR)\fossil.page.forumpost.js" \
570 "$(SRCDIR)\fossil.page.pikchrshow.js" \
 
571 "$(SRCDIR)\fossil.page.wikiedit.js" \
572 "$(SRCDIR)\fossil.pikchr.js" \
573 "$(SRCDIR)\fossil.popupwidget.js" \
574 "$(SRCDIR)\fossil.storage.js" \
575 "$(SRCDIR)\fossil.tabs.js" \
576 "$(SRCDIR)\fossil.wikiedit-wysiwyg.js" \
577 "$(SRCDIR)\graph.js" \
578 "$(SRCDIR)\href.js" \
579 "$(SRCDIR)\login.js" \
580 "$(SRCDIR)\markdown.md" \
581 "$(SRCDIR)\menu.js" \
@@ -1172,16 +1172,16 @@
1172 echo "$(SRCDIR)\fossil.fetch.js" >> $@
1173 echo "$(SRCDIR)\fossil.numbered-lines.js" >> $@
1174 echo "$(SRCDIR)\fossil.page.fileedit.js" >> $@
1175 echo "$(SRCDIR)\fossil.page.forumpost.js" >> $@
1176 echo "$(SRCDIR)\fossil.page.pikchrshow.js" >> $@
 
1177 echo "$(SRCDIR)\fossil.page.wikiedit.js" >> $@
1178 echo "$(SRCDIR)\fossil.pikchr.js" >> $@
1179 echo "$(SRCDIR)\fossil.popupwidget.js" >> $@
1180 echo "$(SRCDIR)\fossil.storage.js" >> $@
1181 echo "$(SRCDIR)\fossil.tabs.js" >> $@
1182 echo "$(SRCDIR)\fossil.wikiedit-wysiwyg.js" >> $@
1183 echo "$(SRCDIR)\graph.js" >> $@
1184 echo "$(SRCDIR)\href.js" >> $@
1185 echo "$(SRCDIR)\login.js" >> $@
1186 echo "$(SRCDIR)\markdown.md" >> $@
1187 echo "$(SRCDIR)\menu.js" >> $@
1188
--- www/changes.wiki
+++ www/changes.wiki
@@ -16,10 +16,13 @@
1616
editor and previewer for pikchr markup.
1717
* In [/help?cmd=/wikiedit|/wikiedit] and
1818
[/help?cmd=/fileedit|/fileedit], Ctrl-Enter can now be used
1919
initiate a preview and to toggle between the editor and preview
2020
tabs.
21
+ * The <tt>/artifact</tt> and <tt>/file</tt> views, when in
22
+ line-number mode, now support interactive selection of a range
23
+ of lines to hyperlink to.
2124
2225
<a name='v2_12'></a>
2326
<h2>Changes for Version 2.12.1 (2020-08-20)</h2>
2427
2528
* (2.12.1): Fix client-side vulnerabilities discovered by Max Justicz.
2629
--- www/changes.wiki
+++ www/changes.wiki
@@ -16,10 +16,13 @@
16 editor and previewer for pikchr markup.
17 * In [/help?cmd=/wikiedit|/wikiedit] and
18 [/help?cmd=/fileedit|/fileedit], Ctrl-Enter can now be used
19 initiate a preview and to toggle between the editor and preview
20 tabs.
 
 
 
21
22 <a name='v2_12'></a>
23 <h2>Changes for Version 2.12.1 (2020-08-20)</h2>
24
25 * (2.12.1): Fix client-side vulnerabilities discovered by Max Justicz.
26
--- www/changes.wiki
+++ www/changes.wiki
@@ -16,10 +16,13 @@
16 editor and previewer for pikchr markup.
17 * In [/help?cmd=/wikiedit|/wikiedit] and
18 [/help?cmd=/fileedit|/fileedit], Ctrl-Enter can now be used
19 initiate a preview and to toggle between the editor and preview
20 tabs.
21 * The <tt>/artifact</tt> and <tt>/file</tt> views, when in
22 line-number mode, now support interactive selection of a range
23 of lines to hyperlink to.
24
25 <a name='v2_12'></a>
26 <h2>Changes for Version 2.12.1 (2020-08-20)</h2>
27
28 * (2.12.1): Fix client-side vulnerabilities discovered by Max Justicz.
29

Keyboard Shortcuts

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