@@ -225,12 +225,14 @@
225 225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
the preview which explicitly have a CSS class named
226 226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
`language-`something, and then asks highlightjs to highlight them.
227 227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
228 228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Integrating a Custom Editor Widget
229 229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *Hypothetically*, though this is currently unproven "in the wild," it
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- is possible to replace `/filepage`'s basic text-editing widget (a
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (These instructions also work for the `/wikiedit` page by eplacing
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "fileedit" with "wikiedit" in any strings or symbol names!)
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ It is possible to replace `/filepage`'s basic text-editing widget (a
232 234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
`textarea` element) with a fancy 3rd-party editor widget by following
233 235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
these instructions...
234 236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
235 237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
All JavaScript code which follows is assumed to be in a script tag
236 238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
similar to the one shown in the previous section:
@@ -251,21 +253,68 @@
251 253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
function(){ return text-form content of your widget },
252 254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
function(content){ set text-form content of your widget }
253 255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
254 256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
```
255 257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Secondly, inject the custom editor widget into the UI, replacing
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the default editor widget:
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Secondly, we need to alert the editor app when there are changes so
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ that it can do things like store edits locally so that they are not
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lost on a page reload. How that is done is completely dependent on the
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 3rd-party editor widget, but it generically looks something like:
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ```
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ myCustomWidget.on('eventName', ()=>fossil.page.notifyOfChange());
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ```
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (This feature requires fossil version 2.13 or later. In 2.12 it is
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ possible to do this but requires making use of a "leaky abstraction".)
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Lastly, if the 3rd-party editor does *not* hide or remove the native
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ editor widget, and does not inject itself into the DOM on the caller's
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ behalf, we can replace the native widget with the 3rd-party one with:
258 273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
259 274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
```javascript
260 275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil.page.replaceEditorWidget(yourNewWidgetElement);
261 276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
```
262 277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
263 278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
That method must be passed a DOM element and may only be called once:
264 279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
it *removes itself* the first time it is called.
265 280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- That "should" be all there is to it. When `fossil.page` needs to get
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- the being-edited content, it will call `fossil.page.fileContent()`
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- with no arguments, and when it sets the content (immediately after
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (re)loading a file), it will pass that content to
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- `fossil.page.fileContent()`. Those, in turn will trigger the installed
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- proxies and fire any relevant events.
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ That should be all there is to it. When `fossil.page` needs to get the
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ being-edited content, it will call the installed content-getter
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ function with no arguments, and when it sets the content (immediately
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ after (re)loading a file or grabbing local edits), it will pass that
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ content to the installed content-setter method. Those, in turn will
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ trigger the installed proxies and fire any relevant events.
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Below is an example of Fossil skin footer content which plugs in the
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ TinyMCE HTML editor into the `/wikiedit` page, but the process is
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ identical for `/fileedit` (noting that `/fileedit` may need to be able
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to edit multiple types of files for which a special-purpose editor
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ like TinyMCE may not be suitable). Note that any paths to CSS and JS
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ resources of course need to be modified to suit one's own
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ installation.
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ```
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <!-- TinyMCE CSS and JS: -->
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <link href="$<home>/doc/ckout/skin.min.css" rel="stylesheet" type="text/css">
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <link href="$<home>/doc/ckout/content.min.css" rel="stylesheet" type="text/css">
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <script src='$<home>/doc/ckout/tinymce.min.js'></script>
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <script src='$<home>/doc/ckout/theme.min.js'></script>
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <script src='$<home>/doc/ckout/icons.min.js'></script>
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <!-- Integrate TinyMCE into /wikiedit: -->
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <script nonce="$<nonce>">
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(window.fossil && window.fossil.page.name==='wikiedit'){
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ window.fossil.onPageLoad( function(){
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const elemId = 'wikiedit-content-editor';
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tinymce.init({selector: 'textarea#'+elemId});
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const widget = tinymce.get(elemId);
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil.page.setContentMethods(
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ function(){return widget.getContent()},
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ function(content){widget.setContent(content)}
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ widget.on('change', function(){
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(widget.isDirty()) fossil.page.notifyOfChange();
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ });
317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ });
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ </script>
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ```
272 321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!