Modifications pour le document MacroService

Modifié par Florent Charton le 2026/03/13 11:04

Depuis la version 3.1
modifié par Florent Charton
sur 2024/08/08 18:44
Commentaire de modification : Install extension [org.xwiki.platform:xwiki-platform-ckeditor-ui/15.10.11]
À la version 6.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]

Résumé

Détails

Propriétés de la Page
Contenu
... ... @@ -51,23 +51,11 @@
51 51   #set ($discard = $xwiki.ssfx.use('uicomponents/suggest/xwiki.selectize.css', true))
52 52  
53 53   #if ($xcontext.action == 'get')
54 - #getRequiredSkinExtensions($requiredSkinExtensions)
55 - #set ($discard = $response.setHeader('X-XWIKI-HTML-HEAD', $requiredSkinExtensions))
54 + #sendRequiredSkinExtensions()
56 56   #end
57 57  
58 58   #set ($syntax = $services.rendering.resolveSyntax($syntaxId))
59 59   #set ($macroDescriptors = $services.rendering.getMacroDescriptors($syntax))
60 - #if (!$macroDescriptors)
61 - ## Before XWiki 9.7RC1 we had to use APIs that require programming rights.
62 - #set ($macroDescriptors = [])
63 - #try()
64 - #set ($macroManager = $services.component.getInstance('org.xwiki.rendering.macro.MacroManager'))
65 - #foreach ($macroId in $macroManager.getMacroIds($syntax))
66 - #set ($macroDescriptor = $macroManager.getMacro($macroId).descriptor)
67 - #set ($discard = $macroDescriptors.add($macroDescriptor))
68 - #end
69 - #end
70 - #end
71 71   #set ($data = {})
72 72   #set ($allMacrosExcludedCategories = [])
73 73   #set ($discard = $allMacrosExcludedCategories.add("#maybeTranslate('rendering.macroCategory.Internal' 'Internal')"))
... ... @@ -109,7 +109,7 @@
109 109   }))
110 110   #end
111 111   #end
112 - #set ($macroList = $resolvedSortTool.sort($macroList, 'name'))
100 + #set ($macroList = $collectiontool.sort($macroList, 'name'))
113 113   #set ($discard = $data.put('list', $macroList))
114 114   ## Get macros provided by compatible available extensions
115 115   #set ($macroExtensionsList = [])
... ... @@ -161,236 +161,18 @@
161 161  #end
162 162  
163 163  #macro (maybeGetMacroDescriptor $macroIdAsString)
164 - #set ($xmacro = $NULL)
165 - #set ($macroDescriptor = $NULL)
166 - #set ($macroId = $services.rendering.resolveMacroId($macroIdAsString))
167 - #if ($macroId)
168 - #set ($macroDescriptor = $services.rendering.getMacroDescriptor($macroId))
169 - #if (!$macroDescriptor && $macroId.syntax)
170 - ## Try the macro id without the syntax.
171 - #set ($macroId = $services.rendering.resolveMacroId($macroId.id))
172 - #set ($macroDescriptor = $services.rendering.getMacroDescriptor($macroId))
173 - #end
174 - #else
175 - ## Either the macro id could not be resolved (unlikely) or we are on an older XWiki instance (before 10.10RC1) where
176 - ## we had to use APIs that require programming rights.
177 - #getMacroWithPR($macroIdAsString)
178 - #if ($xmacro)
179 - #set ($macroDescriptor = $xmacro.descriptor)
180 - #end
181 - #end
152 + #template('display_macros.vm')
153 + #initRequiredSkinExtensions()
154 + #set ($macroDescriptor = $services.wysiwyg.getMacroDescriptorUI($macroIdAsString))
182 182   #if ($macroDescriptor)
183 - #getMacroDescriptor($macroDescriptor)
184 - #if ($xmacro)
185 - ## supportsInlineMode was not exposed on the macro descriptor before XWiki 10.10RC1.
186 - #set ($data.supportsInlineMode = $xmacro.supportsInlineMode())
187 - #end
188 - #end
189 -#end
190 -
191 -#macro (getMacroWithPR $macroIdAsString)
192 - #set ($xmacro = $NULL)
193 - #try()
194 - #set ($macroIdFactory = $services.component.getInstance('org.xwiki.rendering.macro.MacroIdFactory'))
195 - #set ($macroId = $macroIdFactory.createMacroId($macroIdAsString))
196 - #set ($macroManager = $services.component.getInstance('org.xwiki.rendering.macro.MacroManager'))
197 - #if ($macroManager.exists($macroId))
198 - #set ($xmacro = $macroManager.getMacro($macroId))
199 - #elseif ($macroId.syntax)
200 - ## Try the macro id without the syntax.
201 - #set ($macroId = $macroIdFactory.createMacroId($macroId.id))
202 - #if ($macroManager.exists($macroId))
203 - #set ($xmacro = $macroManager.getMacro($macroId))
204 - #end
205 - #end
206 - #end
207 -#end
208 -
209 -#macro (getMacroDescriptor $macroDescriptor)
210 - ## Translate the macro name and description.
211 - #set ($macroTranslationKey = "rendering.macro.$macroDescriptor.id")
212 - #ckeditor_initRequiredSkinExtensions()
213 - #set ($data = {
214 - 'id': $macroDescriptor.id,
215 - 'name': "#maybeTranslate(""${macroTranslationKey}.name"" $macroDescriptor.name)",
216 - 'description': "#maybeTranslate(""${macroTranslationKey}.description"" $macroDescriptor.description)",
217 - 'defaultCategory': $macroDescriptor.defaultCategory,
218 - 'supportsInlineMode': $macroDescriptor.supportsInlineMode(),
219 - 'parameterDescriptorMap': {}
220 - })
221 - #if ($macroDescriptor.contentDescriptor)
222 - ## Translate the content label and description.
223 - ## Treat the macro content as if it is the last macro parameter.
224 - #set ($data.contentDescriptor = {
225 - 'name': "#maybeTranslate('rendering.macroContent' 'Content')",
226 - 'description': "#maybeTranslate(""${macroTranslationKey}.content.description""
227 - $macroDescriptor.contentDescriptor.description)",
228 - 'mandatory': $macroDescriptor.contentDescriptor.mandatory,
229 - 'deprecated': $macroDescriptor.contentDescriptor.deprecated,
230 - 'advanced': $macroDescriptor.contentDescriptor.advanced,
231 - 'defaultValue': $macroDescriptor.contentDescriptor.defaultValue,
232 - 'type': $macroDescriptor.contentDescriptor.type,
233 - 'editTemplate': '<textarea name="$content" rows="7"></textarea>',
234 - 'index': $macroDescriptor.parameterDescriptorMap.size()
156 + #getRequiredSkinExtensions($requiredSkinExtensions)
157 + #set ($data = {
158 + 'descriptor': $macroDescriptor,
159 + 'requiredSkinExtensions': $requiredSkinExtensions
235 235   })
236 - #fixDescriptorType($data.contentDescriptor)
237 237   #end
238 - #set ($groupDescriptorTree = {})
239 - #foreach ($entry in $macroDescriptor.parameterDescriptorMap.entrySet())
240 - #set ($parameterDescriptor = $entry.value)
241 - ## Translate the parameter name and description.
242 - #set ($parameterTranslationKey = "${macroTranslationKey}.parameter.$parameterDescriptor.id")
243 - ## Note: The displayHidden parameter is new in XWiki 12.4RC1 so make sure we set 'hidden' to false if it doesn't
244 - ## exist
245 - #if ("$!parameterDescriptor.displayHidden" != '')
246 - #set ($parameterHidden = $parameterDescriptor.displayHidden)
247 - #else
248 - #set ($parameterHidden = false)
249 - #end
250 - #set ($translatedParameterDescriptor = {
251 - 'id': $parameterDescriptor.id,
252 - 'name': "#maybeTranslate(""${parameterTranslationKey}.name"" $parameterDescriptor.name)",
253 - 'description': "#maybeTranslate(""${parameterTranslationKey}.description"" $parameterDescriptor.description)",
254 - 'mandatory': $parameterDescriptor.mandatory,
255 - 'deprecated': $parameterDescriptor.deprecated,
256 - 'advanced': $parameterDescriptor.advanced,
257 - 'defaultValue': $parameterDescriptor.defaultValue,
258 - 'type': $parameterDescriptor.displayType,
259 - 'hidden' : $parameterHidden,
260 - 'index': $foreach.index
261 - })
262 - #if ("$!translatedParameterDescriptor.type" == '')
263 - ## displayType is not available before XWiki 11.0 so we need to fall back on parameterType.
264 - #set ($translatedParameterDescriptor.type = $parameterDescriptor.parameterType)
265 - #end
266 - #set ($translatedParameterDescriptor.caseInsensitive = $translatedParameterDescriptor.type.isEnum())
267 - #set ($groupDescriptor = $parameterDescriptor.groupDescriptor)
268 - #if ($groupDescriptor)
269 - #handleMacroParameterGroup($groupDescriptor $groupDescriptorTree $translatedParameterDescriptor)
270 - #end
271 - #if ($translatedParameterDescriptor.type.getName() == 'java.lang.String'
272 - && ($parameterDescriptor.defaultValue == 'false' || $parameterDescriptor.defaultValue == 'true')
273 - && $macroDescriptor.parametersBeanClass.getSimpleName() == 'WikiMacroParameters')
274 - #set ($translatedParameterDescriptor.defaultValue = $parameterDescriptor.defaultValue == 'true')
275 - #set ($translatedParameterDescriptor.type = $translatedParameterDescriptor.defaultValue.getClass())
276 - #end
277 - #set ($htmlDisplayerParameters = {'name': $parameterDescriptor.id})
278 - #if ($translatedParameterDescriptor.group)
279 - #set ($discard = $htmlDisplayerParameters.put('data-property-group',
280 - $stringtool.join($translatedParameterDescriptor.group, '/')))
281 - #end
282 - #set ($translatedParameterDescriptor.editTemplate = $services.display.html.display(
283 - $translatedParameterDescriptor.type, $translatedParameterDescriptor.defaultValue, $htmlDisplayerParameters, 'edit'
284 - ))
285 - #if ("$!translatedParameterDescriptor.editTemplate" == '')
286 - #set ($translatedParameterDescriptor.editTemplate = "#getMacroParameterEditTemplate(
287 - $translatedParameterDescriptor)")
288 - #end
289 - #set ($translatedParameterDescriptor.editTemplate = $translatedParameterDescriptor.editTemplate.trim())
290 - #fixDescriptorType($translatedParameterDescriptor)
291 - ## Make sure the key is lowercase (for XWiki <9.0).
292 - ## See XWIKI-13990: Inconsistency between Java-based and Wiki-based rendering macros regarding the parameter
293 - ## descriptor map keys
294 - #set ($discard = $data.parameterDescriptorMap.put($entry.key.toLowerCase(), $translatedParameterDescriptor))
295 - #end
296 - #if ($groupDescriptorTree.groups)
297 - #set ($data.groupDescriptorTree = $groupDescriptorTree.groups)
298 - #end
299 - #set ($data.requiredSkinExtensions = "#ckeditor_getRequiredSkinExtensions()")
300 300  #end
301 301  
302 -#macro (fixDescriptorType $descriptor)
303 - ## The goal of this code is to obtain a normalized string representation of the type specified in the descriptor.
304 - ## See XCOMMONS-1583: Define a stable way to serialize types
305 - ##
306 - ## The type specified in the descriptor can be any implementation of java.lang.reflect.Type, not necessarily a
307 - ## java.lang.Class. We can't use toString() because the return of Class#toString() is different than Class#getName().
308 - ## We can't use Type#getTypeName() either because the access to this method is restricted from Velocity. The only
309 - ## option for now is to try #getName() first and fall back on #toString() for types that are not instances of
310 - ## java.lang.Class.
311 - #set ($typeName = $descriptor.type.getName())
312 - #if ("$!typeName" == '')
313 - ## Probably not a java.lang.Class. Fall back on #toString().
314 - #set ($typeName = "$!descriptor.type")
315 - #end
316 - ## Remove whitespace from the type name in order to have a single string representation.
317 - #set ($descriptor.type = $typeName.replaceAll('\s+', ''))
318 -#end
319 -
320 -## Builds the group tree with the following structure:
321 -##
322 -## {
323 -## 'parentGroupId': {
324 -## 'id': 'parentGroupId',
325 -## 'name': 'Parent Group',
326 -## 'feature': 'someFeature',
327 -## 'groups': {
328 -## 'childGroupId': {...},
329 -## ...
330 -## }
331 -## },
332 -## ...
333 -## }
334 -#macro (handleMacroParameterGroup $groupDescriptor $groupDescriptorTree $translatedParameterDescriptor)
335 - #if ($groupDescriptor.group && $groupDescriptor.group.size() > 0)
336 - #set ($translatedParameterDescriptor.group = $groupDescriptor.group)
337 - #set ($parentGroup = $groupDescriptorTree)
338 - #foreach ($groupId in $groupDescriptor.group)
339 - #if (!$parentGroup.groups)
340 - #set ($parentGroup.groups = {})
341 - #end
342 - #set ($childGroup = $parentGroup.groups.get($groupId))
343 - #if (!$childGroup)
344 - #if ($groupId == $translatedParameterDescriptor.id)
345 - #set ($groupName = $translatedParameterDescriptor.name)
346 - #else
347 - #set ($groupTranslationKey = "${macroTranslationKey}.group.$groupId")
348 - #set ($groupName = "#maybeTranslate(""${groupTranslationKey}.name"" $groupId)")
349 - #end
350 - #set ($childGroup = {
351 - 'id': $groupId,
352 - 'name': $groupName
353 - })
354 - #set ($discard = $parentGroup.groups.put($groupId, $childGroup))
355 - #end
356 - #set ($parentGroup = $childGroup)
357 - #end
358 - #if ("$!groupDescriptor.feature" != '')
359 - #set ($parentGroup.feature = $groupDescriptor.feature)
360 - #end
361 - #elseif ($groupDescriptor.feature)
362 - ## This group is made of a single parameter. The feature then refers to this parameter.
363 - #set ($translatedParameterDescriptor.feature = $groupDescriptor.feature)
364 - #end
365 -#end
366 -
367 -#macro (getMacroParameterEditTemplate $translatedParameterDescriptor)
368 - #if ($translatedParameterDescriptor.type.getName() == 'boolean'
369 - || $translatedParameterDescriptor.type.getName() == 'java.lang.Boolean')
370 - <input type="checkbox" name="$escapetool.xml($translatedParameterDescriptor.id)" value="true"/>##
371 - ## We need to submit something in case the checkbox is not checked.
372 - <input type="hidden" name="$escapetool.xml($translatedParameterDescriptor.id)" value="false"/>
373 - #elseif ($translatedParameterDescriptor.type.isEnum())
374 - #if ($translatedParameterDescriptor.defaultValue)
375 - #set ($enumValues = $translatedParameterDescriptor.defaultValue.values())
376 - #else
377 - ## A parameter of type enum that doesn't have a default value is very unlikely. We attempt to read the list of
378 - ## possible values from the enum type in this case, which is currently forbidden, but at least it will generate
379 - ## a warning in the logs that will help us investigate the problem.
380 - #set ($enumValues = $translatedParameterDescriptor.type.getEnumConstants())
381 - #end
382 - <select name="$escapetool.xml($translatedParameterDescriptor.id)">##
383 - #foreach ($enumValue in $enumValues)
384 - #set ($value = $enumValue.name())
385 - #set ($label = "#maybeTranslate(""${parameterTranslationKey}.value.$value"" $enumValue)")
386 - <option value="$escapetool.xml($value)">$escapetool.xml($label)</option>##
387 - #end
388 - </select>
389 - #else
390 - <input type="text" name="$escapetool.xml($translatedParameterDescriptor.id)"/>
391 - #end
392 -#end
393 -
394 394  #macro (maybeTranslate $key $defaultValue)
395 395   #if ($services.localization.get($key))
396 396   $services.localization.render($key)##
... ... @@ -440,9 +440,19 @@
440 440   $response.sendError(404, $exceptiontool.getRootCauseMessage($job.status.error))
441 441   #end
442 442  #end
443 -{{/velocity}}
444 444  
445 -{{velocity wiki="false"}}
214 +#macro (getMacroParameters $macroId $macroParameters)
215 + #set ($macroId = $services.rendering.resolveMacroId($macroId))
216 + #set ($macroParameters = $jsontool.fromString($macroParameters))
217 + #foreach($macroParameter in $macroParameters.entrySet())
218 + ## TODO: Do we need to take into account the macro parameter type? We could have a macro parameter that is editable
219 + ## inline but whose value is not a List<Block> but rather a String (plain text).
220 + #set ($macroParameter.value = $services.wysiwyg.fromAnnotatedXHTML($macroParameter.value, $macroId.syntax))
221 + #end
222 + #set ($data = $macroParameters)
223 +#end
224 +
225 +#set ($data = $NULL)
446 446  #if ("$!request.action" == 'install')
447 447   #if ($services.csrf.isTokenValid($request.form_token))
448 448   #installMacroExtension($request.extensionId, $request.extensionVersion)
... ... @@ -449,18 +449,18 @@
449 449   #else
450 450   $response.sendError(403)
451 451   #end
452 -#elseif ("$!request.data" != '')
453 - #set ($data = $NULL)
454 - #if ($request.data == 'list')
455 - #getMacroList($request.syntaxId)
456 - #elseif ($request.data == 'descriptor')
457 - #maybeGetMacroDescriptor($request.macroId)
458 - #end
459 - #if ($data)
460 - #set ($discard = $response.setContentType('application/json'))
461 - $jsontool.serialize($data)
462 - #else
463 - $response.sendError(404)
464 - #end
232 +#elseif ($request.data == 'list')
233 + #getMacroList($request.syntaxId)
234 +#elseif ($request.data == 'descriptor')
235 + #maybeGetMacroDescriptor($request.macroId)
236 +#elseif ($request.data == 'macroParameters')
237 + #getMacroParameters($request.macroId, $request.macroParameters)
465 465  #end
239 +#if ($response.isCommitted())
240 + ## Do nothing.
241 +#elseif ($data)
242 + #jsonResponse($data)
243 +#elseif ("$!request.action" != '' || "$!request.data" != '')
244 + $response.sendError(404)
245 +#end
466 466  {{/velocity}}