Changes for page EditSheet
Last modified by teamwire005 on 2025/05/06 08:20
From version 4.1
edited by teamwire004
on 2024/07/12 13:08
on 2024/07/12 13:08
Change comment:
Install extension [org.xwiki.platform:xwiki-platform-ckeditor-ui/15.10.10]
To version 3.1
edited by teamwire004
on 2024/01/16 09:33
on 2024/01/16 09:33
Change comment:
Install extension [org.xwiki.platform:xwiki-platform-ckeditor-ui/14.10.13]
Summary
-
Objects (4 modified, 2 added, 5 removed)
- XWiki.JavaScriptExtension[0]
- XWiki.JavaScriptExtension[2]
- XWiki.StyleSheetExtension[0]
- XWiki.UIExtensionClass[0]
- XWiki.UIExtensionClass[1]
- XWiki.UIExtensionClass[2]
- XWiki.UIExtensionClass[3]
- XWiki.UIExtensionClass[4]
- XWiki.UIExtensionClass[5]
- XWiki.JavaScriptExtension[1]
- XWiki.StyleSheetExtension[1]
Details
- XWiki.JavaScriptExtension[0]
-
- Code
-
... ... @@ -1,6 +1,42 @@ 1 -XWiki.locale = document.documentElement.getAttribute('lang') || ''; 2 - 1 +/* 2 +#if ($services.debug.minify) 3 + #set ($jsExtension = '.min') 4 +#else 5 + #set ($jsExtension = '') 6 +#end 7 +#set ($ckeditorPath = $services.webjars.url('org.xwiki.platform:xwiki-platform-ckeditor-webjar', 'ckeditor')) 8 +#set ($ckeditorBasePath = $stringtool.removeEnd($stringtool.removeEnd($ckeditorPath, '.js'), 'ckeditor')) 9 +#set ($resourcePickerBundlePath = "${ckeditorBasePath}plugins/xwiki-resource/resourcePicker.bundle$jsExtension") 10 +#set ($macroWizardBundlePath = "${ckeditorBasePath}plugins/xwiki-macro/macroWizard.bundle$jsExtension") 11 +#set ($imageWizardBundlePath = "${ckeditorBasePath}plugins/xwiki-image/imageWizard.bundle$jsExtension") 12 +#set ($modalPath = "${ckeditorBasePath}plugins/xwiki-dialog/modal.min") 13 +#set ($l10nPath = "${ckeditorBasePath}plugins/xwiki-localization/l10n.min") 14 +*/ 3 3 require.config({ 16 + paths: { 17 + ckeditor: '$!ckeditorPath', 18 + resourcePickerBundle: '$!resourcePickerBundlePath', 19 + modal: '$!modalPath', 20 + l10n: '$!l10nPath', 21 + macroWizard: '$!macroWizardBundlePath', 22 + imageWizard: '$!imageWizardBundlePath', 23 + // This is used by the resource suggest picker on the link modal. 24 + 'bootstrap3-typeahead': $jsontool.serialize($services.webjars.url('org.webjars.npm:bootstrap-3-typeahead', 25 + 'bootstrap3-typeahead.min')), 26 + // This is used to preserve the selection when switching between WYSIWYG and Source modes. 27 + 'fast-diff': $jsontool.serialize($services.webjars.url('org.webjars.npm:fast-diff', 'diff')) 28 + }, 29 + bundles: { 30 + 'resourcePickerBundle': ['resource', 'resourcePicker', 'entityResourcePicker', 'entityResourceSuggester', 31 + 'entityResourceDisplayer'] 32 + }, 33 + shim: { 34 + ckeditor: { 35 + exports: 'CKEDITOR', 36 + // This includes dependencies of the plugins bundled with the CKEditor code. 37 + deps: ['jquery', 'resource', 'resourcePicker', 'macroWizard', 'imageWizard'] 38 + } 39 + }, 4 4 config: { 5 5 l10n: { 6 6 // We need to specify the language because this URL can be used after the page is loaded and thus after the ... ... @@ -8,24 +8,27 @@ 8 8 // a different language specified). We take the current language from the page HTML, rather than using Velocity, 9 9 // in order to avoid having the current language cached. 10 10 url: new XWiki.Document('Translator', 'CKEditor').getURL('get', 'outputSyntax=plain&language=' + 11 - encodeURIComponent( XWiki.locale))47 + encodeURIComponent(document.documentElement.getAttribute('lang') || '')) 12 12 } 13 13 } 14 14 }); 15 15 52 +window.CKEDITOR_BASEPATH = "$!ckeditorBasePath"; 53 + 16 16 define('xwiki-ckeditor', [ 17 17 'jquery', 18 - // The CKEditor standard API. 19 19 'ckeditor', 20 20 // Used to access the form token required by the upload URL. 21 21 'xwiki-meta', 22 - // CKEditor plugins specific to XWiki. 23 - 'xwiki-ckeditor-plugins', 24 24 // Used to catch form action events fired from Prototype.js code (actionButtons.js). 25 25 'xwiki-events-bridge', 26 - // Load the translations for our custom CKEditor plugins. 27 - new XWiki.Document('Translations', 'CKEditor').getURL('jsx', 'language=' + encodeURIComponent(XWiki.locale)) 61 + // Configures the path to the tree widget module and its dependencies which are used by the page and attachment 62 + // pickers on the link, image and macro dialogs to select pages and attachments. 63 + "$!services.webjars.url('org.xwiki.platform:xwiki-platform-tree-webjar', 'require-config.min.js', {'evaluate': true})" 28 28 ], function($, ckeditor, xwikiMeta) { 65 + var deferred = $.Deferred(); 66 + var currentLocale = $('html').attr('lang') || ''; 67 + 29 29 // We have to pass the plugin that makes the request (the initiator) because the expected response can be different 30 30 // (e.g. between the filebrowser and filetools plugins). 31 31 var getUploadURL = function(document, initiator) { ... ... @@ -34,7 +34,7 @@ 34 34 outputSyntax: 'plain', 35 35 // The syntax and language are important especially when the upload request creates a new document. 36 36 syntax: document.syntax, 37 - language: XWiki.locale,76 + language: currentLocale, 38 38 form_token: xwikiMeta.form_token, 39 39 initiator: initiator 40 40 })); ... ... @@ -58,6 +58,36 @@ 58 58 var config = { 59 59 filebrowserUploadUrl: uploadDisabled ? '' : getUploadURL(sourceDocument, 'filebrowser'), 60 60 height: $(element).height(), 100 + mentions: [ 101 + { 102 + // We use the source document to compute the feed URL because we want the suggested link references to be 103 + // relative to the edited document (we want the editor to output relative references as much as possible). 104 + feed: sourceDocument.getURL('get', $.param({ 105 + sheet: 'CKEditor.LinkSuggestions', 106 + outputSyntax: 'plain', 107 + language: currentLocale 108 + // Prevent the curly brackets from being URL encoded because they mark a placeholder that will be replaced 109 + // with the text typed by the user (and CKEditor takes care of URL encoding it). 110 + }) + '&input={encodedQuery}'), 111 + itemTemplate: [ 112 + '<li data-id="{id}" class="ckeditor-autocomplete-item">', 113 + '<div>', 114 + '<span class="ckeditor-autocomplete-item-icon-wrapper">', 115 + // We have to output both icon types but normally only one is defined and the other is hidden. 116 + '<img src="{iconURL}"/>', 117 + '<span class="{iconClass}"></span>', 118 + '</span>', 119 + '<span class="ckeditor-autocomplete-item-label">{label}</span>', 120 + '</div>', 121 + '<div class="ckeditor-autocomplete-item-hint">{hint}</div>', 122 + '</li>'].join(''), 123 + outputTemplate: '<a href="{url}" data-reference="{typed}|-|{type}|-|{reference}">{label}</a>', 124 + followingSpace: true, 125 + marker: '[', 126 + minChars: 0, 127 + itemsLimit: 6 128 + } 129 + ], 61 61 // Used to resolve and serialize relative references. Also used to make HTTP requests with the right context. 62 62 sourceDocument: sourceDocument, 63 63 // The syntax of the edited content is not always the same as the syntax of the source document (which applies to ... ... @@ -70,7 +70,7 @@ 70 70 labelGenerator: sourceDocument.getURL('get', $.param({ 71 71 sheet: 'CKEditor.LinkLabelGenerator', 72 72 outputSyntax: 'plain', 73 - language: XWiki.locale142 + language: currentLocale 74 74 })) 75 75 } 76 76 }; ... ... @@ -127,49 +127,18 @@ 127 127 object[key] = newValue; 128 128 }; 129 129 130 - // See XWIKI-21351: Macros using RequireJS are not properly displayed by the standalone WYSIWYG editor even when 131 - // JavaScript is enabled. 132 - // 133 - // For each CKEditor instance that uses a separate DOM document for the edited content (i.e. classical iframe-based 134 - // editor) we overwrite the appendChild and insertBefore functions of the initial HEAD element in order to make sure 135 - // that RequireJS appends the script tags to the current HEAD element (because the HEAD element is overwritten each 136 - // time the edited content is reloaded, like when inserting a macro or switching between Source and WYSIWYG modes). 137 - // 138 - // We have to overwrite both appendChild and insertBefore because depending on the presence of the BASE element 139 - // RequireJS uses one or the other. 140 - ckeditor.on('instanceReady', ({editor}) => { 141 - if (editor.document.$ !== document) { 142 - // This editor instance is using a separate DOM document for editing which means it's a standalone editor. 143 - const initialHead = editor.document.$.head; 144 - const originalAppendChild = initialHead.appendChild; 145 - initialHead.appendChild = function() { 146 - const currentHead = editor.document.$.head; 147 - if (currentHead !== initialHead) { 148 - // The edited content has been reloaded. Append to the current HEAD. 149 - return currentHead.appendChild.apply(currentHead, arguments); 150 - } else { 151 - // Still using the initial HEAD so preserve the default behavior. 152 - originalAppendChild.apply(initialHead, arguments); 153 - } 154 - }; 155 - const originalInsertBefore = initialHead.insertBefore; 156 - initialHead.insertBefore = function(newChild, existingChild) { 157 - const currentHead = editor.document.$.head; 158 - if (currentHead !== initialHead) { 159 - // The edited content has been reloaded. Normally the given existingChild should be a child of the initial 160 - // HEAD element (not the current one), but better check to be sure. 161 - if (existingChild.parentNode === currentHead) { 162 - return currentHead.insertBefore(newChild, existingChild); 163 - } else { 164 - return currentHead.appendChild.apply(newChild); 165 - } 166 - } else { 167 - // Still using the initial HEAD so preserve the default behavior. 168 - return originalInsertBefore.apply(initialHead, arguments); 169 - } 170 - }; 171 - } 199 + require([ 200 + // We cannot add these modules to the list of dependencies because they need the tree module to be configured first. 201 + 'entityResourcePicker', 'entityResourceSuggester', 'entityResourceDisplayer', 202 + // Load the translations for our custom CKEditor plugins. We didn't add this as a dependency to the xwiki-ckeditor 203 + // module because some of our plugins load their dependencies with RequireJS and thus they are loaded with a small 204 + // delay. The plugin needs to be defined before calling CKEDITOR.plugins.setLang(). 205 + new XWiki.Document('Translations', 'CKEditor').getURL('jsx', $.param({ 206 + language: currentLocale 207 + })) 208 + ], function() { 209 + deferred.resolve(ckeditor); 172 172 }); 173 173 174 - return $.Deferred().resolve(ckeditor).promise();212 + return deferred.promise(); 175 175 }); - Parse content
-
... ... @@ -1,1 +1,1 @@ 1 - No1 +Yes
- XWiki.JavaScriptExtension[2]
-
- Parse content
-
... ... @@ -1,1 +1,1 @@ 1 - No1 +Yes
- XWiki.StyleSheetExtension[0]
-
- Code
-
... ... @@ -1,5 +1,50 @@ 1 +#template('colorThemeInit.vm') 2 + 3 +/* 4 +#set ($ckeditorSkinPath = $services.webjars.url('org.xwiki.platform:xwiki-platform-ckeditor-webjar', 'skins/moono-lisa')) 5 +#if ($ckeditorSkinPath.indexOf('?') >= 0) 6 + ## The WebJar resource path was specified in the query string before 7.1M1 which prevented the browser from resolving 7 + ## relative paths. See XWIKI-10880 (A CSS file inside a webjar cannot use a resource from that webjar). 8 + */ 9 + a.cke_button > span.cke_button_icon { 10 + background-image: url("$ckeditorSkinPath/icons.png") !important; 11 + } 12 + .cke_hidpi a.cke_button > span.cke_button_icon { 13 + background-image: url("$ckeditorSkinPath/icons_hidpi.png") !important; 14 + } 15 + .cke_notification_close, a.cke_dialog_close_button { 16 + background-image: url("$ckeditorSkinPath/images/close.png") !important; 17 + } 18 + .cke_hidpi .cke_dialog_close_button { 19 + background-image: url("$ckeditorSkinPath/images/hidpi/close.png") !important; 20 + } 21 + .cke_dialog a.cke_btn_reset { 22 + background-image: url("$ckeditorSkinPath/images/refresh.png") !important; 23 + } 24 + .cke_hidpi .cke_dialog a.cke_btn_reset { 25 + background-image: url("$ckeditorSkinPath/images/hidpi/refresh.png") !important; 26 + } 27 + .cke_dialog a.cke_btn_locked { 28 + background-image: url("$ckeditorSkinPath/images/lock.png") !important; 29 + } 30 + .cke_hidpi .cke_dialog a.cke_btn_locked { 31 + background-image: url("$ckeditorSkinPath/images/hidpi/lock.png") !important; 32 + } 33 + .cke_dialog a.cke_btn_unlocked { 34 + background-image: url("$ckeditorSkinPath/images/lock-open.png") !important; 35 + } 36 + .cke_hidpi .cke_dialog a.cke_btn_unlocked { 37 + background-image: url("$ckeditorSkinPath/images/hidpi/lock-open.png") !important; 38 + } 39 + .cke_menuarrow { 40 + background-image: url("$ckeditorSkinPath/images/arrow.png") !important; 41 + } 42 + /* 43 +#end 44 +*/ 45 + 1 1 a.cke_button_disabled > span.cke_button_icon.loading { 2 - background-image: url( @xwiki-icon-spinner) !important;47 + background-image: url("$xwiki.getSkinFile('icons/xwiki/spinner.gif')") !important; 3 3 background-position: 0 0 !important; 4 4 } 5 5 ... ... @@ -35,7 +35,7 @@ 35 35 } 36 36 37 37 .cke_maximized .buttons { 38 - background-color: @well-bg;83 + background-color: $theme.backgroundSecondaryColor; 39 39 padding: .5em; 40 40 } 41 41 ... ... @@ -143,7 +143,7 @@ 143 143 box-sizing: border-box; 144 144 } 145 145 .resourcePicker .resourceDisplay.loading { 146 - background-image: url( @xwiki-icon-spinner);191 + background-image: url("$xwiki.getSkinFile('icons/xwiki/spinner.gif')"); 147 147 background-repeat: no-repeat; 148 148 } 149 149 ... ... @@ -167,7 +167,7 @@ 167 167 * tree finder = 48px 168 168 * footer = 69px 169 169 */ 170 - max-height: calc( ~"100vh - 268px");215 + max-height: calc(100vh - 268px); 171 171 overflow-y: auto; 172 172 } 173 173 ... ... @@ -236,215 +236,43 @@ 236 236 */ 237 237 ul.cke_autocomplete_panel { 238 238 border: 1px solid rgba(0, 0, 0, 0.15); 239 - border-radius: @border-radius-base;284 + border-radius: 4px; 240 240 box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); 241 241 font: inherit; 242 242 padding: 5px 0; 243 243 width: auto; 244 - max-width: 324px;289 + max-width: 100%; 245 245 min-width: 200px; 246 246 } 247 -.cke_autocomplete_panel > li.ckeditor-autocomplete-group, 248 248 .cke_autocomplete_panel > li.ckeditor-autocomplete-item { 249 - padding: 5px 20px;293 + padding: 3px 12px; 250 250 } 251 -.cke_autocomplete_panel > li.ckeditor-autocomplete-group { 252 - border-top: 1px solid @xwiki-border-color; 253 - color: @text-muted; 254 - font-size: smaller; 255 - margin-top: 9px; 256 - padding-top: 14px; 257 -} 258 -.cke_autocomplete_panel > li.ckeditor-autocomplete-group h6 { 259 - font-size: inherit; 260 - margin: 0; 261 -} 262 -.cke_autocomplete_panel > li.ckeditor-autocomplete-group:first-child { 263 - border-top: 0 none; 264 - margin-top: 0; 265 - padding-top: 5px; 266 -} 267 -.cke_autocomplete_panel > li.ckeditor-autocomplete-group:hover { 268 - background-color: transparent; 269 - cursor: inherit; 270 -} 271 -.ckeditor-autocomplete-group h6, 272 -.ckeditor-autocomplete-item-label, 273 -.ckeditor-autocomplete-item-shortcut { 274 - overflow: hidden; 275 - text-overflow: ellipsis; 295 +.cke_autocomplete_panel > li.ckeditor-autocomplete-item > div { 276 276 white-space: nowrap; 277 277 } 278 -.ckeditor-autocomplete-item-head { 279 - display: flex; 280 - align-items: center; 281 -} 282 282 .ckeditor-autocomplete-item-icon-wrapper { 283 283 display: inline-block; 284 284 height: 14px; 285 285 line-height: 14px; 286 - margin-right: . 5em;302 + margin-right: .3em; 287 287 text-align: center; 288 288 width: 14px; 289 289 } 290 290 .ckeditor-autocomplete-item-icon-wrapper img { 291 - border-radius: @border-radius-small;307 + border-radius: 3px; 292 292 max-height: 14px; 293 293 max-width: 14px; 294 294 vertical-align: text-top; 295 295 } 296 -.ckeditor-autocomplete-item-preview-wrapper { 297 - display: flex; 298 - align-items: center; 299 - justify-content: space-around; 300 - height: 64px; 301 - margin-right: .5em; 302 - text-align: center; 303 - vertical-align: middle; 304 - width: 64px; 305 -} 306 -.ckeditor-autocomplete-centered { 307 - justify-content: center; 308 -} 309 -.ckeditor-autocomplete-item-preview-wrapper img { 310 - border-radius: @border-radius-small; 311 - max-height: 64px; 312 - max-width: 64px; 313 - vertical-align: text-top; 314 -} 315 315 /* The image still takes some space in IE11 even if there's no source specified. Let's make sure it's hidden. 316 316 See CKEDITOR-389: Missing space in the suggestions that appear while using the autocomplete function on IE 11 */ 317 -.ckeditor-autocomplete-item-preview-wrapper img[src=""], 318 318 .ckeditor-autocomplete-item-icon-wrapper img[src=""] { 319 319 display: none; 320 320 } 321 -.ckeditor-autocomplete-item-label { 322 - /* Push the shortcut to the right edge of the item. */ 323 - flex-grow: 1; 324 -} 325 -.ckeditor-autocomplete-item-shortcut:not(:empty) { 326 - background-color: @xwiki-border-color; 327 - border-radius: @border-radius-base; 328 - padding: 2px 5px; 329 - margin-left: .5em; 330 -} 331 -.ckeditor-autocomplete-item-shortcut, 332 -.ckeditor-autocomplete-item-badge, 333 333 .ckeditor-autocomplete-item-hint { 334 - color: @text-muted;318 + color: $theme.textSecondaryColor; 335 335 font-size: smaller; 336 336 } 337 -.ckeditor-autocomplete-item-badge { 338 - background-color: @xwiki-border-color; 339 - font-weight: normal; 340 -} 341 -.ckeditor-autocomplete-item-hint { 342 - /* Limit to 3 lines of text (based on line height). */ 343 - max-height: calc(3 * 20em / 14); 344 - overflow: hidden; 345 - /* Put the ellipsis at the end of the last line when the text is cut. */ 346 - display: -webkit-box; 347 - -webkit-box-orient: vertical; 348 - -webkit-line-clamp: 3; 349 -} 350 350 .ckeditor-autocomplete-item-hint:empty { 351 351 margin-top: 0; 352 352 } 353 - 354 -/** 355 - * Source mode 356 - */ 357 - 358 -.cke_contents > textarea.cke_source { 359 - box-sizing: border-box; 360 - color: @text-color; 361 - font-family: @font-family-monospace; 362 - font-size: inherit; 363 - /* Same padding as on the page content. */ 364 - padding: @grid-gutter-width / 2; 365 -} 366 - 367 -.cke_contents > textarea.cke_source.cke_editable_inline { 368 - border: 1px solid transparent; 369 - border-radius: 0; 370 - box-shadow: none; 371 - margin-top: -1px; 372 - margin-left: -1px; 373 - 374 - .form-control-focus(); 375 -} 376 - 377 -.cke_contents.fake { 378 - /* We need this to have the box shadow visible when the source area is focused. */ 379 - overflow: visible; 380 -} 381 - 382 -#xwikicontent + .cke_contents > textarea.cke_source.cke_editable_inline { 383 - /* Don't take the padding and the margin into account when computing the 100% width. */ 384 - box-sizing: content-box; 385 - /* Make sure the Source area has the same width as the WYSIWYG area. */ 386 - margin-left: -@grid-gutter-width / 2 - 1px; 387 - margin-right: -@grid-gutter-width / 2 - 1px; 388 -} 389 - 390 -/** 391 - * Full-screen styles for the in-line editor 392 - */ 393 -body[data-maximized="true"] { 394 - overflow: hidden; 395 - 396 - .cke_maximize_backdrop, 397 - .cke_toolBar_active, 398 - .cke_editable_active, 399 - .cke_actionBar_active { 400 - position: fixed !important; 401 - right: 0 !important; 402 - left: 0 !important; 403 - } 404 - 405 - /* 406 - * The tool bar 407 - */ 408 - .cke_toolBar_active { 409 - /* We have to use !important in order to overwrite the in-line styles. */ 410 - display: block !important; 411 - top: 0 !important; 412 - } 413 - 414 - /* 415 - * The editing area 416 - */ 417 - .cke_maximize_backdrop, 418 - .cke_editable_active { 419 - background-color: @xwiki-page-content-bg; 420 - } 421 - .cke_editable_active { 422 - box-sizing: border-box !important; 423 - margin: 0 !important; 424 - overflow-y: auto !important; 425 - z-index: 9995; 426 - 427 - &:focus { 428 - /* Remove the focus border. */ 429 - border-color: transparent !important; 430 - box-shadow: none !important; 431 - } 432 - } 433 - .cke_maximize_backdrop { 434 - top: 0; 435 - bottom: 0; 436 - z-index: 99; 437 - } 438 - 439 - /* 440 - * The action buttons 441 - */ 442 - .cke_actionBar_active { 443 - background-color: @xwiki-background-secondary-color; 444 - border: 1px solid @xwiki-border-color; 445 - bottom: 0; 446 - /* Reduce a bit the padding. */ 447 - padding: .5em; 448 - z-index: 9995; 449 - } 450 -} - Content Type
-
... ... @@ -1,1 +1,1 @@ 1 - LESS1 +CSS - Name
-
... ... @@ -1,0 +1,1 @@ 1 +CKEditor Skin Fix - Parse content
-
... ... @@ -1,1 +1,1 @@ 1 - No1 +Yes
- XWiki.UIExtensionClass[0]
-
- Extension ID
-
... ... @@ -1,1 +1,1 @@ 1 -org.xwiki.platform.requirejs.module. xwiki-ckeditor1 +org.xwiki.platform.requirejs.module.ckeditor
- XWiki.UIExtensionClass[1]
-
- Cached
-
... ... @@ -1,1 +1,0 @@ 1 -No - Asynchronous rendering
-
... ... @@ -1,1 +1,0 @@ 1 -No - Extension Point ID
-
... ... @@ -1,1 +1,0 @@ 1 -org.xwiki.platform.requirejs.module - Extension ID
-
... ... @@ -1,1 +1,0 @@ 1 -org.xwiki.platform.requirejs.module.fusejs - Extension Parameters
-
... ... @@ -1,2 +1,0 @@ 1 -id=fuse 2 -path=$services.webjars.url('org.webjars.npm:fuse.js', 'dist/fuse.basic.min.js') - Extension Scope
-
... ... @@ -1,1 +1,0 @@ 1 -wiki
- XWiki.UIExtensionClass[2]
-
- Cached
-
... ... @@ -1,1 +1,0 @@ 1 -No - Asynchronous rendering
-
... ... @@ -1,1 +1,0 @@ 1 -No - Extension Point ID
-
... ... @@ -1,1 +1,0 @@ 1 -org.xwiki.platform.requirejs.module - Extension ID
-
... ... @@ -1,1 +1,0 @@ 1 -org.xwiki.platform.requirejs.module.bootstrap3-typeahead - Extension Parameters
-
... ... @@ -1,2 +1,0 @@ 1 -id=bootstrap3-typeahead 2 -path=$services.webjars.url('org.webjars.npm:bootstrap-3-typeahead', 'bootstrap3-typeahead.min') - Extension Scope
-
... ... @@ -1,1 +1,0 @@ 1 -wiki
- XWiki.UIExtensionClass[3]
-
- Cached
-
... ... @@ -1,1 +1,0 @@ 1 -No - Asynchronous rendering
-
... ... @@ -1,1 +1,0 @@ 1 -No - Extension Point ID
-
... ... @@ -1,1 +1,0 @@ 1 -org.xwiki.platform.requirejs.module - Extension ID
-
... ... @@ -1,1 +1,0 @@ 1 -org.xwiki.platform.requirejs.module.fast-diff - Extension Parameters
-
... ... @@ -1,2 +1,0 @@ 1 -id=fast-diff 2 -path=$services.webjars.url('org.webjars.npm:fast-diff', 'diff') - Extension Scope
-
... ... @@ -1,1 +1,0 @@ 1 -wiki
- XWiki.UIExtensionClass[4]
-
- Cached
-
... ... @@ -1,1 +1,0 @@ 1 -No - Asynchronous rendering
-
... ... @@ -1,1 +1,0 @@ 1 -No - Extension Point ID
-
... ... @@ -1,1 +1,0 @@ 1 -org.xwiki.platform.requirejs.module - Extension ID
-
... ... @@ -1,1 +1,0 @@ 1 -org.xwiki.platform.requirejs.module.ckeditor - Extension Parameters
-
... ... @@ -1,3 +1,0 @@ 1 -id=ckeditor 2 -path=$services.webjars.url('org.xwiki.platform:xwiki-platform-ckeditor-webjar', 'ckeditor') 3 -exports=CKEDITOR - Extension Scope
-
... ... @@ -1,1 +1,0 @@ 1 -wiki
- XWiki.UIExtensionClass[5]
-
- Cached
-
... ... @@ -1,1 +1,0 @@ 1 -No - Asynchronous rendering
-
... ... @@ -1,1 +1,0 @@ 1 -No - Extension Point ID
-
... ... @@ -1,1 +1,0 @@ 1 -org.xwiki.platform.requirejs.module - Extension ID
-
... ... @@ -1,1 +1,0 @@ 1 -org.xwiki.platform.requirejs.module.xwiki-ckeditor-plugins - Extension Parameters
-
... ... @@ -1,4 +1,0 @@ 1 -id=xwiki-ckeditor-plugins 2 -path=$services.webjars.url('org.xwiki.platform:xwiki-platform-ckeditor-plugins', 'webjar.bundle.min') 3 -bundles=resource, resourcePicker, entityResourcePicker, entityResourceSuggester, entityResourceDisplayer, modal, l10n, macroWizard, imageWizard 4 -deps=jquery, ckeditor - Extension Scope
-
... ... @@ -1,1 +1,0 @@ 1 -wiki
- XWiki.JavaScriptExtension[1]
-
- Caching policy
-
... ... @@ -1,0 +1,1 @@ 1 +long - Code
-
... ... @@ -1,0 +1,165 @@ 1 +// Fix CKEDITOR.tools.escapeCss() for browsers that don't support CSS.escape() 2 +// See https://github.com/ckeditor/ckeditor4/issues/681 3 +require(['jquery', 'ckeditor'], function($, ckeditor) { 4 + // Test if CKEDITOR.tools.escapeCss() works as expected. 5 + if (ckeditor.tools.escapeCss('.') === '.') { 6 + // Special CSS characters were not escaped so we need to fix this. 7 + // Use jQuery's escapeSelector() if available (only since jQuery 3.0), otherwise use some naive implementation. 8 + ckeditor.tools.escapeCss = $.escapeSelector || function(selector) { 9 + if (typeof selector === 'string') { 10 + // Simple implementation. 11 + // See https://learn.jquery.com/using-jquery-core/faq/how-do-i-select-an-element-by-an-id-that-has-characters-used-in-css-notation/ 12 + return selector.replace(/(:|\.|\[|\]|,|=|@)/g, '\\$1'); 13 + } else { 14 + return selector; 15 + } 16 + }; 17 + } 18 +}); 19 + 20 +// Fix the path to the arrow icon that indicates the presence of a sub-menu in the context menu. 21 +if (CKEDITOR_BASEPATH.indexOf('?') >= 0) { 22 + // The WebJar resource path was specified in the query string before 7.1M1 which prevented the browser from resolving 23 + // relative paths. See XWIKI-10880 (A CSS file inside a webjar cannot use a resource from that webjar). 24 + require(['ckeditor'], function(ckeditor) { 25 + ckeditor.on('instanceReady', function(event) { 26 + if (event.editor.contextMenu) { 27 + event.editor.contextMenu._.panelDefinition.css.push( 28 + '.cke_menuarrow {' + 29 + 'background-image: url("' + CKEDITOR_BASEPATH + 'skins/moono-lisa/images/arrow.png") !important;' + 30 + '}' 31 + ); 32 + } 33 + }); 34 + }); 35 +} 36 + 37 +// Polyfill for the xwiki:actions:beforeSave and xwiki:actions:beforePreview events (available since 7.4.1) 38 +// We have to use Prototype.js because it is loaded before jQuery and we need to register our save and preview listeners 39 +// before the actionButtons.js does it, as otherwise the CKEditor doesn't get the chance to update the text area before 40 +// the form is submitted. 41 +(function() { 42 + var submitActions = ['save', 'preview']; 43 + var beforeSubmitWasTriggered = false; 44 + var onBeforeSubmit = function(event) { 45 + beforeSubmitWasTriggered = true; 46 + if (!(event.memo || {}).polyfill) { 47 + removeListeners(); 48 + } 49 + }; 50 + var onSubmit = function(event) { 51 + if (!beforeSubmitWasTriggered && jQuery) { 52 + // Our CKEditor plugins use jQuery to listen to events. 53 + var parts = event.eventName.split(':'); 54 + var data = event.memo || {}; 55 + data.polyfill = true; 56 + jQuery(document).triggerHandler(getBeforeEventName(parts[parts.length - 1]), data); 57 + } 58 + beforeSubmitWasTriggered = false; 59 + }; 60 + var getBeforeEventName = function(action) { 61 + return 'xwiki:actions:before' + action.substr(0, 1).toUpperCase() + action.substr(1); 62 + }; 63 + var removeListeners = function() { 64 + submitActions.forEach(function(action) { 65 + document.stopObserving(getBeforeEventName(action), onBeforeSubmit); 66 + document.stopObserving('xwiki:actions:' + action, onSubmit); 67 + }); 68 + }; 69 + if (typeof document.observe == 'function') { 70 + submitActions.forEach(function(action) { 71 + document.observe(getBeforeEventName(action), onBeforeSubmit); 72 + document.observe('xwiki:actions:' + action, onSubmit); 73 + }); 74 + } 75 +})(); 76 + 77 +// Make sure the "Back To Edit" button from the Preview mode works as expected on XWiki versions older than 8.2 (where 78 +// CKEditor is not the default editor). 79 +require(['jquery'], function($) { 80 + if (/&sheet=CKEditor.EditSheet\b/.test(window.location.href)) { 81 + // Make sure the CKEditor.EditSheet is preserved when coming back from Preview mode. 82 + $('form#inline').find('input[name="xcontinue"]').val(function(index, oldValue) { 83 + return oldValue + '&sheet=CKEditor.EditSheet'; 84 + }); 85 + } 86 +}); 87 + 88 +// Polyfill for entityReference.js 89 +require(['jquery'], function($) { 90 + if (typeof XWiki.EntityType.byName !== 'function') { 91 + // Before 6.4.1 92 + var entityTypeByName = { 93 + wiki: XWiki.EntityType.WIKI, 94 + space: XWiki.EntityType.SPACE, 95 + document: XWiki.EntityType.DOCUMENT, 96 + attachment: XWiki.EntityType.ATTACHMENT 97 + }; 98 + XWiki.EntityType.byName = function(name) { 99 + return entityTypeByName[name]; 100 + }; 101 + } 102 + 103 + if (typeof XWiki.EntityType.getName !== 'function') { 104 + // Before 6.4.1 105 + var entityTypes = ['wiki', 'space', 'document', 'attachment']; 106 + XWiki.EntityType.getName = function(entityType) { 107 + return entityTypes[entityType]; 108 + } 109 + } 110 + 111 + if (typeof XWiki.EntityReference.prototype.getReversedReferenceChain !== 'function') { 112 + // Before 7.2M2 113 + XWiki.EntityReference.prototype.getReversedReferenceChain = function() { 114 + return this._extractComponents().reverse(); 115 + }; 116 + } 117 + 118 + if (typeof XWiki.currentDocument.getDocumentReference !== 'function') { 119 + // Before 7.2M3 120 + // Take the current document full name. 121 + var currentDocumentReference = $('meta[name="document"]').attr('content'); 122 + // Resolve the local reference. 123 + currentDocumentReference = XWiki.Model.resolve(currentDocumentReference, XWiki.EntityType.DOCUMENT); 124 + // Add the wiki component. 125 + currentDocumentReference.getReversedReferenceChain()[0].parent = new XWiki.WikiReference(XWiki.currentWiki); 126 + XWiki.currentDocument.getDocumentReference = function() { 127 + return currentDocumentReference; 128 + }; 129 + } 130 + 131 + var reference = XWiki.Model.resolve('S', XWiki.EntityType.SPACE, new XWiki.WikiReference('W')); 132 + if (!reference.parent) { 133 + // The resolve method did not support a default value provider before 7.2M1. 134 + var oldResolve = XWiki.Model.resolve; 135 + XWiki.Model.resolve = function(representation, entityType, defaultValueProvider) { 136 + var reference = oldResolve.apply(this, arguments); 137 + if (reference && defaultValueProvider && typeof defaultValueProvider.extractReference === 'function') { 138 + // The given default value provider is an entity reference (normally a document reference). 139 + var root = reference.getReversedReferenceChain()[0]; 140 + // We cover the document and attachment references mainly, 141 + var defaultRoot = defaultValueProvider.extractReference(root.type) || {parent: defaultValueProvider}; 142 + // Nested spaces were introduced in 7.2M1 so we can safely assume that the given default value provider has only 143 + // one space reference component. 144 + root.parent = defaultRoot.parent; 145 + } 146 + return reference; 147 + }; 148 + } 149 +}); 150 + 151 +// Fix the layout to be consistent with the Wiki edit mode (tested with the Flamingo Skin). 152 +require(['jquery'], function($) { 153 + var ckeEditMeta = $('.cke-editMeta'); 154 + if (ckeEditMeta.length != 1) { 155 + // Fix the layout only when the CKEditor.EditSheet is applied. 156 + return; 157 + } 158 + // Hide the page title because the edit form has an input field to edit the title. This is consistent with the Wiki 159 + // edit mode. Remove the 'editMeta' id because the edit sheet adds an element with the same id. 160 + // NOTE: In order to rely on Chrome's Back-Forward cache we must not remove or move form elements. We can only hide. 161 + $('#document-title').parent('#editMeta').removeAttr('id').parent('.row').hide(); 162 + // Move the content menu before the editMeta element so that they are displayed on the same row. 163 + ckeEditMeta.attr('id', 'editMeta').addClass('col-md-pull-5') 164 + .before($('#contentmenu').parent('.col-md-5').addClass('col-md-push-7')); 165 +}); - Name
-
... ... @@ -1,0 +1,1 @@ 1 +Various fixes and polyfills - Parse content
-
... ... @@ -1,0 +1,1 @@ 1 +Yes - Use this extension
-
... ... @@ -1,0 +1,1 @@ 1 +onDemand
- XWiki.StyleSheetExtension[1]
-
- Caching policy
-
... ... @@ -1,0 +1,1 @@ 1 +long - Code
-
... ... @@ -1,0 +1,97 @@ 1 +/** 2 + * Source mode 3 + */ 4 + 5 +.cke_contents > textarea.cke_source { 6 + box-sizing: border-box; 7 + color: @text-color; 8 + font-family: @font-family-monospace; 9 + font-size: inherit; 10 + /* Same padding as on the page content. */ 11 + padding: @grid-gutter-width / 2; 12 +} 13 + 14 +.cke_contents > textarea.cke_source.cke_editable_inline { 15 + border: 1px solid transparent; 16 + border-radius: 0; 17 + box-shadow: none; 18 + margin-top: -1px; 19 + margin-left: -1px; 20 + 21 + .form-control-focus(); 22 +} 23 + 24 +.cke_contents.fake { 25 + /* We need this to have the box shadow visible when the source area is focused. */ 26 + overflow: visible; 27 +} 28 + 29 +#xwikicontent + .cke_contents > textarea.cke_source.cke_editable_inline { 30 + /* Don't take the padding and the margin into account when computing the 100% width. */ 31 + box-sizing: content-box; 32 + /* Make sure the Source area has the same width as the WYSIWYG area. */ 33 + margin-left: -@grid-gutter-width / 2 - 1px; 34 + margin-right: -@grid-gutter-width / 2 - 1px; 35 +} 36 + 37 +/** 38 + * Full-screen styles for the in-line editor 39 + */ 40 +body[data-maximized="true"] { 41 + overflow: hidden; 42 + 43 + .cke_maximize_backdrop, 44 + .cke_toolBar_active, 45 + .cke_editable_active, 46 + .cke_actionBar_active { 47 + position: fixed !important; 48 + right: 0 !important; 49 + left: 0 !important; 50 + } 51 + 52 + /* 53 + * The tool bar 54 + */ 55 + .cke_toolBar_active { 56 + /* We have to use !important in order to overwrite the in-line styles. */ 57 + display: block !important; 58 + top: 0 !important; 59 + } 60 + 61 + /* 62 + * The editing area 63 + */ 64 + .cke_maximize_backdrop, 65 + .cke_editable_active { 66 + background-color: @xwiki-page-content-bg; 67 + } 68 + .cke_editable_active { 69 + box-sizing: border-box !important; 70 + margin: 0 !important; 71 + overflow-y: auto !important; 72 + z-index: 9995; 73 + 74 + &:focus { 75 + /* Remove the focus border. */ 76 + border-color: transparent !important; 77 + box-shadow: none !important; 78 + } 79 + } 80 + .cke_maximize_backdrop { 81 + top: 0; 82 + bottom: 0; 83 + z-index: 99; 84 + } 85 + 86 + /* 87 + * The action buttons 88 + */ 89 + .cke_actionBar_active { 90 + background-color: @xwiki-background-secondary-color; 91 + border: 1px solid @xwiki-border-color; 92 + bottom: 0; 93 + /* Reduce a bit the padding. */ 94 + padding: .5em; 95 + z-index: 9995; 96 + } 97 +} - Content Type
-
... ... @@ -1,0 +1,1 @@ 1 +LESS - Name
-
... ... @@ -1,0 +1,1 @@ 1 +LESS - Parse content
-
... ... @@ -1,0 +1,1 @@ 1 +No - Use this extension
-
... ... @@ -1,0 +1,1 @@ 1 +onDemand