... |
... |
@@ -1,76 +1,78 @@ |
1 |
1 |
{{groovy}} |
2 |
|
-def render(tags, max) { |
3 |
|
- def includeTags = tags?.split(',')*.trim()*.toLowerCase().findAll { it } |
4 |
|
- def maxCount = max?.toInteger() ?: 999 |
|
2 |
+/** |
|
3 |
+ * incidentGallery script macro |
|
4 |
+ * @param tags - comma-separated tags to filter (case-insensitive) |
|
5 |
+ * @param max - max incidents to display (optional) |
|
6 |
+ */ |
|
7 |
+def includeTags = tags?.split(',')*.trim()*.toLowerCase() ?: [] |
|
8 |
+def maxCount = max?.toInteger() ?: 999 |
5 |
5 |
|
6 |
|
- def hql = """ |
7 |
|
- select doc.fullName |
8 |
|
- from XWikiDocument doc, BaseObject obj |
9 |
|
- where obj.name = doc.fullName |
10 |
|
- and obj.className = 'Main Categories.Anti White Incidents.Code.MoviesClass' |
11 |
|
- order by doc.date desc |
12 |
|
- """ |
|
10 |
+def hql = """ |
|
11 |
+ select doc.fullName |
|
12 |
+ from XWikiDocument doc, BaseObject obj |
|
13 |
+ where obj.name = doc.fullName |
|
14 |
+ and obj.className = 'Main Categories.Anti White Incidents.Code.MoviesClass' |
|
15 |
+ order by doc.date desc |
|
16 |
+""" |
13 |
13 |
|
14 |
|
- def docs = xwiki.search(hql, maxCount, 0) |
15 |
|
- def results = [] |
|
18 |
+def docs = xwiki.search(hql, maxCount, 0) |
|
19 |
+def results = [] |
16 |
16 |
|
17 |
|
- docs.each { docName -> |
18 |
|
- if (results.size() >= maxCount) return |
|
21 |
+docs.each { docName -> |
|
22 |
+ if (results.size() >= maxCount) return |
19 |
19 |
|
20 |
|
- def doc = xwiki.getDocument(docName) |
21 |
|
- def obj = doc.getObject("Main Categories.Anti White Incidents.Code.MoviesClass") |
22 |
|
- if (!obj) return |
|
24 |
+ def doc = xwiki.getDocument(docName) |
|
25 |
+ def obj = doc.getObject("Main Categories.Anti White Incidents.Code.MoviesClass") |
|
26 |
+ if (!obj) return |
23 |
23 |
|
24 |
|
- def title = obj.getProperty("shortText1")?.value?.toString()?.trim() |
25 |
|
- def summary = obj.getProperty("shortText2")?.value?.toString()?.trim() ?: obj.getProperty("longText1")?.value?.toString()?.trim() |
26 |
|
- def externalURL = obj.getProperty("longText2")?.value?.toString()?.trim() |
27 |
|
- def tagList = obj.getProperty("tags")?.value |
|
28 |
+ // extract fields |
|
29 |
+ def title = obj.getProperty("shortText1")?.value?.toString()?.trim() |
|
30 |
+ def summary = obj.getProperty("shortText2")?.value?.toString()?.trim() ?: obj.getProperty("longText1")?.value?.toString()?.trim() |
|
31 |
+ def externalURL = obj.getProperty("longText2")?.value?.toString()?.trim() |
|
32 |
+ def tagList = obj.getProperty("tags")?.value |
28 |
28 |
|
29 |
|
- if (!title || !summary) return |
|
34 |
+ if (!title || !summary) return |
30 |
30 |
|
31 |
|
- if (includeTags && tagList) { |
32 |
|
- def tagNames = tagList.collect { it.toString().toLowerCase() } |
33 |
|
- if (!tagNames.any { includeTags.contains(it) }) return |
34 |
|
- } |
|
36 |
+ // tag filtering |
|
37 |
+ if (includeTags && tagList) { |
|
38 |
+ def tagNames = tagList.collect { it.toString().toLowerCase() } |
|
39 |
+ if (!tagNames.any { includeTags.contains(it) }) return |
|
40 |
+ } |
35 |
35 |
|
36 |
|
- def isValidURL = externalURL?.startsWith("http://") || externalURL?.startsWith("https://") |
37 |
|
- def linkTarget = isValidURL ? externalURL : "doc:${docName}" |
38 |
|
- def safeTitle = title.replaceAll(/[\[\]\|]/, '').replaceAll(/\>\>/, '>>\u200B') |
|
42 |
+ def isValidURL = externalURL?.startsWith("http://") || externalURL?.startsWith("https://") |
|
43 |
+ def linkTarget = isValidURL ? externalURL : "doc:${docName}" |
|
44 |
+ def safeTitle = title.replaceAll(/[\[\]\|]/, '').replaceAll(/\>\>/, '>>\u200B') |
39 |
39 |
|
40 |
|
- def imageFile = doc.getAttachmentList()?.find { |
41 |
|
- it.filename.toLowerCase().matches(".*\\.(png|jpg|jpeg|gif)") |
42 |
|
- }?.filename |
|
46 |
+ def imageFile = doc.getAttachmentList()?.find { |
|
47 |
+ it.filename.toLowerCase().matches(".*\\.(png|jpg|jpeg|gif)") |
|
48 |
+ }?.filename |
43 |
43 |
|
44 |
|
- def imageMarkup = "" |
45 |
|
- if (imageFile) { |
46 |
|
- imageMarkup = "[[image:${doc.fullName}@${imageFile}||alt=\"Image\" data-xwiki-image-style=\"thumbnail-clickable\" style=\"border:1px solid #ccc\" width=\"200\"]]" |
47 |
|
- } |
|
50 |
+ def imageMarkup = "" |
|
51 |
+ if (imageFile) { |
|
52 |
+ imageMarkup = "[[image:${doc.fullName}@${imageFile}||alt=\"Image\" data-xwiki-image-style=\"thumbnail-clickable\" style=\"border:1px solid #ccc\" width=\"200\"]]" |
|
53 |
+ } |
48 |
48 |
|
49 |
|
- def block = """ |
50 |
|
- (% style="margin-bottom:20px; width:100%" %) |
51 |
|
- |${imageMarkup}| |
|
55 |
+ def block = """ |
|
56 |
+ (% style="margin-bottom:20px; width:100%" %) |
|
57 |
+ |${imageMarkup}| |
52 |
52 |
|
53 |
|
- === [[${safeTitle}>>${linkTarget}]] === |
|
59 |
+ === [[${safeTitle}>>${linkTarget}]] === |
54 |
54 |
|
55 |
|
- ${summary} |
56 |
|
- [[Read More>>${linkTarget}]] |
57 |
|
- """.trim() |
|
61 |
+ ${summary} |
|
62 |
+ [[Read More>>${linkTarget}]] |
|
63 |
+ """.trim() |
58 |
58 |
|
59 |
|
- results << block |
60 |
|
- } |
|
65 |
+ results << block |
|
66 |
+} |
61 |
61 |
|
62 |
|
- if (results.isEmpty()) { |
63 |
|
- if (includeTags) { |
64 |
|
- println "⚠️ No incidents found for tags: ${tags}" |
65 |
|
- } else { |
66 |
|
- println "⚠️ No incidents to display." |
67 |
|
- } |
|
68 |
+if (results.isEmpty()) { |
|
69 |
+ if (includeTags) { |
|
70 |
+ println "⚠️ No incidents found for tags: ${parameters.tags}" |
68 |
68 |
} else { |
69 |
|
- println results.join("\n\n") |
|
72 |
+ println "⚠️ No incidents to display." |
70 |
70 |
} |
|
74 |
+} else { |
|
75 |
+ println results.join("\n\n") |
71 |
71 |
} |
72 |
|
- |
73 |
|
-// ✅ This is the actual macro parameter call |
74 |
|
-render(tags, max) |
75 |
75 |
{{/groovy}} |
76 |
76 |
|