Changes for page MentionsMacro


on 2021-01-27 09:18

on 2020-06-29 20:57
Summary
Details
- XWiki.JavaScriptExtension[0]
-
- Code
-
... ... @@ -1,9 +1,19 @@ 1 1 require.config({ 2 2 paths: { 3 - 'xwiki-suggestUsers': $jsontool.serialize($xwiki.getSkinFile('uicomponents/suggest/suggestUsersAndGroups.js', true)) 3 + 'xwiki-suggestUsers': "$xwiki.getSkinFile('uicomponents/suggest/suggestUsersAndGroups.js', true))" + 4 + "?v=$escapetool.url($xwiki.version)" 4 4 } 5 5 }); 6 -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 = {}; 7 7 8 8 /** 9 9 * Get the current wiki scope for displaying global, local or global and local users ... ... @@ -10,28 +10,38 @@ 10 10 */ 11 11 const userScope = "$!services.wiki.user.userScope"; 12 12 13 - // see https://stackoverflow.com/a/6248722/657524 14 - function random6chars() { 15 - // I generate the UID from two parts here 16 - // to ensure the random number provide enough bits. 17 - var firstPart = (Math.random() * 46656) | 0; 18 - var secondPart = (Math.random() * 46656) | 0; 19 - firstPart = ("000" + firstPart.toString(36)).slice(-3); 20 - secondPart = ("000" + secondPart.toString(36)).slice(-3); 21 - return firstPart + secondPart; 22 - } 23 - 24 24 /** 25 25 * Compute a new unique anchor for the given reference. 26 - * The unique anchor isbasedonthementionned user id,concatenaedwitha random stringof6 alphanumeric27 - * c haracters.28 - * Thechancesofcollisionare quite low,about46kmentionsforagivenmentioneduseronagivenpage (assuming29 - * 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. 30 30 */ 31 31 const getAnchor = function (reference) { 32 - const refId = reference.replace(/[.:]/g, '-'); 33 - const randomId = random6chars(); 34 - 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; 35 35 }; 36 36 37 37 const search = function (text, callback) { ... ... @@ -115,3 +115,4 @@ 115 115 }; 116 116 }); 117 117 }); 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