Änderungen von Dokument MacroService
Zuletzt geändert von Daniel Herrmann am 2026/02/04 20:23
Auf Version
3.1
bearbeitet von Daniel Herrmann
am 2026/02/04 20:23
am 2026/02/04 20:23
Änderungskommentar:
Install extension [org.xwiki.platform:xwiki-platform-ckeditor-ui/17.10.3]
Zusammenfassung
Details
- Seiteneigenschaften
-
- Dokument-Autor
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki. admin1 +XWiki.dherrman - Inhalt
-
... ... @@ -51,8 +51,7 @@ 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)) ... ... @@ -150,191 +150,18 @@ 150 150 #end 151 151 152 152 #macro (maybeGetMacroDescriptor $macroIdAsString) 153 - #set ($macroId = $services.rendering.resolveMacroId($macroIdAsString)) 154 - #if ($macroId) 155 - #set ($macroDescriptor = $services.rendering.getMacroDescriptor($macroId)) 156 - #if (!$macroDescriptor && $macroId.syntax) 157 - ## Try the macro id without the syntax. 158 - #set ($macroId = $services.rendering.resolveMacroId($macroId.id)) 159 - #set ($macroDescriptor = $services.rendering.getMacroDescriptor($macroId)) 160 - #end 161 - #if ($macroDescriptor) 162 - #getMacroDescriptor($macroDescriptor) 163 - #end 164 - #end 165 -#end 166 - 167 -#macro (getMacroDescriptor $macroDescriptor) 168 - ## Translate the macro name and description. 169 - #set ($macroTranslationKey = "rendering.macro.$macroDescriptor.id") 170 - #ckeditor_initRequiredSkinExtensions() 171 - #set ($data = { 172 - 'id': $macroDescriptor.id, 173 - 'name': "#maybeTranslate(""${macroTranslationKey}.name"" $macroDescriptor.name)", 174 - 'description': "#maybeTranslate(""${macroTranslationKey}.description"" $macroDescriptor.description)", 175 - 'defaultCategory': $macroDescriptor.defaultCategory, 176 - 'supportsInlineMode': $macroDescriptor.supportsInlineMode(), 177 - 'parameterDescriptorMap': {} 178 - }) 179 - #if ($macroDescriptor.contentDescriptor) 180 - ## Translate the content label and description. 181 - ## Treat the macro content as if it is the last macro parameter. 182 - #set ($data.contentDescriptor = { 183 - 'name': "#maybeTranslate('rendering.macroContent' 'Content')", 184 - 'description': "#maybeTranslate(""${macroTranslationKey}.content.description"" 185 - $macroDescriptor.contentDescriptor.description)", 186 - 'mandatory': $macroDescriptor.contentDescriptor.mandatory, 187 - 'deprecated': $macroDescriptor.contentDescriptor.deprecated, 188 - 'advanced': $macroDescriptor.contentDescriptor.advanced, 189 - 'defaultValue': $macroDescriptor.contentDescriptor.defaultValue, 190 - 'type': $macroDescriptor.contentDescriptor.type, 191 - 'editTemplate': '<textarea name="$content" rows="7"></textarea>', 192 - 'index': $macroDescriptor.parameterDescriptorMap.size() 152 + #template('display_macros.vm') 153 + #initRequiredSkinExtensions() 154 + #set ($macroDescriptor = $services.wysiwyg.getMacroDescriptorUI($macroIdAsString)) 155 + #if ($macroDescriptor) 156 + #getRequiredSkinExtensions($requiredSkinExtensions) 157 + #set ($data = { 158 + 'descriptor': $macroDescriptor, 159 + 'requiredSkinExtensions': $requiredSkinExtensions 193 193 }) 194 - #fixDescriptorType($data.contentDescriptor) 195 195 #end 196 - #set ($groupDescriptorTree = {}) 197 - #foreach ($entry in $macroDescriptor.parameterDescriptorMap.entrySet()) 198 - #set ($parameterDescriptor = $entry.value) 199 - ## Translate the parameter name and description. 200 - #set ($parameterTranslationKey = "${macroTranslationKey}.parameter.$parameterDescriptor.id") 201 - #set ($translatedParameterDescriptor = { 202 - 'id': $parameterDescriptor.id, 203 - 'name': "#maybeTranslate(""${parameterTranslationKey}.name"" $parameterDescriptor.name)", 204 - 'description': "#maybeTranslate(""${parameterTranslationKey}.description"" $parameterDescriptor.description)", 205 - 'mandatory': $parameterDescriptor.mandatory, 206 - 'deprecated': $parameterDescriptor.deprecated, 207 - 'advanced': $parameterDescriptor.advanced, 208 - 'defaultValue': $parameterDescriptor.defaultValue, 209 - 'type': $parameterDescriptor.displayType, 210 - 'hidden' : $parameterDescriptor.displayHidden, 211 - 'index': $foreach.index 212 - }) 213 - #set ($translatedParameterDescriptor.caseInsensitive = $translatedParameterDescriptor.type.isEnum()) 214 - #set ($groupDescriptor = $parameterDescriptor.groupDescriptor) 215 - #if ($groupDescriptor) 216 - #handleMacroParameterGroup($groupDescriptor $groupDescriptorTree $translatedParameterDescriptor) 217 - #end 218 - #if ($translatedParameterDescriptor.type.getName() == 'java.lang.String' 219 - && ($parameterDescriptor.defaultValue == 'false' || $parameterDescriptor.defaultValue == 'true') 220 - && $macroDescriptor.parametersBeanClass.getSimpleName() == 'WikiMacroParameters') 221 - #set ($translatedParameterDescriptor.defaultValue = $parameterDescriptor.defaultValue == 'true') 222 - #set ($translatedParameterDescriptor.type = $translatedParameterDescriptor.defaultValue.getClass()) 223 - #end 224 - #set ($htmlDisplayerParameters = {'name': $parameterDescriptor.id}) 225 - #if ($translatedParameterDescriptor.group) 226 - #set ($discard = $htmlDisplayerParameters.put('data-property-group', 227 - $stringtool.join($translatedParameterDescriptor.group, '/'))) 228 - #end 229 - #set ($translatedParameterDescriptor.editTemplate = $services.display.html.display( 230 - $translatedParameterDescriptor.type, $translatedParameterDescriptor.defaultValue, $htmlDisplayerParameters, 'edit' 231 - )) 232 - #if ("$!translatedParameterDescriptor.editTemplate" == '') 233 - #set ($translatedParameterDescriptor.editTemplate = "#getMacroParameterEditTemplate( 234 - $translatedParameterDescriptor)") 235 - #end 236 - #set ($translatedParameterDescriptor.editTemplate = $translatedParameterDescriptor.editTemplate.trim()) 237 - #fixDescriptorType($translatedParameterDescriptor) 238 - #set ($discard = $data.parameterDescriptorMap.put($entry.key, $translatedParameterDescriptor)) 239 - #end 240 - #if ($groupDescriptorTree.groups) 241 - #set ($data.groupDescriptorTree = $groupDescriptorTree.groups) 242 - #end 243 - #set ($data.requiredSkinExtensions = "#ckeditor_getRequiredSkinExtensions()") 244 244 #end 245 245 246 -#macro (fixDescriptorType $descriptor) 247 - ## The goal of this code is to obtain a normalized string representation of the type specified in the descriptor. 248 - ## See XCOMMONS-1583: Define a stable way to serialize types 249 - ## 250 - ## The type specified in the descriptor can be any implementation of java.lang.reflect.Type, not necessarily a 251 - ## java.lang.Class. We can't use toString() because the return of Class#toString() is different than Class#getName(). 252 - ## We can't use Type#getTypeName() either because the access to this method is restricted from Velocity. The only 253 - ## option for now is to try #getName() first and fall back on #toString() for types that are not instances of 254 - ## java.lang.Class. 255 - #set ($typeName = $descriptor.type.getName()) 256 - #if ("$!typeName" == '') 257 - ## Probably not a java.lang.Class. Fall back on #toString(). 258 - #set ($typeName = "$!descriptor.type") 259 - #end 260 - ## Remove whitespace from the type name in order to have a single string representation. 261 - #set ($descriptor.type = $typeName.replaceAll('\s+', '')) 262 -#end 263 - 264 -## Builds the group tree with the following structure: 265 -## 266 -## { 267 -## 'parentGroupId': { 268 -## 'id': 'parentGroupId', 269 -## 'name': 'Parent Group', 270 -## 'feature': 'someFeature', 271 -## 'groups': { 272 -## 'childGroupId': {...}, 273 -## ... 274 -## } 275 -## }, 276 -## ... 277 -## } 278 -#macro (handleMacroParameterGroup $groupDescriptor $groupDescriptorTree $translatedParameterDescriptor) 279 - #if ($groupDescriptor.group && $groupDescriptor.group.size() > 0) 280 - #set ($translatedParameterDescriptor.group = $groupDescriptor.group) 281 - #set ($parentGroup = $groupDescriptorTree) 282 - #foreach ($groupId in $groupDescriptor.group) 283 - #if (!$parentGroup.groups) 284 - #set ($parentGroup.groups = {}) 285 - #end 286 - #set ($childGroup = $parentGroup.groups.get($groupId)) 287 - #if (!$childGroup) 288 - #if ($groupId == $translatedParameterDescriptor.id) 289 - #set ($groupName = $translatedParameterDescriptor.name) 290 - #else 291 - #set ($groupTranslationKey = "${macroTranslationKey}.group.$groupId") 292 - #set ($groupName = "#maybeTranslate(""${groupTranslationKey}.name"" $groupId)") 293 - #end 294 - #set ($childGroup = { 295 - 'id': $groupId, 296 - 'name': $groupName 297 - }) 298 - #set ($discard = $parentGroup.groups.put($groupId, $childGroup)) 299 - #end 300 - #set ($parentGroup = $childGroup) 301 - #end 302 - #if ("$!groupDescriptor.feature" != '') 303 - #set ($parentGroup.feature = $groupDescriptor.feature) 304 - #end 305 - #elseif ($groupDescriptor.feature) 306 - ## This group is made of a single parameter. The feature then refers to this parameter. 307 - #set ($translatedParameterDescriptor.feature = $groupDescriptor.feature) 308 - #end 309 -#end 310 - 311 -#macro (getMacroParameterEditTemplate $translatedParameterDescriptor) 312 - #if ($translatedParameterDescriptor.type.getName() == 'boolean' 313 - || $translatedParameterDescriptor.type.getName() == 'java.lang.Boolean') 314 - <input type="checkbox" name="$escapetool.xml($translatedParameterDescriptor.id)" value="true"/>## 315 - ## We need to submit something in case the checkbox is not checked. 316 - <input type="hidden" name="$escapetool.xml($translatedParameterDescriptor.id)" value="false"/> 317 - #elseif ($translatedParameterDescriptor.type.isEnum()) 318 - #if ($translatedParameterDescriptor.defaultValue) 319 - #set ($enumValues = $translatedParameterDescriptor.defaultValue.values()) 320 - #else 321 - ## A parameter of type enum that doesn't have a default value is very unlikely. We attempt to read the list of 322 - ## possible values from the enum type in this case, which is currently forbidden, but at least it will generate 323 - ## a warning in the logs that will help us investigate the problem. 324 - #set ($enumValues = $translatedParameterDescriptor.type.getEnumConstants()) 325 - #end 326 - <select name="$escapetool.xml($translatedParameterDescriptor.id)">## 327 - #foreach ($enumValue in $enumValues) 328 - #set ($value = $enumValue.name()) 329 - #set ($label = "#maybeTranslate(""${parameterTranslationKey}.value.$value"" $enumValue)") 330 - <option value="$escapetool.xml($value)">$escapetool.xml($label)</option>## 331 - #end 332 - </select> 333 - #else 334 - <input type="text" name="$escapetool.xml($translatedParameterDescriptor.id)"/> 335 - #end 336 -#end 337 - 338 338 #macro (maybeTranslate $key $defaultValue) 339 339 #if ($services.localization.get($key)) 340 340 $services.localization.render($key)## ... ... @@ -384,9 +384,19 @@ 384 384 $response.sendError(404, $exceptiontool.getRootCauseMessage($job.status.error)) 385 385 #end 386 386 #end 387 -{{/velocity}} 388 388 389 -{{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) 390 390 #if ("$!request.action" == 'install') 391 391 #if ($services.csrf.isTokenValid($request.form_token)) 392 392 #installMacroExtension($request.extensionId, $request.extensionVersion) ... ... @@ -393,18 +393,18 @@ 393 393 #else 394 394 $response.sendError(403) 395 395 #end 396 -#elseif ("$!request.data" != '') 397 - #set ($data = $NULL) 398 - #if ($request.data == 'list') 399 - #getMacroList($request.syntaxId) 400 - #elseif ($request.data == 'descriptor') 401 - #maybeGetMacroDescriptor($request.macroId) 402 - #end 403 - #if ($data) 404 - #set ($discard = $response.setContentType('application/json')) 405 - $jsontool.serialize($data) 406 - #else 407 - $response.sendError(404) 408 - #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) 409 409 #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 410 410 {{/velocity}}