Wiki-Quellcode von LinkSuggestions

Zuletzt geändert von admin am 2025/02/23 19:33

Verstecke letzte Bearbeiter
admin 1.1 1 {{template name="hierarchy_macros.vm"/}}
2
3 {{include reference="XWiki.SuggestSolrMacros"/}}
4
5 {{include reference="XWiki.DocumentTreeMacros"/}}
6
7 {{include reference="CKEditor.VelocityMacros" /}}
8
9 {{velocity output="false"}}
10 #macro (setIcon $suggestion $icon)
11 #set ($iconMetaData = $services.icon.getMetaData($icon))
12 #if ($iconMetaData)
13 #set ($suggestion.iconURL = "$!iconMetaData.url")
14 #set ($suggestion.iconClass = "$!iconMetaData.cssClass")
15 #else
16 #set ($suggestion.iconURL = $xwiki.getSkinFile("icons/silk/${icon}.png"))
17 #set ($suggestion.iconClass = '')
18 #end
19 #end
20
21 #set ($entityTypeToLinkType = {
22 'SPACE': 'space',
23 'DOCUMENT': 'doc',
24 'ATTACHMENT': 'attach'
25 })
26
27 #macro (getEntitySuggestion $entityReference $suggestion)
28 #set ($typed = "$entityReference.type" != 'DOCUMENT')
29 #set ($hint = "#hierarchy($entityReference {'local': true, 'excludeSelf': true, 'plain': true})")
30 #set ($discard = $suggestion.putAll({
31 'id': "$entityReference.type.toString().toLowerCase():$services.model.serialize($entityReference, 'default')",
32 'url': $xwiki.getURL($entityReference),
33 'reference': $services.model.serialize($entityReference, 'compact', $doc.documentReference),
34 'type': $entityTypeToLinkType.get($entityReference.type.toString()),
35 'typed': "$typed",
36 'label': $entityReference.name,
37 'hint': $services.xml.unescape($hint.trim())
38 }))
39 #end
40
41 #macro (getDocumentSuggestion $documentReference $suggestion)
42 #getEntitySuggestion($documentReference $suggestion)
43 #set ($targetDoc = $xwiki.getDocument($documentReference))
44 #if ($targetDoc.getObject('XWiki.XWikiUsers'))
45 #getUserAvatarURL($documentReference $avatarURL 30)
46 #if ($avatarURL.specified)
47 #set ($suggestion.iconURL = $avatarURL.url)
48 #set ($suggestion.iconClass = '')
49 #else
50 #setIcon($suggestion 'user')
51 #end
52 #set ($suggestion.label = $xwiki.getPlainUserName($documentReference))
53 ## All the user profiles are in the same location so it doesn't make sense to display it.
54 #set ($suggestion.hint = '')
55 #else
56 #set ($suggestion.label = $targetDoc.plainTitle)
57 #setIcon($suggestion, 'page_white')
58 #end
59 #end
60
61 #macro (getAttachmentSuggestion $attachmentReference $suggestion)
62 #getEntitySuggestion($attachmentReference $suggestion)
63 #setIcon($suggestion 'attach')
64 #end
65
66 #macro (getSuggestion $entityReference $suggestion)
67 #if ("$!entityReference.type" == 'DOCUMENT')
68 #getDocumentSuggestion($entityReference $suggestion)
69 #elseif ("$!entityReference.type" == 'ATTACHMENT')
70 #getAttachmentSuggestion($entityReference $suggestion)
71 #else
72 #getEntitySuggestion($entityReference $suggestion)
73 #end
74 #end
75
76 #macro (getSuggestions $entityReferences $suggestions)
77 #foreach ($entityReference in $entityReferences)
78 #set ($suggestion = {})
79 #getSuggestion($entityReference $suggestion)
80 #set ($discard = $suggestions.add($suggestion))
81 #end
82 #end
83
84 #macro (searchEntities $input $limit $entityReferences)
85 #if ($xwiki.exists('XWiki.SuggestSolrMacros'))
86 #searchEntitiesSolr($input $limit $entityReferences)
87 #elseif ($xwiki.exists('XWiki.DocumentTreeMacros'))
88 #searchEntitiesDatabase($input $limit $entityReferences)
89 #end
90 #end
91
92 #macro (searchEntitiesSolr $input $limit $entityReferences)
93 ## Enable prefix search.
94 #set ($input = "$input* $input")
95 #set ($results = [])
96 #searchDocumentsSolr($input $limit $results)
97 #searchAttachmentsSolr($input $limit $results)
98 #set ($results = $collectiontool.sort($results, 'score:desc'))
99 #foreach ($result in $results.subList(0, $mathtool.min($results.size(), $limit)))
100 #set ($discard = $entityReferences.add($services.solr.resolve($result)))
101 #end
102 #end
103
104 #macro (searchDocumentsSolr $input $limit $results)
105 #set ($params = [
106 'fq=type:DOCUMENT',
107 'qf=title^6 name^4 doccontent^2 doccontentraw',
108 'fl=type wiki spaces name score',
109 "bq=author:""$services.model.serialize($xcontext.userReference, 'default')""",
110 "bq=creator:""$services.model.serialize($xcontext.userReference, 'default')""",
111 'bf=recip(ms(NOW,date),3.16e-11,1,1)'
112 ])
113 #executeSolrQuery($input $params $limit $results)
114 #end
115
116 #macro (searchAttachmentsSolr $input $limit $results)
117 #set ($params = [
118 'fq=type:ATTACHMENT',
119 'qf=filename^4 attcontent',
120 'fl=type wiki spaces name filename score',
121 "bq=attauthor:""$services.model.serialize($xcontext.userReference, 'default')""",
122 "bq=space_exact:""$services.model.serialize($doc.documentReference.parent, 'local')""",
123 'bf=recip(ms(NOW,attdate_sort),3.16e-11,1,1)'
124 ])
125 #executeSolrQuery($input $params $limit $results)
126 #end
127
128 #macro (executeSolrQuery $text $params $limit $results)
129 #set ($paramsAsString = $stringtool.join($params, $util.newline))
130 #createSearchSuggestQuery($paramsAsString $text $query)
131 #set ($discard = $query.setLimit($limit))
132 #set ($discard = $results.addAll($query.execute()[0].results))
133 #end
134
135 #macro (searchEntitiesDatabase $input $limit $entityReferences)
136 #set ($halfLimit = $limit / 2)
137 #searchDocumentsDatabase($input $halfLimit)
138 #set ($discard = $entityReferences.addAll($documentReferences))
139 #searchAttachmentsDatabase($input $halfLimit)
140 #set ($discard = $entityReferences.addAll($attachmentReferences))
141 #end
142 {{/velocity}}
143
144 {{velocity wiki="false"}}
145 #set ($input = $request.input.trim())
146 #if ("$!input" != '' || $input == '')
147 #set ($entityReferences = [])
148 #searchEntities($input 8 $entityReferences)
149 #set ($suggestions = [])
150 #getSuggestions($entityReferences $suggestions)
151 #if ($xcontext.action == 'get')
152 #set ($discard = $response.setContentType('application/json'))
153 #end
154 $jsontool.serialize($suggestions)
155 #end
156 {{/velocity}}