Changes for page EditSheet
Last modified by superadmin on 2025/02/27 10:46
From version 7.1
edited by Thomas Coelho (local)
on 2023/07/26 11:23
on 2023/07/26 11:23
Change comment:
Install extension [org.xwiki.platform:xwiki-platform-ckeditor-ui/15.5]
To version 3.1
edited by Thomas Coelho (local)
on 2022/08/02 15:11
on 2022/08/02 15:11
Change comment:
Install extension [org.xwiki.platform:xwiki-platform-ckeditor-ui/14.6]
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,37 @@ 1 -XWiki.locale = document.documentElement.getAttribute('lang') || ''; 2 - 1 +/* 2 +#set ($ckeditorPath = $services.webjars.url('org.xwiki.platform:xwiki-platform-ckeditor-webjar', 'ckeditor')) 3 +#set ($ckeditorBasePath = $stringtool.removeEnd($stringtool.removeEnd($ckeditorPath, '.js'), 'ckeditor')) 4 +#set ($resourcePickerBundlePath = "${ckeditorBasePath}plugins/xwiki-resource/resourcePicker.bundle.min") 5 +#set ($macroWizardBundlePath = "${ckeditorBasePath}plugins/xwiki-macro/macroWizard.bundle.min") 6 +#set ($imageWizardBundlePath = "${ckeditorBasePath}plugins/xwiki-image/imageWizard.bundle.min") 7 +#set ($modalPath = "${ckeditorBasePath}plugins/xwiki-dialog/modal.min") 8 +#set ($l10nPath = "${ckeditorBasePath}plugins/xwiki-localization/l10n.min") 9 +*/ 3 3 require.config({ 11 + paths: { 12 + ckeditor: '$!ckeditorPath', 13 + resourcePickerBundle: '$!resourcePickerBundlePath', 14 + modal: '$!modalPath', 15 + l10n: '$!l10nPath', 16 + macroWizard: '$!macroWizardBundlePath', 17 + imageWizard: '$!imageWizardBundlePath', 18 + // This is used by the resource suggest picker on the link modal. 19 + 'bootstrap3-typeahead': $jsontool.serialize($services.webjars.url('org.webjars.npm:bootstrap-3-typeahead', 20 + 'bootstrap3-typeahead.min')), 21 + // This is used to preserve the selection when switching between WYSIWYG and Source modes. 22 + 'fast-diff': $jsontool.serialize($services.webjars.url('org.webjars.npm:fast-diff', 'diff')) 23 + }, 24 + bundles: { 25 + 'resourcePickerBundle': ['resource', 'resourcePicker', 'entityResourcePicker', 'entityResourceSuggester', 26 + 'entityResourceDisplayer'] 27 + }, 28 + shim: { 29 + ckeditor: { 30 + exports: 'CKEDITOR', 31 + // This includes dependencies of the plugins bundled with the CKEditor code. 32 + deps: ['jquery', 'resource', 'resourcePicker', 'macroWizard', 'imageWizard'] 33 + } 34 + }, 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))42 + encodeURIComponent(document.documentElement.getAttribute('lang') || '')) 12 12 } 13 13 } 14 14 }); 15 15 47 +window.CKEDITOR_BASEPATH = "$!ckeditorBasePath"; 48 + 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)) 56 + // Configures the path to the tree widget module and its dependencies which are used by the page and attachment 57 + // pickers on the link, image and macro dialogs to select pages and attachments. 58 + "$!services.webjars.url('org.xwiki.platform:xwiki-platform-tree-webjar', 'require-config.min.js', {'evaluate': true})" 28 28 ], function($, ckeditor, xwikiMeta) { 60 + var deferred = $.Deferred(); 61 + var currentLocale = $('html').attr('lang') || ''; 62 + 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,71 + language: currentLocale, 38 38 form_token: xwikiMeta.form_token, 39 39 initiator: initiator 40 40 })); ... ... @@ -42,21 +42,15 @@ 42 42 43 43 // Extend the default CKEditor configuration with settings that depend on the source document. 44 44 var getConfig = function(element) { 45 - var sourceSyntax = $(element).attr('data-syntax'); 46 46 var sourceDocument = XWiki.currentDocument; 47 - sourceDocument.syntax = XWiki.docsyntax; 48 - var sourceDocumentReference = XWiki.Model.resolve($(element).attr('data-sourceDocumentReference'), 49 - XWiki.EntityType.DOCUMENT, XWiki.currentDocument.documentReference); 50 - if (!XWiki.currentDocument.documentReference.equals(sourceDocumentReference)) { 51 - sourceDocument = new XWiki.Document(sourceDocumentReference); 52 - // We assume the syntax of the source document is the same as the syntax of the edited content. 53 - sourceDocument.syntax = sourceSyntax; 80 + var sourceDocumentReference = $(element).attr('data-sourceDocumentReference'); 81 + if (sourceDocumentReference) { 82 + sourceDocument = new XWiki.Document(XWiki.Model.resolve(sourceDocumentReference, XWiki.EntityType.DOCUMENT)); 54 54 } 84 + sourceDocument.syntax = $(element).attr('data-sourceDocumentSyntax'); 55 55 56 - var uploadDisabled = element.hasAttribute('data-upload-disabled'); 57 - 58 58 var config = { 59 - filebrowserUploadUrl: uploadDisabled ? '' :getUploadURL(sourceDocument, 'filebrowser'),87 + filebrowserUploadUrl: getUploadURL(sourceDocument, 'filebrowser'), 60 60 height: $(element).height(), 61 61 mentions: [ 62 62 { ... ... @@ -65,7 +65,7 @@ 65 65 feed: sourceDocument.getURL('get', $.param({ 66 66 sheet: 'CKEditor.LinkSuggestions', 67 67 outputSyntax: 'plain', 68 - language: XWiki.locale96 + language: currentLocale 69 69 // Prevent the curly brackets from being URL encoded because they mark a placeholder that will be replaced 70 70 // with the text typed by the user (and CKEditor takes care of URL encoding it). 71 71 }) + '&input={encodedQuery}'), ... ... @@ -81,19 +81,14 @@ 81 81 '</div>', 82 82 '<div class="ckeditor-autocomplete-item-hint">{hint}</div>', 83 83 '</li>'].join(''), 84 - outputTemplate: '<a href="{url}" data-reference="{typed}|-|{type}|-|{reference}">{label}</a>', 85 - followingSpace: true, 112 + outputTemplate: '<a href="{url}" data-reference="{typed}|-|{type}|-|{reference}">{label}</a><span> </span>', 86 86 marker: '[', 87 87 minChars: 0, 88 88 itemsLimit: 6 89 89 } 90 90 ], 91 - // Used to resolve and serialize relative references. Also used to make HTTP requests with the right context. 92 92 sourceDocument: sourceDocument, 93 - // The syntax of the edited content is not always the same as the syntax of the source document (which applies to 94 - // the source document content, but we might be editing something else, like an object property). 95 - sourceSyntax: sourceSyntax, 96 - uploadUrl: uploadDisabled ? '' : getUploadURL(sourceDocument, 'filetools'), 119 + uploadUrl: getUploadURL(sourceDocument, 'filetools'), 97 97 'xwiki-link': { 98 98 // We use the source document to compute the link label generator URL because we want the link references to be 99 99 // resolved relative to the edited document (as they were inserted). ... ... @@ -100,7 +100,7 @@ 100 100 labelGenerator: sourceDocument.getURL('get', $.param({ 101 101 sheet: 'CKEditor.LinkLabelGenerator', 102 102 outputSyntax: 'plain', 103 - language: XWiki.locale126 + language: currentLocale 104 104 })) 105 105 } 106 106 }; ... ... @@ -157,5 +157,18 @@ 157 157 object[key] = newValue; 158 158 }; 159 159 160 - return $.Deferred().resolve(ckeditor).promise(); 183 + require([ 184 + // We cannot add these modules to the list of dependencies because they need the tree module to be configured first. 185 + 'entityResourcePicker', 'entityResourceSuggester', 'entityResourceDisplayer', 186 + // Load the translations for our custom CKEditor plugins. We didn't add this as a dependency to the xwiki-ckeditor 187 + // module because some of our plugins load their dependencies with RequireJS and thus they are loaded with a small 188 + // delay. The plugin needs to be defined before calling CKEDITOR.plugins.setLang(). 189 + new XWiki.Document('Translations', 'CKEditor').getURL('jsx', $.param({ 190 + language: currentLocale 191 + })) 192 + ], function() { 193 + deferred.resolve(ckeditor); 194 + }); 195 + 196 + return deferred.promise(); 161 161 }); - 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 ... ... @@ -241,49 +241,20 @@ 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 } ... ... @@ -298,133 +298,10 @@ 298 298 .ckeditor-autocomplete-item-icon-wrapper img[src=""] { 299 299 display: none; 300 300 } 301 -.ckeditor-autocomplete-item-label { 302 - /* Push the shortcut to the right edge of the item. */ 303 - flex-grow: 1; 304 -} 305 -.ckeditor-autocomplete-item-shortcut:not(:empty) { 306 - background-color: @xwiki-border-color; 307 - border-radius: @border-radius-base; 308 - padding: 2px 5px; 309 - margin-left: .5em; 310 -} 311 -.ckeditor-autocomplete-item-shortcut, 312 -.ckeditor-autocomplete-item-badge, 313 313 .ckeditor-autocomplete-item-hint { 314 - color: @text-muted;318 + color: $theme.textSecondaryColor; 315 315 font-size: smaller; 316 316 } 317 -.ckeditor-autocomplete-item-badge { 318 - background-color: @xwiki-border-color; 319 - font-weight: normal; 320 -} 321 -.ckeditor-autocomplete-item-hint { 322 - /* Limit to 3 lines of text (based on line height). */ 323 - max-height: calc(3 * 20em / 14); 324 - overflow: hidden; 325 - /* Put the ellipsis at the end of the last line when the text is cut. */ 326 - display: -webkit-box; 327 - -webkit-box-orient: vertical; 328 - -webkit-line-clamp: 3; 329 -} 330 330 .ckeditor-autocomplete-item-hint:empty { 331 331 margin-top: 0; 332 332 } 333 - 334 -/** 335 - * Source mode 336 - */ 337 - 338 -.cke_contents > textarea.cke_source { 339 - box-sizing: border-box; 340 - color: @text-color; 341 - font-family: @font-family-monospace; 342 - font-size: inherit; 343 - /* Same padding as on the page content. */ 344 - padding: @grid-gutter-width / 2; 345 -} 346 - 347 -.cke_contents > textarea.cke_source.cke_editable_inline { 348 - border: 1px solid transparent; 349 - border-radius: 0; 350 - box-shadow: none; 351 - margin-top: -1px; 352 - margin-left: -1px; 353 - 354 - .form-control-focus(); 355 -} 356 - 357 -.cke_contents.fake { 358 - /* We need this to have the box shadow visible when the source area is focused. */ 359 - overflow: visible; 360 -} 361 - 362 -#xwikicontent + .cke_contents > textarea.cke_source.cke_editable_inline { 363 - /* Don't take the padding and the margin into account when computing the 100% width. */ 364 - box-sizing: content-box; 365 - /* Make sure the Source area has the same width as the WYSIWYG area. */ 366 - margin-left: -@grid-gutter-width / 2 - 1px; 367 - margin-right: -@grid-gutter-width / 2 - 1px; 368 -} 369 - 370 -/** 371 - * Full-screen styles for the in-line editor 372 - */ 373 -body[data-maximized="true"] { 374 - overflow: hidden; 375 - 376 - .cke_maximize_backdrop, 377 - .cke_toolBar_active, 378 - .cke_editable_active, 379 - .cke_actionBar_active { 380 - position: fixed !important; 381 - right: 0 !important; 382 - left: 0 !important; 383 - } 384 - 385 - /* 386 - * The tool bar 387 - */ 388 - .cke_toolBar_active { 389 - /* We have to use !important in order to overwrite the in-line styles. */ 390 - display: block !important; 391 - top: 0 !important; 392 - } 393 - 394 - /* 395 - * The editing area 396 - */ 397 - .cke_maximize_backdrop, 398 - .cke_editable_active { 399 - background-color: @xwiki-page-content-bg; 400 - } 401 - .cke_editable_active { 402 - box-sizing: border-box !important; 403 - margin: 0 !important; 404 - overflow-y: auto !important; 405 - z-index: 9995; 406 - 407 - &:focus { 408 - /* Remove the focus border. */ 409 - border-color: transparent !important; 410 - box-shadow: none !important; 411 - } 412 - } 413 - .cke_maximize_backdrop { 414 - top: 0; 415 - bottom: 0; 416 - z-index: 99; 417 - } 418 - 419 - /* 420 - * The action buttons 421 - */ 422 - .cke_actionBar_active { 423 - background-color: @xwiki-background-secondary-color; 424 - border: 1px solid @xwiki-border-color; 425 - bottom: 0; 426 - /* Reduce a bit the padding. */ 427 - padding: .5em; 428 - z-index: 9995; 429 - } 430 -} - 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