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
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
Commentaire de modification : Install extension [org.xwiki.contrib:application-ckeditor-ui/1.63.1]

Résumé

Détails

Propriétés de la Page
Auteur du document
... ... @@ -1,1 +1,1 @@
1 -xwiki:XWiki.fcharton
1 +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('&amp;#123;&amp;#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}}