Configurable hidden macros categories

The list of categories hidden by default, previously hard-coded to Internal and Deprecated, can now be configured using the rendering.transformation.macro.hiddenCategories property in

#-# [Since 14.8RC1]
#-# Override the default hidden macro categories.
#-# Note: the categories are case sensitive.
#-# The default value is:
# rendering.transformation.macro.hiddenCategories = Internal,Deprecated
#-# For instance, to make the "Development" category hidden by default, in addition to the "Internal" and
#-# "Deprecated" categories, you'd use:
# rendering.transformation.macro.hiddenCategories = Development,Internal,Deprecated

Localization API

We added two methods to the LocalizationManager:

  • a helper method to search for a given translation key in the specified locale and to render it as plain text:
    String getTranslationPlain(String key, Locale locale, Object... parameters)
  • a method to get the configured default locale:
    Locale getDefaultLocale()

The first one was already available in the script service (under a different name: $services.localization.render()), so we exposed the second one too:


Checkout the Localization Module documentation for more information.

Provide Raw content filtering mechanism for macros

A new rendering transformation component is now provided for macros to allow perform filtering of RawBlocks. A new API is provided, RawBlockFilter, with a first implementation for HTML raw blocks, used in html macro.

(X)HTML 5 parsers added

Two new parsers for HTML 5 and XHTML 5 have been added to the XWiki rendering framework. They are largely based on the existing parser for XHTML 1.0 but support <figure> and <figcaption> tags. The former is based on the latter, but passes the given HTML code to the HTML cleaner first to obtain valid XML. These parsers are the basis for the new HTML 5 support in the WYSIWYG editor but can also be used in other contexts to convert HTML 5 to XDOM, e.g., in the context of an importer.

HTML 5 support in the WYSIWYG editor

The WYSIWYG Editor Module now uses HTML 5. See below for additional notes on backwards-compatibility. Not all HTML 5 features are supported, yet, the main new feature is support for parsing figures with captions. There should be a closer match between the HTML code in the editor and the HTML code in view mode but this might require adaptations for WYSIWYG editors and extensions extending them. This has also consequences for renderers that should handle figure and figure caption events not just in macro contexts (due to the figure macro).

DocumentVersionReference is part of the model API

The DocumentVersionReference is now part of the model API: this reference API allows to manipulate a DocumentReference with a specific version attribute, allowing to specifically target a version of the document.

Changes to "Own Event" and "System Event" notification filters

The "Own Event" and "System Event" notification filters are not blocking anymore the notifications that target explicitly the user. See the Notification Application documentation for more information about these filters.

Indexing User

A new section to define a dedicated indexing user has been added in the "Search" category in the wiki administration.

The search index usually runs without a dedicated user. In some cases this creates minor issues when indexing the title of pages, e.g. in case of a closed wiki, where one cannot access as guest user the sheet that computes the user profile pages title as "Profile of «firstname» «lastname»". This is not possible unless the indexer is associated with a user that has access to the corresponding sheet. A new section in the "Search"  category of the wiki administration allows to set an "indexing user", which is used to access the sheets which might be used to compute page titles.

If this setting is left empty, the stored plain title of the page name is shown as title of the search result for affected pages.

Please read the description and especially about the security implications before setting an indexing user.

Cluster members are uniquely identified

Each member of a cluster is now uniquely identified. The id is automatically generated once at startup and stored in the permanent directory.

Hidden macro categories API

The MacroCategoryManager role gives access to the list of hidden macro categories.

public interface MacroCategoryManager
   // [...]

     * @return the set of hidden categories (e.g., "Deprecated, Internal")
     * @since 14.8RC1

   default Set<String> getHiddenCategories()
       return Set.of();

PDF Export Limits

The PDF Export Application can now be configured to:

  • limit the amount of content that can be included in a single PDF export; this can be done either from the PDF Export wiki administration section using the "Maximum content size" property or, globally, from
    # [Since 14.10]
    # The maximum content size, in kilobytes (KB), an user is allowed to export to PDF; in order to compute the content size
    # we sum the size of the HTML rendering for each of the XWiki documents included in the export; the size of external
    # resources, such as images, style sheets, JavaScript code is not taken into account; 0 means no limit;
  • limit the number of PDF exports that can be done in parallel; this can be specified only globally, from
    # [Since 14.10]
    # The maximum number of PDF exports that can be executed in parallel (each PDF export needs a separate thread).

Replace the Livetable from the attachments tab with a LiveData

The attachments Livetable was updated to use the new LiveData.

Table of contents is easier to style

The ordered or unordered list element at the root of the table of contents macro now has the wikitoc class attribute such that it is easier to style via CSS.

New event when livedata entries are displayed

A new javascript event xwiki:livedata:entriesUpdated is now triggered for LiveData when the entries are displayed: this event can be listened to when an extension need to augment the data.

Breadcrumbs on Copy, Delete and Rename Operations

When a delete, copy or rename operation is started or its progress is displayed, the breadcrumbs are now visible at the top of the page. This makes it easier to navigate from a deleted, copied or renamed page.

PDF File Name

The file name suggested by the web browser when downloading a PDF generated by the PDF Export Application is now, by default, the title of the wiki page from where the export was triggered (instead of the Java UUID used for the temporary resource name). Checkout the documentation for more information.

Export Without Paged.js

If you're getting a timeout while doing a PDF export and the exported content is not too big then you probably hit a Paged.js bug. Paged.js is the JavaScript library we use to layout the exported content in print pages. You can overcome this by unchecking the Table of Contents, Header and Footer from the PDF Export Options modal and then triggering the export again. This time the export will be done without Paged.js, relying solely on the web browser, which shouldn't pose any problems. Of course, the downside is that you loose the Table of Contents, Header and Footer. Fortunately Paged.js is under active development so we hope its bugs will be fixed soon.

Enable the lightbox view for images by default

The lighbox feature is now enabled by default.

Parameterized and translatable exceptions

A org.xwiki.logging.AbstractMessageException is provided to make easier to create exceptions with the same features as org.xwiki.logging.Message. See for more details.

Extension previous identifiers

It's now possible to explicitly indicate a list of previous identifier (or an empty list) if you don't want to import all the features along with the extension in the Repository Application. See Maven for more details.

User-scope translations require script right

Translations with user scope require script right now. A new configuration option allows disabling this check.

Automatically generated anchors for images

XWiki now automatically generates anchors (ids) for images as it does for heading. This makes it easier to, e.g., reference images using the Reference Macro. Automatically generated ids can be overridden by manually setting the image's id parameter.

Live Data extensions

A new JavaScript API has been added to Live Data that allows adding custom panels to extend to functionality of the Live Data Macro.

Disabling lightbox for specific content

The image lightbox feature can now be disabled for an element and its children by adding xwiki-lightbox=false to the parent of the excluded content. This can be used by macros or extensions rendering images as part of the page content so that these images don't appear in the lightbox view.

Propose not yet installed macros

It's now possible for an admin to install and use a macro directly in the WYSIWYG macros picker. A list of not yet installed compatible macros is proposed at the end to improve discoverability. Note that in the future it'll be proposed to all users (even non-admins) for increased discoverability. Non-admins users will see a message asking them to contact an administrator to install the needed macro.

Display image popover at cursor location

The image popover will be now displayed at cursor location, to make it more visible and accessible.

Global Job Runner JavaScript Module

The xwiki-job-runner JavaScript module has been published in the global RequireJS configuration which means it can now be used directly without specifying its path:

require(['xwiki-job-runner'], function(JobRunner) {

See the Job Module documentation for more information.

Display image ids in the Lightbox

Users can now copy to the image ID (which is either manually added using the Id Macro, or automatically generated) to clipboard from the lightbox menu or from the image toolbar, without the need to open the lightbox. From the image toolbar, users can also get the direct link to the image, which can then be shared easily.

Change the default font size used by the Formula macro

It is now possible to set the default font size to be used by the formula macro using the configuration key macro.formula.defaultFontSize. See the formula macro documentation to learn more.

Temporary Resource Script Service

A new script service is available to check if a temporary resource exists and to get its URL:

#set ($tempResourceReference = ...)
#if ($services.resource.temporary.exists($tempResourceReference))

Live Data events

While Live Data always triggered some events in the browser, they were so far only usable internally as they were triggered on a detached element. This has been fixed and a new instanceCreated event has been added that is triggered just after a new instance has been created.

Block not allowed macro install

The Install button is disabled for user who don't have the right to install a macro in the WYSIWYG macro picker.

Contains queries for events

The SimpleEventQuery in the Event Stream Module now also support querying for text that is contained anywhere in a field.

Temporary Resource Script Service

A new script service is available to check if a temporary resource exists and to get its URL:

#set ($tempResourceReference = ...)
#if ($services.resource.temporary.exists($tempResourceReference))

Active Installs 2

New anonymous information is now sent by Active Installs (number of pages and number of users in both the main wiki and the subwikis).

Block not allowed macro install

The Install button is disabled for user who don't have the right to install a macro in the WYSIWYG macro picker.

Global Job Runner JavaScript Module

The xwiki-job-runner JavaScript module has been published in the global RequireJS configuration which means it can now be used directly without specifying its path:

require(['xwiki-job-runner'], function(JobRunner) {

See the Job Module documentation for more information.

Mimetype provided for attachments in Document Tree response

The mimetype is now provided for attachments when calling XWiki.Document to retrieve the document tree hierarchy.

HTML cleaner supports HTML5

The HTML cleaner in the XML Module now supports cleaning HTML 5 into XHTML 5 when setting the HTML version parameter.

Figure Type Identification

A data-xwiki-rendering-figure-type property is added to the rendered figures macro. Its value is table if the figure contains a single table, and figure otherwise.

In-place editing supports creating objects

The in-place editor for object properties now also supports creating objects by specifying data-object-policy="updateOrCreate" in the <dt>-tag. The also-introduced velocity macro #createObjectAndPropertyIfMissing allows to (temporarily) add an object and a property to the current document using a reference to the property like "Some.UsefulClass[5].status" which is useful for displaying the default value of the property when the object doesn't exist in the document. This can be used to introduce new properties in a docextra tab, see this example.

Macro Categories listed in the available macros page

The list of all the categories of the macros are now listed in the available macros page.

Add original metadata author to XWikiDocument

A new concept of author has been introduced and the way authors are managed in XWikiDocument have been refactored to rely on a unique interface DocumentAuthors.

We now distinguish 4 different kind of authors information:

  • the creator: there's no ambiguity it's the user who created the document
  • the content author: it's the author who performed a change in the content of the document, by opposition with changing a metadata of the document such as an xobject, or an attachment. We distinguish it for security reason since the content of the document might contain scripts that are executed when viewing the document
  • the effective metadata author: it's the author which has been used to save any change in the document, content or not. So changing the content of the document will update both this author, and the content author. However, updating an attachment of a document will only update this author, not the content author. 
  • the original metadata author: it's finally the author you see displayed in the interface, it's most of the time the same as the effective metadata author but in some usecases it might be different. For example when a script wants to allow a user to perform a save without changing the effective author for security reasons, but wants to display the author who actually triggers the save.

Only the original metadata author has been introduced in this release, but all authors have been renamed and now relies on UserReference.

Provide a way to list the categories of a macro

The MacroCategoryManager from Rendering Macro Transformation provides a getMacroCategories operation that takes a MacroId object and return the set of categories of the macro. The default implementation takes into account the macro categories overriding that can be done in

Inline template execution

It's now possible to execute a template inline. There was nothing previously in the TemplateManager to indicate that the template was meant to be inserted in an inline content, and it was not really working properly for the template macro. See Template Module for more details on how to use the TemplateManager.

Script service to access the macro categories

Calling $services.rendering.getMacroCategories($macroId) returns a Set of the categories of the macro. See XWiki Platform - Rendering - XWiki-specific Implementation.

New HTML Sanitizer

A new HTML Sanitizer component has been added that allows checking if a certain HTML element, attribute and attribute value are considered safe according to the current configuration. This can be used when validating user input. The sanitizer also supports SVG and MathML with the features available when they are embedded in HTML documents.

It is now possible to provide new redirection strategies

The RedirectionFilter role allows developers to define domain specific redirection logic.

Improved Less SSX Caching

When writing a SSX using LESS, the SSX request parameters are now taken into account for caching the results of the LESS compilation output.

Less strict code verification in the reset password system

We allow to relax a bit the reset password email link security mechanism to avoid it being revoked at first access, in order to avoid issues with software that checks email links. This mechanism can be used by changing a property in

#-# [Since 13.10.1]
#-# [Since 14.0RC1]
#-# Define the lifetime of the token used for resetting passwords in minutes. Note that this value is only used after
#-# first access.
#-# Default value is 0 meaning that the token is immediately revoked when first accessed.
#-# Use a different value if the reset password email link might be accessed several times (e.g. in case of using an
#-# email link verification system): in such case the user will have the defined lifetime to use again the email link.
#-# The default is:
# security.authentication.resetPasswordTokenLifetime = 0

Improved Macro picker for "not installed" macros

The WYSIWYG editor allows selecting not yet installed macros in the macros picker, but it was missing some usability information. You now see which recommended extensions a macro belong to, and you get a more explicit warning about what will happen when you select such macros.

Ability to exclude some locations from the Location Picker

The Location Picker Macro exposes an additional parameter exclusions allowing to exclude some locations (nested pages) from the list of locations that can be picked.

Notification handling memory improvement

The dispatching of notifications to the user has been rewritten to reduce a lot the memory required for it and improve reliability.

HTML 5 support in the HTML Macro

The HTML macro supports HTML 5 and switches to HTML 5 whenever the content is output as HTML 5. This means that in most cases (for example, when using the default Flamingo Skin), the HTML macro can be used to insert new HTML tags like the <video>-tag into the content of a page while having the clean-parameter enabled.

PDF Export Application Improvements

The PDF Export Application (which is still experimental and not bundled in XWiki Standard) has a couple of improvements:

  • The user's own web browser is now used by default to generate the PDF, but the application can still be configured to use a remote Chrome instance or one that runs inside a Docker container. Check out the migration section below for more information.
  • When a remote (or Docker based) Chrome instance is used for PDF printing the application now checks if connection is working before showing the PDF export options. An error message is shown in case the Chrome browser can't be accessed.
  • In case of PDF export failure, the last error message from the PDF export job log is now displayed.
  • The underlying JavaScript library used for paginating the content before printing to PDF (PagedJS) has been upgraded to its latest version.

HTML 5 support in the rendered differences

The rendered differences between different revisions of a page now correctly display HTML 5 tags like figures and captions for changed content. This is in particular relevant with the new figure caption support but can also be good for custom HTML that includes tags not supported by HTML 4.


Get Connected