Modifications pour le document VelocityMacros
Modifié par Florent Charton le 2026/03/13 11:04
Depuis la version 5.1
modifié par Florent Charton
sur 2026/03/13 11:04
sur 2026/03/13 11:04
Commentaire de modification :
Install extension [org.xwiki.platform:xwiki-platform-ckeditor-ui/17.10.4]
À la version 1.1
modifié par superadmin
sur 2022/06/20 08:49
sur 2022/06/20 08:49
Commentaire de modification :
Install extension [org.xwiki.contrib:application-ckeditor-ui/1.63.1]
Résumé
-
Propriétés de la Page (2 modifications, 0 ajouts, 0 suppressions)
Détails
- Propriétés de la Page
-
- Auteur du document
-
... ... @@ -1,1 +1,1 @@ 1 - xwiki:XWiki.fcharton1 +XWiki.superadmin - Contenu
-
... ... @@ -10,8 +10,7 @@ 10 10 #if ($toHTML) 11 11 #set ($source = { 12 12 'documentReference': $doc.documentReference, 13 - 'syntax': $sourceSyntax, 14 - 'restricted' : $request.wysiwygRestricted 13 + 'syntax': $sourceSyntax 15 15 }) 16 16 #if ($fromHTML) 17 17 #set ($source.html = $text) ... ... @@ -23,10 +23,9 @@ 23 23 ## directly in the current page, e.g. when CKEditor is used in-line (no iframe). We still need to send back the 24 24 ## required style sheets and JavaScript files because some of them might not be available in the target page, e.g. 25 25 ## when a macro is inserted and it needs resource files not available on every page. 26 - #template('display_macros.vm') 27 - #initRequiredSkinExtensions() 25 + #ckeditor_initRequiredSkinExtensions() 28 28 #set ($output = "#ckeditor_getRenderedContent($source)$!html") 29 - #sendRequiredSkinExtensions() 27 + #set ($discard = $response.setHeader('X-XWIKI-HTML-HEAD', "#ckeditor_getRequiredSkinExtensions()")) 30 30 #else 31 31 ## Returns a full HTML page, including the HEAD tag with the style sheets and possibly the JavaScript includes. 32 32 ## This is needed when the edited content is loaded in an iframe, which is the case when CKEditor replaces a text ... ... @@ -35,6 +35,11 @@ 35 35 #end 36 36 #else 37 37 #set ($output = $services.wysiwyg.fromAnnotatedXHTML($text, $sourceSyntax.toIdString())) 36 + #if ("$!output" == '' && $output != '') 37 + ## $output is null, probably because $services.wysiwyg.fromAnnotatedXHTML() is not available (before 10.10RC1) 38 + #set ($xdom = $services.rendering.parse($text, 'xhtml/1.0')) 39 + #set ($output = $services.rendering.render($xdom, $sourceSyntax.toIdString())) 40 + #end 38 38 #end 39 39 #if ("$!output" != '' || $output == '') 40 40 $output## ... ... @@ -47,6 +47,19 @@ 47 47 #macro (ckeditor_renderContentSheet $source) 48 48 ## The $source variable is used inside the content sheet. 49 49 #set ($output = $services.wysiwyg.render('CKEditor.ContentSheet')) 53 + #if ("$!output" == '' && $output != '') 54 + ## $output is null, probably because $services.wysiwyg.render() is not available (before 7.4.1) 55 + #set ($output = $xwiki.getDocument('CKEditor.ContentSheet').getRenderedContent()) 56 + #set ($skinExtensionHooks = { 57 + 'ssx': 'CssSkinExtensionPlugin', 58 + 'ssfx': 'CssSkinFileExtensionPlugin', 59 + 'ssrx': 'CssResourceSkinExtensionPlugin' 60 + }) 61 + #foreach ($entry in $skinExtensionHooks.entrySet()) 62 + #set ($output = $output.replace("<!-- com.xpn.xwiki.plugin.skinx.$entry.value -->", 63 + $xwiki.get($entry.key).importString)) 64 + #end 65 + #end 50 50 ## Unescape {{ which happened in CKEditor.ContentSheet for protecting the {{html}} macro. 51 51 $!output.replace('&#123;&#123;', '{{')## 52 52 #end ... ... @@ -55,11 +55,24 @@ 55 55 ## Make sure the edited content is rendered for view because this is a WYSIWYG editor. 56 56 #set ($macro.previousDisplayMode = $xcontext.displayMode) 57 57 #set ($discard = $xcontext.setDisplayMode('view')) 58 - #set ($restricted = "$!source.restricted" == 'true') 74 + #if ($xcontext.displayMode != 'view') 75 + ## Before XWiki 14.0-rc-1, 13.4.7, 13.10.3 and 12.10.12 there's no API to get the current display mode so we can't 76 + ## restore the previous display mode properly. We assume the previous display mode is 'edit' because the WYSIWYG 77 + ## editor is used. 78 + #set ($macro.previousDisplayMode = 'edit') 79 + #end 59 59 #if ($source.html) 60 - #set ($html = $services.wysiwyg.parseAndRender($source.html, $source.syntax, $source.documentReference, $restricted)) 81 + #set ($html = $services.wysiwyg.parseAndRender($source.html, $source.syntax, $source.documentReference)) 82 + #if ("$!html" == '' && $html != '') 83 + ## Before XWiki 11.9RC1 (see XWIKI-16737) 84 + #set ($html = $services.wysiwyg.parseAndRender($source.html, $source.syntax.toIdString())) 85 + #end 61 61 #else 62 - #set ($html = $services.wysiwyg.toAnnotatedXHTML($source.content, $source.syntax, $source.documentReference, $restricted)) 87 + #set ($html = $services.wysiwyg.toAnnotatedXHTML($source.content, $source.syntax, $source.documentReference)) 88 + #if ("$!html" == '' && $html != '') 89 + ## Before XWiki 11.9RC1 (see XWIKI-16737) 90 + #set ($html = $services.wysiwyg.toAnnotatedXHTML($source.content, $source.syntax.toIdString())) 91 + #end 63 63 #end 64 64 #if ("$!html" == '') 65 65 ## Prevent Firefox from inserting bogus whitespace when the text area is empty. ... ... @@ -75,6 +75,10 @@ 75 75 #set ($discard = $xwiki.linkx.use($url, {'type': 'text/css', 'rel': 'stylesheet'})) 76 76 #end 77 77 107 +#macro (importCKEditorCSS $path $evaluate) 108 + #ckeditor_importCSS('org.xwiki.contrib' 'application-ckeditor-webjar' $path $evaluate) 109 +#end 110 + 78 78 #macro (importCKEditorResources) 79 79 #set ($discard = $xwiki.ssx.use('CKEditor.EditSheet')) 80 80 ## Add the version of each JavaScript dependency of CKEditor Integration to the URL used to load the CKEditor in order ... ... @@ -81,7 +81,7 @@ 81 81 ## to make sure the browser cache is invalidated when one of these versions changes (e.g. when we upgrade XWiki or one 82 82 ## of these dependencies but the CKEditor version remains the same). 83 83 #set ($discard = $xwiki.jsx.use('CKEditor.EditSheet', { 84 - 'v': $services.extension.installed.getInstalledExtension('org.xwiki. platform:xwiki-platform-ckeditor-ui',117 + 'v': $services.extension.installed.getInstalledExtension('org.xwiki.contrib:application-ckeditor-ui', 85 85 "wiki:$xcontext.database").version.value, 86 86 'xwiki-version': $services.extension.core.getCoreExtension( 87 87 'org.xwiki.platform:xwiki-platform-tree-webjar').version.value, ... ... @@ -90,7 +90,8 @@ 90 90 'bs3typeahead-version': $services.extension.installed.getInstalledExtension('org.webjars.npm:bootstrap-3-typeahead', 91 91 "wiki:$xcontext.database").version.value 92 92 })) 93 - #ckeditor_importCSS('org.xwiki.platform' 'xwiki-platform-ckeditor-plugins' 'webjar.bundle.min.css' true) 126 + #importCKEditorCSS('plugins/xwiki-resource/resourcePicker.min.css' true) 127 + #importCKEditorCSS('plugins/xwiki-macro/macroWizard.min.css' true) 94 94 ## Tree styles needed for the document/attachment tree picker. 95 95 #set ($discard = $xwiki.linkx.use($services.webjars.url('org.xwiki.platform:xwiki-platform-tree-webjar', 'tree.min.css', 96 96 {'evaluate': true}), {'type': 'text/css', 'rel': 'stylesheet'})) ... ... @@ -100,55 +100,40 @@ 100 100 101 101 #macro (ckeditor $parameters) 102 102 #importCKEditorResources 103 - ## 137 + #set ($sourceDocumentReference = $parameters.attributes.get('data-sourceDocumentReference')) 138 + ## Use the current document as source document, if possible, because it may contain unsaved changes (e.g. changes 139 + ## coming from a template specified in the URL or from other URL parameters). This is important for instance in order 140 + ## to ensure that for new (unsaved) documents we use the syntax that has been copied from the template and not the 141 + ## default wiki syntax. 142 + #if (!$sourceDocumentReference || $sourceDocumentReference.equals($tdoc.documentReference)) 143 + #set ($sourceDocument = $tdoc) 144 + #set ($sourceDocumentReference = $tdoc.documentReference) 145 + #else 146 + #set ($sourceDocument = $xwiki.getDocument($sourceDocumentReference)) 147 + #end 104 104 #set ($escapedName = $escapetool.xml($parameters.attributes.name)) 105 105 <input value="$!escapedName" name="RequiresHTMLConversion" type="hidden"/> 106 - ## 107 - #set ($syntaxId = $parameters.attributes.get('data-syntax')) 108 - <input value="$!escapetool.xml($syntaxId)" name="$!{escapedName}_syntax" type="hidden"/> 109 - ## 150 + <input value="$!escapetool.xml($sourceDocument.syntax.toIdString())" name="$!{escapedName}_syntax" type="hidden"/> 110 110 ## Chrome doesn't cache the enabled/disabled state of the form fields so we must store this state in the value of 111 111 ## another form field. For instance, the enabled/disabled state of the RequiresHTMLConversion hidden input 112 112 ## determines which editor mode (WYSIWYG vs. Source) is loaded initially. 113 113 ## See CKEDITOR-34: Wiki syntax gets escaped when you click "Back" in the browser 114 114 <input value="" name="$!{escapedName}_cache" type="hidden" class="cache"/> 115 - ## 116 116 #set ($discard = $parameters.attributes.putAll({ 117 117 'class': "$!parameters.attributes.get('class') ckeditor-textarea loading", 118 - 'spellcheck': false 158 + 'spellcheck': false, 159 + 'data-sourceDocumentSyntax': $sourceDocument.syntax.toIdString() 119 119 })) 120 - ## 121 - #set ($sourceDocumentReference = $parameters.attributes.get('data-sourceDocumentReference')) 122 - #if (!$sourceDocumentReference) 123 - #set ($sourceDocumentReference = $tdoc.documentReference) 124 - #end 125 - #set ($source = { 126 - 'documentReference': $sourceDocumentReference, 127 - 'syntax': $syntaxId, 128 - 'content': $parameters.content, 129 - 'restricted': $parameters.attributes.data-restricted 130 - }) 131 - ## 132 - ## Disable the file upload and drag & drop when the current user doesn't have edit right on the source document, if 133 - ## the source is restricted. This is the case for instance when an user with comment right adds a comment to a page 134 - ## they don't have edit right on. They are allowed to add the comment but they can't upload files because that 135 - ## requires edit right. We check if the source is in restricted mode because in some cases (such as for Change Request 136 - ## Application) we want to allow file upload even if the current user doesn't have edit right on the source document. 137 - #if ($source.restricted == 'true' && !$services.security.authorization.hasAccess('edit', $source.documentReference)) 138 - #set ($parameters.attributes.data-upload-disabled = 'true') 139 - #end 140 - ## We use the velocity template context to convey the startupFocus parameter to CKEditor. 141 - #if ($wysiwygEditorConfig.startupFocus) 142 - #set ($parameters.attributes.data-startup-focus = 'true') 143 - ## We make sure to clear this context so that it doesn't interfere with CKEditors opened later. 144 - #set ($wysiwygEditorConfig.startupFocus = false) 145 - #end 146 - ## 147 147 <textarea 148 148 #foreach ($entry in $parameters.attributes.entrySet()) 149 149 $entry.key="$!escapetool.xml($entry.value)" 150 150 #end 151 151 ## We render the content sheet at the end because the edited content can overwrite the variables used by this macro. 166 + #set ($source = { 167 + 'documentReference': $sourceDocumentReference, 168 + 'syntax': $sourceDocument.syntax, 169 + 'content': $parameters.content 170 + }) 152 152 #set ($content = "#ckeditor_renderContentSheet($source)") 153 153 >$!escapetool.xml($content)</textarea> 154 154 #end ... ... @@ -155,7 +155,7 @@ 155 155 156 156 #macro (displayCKEditorConfigProperty $configDoc $propName $action) 157 157 <dt> 158 - <label for="CKEditor.ConfigClass_$escapetool.xml($configDoc.getObject("CKEditor.ConfigClass").getNumber())_${propName}">$configDoc.displayPrettyName($propName)</label>177 + <label>$configDoc.displayPrettyName($propName)</label> 159 159 <span class="xHint">$escapetool.xml($services.localization.render("CKEditor.ConfigClass_${propName}.hint"))</span> 160 160 </dt> 161 161 <dd>#displayCKEditorConfigPropertyValue($configDoc $propName $action)</dd> ... ... @@ -173,7 +173,10 @@ 173 173 #end 174 174 175 175 #macro (displayCKEditorConfigPropertyValue $configDoc $propName $action) 176 - #unwrapXPropertyDisplay($configDoc.display($propName, $action)) 195 + #set ($output = $configDoc.display($propName, $action)) 196 + #set ($output = $stringtool.removeStart($output, '{{html clean="false" wiki="false"}}')) 197 + #set ($output = $stringtool.removeEnd($output, '{{/html}}')) 198 + $output 177 177 #end 178 178 179 179 #macro (displayCKEditorConfig $configDoc $action) ... ... @@ -198,11 +198,12 @@ 198 198 </dl> 199 199 #end 200 200 201 -#** 202 - * Deprecated. Use #initRequiredSkinExtensions() from display_macros.vm instead. 203 -*# 204 204 #macro (ckeditor_initRequiredSkinExtensions) 205 205 #set ($requiredSkinExtensions = $collectiontool.orderedMap) 225 + #if ("$!requiredSkinExtensions" == '') 226 + ## For XWiki versions older than 12.1RC1 fallback on the old $collectionstool (available since 4.0M1). 227 + #set ($requiredSkinExtensions = $collectionstool.orderedMap) 228 + #end 206 206 ## Save the import string for each skin extension plugin in order to be able to remove the always used extensions 207 207 ## (they are aready available on the edit page so there's no need to load them). 208 208 #foreach ($pluginName in ['ssrx', 'ssfx', 'ssx', 'linkx', 'jsrx', 'jsfx', 'jsx']) ... ... @@ -210,9 +210,6 @@ 210 210 #end 211 211 #end 212 212 213 -#** 214 - * Deprecated. Use #getRequiredSkinExtensions() from display_macros.vm instead. 215 -*# 216 216 #macro (ckeditor_getRequiredSkinExtensions) 217 217 #foreach ($entry in $requiredSkinExtensions.entrySet()) 218 218 #set ($importString = $xwiki.get($entry.key).importString) ... ... @@ -220,4 +220,20 @@ 220 220 $!stringtool.removeStart($importString, $entry.value).trim()## 221 221 #end 222 222 #end 243 + 244 +#macro (ckeditor_defineSortTool $sortToolVariable) 245 + #set ($checkedExtension = "org.xwiki.commons:xwiki-commons-velocity") 246 + ## Because of an API collision, $collectionstool has been replaced by $collectiontool in XCOMMONS-1861 247 + #if ($services.extension.core.getCoreExtension($checkedExtension).id.version.compareTo("12.1-SNAPSHOT") >= 0) 248 + #setVariable ($sortToolVariable, $collectiontool) 249 + ## With the upgrade of Velocity $sorttool has been replaced by $collectionstool (XCOMMONS-1296) 250 + #elseif ($services.extension.core.getCoreExtension($checkedExtension).id.version.compareTo("12.0-SNAPSHOT") >= 0) 251 + #setVariable ($sortToolVariable, $collectionstool) 252 + ## Old API for sorting was $sorttool 253 + #else 254 + #setVariable ($sortToolVariable, $sorttool) 255 + #end 256 +#end 257 + 258 +#ckeditor_defineSortTool("$resolvedSortTool") 223 223 {{/velocity}}