Changes for page MentionsMacro


on 2020-12-02 06:26

on 2020-06-29 20:57
Summary
Details
- XWiki.JavaScriptExtension[0]
-
- Code
-
... ... @@ -4,7 +4,16 @@ 4 4 "?v=$escapetool.url($xwiki.version)" 5 5 } 6 6 }); 7 -require(['deferred!ckeditor', 'xwiki-suggestUsers', 'jquery', 'xwiki-meta'], function (ckeditorPromise, suggestUsers, $, xm) { 7 +require(['deferred!ckeditor', 'xwiki-suggestUsers', 'jquery'], function (ckeditorPromise, suggestUsers, $) { 8 + /* 9 + * Keep records of the added anchors during the current edit session. 10 + * Note that the anchors saved here are not only the ones added on the current session, 11 + * but also those already present in the document. 12 + * For more information, see #getAnchor. 13 + * The information are stored on the form: 14 + * { reference: Array<String> } 15 + */ 16 + const anchorIds = {}; 8 8 9 9 /** 10 10 * Get the current wiki scope for displaying global, local or global and local users ... ... @@ -11,28 +11,38 @@ 11 11 */ 12 12 const userScope = "$!services.wiki.user.userScope"; 13 13 14 - // see https://stackoverflow.com/a/6248722/657524 15 - function random6chars() { 16 - // I generate the UID from two parts here 17 - // to ensure the random number provide enough bits. 18 - var firstPart = (Math.random() * 46656) | 0; 19 - var secondPart = (Math.random() * 46656) | 0; 20 - firstPart = ("000" + firstPart.toString(36)).slice(-3); 21 - secondPart = ("000" + secondPart.toString(36)).slice(-3); 22 - return firstPart + secondPart; 23 - } 24 - 25 25 /** 26 26 * Compute a new unique anchor for the given reference. 27 - * The unique anchor isbasedonthementionned user id,concatenaedwitha random stringof6 alphanumeric28 - * c haracters.29 - * Thechancesofcollisionare quite low,about46kmentionsforagivenmentioneduseronagivenpage (assuming30 - * thatnomentionsare ever deleted).25 + * The uniqueness of the anchor is given by two mechanisms: 26 + * - retrieve on first call all mentions available on current document and store them 27 + * - then use that information to compute a next anchor not overlapping an existing one on the current document. 28 + * The mechanism is obviously not perfect and might be improved later but should be enough for most usage. 31 31 */ 32 32 const getAnchor = function (reference) { 33 - const refId = reference.replace(/[.:]/g, '-'); 34 - const randomId = random6chars(); 35 - return refId + '-' + randomId; 31 + var existingIds; 32 + 33 + if (anchorIds.hasOwnProperty(reference)) { 34 + existingIds = anchorIds[reference]; 35 + } else { 36 + existingIds = []; 37 + $('.xwiki-mention').each(function() { 38 + var mention = $(this); 39 + if (mention.attr('data-reference') === reference) { 40 + existingIds.push(mention.attr('id')); 41 + } 42 + }); 43 + anchorIds[reference] = existingIds; 44 + } 45 + 46 + var counter = existingIds.length + 1; 47 + var refId = reference.replace(/[.:]/g, '-'); 48 + var proposedAnchor = refId + "-" + counter; 49 + while (existingIds.indexOf(proposedAnchor) != -1) { 50 + counter++; 51 + proposedAnchor = refId + "-" + counter; 52 + } 53 + anchorIds[reference].push(proposedAnchor); 54 + return proposedAnchor; 36 36 }; 37 37 38 38 const search = function (text, callback) { ... ... @@ -116,3 +116,4 @@ 116 116 }; 117 117 }); 118 118 }); 138 +
- XWiki.StyleSheetExtension[0]
-
- Code
-
... ... @@ -11,7 +11,3 @@ 11 11 .xwiki-mention.removed { 12 12 text-decoration: line-through; 13 13 } 14 - 15 -blockquote.mention-quote { 16 - font-size: inherit; 17 -}
- XWiki.WikiMacroClass[0]
-
- Macro code
-
... ... @@ -1,16 +1,26 @@ 1 1 {{velocity}} 2 2 #set ($reference = $wikimacro.parameters.reference) 3 3 #set ($style = $wikimacro.parameters.style) 4 -#set ($type = "$!wikimacro.parameters.type") 5 -#set ($content = $services.mentions.format($reference.reference, $style, $type)) 6 6 #set ($anchor = $wikimacro.parameters.anchor) 7 -#set ($isCurrentUser = $xcontext.userReference == $reference.reference && ($type == '' || $type == 'user')) 5 +#set ($userProperties = $services.user.getProperties($reference)) 6 +#set ($firstName = $userProperties.getFirstName()) 7 +#set ($lastName = $userProperties.getLastName()) 8 +#set ($isCurrentUser = $xcontext.userReference == $reference.reference) 8 8 #set ($cssClasses = ['xwiki-mention', 'user']) 9 9 #if ($isCurrentUser) 10 10 #set ($discard = $cssClasses.add('self')) 11 11 #end 13 +#if ("$!firstName" == "") 14 + #set($content = "@$reference.reference.name") 15 +#elseif ($style == 'FIRST_NAME') 16 + #set($content = "@$firstName") 17 +#elseif ($style == 'LOGIN') 18 + #set($content = "@$reference.reference.name") 19 +#else 20 + #set($content = "@$firstName $!lastName") 21 +#end 12 12 #set ($link = $xwiki.getURL($reference.reference, 'view')) 13 13 {{html}} 14 -<a id="$anchor" class="$stringtool.join($cssClasses, ' ')" data-reference="$services.model.serialize($reference.reference, ' default')" href="$link">$content</a>24 +<a id="$anchor" class="$stringtool.join($cssClasses, ' ')" data-reference="$services.model.serialize($reference.reference, 'compactwiki')" href="$link">$content</a> 15 15 {{/html}} 16 16 {{/velocity}}
- XWiki.WikiMacroParameterClass[3]
-
- Parameter description
-
... ... @@ -1,1 +1,0 @@ 1 -The type of mentioned actor. - Parameter name
-
... ... @@ -1,1 +1,0 @@ 1 -type - Parameter type
-
... ... @@ -1,1 +1,0 @@ 1 -java.lang.String