... |
... |
@@ -1,6 +1,8 @@ |
1 |
|
-{{groovy}} |
2 |
|
-def results = [] |
|
1 |
+{{groovy bindings="tags,max"}} |
|
2 |
+def includeTags = (context.macro.params.tags ?: "").split(',')*.trim()*.toLowerCase().findAll { it } // removes blanks |
|
3 |
+def maxCount = context.macro.params.max?.toInteger() ?: 999 |
3 |
3 |
|
|
5 |
+ |
4 |
4 |
def hql = """ |
5 |
5 |
select doc.fullName |
6 |
6 |
from XWikiDocument doc, BaseObject obj |
... |
... |
@@ -9,27 +9,34 @@ |
9 |
9 |
order by doc.date desc |
10 |
10 |
""" |
11 |
11 |
|
12 |
|
-def docs = xwiki.search(hql, 100, 0) |
|
14 |
+def docs = xwiki.search(hql, maxCount, 0) |
|
15 |
+def results = [] |
13 |
13 |
|
14 |
14 |
docs.each { docName -> |
|
18 |
+ if (results.size() >= maxCount) return |
|
19 |
+ |
15 |
15 |
def doc = xwiki.getDocument(docName) |
16 |
16 |
def obj = doc.getObject("Main Categories.Anti White Incidents.Code.MoviesClass") |
17 |
17 |
if (!obj) return |
18 |
18 |
|
|
24 |
+ // extract fields |
19 |
19 |
def title = obj.getProperty("shortText1")?.value?.toString()?.trim() |
20 |
20 |
def summary = obj.getProperty("shortText2")?.value?.toString()?.trim() ?: obj.getProperty("longText1")?.value?.toString()?.trim() |
21 |
21 |
def externalURL = obj.getProperty("longText2")?.value?.toString()?.trim() |
|
28 |
+ def tagList = obj.getProperty("tags")?.value |
22 |
22 |
|
23 |
23 |
if (!title || !summary) return |
24 |
24 |
|
25 |
|
- // ✅ Choose external link if valid, otherwise link to doc |
26 |
|
- def isValidURL = externalURL && (externalURL.startsWith("http://") || externalURL.startsWith("https://")) |
27 |
|
- def linkTarget = isValidURL ? externalURL : "doc:${docName}" |
|
32 |
+ // tag filtering |
|
33 |
+ if (includeTags && tagList) { |
|
34 |
+ def tagNames = tagList.collect { it.toString().toLowerCase() } |
|
35 |
+ if (!tagNames.any { includeTags.contains(it) }) return |
|
36 |
+ } |
28 |
28 |
|
29 |
|
- // ✅ Escape brackets in title to avoid wiki breakage |
|
38 |
+ def isValidURL = externalURL?.startsWith("http://") || externalURL?.startsWith("https://") |
|
39 |
+ def linkTarget = isValidURL ? externalURL : "doc:${docName}" |
30 |
30 |
def safeTitle = title.replaceAll(/[\[\]\|]/, '').replaceAll(/\>\>/, '>>\u200B') |
31 |
31 |
|
32 |
|
- // ✅ Auto-detect first attached image |
33 |
33 |
def imageFile = doc.getAttachmentList()?.find { |
34 |
34 |
it.filename.toLowerCase().matches(".*\\.(png|jpg|jpeg|gif)") |
35 |
35 |
}?.filename |
... |
... |
@@ -40,20 +40,24 @@ |
40 |
40 |
} |
41 |
41 |
|
42 |
42 |
def block = """ |
43 |
|
-(% style="margin-bottom:20px; width:100%" %) |
44 |
|
-|${imageMarkup}| |
|
52 |
+ (% style="margin-bottom:20px; width:100%" %) |
|
53 |
+ |${imageMarkup}| |
45 |
45 |
|
46 |
|
-=== [[${safeTitle}>>${linkTarget}]] === |
|
55 |
+ === [[${safeTitle}>>${linkTarget}]] === |
47 |
47 |
|
48 |
|
-${summary} |
49 |
|
-[[Read More>>${linkTarget}]] |
50 |
|
-""".trim() |
|
57 |
+ ${summary} |
|
58 |
+ [[Read More>>${linkTarget}]] |
|
59 |
+ """.trim() |
51 |
51 |
|
52 |
52 |
results << block |
53 |
53 |
} |
54 |
54 |
|
55 |
55 |
if (results.isEmpty()) { |
56 |
|
- println "⚠️ Still no incident blocks rendered — ensure at least one page has valid title/summary/attachment." |
|
65 |
+ if (includeTags) { |
|
66 |
+ println "⚠️ No incidents found for tags: ${parameters.tags}" |
|
67 |
+ } else { |
|
68 |
+ println "⚠️ No incidents to display." |
|
69 |
+ } |
57 |
57 |
} else { |
58 |
58 |
println results.join("\n\n") |
59 |
59 |
} |