Changes for page EditSheet
Last modified by superadmin on 2025/02/27 10:46
From version 11.1
edited by Thomas Coelho (local)
on 2025/02/13 15:10
on 2025/02/13 15:10
Change comment:
Install extension [org.xwiki.platform:xwiki-platform-ckeditor-ui/17.0.0]
To version 6.1
edited by Thomas Coelho
on 2023/02/27 12:06
on 2023/02/27 12:06
Change comment:
Install extension [org.xwiki.platform:xwiki-platform-ckeditor-ui/15.1]
Summary
-
Page properties (2 modified, 0 added, 0 removed)
-
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
- Page properties
-
- Author
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki. coelho1 +XWiki.thw - Content
-
... ... @@ -1,0 +1,38 @@ 1 +{{include reference="CKEditor.VelocityMacros"/}} 2 + 3 +{{velocity}} 4 +#if ($doc.fullName == 'CKEditor.EditSheet') 5 + This is a sheet for editing the document content using [[CKEditor>>http://ckeditor.com/]]. 6 +#else 7 + {{html clean="false"}} 8 + ## Include the auto-save styles. 9 + #set ($discard = $xwiki.ssfx.use('js/xwiki/editors/autosave.css', true)) 10 + #if ("$!request.section" != '') 11 + <div class="hidden"> 12 + <input type="hidden" name="section" value="$!escapetool.xml($request.section)"/> 13 + </div> 14 + #end 15 + <div class="row"> 16 + <div class="cke-editMeta col-xs-12 col-md-7"> 17 + ## Add support for editing the page title (which is not available by default in Inline Form edit mode). 18 + #set ($editor = 'wiki') 19 + #template('editmeta.vm') 20 + #set ($editor = 'inline') 21 + </div> 22 + </div> 23 + ## The xwikieditcontent id is needed for the auto-save feature. 24 + <div id="xwikieditcontent" data-autosave="true"> 25 + #set ($parameters = { 26 + 'content': $tdoc.content, 27 + 'attributes': { 28 + 'id': 'content', 29 + 'name': 'content', 30 + 'rows': 25, 31 + 'cols': 80 32 + } 33 + }) 34 + #ckeditor($parameters) 35 + </div> 36 + {{/html}} 37 +#end 38 +{{/velocity}}
- 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 })); ... ... @@ -54,12 +54,40 @@ 54 54 } 55 55 56 56 var uploadDisabled = element.hasAttribute('data-upload-disabled'); 57 - var startupFocus = element.hasAttribute('data-startup-focus'); 58 58 59 59 var config = { 60 60 filebrowserUploadUrl: uploadDisabled ? '' : getUploadURL(sourceDocument, 'filebrowser'), 61 - startupFocus, 62 62 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 + ], 63 63 // Used to resolve and serialize relative references. Also used to make HTTP requests with the right context. 64 64 sourceDocument: sourceDocument, 65 65 // The syntax of the edited content is not always the same as the syntax of the source document (which applies to ... ... @@ -72,7 +72,7 @@ 72 72 labelGenerator: sourceDocument.getURL('get', $.param({ 73 73 sheet: 'CKEditor.LinkLabelGenerator', 74 74 outputSyntax: 'plain', 75 - language: XWiki.locale142 + language: currentLocale 76 76 })) 77 77 } 78 78 }; ... ... @@ -129,49 +129,18 @@ 129 129 object[key] = newValue; 130 130 }; 131 131 132 - // See XWIKI-21351: Macros using RequireJS are not properly displayed by the standalone WYSIWYG editor even when 133 - // JavaScript is enabled. 134 - // 135 - // For each CKEditor instance that uses a separate DOM document for the edited content (i.e. classical iframe-based 136 - // editor) we overwrite the appendChild and insertBefore functions of the initial HEAD element in order to make sure 137 - // that RequireJS appends the script tags to the current HEAD element (because the HEAD element is overwritten each 138 - // time the edited content is reloaded, like when inserting a macro or switching between Source and WYSIWYG modes). 139 - // 140 - // We have to overwrite both appendChild and insertBefore because depending on the presence of the BASE element 141 - // RequireJS uses one or the other. 142 - ckeditor.on('instanceReady', ({editor}) => { 143 - if (editor.document.$ !== document) { 144 - // This editor instance is using a separate DOM document for editing which means it's a standalone editor. 145 - const initialHead = editor.document.$.head; 146 - const originalAppendChild = initialHead.appendChild; 147 - initialHead.appendChild = function() { 148 - const currentHead = editor.document.$.head; 149 - if (currentHead !== initialHead) { 150 - // The edited content has been reloaded. Append to the current HEAD. 151 - return currentHead.appendChild.apply(currentHead, arguments); 152 - } else { 153 - // Still using the initial HEAD so preserve the default behavior. 154 - originalAppendChild.apply(initialHead, arguments); 155 - } 156 - }; 157 - const originalInsertBefore = initialHead.insertBefore; 158 - initialHead.insertBefore = function(newChild, existingChild) { 159 - const currentHead = editor.document.$.head; 160 - if (currentHead !== initialHead) { 161 - // The edited content has been reloaded. Normally the given existingChild should be a child of the initial 162 - // HEAD element (not the current one), but better check to be sure. 163 - if (existingChild.parentNode === currentHead) { 164 - return currentHead.insertBefore(newChild, existingChild); 165 - } else { 166 - return currentHead.appendChild.apply(newChild); 167 - } 168 - } else { 169 - // Still using the initial HEAD so preserve the default behavior. 170 - return originalInsertBefore.apply(initialHead, arguments); 171 - } 172 - }; 173 - } 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); 174 174 }); 175 175 176 - return $.Deferred().resolve(ckeditor).promise();212 + return deferred.promise(); 177 177 }); - 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 ... ... @@ -204,6 +204,8 @@ 204 204 a.cke_button.cke_button__xwiki-macro-edit > span.cke_button_icon.cke_button__xwiki-macro-edit_icon, 205 205 a.cke_button.cke_button__xwiki-link-open > span.cke_button_icon.cke_button__xwiki-link-open_icon, 206 206 a.cke_button.cke_button__insert > span.cke_button_icon.cke_button__insert_icon { 252 + /* This is needed for XWiki versions older than 7.1M1 where we overwrite the icons path (see above). */ 253 + background-image: none !important; 207 207 font-family: 'Glyphicons Halflings'; 208 208 position: relative; 209 209 top: 1px; ... ... @@ -234,232 +234,43 @@ 234 234 */ 235 235 ul.cke_autocomplete_panel { 236 236 border: 1px solid rgba(0, 0, 0, 0.15); 237 - border-radius: @border-radius-base;284 + border-radius: 4px; 238 238 box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); 239 239 font: inherit; 240 240 padding: 5px 0; 241 241 width: auto; 242 - max-width: 324px;289 + max-width: 100%; 243 243 min-width: 200px; 244 244 } 245 -.cke_autocomplete_panel > li.ckeditor-autocomplete-group, 246 246 .cke_autocomplete_panel > li.ckeditor-autocomplete-item { 247 - padding: 5px 20px;293 + padding: 3px 12px; 248 248 } 249 -.cke_autocomplete_panel > li.ckeditor-autocomplete-group { 250 - border-top: 1px solid @xwiki-border-color; 251 - color: @text-muted; 252 - font-size: smaller; 253 - margin-top: 9px; 254 - padding-top: 14px; 255 -} 256 -.cke_autocomplete_panel > li.ckeditor-autocomplete-group h6 { 257 - font-size: inherit; 258 - margin: 0; 259 -} 260 -.cke_autocomplete_panel > li.ckeditor-autocomplete-group:first-child { 261 - border-top: 0 none; 262 - margin-top: 0; 263 - padding-top: 5px; 264 -} 265 -.cke_autocomplete_panel > li.ckeditor-autocomplete-group:hover { 266 - background-color: transparent; 267 - cursor: inherit; 268 -} 269 -.ckeditor-autocomplete-group h6, 270 -.ckeditor-autocomplete-item-label, 271 -.ckeditor-autocomplete-item-shortcut { 272 - overflow: hidden; 273 - text-overflow: ellipsis; 295 +.cke_autocomplete_panel > li.ckeditor-autocomplete-item > div { 274 274 white-space: nowrap; 275 275 } 276 -.ckeditor-autocomplete-item-head { 277 - display: flex; 278 - align-items: center; 279 -} 280 280 .ckeditor-autocomplete-item-icon-wrapper { 281 281 display: inline-block; 282 282 height: 14px; 283 283 line-height: 14px; 284 - margin-right: . 5em;302 + margin-right: .3em; 285 285 text-align: center; 286 286 width: 14px; 287 287 } 288 288 .ckeditor-autocomplete-item-icon-wrapper img { 289 - border-radius: @border-radius-small;307 + border-radius: 3px; 290 290 max-height: 14px; 291 291 max-width: 14px; 292 292 vertical-align: text-top; 293 293 } 294 -.ckeditor-autocomplete-item-preview-wrapper { 295 - display: flex; 296 - align-items: center; 297 - justify-content: space-around; 298 - height: 64px; 299 - margin-right: .5em; 300 - text-align: center; 301 - vertical-align: middle; 302 - width: 64px; 303 -} 304 -.ckeditor-autocomplete-centered { 305 - justify-content: center; 306 -} 307 -.ckeditor-autocomplete-item-preview-wrapper img { 308 - border-radius: @border-radius-small; 309 - max-height: 64px; 310 - max-width: 64px; 311 - vertical-align: text-top; 312 -} 313 -/* The image still takes some space in all browsers even if there's no source specified. Let's make sure it's hidden. 312 +/* The image still takes some space in IE11 even if there's no source specified. Let's make sure it's hidden. 314 314 See CKEDITOR-389: Missing space in the suggestions that appear while using the autocomplete function on IE 11 */ 315 -.ckeditor-autocomplete-item-preview-wrapper img[src=""], 316 316 .ckeditor-autocomplete-item-icon-wrapper img[src=""] { 317 317 display: none; 318 318 } 319 -.ckeditor-autocomplete-item-label { 320 - /* Push the shortcut to the right edge of the item. */ 321 - flex-grow: 1; 322 -} 323 -.ckeditor-autocomplete-item-shortcut:not(:empty) { 324 - background-color: @xwiki-border-color; 325 - border-radius: @border-radius-base; 326 - padding: 2px 5px; 327 - margin-left: .5em; 328 -} 329 -.ckeditor-autocomplete-item-shortcut, 330 -.ckeditor-autocomplete-item-badge, 331 331 .ckeditor-autocomplete-item-hint { 332 - color: @text-muted;318 + color: $theme.textSecondaryColor; 333 333 font-size: smaller; 334 334 } 335 -.ckeditor-autocomplete-item-badge { 336 - background-color: @xwiki-border-color; 337 - font-weight: normal; 338 -} 339 -.ckeditor-autocomplete-item-hint { 340 - /* Limit to 3 lines of text (based on line height). */ 341 - max-height: calc(3 * 20em / 14); 342 - overflow: hidden; 343 - /* Put the ellipsis at the end of the last line when the text is cut. */ 344 - display: -webkit-box; 345 - -webkit-box-orient: vertical; 346 - -webkit-line-clamp: 3; 347 -} 348 348 .ckeditor-autocomplete-item-hint:empty { 349 349 margin-top: 0; 350 350 } 351 - 352 -/** 353 - * Source mode 354 - */ 355 - 356 -.cke_contents > textarea.cke_source { 357 - box-sizing: border-box; 358 - color: @text-color; 359 - font-family: @font-family-monospace; 360 - font-size: inherit; 361 - /* Same padding as on the page content. */ 362 - padding: @grid-gutter-width / 2; 363 -} 364 - 365 -.cke_contents > textarea.cke_source.cke_editable_inline { 366 - border: 1px solid transparent; 367 - border-radius: 0; 368 - box-shadow: none; 369 - margin-top: -1px; 370 - margin-left: -1px; 371 - 372 - .form-control-focus(); 373 -} 374 - 375 -.cke_contents.fake { 376 - /* We need this to have the box shadow visible when the source area is focused. */ 377 - overflow: visible; 378 -} 379 - 380 -#xwikicontent + .cke_contents > textarea.cke_source.cke_editable_inline { 381 - /* Don't take the padding and the margin into account when computing the 100% width. */ 382 - box-sizing: content-box; 383 - /* Make sure the Source area has the same width as the WYSIWYG area. */ 384 - margin-left: -@grid-gutter-width / 2 - 1px; 385 - margin-right: -@grid-gutter-width / 2 - 1px; 386 -} 387 - 388 -/** 389 - * Full-screen styles for the in-line editor 390 - */ 391 -body[data-maximized="true"] { 392 - overflow: hidden; 393 - 394 - .cke_maximize_backdrop, 395 - .cke_toolBar_active, 396 - .cke_editable_active, 397 - .cke_actionBar_active { 398 - position: fixed !important; 399 - right: 0 !important; 400 - left: 0 !important; 401 - } 402 - 403 - /* 404 - * The tool bar 405 - */ 406 - .cke_toolBar_active { 407 - /* We have to use !important in order to overwrite the in-line styles. */ 408 - display: block !important; 409 - top: 0 !important; 410 - } 411 - 412 - /* 413 - * The editing area 414 - */ 415 - .cke_maximize_backdrop, 416 - .cke_editable_active { 417 - background-color: @xwiki-page-content-bg; 418 - } 419 - .cke_editable_active { 420 - box-sizing: border-box !important; 421 - margin: 0 !important; 422 - overflow-y: auto !important; 423 - z-index: 9995; 424 - 425 - &:focus { 426 - /* Remove the focus border. */ 427 - border-color: transparent !important; 428 - box-shadow: none !important; 429 - } 430 - } 431 - .cke_maximize_backdrop { 432 - top: 0; 433 - bottom: 0; 434 - z-index: 99; 435 - } 436 - 437 - /* 438 - * The action buttons 439 - */ 440 - .cke_actionBar_active { 441 - background-color: @xwiki-background-secondary-color; 442 - border: 1px solid @xwiki-border-color; 443 - bottom: 0; 444 - /* Reduce a bit the padding. */ 445 - padding: .5em; 446 - z-index: 9995; 447 - } 448 -} 449 - 450 -/* 451 - * Override the CKEditor reset for the table border color. 452 - * The default border color from CKEditor is quite lacking on contrast. 453 - */ 454 -.cke_editable.cke_show_borders table.cke_show_border, 455 -.cke_editable.cke_show_borders table.cke_show_border > tr > th, 456 -.cke_editable.cke_show_borders table.cke_show_border > tr > td, 457 -.cke_editable.cke_show_borders table.cke_show_border > thead > tr > th, 458 -.cke_editable.cke_show_borders table.cke_show_border > thead > tr > td, 459 -.cke_editable.cke_show_borders table.cke_show_border > tbody > tr > th, 460 -.cke_editable.cke_show_borders table.cke_show_border > tbody > tr > td, 461 -.cke_editable.cke_show_borders table.cke_show_border > tfoot > tr > th, 462 -.cke_editable.cke_show_borders table.cke_show_border > tfoot > tr > td { 463 - border-color: @table-border-color; 464 - border-style: solid; 465 -} - 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