Wiki-Quellcode von LinkSuggestions
Zuletzt geändert von admin am 2025/02/23 19:33
Verstecke letzte Bearbeiter
| author | version | line-number | content |
|---|---|---|---|
| |
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}} |