Wiki source code of SolrMediaTypeFacet
Last modified by Frank Fock on 2024/02/07 14:48
Hide last authors
author | version | line-number | content |
---|---|---|---|
![]() |
1.1 | 1 | {{velocity output="false"}} |
2 | #macro (displaySearchFacetValues_mediaType $facetValues) | ||
3 | #set ($discard = $xwiki.ssx.use('Main.SolrMediaTypeFacet')) | ||
4 | #set ($discard = $xwiki.jsx.use('Main.SolrMediaTypeFacet')) | ||
5 | #set ($categoryMap = $solrConfig.facet.mediaType.categories) | ||
6 | #groupMediaTypes($facetValues $categoryMap true) | ||
7 | ## We also need to group some technical media types inside a category. | ||
8 | #set ($subcategoryMap = $solrConfig.facet.mediaType.subcategories) | ||
9 | #foreach ($facetValue in $facetValues) | ||
10 | #set ($subcategories = $subcategoryMap.get($facetValue.id)) | ||
11 | #if ($subcategories) | ||
12 | #groupMediaTypes($facetValue.mediaTypesWithCounts $subcategories) | ||
13 | ## Update the list of media types to be able to unselect all subcategories when a category is selected. | ||
14 | #set ($discard = $facetValue.mediaTypes.clear()) | ||
15 | #foreach ($mediaType in $facetValue.mediaTypesWithCounts) | ||
16 | #set ($discard = $facetValue.mediaTypes.add($mediaType.name)) | ||
17 | #end | ||
18 | #end | ||
19 | #end | ||
20 | #displayMediaTypesWithPagination($facetValues) | ||
21 | #end | ||
22 | |||
23 | #macro (groupMediaTypes $mediaTypes $groups $groupRemainingMediaTypes) | ||
24 | #set ($matchedGroups = []) | ||
25 | #set ($groupedMediaTypes = []) | ||
26 | #foreach ($entry in $groups.entrySet()) | ||
27 | #set ($group = { | ||
28 | 'id': $entry.key, | ||
29 | 'count': 0, | ||
30 | 'mediaTypes': [], | ||
31 | 'mediaTypesWithCounts': [] | ||
32 | }) | ||
33 | #foreach ($mediaType in $mediaTypes) | ||
34 | ## See if this media type is included in this group. | ||
35 | #foreach ($pattern in $entry.value) | ||
36 | #if ($mediaType.name == $pattern || $mediaType.name.startsWith($pattern) || $mediaType.name.endsWith($pattern)) | ||
37 | #set ($group.count = $group.count + $mediaType.count) | ||
38 | #set ($discard = $group.mediaTypes.add($mediaType.name)) | ||
39 | #set ($discard = $group.mediaTypesWithCounts.add($mediaType)) | ||
40 | #set ($discard = $groupedMediaTypes.add($mediaType)) | ||
41 | #break | ||
42 | #end | ||
43 | #end | ||
44 | #end | ||
45 | #if ($group.count > 0) | ||
46 | ## Compute the filter value. | ||
47 | #joinMediaTypes($entry.value $escapedFilterValue) | ||
48 | #set ($discard = $group.put('name', $escapedFilterValue)) | ||
49 | #set ($discard = $matchedGroups.add($group)) | ||
50 | #end | ||
51 | #end | ||
52 | #set ($discard = $mediaTypes.removeAll($groupedMediaTypes)) | ||
53 | #if ($groupRemainingMediaTypes && $mediaTypes && $mediaTypes.size() > 0) | ||
54 | #set ($other = { | ||
55 | 'id': 'other', | ||
56 | 'count': 0, | ||
57 | 'mediaTypes': [], | ||
58 | 'mediaTypesWithCounts': [] | ||
59 | }) | ||
60 | #set ($discard = $other.mediaTypesWithCounts.addAll($mediaTypes)) | ||
61 | #foreach ($mediaType in $mediaTypes) | ||
62 | #set ($other.count = $other.count + $mediaType.count) | ||
63 | #set ($discard = $other.mediaTypes.add($mediaType.name)) | ||
64 | #end | ||
65 | #joinMediaTypes($other.mediaTypes $escapedFilterValue) | ||
66 | #set ($discard = $other.put('name', $escapedFilterValue)) | ||
67 | #set ($discard = $mediaTypes.clear()) | ||
68 | #set ($discard = $mediaTypes.add($other)) | ||
69 | #end | ||
70 | #set ($discard = $mediaTypes.addAll($matchedGroups)) | ||
71 | ## Sort the media type groups based on the number of matches. | ||
72 | ## Note that the sort tool doesn't change the passed list. | ||
73 | #set ($sortedMediaTypes = $collectiontool.sort($mediaTypes, 'count:desc')) | ||
74 | #set ($discard = $mediaTypes.clear()) | ||
75 | #set ($discard = $mediaTypes.addAll($sortedMediaTypes)) | ||
76 | #end | ||
77 | |||
78 | #macro (joinMediaTypes $mediaTypes $return) | ||
79 | #set ($escapedMediaTypes = []) | ||
80 | #foreach ($mediaType in $mediaTypes) | ||
81 | ## Escape the characters that have special meaning in the filter query. | ||
82 | #set ($escapedMediaType = $mediaType.replaceAll('([/.+\-])', '\\$1')) | ||
83 | #if ($mediaType.indexOf('/') > 0) | ||
84 | ## Prefix. | ||
85 | #set ($escapedMediaType = "$escapedMediaType*") | ||
86 | #else | ||
87 | ## Suffix. | ||
88 | #set ($escapedMediaType = "*$escapedMediaType") | ||
89 | #end | ||
90 | #set ($discard = $escapedMediaTypes.add($escapedMediaType)) | ||
91 | #end | ||
92 | #set ($return = $NULL) | ||
93 | #setVariable("$return" "($stringtool.join($escapedMediaTypes, ' '))") | ||
94 | #end | ||
95 | |||
96 | #macro (displayMediaTypesWithPagination $categories) | ||
97 | #set ($limitRequestParameter = "l_$facetField.name") | ||
98 | #set ($categoryLimit = $numbertool.toNumber($request.getParameter($limitRequestParameter)).intValue()) | ||
99 | #if ("$!categoryLimit" == '') | ||
100 | #set ($categoryLimit = $solrConfig.facetPaginationStep) | ||
101 | #end | ||
102 | #set ($categoryLimit = $mathtool.max($mathtool.min($categoryLimit, $categories.size()), 0)) | ||
103 | <ul class="mediaTypes"> | ||
104 | #foreach ($category in $categories) | ||
105 | #if ($foreach.index < $categoryLimit) | ||
106 | <li> | ||
107 | ## Backup the selected values to be able to restore them afterwards. | ||
108 | #set ($facetRequestValuesBackup = $facetRequestValues) | ||
109 | ## When an entire category is selected we need to remove the values that were selected from that category. | ||
110 | #set ($facetRequestValues = []) | ||
111 | #if ($facetRequestValuesBackup) | ||
112 | #set ($discard = $facetRequestValues.addAll($facetRequestValuesBackup.subList(0, | ||
113 | $facetRequestValuesBackup.size()))) | ||
114 | #set ($discard = $facetRequestValues.removeAll($category.mediaTypes)) | ||
115 | #end | ||
116 | <div id="mediatype-$stringtool.remove($stringtool.substringBetween($category.name, '(', '\'), ' ')" | ||
117 | class="mediaTypeCategory">#displaySearchFacetValue($category {} 'displaySearchFacetValue_mediaType' true)</div> | ||
118 | ## When a media type is selected, it's category should be unselected. | ||
119 | #set ($facetRequestValues = []) | ||
120 | #if ($facetRequestValuesBackup) | ||
121 | #set ($discard = $facetRequestValues.addAll($facetRequestValuesBackup.subList(0, | ||
122 | $facetRequestValuesBackup.size()))) | ||
123 | #set ($discard = $facetRequestValues.remove($category.name)) | ||
124 | #end | ||
125 | <ul>#displaySearchFacetValuesLimited($category.mediaTypesWithCounts {} 'displaySearchFacetValue_mediaType' true)</ul> | ||
126 | ## Restore the selected values. | ||
127 | #set ($facetRequestValues = $facetRequestValuesBackup) | ||
128 | </li> | ||
129 | #else | ||
130 | #extendQueryString($url {$limitRequestParameter: [$mathtool.add($categoryLimit, $solrConfig.facetPaginationStep)]}) | ||
131 | <li><a href="$url" class="more">… $escapetool.xml($services.localization.render( | ||
132 | 'solr.facets.moreValues', [$mathtool.sub($categories.size(), $categoryLimit)]))</a></li> | ||
133 | #break | ||
134 | #end | ||
135 | #end | ||
136 | </ul> | ||
137 | #end | ||
138 | |||
139 | #macro (displaySearchFacetValue_mediaType $mediaType) | ||
140 | #if ($facetValue.id) | ||
141 | ## A media type category. | ||
142 | $services.localization.render("solr.filterBy.fileType.$facetValue.id") | ||
143 | #else | ||
144 | #set ($prettyName = $stringtool.substringAfter($mediaType, '/')) | ||
145 | ## Fonts have a dedicated category so we can remove the 'x-font-' prefix. | ||
146 | #set ($prettyName = $stringtool.removeStart($prettyName, 'x-font-')) | ||
147 | ## Non-standard media type, i.e. not registered with the Internet Assigned Numbers Authority (IANA). | ||
148 | #set ($prettyName = $stringtool.removeStart($prettyName, 'x-')) | ||
149 | ## Vendor specific media type. | ||
150 | #set ($prettyName = $stringtool.removeStart($prettyName, 'vnd.')) | ||
151 | ## Many media types end with '+xml' or something similar. Let's remove this part. | ||
152 | #set ($prettyName = $stringtool.substringBeforeLast($prettyName, '+')) | ||
153 | ## Attempt to translate the pretty name. | ||
154 | #set ($translationKey = "solr.facet.fileType.${category.id}.$prettyName") | ||
155 | #if ($services.localization.get($translationKey)) | ||
156 | #set ($prettyName = $services.localization.render($translationKey)) | ||
157 | #elseif ($prettyName.length() < 5) | ||
158 | ## Probably a file extension (or acronym). | ||
159 | #set ($prettyName = $prettyName.toUpperCase()) | ||
160 | #end | ||
161 | <span title="$mediaType">$prettyName</span> | ||
162 | #end | ||
163 | #end | ||
164 | {{/velocity}} | ||
165 | |||
166 | {{velocity}} | ||
167 | #if ($facetValues) | ||
168 | {{html clean="false"}}#displaySearchFacetValues_mediaType($facetValues){{/html}} | ||
169 | #end | ||
170 | {{/velocity}} |