Changes for page Home
Last modified by Jesse Veentjer on 06-5-2024 05:01
From version 219.32
edited by Jesse Veentjer
on 19-2-2024 11:41
on 19-2-2024 11:41
Change comment:
There is no comment for this version
To version 222.1
edited by Jesse Veentjer
on 06-5-2024 05:01
on 06-5-2024 05:01
Change comment:
Nieuwe afbeelding Preloader_blauw.gif toegevoegd
Summary
-
Page properties (1 modified, 0 added, 0 removed)
-
Attachments (0 modified, 2 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -1,129 +29,16 @@ 1 -(% class="floatinginfobox wbrechts" %) 2 -((( 3 -(% class="wbrb" %) 4 -(% aria-label="aanhetwerk.gif image widget" contenteditable="false" data-xwiki-image-style-alignment="center" role="region" tabindex="-1" data-widget="image" %)[[image:attach:aanhetwerk.gif||data-xwiki-image-style-alignment="center"]](% title="Click and drag to resize" %)(% aria-label="aanhetwerk.gif image widget" contenteditable="false" data-xwiki-image-style-alignment="center" role="region" tabindex="-1" style="background-color:rgba(220,220,220,0.5)" %)[[image:data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==||draggable="true" height="15" role="presentation" title="Click and drag to move" width="15"]] 5 - 6 -(% class="wbtoc" %) 7 -((( 8 - (% class="wbtocheader" %)Inhoud 9 - 10 -(% aria-label="macro:toc widget" contenteditable="false" role="region" tabindex="-1" %) 11 -((( 12 -(% class="macro" data-macro="startmacro:toc|-|" data-widget="xwiki-macro" data-xwiki-dom-updated="true" %) 13 -((( 14 -(% class="macro-placeholder hidden" %) 15 -((( 16 -macro:toc 17 -))) 18 - 19 -(% class="wikitoc" %) 20 -* [[Welkom op de WB Kennisbank>>doc:null||anchor="HWelkomopdeWBKennisbank"]] 21 -* [[Nieuws>>doc:null||anchor="HNieuws"]] 22 -))) 23 - 24 -(% style="background-color:rgba(220,220,220,0.5)" %)[[image:data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==||height="15" role="presentation" title="Click and drag to move" width="15"]] 25 -))) 26 -))) 27 -))) 28 - 29 29 (% class="wblinks" %) 30 30 ((( 31 -= **Welkom op de WB Kennisbank** = 3 +{{velocity}} 4 +#if($isGuest) 5 +#set($loginscherm = 'https://kennis.wardenburg.nl/login/XWiki/XWikiLogin') 6 +=Welkom op onze Kennisbank= 7 +Toegang tot (kwalitatief) goede informatie is een uitdaging waar iedereen mee worstelt, met het lanceren van dit digitale archief waarin we kennis, de laatste ontwikkelingen (nieuws), bestanden en ideeën kunnen plaatsen en delen gaan we het vinden van informatie eenvoudiger maken. In de kern maakt kennisbank het mogelijk om informatie te genereren organiseren en delen 32 32 33 -(% aria-label="macro:velocity widget" contenteditable="false" role="region" tabindex="-1" %) 34 -((( 35 -(% class="macro" data-macro="startmacro:velocity|-||-|#if(!$isGuest) 36 -##gebruiker is ingelogd 37 -(% style=~"font-size:18px;font-style: italic;~" ~%)**[[Zorg dat je op de hoogte bent van de kennisbank huisregels!>>doc:.Werkwijze.Kennisbank.Huisregels kennisbank.WebHome||target=_blank]]** 38 -#end" data-widget="xwiki-macro" data-xwiki-dom-updated="true" %) 39 -((( 40 -(% class="macro-placeholder hidden" %) 41 -((( 42 -macro:velocity 43 -))) 44 - 45 -(% style="font-size:18px; font-style:italic" %)**//[[Zorg dat je op de hoogte bent van de kennisbank huisregels!>>doc:.Werkwijze.Kennisbank.Huisregels kennisbank.WebHome||target="_blank"]]//** 46 -))) 47 - 48 -(% style="background:url(~"https://kennis.wardenburg.nl/webjars/wiki%3Axwiki/xwiki-platform-ckeditor-webjar/15.8/plugins/widget/images/handle.png~") rgba(220, 220, 220, 0.5); left:0px; top:-15px" %)[[image:data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==||height="15" role="presentation" title="Click and drag to move" width="15"]] 49 -))) 50 - 51 -Toegang tot (kwalitatief) goede informatie is een uitdaging waar iedereen mee worsteld, met het lanceren van dit digitale archief waarin we kennis, de laatste ontwikkelingen (nieuws), bestanden en ideeën kunnen plaatsen en delen gaan we het vinden van informatie eenvoudiger maken. In de kern maakt kennisbank het mogelijk om informatie te genereren organiseren en delen 52 - 53 -(% aria-label="macro:showhide widget" contenteditable="false" role="region" tabindex="-1" %) 54 -((( 55 -(% class="macro" data-macro="startmacro:showhide|-|showmessage=~"We kunnen dit op vele manieren gebruiken, klik hier om enkele voorbeelden te zien:~" hidemessage=~"Verstop voorbeelden~" effectduration=~"1~"|-|✅ Toegang tot informatie , verbreed je kennis naar nieuwe onderwerpen. 56 -* Gedeelde kennis is makkelijk doorzoekbaar, je kan naar specifieke delen van pagina’s linken met een weblink! 57 -* Kennis van collega's wordt met elkaar gedeeld. Het voorkomt dat je zelf het wiel moet uitvinden terwijl er al informatie van een collega over een bepaald onderwerp is. 58 -* //Help collega's en klanten door hen in staat te stellen zichzelf te helpen//[[(Nb. zonder in te loggen zien bezoekers ook de 'Openbaar' folder)>>doc:.Openbaar.WebHome]] 59 - 60 -✅ Dankzij de nieuwssectie kunnen ook de laatste ontwikkelingen per 'nieuwsonderwerp' op de kennisbank geplaatst worden. 61 - 62 -✅ Deel je kennis door het vast te leggen in de kennisbank 63 -* Of het nou gaat om een bekende fout in een apparaat/softwareversie of een handige manier om een installatie te configureren, als je tijd hebt geïnvesteerd om een probleem oplossen is het jammer wanneer bijvoorbeeld een collega moet zwoegen om tot dezelfde oplossing te komen. 64 - 65 -✅ Zorgt voor transparantie en duidelijkheid op kennisgebied 66 -* Uitleg en handleidingen van installaties maar ook onze werkprocessen kunnen vastgelegd en gedeeld worden met de kennisbank. 67 -* Ervaringen en discussies kunnen per onderwerp geplaatst en besproken worden." data-widget="xwiki-macro" data-xwiki-dom-updated="true" %) 68 -((( 69 -(% class="macro-placeholder hidden" %) 70 -((( 71 -macro:showhide 72 -))) 73 - 74 -(% class="macro" data-macro="startmacro:velocity|-||-|#set($discard = $xwiki.jsx.use(~"Macros.ShowHideMacro~")) 75 -#set($mparams = $wikimacro.parameters) 76 -#if(!$mparams) 77 - #set($mparams = $xcontext.macro.params) 78 -#end 79 -#if($mparams.id) 80 - #set($id = $util.convertToAlphaNumeric($mparams.id)) 81 -#end 82 -#set($showmessage = $escapetool.xml($mparams.showmessage)) 83 -#set($hidemessage = $escapetool.xml($mparams.hidemessage)) 84 -#set($divstyle = $escapetool.xml($mparams.style)) 85 -#set($effect = $escapetool.xml($mparams.effect)) 86 -#if($effect == ~"appear~" || $effect == ~"fade~") 87 - #set($effect = ~"fadeToggle~") 88 -#elseif ($effect == ~"blind~" || $effect == ~"slide~") 89 - #set($effect = ~"slideToggle~") 90 -#end 91 -#set($effectduration = $mathtool.mul(1000,$mparams.effectduration)) 92 -(% #if($divstyle && $divstyle!=~"~") style=~"$\{divstyle}~" #end ~%) 93 -((( 94 -(% class=~"showhidebutton~" ~%) 95 -((( 96 -\{\{html clean=false}} 97 -<a href=~"javascript:void(0)~" #if($id && $id!=~"~")id=~"showhidebuttontext$\{id}~" #end data-show-duration=~"$effectduration~" data-show-effect=~"$effect~" data-show-message=~"$showmessage~" data-hide-message=~"$hidemessage~">$mparams.showmessage</a> 98 -\{\{/html}} 99 -))) 100 -(% class=~"showhidecontent~" #if($id && $id!=~"~")id=~"showhidecontent$\{id}~" #end style=~"display: none;~" ~%) 101 -((( 102 -((( 103 -$xcontext.macro.content 104 -))) 105 -))) 106 -)))" %) 107 -((( 108 -(% class="macro-placeholder hidden" %) 109 -((( 110 -macro:velocity 111 -))) 112 - 113 -((( 114 -(% class="showhidebutton" %) 115 -((( 116 -(% data-macro="startmacro:html|-|clean=~"false~"|-|<a href=~"javascript:void(0)~" data-show-duration=~"1000~" data-show-effect=~"toggle~" data-show-message=~"We kunnen dit op vele manieren gebruiken, klik hier om enkele voorbeelden te zien:~" data-hide-message=~"Verstop voorbeelden~">We kunnen dit op vele manieren gebruiken, klik hier om enkele voorbeelden te zien:</a>" class="macro hidden macro-placeholder" %)macro:html(% class="macro" data-macro="startmacro:html|-|clean=~"false~"|-|<a href=~"javascript:void(0)~" data-show-duration=~"1000~" data-show-effect=~"toggle~" data-show-message=~"We kunnen dit op vele manieren gebruiken, klik hier om enkele voorbeelden te zien:~" data-hide-message=~"Verstop voorbeelden~">We kunnen dit op vele manieren gebruiken, klik hier om enkele voorbeelden te zien:</a>" %)[[We kunnen dit op vele manieren gebruiken, klik hier om enkele voorbeelden te zien:>>path:javascript:void(0)||data-hide-message="Verstop voorbeelden" data-show-duration="1000" data-show-effect="toggle" data-show-message="We kunnen dit op vele manieren gebruiken, klik hier om enkele voorbeelden te zien:"]] 117 -))) 118 - 119 -(% class="showhidecontent" style="display: none;" %) 120 -((( 121 -((( 9 +{{showhide showmessage="We kunnen dit op vele manieren gebruiken, klik hier om enkele voorbeelden te zien:" hidemessage="Verstop voorbeelden" effectduration="1"}} 122 122 ✅ Toegang tot informatie , verbreed je kennis naar nieuwe onderwerpen. 123 - 124 124 * Gedeelde kennis is makkelijk doorzoekbaar, je kan naar specifieke delen van pagina’s linken met een weblink! 125 125 * Kennis van collega's wordt met elkaar gedeeld. Het voorkomt dat je zelf het wiel moet uitvinden terwijl er al informatie van een collega over een bepaald onderwerp is. 126 -* //Help collega's en klanten door hen in staat te stellen zichzelf te helpen//[[(Nb. zonder in te loggen zien bezoekers ook de 'Openbaar' folder)>> doc:.Openbaar.WebHome]]13 +* //Help collega's en klanten door hen in staat te stellen zichzelf te helpen//[[(Nb. zonder in te loggen zien bezoekers ook de 'Openbaar' folder)>>path:/Main/Openbaar/]] 127 127 128 128 ✅ Dankzij de nieuwssectie kunnen ook de laatste ontwikkelingen per 'nieuwsonderwerp' op de kennisbank geplaatst worden. 129 129 ... ... @@ -135,16854 +135,33 @@ 135 135 136 136 * Uitleg en handleidingen van installaties maar ook onze werkprocessen kunnen vastgelegd en gedeeld worden met de kennisbank. 137 137 * Ervaringen en discussies kunnen per onderwerp geplaatst en besproken worden. 138 -))) 139 -))) 140 -))) 141 -))) 142 -))) 143 - 144 -(% style="background:url(~"https://kennis.wardenburg.nl/webjars/wiki%3Axwiki/xwiki-platform-ckeditor-webjar/15.8/plugins/widget/images/handle.png~") rgba(220, 220, 220, 0.5); left:0px; top:-15px" %)[[image:data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==||height="15" role="presentation" title="Click and drag to move" width="15"]] 145 -))) 146 - 25 +{{/showhide}} 26 +{{html}} 27 +<a href=$loginscherm> 28 +<button class="login-btn" onclick="this.classList.add('clicked')"><span>Login</span></button> 29 +</a> 30 +{{/html}} 31 +Door in te loggen krijg je meer functies op de kennisbank, log in met je voornaam.achternaam (hetzelfde als je e-mail zonder het @wardenburg.nl gedeelte). 32 +#else 33 +=Zoeken= 34 +[[Klik hier om de zoekopdracht te wissen>>path:/Main ||target="_self"]] 35 +{{include reference="Main.Search" /}} 147 147 ---- 148 - 149 -* [[Klik hier voor uitleg hoe de kennisbank werkt>>doc:Main.Werkwijze.Kennisbank.WebHome]]. //Als je verdwaald raakt kan je altijd linksbovenin op het logo klikken, dan ga je terug naar deze homepagina. // 150 -* [[Voor discussies,vragen en/of opmerkingen over de kennisbank kan je aan dit teamkanaal meedoen>>https://teams.microsoft.com/l/team/19%3aAxo-k8j1CVRGXTb0t3Dc6tjNDNudeTZjcP_KZVFR5381%40thread.tacv2/conversations?groupId=4da292cd-ff72-4d4c-adc5-8aa3dfc4ae3f&tenantId=42b413cc-67db-4507-a4a6-ce30ce798022||rel="noopener noreferrer" target="_blank"]]. 151 - 152 -(% aria-label="macro:velocity widget" contenteditable="false" role="region" tabindex="-1" %) 153 -((( 154 -(% class="macro" data-macro="startmacro:velocity|-||-| 155 -#if($isGuest) 156 -#set($loginscherm = 'https://kennis.wardenburg.nl/login/XWiki/XWikiLogin') 157 -==**Inloggen**== 158 -Door in te loggen krijg je meer functies op de kennisbank. [[Log hier in op de wiki >>$loginscherm ||target=~"_blank~"]] met je voornaam.achternaam (hetzelfde als je e-mail zonder het @wardenburg.nl gedeelte). 159 - 160 -Ondervind je problemen met het inloggen? [[Neem dan contact op met Automatisering.>>https://teams.microsoft.com/l/chat/0/0?users=jesse.veentjer@wardenburg.nl&topicname=Xwiki|target=_blank]] 37 +* [[Klik hier voor uitleg hoe de kennisbank werkt>>path:/Main/Werkwijze/Kennisbank/]]. //Als je verdwaald raakt kan je altijd linksbovenin op het logo klikken, dan ga je terug naar deze homepagina. // 38 +* [[Voor discussies,vragen en/of opmerkingen over de kennisbank kan je aan dit teamkanaal meedoen>>url:https://teams.microsoft.com/l/team/19%3aAxo-k8j1CVRGXTb0t3Dc6tjNDNudeTZjcP_KZVFR5381%40thread.tacv2/conversations?groupId=4da292cd-ff72-4d4c-adc5-8aa3dfc4ae3f&tenantId=42b413cc-67db-4507-a4a6-ce30ce798022||rel="noopener noreferrer" target="_blank"]]. 161 161 #end 162 162 #if(!$isGuest) 163 -##gebruiker is ingelogd 164 -(% class=~"nieuws~" ~%) 165 -= **Nieuws** = 166 -Hieronder vind je de laatste (10) nieuwsberichten, [[een overzicht van alle nieuwsberichten en een onderverdeling van de categorieën vindt je op de nieuws homepagina>>doc:Nieuws.WebHome]]. 167 - 168 -(% class=~"nieuwstabel~" ~%) 169 -((( 170 -\{\{blogpostlist blog=~"Nieuws.WebHome~" limit=~"10~" layout=~"cards~" layoutParams=~"displayTitle=true|useSummary=true~"/}} 171 -))) 172 -#end" data-widget="xwiki-macro" data-xwiki-dom-updated="true" %) 173 -((( 174 -(% class="macro-placeholder hidden" %) 175 -((( 176 -macro:velocity 177 -))) 178 - 179 -(% id="HNieuws" class="nieuws" %) 180 -= **Nieuws** = 181 - 182 -Hieronder vind je de laatste (10) nieuwsberichten, [[een overzicht van alle nieuwsberichten en een onderverdeling van de categorieën vindt je op de nieuws homepagina>>doc:Nieuws.WebHome]]. 183 - 184 -(% class="nieuwstabel" %) 185 -((( 186 -(% class="macro" data-macro="startmacro:blogpostlist|-|blog=~"Nieuws.WebHome~" limit=~"10~" layout=~"cards~" layoutParams=~"displayTitle=true|useSummary=true~"" %) 187 -((( 188 -(% class="macro-placeholder hidden" %) 189 -((( 190 -macro:blogpostlist 191 -))) 192 - 193 -(% class="macro" data-macro="startmacro:blogPostLayoutCards|-|reference=~"Nieuws.Nieuwsbrief januari 2024~" params=~"displayTitle=true|useSummary=true|list-limit=10|list-layout=cards|list-blog=Nieuws.WebHome|list-paginated=no|list-results-count=10|postIndex=0|previousPostReference=~"" %) 194 -((( 195 -(% class="macro-placeholder hidden" %) 196 -((( 197 -macro:blogPostLayoutCards 198 -))) 199 - 200 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogCode~"" %) 201 -((( 202 -(% class="macro-placeholder hidden" %) 203 -((( 204 -macro:include 205 -))) 206 - 207 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogParameters~"" %) 208 -((( 209 -(% class="macro-placeholder hidden" %) 210 -((( 211 -macro:include 212 -))) 213 - 214 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## Blog 215 -#set($blogClassname = 'Blog.BlogClass') 216 -#set($blogTemplate = 'Blog.BlogTemplate') 217 -#set($blogSheet = 'Blog.BlogSheet') 218 -## Blog entries 219 -#set($blogPostClassname = 'Blog.BlogPostClass') 220 -#set($blogPostTemplate = 'Blog.BlogPostTemplate') 221 -#set($blogPostSheet = 'Blog.BlogPostSheet') 222 -#set($blogPostObjectNumber = $xwiki.getDocument($blogPostTemplate).getObject($blogPostClassname).number) 223 -#set($oldArticleClassname = 'XWiki.ArticleClass') 224 -## Categories 225 -#set($blogCategoryClassname = 'Blog.CategoryClass') 226 -#set($blogCategoryTemplate = 'Blog.CategoryTemplate') 227 -#set($blogCategorySheet = 'Blog.CategorySheet') 228 -#set($blogCategoriesSheet = 'Blog.CategoriesSheet') 229 -#set($oldBlogCategoryClassname = 'Blog.Categories') 230 -#set($defaultCategoryParent = 'Blog.Categories') 231 -## Style 232 -#set($blogStyleDocumentName = 'Blog.BlogStyle') 233 -#set($blogStyleDocument = $xwiki.getDocument($blogStyleDocumentName)) 234 -## Clientside scripts 235 -#set($blogScriptsDocumentName = 'Blog.BlogScripts') 236 -#set($blogPublisher = $xwiki.getDocument('Blog.Publisher')) 237 -## Misc 238 -#set($thisURL = $doc.getURL($xcontext.action, $request.queryString)) 239 -#set($isBlogPost = $doc.getObject($blogPostClassname)) 240 -#set($defaultBlogSpace = 'Blog') 241 -#set($isCategoryPage = $doc.getObject($blogCategoryClassname)) 242 -#set($isCategoriesHomePage = $doc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 243 -## 244 -## 245 -## 246 -#** 247 - * Displays an image, taken from the blog style document. 248 - * 249 - * @param $imgName The name of the icon from icons set to use. 250 - *# 251 -#macro(toolImage $imgName)(% class=~"icon-manage~"~%)$services.icon.render($imgName)(%~%)#end" %) 252 -((( 253 -(% class="macro-placeholder hidden" %) 254 -((( 255 -macro:velocity 256 -))) 257 -))) 258 -))) 259 - 260 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## 261 -## 262 -## 263 -## Import the blog skin and javascripts. 264 -$!xwiki.ssx.use($blogStyleDocumentName)## 265 -$!xwiki.jsx.use($blogScriptsDocumentName)## 266 -## 267 -## import the hierarchy for the path the blog post footer (in displayEntryBlogLocation) 268 -#template('hierarchy_macros.vm')## 269 -## 270 -## 271 -#** 272 - * Prints a blog. This is the main macro used in the BlogSheet. 273 - * 274 - * @param blogDoc the XDocument holding the blog definition object. 275 - *### 276 -#macro(printBlog $blogDoc) 277 - \{\{include reference='Blog.CreatePost'/}} 278 - 279 - ## Use the blogPostList macro to display the blogposts 280 - ## The blogPostList is used only in case of 'all' or 'paged' blog display type because the blogPostList macro 281 - ## do not support FTM the monthly and weekly blog display types 282 - #getBlogDisplayType($blogDoc $displayType) 283 - #if ($displayType == 'weekly' || $displayType == 'monthly') 284 - #getBlogEntries($blogDoc $entries) 285 - #displayBlog($entries 'index' true true) 286 - #displayNavigationLinks($blogDoc) 287 - #else 288 - #getBlogDisplayType($blogDoc $displayType) 289 - #set ($paginated = 'no') 290 - #if ($displayType == 'paginated') 291 - #set ($paginated = 'yes') 292 - #end 293 - #getBlogPostsLayout($blogDoc $postsLayout) 294 - (% class=~"hfeed index~" ~%)(((\{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$paginated~" layout=~"$!postsLayout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" /}}))) 295 - #end 41 += Nieuws = 42 +{{blogpostlist blog="Nieuws.WebHome" limit="6" layout="cards" layoutParams="displayTitle=true|useSummary=true"/}} 296 296 #end 297 -## 298 -## 299 -## 300 -#** 301 - * Shows blog information. In view mode, the description is printed. In edit mode, allows changing blog settings: title, 302 - * description, blog type (global or in-space), index display type (fixed size pagination, weekly index, monthly index, 303 - * all entries). 304 - * 305 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 306 - *### 307 -#macro(showBlogInfo $blogDoc) 308 - #if($blogDoc.getObject($blogClassname)) 309 - ## Keep testing for inline action for backward compatibility with older blogs. 310 - #if($xcontext.action == 'edit' || $xcontext.action == 'inline') 311 - #macro(displayProperty $blogDoc $propname) 312 - ; #displayPropName($xwiki.getClass($blogClassname).get($propname)): 313 - : $blogDoc.display($propname) 314 - #end 315 - #displayProperty($blogDoc 'title') 316 - #displayProperty($blogDoc 'description') 317 - #displayProperty($blogDoc 'displayType') 318 - #displayProperty($blogDoc 'itemsPerPage') 319 - #displayProperty($blogDoc 'postsLayout') 320 - #displayProperty($blogDoc 'postsLayoutParameters') 321 - #else 322 - $blogDoc.display('description') 323 - #end 324 - #elseif($doc.fullName == $blogSheet) 325 -= $services.localization.render('blog.code.blogsheet') = 326 - \{\{translation key='blog.code.sheetexplanation'/}} 327 - #else 328 - \{\{warning}}\{\{translation key='blog.code.notblog'/}}\{\{/warning}} 329 - #end 330 -#end 331 -## 332 -## 333 -## 334 -#** 335 - * Retrieve the blog document, which usually is either <tt><Space>.WebHome</tt> for whole-spaces blogs, or 336 - * <tt><Space>.Blog</tt> for in-space blogs. If none of these documents contains a blog object, then the first 337 - * (alphabetically) document in the target space that contains one is returned. Finally, if no document in the current 338 - * space contains a blog object, then <tt>Blog.WebHome</tt> is returned as the default blog. 339 - * 340 - * @param space A <tt>String</tt>, the name of the space where to search. 341 - * @param blogDoc The resulting XDocument. 342 - *### 343 -#macro(getBlogDocument $space $blogDoc) 344 - #set ($result = $NULL) 345 - ## Check if the current space has a WebPreferences page that contains a Blog.EnablePanelsConfigurationClass object. 346 - ## It is possible to display a blog's panels info in a page that is not inside a blog and in that case we need to 347 - ## identify the right blog based on a configuration object in a WebPreferences page. 348 - #set ($spaceReference = $services.model.resolveSpace($space)) 349 - #set ($preferencesDocRef = $services.model.createDocumentReference('WebPreferences', $spaceReference)) 350 - #set ($preferencesDoc = $xwiki.getDocument($preferencesDocRef)) 351 - #set ($preferencesObj = $preferencesDoc.getObject('Blog.EnablePanelsConfigurationClass')) 352 - #if ($preferencesObj) 353 - #set ($result = $xwiki.getDocument( $preferencesObj.getValue('blog'))) 354 - #end 355 - ## If no special case occurs (like the previous one), identify a blog by checking the current location from its hierarchy. 356 - #if (~"$!result~" == '') 357 - ## First, try the Space.WebHome, for a whole-space blog 358 - #set($result = $xwiki.getDocument(~"$\{space}.WebHome~")) 359 - #if(!$result.getObject($blogClassname)) 360 - ## Second, try the Space.Blog document 361 - #set($result = $xwiki.getDocument(~"$\{space}.Blog~")) 362 - #if(!$result.getObject($blogClassname)) 363 - ## Third, try searching for a blog document in the current space 364 - ## Prevent the query fail when the space contains dots '.' 365 - #set($blogDocs = $services.query.hql(~", BaseObject obj where doc.space = :space and obj.name = doc.fullName and obj.className = '$blogClassname' order by doc.name~").setLimit(1).setOffset(0).bindValue('space', $space).execute()) 366 - #if($blogDocs.size() > 0) 367 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 368 - #else 369 - ## Fourth, try searching for a blog document that have the its 'postsLocation' set to the current space 370 - #set($blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as postsLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=postsLocationProp.id.id and postsLocationProp.id.name='postsLocation' and postsLocationProp.value=:postsLocation order by doc.name~").setLimit(1).setOffset(0).bindValue('postsLocation', $space).execute()) 371 - #if($blogDocs.size() > 0) 372 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 373 - #else 374 - ## Last, fallback to Blog.WebHome, the default blog 375 - #set($result = $xwiki.getDocument('Blog.WebHome')) 376 - #end 377 - #end 378 - #end 379 - #end 380 - #end 381 - #set ($blogDoc = $NULL) 382 - #setVariable (~"$blogDoc~" $result) 383 -#end 384 -## 385 -## 386 -## 387 -#** 388 - * Retrieve the blog title. 389 - * 390 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass<tt> object with the <tt>title</tt> property set. 391 - * @param title The resulting title. 392 - *### 393 -#macro(getBlogTitle $blogDoc $title) 394 - ## Titles can contain velocity code (most commonly translations), so we should evaluate them. 395 - #set ($title = $NULL) 396 - #setVariable (~"$title~" $!blogDoc.displayTitle) 397 -#end 398 -## 399 -## 400 -## 401 -#** 402 - * Retrieve the blog description. 403 - * 404 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>description</tt> 405 - * property set. 406 - * @param description The resulting description. 407 - *### 408 -#macro(getBlogDescription $blogDoc $description) 409 - #getBlogProperty($blogDoc 'description' '' $result) 410 - #set ($description = $NULL) 411 - #setVariable (~"$description~" $result) 412 -#end 413 -## 414 -## 415 -## 416 -#** 417 - * Retrieves a list of entries to be displayed. The entries are either part of the blog's space, or have the blog 418 - * document set as a parent. The number and range of entries returned (from all those belonging to this blog) depends on 419 - * the blog display type: paginated (fixed number of entries), weekly (all entries in a week), monthly (all entries in a 420 - * month), or all. 421 - * 422 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 423 - * @param entries The resulting list of entries to display, a list of XDocument names. 424 - *### 425 -#macro(getBlogEntries $blogDoc $entries) 426 - #if (!$entries) 427 - #setVariable (~"$entries~" []) 428 - #end 429 - #getAllBlogPostsQuery($query) 430 - #isDefaultBlog($blogDoc $isDefault) 431 - #set($queryParams = \{}) 432 - #if ($isDefault) 433 - #getCategoryAllBlogPostsQuery($query) 434 - #set($query = ~"$\{query} and (doc.creator = :creator or (isPublished.value = 1 and hidden.value = 0)) and (doc.space = :space or catList like :catList escape '!')~") 435 - #set($discard = $queryParams.put('creator', $xcontext.user)) 436 - #set($discard = $queryParams.put('space', $blogDoc.space)) 437 - #set($sanitizedBlogSpace = $blogDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 438 - #set($discard = $queryParams.put('catList', $sanitizedBlogSpace)) 439 - #else 440 - #set($query = ~"$\{query} and (doc.space = :space or doc.parent = :parent)~") 441 - #getBlogPostsLocation($blogDoc.space $blogPostsLocation) 442 - #set($discard = $queryParams.put('space', $blogPostsLocation)) 443 - #set($discard = $queryParams.put('parent', $blogDoc.space)) 444 - #end 445 - #getBlogDisplayType($blogDoc $displayType) 446 - #if($displayType == 'weekly') 447 - #getWeeklyBlogEntries($blogDoc $query $entries $queryParams) 448 - #elseif($displayType == 'monthly') 449 - #getMonthlyBlogEntries($blogDoc $query $entries $queryParams) 450 - #elseif($displayType == 'all') 451 - #getAllBlogEntries($blogDoc $query $entries $queryParams) 452 - #else 453 - #getPagedBlogEntries($blogDoc $query $entries $queryParams) 454 - #end 455 -#end 456 -## 457 -## 458 -## 459 -#** 460 - * Retrieves a list of entries to be displayed. The entries are taken from a ~"page~" of the blog, a sequence of documents 461 - * defined by the request parameters <tt>ipp</tt> (items per page) and <tt>page</tt> (the current page). Initially the 462 - * first page is displayed, with the number of entries defined in the blog object in the <tt>itemsPerPage</tt> property 463 - * (10 if not defined). 464 - * 465 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 466 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 467 - * refined to restrict to a given space, or to a given search criteria, etc. 468 - * @param entries The resulting list of entries to display, a list of XDocument names. 469 - * @param queryParams The parameters to bind with the query. 470 - *### 471 -#macro(getPagedBlogEntries $blogDoc $query $entries $queryParams) 472 - #if (!$entries) 473 - #setVariable (~"$entries~" []) 474 - #end 475 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 476 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~")) 477 - #bindQueryParameters($countQueryObj $queryParams) 478 - #bindQueryParameters($queryObj $queryParams) 479 - #set($totalEntries = $countQueryObj.count()) 480 - #getBlogProperty($blogDoc 'itemsPerPage' '10' $defaultItemsPerPage) 481 - #set($defaultItemsPerPage = $numbertool.toNumber($defaultItemsPerPage).intValue()) 482 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 483 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 484 - #set($discard = $entries.addAll($queryObj.setLimit($itemsPerPage).setOffset($startAt).addFilter(~"unique~").execute())) 485 -#end 486 -## 487 -## 488 -## 489 -#** 490 - * Retrieves a list of entries to be displayed. The entries are taken from a week of the blog. The target week is 491 - * defined by the request parameters <tt>week</tt> (the week number in the year, from 1 to 52) and <tt>year</tt> (4 492 - * digit year). Initially the current week is displayed. 493 - * 494 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 495 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 496 - * refined to restrict to a given space, or to a given search criteria, etc. 497 - * @param entries The resulting list of entries to display, a list of XDocument names. 498 - * @param queryParams The parameters to bind with the query. 499 - *### 500 -#macro(getWeeklyBlogEntries $blogDoc $query $entries $queryParams) 501 - #if (!$entries) 502 - #setVariable (~"$entries~" []) 503 - #end 504 - #getRequestedWeek($weekDate) 505 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 506 - #set($minDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundFloor())) 507 - #set($maxDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundCeiling())) 508 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 509 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 510 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 511 - #bindQueryParameters($countQueryObj $queryParams) 512 - #bindQueryParameters($queryObj $queryParams) 513 - #set($totalEntries = $countQueryObj.count()) 514 - #set($discard = $entries.addAll($queryObj.execute())) 515 -#end 516 -## 517 -## 518 -## 519 -#** 520 - * Retrieves a list of entries to be displayed. The entries are taken from a month of the blog. The target month is 521 - * defined by the request parameters <tt>month</tt> (the month number, from 1 to 12) and <tt>year</tt> (4 522 - * digit year). Initially the current month is displayed. 523 - * 524 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 525 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 526 - * refined to restrict to a given space, or to a given search criteria, etc. 527 - * @param entries The resulting list of entries to display, a list of XDocument names. 528 - * @param queryParams The parameters to bind with the query. 529 - *### 530 -#macro(getMonthlyBlogEntries $blogDoc $query $entries) 531 - #if (!$entries) 532 - #setVariable (~"$entries~" []) 533 - #end 534 - #getRequestedMonth($monthDate) 535 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 536 - #set($minDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundFloor())) 537 - #set($maxDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundCeiling())) 538 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 539 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 540 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 541 - #bindQueryParameters($countQueryObj $queryParams) 542 - #bindQueryParameters($queryObj $queryParams) 543 - #set($totalEntries = $countQueryObj.count()) 544 - #set($discard = $entries.addAll($queryObj.execute())) 545 -#end 546 -## 547 -## 548 -## 549 -#** 550 - * Retrieves a list of entries to be displayed. All entries belonging to the current blog are returned. 551 - * 552 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 553 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 554 - * refined to restrict to a given space, or to a given search criteria, etc. 555 - * @param entries The resulting list of entries to display, a list of XDocument names. 556 - * @param queryParams The parameters to bind with the query. 557 - *### 558 -#macro(getAllBlogEntries $blogDoc $query $entries $queryParams) 559 - #if (!$entries) 560 - #setVariable (~"$entries~" []) 561 - #end 562 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 563 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 564 - #bindQueryParameters($countQueryObj $queryParams) 565 - #bindQueryParameters($queryObj $queryParams) 566 - #set($totalEntries = $countQueryObj.count()) 567 - #set($discard = $entries.addAll($queryObj.execute())) 568 -#end 569 -## 570 -## 571 -## 572 -#** 573 - * Retrieves a list of entries to be displayed. Only (and all) unpublished entries are returned. 574 - * 575 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 576 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 577 - * refined to restrict to a given space, or to a given search criteria, etc. 578 - * @param queryParams The parameters to bind with the query. 579 - * @param entries The resulting list of entries to display, a list of XDocument names. 580 - *### 581 -#macro(getUnpublishedBlogEntries $blogDoc $query $queryParams $entries) 582 - #if (!$entries) 583 - #setVariable (~"$entries~" []) 584 - #end 585 - #set($query = ~"$\{query} and isPublished.value = 0~") 586 - #set ($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 587 - #set ($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 588 - #bindQueryParameters($countQueryObj $queryParams) 589 - #bindQueryParameters($queryObj $queryParams) 590 - #set($totalEntries = $countQueryObj.count()) 591 - #set($discard = $entries.addAll($queryObj.execute())) 592 -#end 593 -## 594 -## 595 -## 596 -#** 597 - * Retrieves a list of entries to be displayed. The entries are taken from all the wiki, and not from a specific blog. 598 - * 599 - * @param entries The resulting list of entries to display, a list of XDocument names. 600 - *### 601 -#macro(getGlobalBlogEntries $entries) 602 - #if (!$entries) 603 - #setVariable (~"$entries~" []) 604 - #end 605 - #getAllBlogPostsQuery($query) 606 - #set($totalEntries = $services.query.hql($query).count()) 607 - #set($defaultItemsPerPage = 20) 608 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 609 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 610 - #set($discard = $entries.addAll($services.query.hql(~"$\{query} order by publishDate.value desc~").setLimit($itemsPerPage).setOffset($startAt).execute())) 611 -#end 612 -#** 613 - * Return the base query for selecting blog entries. It filters only visible entries, but does not bind to a specific 614 - * blog, nor specify a range or an ordering criteria. 615 - * 616 - * This macro is a duplicate of #getAllBlogPostsQuery($query). Keep it in case it's used outside, in custom code. 617 - * 618 - * @param query The basic query for selecting blog entries. 619 - *# 620 -#macro(getBlogEntriesBaseQuery $query) 621 - #getAllBlogPostsQuery($query) 622 -#end 623 -#** 624 - * Return the Query for selecting the all wiki blog posts without filtering 625 - * 626 - * @param query The basic query for selecting blog entries. 627 - *# 628 -#macro(getAllBlogPostsQuery $query) 629 - #set ($query = $NULL) 630 - #setVariable(~"$query~" ~", BaseObject as obj, IntegerProperty isPublished, 631 - IntegerProperty hidden, DateProperty publishDate 632 - where doc.fullName <> '$blogPostTemplate' and 633 - obj.name=doc.fullName and obj.className='$blogPostClassname' and 634 - isPublished.id.id = obj.id and isPublished.id.name = 'published' and 635 - hidden.id.id = obj.id and hidden.id.name='hidden' and 636 - publishDate.id.id = obj.id and publishDate.id.name='publishDate' and 637 - (doc.creator = '$escapetool.sql($xcontext.user)' or (isPublished.value = 1 and hidden.value = 0))~") 638 -#end 639 -## 640 -## 641 -## 642 -###** 643 - * Return the Query for selecting the all wiki blog posts with categories filtering 644 - * 645 - * @param query The basic query for selecting blog entries. 646 - *### 647 -#macro(getCategoryAllBlogPostsQuery $query) 648 - #set ($query = $NULL) 649 - #getAllBlogPostsQuery($baseQuery) 650 - #set ($baseQuery = $baseQuery.replace('DateProperty publishDate', 'DateProperty publishDate, DBStringListProperty as category left join category.list catList')) 651 - #setVariable(~"$query~" ~"$\{baseQuery} and obj.id=category.id.id and category.id.name='category'~") 652 -#end 653 -## 654 -## 655 -## 656 -#** 657 - * Determines how is the blog index split into pages: paginated (fixed number of entries), weekly (all entries in a 658 - * week), monthly (all entries in a month), or all. 659 - * 660 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>displayType</tt> 661 - * property set. 662 - * @param displayType The resulting string. If the blog object does not define anything, it is considered paginated. 663 - *### 664 -#macro(getBlogDisplayType $blogDoc $displayType) 665 - #getBlogProperty($blogDoc 'displayType' 'paginated' $result) 666 - #set ($displayType = $NULL) 667 - #setVariable (~"$displayType~" $result) 668 -#end 669 -## 670 -## 671 -## 672 -#** 673 - * Displays a list of entries. 674 - * 675 - * @param entries The entries to display, a list of XDocument names. 676 - * @param displaying What exactly is displayed: blog index, a single blog entry, a blog category, search results, 677 - * unpublished entries, etc. This will be used as the classname(s) for the container div (hfeed). Currently 678 - * used values: index, single, category, search, unpublished, hidden. 679 - * @param onlyExtract If <tt>true</tt>, only display the extract of articles where available, otherwise display the full content. 680 - * @param shouldDisplayTitles If <tt>true</tt>, display the blog title (blog posts shouldn't display the title when they're 681 - * displayed alone on their page since it's the page title which is used in this case) 682 - *### 683 -#macro(displayBlog $entries $displaying $onlyExtract $shouldDisplayTitles) 684 - #set($blogDay = '') 685 - (% class=~"hfeed $!\{displaying}~" ~%)((( 686 - (% class=~"blogDay~" ~%)((( 687 - #foreach ($entryDoc in $xwiki.wrapDocs($entries)) 688 - #getEntryObject($entryDoc $entryObj) 689 - ## Although all entries should have one of the two objects, better check to be sure. 690 - #if(~"$!\{entryObj}~" != '') 691 - #getEntryDate($entryDoc $entryObj $entryDate) 692 - ## Display a ~"calendar sheet~" for each day. All entries posted on the same day share one such sheet. 693 - #set($entryDateStr = $xwiki.formatDate($entryDate, 'yyyyMMMMdd')) 694 - #if($blogDay != $entryDateStr) 695 - #if($blogDay != '') 696 - ))) 697 - (% class=~"blogDay~" ~%)((( 698 - #end 699 - #displayBlogDate($entryDate) 700 - #set ($blogDay = $entryDateStr) 701 - #end 702 - ## Finally, display the entry. 703 - #displayEntry($entryDoc $entryObj $onlyExtract $shouldDisplayTitles true) 704 - #end 705 - #end 706 - )))## blogDay 707 - )))## hfeed 708 -#end 709 -## 710 -## 711 -## 712 -#** 713 - * Get the entry object, either a new BlogPost or an old Article. 714 - * 715 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 716 - * @param entryObj The resulting xobject of the blog post. 717 - *### 718 -#macro(getEntryObject $entryDoc $__entryObj) 719 - #set($result = $entryDoc.getObject(~"$\{blogPostClassname}~")) 720 - #if(!$result) 721 - #set($result = $entryDoc.getObject(~"$\{oldArticleClassname}~")) 722 - #end 723 - ## NOTE: The reason we put an underscore in front of the variable name is to prevent the following line from 724 - ## overwriting the $entryObj variable that may be defined before this macro is called. Of course, $__entryObj may be 725 - ## overwritten in this case but it's less likely to have such a variable defined before. 726 - #set ($__entryObj = $NULL) 727 - #setVariable (~"$__entryObj~" $result) 728 -#end 729 -## 730 -## 731 -## 732 -#** 733 - * Gets the date associated with a blog entry. This is the publication date. For unpublished entries, initially this is 734 - * the document creation date, but can be edited by the user. 735 - * 736 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 737 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 738 - * @param result The resulting date, an instance of <tt>java.util.Date</tt>. 739 - *### 740 -#macro(getEntryDate $entryDoc $entryObj $result) 741 - #set ($result = $NULL) 742 - #setVariable (~"$result~" $entryObj.getProperty('publishDate').value) 743 -#end 744 -## 745 -## 746 -## 747 -#** 748 - * Displays a date, nicely formatted as a calendar page. 749 - * 750 - * @param date The date to display, an instance of <tt>java.util.Date</tt>. 751 - *### 752 -#macro(displayBlogDate $date) 753 - #set($year = $xwiki.formatDate($date, 'yyyy')) 754 - ## 3 letter month name, like Jan, Dec. 755 - #set($month = $xwiki.formatDate($date, 'MMM')) 756 - ## Uncomment to get a full length month name, like January, December. 757 - ## TODO: this could be defined somewhere in the blog style. 758 - ## #set($month = $xwiki.formatDate($date, 'MMMM')) 759 - #set($day = $xwiki.formatDate($date, 'dd')) 760 - (% class=~"blogdate~" ~%) 761 - == (% class=~"month~" ~%)$month(%~%) (% class=~"day~" ~%)$day(%~%) (% class=~"year~" ~%)$year(%~%) == 762 -#end 763 -## 764 -## 765 -## 766 -#** 767 - * Displays a blog article: management tools, header, content, footer. 768 - * 769 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 770 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 771 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 772 - * @param shouldDisplayTitle If <tt>true</tt>, display the blog title (blog posts shouldn't display the title 773 - * when they're displayed alone on their page since it's the page title which is used in this case) 774 - * @param shouldDisplayActions If <tt>true</tt>, display the blog post actions buttons 775 - *### 776 -#macro(displayEntry $entryDoc $entryObj $onlyExtract $shouldDisplayTitle $shouldDisplayActions) 777 - ## Only articles with an explicit hidden setting or an explicit unpublished setting are hidden 778 - #isPublished($entryObj $isPublished) 779 - #isHidden($entryObj $isHidden) 780 - #if($doc.fullName == $entryDoc.fullName) 781 - (% class=~"hentry single-article~" ~%)((( 782 - #else 783 - (% class=~"hentry#if(!$isPublished) unpublished-article#elseif($isHidden) hidden-article#end~" ~%)((( 784 - #end 785 - #if ($shouldDisplayActions) 786 - #displayEntryTools($entryDoc $entryObj) 787 - #end 788 - #if($shouldDisplayTitle) 789 - #displayEntryTitle($entryDoc $entryObj) 790 - #end 791 - #if($doc.fullName == $entryDoc.fullName) 792 - #if(!$isPublished) 793 - \{\{warning}}\{\{translation key='blog.code.published'/}}\{\{/warning}} 794 - #elseif($isHidden) 795 - \{\{warning}}\{\{translation key='blog.code.hidden'/}}\{\{/warning}} 796 - #end 797 - #end 798 - #displayEntryContent($entryDoc $entryObj $onlyExtract) 799 - #displayEntryFooter($entryDoc $entryObj) 800 - )))## hentry 801 -#end 802 -## 803 -## 804 -## 805 -#** 806 - * Checks if the provided blog is published or not. 807 - * 808 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 809 - * @param isPublished The resulting boolean, true if the entry is considered published. 810 - *### 811 -#macro(isPublished $entryObj $isPublished) 812 - #set ($isPublished = $NULL) 813 - ## This should work for both old articles, which don't have the 'published' property at all, and 814 - ## are considered published by default, and new entries, that should have 1 if published. 815 - #if (~"$!\{entryObj.getProperty('published').value}~" != '0') 816 - #setVariable (~"$isPublished~" true) 817 - #else 818 - #setVariable (~"$isPublished~" false) 819 - #end 820 -#end 821 -## 822 -## 823 -## 824 -#** 825 - * Checks if the provided blog is hidden or not. 826 - * 827 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass<tt> xclass. 828 - * @param isHiddel The resulting boolean, true if the entry is considered hidden. 829 - *### 830 -#macro(isHidden $entryObj $isHidden) 831 - #set ($isHidden = $NULL) 832 - ## This should work for both old articles, which don't have the 'hidden' property at all, and 833 - ## are considered visible by default, and new entries, that should have 1 if hidden. 834 - #if (~"$!\{entryObj.getProperty('hidden').value}~" == '1') 835 - #setVariable (~"$isHidden~" true) 836 - #else 837 - #setVariable (~"$isHidden~" false) 838 - #end 839 -#end 840 -## 841 -## 842 -## 843 -#** 844 - * Displays several ~"tools~" for manipulating blog posts: hide/show, publish, edit. 845 - * 846 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 847 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 848 - *### 849 -#macro(displayEntryTools $entryDoc $entryObj) 850 - #if($xcontext.action == 'view') 851 - (% class=~"blog-entry-toolbox~" ~%)((( 852 - #displayPublishButton($entryDoc $entryObj) 853 - #displayHideShowButton($entryDoc $entryObj) 854 - #displayEditButton($entryDoc $entryObj) 855 - #displayDeleteButton($entryDoc $entryObj) 856 - ))) 857 - #end 858 -#end 859 -## 860 -## 861 -## 862 -#** 863 - * Displays the publish button to the entry <strong>creator</strong>, if the article is not published yet. 864 - * 865 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 866 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 867 - * @todo AJAX calls. 868 - *### 869 -#macro(displayPublishButton $entryDoc $entryObj) 870 - #isPublished($entryObj $isPublished) 871 - #if(!$isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 872 - [[#toolImage('world')>>path:$blogPublisher.getURL('view', ~"entryName=$\{escapetool.url($entryDoc.fullName)}&xredirect=$\{escapetool.url($thisURL)}&form_token=$!\{services.csrf.getToken()}~")||title=~"$services.localization.render('blog.code.notpublished')~"]]## 873 - #end 874 -#end 875 -## 876 -## 877 -## 878 -#** 879 - * Displays the hide or show button to the entry <strong>creator</strong>, if the article is already published. 880 - * 881 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 882 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 883 - *### 884 -#macro(displayHideShowButton $entryDoc $entryObj) 885 - #isPublished($entryObj $isPublished) 886 - #isHidden($entryObj $isHidden) 887 - ## Only published articles can be hidden. Unpublished articles are considered already hidden. 888 - #if($isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 889 - #set ($queryString = \{ 890 - 'xredirect' : $thisURL, 891 - 'form_token' : $services.csrf.getToken() 892 - }) 893 - #if ($isHidden) 894 - #set ($discard = $queryString.putAll(\{ 895 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 0, 896 - 'comment' : $services.localization.render('blog.code.madevisible') 897 - })) 898 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 899 - [[#toolImage('unlock')>>path:$lockURL||class=~"blog-tool-show~" title=~"$services.localization.render('blog.code.makevisible')~"]]## 900 - #else 901 - #set ($discard = $queryString.putAll(\{ 902 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 1, 903 - 'comment' : $services.localization.render('blog.code.hid') 904 - })) 905 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 906 - [[#toolImage('lock')>>path:$lockURL||class=~"blog-tool-hide~" title=~"$services.localization.render('blog.code.hide')~"]]## 907 - #end 908 - #end 909 -#end 910 -## 911 -## 912 -## 913 -#** 914 - * Displays the edit button to those that can edit the article. 915 - * 916 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 917 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 918 - *### 919 -#macro(displayEditButton $entryDoc $entryObj) 920 - #if($xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 921 - ## Call getDefaultEditMode() for backward compatibility with older blog posts. 922 - [[#toolImage('pencil')>>path:$entryDoc.getURL('edit')||title=~"$services.localization.render('blog.code.editpost')~"]]## 923 - #end 924 -#end 925 -## 926 -## 927 -## 928 -#** 929 - * Displays the delete button to those that can edit the article. 930 - * 931 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 932 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 933 - * @todo AJAX calls. 934 - *### 935 -#macro(displayDeleteButton $entryDoc $entryObj) 936 - #if($xwiki.hasAccessLevel('delete', $xcontext.user, $entryDoc.fullName)) 937 - [[#toolImage('cross')>>path:$entryDoc.getURL('delete')||title=~"$services.localization.render('blog.code.deletepost')~"]]## 938 - #end 939 -#end 940 -## 941 -## 942 -## 943 -#** 944 - * Displays the title of the entry. 945 - * 946 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 947 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 948 - *### 949 -#macro(displayEntryTitle $entryDoc $entryObj) 950 - #if($doc.fullName == $entryDoc.fullName) 951 - (% class=~"entry-title~" ~%) 952 - = $services.rendering.escape($entryDoc.display('title', 'view', $entryObj), $xwiki.getCurrentContentSyntaxId()) = 953 - #else 954 - (% class=~"entry-title~" ~%) 955 - === [[$services.rendering.escape($entryDoc.display('title', 'view', $entryObj),$xwiki.getCurrentContentSyntaxId())>>doc:$services.rendering.escape($services.model.serialize($entryDoc.getDocumentReference(),'default'),$xwiki.getCurrentContentSyntaxId())]] === 956 - #end 957 -#end 958 -## 959 -## 960 -## 961 -#** 962 - * Displays the body of the entry. 963 - * 964 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 965 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 966 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 967 - *### 968 -#macro(displayEntryContent $entryDoc $entryObj $onlyExtract) 969 - (% class=~"#if($onlyExtract)entry-summary#\{else}entry-content#end~" ~%)((( 970 - #getEntryContent($entryDoc $entryObj $onlyExtract $entryContent) 971 - ## FIXME: This causes the blog's content to not be annotatable. See http://jira.xwiki.org/browse/XWIKI-6328 972 - ## Should probably be replaced by a display macro call with a reference to the object property holding the post's content 973 - \{\{html wiki=~"false~"}}$entryDoc.getRenderedContent($entryContent, $entryDoc.syntax.toIdString())\{\{/html}} 974 - ))) ## entry-content 975 - (% class=~"clearfloats~" ~%)((())) 976 -#end 977 -## 978 -## 979 -## 980 -#** 981 - * Extracts the body of the entry that should be displayed. If <tt>onlyExtract</tt> is <tt>true</tt>, display the content 982 - * of the <tt>extract</tt> field (if not empty). 983 - * 984 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 985 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 986 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 987 - * @param entryContent The resulting content. 988 - * @param removeEllipsis If <tt>true</tt>, then don't display an ellipsis at the end of the content (only used when 989 - * <tt>onlyExtract</tt> is <tt>true</tt>) 990 - *### 991 -#macro(getEntryContent $entryDoc $entryObj $onlyExtract $entryContent $removeEllipsis) 992 - #if ($onlyExtract) 993 - ## Note: We trim the summary so that if there's some white space it won't cause the summary to be used instead 994 - ## of the content. 995 - #set ($macro.result = $entryObj.getProperty('extract').value.trim()) 996 - #end 997 - #if(~"$!macro.result~" == '') 998 - #set($macro.result = $entryObj.getProperty('content').value) 999 -#* Disabled until the content can be cleanly cut. 1000 -* #if($onlyExtract && $result.length()>$maxchars) 1001 -* #set($i = $macro.result.lastIndexOf(~" ~", $maxchars)) 1002 -* #set($i = $i + 1) 1003 -* #set($macro.result = ~"$\{macro.result.substring(0,$i)} *[...>$\{entryDoc.fullName}]*~") 1004 -* #end 1005 -## *### 1006 - #elseif (!$removeEllipsis) 1007 - #if($entryDoc.syntax.toIdString() == 'xwiki/1.0') 1008 - #set($macro.result = ~"$\{macro.result} <a href='$\{entryDoc.getExternalURL()}' title='$services.localization.render('blog.code.readpost')'>...</a>~") 1009 - #elseif($entryDoc.syntax.toIdString() == 'xwiki/2.0' || $entryDoc.syntax.toIdString() == 'xwiki/2.1') 1010 - #set($macro.result = ~"$\{macro.result} [[...>>$\{services.rendering.escape($entryDoc.getFullName(), $entryDoc.getSyntax())}||title='$services.localization.render('blog.code.readpost')']]~") 1011 - #end 1012 - #end 1013 - #set ($entryContent = $NULL) 1014 - #setVariable (~"$entryContent~" $macro.result) 1015 -#end 1016 -## 1017 -## 1018 -## 1019 -#** 1020 - * Displays the footer of the entry. 1021 - * 1022 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 1023 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 1024 - *### 1025 -#macro(displayEntryFooter $entryDoc $entryObj) 1026 - (% class=~"entry-footer~" ~%)((( 1027 - #isPublished($entryObj $isPublished) 1028 - (% class='entry-author-label' ~%) 1029 - #if($isPublished) 1030 - \{\{translation key='blog.code.postedby'/}} ## 1031 - #else 1032 - \{\{translation key='blog.code.createdby'/}} ## 1033 - #end 1034 - \{\{html wiki=~"false~" clean=~"false~"}}<span class='author vcard'>#userfn($entryDoc.creator)</span>\{\{/html}} ## 1035 - #getEntryDate($entryDoc $entryObj $entryDate) 1036 - #listCategories($entryObj) #* 1037 - ## Since the publish date and update date are not set at the exact same time, there could be a small difference that 1038 - ## we assume cannot be more than 3 seconds. 1039 - *#(% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.permalink'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||rel=~"bookmark~"]] ## 1040 - #if ($showcomments) 1041 - (% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.comments'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||anchor=~"Comments~"]] (% class=~"itemCount~" ~%)($entryDoc.comments.size())(%~%) ## 1042 - #end ## 1043 - #if($entryDoc != $doc) ## 1044 - #displayEntryBlogLocation($entryDoc $entryObj) ## 1045 - #end 1046 - )))## entry-footer 1047 -#end 1048 -## 1049 -## 1050 -#** 1051 - * Display the blog for the entry (if it is not the currently displayed blog) 1052 - * 1053 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 1054 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 1055 - *### 1056 -#macro(displayEntryBlogLocation $entryDoc $entryObj) 1057 - #getBlogPostsLocation($entryDoc.getSpace() $blogPostsLocation) ## 1058 - #if(~"$!blogPostsLocation~" != ~"~") ## 1059 - #set($blogSpaceRef = $services.model.resolveSpace($blogPostsLocation)) ## 1060 - #set($blogDocRef = $services.model.createDocumentReference($services.model.getEntityReference('DOCUMENT', 'default').getName(), $blogSpaceRef)) ## 1061 - #if($doc.documentReference != $blogDocRef) ## 1062 - #set($blogDoc = $xwiki.getDocument($blogDocRef)) ## 1063 - #set($blogObj = $blogDoc.getObject('Blog.BlogClass')) ## 1064 - #if($blogObj) (% class=~"blogrefpath~" ~%)((( ## 1065 - $services.localization.render('blog.code.postedin') \{\{html clean=~"false~" wiki=~"false~"}} #hierarchy($blogDocRef, \{'selfIsActive' : true, 'local': true}) \{\{/html}} ## 1066 - )))(%~%)## 1067 - #end 1068 - #end 1069 - #end 1070 -#end 1071 -## 1072 -## 1073 -## 1074 -## 1075 -#** 1076 - * List the categories an entry belongs to. Used in the footer. The categories are instances of <tt>Blog.CategoryClass</tt>. 1077 - * 1078 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 1079 - *### 1080 -#macro(listCategories $entryObj) 1081 - #if($entryObj.getxWikiClass().getName() == $blogPostClassname) 1082 - #set($categories = $entryObj.getProperty('category').value) 1083 - #set($first = true) 1084 - #if($categories.size() > 0) 1085 - #foreach($category in $categories) 1086 - #set($categoryDoc = $!xwiki.getDocument($category)) 1087 - #if(!$categoryDoc.isNew() && $categoryDoc.getObject($\{blogCategoryClassname})) 1088 - #if($foreach.count == 1) 1089 - (% class='separator' ~%)·(%~%) $services.localization.render('blog.code.categories') ## 1090 - #else 1091 - , ## 1092 - #end## 1093 - [[$!\{categoryDoc.getObject($blogCategoryClassname).getValue('name')}>>$\{category}||rel='tag']]## 1094 - #end## 1095 - #end## 1096 - #end 1097 - #end 1098 -#end 1099 -## 1100 -## 1101 -## 1102 -#** 1103 - * Displays blog pagination links (older and newer entries). 1104 - * 1105 - * @param blogDoc the XDocument holding the blog definition object. 1106 - *### 1107 -#macro(displayNavigationLinks $blogDoc) 1108 - (% class=~"clearfloats~" ~%)((())) 1109 - #getBlogDisplayType($blogDoc $displayType) 1110 - #if($displayType == 'weekly') 1111 - (% class=~"pagingLinks~" ~%)((( 1112 - #getRequestedWeek($weekDate) 1113 - $weekDate.addWeeks(-1)## 1114 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousweek'/}}>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 1115 - #sep() 1116 - $weekDate.addWeeks(2)## 2 because we already subtracted 1 above 1117 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextweek'/}} »>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 1118 - ))) 1119 - #elseif($displayType == 'monthly') 1120 - (% class=~"pagingLinks~" ~%)((( 1121 - #getRequestedMonth($monthDate) 1122 - $monthDate.addMonths(-1)## 1123 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousmonth'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 1124 - #sep() 1125 - $monthDate.addMonths(2)## 2 because we already subtracted 1 above 1126 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextmonth'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 1127 - ))) 1128 - #elseif($displayType == 'all') 1129 - #else 1130 - ## Paginated 1131 - #if(($totalPages > 1)) 1132 - #set($queryString = '') 1133 - #foreach($p in $request.getParameterNames()) 1134 - #if($p != 'page' && $p != 'ipp') 1135 - #foreach($v in $request.getParameterValues($p)) 1136 - #set($queryString = ~"$\{queryString}&$\{escapetool.url($p)}=$\{escapetool.url($v)}~") 1137 - #end 1138 - #end 1139 - #end 1140 - (% class=~"pagingLinks~" ~%)((( 1141 - #if ($currentPageNumber < $totalPages) 1142 - #set($currentPageNumber = $currentPageNumber + 1) 1143 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.olderposts'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 1144 - #set($currentPageNumber = $currentPageNumber - 1) 1145 - #end 1146 - #if ($currentPageNumber > 1) 1147 - #if ($currentPageNumber < $totalPages) 1148 - #sep() 1149 - #end 1150 - #set($currentPageNumber = $currentPageNumber - 1) 1151 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.newerposts'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 1152 - #set($currentPageNumber = $currentPageNumber + 1) 1153 - #end 1154 - (% class=~"clear~" ~%)(%~%) 1155 - )))## pagingLinks 1156 - #end 1157 - #end 1158 -#end 1159 -## 1160 -## 1161 -## 1162 -#** 1163 - * Displays a message box with ~"publish~" icon. 1164 - * 1165 - * @param message A text message concerning blog article publishing 1166 - *### 1167 -#macro(publishMessageBox $message) 1168 -(% class=~"plainmessage publish-message~" ~%)((($services.icon.render('world') $message))) 1169 -#end 1170 -#** 1171 - * Displays a message box with ~"show/hide~" icon. 1172 - * 1173 - * @param message A text message concerning blog article hiding 1174 - *### 1175 -#macro(hideMessageBox $message) 1176 -(% class=~"plainmessage hide-message~" ~%)((($services.icon.render('unlock') $message))) 1177 -#end 1178 -## 1179 -## 1180 -## 1181 -#** 1182 - * Determine the requested week, for using in a weekly-indexed blog. The relevant request parameters are 1183 - * <tt>year</tt> and <tt>week</tt>. By default, the current week is used. 1184 - * 1185 - * @param monthDate The resulting week, a JODATime MutableDateTime. 1186 - *### 1187 -#macro(getRequestedWeek $weekDate) 1188 - #set ($weekDate = $NULL) 1189 - #setVariable (~"$weekDate~" $xwiki.jodatime.mutableDateTime) 1190 - #if(~"$!\{request.year}~" != '') 1191 - #set ($discard = $weekDate.setYear($numbertool.toNumber($request.year).intValue())) 1192 - #end 1193 - #if(~"$!\{request.week}~" != '') 1194 - #set ($discard = $weekDate.setWeekOfWeekyear($numbertool.toNumber($request.week).intValue())) 1195 - #end 1196 -#end 1197 -## 1198 -## 1199 -## 1200 -#** 1201 - * Determine the requested month, for using in a monthly-indexed blog. The relevant request parameters are 1202 - * <tt>year</tt> and <tt>month</tt>. By default, the current month is used. 1203 - * 1204 - * @param monthDate The resulting month, a JODATime MutableDateTime. 1205 - *### 1206 -#macro(getRequestedMonth $monthDate) 1207 - #set ($monthDate = $NULL) 1208 - #setVariable (~"$monthDate~" $xwiki.jodatime.mutableDateTime) 1209 - #if(~"$!\{request.year}~" != '') 1210 - #set ($discard = $monthDate.setYear($numbertool.toNumber($request.year).intValue())) 1211 - #end 1212 - #if(~"$!\{request.month}~" != '') 1213 - #set ($discard = $monthDate.setMonthOfYear($numbertool.toNumber($request.month).intValue())) 1214 - #end 1215 -#end 1216 -## 1217 -## 1218 -## 1219 -#** 1220 - * Retrieve a blog property (title, display type, etc). 1221 - * 1222 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 1223 - * @param propertyName The name of the property to be retrieved. One of the <tt>Blog.BlogClass</tt>'s properties. 1224 - * @param defaultValue The default value to use in case the blog object does not define one. 1225 - * @param propertyValue The resulting value. 1226 - *### 1227 -#macro(getBlogProperty $blogDoc $propertyName $defaultValue $propertyValue) 1228 - #set($result = ~"$!\{blogDoc.getObject($\{blogClassname}).getProperty($propertyName).value}~") 1229 - #if($result == '') 1230 - #set($result = $defaultValue) 1231 - #end 1232 - #set ($propertyValue = $NULL) 1233 - #setVariable (~"$propertyValue~" $result) 1234 -#end 44 +{{/velocity}} 1235 1235 1236 -#** 1237 - * If an error occurs when executing an action, set a specific response status and display an error message. 1238 - * 1239 - * @param status The response status. 1240 - * @param text The user readable error to be displayed. Can be a translation key. 1241 - * @param parameters The parameters to use when decoding the translation key. 1242 - *### 1243 -#macro(blog__actionResponseError $status $text $parameters) 1244 - $response.setStatus($status) 1245 - #if($request.ajax) 1246 - $services.localization.render($text, $!parameters) 1247 - #else 1248 - \{\{error}}$services.localization.render($text, $!parameters)\{\{/error}} 1249 - #end 1250 -#end 1251 -## 1252 -## 1253 -## 1254 -#** 1255 - * Check if a blog is the Default blog (The one in the 'Blog' space). 1256 - * 1257 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 1258 - * @param isDefault The resulting boolean. 1259 - *### 1260 -#macro(isDefaultBlog $blogDoc $isDefault) 1261 - #set ($result = false) 1262 - #if ($blogDoc.space == 'Blog') 1263 - #set ($result = true) 1264 - #end 1265 - #setVariable(~"$isDefault~" $result) 1266 -#end 1267 -## 1268 -## 1269 -## 1270 -#** 1271 - * Retrieve the blog posts location (space). 1272 - * 1273 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 1274 - * @param postsLocation The resulting location. 1275 - *### 1276 -#macro(getBlogPostsLocation $blogSpace $postsLocation) 1277 - #getBlogDocument($blogSpace $blogDoc) 1278 - #getBlogProperty($blogDoc 'postsLocation' $blogDoc.space $result) 1279 - #set ($postsLocation = $NULL) 1280 - #setVariable (~"$postsLocation~" $result) 1281 -#end 1282 -## 1283 -## 1284 -## 1285 -#** 1286 - * Retrieve the blog categories location (space). 1287 - * 1288 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 1289 - * @param categoriesLocation The resulting location. 1290 - *### 1291 -#macro(getBlogCategoriesLocation $blogSpace $categoriesLocation) 1292 - #getBlogDocument($blogSpace $blogDoc) 1293 - #getBlogProperty($blogDoc 'categoriesLocation' 'Blog' $result) 1294 - #set ($postsLocation = $NULL) 1295 - #setVariable (~"$categoriesLocation~" $result) 1296 -#end 1297 -###** 1298 - * Return the Query for selecting the blog posts based on the context where the posts are displayed. 1299 - * for example there is 4 different panel contexts: 1300 - * aBlog.aPost or aBlog.WebHome 1301 - * aCategorySpace.aCategory 1302 - * aCategorySpace.WebHome 1303 - * Blog.aPost or Blog.WebHome 1304 - * 1305 - * @param query The query for selecting blog entries. 1306 - * @param queryParams The parameters to bind with the generated query. 1307 - * @param targetDoc The document in which the articles will be displayed. 1308 - *### 1309 -#macro(getAllBlogPostsQueryBasedOnDisplayContext $targetDoc $query $queryParams) 1310 - #set ($query = $NULL) 1311 - #set ($queryParams = $NULL) 1312 - #getCategoryAllBlogPostsQuery($resultQuery) 1313 - #set ($resultQueryParams = \{}) 1314 - #set($sanitizedSpace = $targetDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 1315 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 1316 - ## Get all posts that are in the default blog space('Blog') or in category 'Blog.%' 1317 - #set ($discard = $resultQueryParams.put('space', $targetDoc.space)) 1318 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 1319 - #set($resultQuery = ~"$\{resultQuery} and (doc.space = :space or catList like :catList escape '!')~") 1320 - #elseif($targetDoc.getObject($blogCategoryClassname)) 1321 - ## Get all posts that are in a category aCategorySpace.aCategory 1322 - #set ($discard = $resultQueryParams.put('catList', $targetDoc.fullName)) 1323 - #set($resultQuery = ~"$\{resultQuery} and (catList=:catList)~") 1324 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 1325 - ## Get all posts that are in a category aCategorySpace.% 1326 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 1327 - ## Exclude incategorized posts 1328 - #set ($excludedCategory = ~"$\{targetDoc.space}.WebHome~") 1329 - #if ($targetDoc.space == $defaultBlogSpace) 1330 - #set ($excludedCategory = ~"Blog.Categories.WebHome~") 1331 - #end 1332 - #set ($discard = $resultQueryParams.put('excludedCategory', $excludedCategory)) 1333 - #set($resultQuery = ~"$\{resultQuery} and (catList<>:excludedCategory) and (catList like :catList escape '!')~") 1334 - #else 1335 - ## Get all posts in blog space aBlog 1336 - #getAllBlogPostsQuery($resultQuery) 1337 - #getBlogPostsLocation($targetDoc.space $postsLocation) 1338 - #set ($discard = $resultQueryParams.put('space', $postsLocation)) 1339 - #set($resultQuery = ~"$\{resultQuery} and doc.space = :space~") 1340 - #end 1341 - #setVariable(~"$query~" $resultQuery) 1342 - #setVariable(~"$queryParams~" $resultQueryParams) 1343 -#end 1344 -## 1345 -## 1346 -## 1347 -###** 1348 - * Display blog posts based on the context where the posts are displayed. 1349 - * for example there is 4 different panel contexts: 1350 - * aBlog.aPost or aBlog.WebHome 1351 - * aCategorySpace.aCategory 1352 - * aCategorySpace.WebHome 1353 - * Blog.aPost or Blog.WebHome 1354 - * 1355 - * @param targetDoc The document in which the articles will be displayed. 1356 - * @param postsVisiblity The visibility of the posts to display: recent, unpublished, ... 1357 - * @param layout Layout of the the posts to display 1358 - * @param layoutParams additional layout parameters, it is a string like 'param1=val1|...|paramN=valueN' 1359 - * @param limit the number of posts to display 1360 - *### 1361 -#macro(displayBlogPostsBasedOnContext $targetDoc $postsVisiblity $layout $layoutParams $limit) 1362 - #if ($postLayout == 'full') 1363 - #set ($macro.paginated = 'yes') 1364 - #end 1365 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 1366 - ## Display all posts that are in the default blog space('Blog') or in category 'Blog.%' 1367 - #getBlogPostsLayout($xwiki.getDocument(~"$\{defaultBlogSpace}.WebHome~") $postsLayout) 1368 - #if (~"$!layout~" == '') 1369 - #set ($layout = $postsLayout) 1370 - #end 1371 - #if ($postsVisiblity == 'recent') 1372 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 1373 - #elseif($postsVisiblity == 'unpublished') 1374 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 1375 - #end 1376 - #elseif($targetDoc.getObject($blogCategoryClassname)) 1377 - ## Display all posts that are in a category aCategorySpace.aCategory 1378 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 1379 - #getBlogPostsLayout($blogDoc $postsLayout) 1380 - #if (~"$!layout~" == '') 1381 - #set ($layout = $postsLayout) 1382 - #end 1383 - #if ($postsVisiblity == 'recent') 1384 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 1385 - #elseif($postsVisiblity == 'unpublished') 1386 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 1387 - #end 1388 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 1389 - ## Display all posts that are in a category aCategorySpace.% 1390 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 1391 - #getBlogPostsLayout($blogDoc $postsLayout) 1392 - #if (~"$!layout~" == '') 1393 - #set ($layout = $postsLayout) 1394 - #end 1395 - #if ($postsVisiblity == 'recent') 1396 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 1397 - #elseif($postsVisiblity == 'unpublished') 1398 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 1399 - #end 1400 - #else 1401 - ## Display all posts in blog space aBlog 1402 - #getBlogDocument($targetDoc.space $blogDoc) 1403 - #getBlogPostsLayout($blogDoc $postsLayout) 1404 - #if (~"$!layout~" == '') 1405 - #set ($layout = $postsLayout) 1406 - #end 1407 - #if ($postsVisiblity == 'recent') 1408 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 1409 - #elseif($postsVisiblity == 'unpublished') 1410 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 1411 - #end 1412 - #end 1413 -#end 1414 -## 1415 -## 1416 -## 1417 -#** 1418 - * Bind parameters to a query object. 1419 - * 1420 - * @param queryObj The query object (org.xwiki.query.internal.ScriptQuery object) 1421 - * @param queryParams the query parameters. 1422 - *### 1423 -#macro(bindQueryParameters $queryObj $queryParams) 1424 - #set ($output = $queryObj) 1425 - #foreach( $key in $queryParams.keySet() ) 1426 - #set($output = $queryObj.bindValue($key, $queryParams.get($key))) 1427 - #end 1428 - #setVariable(~"$queryObj~" $output) 1429 -#end 1430 -## 1431 -## 1432 -## 1433 -#** 1434 - * Determines the blogposts layout: Default layout (Calendar), Image thumbnail 1435 - * 1436 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>postsLayout</tt> 1437 - * property set. 1438 - * @param postsLayout The resulting string. If the blog object does not define anything, it is considered full (default). 1439 - *### 1440 -#macro(getBlogPostsLayout $blogDoc $postsLayout) 1441 - #getBlogProperty($blogDoc 'postsLayout' 'full' $res) 1442 - #set ($postsLayout = $NULL) 1443 - #setVariable (~"$postsLayout~" $res) 1444 -#end 1445 -## 1446 -## 1447 -## 1448 -#** 1449 - * Retrieve the blog document of a categories space, which is the blog descriptor that have its categoriesLocation property set to the categories space 1450 - * 1451 - * @param categoriesSpace A <tt>String</tt>, the name of the space. 1452 - * @param blogDoc The resulting XDocument. 1453 - *### 1454 -#macro(getBlogDocumentForCategoriesSpace $categoriesSpace $blogDoc) 1455 - #set($macro.blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as categoriesLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=categoriesLocationProp.id.id and categoriesLocationProp.id.name='categoriesLocation' and categoriesLocationProp.value=:categoriesLocation order by doc.creationDate~").setLimit(1).setOffset(0).bindValue('categoriesLocation', $categoriesSpace).execute()) 1456 - #if($macro.blogDocs.size() > 0 && $categoriesSpace != $defaultBlogSpace) 1457 - #set($macro.result = $xwiki.getDocument($macro.blogDocs.get(0))) 1458 - #else 1459 - ## Fallback to Blog.WebHome, the default blog 1460 - #set($macro.result = $xwiki.getDocument('Blog.WebHome')) 1461 - #end 1462 - #set ($blogDoc = $NULL) 1463 - #setVariable (~"$blogDoc~" $macro.result) 1464 -#end" %) 1465 -((( 1466 -(% class="macro-placeholder hidden" %) 1467 -((( 1468 -macro:velocity 1469 1469 ))) 1470 -))) 1471 -))) 1472 - 1473 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogPostLayoutMacros~"" %) 1474 -((( 1475 -(% class="macro-placeholder hidden" %) 1476 -((( 1477 -macro:include 1478 -))) 1479 - 1480 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|#** 1481 - * Extract the layout parameters from a string. 1482 - * 1483 - * @param layoutParamsString The string representation of the layout parameters. 1484 - * It should contain a String following this format ~"paramName1=Value1|paramName2=Value2|...|paramNameK=ValueK~" 1485 - * @param layoutsParameters The resulting layout parameters Map. 1486 - *### 1487 -#macro(extractLayoutParametersFromString $layoutParamsString $layoutsParameters) 1488 - #set ($layoutsParameters = $NULL) 1489 - #set ($macro.layoutParams = \{}) 1490 - #if (~"$!layoutParamsString~" != '') 1491 - #set ($macro.paramsArr = $layoutParamsString.split('\\|')) 1492 - #foreach ($item in $macro.paramsArr) 1493 - #set ($itemSplit = $item.split('=')) 1494 - #if ($itemSplit.size() == 2) 1495 - #set ($discard = $macro.layoutParams.put($itemSplit[0].trim(), $itemSplit[1].trim())) 1496 - #end 1497 - #end 1498 - #end 1499 - #setVariable(~"$layoutsParameters~" $macro.layoutParams) 1500 -#end" %) 1501 -((( 1502 -(% class="macro-placeholder hidden" %) 1503 -((( 1504 -macro:velocity 1505 -))) 1506 -))) 1507 -))) 1508 - 1509 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-| #macro(displaySmallPost $pDoc $pObj) 1510 - #initLayoutVars($pDoc $pObj) 1511 - <div class=~"col-xs-12 col-sm-6 next_blog~"> 1512 - <a href=~"$pDoc.uRL~" class=~"thumbnail~"> 1513 - <div class=~"row~"> 1514 - <div class=~"col-xs-4~"> 1515 - #if ($imageAtt) 1516 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 1517 - #end 1518 - </div> 1519 - <div class=~"col-xs-8 art_det~"> 1520 - <p class=~"text-left~"> 1521 - #if($displayTitle)$!postTitle #end 1522 - <br/><span class=~"date_info~"> $!dateStr </span> 1523 - </p> 1524 - #displayPostDetails($pDoc) 1525 - </div> 1526 - </div> 1527 - </a> 1528 - </div> 1529 - #end 1530 - ## 1531 - ## 1532 - ## 1533 - #macro(displayPinnedPost $pDoc $pObj) 1534 - #initLayoutVars($pDoc $pObj) 1535 - <div class=~"col-xs-12 col-sm-4 col-md-4 blog_pin~"> 1536 - <a href=~"$pDoc.uRL~" class=~"all-post-link~"> 1537 - <div class=~"thumbnail~"> 1538 - #if ($displayTitle && $displayTitleFirstOnPinnedPosts) 1539 - <h5 class=~"title-top~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 1540 - #end 1541 - #if ($imageAtt) 1542 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 1543 - #end 1544 - <div class=~"caption~"> 1545 - #if ($displayTitle && !$displayTitleFirstOnPinnedPosts) 1546 - <h5 class=~"text-left~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 1547 - #end 1548 - #if ($displaySummaryOnPinnedPosts) 1549 - <div class=~"text-left post-summary~"> 1550 - #set ($postContent = $pObj.getProperty('extract').value) 1551 - $!pDoc.getRenderedContent($postContent, $pDoc.syntax.toIdString()) 1552 - </div> 1553 - #end 1554 - #displayPostDetails($pDoc) 1555 - </div> 1556 - </div> 1557 - </a> 1558 - </div> 1559 - #end 1560 - ## 1561 - ## 1562 - ## 1563 - #macro(formatPostDate $pDoc $pObj) 1564 - #set ($formattedDate = $NULL) 1565 - #set($dateStr = $datetool.format('medium', $postDate, $xcontext.locale)) 1566 - #if (~"$!dateStr~" != '') 1567 - #set ($dateArr = $dateStr.split(' ')) 1568 - #if ($dateArr.size() > 3) 1569 - #set ($dateStr = ~"~") 1570 - #foreach($s in $dateArr.subList(0, 3)) 1571 - #set ($dateStr = ~"$\{dateStr}$\{s} ~") 1572 - #end 1573 - #end 1574 - #end 1575 - #setVariable(~"$formattedDate~" $dateStr) 1576 - #end 1577 - ## 1578 - ## 1579 - ## 1580 - #macro(displayPostDetails $pDoc) 1581 - <div class=~"row post-details~"> 1582 - <div class=~"col-xs-8 detail~"> 1583 - #if ($services.like.displayButton($pDoc.documentReference)) 1584 - #set ($optLikeRecord = $services.like.getLikes($pDoc.documentReference)) 1585 - ## Retrieve the likes number in XWiki 12.9+ 1586 - #set ($likeNumber = $optLikeRecord.get()) 1587 - #if (!$stringtool.isNumeric($likeNumber.toString())) 1588 - ## Retrieve the likes number in XWiki versions greater than 12.7 and lower than 12.9. 1589 - #set ($likeNumber = $optLikeRecord.get().likeNumber) 1590 - #end 1591 - #if ($stringtool.isNumeric($likeNumber.toString())) 1592 - <div class=~"post-likes btn btn-default disabled badge~" 1593 - title=~"$escapetool.xml($services.localization.render('like.button.title', [$likeNumber]))~"> 1594 - $services.icon.renderHTML('heart') <span class=~"like-number~">$likeNumber</span> 1595 - </div> 1596 - #end 1597 - #elseif ($services.ratings) 1598 - #set ($ratingsConfigDoc = $services.ratings.getConfigurationDocument($pDoc.documentReference)) 1599 - #if ($ratingsConfigDoc.getValue('displayRatings') == 1) 1600 - <ul class=~"pull-left note list-inline~"> 1601 - #foreach ($x in [1..5]) 1602 - #set ($cls = ~"~") 1603 - #if ($x > $averageVote) 1604 - #set ($cls = ~"-o~") 1605 - #end 1606 - <li><span class=~"fa fa-star$\{cls}~"></span></li> 1607 - #end 1608 - </ul> 1609 - #end 1610 - #end 1611 - </div> 1612 - #if ($showPostComments) 1613 - <div class=~"col-xs-4 com_det~"> 1614 - <p class=~"text-right~">$services.icon.renderHTML('comments') ($!nbComments)</p> 1615 - </div> 1616 - #end 1617 - </div> 1618 - #end 1619 - ## 1620 - ## 1621 - ## 1622 - #macro(initLayoutVars $pDoc $pObj) 1623 - #set ($postTitle = $pDoc.display('title', 'view', $pObj)) 1624 - #set ($imageAtt = $pDoc.getAttachment($pObj.getValue('image'))) 1625 - #isPublished($pObj $isPublished) 1626 - #isHidden($pObj $isHidden) 1627 - #getEntryDate($pDoc $pObj $postDate) 1628 - #formatPostDate($postDate $dateStr) 1629 - #set ($averageVote = $mathtool.round($services.ratings.getAverageRating($pDoc.documentReference).getAverageVote())) 1630 - #set ($nbComments = $pDoc.getComments().size()) 1631 - #set ($showPostComments = true) 1632 - #if ($xwiki.getSpacePreferenceFor('showcomments', $pDoc.documentReference.lastSpaceReference, '1') == '0') 1633 - #set ($showPostComments = false) 1634 - #end 1635 - #end 1636 - ## 1637 - ## 1638 - ## 1639 - #macro(displayEditPinnedPostsButton) 1640 - #if (~"$!macroAdditionalParams.get('postIndex')~" == '0' && $services.security.authorization.hasAccess('edit', $pinnedPostsSourceDoc.fullName)) 1641 - #set ($discard = $xwiki.ssx.use('Blog.PinnedPostsSheet')) 1642 - #set ($discard = $xwiki.jsx.use('Blog.PinnedPostsSheet')) 1643 - #set ($editPinnedPostsURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'get', 'sheet=Blog.PinnedPostsSheet')) 1644 - #set ($newPinnedPostsObjectURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'objectadd', ~"classname=Blog.PinnedPostsClass&form_token=$!\{services.csrf.getToken()}~")) 1645 - <div class=~"edit-pinned-posts-container~"> 1646 - <div class=~"col-xs-12 col-sm-12 col-md-12 text-right edit-pinned-posts~"> 1647 - <a href=~"javascript:;~" class=~"editPinnedPosts~"> 1648 - <span class=~"glyphicon glyphicon-edit~" aria-hidden=~"true~"></span> $services.localization.render('blog.post.layout.cards.pinnedposts.edit') 1649 - </a> 1650 - <input type=~"hidden~" id=~"editPinnedPostsURL~" value=~"$escapetool.xml($editPinnedPostsURL)~"/> 1651 - <input type=~"hidden~" id=~"newPinnedPostsObjectURL~" value=~"$escapetool.xml($newPinnedPostsObjectURL)~"/> 1652 - </div> 1653 - </div> 1654 - #if (~"$!pinnedPostsObj~" == '') 1655 - <input type=~"hidden~" name=~"createPinnedPostsObject~" value=~"1~"/> 1656 - #end 1657 - #end 1658 - #end" %) 1659 -((( 1660 -(% class="macro-placeholder hidden" %) 1661 -((( 1662 -macro:velocity 1663 -))) 1664 -))) 1665 - 1666 -(% class="macro" data-macro="startmacro:velocity|-||-| #if ($services.security.authorization.hasAccess('view', $xcontext.macro.params.reference)) 1667 - #set ($postDoc = $xwiki.getDocument($xcontext.macro.params.reference)) 1668 - #getEntryObject($postDoc $postObj) 1669 - #if (~"$!postObj~" != '') 1670 - #extractLayoutParametersFromString($xcontext.macro.params.params $macroAdditionalParams) 1671 - ## 1672 - #set ($displayTitle = true) 1673 - #if (~"$!macroAdditionalParams.get('displayTitle')~" == 'false') 1674 - #set ($displayTitle = false) 1675 - #end 1676 - ## 1677 - #set ($displayTitleFirstOnPinnedPosts = false) 1678 - #if (~"$!macroAdditionalParams.get('displayTitleFirstOnPinnedPosts')~" == 'true') 1679 - #set ($displayTitleFirstOnPinnedPosts = true) 1680 - #end 1681 - ## 1682 - #set ($displaySummaryOnPinnedPosts = true) 1683 - #if (~"$!macroAdditionalParams.get('displaySummaryOnPinnedPosts')~" == 'false') 1684 - #set ($displaySummaryOnPinnedPosts = false) 1685 - #end 1686 - ## 1687 - #set ($postIndex = $numbertool.toNumber($macroAdditionalParams.get('postIndex')).intValue()) 1688 - #if ($postIndex == 0) 1689 - #set ($stopBlogPostsDisplay = false) 1690 - #end 1691 - #set ($listResultsCount = $numbertool.toNumber($macroAdditionalParams.get('list-results-count')).intValue()) 1692 - #set($discard = $xwiki.ssx.use('Blog.BlogPostLayoutCards')) 1693 - #set($scaleWidth = 600) 1694 - #set($imgQs=~"width=$scaleWidth~") 1695 - ## Display pinned posts 1696 - ## Get the list of pinned posts 1697 - #set ($pinnedPosts = []) 1698 - #set ($pinnedPostsSourceDoc = $NULL) 1699 - #if (~"$!macroAdditionalParams.get('forceDisplayPinnedPosts')~" == 'true' && ~"$!macroAdditionalParams.get('list-blog')~" != '') 1700 - #set ($pinnedPostsSourceDoc = $xwiki.getDocument($macroAdditionalParams.get('list-blog'))) 1701 - ## Note that the 'list-blog' parameter contains the value of the 'blog' parameter of the blogpostlist macro passed to the current layout macro 1702 - #end 1703 - #if (~"$!pinnedPostsSourceDoc~" != '') 1704 - #set ($pinnedPostsObj = $pinnedPostsSourceDoc.getObject('Blog.PinnedPostsClass')) 1705 - #if (~"$!pinnedPostsObj~" != '') 1706 - #set ($orderedPinnedPostsJSON = $pinnedPostsObj.getProperty('orderedPosts').value) 1707 - #if (~"$!orderedPinnedPostsJSON~" != '') 1708 - #set ($pinnedPosts = $jsontool.parse($orderedPinnedPostsJSON)) 1709 - #else 1710 - #set ($pinnedPosts = $pinnedPostsObj.getProperty('posts').value) 1711 - #end 1712 - #end 1713 - #if ($postIndex == 0 && $pinnedPosts.size() > 0) 1714 - \{\{html clean=~"false~"}} 1715 - #set ($x = 0) 1716 - #set ($showPinnedPostsButton = true) 1717 - #foreach ($pinnedPost in $pinnedPosts) 1718 - #if ($x == 0) 1719 - <div class=~"row flex-container~"> 1720 - #if ($showPinnedPostsButton) 1721 - #displayEditPinnedPostsButton() 1722 - #set($showPinnedPostsButton = false) 1723 - #end 1724 - #end 1725 - #set ($pinnedPostDoc = $xwiki.getDocument($pinnedPost)) 1726 - #getEntryObject($pinnedPostDoc $pinnedPostObj) 1727 - #if (~"$!pinnedPostObj~" != '') 1728 - #displayPinnedPost($pinnedPostDoc $pinnedPostObj) 1729 - #end 1730 - #set ($x = $mathtool.add($x, 1)) 1731 - #if ($x == 3) 1732 - #set ($x = 0) 1733 - </div> 1734 - #end 1735 - #end 1736 - #if ($mathtool.mod($x, 3) != 0) 1737 - </div> 1738 - #end 1739 - \{\{/html}} 1740 - 1741 - ## If the first post is a pinned post : this means that all the posts are pinned 1742 - ## In this case, avoid displaying the posts again after the pinned posts section. 1743 - #if ($pinnedPosts.contains($xcontext.macro.params.reference)) 1744 - #set ($stopBlogPostsDisplay = true) 1745 - #end 1746 - #elseif($postIndex == 0 && $pinnedPosts.size() == 0) 1747 - 1748 - \{\{html}} 1749 - <div class=~"row no-pinnded-posts~"> 1750 - #displayEditPinnedPostsButton() 1751 - </div> 1752 - \{\{/html}} 1753 - 1754 - #end 1755 - #end 1756 - #if (!$stopBlogPostsDisplay) 1757 - \{\{html clean=~"false~"}} 1758 - #if (~"$!nbDisplayedPosts~" == '' || $postIndex == 0) 1759 - #set ($nbDisplayedPosts = 0) 1760 - #end 1761 - #if($mathtool.mod($nbDisplayedPosts, 2) == 0) 1762 - #if ($nbDisplayedPosts != 0) 1763 - </div> 1764 - #set ($lastHtmlTag = 'c') 1765 - #end 1766 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 1767 - <div class=~"row~"> 1768 - #set ($lastHtmlTag = 'o') 1769 - #set ($lastRowClass = ~"~") 1770 - #else 1771 - <div class=~"row flex-container~"> 1772 - #set ($lastHtmlTag = 'o') 1773 - #set ($lastRowClass = ~"flex~") 1774 - #end 1775 - #end 1776 - #displaySmallPost($postDoc $postObj) 1777 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 1778 - </div> 1779 - #set ($lastHtmlTag = 'c') 1780 - #end 1781 - #set ($nbDisplayedPosts = $mathtool.add($nbDisplayedPosts, 1)) 1782 - #if ($postIndex == $mathtool.sub($listResultsCount, 1)) 1783 - #if (~"$!lastHtmlTag~" == 'o') 1784 - #if ($mathtool.mod($nbDisplayedPosts, 2) == 1 && $lastRowClass == ~"flex~") 1785 - <div class=~"col-xs-12 col-sm-6~"></div> 1786 - #end 1787 - </div> 1788 - #end 1789 - #end 1790 - \{\{/html}} 1791 - #end 1792 - #else 1793 - \{\{error}}$services.localization.render('blog.blogpostlayout.notpost', [$xcontext.macro.params.reference])\{\{/error}} 1794 - #end 1795 - #else 1796 - \{\{error}}$services.localization.render('blog.blogpostlayout.post_view_not_allowed', [$xcontext.macro.params.reference])\{\{/error}} 1797 - #end" %) 1798 -((( 1799 -(% class="macro-placeholder hidden" %) 1800 -((( 1801 -macro:velocity 1802 -))) 1803 - 1804 -(% class="macro" data-macro="startmacro:html|-|clean=~"false~"|-|<div class=~"row flex-container~"> 1805 -<div class=~"col-xs-12 col-sm-6 next_blog~"> 1806 -<a href=~"/Nieuws/Nieuwsbrief%20januari%202024~" class=~"thumbnail~"> 1807 -<div class=~"row~"> 1808 -<div class=~"col-xs-4~"> 1809 -<img src=~"/download/Nieuws/Nieuwsbrief%20januari%202024/man-outdoor-light-architecture-people-street-1194699-pxhere.com.jpg?width=600&rev=1.1~" /> 1810 -</div> 1811 -<div class=~"col-xs-8 art_det~"> 1812 -<p class=~"text-left~"> 1813 -Nieuwsbrief januari 2024 <br/><span class=~"date_info~"> Feb 5, 2024, </span> 1814 -</p> 1815 -<div class=~"row post-details~"> 1816 -<div class=~"col-xs-8 detail~"> 1817 -<div class=~"post-likes btn btn-default disabled badge~" 1818 -title=~"Number of likes on this page: 3~"> 1819 -<span class=~"fa fa-heart~"></span> <span class=~"like-number~">3</span> 1820 -</div> 1821 -</div> 1822 -<div class=~"col-xs-4 com_det~"> 1823 -<p class=~"text-right~"><span class=~"fa fa-comments~"></span> (0)</p> 1824 -</div> 1825 -</div> 1826 -</div> 1827 -</div> 1828 -</a> 1829 -</div>" %) 1830 -((( 1831 -(% class="macro-placeholder hidden" %) 1832 -((( 1833 -macro:html 1834 -))) 1835 - 1836 -(% class="row flex-container" %) 1837 -((( 1838 -(% class="col-xs-12 col-sm-6 next_blog" %) 1839 -((( 1840 -(% class="row" %) 1841 -((( 1842 -(% class="col-xs-4" %) 1843 -((( 1844 -[[~[~[image:/download/Nieuws/Nieuwsbrief%20januari%202024/man-outdoor-light-architecture-people-street-1194699-pxhere.com.jpg?width=600&rev=1.1~]~]>>path:/Nieuws/Nieuwsbrief%20januari%202024||class="thumbnail"]] 1845 -))) 1846 - 1847 -(% class="col-xs-8 art_det" %) 1848 -((( 1849 -(% class="text-left" %) 1850 -[[Nieuwsbrief januari 2024 1851 -(% class="date_info" %) Feb 5, 2024,>>path:/Nieuws/Nieuwsbrief%20januari%202024||class="thumbnail"]] 1852 - 1853 -(% class="row post-details" %) 1854 -((( 1855 -(% class="col-xs-8 detail" %) 1856 -((( 1857 -(% class="post-likes btn btn-default disabled badge" title="Number of likes on this page: 3" %) 1858 -((( 1859 -[[(% class="like-number" %)3>>path:/Nieuws/Nieuwsbrief%20januari%202024||class="thumbnail"]] 1860 -))) 1861 -))) 1862 - 1863 -(% class="col-xs-4 com_det" %) 1864 -((( 1865 -(% class="text-right" %) 1866 -[[(0)>>path:/Nieuws/Nieuwsbrief%20januari%202024||class="thumbnail"]] 1867 -))) 1868 -))) 1869 -))) 1870 -))) 1871 -))) 1872 - 1873 -(% class="macro" data-macro="startmacro:blogPostLayoutCards|-|reference=~"Nieuws.Audit BMI en BORG~" params=~"displayTitle=true|useSummary=true|list-limit=10|list-layout=cards|list-blog=Nieuws.WebHome|list-paginated=no|list-results-count=10|postIndex=0|previousPostReference=|postIndex=1|previousPostReference=Nieuws.Nieuwsbrief januari 2024~"" %) 1874 -((( 1875 -(% class="macro-placeholder hidden" %) 1876 -((( 1877 -macro:blogPostLayoutCards 1878 -))) 1879 - 1880 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogCode~"" %) 1881 -((( 1882 -(% class="macro-placeholder hidden" %) 1883 -((( 1884 -macro:include 1885 -))) 1886 - 1887 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogParameters~"" %) 1888 -((( 1889 -(% class="macro-placeholder hidden" %) 1890 -((( 1891 -macro:include 1892 -))) 1893 - 1894 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## Blog 1895 -#set($blogClassname = 'Blog.BlogClass') 1896 -#set($blogTemplate = 'Blog.BlogTemplate') 1897 -#set($blogSheet = 'Blog.BlogSheet') 1898 -## Blog entries 1899 -#set($blogPostClassname = 'Blog.BlogPostClass') 1900 -#set($blogPostTemplate = 'Blog.BlogPostTemplate') 1901 -#set($blogPostSheet = 'Blog.BlogPostSheet') 1902 -#set($blogPostObjectNumber = $xwiki.getDocument($blogPostTemplate).getObject($blogPostClassname).number) 1903 -#set($oldArticleClassname = 'XWiki.ArticleClass') 1904 -## Categories 1905 -#set($blogCategoryClassname = 'Blog.CategoryClass') 1906 -#set($blogCategoryTemplate = 'Blog.CategoryTemplate') 1907 -#set($blogCategorySheet = 'Blog.CategorySheet') 1908 -#set($blogCategoriesSheet = 'Blog.CategoriesSheet') 1909 -#set($oldBlogCategoryClassname = 'Blog.Categories') 1910 -#set($defaultCategoryParent = 'Blog.Categories') 1911 -## Style 1912 -#set($blogStyleDocumentName = 'Blog.BlogStyle') 1913 -#set($blogStyleDocument = $xwiki.getDocument($blogStyleDocumentName)) 1914 -## Clientside scripts 1915 -#set($blogScriptsDocumentName = 'Blog.BlogScripts') 1916 -#set($blogPublisher = $xwiki.getDocument('Blog.Publisher')) 1917 -## Misc 1918 -#set($thisURL = $doc.getURL($xcontext.action, $request.queryString)) 1919 -#set($isBlogPost = $doc.getObject($blogPostClassname)) 1920 -#set($defaultBlogSpace = 'Blog') 1921 -#set($isCategoryPage = $doc.getObject($blogCategoryClassname)) 1922 -#set($isCategoriesHomePage = $doc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 1923 -## 1924 -## 1925 -## 1926 -#** 1927 - * Displays an image, taken from the blog style document. 1928 - * 1929 - * @param $imgName The name of the icon from icons set to use. 1930 - *# 1931 -#macro(toolImage $imgName)(% class=~"icon-manage~"~%)$services.icon.render($imgName)(%~%)#end" %) 1932 -((( 1933 -(% class="macro-placeholder hidden" %) 1934 -((( 1935 -macro:velocity 1936 -))) 1937 -))) 1938 -))) 1939 - 1940 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## 1941 -## 1942 -## 1943 -## Import the blog skin and javascripts. 1944 -$!xwiki.ssx.use($blogStyleDocumentName)## 1945 -$!xwiki.jsx.use($blogScriptsDocumentName)## 1946 -## 1947 -## import the hierarchy for the path the blog post footer (in displayEntryBlogLocation) 1948 -#template('hierarchy_macros.vm')## 1949 -## 1950 -## 1951 -#** 1952 - * Prints a blog. This is the main macro used in the BlogSheet. 1953 - * 1954 - * @param blogDoc the XDocument holding the blog definition object. 1955 - *### 1956 -#macro(printBlog $blogDoc) 1957 - \{\{include reference='Blog.CreatePost'/}} 1958 - 1959 - ## Use the blogPostList macro to display the blogposts 1960 - ## The blogPostList is used only in case of 'all' or 'paged' blog display type because the blogPostList macro 1961 - ## do not support FTM the monthly and weekly blog display types 1962 - #getBlogDisplayType($blogDoc $displayType) 1963 - #if ($displayType == 'weekly' || $displayType == 'monthly') 1964 - #getBlogEntries($blogDoc $entries) 1965 - #displayBlog($entries 'index' true true) 1966 - #displayNavigationLinks($blogDoc) 1967 - #else 1968 - #getBlogDisplayType($blogDoc $displayType) 1969 - #set ($paginated = 'no') 1970 - #if ($displayType == 'paginated') 1971 - #set ($paginated = 'yes') 1972 - #end 1973 - #getBlogPostsLayout($blogDoc $postsLayout) 1974 - (% class=~"hfeed index~" ~%)(((\{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$paginated~" layout=~"$!postsLayout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" /}}))) 1975 - #end 1976 -#end 1977 -## 1978 -## 1979 -## 1980 -#** 1981 - * Shows blog information. In view mode, the description is printed. In edit mode, allows changing blog settings: title, 1982 - * description, blog type (global or in-space), index display type (fixed size pagination, weekly index, monthly index, 1983 - * all entries). 1984 - * 1985 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 1986 - *### 1987 -#macro(showBlogInfo $blogDoc) 1988 - #if($blogDoc.getObject($blogClassname)) 1989 - ## Keep testing for inline action for backward compatibility with older blogs. 1990 - #if($xcontext.action == 'edit' || $xcontext.action == 'inline') 1991 - #macro(displayProperty $blogDoc $propname) 1992 - ; #displayPropName($xwiki.getClass($blogClassname).get($propname)): 1993 - : $blogDoc.display($propname) 1994 - #end 1995 - #displayProperty($blogDoc 'title') 1996 - #displayProperty($blogDoc 'description') 1997 - #displayProperty($blogDoc 'displayType') 1998 - #displayProperty($blogDoc 'itemsPerPage') 1999 - #displayProperty($blogDoc 'postsLayout') 2000 - #displayProperty($blogDoc 'postsLayoutParameters') 2001 - #else 2002 - $blogDoc.display('description') 2003 - #end 2004 - #elseif($doc.fullName == $blogSheet) 2005 -= $services.localization.render('blog.code.blogsheet') = 2006 - \{\{translation key='blog.code.sheetexplanation'/}} 2007 - #else 2008 - \{\{warning}}\{\{translation key='blog.code.notblog'/}}\{\{/warning}} 2009 - #end 2010 -#end 2011 -## 2012 -## 2013 -## 2014 -#** 2015 - * Retrieve the blog document, which usually is either <tt><Space>.WebHome</tt> for whole-spaces blogs, or 2016 - * <tt><Space>.Blog</tt> for in-space blogs. If none of these documents contains a blog object, then the first 2017 - * (alphabetically) document in the target space that contains one is returned. Finally, if no document in the current 2018 - * space contains a blog object, then <tt>Blog.WebHome</tt> is returned as the default blog. 2019 - * 2020 - * @param space A <tt>String</tt>, the name of the space where to search. 2021 - * @param blogDoc The resulting XDocument. 2022 - *### 2023 -#macro(getBlogDocument $space $blogDoc) 2024 - #set ($result = $NULL) 2025 - ## Check if the current space has a WebPreferences page that contains a Blog.EnablePanelsConfigurationClass object. 2026 - ## It is possible to display a blog's panels info in a page that is not inside a blog and in that case we need to 2027 - ## identify the right blog based on a configuration object in a WebPreferences page. 2028 - #set ($spaceReference = $services.model.resolveSpace($space)) 2029 - #set ($preferencesDocRef = $services.model.createDocumentReference('WebPreferences', $spaceReference)) 2030 - #set ($preferencesDoc = $xwiki.getDocument($preferencesDocRef)) 2031 - #set ($preferencesObj = $preferencesDoc.getObject('Blog.EnablePanelsConfigurationClass')) 2032 - #if ($preferencesObj) 2033 - #set ($result = $xwiki.getDocument( $preferencesObj.getValue('blog'))) 2034 - #end 2035 - ## If no special case occurs (like the previous one), identify a blog by checking the current location from its hierarchy. 2036 - #if (~"$!result~" == '') 2037 - ## First, try the Space.WebHome, for a whole-space blog 2038 - #set($result = $xwiki.getDocument(~"$\{space}.WebHome~")) 2039 - #if(!$result.getObject($blogClassname)) 2040 - ## Second, try the Space.Blog document 2041 - #set($result = $xwiki.getDocument(~"$\{space}.Blog~")) 2042 - #if(!$result.getObject($blogClassname)) 2043 - ## Third, try searching for a blog document in the current space 2044 - ## Prevent the query fail when the space contains dots '.' 2045 - #set($blogDocs = $services.query.hql(~", BaseObject obj where doc.space = :space and obj.name = doc.fullName and obj.className = '$blogClassname' order by doc.name~").setLimit(1).setOffset(0).bindValue('space', $space).execute()) 2046 - #if($blogDocs.size() > 0) 2047 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 2048 - #else 2049 - ## Fourth, try searching for a blog document that have the its 'postsLocation' set to the current space 2050 - #set($blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as postsLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=postsLocationProp.id.id and postsLocationProp.id.name='postsLocation' and postsLocationProp.value=:postsLocation order by doc.name~").setLimit(1).setOffset(0).bindValue('postsLocation', $space).execute()) 2051 - #if($blogDocs.size() > 0) 2052 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 2053 - #else 2054 - ## Last, fallback to Blog.WebHome, the default blog 2055 - #set($result = $xwiki.getDocument('Blog.WebHome')) 2056 - #end 2057 - #end 2058 - #end 2059 - #end 2060 - #end 2061 - #set ($blogDoc = $NULL) 2062 - #setVariable (~"$blogDoc~" $result) 2063 -#end 2064 -## 2065 -## 2066 -## 2067 -#** 2068 - * Retrieve the blog title. 2069 - * 2070 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass<tt> object with the <tt>title</tt> property set. 2071 - * @param title The resulting title. 2072 - *### 2073 -#macro(getBlogTitle $blogDoc $title) 2074 - ## Titles can contain velocity code (most commonly translations), so we should evaluate them. 2075 - #set ($title = $NULL) 2076 - #setVariable (~"$title~" $!blogDoc.displayTitle) 2077 -#end 2078 -## 2079 -## 2080 -## 2081 -#** 2082 - * Retrieve the blog description. 2083 - * 2084 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>description</tt> 2085 - * property set. 2086 - * @param description The resulting description. 2087 - *### 2088 -#macro(getBlogDescription $blogDoc $description) 2089 - #getBlogProperty($blogDoc 'description' '' $result) 2090 - #set ($description = $NULL) 2091 - #setVariable (~"$description~" $result) 2092 -#end 2093 -## 2094 -## 2095 -## 2096 -#** 2097 - * Retrieves a list of entries to be displayed. The entries are either part of the blog's space, or have the blog 2098 - * document set as a parent. The number and range of entries returned (from all those belonging to this blog) depends on 2099 - * the blog display type: paginated (fixed number of entries), weekly (all entries in a week), monthly (all entries in a 2100 - * month), or all. 2101 - * 2102 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 2103 - * @param entries The resulting list of entries to display, a list of XDocument names. 2104 - *### 2105 -#macro(getBlogEntries $blogDoc $entries) 2106 - #if (!$entries) 2107 - #setVariable (~"$entries~" []) 2108 - #end 2109 - #getAllBlogPostsQuery($query) 2110 - #isDefaultBlog($blogDoc $isDefault) 2111 - #set($queryParams = \{}) 2112 - #if ($isDefault) 2113 - #getCategoryAllBlogPostsQuery($query) 2114 - #set($query = ~"$\{query} and (doc.creator = :creator or (isPublished.value = 1 and hidden.value = 0)) and (doc.space = :space or catList like :catList escape '!')~") 2115 - #set($discard = $queryParams.put('creator', $xcontext.user)) 2116 - #set($discard = $queryParams.put('space', $blogDoc.space)) 2117 - #set($sanitizedBlogSpace = $blogDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 2118 - #set($discard = $queryParams.put('catList', $sanitizedBlogSpace)) 2119 - #else 2120 - #set($query = ~"$\{query} and (doc.space = :space or doc.parent = :parent)~") 2121 - #getBlogPostsLocation($blogDoc.space $blogPostsLocation) 2122 - #set($discard = $queryParams.put('space', $blogPostsLocation)) 2123 - #set($discard = $queryParams.put('parent', $blogDoc.space)) 2124 - #end 2125 - #getBlogDisplayType($blogDoc $displayType) 2126 - #if($displayType == 'weekly') 2127 - #getWeeklyBlogEntries($blogDoc $query $entries $queryParams) 2128 - #elseif($displayType == 'monthly') 2129 - #getMonthlyBlogEntries($blogDoc $query $entries $queryParams) 2130 - #elseif($displayType == 'all') 2131 - #getAllBlogEntries($blogDoc $query $entries $queryParams) 2132 - #else 2133 - #getPagedBlogEntries($blogDoc $query $entries $queryParams) 2134 - #end 2135 -#end 2136 -## 2137 -## 2138 -## 2139 -#** 2140 - * Retrieves a list of entries to be displayed. The entries are taken from a ~"page~" of the blog, a sequence of documents 2141 - * defined by the request parameters <tt>ipp</tt> (items per page) and <tt>page</tt> (the current page). Initially the 2142 - * first page is displayed, with the number of entries defined in the blog object in the <tt>itemsPerPage</tt> property 2143 - * (10 if not defined). 2144 - * 2145 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 2146 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 2147 - * refined to restrict to a given space, or to a given search criteria, etc. 2148 - * @param entries The resulting list of entries to display, a list of XDocument names. 2149 - * @param queryParams The parameters to bind with the query. 2150 - *### 2151 -#macro(getPagedBlogEntries $blogDoc $query $entries $queryParams) 2152 - #if (!$entries) 2153 - #setVariable (~"$entries~" []) 2154 - #end 2155 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 2156 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~")) 2157 - #bindQueryParameters($countQueryObj $queryParams) 2158 - #bindQueryParameters($queryObj $queryParams) 2159 - #set($totalEntries = $countQueryObj.count()) 2160 - #getBlogProperty($blogDoc 'itemsPerPage' '10' $defaultItemsPerPage) 2161 - #set($defaultItemsPerPage = $numbertool.toNumber($defaultItemsPerPage).intValue()) 2162 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 2163 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 2164 - #set($discard = $entries.addAll($queryObj.setLimit($itemsPerPage).setOffset($startAt).addFilter(~"unique~").execute())) 2165 -#end 2166 -## 2167 -## 2168 -## 2169 -#** 2170 - * Retrieves a list of entries to be displayed. The entries are taken from a week of the blog. The target week is 2171 - * defined by the request parameters <tt>week</tt> (the week number in the year, from 1 to 52) and <tt>year</tt> (4 2172 - * digit year). Initially the current week is displayed. 2173 - * 2174 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 2175 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 2176 - * refined to restrict to a given space, or to a given search criteria, etc. 2177 - * @param entries The resulting list of entries to display, a list of XDocument names. 2178 - * @param queryParams The parameters to bind with the query. 2179 - *### 2180 -#macro(getWeeklyBlogEntries $blogDoc $query $entries $queryParams) 2181 - #if (!$entries) 2182 - #setVariable (~"$entries~" []) 2183 - #end 2184 - #getRequestedWeek($weekDate) 2185 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 2186 - #set($minDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundFloor())) 2187 - #set($maxDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundCeiling())) 2188 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 2189 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 2190 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 2191 - #bindQueryParameters($countQueryObj $queryParams) 2192 - #bindQueryParameters($queryObj $queryParams) 2193 - #set($totalEntries = $countQueryObj.count()) 2194 - #set($discard = $entries.addAll($queryObj.execute())) 2195 -#end 2196 -## 2197 -## 2198 -## 2199 -#** 2200 - * Retrieves a list of entries to be displayed. The entries are taken from a month of the blog. The target month is 2201 - * defined by the request parameters <tt>month</tt> (the month number, from 1 to 12) and <tt>year</tt> (4 2202 - * digit year). Initially the current month is displayed. 2203 - * 2204 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 2205 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 2206 - * refined to restrict to a given space, or to a given search criteria, etc. 2207 - * @param entries The resulting list of entries to display, a list of XDocument names. 2208 - * @param queryParams The parameters to bind with the query. 2209 - *### 2210 -#macro(getMonthlyBlogEntries $blogDoc $query $entries) 2211 - #if (!$entries) 2212 - #setVariable (~"$entries~" []) 2213 - #end 2214 - #getRequestedMonth($monthDate) 2215 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 2216 - #set($minDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundFloor())) 2217 - #set($maxDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundCeiling())) 2218 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 2219 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 2220 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 2221 - #bindQueryParameters($countQueryObj $queryParams) 2222 - #bindQueryParameters($queryObj $queryParams) 2223 - #set($totalEntries = $countQueryObj.count()) 2224 - #set($discard = $entries.addAll($queryObj.execute())) 2225 -#end 2226 -## 2227 -## 2228 -## 2229 -#** 2230 - * Retrieves a list of entries to be displayed. All entries belonging to the current blog are returned. 2231 - * 2232 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 2233 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 2234 - * refined to restrict to a given space, or to a given search criteria, etc. 2235 - * @param entries The resulting list of entries to display, a list of XDocument names. 2236 - * @param queryParams The parameters to bind with the query. 2237 - *### 2238 -#macro(getAllBlogEntries $blogDoc $query $entries $queryParams) 2239 - #if (!$entries) 2240 - #setVariable (~"$entries~" []) 2241 - #end 2242 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 2243 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 2244 - #bindQueryParameters($countQueryObj $queryParams) 2245 - #bindQueryParameters($queryObj $queryParams) 2246 - #set($totalEntries = $countQueryObj.count()) 2247 - #set($discard = $entries.addAll($queryObj.execute())) 2248 -#end 2249 -## 2250 -## 2251 -## 2252 -#** 2253 - * Retrieves a list of entries to be displayed. Only (and all) unpublished entries are returned. 2254 - * 2255 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 2256 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 2257 - * refined to restrict to a given space, or to a given search criteria, etc. 2258 - * @param queryParams The parameters to bind with the query. 2259 - * @param entries The resulting list of entries to display, a list of XDocument names. 2260 - *### 2261 -#macro(getUnpublishedBlogEntries $blogDoc $query $queryParams $entries) 2262 - #if (!$entries) 2263 - #setVariable (~"$entries~" []) 2264 - #end 2265 - #set($query = ~"$\{query} and isPublished.value = 0~") 2266 - #set ($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 2267 - #set ($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 2268 - #bindQueryParameters($countQueryObj $queryParams) 2269 - #bindQueryParameters($queryObj $queryParams) 2270 - #set($totalEntries = $countQueryObj.count()) 2271 - #set($discard = $entries.addAll($queryObj.execute())) 2272 -#end 2273 -## 2274 -## 2275 -## 2276 -#** 2277 - * Retrieves a list of entries to be displayed. The entries are taken from all the wiki, and not from a specific blog. 2278 - * 2279 - * @param entries The resulting list of entries to display, a list of XDocument names. 2280 - *### 2281 -#macro(getGlobalBlogEntries $entries) 2282 - #if (!$entries) 2283 - #setVariable (~"$entries~" []) 2284 - #end 2285 - #getAllBlogPostsQuery($query) 2286 - #set($totalEntries = $services.query.hql($query).count()) 2287 - #set($defaultItemsPerPage = 20) 2288 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 2289 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 2290 - #set($discard = $entries.addAll($services.query.hql(~"$\{query} order by publishDate.value desc~").setLimit($itemsPerPage).setOffset($startAt).execute())) 2291 -#end 2292 -#** 2293 - * Return the base query for selecting blog entries. It filters only visible entries, but does not bind to a specific 2294 - * blog, nor specify a range or an ordering criteria. 2295 - * 2296 - * This macro is a duplicate of #getAllBlogPostsQuery($query). Keep it in case it's used outside, in custom code. 2297 - * 2298 - * @param query The basic query for selecting blog entries. 2299 - *# 2300 -#macro(getBlogEntriesBaseQuery $query) 2301 - #getAllBlogPostsQuery($query) 2302 -#end 2303 -#** 2304 - * Return the Query for selecting the all wiki blog posts without filtering 2305 - * 2306 - * @param query The basic query for selecting blog entries. 2307 - *# 2308 -#macro(getAllBlogPostsQuery $query) 2309 - #set ($query = $NULL) 2310 - #setVariable(~"$query~" ~", BaseObject as obj, IntegerProperty isPublished, 2311 - IntegerProperty hidden, DateProperty publishDate 2312 - where doc.fullName <> '$blogPostTemplate' and 2313 - obj.name=doc.fullName and obj.className='$blogPostClassname' and 2314 - isPublished.id.id = obj.id and isPublished.id.name = 'published' and 2315 - hidden.id.id = obj.id and hidden.id.name='hidden' and 2316 - publishDate.id.id = obj.id and publishDate.id.name='publishDate' and 2317 - (doc.creator = '$escapetool.sql($xcontext.user)' or (isPublished.value = 1 and hidden.value = 0))~") 2318 -#end 2319 -## 2320 -## 2321 -## 2322 -###** 2323 - * Return the Query for selecting the all wiki blog posts with categories filtering 2324 - * 2325 - * @param query The basic query for selecting blog entries. 2326 - *### 2327 -#macro(getCategoryAllBlogPostsQuery $query) 2328 - #set ($query = $NULL) 2329 - #getAllBlogPostsQuery($baseQuery) 2330 - #set ($baseQuery = $baseQuery.replace('DateProperty publishDate', 'DateProperty publishDate, DBStringListProperty as category left join category.list catList')) 2331 - #setVariable(~"$query~" ~"$\{baseQuery} and obj.id=category.id.id and category.id.name='category'~") 2332 -#end 2333 -## 2334 -## 2335 -## 2336 -#** 2337 - * Determines how is the blog index split into pages: paginated (fixed number of entries), weekly (all entries in a 2338 - * week), monthly (all entries in a month), or all. 2339 - * 2340 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>displayType</tt> 2341 - * property set. 2342 - * @param displayType The resulting string. If the blog object does not define anything, it is considered paginated. 2343 - *### 2344 -#macro(getBlogDisplayType $blogDoc $displayType) 2345 - #getBlogProperty($blogDoc 'displayType' 'paginated' $result) 2346 - #set ($displayType = $NULL) 2347 - #setVariable (~"$displayType~" $result) 2348 -#end 2349 -## 2350 -## 2351 -## 2352 -#** 2353 - * Displays a list of entries. 2354 - * 2355 - * @param entries The entries to display, a list of XDocument names. 2356 - * @param displaying What exactly is displayed: blog index, a single blog entry, a blog category, search results, 2357 - * unpublished entries, etc. This will be used as the classname(s) for the container div (hfeed). Currently 2358 - * used values: index, single, category, search, unpublished, hidden. 2359 - * @param onlyExtract If <tt>true</tt>, only display the extract of articles where available, otherwise display the full content. 2360 - * @param shouldDisplayTitles If <tt>true</tt>, display the blog title (blog posts shouldn't display the title when they're 2361 - * displayed alone on their page since it's the page title which is used in this case) 2362 - *### 2363 -#macro(displayBlog $entries $displaying $onlyExtract $shouldDisplayTitles) 2364 - #set($blogDay = '') 2365 - (% class=~"hfeed $!\{displaying}~" ~%)((( 2366 - (% class=~"blogDay~" ~%)((( 2367 - #foreach ($entryDoc in $xwiki.wrapDocs($entries)) 2368 - #getEntryObject($entryDoc $entryObj) 2369 - ## Although all entries should have one of the two objects, better check to be sure. 2370 - #if(~"$!\{entryObj}~" != '') 2371 - #getEntryDate($entryDoc $entryObj $entryDate) 2372 - ## Display a ~"calendar sheet~" for each day. All entries posted on the same day share one such sheet. 2373 - #set($entryDateStr = $xwiki.formatDate($entryDate, 'yyyyMMMMdd')) 2374 - #if($blogDay != $entryDateStr) 2375 - #if($blogDay != '') 2376 - ))) 2377 - (% class=~"blogDay~" ~%)((( 2378 - #end 2379 - #displayBlogDate($entryDate) 2380 - #set ($blogDay = $entryDateStr) 2381 - #end 2382 - ## Finally, display the entry. 2383 - #displayEntry($entryDoc $entryObj $onlyExtract $shouldDisplayTitles true) 2384 - #end 2385 - #end 2386 - )))## blogDay 2387 - )))## hfeed 2388 -#end 2389 -## 2390 -## 2391 -## 2392 -#** 2393 - * Get the entry object, either a new BlogPost or an old Article. 2394 - * 2395 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 2396 - * @param entryObj The resulting xobject of the blog post. 2397 - *### 2398 -#macro(getEntryObject $entryDoc $__entryObj) 2399 - #set($result = $entryDoc.getObject(~"$\{blogPostClassname}~")) 2400 - #if(!$result) 2401 - #set($result = $entryDoc.getObject(~"$\{oldArticleClassname}~")) 2402 - #end 2403 - ## NOTE: The reason we put an underscore in front of the variable name is to prevent the following line from 2404 - ## overwriting the $entryObj variable that may be defined before this macro is called. Of course, $__entryObj may be 2405 - ## overwritten in this case but it's less likely to have such a variable defined before. 2406 - #set ($__entryObj = $NULL) 2407 - #setVariable (~"$__entryObj~" $result) 2408 -#end 2409 -## 2410 -## 2411 -## 2412 -#** 2413 - * Gets the date associated with a blog entry. This is the publication date. For unpublished entries, initially this is 2414 - * the document creation date, but can be edited by the user. 2415 - * 2416 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 2417 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 2418 - * @param result The resulting date, an instance of <tt>java.util.Date</tt>. 2419 - *### 2420 -#macro(getEntryDate $entryDoc $entryObj $result) 2421 - #set ($result = $NULL) 2422 - #setVariable (~"$result~" $entryObj.getProperty('publishDate').value) 2423 -#end 2424 -## 2425 -## 2426 -## 2427 -#** 2428 - * Displays a date, nicely formatted as a calendar page. 2429 - * 2430 - * @param date The date to display, an instance of <tt>java.util.Date</tt>. 2431 - *### 2432 -#macro(displayBlogDate $date) 2433 - #set($year = $xwiki.formatDate($date, 'yyyy')) 2434 - ## 3 letter month name, like Jan, Dec. 2435 - #set($month = $xwiki.formatDate($date, 'MMM')) 2436 - ## Uncomment to get a full length month name, like January, December. 2437 - ## TODO: this could be defined somewhere in the blog style. 2438 - ## #set($month = $xwiki.formatDate($date, 'MMMM')) 2439 - #set($day = $xwiki.formatDate($date, 'dd')) 2440 - (% class=~"blogdate~" ~%) 2441 - == (% class=~"month~" ~%)$month(%~%) (% class=~"day~" ~%)$day(%~%) (% class=~"year~" ~%)$year(%~%) == 2442 -#end 2443 -## 2444 -## 2445 -## 2446 -#** 2447 - * Displays a blog article: management tools, header, content, footer. 2448 - * 2449 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 2450 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 2451 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 2452 - * @param shouldDisplayTitle If <tt>true</tt>, display the blog title (blog posts shouldn't display the title 2453 - * when they're displayed alone on their page since it's the page title which is used in this case) 2454 - * @param shouldDisplayActions If <tt>true</tt>, display the blog post actions buttons 2455 - *### 2456 -#macro(displayEntry $entryDoc $entryObj $onlyExtract $shouldDisplayTitle $shouldDisplayActions) 2457 - ## Only articles with an explicit hidden setting or an explicit unpublished setting are hidden 2458 - #isPublished($entryObj $isPublished) 2459 - #isHidden($entryObj $isHidden) 2460 - #if($doc.fullName == $entryDoc.fullName) 2461 - (% class=~"hentry single-article~" ~%)((( 2462 - #else 2463 - (% class=~"hentry#if(!$isPublished) unpublished-article#elseif($isHidden) hidden-article#end~" ~%)((( 2464 - #end 2465 - #if ($shouldDisplayActions) 2466 - #displayEntryTools($entryDoc $entryObj) 2467 - #end 2468 - #if($shouldDisplayTitle) 2469 - #displayEntryTitle($entryDoc $entryObj) 2470 - #end 2471 - #if($doc.fullName == $entryDoc.fullName) 2472 - #if(!$isPublished) 2473 - \{\{warning}}\{\{translation key='blog.code.published'/}}\{\{/warning}} 2474 - #elseif($isHidden) 2475 - \{\{warning}}\{\{translation key='blog.code.hidden'/}}\{\{/warning}} 2476 - #end 2477 - #end 2478 - #displayEntryContent($entryDoc $entryObj $onlyExtract) 2479 - #displayEntryFooter($entryDoc $entryObj) 2480 - )))## hentry 2481 -#end 2482 -## 2483 -## 2484 -## 2485 -#** 2486 - * Checks if the provided blog is published or not. 2487 - * 2488 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 2489 - * @param isPublished The resulting boolean, true if the entry is considered published. 2490 - *### 2491 -#macro(isPublished $entryObj $isPublished) 2492 - #set ($isPublished = $NULL) 2493 - ## This should work for both old articles, which don't have the 'published' property at all, and 2494 - ## are considered published by default, and new entries, that should have 1 if published. 2495 - #if (~"$!\{entryObj.getProperty('published').value}~" != '0') 2496 - #setVariable (~"$isPublished~" true) 2497 - #else 2498 - #setVariable (~"$isPublished~" false) 2499 - #end 2500 -#end 2501 -## 2502 -## 2503 -## 2504 -#** 2505 - * Checks if the provided blog is hidden or not. 2506 - * 2507 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass<tt> xclass. 2508 - * @param isHiddel The resulting boolean, true if the entry is considered hidden. 2509 - *### 2510 -#macro(isHidden $entryObj $isHidden) 2511 - #set ($isHidden = $NULL) 2512 - ## This should work for both old articles, which don't have the 'hidden' property at all, and 2513 - ## are considered visible by default, and new entries, that should have 1 if hidden. 2514 - #if (~"$!\{entryObj.getProperty('hidden').value}~" == '1') 2515 - #setVariable (~"$isHidden~" true) 2516 - #else 2517 - #setVariable (~"$isHidden~" false) 2518 - #end 2519 -#end 2520 -## 2521 -## 2522 -## 2523 -#** 2524 - * Displays several ~"tools~" for manipulating blog posts: hide/show, publish, edit. 2525 - * 2526 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 2527 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 2528 - *### 2529 -#macro(displayEntryTools $entryDoc $entryObj) 2530 - #if($xcontext.action == 'view') 2531 - (% class=~"blog-entry-toolbox~" ~%)((( 2532 - #displayPublishButton($entryDoc $entryObj) 2533 - #displayHideShowButton($entryDoc $entryObj) 2534 - #displayEditButton($entryDoc $entryObj) 2535 - #displayDeleteButton($entryDoc $entryObj) 2536 - ))) 2537 - #end 2538 -#end 2539 -## 2540 -## 2541 -## 2542 -#** 2543 - * Displays the publish button to the entry <strong>creator</strong>, if the article is not published yet. 2544 - * 2545 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 2546 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 2547 - * @todo AJAX calls. 2548 - *### 2549 -#macro(displayPublishButton $entryDoc $entryObj) 2550 - #isPublished($entryObj $isPublished) 2551 - #if(!$isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 2552 - [[#toolImage('world')>>path:$blogPublisher.getURL('view', ~"entryName=$\{escapetool.url($entryDoc.fullName)}&xredirect=$\{escapetool.url($thisURL)}&form_token=$!\{services.csrf.getToken()}~")||title=~"$services.localization.render('blog.code.notpublished')~"]]## 2553 - #end 2554 -#end 2555 -## 2556 -## 2557 -## 2558 -#** 2559 - * Displays the hide or show button to the entry <strong>creator</strong>, if the article is already published. 2560 - * 2561 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 2562 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 2563 - *### 2564 -#macro(displayHideShowButton $entryDoc $entryObj) 2565 - #isPublished($entryObj $isPublished) 2566 - #isHidden($entryObj $isHidden) 2567 - ## Only published articles can be hidden. Unpublished articles are considered already hidden. 2568 - #if($isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 2569 - #set ($queryString = \{ 2570 - 'xredirect' : $thisURL, 2571 - 'form_token' : $services.csrf.getToken() 2572 - }) 2573 - #if ($isHidden) 2574 - #set ($discard = $queryString.putAll(\{ 2575 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 0, 2576 - 'comment' : $services.localization.render('blog.code.madevisible') 2577 - })) 2578 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 2579 - [[#toolImage('unlock')>>path:$lockURL||class=~"blog-tool-show~" title=~"$services.localization.render('blog.code.makevisible')~"]]## 2580 - #else 2581 - #set ($discard = $queryString.putAll(\{ 2582 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 1, 2583 - 'comment' : $services.localization.render('blog.code.hid') 2584 - })) 2585 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 2586 - [[#toolImage('lock')>>path:$lockURL||class=~"blog-tool-hide~" title=~"$services.localization.render('blog.code.hide')~"]]## 2587 - #end 2588 - #end 2589 -#end 2590 -## 2591 -## 2592 -## 2593 -#** 2594 - * Displays the edit button to those that can edit the article. 2595 - * 2596 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 2597 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 2598 - *### 2599 -#macro(displayEditButton $entryDoc $entryObj) 2600 - #if($xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 2601 - ## Call getDefaultEditMode() for backward compatibility with older blog posts. 2602 - [[#toolImage('pencil')>>path:$entryDoc.getURL('edit')||title=~"$services.localization.render('blog.code.editpost')~"]]## 2603 - #end 2604 -#end 2605 -## 2606 -## 2607 -## 2608 -#** 2609 - * Displays the delete button to those that can edit the article. 2610 - * 2611 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 2612 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 2613 - * @todo AJAX calls. 2614 - *### 2615 -#macro(displayDeleteButton $entryDoc $entryObj) 2616 - #if($xwiki.hasAccessLevel('delete', $xcontext.user, $entryDoc.fullName)) 2617 - [[#toolImage('cross')>>path:$entryDoc.getURL('delete')||title=~"$services.localization.render('blog.code.deletepost')~"]]## 2618 - #end 2619 -#end 2620 -## 2621 -## 2622 -## 2623 -#** 2624 - * Displays the title of the entry. 2625 - * 2626 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 2627 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 2628 - *### 2629 -#macro(displayEntryTitle $entryDoc $entryObj) 2630 - #if($doc.fullName == $entryDoc.fullName) 2631 - (% class=~"entry-title~" ~%) 2632 - = $services.rendering.escape($entryDoc.display('title', 'view', $entryObj), $xwiki.getCurrentContentSyntaxId()) = 2633 - #else 2634 - (% class=~"entry-title~" ~%) 2635 - === [[$services.rendering.escape($entryDoc.display('title', 'view', $entryObj),$xwiki.getCurrentContentSyntaxId())>>doc:$services.rendering.escape($services.model.serialize($entryDoc.getDocumentReference(),'default'),$xwiki.getCurrentContentSyntaxId())]] === 2636 - #end 2637 -#end 2638 -## 2639 -## 2640 -## 2641 -#** 2642 - * Displays the body of the entry. 2643 - * 2644 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 2645 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 2646 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 2647 - *### 2648 -#macro(displayEntryContent $entryDoc $entryObj $onlyExtract) 2649 - (% class=~"#if($onlyExtract)entry-summary#\{else}entry-content#end~" ~%)((( 2650 - #getEntryContent($entryDoc $entryObj $onlyExtract $entryContent) 2651 - ## FIXME: This causes the blog's content to not be annotatable. See http://jira.xwiki.org/browse/XWIKI-6328 2652 - ## Should probably be replaced by a display macro call with a reference to the object property holding the post's content 2653 - \{\{html wiki=~"false~"}}$entryDoc.getRenderedContent($entryContent, $entryDoc.syntax.toIdString())\{\{/html}} 2654 - ))) ## entry-content 2655 - (% class=~"clearfloats~" ~%)((())) 2656 -#end 2657 -## 2658 -## 2659 -## 2660 -#** 2661 - * Extracts the body of the entry that should be displayed. If <tt>onlyExtract</tt> is <tt>true</tt>, display the content 2662 - * of the <tt>extract</tt> field (if not empty). 2663 - * 2664 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 2665 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 2666 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 2667 - * @param entryContent The resulting content. 2668 - * @param removeEllipsis If <tt>true</tt>, then don't display an ellipsis at the end of the content (only used when 2669 - * <tt>onlyExtract</tt> is <tt>true</tt>) 2670 - *### 2671 -#macro(getEntryContent $entryDoc $entryObj $onlyExtract $entryContent $removeEllipsis) 2672 - #if ($onlyExtract) 2673 - ## Note: We trim the summary so that if there's some white space it won't cause the summary to be used instead 2674 - ## of the content. 2675 - #set ($macro.result = $entryObj.getProperty('extract').value.trim()) 2676 - #end 2677 - #if(~"$!macro.result~" == '') 2678 - #set($macro.result = $entryObj.getProperty('content').value) 2679 -#* Disabled until the content can be cleanly cut. 2680 -* #if($onlyExtract && $result.length()>$maxchars) 2681 -* #set($i = $macro.result.lastIndexOf(~" ~", $maxchars)) 2682 -* #set($i = $i + 1) 2683 -* #set($macro.result = ~"$\{macro.result.substring(0,$i)} *[...>$\{entryDoc.fullName}]*~") 2684 -* #end 2685 -## *### 2686 - #elseif (!$removeEllipsis) 2687 - #if($entryDoc.syntax.toIdString() == 'xwiki/1.0') 2688 - #set($macro.result = ~"$\{macro.result} <a href='$\{entryDoc.getExternalURL()}' title='$services.localization.render('blog.code.readpost')'>...</a>~") 2689 - #elseif($entryDoc.syntax.toIdString() == 'xwiki/2.0' || $entryDoc.syntax.toIdString() == 'xwiki/2.1') 2690 - #set($macro.result = ~"$\{macro.result} [[...>>$\{services.rendering.escape($entryDoc.getFullName(), $entryDoc.getSyntax())}||title='$services.localization.render('blog.code.readpost')']]~") 2691 - #end 2692 - #end 2693 - #set ($entryContent = $NULL) 2694 - #setVariable (~"$entryContent~" $macro.result) 2695 -#end 2696 -## 2697 -## 2698 -## 2699 -#** 2700 - * Displays the footer of the entry. 2701 - * 2702 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 2703 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 2704 - *### 2705 -#macro(displayEntryFooter $entryDoc $entryObj) 2706 - (% class=~"entry-footer~" ~%)((( 2707 - #isPublished($entryObj $isPublished) 2708 - (% class='entry-author-label' ~%) 2709 - #if($isPublished) 2710 - \{\{translation key='blog.code.postedby'/}} ## 2711 - #else 2712 - \{\{translation key='blog.code.createdby'/}} ## 2713 - #end 2714 - \{\{html wiki=~"false~" clean=~"false~"}}<span class='author vcard'>#userfn($entryDoc.creator)</span>\{\{/html}} ## 2715 - #getEntryDate($entryDoc $entryObj $entryDate) 2716 - #listCategories($entryObj) #* 2717 - ## Since the publish date and update date are not set at the exact same time, there could be a small difference that 2718 - ## we assume cannot be more than 3 seconds. 2719 - *#(% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.permalink'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||rel=~"bookmark~"]] ## 2720 - #if ($showcomments) 2721 - (% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.comments'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||anchor=~"Comments~"]] (% class=~"itemCount~" ~%)($entryDoc.comments.size())(%~%) ## 2722 - #end ## 2723 - #if($entryDoc != $doc) ## 2724 - #displayEntryBlogLocation($entryDoc $entryObj) ## 2725 - #end 2726 - )))## entry-footer 2727 -#end 2728 -## 2729 -## 2730 -#** 2731 - * Display the blog for the entry (if it is not the currently displayed blog) 2732 - * 2733 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 2734 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 2735 - *### 2736 -#macro(displayEntryBlogLocation $entryDoc $entryObj) 2737 - #getBlogPostsLocation($entryDoc.getSpace() $blogPostsLocation) ## 2738 - #if(~"$!blogPostsLocation~" != ~"~") ## 2739 - #set($blogSpaceRef = $services.model.resolveSpace($blogPostsLocation)) ## 2740 - #set($blogDocRef = $services.model.createDocumentReference($services.model.getEntityReference('DOCUMENT', 'default').getName(), $blogSpaceRef)) ## 2741 - #if($doc.documentReference != $blogDocRef) ## 2742 - #set($blogDoc = $xwiki.getDocument($blogDocRef)) ## 2743 - #set($blogObj = $blogDoc.getObject('Blog.BlogClass')) ## 2744 - #if($blogObj) (% class=~"blogrefpath~" ~%)((( ## 2745 - $services.localization.render('blog.code.postedin') \{\{html clean=~"false~" wiki=~"false~"}} #hierarchy($blogDocRef, \{'selfIsActive' : true, 'local': true}) \{\{/html}} ## 2746 - )))(%~%)## 2747 - #end 2748 - #end 2749 - #end 2750 -#end 2751 -## 2752 -## 2753 -## 2754 -## 2755 -#** 2756 - * List the categories an entry belongs to. Used in the footer. The categories are instances of <tt>Blog.CategoryClass</tt>. 2757 - * 2758 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 2759 - *### 2760 -#macro(listCategories $entryObj) 2761 - #if($entryObj.getxWikiClass().getName() == $blogPostClassname) 2762 - #set($categories = $entryObj.getProperty('category').value) 2763 - #set($first = true) 2764 - #if($categories.size() > 0) 2765 - #foreach($category in $categories) 2766 - #set($categoryDoc = $!xwiki.getDocument($category)) 2767 - #if(!$categoryDoc.isNew() && $categoryDoc.getObject($\{blogCategoryClassname})) 2768 - #if($foreach.count == 1) 2769 - (% class='separator' ~%)·(%~%) $services.localization.render('blog.code.categories') ## 2770 - #else 2771 - , ## 2772 - #end## 2773 - [[$!\{categoryDoc.getObject($blogCategoryClassname).getValue('name')}>>$\{category}||rel='tag']]## 2774 - #end## 2775 - #end## 2776 - #end 2777 - #end 2778 -#end 2779 -## 2780 -## 2781 -## 2782 -#** 2783 - * Displays blog pagination links (older and newer entries). 2784 - * 2785 - * @param blogDoc the XDocument holding the blog definition object. 2786 - *### 2787 -#macro(displayNavigationLinks $blogDoc) 2788 - (% class=~"clearfloats~" ~%)((())) 2789 - #getBlogDisplayType($blogDoc $displayType) 2790 - #if($displayType == 'weekly') 2791 - (% class=~"pagingLinks~" ~%)((( 2792 - #getRequestedWeek($weekDate) 2793 - $weekDate.addWeeks(-1)## 2794 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousweek'/}}>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 2795 - #sep() 2796 - $weekDate.addWeeks(2)## 2 because we already subtracted 1 above 2797 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextweek'/}} »>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 2798 - ))) 2799 - #elseif($displayType == 'monthly') 2800 - (% class=~"pagingLinks~" ~%)((( 2801 - #getRequestedMonth($monthDate) 2802 - $monthDate.addMonths(-1)## 2803 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousmonth'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 2804 - #sep() 2805 - $monthDate.addMonths(2)## 2 because we already subtracted 1 above 2806 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextmonth'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 2807 - ))) 2808 - #elseif($displayType == 'all') 2809 - #else 2810 - ## Paginated 2811 - #if(($totalPages > 1)) 2812 - #set($queryString = '') 2813 - #foreach($p in $request.getParameterNames()) 2814 - #if($p != 'page' && $p != 'ipp') 2815 - #foreach($v in $request.getParameterValues($p)) 2816 - #set($queryString = ~"$\{queryString}&$\{escapetool.url($p)}=$\{escapetool.url($v)}~") 2817 - #end 2818 - #end 2819 - #end 2820 - (% class=~"pagingLinks~" ~%)((( 2821 - #if ($currentPageNumber < $totalPages) 2822 - #set($currentPageNumber = $currentPageNumber + 1) 2823 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.olderposts'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 2824 - #set($currentPageNumber = $currentPageNumber - 1) 2825 - #end 2826 - #if ($currentPageNumber > 1) 2827 - #if ($currentPageNumber < $totalPages) 2828 - #sep() 2829 - #end 2830 - #set($currentPageNumber = $currentPageNumber - 1) 2831 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.newerposts'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 2832 - #set($currentPageNumber = $currentPageNumber + 1) 2833 - #end 2834 - (% class=~"clear~" ~%)(%~%) 2835 - )))## pagingLinks 2836 - #end 2837 - #end 2838 -#end 2839 -## 2840 -## 2841 -## 2842 -#** 2843 - * Displays a message box with ~"publish~" icon. 2844 - * 2845 - * @param message A text message concerning blog article publishing 2846 - *### 2847 -#macro(publishMessageBox $message) 2848 -(% class=~"plainmessage publish-message~" ~%)((($services.icon.render('world') $message))) 2849 -#end 2850 -#** 2851 - * Displays a message box with ~"show/hide~" icon. 2852 - * 2853 - * @param message A text message concerning blog article hiding 2854 - *### 2855 -#macro(hideMessageBox $message) 2856 -(% class=~"plainmessage hide-message~" ~%)((($services.icon.render('unlock') $message))) 2857 -#end 2858 -## 2859 -## 2860 -## 2861 -#** 2862 - * Determine the requested week, for using in a weekly-indexed blog. The relevant request parameters are 2863 - * <tt>year</tt> and <tt>week</tt>. By default, the current week is used. 2864 - * 2865 - * @param monthDate The resulting week, a JODATime MutableDateTime. 2866 - *### 2867 -#macro(getRequestedWeek $weekDate) 2868 - #set ($weekDate = $NULL) 2869 - #setVariable (~"$weekDate~" $xwiki.jodatime.mutableDateTime) 2870 - #if(~"$!\{request.year}~" != '') 2871 - #set ($discard = $weekDate.setYear($numbertool.toNumber($request.year).intValue())) 2872 - #end 2873 - #if(~"$!\{request.week}~" != '') 2874 - #set ($discard = $weekDate.setWeekOfWeekyear($numbertool.toNumber($request.week).intValue())) 2875 - #end 2876 -#end 2877 -## 2878 -## 2879 -## 2880 -#** 2881 - * Determine the requested month, for using in a monthly-indexed blog. The relevant request parameters are 2882 - * <tt>year</tt> and <tt>month</tt>. By default, the current month is used. 2883 - * 2884 - * @param monthDate The resulting month, a JODATime MutableDateTime. 2885 - *### 2886 -#macro(getRequestedMonth $monthDate) 2887 - #set ($monthDate = $NULL) 2888 - #setVariable (~"$monthDate~" $xwiki.jodatime.mutableDateTime) 2889 - #if(~"$!\{request.year}~" != '') 2890 - #set ($discard = $monthDate.setYear($numbertool.toNumber($request.year).intValue())) 2891 - #end 2892 - #if(~"$!\{request.month}~" != '') 2893 - #set ($discard = $monthDate.setMonthOfYear($numbertool.toNumber($request.month).intValue())) 2894 - #end 2895 -#end 2896 -## 2897 -## 2898 -## 2899 -#** 2900 - * Retrieve a blog property (title, display type, etc). 2901 - * 2902 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 2903 - * @param propertyName The name of the property to be retrieved. One of the <tt>Blog.BlogClass</tt>'s properties. 2904 - * @param defaultValue The default value to use in case the blog object does not define one. 2905 - * @param propertyValue The resulting value. 2906 - *### 2907 -#macro(getBlogProperty $blogDoc $propertyName $defaultValue $propertyValue) 2908 - #set($result = ~"$!\{blogDoc.getObject($\{blogClassname}).getProperty($propertyName).value}~") 2909 - #if($result == '') 2910 - #set($result = $defaultValue) 2911 - #end 2912 - #set ($propertyValue = $NULL) 2913 - #setVariable (~"$propertyValue~" $result) 2914 -#end 2915 - 2916 -#** 2917 - * If an error occurs when executing an action, set a specific response status and display an error message. 2918 - * 2919 - * @param status The response status. 2920 - * @param text The user readable error to be displayed. Can be a translation key. 2921 - * @param parameters The parameters to use when decoding the translation key. 2922 - *### 2923 -#macro(blog__actionResponseError $status $text $parameters) 2924 - $response.setStatus($status) 2925 - #if($request.ajax) 2926 - $services.localization.render($text, $!parameters) 2927 - #else 2928 - \{\{error}}$services.localization.render($text, $!parameters)\{\{/error}} 2929 - #end 2930 -#end 2931 -## 2932 -## 2933 -## 2934 -#** 2935 - * Check if a blog is the Default blog (The one in the 'Blog' space). 2936 - * 2937 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 2938 - * @param isDefault The resulting boolean. 2939 - *### 2940 -#macro(isDefaultBlog $blogDoc $isDefault) 2941 - #set ($result = false) 2942 - #if ($blogDoc.space == 'Blog') 2943 - #set ($result = true) 2944 - #end 2945 - #setVariable(~"$isDefault~" $result) 2946 -#end 2947 -## 2948 -## 2949 -## 2950 -#** 2951 - * Retrieve the blog posts location (space). 2952 - * 2953 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 2954 - * @param postsLocation The resulting location. 2955 - *### 2956 -#macro(getBlogPostsLocation $blogSpace $postsLocation) 2957 - #getBlogDocument($blogSpace $blogDoc) 2958 - #getBlogProperty($blogDoc 'postsLocation' $blogDoc.space $result) 2959 - #set ($postsLocation = $NULL) 2960 - #setVariable (~"$postsLocation~" $result) 2961 -#end 2962 -## 2963 -## 2964 -## 2965 -#** 2966 - * Retrieve the blog categories location (space). 2967 - * 2968 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 2969 - * @param categoriesLocation The resulting location. 2970 - *### 2971 -#macro(getBlogCategoriesLocation $blogSpace $categoriesLocation) 2972 - #getBlogDocument($blogSpace $blogDoc) 2973 - #getBlogProperty($blogDoc 'categoriesLocation' 'Blog' $result) 2974 - #set ($postsLocation = $NULL) 2975 - #setVariable (~"$categoriesLocation~" $result) 2976 -#end 2977 -###** 2978 - * Return the Query for selecting the blog posts based on the context where the posts are displayed. 2979 - * for example there is 4 different panel contexts: 2980 - * aBlog.aPost or aBlog.WebHome 2981 - * aCategorySpace.aCategory 2982 - * aCategorySpace.WebHome 2983 - * Blog.aPost or Blog.WebHome 2984 - * 2985 - * @param query The query for selecting blog entries. 2986 - * @param queryParams The parameters to bind with the generated query. 2987 - * @param targetDoc The document in which the articles will be displayed. 2988 - *### 2989 -#macro(getAllBlogPostsQueryBasedOnDisplayContext $targetDoc $query $queryParams) 2990 - #set ($query = $NULL) 2991 - #set ($queryParams = $NULL) 2992 - #getCategoryAllBlogPostsQuery($resultQuery) 2993 - #set ($resultQueryParams = \{}) 2994 - #set($sanitizedSpace = $targetDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 2995 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 2996 - ## Get all posts that are in the default blog space('Blog') or in category 'Blog.%' 2997 - #set ($discard = $resultQueryParams.put('space', $targetDoc.space)) 2998 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 2999 - #set($resultQuery = ~"$\{resultQuery} and (doc.space = :space or catList like :catList escape '!')~") 3000 - #elseif($targetDoc.getObject($blogCategoryClassname)) 3001 - ## Get all posts that are in a category aCategorySpace.aCategory 3002 - #set ($discard = $resultQueryParams.put('catList', $targetDoc.fullName)) 3003 - #set($resultQuery = ~"$\{resultQuery} and (catList=:catList)~") 3004 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 3005 - ## Get all posts that are in a category aCategorySpace.% 3006 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 3007 - ## Exclude incategorized posts 3008 - #set ($excludedCategory = ~"$\{targetDoc.space}.WebHome~") 3009 - #if ($targetDoc.space == $defaultBlogSpace) 3010 - #set ($excludedCategory = ~"Blog.Categories.WebHome~") 3011 - #end 3012 - #set ($discard = $resultQueryParams.put('excludedCategory', $excludedCategory)) 3013 - #set($resultQuery = ~"$\{resultQuery} and (catList<>:excludedCategory) and (catList like :catList escape '!')~") 3014 - #else 3015 - ## Get all posts in blog space aBlog 3016 - #getAllBlogPostsQuery($resultQuery) 3017 - #getBlogPostsLocation($targetDoc.space $postsLocation) 3018 - #set ($discard = $resultQueryParams.put('space', $postsLocation)) 3019 - #set($resultQuery = ~"$\{resultQuery} and doc.space = :space~") 3020 - #end 3021 - #setVariable(~"$query~" $resultQuery) 3022 - #setVariable(~"$queryParams~" $resultQueryParams) 3023 -#end 3024 -## 3025 -## 3026 -## 3027 -###** 3028 - * Display blog posts based on the context where the posts are displayed. 3029 - * for example there is 4 different panel contexts: 3030 - * aBlog.aPost or aBlog.WebHome 3031 - * aCategorySpace.aCategory 3032 - * aCategorySpace.WebHome 3033 - * Blog.aPost or Blog.WebHome 3034 - * 3035 - * @param targetDoc The document in which the articles will be displayed. 3036 - * @param postsVisiblity The visibility of the posts to display: recent, unpublished, ... 3037 - * @param layout Layout of the the posts to display 3038 - * @param layoutParams additional layout parameters, it is a string like 'param1=val1|...|paramN=valueN' 3039 - * @param limit the number of posts to display 3040 - *### 3041 -#macro(displayBlogPostsBasedOnContext $targetDoc $postsVisiblity $layout $layoutParams $limit) 3042 - #if ($postLayout == 'full') 3043 - #set ($macro.paginated = 'yes') 3044 - #end 3045 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 3046 - ## Display all posts that are in the default blog space('Blog') or in category 'Blog.%' 3047 - #getBlogPostsLayout($xwiki.getDocument(~"$\{defaultBlogSpace}.WebHome~") $postsLayout) 3048 - #if (~"$!layout~" == '') 3049 - #set ($layout = $postsLayout) 3050 - #end 3051 - #if ($postsVisiblity == 'recent') 3052 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 3053 - #elseif($postsVisiblity == 'unpublished') 3054 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 3055 - #end 3056 - #elseif($targetDoc.getObject($blogCategoryClassname)) 3057 - ## Display all posts that are in a category aCategorySpace.aCategory 3058 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 3059 - #getBlogPostsLayout($blogDoc $postsLayout) 3060 - #if (~"$!layout~" == '') 3061 - #set ($layout = $postsLayout) 3062 - #end 3063 - #if ($postsVisiblity == 'recent') 3064 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 3065 - #elseif($postsVisiblity == 'unpublished') 3066 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 3067 - #end 3068 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 3069 - ## Display all posts that are in a category aCategorySpace.% 3070 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 3071 - #getBlogPostsLayout($blogDoc $postsLayout) 3072 - #if (~"$!layout~" == '') 3073 - #set ($layout = $postsLayout) 3074 - #end 3075 - #if ($postsVisiblity == 'recent') 3076 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 3077 - #elseif($postsVisiblity == 'unpublished') 3078 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 3079 - #end 3080 - #else 3081 - ## Display all posts in blog space aBlog 3082 - #getBlogDocument($targetDoc.space $blogDoc) 3083 - #getBlogPostsLayout($blogDoc $postsLayout) 3084 - #if (~"$!layout~" == '') 3085 - #set ($layout = $postsLayout) 3086 - #end 3087 - #if ($postsVisiblity == 'recent') 3088 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 3089 - #elseif($postsVisiblity == 'unpublished') 3090 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 3091 - #end 3092 - #end 3093 -#end 3094 -## 3095 -## 3096 -## 3097 -#** 3098 - * Bind parameters to a query object. 3099 - * 3100 - * @param queryObj The query object (org.xwiki.query.internal.ScriptQuery object) 3101 - * @param queryParams the query parameters. 3102 - *### 3103 -#macro(bindQueryParameters $queryObj $queryParams) 3104 - #set ($output = $queryObj) 3105 - #foreach( $key in $queryParams.keySet() ) 3106 - #set($output = $queryObj.bindValue($key, $queryParams.get($key))) 3107 - #end 3108 - #setVariable(~"$queryObj~" $output) 3109 -#end 3110 -## 3111 -## 3112 -## 3113 -#** 3114 - * Determines the blogposts layout: Default layout (Calendar), Image thumbnail 3115 - * 3116 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>postsLayout</tt> 3117 - * property set. 3118 - * @param postsLayout The resulting string. If the blog object does not define anything, it is considered full (default). 3119 - *### 3120 -#macro(getBlogPostsLayout $blogDoc $postsLayout) 3121 - #getBlogProperty($blogDoc 'postsLayout' 'full' $res) 3122 - #set ($postsLayout = $NULL) 3123 - #setVariable (~"$postsLayout~" $res) 3124 -#end 3125 -## 3126 -## 3127 -## 3128 -#** 3129 - * Retrieve the blog document of a categories space, which is the blog descriptor that have its categoriesLocation property set to the categories space 3130 - * 3131 - * @param categoriesSpace A <tt>String</tt>, the name of the space. 3132 - * @param blogDoc The resulting XDocument. 3133 - *### 3134 -#macro(getBlogDocumentForCategoriesSpace $categoriesSpace $blogDoc) 3135 - #set($macro.blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as categoriesLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=categoriesLocationProp.id.id and categoriesLocationProp.id.name='categoriesLocation' and categoriesLocationProp.value=:categoriesLocation order by doc.creationDate~").setLimit(1).setOffset(0).bindValue('categoriesLocation', $categoriesSpace).execute()) 3136 - #if($macro.blogDocs.size() > 0 && $categoriesSpace != $defaultBlogSpace) 3137 - #set($macro.result = $xwiki.getDocument($macro.blogDocs.get(0))) 3138 - #else 3139 - ## Fallback to Blog.WebHome, the default blog 3140 - #set($macro.result = $xwiki.getDocument('Blog.WebHome')) 3141 - #end 3142 - #set ($blogDoc = $NULL) 3143 - #setVariable (~"$blogDoc~" $macro.result) 3144 -#end" %) 3145 -((( 3146 -(% class="macro-placeholder hidden" %) 3147 -((( 3148 -macro:velocity 3149 -))) 3150 -))) 3151 -))) 3152 - 3153 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogPostLayoutMacros~"" %) 3154 -((( 3155 -(% class="macro-placeholder hidden" %) 3156 -((( 3157 -macro:include 3158 -))) 3159 - 3160 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|#** 3161 - * Extract the layout parameters from a string. 3162 - * 3163 - * @param layoutParamsString The string representation of the layout parameters. 3164 - * It should contain a String following this format ~"paramName1=Value1|paramName2=Value2|...|paramNameK=ValueK~" 3165 - * @param layoutsParameters The resulting layout parameters Map. 3166 - *### 3167 -#macro(extractLayoutParametersFromString $layoutParamsString $layoutsParameters) 3168 - #set ($layoutsParameters = $NULL) 3169 - #set ($macro.layoutParams = \{}) 3170 - #if (~"$!layoutParamsString~" != '') 3171 - #set ($macro.paramsArr = $layoutParamsString.split('\\|')) 3172 - #foreach ($item in $macro.paramsArr) 3173 - #set ($itemSplit = $item.split('=')) 3174 - #if ($itemSplit.size() == 2) 3175 - #set ($discard = $macro.layoutParams.put($itemSplit[0].trim(), $itemSplit[1].trim())) 3176 - #end 3177 - #end 3178 - #end 3179 - #setVariable(~"$layoutsParameters~" $macro.layoutParams) 3180 -#end" %) 3181 -((( 3182 -(% class="macro-placeholder hidden" %) 3183 -((( 3184 -macro:velocity 3185 -))) 3186 -))) 3187 -))) 3188 - 3189 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-| #macro(displaySmallPost $pDoc $pObj) 3190 - #initLayoutVars($pDoc $pObj) 3191 - <div class=~"col-xs-12 col-sm-6 next_blog~"> 3192 - <a href=~"$pDoc.uRL~" class=~"thumbnail~"> 3193 - <div class=~"row~"> 3194 - <div class=~"col-xs-4~"> 3195 - #if ($imageAtt) 3196 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 3197 - #end 3198 - </div> 3199 - <div class=~"col-xs-8 art_det~"> 3200 - <p class=~"text-left~"> 3201 - #if($displayTitle)$!postTitle #end 3202 - <br/><span class=~"date_info~"> $!dateStr </span> 3203 - </p> 3204 - #displayPostDetails($pDoc) 3205 - </div> 3206 - </div> 3207 - </a> 3208 - </div> 3209 - #end 3210 - ## 3211 - ## 3212 - ## 3213 - #macro(displayPinnedPost $pDoc $pObj) 3214 - #initLayoutVars($pDoc $pObj) 3215 - <div class=~"col-xs-12 col-sm-4 col-md-4 blog_pin~"> 3216 - <a href=~"$pDoc.uRL~" class=~"all-post-link~"> 3217 - <div class=~"thumbnail~"> 3218 - #if ($displayTitle && $displayTitleFirstOnPinnedPosts) 3219 - <h5 class=~"title-top~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 3220 - #end 3221 - #if ($imageAtt) 3222 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 3223 - #end 3224 - <div class=~"caption~"> 3225 - #if ($displayTitle && !$displayTitleFirstOnPinnedPosts) 3226 - <h5 class=~"text-left~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 3227 - #end 3228 - #if ($displaySummaryOnPinnedPosts) 3229 - <div class=~"text-left post-summary~"> 3230 - #set ($postContent = $pObj.getProperty('extract').value) 3231 - $!pDoc.getRenderedContent($postContent, $pDoc.syntax.toIdString()) 3232 - </div> 3233 - #end 3234 - #displayPostDetails($pDoc) 3235 - </div> 3236 - </div> 3237 - </a> 3238 - </div> 3239 - #end 3240 - ## 3241 - ## 3242 - ## 3243 - #macro(formatPostDate $pDoc $pObj) 3244 - #set ($formattedDate = $NULL) 3245 - #set($dateStr = $datetool.format('medium', $postDate, $xcontext.locale)) 3246 - #if (~"$!dateStr~" != '') 3247 - #set ($dateArr = $dateStr.split(' ')) 3248 - #if ($dateArr.size() > 3) 3249 - #set ($dateStr = ~"~") 3250 - #foreach($s in $dateArr.subList(0, 3)) 3251 - #set ($dateStr = ~"$\{dateStr}$\{s} ~") 3252 - #end 3253 - #end 3254 - #end 3255 - #setVariable(~"$formattedDate~" $dateStr) 3256 - #end 3257 - ## 3258 - ## 3259 - ## 3260 - #macro(displayPostDetails $pDoc) 3261 - <div class=~"row post-details~"> 3262 - <div class=~"col-xs-8 detail~"> 3263 - #if ($services.like.displayButton($pDoc.documentReference)) 3264 - #set ($optLikeRecord = $services.like.getLikes($pDoc.documentReference)) 3265 - ## Retrieve the likes number in XWiki 12.9+ 3266 - #set ($likeNumber = $optLikeRecord.get()) 3267 - #if (!$stringtool.isNumeric($likeNumber.toString())) 3268 - ## Retrieve the likes number in XWiki versions greater than 12.7 and lower than 12.9. 3269 - #set ($likeNumber = $optLikeRecord.get().likeNumber) 3270 - #end 3271 - #if ($stringtool.isNumeric($likeNumber.toString())) 3272 - <div class=~"post-likes btn btn-default disabled badge~" 3273 - title=~"$escapetool.xml($services.localization.render('like.button.title', [$likeNumber]))~"> 3274 - $services.icon.renderHTML('heart') <span class=~"like-number~">$likeNumber</span> 3275 - </div> 3276 - #end 3277 - #elseif ($services.ratings) 3278 - #set ($ratingsConfigDoc = $services.ratings.getConfigurationDocument($pDoc.documentReference)) 3279 - #if ($ratingsConfigDoc.getValue('displayRatings') == 1) 3280 - <ul class=~"pull-left note list-inline~"> 3281 - #foreach ($x in [1..5]) 3282 - #set ($cls = ~"~") 3283 - #if ($x > $averageVote) 3284 - #set ($cls = ~"-o~") 3285 - #end 3286 - <li><span class=~"fa fa-star$\{cls}~"></span></li> 3287 - #end 3288 - </ul> 3289 - #end 3290 - #end 3291 - </div> 3292 - #if ($showPostComments) 3293 - <div class=~"col-xs-4 com_det~"> 3294 - <p class=~"text-right~">$services.icon.renderHTML('comments') ($!nbComments)</p> 3295 - </div> 3296 - #end 3297 - </div> 3298 - #end 3299 - ## 3300 - ## 3301 - ## 3302 - #macro(initLayoutVars $pDoc $pObj) 3303 - #set ($postTitle = $pDoc.display('title', 'view', $pObj)) 3304 - #set ($imageAtt = $pDoc.getAttachment($pObj.getValue('image'))) 3305 - #isPublished($pObj $isPublished) 3306 - #isHidden($pObj $isHidden) 3307 - #getEntryDate($pDoc $pObj $postDate) 3308 - #formatPostDate($postDate $dateStr) 3309 - #set ($averageVote = $mathtool.round($services.ratings.getAverageRating($pDoc.documentReference).getAverageVote())) 3310 - #set ($nbComments = $pDoc.getComments().size()) 3311 - #set ($showPostComments = true) 3312 - #if ($xwiki.getSpacePreferenceFor('showcomments', $pDoc.documentReference.lastSpaceReference, '1') == '0') 3313 - #set ($showPostComments = false) 3314 - #end 3315 - #end 3316 - ## 3317 - ## 3318 - ## 3319 - #macro(displayEditPinnedPostsButton) 3320 - #if (~"$!macroAdditionalParams.get('postIndex')~" == '0' && $services.security.authorization.hasAccess('edit', $pinnedPostsSourceDoc.fullName)) 3321 - #set ($discard = $xwiki.ssx.use('Blog.PinnedPostsSheet')) 3322 - #set ($discard = $xwiki.jsx.use('Blog.PinnedPostsSheet')) 3323 - #set ($editPinnedPostsURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'get', 'sheet=Blog.PinnedPostsSheet')) 3324 - #set ($newPinnedPostsObjectURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'objectadd', ~"classname=Blog.PinnedPostsClass&form_token=$!\{services.csrf.getToken()}~")) 3325 - <div class=~"edit-pinned-posts-container~"> 3326 - <div class=~"col-xs-12 col-sm-12 col-md-12 text-right edit-pinned-posts~"> 3327 - <a href=~"javascript:;~" class=~"editPinnedPosts~"> 3328 - <span class=~"glyphicon glyphicon-edit~" aria-hidden=~"true~"></span> $services.localization.render('blog.post.layout.cards.pinnedposts.edit') 3329 - </a> 3330 - <input type=~"hidden~" id=~"editPinnedPostsURL~" value=~"$escapetool.xml($editPinnedPostsURL)~"/> 3331 - <input type=~"hidden~" id=~"newPinnedPostsObjectURL~" value=~"$escapetool.xml($newPinnedPostsObjectURL)~"/> 3332 - </div> 3333 - </div> 3334 - #if (~"$!pinnedPostsObj~" == '') 3335 - <input type=~"hidden~" name=~"createPinnedPostsObject~" value=~"1~"/> 3336 - #end 3337 - #end 3338 - #end" %) 3339 -((( 3340 -(% class="macro-placeholder hidden" %) 3341 -((( 3342 -macro:velocity 3343 -))) 3344 -))) 3345 - 3346 -(% class="macro" data-macro="startmacro:velocity|-||-| #if ($services.security.authorization.hasAccess('view', $xcontext.macro.params.reference)) 3347 - #set ($postDoc = $xwiki.getDocument($xcontext.macro.params.reference)) 3348 - #getEntryObject($postDoc $postObj) 3349 - #if (~"$!postObj~" != '') 3350 - #extractLayoutParametersFromString($xcontext.macro.params.params $macroAdditionalParams) 3351 - ## 3352 - #set ($displayTitle = true) 3353 - #if (~"$!macroAdditionalParams.get('displayTitle')~" == 'false') 3354 - #set ($displayTitle = false) 3355 - #end 3356 - ## 3357 - #set ($displayTitleFirstOnPinnedPosts = false) 3358 - #if (~"$!macroAdditionalParams.get('displayTitleFirstOnPinnedPosts')~" == 'true') 3359 - #set ($displayTitleFirstOnPinnedPosts = true) 3360 - #end 3361 - ## 3362 - #set ($displaySummaryOnPinnedPosts = true) 3363 - #if (~"$!macroAdditionalParams.get('displaySummaryOnPinnedPosts')~" == 'false') 3364 - #set ($displaySummaryOnPinnedPosts = false) 3365 - #end 3366 - ## 3367 - #set ($postIndex = $numbertool.toNumber($macroAdditionalParams.get('postIndex')).intValue()) 3368 - #if ($postIndex == 0) 3369 - #set ($stopBlogPostsDisplay = false) 3370 - #end 3371 - #set ($listResultsCount = $numbertool.toNumber($macroAdditionalParams.get('list-results-count')).intValue()) 3372 - #set($discard = $xwiki.ssx.use('Blog.BlogPostLayoutCards')) 3373 - #set($scaleWidth = 600) 3374 - #set($imgQs=~"width=$scaleWidth~") 3375 - ## Display pinned posts 3376 - ## Get the list of pinned posts 3377 - #set ($pinnedPosts = []) 3378 - #set ($pinnedPostsSourceDoc = $NULL) 3379 - #if (~"$!macroAdditionalParams.get('forceDisplayPinnedPosts')~" == 'true' && ~"$!macroAdditionalParams.get('list-blog')~" != '') 3380 - #set ($pinnedPostsSourceDoc = $xwiki.getDocument($macroAdditionalParams.get('list-blog'))) 3381 - ## Note that the 'list-blog' parameter contains the value of the 'blog' parameter of the blogpostlist macro passed to the current layout macro 3382 - #end 3383 - #if (~"$!pinnedPostsSourceDoc~" != '') 3384 - #set ($pinnedPostsObj = $pinnedPostsSourceDoc.getObject('Blog.PinnedPostsClass')) 3385 - #if (~"$!pinnedPostsObj~" != '') 3386 - #set ($orderedPinnedPostsJSON = $pinnedPostsObj.getProperty('orderedPosts').value) 3387 - #if (~"$!orderedPinnedPostsJSON~" != '') 3388 - #set ($pinnedPosts = $jsontool.parse($orderedPinnedPostsJSON)) 3389 - #else 3390 - #set ($pinnedPosts = $pinnedPostsObj.getProperty('posts').value) 3391 - #end 3392 - #end 3393 - #if ($postIndex == 0 && $pinnedPosts.size() > 0) 3394 - \{\{html clean=~"false~"}} 3395 - #set ($x = 0) 3396 - #set ($showPinnedPostsButton = true) 3397 - #foreach ($pinnedPost in $pinnedPosts) 3398 - #if ($x == 0) 3399 - <div class=~"row flex-container~"> 3400 - #if ($showPinnedPostsButton) 3401 - #displayEditPinnedPostsButton() 3402 - #set($showPinnedPostsButton = false) 3403 - #end 3404 - #end 3405 - #set ($pinnedPostDoc = $xwiki.getDocument($pinnedPost)) 3406 - #getEntryObject($pinnedPostDoc $pinnedPostObj) 3407 - #if (~"$!pinnedPostObj~" != '') 3408 - #displayPinnedPost($pinnedPostDoc $pinnedPostObj) 3409 - #end 3410 - #set ($x = $mathtool.add($x, 1)) 3411 - #if ($x == 3) 3412 - #set ($x = 0) 3413 - </div> 3414 - #end 3415 - #end 3416 - #if ($mathtool.mod($x, 3) != 0) 3417 - </div> 3418 - #end 3419 - \{\{/html}} 3420 - 3421 - ## If the first post is a pinned post : this means that all the posts are pinned 3422 - ## In this case, avoid displaying the posts again after the pinned posts section. 3423 - #if ($pinnedPosts.contains($xcontext.macro.params.reference)) 3424 - #set ($stopBlogPostsDisplay = true) 3425 - #end 3426 - #elseif($postIndex == 0 && $pinnedPosts.size() == 0) 3427 - 3428 - \{\{html}} 3429 - <div class=~"row no-pinnded-posts~"> 3430 - #displayEditPinnedPostsButton() 3431 - </div> 3432 - \{\{/html}} 3433 - 3434 - #end 3435 - #end 3436 - #if (!$stopBlogPostsDisplay) 3437 - \{\{html clean=~"false~"}} 3438 - #if (~"$!nbDisplayedPosts~" == '' || $postIndex == 0) 3439 - #set ($nbDisplayedPosts = 0) 3440 - #end 3441 - #if($mathtool.mod($nbDisplayedPosts, 2) == 0) 3442 - #if ($nbDisplayedPosts != 0) 3443 - </div> 3444 - #set ($lastHtmlTag = 'c') 3445 - #end 3446 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 3447 - <div class=~"row~"> 3448 - #set ($lastHtmlTag = 'o') 3449 - #set ($lastRowClass = ~"~") 3450 - #else 3451 - <div class=~"row flex-container~"> 3452 - #set ($lastHtmlTag = 'o') 3453 - #set ($lastRowClass = ~"flex~") 3454 - #end 3455 - #end 3456 - #displaySmallPost($postDoc $postObj) 3457 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 3458 - </div> 3459 - #set ($lastHtmlTag = 'c') 3460 - #end 3461 - #set ($nbDisplayedPosts = $mathtool.add($nbDisplayedPosts, 1)) 3462 - #if ($postIndex == $mathtool.sub($listResultsCount, 1)) 3463 - #if (~"$!lastHtmlTag~" == 'o') 3464 - #if ($mathtool.mod($nbDisplayedPosts, 2) == 1 && $lastRowClass == ~"flex~") 3465 - <div class=~"col-xs-12 col-sm-6~"></div> 3466 - #end 3467 - </div> 3468 - #end 3469 - #end 3470 - \{\{/html}} 3471 - #end 3472 - #else 3473 - \{\{error}}$services.localization.render('blog.blogpostlayout.notpost', [$xcontext.macro.params.reference])\{\{/error}} 3474 - #end 3475 - #else 3476 - \{\{error}}$services.localization.render('blog.blogpostlayout.post_view_not_allowed', [$xcontext.macro.params.reference])\{\{/error}} 3477 - #end" %) 3478 -((( 3479 -(% class="macro-placeholder hidden" %) 3480 -((( 3481 -macro:velocity 3482 -))) 3483 - 3484 -(% class="macro" data-macro="startmacro:html|-|clean=~"false~"|-|<div class=~"col-xs-12 col-sm-6 next_blog~"> 3485 -<a href=~"/Nieuws/Audit%20BMI%20en%20BORG~" class=~"thumbnail~"> 3486 -<div class=~"row~"> 3487 -<div class=~"col-xs-4~"> 3488 -<img src=~"/download/Nieuws/Audit%20BMI%20en%20BORG/giphy.gif?width=600&rev=1.1~" /> 3489 -</div> 3490 -<div class=~"col-xs-8 art_det~"> 3491 -<p class=~"text-left~"> 3492 -Audit BMI en BORG <br/><span class=~"date_info~"> Jan 15, 2024, </span> 3493 -</p> 3494 -<div class=~"row post-details~"> 3495 -<div class=~"col-xs-8 detail~"> 3496 -<div class=~"post-likes btn btn-default disabled badge~" 3497 -title=~"Number of likes on this page: 0~"> 3498 -<span class=~"fa fa-heart~"></span> <span class=~"like-number~">0</span> 3499 -</div> 3500 -</div> 3501 -<div class=~"col-xs-4 com_det~"> 3502 -<p class=~"text-right~"><span class=~"fa fa-comments~"></span> (0)</p> 3503 -</div> 3504 -</div> 3505 -</div> 3506 -</div> 3507 -</a> 3508 -</div>" %) 3509 -((( 3510 -(% class="macro-placeholder hidden" %) 3511 -((( 3512 -macro:html 3513 -))) 3514 - 3515 -(% class="col-xs-12 col-sm-6 next_blog" %) 3516 -((( 3517 -(% class="row" %) 3518 -((( 3519 -(% class="col-xs-4" %) 3520 -((( 3521 -[[~[~[image:/download/Nieuws/Audit%20BMI%20en%20BORG/giphy.gif?width=600&rev=1.1~]~]>>path:/Nieuws/Audit%20BMI%20en%20BORG||class="thumbnail"]] 3522 -))) 3523 - 3524 -(% class="col-xs-8 art_det" %) 3525 -((( 3526 -(% class="text-left" %) 3527 -[[Audit BMI en BORG 3528 -(% class="date_info" %) Jan 15, 2024,>>path:/Nieuws/Audit%20BMI%20en%20BORG||class="thumbnail"]] 3529 - 3530 -(% class="row post-details" %) 3531 -((( 3532 -(% class="col-xs-8 detail" %) 3533 -((( 3534 -(% class="post-likes btn btn-default disabled badge" title="Number of likes on this page: 0" %) 3535 -((( 3536 -[[(% class="like-number" %)0>>path:/Nieuws/Audit%20BMI%20en%20BORG||class="thumbnail"]] 3537 -))) 3538 -))) 3539 - 3540 -(% class="col-xs-4 com_det" %) 3541 -((( 3542 -(% class="text-right" %) 3543 -[[(0)>>path:/Nieuws/Audit%20BMI%20en%20BORG||class="thumbnail"]] 3544 -))) 3545 -))) 3546 -))) 3547 -))) 3548 -))) 3549 -))) 3550 -))) 3551 -))) 3552 - 3553 -(% class="macro" data-macro="startmacro:blogPostLayoutCards|-|reference=~"Nieuws.Nieuwsbrief december 2023~" params=~"displayTitle=true|useSummary=true|list-limit=10|list-layout=cards|list-blog=Nieuws.WebHome|list-paginated=no|list-results-count=10|postIndex=0|previousPostReference=|postIndex=1|previousPostReference=Nieuws.Nieuwsbrief januari 2024|postIndex=2|previousPostReference=Nieuws.Audit BMI en BORG~"" %) 3554 -((( 3555 -(% class="macro-placeholder hidden" %) 3556 -((( 3557 -macro:blogPostLayoutCards 3558 -))) 3559 - 3560 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogCode~"" %) 3561 -((( 3562 -(% class="macro-placeholder hidden" %) 3563 -((( 3564 -macro:include 3565 -))) 3566 - 3567 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogParameters~"" %) 3568 -((( 3569 -(% class="macro-placeholder hidden" %) 3570 -((( 3571 -macro:include 3572 -))) 3573 - 3574 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## Blog 3575 -#set($blogClassname = 'Blog.BlogClass') 3576 -#set($blogTemplate = 'Blog.BlogTemplate') 3577 -#set($blogSheet = 'Blog.BlogSheet') 3578 -## Blog entries 3579 -#set($blogPostClassname = 'Blog.BlogPostClass') 3580 -#set($blogPostTemplate = 'Blog.BlogPostTemplate') 3581 -#set($blogPostSheet = 'Blog.BlogPostSheet') 3582 -#set($blogPostObjectNumber = $xwiki.getDocument($blogPostTemplate).getObject($blogPostClassname).number) 3583 -#set($oldArticleClassname = 'XWiki.ArticleClass') 3584 -## Categories 3585 -#set($blogCategoryClassname = 'Blog.CategoryClass') 3586 -#set($blogCategoryTemplate = 'Blog.CategoryTemplate') 3587 -#set($blogCategorySheet = 'Blog.CategorySheet') 3588 -#set($blogCategoriesSheet = 'Blog.CategoriesSheet') 3589 -#set($oldBlogCategoryClassname = 'Blog.Categories') 3590 -#set($defaultCategoryParent = 'Blog.Categories') 3591 -## Style 3592 -#set($blogStyleDocumentName = 'Blog.BlogStyle') 3593 -#set($blogStyleDocument = $xwiki.getDocument($blogStyleDocumentName)) 3594 -## Clientside scripts 3595 -#set($blogScriptsDocumentName = 'Blog.BlogScripts') 3596 -#set($blogPublisher = $xwiki.getDocument('Blog.Publisher')) 3597 -## Misc 3598 -#set($thisURL = $doc.getURL($xcontext.action, $request.queryString)) 3599 -#set($isBlogPost = $doc.getObject($blogPostClassname)) 3600 -#set($defaultBlogSpace = 'Blog') 3601 -#set($isCategoryPage = $doc.getObject($blogCategoryClassname)) 3602 -#set($isCategoriesHomePage = $doc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 3603 -## 3604 -## 3605 -## 3606 -#** 3607 - * Displays an image, taken from the blog style document. 3608 - * 3609 - * @param $imgName The name of the icon from icons set to use. 3610 - *# 3611 -#macro(toolImage $imgName)(% class=~"icon-manage~"~%)$services.icon.render($imgName)(%~%)#end" %) 3612 -((( 3613 -(% class="macro-placeholder hidden" %) 3614 -((( 3615 -macro:velocity 3616 -))) 3617 -))) 3618 -))) 3619 - 3620 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## 3621 -## 3622 -## 3623 -## Import the blog skin and javascripts. 3624 -$!xwiki.ssx.use($blogStyleDocumentName)## 3625 -$!xwiki.jsx.use($blogScriptsDocumentName)## 3626 -## 3627 -## import the hierarchy for the path the blog post footer (in displayEntryBlogLocation) 3628 -#template('hierarchy_macros.vm')## 3629 -## 3630 -## 3631 -#** 3632 - * Prints a blog. This is the main macro used in the BlogSheet. 3633 - * 3634 - * @param blogDoc the XDocument holding the blog definition object. 3635 - *### 3636 -#macro(printBlog $blogDoc) 3637 - \{\{include reference='Blog.CreatePost'/}} 3638 - 3639 - ## Use the blogPostList macro to display the blogposts 3640 - ## The blogPostList is used only in case of 'all' or 'paged' blog display type because the blogPostList macro 3641 - ## do not support FTM the monthly and weekly blog display types 3642 - #getBlogDisplayType($blogDoc $displayType) 3643 - #if ($displayType == 'weekly' || $displayType == 'monthly') 3644 - #getBlogEntries($blogDoc $entries) 3645 - #displayBlog($entries 'index' true true) 3646 - #displayNavigationLinks($blogDoc) 3647 - #else 3648 - #getBlogDisplayType($blogDoc $displayType) 3649 - #set ($paginated = 'no') 3650 - #if ($displayType == 'paginated') 3651 - #set ($paginated = 'yes') 3652 - #end 3653 - #getBlogPostsLayout($blogDoc $postsLayout) 3654 - (% class=~"hfeed index~" ~%)(((\{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$paginated~" layout=~"$!postsLayout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" /}}))) 3655 - #end 3656 -#end 3657 -## 3658 -## 3659 -## 3660 -#** 3661 - * Shows blog information. In view mode, the description is printed. In edit mode, allows changing blog settings: title, 3662 - * description, blog type (global or in-space), index display type (fixed size pagination, weekly index, monthly index, 3663 - * all entries). 3664 - * 3665 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 3666 - *### 3667 -#macro(showBlogInfo $blogDoc) 3668 - #if($blogDoc.getObject($blogClassname)) 3669 - ## Keep testing for inline action for backward compatibility with older blogs. 3670 - #if($xcontext.action == 'edit' || $xcontext.action == 'inline') 3671 - #macro(displayProperty $blogDoc $propname) 3672 - ; #displayPropName($xwiki.getClass($blogClassname).get($propname)): 3673 - : $blogDoc.display($propname) 3674 - #end 3675 - #displayProperty($blogDoc 'title') 3676 - #displayProperty($blogDoc 'description') 3677 - #displayProperty($blogDoc 'displayType') 3678 - #displayProperty($blogDoc 'itemsPerPage') 3679 - #displayProperty($blogDoc 'postsLayout') 3680 - #displayProperty($blogDoc 'postsLayoutParameters') 3681 - #else 3682 - $blogDoc.display('description') 3683 - #end 3684 - #elseif($doc.fullName == $blogSheet) 3685 -= $services.localization.render('blog.code.blogsheet') = 3686 - \{\{translation key='blog.code.sheetexplanation'/}} 3687 - #else 3688 - \{\{warning}}\{\{translation key='blog.code.notblog'/}}\{\{/warning}} 3689 - #end 3690 -#end 3691 -## 3692 -## 3693 -## 3694 -#** 3695 - * Retrieve the blog document, which usually is either <tt><Space>.WebHome</tt> for whole-spaces blogs, or 3696 - * <tt><Space>.Blog</tt> for in-space blogs. If none of these documents contains a blog object, then the first 3697 - * (alphabetically) document in the target space that contains one is returned. Finally, if no document in the current 3698 - * space contains a blog object, then <tt>Blog.WebHome</tt> is returned as the default blog. 3699 - * 3700 - * @param space A <tt>String</tt>, the name of the space where to search. 3701 - * @param blogDoc The resulting XDocument. 3702 - *### 3703 -#macro(getBlogDocument $space $blogDoc) 3704 - #set ($result = $NULL) 3705 - ## Check if the current space has a WebPreferences page that contains a Blog.EnablePanelsConfigurationClass object. 3706 - ## It is possible to display a blog's panels info in a page that is not inside a blog and in that case we need to 3707 - ## identify the right blog based on a configuration object in a WebPreferences page. 3708 - #set ($spaceReference = $services.model.resolveSpace($space)) 3709 - #set ($preferencesDocRef = $services.model.createDocumentReference('WebPreferences', $spaceReference)) 3710 - #set ($preferencesDoc = $xwiki.getDocument($preferencesDocRef)) 3711 - #set ($preferencesObj = $preferencesDoc.getObject('Blog.EnablePanelsConfigurationClass')) 3712 - #if ($preferencesObj) 3713 - #set ($result = $xwiki.getDocument( $preferencesObj.getValue('blog'))) 3714 - #end 3715 - ## If no special case occurs (like the previous one), identify a blog by checking the current location from its hierarchy. 3716 - #if (~"$!result~" == '') 3717 - ## First, try the Space.WebHome, for a whole-space blog 3718 - #set($result = $xwiki.getDocument(~"$\{space}.WebHome~")) 3719 - #if(!$result.getObject($blogClassname)) 3720 - ## Second, try the Space.Blog document 3721 - #set($result = $xwiki.getDocument(~"$\{space}.Blog~")) 3722 - #if(!$result.getObject($blogClassname)) 3723 - ## Third, try searching for a blog document in the current space 3724 - ## Prevent the query fail when the space contains dots '.' 3725 - #set($blogDocs = $services.query.hql(~", BaseObject obj where doc.space = :space and obj.name = doc.fullName and obj.className = '$blogClassname' order by doc.name~").setLimit(1).setOffset(0).bindValue('space', $space).execute()) 3726 - #if($blogDocs.size() > 0) 3727 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 3728 - #else 3729 - ## Fourth, try searching for a blog document that have the its 'postsLocation' set to the current space 3730 - #set($blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as postsLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=postsLocationProp.id.id and postsLocationProp.id.name='postsLocation' and postsLocationProp.value=:postsLocation order by doc.name~").setLimit(1).setOffset(0).bindValue('postsLocation', $space).execute()) 3731 - #if($blogDocs.size() > 0) 3732 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 3733 - #else 3734 - ## Last, fallback to Blog.WebHome, the default blog 3735 - #set($result = $xwiki.getDocument('Blog.WebHome')) 3736 - #end 3737 - #end 3738 - #end 3739 - #end 3740 - #end 3741 - #set ($blogDoc = $NULL) 3742 - #setVariable (~"$blogDoc~" $result) 3743 -#end 3744 -## 3745 -## 3746 -## 3747 -#** 3748 - * Retrieve the blog title. 3749 - * 3750 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass<tt> object with the <tt>title</tt> property set. 3751 - * @param title The resulting title. 3752 - *### 3753 -#macro(getBlogTitle $blogDoc $title) 3754 - ## Titles can contain velocity code (most commonly translations), so we should evaluate them. 3755 - #set ($title = $NULL) 3756 - #setVariable (~"$title~" $!blogDoc.displayTitle) 3757 -#end 3758 -## 3759 -## 3760 -## 3761 -#** 3762 - * Retrieve the blog description. 3763 - * 3764 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>description</tt> 3765 - * property set. 3766 - * @param description The resulting description. 3767 - *### 3768 -#macro(getBlogDescription $blogDoc $description) 3769 - #getBlogProperty($blogDoc 'description' '' $result) 3770 - #set ($description = $NULL) 3771 - #setVariable (~"$description~" $result) 3772 -#end 3773 -## 3774 -## 3775 -## 3776 -#** 3777 - * Retrieves a list of entries to be displayed. The entries are either part of the blog's space, or have the blog 3778 - * document set as a parent. The number and range of entries returned (from all those belonging to this blog) depends on 3779 - * the blog display type: paginated (fixed number of entries), weekly (all entries in a week), monthly (all entries in a 3780 - * month), or all. 3781 - * 3782 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 3783 - * @param entries The resulting list of entries to display, a list of XDocument names. 3784 - *### 3785 -#macro(getBlogEntries $blogDoc $entries) 3786 - #if (!$entries) 3787 - #setVariable (~"$entries~" []) 3788 - #end 3789 - #getAllBlogPostsQuery($query) 3790 - #isDefaultBlog($blogDoc $isDefault) 3791 - #set($queryParams = \{}) 3792 - #if ($isDefault) 3793 - #getCategoryAllBlogPostsQuery($query) 3794 - #set($query = ~"$\{query} and (doc.creator = :creator or (isPublished.value = 1 and hidden.value = 0)) and (doc.space = :space or catList like :catList escape '!')~") 3795 - #set($discard = $queryParams.put('creator', $xcontext.user)) 3796 - #set($discard = $queryParams.put('space', $blogDoc.space)) 3797 - #set($sanitizedBlogSpace = $blogDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 3798 - #set($discard = $queryParams.put('catList', $sanitizedBlogSpace)) 3799 - #else 3800 - #set($query = ~"$\{query} and (doc.space = :space or doc.parent = :parent)~") 3801 - #getBlogPostsLocation($blogDoc.space $blogPostsLocation) 3802 - #set($discard = $queryParams.put('space', $blogPostsLocation)) 3803 - #set($discard = $queryParams.put('parent', $blogDoc.space)) 3804 - #end 3805 - #getBlogDisplayType($blogDoc $displayType) 3806 - #if($displayType == 'weekly') 3807 - #getWeeklyBlogEntries($blogDoc $query $entries $queryParams) 3808 - #elseif($displayType == 'monthly') 3809 - #getMonthlyBlogEntries($blogDoc $query $entries $queryParams) 3810 - #elseif($displayType == 'all') 3811 - #getAllBlogEntries($blogDoc $query $entries $queryParams) 3812 - #else 3813 - #getPagedBlogEntries($blogDoc $query $entries $queryParams) 3814 - #end 3815 -#end 3816 -## 3817 -## 3818 -## 3819 -#** 3820 - * Retrieves a list of entries to be displayed. The entries are taken from a ~"page~" of the blog, a sequence of documents 3821 - * defined by the request parameters <tt>ipp</tt> (items per page) and <tt>page</tt> (the current page). Initially the 3822 - * first page is displayed, with the number of entries defined in the blog object in the <tt>itemsPerPage</tt> property 3823 - * (10 if not defined). 3824 - * 3825 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 3826 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 3827 - * refined to restrict to a given space, or to a given search criteria, etc. 3828 - * @param entries The resulting list of entries to display, a list of XDocument names. 3829 - * @param queryParams The parameters to bind with the query. 3830 - *### 3831 -#macro(getPagedBlogEntries $blogDoc $query $entries $queryParams) 3832 - #if (!$entries) 3833 - #setVariable (~"$entries~" []) 3834 - #end 3835 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 3836 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~")) 3837 - #bindQueryParameters($countQueryObj $queryParams) 3838 - #bindQueryParameters($queryObj $queryParams) 3839 - #set($totalEntries = $countQueryObj.count()) 3840 - #getBlogProperty($blogDoc 'itemsPerPage' '10' $defaultItemsPerPage) 3841 - #set($defaultItemsPerPage = $numbertool.toNumber($defaultItemsPerPage).intValue()) 3842 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 3843 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 3844 - #set($discard = $entries.addAll($queryObj.setLimit($itemsPerPage).setOffset($startAt).addFilter(~"unique~").execute())) 3845 -#end 3846 -## 3847 -## 3848 -## 3849 -#** 3850 - * Retrieves a list of entries to be displayed. The entries are taken from a week of the blog. The target week is 3851 - * defined by the request parameters <tt>week</tt> (the week number in the year, from 1 to 52) and <tt>year</tt> (4 3852 - * digit year). Initially the current week is displayed. 3853 - * 3854 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 3855 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 3856 - * refined to restrict to a given space, or to a given search criteria, etc. 3857 - * @param entries The resulting list of entries to display, a list of XDocument names. 3858 - * @param queryParams The parameters to bind with the query. 3859 - *### 3860 -#macro(getWeeklyBlogEntries $blogDoc $query $entries $queryParams) 3861 - #if (!$entries) 3862 - #setVariable (~"$entries~" []) 3863 - #end 3864 - #getRequestedWeek($weekDate) 3865 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 3866 - #set($minDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundFloor())) 3867 - #set($maxDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundCeiling())) 3868 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 3869 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 3870 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 3871 - #bindQueryParameters($countQueryObj $queryParams) 3872 - #bindQueryParameters($queryObj $queryParams) 3873 - #set($totalEntries = $countQueryObj.count()) 3874 - #set($discard = $entries.addAll($queryObj.execute())) 3875 -#end 3876 -## 3877 -## 3878 -## 3879 -#** 3880 - * Retrieves a list of entries to be displayed. The entries are taken from a month of the blog. The target month is 3881 - * defined by the request parameters <tt>month</tt> (the month number, from 1 to 12) and <tt>year</tt> (4 3882 - * digit year). Initially the current month is displayed. 3883 - * 3884 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 3885 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 3886 - * refined to restrict to a given space, or to a given search criteria, etc. 3887 - * @param entries The resulting list of entries to display, a list of XDocument names. 3888 - * @param queryParams The parameters to bind with the query. 3889 - *### 3890 -#macro(getMonthlyBlogEntries $blogDoc $query $entries) 3891 - #if (!$entries) 3892 - #setVariable (~"$entries~" []) 3893 - #end 3894 - #getRequestedMonth($monthDate) 3895 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 3896 - #set($minDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundFloor())) 3897 - #set($maxDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundCeiling())) 3898 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 3899 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 3900 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 3901 - #bindQueryParameters($countQueryObj $queryParams) 3902 - #bindQueryParameters($queryObj $queryParams) 3903 - #set($totalEntries = $countQueryObj.count()) 3904 - #set($discard = $entries.addAll($queryObj.execute())) 3905 -#end 3906 -## 3907 -## 3908 -## 3909 -#** 3910 - * Retrieves a list of entries to be displayed. All entries belonging to the current blog are returned. 3911 - * 3912 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 3913 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 3914 - * refined to restrict to a given space, or to a given search criteria, etc. 3915 - * @param entries The resulting list of entries to display, a list of XDocument names. 3916 - * @param queryParams The parameters to bind with the query. 3917 - *### 3918 -#macro(getAllBlogEntries $blogDoc $query $entries $queryParams) 3919 - #if (!$entries) 3920 - #setVariable (~"$entries~" []) 3921 - #end 3922 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 3923 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 3924 - #bindQueryParameters($countQueryObj $queryParams) 3925 - #bindQueryParameters($queryObj $queryParams) 3926 - #set($totalEntries = $countQueryObj.count()) 3927 - #set($discard = $entries.addAll($queryObj.execute())) 3928 -#end 3929 -## 3930 -## 3931 -## 3932 -#** 3933 - * Retrieves a list of entries to be displayed. Only (and all) unpublished entries are returned. 3934 - * 3935 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 3936 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 3937 - * refined to restrict to a given space, or to a given search criteria, etc. 3938 - * @param queryParams The parameters to bind with the query. 3939 - * @param entries The resulting list of entries to display, a list of XDocument names. 3940 - *### 3941 -#macro(getUnpublishedBlogEntries $blogDoc $query $queryParams $entries) 3942 - #if (!$entries) 3943 - #setVariable (~"$entries~" []) 3944 - #end 3945 - #set($query = ~"$\{query} and isPublished.value = 0~") 3946 - #set ($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 3947 - #set ($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 3948 - #bindQueryParameters($countQueryObj $queryParams) 3949 - #bindQueryParameters($queryObj $queryParams) 3950 - #set($totalEntries = $countQueryObj.count()) 3951 - #set($discard = $entries.addAll($queryObj.execute())) 3952 -#end 3953 -## 3954 -## 3955 -## 3956 -#** 3957 - * Retrieves a list of entries to be displayed. The entries are taken from all the wiki, and not from a specific blog. 3958 - * 3959 - * @param entries The resulting list of entries to display, a list of XDocument names. 3960 - *### 3961 -#macro(getGlobalBlogEntries $entries) 3962 - #if (!$entries) 3963 - #setVariable (~"$entries~" []) 3964 - #end 3965 - #getAllBlogPostsQuery($query) 3966 - #set($totalEntries = $services.query.hql($query).count()) 3967 - #set($defaultItemsPerPage = 20) 3968 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 3969 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 3970 - #set($discard = $entries.addAll($services.query.hql(~"$\{query} order by publishDate.value desc~").setLimit($itemsPerPage).setOffset($startAt).execute())) 3971 -#end 3972 -#** 3973 - * Return the base query for selecting blog entries. It filters only visible entries, but does not bind to a specific 3974 - * blog, nor specify a range or an ordering criteria. 3975 - * 3976 - * This macro is a duplicate of #getAllBlogPostsQuery($query). Keep it in case it's used outside, in custom code. 3977 - * 3978 - * @param query The basic query for selecting blog entries. 3979 - *# 3980 -#macro(getBlogEntriesBaseQuery $query) 3981 - #getAllBlogPostsQuery($query) 3982 -#end 3983 -#** 3984 - * Return the Query for selecting the all wiki blog posts without filtering 3985 - * 3986 - * @param query The basic query for selecting blog entries. 3987 - *# 3988 -#macro(getAllBlogPostsQuery $query) 3989 - #set ($query = $NULL) 3990 - #setVariable(~"$query~" ~", BaseObject as obj, IntegerProperty isPublished, 3991 - IntegerProperty hidden, DateProperty publishDate 3992 - where doc.fullName <> '$blogPostTemplate' and 3993 - obj.name=doc.fullName and obj.className='$blogPostClassname' and 3994 - isPublished.id.id = obj.id and isPublished.id.name = 'published' and 3995 - hidden.id.id = obj.id and hidden.id.name='hidden' and 3996 - publishDate.id.id = obj.id and publishDate.id.name='publishDate' and 3997 - (doc.creator = '$escapetool.sql($xcontext.user)' or (isPublished.value = 1 and hidden.value = 0))~") 3998 -#end 3999 -## 4000 -## 4001 -## 4002 -###** 4003 - * Return the Query for selecting the all wiki blog posts with categories filtering 4004 - * 4005 - * @param query The basic query for selecting blog entries. 4006 - *### 4007 -#macro(getCategoryAllBlogPostsQuery $query) 4008 - #set ($query = $NULL) 4009 - #getAllBlogPostsQuery($baseQuery) 4010 - #set ($baseQuery = $baseQuery.replace('DateProperty publishDate', 'DateProperty publishDate, DBStringListProperty as category left join category.list catList')) 4011 - #setVariable(~"$query~" ~"$\{baseQuery} and obj.id=category.id.id and category.id.name='category'~") 4012 -#end 4013 -## 4014 -## 4015 -## 4016 -#** 4017 - * Determines how is the blog index split into pages: paginated (fixed number of entries), weekly (all entries in a 4018 - * week), monthly (all entries in a month), or all. 4019 - * 4020 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>displayType</tt> 4021 - * property set. 4022 - * @param displayType The resulting string. If the blog object does not define anything, it is considered paginated. 4023 - *### 4024 -#macro(getBlogDisplayType $blogDoc $displayType) 4025 - #getBlogProperty($blogDoc 'displayType' 'paginated' $result) 4026 - #set ($displayType = $NULL) 4027 - #setVariable (~"$displayType~" $result) 4028 -#end 4029 -## 4030 -## 4031 -## 4032 -#** 4033 - * Displays a list of entries. 4034 - * 4035 - * @param entries The entries to display, a list of XDocument names. 4036 - * @param displaying What exactly is displayed: blog index, a single blog entry, a blog category, search results, 4037 - * unpublished entries, etc. This will be used as the classname(s) for the container div (hfeed). Currently 4038 - * used values: index, single, category, search, unpublished, hidden. 4039 - * @param onlyExtract If <tt>true</tt>, only display the extract of articles where available, otherwise display the full content. 4040 - * @param shouldDisplayTitles If <tt>true</tt>, display the blog title (blog posts shouldn't display the title when they're 4041 - * displayed alone on their page since it's the page title which is used in this case) 4042 - *### 4043 -#macro(displayBlog $entries $displaying $onlyExtract $shouldDisplayTitles) 4044 - #set($blogDay = '') 4045 - (% class=~"hfeed $!\{displaying}~" ~%)((( 4046 - (% class=~"blogDay~" ~%)((( 4047 - #foreach ($entryDoc in $xwiki.wrapDocs($entries)) 4048 - #getEntryObject($entryDoc $entryObj) 4049 - ## Although all entries should have one of the two objects, better check to be sure. 4050 - #if(~"$!\{entryObj}~" != '') 4051 - #getEntryDate($entryDoc $entryObj $entryDate) 4052 - ## Display a ~"calendar sheet~" for each day. All entries posted on the same day share one such sheet. 4053 - #set($entryDateStr = $xwiki.formatDate($entryDate, 'yyyyMMMMdd')) 4054 - #if($blogDay != $entryDateStr) 4055 - #if($blogDay != '') 4056 - ))) 4057 - (% class=~"blogDay~" ~%)((( 4058 - #end 4059 - #displayBlogDate($entryDate) 4060 - #set ($blogDay = $entryDateStr) 4061 - #end 4062 - ## Finally, display the entry. 4063 - #displayEntry($entryDoc $entryObj $onlyExtract $shouldDisplayTitles true) 4064 - #end 4065 - #end 4066 - )))## blogDay 4067 - )))## hfeed 4068 -#end 4069 -## 4070 -## 4071 -## 4072 -#** 4073 - * Get the entry object, either a new BlogPost or an old Article. 4074 - * 4075 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 4076 - * @param entryObj The resulting xobject of the blog post. 4077 - *### 4078 -#macro(getEntryObject $entryDoc $__entryObj) 4079 - #set($result = $entryDoc.getObject(~"$\{blogPostClassname}~")) 4080 - #if(!$result) 4081 - #set($result = $entryDoc.getObject(~"$\{oldArticleClassname}~")) 4082 - #end 4083 - ## NOTE: The reason we put an underscore in front of the variable name is to prevent the following line from 4084 - ## overwriting the $entryObj variable that may be defined before this macro is called. Of course, $__entryObj may be 4085 - ## overwritten in this case but it's less likely to have such a variable defined before. 4086 - #set ($__entryObj = $NULL) 4087 - #setVariable (~"$__entryObj~" $result) 4088 -#end 4089 -## 4090 -## 4091 -## 4092 -#** 4093 - * Gets the date associated with a blog entry. This is the publication date. For unpublished entries, initially this is 4094 - * the document creation date, but can be edited by the user. 4095 - * 4096 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 4097 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 4098 - * @param result The resulting date, an instance of <tt>java.util.Date</tt>. 4099 - *### 4100 -#macro(getEntryDate $entryDoc $entryObj $result) 4101 - #set ($result = $NULL) 4102 - #setVariable (~"$result~" $entryObj.getProperty('publishDate').value) 4103 -#end 4104 -## 4105 -## 4106 -## 4107 -#** 4108 - * Displays a date, nicely formatted as a calendar page. 4109 - * 4110 - * @param date The date to display, an instance of <tt>java.util.Date</tt>. 4111 - *### 4112 -#macro(displayBlogDate $date) 4113 - #set($year = $xwiki.formatDate($date, 'yyyy')) 4114 - ## 3 letter month name, like Jan, Dec. 4115 - #set($month = $xwiki.formatDate($date, 'MMM')) 4116 - ## Uncomment to get a full length month name, like January, December. 4117 - ## TODO: this could be defined somewhere in the blog style. 4118 - ## #set($month = $xwiki.formatDate($date, 'MMMM')) 4119 - #set($day = $xwiki.formatDate($date, 'dd')) 4120 - (% class=~"blogdate~" ~%) 4121 - == (% class=~"month~" ~%)$month(%~%) (% class=~"day~" ~%)$day(%~%) (% class=~"year~" ~%)$year(%~%) == 4122 -#end 4123 -## 4124 -## 4125 -## 4126 -#** 4127 - * Displays a blog article: management tools, header, content, footer. 4128 - * 4129 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 4130 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 4131 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 4132 - * @param shouldDisplayTitle If <tt>true</tt>, display the blog title (blog posts shouldn't display the title 4133 - * when they're displayed alone on their page since it's the page title which is used in this case) 4134 - * @param shouldDisplayActions If <tt>true</tt>, display the blog post actions buttons 4135 - *### 4136 -#macro(displayEntry $entryDoc $entryObj $onlyExtract $shouldDisplayTitle $shouldDisplayActions) 4137 - ## Only articles with an explicit hidden setting or an explicit unpublished setting are hidden 4138 - #isPublished($entryObj $isPublished) 4139 - #isHidden($entryObj $isHidden) 4140 - #if($doc.fullName == $entryDoc.fullName) 4141 - (% class=~"hentry single-article~" ~%)((( 4142 - #else 4143 - (% class=~"hentry#if(!$isPublished) unpublished-article#elseif($isHidden) hidden-article#end~" ~%)((( 4144 - #end 4145 - #if ($shouldDisplayActions) 4146 - #displayEntryTools($entryDoc $entryObj) 4147 - #end 4148 - #if($shouldDisplayTitle) 4149 - #displayEntryTitle($entryDoc $entryObj) 4150 - #end 4151 - #if($doc.fullName == $entryDoc.fullName) 4152 - #if(!$isPublished) 4153 - \{\{warning}}\{\{translation key='blog.code.published'/}}\{\{/warning}} 4154 - #elseif($isHidden) 4155 - \{\{warning}}\{\{translation key='blog.code.hidden'/}}\{\{/warning}} 4156 - #end 4157 - #end 4158 - #displayEntryContent($entryDoc $entryObj $onlyExtract) 4159 - #displayEntryFooter($entryDoc $entryObj) 4160 - )))## hentry 4161 -#end 4162 -## 4163 -## 4164 -## 4165 -#** 4166 - * Checks if the provided blog is published or not. 4167 - * 4168 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 4169 - * @param isPublished The resulting boolean, true if the entry is considered published. 4170 - *### 4171 -#macro(isPublished $entryObj $isPublished) 4172 - #set ($isPublished = $NULL) 4173 - ## This should work for both old articles, which don't have the 'published' property at all, and 4174 - ## are considered published by default, and new entries, that should have 1 if published. 4175 - #if (~"$!\{entryObj.getProperty('published').value}~" != '0') 4176 - #setVariable (~"$isPublished~" true) 4177 - #else 4178 - #setVariable (~"$isPublished~" false) 4179 - #end 4180 -#end 4181 -## 4182 -## 4183 -## 4184 -#** 4185 - * Checks if the provided blog is hidden or not. 4186 - * 4187 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass<tt> xclass. 4188 - * @param isHiddel The resulting boolean, true if the entry is considered hidden. 4189 - *### 4190 -#macro(isHidden $entryObj $isHidden) 4191 - #set ($isHidden = $NULL) 4192 - ## This should work for both old articles, which don't have the 'hidden' property at all, and 4193 - ## are considered visible by default, and new entries, that should have 1 if hidden. 4194 - #if (~"$!\{entryObj.getProperty('hidden').value}~" == '1') 4195 - #setVariable (~"$isHidden~" true) 4196 - #else 4197 - #setVariable (~"$isHidden~" false) 4198 - #end 4199 -#end 4200 -## 4201 -## 4202 -## 4203 -#** 4204 - * Displays several ~"tools~" for manipulating blog posts: hide/show, publish, edit. 4205 - * 4206 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 4207 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 4208 - *### 4209 -#macro(displayEntryTools $entryDoc $entryObj) 4210 - #if($xcontext.action == 'view') 4211 - (% class=~"blog-entry-toolbox~" ~%)((( 4212 - #displayPublishButton($entryDoc $entryObj) 4213 - #displayHideShowButton($entryDoc $entryObj) 4214 - #displayEditButton($entryDoc $entryObj) 4215 - #displayDeleteButton($entryDoc $entryObj) 4216 - ))) 4217 - #end 4218 -#end 4219 -## 4220 -## 4221 -## 4222 -#** 4223 - * Displays the publish button to the entry <strong>creator</strong>, if the article is not published yet. 4224 - * 4225 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 4226 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 4227 - * @todo AJAX calls. 4228 - *### 4229 -#macro(displayPublishButton $entryDoc $entryObj) 4230 - #isPublished($entryObj $isPublished) 4231 - #if(!$isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 4232 - [[#toolImage('world')>>path:$blogPublisher.getURL('view', ~"entryName=$\{escapetool.url($entryDoc.fullName)}&xredirect=$\{escapetool.url($thisURL)}&form_token=$!\{services.csrf.getToken()}~")||title=~"$services.localization.render('blog.code.notpublished')~"]]## 4233 - #end 4234 -#end 4235 -## 4236 -## 4237 -## 4238 -#** 4239 - * Displays the hide or show button to the entry <strong>creator</strong>, if the article is already published. 4240 - * 4241 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 4242 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 4243 - *### 4244 -#macro(displayHideShowButton $entryDoc $entryObj) 4245 - #isPublished($entryObj $isPublished) 4246 - #isHidden($entryObj $isHidden) 4247 - ## Only published articles can be hidden. Unpublished articles are considered already hidden. 4248 - #if($isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 4249 - #set ($queryString = \{ 4250 - 'xredirect' : $thisURL, 4251 - 'form_token' : $services.csrf.getToken() 4252 - }) 4253 - #if ($isHidden) 4254 - #set ($discard = $queryString.putAll(\{ 4255 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 0, 4256 - 'comment' : $services.localization.render('blog.code.madevisible') 4257 - })) 4258 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 4259 - [[#toolImage('unlock')>>path:$lockURL||class=~"blog-tool-show~" title=~"$services.localization.render('blog.code.makevisible')~"]]## 4260 - #else 4261 - #set ($discard = $queryString.putAll(\{ 4262 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 1, 4263 - 'comment' : $services.localization.render('blog.code.hid') 4264 - })) 4265 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 4266 - [[#toolImage('lock')>>path:$lockURL||class=~"blog-tool-hide~" title=~"$services.localization.render('blog.code.hide')~"]]## 4267 - #end 4268 - #end 4269 -#end 4270 -## 4271 -## 4272 -## 4273 -#** 4274 - * Displays the edit button to those that can edit the article. 4275 - * 4276 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 4277 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 4278 - *### 4279 -#macro(displayEditButton $entryDoc $entryObj) 4280 - #if($xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 4281 - ## Call getDefaultEditMode() for backward compatibility with older blog posts. 4282 - [[#toolImage('pencil')>>path:$entryDoc.getURL('edit')||title=~"$services.localization.render('blog.code.editpost')~"]]## 4283 - #end 4284 -#end 4285 -## 4286 -## 4287 -## 4288 -#** 4289 - * Displays the delete button to those that can edit the article. 4290 - * 4291 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 4292 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 4293 - * @todo AJAX calls. 4294 - *### 4295 -#macro(displayDeleteButton $entryDoc $entryObj) 4296 - #if($xwiki.hasAccessLevel('delete', $xcontext.user, $entryDoc.fullName)) 4297 - [[#toolImage('cross')>>path:$entryDoc.getURL('delete')||title=~"$services.localization.render('blog.code.deletepost')~"]]## 4298 - #end 4299 -#end 4300 -## 4301 -## 4302 -## 4303 -#** 4304 - * Displays the title of the entry. 4305 - * 4306 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 4307 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 4308 - *### 4309 -#macro(displayEntryTitle $entryDoc $entryObj) 4310 - #if($doc.fullName == $entryDoc.fullName) 4311 - (% class=~"entry-title~" ~%) 4312 - = $services.rendering.escape($entryDoc.display('title', 'view', $entryObj), $xwiki.getCurrentContentSyntaxId()) = 4313 - #else 4314 - (% class=~"entry-title~" ~%) 4315 - === [[$services.rendering.escape($entryDoc.display('title', 'view', $entryObj),$xwiki.getCurrentContentSyntaxId())>>doc:$services.rendering.escape($services.model.serialize($entryDoc.getDocumentReference(),'default'),$xwiki.getCurrentContentSyntaxId())]] === 4316 - #end 4317 -#end 4318 -## 4319 -## 4320 -## 4321 -#** 4322 - * Displays the body of the entry. 4323 - * 4324 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 4325 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 4326 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 4327 - *### 4328 -#macro(displayEntryContent $entryDoc $entryObj $onlyExtract) 4329 - (% class=~"#if($onlyExtract)entry-summary#\{else}entry-content#end~" ~%)((( 4330 - #getEntryContent($entryDoc $entryObj $onlyExtract $entryContent) 4331 - ## FIXME: This causes the blog's content to not be annotatable. See http://jira.xwiki.org/browse/XWIKI-6328 4332 - ## Should probably be replaced by a display macro call with a reference to the object property holding the post's content 4333 - \{\{html wiki=~"false~"}}$entryDoc.getRenderedContent($entryContent, $entryDoc.syntax.toIdString())\{\{/html}} 4334 - ))) ## entry-content 4335 - (% class=~"clearfloats~" ~%)((())) 4336 -#end 4337 -## 4338 -## 4339 -## 4340 -#** 4341 - * Extracts the body of the entry that should be displayed. If <tt>onlyExtract</tt> is <tt>true</tt>, display the content 4342 - * of the <tt>extract</tt> field (if not empty). 4343 - * 4344 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 4345 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 4346 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 4347 - * @param entryContent The resulting content. 4348 - * @param removeEllipsis If <tt>true</tt>, then don't display an ellipsis at the end of the content (only used when 4349 - * <tt>onlyExtract</tt> is <tt>true</tt>) 4350 - *### 4351 -#macro(getEntryContent $entryDoc $entryObj $onlyExtract $entryContent $removeEllipsis) 4352 - #if ($onlyExtract) 4353 - ## Note: We trim the summary so that if there's some white space it won't cause the summary to be used instead 4354 - ## of the content. 4355 - #set ($macro.result = $entryObj.getProperty('extract').value.trim()) 4356 - #end 4357 - #if(~"$!macro.result~" == '') 4358 - #set($macro.result = $entryObj.getProperty('content').value) 4359 -#* Disabled until the content can be cleanly cut. 4360 -* #if($onlyExtract && $result.length()>$maxchars) 4361 -* #set($i = $macro.result.lastIndexOf(~" ~", $maxchars)) 4362 -* #set($i = $i + 1) 4363 -* #set($macro.result = ~"$\{macro.result.substring(0,$i)} *[...>$\{entryDoc.fullName}]*~") 4364 -* #end 4365 -## *### 4366 - #elseif (!$removeEllipsis) 4367 - #if($entryDoc.syntax.toIdString() == 'xwiki/1.0') 4368 - #set($macro.result = ~"$\{macro.result} <a href='$\{entryDoc.getExternalURL()}' title='$services.localization.render('blog.code.readpost')'>...</a>~") 4369 - #elseif($entryDoc.syntax.toIdString() == 'xwiki/2.0' || $entryDoc.syntax.toIdString() == 'xwiki/2.1') 4370 - #set($macro.result = ~"$\{macro.result} [[...>>$\{services.rendering.escape($entryDoc.getFullName(), $entryDoc.getSyntax())}||title='$services.localization.render('blog.code.readpost')']]~") 4371 - #end 4372 - #end 4373 - #set ($entryContent = $NULL) 4374 - #setVariable (~"$entryContent~" $macro.result) 4375 -#end 4376 -## 4377 -## 4378 -## 4379 -#** 4380 - * Displays the footer of the entry. 4381 - * 4382 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 4383 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 4384 - *### 4385 -#macro(displayEntryFooter $entryDoc $entryObj) 4386 - (% class=~"entry-footer~" ~%)((( 4387 - #isPublished($entryObj $isPublished) 4388 - (% class='entry-author-label' ~%) 4389 - #if($isPublished) 4390 - \{\{translation key='blog.code.postedby'/}} ## 4391 - #else 4392 - \{\{translation key='blog.code.createdby'/}} ## 4393 - #end 4394 - \{\{html wiki=~"false~" clean=~"false~"}}<span class='author vcard'>#userfn($entryDoc.creator)</span>\{\{/html}} ## 4395 - #getEntryDate($entryDoc $entryObj $entryDate) 4396 - #listCategories($entryObj) #* 4397 - ## Since the publish date and update date are not set at the exact same time, there could be a small difference that 4398 - ## we assume cannot be more than 3 seconds. 4399 - *#(% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.permalink'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||rel=~"bookmark~"]] ## 4400 - #if ($showcomments) 4401 - (% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.comments'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||anchor=~"Comments~"]] (% class=~"itemCount~" ~%)($entryDoc.comments.size())(%~%) ## 4402 - #end ## 4403 - #if($entryDoc != $doc) ## 4404 - #displayEntryBlogLocation($entryDoc $entryObj) ## 4405 - #end 4406 - )))## entry-footer 4407 -#end 4408 -## 4409 -## 4410 -#** 4411 - * Display the blog for the entry (if it is not the currently displayed blog) 4412 - * 4413 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 4414 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 4415 - *### 4416 -#macro(displayEntryBlogLocation $entryDoc $entryObj) 4417 - #getBlogPostsLocation($entryDoc.getSpace() $blogPostsLocation) ## 4418 - #if(~"$!blogPostsLocation~" != ~"~") ## 4419 - #set($blogSpaceRef = $services.model.resolveSpace($blogPostsLocation)) ## 4420 - #set($blogDocRef = $services.model.createDocumentReference($services.model.getEntityReference('DOCUMENT', 'default').getName(), $blogSpaceRef)) ## 4421 - #if($doc.documentReference != $blogDocRef) ## 4422 - #set($blogDoc = $xwiki.getDocument($blogDocRef)) ## 4423 - #set($blogObj = $blogDoc.getObject('Blog.BlogClass')) ## 4424 - #if($blogObj) (% class=~"blogrefpath~" ~%)((( ## 4425 - $services.localization.render('blog.code.postedin') \{\{html clean=~"false~" wiki=~"false~"}} #hierarchy($blogDocRef, \{'selfIsActive' : true, 'local': true}) \{\{/html}} ## 4426 - )))(%~%)## 4427 - #end 4428 - #end 4429 - #end 4430 -#end 4431 -## 4432 -## 4433 -## 4434 -## 4435 -#** 4436 - * List the categories an entry belongs to. Used in the footer. The categories are instances of <tt>Blog.CategoryClass</tt>. 4437 - * 4438 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 4439 - *### 4440 -#macro(listCategories $entryObj) 4441 - #if($entryObj.getxWikiClass().getName() == $blogPostClassname) 4442 - #set($categories = $entryObj.getProperty('category').value) 4443 - #set($first = true) 4444 - #if($categories.size() > 0) 4445 - #foreach($category in $categories) 4446 - #set($categoryDoc = $!xwiki.getDocument($category)) 4447 - #if(!$categoryDoc.isNew() && $categoryDoc.getObject($\{blogCategoryClassname})) 4448 - #if($foreach.count == 1) 4449 - (% class='separator' ~%)·(%~%) $services.localization.render('blog.code.categories') ## 4450 - #else 4451 - , ## 4452 - #end## 4453 - [[$!\{categoryDoc.getObject($blogCategoryClassname).getValue('name')}>>$\{category}||rel='tag']]## 4454 - #end## 4455 - #end## 4456 - #end 4457 - #end 4458 -#end 4459 -## 4460 -## 4461 -## 4462 -#** 4463 - * Displays blog pagination links (older and newer entries). 4464 - * 4465 - * @param blogDoc the XDocument holding the blog definition object. 4466 - *### 4467 -#macro(displayNavigationLinks $blogDoc) 4468 - (% class=~"clearfloats~" ~%)((())) 4469 - #getBlogDisplayType($blogDoc $displayType) 4470 - #if($displayType == 'weekly') 4471 - (% class=~"pagingLinks~" ~%)((( 4472 - #getRequestedWeek($weekDate) 4473 - $weekDate.addWeeks(-1)## 4474 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousweek'/}}>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 4475 - #sep() 4476 - $weekDate.addWeeks(2)## 2 because we already subtracted 1 above 4477 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextweek'/}} »>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 4478 - ))) 4479 - #elseif($displayType == 'monthly') 4480 - (% class=~"pagingLinks~" ~%)((( 4481 - #getRequestedMonth($monthDate) 4482 - $monthDate.addMonths(-1)## 4483 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousmonth'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 4484 - #sep() 4485 - $monthDate.addMonths(2)## 2 because we already subtracted 1 above 4486 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextmonth'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 4487 - ))) 4488 - #elseif($displayType == 'all') 4489 - #else 4490 - ## Paginated 4491 - #if(($totalPages > 1)) 4492 - #set($queryString = '') 4493 - #foreach($p in $request.getParameterNames()) 4494 - #if($p != 'page' && $p != 'ipp') 4495 - #foreach($v in $request.getParameterValues($p)) 4496 - #set($queryString = ~"$\{queryString}&$\{escapetool.url($p)}=$\{escapetool.url($v)}~") 4497 - #end 4498 - #end 4499 - #end 4500 - (% class=~"pagingLinks~" ~%)((( 4501 - #if ($currentPageNumber < $totalPages) 4502 - #set($currentPageNumber = $currentPageNumber + 1) 4503 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.olderposts'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 4504 - #set($currentPageNumber = $currentPageNumber - 1) 4505 - #end 4506 - #if ($currentPageNumber > 1) 4507 - #if ($currentPageNumber < $totalPages) 4508 - #sep() 4509 - #end 4510 - #set($currentPageNumber = $currentPageNumber - 1) 4511 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.newerposts'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 4512 - #set($currentPageNumber = $currentPageNumber + 1) 4513 - #end 4514 - (% class=~"clear~" ~%)(%~%) 4515 - )))## pagingLinks 4516 - #end 4517 - #end 4518 -#end 4519 -## 4520 -## 4521 -## 4522 -#** 4523 - * Displays a message box with ~"publish~" icon. 4524 - * 4525 - * @param message A text message concerning blog article publishing 4526 - *### 4527 -#macro(publishMessageBox $message) 4528 -(% class=~"plainmessage publish-message~" ~%)((($services.icon.render('world') $message))) 4529 -#end 4530 -#** 4531 - * Displays a message box with ~"show/hide~" icon. 4532 - * 4533 - * @param message A text message concerning blog article hiding 4534 - *### 4535 -#macro(hideMessageBox $message) 4536 -(% class=~"plainmessage hide-message~" ~%)((($services.icon.render('unlock') $message))) 4537 -#end 4538 -## 4539 -## 4540 -## 4541 -#** 4542 - * Determine the requested week, for using in a weekly-indexed blog. The relevant request parameters are 4543 - * <tt>year</tt> and <tt>week</tt>. By default, the current week is used. 4544 - * 4545 - * @param monthDate The resulting week, a JODATime MutableDateTime. 4546 - *### 4547 -#macro(getRequestedWeek $weekDate) 4548 - #set ($weekDate = $NULL) 4549 - #setVariable (~"$weekDate~" $xwiki.jodatime.mutableDateTime) 4550 - #if(~"$!\{request.year}~" != '') 4551 - #set ($discard = $weekDate.setYear($numbertool.toNumber($request.year).intValue())) 4552 - #end 4553 - #if(~"$!\{request.week}~" != '') 4554 - #set ($discard = $weekDate.setWeekOfWeekyear($numbertool.toNumber($request.week).intValue())) 4555 - #end 4556 -#end 4557 -## 4558 -## 4559 -## 4560 -#** 4561 - * Determine the requested month, for using in a monthly-indexed blog. The relevant request parameters are 4562 - * <tt>year</tt> and <tt>month</tt>. By default, the current month is used. 4563 - * 4564 - * @param monthDate The resulting month, a JODATime MutableDateTime. 4565 - *### 4566 -#macro(getRequestedMonth $monthDate) 4567 - #set ($monthDate = $NULL) 4568 - #setVariable (~"$monthDate~" $xwiki.jodatime.mutableDateTime) 4569 - #if(~"$!\{request.year}~" != '') 4570 - #set ($discard = $monthDate.setYear($numbertool.toNumber($request.year).intValue())) 4571 - #end 4572 - #if(~"$!\{request.month}~" != '') 4573 - #set ($discard = $monthDate.setMonthOfYear($numbertool.toNumber($request.month).intValue())) 4574 - #end 4575 -#end 4576 -## 4577 -## 4578 -## 4579 -#** 4580 - * Retrieve a blog property (title, display type, etc). 4581 - * 4582 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 4583 - * @param propertyName The name of the property to be retrieved. One of the <tt>Blog.BlogClass</tt>'s properties. 4584 - * @param defaultValue The default value to use in case the blog object does not define one. 4585 - * @param propertyValue The resulting value. 4586 - *### 4587 -#macro(getBlogProperty $blogDoc $propertyName $defaultValue $propertyValue) 4588 - #set($result = ~"$!\{blogDoc.getObject($\{blogClassname}).getProperty($propertyName).value}~") 4589 - #if($result == '') 4590 - #set($result = $defaultValue) 4591 - #end 4592 - #set ($propertyValue = $NULL) 4593 - #setVariable (~"$propertyValue~" $result) 4594 -#end 4595 - 4596 -#** 4597 - * If an error occurs when executing an action, set a specific response status and display an error message. 4598 - * 4599 - * @param status The response status. 4600 - * @param text The user readable error to be displayed. Can be a translation key. 4601 - * @param parameters The parameters to use when decoding the translation key. 4602 - *### 4603 -#macro(blog__actionResponseError $status $text $parameters) 4604 - $response.setStatus($status) 4605 - #if($request.ajax) 4606 - $services.localization.render($text, $!parameters) 4607 - #else 4608 - \{\{error}}$services.localization.render($text, $!parameters)\{\{/error}} 4609 - #end 4610 -#end 4611 -## 4612 -## 4613 -## 4614 -#** 4615 - * Check if a blog is the Default blog (The one in the 'Blog' space). 4616 - * 4617 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 4618 - * @param isDefault The resulting boolean. 4619 - *### 4620 -#macro(isDefaultBlog $blogDoc $isDefault) 4621 - #set ($result = false) 4622 - #if ($blogDoc.space == 'Blog') 4623 - #set ($result = true) 4624 - #end 4625 - #setVariable(~"$isDefault~" $result) 4626 -#end 4627 -## 4628 -## 4629 -## 4630 -#** 4631 - * Retrieve the blog posts location (space). 4632 - * 4633 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 4634 - * @param postsLocation The resulting location. 4635 - *### 4636 -#macro(getBlogPostsLocation $blogSpace $postsLocation) 4637 - #getBlogDocument($blogSpace $blogDoc) 4638 - #getBlogProperty($blogDoc 'postsLocation' $blogDoc.space $result) 4639 - #set ($postsLocation = $NULL) 4640 - #setVariable (~"$postsLocation~" $result) 4641 -#end 4642 -## 4643 -## 4644 -## 4645 -#** 4646 - * Retrieve the blog categories location (space). 4647 - * 4648 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 4649 - * @param categoriesLocation The resulting location. 4650 - *### 4651 -#macro(getBlogCategoriesLocation $blogSpace $categoriesLocation) 4652 - #getBlogDocument($blogSpace $blogDoc) 4653 - #getBlogProperty($blogDoc 'categoriesLocation' 'Blog' $result) 4654 - #set ($postsLocation = $NULL) 4655 - #setVariable (~"$categoriesLocation~" $result) 4656 -#end 4657 -###** 4658 - * Return the Query for selecting the blog posts based on the context where the posts are displayed. 4659 - * for example there is 4 different panel contexts: 4660 - * aBlog.aPost or aBlog.WebHome 4661 - * aCategorySpace.aCategory 4662 - * aCategorySpace.WebHome 4663 - * Blog.aPost or Blog.WebHome 4664 - * 4665 - * @param query The query for selecting blog entries. 4666 - * @param queryParams The parameters to bind with the generated query. 4667 - * @param targetDoc The document in which the articles will be displayed. 4668 - *### 4669 -#macro(getAllBlogPostsQueryBasedOnDisplayContext $targetDoc $query $queryParams) 4670 - #set ($query = $NULL) 4671 - #set ($queryParams = $NULL) 4672 - #getCategoryAllBlogPostsQuery($resultQuery) 4673 - #set ($resultQueryParams = \{}) 4674 - #set($sanitizedSpace = $targetDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 4675 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 4676 - ## Get all posts that are in the default blog space('Blog') or in category 'Blog.%' 4677 - #set ($discard = $resultQueryParams.put('space', $targetDoc.space)) 4678 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 4679 - #set($resultQuery = ~"$\{resultQuery} and (doc.space = :space or catList like :catList escape '!')~") 4680 - #elseif($targetDoc.getObject($blogCategoryClassname)) 4681 - ## Get all posts that are in a category aCategorySpace.aCategory 4682 - #set ($discard = $resultQueryParams.put('catList', $targetDoc.fullName)) 4683 - #set($resultQuery = ~"$\{resultQuery} and (catList=:catList)~") 4684 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 4685 - ## Get all posts that are in a category aCategorySpace.% 4686 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 4687 - ## Exclude incategorized posts 4688 - #set ($excludedCategory = ~"$\{targetDoc.space}.WebHome~") 4689 - #if ($targetDoc.space == $defaultBlogSpace) 4690 - #set ($excludedCategory = ~"Blog.Categories.WebHome~") 4691 - #end 4692 - #set ($discard = $resultQueryParams.put('excludedCategory', $excludedCategory)) 4693 - #set($resultQuery = ~"$\{resultQuery} and (catList<>:excludedCategory) and (catList like :catList escape '!')~") 4694 - #else 4695 - ## Get all posts in blog space aBlog 4696 - #getAllBlogPostsQuery($resultQuery) 4697 - #getBlogPostsLocation($targetDoc.space $postsLocation) 4698 - #set ($discard = $resultQueryParams.put('space', $postsLocation)) 4699 - #set($resultQuery = ~"$\{resultQuery} and doc.space = :space~") 4700 - #end 4701 - #setVariable(~"$query~" $resultQuery) 4702 - #setVariable(~"$queryParams~" $resultQueryParams) 4703 -#end 4704 -## 4705 -## 4706 -## 4707 -###** 4708 - * Display blog posts based on the context where the posts are displayed. 4709 - * for example there is 4 different panel contexts: 4710 - * aBlog.aPost or aBlog.WebHome 4711 - * aCategorySpace.aCategory 4712 - * aCategorySpace.WebHome 4713 - * Blog.aPost or Blog.WebHome 4714 - * 4715 - * @param targetDoc The document in which the articles will be displayed. 4716 - * @param postsVisiblity The visibility of the posts to display: recent, unpublished, ... 4717 - * @param layout Layout of the the posts to display 4718 - * @param layoutParams additional layout parameters, it is a string like 'param1=val1|...|paramN=valueN' 4719 - * @param limit the number of posts to display 4720 - *### 4721 -#macro(displayBlogPostsBasedOnContext $targetDoc $postsVisiblity $layout $layoutParams $limit) 4722 - #if ($postLayout == 'full') 4723 - #set ($macro.paginated = 'yes') 4724 - #end 4725 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 4726 - ## Display all posts that are in the default blog space('Blog') or in category 'Blog.%' 4727 - #getBlogPostsLayout($xwiki.getDocument(~"$\{defaultBlogSpace}.WebHome~") $postsLayout) 4728 - #if (~"$!layout~" == '') 4729 - #set ($layout = $postsLayout) 4730 - #end 4731 - #if ($postsVisiblity == 'recent') 4732 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 4733 - #elseif($postsVisiblity == 'unpublished') 4734 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 4735 - #end 4736 - #elseif($targetDoc.getObject($blogCategoryClassname)) 4737 - ## Display all posts that are in a category aCategorySpace.aCategory 4738 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 4739 - #getBlogPostsLayout($blogDoc $postsLayout) 4740 - #if (~"$!layout~" == '') 4741 - #set ($layout = $postsLayout) 4742 - #end 4743 - #if ($postsVisiblity == 'recent') 4744 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 4745 - #elseif($postsVisiblity == 'unpublished') 4746 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 4747 - #end 4748 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 4749 - ## Display all posts that are in a category aCategorySpace.% 4750 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 4751 - #getBlogPostsLayout($blogDoc $postsLayout) 4752 - #if (~"$!layout~" == '') 4753 - #set ($layout = $postsLayout) 4754 - #end 4755 - #if ($postsVisiblity == 'recent') 4756 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 4757 - #elseif($postsVisiblity == 'unpublished') 4758 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 4759 - #end 4760 - #else 4761 - ## Display all posts in blog space aBlog 4762 - #getBlogDocument($targetDoc.space $blogDoc) 4763 - #getBlogPostsLayout($blogDoc $postsLayout) 4764 - #if (~"$!layout~" == '') 4765 - #set ($layout = $postsLayout) 4766 - #end 4767 - #if ($postsVisiblity == 'recent') 4768 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 4769 - #elseif($postsVisiblity == 'unpublished') 4770 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 4771 - #end 4772 - #end 4773 -#end 4774 -## 4775 -## 4776 -## 4777 -#** 4778 - * Bind parameters to a query object. 4779 - * 4780 - * @param queryObj The query object (org.xwiki.query.internal.ScriptQuery object) 4781 - * @param queryParams the query parameters. 4782 - *### 4783 -#macro(bindQueryParameters $queryObj $queryParams) 4784 - #set ($output = $queryObj) 4785 - #foreach( $key in $queryParams.keySet() ) 4786 - #set($output = $queryObj.bindValue($key, $queryParams.get($key))) 4787 - #end 4788 - #setVariable(~"$queryObj~" $output) 4789 -#end 4790 -## 4791 -## 4792 -## 4793 -#** 4794 - * Determines the blogposts layout: Default layout (Calendar), Image thumbnail 4795 - * 4796 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>postsLayout</tt> 4797 - * property set. 4798 - * @param postsLayout The resulting string. If the blog object does not define anything, it is considered full (default). 4799 - *### 4800 -#macro(getBlogPostsLayout $blogDoc $postsLayout) 4801 - #getBlogProperty($blogDoc 'postsLayout' 'full' $res) 4802 - #set ($postsLayout = $NULL) 4803 - #setVariable (~"$postsLayout~" $res) 4804 -#end 4805 -## 4806 -## 4807 -## 4808 -#** 4809 - * Retrieve the blog document of a categories space, which is the blog descriptor that have its categoriesLocation property set to the categories space 4810 - * 4811 - * @param categoriesSpace A <tt>String</tt>, the name of the space. 4812 - * @param blogDoc The resulting XDocument. 4813 - *### 4814 -#macro(getBlogDocumentForCategoriesSpace $categoriesSpace $blogDoc) 4815 - #set($macro.blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as categoriesLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=categoriesLocationProp.id.id and categoriesLocationProp.id.name='categoriesLocation' and categoriesLocationProp.value=:categoriesLocation order by doc.creationDate~").setLimit(1).setOffset(0).bindValue('categoriesLocation', $categoriesSpace).execute()) 4816 - #if($macro.blogDocs.size() > 0 && $categoriesSpace != $defaultBlogSpace) 4817 - #set($macro.result = $xwiki.getDocument($macro.blogDocs.get(0))) 4818 - #else 4819 - ## Fallback to Blog.WebHome, the default blog 4820 - #set($macro.result = $xwiki.getDocument('Blog.WebHome')) 4821 - #end 4822 - #set ($blogDoc = $NULL) 4823 - #setVariable (~"$blogDoc~" $macro.result) 4824 -#end" %) 4825 -((( 4826 -(% class="macro-placeholder hidden" %) 4827 -((( 4828 -macro:velocity 4829 -))) 4830 -))) 4831 -))) 4832 - 4833 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogPostLayoutMacros~"" %) 4834 -((( 4835 -(% class="macro-placeholder hidden" %) 4836 -((( 4837 -macro:include 4838 -))) 4839 - 4840 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|#** 4841 - * Extract the layout parameters from a string. 4842 - * 4843 - * @param layoutParamsString The string representation of the layout parameters. 4844 - * It should contain a String following this format ~"paramName1=Value1|paramName2=Value2|...|paramNameK=ValueK~" 4845 - * @param layoutsParameters The resulting layout parameters Map. 4846 - *### 4847 -#macro(extractLayoutParametersFromString $layoutParamsString $layoutsParameters) 4848 - #set ($layoutsParameters = $NULL) 4849 - #set ($macro.layoutParams = \{}) 4850 - #if (~"$!layoutParamsString~" != '') 4851 - #set ($macro.paramsArr = $layoutParamsString.split('\\|')) 4852 - #foreach ($item in $macro.paramsArr) 4853 - #set ($itemSplit = $item.split('=')) 4854 - #if ($itemSplit.size() == 2) 4855 - #set ($discard = $macro.layoutParams.put($itemSplit[0].trim(), $itemSplit[1].trim())) 4856 - #end 4857 - #end 4858 - #end 4859 - #setVariable(~"$layoutsParameters~" $macro.layoutParams) 4860 -#end" %) 4861 -((( 4862 -(% class="macro-placeholder hidden" %) 4863 -((( 4864 -macro:velocity 4865 -))) 4866 -))) 4867 -))) 4868 - 4869 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-| #macro(displaySmallPost $pDoc $pObj) 4870 - #initLayoutVars($pDoc $pObj) 4871 - <div class=~"col-xs-12 col-sm-6 next_blog~"> 4872 - <a href=~"$pDoc.uRL~" class=~"thumbnail~"> 4873 - <div class=~"row~"> 4874 - <div class=~"col-xs-4~"> 4875 - #if ($imageAtt) 4876 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 4877 - #end 4878 - </div> 4879 - <div class=~"col-xs-8 art_det~"> 4880 - <p class=~"text-left~"> 4881 - #if($displayTitle)$!postTitle #end 4882 - <br/><span class=~"date_info~"> $!dateStr </span> 4883 - </p> 4884 - #displayPostDetails($pDoc) 4885 - </div> 4886 - </div> 4887 - </a> 4888 - </div> 4889 - #end 4890 - ## 4891 - ## 4892 - ## 4893 - #macro(displayPinnedPost $pDoc $pObj) 4894 - #initLayoutVars($pDoc $pObj) 4895 - <div class=~"col-xs-12 col-sm-4 col-md-4 blog_pin~"> 4896 - <a href=~"$pDoc.uRL~" class=~"all-post-link~"> 4897 - <div class=~"thumbnail~"> 4898 - #if ($displayTitle && $displayTitleFirstOnPinnedPosts) 4899 - <h5 class=~"title-top~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 4900 - #end 4901 - #if ($imageAtt) 4902 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 4903 - #end 4904 - <div class=~"caption~"> 4905 - #if ($displayTitle && !$displayTitleFirstOnPinnedPosts) 4906 - <h5 class=~"text-left~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 4907 - #end 4908 - #if ($displaySummaryOnPinnedPosts) 4909 - <div class=~"text-left post-summary~"> 4910 - #set ($postContent = $pObj.getProperty('extract').value) 4911 - $!pDoc.getRenderedContent($postContent, $pDoc.syntax.toIdString()) 4912 - </div> 4913 - #end 4914 - #displayPostDetails($pDoc) 4915 - </div> 4916 - </div> 4917 - </a> 4918 - </div> 4919 - #end 4920 - ## 4921 - ## 4922 - ## 4923 - #macro(formatPostDate $pDoc $pObj) 4924 - #set ($formattedDate = $NULL) 4925 - #set($dateStr = $datetool.format('medium', $postDate, $xcontext.locale)) 4926 - #if (~"$!dateStr~" != '') 4927 - #set ($dateArr = $dateStr.split(' ')) 4928 - #if ($dateArr.size() > 3) 4929 - #set ($dateStr = ~"~") 4930 - #foreach($s in $dateArr.subList(0, 3)) 4931 - #set ($dateStr = ~"$\{dateStr}$\{s} ~") 4932 - #end 4933 - #end 4934 - #end 4935 - #setVariable(~"$formattedDate~" $dateStr) 4936 - #end 4937 - ## 4938 - ## 4939 - ## 4940 - #macro(displayPostDetails $pDoc) 4941 - <div class=~"row post-details~"> 4942 - <div class=~"col-xs-8 detail~"> 4943 - #if ($services.like.displayButton($pDoc.documentReference)) 4944 - #set ($optLikeRecord = $services.like.getLikes($pDoc.documentReference)) 4945 - ## Retrieve the likes number in XWiki 12.9+ 4946 - #set ($likeNumber = $optLikeRecord.get()) 4947 - #if (!$stringtool.isNumeric($likeNumber.toString())) 4948 - ## Retrieve the likes number in XWiki versions greater than 12.7 and lower than 12.9. 4949 - #set ($likeNumber = $optLikeRecord.get().likeNumber) 4950 - #end 4951 - #if ($stringtool.isNumeric($likeNumber.toString())) 4952 - <div class=~"post-likes btn btn-default disabled badge~" 4953 - title=~"$escapetool.xml($services.localization.render('like.button.title', [$likeNumber]))~"> 4954 - $services.icon.renderHTML('heart') <span class=~"like-number~">$likeNumber</span> 4955 - </div> 4956 - #end 4957 - #elseif ($services.ratings) 4958 - #set ($ratingsConfigDoc = $services.ratings.getConfigurationDocument($pDoc.documentReference)) 4959 - #if ($ratingsConfigDoc.getValue('displayRatings') == 1) 4960 - <ul class=~"pull-left note list-inline~"> 4961 - #foreach ($x in [1..5]) 4962 - #set ($cls = ~"~") 4963 - #if ($x > $averageVote) 4964 - #set ($cls = ~"-o~") 4965 - #end 4966 - <li><span class=~"fa fa-star$\{cls}~"></span></li> 4967 - #end 4968 - </ul> 4969 - #end 4970 - #end 4971 - </div> 4972 - #if ($showPostComments) 4973 - <div class=~"col-xs-4 com_det~"> 4974 - <p class=~"text-right~">$services.icon.renderHTML('comments') ($!nbComments)</p> 4975 - </div> 4976 - #end 4977 - </div> 4978 - #end 4979 - ## 4980 - ## 4981 - ## 4982 - #macro(initLayoutVars $pDoc $pObj) 4983 - #set ($postTitle = $pDoc.display('title', 'view', $pObj)) 4984 - #set ($imageAtt = $pDoc.getAttachment($pObj.getValue('image'))) 4985 - #isPublished($pObj $isPublished) 4986 - #isHidden($pObj $isHidden) 4987 - #getEntryDate($pDoc $pObj $postDate) 4988 - #formatPostDate($postDate $dateStr) 4989 - #set ($averageVote = $mathtool.round($services.ratings.getAverageRating($pDoc.documentReference).getAverageVote())) 4990 - #set ($nbComments = $pDoc.getComments().size()) 4991 - #set ($showPostComments = true) 4992 - #if ($xwiki.getSpacePreferenceFor('showcomments', $pDoc.documentReference.lastSpaceReference, '1') == '0') 4993 - #set ($showPostComments = false) 4994 - #end 4995 - #end 4996 - ## 4997 - ## 4998 - ## 4999 - #macro(displayEditPinnedPostsButton) 5000 - #if (~"$!macroAdditionalParams.get('postIndex')~" == '0' && $services.security.authorization.hasAccess('edit', $pinnedPostsSourceDoc.fullName)) 5001 - #set ($discard = $xwiki.ssx.use('Blog.PinnedPostsSheet')) 5002 - #set ($discard = $xwiki.jsx.use('Blog.PinnedPostsSheet')) 5003 - #set ($editPinnedPostsURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'get', 'sheet=Blog.PinnedPostsSheet')) 5004 - #set ($newPinnedPostsObjectURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'objectadd', ~"classname=Blog.PinnedPostsClass&form_token=$!\{services.csrf.getToken()}~")) 5005 - <div class=~"edit-pinned-posts-container~"> 5006 - <div class=~"col-xs-12 col-sm-12 col-md-12 text-right edit-pinned-posts~"> 5007 - <a href=~"javascript:;~" class=~"editPinnedPosts~"> 5008 - <span class=~"glyphicon glyphicon-edit~" aria-hidden=~"true~"></span> $services.localization.render('blog.post.layout.cards.pinnedposts.edit') 5009 - </a> 5010 - <input type=~"hidden~" id=~"editPinnedPostsURL~" value=~"$escapetool.xml($editPinnedPostsURL)~"/> 5011 - <input type=~"hidden~" id=~"newPinnedPostsObjectURL~" value=~"$escapetool.xml($newPinnedPostsObjectURL)~"/> 5012 - </div> 5013 - </div> 5014 - #if (~"$!pinnedPostsObj~" == '') 5015 - <input type=~"hidden~" name=~"createPinnedPostsObject~" value=~"1~"/> 5016 - #end 5017 - #end 5018 - #end" %) 5019 -((( 5020 -(% class="macro-placeholder hidden" %) 5021 -((( 5022 -macro:velocity 5023 -))) 5024 -))) 5025 - 5026 -(% data-macro="startmacro:velocity|-||-| #if ($services.security.authorization.hasAccess('view', $xcontext.macro.params.reference)) 5027 - #set ($postDoc = $xwiki.getDocument($xcontext.macro.params.reference)) 5028 - #getEntryObject($postDoc $postObj) 5029 - #if (~"$!postObj~" != '') 5030 - #extractLayoutParametersFromString($xcontext.macro.params.params $macroAdditionalParams) 5031 - ## 5032 - #set ($displayTitle = true) 5033 - #if (~"$!macroAdditionalParams.get('displayTitle')~" == 'false') 5034 - #set ($displayTitle = false) 5035 - #end 5036 - ## 5037 - #set ($displayTitleFirstOnPinnedPosts = false) 5038 - #if (~"$!macroAdditionalParams.get('displayTitleFirstOnPinnedPosts')~" == 'true') 5039 - #set ($displayTitleFirstOnPinnedPosts = true) 5040 - #end 5041 - ## 5042 - #set ($displaySummaryOnPinnedPosts = true) 5043 - #if (~"$!macroAdditionalParams.get('displaySummaryOnPinnedPosts')~" == 'false') 5044 - #set ($displaySummaryOnPinnedPosts = false) 5045 - #end 5046 - ## 5047 - #set ($postIndex = $numbertool.toNumber($macroAdditionalParams.get('postIndex')).intValue()) 5048 - #if ($postIndex == 0) 5049 - #set ($stopBlogPostsDisplay = false) 5050 - #end 5051 - #set ($listResultsCount = $numbertool.toNumber($macroAdditionalParams.get('list-results-count')).intValue()) 5052 - #set($discard = $xwiki.ssx.use('Blog.BlogPostLayoutCards')) 5053 - #set($scaleWidth = 600) 5054 - #set($imgQs=~"width=$scaleWidth~") 5055 - ## Display pinned posts 5056 - ## Get the list of pinned posts 5057 - #set ($pinnedPosts = []) 5058 - #set ($pinnedPostsSourceDoc = $NULL) 5059 - #if (~"$!macroAdditionalParams.get('forceDisplayPinnedPosts')~" == 'true' && ~"$!macroAdditionalParams.get('list-blog')~" != '') 5060 - #set ($pinnedPostsSourceDoc = $xwiki.getDocument($macroAdditionalParams.get('list-blog'))) 5061 - ## Note that the 'list-blog' parameter contains the value of the 'blog' parameter of the blogpostlist macro passed to the current layout macro 5062 - #end 5063 - #if (~"$!pinnedPostsSourceDoc~" != '') 5064 - #set ($pinnedPostsObj = $pinnedPostsSourceDoc.getObject('Blog.PinnedPostsClass')) 5065 - #if (~"$!pinnedPostsObj~" != '') 5066 - #set ($orderedPinnedPostsJSON = $pinnedPostsObj.getProperty('orderedPosts').value) 5067 - #if (~"$!orderedPinnedPostsJSON~" != '') 5068 - #set ($pinnedPosts = $jsontool.parse($orderedPinnedPostsJSON)) 5069 - #else 5070 - #set ($pinnedPosts = $pinnedPostsObj.getProperty('posts').value) 5071 - #end 5072 - #end 5073 - #if ($postIndex == 0 && $pinnedPosts.size() > 0) 5074 - \{\{html clean=~"false~"}} 5075 - #set ($x = 0) 5076 - #set ($showPinnedPostsButton = true) 5077 - #foreach ($pinnedPost in $pinnedPosts) 5078 - #if ($x == 0) 5079 - <div class=~"row flex-container~"> 5080 - #if ($showPinnedPostsButton) 5081 - #displayEditPinnedPostsButton() 5082 - #set($showPinnedPostsButton = false) 5083 - #end 5084 - #end 5085 - #set ($pinnedPostDoc = $xwiki.getDocument($pinnedPost)) 5086 - #getEntryObject($pinnedPostDoc $pinnedPostObj) 5087 - #if (~"$!pinnedPostObj~" != '') 5088 - #displayPinnedPost($pinnedPostDoc $pinnedPostObj) 5089 - #end 5090 - #set ($x = $mathtool.add($x, 1)) 5091 - #if ($x == 3) 5092 - #set ($x = 0) 5093 - </div> 5094 - #end 5095 - #end 5096 - #if ($mathtool.mod($x, 3) != 0) 5097 - </div> 5098 - #end 5099 - \{\{/html}} 5100 - 5101 - ## If the first post is a pinned post : this means that all the posts are pinned 5102 - ## In this case, avoid displaying the posts again after the pinned posts section. 5103 - #if ($pinnedPosts.contains($xcontext.macro.params.reference)) 5104 - #set ($stopBlogPostsDisplay = true) 5105 - #end 5106 - #elseif($postIndex == 0 && $pinnedPosts.size() == 0) 5107 - 5108 - \{\{html}} 5109 - <div class=~"row no-pinnded-posts~"> 5110 - #displayEditPinnedPostsButton() 5111 - </div> 5112 - \{\{/html}} 5113 - 5114 - #end 5115 - #end 5116 - #if (!$stopBlogPostsDisplay) 5117 - \{\{html clean=~"false~"}} 5118 - #if (~"$!nbDisplayedPosts~" == '' || $postIndex == 0) 5119 - #set ($nbDisplayedPosts = 0) 5120 - #end 5121 - #if($mathtool.mod($nbDisplayedPosts, 2) == 0) 5122 - #if ($nbDisplayedPosts != 0) 5123 - </div> 5124 - #set ($lastHtmlTag = 'c') 5125 - #end 5126 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 5127 - <div class=~"row~"> 5128 - #set ($lastHtmlTag = 'o') 5129 - #set ($lastRowClass = ~"~") 5130 - #else 5131 - <div class=~"row flex-container~"> 5132 - #set ($lastHtmlTag = 'o') 5133 - #set ($lastRowClass = ~"flex~") 5134 - #end 5135 - #end 5136 - #displaySmallPost($postDoc $postObj) 5137 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 5138 - </div> 5139 - #set ($lastHtmlTag = 'c') 5140 - #end 5141 - #set ($nbDisplayedPosts = $mathtool.add($nbDisplayedPosts, 1)) 5142 - #if ($postIndex == $mathtool.sub($listResultsCount, 1)) 5143 - #if (~"$!lastHtmlTag~" == 'o') 5144 - #if ($mathtool.mod($nbDisplayedPosts, 2) == 1 && $lastRowClass == ~"flex~") 5145 - <div class=~"col-xs-12 col-sm-6~"></div> 5146 - #end 5147 - </div> 5148 - #end 5149 - #end 5150 - \{\{/html}} 5151 - #end 5152 - #else 5153 - \{\{error}}$services.localization.render('blog.blogpostlayout.notpost', [$xcontext.macro.params.reference])\{\{/error}} 5154 - #end 5155 - #else 5156 - \{\{error}}$services.localization.render('blog.blogpostlayout.post_view_not_allowed', [$xcontext.macro.params.reference])\{\{/error}} 5157 - #end" class="macro hidden macro-placeholder" %)macro:velocity(% data-macro="startmacro:html|-|clean=~"false~"|-|</div> 5158 -<div class=~"row flex-container~"> 5159 -<div class=~"col-xs-12 col-sm-6 next_blog~"> 5160 -<a href=~"/Nieuws/Nieuwsbrief%20december%202023~" class=~"thumbnail~"> 5161 -<div class=~"row~"> 5162 -<div class=~"col-xs-4~"> 5163 -<img src=~"/download/Nieuws/Nieuwsbrief%20december%202023/snow-cold-winter-white-sweet-weather-1363025-pxhere.com.jpg?width=600&rev=1.1~" /> 5164 -</div> 5165 -<div class=~"col-xs-8 art_det~"> 5166 -<p class=~"text-left~"> 5167 -Nieuwsbrief december 2023 <br/><span class=~"date_info~"> Jan 10, 2024, </span> 5168 -</p> 5169 -<div class=~"row post-details~"> 5170 -<div class=~"col-xs-8 detail~"> 5171 -<div class=~"post-likes btn btn-default disabled badge~" 5172 -title=~"Number of likes on this page: 1~"> 5173 -<span class=~"fa fa-heart~"></span> <span class=~"like-number~">1</span> 5174 -</div> 5175 -</div> 5176 -<div class=~"col-xs-4 com_det~"> 5177 -<p class=~"text-right~"><span class=~"fa fa-comments~"></span> (0)</p> 5178 -</div> 5179 -</div> 5180 -</div> 5181 -</div> 5182 -</a> 5183 -</div>" class="macro macro hidden macro-placeholder" %)macro:html 5184 -))) 5185 -))) 5186 - 5187 -(% class="row flex-container" %) 5188 -((( 5189 -(% class="col-xs-12 col-sm-6 next_blog" %) 5190 -((( 5191 -(% class="row" %) 5192 -((( 5193 -(% class="col-xs-4" %) 5194 -((( 5195 -[[~[~[image:/download/Nieuws/Nieuwsbrief%20december%202023/snow-cold-winter-white-sweet-weather-1363025-pxhere.com.jpg?width=600&rev=1.1~]~]>>path:/Nieuws/Nieuwsbrief%20december%202023||class="thumbnail"]] 5196 -))) 5197 - 5198 -(% class="col-xs-8 art_det" %) 5199 -((( 5200 -(% class="text-left" %) 5201 -[[Nieuwsbrief december 2023 5202 -(% class="date_info" %) Jan 10, 2024,>>path:/Nieuws/Nieuwsbrief%20december%202023||class="thumbnail"]] 5203 - 5204 -(% class="row post-details" %) 5205 -((( 5206 -(% class="col-xs-8 detail" %) 5207 -((( 5208 -(% class="post-likes btn btn-default disabled badge" title="Number of likes on this page: 1" %) 5209 -((( 5210 -[[(% class="like-number" %)1>>path:/Nieuws/Nieuwsbrief%20december%202023||class="thumbnail"]] 5211 -))) 5212 -))) 5213 - 5214 -(% class="col-xs-4 com_det" %) 5215 -((( 5216 -(% class="text-right" %) 5217 -[[(0)>>path:/Nieuws/Nieuwsbrief%20december%202023||class="thumbnail"]] 5218 -))) 5219 -))) 5220 -))) 5221 -))) 5222 -))) 5223 - 5224 -(% class="macro" data-macro="startmacro:blogPostLayoutCards|-|reference=~"Nieuws.Nieuwsbrief november 2023~" params=~"displayTitle=true|useSummary=true|list-limit=10|list-layout=cards|list-blog=Nieuws.WebHome|list-paginated=no|list-results-count=10|postIndex=0|previousPostReference=|postIndex=1|previousPostReference=Nieuws.Nieuwsbrief januari 2024|postIndex=2|previousPostReference=Nieuws.Audit BMI en BORG|postIndex=3|previousPostReference=Nieuws.Nieuwsbrief december 2023~"" %) 5225 -((( 5226 -(% class="macro-placeholder hidden" %) 5227 -((( 5228 -macro:blogPostLayoutCards 5229 -))) 5230 - 5231 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogCode~"" %) 5232 -((( 5233 -(% class="macro-placeholder hidden" %) 5234 -((( 5235 -macro:include 5236 -))) 5237 - 5238 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogParameters~"" %) 5239 -((( 5240 -(% class="macro-placeholder hidden" %) 5241 -((( 5242 -macro:include 5243 -))) 5244 - 5245 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## Blog 5246 -#set($blogClassname = 'Blog.BlogClass') 5247 -#set($blogTemplate = 'Blog.BlogTemplate') 5248 -#set($blogSheet = 'Blog.BlogSheet') 5249 -## Blog entries 5250 -#set($blogPostClassname = 'Blog.BlogPostClass') 5251 -#set($blogPostTemplate = 'Blog.BlogPostTemplate') 5252 -#set($blogPostSheet = 'Blog.BlogPostSheet') 5253 -#set($blogPostObjectNumber = $xwiki.getDocument($blogPostTemplate).getObject($blogPostClassname).number) 5254 -#set($oldArticleClassname = 'XWiki.ArticleClass') 5255 -## Categories 5256 -#set($blogCategoryClassname = 'Blog.CategoryClass') 5257 -#set($blogCategoryTemplate = 'Blog.CategoryTemplate') 5258 -#set($blogCategorySheet = 'Blog.CategorySheet') 5259 -#set($blogCategoriesSheet = 'Blog.CategoriesSheet') 5260 -#set($oldBlogCategoryClassname = 'Blog.Categories') 5261 -#set($defaultCategoryParent = 'Blog.Categories') 5262 -## Style 5263 -#set($blogStyleDocumentName = 'Blog.BlogStyle') 5264 -#set($blogStyleDocument = $xwiki.getDocument($blogStyleDocumentName)) 5265 -## Clientside scripts 5266 -#set($blogScriptsDocumentName = 'Blog.BlogScripts') 5267 -#set($blogPublisher = $xwiki.getDocument('Blog.Publisher')) 5268 -## Misc 5269 -#set($thisURL = $doc.getURL($xcontext.action, $request.queryString)) 5270 -#set($isBlogPost = $doc.getObject($blogPostClassname)) 5271 -#set($defaultBlogSpace = 'Blog') 5272 -#set($isCategoryPage = $doc.getObject($blogCategoryClassname)) 5273 -#set($isCategoriesHomePage = $doc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 5274 -## 5275 -## 5276 -## 5277 -#** 5278 - * Displays an image, taken from the blog style document. 5279 - * 5280 - * @param $imgName The name of the icon from icons set to use. 5281 - *# 5282 -#macro(toolImage $imgName)(% class=~"icon-manage~"~%)$services.icon.render($imgName)(%~%)#end" %) 5283 -((( 5284 -(% class="macro-placeholder hidden" %) 5285 -((( 5286 -macro:velocity 5287 -))) 5288 -))) 5289 -))) 5290 - 5291 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## 5292 -## 5293 -## 5294 -## Import the blog skin and javascripts. 5295 -$!xwiki.ssx.use($blogStyleDocumentName)## 5296 -$!xwiki.jsx.use($blogScriptsDocumentName)## 5297 -## 5298 -## import the hierarchy for the path the blog post footer (in displayEntryBlogLocation) 5299 -#template('hierarchy_macros.vm')## 5300 -## 5301 -## 5302 -#** 5303 - * Prints a blog. This is the main macro used in the BlogSheet. 5304 - * 5305 - * @param blogDoc the XDocument holding the blog definition object. 5306 - *### 5307 -#macro(printBlog $blogDoc) 5308 - \{\{include reference='Blog.CreatePost'/}} 5309 - 5310 - ## Use the blogPostList macro to display the blogposts 5311 - ## The blogPostList is used only in case of 'all' or 'paged' blog display type because the blogPostList macro 5312 - ## do not support FTM the monthly and weekly blog display types 5313 - #getBlogDisplayType($blogDoc $displayType) 5314 - #if ($displayType == 'weekly' || $displayType == 'monthly') 5315 - #getBlogEntries($blogDoc $entries) 5316 - #displayBlog($entries 'index' true true) 5317 - #displayNavigationLinks($blogDoc) 5318 - #else 5319 - #getBlogDisplayType($blogDoc $displayType) 5320 - #set ($paginated = 'no') 5321 - #if ($displayType == 'paginated') 5322 - #set ($paginated = 'yes') 5323 - #end 5324 - #getBlogPostsLayout($blogDoc $postsLayout) 5325 - (% class=~"hfeed index~" ~%)(((\{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$paginated~" layout=~"$!postsLayout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" /}}))) 5326 - #end 5327 -#end 5328 -## 5329 -## 5330 -## 5331 -#** 5332 - * Shows blog information. In view mode, the description is printed. In edit mode, allows changing blog settings: title, 5333 - * description, blog type (global or in-space), index display type (fixed size pagination, weekly index, monthly index, 5334 - * all entries). 5335 - * 5336 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 5337 - *### 5338 -#macro(showBlogInfo $blogDoc) 5339 - #if($blogDoc.getObject($blogClassname)) 5340 - ## Keep testing for inline action for backward compatibility with older blogs. 5341 - #if($xcontext.action == 'edit' || $xcontext.action == 'inline') 5342 - #macro(displayProperty $blogDoc $propname) 5343 - ; #displayPropName($xwiki.getClass($blogClassname).get($propname)): 5344 - : $blogDoc.display($propname) 5345 - #end 5346 - #displayProperty($blogDoc 'title') 5347 - #displayProperty($blogDoc 'description') 5348 - #displayProperty($blogDoc 'displayType') 5349 - #displayProperty($blogDoc 'itemsPerPage') 5350 - #displayProperty($blogDoc 'postsLayout') 5351 - #displayProperty($blogDoc 'postsLayoutParameters') 5352 - #else 5353 - $blogDoc.display('description') 5354 - #end 5355 - #elseif($doc.fullName == $blogSheet) 5356 -= $services.localization.render('blog.code.blogsheet') = 5357 - \{\{translation key='blog.code.sheetexplanation'/}} 5358 - #else 5359 - \{\{warning}}\{\{translation key='blog.code.notblog'/}}\{\{/warning}} 5360 - #end 5361 -#end 5362 -## 5363 -## 5364 -## 5365 -#** 5366 - * Retrieve the blog document, which usually is either <tt><Space>.WebHome</tt> for whole-spaces blogs, or 5367 - * <tt><Space>.Blog</tt> for in-space blogs. If none of these documents contains a blog object, then the first 5368 - * (alphabetically) document in the target space that contains one is returned. Finally, if no document in the current 5369 - * space contains a blog object, then <tt>Blog.WebHome</tt> is returned as the default blog. 5370 - * 5371 - * @param space A <tt>String</tt>, the name of the space where to search. 5372 - * @param blogDoc The resulting XDocument. 5373 - *### 5374 -#macro(getBlogDocument $space $blogDoc) 5375 - #set ($result = $NULL) 5376 - ## Check if the current space has a WebPreferences page that contains a Blog.EnablePanelsConfigurationClass object. 5377 - ## It is possible to display a blog's panels info in a page that is not inside a blog and in that case we need to 5378 - ## identify the right blog based on a configuration object in a WebPreferences page. 5379 - #set ($spaceReference = $services.model.resolveSpace($space)) 5380 - #set ($preferencesDocRef = $services.model.createDocumentReference('WebPreferences', $spaceReference)) 5381 - #set ($preferencesDoc = $xwiki.getDocument($preferencesDocRef)) 5382 - #set ($preferencesObj = $preferencesDoc.getObject('Blog.EnablePanelsConfigurationClass')) 5383 - #if ($preferencesObj) 5384 - #set ($result = $xwiki.getDocument( $preferencesObj.getValue('blog'))) 5385 - #end 5386 - ## If no special case occurs (like the previous one), identify a blog by checking the current location from its hierarchy. 5387 - #if (~"$!result~" == '') 5388 - ## First, try the Space.WebHome, for a whole-space blog 5389 - #set($result = $xwiki.getDocument(~"$\{space}.WebHome~")) 5390 - #if(!$result.getObject($blogClassname)) 5391 - ## Second, try the Space.Blog document 5392 - #set($result = $xwiki.getDocument(~"$\{space}.Blog~")) 5393 - #if(!$result.getObject($blogClassname)) 5394 - ## Third, try searching for a blog document in the current space 5395 - ## Prevent the query fail when the space contains dots '.' 5396 - #set($blogDocs = $services.query.hql(~", BaseObject obj where doc.space = :space and obj.name = doc.fullName and obj.className = '$blogClassname' order by doc.name~").setLimit(1).setOffset(0).bindValue('space', $space).execute()) 5397 - #if($blogDocs.size() > 0) 5398 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 5399 - #else 5400 - ## Fourth, try searching for a blog document that have the its 'postsLocation' set to the current space 5401 - #set($blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as postsLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=postsLocationProp.id.id and postsLocationProp.id.name='postsLocation' and postsLocationProp.value=:postsLocation order by doc.name~").setLimit(1).setOffset(0).bindValue('postsLocation', $space).execute()) 5402 - #if($blogDocs.size() > 0) 5403 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 5404 - #else 5405 - ## Last, fallback to Blog.WebHome, the default blog 5406 - #set($result = $xwiki.getDocument('Blog.WebHome')) 5407 - #end 5408 - #end 5409 - #end 5410 - #end 5411 - #end 5412 - #set ($blogDoc = $NULL) 5413 - #setVariable (~"$blogDoc~" $result) 5414 -#end 5415 -## 5416 -## 5417 -## 5418 -#** 5419 - * Retrieve the blog title. 5420 - * 5421 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass<tt> object with the <tt>title</tt> property set. 5422 - * @param title The resulting title. 5423 - *### 5424 -#macro(getBlogTitle $blogDoc $title) 5425 - ## Titles can contain velocity code (most commonly translations), so we should evaluate them. 5426 - #set ($title = $NULL) 5427 - #setVariable (~"$title~" $!blogDoc.displayTitle) 5428 -#end 5429 -## 5430 -## 5431 -## 5432 -#** 5433 - * Retrieve the blog description. 5434 - * 5435 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>description</tt> 5436 - * property set. 5437 - * @param description The resulting description. 5438 - *### 5439 -#macro(getBlogDescription $blogDoc $description) 5440 - #getBlogProperty($blogDoc 'description' '' $result) 5441 - #set ($description = $NULL) 5442 - #setVariable (~"$description~" $result) 5443 -#end 5444 -## 5445 -## 5446 -## 5447 -#** 5448 - * Retrieves a list of entries to be displayed. The entries are either part of the blog's space, or have the blog 5449 - * document set as a parent. The number and range of entries returned (from all those belonging to this blog) depends on 5450 - * the blog display type: paginated (fixed number of entries), weekly (all entries in a week), monthly (all entries in a 5451 - * month), or all. 5452 - * 5453 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 5454 - * @param entries The resulting list of entries to display, a list of XDocument names. 5455 - *### 5456 -#macro(getBlogEntries $blogDoc $entries) 5457 - #if (!$entries) 5458 - #setVariable (~"$entries~" []) 5459 - #end 5460 - #getAllBlogPostsQuery($query) 5461 - #isDefaultBlog($blogDoc $isDefault) 5462 - #set($queryParams = \{}) 5463 - #if ($isDefault) 5464 - #getCategoryAllBlogPostsQuery($query) 5465 - #set($query = ~"$\{query} and (doc.creator = :creator or (isPublished.value = 1 and hidden.value = 0)) and (doc.space = :space or catList like :catList escape '!')~") 5466 - #set($discard = $queryParams.put('creator', $xcontext.user)) 5467 - #set($discard = $queryParams.put('space', $blogDoc.space)) 5468 - #set($sanitizedBlogSpace = $blogDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 5469 - #set($discard = $queryParams.put('catList', $sanitizedBlogSpace)) 5470 - #else 5471 - #set($query = ~"$\{query} and (doc.space = :space or doc.parent = :parent)~") 5472 - #getBlogPostsLocation($blogDoc.space $blogPostsLocation) 5473 - #set($discard = $queryParams.put('space', $blogPostsLocation)) 5474 - #set($discard = $queryParams.put('parent', $blogDoc.space)) 5475 - #end 5476 - #getBlogDisplayType($blogDoc $displayType) 5477 - #if($displayType == 'weekly') 5478 - #getWeeklyBlogEntries($blogDoc $query $entries $queryParams) 5479 - #elseif($displayType == 'monthly') 5480 - #getMonthlyBlogEntries($blogDoc $query $entries $queryParams) 5481 - #elseif($displayType == 'all') 5482 - #getAllBlogEntries($blogDoc $query $entries $queryParams) 5483 - #else 5484 - #getPagedBlogEntries($blogDoc $query $entries $queryParams) 5485 - #end 5486 -#end 5487 -## 5488 -## 5489 -## 5490 -#** 5491 - * Retrieves a list of entries to be displayed. The entries are taken from a ~"page~" of the blog, a sequence of documents 5492 - * defined by the request parameters <tt>ipp</tt> (items per page) and <tt>page</tt> (the current page). Initially the 5493 - * first page is displayed, with the number of entries defined in the blog object in the <tt>itemsPerPage</tt> property 5494 - * (10 if not defined). 5495 - * 5496 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 5497 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 5498 - * refined to restrict to a given space, or to a given search criteria, etc. 5499 - * @param entries The resulting list of entries to display, a list of XDocument names. 5500 - * @param queryParams The parameters to bind with the query. 5501 - *### 5502 -#macro(getPagedBlogEntries $blogDoc $query $entries $queryParams) 5503 - #if (!$entries) 5504 - #setVariable (~"$entries~" []) 5505 - #end 5506 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 5507 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~")) 5508 - #bindQueryParameters($countQueryObj $queryParams) 5509 - #bindQueryParameters($queryObj $queryParams) 5510 - #set($totalEntries = $countQueryObj.count()) 5511 - #getBlogProperty($blogDoc 'itemsPerPage' '10' $defaultItemsPerPage) 5512 - #set($defaultItemsPerPage = $numbertool.toNumber($defaultItemsPerPage).intValue()) 5513 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 5514 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 5515 - #set($discard = $entries.addAll($queryObj.setLimit($itemsPerPage).setOffset($startAt).addFilter(~"unique~").execute())) 5516 -#end 5517 -## 5518 -## 5519 -## 5520 -#** 5521 - * Retrieves a list of entries to be displayed. The entries are taken from a week of the blog. The target week is 5522 - * defined by the request parameters <tt>week</tt> (the week number in the year, from 1 to 52) and <tt>year</tt> (4 5523 - * digit year). Initially the current week is displayed. 5524 - * 5525 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 5526 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 5527 - * refined to restrict to a given space, or to a given search criteria, etc. 5528 - * @param entries The resulting list of entries to display, a list of XDocument names. 5529 - * @param queryParams The parameters to bind with the query. 5530 - *### 5531 -#macro(getWeeklyBlogEntries $blogDoc $query $entries $queryParams) 5532 - #if (!$entries) 5533 - #setVariable (~"$entries~" []) 5534 - #end 5535 - #getRequestedWeek($weekDate) 5536 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 5537 - #set($minDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundFloor())) 5538 - #set($maxDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundCeiling())) 5539 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 5540 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 5541 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 5542 - #bindQueryParameters($countQueryObj $queryParams) 5543 - #bindQueryParameters($queryObj $queryParams) 5544 - #set($totalEntries = $countQueryObj.count()) 5545 - #set($discard = $entries.addAll($queryObj.execute())) 5546 -#end 5547 -## 5548 -## 5549 -## 5550 -#** 5551 - * Retrieves a list of entries to be displayed. The entries are taken from a month of the blog. The target month is 5552 - * defined by the request parameters <tt>month</tt> (the month number, from 1 to 12) and <tt>year</tt> (4 5553 - * digit year). Initially the current month is displayed. 5554 - * 5555 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 5556 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 5557 - * refined to restrict to a given space, or to a given search criteria, etc. 5558 - * @param entries The resulting list of entries to display, a list of XDocument names. 5559 - * @param queryParams The parameters to bind with the query. 5560 - *### 5561 -#macro(getMonthlyBlogEntries $blogDoc $query $entries) 5562 - #if (!$entries) 5563 - #setVariable (~"$entries~" []) 5564 - #end 5565 - #getRequestedMonth($monthDate) 5566 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 5567 - #set($minDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundFloor())) 5568 - #set($maxDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundCeiling())) 5569 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 5570 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 5571 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 5572 - #bindQueryParameters($countQueryObj $queryParams) 5573 - #bindQueryParameters($queryObj $queryParams) 5574 - #set($totalEntries = $countQueryObj.count()) 5575 - #set($discard = $entries.addAll($queryObj.execute())) 5576 -#end 5577 -## 5578 -## 5579 -## 5580 -#** 5581 - * Retrieves a list of entries to be displayed. All entries belonging to the current blog are returned. 5582 - * 5583 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 5584 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 5585 - * refined to restrict to a given space, or to a given search criteria, etc. 5586 - * @param entries The resulting list of entries to display, a list of XDocument names. 5587 - * @param queryParams The parameters to bind with the query. 5588 - *### 5589 -#macro(getAllBlogEntries $blogDoc $query $entries $queryParams) 5590 - #if (!$entries) 5591 - #setVariable (~"$entries~" []) 5592 - #end 5593 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 5594 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 5595 - #bindQueryParameters($countQueryObj $queryParams) 5596 - #bindQueryParameters($queryObj $queryParams) 5597 - #set($totalEntries = $countQueryObj.count()) 5598 - #set($discard = $entries.addAll($queryObj.execute())) 5599 -#end 5600 -## 5601 -## 5602 -## 5603 -#** 5604 - * Retrieves a list of entries to be displayed. Only (and all) unpublished entries are returned. 5605 - * 5606 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 5607 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 5608 - * refined to restrict to a given space, or to a given search criteria, etc. 5609 - * @param queryParams The parameters to bind with the query. 5610 - * @param entries The resulting list of entries to display, a list of XDocument names. 5611 - *### 5612 -#macro(getUnpublishedBlogEntries $blogDoc $query $queryParams $entries) 5613 - #if (!$entries) 5614 - #setVariable (~"$entries~" []) 5615 - #end 5616 - #set($query = ~"$\{query} and isPublished.value = 0~") 5617 - #set ($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 5618 - #set ($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 5619 - #bindQueryParameters($countQueryObj $queryParams) 5620 - #bindQueryParameters($queryObj $queryParams) 5621 - #set($totalEntries = $countQueryObj.count()) 5622 - #set($discard = $entries.addAll($queryObj.execute())) 5623 -#end 5624 -## 5625 -## 5626 -## 5627 -#** 5628 - * Retrieves a list of entries to be displayed. The entries are taken from all the wiki, and not from a specific blog. 5629 - * 5630 - * @param entries The resulting list of entries to display, a list of XDocument names. 5631 - *### 5632 -#macro(getGlobalBlogEntries $entries) 5633 - #if (!$entries) 5634 - #setVariable (~"$entries~" []) 5635 - #end 5636 - #getAllBlogPostsQuery($query) 5637 - #set($totalEntries = $services.query.hql($query).count()) 5638 - #set($defaultItemsPerPage = 20) 5639 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 5640 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 5641 - #set($discard = $entries.addAll($services.query.hql(~"$\{query} order by publishDate.value desc~").setLimit($itemsPerPage).setOffset($startAt).execute())) 5642 -#end 5643 -#** 5644 - * Return the base query for selecting blog entries. It filters only visible entries, but does not bind to a specific 5645 - * blog, nor specify a range or an ordering criteria. 5646 - * 5647 - * This macro is a duplicate of #getAllBlogPostsQuery($query). Keep it in case it's used outside, in custom code. 5648 - * 5649 - * @param query The basic query for selecting blog entries. 5650 - *# 5651 -#macro(getBlogEntriesBaseQuery $query) 5652 - #getAllBlogPostsQuery($query) 5653 -#end 5654 -#** 5655 - * Return the Query for selecting the all wiki blog posts without filtering 5656 - * 5657 - * @param query The basic query for selecting blog entries. 5658 - *# 5659 -#macro(getAllBlogPostsQuery $query) 5660 - #set ($query = $NULL) 5661 - #setVariable(~"$query~" ~", BaseObject as obj, IntegerProperty isPublished, 5662 - IntegerProperty hidden, DateProperty publishDate 5663 - where doc.fullName <> '$blogPostTemplate' and 5664 - obj.name=doc.fullName and obj.className='$blogPostClassname' and 5665 - isPublished.id.id = obj.id and isPublished.id.name = 'published' and 5666 - hidden.id.id = obj.id and hidden.id.name='hidden' and 5667 - publishDate.id.id = obj.id and publishDate.id.name='publishDate' and 5668 - (doc.creator = '$escapetool.sql($xcontext.user)' or (isPublished.value = 1 and hidden.value = 0))~") 5669 -#end 5670 -## 5671 -## 5672 -## 5673 -###** 5674 - * Return the Query for selecting the all wiki blog posts with categories filtering 5675 - * 5676 - * @param query The basic query for selecting blog entries. 5677 - *### 5678 -#macro(getCategoryAllBlogPostsQuery $query) 5679 - #set ($query = $NULL) 5680 - #getAllBlogPostsQuery($baseQuery) 5681 - #set ($baseQuery = $baseQuery.replace('DateProperty publishDate', 'DateProperty publishDate, DBStringListProperty as category left join category.list catList')) 5682 - #setVariable(~"$query~" ~"$\{baseQuery} and obj.id=category.id.id and category.id.name='category'~") 5683 -#end 5684 -## 5685 -## 5686 -## 5687 -#** 5688 - * Determines how is the blog index split into pages: paginated (fixed number of entries), weekly (all entries in a 5689 - * week), monthly (all entries in a month), or all. 5690 - * 5691 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>displayType</tt> 5692 - * property set. 5693 - * @param displayType The resulting string. If the blog object does not define anything, it is considered paginated. 5694 - *### 5695 -#macro(getBlogDisplayType $blogDoc $displayType) 5696 - #getBlogProperty($blogDoc 'displayType' 'paginated' $result) 5697 - #set ($displayType = $NULL) 5698 - #setVariable (~"$displayType~" $result) 5699 -#end 5700 -## 5701 -## 5702 -## 5703 -#** 5704 - * Displays a list of entries. 5705 - * 5706 - * @param entries The entries to display, a list of XDocument names. 5707 - * @param displaying What exactly is displayed: blog index, a single blog entry, a blog category, search results, 5708 - * unpublished entries, etc. This will be used as the classname(s) for the container div (hfeed). Currently 5709 - * used values: index, single, category, search, unpublished, hidden. 5710 - * @param onlyExtract If <tt>true</tt>, only display the extract of articles where available, otherwise display the full content. 5711 - * @param shouldDisplayTitles If <tt>true</tt>, display the blog title (blog posts shouldn't display the title when they're 5712 - * displayed alone on their page since it's the page title which is used in this case) 5713 - *### 5714 -#macro(displayBlog $entries $displaying $onlyExtract $shouldDisplayTitles) 5715 - #set($blogDay = '') 5716 - (% class=~"hfeed $!\{displaying}~" ~%)((( 5717 - (% class=~"blogDay~" ~%)((( 5718 - #foreach ($entryDoc in $xwiki.wrapDocs($entries)) 5719 - #getEntryObject($entryDoc $entryObj) 5720 - ## Although all entries should have one of the two objects, better check to be sure. 5721 - #if(~"$!\{entryObj}~" != '') 5722 - #getEntryDate($entryDoc $entryObj $entryDate) 5723 - ## Display a ~"calendar sheet~" for each day. All entries posted on the same day share one such sheet. 5724 - #set($entryDateStr = $xwiki.formatDate($entryDate, 'yyyyMMMMdd')) 5725 - #if($blogDay != $entryDateStr) 5726 - #if($blogDay != '') 5727 - ))) 5728 - (% class=~"blogDay~" ~%)((( 5729 - #end 5730 - #displayBlogDate($entryDate) 5731 - #set ($blogDay = $entryDateStr) 5732 - #end 5733 - ## Finally, display the entry. 5734 - #displayEntry($entryDoc $entryObj $onlyExtract $shouldDisplayTitles true) 5735 - #end 5736 - #end 5737 - )))## blogDay 5738 - )))## hfeed 5739 -#end 5740 -## 5741 -## 5742 -## 5743 -#** 5744 - * Get the entry object, either a new BlogPost or an old Article. 5745 - * 5746 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 5747 - * @param entryObj The resulting xobject of the blog post. 5748 - *### 5749 -#macro(getEntryObject $entryDoc $__entryObj) 5750 - #set($result = $entryDoc.getObject(~"$\{blogPostClassname}~")) 5751 - #if(!$result) 5752 - #set($result = $entryDoc.getObject(~"$\{oldArticleClassname}~")) 5753 - #end 5754 - ## NOTE: The reason we put an underscore in front of the variable name is to prevent the following line from 5755 - ## overwriting the $entryObj variable that may be defined before this macro is called. Of course, $__entryObj may be 5756 - ## overwritten in this case but it's less likely to have such a variable defined before. 5757 - #set ($__entryObj = $NULL) 5758 - #setVariable (~"$__entryObj~" $result) 5759 -#end 5760 -## 5761 -## 5762 -## 5763 -#** 5764 - * Gets the date associated with a blog entry. This is the publication date. For unpublished entries, initially this is 5765 - * the document creation date, but can be edited by the user. 5766 - * 5767 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 5768 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 5769 - * @param result The resulting date, an instance of <tt>java.util.Date</tt>. 5770 - *### 5771 -#macro(getEntryDate $entryDoc $entryObj $result) 5772 - #set ($result = $NULL) 5773 - #setVariable (~"$result~" $entryObj.getProperty('publishDate').value) 5774 -#end 5775 -## 5776 -## 5777 -## 5778 -#** 5779 - * Displays a date, nicely formatted as a calendar page. 5780 - * 5781 - * @param date The date to display, an instance of <tt>java.util.Date</tt>. 5782 - *### 5783 -#macro(displayBlogDate $date) 5784 - #set($year = $xwiki.formatDate($date, 'yyyy')) 5785 - ## 3 letter month name, like Jan, Dec. 5786 - #set($month = $xwiki.formatDate($date, 'MMM')) 5787 - ## Uncomment to get a full length month name, like January, December. 5788 - ## TODO: this could be defined somewhere in the blog style. 5789 - ## #set($month = $xwiki.formatDate($date, 'MMMM')) 5790 - #set($day = $xwiki.formatDate($date, 'dd')) 5791 - (% class=~"blogdate~" ~%) 5792 - == (% class=~"month~" ~%)$month(%~%) (% class=~"day~" ~%)$day(%~%) (% class=~"year~" ~%)$year(%~%) == 5793 -#end 5794 -## 5795 -## 5796 -## 5797 -#** 5798 - * Displays a blog article: management tools, header, content, footer. 5799 - * 5800 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 5801 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 5802 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 5803 - * @param shouldDisplayTitle If <tt>true</tt>, display the blog title (blog posts shouldn't display the title 5804 - * when they're displayed alone on their page since it's the page title which is used in this case) 5805 - * @param shouldDisplayActions If <tt>true</tt>, display the blog post actions buttons 5806 - *### 5807 -#macro(displayEntry $entryDoc $entryObj $onlyExtract $shouldDisplayTitle $shouldDisplayActions) 5808 - ## Only articles with an explicit hidden setting or an explicit unpublished setting are hidden 5809 - #isPublished($entryObj $isPublished) 5810 - #isHidden($entryObj $isHidden) 5811 - #if($doc.fullName == $entryDoc.fullName) 5812 - (% class=~"hentry single-article~" ~%)((( 5813 - #else 5814 - (% class=~"hentry#if(!$isPublished) unpublished-article#elseif($isHidden) hidden-article#end~" ~%)((( 5815 - #end 5816 - #if ($shouldDisplayActions) 5817 - #displayEntryTools($entryDoc $entryObj) 5818 - #end 5819 - #if($shouldDisplayTitle) 5820 - #displayEntryTitle($entryDoc $entryObj) 5821 - #end 5822 - #if($doc.fullName == $entryDoc.fullName) 5823 - #if(!$isPublished) 5824 - \{\{warning}}\{\{translation key='blog.code.published'/}}\{\{/warning}} 5825 - #elseif($isHidden) 5826 - \{\{warning}}\{\{translation key='blog.code.hidden'/}}\{\{/warning}} 5827 - #end 5828 - #end 5829 - #displayEntryContent($entryDoc $entryObj $onlyExtract) 5830 - #displayEntryFooter($entryDoc $entryObj) 5831 - )))## hentry 5832 -#end 5833 -## 5834 -## 5835 -## 5836 -#** 5837 - * Checks if the provided blog is published or not. 5838 - * 5839 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 5840 - * @param isPublished The resulting boolean, true if the entry is considered published. 5841 - *### 5842 -#macro(isPublished $entryObj $isPublished) 5843 - #set ($isPublished = $NULL) 5844 - ## This should work for both old articles, which don't have the 'published' property at all, and 5845 - ## are considered published by default, and new entries, that should have 1 if published. 5846 - #if (~"$!\{entryObj.getProperty('published').value}~" != '0') 5847 - #setVariable (~"$isPublished~" true) 5848 - #else 5849 - #setVariable (~"$isPublished~" false) 5850 - #end 5851 -#end 5852 -## 5853 -## 5854 -## 5855 -#** 5856 - * Checks if the provided blog is hidden or not. 5857 - * 5858 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass<tt> xclass. 5859 - * @param isHiddel The resulting boolean, true if the entry is considered hidden. 5860 - *### 5861 -#macro(isHidden $entryObj $isHidden) 5862 - #set ($isHidden = $NULL) 5863 - ## This should work for both old articles, which don't have the 'hidden' property at all, and 5864 - ## are considered visible by default, and new entries, that should have 1 if hidden. 5865 - #if (~"$!\{entryObj.getProperty('hidden').value}~" == '1') 5866 - #setVariable (~"$isHidden~" true) 5867 - #else 5868 - #setVariable (~"$isHidden~" false) 5869 - #end 5870 -#end 5871 -## 5872 -## 5873 -## 5874 -#** 5875 - * Displays several ~"tools~" for manipulating blog posts: hide/show, publish, edit. 5876 - * 5877 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 5878 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 5879 - *### 5880 -#macro(displayEntryTools $entryDoc $entryObj) 5881 - #if($xcontext.action == 'view') 5882 - (% class=~"blog-entry-toolbox~" ~%)((( 5883 - #displayPublishButton($entryDoc $entryObj) 5884 - #displayHideShowButton($entryDoc $entryObj) 5885 - #displayEditButton($entryDoc $entryObj) 5886 - #displayDeleteButton($entryDoc $entryObj) 5887 - ))) 5888 - #end 5889 -#end 5890 -## 5891 -## 5892 -## 5893 -#** 5894 - * Displays the publish button to the entry <strong>creator</strong>, if the article is not published yet. 5895 - * 5896 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 5897 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 5898 - * @todo AJAX calls. 5899 - *### 5900 -#macro(displayPublishButton $entryDoc $entryObj) 5901 - #isPublished($entryObj $isPublished) 5902 - #if(!$isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 5903 - [[#toolImage('world')>>path:$blogPublisher.getURL('view', ~"entryName=$\{escapetool.url($entryDoc.fullName)}&xredirect=$\{escapetool.url($thisURL)}&form_token=$!\{services.csrf.getToken()}~")||title=~"$services.localization.render('blog.code.notpublished')~"]]## 5904 - #end 5905 -#end 5906 -## 5907 -## 5908 -## 5909 -#** 5910 - * Displays the hide or show button to the entry <strong>creator</strong>, if the article is already published. 5911 - * 5912 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 5913 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 5914 - *### 5915 -#macro(displayHideShowButton $entryDoc $entryObj) 5916 - #isPublished($entryObj $isPublished) 5917 - #isHidden($entryObj $isHidden) 5918 - ## Only published articles can be hidden. Unpublished articles are considered already hidden. 5919 - #if($isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 5920 - #set ($queryString = \{ 5921 - 'xredirect' : $thisURL, 5922 - 'form_token' : $services.csrf.getToken() 5923 - }) 5924 - #if ($isHidden) 5925 - #set ($discard = $queryString.putAll(\{ 5926 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 0, 5927 - 'comment' : $services.localization.render('blog.code.madevisible') 5928 - })) 5929 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 5930 - [[#toolImage('unlock')>>path:$lockURL||class=~"blog-tool-show~" title=~"$services.localization.render('blog.code.makevisible')~"]]## 5931 - #else 5932 - #set ($discard = $queryString.putAll(\{ 5933 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 1, 5934 - 'comment' : $services.localization.render('blog.code.hid') 5935 - })) 5936 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 5937 - [[#toolImage('lock')>>path:$lockURL||class=~"blog-tool-hide~" title=~"$services.localization.render('blog.code.hide')~"]]## 5938 - #end 5939 - #end 5940 -#end 5941 -## 5942 -## 5943 -## 5944 -#** 5945 - * Displays the edit button to those that can edit the article. 5946 - * 5947 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 5948 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 5949 - *### 5950 -#macro(displayEditButton $entryDoc $entryObj) 5951 - #if($xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 5952 - ## Call getDefaultEditMode() for backward compatibility with older blog posts. 5953 - [[#toolImage('pencil')>>path:$entryDoc.getURL('edit')||title=~"$services.localization.render('blog.code.editpost')~"]]## 5954 - #end 5955 -#end 5956 -## 5957 -## 5958 -## 5959 -#** 5960 - * Displays the delete button to those that can edit the article. 5961 - * 5962 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 5963 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 5964 - * @todo AJAX calls. 5965 - *### 5966 -#macro(displayDeleteButton $entryDoc $entryObj) 5967 - #if($xwiki.hasAccessLevel('delete', $xcontext.user, $entryDoc.fullName)) 5968 - [[#toolImage('cross')>>path:$entryDoc.getURL('delete')||title=~"$services.localization.render('blog.code.deletepost')~"]]## 5969 - #end 5970 -#end 5971 -## 5972 -## 5973 -## 5974 -#** 5975 - * Displays the title of the entry. 5976 - * 5977 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 5978 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 5979 - *### 5980 -#macro(displayEntryTitle $entryDoc $entryObj) 5981 - #if($doc.fullName == $entryDoc.fullName) 5982 - (% class=~"entry-title~" ~%) 5983 - = $services.rendering.escape($entryDoc.display('title', 'view', $entryObj), $xwiki.getCurrentContentSyntaxId()) = 5984 - #else 5985 - (% class=~"entry-title~" ~%) 5986 - === [[$services.rendering.escape($entryDoc.display('title', 'view', $entryObj),$xwiki.getCurrentContentSyntaxId())>>doc:$services.rendering.escape($services.model.serialize($entryDoc.getDocumentReference(),'default'),$xwiki.getCurrentContentSyntaxId())]] === 5987 - #end 5988 -#end 5989 -## 5990 -## 5991 -## 5992 -#** 5993 - * Displays the body of the entry. 5994 - * 5995 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 5996 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 5997 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 5998 - *### 5999 -#macro(displayEntryContent $entryDoc $entryObj $onlyExtract) 6000 - (% class=~"#if($onlyExtract)entry-summary#\{else}entry-content#end~" ~%)((( 6001 - #getEntryContent($entryDoc $entryObj $onlyExtract $entryContent) 6002 - ## FIXME: This causes the blog's content to not be annotatable. See http://jira.xwiki.org/browse/XWIKI-6328 6003 - ## Should probably be replaced by a display macro call with a reference to the object property holding the post's content 6004 - \{\{html wiki=~"false~"}}$entryDoc.getRenderedContent($entryContent, $entryDoc.syntax.toIdString())\{\{/html}} 6005 - ))) ## entry-content 6006 - (% class=~"clearfloats~" ~%)((())) 6007 -#end 6008 -## 6009 -## 6010 -## 6011 -#** 6012 - * Extracts the body of the entry that should be displayed. If <tt>onlyExtract</tt> is <tt>true</tt>, display the content 6013 - * of the <tt>extract</tt> field (if not empty). 6014 - * 6015 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 6016 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 6017 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 6018 - * @param entryContent The resulting content. 6019 - * @param removeEllipsis If <tt>true</tt>, then don't display an ellipsis at the end of the content (only used when 6020 - * <tt>onlyExtract</tt> is <tt>true</tt>) 6021 - *### 6022 -#macro(getEntryContent $entryDoc $entryObj $onlyExtract $entryContent $removeEllipsis) 6023 - #if ($onlyExtract) 6024 - ## Note: We trim the summary so that if there's some white space it won't cause the summary to be used instead 6025 - ## of the content. 6026 - #set ($macro.result = $entryObj.getProperty('extract').value.trim()) 6027 - #end 6028 - #if(~"$!macro.result~" == '') 6029 - #set($macro.result = $entryObj.getProperty('content').value) 6030 -#* Disabled until the content can be cleanly cut. 6031 -* #if($onlyExtract && $result.length()>$maxchars) 6032 -* #set($i = $macro.result.lastIndexOf(~" ~", $maxchars)) 6033 -* #set($i = $i + 1) 6034 -* #set($macro.result = ~"$\{macro.result.substring(0,$i)} *[...>$\{entryDoc.fullName}]*~") 6035 -* #end 6036 -## *### 6037 - #elseif (!$removeEllipsis) 6038 - #if($entryDoc.syntax.toIdString() == 'xwiki/1.0') 6039 - #set($macro.result = ~"$\{macro.result} <a href='$\{entryDoc.getExternalURL()}' title='$services.localization.render('blog.code.readpost')'>...</a>~") 6040 - #elseif($entryDoc.syntax.toIdString() == 'xwiki/2.0' || $entryDoc.syntax.toIdString() == 'xwiki/2.1') 6041 - #set($macro.result = ~"$\{macro.result} [[...>>$\{services.rendering.escape($entryDoc.getFullName(), $entryDoc.getSyntax())}||title='$services.localization.render('blog.code.readpost')']]~") 6042 - #end 6043 - #end 6044 - #set ($entryContent = $NULL) 6045 - #setVariable (~"$entryContent~" $macro.result) 6046 -#end 6047 -## 6048 -## 6049 -## 6050 -#** 6051 - * Displays the footer of the entry. 6052 - * 6053 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 6054 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 6055 - *### 6056 -#macro(displayEntryFooter $entryDoc $entryObj) 6057 - (% class=~"entry-footer~" ~%)((( 6058 - #isPublished($entryObj $isPublished) 6059 - (% class='entry-author-label' ~%) 6060 - #if($isPublished) 6061 - \{\{translation key='blog.code.postedby'/}} ## 6062 - #else 6063 - \{\{translation key='blog.code.createdby'/}} ## 6064 - #end 6065 - \{\{html wiki=~"false~" clean=~"false~"}}<span class='author vcard'>#userfn($entryDoc.creator)</span>\{\{/html}} ## 6066 - #getEntryDate($entryDoc $entryObj $entryDate) 6067 - #listCategories($entryObj) #* 6068 - ## Since the publish date and update date are not set at the exact same time, there could be a small difference that 6069 - ## we assume cannot be more than 3 seconds. 6070 - *#(% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.permalink'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||rel=~"bookmark~"]] ## 6071 - #if ($showcomments) 6072 - (% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.comments'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||anchor=~"Comments~"]] (% class=~"itemCount~" ~%)($entryDoc.comments.size())(%~%) ## 6073 - #end ## 6074 - #if($entryDoc != $doc) ## 6075 - #displayEntryBlogLocation($entryDoc $entryObj) ## 6076 - #end 6077 - )))## entry-footer 6078 -#end 6079 -## 6080 -## 6081 -#** 6082 - * Display the blog for the entry (if it is not the currently displayed blog) 6083 - * 6084 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 6085 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 6086 - *### 6087 -#macro(displayEntryBlogLocation $entryDoc $entryObj) 6088 - #getBlogPostsLocation($entryDoc.getSpace() $blogPostsLocation) ## 6089 - #if(~"$!blogPostsLocation~" != ~"~") ## 6090 - #set($blogSpaceRef = $services.model.resolveSpace($blogPostsLocation)) ## 6091 - #set($blogDocRef = $services.model.createDocumentReference($services.model.getEntityReference('DOCUMENT', 'default').getName(), $blogSpaceRef)) ## 6092 - #if($doc.documentReference != $blogDocRef) ## 6093 - #set($blogDoc = $xwiki.getDocument($blogDocRef)) ## 6094 - #set($blogObj = $blogDoc.getObject('Blog.BlogClass')) ## 6095 - #if($blogObj) (% class=~"blogrefpath~" ~%)((( ## 6096 - $services.localization.render('blog.code.postedin') \{\{html clean=~"false~" wiki=~"false~"}} #hierarchy($blogDocRef, \{'selfIsActive' : true, 'local': true}) \{\{/html}} ## 6097 - )))(%~%)## 6098 - #end 6099 - #end 6100 - #end 6101 -#end 6102 -## 6103 -## 6104 -## 6105 -## 6106 -#** 6107 - * List the categories an entry belongs to. Used in the footer. The categories are instances of <tt>Blog.CategoryClass</tt>. 6108 - * 6109 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 6110 - *### 6111 -#macro(listCategories $entryObj) 6112 - #if($entryObj.getxWikiClass().getName() == $blogPostClassname) 6113 - #set($categories = $entryObj.getProperty('category').value) 6114 - #set($first = true) 6115 - #if($categories.size() > 0) 6116 - #foreach($category in $categories) 6117 - #set($categoryDoc = $!xwiki.getDocument($category)) 6118 - #if(!$categoryDoc.isNew() && $categoryDoc.getObject($\{blogCategoryClassname})) 6119 - #if($foreach.count == 1) 6120 - (% class='separator' ~%)·(%~%) $services.localization.render('blog.code.categories') ## 6121 - #else 6122 - , ## 6123 - #end## 6124 - [[$!\{categoryDoc.getObject($blogCategoryClassname).getValue('name')}>>$\{category}||rel='tag']]## 6125 - #end## 6126 - #end## 6127 - #end 6128 - #end 6129 -#end 6130 -## 6131 -## 6132 -## 6133 -#** 6134 - * Displays blog pagination links (older and newer entries). 6135 - * 6136 - * @param blogDoc the XDocument holding the blog definition object. 6137 - *### 6138 -#macro(displayNavigationLinks $blogDoc) 6139 - (% class=~"clearfloats~" ~%)((())) 6140 - #getBlogDisplayType($blogDoc $displayType) 6141 - #if($displayType == 'weekly') 6142 - (% class=~"pagingLinks~" ~%)((( 6143 - #getRequestedWeek($weekDate) 6144 - $weekDate.addWeeks(-1)## 6145 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousweek'/}}>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 6146 - #sep() 6147 - $weekDate.addWeeks(2)## 2 because we already subtracted 1 above 6148 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextweek'/}} »>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 6149 - ))) 6150 - #elseif($displayType == 'monthly') 6151 - (% class=~"pagingLinks~" ~%)((( 6152 - #getRequestedMonth($monthDate) 6153 - $monthDate.addMonths(-1)## 6154 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousmonth'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 6155 - #sep() 6156 - $monthDate.addMonths(2)## 2 because we already subtracted 1 above 6157 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextmonth'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 6158 - ))) 6159 - #elseif($displayType == 'all') 6160 - #else 6161 - ## Paginated 6162 - #if(($totalPages > 1)) 6163 - #set($queryString = '') 6164 - #foreach($p in $request.getParameterNames()) 6165 - #if($p != 'page' && $p != 'ipp') 6166 - #foreach($v in $request.getParameterValues($p)) 6167 - #set($queryString = ~"$\{queryString}&$\{escapetool.url($p)}=$\{escapetool.url($v)}~") 6168 - #end 6169 - #end 6170 - #end 6171 - (% class=~"pagingLinks~" ~%)((( 6172 - #if ($currentPageNumber < $totalPages) 6173 - #set($currentPageNumber = $currentPageNumber + 1) 6174 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.olderposts'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 6175 - #set($currentPageNumber = $currentPageNumber - 1) 6176 - #end 6177 - #if ($currentPageNumber > 1) 6178 - #if ($currentPageNumber < $totalPages) 6179 - #sep() 6180 - #end 6181 - #set($currentPageNumber = $currentPageNumber - 1) 6182 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.newerposts'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 6183 - #set($currentPageNumber = $currentPageNumber + 1) 6184 - #end 6185 - (% class=~"clear~" ~%)(%~%) 6186 - )))## pagingLinks 6187 - #end 6188 - #end 6189 -#end 6190 -## 6191 -## 6192 -## 6193 -#** 6194 - * Displays a message box with ~"publish~" icon. 6195 - * 6196 - * @param message A text message concerning blog article publishing 6197 - *### 6198 -#macro(publishMessageBox $message) 6199 -(% class=~"plainmessage publish-message~" ~%)((($services.icon.render('world') $message))) 6200 -#end 6201 -#** 6202 - * Displays a message box with ~"show/hide~" icon. 6203 - * 6204 - * @param message A text message concerning blog article hiding 6205 - *### 6206 -#macro(hideMessageBox $message) 6207 -(% class=~"plainmessage hide-message~" ~%)((($services.icon.render('unlock') $message))) 6208 -#end 6209 -## 6210 -## 6211 -## 6212 -#** 6213 - * Determine the requested week, for using in a weekly-indexed blog. The relevant request parameters are 6214 - * <tt>year</tt> and <tt>week</tt>. By default, the current week is used. 6215 - * 6216 - * @param monthDate The resulting week, a JODATime MutableDateTime. 6217 - *### 6218 -#macro(getRequestedWeek $weekDate) 6219 - #set ($weekDate = $NULL) 6220 - #setVariable (~"$weekDate~" $xwiki.jodatime.mutableDateTime) 6221 - #if(~"$!\{request.year}~" != '') 6222 - #set ($discard = $weekDate.setYear($numbertool.toNumber($request.year).intValue())) 6223 - #end 6224 - #if(~"$!\{request.week}~" != '') 6225 - #set ($discard = $weekDate.setWeekOfWeekyear($numbertool.toNumber($request.week).intValue())) 6226 - #end 6227 -#end 6228 -## 6229 -## 6230 -## 6231 -#** 6232 - * Determine the requested month, for using in a monthly-indexed blog. The relevant request parameters are 6233 - * <tt>year</tt> and <tt>month</tt>. By default, the current month is used. 6234 - * 6235 - * @param monthDate The resulting month, a JODATime MutableDateTime. 6236 - *### 6237 -#macro(getRequestedMonth $monthDate) 6238 - #set ($monthDate = $NULL) 6239 - #setVariable (~"$monthDate~" $xwiki.jodatime.mutableDateTime) 6240 - #if(~"$!\{request.year}~" != '') 6241 - #set ($discard = $monthDate.setYear($numbertool.toNumber($request.year).intValue())) 6242 - #end 6243 - #if(~"$!\{request.month}~" != '') 6244 - #set ($discard = $monthDate.setMonthOfYear($numbertool.toNumber($request.month).intValue())) 6245 - #end 6246 -#end 6247 -## 6248 -## 6249 -## 6250 -#** 6251 - * Retrieve a blog property (title, display type, etc). 6252 - * 6253 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 6254 - * @param propertyName The name of the property to be retrieved. One of the <tt>Blog.BlogClass</tt>'s properties. 6255 - * @param defaultValue The default value to use in case the blog object does not define one. 6256 - * @param propertyValue The resulting value. 6257 - *### 6258 -#macro(getBlogProperty $blogDoc $propertyName $defaultValue $propertyValue) 6259 - #set($result = ~"$!\{blogDoc.getObject($\{blogClassname}).getProperty($propertyName).value}~") 6260 - #if($result == '') 6261 - #set($result = $defaultValue) 6262 - #end 6263 - #set ($propertyValue = $NULL) 6264 - #setVariable (~"$propertyValue~" $result) 6265 -#end 6266 - 6267 -#** 6268 - * If an error occurs when executing an action, set a specific response status and display an error message. 6269 - * 6270 - * @param status The response status. 6271 - * @param text The user readable error to be displayed. Can be a translation key. 6272 - * @param parameters The parameters to use when decoding the translation key. 6273 - *### 6274 -#macro(blog__actionResponseError $status $text $parameters) 6275 - $response.setStatus($status) 6276 - #if($request.ajax) 6277 - $services.localization.render($text, $!parameters) 6278 - #else 6279 - \{\{error}}$services.localization.render($text, $!parameters)\{\{/error}} 6280 - #end 6281 -#end 6282 -## 6283 -## 6284 -## 6285 -#** 6286 - * Check if a blog is the Default blog (The one in the 'Blog' space). 6287 - * 6288 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 6289 - * @param isDefault The resulting boolean. 6290 - *### 6291 -#macro(isDefaultBlog $blogDoc $isDefault) 6292 - #set ($result = false) 6293 - #if ($blogDoc.space == 'Blog') 6294 - #set ($result = true) 6295 - #end 6296 - #setVariable(~"$isDefault~" $result) 6297 -#end 6298 -## 6299 -## 6300 -## 6301 -#** 6302 - * Retrieve the blog posts location (space). 6303 - * 6304 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 6305 - * @param postsLocation The resulting location. 6306 - *### 6307 -#macro(getBlogPostsLocation $blogSpace $postsLocation) 6308 - #getBlogDocument($blogSpace $blogDoc) 6309 - #getBlogProperty($blogDoc 'postsLocation' $blogDoc.space $result) 6310 - #set ($postsLocation = $NULL) 6311 - #setVariable (~"$postsLocation~" $result) 6312 -#end 6313 -## 6314 -## 6315 -## 6316 -#** 6317 - * Retrieve the blog categories location (space). 6318 - * 6319 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 6320 - * @param categoriesLocation The resulting location. 6321 - *### 6322 -#macro(getBlogCategoriesLocation $blogSpace $categoriesLocation) 6323 - #getBlogDocument($blogSpace $blogDoc) 6324 - #getBlogProperty($blogDoc 'categoriesLocation' 'Blog' $result) 6325 - #set ($postsLocation = $NULL) 6326 - #setVariable (~"$categoriesLocation~" $result) 6327 -#end 6328 -###** 6329 - * Return the Query for selecting the blog posts based on the context where the posts are displayed. 6330 - * for example there is 4 different panel contexts: 6331 - * aBlog.aPost or aBlog.WebHome 6332 - * aCategorySpace.aCategory 6333 - * aCategorySpace.WebHome 6334 - * Blog.aPost or Blog.WebHome 6335 - * 6336 - * @param query The query for selecting blog entries. 6337 - * @param queryParams The parameters to bind with the generated query. 6338 - * @param targetDoc The document in which the articles will be displayed. 6339 - *### 6340 -#macro(getAllBlogPostsQueryBasedOnDisplayContext $targetDoc $query $queryParams) 6341 - #set ($query = $NULL) 6342 - #set ($queryParams = $NULL) 6343 - #getCategoryAllBlogPostsQuery($resultQuery) 6344 - #set ($resultQueryParams = \{}) 6345 - #set($sanitizedSpace = $targetDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 6346 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 6347 - ## Get all posts that are in the default blog space('Blog') or in category 'Blog.%' 6348 - #set ($discard = $resultQueryParams.put('space', $targetDoc.space)) 6349 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 6350 - #set($resultQuery = ~"$\{resultQuery} and (doc.space = :space or catList like :catList escape '!')~") 6351 - #elseif($targetDoc.getObject($blogCategoryClassname)) 6352 - ## Get all posts that are in a category aCategorySpace.aCategory 6353 - #set ($discard = $resultQueryParams.put('catList', $targetDoc.fullName)) 6354 - #set($resultQuery = ~"$\{resultQuery} and (catList=:catList)~") 6355 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 6356 - ## Get all posts that are in a category aCategorySpace.% 6357 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 6358 - ## Exclude incategorized posts 6359 - #set ($excludedCategory = ~"$\{targetDoc.space}.WebHome~") 6360 - #if ($targetDoc.space == $defaultBlogSpace) 6361 - #set ($excludedCategory = ~"Blog.Categories.WebHome~") 6362 - #end 6363 - #set ($discard = $resultQueryParams.put('excludedCategory', $excludedCategory)) 6364 - #set($resultQuery = ~"$\{resultQuery} and (catList<>:excludedCategory) and (catList like :catList escape '!')~") 6365 - #else 6366 - ## Get all posts in blog space aBlog 6367 - #getAllBlogPostsQuery($resultQuery) 6368 - #getBlogPostsLocation($targetDoc.space $postsLocation) 6369 - #set ($discard = $resultQueryParams.put('space', $postsLocation)) 6370 - #set($resultQuery = ~"$\{resultQuery} and doc.space = :space~") 6371 - #end 6372 - #setVariable(~"$query~" $resultQuery) 6373 - #setVariable(~"$queryParams~" $resultQueryParams) 6374 -#end 6375 -## 6376 -## 6377 -## 6378 -###** 6379 - * Display blog posts based on the context where the posts are displayed. 6380 - * for example there is 4 different panel contexts: 6381 - * aBlog.aPost or aBlog.WebHome 6382 - * aCategorySpace.aCategory 6383 - * aCategorySpace.WebHome 6384 - * Blog.aPost or Blog.WebHome 6385 - * 6386 - * @param targetDoc The document in which the articles will be displayed. 6387 - * @param postsVisiblity The visibility of the posts to display: recent, unpublished, ... 6388 - * @param layout Layout of the the posts to display 6389 - * @param layoutParams additional layout parameters, it is a string like 'param1=val1|...|paramN=valueN' 6390 - * @param limit the number of posts to display 6391 - *### 6392 -#macro(displayBlogPostsBasedOnContext $targetDoc $postsVisiblity $layout $layoutParams $limit) 6393 - #if ($postLayout == 'full') 6394 - #set ($macro.paginated = 'yes') 6395 - #end 6396 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 6397 - ## Display all posts that are in the default blog space('Blog') or in category 'Blog.%' 6398 - #getBlogPostsLayout($xwiki.getDocument(~"$\{defaultBlogSpace}.WebHome~") $postsLayout) 6399 - #if (~"$!layout~" == '') 6400 - #set ($layout = $postsLayout) 6401 - #end 6402 - #if ($postsVisiblity == 'recent') 6403 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 6404 - #elseif($postsVisiblity == 'unpublished') 6405 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 6406 - #end 6407 - #elseif($targetDoc.getObject($blogCategoryClassname)) 6408 - ## Display all posts that are in a category aCategorySpace.aCategory 6409 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 6410 - #getBlogPostsLayout($blogDoc $postsLayout) 6411 - #if (~"$!layout~" == '') 6412 - #set ($layout = $postsLayout) 6413 - #end 6414 - #if ($postsVisiblity == 'recent') 6415 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 6416 - #elseif($postsVisiblity == 'unpublished') 6417 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 6418 - #end 6419 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 6420 - ## Display all posts that are in a category aCategorySpace.% 6421 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 6422 - #getBlogPostsLayout($blogDoc $postsLayout) 6423 - #if (~"$!layout~" == '') 6424 - #set ($layout = $postsLayout) 6425 - #end 6426 - #if ($postsVisiblity == 'recent') 6427 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 6428 - #elseif($postsVisiblity == 'unpublished') 6429 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 6430 - #end 6431 - #else 6432 - ## Display all posts in blog space aBlog 6433 - #getBlogDocument($targetDoc.space $blogDoc) 6434 - #getBlogPostsLayout($blogDoc $postsLayout) 6435 - #if (~"$!layout~" == '') 6436 - #set ($layout = $postsLayout) 6437 - #end 6438 - #if ($postsVisiblity == 'recent') 6439 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 6440 - #elseif($postsVisiblity == 'unpublished') 6441 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 6442 - #end 6443 - #end 6444 -#end 6445 -## 6446 -## 6447 -## 6448 -#** 6449 - * Bind parameters to a query object. 6450 - * 6451 - * @param queryObj The query object (org.xwiki.query.internal.ScriptQuery object) 6452 - * @param queryParams the query parameters. 6453 - *### 6454 -#macro(bindQueryParameters $queryObj $queryParams) 6455 - #set ($output = $queryObj) 6456 - #foreach( $key in $queryParams.keySet() ) 6457 - #set($output = $queryObj.bindValue($key, $queryParams.get($key))) 6458 - #end 6459 - #setVariable(~"$queryObj~" $output) 6460 -#end 6461 -## 6462 -## 6463 -## 6464 -#** 6465 - * Determines the blogposts layout: Default layout (Calendar), Image thumbnail 6466 - * 6467 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>postsLayout</tt> 6468 - * property set. 6469 - * @param postsLayout The resulting string. If the blog object does not define anything, it is considered full (default). 6470 - *### 6471 -#macro(getBlogPostsLayout $blogDoc $postsLayout) 6472 - #getBlogProperty($blogDoc 'postsLayout' 'full' $res) 6473 - #set ($postsLayout = $NULL) 6474 - #setVariable (~"$postsLayout~" $res) 6475 -#end 6476 -## 6477 -## 6478 -## 6479 -#** 6480 - * Retrieve the blog document of a categories space, which is the blog descriptor that have its categoriesLocation property set to the categories space 6481 - * 6482 - * @param categoriesSpace A <tt>String</tt>, the name of the space. 6483 - * @param blogDoc The resulting XDocument. 6484 - *### 6485 -#macro(getBlogDocumentForCategoriesSpace $categoriesSpace $blogDoc) 6486 - #set($macro.blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as categoriesLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=categoriesLocationProp.id.id and categoriesLocationProp.id.name='categoriesLocation' and categoriesLocationProp.value=:categoriesLocation order by doc.creationDate~").setLimit(1).setOffset(0).bindValue('categoriesLocation', $categoriesSpace).execute()) 6487 - #if($macro.blogDocs.size() > 0 && $categoriesSpace != $defaultBlogSpace) 6488 - #set($macro.result = $xwiki.getDocument($macro.blogDocs.get(0))) 6489 - #else 6490 - ## Fallback to Blog.WebHome, the default blog 6491 - #set($macro.result = $xwiki.getDocument('Blog.WebHome')) 6492 - #end 6493 - #set ($blogDoc = $NULL) 6494 - #setVariable (~"$blogDoc~" $macro.result) 6495 -#end" %) 6496 -((( 6497 -(% class="macro-placeholder hidden" %) 6498 -((( 6499 -macro:velocity 6500 -))) 6501 -))) 6502 -))) 6503 - 6504 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogPostLayoutMacros~"" %) 6505 -((( 6506 -(% class="macro-placeholder hidden" %) 6507 -((( 6508 -macro:include 6509 -))) 6510 - 6511 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|#** 6512 - * Extract the layout parameters from a string. 6513 - * 6514 - * @param layoutParamsString The string representation of the layout parameters. 6515 - * It should contain a String following this format ~"paramName1=Value1|paramName2=Value2|...|paramNameK=ValueK~" 6516 - * @param layoutsParameters The resulting layout parameters Map. 6517 - *### 6518 -#macro(extractLayoutParametersFromString $layoutParamsString $layoutsParameters) 6519 - #set ($layoutsParameters = $NULL) 6520 - #set ($macro.layoutParams = \{}) 6521 - #if (~"$!layoutParamsString~" != '') 6522 - #set ($macro.paramsArr = $layoutParamsString.split('\\|')) 6523 - #foreach ($item in $macro.paramsArr) 6524 - #set ($itemSplit = $item.split('=')) 6525 - #if ($itemSplit.size() == 2) 6526 - #set ($discard = $macro.layoutParams.put($itemSplit[0].trim(), $itemSplit[1].trim())) 6527 - #end 6528 - #end 6529 - #end 6530 - #setVariable(~"$layoutsParameters~" $macro.layoutParams) 6531 -#end" %) 6532 -((( 6533 -(% class="macro-placeholder hidden" %) 6534 -((( 6535 -macro:velocity 6536 -))) 6537 -))) 6538 -))) 6539 - 6540 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-| #macro(displaySmallPost $pDoc $pObj) 6541 - #initLayoutVars($pDoc $pObj) 6542 - <div class=~"col-xs-12 col-sm-6 next_blog~"> 6543 - <a href=~"$pDoc.uRL~" class=~"thumbnail~"> 6544 - <div class=~"row~"> 6545 - <div class=~"col-xs-4~"> 6546 - #if ($imageAtt) 6547 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 6548 - #end 6549 - </div> 6550 - <div class=~"col-xs-8 art_det~"> 6551 - <p class=~"text-left~"> 6552 - #if($displayTitle)$!postTitle #end 6553 - <br/><span class=~"date_info~"> $!dateStr </span> 6554 - </p> 6555 - #displayPostDetails($pDoc) 6556 - </div> 6557 - </div> 6558 - </a> 6559 - </div> 6560 - #end 6561 - ## 6562 - ## 6563 - ## 6564 - #macro(displayPinnedPost $pDoc $pObj) 6565 - #initLayoutVars($pDoc $pObj) 6566 - <div class=~"col-xs-12 col-sm-4 col-md-4 blog_pin~"> 6567 - <a href=~"$pDoc.uRL~" class=~"all-post-link~"> 6568 - <div class=~"thumbnail~"> 6569 - #if ($displayTitle && $displayTitleFirstOnPinnedPosts) 6570 - <h5 class=~"title-top~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 6571 - #end 6572 - #if ($imageAtt) 6573 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 6574 - #end 6575 - <div class=~"caption~"> 6576 - #if ($displayTitle && !$displayTitleFirstOnPinnedPosts) 6577 - <h5 class=~"text-left~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 6578 - #end 6579 - #if ($displaySummaryOnPinnedPosts) 6580 - <div class=~"text-left post-summary~"> 6581 - #set ($postContent = $pObj.getProperty('extract').value) 6582 - $!pDoc.getRenderedContent($postContent, $pDoc.syntax.toIdString()) 6583 - </div> 6584 - #end 6585 - #displayPostDetails($pDoc) 6586 - </div> 6587 - </div> 6588 - </a> 6589 - </div> 6590 - #end 6591 - ## 6592 - ## 6593 - ## 6594 - #macro(formatPostDate $pDoc $pObj) 6595 - #set ($formattedDate = $NULL) 6596 - #set($dateStr = $datetool.format('medium', $postDate, $xcontext.locale)) 6597 - #if (~"$!dateStr~" != '') 6598 - #set ($dateArr = $dateStr.split(' ')) 6599 - #if ($dateArr.size() > 3) 6600 - #set ($dateStr = ~"~") 6601 - #foreach($s in $dateArr.subList(0, 3)) 6602 - #set ($dateStr = ~"$\{dateStr}$\{s} ~") 6603 - #end 6604 - #end 6605 - #end 6606 - #setVariable(~"$formattedDate~" $dateStr) 6607 - #end 6608 - ## 6609 - ## 6610 - ## 6611 - #macro(displayPostDetails $pDoc) 6612 - <div class=~"row post-details~"> 6613 - <div class=~"col-xs-8 detail~"> 6614 - #if ($services.like.displayButton($pDoc.documentReference)) 6615 - #set ($optLikeRecord = $services.like.getLikes($pDoc.documentReference)) 6616 - ## Retrieve the likes number in XWiki 12.9+ 6617 - #set ($likeNumber = $optLikeRecord.get()) 6618 - #if (!$stringtool.isNumeric($likeNumber.toString())) 6619 - ## Retrieve the likes number in XWiki versions greater than 12.7 and lower than 12.9. 6620 - #set ($likeNumber = $optLikeRecord.get().likeNumber) 6621 - #end 6622 - #if ($stringtool.isNumeric($likeNumber.toString())) 6623 - <div class=~"post-likes btn btn-default disabled badge~" 6624 - title=~"$escapetool.xml($services.localization.render('like.button.title', [$likeNumber]))~"> 6625 - $services.icon.renderHTML('heart') <span class=~"like-number~">$likeNumber</span> 6626 - </div> 6627 - #end 6628 - #elseif ($services.ratings) 6629 - #set ($ratingsConfigDoc = $services.ratings.getConfigurationDocument($pDoc.documentReference)) 6630 - #if ($ratingsConfigDoc.getValue('displayRatings') == 1) 6631 - <ul class=~"pull-left note list-inline~"> 6632 - #foreach ($x in [1..5]) 6633 - #set ($cls = ~"~") 6634 - #if ($x > $averageVote) 6635 - #set ($cls = ~"-o~") 6636 - #end 6637 - <li><span class=~"fa fa-star$\{cls}~"></span></li> 6638 - #end 6639 - </ul> 6640 - #end 6641 - #end 6642 - </div> 6643 - #if ($showPostComments) 6644 - <div class=~"col-xs-4 com_det~"> 6645 - <p class=~"text-right~">$services.icon.renderHTML('comments') ($!nbComments)</p> 6646 - </div> 6647 - #end 6648 - </div> 6649 - #end 6650 - ## 6651 - ## 6652 - ## 6653 - #macro(initLayoutVars $pDoc $pObj) 6654 - #set ($postTitle = $pDoc.display('title', 'view', $pObj)) 6655 - #set ($imageAtt = $pDoc.getAttachment($pObj.getValue('image'))) 6656 - #isPublished($pObj $isPublished) 6657 - #isHidden($pObj $isHidden) 6658 - #getEntryDate($pDoc $pObj $postDate) 6659 - #formatPostDate($postDate $dateStr) 6660 - #set ($averageVote = $mathtool.round($services.ratings.getAverageRating($pDoc.documentReference).getAverageVote())) 6661 - #set ($nbComments = $pDoc.getComments().size()) 6662 - #set ($showPostComments = true) 6663 - #if ($xwiki.getSpacePreferenceFor('showcomments', $pDoc.documentReference.lastSpaceReference, '1') == '0') 6664 - #set ($showPostComments = false) 6665 - #end 6666 - #end 6667 - ## 6668 - ## 6669 - ## 6670 - #macro(displayEditPinnedPostsButton) 6671 - #if (~"$!macroAdditionalParams.get('postIndex')~" == '0' && $services.security.authorization.hasAccess('edit', $pinnedPostsSourceDoc.fullName)) 6672 - #set ($discard = $xwiki.ssx.use('Blog.PinnedPostsSheet')) 6673 - #set ($discard = $xwiki.jsx.use('Blog.PinnedPostsSheet')) 6674 - #set ($editPinnedPostsURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'get', 'sheet=Blog.PinnedPostsSheet')) 6675 - #set ($newPinnedPostsObjectURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'objectadd', ~"classname=Blog.PinnedPostsClass&form_token=$!\{services.csrf.getToken()}~")) 6676 - <div class=~"edit-pinned-posts-container~"> 6677 - <div class=~"col-xs-12 col-sm-12 col-md-12 text-right edit-pinned-posts~"> 6678 - <a href=~"javascript:;~" class=~"editPinnedPosts~"> 6679 - <span class=~"glyphicon glyphicon-edit~" aria-hidden=~"true~"></span> $services.localization.render('blog.post.layout.cards.pinnedposts.edit') 6680 - </a> 6681 - <input type=~"hidden~" id=~"editPinnedPostsURL~" value=~"$escapetool.xml($editPinnedPostsURL)~"/> 6682 - <input type=~"hidden~" id=~"newPinnedPostsObjectURL~" value=~"$escapetool.xml($newPinnedPostsObjectURL)~"/> 6683 - </div> 6684 - </div> 6685 - #if (~"$!pinnedPostsObj~" == '') 6686 - <input type=~"hidden~" name=~"createPinnedPostsObject~" value=~"1~"/> 6687 - #end 6688 - #end 6689 - #end" %) 6690 -((( 6691 -(% class="macro-placeholder hidden" %) 6692 -((( 6693 -macro:velocity 6694 -))) 6695 -))) 6696 - 6697 -(% class="macro" data-macro="startmacro:velocity|-||-| #if ($services.security.authorization.hasAccess('view', $xcontext.macro.params.reference)) 6698 - #set ($postDoc = $xwiki.getDocument($xcontext.macro.params.reference)) 6699 - #getEntryObject($postDoc $postObj) 6700 - #if (~"$!postObj~" != '') 6701 - #extractLayoutParametersFromString($xcontext.macro.params.params $macroAdditionalParams) 6702 - ## 6703 - #set ($displayTitle = true) 6704 - #if (~"$!macroAdditionalParams.get('displayTitle')~" == 'false') 6705 - #set ($displayTitle = false) 6706 - #end 6707 - ## 6708 - #set ($displayTitleFirstOnPinnedPosts = false) 6709 - #if (~"$!macroAdditionalParams.get('displayTitleFirstOnPinnedPosts')~" == 'true') 6710 - #set ($displayTitleFirstOnPinnedPosts = true) 6711 - #end 6712 - ## 6713 - #set ($displaySummaryOnPinnedPosts = true) 6714 - #if (~"$!macroAdditionalParams.get('displaySummaryOnPinnedPosts')~" == 'false') 6715 - #set ($displaySummaryOnPinnedPosts = false) 6716 - #end 6717 - ## 6718 - #set ($postIndex = $numbertool.toNumber($macroAdditionalParams.get('postIndex')).intValue()) 6719 - #if ($postIndex == 0) 6720 - #set ($stopBlogPostsDisplay = false) 6721 - #end 6722 - #set ($listResultsCount = $numbertool.toNumber($macroAdditionalParams.get('list-results-count')).intValue()) 6723 - #set($discard = $xwiki.ssx.use('Blog.BlogPostLayoutCards')) 6724 - #set($scaleWidth = 600) 6725 - #set($imgQs=~"width=$scaleWidth~") 6726 - ## Display pinned posts 6727 - ## Get the list of pinned posts 6728 - #set ($pinnedPosts = []) 6729 - #set ($pinnedPostsSourceDoc = $NULL) 6730 - #if (~"$!macroAdditionalParams.get('forceDisplayPinnedPosts')~" == 'true' && ~"$!macroAdditionalParams.get('list-blog')~" != '') 6731 - #set ($pinnedPostsSourceDoc = $xwiki.getDocument($macroAdditionalParams.get('list-blog'))) 6732 - ## Note that the 'list-blog' parameter contains the value of the 'blog' parameter of the blogpostlist macro passed to the current layout macro 6733 - #end 6734 - #if (~"$!pinnedPostsSourceDoc~" != '') 6735 - #set ($pinnedPostsObj = $pinnedPostsSourceDoc.getObject('Blog.PinnedPostsClass')) 6736 - #if (~"$!pinnedPostsObj~" != '') 6737 - #set ($orderedPinnedPostsJSON = $pinnedPostsObj.getProperty('orderedPosts').value) 6738 - #if (~"$!orderedPinnedPostsJSON~" != '') 6739 - #set ($pinnedPosts = $jsontool.parse($orderedPinnedPostsJSON)) 6740 - #else 6741 - #set ($pinnedPosts = $pinnedPostsObj.getProperty('posts').value) 6742 - #end 6743 - #end 6744 - #if ($postIndex == 0 && $pinnedPosts.size() > 0) 6745 - \{\{html clean=~"false~"}} 6746 - #set ($x = 0) 6747 - #set ($showPinnedPostsButton = true) 6748 - #foreach ($pinnedPost in $pinnedPosts) 6749 - #if ($x == 0) 6750 - <div class=~"row flex-container~"> 6751 - #if ($showPinnedPostsButton) 6752 - #displayEditPinnedPostsButton() 6753 - #set($showPinnedPostsButton = false) 6754 - #end 6755 - #end 6756 - #set ($pinnedPostDoc = $xwiki.getDocument($pinnedPost)) 6757 - #getEntryObject($pinnedPostDoc $pinnedPostObj) 6758 - #if (~"$!pinnedPostObj~" != '') 6759 - #displayPinnedPost($pinnedPostDoc $pinnedPostObj) 6760 - #end 6761 - #set ($x = $mathtool.add($x, 1)) 6762 - #if ($x == 3) 6763 - #set ($x = 0) 6764 - </div> 6765 - #end 6766 - #end 6767 - #if ($mathtool.mod($x, 3) != 0) 6768 - </div> 6769 - #end 6770 - \{\{/html}} 6771 - 6772 - ## If the first post is a pinned post : this means that all the posts are pinned 6773 - ## In this case, avoid displaying the posts again after the pinned posts section. 6774 - #if ($pinnedPosts.contains($xcontext.macro.params.reference)) 6775 - #set ($stopBlogPostsDisplay = true) 6776 - #end 6777 - #elseif($postIndex == 0 && $pinnedPosts.size() == 0) 6778 - 6779 - \{\{html}} 6780 - <div class=~"row no-pinnded-posts~"> 6781 - #displayEditPinnedPostsButton() 6782 - </div> 6783 - \{\{/html}} 6784 - 6785 - #end 6786 - #end 6787 - #if (!$stopBlogPostsDisplay) 6788 - \{\{html clean=~"false~"}} 6789 - #if (~"$!nbDisplayedPosts~" == '' || $postIndex == 0) 6790 - #set ($nbDisplayedPosts = 0) 6791 - #end 6792 - #if($mathtool.mod($nbDisplayedPosts, 2) == 0) 6793 - #if ($nbDisplayedPosts != 0) 6794 - </div> 6795 - #set ($lastHtmlTag = 'c') 6796 - #end 6797 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 6798 - <div class=~"row~"> 6799 - #set ($lastHtmlTag = 'o') 6800 - #set ($lastRowClass = ~"~") 6801 - #else 6802 - <div class=~"row flex-container~"> 6803 - #set ($lastHtmlTag = 'o') 6804 - #set ($lastRowClass = ~"flex~") 6805 - #end 6806 - #end 6807 - #displaySmallPost($postDoc $postObj) 6808 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 6809 - </div> 6810 - #set ($lastHtmlTag = 'c') 6811 - #end 6812 - #set ($nbDisplayedPosts = $mathtool.add($nbDisplayedPosts, 1)) 6813 - #if ($postIndex == $mathtool.sub($listResultsCount, 1)) 6814 - #if (~"$!lastHtmlTag~" == 'o') 6815 - #if ($mathtool.mod($nbDisplayedPosts, 2) == 1 && $lastRowClass == ~"flex~") 6816 - <div class=~"col-xs-12 col-sm-6~"></div> 6817 - #end 6818 - </div> 6819 - #end 6820 - #end 6821 - \{\{/html}} 6822 - #end 6823 - #else 6824 - \{\{error}}$services.localization.render('blog.blogpostlayout.notpost', [$xcontext.macro.params.reference])\{\{/error}} 6825 - #end 6826 - #else 6827 - \{\{error}}$services.localization.render('blog.blogpostlayout.post_view_not_allowed', [$xcontext.macro.params.reference])\{\{/error}} 6828 - #end" %) 6829 -((( 6830 -(% class="macro-placeholder hidden" %) 6831 -((( 6832 -macro:velocity 6833 -))) 6834 - 6835 -(% class="macro" data-macro="startmacro:html|-|clean=~"false~"|-|<div class=~"col-xs-12 col-sm-6 next_blog~"> 6836 -<a href=~"/Nieuws/Nieuwsbrief%20november%202023~" class=~"thumbnail~"> 6837 -<div class=~"row~"> 6838 -<div class=~"col-xs-4~"> 6839 -<img src=~"/download/Nieuws/Nieuwsbrief%20november%202023/man-person-light-bokeh-blur-road-1268120-pxhere.com.jpg?width=600&rev=1.1~" /> 6840 -</div> 6841 -<div class=~"col-xs-8 art_det~"> 6842 -<p class=~"text-left~"> 6843 -Nieuwsbrief november 2023 <br/><span class=~"date_info~"> Dec 18, 2023, </span> 6844 -</p> 6845 -<div class=~"row post-details~"> 6846 -<div class=~"col-xs-8 detail~"> 6847 -<div class=~"post-likes btn btn-default disabled badge~" 6848 -title=~"Number of likes on this page: 0~"> 6849 -<span class=~"fa fa-heart~"></span> <span class=~"like-number~">0</span> 6850 -</div> 6851 -</div> 6852 -<div class=~"col-xs-4 com_det~"> 6853 -<p class=~"text-right~"><span class=~"fa fa-comments~"></span> (0)</p> 6854 -</div> 6855 -</div> 6856 -</div> 6857 -</div> 6858 -</a> 6859 -</div>" %) 6860 -((( 6861 -(% class="macro-placeholder hidden" %) 6862 -((( 6863 -macro:html 6864 -))) 6865 - 6866 -(% class="col-xs-12 col-sm-6 next_blog" %) 6867 -((( 6868 -(% class="row" %) 6869 -((( 6870 -(% class="col-xs-4" %) 6871 -((( 6872 -[[~[~[image:/download/Nieuws/Nieuwsbrief%20november%202023/man-person-light-bokeh-blur-road-1268120-pxhere.com.jpg?width=600&rev=1.1~]~]>>path:/Nieuws/Nieuwsbrief%20november%202023||class="thumbnail"]] 6873 -))) 6874 - 6875 -(% class="col-xs-8 art_det" %) 6876 -((( 6877 -(% class="text-left" %) 6878 -[[Nieuwsbrief november 2023 6879 -(% class="date_info" %) Dec 18, 2023,>>path:/Nieuws/Nieuwsbrief%20november%202023||class="thumbnail"]] 6880 - 6881 -(% class="row post-details" %) 6882 -((( 6883 -(% class="col-xs-8 detail" %) 6884 -((( 6885 -(% class="post-likes btn btn-default disabled badge" title="Number of likes on this page: 0" %) 6886 -((( 6887 -[[(% class="like-number" %)0>>path:/Nieuws/Nieuwsbrief%20november%202023||class="thumbnail"]] 6888 -))) 6889 -))) 6890 - 6891 -(% class="col-xs-4 com_det" %) 6892 -((( 6893 -(% class="text-right" %) 6894 -[[(0)>>path:/Nieuws/Nieuwsbrief%20november%202023||class="thumbnail"]] 6895 -))) 6896 -))) 6897 -))) 6898 -))) 6899 -))) 6900 -))) 6901 -))) 6902 -))) 6903 - 6904 -(% class="macro" data-macro="startmacro:blogPostLayoutCards|-|reference=~"Nieuws.Feestelijke afsluiting, keuring materieel en tellen voorraden~" params=~"displayTitle=true|useSummary=true|list-limit=10|list-layout=cards|list-blog=Nieuws.WebHome|list-paginated=no|list-results-count=10|postIndex=0|previousPostReference=|postIndex=1|previousPostReference=Nieuws.Nieuwsbrief januari 2024|postIndex=2|previousPostReference=Nieuws.Audit BMI en BORG|postIndex=3|previousPostReference=Nieuws.Nieuwsbrief december 2023|postIndex=4|previousPostReference=Nieuws.Nieuwsbrief november 2023~"" %) 6905 -((( 6906 -(% class="macro-placeholder hidden" %) 6907 -((( 6908 -macro:blogPostLayoutCards 6909 -))) 6910 - 6911 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogCode~"" %) 6912 -((( 6913 -(% class="macro-placeholder hidden" %) 6914 -((( 6915 -macro:include 6916 -))) 6917 - 6918 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogParameters~"" %) 6919 -((( 6920 -(% class="macro-placeholder hidden" %) 6921 -((( 6922 -macro:include 6923 -))) 6924 - 6925 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## Blog 6926 -#set($blogClassname = 'Blog.BlogClass') 6927 -#set($blogTemplate = 'Blog.BlogTemplate') 6928 -#set($blogSheet = 'Blog.BlogSheet') 6929 -## Blog entries 6930 -#set($blogPostClassname = 'Blog.BlogPostClass') 6931 -#set($blogPostTemplate = 'Blog.BlogPostTemplate') 6932 -#set($blogPostSheet = 'Blog.BlogPostSheet') 6933 -#set($blogPostObjectNumber = $xwiki.getDocument($blogPostTemplate).getObject($blogPostClassname).number) 6934 -#set($oldArticleClassname = 'XWiki.ArticleClass') 6935 -## Categories 6936 -#set($blogCategoryClassname = 'Blog.CategoryClass') 6937 -#set($blogCategoryTemplate = 'Blog.CategoryTemplate') 6938 -#set($blogCategorySheet = 'Blog.CategorySheet') 6939 -#set($blogCategoriesSheet = 'Blog.CategoriesSheet') 6940 -#set($oldBlogCategoryClassname = 'Blog.Categories') 6941 -#set($defaultCategoryParent = 'Blog.Categories') 6942 -## Style 6943 -#set($blogStyleDocumentName = 'Blog.BlogStyle') 6944 -#set($blogStyleDocument = $xwiki.getDocument($blogStyleDocumentName)) 6945 -## Clientside scripts 6946 -#set($blogScriptsDocumentName = 'Blog.BlogScripts') 6947 -#set($blogPublisher = $xwiki.getDocument('Blog.Publisher')) 6948 -## Misc 6949 -#set($thisURL = $doc.getURL($xcontext.action, $request.queryString)) 6950 -#set($isBlogPost = $doc.getObject($blogPostClassname)) 6951 -#set($defaultBlogSpace = 'Blog') 6952 -#set($isCategoryPage = $doc.getObject($blogCategoryClassname)) 6953 -#set($isCategoriesHomePage = $doc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 6954 -## 6955 -## 6956 -## 6957 -#** 6958 - * Displays an image, taken from the blog style document. 6959 - * 6960 - * @param $imgName The name of the icon from icons set to use. 6961 - *# 6962 -#macro(toolImage $imgName)(% class=~"icon-manage~"~%)$services.icon.render($imgName)(%~%)#end" %) 6963 -((( 6964 -(% class="macro-placeholder hidden" %) 6965 -((( 6966 -macro:velocity 6967 -))) 6968 -))) 6969 -))) 6970 - 6971 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## 6972 -## 6973 -## 6974 -## Import the blog skin and javascripts. 6975 -$!xwiki.ssx.use($blogStyleDocumentName)## 6976 -$!xwiki.jsx.use($blogScriptsDocumentName)## 6977 -## 6978 -## import the hierarchy for the path the blog post footer (in displayEntryBlogLocation) 6979 -#template('hierarchy_macros.vm')## 6980 -## 6981 -## 6982 -#** 6983 - * Prints a blog. This is the main macro used in the BlogSheet. 6984 - * 6985 - * @param blogDoc the XDocument holding the blog definition object. 6986 - *### 6987 -#macro(printBlog $blogDoc) 6988 - \{\{include reference='Blog.CreatePost'/}} 6989 - 6990 - ## Use the blogPostList macro to display the blogposts 6991 - ## The blogPostList is used only in case of 'all' or 'paged' blog display type because the blogPostList macro 6992 - ## do not support FTM the monthly and weekly blog display types 6993 - #getBlogDisplayType($blogDoc $displayType) 6994 - #if ($displayType == 'weekly' || $displayType == 'monthly') 6995 - #getBlogEntries($blogDoc $entries) 6996 - #displayBlog($entries 'index' true true) 6997 - #displayNavigationLinks($blogDoc) 6998 - #else 6999 - #getBlogDisplayType($blogDoc $displayType) 7000 - #set ($paginated = 'no') 7001 - #if ($displayType == 'paginated') 7002 - #set ($paginated = 'yes') 7003 - #end 7004 - #getBlogPostsLayout($blogDoc $postsLayout) 7005 - (% class=~"hfeed index~" ~%)(((\{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$paginated~" layout=~"$!postsLayout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" /}}))) 7006 - #end 7007 -#end 7008 -## 7009 -## 7010 -## 7011 -#** 7012 - * Shows blog information. In view mode, the description is printed. In edit mode, allows changing blog settings: title, 7013 - * description, blog type (global or in-space), index display type (fixed size pagination, weekly index, monthly index, 7014 - * all entries). 7015 - * 7016 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 7017 - *### 7018 -#macro(showBlogInfo $blogDoc) 7019 - #if($blogDoc.getObject($blogClassname)) 7020 - ## Keep testing for inline action for backward compatibility with older blogs. 7021 - #if($xcontext.action == 'edit' || $xcontext.action == 'inline') 7022 - #macro(displayProperty $blogDoc $propname) 7023 - ; #displayPropName($xwiki.getClass($blogClassname).get($propname)): 7024 - : $blogDoc.display($propname) 7025 - #end 7026 - #displayProperty($blogDoc 'title') 7027 - #displayProperty($blogDoc 'description') 7028 - #displayProperty($blogDoc 'displayType') 7029 - #displayProperty($blogDoc 'itemsPerPage') 7030 - #displayProperty($blogDoc 'postsLayout') 7031 - #displayProperty($blogDoc 'postsLayoutParameters') 7032 - #else 7033 - $blogDoc.display('description') 7034 - #end 7035 - #elseif($doc.fullName == $blogSheet) 7036 -= $services.localization.render('blog.code.blogsheet') = 7037 - \{\{translation key='blog.code.sheetexplanation'/}} 7038 - #else 7039 - \{\{warning}}\{\{translation key='blog.code.notblog'/}}\{\{/warning}} 7040 - #end 7041 -#end 7042 -## 7043 -## 7044 -## 7045 -#** 7046 - * Retrieve the blog document, which usually is either <tt><Space>.WebHome</tt> for whole-spaces blogs, or 7047 - * <tt><Space>.Blog</tt> for in-space blogs. If none of these documents contains a blog object, then the first 7048 - * (alphabetically) document in the target space that contains one is returned. Finally, if no document in the current 7049 - * space contains a blog object, then <tt>Blog.WebHome</tt> is returned as the default blog. 7050 - * 7051 - * @param space A <tt>String</tt>, the name of the space where to search. 7052 - * @param blogDoc The resulting XDocument. 7053 - *### 7054 -#macro(getBlogDocument $space $blogDoc) 7055 - #set ($result = $NULL) 7056 - ## Check if the current space has a WebPreferences page that contains a Blog.EnablePanelsConfigurationClass object. 7057 - ## It is possible to display a blog's panels info in a page that is not inside a blog and in that case we need to 7058 - ## identify the right blog based on a configuration object in a WebPreferences page. 7059 - #set ($spaceReference = $services.model.resolveSpace($space)) 7060 - #set ($preferencesDocRef = $services.model.createDocumentReference('WebPreferences', $spaceReference)) 7061 - #set ($preferencesDoc = $xwiki.getDocument($preferencesDocRef)) 7062 - #set ($preferencesObj = $preferencesDoc.getObject('Blog.EnablePanelsConfigurationClass')) 7063 - #if ($preferencesObj) 7064 - #set ($result = $xwiki.getDocument( $preferencesObj.getValue('blog'))) 7065 - #end 7066 - ## If no special case occurs (like the previous one), identify a blog by checking the current location from its hierarchy. 7067 - #if (~"$!result~" == '') 7068 - ## First, try the Space.WebHome, for a whole-space blog 7069 - #set($result = $xwiki.getDocument(~"$\{space}.WebHome~")) 7070 - #if(!$result.getObject($blogClassname)) 7071 - ## Second, try the Space.Blog document 7072 - #set($result = $xwiki.getDocument(~"$\{space}.Blog~")) 7073 - #if(!$result.getObject($blogClassname)) 7074 - ## Third, try searching for a blog document in the current space 7075 - ## Prevent the query fail when the space contains dots '.' 7076 - #set($blogDocs = $services.query.hql(~", BaseObject obj where doc.space = :space and obj.name = doc.fullName and obj.className = '$blogClassname' order by doc.name~").setLimit(1).setOffset(0).bindValue('space', $space).execute()) 7077 - #if($blogDocs.size() > 0) 7078 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 7079 - #else 7080 - ## Fourth, try searching for a blog document that have the its 'postsLocation' set to the current space 7081 - #set($blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as postsLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=postsLocationProp.id.id and postsLocationProp.id.name='postsLocation' and postsLocationProp.value=:postsLocation order by doc.name~").setLimit(1).setOffset(0).bindValue('postsLocation', $space).execute()) 7082 - #if($blogDocs.size() > 0) 7083 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 7084 - #else 7085 - ## Last, fallback to Blog.WebHome, the default blog 7086 - #set($result = $xwiki.getDocument('Blog.WebHome')) 7087 - #end 7088 - #end 7089 - #end 7090 - #end 7091 - #end 7092 - #set ($blogDoc = $NULL) 7093 - #setVariable (~"$blogDoc~" $result) 7094 -#end 7095 -## 7096 -## 7097 -## 7098 -#** 7099 - * Retrieve the blog title. 7100 - * 7101 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass<tt> object with the <tt>title</tt> property set. 7102 - * @param title The resulting title. 7103 - *### 7104 -#macro(getBlogTitle $blogDoc $title) 7105 - ## Titles can contain velocity code (most commonly translations), so we should evaluate them. 7106 - #set ($title = $NULL) 7107 - #setVariable (~"$title~" $!blogDoc.displayTitle) 7108 -#end 7109 -## 7110 -## 7111 -## 7112 -#** 7113 - * Retrieve the blog description. 7114 - * 7115 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>description</tt> 7116 - * property set. 7117 - * @param description The resulting description. 7118 - *### 7119 -#macro(getBlogDescription $blogDoc $description) 7120 - #getBlogProperty($blogDoc 'description' '' $result) 7121 - #set ($description = $NULL) 7122 - #setVariable (~"$description~" $result) 7123 -#end 7124 -## 7125 -## 7126 -## 7127 -#** 7128 - * Retrieves a list of entries to be displayed. The entries are either part of the blog's space, or have the blog 7129 - * document set as a parent. The number and range of entries returned (from all those belonging to this blog) depends on 7130 - * the blog display type: paginated (fixed number of entries), weekly (all entries in a week), monthly (all entries in a 7131 - * month), or all. 7132 - * 7133 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 7134 - * @param entries The resulting list of entries to display, a list of XDocument names. 7135 - *### 7136 -#macro(getBlogEntries $blogDoc $entries) 7137 - #if (!$entries) 7138 - #setVariable (~"$entries~" []) 7139 - #end 7140 - #getAllBlogPostsQuery($query) 7141 - #isDefaultBlog($blogDoc $isDefault) 7142 - #set($queryParams = \{}) 7143 - #if ($isDefault) 7144 - #getCategoryAllBlogPostsQuery($query) 7145 - #set($query = ~"$\{query} and (doc.creator = :creator or (isPublished.value = 1 and hidden.value = 0)) and (doc.space = :space or catList like :catList escape '!')~") 7146 - #set($discard = $queryParams.put('creator', $xcontext.user)) 7147 - #set($discard = $queryParams.put('space', $blogDoc.space)) 7148 - #set($sanitizedBlogSpace = $blogDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 7149 - #set($discard = $queryParams.put('catList', $sanitizedBlogSpace)) 7150 - #else 7151 - #set($query = ~"$\{query} and (doc.space = :space or doc.parent = :parent)~") 7152 - #getBlogPostsLocation($blogDoc.space $blogPostsLocation) 7153 - #set($discard = $queryParams.put('space', $blogPostsLocation)) 7154 - #set($discard = $queryParams.put('parent', $blogDoc.space)) 7155 - #end 7156 - #getBlogDisplayType($blogDoc $displayType) 7157 - #if($displayType == 'weekly') 7158 - #getWeeklyBlogEntries($blogDoc $query $entries $queryParams) 7159 - #elseif($displayType == 'monthly') 7160 - #getMonthlyBlogEntries($blogDoc $query $entries $queryParams) 7161 - #elseif($displayType == 'all') 7162 - #getAllBlogEntries($blogDoc $query $entries $queryParams) 7163 - #else 7164 - #getPagedBlogEntries($blogDoc $query $entries $queryParams) 7165 - #end 7166 -#end 7167 -## 7168 -## 7169 -## 7170 -#** 7171 - * Retrieves a list of entries to be displayed. The entries are taken from a ~"page~" of the blog, a sequence of documents 7172 - * defined by the request parameters <tt>ipp</tt> (items per page) and <tt>page</tt> (the current page). Initially the 7173 - * first page is displayed, with the number of entries defined in the blog object in the <tt>itemsPerPage</tt> property 7174 - * (10 if not defined). 7175 - * 7176 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 7177 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 7178 - * refined to restrict to a given space, or to a given search criteria, etc. 7179 - * @param entries The resulting list of entries to display, a list of XDocument names. 7180 - * @param queryParams The parameters to bind with the query. 7181 - *### 7182 -#macro(getPagedBlogEntries $blogDoc $query $entries $queryParams) 7183 - #if (!$entries) 7184 - #setVariable (~"$entries~" []) 7185 - #end 7186 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 7187 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~")) 7188 - #bindQueryParameters($countQueryObj $queryParams) 7189 - #bindQueryParameters($queryObj $queryParams) 7190 - #set($totalEntries = $countQueryObj.count()) 7191 - #getBlogProperty($blogDoc 'itemsPerPage' '10' $defaultItemsPerPage) 7192 - #set($defaultItemsPerPage = $numbertool.toNumber($defaultItemsPerPage).intValue()) 7193 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 7194 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 7195 - #set($discard = $entries.addAll($queryObj.setLimit($itemsPerPage).setOffset($startAt).addFilter(~"unique~").execute())) 7196 -#end 7197 -## 7198 -## 7199 -## 7200 -#** 7201 - * Retrieves a list of entries to be displayed. The entries are taken from a week of the blog. The target week is 7202 - * defined by the request parameters <tt>week</tt> (the week number in the year, from 1 to 52) and <tt>year</tt> (4 7203 - * digit year). Initially the current week is displayed. 7204 - * 7205 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 7206 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 7207 - * refined to restrict to a given space, or to a given search criteria, etc. 7208 - * @param entries The resulting list of entries to display, a list of XDocument names. 7209 - * @param queryParams The parameters to bind with the query. 7210 - *### 7211 -#macro(getWeeklyBlogEntries $blogDoc $query $entries $queryParams) 7212 - #if (!$entries) 7213 - #setVariable (~"$entries~" []) 7214 - #end 7215 - #getRequestedWeek($weekDate) 7216 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 7217 - #set($minDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundFloor())) 7218 - #set($maxDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundCeiling())) 7219 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 7220 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 7221 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 7222 - #bindQueryParameters($countQueryObj $queryParams) 7223 - #bindQueryParameters($queryObj $queryParams) 7224 - #set($totalEntries = $countQueryObj.count()) 7225 - #set($discard = $entries.addAll($queryObj.execute())) 7226 -#end 7227 -## 7228 -## 7229 -## 7230 -#** 7231 - * Retrieves a list of entries to be displayed. The entries are taken from a month of the blog. The target month is 7232 - * defined by the request parameters <tt>month</tt> (the month number, from 1 to 12) and <tt>year</tt> (4 7233 - * digit year). Initially the current month is displayed. 7234 - * 7235 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 7236 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 7237 - * refined to restrict to a given space, or to a given search criteria, etc. 7238 - * @param entries The resulting list of entries to display, a list of XDocument names. 7239 - * @param queryParams The parameters to bind with the query. 7240 - *### 7241 -#macro(getMonthlyBlogEntries $blogDoc $query $entries) 7242 - #if (!$entries) 7243 - #setVariable (~"$entries~" []) 7244 - #end 7245 - #getRequestedMonth($monthDate) 7246 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 7247 - #set($minDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundFloor())) 7248 - #set($maxDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundCeiling())) 7249 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 7250 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 7251 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 7252 - #bindQueryParameters($countQueryObj $queryParams) 7253 - #bindQueryParameters($queryObj $queryParams) 7254 - #set($totalEntries = $countQueryObj.count()) 7255 - #set($discard = $entries.addAll($queryObj.execute())) 7256 -#end 7257 -## 7258 -## 7259 -## 7260 -#** 7261 - * Retrieves a list of entries to be displayed. All entries belonging to the current blog are returned. 7262 - * 7263 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 7264 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 7265 - * refined to restrict to a given space, or to a given search criteria, etc. 7266 - * @param entries The resulting list of entries to display, a list of XDocument names. 7267 - * @param queryParams The parameters to bind with the query. 7268 - *### 7269 -#macro(getAllBlogEntries $blogDoc $query $entries $queryParams) 7270 - #if (!$entries) 7271 - #setVariable (~"$entries~" []) 7272 - #end 7273 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 7274 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 7275 - #bindQueryParameters($countQueryObj $queryParams) 7276 - #bindQueryParameters($queryObj $queryParams) 7277 - #set($totalEntries = $countQueryObj.count()) 7278 - #set($discard = $entries.addAll($queryObj.execute())) 7279 -#end 7280 -## 7281 -## 7282 -## 7283 -#** 7284 - * Retrieves a list of entries to be displayed. Only (and all) unpublished entries are returned. 7285 - * 7286 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 7287 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 7288 - * refined to restrict to a given space, or to a given search criteria, etc. 7289 - * @param queryParams The parameters to bind with the query. 7290 - * @param entries The resulting list of entries to display, a list of XDocument names. 7291 - *### 7292 -#macro(getUnpublishedBlogEntries $blogDoc $query $queryParams $entries) 7293 - #if (!$entries) 7294 - #setVariable (~"$entries~" []) 7295 - #end 7296 - #set($query = ~"$\{query} and isPublished.value = 0~") 7297 - #set ($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 7298 - #set ($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 7299 - #bindQueryParameters($countQueryObj $queryParams) 7300 - #bindQueryParameters($queryObj $queryParams) 7301 - #set($totalEntries = $countQueryObj.count()) 7302 - #set($discard = $entries.addAll($queryObj.execute())) 7303 -#end 7304 -## 7305 -## 7306 -## 7307 -#** 7308 - * Retrieves a list of entries to be displayed. The entries are taken from all the wiki, and not from a specific blog. 7309 - * 7310 - * @param entries The resulting list of entries to display, a list of XDocument names. 7311 - *### 7312 -#macro(getGlobalBlogEntries $entries) 7313 - #if (!$entries) 7314 - #setVariable (~"$entries~" []) 7315 - #end 7316 - #getAllBlogPostsQuery($query) 7317 - #set($totalEntries = $services.query.hql($query).count()) 7318 - #set($defaultItemsPerPage = 20) 7319 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 7320 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 7321 - #set($discard = $entries.addAll($services.query.hql(~"$\{query} order by publishDate.value desc~").setLimit($itemsPerPage).setOffset($startAt).execute())) 7322 -#end 7323 -#** 7324 - * Return the base query for selecting blog entries. It filters only visible entries, but does not bind to a specific 7325 - * blog, nor specify a range or an ordering criteria. 7326 - * 7327 - * This macro is a duplicate of #getAllBlogPostsQuery($query). Keep it in case it's used outside, in custom code. 7328 - * 7329 - * @param query The basic query for selecting blog entries. 7330 - *# 7331 -#macro(getBlogEntriesBaseQuery $query) 7332 - #getAllBlogPostsQuery($query) 7333 -#end 7334 -#** 7335 - * Return the Query for selecting the all wiki blog posts without filtering 7336 - * 7337 - * @param query The basic query for selecting blog entries. 7338 - *# 7339 -#macro(getAllBlogPostsQuery $query) 7340 - #set ($query = $NULL) 7341 - #setVariable(~"$query~" ~", BaseObject as obj, IntegerProperty isPublished, 7342 - IntegerProperty hidden, DateProperty publishDate 7343 - where doc.fullName <> '$blogPostTemplate' and 7344 - obj.name=doc.fullName and obj.className='$blogPostClassname' and 7345 - isPublished.id.id = obj.id and isPublished.id.name = 'published' and 7346 - hidden.id.id = obj.id and hidden.id.name='hidden' and 7347 - publishDate.id.id = obj.id and publishDate.id.name='publishDate' and 7348 - (doc.creator = '$escapetool.sql($xcontext.user)' or (isPublished.value = 1 and hidden.value = 0))~") 7349 -#end 7350 -## 7351 -## 7352 -## 7353 -###** 7354 - * Return the Query for selecting the all wiki blog posts with categories filtering 7355 - * 7356 - * @param query The basic query for selecting blog entries. 7357 - *### 7358 -#macro(getCategoryAllBlogPostsQuery $query) 7359 - #set ($query = $NULL) 7360 - #getAllBlogPostsQuery($baseQuery) 7361 - #set ($baseQuery = $baseQuery.replace('DateProperty publishDate', 'DateProperty publishDate, DBStringListProperty as category left join category.list catList')) 7362 - #setVariable(~"$query~" ~"$\{baseQuery} and obj.id=category.id.id and category.id.name='category'~") 7363 -#end 7364 -## 7365 -## 7366 -## 7367 -#** 7368 - * Determines how is the blog index split into pages: paginated (fixed number of entries), weekly (all entries in a 7369 - * week), monthly (all entries in a month), or all. 7370 - * 7371 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>displayType</tt> 7372 - * property set. 7373 - * @param displayType The resulting string. If the blog object does not define anything, it is considered paginated. 7374 - *### 7375 -#macro(getBlogDisplayType $blogDoc $displayType) 7376 - #getBlogProperty($blogDoc 'displayType' 'paginated' $result) 7377 - #set ($displayType = $NULL) 7378 - #setVariable (~"$displayType~" $result) 7379 -#end 7380 -## 7381 -## 7382 -## 7383 -#** 7384 - * Displays a list of entries. 7385 - * 7386 - * @param entries The entries to display, a list of XDocument names. 7387 - * @param displaying What exactly is displayed: blog index, a single blog entry, a blog category, search results, 7388 - * unpublished entries, etc. This will be used as the classname(s) for the container div (hfeed). Currently 7389 - * used values: index, single, category, search, unpublished, hidden. 7390 - * @param onlyExtract If <tt>true</tt>, only display the extract of articles where available, otherwise display the full content. 7391 - * @param shouldDisplayTitles If <tt>true</tt>, display the blog title (blog posts shouldn't display the title when they're 7392 - * displayed alone on their page since it's the page title which is used in this case) 7393 - *### 7394 -#macro(displayBlog $entries $displaying $onlyExtract $shouldDisplayTitles) 7395 - #set($blogDay = '') 7396 - (% class=~"hfeed $!\{displaying}~" ~%)((( 7397 - (% class=~"blogDay~" ~%)((( 7398 - #foreach ($entryDoc in $xwiki.wrapDocs($entries)) 7399 - #getEntryObject($entryDoc $entryObj) 7400 - ## Although all entries should have one of the two objects, better check to be sure. 7401 - #if(~"$!\{entryObj}~" != '') 7402 - #getEntryDate($entryDoc $entryObj $entryDate) 7403 - ## Display a ~"calendar sheet~" for each day. All entries posted on the same day share one such sheet. 7404 - #set($entryDateStr = $xwiki.formatDate($entryDate, 'yyyyMMMMdd')) 7405 - #if($blogDay != $entryDateStr) 7406 - #if($blogDay != '') 7407 - ))) 7408 - (% class=~"blogDay~" ~%)((( 7409 - #end 7410 - #displayBlogDate($entryDate) 7411 - #set ($blogDay = $entryDateStr) 7412 - #end 7413 - ## Finally, display the entry. 7414 - #displayEntry($entryDoc $entryObj $onlyExtract $shouldDisplayTitles true) 7415 - #end 7416 - #end 7417 - )))## blogDay 7418 - )))## hfeed 7419 -#end 7420 -## 7421 -## 7422 -## 7423 -#** 7424 - * Get the entry object, either a new BlogPost or an old Article. 7425 - * 7426 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 7427 - * @param entryObj The resulting xobject of the blog post. 7428 - *### 7429 -#macro(getEntryObject $entryDoc $__entryObj) 7430 - #set($result = $entryDoc.getObject(~"$\{blogPostClassname}~")) 7431 - #if(!$result) 7432 - #set($result = $entryDoc.getObject(~"$\{oldArticleClassname}~")) 7433 - #end 7434 - ## NOTE: The reason we put an underscore in front of the variable name is to prevent the following line from 7435 - ## overwriting the $entryObj variable that may be defined before this macro is called. Of course, $__entryObj may be 7436 - ## overwritten in this case but it's less likely to have such a variable defined before. 7437 - #set ($__entryObj = $NULL) 7438 - #setVariable (~"$__entryObj~" $result) 7439 -#end 7440 -## 7441 -## 7442 -## 7443 -#** 7444 - * Gets the date associated with a blog entry. This is the publication date. For unpublished entries, initially this is 7445 - * the document creation date, but can be edited by the user. 7446 - * 7447 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 7448 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 7449 - * @param result The resulting date, an instance of <tt>java.util.Date</tt>. 7450 - *### 7451 -#macro(getEntryDate $entryDoc $entryObj $result) 7452 - #set ($result = $NULL) 7453 - #setVariable (~"$result~" $entryObj.getProperty('publishDate').value) 7454 -#end 7455 -## 7456 -## 7457 -## 7458 -#** 7459 - * Displays a date, nicely formatted as a calendar page. 7460 - * 7461 - * @param date The date to display, an instance of <tt>java.util.Date</tt>. 7462 - *### 7463 -#macro(displayBlogDate $date) 7464 - #set($year = $xwiki.formatDate($date, 'yyyy')) 7465 - ## 3 letter month name, like Jan, Dec. 7466 - #set($month = $xwiki.formatDate($date, 'MMM')) 7467 - ## Uncomment to get a full length month name, like January, December. 7468 - ## TODO: this could be defined somewhere in the blog style. 7469 - ## #set($month = $xwiki.formatDate($date, 'MMMM')) 7470 - #set($day = $xwiki.formatDate($date, 'dd')) 7471 - (% class=~"blogdate~" ~%) 7472 - == (% class=~"month~" ~%)$month(%~%) (% class=~"day~" ~%)$day(%~%) (% class=~"year~" ~%)$year(%~%) == 7473 -#end 7474 -## 7475 -## 7476 -## 7477 -#** 7478 - * Displays a blog article: management tools, header, content, footer. 7479 - * 7480 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 7481 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 7482 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 7483 - * @param shouldDisplayTitle If <tt>true</tt>, display the blog title (blog posts shouldn't display the title 7484 - * when they're displayed alone on their page since it's the page title which is used in this case) 7485 - * @param shouldDisplayActions If <tt>true</tt>, display the blog post actions buttons 7486 - *### 7487 -#macro(displayEntry $entryDoc $entryObj $onlyExtract $shouldDisplayTitle $shouldDisplayActions) 7488 - ## Only articles with an explicit hidden setting or an explicit unpublished setting are hidden 7489 - #isPublished($entryObj $isPublished) 7490 - #isHidden($entryObj $isHidden) 7491 - #if($doc.fullName == $entryDoc.fullName) 7492 - (% class=~"hentry single-article~" ~%)((( 7493 - #else 7494 - (% class=~"hentry#if(!$isPublished) unpublished-article#elseif($isHidden) hidden-article#end~" ~%)((( 7495 - #end 7496 - #if ($shouldDisplayActions) 7497 - #displayEntryTools($entryDoc $entryObj) 7498 - #end 7499 - #if($shouldDisplayTitle) 7500 - #displayEntryTitle($entryDoc $entryObj) 7501 - #end 7502 - #if($doc.fullName == $entryDoc.fullName) 7503 - #if(!$isPublished) 7504 - \{\{warning}}\{\{translation key='blog.code.published'/}}\{\{/warning}} 7505 - #elseif($isHidden) 7506 - \{\{warning}}\{\{translation key='blog.code.hidden'/}}\{\{/warning}} 7507 - #end 7508 - #end 7509 - #displayEntryContent($entryDoc $entryObj $onlyExtract) 7510 - #displayEntryFooter($entryDoc $entryObj) 7511 - )))## hentry 7512 -#end 7513 -## 7514 -## 7515 -## 7516 -#** 7517 - * Checks if the provided blog is published or not. 7518 - * 7519 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 7520 - * @param isPublished The resulting boolean, true if the entry is considered published. 7521 - *### 7522 -#macro(isPublished $entryObj $isPublished) 7523 - #set ($isPublished = $NULL) 7524 - ## This should work for both old articles, which don't have the 'published' property at all, and 7525 - ## are considered published by default, and new entries, that should have 1 if published. 7526 - #if (~"$!\{entryObj.getProperty('published').value}~" != '0') 7527 - #setVariable (~"$isPublished~" true) 7528 - #else 7529 - #setVariable (~"$isPublished~" false) 7530 - #end 7531 -#end 7532 -## 7533 -## 7534 -## 7535 -#** 7536 - * Checks if the provided blog is hidden or not. 7537 - * 7538 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass<tt> xclass. 7539 - * @param isHiddel The resulting boolean, true if the entry is considered hidden. 7540 - *### 7541 -#macro(isHidden $entryObj $isHidden) 7542 - #set ($isHidden = $NULL) 7543 - ## This should work for both old articles, which don't have the 'hidden' property at all, and 7544 - ## are considered visible by default, and new entries, that should have 1 if hidden. 7545 - #if (~"$!\{entryObj.getProperty('hidden').value}~" == '1') 7546 - #setVariable (~"$isHidden~" true) 7547 - #else 7548 - #setVariable (~"$isHidden~" false) 7549 - #end 7550 -#end 7551 -## 7552 -## 7553 -## 7554 -#** 7555 - * Displays several ~"tools~" for manipulating blog posts: hide/show, publish, edit. 7556 - * 7557 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 7558 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 7559 - *### 7560 -#macro(displayEntryTools $entryDoc $entryObj) 7561 - #if($xcontext.action == 'view') 7562 - (% class=~"blog-entry-toolbox~" ~%)((( 7563 - #displayPublishButton($entryDoc $entryObj) 7564 - #displayHideShowButton($entryDoc $entryObj) 7565 - #displayEditButton($entryDoc $entryObj) 7566 - #displayDeleteButton($entryDoc $entryObj) 7567 - ))) 7568 - #end 7569 -#end 7570 -## 7571 -## 7572 -## 7573 -#** 7574 - * Displays the publish button to the entry <strong>creator</strong>, if the article is not published yet. 7575 - * 7576 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 7577 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 7578 - * @todo AJAX calls. 7579 - *### 7580 -#macro(displayPublishButton $entryDoc $entryObj) 7581 - #isPublished($entryObj $isPublished) 7582 - #if(!$isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 7583 - [[#toolImage('world')>>path:$blogPublisher.getURL('view', ~"entryName=$\{escapetool.url($entryDoc.fullName)}&xredirect=$\{escapetool.url($thisURL)}&form_token=$!\{services.csrf.getToken()}~")||title=~"$services.localization.render('blog.code.notpublished')~"]]## 7584 - #end 7585 -#end 7586 -## 7587 -## 7588 -## 7589 -#** 7590 - * Displays the hide or show button to the entry <strong>creator</strong>, if the article is already published. 7591 - * 7592 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 7593 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 7594 - *### 7595 -#macro(displayHideShowButton $entryDoc $entryObj) 7596 - #isPublished($entryObj $isPublished) 7597 - #isHidden($entryObj $isHidden) 7598 - ## Only published articles can be hidden. Unpublished articles are considered already hidden. 7599 - #if($isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 7600 - #set ($queryString = \{ 7601 - 'xredirect' : $thisURL, 7602 - 'form_token' : $services.csrf.getToken() 7603 - }) 7604 - #if ($isHidden) 7605 - #set ($discard = $queryString.putAll(\{ 7606 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 0, 7607 - 'comment' : $services.localization.render('blog.code.madevisible') 7608 - })) 7609 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 7610 - [[#toolImage('unlock')>>path:$lockURL||class=~"blog-tool-show~" title=~"$services.localization.render('blog.code.makevisible')~"]]## 7611 - #else 7612 - #set ($discard = $queryString.putAll(\{ 7613 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 1, 7614 - 'comment' : $services.localization.render('blog.code.hid') 7615 - })) 7616 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 7617 - [[#toolImage('lock')>>path:$lockURL||class=~"blog-tool-hide~" title=~"$services.localization.render('blog.code.hide')~"]]## 7618 - #end 7619 - #end 7620 -#end 7621 -## 7622 -## 7623 -## 7624 -#** 7625 - * Displays the edit button to those that can edit the article. 7626 - * 7627 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 7628 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 7629 - *### 7630 -#macro(displayEditButton $entryDoc $entryObj) 7631 - #if($xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 7632 - ## Call getDefaultEditMode() for backward compatibility with older blog posts. 7633 - [[#toolImage('pencil')>>path:$entryDoc.getURL('edit')||title=~"$services.localization.render('blog.code.editpost')~"]]## 7634 - #end 7635 -#end 7636 -## 7637 -## 7638 -## 7639 -#** 7640 - * Displays the delete button to those that can edit the article. 7641 - * 7642 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 7643 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 7644 - * @todo AJAX calls. 7645 - *### 7646 -#macro(displayDeleteButton $entryDoc $entryObj) 7647 - #if($xwiki.hasAccessLevel('delete', $xcontext.user, $entryDoc.fullName)) 7648 - [[#toolImage('cross')>>path:$entryDoc.getURL('delete')||title=~"$services.localization.render('blog.code.deletepost')~"]]## 7649 - #end 7650 -#end 7651 -## 7652 -## 7653 -## 7654 -#** 7655 - * Displays the title of the entry. 7656 - * 7657 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 7658 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 7659 - *### 7660 -#macro(displayEntryTitle $entryDoc $entryObj) 7661 - #if($doc.fullName == $entryDoc.fullName) 7662 - (% class=~"entry-title~" ~%) 7663 - = $services.rendering.escape($entryDoc.display('title', 'view', $entryObj), $xwiki.getCurrentContentSyntaxId()) = 7664 - #else 7665 - (% class=~"entry-title~" ~%) 7666 - === [[$services.rendering.escape($entryDoc.display('title', 'view', $entryObj),$xwiki.getCurrentContentSyntaxId())>>doc:$services.rendering.escape($services.model.serialize($entryDoc.getDocumentReference(),'default'),$xwiki.getCurrentContentSyntaxId())]] === 7667 - #end 7668 -#end 7669 -## 7670 -## 7671 -## 7672 -#** 7673 - * Displays the body of the entry. 7674 - * 7675 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 7676 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 7677 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 7678 - *### 7679 -#macro(displayEntryContent $entryDoc $entryObj $onlyExtract) 7680 - (% class=~"#if($onlyExtract)entry-summary#\{else}entry-content#end~" ~%)((( 7681 - #getEntryContent($entryDoc $entryObj $onlyExtract $entryContent) 7682 - ## FIXME: This causes the blog's content to not be annotatable. See http://jira.xwiki.org/browse/XWIKI-6328 7683 - ## Should probably be replaced by a display macro call with a reference to the object property holding the post's content 7684 - \{\{html wiki=~"false~"}}$entryDoc.getRenderedContent($entryContent, $entryDoc.syntax.toIdString())\{\{/html}} 7685 - ))) ## entry-content 7686 - (% class=~"clearfloats~" ~%)((())) 7687 -#end 7688 -## 7689 -## 7690 -## 7691 -#** 7692 - * Extracts the body of the entry that should be displayed. If <tt>onlyExtract</tt> is <tt>true</tt>, display the content 7693 - * of the <tt>extract</tt> field (if not empty). 7694 - * 7695 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 7696 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 7697 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 7698 - * @param entryContent The resulting content. 7699 - * @param removeEllipsis If <tt>true</tt>, then don't display an ellipsis at the end of the content (only used when 7700 - * <tt>onlyExtract</tt> is <tt>true</tt>) 7701 - *### 7702 -#macro(getEntryContent $entryDoc $entryObj $onlyExtract $entryContent $removeEllipsis) 7703 - #if ($onlyExtract) 7704 - ## Note: We trim the summary so that if there's some white space it won't cause the summary to be used instead 7705 - ## of the content. 7706 - #set ($macro.result = $entryObj.getProperty('extract').value.trim()) 7707 - #end 7708 - #if(~"$!macro.result~" == '') 7709 - #set($macro.result = $entryObj.getProperty('content').value) 7710 -#* Disabled until the content can be cleanly cut. 7711 -* #if($onlyExtract && $result.length()>$maxchars) 7712 -* #set($i = $macro.result.lastIndexOf(~" ~", $maxchars)) 7713 -* #set($i = $i + 1) 7714 -* #set($macro.result = ~"$\{macro.result.substring(0,$i)} *[...>$\{entryDoc.fullName}]*~") 7715 -* #end 7716 -## *### 7717 - #elseif (!$removeEllipsis) 7718 - #if($entryDoc.syntax.toIdString() == 'xwiki/1.0') 7719 - #set($macro.result = ~"$\{macro.result} <a href='$\{entryDoc.getExternalURL()}' title='$services.localization.render('blog.code.readpost')'>...</a>~") 7720 - #elseif($entryDoc.syntax.toIdString() == 'xwiki/2.0' || $entryDoc.syntax.toIdString() == 'xwiki/2.1') 7721 - #set($macro.result = ~"$\{macro.result} [[...>>$\{services.rendering.escape($entryDoc.getFullName(), $entryDoc.getSyntax())}||title='$services.localization.render('blog.code.readpost')']]~") 7722 - #end 7723 - #end 7724 - #set ($entryContent = $NULL) 7725 - #setVariable (~"$entryContent~" $macro.result) 7726 -#end 7727 -## 7728 -## 7729 -## 7730 -#** 7731 - * Displays the footer of the entry. 7732 - * 7733 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 7734 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 7735 - *### 7736 -#macro(displayEntryFooter $entryDoc $entryObj) 7737 - (% class=~"entry-footer~" ~%)((( 7738 - #isPublished($entryObj $isPublished) 7739 - (% class='entry-author-label' ~%) 7740 - #if($isPublished) 7741 - \{\{translation key='blog.code.postedby'/}} ## 7742 - #else 7743 - \{\{translation key='blog.code.createdby'/}} ## 7744 - #end 7745 - \{\{html wiki=~"false~" clean=~"false~"}}<span class='author vcard'>#userfn($entryDoc.creator)</span>\{\{/html}} ## 7746 - #getEntryDate($entryDoc $entryObj $entryDate) 7747 - #listCategories($entryObj) #* 7748 - ## Since the publish date and update date are not set at the exact same time, there could be a small difference that 7749 - ## we assume cannot be more than 3 seconds. 7750 - *#(% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.permalink'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||rel=~"bookmark~"]] ## 7751 - #if ($showcomments) 7752 - (% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.comments'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||anchor=~"Comments~"]] (% class=~"itemCount~" ~%)($entryDoc.comments.size())(%~%) ## 7753 - #end ## 7754 - #if($entryDoc != $doc) ## 7755 - #displayEntryBlogLocation($entryDoc $entryObj) ## 7756 - #end 7757 - )))## entry-footer 7758 -#end 7759 -## 7760 -## 7761 -#** 7762 - * Display the blog for the entry (if it is not the currently displayed blog) 7763 - * 7764 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 7765 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 7766 - *### 7767 -#macro(displayEntryBlogLocation $entryDoc $entryObj) 7768 - #getBlogPostsLocation($entryDoc.getSpace() $blogPostsLocation) ## 7769 - #if(~"$!blogPostsLocation~" != ~"~") ## 7770 - #set($blogSpaceRef = $services.model.resolveSpace($blogPostsLocation)) ## 7771 - #set($blogDocRef = $services.model.createDocumentReference($services.model.getEntityReference('DOCUMENT', 'default').getName(), $blogSpaceRef)) ## 7772 - #if($doc.documentReference != $blogDocRef) ## 7773 - #set($blogDoc = $xwiki.getDocument($blogDocRef)) ## 7774 - #set($blogObj = $blogDoc.getObject('Blog.BlogClass')) ## 7775 - #if($blogObj) (% class=~"blogrefpath~" ~%)((( ## 7776 - $services.localization.render('blog.code.postedin') \{\{html clean=~"false~" wiki=~"false~"}} #hierarchy($blogDocRef, \{'selfIsActive' : true, 'local': true}) \{\{/html}} ## 7777 - )))(%~%)## 7778 - #end 7779 - #end 7780 - #end 7781 -#end 7782 -## 7783 -## 7784 -## 7785 -## 7786 -#** 7787 - * List the categories an entry belongs to. Used in the footer. The categories are instances of <tt>Blog.CategoryClass</tt>. 7788 - * 7789 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 7790 - *### 7791 -#macro(listCategories $entryObj) 7792 - #if($entryObj.getxWikiClass().getName() == $blogPostClassname) 7793 - #set($categories = $entryObj.getProperty('category').value) 7794 - #set($first = true) 7795 - #if($categories.size() > 0) 7796 - #foreach($category in $categories) 7797 - #set($categoryDoc = $!xwiki.getDocument($category)) 7798 - #if(!$categoryDoc.isNew() && $categoryDoc.getObject($\{blogCategoryClassname})) 7799 - #if($foreach.count == 1) 7800 - (% class='separator' ~%)·(%~%) $services.localization.render('blog.code.categories') ## 7801 - #else 7802 - , ## 7803 - #end## 7804 - [[$!\{categoryDoc.getObject($blogCategoryClassname).getValue('name')}>>$\{category}||rel='tag']]## 7805 - #end## 7806 - #end## 7807 - #end 7808 - #end 7809 -#end 7810 -## 7811 -## 7812 -## 7813 -#** 7814 - * Displays blog pagination links (older and newer entries). 7815 - * 7816 - * @param blogDoc the XDocument holding the blog definition object. 7817 - *### 7818 -#macro(displayNavigationLinks $blogDoc) 7819 - (% class=~"clearfloats~" ~%)((())) 7820 - #getBlogDisplayType($blogDoc $displayType) 7821 - #if($displayType == 'weekly') 7822 - (% class=~"pagingLinks~" ~%)((( 7823 - #getRequestedWeek($weekDate) 7824 - $weekDate.addWeeks(-1)## 7825 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousweek'/}}>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 7826 - #sep() 7827 - $weekDate.addWeeks(2)## 2 because we already subtracted 1 above 7828 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextweek'/}} »>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 7829 - ))) 7830 - #elseif($displayType == 'monthly') 7831 - (% class=~"pagingLinks~" ~%)((( 7832 - #getRequestedMonth($monthDate) 7833 - $monthDate.addMonths(-1)## 7834 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousmonth'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 7835 - #sep() 7836 - $monthDate.addMonths(2)## 2 because we already subtracted 1 above 7837 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextmonth'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 7838 - ))) 7839 - #elseif($displayType == 'all') 7840 - #else 7841 - ## Paginated 7842 - #if(($totalPages > 1)) 7843 - #set($queryString = '') 7844 - #foreach($p in $request.getParameterNames()) 7845 - #if($p != 'page' && $p != 'ipp') 7846 - #foreach($v in $request.getParameterValues($p)) 7847 - #set($queryString = ~"$\{queryString}&$\{escapetool.url($p)}=$\{escapetool.url($v)}~") 7848 - #end 7849 - #end 7850 - #end 7851 - (% class=~"pagingLinks~" ~%)((( 7852 - #if ($currentPageNumber < $totalPages) 7853 - #set($currentPageNumber = $currentPageNumber + 1) 7854 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.olderposts'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 7855 - #set($currentPageNumber = $currentPageNumber - 1) 7856 - #end 7857 - #if ($currentPageNumber > 1) 7858 - #if ($currentPageNumber < $totalPages) 7859 - #sep() 7860 - #end 7861 - #set($currentPageNumber = $currentPageNumber - 1) 7862 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.newerposts'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 7863 - #set($currentPageNumber = $currentPageNumber + 1) 7864 - #end 7865 - (% class=~"clear~" ~%)(%~%) 7866 - )))## pagingLinks 7867 - #end 7868 - #end 7869 -#end 7870 -## 7871 -## 7872 -## 7873 -#** 7874 - * Displays a message box with ~"publish~" icon. 7875 - * 7876 - * @param message A text message concerning blog article publishing 7877 - *### 7878 -#macro(publishMessageBox $message) 7879 -(% class=~"plainmessage publish-message~" ~%)((($services.icon.render('world') $message))) 7880 -#end 7881 -#** 7882 - * Displays a message box with ~"show/hide~" icon. 7883 - * 7884 - * @param message A text message concerning blog article hiding 7885 - *### 7886 -#macro(hideMessageBox $message) 7887 -(% class=~"plainmessage hide-message~" ~%)((($services.icon.render('unlock') $message))) 7888 -#end 7889 -## 7890 -## 7891 -## 7892 -#** 7893 - * Determine the requested week, for using in a weekly-indexed blog. The relevant request parameters are 7894 - * <tt>year</tt> and <tt>week</tt>. By default, the current week is used. 7895 - * 7896 - * @param monthDate The resulting week, a JODATime MutableDateTime. 7897 - *### 7898 -#macro(getRequestedWeek $weekDate) 7899 - #set ($weekDate = $NULL) 7900 - #setVariable (~"$weekDate~" $xwiki.jodatime.mutableDateTime) 7901 - #if(~"$!\{request.year}~" != '') 7902 - #set ($discard = $weekDate.setYear($numbertool.toNumber($request.year).intValue())) 7903 - #end 7904 - #if(~"$!\{request.week}~" != '') 7905 - #set ($discard = $weekDate.setWeekOfWeekyear($numbertool.toNumber($request.week).intValue())) 7906 - #end 7907 -#end 7908 -## 7909 -## 7910 -## 7911 -#** 7912 - * Determine the requested month, for using in a monthly-indexed blog. The relevant request parameters are 7913 - * <tt>year</tt> and <tt>month</tt>. By default, the current month is used. 7914 - * 7915 - * @param monthDate The resulting month, a JODATime MutableDateTime. 7916 - *### 7917 -#macro(getRequestedMonth $monthDate) 7918 - #set ($monthDate = $NULL) 7919 - #setVariable (~"$monthDate~" $xwiki.jodatime.mutableDateTime) 7920 - #if(~"$!\{request.year}~" != '') 7921 - #set ($discard = $monthDate.setYear($numbertool.toNumber($request.year).intValue())) 7922 - #end 7923 - #if(~"$!\{request.month}~" != '') 7924 - #set ($discard = $monthDate.setMonthOfYear($numbertool.toNumber($request.month).intValue())) 7925 - #end 7926 -#end 7927 -## 7928 -## 7929 -## 7930 -#** 7931 - * Retrieve a blog property (title, display type, etc). 7932 - * 7933 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 7934 - * @param propertyName The name of the property to be retrieved. One of the <tt>Blog.BlogClass</tt>'s properties. 7935 - * @param defaultValue The default value to use in case the blog object does not define one. 7936 - * @param propertyValue The resulting value. 7937 - *### 7938 -#macro(getBlogProperty $blogDoc $propertyName $defaultValue $propertyValue) 7939 - #set($result = ~"$!\{blogDoc.getObject($\{blogClassname}).getProperty($propertyName).value}~") 7940 - #if($result == '') 7941 - #set($result = $defaultValue) 7942 - #end 7943 - #set ($propertyValue = $NULL) 7944 - #setVariable (~"$propertyValue~" $result) 7945 -#end 7946 - 7947 -#** 7948 - * If an error occurs when executing an action, set a specific response status and display an error message. 7949 - * 7950 - * @param status The response status. 7951 - * @param text The user readable error to be displayed. Can be a translation key. 7952 - * @param parameters The parameters to use when decoding the translation key. 7953 - *### 7954 -#macro(blog__actionResponseError $status $text $parameters) 7955 - $response.setStatus($status) 7956 - #if($request.ajax) 7957 - $services.localization.render($text, $!parameters) 7958 - #else 7959 - \{\{error}}$services.localization.render($text, $!parameters)\{\{/error}} 7960 - #end 7961 -#end 7962 -## 7963 -## 7964 -## 7965 -#** 7966 - * Check if a blog is the Default blog (The one in the 'Blog' space). 7967 - * 7968 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 7969 - * @param isDefault The resulting boolean. 7970 - *### 7971 -#macro(isDefaultBlog $blogDoc $isDefault) 7972 - #set ($result = false) 7973 - #if ($blogDoc.space == 'Blog') 7974 - #set ($result = true) 7975 - #end 7976 - #setVariable(~"$isDefault~" $result) 7977 -#end 7978 -## 7979 -## 7980 -## 7981 -#** 7982 - * Retrieve the blog posts location (space). 7983 - * 7984 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 7985 - * @param postsLocation The resulting location. 7986 - *### 7987 -#macro(getBlogPostsLocation $blogSpace $postsLocation) 7988 - #getBlogDocument($blogSpace $blogDoc) 7989 - #getBlogProperty($blogDoc 'postsLocation' $blogDoc.space $result) 7990 - #set ($postsLocation = $NULL) 7991 - #setVariable (~"$postsLocation~" $result) 7992 -#end 7993 -## 7994 -## 7995 -## 7996 -#** 7997 - * Retrieve the blog categories location (space). 7998 - * 7999 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 8000 - * @param categoriesLocation The resulting location. 8001 - *### 8002 -#macro(getBlogCategoriesLocation $blogSpace $categoriesLocation) 8003 - #getBlogDocument($blogSpace $blogDoc) 8004 - #getBlogProperty($blogDoc 'categoriesLocation' 'Blog' $result) 8005 - #set ($postsLocation = $NULL) 8006 - #setVariable (~"$categoriesLocation~" $result) 8007 -#end 8008 -###** 8009 - * Return the Query for selecting the blog posts based on the context where the posts are displayed. 8010 - * for example there is 4 different panel contexts: 8011 - * aBlog.aPost or aBlog.WebHome 8012 - * aCategorySpace.aCategory 8013 - * aCategorySpace.WebHome 8014 - * Blog.aPost or Blog.WebHome 8015 - * 8016 - * @param query The query for selecting blog entries. 8017 - * @param queryParams The parameters to bind with the generated query. 8018 - * @param targetDoc The document in which the articles will be displayed. 8019 - *### 8020 -#macro(getAllBlogPostsQueryBasedOnDisplayContext $targetDoc $query $queryParams) 8021 - #set ($query = $NULL) 8022 - #set ($queryParams = $NULL) 8023 - #getCategoryAllBlogPostsQuery($resultQuery) 8024 - #set ($resultQueryParams = \{}) 8025 - #set($sanitizedSpace = $targetDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 8026 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 8027 - ## Get all posts that are in the default blog space('Blog') or in category 'Blog.%' 8028 - #set ($discard = $resultQueryParams.put('space', $targetDoc.space)) 8029 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 8030 - #set($resultQuery = ~"$\{resultQuery} and (doc.space = :space or catList like :catList escape '!')~") 8031 - #elseif($targetDoc.getObject($blogCategoryClassname)) 8032 - ## Get all posts that are in a category aCategorySpace.aCategory 8033 - #set ($discard = $resultQueryParams.put('catList', $targetDoc.fullName)) 8034 - #set($resultQuery = ~"$\{resultQuery} and (catList=:catList)~") 8035 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 8036 - ## Get all posts that are in a category aCategorySpace.% 8037 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 8038 - ## Exclude incategorized posts 8039 - #set ($excludedCategory = ~"$\{targetDoc.space}.WebHome~") 8040 - #if ($targetDoc.space == $defaultBlogSpace) 8041 - #set ($excludedCategory = ~"Blog.Categories.WebHome~") 8042 - #end 8043 - #set ($discard = $resultQueryParams.put('excludedCategory', $excludedCategory)) 8044 - #set($resultQuery = ~"$\{resultQuery} and (catList<>:excludedCategory) and (catList like :catList escape '!')~") 8045 - #else 8046 - ## Get all posts in blog space aBlog 8047 - #getAllBlogPostsQuery($resultQuery) 8048 - #getBlogPostsLocation($targetDoc.space $postsLocation) 8049 - #set ($discard = $resultQueryParams.put('space', $postsLocation)) 8050 - #set($resultQuery = ~"$\{resultQuery} and doc.space = :space~") 8051 - #end 8052 - #setVariable(~"$query~" $resultQuery) 8053 - #setVariable(~"$queryParams~" $resultQueryParams) 8054 -#end 8055 -## 8056 -## 8057 -## 8058 -###** 8059 - * Display blog posts based on the context where the posts are displayed. 8060 - * for example there is 4 different panel contexts: 8061 - * aBlog.aPost or aBlog.WebHome 8062 - * aCategorySpace.aCategory 8063 - * aCategorySpace.WebHome 8064 - * Blog.aPost or Blog.WebHome 8065 - * 8066 - * @param targetDoc The document in which the articles will be displayed. 8067 - * @param postsVisiblity The visibility of the posts to display: recent, unpublished, ... 8068 - * @param layout Layout of the the posts to display 8069 - * @param layoutParams additional layout parameters, it is a string like 'param1=val1|...|paramN=valueN' 8070 - * @param limit the number of posts to display 8071 - *### 8072 -#macro(displayBlogPostsBasedOnContext $targetDoc $postsVisiblity $layout $layoutParams $limit) 8073 - #if ($postLayout == 'full') 8074 - #set ($macro.paginated = 'yes') 8075 - #end 8076 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 8077 - ## Display all posts that are in the default blog space('Blog') or in category 'Blog.%' 8078 - #getBlogPostsLayout($xwiki.getDocument(~"$\{defaultBlogSpace}.WebHome~") $postsLayout) 8079 - #if (~"$!layout~" == '') 8080 - #set ($layout = $postsLayout) 8081 - #end 8082 - #if ($postsVisiblity == 'recent') 8083 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 8084 - #elseif($postsVisiblity == 'unpublished') 8085 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 8086 - #end 8087 - #elseif($targetDoc.getObject($blogCategoryClassname)) 8088 - ## Display all posts that are in a category aCategorySpace.aCategory 8089 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 8090 - #getBlogPostsLayout($blogDoc $postsLayout) 8091 - #if (~"$!layout~" == '') 8092 - #set ($layout = $postsLayout) 8093 - #end 8094 - #if ($postsVisiblity == 'recent') 8095 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 8096 - #elseif($postsVisiblity == 'unpublished') 8097 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 8098 - #end 8099 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 8100 - ## Display all posts that are in a category aCategorySpace.% 8101 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 8102 - #getBlogPostsLayout($blogDoc $postsLayout) 8103 - #if (~"$!layout~" == '') 8104 - #set ($layout = $postsLayout) 8105 - #end 8106 - #if ($postsVisiblity == 'recent') 8107 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 8108 - #elseif($postsVisiblity == 'unpublished') 8109 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 8110 - #end 8111 - #else 8112 - ## Display all posts in blog space aBlog 8113 - #getBlogDocument($targetDoc.space $blogDoc) 8114 - #getBlogPostsLayout($blogDoc $postsLayout) 8115 - #if (~"$!layout~" == '') 8116 - #set ($layout = $postsLayout) 8117 - #end 8118 - #if ($postsVisiblity == 'recent') 8119 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 8120 - #elseif($postsVisiblity == 'unpublished') 8121 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 8122 - #end 8123 - #end 8124 -#end 8125 -## 8126 -## 8127 -## 8128 -#** 8129 - * Bind parameters to a query object. 8130 - * 8131 - * @param queryObj The query object (org.xwiki.query.internal.ScriptQuery object) 8132 - * @param queryParams the query parameters. 8133 - *### 8134 -#macro(bindQueryParameters $queryObj $queryParams) 8135 - #set ($output = $queryObj) 8136 - #foreach( $key in $queryParams.keySet() ) 8137 - #set($output = $queryObj.bindValue($key, $queryParams.get($key))) 8138 - #end 8139 - #setVariable(~"$queryObj~" $output) 8140 -#end 8141 -## 8142 -## 8143 -## 8144 -#** 8145 - * Determines the blogposts layout: Default layout (Calendar), Image thumbnail 8146 - * 8147 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>postsLayout</tt> 8148 - * property set. 8149 - * @param postsLayout The resulting string. If the blog object does not define anything, it is considered full (default). 8150 - *### 8151 -#macro(getBlogPostsLayout $blogDoc $postsLayout) 8152 - #getBlogProperty($blogDoc 'postsLayout' 'full' $res) 8153 - #set ($postsLayout = $NULL) 8154 - #setVariable (~"$postsLayout~" $res) 8155 -#end 8156 -## 8157 -## 8158 -## 8159 -#** 8160 - * Retrieve the blog document of a categories space, which is the blog descriptor that have its categoriesLocation property set to the categories space 8161 - * 8162 - * @param categoriesSpace A <tt>String</tt>, the name of the space. 8163 - * @param blogDoc The resulting XDocument. 8164 - *### 8165 -#macro(getBlogDocumentForCategoriesSpace $categoriesSpace $blogDoc) 8166 - #set($macro.blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as categoriesLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=categoriesLocationProp.id.id and categoriesLocationProp.id.name='categoriesLocation' and categoriesLocationProp.value=:categoriesLocation order by doc.creationDate~").setLimit(1).setOffset(0).bindValue('categoriesLocation', $categoriesSpace).execute()) 8167 - #if($macro.blogDocs.size() > 0 && $categoriesSpace != $defaultBlogSpace) 8168 - #set($macro.result = $xwiki.getDocument($macro.blogDocs.get(0))) 8169 - #else 8170 - ## Fallback to Blog.WebHome, the default blog 8171 - #set($macro.result = $xwiki.getDocument('Blog.WebHome')) 8172 - #end 8173 - #set ($blogDoc = $NULL) 8174 - #setVariable (~"$blogDoc~" $macro.result) 8175 -#end" %) 8176 -((( 8177 -(% class="macro-placeholder hidden" %) 8178 -((( 8179 -macro:velocity 8180 -))) 8181 -))) 8182 -))) 8183 - 8184 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogPostLayoutMacros~"" %) 8185 -((( 8186 -(% class="macro-placeholder hidden" %) 8187 -((( 8188 -macro:include 8189 -))) 8190 - 8191 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|#** 8192 - * Extract the layout parameters from a string. 8193 - * 8194 - * @param layoutParamsString The string representation of the layout parameters. 8195 - * It should contain a String following this format ~"paramName1=Value1|paramName2=Value2|...|paramNameK=ValueK~" 8196 - * @param layoutsParameters The resulting layout parameters Map. 8197 - *### 8198 -#macro(extractLayoutParametersFromString $layoutParamsString $layoutsParameters) 8199 - #set ($layoutsParameters = $NULL) 8200 - #set ($macro.layoutParams = \{}) 8201 - #if (~"$!layoutParamsString~" != '') 8202 - #set ($macro.paramsArr = $layoutParamsString.split('\\|')) 8203 - #foreach ($item in $macro.paramsArr) 8204 - #set ($itemSplit = $item.split('=')) 8205 - #if ($itemSplit.size() == 2) 8206 - #set ($discard = $macro.layoutParams.put($itemSplit[0].trim(), $itemSplit[1].trim())) 8207 - #end 8208 - #end 8209 - #end 8210 - #setVariable(~"$layoutsParameters~" $macro.layoutParams) 8211 -#end" %) 8212 -((( 8213 -(% class="macro-placeholder hidden" %) 8214 -((( 8215 -macro:velocity 8216 -))) 8217 -))) 8218 -))) 8219 - 8220 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-| #macro(displaySmallPost $pDoc $pObj) 8221 - #initLayoutVars($pDoc $pObj) 8222 - <div class=~"col-xs-12 col-sm-6 next_blog~"> 8223 - <a href=~"$pDoc.uRL~" class=~"thumbnail~"> 8224 - <div class=~"row~"> 8225 - <div class=~"col-xs-4~"> 8226 - #if ($imageAtt) 8227 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 8228 - #end 8229 - </div> 8230 - <div class=~"col-xs-8 art_det~"> 8231 - <p class=~"text-left~"> 8232 - #if($displayTitle)$!postTitle #end 8233 - <br/><span class=~"date_info~"> $!dateStr </span> 8234 - </p> 8235 - #displayPostDetails($pDoc) 8236 - </div> 8237 - </div> 8238 - </a> 8239 - </div> 8240 - #end 8241 - ## 8242 - ## 8243 - ## 8244 - #macro(displayPinnedPost $pDoc $pObj) 8245 - #initLayoutVars($pDoc $pObj) 8246 - <div class=~"col-xs-12 col-sm-4 col-md-4 blog_pin~"> 8247 - <a href=~"$pDoc.uRL~" class=~"all-post-link~"> 8248 - <div class=~"thumbnail~"> 8249 - #if ($displayTitle && $displayTitleFirstOnPinnedPosts) 8250 - <h5 class=~"title-top~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 8251 - #end 8252 - #if ($imageAtt) 8253 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 8254 - #end 8255 - <div class=~"caption~"> 8256 - #if ($displayTitle && !$displayTitleFirstOnPinnedPosts) 8257 - <h5 class=~"text-left~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 8258 - #end 8259 - #if ($displaySummaryOnPinnedPosts) 8260 - <div class=~"text-left post-summary~"> 8261 - #set ($postContent = $pObj.getProperty('extract').value) 8262 - $!pDoc.getRenderedContent($postContent, $pDoc.syntax.toIdString()) 8263 - </div> 8264 - #end 8265 - #displayPostDetails($pDoc) 8266 - </div> 8267 - </div> 8268 - </a> 8269 - </div> 8270 - #end 8271 - ## 8272 - ## 8273 - ## 8274 - #macro(formatPostDate $pDoc $pObj) 8275 - #set ($formattedDate = $NULL) 8276 - #set($dateStr = $datetool.format('medium', $postDate, $xcontext.locale)) 8277 - #if (~"$!dateStr~" != '') 8278 - #set ($dateArr = $dateStr.split(' ')) 8279 - #if ($dateArr.size() > 3) 8280 - #set ($dateStr = ~"~") 8281 - #foreach($s in $dateArr.subList(0, 3)) 8282 - #set ($dateStr = ~"$\{dateStr}$\{s} ~") 8283 - #end 8284 - #end 8285 - #end 8286 - #setVariable(~"$formattedDate~" $dateStr) 8287 - #end 8288 - ## 8289 - ## 8290 - ## 8291 - #macro(displayPostDetails $pDoc) 8292 - <div class=~"row post-details~"> 8293 - <div class=~"col-xs-8 detail~"> 8294 - #if ($services.like.displayButton($pDoc.documentReference)) 8295 - #set ($optLikeRecord = $services.like.getLikes($pDoc.documentReference)) 8296 - ## Retrieve the likes number in XWiki 12.9+ 8297 - #set ($likeNumber = $optLikeRecord.get()) 8298 - #if (!$stringtool.isNumeric($likeNumber.toString())) 8299 - ## Retrieve the likes number in XWiki versions greater than 12.7 and lower than 12.9. 8300 - #set ($likeNumber = $optLikeRecord.get().likeNumber) 8301 - #end 8302 - #if ($stringtool.isNumeric($likeNumber.toString())) 8303 - <div class=~"post-likes btn btn-default disabled badge~" 8304 - title=~"$escapetool.xml($services.localization.render('like.button.title', [$likeNumber]))~"> 8305 - $services.icon.renderHTML('heart') <span class=~"like-number~">$likeNumber</span> 8306 - </div> 8307 - #end 8308 - #elseif ($services.ratings) 8309 - #set ($ratingsConfigDoc = $services.ratings.getConfigurationDocument($pDoc.documentReference)) 8310 - #if ($ratingsConfigDoc.getValue('displayRatings') == 1) 8311 - <ul class=~"pull-left note list-inline~"> 8312 - #foreach ($x in [1..5]) 8313 - #set ($cls = ~"~") 8314 - #if ($x > $averageVote) 8315 - #set ($cls = ~"-o~") 8316 - #end 8317 - <li><span class=~"fa fa-star$\{cls}~"></span></li> 8318 - #end 8319 - </ul> 8320 - #end 8321 - #end 8322 - </div> 8323 - #if ($showPostComments) 8324 - <div class=~"col-xs-4 com_det~"> 8325 - <p class=~"text-right~">$services.icon.renderHTML('comments') ($!nbComments)</p> 8326 - </div> 8327 - #end 8328 - </div> 8329 - #end 8330 - ## 8331 - ## 8332 - ## 8333 - #macro(initLayoutVars $pDoc $pObj) 8334 - #set ($postTitle = $pDoc.display('title', 'view', $pObj)) 8335 - #set ($imageAtt = $pDoc.getAttachment($pObj.getValue('image'))) 8336 - #isPublished($pObj $isPublished) 8337 - #isHidden($pObj $isHidden) 8338 - #getEntryDate($pDoc $pObj $postDate) 8339 - #formatPostDate($postDate $dateStr) 8340 - #set ($averageVote = $mathtool.round($services.ratings.getAverageRating($pDoc.documentReference).getAverageVote())) 8341 - #set ($nbComments = $pDoc.getComments().size()) 8342 - #set ($showPostComments = true) 8343 - #if ($xwiki.getSpacePreferenceFor('showcomments', $pDoc.documentReference.lastSpaceReference, '1') == '0') 8344 - #set ($showPostComments = false) 8345 - #end 8346 - #end 8347 - ## 8348 - ## 8349 - ## 8350 - #macro(displayEditPinnedPostsButton) 8351 - #if (~"$!macroAdditionalParams.get('postIndex')~" == '0' && $services.security.authorization.hasAccess('edit', $pinnedPostsSourceDoc.fullName)) 8352 - #set ($discard = $xwiki.ssx.use('Blog.PinnedPostsSheet')) 8353 - #set ($discard = $xwiki.jsx.use('Blog.PinnedPostsSheet')) 8354 - #set ($editPinnedPostsURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'get', 'sheet=Blog.PinnedPostsSheet')) 8355 - #set ($newPinnedPostsObjectURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'objectadd', ~"classname=Blog.PinnedPostsClass&form_token=$!\{services.csrf.getToken()}~")) 8356 - <div class=~"edit-pinned-posts-container~"> 8357 - <div class=~"col-xs-12 col-sm-12 col-md-12 text-right edit-pinned-posts~"> 8358 - <a href=~"javascript:;~" class=~"editPinnedPosts~"> 8359 - <span class=~"glyphicon glyphicon-edit~" aria-hidden=~"true~"></span> $services.localization.render('blog.post.layout.cards.pinnedposts.edit') 8360 - </a> 8361 - <input type=~"hidden~" id=~"editPinnedPostsURL~" value=~"$escapetool.xml($editPinnedPostsURL)~"/> 8362 - <input type=~"hidden~" id=~"newPinnedPostsObjectURL~" value=~"$escapetool.xml($newPinnedPostsObjectURL)~"/> 8363 - </div> 8364 - </div> 8365 - #if (~"$!pinnedPostsObj~" == '') 8366 - <input type=~"hidden~" name=~"createPinnedPostsObject~" value=~"1~"/> 8367 - #end 8368 - #end 8369 - #end" %) 8370 -((( 8371 -(% class="macro-placeholder hidden" %) 8372 -((( 8373 -macro:velocity 8374 -))) 8375 -))) 8376 - 8377 -(% data-macro="startmacro:velocity|-||-| #if ($services.security.authorization.hasAccess('view', $xcontext.macro.params.reference)) 8378 - #set ($postDoc = $xwiki.getDocument($xcontext.macro.params.reference)) 8379 - #getEntryObject($postDoc $postObj) 8380 - #if (~"$!postObj~" != '') 8381 - #extractLayoutParametersFromString($xcontext.macro.params.params $macroAdditionalParams) 8382 - ## 8383 - #set ($displayTitle = true) 8384 - #if (~"$!macroAdditionalParams.get('displayTitle')~" == 'false') 8385 - #set ($displayTitle = false) 8386 - #end 8387 - ## 8388 - #set ($displayTitleFirstOnPinnedPosts = false) 8389 - #if (~"$!macroAdditionalParams.get('displayTitleFirstOnPinnedPosts')~" == 'true') 8390 - #set ($displayTitleFirstOnPinnedPosts = true) 8391 - #end 8392 - ## 8393 - #set ($displaySummaryOnPinnedPosts = true) 8394 - #if (~"$!macroAdditionalParams.get('displaySummaryOnPinnedPosts')~" == 'false') 8395 - #set ($displaySummaryOnPinnedPosts = false) 8396 - #end 8397 - ## 8398 - #set ($postIndex = $numbertool.toNumber($macroAdditionalParams.get('postIndex')).intValue()) 8399 - #if ($postIndex == 0) 8400 - #set ($stopBlogPostsDisplay = false) 8401 - #end 8402 - #set ($listResultsCount = $numbertool.toNumber($macroAdditionalParams.get('list-results-count')).intValue()) 8403 - #set($discard = $xwiki.ssx.use('Blog.BlogPostLayoutCards')) 8404 - #set($scaleWidth = 600) 8405 - #set($imgQs=~"width=$scaleWidth~") 8406 - ## Display pinned posts 8407 - ## Get the list of pinned posts 8408 - #set ($pinnedPosts = []) 8409 - #set ($pinnedPostsSourceDoc = $NULL) 8410 - #if (~"$!macroAdditionalParams.get('forceDisplayPinnedPosts')~" == 'true' && ~"$!macroAdditionalParams.get('list-blog')~" != '') 8411 - #set ($pinnedPostsSourceDoc = $xwiki.getDocument($macroAdditionalParams.get('list-blog'))) 8412 - ## Note that the 'list-blog' parameter contains the value of the 'blog' parameter of the blogpostlist macro passed to the current layout macro 8413 - #end 8414 - #if (~"$!pinnedPostsSourceDoc~" != '') 8415 - #set ($pinnedPostsObj = $pinnedPostsSourceDoc.getObject('Blog.PinnedPostsClass')) 8416 - #if (~"$!pinnedPostsObj~" != '') 8417 - #set ($orderedPinnedPostsJSON = $pinnedPostsObj.getProperty('orderedPosts').value) 8418 - #if (~"$!orderedPinnedPostsJSON~" != '') 8419 - #set ($pinnedPosts = $jsontool.parse($orderedPinnedPostsJSON)) 8420 - #else 8421 - #set ($pinnedPosts = $pinnedPostsObj.getProperty('posts').value) 8422 - #end 8423 - #end 8424 - #if ($postIndex == 0 && $pinnedPosts.size() > 0) 8425 - \{\{html clean=~"false~"}} 8426 - #set ($x = 0) 8427 - #set ($showPinnedPostsButton = true) 8428 - #foreach ($pinnedPost in $pinnedPosts) 8429 - #if ($x == 0) 8430 - <div class=~"row flex-container~"> 8431 - #if ($showPinnedPostsButton) 8432 - #displayEditPinnedPostsButton() 8433 - #set($showPinnedPostsButton = false) 8434 - #end 8435 - #end 8436 - #set ($pinnedPostDoc = $xwiki.getDocument($pinnedPost)) 8437 - #getEntryObject($pinnedPostDoc $pinnedPostObj) 8438 - #if (~"$!pinnedPostObj~" != '') 8439 - #displayPinnedPost($pinnedPostDoc $pinnedPostObj) 8440 - #end 8441 - #set ($x = $mathtool.add($x, 1)) 8442 - #if ($x == 3) 8443 - #set ($x = 0) 8444 - </div> 8445 - #end 8446 - #end 8447 - #if ($mathtool.mod($x, 3) != 0) 8448 - </div> 8449 - #end 8450 - \{\{/html}} 8451 - 8452 - ## If the first post is a pinned post : this means that all the posts are pinned 8453 - ## In this case, avoid displaying the posts again after the pinned posts section. 8454 - #if ($pinnedPosts.contains($xcontext.macro.params.reference)) 8455 - #set ($stopBlogPostsDisplay = true) 8456 - #end 8457 - #elseif($postIndex == 0 && $pinnedPosts.size() == 0) 8458 - 8459 - \{\{html}} 8460 - <div class=~"row no-pinnded-posts~"> 8461 - #displayEditPinnedPostsButton() 8462 - </div> 8463 - \{\{/html}} 8464 - 8465 - #end 8466 - #end 8467 - #if (!$stopBlogPostsDisplay) 8468 - \{\{html clean=~"false~"}} 8469 - #if (~"$!nbDisplayedPosts~" == '' || $postIndex == 0) 8470 - #set ($nbDisplayedPosts = 0) 8471 - #end 8472 - #if($mathtool.mod($nbDisplayedPosts, 2) == 0) 8473 - #if ($nbDisplayedPosts != 0) 8474 - </div> 8475 - #set ($lastHtmlTag = 'c') 8476 - #end 8477 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 8478 - <div class=~"row~"> 8479 - #set ($lastHtmlTag = 'o') 8480 - #set ($lastRowClass = ~"~") 8481 - #else 8482 - <div class=~"row flex-container~"> 8483 - #set ($lastHtmlTag = 'o') 8484 - #set ($lastRowClass = ~"flex~") 8485 - #end 8486 - #end 8487 - #displaySmallPost($postDoc $postObj) 8488 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 8489 - </div> 8490 - #set ($lastHtmlTag = 'c') 8491 - #end 8492 - #set ($nbDisplayedPosts = $mathtool.add($nbDisplayedPosts, 1)) 8493 - #if ($postIndex == $mathtool.sub($listResultsCount, 1)) 8494 - #if (~"$!lastHtmlTag~" == 'o') 8495 - #if ($mathtool.mod($nbDisplayedPosts, 2) == 1 && $lastRowClass == ~"flex~") 8496 - <div class=~"col-xs-12 col-sm-6~"></div> 8497 - #end 8498 - </div> 8499 - #end 8500 - #end 8501 - \{\{/html}} 8502 - #end 8503 - #else 8504 - \{\{error}}$services.localization.render('blog.blogpostlayout.notpost', [$xcontext.macro.params.reference])\{\{/error}} 8505 - #end 8506 - #else 8507 - \{\{error}}$services.localization.render('blog.blogpostlayout.post_view_not_allowed', [$xcontext.macro.params.reference])\{\{/error}} 8508 - #end" class="macro hidden macro-placeholder" %)macro:velocity(% data-macro="startmacro:html|-|clean=~"false~"|-|</div> 8509 -<div class=~"row flex-container~"> 8510 -<div class=~"col-xs-12 col-sm-6 next_blog~"> 8511 -<a href=~"/Nieuws/Feestelijke%20afsluiting%2C%20keuring%20materieel%20en%20tellen%20voorraden~" class=~"thumbnail~"> 8512 -<div class=~"row~"> 8513 -<div class=~"col-xs-4~"> 8514 -<img src=~"/download/Nieuws/Feestelijke%20afsluiting%2C%20keuring%20materieel%20en%20tellen%20voorraden/OIP.jpg?width=600&rev=1.1~" /> 8515 -</div> 8516 -<div class=~"col-xs-8 art_det~"> 8517 -<p class=~"text-left~"> 8518 -Feestelijke afsluiting, keuring materieel en tellen voorraden <br/><span class=~"date_info~"> Dec 14, 2023, </span> 8519 -</p> 8520 -<div class=~"row post-details~"> 8521 -<div class=~"col-xs-8 detail~"> 8522 -<div class=~"post-likes btn btn-default disabled badge~" 8523 -title=~"Number of likes on this page: 1~"> 8524 -<span class=~"fa fa-heart~"></span> <span class=~"like-number~">1</span> 8525 -</div> 8526 -</div> 8527 -<div class=~"col-xs-4 com_det~"> 8528 -<p class=~"text-right~"><span class=~"fa fa-comments~"></span> (0)</p> 8529 -</div> 8530 -</div> 8531 -</div> 8532 -</div> 8533 -</a> 8534 -</div>" class="macro macro hidden macro-placeholder" %)macro:html 8535 -))) 8536 -))) 8537 - 8538 -(% class="row flex-container" %) 8539 -((( 8540 -(% class="col-xs-12 col-sm-6 next_blog" %) 8541 -((( 8542 -(% class="row" %) 8543 -((( 8544 -(% class="col-xs-4" %) 8545 -((( 8546 -[[~[~[image:/download/Nieuws/Feestelijke%20afsluiting%2C%20keuring%20materieel%20en%20tellen%20voorraden/OIP.jpg?width=600&rev=1.1~]~]>>path:/Nieuws/Feestelijke%20afsluiting%2C%20keuring%20materieel%20en%20tellen%20voorraden||class="thumbnail"]] 8547 -))) 8548 - 8549 -(% class="col-xs-8 art_det" %) 8550 -((( 8551 -(% class="text-left" %) 8552 -[[Feestelijke afsluiting, keuring materieel en tellen voorraden 8553 -(% class="date_info" %) Dec 14, 2023,>>path:/Nieuws/Feestelijke%20afsluiting%2C%20keuring%20materieel%20en%20tellen%20voorraden||class="thumbnail"]] 8554 - 8555 -(% class="row post-details" %) 8556 -((( 8557 -(% class="col-xs-8 detail" %) 8558 -((( 8559 -(% class="post-likes btn btn-default disabled badge" title="Number of likes on this page: 1" %) 8560 -((( 8561 -[[(% class="like-number" %)1>>path:/Nieuws/Feestelijke%20afsluiting%2C%20keuring%20materieel%20en%20tellen%20voorraden||class="thumbnail"]] 8562 -))) 8563 -))) 8564 - 8565 -(% class="col-xs-4 com_det" %) 8566 -((( 8567 -(% class="text-right" %) 8568 -[[(0)>>path:/Nieuws/Feestelijke%20afsluiting%2C%20keuring%20materieel%20en%20tellen%20voorraden||class="thumbnail"]] 8569 -))) 8570 -))) 8571 -))) 8572 -))) 8573 -))) 8574 - 8575 -(% class="macro" data-macro="startmacro:blogPostLayoutCards|-|reference=~"Nieuws.RI&E 2023~" params=~"displayTitle=true|useSummary=true|list-limit=10|list-layout=cards|list-blog=Nieuws.WebHome|list-paginated=no|list-results-count=10|postIndex=0|previousPostReference=|postIndex=1|previousPostReference=Nieuws.Nieuwsbrief januari 2024|postIndex=2|previousPostReference=Nieuws.Audit BMI en BORG|postIndex=3|previousPostReference=Nieuws.Nieuwsbrief december 2023|postIndex=4|previousPostReference=Nieuws.Nieuwsbrief november 2023|postIndex=5|previousPostReference=Nieuws.Feestelijke afsluiting, keuring materieel en tellen voorraden~"" %) 8576 -((( 8577 -(% class="macro-placeholder hidden" %) 8578 -((( 8579 -macro:blogPostLayoutCards 8580 -))) 8581 - 8582 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogCode~"" %) 8583 -((( 8584 -(% class="macro-placeholder hidden" %) 8585 -((( 8586 -macro:include 8587 -))) 8588 - 8589 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogParameters~"" %) 8590 -((( 8591 -(% class="macro-placeholder hidden" %) 8592 -((( 8593 -macro:include 8594 -))) 8595 - 8596 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## Blog 8597 -#set($blogClassname = 'Blog.BlogClass') 8598 -#set($blogTemplate = 'Blog.BlogTemplate') 8599 -#set($blogSheet = 'Blog.BlogSheet') 8600 -## Blog entries 8601 -#set($blogPostClassname = 'Blog.BlogPostClass') 8602 -#set($blogPostTemplate = 'Blog.BlogPostTemplate') 8603 -#set($blogPostSheet = 'Blog.BlogPostSheet') 8604 -#set($blogPostObjectNumber = $xwiki.getDocument($blogPostTemplate).getObject($blogPostClassname).number) 8605 -#set($oldArticleClassname = 'XWiki.ArticleClass') 8606 -## Categories 8607 -#set($blogCategoryClassname = 'Blog.CategoryClass') 8608 -#set($blogCategoryTemplate = 'Blog.CategoryTemplate') 8609 -#set($blogCategorySheet = 'Blog.CategorySheet') 8610 -#set($blogCategoriesSheet = 'Blog.CategoriesSheet') 8611 -#set($oldBlogCategoryClassname = 'Blog.Categories') 8612 -#set($defaultCategoryParent = 'Blog.Categories') 8613 -## Style 8614 -#set($blogStyleDocumentName = 'Blog.BlogStyle') 8615 -#set($blogStyleDocument = $xwiki.getDocument($blogStyleDocumentName)) 8616 -## Clientside scripts 8617 -#set($blogScriptsDocumentName = 'Blog.BlogScripts') 8618 -#set($blogPublisher = $xwiki.getDocument('Blog.Publisher')) 8619 -## Misc 8620 -#set($thisURL = $doc.getURL($xcontext.action, $request.queryString)) 8621 -#set($isBlogPost = $doc.getObject($blogPostClassname)) 8622 -#set($defaultBlogSpace = 'Blog') 8623 -#set($isCategoryPage = $doc.getObject($blogCategoryClassname)) 8624 -#set($isCategoriesHomePage = $doc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 8625 -## 8626 -## 8627 -## 8628 -#** 8629 - * Displays an image, taken from the blog style document. 8630 - * 8631 - * @param $imgName The name of the icon from icons set to use. 8632 - *# 8633 -#macro(toolImage $imgName)(% class=~"icon-manage~"~%)$services.icon.render($imgName)(%~%)#end" %) 8634 -((( 8635 -(% class="macro-placeholder hidden" %) 8636 -((( 8637 -macro:velocity 8638 -))) 8639 -))) 8640 -))) 8641 - 8642 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## 8643 -## 8644 -## 8645 -## Import the blog skin and javascripts. 8646 -$!xwiki.ssx.use($blogStyleDocumentName)## 8647 -$!xwiki.jsx.use($blogScriptsDocumentName)## 8648 -## 8649 -## import the hierarchy for the path the blog post footer (in displayEntryBlogLocation) 8650 -#template('hierarchy_macros.vm')## 8651 -## 8652 -## 8653 -#** 8654 - * Prints a blog. This is the main macro used in the BlogSheet. 8655 - * 8656 - * @param blogDoc the XDocument holding the blog definition object. 8657 - *### 8658 -#macro(printBlog $blogDoc) 8659 - \{\{include reference='Blog.CreatePost'/}} 8660 - 8661 - ## Use the blogPostList macro to display the blogposts 8662 - ## The blogPostList is used only in case of 'all' or 'paged' blog display type because the blogPostList macro 8663 - ## do not support FTM the monthly and weekly blog display types 8664 - #getBlogDisplayType($blogDoc $displayType) 8665 - #if ($displayType == 'weekly' || $displayType == 'monthly') 8666 - #getBlogEntries($blogDoc $entries) 8667 - #displayBlog($entries 'index' true true) 8668 - #displayNavigationLinks($blogDoc) 8669 - #else 8670 - #getBlogDisplayType($blogDoc $displayType) 8671 - #set ($paginated = 'no') 8672 - #if ($displayType == 'paginated') 8673 - #set ($paginated = 'yes') 8674 - #end 8675 - #getBlogPostsLayout($blogDoc $postsLayout) 8676 - (% class=~"hfeed index~" ~%)(((\{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$paginated~" layout=~"$!postsLayout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" /}}))) 8677 - #end 8678 -#end 8679 -## 8680 -## 8681 -## 8682 -#** 8683 - * Shows blog information. In view mode, the description is printed. In edit mode, allows changing blog settings: title, 8684 - * description, blog type (global or in-space), index display type (fixed size pagination, weekly index, monthly index, 8685 - * all entries). 8686 - * 8687 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 8688 - *### 8689 -#macro(showBlogInfo $blogDoc) 8690 - #if($blogDoc.getObject($blogClassname)) 8691 - ## Keep testing for inline action for backward compatibility with older blogs. 8692 - #if($xcontext.action == 'edit' || $xcontext.action == 'inline') 8693 - #macro(displayProperty $blogDoc $propname) 8694 - ; #displayPropName($xwiki.getClass($blogClassname).get($propname)): 8695 - : $blogDoc.display($propname) 8696 - #end 8697 - #displayProperty($blogDoc 'title') 8698 - #displayProperty($blogDoc 'description') 8699 - #displayProperty($blogDoc 'displayType') 8700 - #displayProperty($blogDoc 'itemsPerPage') 8701 - #displayProperty($blogDoc 'postsLayout') 8702 - #displayProperty($blogDoc 'postsLayoutParameters') 8703 - #else 8704 - $blogDoc.display('description') 8705 - #end 8706 - #elseif($doc.fullName == $blogSheet) 8707 -= $services.localization.render('blog.code.blogsheet') = 8708 - \{\{translation key='blog.code.sheetexplanation'/}} 8709 - #else 8710 - \{\{warning}}\{\{translation key='blog.code.notblog'/}}\{\{/warning}} 8711 - #end 8712 -#end 8713 -## 8714 -## 8715 -## 8716 -#** 8717 - * Retrieve the blog document, which usually is either <tt><Space>.WebHome</tt> for whole-spaces blogs, or 8718 - * <tt><Space>.Blog</tt> for in-space blogs. If none of these documents contains a blog object, then the first 8719 - * (alphabetically) document in the target space that contains one is returned. Finally, if no document in the current 8720 - * space contains a blog object, then <tt>Blog.WebHome</tt> is returned as the default blog. 8721 - * 8722 - * @param space A <tt>String</tt>, the name of the space where to search. 8723 - * @param blogDoc The resulting XDocument. 8724 - *### 8725 -#macro(getBlogDocument $space $blogDoc) 8726 - #set ($result = $NULL) 8727 - ## Check if the current space has a WebPreferences page that contains a Blog.EnablePanelsConfigurationClass object. 8728 - ## It is possible to display a blog's panels info in a page that is not inside a blog and in that case we need to 8729 - ## identify the right blog based on a configuration object in a WebPreferences page. 8730 - #set ($spaceReference = $services.model.resolveSpace($space)) 8731 - #set ($preferencesDocRef = $services.model.createDocumentReference('WebPreferences', $spaceReference)) 8732 - #set ($preferencesDoc = $xwiki.getDocument($preferencesDocRef)) 8733 - #set ($preferencesObj = $preferencesDoc.getObject('Blog.EnablePanelsConfigurationClass')) 8734 - #if ($preferencesObj) 8735 - #set ($result = $xwiki.getDocument( $preferencesObj.getValue('blog'))) 8736 - #end 8737 - ## If no special case occurs (like the previous one), identify a blog by checking the current location from its hierarchy. 8738 - #if (~"$!result~" == '') 8739 - ## First, try the Space.WebHome, for a whole-space blog 8740 - #set($result = $xwiki.getDocument(~"$\{space}.WebHome~")) 8741 - #if(!$result.getObject($blogClassname)) 8742 - ## Second, try the Space.Blog document 8743 - #set($result = $xwiki.getDocument(~"$\{space}.Blog~")) 8744 - #if(!$result.getObject($blogClassname)) 8745 - ## Third, try searching for a blog document in the current space 8746 - ## Prevent the query fail when the space contains dots '.' 8747 - #set($blogDocs = $services.query.hql(~", BaseObject obj where doc.space = :space and obj.name = doc.fullName and obj.className = '$blogClassname' order by doc.name~").setLimit(1).setOffset(0).bindValue('space', $space).execute()) 8748 - #if($blogDocs.size() > 0) 8749 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 8750 - #else 8751 - ## Fourth, try searching for a blog document that have the its 'postsLocation' set to the current space 8752 - #set($blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as postsLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=postsLocationProp.id.id and postsLocationProp.id.name='postsLocation' and postsLocationProp.value=:postsLocation order by doc.name~").setLimit(1).setOffset(0).bindValue('postsLocation', $space).execute()) 8753 - #if($blogDocs.size() > 0) 8754 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 8755 - #else 8756 - ## Last, fallback to Blog.WebHome, the default blog 8757 - #set($result = $xwiki.getDocument('Blog.WebHome')) 8758 - #end 8759 - #end 8760 - #end 8761 - #end 8762 - #end 8763 - #set ($blogDoc = $NULL) 8764 - #setVariable (~"$blogDoc~" $result) 8765 -#end 8766 -## 8767 -## 8768 -## 8769 -#** 8770 - * Retrieve the blog title. 8771 - * 8772 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass<tt> object with the <tt>title</tt> property set. 8773 - * @param title The resulting title. 8774 - *### 8775 -#macro(getBlogTitle $blogDoc $title) 8776 - ## Titles can contain velocity code (most commonly translations), so we should evaluate them. 8777 - #set ($title = $NULL) 8778 - #setVariable (~"$title~" $!blogDoc.displayTitle) 8779 -#end 8780 -## 8781 -## 8782 -## 8783 -#** 8784 - * Retrieve the blog description. 8785 - * 8786 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>description</tt> 8787 - * property set. 8788 - * @param description The resulting description. 8789 - *### 8790 -#macro(getBlogDescription $blogDoc $description) 8791 - #getBlogProperty($blogDoc 'description' '' $result) 8792 - #set ($description = $NULL) 8793 - #setVariable (~"$description~" $result) 8794 -#end 8795 -## 8796 -## 8797 -## 8798 -#** 8799 - * Retrieves a list of entries to be displayed. The entries are either part of the blog's space, or have the blog 8800 - * document set as a parent. The number and range of entries returned (from all those belonging to this blog) depends on 8801 - * the blog display type: paginated (fixed number of entries), weekly (all entries in a week), monthly (all entries in a 8802 - * month), or all. 8803 - * 8804 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 8805 - * @param entries The resulting list of entries to display, a list of XDocument names. 8806 - *### 8807 -#macro(getBlogEntries $blogDoc $entries) 8808 - #if (!$entries) 8809 - #setVariable (~"$entries~" []) 8810 - #end 8811 - #getAllBlogPostsQuery($query) 8812 - #isDefaultBlog($blogDoc $isDefault) 8813 - #set($queryParams = \{}) 8814 - #if ($isDefault) 8815 - #getCategoryAllBlogPostsQuery($query) 8816 - #set($query = ~"$\{query} and (doc.creator = :creator or (isPublished.value = 1 and hidden.value = 0)) and (doc.space = :space or catList like :catList escape '!')~") 8817 - #set($discard = $queryParams.put('creator', $xcontext.user)) 8818 - #set($discard = $queryParams.put('space', $blogDoc.space)) 8819 - #set($sanitizedBlogSpace = $blogDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 8820 - #set($discard = $queryParams.put('catList', $sanitizedBlogSpace)) 8821 - #else 8822 - #set($query = ~"$\{query} and (doc.space = :space or doc.parent = :parent)~") 8823 - #getBlogPostsLocation($blogDoc.space $blogPostsLocation) 8824 - #set($discard = $queryParams.put('space', $blogPostsLocation)) 8825 - #set($discard = $queryParams.put('parent', $blogDoc.space)) 8826 - #end 8827 - #getBlogDisplayType($blogDoc $displayType) 8828 - #if($displayType == 'weekly') 8829 - #getWeeklyBlogEntries($blogDoc $query $entries $queryParams) 8830 - #elseif($displayType == 'monthly') 8831 - #getMonthlyBlogEntries($blogDoc $query $entries $queryParams) 8832 - #elseif($displayType == 'all') 8833 - #getAllBlogEntries($blogDoc $query $entries $queryParams) 8834 - #else 8835 - #getPagedBlogEntries($blogDoc $query $entries $queryParams) 8836 - #end 8837 -#end 8838 -## 8839 -## 8840 -## 8841 -#** 8842 - * Retrieves a list of entries to be displayed. The entries are taken from a ~"page~" of the blog, a sequence of documents 8843 - * defined by the request parameters <tt>ipp</tt> (items per page) and <tt>page</tt> (the current page). Initially the 8844 - * first page is displayed, with the number of entries defined in the blog object in the <tt>itemsPerPage</tt> property 8845 - * (10 if not defined). 8846 - * 8847 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 8848 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 8849 - * refined to restrict to a given space, or to a given search criteria, etc. 8850 - * @param entries The resulting list of entries to display, a list of XDocument names. 8851 - * @param queryParams The parameters to bind with the query. 8852 - *### 8853 -#macro(getPagedBlogEntries $blogDoc $query $entries $queryParams) 8854 - #if (!$entries) 8855 - #setVariable (~"$entries~" []) 8856 - #end 8857 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 8858 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~")) 8859 - #bindQueryParameters($countQueryObj $queryParams) 8860 - #bindQueryParameters($queryObj $queryParams) 8861 - #set($totalEntries = $countQueryObj.count()) 8862 - #getBlogProperty($blogDoc 'itemsPerPage' '10' $defaultItemsPerPage) 8863 - #set($defaultItemsPerPage = $numbertool.toNumber($defaultItemsPerPage).intValue()) 8864 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 8865 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 8866 - #set($discard = $entries.addAll($queryObj.setLimit($itemsPerPage).setOffset($startAt).addFilter(~"unique~").execute())) 8867 -#end 8868 -## 8869 -## 8870 -## 8871 -#** 8872 - * Retrieves a list of entries to be displayed. The entries are taken from a week of the blog. The target week is 8873 - * defined by the request parameters <tt>week</tt> (the week number in the year, from 1 to 52) and <tt>year</tt> (4 8874 - * digit year). Initially the current week is displayed. 8875 - * 8876 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 8877 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 8878 - * refined to restrict to a given space, or to a given search criteria, etc. 8879 - * @param entries The resulting list of entries to display, a list of XDocument names. 8880 - * @param queryParams The parameters to bind with the query. 8881 - *### 8882 -#macro(getWeeklyBlogEntries $blogDoc $query $entries $queryParams) 8883 - #if (!$entries) 8884 - #setVariable (~"$entries~" []) 8885 - #end 8886 - #getRequestedWeek($weekDate) 8887 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 8888 - #set($minDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundFloor())) 8889 - #set($maxDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundCeiling())) 8890 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 8891 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 8892 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 8893 - #bindQueryParameters($countQueryObj $queryParams) 8894 - #bindQueryParameters($queryObj $queryParams) 8895 - #set($totalEntries = $countQueryObj.count()) 8896 - #set($discard = $entries.addAll($queryObj.execute())) 8897 -#end 8898 -## 8899 -## 8900 -## 8901 -#** 8902 - * Retrieves a list of entries to be displayed. The entries are taken from a month of the blog. The target month is 8903 - * defined by the request parameters <tt>month</tt> (the month number, from 1 to 12) and <tt>year</tt> (4 8904 - * digit year). Initially the current month is displayed. 8905 - * 8906 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 8907 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 8908 - * refined to restrict to a given space, or to a given search criteria, etc. 8909 - * @param entries The resulting list of entries to display, a list of XDocument names. 8910 - * @param queryParams The parameters to bind with the query. 8911 - *### 8912 -#macro(getMonthlyBlogEntries $blogDoc $query $entries) 8913 - #if (!$entries) 8914 - #setVariable (~"$entries~" []) 8915 - #end 8916 - #getRequestedMonth($monthDate) 8917 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 8918 - #set($minDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundFloor())) 8919 - #set($maxDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundCeiling())) 8920 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 8921 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 8922 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 8923 - #bindQueryParameters($countQueryObj $queryParams) 8924 - #bindQueryParameters($queryObj $queryParams) 8925 - #set($totalEntries = $countQueryObj.count()) 8926 - #set($discard = $entries.addAll($queryObj.execute())) 8927 -#end 8928 -## 8929 -## 8930 -## 8931 -#** 8932 - * Retrieves a list of entries to be displayed. All entries belonging to the current blog are returned. 8933 - * 8934 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 8935 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 8936 - * refined to restrict to a given space, or to a given search criteria, etc. 8937 - * @param entries The resulting list of entries to display, a list of XDocument names. 8938 - * @param queryParams The parameters to bind with the query. 8939 - *### 8940 -#macro(getAllBlogEntries $blogDoc $query $entries $queryParams) 8941 - #if (!$entries) 8942 - #setVariable (~"$entries~" []) 8943 - #end 8944 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 8945 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 8946 - #bindQueryParameters($countQueryObj $queryParams) 8947 - #bindQueryParameters($queryObj $queryParams) 8948 - #set($totalEntries = $countQueryObj.count()) 8949 - #set($discard = $entries.addAll($queryObj.execute())) 8950 -#end 8951 -## 8952 -## 8953 -## 8954 -#** 8955 - * Retrieves a list of entries to be displayed. Only (and all) unpublished entries are returned. 8956 - * 8957 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 8958 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 8959 - * refined to restrict to a given space, or to a given search criteria, etc. 8960 - * @param queryParams The parameters to bind with the query. 8961 - * @param entries The resulting list of entries to display, a list of XDocument names. 8962 - *### 8963 -#macro(getUnpublishedBlogEntries $blogDoc $query $queryParams $entries) 8964 - #if (!$entries) 8965 - #setVariable (~"$entries~" []) 8966 - #end 8967 - #set($query = ~"$\{query} and isPublished.value = 0~") 8968 - #set ($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 8969 - #set ($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 8970 - #bindQueryParameters($countQueryObj $queryParams) 8971 - #bindQueryParameters($queryObj $queryParams) 8972 - #set($totalEntries = $countQueryObj.count()) 8973 - #set($discard = $entries.addAll($queryObj.execute())) 8974 -#end 8975 -## 8976 -## 8977 -## 8978 -#** 8979 - * Retrieves a list of entries to be displayed. The entries are taken from all the wiki, and not from a specific blog. 8980 - * 8981 - * @param entries The resulting list of entries to display, a list of XDocument names. 8982 - *### 8983 -#macro(getGlobalBlogEntries $entries) 8984 - #if (!$entries) 8985 - #setVariable (~"$entries~" []) 8986 - #end 8987 - #getAllBlogPostsQuery($query) 8988 - #set($totalEntries = $services.query.hql($query).count()) 8989 - #set($defaultItemsPerPage = 20) 8990 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 8991 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 8992 - #set($discard = $entries.addAll($services.query.hql(~"$\{query} order by publishDate.value desc~").setLimit($itemsPerPage).setOffset($startAt).execute())) 8993 -#end 8994 -#** 8995 - * Return the base query for selecting blog entries. It filters only visible entries, but does not bind to a specific 8996 - * blog, nor specify a range or an ordering criteria. 8997 - * 8998 - * This macro is a duplicate of #getAllBlogPostsQuery($query). Keep it in case it's used outside, in custom code. 8999 - * 9000 - * @param query The basic query for selecting blog entries. 9001 - *# 9002 -#macro(getBlogEntriesBaseQuery $query) 9003 - #getAllBlogPostsQuery($query) 9004 -#end 9005 -#** 9006 - * Return the Query for selecting the all wiki blog posts without filtering 9007 - * 9008 - * @param query The basic query for selecting blog entries. 9009 - *# 9010 -#macro(getAllBlogPostsQuery $query) 9011 - #set ($query = $NULL) 9012 - #setVariable(~"$query~" ~", BaseObject as obj, IntegerProperty isPublished, 9013 - IntegerProperty hidden, DateProperty publishDate 9014 - where doc.fullName <> '$blogPostTemplate' and 9015 - obj.name=doc.fullName and obj.className='$blogPostClassname' and 9016 - isPublished.id.id = obj.id and isPublished.id.name = 'published' and 9017 - hidden.id.id = obj.id and hidden.id.name='hidden' and 9018 - publishDate.id.id = obj.id and publishDate.id.name='publishDate' and 9019 - (doc.creator = '$escapetool.sql($xcontext.user)' or (isPublished.value = 1 and hidden.value = 0))~") 9020 -#end 9021 -## 9022 -## 9023 -## 9024 -###** 9025 - * Return the Query for selecting the all wiki blog posts with categories filtering 9026 - * 9027 - * @param query The basic query for selecting blog entries. 9028 - *### 9029 -#macro(getCategoryAllBlogPostsQuery $query) 9030 - #set ($query = $NULL) 9031 - #getAllBlogPostsQuery($baseQuery) 9032 - #set ($baseQuery = $baseQuery.replace('DateProperty publishDate', 'DateProperty publishDate, DBStringListProperty as category left join category.list catList')) 9033 - #setVariable(~"$query~" ~"$\{baseQuery} and obj.id=category.id.id and category.id.name='category'~") 9034 -#end 9035 -## 9036 -## 9037 -## 9038 -#** 9039 - * Determines how is the blog index split into pages: paginated (fixed number of entries), weekly (all entries in a 9040 - * week), monthly (all entries in a month), or all. 9041 - * 9042 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>displayType</tt> 9043 - * property set. 9044 - * @param displayType The resulting string. If the blog object does not define anything, it is considered paginated. 9045 - *### 9046 -#macro(getBlogDisplayType $blogDoc $displayType) 9047 - #getBlogProperty($blogDoc 'displayType' 'paginated' $result) 9048 - #set ($displayType = $NULL) 9049 - #setVariable (~"$displayType~" $result) 9050 -#end 9051 -## 9052 -## 9053 -## 9054 -#** 9055 - * Displays a list of entries. 9056 - * 9057 - * @param entries The entries to display, a list of XDocument names. 9058 - * @param displaying What exactly is displayed: blog index, a single blog entry, a blog category, search results, 9059 - * unpublished entries, etc. This will be used as the classname(s) for the container div (hfeed). Currently 9060 - * used values: index, single, category, search, unpublished, hidden. 9061 - * @param onlyExtract If <tt>true</tt>, only display the extract of articles where available, otherwise display the full content. 9062 - * @param shouldDisplayTitles If <tt>true</tt>, display the blog title (blog posts shouldn't display the title when they're 9063 - * displayed alone on their page since it's the page title which is used in this case) 9064 - *### 9065 -#macro(displayBlog $entries $displaying $onlyExtract $shouldDisplayTitles) 9066 - #set($blogDay = '') 9067 - (% class=~"hfeed $!\{displaying}~" ~%)((( 9068 - (% class=~"blogDay~" ~%)((( 9069 - #foreach ($entryDoc in $xwiki.wrapDocs($entries)) 9070 - #getEntryObject($entryDoc $entryObj) 9071 - ## Although all entries should have one of the two objects, better check to be sure. 9072 - #if(~"$!\{entryObj}~" != '') 9073 - #getEntryDate($entryDoc $entryObj $entryDate) 9074 - ## Display a ~"calendar sheet~" for each day. All entries posted on the same day share one such sheet. 9075 - #set($entryDateStr = $xwiki.formatDate($entryDate, 'yyyyMMMMdd')) 9076 - #if($blogDay != $entryDateStr) 9077 - #if($blogDay != '') 9078 - ))) 9079 - (% class=~"blogDay~" ~%)((( 9080 - #end 9081 - #displayBlogDate($entryDate) 9082 - #set ($blogDay = $entryDateStr) 9083 - #end 9084 - ## Finally, display the entry. 9085 - #displayEntry($entryDoc $entryObj $onlyExtract $shouldDisplayTitles true) 9086 - #end 9087 - #end 9088 - )))## blogDay 9089 - )))## hfeed 9090 -#end 9091 -## 9092 -## 9093 -## 9094 -#** 9095 - * Get the entry object, either a new BlogPost or an old Article. 9096 - * 9097 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 9098 - * @param entryObj The resulting xobject of the blog post. 9099 - *### 9100 -#macro(getEntryObject $entryDoc $__entryObj) 9101 - #set($result = $entryDoc.getObject(~"$\{blogPostClassname}~")) 9102 - #if(!$result) 9103 - #set($result = $entryDoc.getObject(~"$\{oldArticleClassname}~")) 9104 - #end 9105 - ## NOTE: The reason we put an underscore in front of the variable name is to prevent the following line from 9106 - ## overwriting the $entryObj variable that may be defined before this macro is called. Of course, $__entryObj may be 9107 - ## overwritten in this case but it's less likely to have such a variable defined before. 9108 - #set ($__entryObj = $NULL) 9109 - #setVariable (~"$__entryObj~" $result) 9110 -#end 9111 -## 9112 -## 9113 -## 9114 -#** 9115 - * Gets the date associated with a blog entry. This is the publication date. For unpublished entries, initially this is 9116 - * the document creation date, but can be edited by the user. 9117 - * 9118 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 9119 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 9120 - * @param result The resulting date, an instance of <tt>java.util.Date</tt>. 9121 - *### 9122 -#macro(getEntryDate $entryDoc $entryObj $result) 9123 - #set ($result = $NULL) 9124 - #setVariable (~"$result~" $entryObj.getProperty('publishDate').value) 9125 -#end 9126 -## 9127 -## 9128 -## 9129 -#** 9130 - * Displays a date, nicely formatted as a calendar page. 9131 - * 9132 - * @param date The date to display, an instance of <tt>java.util.Date</tt>. 9133 - *### 9134 -#macro(displayBlogDate $date) 9135 - #set($year = $xwiki.formatDate($date, 'yyyy')) 9136 - ## 3 letter month name, like Jan, Dec. 9137 - #set($month = $xwiki.formatDate($date, 'MMM')) 9138 - ## Uncomment to get a full length month name, like January, December. 9139 - ## TODO: this could be defined somewhere in the blog style. 9140 - ## #set($month = $xwiki.formatDate($date, 'MMMM')) 9141 - #set($day = $xwiki.formatDate($date, 'dd')) 9142 - (% class=~"blogdate~" ~%) 9143 - == (% class=~"month~" ~%)$month(%~%) (% class=~"day~" ~%)$day(%~%) (% class=~"year~" ~%)$year(%~%) == 9144 -#end 9145 -## 9146 -## 9147 -## 9148 -#** 9149 - * Displays a blog article: management tools, header, content, footer. 9150 - * 9151 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 9152 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 9153 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 9154 - * @param shouldDisplayTitle If <tt>true</tt>, display the blog title (blog posts shouldn't display the title 9155 - * when they're displayed alone on their page since it's the page title which is used in this case) 9156 - * @param shouldDisplayActions If <tt>true</tt>, display the blog post actions buttons 9157 - *### 9158 -#macro(displayEntry $entryDoc $entryObj $onlyExtract $shouldDisplayTitle $shouldDisplayActions) 9159 - ## Only articles with an explicit hidden setting or an explicit unpublished setting are hidden 9160 - #isPublished($entryObj $isPublished) 9161 - #isHidden($entryObj $isHidden) 9162 - #if($doc.fullName == $entryDoc.fullName) 9163 - (% class=~"hentry single-article~" ~%)((( 9164 - #else 9165 - (% class=~"hentry#if(!$isPublished) unpublished-article#elseif($isHidden) hidden-article#end~" ~%)((( 9166 - #end 9167 - #if ($shouldDisplayActions) 9168 - #displayEntryTools($entryDoc $entryObj) 9169 - #end 9170 - #if($shouldDisplayTitle) 9171 - #displayEntryTitle($entryDoc $entryObj) 9172 - #end 9173 - #if($doc.fullName == $entryDoc.fullName) 9174 - #if(!$isPublished) 9175 - \{\{warning}}\{\{translation key='blog.code.published'/}}\{\{/warning}} 9176 - #elseif($isHidden) 9177 - \{\{warning}}\{\{translation key='blog.code.hidden'/}}\{\{/warning}} 9178 - #end 9179 - #end 9180 - #displayEntryContent($entryDoc $entryObj $onlyExtract) 9181 - #displayEntryFooter($entryDoc $entryObj) 9182 - )))## hentry 9183 -#end 9184 -## 9185 -## 9186 -## 9187 -#** 9188 - * Checks if the provided blog is published or not. 9189 - * 9190 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 9191 - * @param isPublished The resulting boolean, true if the entry is considered published. 9192 - *### 9193 -#macro(isPublished $entryObj $isPublished) 9194 - #set ($isPublished = $NULL) 9195 - ## This should work for both old articles, which don't have the 'published' property at all, and 9196 - ## are considered published by default, and new entries, that should have 1 if published. 9197 - #if (~"$!\{entryObj.getProperty('published').value}~" != '0') 9198 - #setVariable (~"$isPublished~" true) 9199 - #else 9200 - #setVariable (~"$isPublished~" false) 9201 - #end 9202 -#end 9203 -## 9204 -## 9205 -## 9206 -#** 9207 - * Checks if the provided blog is hidden or not. 9208 - * 9209 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass<tt> xclass. 9210 - * @param isHiddel The resulting boolean, true if the entry is considered hidden. 9211 - *### 9212 -#macro(isHidden $entryObj $isHidden) 9213 - #set ($isHidden = $NULL) 9214 - ## This should work for both old articles, which don't have the 'hidden' property at all, and 9215 - ## are considered visible by default, and new entries, that should have 1 if hidden. 9216 - #if (~"$!\{entryObj.getProperty('hidden').value}~" == '1') 9217 - #setVariable (~"$isHidden~" true) 9218 - #else 9219 - #setVariable (~"$isHidden~" false) 9220 - #end 9221 -#end 9222 -## 9223 -## 9224 -## 9225 -#** 9226 - * Displays several ~"tools~" for manipulating blog posts: hide/show, publish, edit. 9227 - * 9228 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 9229 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 9230 - *### 9231 -#macro(displayEntryTools $entryDoc $entryObj) 9232 - #if($xcontext.action == 'view') 9233 - (% class=~"blog-entry-toolbox~" ~%)((( 9234 - #displayPublishButton($entryDoc $entryObj) 9235 - #displayHideShowButton($entryDoc $entryObj) 9236 - #displayEditButton($entryDoc $entryObj) 9237 - #displayDeleteButton($entryDoc $entryObj) 9238 - ))) 9239 - #end 9240 -#end 9241 -## 9242 -## 9243 -## 9244 -#** 9245 - * Displays the publish button to the entry <strong>creator</strong>, if the article is not published yet. 9246 - * 9247 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 9248 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 9249 - * @todo AJAX calls. 9250 - *### 9251 -#macro(displayPublishButton $entryDoc $entryObj) 9252 - #isPublished($entryObj $isPublished) 9253 - #if(!$isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 9254 - [[#toolImage('world')>>path:$blogPublisher.getURL('view', ~"entryName=$\{escapetool.url($entryDoc.fullName)}&xredirect=$\{escapetool.url($thisURL)}&form_token=$!\{services.csrf.getToken()}~")||title=~"$services.localization.render('blog.code.notpublished')~"]]## 9255 - #end 9256 -#end 9257 -## 9258 -## 9259 -## 9260 -#** 9261 - * Displays the hide or show button to the entry <strong>creator</strong>, if the article is already published. 9262 - * 9263 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 9264 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 9265 - *### 9266 -#macro(displayHideShowButton $entryDoc $entryObj) 9267 - #isPublished($entryObj $isPublished) 9268 - #isHidden($entryObj $isHidden) 9269 - ## Only published articles can be hidden. Unpublished articles are considered already hidden. 9270 - #if($isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 9271 - #set ($queryString = \{ 9272 - 'xredirect' : $thisURL, 9273 - 'form_token' : $services.csrf.getToken() 9274 - }) 9275 - #if ($isHidden) 9276 - #set ($discard = $queryString.putAll(\{ 9277 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 0, 9278 - 'comment' : $services.localization.render('blog.code.madevisible') 9279 - })) 9280 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 9281 - [[#toolImage('unlock')>>path:$lockURL||class=~"blog-tool-show~" title=~"$services.localization.render('blog.code.makevisible')~"]]## 9282 - #else 9283 - #set ($discard = $queryString.putAll(\{ 9284 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 1, 9285 - 'comment' : $services.localization.render('blog.code.hid') 9286 - })) 9287 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 9288 - [[#toolImage('lock')>>path:$lockURL||class=~"blog-tool-hide~" title=~"$services.localization.render('blog.code.hide')~"]]## 9289 - #end 9290 - #end 9291 -#end 9292 -## 9293 -## 9294 -## 9295 -#** 9296 - * Displays the edit button to those that can edit the article. 9297 - * 9298 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 9299 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 9300 - *### 9301 -#macro(displayEditButton $entryDoc $entryObj) 9302 - #if($xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 9303 - ## Call getDefaultEditMode() for backward compatibility with older blog posts. 9304 - [[#toolImage('pencil')>>path:$entryDoc.getURL('edit')||title=~"$services.localization.render('blog.code.editpost')~"]]## 9305 - #end 9306 -#end 9307 -## 9308 -## 9309 -## 9310 -#** 9311 - * Displays the delete button to those that can edit the article. 9312 - * 9313 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 9314 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 9315 - * @todo AJAX calls. 9316 - *### 9317 -#macro(displayDeleteButton $entryDoc $entryObj) 9318 - #if($xwiki.hasAccessLevel('delete', $xcontext.user, $entryDoc.fullName)) 9319 - [[#toolImage('cross')>>path:$entryDoc.getURL('delete')||title=~"$services.localization.render('blog.code.deletepost')~"]]## 9320 - #end 9321 -#end 9322 -## 9323 -## 9324 -## 9325 -#** 9326 - * Displays the title of the entry. 9327 - * 9328 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 9329 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 9330 - *### 9331 -#macro(displayEntryTitle $entryDoc $entryObj) 9332 - #if($doc.fullName == $entryDoc.fullName) 9333 - (% class=~"entry-title~" ~%) 9334 - = $services.rendering.escape($entryDoc.display('title', 'view', $entryObj), $xwiki.getCurrentContentSyntaxId()) = 9335 - #else 9336 - (% class=~"entry-title~" ~%) 9337 - === [[$services.rendering.escape($entryDoc.display('title', 'view', $entryObj),$xwiki.getCurrentContentSyntaxId())>>doc:$services.rendering.escape($services.model.serialize($entryDoc.getDocumentReference(),'default'),$xwiki.getCurrentContentSyntaxId())]] === 9338 - #end 9339 -#end 9340 -## 9341 -## 9342 -## 9343 -#** 9344 - * Displays the body of the entry. 9345 - * 9346 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 9347 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 9348 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 9349 - *### 9350 -#macro(displayEntryContent $entryDoc $entryObj $onlyExtract) 9351 - (% class=~"#if($onlyExtract)entry-summary#\{else}entry-content#end~" ~%)((( 9352 - #getEntryContent($entryDoc $entryObj $onlyExtract $entryContent) 9353 - ## FIXME: This causes the blog's content to not be annotatable. See http://jira.xwiki.org/browse/XWIKI-6328 9354 - ## Should probably be replaced by a display macro call with a reference to the object property holding the post's content 9355 - \{\{html wiki=~"false~"}}$entryDoc.getRenderedContent($entryContent, $entryDoc.syntax.toIdString())\{\{/html}} 9356 - ))) ## entry-content 9357 - (% class=~"clearfloats~" ~%)((())) 9358 -#end 9359 -## 9360 -## 9361 -## 9362 -#** 9363 - * Extracts the body of the entry that should be displayed. If <tt>onlyExtract</tt> is <tt>true</tt>, display the content 9364 - * of the <tt>extract</tt> field (if not empty). 9365 - * 9366 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 9367 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 9368 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 9369 - * @param entryContent The resulting content. 9370 - * @param removeEllipsis If <tt>true</tt>, then don't display an ellipsis at the end of the content (only used when 9371 - * <tt>onlyExtract</tt> is <tt>true</tt>) 9372 - *### 9373 -#macro(getEntryContent $entryDoc $entryObj $onlyExtract $entryContent $removeEllipsis) 9374 - #if ($onlyExtract) 9375 - ## Note: We trim the summary so that if there's some white space it won't cause the summary to be used instead 9376 - ## of the content. 9377 - #set ($macro.result = $entryObj.getProperty('extract').value.trim()) 9378 - #end 9379 - #if(~"$!macro.result~" == '') 9380 - #set($macro.result = $entryObj.getProperty('content').value) 9381 -#* Disabled until the content can be cleanly cut. 9382 -* #if($onlyExtract && $result.length()>$maxchars) 9383 -* #set($i = $macro.result.lastIndexOf(~" ~", $maxchars)) 9384 -* #set($i = $i + 1) 9385 -* #set($macro.result = ~"$\{macro.result.substring(0,$i)} *[...>$\{entryDoc.fullName}]*~") 9386 -* #end 9387 -## *### 9388 - #elseif (!$removeEllipsis) 9389 - #if($entryDoc.syntax.toIdString() == 'xwiki/1.0') 9390 - #set($macro.result = ~"$\{macro.result} <a href='$\{entryDoc.getExternalURL()}' title='$services.localization.render('blog.code.readpost')'>...</a>~") 9391 - #elseif($entryDoc.syntax.toIdString() == 'xwiki/2.0' || $entryDoc.syntax.toIdString() == 'xwiki/2.1') 9392 - #set($macro.result = ~"$\{macro.result} [[...>>$\{services.rendering.escape($entryDoc.getFullName(), $entryDoc.getSyntax())}||title='$services.localization.render('blog.code.readpost')']]~") 9393 - #end 9394 - #end 9395 - #set ($entryContent = $NULL) 9396 - #setVariable (~"$entryContent~" $macro.result) 9397 -#end 9398 -## 9399 -## 9400 -## 9401 -#** 9402 - * Displays the footer of the entry. 9403 - * 9404 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 9405 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 9406 - *### 9407 -#macro(displayEntryFooter $entryDoc $entryObj) 9408 - (% class=~"entry-footer~" ~%)((( 9409 - #isPublished($entryObj $isPublished) 9410 - (% class='entry-author-label' ~%) 9411 - #if($isPublished) 9412 - \{\{translation key='blog.code.postedby'/}} ## 9413 - #else 9414 - \{\{translation key='blog.code.createdby'/}} ## 9415 - #end 9416 - \{\{html wiki=~"false~" clean=~"false~"}}<span class='author vcard'>#userfn($entryDoc.creator)</span>\{\{/html}} ## 9417 - #getEntryDate($entryDoc $entryObj $entryDate) 9418 - #listCategories($entryObj) #* 9419 - ## Since the publish date and update date are not set at the exact same time, there could be a small difference that 9420 - ## we assume cannot be more than 3 seconds. 9421 - *#(% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.permalink'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||rel=~"bookmark~"]] ## 9422 - #if ($showcomments) 9423 - (% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.comments'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||anchor=~"Comments~"]] (% class=~"itemCount~" ~%)($entryDoc.comments.size())(%~%) ## 9424 - #end ## 9425 - #if($entryDoc != $doc) ## 9426 - #displayEntryBlogLocation($entryDoc $entryObj) ## 9427 - #end 9428 - )))## entry-footer 9429 -#end 9430 -## 9431 -## 9432 -#** 9433 - * Display the blog for the entry (if it is not the currently displayed blog) 9434 - * 9435 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 9436 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 9437 - *### 9438 -#macro(displayEntryBlogLocation $entryDoc $entryObj) 9439 - #getBlogPostsLocation($entryDoc.getSpace() $blogPostsLocation) ## 9440 - #if(~"$!blogPostsLocation~" != ~"~") ## 9441 - #set($blogSpaceRef = $services.model.resolveSpace($blogPostsLocation)) ## 9442 - #set($blogDocRef = $services.model.createDocumentReference($services.model.getEntityReference('DOCUMENT', 'default').getName(), $blogSpaceRef)) ## 9443 - #if($doc.documentReference != $blogDocRef) ## 9444 - #set($blogDoc = $xwiki.getDocument($blogDocRef)) ## 9445 - #set($blogObj = $blogDoc.getObject('Blog.BlogClass')) ## 9446 - #if($blogObj) (% class=~"blogrefpath~" ~%)((( ## 9447 - $services.localization.render('blog.code.postedin') \{\{html clean=~"false~" wiki=~"false~"}} #hierarchy($blogDocRef, \{'selfIsActive' : true, 'local': true}) \{\{/html}} ## 9448 - )))(%~%)## 9449 - #end 9450 - #end 9451 - #end 9452 -#end 9453 -## 9454 -## 9455 -## 9456 -## 9457 -#** 9458 - * List the categories an entry belongs to. Used in the footer. The categories are instances of <tt>Blog.CategoryClass</tt>. 9459 - * 9460 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 9461 - *### 9462 -#macro(listCategories $entryObj) 9463 - #if($entryObj.getxWikiClass().getName() == $blogPostClassname) 9464 - #set($categories = $entryObj.getProperty('category').value) 9465 - #set($first = true) 9466 - #if($categories.size() > 0) 9467 - #foreach($category in $categories) 9468 - #set($categoryDoc = $!xwiki.getDocument($category)) 9469 - #if(!$categoryDoc.isNew() && $categoryDoc.getObject($\{blogCategoryClassname})) 9470 - #if($foreach.count == 1) 9471 - (% class='separator' ~%)·(%~%) $services.localization.render('blog.code.categories') ## 9472 - #else 9473 - , ## 9474 - #end## 9475 - [[$!\{categoryDoc.getObject($blogCategoryClassname).getValue('name')}>>$\{category}||rel='tag']]## 9476 - #end## 9477 - #end## 9478 - #end 9479 - #end 9480 -#end 9481 -## 9482 -## 9483 -## 9484 -#** 9485 - * Displays blog pagination links (older and newer entries). 9486 - * 9487 - * @param blogDoc the XDocument holding the blog definition object. 9488 - *### 9489 -#macro(displayNavigationLinks $blogDoc) 9490 - (% class=~"clearfloats~" ~%)((())) 9491 - #getBlogDisplayType($blogDoc $displayType) 9492 - #if($displayType == 'weekly') 9493 - (% class=~"pagingLinks~" ~%)((( 9494 - #getRequestedWeek($weekDate) 9495 - $weekDate.addWeeks(-1)## 9496 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousweek'/}}>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 9497 - #sep() 9498 - $weekDate.addWeeks(2)## 2 because we already subtracted 1 above 9499 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextweek'/}} »>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 9500 - ))) 9501 - #elseif($displayType == 'monthly') 9502 - (% class=~"pagingLinks~" ~%)((( 9503 - #getRequestedMonth($monthDate) 9504 - $monthDate.addMonths(-1)## 9505 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousmonth'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 9506 - #sep() 9507 - $monthDate.addMonths(2)## 2 because we already subtracted 1 above 9508 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextmonth'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 9509 - ))) 9510 - #elseif($displayType == 'all') 9511 - #else 9512 - ## Paginated 9513 - #if(($totalPages > 1)) 9514 - #set($queryString = '') 9515 - #foreach($p in $request.getParameterNames()) 9516 - #if($p != 'page' && $p != 'ipp') 9517 - #foreach($v in $request.getParameterValues($p)) 9518 - #set($queryString = ~"$\{queryString}&$\{escapetool.url($p)}=$\{escapetool.url($v)}~") 9519 - #end 9520 - #end 9521 - #end 9522 - (% class=~"pagingLinks~" ~%)((( 9523 - #if ($currentPageNumber < $totalPages) 9524 - #set($currentPageNumber = $currentPageNumber + 1) 9525 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.olderposts'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 9526 - #set($currentPageNumber = $currentPageNumber - 1) 9527 - #end 9528 - #if ($currentPageNumber > 1) 9529 - #if ($currentPageNumber < $totalPages) 9530 - #sep() 9531 - #end 9532 - #set($currentPageNumber = $currentPageNumber - 1) 9533 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.newerposts'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 9534 - #set($currentPageNumber = $currentPageNumber + 1) 9535 - #end 9536 - (% class=~"clear~" ~%)(%~%) 9537 - )))## pagingLinks 9538 - #end 9539 - #end 9540 -#end 9541 -## 9542 -## 9543 -## 9544 -#** 9545 - * Displays a message box with ~"publish~" icon. 9546 - * 9547 - * @param message A text message concerning blog article publishing 9548 - *### 9549 -#macro(publishMessageBox $message) 9550 -(% class=~"plainmessage publish-message~" ~%)((($services.icon.render('world') $message))) 9551 -#end 9552 -#** 9553 - * Displays a message box with ~"show/hide~" icon. 9554 - * 9555 - * @param message A text message concerning blog article hiding 9556 - *### 9557 -#macro(hideMessageBox $message) 9558 -(% class=~"plainmessage hide-message~" ~%)((($services.icon.render('unlock') $message))) 9559 -#end 9560 -## 9561 -## 9562 -## 9563 -#** 9564 - * Determine the requested week, for using in a weekly-indexed blog. The relevant request parameters are 9565 - * <tt>year</tt> and <tt>week</tt>. By default, the current week is used. 9566 - * 9567 - * @param monthDate The resulting week, a JODATime MutableDateTime. 9568 - *### 9569 -#macro(getRequestedWeek $weekDate) 9570 - #set ($weekDate = $NULL) 9571 - #setVariable (~"$weekDate~" $xwiki.jodatime.mutableDateTime) 9572 - #if(~"$!\{request.year}~" != '') 9573 - #set ($discard = $weekDate.setYear($numbertool.toNumber($request.year).intValue())) 9574 - #end 9575 - #if(~"$!\{request.week}~" != '') 9576 - #set ($discard = $weekDate.setWeekOfWeekyear($numbertool.toNumber($request.week).intValue())) 9577 - #end 9578 -#end 9579 -## 9580 -## 9581 -## 9582 -#** 9583 - * Determine the requested month, for using in a monthly-indexed blog. The relevant request parameters are 9584 - * <tt>year</tt> and <tt>month</tt>. By default, the current month is used. 9585 - * 9586 - * @param monthDate The resulting month, a JODATime MutableDateTime. 9587 - *### 9588 -#macro(getRequestedMonth $monthDate) 9589 - #set ($monthDate = $NULL) 9590 - #setVariable (~"$monthDate~" $xwiki.jodatime.mutableDateTime) 9591 - #if(~"$!\{request.year}~" != '') 9592 - #set ($discard = $monthDate.setYear($numbertool.toNumber($request.year).intValue())) 9593 - #end 9594 - #if(~"$!\{request.month}~" != '') 9595 - #set ($discard = $monthDate.setMonthOfYear($numbertool.toNumber($request.month).intValue())) 9596 - #end 9597 -#end 9598 -## 9599 -## 9600 -## 9601 -#** 9602 - * Retrieve a blog property (title, display type, etc). 9603 - * 9604 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 9605 - * @param propertyName The name of the property to be retrieved. One of the <tt>Blog.BlogClass</tt>'s properties. 9606 - * @param defaultValue The default value to use in case the blog object does not define one. 9607 - * @param propertyValue The resulting value. 9608 - *### 9609 -#macro(getBlogProperty $blogDoc $propertyName $defaultValue $propertyValue) 9610 - #set($result = ~"$!\{blogDoc.getObject($\{blogClassname}).getProperty($propertyName).value}~") 9611 - #if($result == '') 9612 - #set($result = $defaultValue) 9613 - #end 9614 - #set ($propertyValue = $NULL) 9615 - #setVariable (~"$propertyValue~" $result) 9616 -#end 9617 - 9618 -#** 9619 - * If an error occurs when executing an action, set a specific response status and display an error message. 9620 - * 9621 - * @param status The response status. 9622 - * @param text The user readable error to be displayed. Can be a translation key. 9623 - * @param parameters The parameters to use when decoding the translation key. 9624 - *### 9625 -#macro(blog__actionResponseError $status $text $parameters) 9626 - $response.setStatus($status) 9627 - #if($request.ajax) 9628 - $services.localization.render($text, $!parameters) 9629 - #else 9630 - \{\{error}}$services.localization.render($text, $!parameters)\{\{/error}} 9631 - #end 9632 -#end 9633 -## 9634 -## 9635 -## 9636 -#** 9637 - * Check if a blog is the Default blog (The one in the 'Blog' space). 9638 - * 9639 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 9640 - * @param isDefault The resulting boolean. 9641 - *### 9642 -#macro(isDefaultBlog $blogDoc $isDefault) 9643 - #set ($result = false) 9644 - #if ($blogDoc.space == 'Blog') 9645 - #set ($result = true) 9646 - #end 9647 - #setVariable(~"$isDefault~" $result) 9648 -#end 9649 -## 9650 -## 9651 -## 9652 -#** 9653 - * Retrieve the blog posts location (space). 9654 - * 9655 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 9656 - * @param postsLocation The resulting location. 9657 - *### 9658 -#macro(getBlogPostsLocation $blogSpace $postsLocation) 9659 - #getBlogDocument($blogSpace $blogDoc) 9660 - #getBlogProperty($blogDoc 'postsLocation' $blogDoc.space $result) 9661 - #set ($postsLocation = $NULL) 9662 - #setVariable (~"$postsLocation~" $result) 9663 -#end 9664 -## 9665 -## 9666 -## 9667 -#** 9668 - * Retrieve the blog categories location (space). 9669 - * 9670 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 9671 - * @param categoriesLocation The resulting location. 9672 - *### 9673 -#macro(getBlogCategoriesLocation $blogSpace $categoriesLocation) 9674 - #getBlogDocument($blogSpace $blogDoc) 9675 - #getBlogProperty($blogDoc 'categoriesLocation' 'Blog' $result) 9676 - #set ($postsLocation = $NULL) 9677 - #setVariable (~"$categoriesLocation~" $result) 9678 -#end 9679 -###** 9680 - * Return the Query for selecting the blog posts based on the context where the posts are displayed. 9681 - * for example there is 4 different panel contexts: 9682 - * aBlog.aPost or aBlog.WebHome 9683 - * aCategorySpace.aCategory 9684 - * aCategorySpace.WebHome 9685 - * Blog.aPost or Blog.WebHome 9686 - * 9687 - * @param query The query for selecting blog entries. 9688 - * @param queryParams The parameters to bind with the generated query. 9689 - * @param targetDoc The document in which the articles will be displayed. 9690 - *### 9691 -#macro(getAllBlogPostsQueryBasedOnDisplayContext $targetDoc $query $queryParams) 9692 - #set ($query = $NULL) 9693 - #set ($queryParams = $NULL) 9694 - #getCategoryAllBlogPostsQuery($resultQuery) 9695 - #set ($resultQueryParams = \{}) 9696 - #set($sanitizedSpace = $targetDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 9697 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 9698 - ## Get all posts that are in the default blog space('Blog') or in category 'Blog.%' 9699 - #set ($discard = $resultQueryParams.put('space', $targetDoc.space)) 9700 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 9701 - #set($resultQuery = ~"$\{resultQuery} and (doc.space = :space or catList like :catList escape '!')~") 9702 - #elseif($targetDoc.getObject($blogCategoryClassname)) 9703 - ## Get all posts that are in a category aCategorySpace.aCategory 9704 - #set ($discard = $resultQueryParams.put('catList', $targetDoc.fullName)) 9705 - #set($resultQuery = ~"$\{resultQuery} and (catList=:catList)~") 9706 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 9707 - ## Get all posts that are in a category aCategorySpace.% 9708 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 9709 - ## Exclude incategorized posts 9710 - #set ($excludedCategory = ~"$\{targetDoc.space}.WebHome~") 9711 - #if ($targetDoc.space == $defaultBlogSpace) 9712 - #set ($excludedCategory = ~"Blog.Categories.WebHome~") 9713 - #end 9714 - #set ($discard = $resultQueryParams.put('excludedCategory', $excludedCategory)) 9715 - #set($resultQuery = ~"$\{resultQuery} and (catList<>:excludedCategory) and (catList like :catList escape '!')~") 9716 - #else 9717 - ## Get all posts in blog space aBlog 9718 - #getAllBlogPostsQuery($resultQuery) 9719 - #getBlogPostsLocation($targetDoc.space $postsLocation) 9720 - #set ($discard = $resultQueryParams.put('space', $postsLocation)) 9721 - #set($resultQuery = ~"$\{resultQuery} and doc.space = :space~") 9722 - #end 9723 - #setVariable(~"$query~" $resultQuery) 9724 - #setVariable(~"$queryParams~" $resultQueryParams) 9725 -#end 9726 -## 9727 -## 9728 -## 9729 -###** 9730 - * Display blog posts based on the context where the posts are displayed. 9731 - * for example there is 4 different panel contexts: 9732 - * aBlog.aPost or aBlog.WebHome 9733 - * aCategorySpace.aCategory 9734 - * aCategorySpace.WebHome 9735 - * Blog.aPost or Blog.WebHome 9736 - * 9737 - * @param targetDoc The document in which the articles will be displayed. 9738 - * @param postsVisiblity The visibility of the posts to display: recent, unpublished, ... 9739 - * @param layout Layout of the the posts to display 9740 - * @param layoutParams additional layout parameters, it is a string like 'param1=val1|...|paramN=valueN' 9741 - * @param limit the number of posts to display 9742 - *### 9743 -#macro(displayBlogPostsBasedOnContext $targetDoc $postsVisiblity $layout $layoutParams $limit) 9744 - #if ($postLayout == 'full') 9745 - #set ($macro.paginated = 'yes') 9746 - #end 9747 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 9748 - ## Display all posts that are in the default blog space('Blog') or in category 'Blog.%' 9749 - #getBlogPostsLayout($xwiki.getDocument(~"$\{defaultBlogSpace}.WebHome~") $postsLayout) 9750 - #if (~"$!layout~" == '') 9751 - #set ($layout = $postsLayout) 9752 - #end 9753 - #if ($postsVisiblity == 'recent') 9754 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 9755 - #elseif($postsVisiblity == 'unpublished') 9756 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 9757 - #end 9758 - #elseif($targetDoc.getObject($blogCategoryClassname)) 9759 - ## Display all posts that are in a category aCategorySpace.aCategory 9760 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 9761 - #getBlogPostsLayout($blogDoc $postsLayout) 9762 - #if (~"$!layout~" == '') 9763 - #set ($layout = $postsLayout) 9764 - #end 9765 - #if ($postsVisiblity == 'recent') 9766 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 9767 - #elseif($postsVisiblity == 'unpublished') 9768 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 9769 - #end 9770 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 9771 - ## Display all posts that are in a category aCategorySpace.% 9772 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 9773 - #getBlogPostsLayout($blogDoc $postsLayout) 9774 - #if (~"$!layout~" == '') 9775 - #set ($layout = $postsLayout) 9776 - #end 9777 - #if ($postsVisiblity == 'recent') 9778 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 9779 - #elseif($postsVisiblity == 'unpublished') 9780 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 9781 - #end 9782 - #else 9783 - ## Display all posts in blog space aBlog 9784 - #getBlogDocument($targetDoc.space $blogDoc) 9785 - #getBlogPostsLayout($blogDoc $postsLayout) 9786 - #if (~"$!layout~" == '') 9787 - #set ($layout = $postsLayout) 9788 - #end 9789 - #if ($postsVisiblity == 'recent') 9790 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 9791 - #elseif($postsVisiblity == 'unpublished') 9792 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 9793 - #end 9794 - #end 9795 -#end 9796 -## 9797 -## 9798 -## 9799 -#** 9800 - * Bind parameters to a query object. 9801 - * 9802 - * @param queryObj The query object (org.xwiki.query.internal.ScriptQuery object) 9803 - * @param queryParams the query parameters. 9804 - *### 9805 -#macro(bindQueryParameters $queryObj $queryParams) 9806 - #set ($output = $queryObj) 9807 - #foreach( $key in $queryParams.keySet() ) 9808 - #set($output = $queryObj.bindValue($key, $queryParams.get($key))) 9809 - #end 9810 - #setVariable(~"$queryObj~" $output) 9811 -#end 9812 -## 9813 -## 9814 -## 9815 -#** 9816 - * Determines the blogposts layout: Default layout (Calendar), Image thumbnail 9817 - * 9818 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>postsLayout</tt> 9819 - * property set. 9820 - * @param postsLayout The resulting string. If the blog object does not define anything, it is considered full (default). 9821 - *### 9822 -#macro(getBlogPostsLayout $blogDoc $postsLayout) 9823 - #getBlogProperty($blogDoc 'postsLayout' 'full' $res) 9824 - #set ($postsLayout = $NULL) 9825 - #setVariable (~"$postsLayout~" $res) 9826 -#end 9827 -## 9828 -## 9829 -## 9830 -#** 9831 - * Retrieve the blog document of a categories space, which is the blog descriptor that have its categoriesLocation property set to the categories space 9832 - * 9833 - * @param categoriesSpace A <tt>String</tt>, the name of the space. 9834 - * @param blogDoc The resulting XDocument. 9835 - *### 9836 -#macro(getBlogDocumentForCategoriesSpace $categoriesSpace $blogDoc) 9837 - #set($macro.blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as categoriesLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=categoriesLocationProp.id.id and categoriesLocationProp.id.name='categoriesLocation' and categoriesLocationProp.value=:categoriesLocation order by doc.creationDate~").setLimit(1).setOffset(0).bindValue('categoriesLocation', $categoriesSpace).execute()) 9838 - #if($macro.blogDocs.size() > 0 && $categoriesSpace != $defaultBlogSpace) 9839 - #set($macro.result = $xwiki.getDocument($macro.blogDocs.get(0))) 9840 - #else 9841 - ## Fallback to Blog.WebHome, the default blog 9842 - #set($macro.result = $xwiki.getDocument('Blog.WebHome')) 9843 - #end 9844 - #set ($blogDoc = $NULL) 9845 - #setVariable (~"$blogDoc~" $macro.result) 9846 -#end" %) 9847 -((( 9848 -(% class="macro-placeholder hidden" %) 9849 -((( 9850 -macro:velocity 9851 -))) 9852 -))) 9853 -))) 9854 - 9855 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogPostLayoutMacros~"" %) 9856 -((( 9857 -(% class="macro-placeholder hidden" %) 9858 -((( 9859 -macro:include 9860 -))) 9861 - 9862 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|#** 9863 - * Extract the layout parameters from a string. 9864 - * 9865 - * @param layoutParamsString The string representation of the layout parameters. 9866 - * It should contain a String following this format ~"paramName1=Value1|paramName2=Value2|...|paramNameK=ValueK~" 9867 - * @param layoutsParameters The resulting layout parameters Map. 9868 - *### 9869 -#macro(extractLayoutParametersFromString $layoutParamsString $layoutsParameters) 9870 - #set ($layoutsParameters = $NULL) 9871 - #set ($macro.layoutParams = \{}) 9872 - #if (~"$!layoutParamsString~" != '') 9873 - #set ($macro.paramsArr = $layoutParamsString.split('\\|')) 9874 - #foreach ($item in $macro.paramsArr) 9875 - #set ($itemSplit = $item.split('=')) 9876 - #if ($itemSplit.size() == 2) 9877 - #set ($discard = $macro.layoutParams.put($itemSplit[0].trim(), $itemSplit[1].trim())) 9878 - #end 9879 - #end 9880 - #end 9881 - #setVariable(~"$layoutsParameters~" $macro.layoutParams) 9882 -#end" %) 9883 -((( 9884 -(% class="macro-placeholder hidden" %) 9885 -((( 9886 -macro:velocity 9887 -))) 9888 -))) 9889 -))) 9890 - 9891 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-| #macro(displaySmallPost $pDoc $pObj) 9892 - #initLayoutVars($pDoc $pObj) 9893 - <div class=~"col-xs-12 col-sm-6 next_blog~"> 9894 - <a href=~"$pDoc.uRL~" class=~"thumbnail~"> 9895 - <div class=~"row~"> 9896 - <div class=~"col-xs-4~"> 9897 - #if ($imageAtt) 9898 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 9899 - #end 9900 - </div> 9901 - <div class=~"col-xs-8 art_det~"> 9902 - <p class=~"text-left~"> 9903 - #if($displayTitle)$!postTitle #end 9904 - <br/><span class=~"date_info~"> $!dateStr </span> 9905 - </p> 9906 - #displayPostDetails($pDoc) 9907 - </div> 9908 - </div> 9909 - </a> 9910 - </div> 9911 - #end 9912 - ## 9913 - ## 9914 - ## 9915 - #macro(displayPinnedPost $pDoc $pObj) 9916 - #initLayoutVars($pDoc $pObj) 9917 - <div class=~"col-xs-12 col-sm-4 col-md-4 blog_pin~"> 9918 - <a href=~"$pDoc.uRL~" class=~"all-post-link~"> 9919 - <div class=~"thumbnail~"> 9920 - #if ($displayTitle && $displayTitleFirstOnPinnedPosts) 9921 - <h5 class=~"title-top~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 9922 - #end 9923 - #if ($imageAtt) 9924 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 9925 - #end 9926 - <div class=~"caption~"> 9927 - #if ($displayTitle && !$displayTitleFirstOnPinnedPosts) 9928 - <h5 class=~"text-left~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 9929 - #end 9930 - #if ($displaySummaryOnPinnedPosts) 9931 - <div class=~"text-left post-summary~"> 9932 - #set ($postContent = $pObj.getProperty('extract').value) 9933 - $!pDoc.getRenderedContent($postContent, $pDoc.syntax.toIdString()) 9934 - </div> 9935 - #end 9936 - #displayPostDetails($pDoc) 9937 - </div> 9938 - </div> 9939 - </a> 9940 - </div> 9941 - #end 9942 - ## 9943 - ## 9944 - ## 9945 - #macro(formatPostDate $pDoc $pObj) 9946 - #set ($formattedDate = $NULL) 9947 - #set($dateStr = $datetool.format('medium', $postDate, $xcontext.locale)) 9948 - #if (~"$!dateStr~" != '') 9949 - #set ($dateArr = $dateStr.split(' ')) 9950 - #if ($dateArr.size() > 3) 9951 - #set ($dateStr = ~"~") 9952 - #foreach($s in $dateArr.subList(0, 3)) 9953 - #set ($dateStr = ~"$\{dateStr}$\{s} ~") 9954 - #end 9955 - #end 9956 - #end 9957 - #setVariable(~"$formattedDate~" $dateStr) 9958 - #end 9959 - ## 9960 - ## 9961 - ## 9962 - #macro(displayPostDetails $pDoc) 9963 - <div class=~"row post-details~"> 9964 - <div class=~"col-xs-8 detail~"> 9965 - #if ($services.like.displayButton($pDoc.documentReference)) 9966 - #set ($optLikeRecord = $services.like.getLikes($pDoc.documentReference)) 9967 - ## Retrieve the likes number in XWiki 12.9+ 9968 - #set ($likeNumber = $optLikeRecord.get()) 9969 - #if (!$stringtool.isNumeric($likeNumber.toString())) 9970 - ## Retrieve the likes number in XWiki versions greater than 12.7 and lower than 12.9. 9971 - #set ($likeNumber = $optLikeRecord.get().likeNumber) 9972 - #end 9973 - #if ($stringtool.isNumeric($likeNumber.toString())) 9974 - <div class=~"post-likes btn btn-default disabled badge~" 9975 - title=~"$escapetool.xml($services.localization.render('like.button.title', [$likeNumber]))~"> 9976 - $services.icon.renderHTML('heart') <span class=~"like-number~">$likeNumber</span> 9977 - </div> 9978 - #end 9979 - #elseif ($services.ratings) 9980 - #set ($ratingsConfigDoc = $services.ratings.getConfigurationDocument($pDoc.documentReference)) 9981 - #if ($ratingsConfigDoc.getValue('displayRatings') == 1) 9982 - <ul class=~"pull-left note list-inline~"> 9983 - #foreach ($x in [1..5]) 9984 - #set ($cls = ~"~") 9985 - #if ($x > $averageVote) 9986 - #set ($cls = ~"-o~") 9987 - #end 9988 - <li><span class=~"fa fa-star$\{cls}~"></span></li> 9989 - #end 9990 - </ul> 9991 - #end 9992 - #end 9993 - </div> 9994 - #if ($showPostComments) 9995 - <div class=~"col-xs-4 com_det~"> 9996 - <p class=~"text-right~">$services.icon.renderHTML('comments') ($!nbComments)</p> 9997 - </div> 9998 - #end 9999 - </div> 10000 - #end 10001 - ## 10002 - ## 10003 - ## 10004 - #macro(initLayoutVars $pDoc $pObj) 10005 - #set ($postTitle = $pDoc.display('title', 'view', $pObj)) 10006 - #set ($imageAtt = $pDoc.getAttachment($pObj.getValue('image'))) 10007 - #isPublished($pObj $isPublished) 10008 - #isHidden($pObj $isHidden) 10009 - #getEntryDate($pDoc $pObj $postDate) 10010 - #formatPostDate($postDate $dateStr) 10011 - #set ($averageVote = $mathtool.round($services.ratings.getAverageRating($pDoc.documentReference).getAverageVote())) 10012 - #set ($nbComments = $pDoc.getComments().size()) 10013 - #set ($showPostComments = true) 10014 - #if ($xwiki.getSpacePreferenceFor('showcomments', $pDoc.documentReference.lastSpaceReference, '1') == '0') 10015 - #set ($showPostComments = false) 10016 - #end 10017 - #end 10018 - ## 10019 - ## 10020 - ## 10021 - #macro(displayEditPinnedPostsButton) 10022 - #if (~"$!macroAdditionalParams.get('postIndex')~" == '0' && $services.security.authorization.hasAccess('edit', $pinnedPostsSourceDoc.fullName)) 10023 - #set ($discard = $xwiki.ssx.use('Blog.PinnedPostsSheet')) 10024 - #set ($discard = $xwiki.jsx.use('Blog.PinnedPostsSheet')) 10025 - #set ($editPinnedPostsURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'get', 'sheet=Blog.PinnedPostsSheet')) 10026 - #set ($newPinnedPostsObjectURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'objectadd', ~"classname=Blog.PinnedPostsClass&form_token=$!\{services.csrf.getToken()}~")) 10027 - <div class=~"edit-pinned-posts-container~"> 10028 - <div class=~"col-xs-12 col-sm-12 col-md-12 text-right edit-pinned-posts~"> 10029 - <a href=~"javascript:;~" class=~"editPinnedPosts~"> 10030 - <span class=~"glyphicon glyphicon-edit~" aria-hidden=~"true~"></span> $services.localization.render('blog.post.layout.cards.pinnedposts.edit') 10031 - </a> 10032 - <input type=~"hidden~" id=~"editPinnedPostsURL~" value=~"$escapetool.xml($editPinnedPostsURL)~"/> 10033 - <input type=~"hidden~" id=~"newPinnedPostsObjectURL~" value=~"$escapetool.xml($newPinnedPostsObjectURL)~"/> 10034 - </div> 10035 - </div> 10036 - #if (~"$!pinnedPostsObj~" == '') 10037 - <input type=~"hidden~" name=~"createPinnedPostsObject~" value=~"1~"/> 10038 - #end 10039 - #end 10040 - #end" %) 10041 -((( 10042 -(% class="macro-placeholder hidden" %) 10043 -((( 10044 -macro:velocity 10045 -))) 10046 -))) 10047 - 10048 -(% class="macro" data-macro="startmacro:velocity|-||-| #if ($services.security.authorization.hasAccess('view', $xcontext.macro.params.reference)) 10049 - #set ($postDoc = $xwiki.getDocument($xcontext.macro.params.reference)) 10050 - #getEntryObject($postDoc $postObj) 10051 - #if (~"$!postObj~" != '') 10052 - #extractLayoutParametersFromString($xcontext.macro.params.params $macroAdditionalParams) 10053 - ## 10054 - #set ($displayTitle = true) 10055 - #if (~"$!macroAdditionalParams.get('displayTitle')~" == 'false') 10056 - #set ($displayTitle = false) 10057 - #end 10058 - ## 10059 - #set ($displayTitleFirstOnPinnedPosts = false) 10060 - #if (~"$!macroAdditionalParams.get('displayTitleFirstOnPinnedPosts')~" == 'true') 10061 - #set ($displayTitleFirstOnPinnedPosts = true) 10062 - #end 10063 - ## 10064 - #set ($displaySummaryOnPinnedPosts = true) 10065 - #if (~"$!macroAdditionalParams.get('displaySummaryOnPinnedPosts')~" == 'false') 10066 - #set ($displaySummaryOnPinnedPosts = false) 10067 - #end 10068 - ## 10069 - #set ($postIndex = $numbertool.toNumber($macroAdditionalParams.get('postIndex')).intValue()) 10070 - #if ($postIndex == 0) 10071 - #set ($stopBlogPostsDisplay = false) 10072 - #end 10073 - #set ($listResultsCount = $numbertool.toNumber($macroAdditionalParams.get('list-results-count')).intValue()) 10074 - #set($discard = $xwiki.ssx.use('Blog.BlogPostLayoutCards')) 10075 - #set($scaleWidth = 600) 10076 - #set($imgQs=~"width=$scaleWidth~") 10077 - ## Display pinned posts 10078 - ## Get the list of pinned posts 10079 - #set ($pinnedPosts = []) 10080 - #set ($pinnedPostsSourceDoc = $NULL) 10081 - #if (~"$!macroAdditionalParams.get('forceDisplayPinnedPosts')~" == 'true' && ~"$!macroAdditionalParams.get('list-blog')~" != '') 10082 - #set ($pinnedPostsSourceDoc = $xwiki.getDocument($macroAdditionalParams.get('list-blog'))) 10083 - ## Note that the 'list-blog' parameter contains the value of the 'blog' parameter of the blogpostlist macro passed to the current layout macro 10084 - #end 10085 - #if (~"$!pinnedPostsSourceDoc~" != '') 10086 - #set ($pinnedPostsObj = $pinnedPostsSourceDoc.getObject('Blog.PinnedPostsClass')) 10087 - #if (~"$!pinnedPostsObj~" != '') 10088 - #set ($orderedPinnedPostsJSON = $pinnedPostsObj.getProperty('orderedPosts').value) 10089 - #if (~"$!orderedPinnedPostsJSON~" != '') 10090 - #set ($pinnedPosts = $jsontool.parse($orderedPinnedPostsJSON)) 10091 - #else 10092 - #set ($pinnedPosts = $pinnedPostsObj.getProperty('posts').value) 10093 - #end 10094 - #end 10095 - #if ($postIndex == 0 && $pinnedPosts.size() > 0) 10096 - \{\{html clean=~"false~"}} 10097 - #set ($x = 0) 10098 - #set ($showPinnedPostsButton = true) 10099 - #foreach ($pinnedPost in $pinnedPosts) 10100 - #if ($x == 0) 10101 - <div class=~"row flex-container~"> 10102 - #if ($showPinnedPostsButton) 10103 - #displayEditPinnedPostsButton() 10104 - #set($showPinnedPostsButton = false) 10105 - #end 10106 - #end 10107 - #set ($pinnedPostDoc = $xwiki.getDocument($pinnedPost)) 10108 - #getEntryObject($pinnedPostDoc $pinnedPostObj) 10109 - #if (~"$!pinnedPostObj~" != '') 10110 - #displayPinnedPost($pinnedPostDoc $pinnedPostObj) 10111 - #end 10112 - #set ($x = $mathtool.add($x, 1)) 10113 - #if ($x == 3) 10114 - #set ($x = 0) 10115 - </div> 10116 - #end 10117 - #end 10118 - #if ($mathtool.mod($x, 3) != 0) 10119 - </div> 10120 - #end 10121 - \{\{/html}} 10122 - 10123 - ## If the first post is a pinned post : this means that all the posts are pinned 10124 - ## In this case, avoid displaying the posts again after the pinned posts section. 10125 - #if ($pinnedPosts.contains($xcontext.macro.params.reference)) 10126 - #set ($stopBlogPostsDisplay = true) 10127 - #end 10128 - #elseif($postIndex == 0 && $pinnedPosts.size() == 0) 10129 - 10130 - \{\{html}} 10131 - <div class=~"row no-pinnded-posts~"> 10132 - #displayEditPinnedPostsButton() 10133 - </div> 10134 - \{\{/html}} 10135 - 10136 - #end 10137 - #end 10138 - #if (!$stopBlogPostsDisplay) 10139 - \{\{html clean=~"false~"}} 10140 - #if (~"$!nbDisplayedPosts~" == '' || $postIndex == 0) 10141 - #set ($nbDisplayedPosts = 0) 10142 - #end 10143 - #if($mathtool.mod($nbDisplayedPosts, 2) == 0) 10144 - #if ($nbDisplayedPosts != 0) 10145 - </div> 10146 - #set ($lastHtmlTag = 'c') 10147 - #end 10148 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 10149 - <div class=~"row~"> 10150 - #set ($lastHtmlTag = 'o') 10151 - #set ($lastRowClass = ~"~") 10152 - #else 10153 - <div class=~"row flex-container~"> 10154 - #set ($lastHtmlTag = 'o') 10155 - #set ($lastRowClass = ~"flex~") 10156 - #end 10157 - #end 10158 - #displaySmallPost($postDoc $postObj) 10159 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 10160 - </div> 10161 - #set ($lastHtmlTag = 'c') 10162 - #end 10163 - #set ($nbDisplayedPosts = $mathtool.add($nbDisplayedPosts, 1)) 10164 - #if ($postIndex == $mathtool.sub($listResultsCount, 1)) 10165 - #if (~"$!lastHtmlTag~" == 'o') 10166 - #if ($mathtool.mod($nbDisplayedPosts, 2) == 1 && $lastRowClass == ~"flex~") 10167 - <div class=~"col-xs-12 col-sm-6~"></div> 10168 - #end 10169 - </div> 10170 - #end 10171 - #end 10172 - \{\{/html}} 10173 - #end 10174 - #else 10175 - \{\{error}}$services.localization.render('blog.blogpostlayout.notpost', [$xcontext.macro.params.reference])\{\{/error}} 10176 - #end 10177 - #else 10178 - \{\{error}}$services.localization.render('blog.blogpostlayout.post_view_not_allowed', [$xcontext.macro.params.reference])\{\{/error}} 10179 - #end" %) 10180 -((( 10181 -(% class="macro-placeholder hidden" %) 10182 -((( 10183 -macro:velocity 10184 -))) 10185 - 10186 -(% class="macro" data-macro="startmacro:html|-|clean=~"false~"|-|<div class=~"col-xs-12 col-sm-6 next_blog~"> 10187 -<a href=~"/Nieuws/RI%26E%202023~" class=~"thumbnail~"> 10188 -<div class=~"row~"> 10189 -<div class=~"col-xs-4~"> 10190 -<img src=~"/download/Nieuws/RI%26E%202023/Knipsel.JPG?width=600&rev=1.1~" /> 10191 -</div> 10192 -<div class=~"col-xs-8 art_det~"> 10193 -<p class=~"text-left~"> 10194 -RI en E 2023 <br/><span class=~"date_info~"> Dec 13, 2023, </span> 10195 -</p> 10196 -<div class=~"row post-details~"> 10197 -<div class=~"col-xs-8 detail~"> 10198 -<div class=~"post-likes btn btn-default disabled badge~" 10199 -title=~"Number of likes on this page: 1~"> 10200 -<span class=~"fa fa-heart~"></span> <span class=~"like-number~">1</span> 10201 -</div> 10202 -</div> 10203 -<div class=~"col-xs-4 com_det~"> 10204 -<p class=~"text-right~"><span class=~"fa fa-comments~"></span> (0)</p> 10205 -</div> 10206 -</div> 10207 -</div> 10208 -</div> 10209 -</a> 10210 -</div>" %) 10211 -((( 10212 -(% class="macro-placeholder hidden" %) 10213 -((( 10214 -macro:html 10215 -))) 10216 - 10217 -(% class="col-xs-12 col-sm-6 next_blog" %) 10218 -((( 10219 -(% class="row" %) 10220 -((( 10221 -(% class="col-xs-4" %) 10222 -((( 10223 -[[~[~[image:/download/Nieuws/RI%26E%202023/Knipsel.JPG?width=600&rev=1.1~]~]>>path:/Nieuws/RI%26E%202023||class="thumbnail"]] 10224 -))) 10225 - 10226 -(% class="col-xs-8 art_det" %) 10227 -((( 10228 -(% class="text-left" %) 10229 -[[RI en E 2023 10230 -(% class="date_info" %) Dec 13, 2023,>>path:/Nieuws/RI%26E%202023||class="thumbnail"]] 10231 - 10232 -(% class="row post-details" %) 10233 -((( 10234 -(% class="col-xs-8 detail" %) 10235 -((( 10236 -(% class="post-likes btn btn-default disabled badge" title="Number of likes on this page: 1" %) 10237 -((( 10238 -[[(% class="like-number" %)1>>path:/Nieuws/RI%26E%202023||class="thumbnail"]] 10239 -))) 10240 -))) 10241 - 10242 -(% class="col-xs-4 com_det" %) 10243 -((( 10244 -(% class="text-right" %) 10245 -[[(0)>>path:/Nieuws/RI%26E%202023||class="thumbnail"]] 10246 -))) 10247 -))) 10248 -))) 10249 -))) 10250 -))) 10251 -))) 10252 -))) 10253 -))) 10254 - 10255 -(% class="macro" data-macro="startmacro:blogPostLayoutCards|-|reference=~"Nieuws.Aankondiging update Syntess 6\\\\.9\\\\.0181~" params=~"displayTitle=true|useSummary=true|list-limit=10|list-layout=cards|list-blog=Nieuws.WebHome|list-paginated=no|list-results-count=10|postIndex=0|previousPostReference=|postIndex=1|previousPostReference=Nieuws.Nieuwsbrief januari 2024|postIndex=2|previousPostReference=Nieuws.Audit BMI en BORG|postIndex=3|previousPostReference=Nieuws.Nieuwsbrief december 2023|postIndex=4|previousPostReference=Nieuws.Nieuwsbrief november 2023|postIndex=5|previousPostReference=Nieuws.Feestelijke afsluiting, keuring materieel en tellen voorraden|postIndex=6|previousPostReference=Nieuws.RI&E 2023~"" %) 10256 -((( 10257 -(% class="macro-placeholder hidden" %) 10258 -((( 10259 -macro:blogPostLayoutCards 10260 -))) 10261 - 10262 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogCode~"" %) 10263 -((( 10264 -(% class="macro-placeholder hidden" %) 10265 -((( 10266 -macro:include 10267 -))) 10268 - 10269 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogParameters~"" %) 10270 -((( 10271 -(% class="macro-placeholder hidden" %) 10272 -((( 10273 -macro:include 10274 -))) 10275 - 10276 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## Blog 10277 -#set($blogClassname = 'Blog.BlogClass') 10278 -#set($blogTemplate = 'Blog.BlogTemplate') 10279 -#set($blogSheet = 'Blog.BlogSheet') 10280 -## Blog entries 10281 -#set($blogPostClassname = 'Blog.BlogPostClass') 10282 -#set($blogPostTemplate = 'Blog.BlogPostTemplate') 10283 -#set($blogPostSheet = 'Blog.BlogPostSheet') 10284 -#set($blogPostObjectNumber = $xwiki.getDocument($blogPostTemplate).getObject($blogPostClassname).number) 10285 -#set($oldArticleClassname = 'XWiki.ArticleClass') 10286 -## Categories 10287 -#set($blogCategoryClassname = 'Blog.CategoryClass') 10288 -#set($blogCategoryTemplate = 'Blog.CategoryTemplate') 10289 -#set($blogCategorySheet = 'Blog.CategorySheet') 10290 -#set($blogCategoriesSheet = 'Blog.CategoriesSheet') 10291 -#set($oldBlogCategoryClassname = 'Blog.Categories') 10292 -#set($defaultCategoryParent = 'Blog.Categories') 10293 -## Style 10294 -#set($blogStyleDocumentName = 'Blog.BlogStyle') 10295 -#set($blogStyleDocument = $xwiki.getDocument($blogStyleDocumentName)) 10296 -## Clientside scripts 10297 -#set($blogScriptsDocumentName = 'Blog.BlogScripts') 10298 -#set($blogPublisher = $xwiki.getDocument('Blog.Publisher')) 10299 -## Misc 10300 -#set($thisURL = $doc.getURL($xcontext.action, $request.queryString)) 10301 -#set($isBlogPost = $doc.getObject($blogPostClassname)) 10302 -#set($defaultBlogSpace = 'Blog') 10303 -#set($isCategoryPage = $doc.getObject($blogCategoryClassname)) 10304 -#set($isCategoriesHomePage = $doc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 10305 -## 10306 -## 10307 -## 10308 -#** 10309 - * Displays an image, taken from the blog style document. 10310 - * 10311 - * @param $imgName The name of the icon from icons set to use. 10312 - *# 10313 -#macro(toolImage $imgName)(% class=~"icon-manage~"~%)$services.icon.render($imgName)(%~%)#end" %) 10314 -((( 10315 -(% class="macro-placeholder hidden" %) 10316 -((( 10317 -macro:velocity 10318 -))) 10319 -))) 10320 -))) 10321 - 10322 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## 10323 -## 10324 -## 10325 -## Import the blog skin and javascripts. 10326 -$!xwiki.ssx.use($blogStyleDocumentName)## 10327 -$!xwiki.jsx.use($blogScriptsDocumentName)## 10328 -## 10329 -## import the hierarchy for the path the blog post footer (in displayEntryBlogLocation) 10330 -#template('hierarchy_macros.vm')## 10331 -## 10332 -## 10333 -#** 10334 - * Prints a blog. This is the main macro used in the BlogSheet. 10335 - * 10336 - * @param blogDoc the XDocument holding the blog definition object. 10337 - *### 10338 -#macro(printBlog $blogDoc) 10339 - \{\{include reference='Blog.CreatePost'/}} 10340 - 10341 - ## Use the blogPostList macro to display the blogposts 10342 - ## The blogPostList is used only in case of 'all' or 'paged' blog display type because the blogPostList macro 10343 - ## do not support FTM the monthly and weekly blog display types 10344 - #getBlogDisplayType($blogDoc $displayType) 10345 - #if ($displayType == 'weekly' || $displayType == 'monthly') 10346 - #getBlogEntries($blogDoc $entries) 10347 - #displayBlog($entries 'index' true true) 10348 - #displayNavigationLinks($blogDoc) 10349 - #else 10350 - #getBlogDisplayType($blogDoc $displayType) 10351 - #set ($paginated = 'no') 10352 - #if ($displayType == 'paginated') 10353 - #set ($paginated = 'yes') 10354 - #end 10355 - #getBlogPostsLayout($blogDoc $postsLayout) 10356 - (% class=~"hfeed index~" ~%)(((\{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$paginated~" layout=~"$!postsLayout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" /}}))) 10357 - #end 10358 -#end 10359 -## 10360 -## 10361 -## 10362 -#** 10363 - * Shows blog information. In view mode, the description is printed. In edit mode, allows changing blog settings: title, 10364 - * description, blog type (global or in-space), index display type (fixed size pagination, weekly index, monthly index, 10365 - * all entries). 10366 - * 10367 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 10368 - *### 10369 -#macro(showBlogInfo $blogDoc) 10370 - #if($blogDoc.getObject($blogClassname)) 10371 - ## Keep testing for inline action for backward compatibility with older blogs. 10372 - #if($xcontext.action == 'edit' || $xcontext.action == 'inline') 10373 - #macro(displayProperty $blogDoc $propname) 10374 - ; #displayPropName($xwiki.getClass($blogClassname).get($propname)): 10375 - : $blogDoc.display($propname) 10376 - #end 10377 - #displayProperty($blogDoc 'title') 10378 - #displayProperty($blogDoc 'description') 10379 - #displayProperty($blogDoc 'displayType') 10380 - #displayProperty($blogDoc 'itemsPerPage') 10381 - #displayProperty($blogDoc 'postsLayout') 10382 - #displayProperty($blogDoc 'postsLayoutParameters') 10383 - #else 10384 - $blogDoc.display('description') 10385 - #end 10386 - #elseif($doc.fullName == $blogSheet) 10387 -= $services.localization.render('blog.code.blogsheet') = 10388 - \{\{translation key='blog.code.sheetexplanation'/}} 10389 - #else 10390 - \{\{warning}}\{\{translation key='blog.code.notblog'/}}\{\{/warning}} 10391 - #end 10392 -#end 10393 -## 10394 -## 10395 -## 10396 -#** 10397 - * Retrieve the blog document, which usually is either <tt><Space>.WebHome</tt> for whole-spaces blogs, or 10398 - * <tt><Space>.Blog</tt> for in-space blogs. If none of these documents contains a blog object, then the first 10399 - * (alphabetically) document in the target space that contains one is returned. Finally, if no document in the current 10400 - * space contains a blog object, then <tt>Blog.WebHome</tt> is returned as the default blog. 10401 - * 10402 - * @param space A <tt>String</tt>, the name of the space where to search. 10403 - * @param blogDoc The resulting XDocument. 10404 - *### 10405 -#macro(getBlogDocument $space $blogDoc) 10406 - #set ($result = $NULL) 10407 - ## Check if the current space has a WebPreferences page that contains a Blog.EnablePanelsConfigurationClass object. 10408 - ## It is possible to display a blog's panels info in a page that is not inside a blog and in that case we need to 10409 - ## identify the right blog based on a configuration object in a WebPreferences page. 10410 - #set ($spaceReference = $services.model.resolveSpace($space)) 10411 - #set ($preferencesDocRef = $services.model.createDocumentReference('WebPreferences', $spaceReference)) 10412 - #set ($preferencesDoc = $xwiki.getDocument($preferencesDocRef)) 10413 - #set ($preferencesObj = $preferencesDoc.getObject('Blog.EnablePanelsConfigurationClass')) 10414 - #if ($preferencesObj) 10415 - #set ($result = $xwiki.getDocument( $preferencesObj.getValue('blog'))) 10416 - #end 10417 - ## If no special case occurs (like the previous one), identify a blog by checking the current location from its hierarchy. 10418 - #if (~"$!result~" == '') 10419 - ## First, try the Space.WebHome, for a whole-space blog 10420 - #set($result = $xwiki.getDocument(~"$\{space}.WebHome~")) 10421 - #if(!$result.getObject($blogClassname)) 10422 - ## Second, try the Space.Blog document 10423 - #set($result = $xwiki.getDocument(~"$\{space}.Blog~")) 10424 - #if(!$result.getObject($blogClassname)) 10425 - ## Third, try searching for a blog document in the current space 10426 - ## Prevent the query fail when the space contains dots '.' 10427 - #set($blogDocs = $services.query.hql(~", BaseObject obj where doc.space = :space and obj.name = doc.fullName and obj.className = '$blogClassname' order by doc.name~").setLimit(1).setOffset(0).bindValue('space', $space).execute()) 10428 - #if($blogDocs.size() > 0) 10429 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 10430 - #else 10431 - ## Fourth, try searching for a blog document that have the its 'postsLocation' set to the current space 10432 - #set($blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as postsLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=postsLocationProp.id.id and postsLocationProp.id.name='postsLocation' and postsLocationProp.value=:postsLocation order by doc.name~").setLimit(1).setOffset(0).bindValue('postsLocation', $space).execute()) 10433 - #if($blogDocs.size() > 0) 10434 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 10435 - #else 10436 - ## Last, fallback to Blog.WebHome, the default blog 10437 - #set($result = $xwiki.getDocument('Blog.WebHome')) 10438 - #end 10439 - #end 10440 - #end 10441 - #end 10442 - #end 10443 - #set ($blogDoc = $NULL) 10444 - #setVariable (~"$blogDoc~" $result) 10445 -#end 10446 -## 10447 -## 10448 -## 10449 -#** 10450 - * Retrieve the blog title. 10451 - * 10452 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass<tt> object with the <tt>title</tt> property set. 10453 - * @param title The resulting title. 10454 - *### 10455 -#macro(getBlogTitle $blogDoc $title) 10456 - ## Titles can contain velocity code (most commonly translations), so we should evaluate them. 10457 - #set ($title = $NULL) 10458 - #setVariable (~"$title~" $!blogDoc.displayTitle) 10459 -#end 10460 -## 10461 -## 10462 -## 10463 -#** 10464 - * Retrieve the blog description. 10465 - * 10466 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>description</tt> 10467 - * property set. 10468 - * @param description The resulting description. 10469 - *### 10470 -#macro(getBlogDescription $blogDoc $description) 10471 - #getBlogProperty($blogDoc 'description' '' $result) 10472 - #set ($description = $NULL) 10473 - #setVariable (~"$description~" $result) 10474 -#end 10475 -## 10476 -## 10477 -## 10478 -#** 10479 - * Retrieves a list of entries to be displayed. The entries are either part of the blog's space, or have the blog 10480 - * document set as a parent. The number and range of entries returned (from all those belonging to this blog) depends on 10481 - * the blog display type: paginated (fixed number of entries), weekly (all entries in a week), monthly (all entries in a 10482 - * month), or all. 10483 - * 10484 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 10485 - * @param entries The resulting list of entries to display, a list of XDocument names. 10486 - *### 10487 -#macro(getBlogEntries $blogDoc $entries) 10488 - #if (!$entries) 10489 - #setVariable (~"$entries~" []) 10490 - #end 10491 - #getAllBlogPostsQuery($query) 10492 - #isDefaultBlog($blogDoc $isDefault) 10493 - #set($queryParams = \{}) 10494 - #if ($isDefault) 10495 - #getCategoryAllBlogPostsQuery($query) 10496 - #set($query = ~"$\{query} and (doc.creator = :creator or (isPublished.value = 1 and hidden.value = 0)) and (doc.space = :space or catList like :catList escape '!')~") 10497 - #set($discard = $queryParams.put('creator', $xcontext.user)) 10498 - #set($discard = $queryParams.put('space', $blogDoc.space)) 10499 - #set($sanitizedBlogSpace = $blogDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 10500 - #set($discard = $queryParams.put('catList', $sanitizedBlogSpace)) 10501 - #else 10502 - #set($query = ~"$\{query} and (doc.space = :space or doc.parent = :parent)~") 10503 - #getBlogPostsLocation($blogDoc.space $blogPostsLocation) 10504 - #set($discard = $queryParams.put('space', $blogPostsLocation)) 10505 - #set($discard = $queryParams.put('parent', $blogDoc.space)) 10506 - #end 10507 - #getBlogDisplayType($blogDoc $displayType) 10508 - #if($displayType == 'weekly') 10509 - #getWeeklyBlogEntries($blogDoc $query $entries $queryParams) 10510 - #elseif($displayType == 'monthly') 10511 - #getMonthlyBlogEntries($blogDoc $query $entries $queryParams) 10512 - #elseif($displayType == 'all') 10513 - #getAllBlogEntries($blogDoc $query $entries $queryParams) 10514 - #else 10515 - #getPagedBlogEntries($blogDoc $query $entries $queryParams) 10516 - #end 10517 -#end 10518 -## 10519 -## 10520 -## 10521 -#** 10522 - * Retrieves a list of entries to be displayed. The entries are taken from a ~"page~" of the blog, a sequence of documents 10523 - * defined by the request parameters <tt>ipp</tt> (items per page) and <tt>page</tt> (the current page). Initially the 10524 - * first page is displayed, with the number of entries defined in the blog object in the <tt>itemsPerPage</tt> property 10525 - * (10 if not defined). 10526 - * 10527 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 10528 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 10529 - * refined to restrict to a given space, or to a given search criteria, etc. 10530 - * @param entries The resulting list of entries to display, a list of XDocument names. 10531 - * @param queryParams The parameters to bind with the query. 10532 - *### 10533 -#macro(getPagedBlogEntries $blogDoc $query $entries $queryParams) 10534 - #if (!$entries) 10535 - #setVariable (~"$entries~" []) 10536 - #end 10537 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 10538 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~")) 10539 - #bindQueryParameters($countQueryObj $queryParams) 10540 - #bindQueryParameters($queryObj $queryParams) 10541 - #set($totalEntries = $countQueryObj.count()) 10542 - #getBlogProperty($blogDoc 'itemsPerPage' '10' $defaultItemsPerPage) 10543 - #set($defaultItemsPerPage = $numbertool.toNumber($defaultItemsPerPage).intValue()) 10544 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 10545 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 10546 - #set($discard = $entries.addAll($queryObj.setLimit($itemsPerPage).setOffset($startAt).addFilter(~"unique~").execute())) 10547 -#end 10548 -## 10549 -## 10550 -## 10551 -#** 10552 - * Retrieves a list of entries to be displayed. The entries are taken from a week of the blog. The target week is 10553 - * defined by the request parameters <tt>week</tt> (the week number in the year, from 1 to 52) and <tt>year</tt> (4 10554 - * digit year). Initially the current week is displayed. 10555 - * 10556 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 10557 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 10558 - * refined to restrict to a given space, or to a given search criteria, etc. 10559 - * @param entries The resulting list of entries to display, a list of XDocument names. 10560 - * @param queryParams The parameters to bind with the query. 10561 - *### 10562 -#macro(getWeeklyBlogEntries $blogDoc $query $entries $queryParams) 10563 - #if (!$entries) 10564 - #setVariable (~"$entries~" []) 10565 - #end 10566 - #getRequestedWeek($weekDate) 10567 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 10568 - #set($minDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundFloor())) 10569 - #set($maxDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundCeiling())) 10570 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 10571 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 10572 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 10573 - #bindQueryParameters($countQueryObj $queryParams) 10574 - #bindQueryParameters($queryObj $queryParams) 10575 - #set($totalEntries = $countQueryObj.count()) 10576 - #set($discard = $entries.addAll($queryObj.execute())) 10577 -#end 10578 -## 10579 -## 10580 -## 10581 -#** 10582 - * Retrieves a list of entries to be displayed. The entries are taken from a month of the blog. The target month is 10583 - * defined by the request parameters <tt>month</tt> (the month number, from 1 to 12) and <tt>year</tt> (4 10584 - * digit year). Initially the current month is displayed. 10585 - * 10586 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 10587 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 10588 - * refined to restrict to a given space, or to a given search criteria, etc. 10589 - * @param entries The resulting list of entries to display, a list of XDocument names. 10590 - * @param queryParams The parameters to bind with the query. 10591 - *### 10592 -#macro(getMonthlyBlogEntries $blogDoc $query $entries) 10593 - #if (!$entries) 10594 - #setVariable (~"$entries~" []) 10595 - #end 10596 - #getRequestedMonth($monthDate) 10597 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 10598 - #set($minDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundFloor())) 10599 - #set($maxDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundCeiling())) 10600 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 10601 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 10602 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 10603 - #bindQueryParameters($countQueryObj $queryParams) 10604 - #bindQueryParameters($queryObj $queryParams) 10605 - #set($totalEntries = $countQueryObj.count()) 10606 - #set($discard = $entries.addAll($queryObj.execute())) 10607 -#end 10608 -## 10609 -## 10610 -## 10611 -#** 10612 - * Retrieves a list of entries to be displayed. All entries belonging to the current blog are returned. 10613 - * 10614 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 10615 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 10616 - * refined to restrict to a given space, or to a given search criteria, etc. 10617 - * @param entries The resulting list of entries to display, a list of XDocument names. 10618 - * @param queryParams The parameters to bind with the query. 10619 - *### 10620 -#macro(getAllBlogEntries $blogDoc $query $entries $queryParams) 10621 - #if (!$entries) 10622 - #setVariable (~"$entries~" []) 10623 - #end 10624 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 10625 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 10626 - #bindQueryParameters($countQueryObj $queryParams) 10627 - #bindQueryParameters($queryObj $queryParams) 10628 - #set($totalEntries = $countQueryObj.count()) 10629 - #set($discard = $entries.addAll($queryObj.execute())) 10630 -#end 10631 -## 10632 -## 10633 -## 10634 -#** 10635 - * Retrieves a list of entries to be displayed. Only (and all) unpublished entries are returned. 10636 - * 10637 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 10638 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 10639 - * refined to restrict to a given space, or to a given search criteria, etc. 10640 - * @param queryParams The parameters to bind with the query. 10641 - * @param entries The resulting list of entries to display, a list of XDocument names. 10642 - *### 10643 -#macro(getUnpublishedBlogEntries $blogDoc $query $queryParams $entries) 10644 - #if (!$entries) 10645 - #setVariable (~"$entries~" []) 10646 - #end 10647 - #set($query = ~"$\{query} and isPublished.value = 0~") 10648 - #set ($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 10649 - #set ($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 10650 - #bindQueryParameters($countQueryObj $queryParams) 10651 - #bindQueryParameters($queryObj $queryParams) 10652 - #set($totalEntries = $countQueryObj.count()) 10653 - #set($discard = $entries.addAll($queryObj.execute())) 10654 -#end 10655 -## 10656 -## 10657 -## 10658 -#** 10659 - * Retrieves a list of entries to be displayed. The entries are taken from all the wiki, and not from a specific blog. 10660 - * 10661 - * @param entries The resulting list of entries to display, a list of XDocument names. 10662 - *### 10663 -#macro(getGlobalBlogEntries $entries) 10664 - #if (!$entries) 10665 - #setVariable (~"$entries~" []) 10666 - #end 10667 - #getAllBlogPostsQuery($query) 10668 - #set($totalEntries = $services.query.hql($query).count()) 10669 - #set($defaultItemsPerPage = 20) 10670 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 10671 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 10672 - #set($discard = $entries.addAll($services.query.hql(~"$\{query} order by publishDate.value desc~").setLimit($itemsPerPage).setOffset($startAt).execute())) 10673 -#end 10674 -#** 10675 - * Return the base query for selecting blog entries. It filters only visible entries, but does not bind to a specific 10676 - * blog, nor specify a range or an ordering criteria. 10677 - * 10678 - * This macro is a duplicate of #getAllBlogPostsQuery($query). Keep it in case it's used outside, in custom code. 10679 - * 10680 - * @param query The basic query for selecting blog entries. 10681 - *# 10682 -#macro(getBlogEntriesBaseQuery $query) 10683 - #getAllBlogPostsQuery($query) 10684 -#end 10685 -#** 10686 - * Return the Query for selecting the all wiki blog posts without filtering 10687 - * 10688 - * @param query The basic query for selecting blog entries. 10689 - *# 10690 -#macro(getAllBlogPostsQuery $query) 10691 - #set ($query = $NULL) 10692 - #setVariable(~"$query~" ~", BaseObject as obj, IntegerProperty isPublished, 10693 - IntegerProperty hidden, DateProperty publishDate 10694 - where doc.fullName <> '$blogPostTemplate' and 10695 - obj.name=doc.fullName and obj.className='$blogPostClassname' and 10696 - isPublished.id.id = obj.id and isPublished.id.name = 'published' and 10697 - hidden.id.id = obj.id and hidden.id.name='hidden' and 10698 - publishDate.id.id = obj.id and publishDate.id.name='publishDate' and 10699 - (doc.creator = '$escapetool.sql($xcontext.user)' or (isPublished.value = 1 and hidden.value = 0))~") 10700 -#end 10701 -## 10702 -## 10703 -## 10704 -###** 10705 - * Return the Query for selecting the all wiki blog posts with categories filtering 10706 - * 10707 - * @param query The basic query for selecting blog entries. 10708 - *### 10709 -#macro(getCategoryAllBlogPostsQuery $query) 10710 - #set ($query = $NULL) 10711 - #getAllBlogPostsQuery($baseQuery) 10712 - #set ($baseQuery = $baseQuery.replace('DateProperty publishDate', 'DateProperty publishDate, DBStringListProperty as category left join category.list catList')) 10713 - #setVariable(~"$query~" ~"$\{baseQuery} and obj.id=category.id.id and category.id.name='category'~") 10714 -#end 10715 -## 10716 -## 10717 -## 10718 -#** 10719 - * Determines how is the blog index split into pages: paginated (fixed number of entries), weekly (all entries in a 10720 - * week), monthly (all entries in a month), or all. 10721 - * 10722 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>displayType</tt> 10723 - * property set. 10724 - * @param displayType The resulting string. If the blog object does not define anything, it is considered paginated. 10725 - *### 10726 -#macro(getBlogDisplayType $blogDoc $displayType) 10727 - #getBlogProperty($blogDoc 'displayType' 'paginated' $result) 10728 - #set ($displayType = $NULL) 10729 - #setVariable (~"$displayType~" $result) 10730 -#end 10731 -## 10732 -## 10733 -## 10734 -#** 10735 - * Displays a list of entries. 10736 - * 10737 - * @param entries The entries to display, a list of XDocument names. 10738 - * @param displaying What exactly is displayed: blog index, a single blog entry, a blog category, search results, 10739 - * unpublished entries, etc. This will be used as the classname(s) for the container div (hfeed). Currently 10740 - * used values: index, single, category, search, unpublished, hidden. 10741 - * @param onlyExtract If <tt>true</tt>, only display the extract of articles where available, otherwise display the full content. 10742 - * @param shouldDisplayTitles If <tt>true</tt>, display the blog title (blog posts shouldn't display the title when they're 10743 - * displayed alone on their page since it's the page title which is used in this case) 10744 - *### 10745 -#macro(displayBlog $entries $displaying $onlyExtract $shouldDisplayTitles) 10746 - #set($blogDay = '') 10747 - (% class=~"hfeed $!\{displaying}~" ~%)((( 10748 - (% class=~"blogDay~" ~%)((( 10749 - #foreach ($entryDoc in $xwiki.wrapDocs($entries)) 10750 - #getEntryObject($entryDoc $entryObj) 10751 - ## Although all entries should have one of the two objects, better check to be sure. 10752 - #if(~"$!\{entryObj}~" != '') 10753 - #getEntryDate($entryDoc $entryObj $entryDate) 10754 - ## Display a ~"calendar sheet~" for each day. All entries posted on the same day share one such sheet. 10755 - #set($entryDateStr = $xwiki.formatDate($entryDate, 'yyyyMMMMdd')) 10756 - #if($blogDay != $entryDateStr) 10757 - #if($blogDay != '') 10758 - ))) 10759 - (% class=~"blogDay~" ~%)((( 10760 - #end 10761 - #displayBlogDate($entryDate) 10762 - #set ($blogDay = $entryDateStr) 10763 - #end 10764 - ## Finally, display the entry. 10765 - #displayEntry($entryDoc $entryObj $onlyExtract $shouldDisplayTitles true) 10766 - #end 10767 - #end 10768 - )))## blogDay 10769 - )))## hfeed 10770 -#end 10771 -## 10772 -## 10773 -## 10774 -#** 10775 - * Get the entry object, either a new BlogPost or an old Article. 10776 - * 10777 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 10778 - * @param entryObj The resulting xobject of the blog post. 10779 - *### 10780 -#macro(getEntryObject $entryDoc $__entryObj) 10781 - #set($result = $entryDoc.getObject(~"$\{blogPostClassname}~")) 10782 - #if(!$result) 10783 - #set($result = $entryDoc.getObject(~"$\{oldArticleClassname}~")) 10784 - #end 10785 - ## NOTE: The reason we put an underscore in front of the variable name is to prevent the following line from 10786 - ## overwriting the $entryObj variable that may be defined before this macro is called. Of course, $__entryObj may be 10787 - ## overwritten in this case but it's less likely to have such a variable defined before. 10788 - #set ($__entryObj = $NULL) 10789 - #setVariable (~"$__entryObj~" $result) 10790 -#end 10791 -## 10792 -## 10793 -## 10794 -#** 10795 - * Gets the date associated with a blog entry. This is the publication date. For unpublished entries, initially this is 10796 - * the document creation date, but can be edited by the user. 10797 - * 10798 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 10799 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 10800 - * @param result The resulting date, an instance of <tt>java.util.Date</tt>. 10801 - *### 10802 -#macro(getEntryDate $entryDoc $entryObj $result) 10803 - #set ($result = $NULL) 10804 - #setVariable (~"$result~" $entryObj.getProperty('publishDate').value) 10805 -#end 10806 -## 10807 -## 10808 -## 10809 -#** 10810 - * Displays a date, nicely formatted as a calendar page. 10811 - * 10812 - * @param date The date to display, an instance of <tt>java.util.Date</tt>. 10813 - *### 10814 -#macro(displayBlogDate $date) 10815 - #set($year = $xwiki.formatDate($date, 'yyyy')) 10816 - ## 3 letter month name, like Jan, Dec. 10817 - #set($month = $xwiki.formatDate($date, 'MMM')) 10818 - ## Uncomment to get a full length month name, like January, December. 10819 - ## TODO: this could be defined somewhere in the blog style. 10820 - ## #set($month = $xwiki.formatDate($date, 'MMMM')) 10821 - #set($day = $xwiki.formatDate($date, 'dd')) 10822 - (% class=~"blogdate~" ~%) 10823 - == (% class=~"month~" ~%)$month(%~%) (% class=~"day~" ~%)$day(%~%) (% class=~"year~" ~%)$year(%~%) == 10824 -#end 10825 -## 10826 -## 10827 -## 10828 -#** 10829 - * Displays a blog article: management tools, header, content, footer. 10830 - * 10831 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 10832 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 10833 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 10834 - * @param shouldDisplayTitle If <tt>true</tt>, display the blog title (blog posts shouldn't display the title 10835 - * when they're displayed alone on their page since it's the page title which is used in this case) 10836 - * @param shouldDisplayActions If <tt>true</tt>, display the blog post actions buttons 10837 - *### 10838 -#macro(displayEntry $entryDoc $entryObj $onlyExtract $shouldDisplayTitle $shouldDisplayActions) 10839 - ## Only articles with an explicit hidden setting or an explicit unpublished setting are hidden 10840 - #isPublished($entryObj $isPublished) 10841 - #isHidden($entryObj $isHidden) 10842 - #if($doc.fullName == $entryDoc.fullName) 10843 - (% class=~"hentry single-article~" ~%)((( 10844 - #else 10845 - (% class=~"hentry#if(!$isPublished) unpublished-article#elseif($isHidden) hidden-article#end~" ~%)((( 10846 - #end 10847 - #if ($shouldDisplayActions) 10848 - #displayEntryTools($entryDoc $entryObj) 10849 - #end 10850 - #if($shouldDisplayTitle) 10851 - #displayEntryTitle($entryDoc $entryObj) 10852 - #end 10853 - #if($doc.fullName == $entryDoc.fullName) 10854 - #if(!$isPublished) 10855 - \{\{warning}}\{\{translation key='blog.code.published'/}}\{\{/warning}} 10856 - #elseif($isHidden) 10857 - \{\{warning}}\{\{translation key='blog.code.hidden'/}}\{\{/warning}} 10858 - #end 10859 - #end 10860 - #displayEntryContent($entryDoc $entryObj $onlyExtract) 10861 - #displayEntryFooter($entryDoc $entryObj) 10862 - )))## hentry 10863 -#end 10864 -## 10865 -## 10866 -## 10867 -#** 10868 - * Checks if the provided blog is published or not. 10869 - * 10870 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 10871 - * @param isPublished The resulting boolean, true if the entry is considered published. 10872 - *### 10873 -#macro(isPublished $entryObj $isPublished) 10874 - #set ($isPublished = $NULL) 10875 - ## This should work for both old articles, which don't have the 'published' property at all, and 10876 - ## are considered published by default, and new entries, that should have 1 if published. 10877 - #if (~"$!\{entryObj.getProperty('published').value}~" != '0') 10878 - #setVariable (~"$isPublished~" true) 10879 - #else 10880 - #setVariable (~"$isPublished~" false) 10881 - #end 10882 -#end 10883 -## 10884 -## 10885 -## 10886 -#** 10887 - * Checks if the provided blog is hidden or not. 10888 - * 10889 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass<tt> xclass. 10890 - * @param isHiddel The resulting boolean, true if the entry is considered hidden. 10891 - *### 10892 -#macro(isHidden $entryObj $isHidden) 10893 - #set ($isHidden = $NULL) 10894 - ## This should work for both old articles, which don't have the 'hidden' property at all, and 10895 - ## are considered visible by default, and new entries, that should have 1 if hidden. 10896 - #if (~"$!\{entryObj.getProperty('hidden').value}~" == '1') 10897 - #setVariable (~"$isHidden~" true) 10898 - #else 10899 - #setVariable (~"$isHidden~" false) 10900 - #end 10901 -#end 10902 -## 10903 -## 10904 -## 10905 -#** 10906 - * Displays several ~"tools~" for manipulating blog posts: hide/show, publish, edit. 10907 - * 10908 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 10909 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 10910 - *### 10911 -#macro(displayEntryTools $entryDoc $entryObj) 10912 - #if($xcontext.action == 'view') 10913 - (% class=~"blog-entry-toolbox~" ~%)((( 10914 - #displayPublishButton($entryDoc $entryObj) 10915 - #displayHideShowButton($entryDoc $entryObj) 10916 - #displayEditButton($entryDoc $entryObj) 10917 - #displayDeleteButton($entryDoc $entryObj) 10918 - ))) 10919 - #end 10920 -#end 10921 -## 10922 -## 10923 -## 10924 -#** 10925 - * Displays the publish button to the entry <strong>creator</strong>, if the article is not published yet. 10926 - * 10927 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 10928 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 10929 - * @todo AJAX calls. 10930 - *### 10931 -#macro(displayPublishButton $entryDoc $entryObj) 10932 - #isPublished($entryObj $isPublished) 10933 - #if(!$isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 10934 - [[#toolImage('world')>>path:$blogPublisher.getURL('view', ~"entryName=$\{escapetool.url($entryDoc.fullName)}&xredirect=$\{escapetool.url($thisURL)}&form_token=$!\{services.csrf.getToken()}~")||title=~"$services.localization.render('blog.code.notpublished')~"]]## 10935 - #end 10936 -#end 10937 -## 10938 -## 10939 -## 10940 -#** 10941 - * Displays the hide or show button to the entry <strong>creator</strong>, if the article is already published. 10942 - * 10943 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 10944 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 10945 - *### 10946 -#macro(displayHideShowButton $entryDoc $entryObj) 10947 - #isPublished($entryObj $isPublished) 10948 - #isHidden($entryObj $isHidden) 10949 - ## Only published articles can be hidden. Unpublished articles are considered already hidden. 10950 - #if($isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 10951 - #set ($queryString = \{ 10952 - 'xredirect' : $thisURL, 10953 - 'form_token' : $services.csrf.getToken() 10954 - }) 10955 - #if ($isHidden) 10956 - #set ($discard = $queryString.putAll(\{ 10957 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 0, 10958 - 'comment' : $services.localization.render('blog.code.madevisible') 10959 - })) 10960 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 10961 - [[#toolImage('unlock')>>path:$lockURL||class=~"blog-tool-show~" title=~"$services.localization.render('blog.code.makevisible')~"]]## 10962 - #else 10963 - #set ($discard = $queryString.putAll(\{ 10964 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 1, 10965 - 'comment' : $services.localization.render('blog.code.hid') 10966 - })) 10967 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 10968 - [[#toolImage('lock')>>path:$lockURL||class=~"blog-tool-hide~" title=~"$services.localization.render('blog.code.hide')~"]]## 10969 - #end 10970 - #end 10971 -#end 10972 -## 10973 -## 10974 -## 10975 -#** 10976 - * Displays the edit button to those that can edit the article. 10977 - * 10978 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 10979 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 10980 - *### 10981 -#macro(displayEditButton $entryDoc $entryObj) 10982 - #if($xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 10983 - ## Call getDefaultEditMode() for backward compatibility with older blog posts. 10984 - [[#toolImage('pencil')>>path:$entryDoc.getURL('edit')||title=~"$services.localization.render('blog.code.editpost')~"]]## 10985 - #end 10986 -#end 10987 -## 10988 -## 10989 -## 10990 -#** 10991 - * Displays the delete button to those that can edit the article. 10992 - * 10993 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 10994 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 10995 - * @todo AJAX calls. 10996 - *### 10997 -#macro(displayDeleteButton $entryDoc $entryObj) 10998 - #if($xwiki.hasAccessLevel('delete', $xcontext.user, $entryDoc.fullName)) 10999 - [[#toolImage('cross')>>path:$entryDoc.getURL('delete')||title=~"$services.localization.render('blog.code.deletepost')~"]]## 11000 - #end 11001 -#end 11002 -## 11003 -## 11004 -## 11005 -#** 11006 - * Displays the title of the entry. 11007 - * 11008 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 11009 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 11010 - *### 11011 -#macro(displayEntryTitle $entryDoc $entryObj) 11012 - #if($doc.fullName == $entryDoc.fullName) 11013 - (% class=~"entry-title~" ~%) 11014 - = $services.rendering.escape($entryDoc.display('title', 'view', $entryObj), $xwiki.getCurrentContentSyntaxId()) = 11015 - #else 11016 - (% class=~"entry-title~" ~%) 11017 - === [[$services.rendering.escape($entryDoc.display('title', 'view', $entryObj),$xwiki.getCurrentContentSyntaxId())>>doc:$services.rendering.escape($services.model.serialize($entryDoc.getDocumentReference(),'default'),$xwiki.getCurrentContentSyntaxId())]] === 11018 - #end 11019 -#end 11020 -## 11021 -## 11022 -## 11023 -#** 11024 - * Displays the body of the entry. 11025 - * 11026 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 11027 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 11028 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 11029 - *### 11030 -#macro(displayEntryContent $entryDoc $entryObj $onlyExtract) 11031 - (% class=~"#if($onlyExtract)entry-summary#\{else}entry-content#end~" ~%)((( 11032 - #getEntryContent($entryDoc $entryObj $onlyExtract $entryContent) 11033 - ## FIXME: This causes the blog's content to not be annotatable. See http://jira.xwiki.org/browse/XWIKI-6328 11034 - ## Should probably be replaced by a display macro call with a reference to the object property holding the post's content 11035 - \{\{html wiki=~"false~"}}$entryDoc.getRenderedContent($entryContent, $entryDoc.syntax.toIdString())\{\{/html}} 11036 - ))) ## entry-content 11037 - (% class=~"clearfloats~" ~%)((())) 11038 -#end 11039 -## 11040 -## 11041 -## 11042 -#** 11043 - * Extracts the body of the entry that should be displayed. If <tt>onlyExtract</tt> is <tt>true</tt>, display the content 11044 - * of the <tt>extract</tt> field (if not empty). 11045 - * 11046 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 11047 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 11048 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 11049 - * @param entryContent The resulting content. 11050 - * @param removeEllipsis If <tt>true</tt>, then don't display an ellipsis at the end of the content (only used when 11051 - * <tt>onlyExtract</tt> is <tt>true</tt>) 11052 - *### 11053 -#macro(getEntryContent $entryDoc $entryObj $onlyExtract $entryContent $removeEllipsis) 11054 - #if ($onlyExtract) 11055 - ## Note: We trim the summary so that if there's some white space it won't cause the summary to be used instead 11056 - ## of the content. 11057 - #set ($macro.result = $entryObj.getProperty('extract').value.trim()) 11058 - #end 11059 - #if(~"$!macro.result~" == '') 11060 - #set($macro.result = $entryObj.getProperty('content').value) 11061 -#* Disabled until the content can be cleanly cut. 11062 -* #if($onlyExtract && $result.length()>$maxchars) 11063 -* #set($i = $macro.result.lastIndexOf(~" ~", $maxchars)) 11064 -* #set($i = $i + 1) 11065 -* #set($macro.result = ~"$\{macro.result.substring(0,$i)} *[...>$\{entryDoc.fullName}]*~") 11066 -* #end 11067 -## *### 11068 - #elseif (!$removeEllipsis) 11069 - #if($entryDoc.syntax.toIdString() == 'xwiki/1.0') 11070 - #set($macro.result = ~"$\{macro.result} <a href='$\{entryDoc.getExternalURL()}' title='$services.localization.render('blog.code.readpost')'>...</a>~") 11071 - #elseif($entryDoc.syntax.toIdString() == 'xwiki/2.0' || $entryDoc.syntax.toIdString() == 'xwiki/2.1') 11072 - #set($macro.result = ~"$\{macro.result} [[...>>$\{services.rendering.escape($entryDoc.getFullName(), $entryDoc.getSyntax())}||title='$services.localization.render('blog.code.readpost')']]~") 11073 - #end 11074 - #end 11075 - #set ($entryContent = $NULL) 11076 - #setVariable (~"$entryContent~" $macro.result) 11077 -#end 11078 -## 11079 -## 11080 -## 11081 -#** 11082 - * Displays the footer of the entry. 11083 - * 11084 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 11085 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 11086 - *### 11087 -#macro(displayEntryFooter $entryDoc $entryObj) 11088 - (% class=~"entry-footer~" ~%)((( 11089 - #isPublished($entryObj $isPublished) 11090 - (% class='entry-author-label' ~%) 11091 - #if($isPublished) 11092 - \{\{translation key='blog.code.postedby'/}} ## 11093 - #else 11094 - \{\{translation key='blog.code.createdby'/}} ## 11095 - #end 11096 - \{\{html wiki=~"false~" clean=~"false~"}}<span class='author vcard'>#userfn($entryDoc.creator)</span>\{\{/html}} ## 11097 - #getEntryDate($entryDoc $entryObj $entryDate) 11098 - #listCategories($entryObj) #* 11099 - ## Since the publish date and update date are not set at the exact same time, there could be a small difference that 11100 - ## we assume cannot be more than 3 seconds. 11101 - *#(% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.permalink'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||rel=~"bookmark~"]] ## 11102 - #if ($showcomments) 11103 - (% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.comments'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||anchor=~"Comments~"]] (% class=~"itemCount~" ~%)($entryDoc.comments.size())(%~%) ## 11104 - #end ## 11105 - #if($entryDoc != $doc) ## 11106 - #displayEntryBlogLocation($entryDoc $entryObj) ## 11107 - #end 11108 - )))## entry-footer 11109 -#end 11110 -## 11111 -## 11112 -#** 11113 - * Display the blog for the entry (if it is not the currently displayed blog) 11114 - * 11115 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 11116 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 11117 - *### 11118 -#macro(displayEntryBlogLocation $entryDoc $entryObj) 11119 - #getBlogPostsLocation($entryDoc.getSpace() $blogPostsLocation) ## 11120 - #if(~"$!blogPostsLocation~" != ~"~") ## 11121 - #set($blogSpaceRef = $services.model.resolveSpace($blogPostsLocation)) ## 11122 - #set($blogDocRef = $services.model.createDocumentReference($services.model.getEntityReference('DOCUMENT', 'default').getName(), $blogSpaceRef)) ## 11123 - #if($doc.documentReference != $blogDocRef) ## 11124 - #set($blogDoc = $xwiki.getDocument($blogDocRef)) ## 11125 - #set($blogObj = $blogDoc.getObject('Blog.BlogClass')) ## 11126 - #if($blogObj) (% class=~"blogrefpath~" ~%)((( ## 11127 - $services.localization.render('blog.code.postedin') \{\{html clean=~"false~" wiki=~"false~"}} #hierarchy($blogDocRef, \{'selfIsActive' : true, 'local': true}) \{\{/html}} ## 11128 - )))(%~%)## 11129 - #end 11130 - #end 11131 - #end 11132 -#end 11133 -## 11134 -## 11135 -## 11136 -## 11137 -#** 11138 - * List the categories an entry belongs to. Used in the footer. The categories are instances of <tt>Blog.CategoryClass</tt>. 11139 - * 11140 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 11141 - *### 11142 -#macro(listCategories $entryObj) 11143 - #if($entryObj.getxWikiClass().getName() == $blogPostClassname) 11144 - #set($categories = $entryObj.getProperty('category').value) 11145 - #set($first = true) 11146 - #if($categories.size() > 0) 11147 - #foreach($category in $categories) 11148 - #set($categoryDoc = $!xwiki.getDocument($category)) 11149 - #if(!$categoryDoc.isNew() && $categoryDoc.getObject($\{blogCategoryClassname})) 11150 - #if($foreach.count == 1) 11151 - (% class='separator' ~%)·(%~%) $services.localization.render('blog.code.categories') ## 11152 - #else 11153 - , ## 11154 - #end## 11155 - [[$!\{categoryDoc.getObject($blogCategoryClassname).getValue('name')}>>$\{category}||rel='tag']]## 11156 - #end## 11157 - #end## 11158 - #end 11159 - #end 11160 -#end 11161 -## 11162 -## 11163 -## 11164 -#** 11165 - * Displays blog pagination links (older and newer entries). 11166 - * 11167 - * @param blogDoc the XDocument holding the blog definition object. 11168 - *### 11169 -#macro(displayNavigationLinks $blogDoc) 11170 - (% class=~"clearfloats~" ~%)((())) 11171 - #getBlogDisplayType($blogDoc $displayType) 11172 - #if($displayType == 'weekly') 11173 - (% class=~"pagingLinks~" ~%)((( 11174 - #getRequestedWeek($weekDate) 11175 - $weekDate.addWeeks(-1)## 11176 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousweek'/}}>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 11177 - #sep() 11178 - $weekDate.addWeeks(2)## 2 because we already subtracted 1 above 11179 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextweek'/}} »>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 11180 - ))) 11181 - #elseif($displayType == 'monthly') 11182 - (% class=~"pagingLinks~" ~%)((( 11183 - #getRequestedMonth($monthDate) 11184 - $monthDate.addMonths(-1)## 11185 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousmonth'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 11186 - #sep() 11187 - $monthDate.addMonths(2)## 2 because we already subtracted 1 above 11188 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextmonth'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 11189 - ))) 11190 - #elseif($displayType == 'all') 11191 - #else 11192 - ## Paginated 11193 - #if(($totalPages > 1)) 11194 - #set($queryString = '') 11195 - #foreach($p in $request.getParameterNames()) 11196 - #if($p != 'page' && $p != 'ipp') 11197 - #foreach($v in $request.getParameterValues($p)) 11198 - #set($queryString = ~"$\{queryString}&$\{escapetool.url($p)}=$\{escapetool.url($v)}~") 11199 - #end 11200 - #end 11201 - #end 11202 - (% class=~"pagingLinks~" ~%)((( 11203 - #if ($currentPageNumber < $totalPages) 11204 - #set($currentPageNumber = $currentPageNumber + 1) 11205 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.olderposts'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 11206 - #set($currentPageNumber = $currentPageNumber - 1) 11207 - #end 11208 - #if ($currentPageNumber > 1) 11209 - #if ($currentPageNumber < $totalPages) 11210 - #sep() 11211 - #end 11212 - #set($currentPageNumber = $currentPageNumber - 1) 11213 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.newerposts'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 11214 - #set($currentPageNumber = $currentPageNumber + 1) 11215 - #end 11216 - (% class=~"clear~" ~%)(%~%) 11217 - )))## pagingLinks 11218 - #end 11219 - #end 11220 -#end 11221 -## 11222 -## 11223 -## 11224 -#** 11225 - * Displays a message box with ~"publish~" icon. 11226 - * 11227 - * @param message A text message concerning blog article publishing 11228 - *### 11229 -#macro(publishMessageBox $message) 11230 -(% class=~"plainmessage publish-message~" ~%)((($services.icon.render('world') $message))) 11231 -#end 11232 -#** 11233 - * Displays a message box with ~"show/hide~" icon. 11234 - * 11235 - * @param message A text message concerning blog article hiding 11236 - *### 11237 -#macro(hideMessageBox $message) 11238 -(% class=~"plainmessage hide-message~" ~%)((($services.icon.render('unlock') $message))) 11239 -#end 11240 -## 11241 -## 11242 -## 11243 -#** 11244 - * Determine the requested week, for using in a weekly-indexed blog. The relevant request parameters are 11245 - * <tt>year</tt> and <tt>week</tt>. By default, the current week is used. 11246 - * 11247 - * @param monthDate The resulting week, a JODATime MutableDateTime. 11248 - *### 11249 -#macro(getRequestedWeek $weekDate) 11250 - #set ($weekDate = $NULL) 11251 - #setVariable (~"$weekDate~" $xwiki.jodatime.mutableDateTime) 11252 - #if(~"$!\{request.year}~" != '') 11253 - #set ($discard = $weekDate.setYear($numbertool.toNumber($request.year).intValue())) 11254 - #end 11255 - #if(~"$!\{request.week}~" != '') 11256 - #set ($discard = $weekDate.setWeekOfWeekyear($numbertool.toNumber($request.week).intValue())) 11257 - #end 11258 -#end 11259 -## 11260 -## 11261 -## 11262 -#** 11263 - * Determine the requested month, for using in a monthly-indexed blog. The relevant request parameters are 11264 - * <tt>year</tt> and <tt>month</tt>. By default, the current month is used. 11265 - * 11266 - * @param monthDate The resulting month, a JODATime MutableDateTime. 11267 - *### 11268 -#macro(getRequestedMonth $monthDate) 11269 - #set ($monthDate = $NULL) 11270 - #setVariable (~"$monthDate~" $xwiki.jodatime.mutableDateTime) 11271 - #if(~"$!\{request.year}~" != '') 11272 - #set ($discard = $monthDate.setYear($numbertool.toNumber($request.year).intValue())) 11273 - #end 11274 - #if(~"$!\{request.month}~" != '') 11275 - #set ($discard = $monthDate.setMonthOfYear($numbertool.toNumber($request.month).intValue())) 11276 - #end 11277 -#end 11278 -## 11279 -## 11280 -## 11281 -#** 11282 - * Retrieve a blog property (title, display type, etc). 11283 - * 11284 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 11285 - * @param propertyName The name of the property to be retrieved. One of the <tt>Blog.BlogClass</tt>'s properties. 11286 - * @param defaultValue The default value to use in case the blog object does not define one. 11287 - * @param propertyValue The resulting value. 11288 - *### 11289 -#macro(getBlogProperty $blogDoc $propertyName $defaultValue $propertyValue) 11290 - #set($result = ~"$!\{blogDoc.getObject($\{blogClassname}).getProperty($propertyName).value}~") 11291 - #if($result == '') 11292 - #set($result = $defaultValue) 11293 - #end 11294 - #set ($propertyValue = $NULL) 11295 - #setVariable (~"$propertyValue~" $result) 11296 -#end 11297 - 11298 -#** 11299 - * If an error occurs when executing an action, set a specific response status and display an error message. 11300 - * 11301 - * @param status The response status. 11302 - * @param text The user readable error to be displayed. Can be a translation key. 11303 - * @param parameters The parameters to use when decoding the translation key. 11304 - *### 11305 -#macro(blog__actionResponseError $status $text $parameters) 11306 - $response.setStatus($status) 11307 - #if($request.ajax) 11308 - $services.localization.render($text, $!parameters) 11309 - #else 11310 - \{\{error}}$services.localization.render($text, $!parameters)\{\{/error}} 11311 - #end 11312 -#end 11313 -## 11314 -## 11315 -## 11316 -#** 11317 - * Check if a blog is the Default blog (The one in the 'Blog' space). 11318 - * 11319 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 11320 - * @param isDefault The resulting boolean. 11321 - *### 11322 -#macro(isDefaultBlog $blogDoc $isDefault) 11323 - #set ($result = false) 11324 - #if ($blogDoc.space == 'Blog') 11325 - #set ($result = true) 11326 - #end 11327 - #setVariable(~"$isDefault~" $result) 11328 -#end 11329 -## 11330 -## 11331 -## 11332 -#** 11333 - * Retrieve the blog posts location (space). 11334 - * 11335 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 11336 - * @param postsLocation The resulting location. 11337 - *### 11338 -#macro(getBlogPostsLocation $blogSpace $postsLocation) 11339 - #getBlogDocument($blogSpace $blogDoc) 11340 - #getBlogProperty($blogDoc 'postsLocation' $blogDoc.space $result) 11341 - #set ($postsLocation = $NULL) 11342 - #setVariable (~"$postsLocation~" $result) 11343 -#end 11344 -## 11345 -## 11346 -## 11347 -#** 11348 - * Retrieve the blog categories location (space). 11349 - * 11350 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 11351 - * @param categoriesLocation The resulting location. 11352 - *### 11353 -#macro(getBlogCategoriesLocation $blogSpace $categoriesLocation) 11354 - #getBlogDocument($blogSpace $blogDoc) 11355 - #getBlogProperty($blogDoc 'categoriesLocation' 'Blog' $result) 11356 - #set ($postsLocation = $NULL) 11357 - #setVariable (~"$categoriesLocation~" $result) 11358 -#end 11359 -###** 11360 - * Return the Query for selecting the blog posts based on the context where the posts are displayed. 11361 - * for example there is 4 different panel contexts: 11362 - * aBlog.aPost or aBlog.WebHome 11363 - * aCategorySpace.aCategory 11364 - * aCategorySpace.WebHome 11365 - * Blog.aPost or Blog.WebHome 11366 - * 11367 - * @param query The query for selecting blog entries. 11368 - * @param queryParams The parameters to bind with the generated query. 11369 - * @param targetDoc The document in which the articles will be displayed. 11370 - *### 11371 -#macro(getAllBlogPostsQueryBasedOnDisplayContext $targetDoc $query $queryParams) 11372 - #set ($query = $NULL) 11373 - #set ($queryParams = $NULL) 11374 - #getCategoryAllBlogPostsQuery($resultQuery) 11375 - #set ($resultQueryParams = \{}) 11376 - #set($sanitizedSpace = $targetDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 11377 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 11378 - ## Get all posts that are in the default blog space('Blog') or in category 'Blog.%' 11379 - #set ($discard = $resultQueryParams.put('space', $targetDoc.space)) 11380 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 11381 - #set($resultQuery = ~"$\{resultQuery} and (doc.space = :space or catList like :catList escape '!')~") 11382 - #elseif($targetDoc.getObject($blogCategoryClassname)) 11383 - ## Get all posts that are in a category aCategorySpace.aCategory 11384 - #set ($discard = $resultQueryParams.put('catList', $targetDoc.fullName)) 11385 - #set($resultQuery = ~"$\{resultQuery} and (catList=:catList)~") 11386 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 11387 - ## Get all posts that are in a category aCategorySpace.% 11388 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 11389 - ## Exclude incategorized posts 11390 - #set ($excludedCategory = ~"$\{targetDoc.space}.WebHome~") 11391 - #if ($targetDoc.space == $defaultBlogSpace) 11392 - #set ($excludedCategory = ~"Blog.Categories.WebHome~") 11393 - #end 11394 - #set ($discard = $resultQueryParams.put('excludedCategory', $excludedCategory)) 11395 - #set($resultQuery = ~"$\{resultQuery} and (catList<>:excludedCategory) and (catList like :catList escape '!')~") 11396 - #else 11397 - ## Get all posts in blog space aBlog 11398 - #getAllBlogPostsQuery($resultQuery) 11399 - #getBlogPostsLocation($targetDoc.space $postsLocation) 11400 - #set ($discard = $resultQueryParams.put('space', $postsLocation)) 11401 - #set($resultQuery = ~"$\{resultQuery} and doc.space = :space~") 11402 - #end 11403 - #setVariable(~"$query~" $resultQuery) 11404 - #setVariable(~"$queryParams~" $resultQueryParams) 11405 -#end 11406 -## 11407 -## 11408 -## 11409 -###** 11410 - * Display blog posts based on the context where the posts are displayed. 11411 - * for example there is 4 different panel contexts: 11412 - * aBlog.aPost or aBlog.WebHome 11413 - * aCategorySpace.aCategory 11414 - * aCategorySpace.WebHome 11415 - * Blog.aPost or Blog.WebHome 11416 - * 11417 - * @param targetDoc The document in which the articles will be displayed. 11418 - * @param postsVisiblity The visibility of the posts to display: recent, unpublished, ... 11419 - * @param layout Layout of the the posts to display 11420 - * @param layoutParams additional layout parameters, it is a string like 'param1=val1|...|paramN=valueN' 11421 - * @param limit the number of posts to display 11422 - *### 11423 -#macro(displayBlogPostsBasedOnContext $targetDoc $postsVisiblity $layout $layoutParams $limit) 11424 - #if ($postLayout == 'full') 11425 - #set ($macro.paginated = 'yes') 11426 - #end 11427 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 11428 - ## Display all posts that are in the default blog space('Blog') or in category 'Blog.%' 11429 - #getBlogPostsLayout($xwiki.getDocument(~"$\{defaultBlogSpace}.WebHome~") $postsLayout) 11430 - #if (~"$!layout~" == '') 11431 - #set ($layout = $postsLayout) 11432 - #end 11433 - #if ($postsVisiblity == 'recent') 11434 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 11435 - #elseif($postsVisiblity == 'unpublished') 11436 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 11437 - #end 11438 - #elseif($targetDoc.getObject($blogCategoryClassname)) 11439 - ## Display all posts that are in a category aCategorySpace.aCategory 11440 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 11441 - #getBlogPostsLayout($blogDoc $postsLayout) 11442 - #if (~"$!layout~" == '') 11443 - #set ($layout = $postsLayout) 11444 - #end 11445 - #if ($postsVisiblity == 'recent') 11446 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 11447 - #elseif($postsVisiblity == 'unpublished') 11448 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 11449 - #end 11450 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 11451 - ## Display all posts that are in a category aCategorySpace.% 11452 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 11453 - #getBlogPostsLayout($blogDoc $postsLayout) 11454 - #if (~"$!layout~" == '') 11455 - #set ($layout = $postsLayout) 11456 - #end 11457 - #if ($postsVisiblity == 'recent') 11458 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 11459 - #elseif($postsVisiblity == 'unpublished') 11460 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 11461 - #end 11462 - #else 11463 - ## Display all posts in blog space aBlog 11464 - #getBlogDocument($targetDoc.space $blogDoc) 11465 - #getBlogPostsLayout($blogDoc $postsLayout) 11466 - #if (~"$!layout~" == '') 11467 - #set ($layout = $postsLayout) 11468 - #end 11469 - #if ($postsVisiblity == 'recent') 11470 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 11471 - #elseif($postsVisiblity == 'unpublished') 11472 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 11473 - #end 11474 - #end 11475 -#end 11476 -## 11477 -## 11478 -## 11479 -#** 11480 - * Bind parameters to a query object. 11481 - * 11482 - * @param queryObj The query object (org.xwiki.query.internal.ScriptQuery object) 11483 - * @param queryParams the query parameters. 11484 - *### 11485 -#macro(bindQueryParameters $queryObj $queryParams) 11486 - #set ($output = $queryObj) 11487 - #foreach( $key in $queryParams.keySet() ) 11488 - #set($output = $queryObj.bindValue($key, $queryParams.get($key))) 11489 - #end 11490 - #setVariable(~"$queryObj~" $output) 11491 -#end 11492 -## 11493 -## 11494 -## 11495 -#** 11496 - * Determines the blogposts layout: Default layout (Calendar), Image thumbnail 11497 - * 11498 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>postsLayout</tt> 11499 - * property set. 11500 - * @param postsLayout The resulting string. If the blog object does not define anything, it is considered full (default). 11501 - *### 11502 -#macro(getBlogPostsLayout $blogDoc $postsLayout) 11503 - #getBlogProperty($blogDoc 'postsLayout' 'full' $res) 11504 - #set ($postsLayout = $NULL) 11505 - #setVariable (~"$postsLayout~" $res) 11506 -#end 11507 -## 11508 -## 11509 -## 11510 -#** 11511 - * Retrieve the blog document of a categories space, which is the blog descriptor that have its categoriesLocation property set to the categories space 11512 - * 11513 - * @param categoriesSpace A <tt>String</tt>, the name of the space. 11514 - * @param blogDoc The resulting XDocument. 11515 - *### 11516 -#macro(getBlogDocumentForCategoriesSpace $categoriesSpace $blogDoc) 11517 - #set($macro.blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as categoriesLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=categoriesLocationProp.id.id and categoriesLocationProp.id.name='categoriesLocation' and categoriesLocationProp.value=:categoriesLocation order by doc.creationDate~").setLimit(1).setOffset(0).bindValue('categoriesLocation', $categoriesSpace).execute()) 11518 - #if($macro.blogDocs.size() > 0 && $categoriesSpace != $defaultBlogSpace) 11519 - #set($macro.result = $xwiki.getDocument($macro.blogDocs.get(0))) 11520 - #else 11521 - ## Fallback to Blog.WebHome, the default blog 11522 - #set($macro.result = $xwiki.getDocument('Blog.WebHome')) 11523 - #end 11524 - #set ($blogDoc = $NULL) 11525 - #setVariable (~"$blogDoc~" $macro.result) 11526 -#end" %) 11527 -((( 11528 -(% class="macro-placeholder hidden" %) 11529 -((( 11530 -macro:velocity 11531 -))) 11532 -))) 11533 -))) 11534 - 11535 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogPostLayoutMacros~"" %) 11536 -((( 11537 -(% class="macro-placeholder hidden" %) 11538 -((( 11539 -macro:include 11540 -))) 11541 - 11542 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|#** 11543 - * Extract the layout parameters from a string. 11544 - * 11545 - * @param layoutParamsString The string representation of the layout parameters. 11546 - * It should contain a String following this format ~"paramName1=Value1|paramName2=Value2|...|paramNameK=ValueK~" 11547 - * @param layoutsParameters The resulting layout parameters Map. 11548 - *### 11549 -#macro(extractLayoutParametersFromString $layoutParamsString $layoutsParameters) 11550 - #set ($layoutsParameters = $NULL) 11551 - #set ($macro.layoutParams = \{}) 11552 - #if (~"$!layoutParamsString~" != '') 11553 - #set ($macro.paramsArr = $layoutParamsString.split('\\|')) 11554 - #foreach ($item in $macro.paramsArr) 11555 - #set ($itemSplit = $item.split('=')) 11556 - #if ($itemSplit.size() == 2) 11557 - #set ($discard = $macro.layoutParams.put($itemSplit[0].trim(), $itemSplit[1].trim())) 11558 - #end 11559 - #end 11560 - #end 11561 - #setVariable(~"$layoutsParameters~" $macro.layoutParams) 11562 -#end" %) 11563 -((( 11564 -(% class="macro-placeholder hidden" %) 11565 -((( 11566 -macro:velocity 11567 -))) 11568 -))) 11569 -))) 11570 - 11571 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-| #macro(displaySmallPost $pDoc $pObj) 11572 - #initLayoutVars($pDoc $pObj) 11573 - <div class=~"col-xs-12 col-sm-6 next_blog~"> 11574 - <a href=~"$pDoc.uRL~" class=~"thumbnail~"> 11575 - <div class=~"row~"> 11576 - <div class=~"col-xs-4~"> 11577 - #if ($imageAtt) 11578 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 11579 - #end 11580 - </div> 11581 - <div class=~"col-xs-8 art_det~"> 11582 - <p class=~"text-left~"> 11583 - #if($displayTitle)$!postTitle #end 11584 - <br/><span class=~"date_info~"> $!dateStr </span> 11585 - </p> 11586 - #displayPostDetails($pDoc) 11587 - </div> 11588 - </div> 11589 - </a> 11590 - </div> 11591 - #end 11592 - ## 11593 - ## 11594 - ## 11595 - #macro(displayPinnedPost $pDoc $pObj) 11596 - #initLayoutVars($pDoc $pObj) 11597 - <div class=~"col-xs-12 col-sm-4 col-md-4 blog_pin~"> 11598 - <a href=~"$pDoc.uRL~" class=~"all-post-link~"> 11599 - <div class=~"thumbnail~"> 11600 - #if ($displayTitle && $displayTitleFirstOnPinnedPosts) 11601 - <h5 class=~"title-top~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 11602 - #end 11603 - #if ($imageAtt) 11604 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 11605 - #end 11606 - <div class=~"caption~"> 11607 - #if ($displayTitle && !$displayTitleFirstOnPinnedPosts) 11608 - <h5 class=~"text-left~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 11609 - #end 11610 - #if ($displaySummaryOnPinnedPosts) 11611 - <div class=~"text-left post-summary~"> 11612 - #set ($postContent = $pObj.getProperty('extract').value) 11613 - $!pDoc.getRenderedContent($postContent, $pDoc.syntax.toIdString()) 11614 - </div> 11615 - #end 11616 - #displayPostDetails($pDoc) 11617 - </div> 11618 - </div> 11619 - </a> 11620 - </div> 11621 - #end 11622 - ## 11623 - ## 11624 - ## 11625 - #macro(formatPostDate $pDoc $pObj) 11626 - #set ($formattedDate = $NULL) 11627 - #set($dateStr = $datetool.format('medium', $postDate, $xcontext.locale)) 11628 - #if (~"$!dateStr~" != '') 11629 - #set ($dateArr = $dateStr.split(' ')) 11630 - #if ($dateArr.size() > 3) 11631 - #set ($dateStr = ~"~") 11632 - #foreach($s in $dateArr.subList(0, 3)) 11633 - #set ($dateStr = ~"$\{dateStr}$\{s} ~") 11634 - #end 11635 - #end 11636 - #end 11637 - #setVariable(~"$formattedDate~" $dateStr) 11638 - #end 11639 - ## 11640 - ## 11641 - ## 11642 - #macro(displayPostDetails $pDoc) 11643 - <div class=~"row post-details~"> 11644 - <div class=~"col-xs-8 detail~"> 11645 - #if ($services.like.displayButton($pDoc.documentReference)) 11646 - #set ($optLikeRecord = $services.like.getLikes($pDoc.documentReference)) 11647 - ## Retrieve the likes number in XWiki 12.9+ 11648 - #set ($likeNumber = $optLikeRecord.get()) 11649 - #if (!$stringtool.isNumeric($likeNumber.toString())) 11650 - ## Retrieve the likes number in XWiki versions greater than 12.7 and lower than 12.9. 11651 - #set ($likeNumber = $optLikeRecord.get().likeNumber) 11652 - #end 11653 - #if ($stringtool.isNumeric($likeNumber.toString())) 11654 - <div class=~"post-likes btn btn-default disabled badge~" 11655 - title=~"$escapetool.xml($services.localization.render('like.button.title', [$likeNumber]))~"> 11656 - $services.icon.renderHTML('heart') <span class=~"like-number~">$likeNumber</span> 11657 - </div> 11658 - #end 11659 - #elseif ($services.ratings) 11660 - #set ($ratingsConfigDoc = $services.ratings.getConfigurationDocument($pDoc.documentReference)) 11661 - #if ($ratingsConfigDoc.getValue('displayRatings') == 1) 11662 - <ul class=~"pull-left note list-inline~"> 11663 - #foreach ($x in [1..5]) 11664 - #set ($cls = ~"~") 11665 - #if ($x > $averageVote) 11666 - #set ($cls = ~"-o~") 11667 - #end 11668 - <li><span class=~"fa fa-star$\{cls}~"></span></li> 11669 - #end 11670 - </ul> 11671 - #end 11672 - #end 11673 - </div> 11674 - #if ($showPostComments) 11675 - <div class=~"col-xs-4 com_det~"> 11676 - <p class=~"text-right~">$services.icon.renderHTML('comments') ($!nbComments)</p> 11677 - </div> 11678 - #end 11679 - </div> 11680 - #end 11681 - ## 11682 - ## 11683 - ## 11684 - #macro(initLayoutVars $pDoc $pObj) 11685 - #set ($postTitle = $pDoc.display('title', 'view', $pObj)) 11686 - #set ($imageAtt = $pDoc.getAttachment($pObj.getValue('image'))) 11687 - #isPublished($pObj $isPublished) 11688 - #isHidden($pObj $isHidden) 11689 - #getEntryDate($pDoc $pObj $postDate) 11690 - #formatPostDate($postDate $dateStr) 11691 - #set ($averageVote = $mathtool.round($services.ratings.getAverageRating($pDoc.documentReference).getAverageVote())) 11692 - #set ($nbComments = $pDoc.getComments().size()) 11693 - #set ($showPostComments = true) 11694 - #if ($xwiki.getSpacePreferenceFor('showcomments', $pDoc.documentReference.lastSpaceReference, '1') == '0') 11695 - #set ($showPostComments = false) 11696 - #end 11697 - #end 11698 - ## 11699 - ## 11700 - ## 11701 - #macro(displayEditPinnedPostsButton) 11702 - #if (~"$!macroAdditionalParams.get('postIndex')~" == '0' && $services.security.authorization.hasAccess('edit', $pinnedPostsSourceDoc.fullName)) 11703 - #set ($discard = $xwiki.ssx.use('Blog.PinnedPostsSheet')) 11704 - #set ($discard = $xwiki.jsx.use('Blog.PinnedPostsSheet')) 11705 - #set ($editPinnedPostsURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'get', 'sheet=Blog.PinnedPostsSheet')) 11706 - #set ($newPinnedPostsObjectURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'objectadd', ~"classname=Blog.PinnedPostsClass&form_token=$!\{services.csrf.getToken()}~")) 11707 - <div class=~"edit-pinned-posts-container~"> 11708 - <div class=~"col-xs-12 col-sm-12 col-md-12 text-right edit-pinned-posts~"> 11709 - <a href=~"javascript:;~" class=~"editPinnedPosts~"> 11710 - <span class=~"glyphicon glyphicon-edit~" aria-hidden=~"true~"></span> $services.localization.render('blog.post.layout.cards.pinnedposts.edit') 11711 - </a> 11712 - <input type=~"hidden~" id=~"editPinnedPostsURL~" value=~"$escapetool.xml($editPinnedPostsURL)~"/> 11713 - <input type=~"hidden~" id=~"newPinnedPostsObjectURL~" value=~"$escapetool.xml($newPinnedPostsObjectURL)~"/> 11714 - </div> 11715 - </div> 11716 - #if (~"$!pinnedPostsObj~" == '') 11717 - <input type=~"hidden~" name=~"createPinnedPostsObject~" value=~"1~"/> 11718 - #end 11719 - #end 11720 - #end" %) 11721 -((( 11722 -(% class="macro-placeholder hidden" %) 11723 -((( 11724 -macro:velocity 11725 -))) 11726 -))) 11727 - 11728 -(% data-macro="startmacro:velocity|-||-| #if ($services.security.authorization.hasAccess('view', $xcontext.macro.params.reference)) 11729 - #set ($postDoc = $xwiki.getDocument($xcontext.macro.params.reference)) 11730 - #getEntryObject($postDoc $postObj) 11731 - #if (~"$!postObj~" != '') 11732 - #extractLayoutParametersFromString($xcontext.macro.params.params $macroAdditionalParams) 11733 - ## 11734 - #set ($displayTitle = true) 11735 - #if (~"$!macroAdditionalParams.get('displayTitle')~" == 'false') 11736 - #set ($displayTitle = false) 11737 - #end 11738 - ## 11739 - #set ($displayTitleFirstOnPinnedPosts = false) 11740 - #if (~"$!macroAdditionalParams.get('displayTitleFirstOnPinnedPosts')~" == 'true') 11741 - #set ($displayTitleFirstOnPinnedPosts = true) 11742 - #end 11743 - ## 11744 - #set ($displaySummaryOnPinnedPosts = true) 11745 - #if (~"$!macroAdditionalParams.get('displaySummaryOnPinnedPosts')~" == 'false') 11746 - #set ($displaySummaryOnPinnedPosts = false) 11747 - #end 11748 - ## 11749 - #set ($postIndex = $numbertool.toNumber($macroAdditionalParams.get('postIndex')).intValue()) 11750 - #if ($postIndex == 0) 11751 - #set ($stopBlogPostsDisplay = false) 11752 - #end 11753 - #set ($listResultsCount = $numbertool.toNumber($macroAdditionalParams.get('list-results-count')).intValue()) 11754 - #set($discard = $xwiki.ssx.use('Blog.BlogPostLayoutCards')) 11755 - #set($scaleWidth = 600) 11756 - #set($imgQs=~"width=$scaleWidth~") 11757 - ## Display pinned posts 11758 - ## Get the list of pinned posts 11759 - #set ($pinnedPosts = []) 11760 - #set ($pinnedPostsSourceDoc = $NULL) 11761 - #if (~"$!macroAdditionalParams.get('forceDisplayPinnedPosts')~" == 'true' && ~"$!macroAdditionalParams.get('list-blog')~" != '') 11762 - #set ($pinnedPostsSourceDoc = $xwiki.getDocument($macroAdditionalParams.get('list-blog'))) 11763 - ## Note that the 'list-blog' parameter contains the value of the 'blog' parameter of the blogpostlist macro passed to the current layout macro 11764 - #end 11765 - #if (~"$!pinnedPostsSourceDoc~" != '') 11766 - #set ($pinnedPostsObj = $pinnedPostsSourceDoc.getObject('Blog.PinnedPostsClass')) 11767 - #if (~"$!pinnedPostsObj~" != '') 11768 - #set ($orderedPinnedPostsJSON = $pinnedPostsObj.getProperty('orderedPosts').value) 11769 - #if (~"$!orderedPinnedPostsJSON~" != '') 11770 - #set ($pinnedPosts = $jsontool.parse($orderedPinnedPostsJSON)) 11771 - #else 11772 - #set ($pinnedPosts = $pinnedPostsObj.getProperty('posts').value) 11773 - #end 11774 - #end 11775 - #if ($postIndex == 0 && $pinnedPosts.size() > 0) 11776 - \{\{html clean=~"false~"}} 11777 - #set ($x = 0) 11778 - #set ($showPinnedPostsButton = true) 11779 - #foreach ($pinnedPost in $pinnedPosts) 11780 - #if ($x == 0) 11781 - <div class=~"row flex-container~"> 11782 - #if ($showPinnedPostsButton) 11783 - #displayEditPinnedPostsButton() 11784 - #set($showPinnedPostsButton = false) 11785 - #end 11786 - #end 11787 - #set ($pinnedPostDoc = $xwiki.getDocument($pinnedPost)) 11788 - #getEntryObject($pinnedPostDoc $pinnedPostObj) 11789 - #if (~"$!pinnedPostObj~" != '') 11790 - #displayPinnedPost($pinnedPostDoc $pinnedPostObj) 11791 - #end 11792 - #set ($x = $mathtool.add($x, 1)) 11793 - #if ($x == 3) 11794 - #set ($x = 0) 11795 - </div> 11796 - #end 11797 - #end 11798 - #if ($mathtool.mod($x, 3) != 0) 11799 - </div> 11800 - #end 11801 - \{\{/html}} 11802 - 11803 - ## If the first post is a pinned post : this means that all the posts are pinned 11804 - ## In this case, avoid displaying the posts again after the pinned posts section. 11805 - #if ($pinnedPosts.contains($xcontext.macro.params.reference)) 11806 - #set ($stopBlogPostsDisplay = true) 11807 - #end 11808 - #elseif($postIndex == 0 && $pinnedPosts.size() == 0) 11809 - 11810 - \{\{html}} 11811 - <div class=~"row no-pinnded-posts~"> 11812 - #displayEditPinnedPostsButton() 11813 - </div> 11814 - \{\{/html}} 11815 - 11816 - #end 11817 - #end 11818 - #if (!$stopBlogPostsDisplay) 11819 - \{\{html clean=~"false~"}} 11820 - #if (~"$!nbDisplayedPosts~" == '' || $postIndex == 0) 11821 - #set ($nbDisplayedPosts = 0) 11822 - #end 11823 - #if($mathtool.mod($nbDisplayedPosts, 2) == 0) 11824 - #if ($nbDisplayedPosts != 0) 11825 - </div> 11826 - #set ($lastHtmlTag = 'c') 11827 - #end 11828 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 11829 - <div class=~"row~"> 11830 - #set ($lastHtmlTag = 'o') 11831 - #set ($lastRowClass = ~"~") 11832 - #else 11833 - <div class=~"row flex-container~"> 11834 - #set ($lastHtmlTag = 'o') 11835 - #set ($lastRowClass = ~"flex~") 11836 - #end 11837 - #end 11838 - #displaySmallPost($postDoc $postObj) 11839 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 11840 - </div> 11841 - #set ($lastHtmlTag = 'c') 11842 - #end 11843 - #set ($nbDisplayedPosts = $mathtool.add($nbDisplayedPosts, 1)) 11844 - #if ($postIndex == $mathtool.sub($listResultsCount, 1)) 11845 - #if (~"$!lastHtmlTag~" == 'o') 11846 - #if ($mathtool.mod($nbDisplayedPosts, 2) == 1 && $lastRowClass == ~"flex~") 11847 - <div class=~"col-xs-12 col-sm-6~"></div> 11848 - #end 11849 - </div> 11850 - #end 11851 - #end 11852 - \{\{/html}} 11853 - #end 11854 - #else 11855 - \{\{error}}$services.localization.render('blog.blogpostlayout.notpost', [$xcontext.macro.params.reference])\{\{/error}} 11856 - #end 11857 - #else 11858 - \{\{error}}$services.localization.render('blog.blogpostlayout.post_view_not_allowed', [$xcontext.macro.params.reference])\{\{/error}} 11859 - #end" class="macro hidden macro-placeholder" %)macro:velocity(% data-macro="startmacro:html|-|clean=~"false~"|-|</div> 11860 -<div class=~"row flex-container~"> 11861 -<div class=~"col-xs-12 col-sm-6 next_blog~"> 11862 -<a href=~"/Nieuws/Aankondiging%20update%20Syntess%206.9.0181~" class=~"thumbnail~"> 11863 -<div class=~"row~"> 11864 -<div class=~"col-xs-4~"> 11865 -<img src=~"/download/Nieuws/Aankondiging%20update%20Syntess%206.9.0181/05-12-37-113_512.gif?width=600&rev=1.1~" /> 11866 -</div> 11867 -<div class=~"col-xs-8 art_det~"> 11868 -<p class=~"text-left~"> 11869 -Aankondiging update Syntess 6.9.0181 <br/><span class=~"date_info~"> Dec 12, 2023, </span> 11870 -</p> 11871 -<div class=~"row post-details~"> 11872 -<div class=~"col-xs-8 detail~"> 11873 -<div class=~"post-likes btn btn-default disabled badge~" 11874 -title=~"Number of likes on this page: 0~"> 11875 -<span class=~"fa fa-heart~"></span> <span class=~"like-number~">0</span> 11876 -</div> 11877 -</div> 11878 -<div class=~"col-xs-4 com_det~"> 11879 -<p class=~"text-right~"><span class=~"fa fa-comments~"></span> (0)</p> 11880 -</div> 11881 -</div> 11882 -</div> 11883 -</div> 11884 -</a> 11885 -</div>" class="macro macro hidden macro-placeholder" %)macro:html 11886 -))) 11887 -))) 11888 - 11889 -(% class="row flex-container" %) 11890 -((( 11891 -(% class="col-xs-12 col-sm-6 next_blog" %) 11892 -((( 11893 -(% class="row" %) 11894 -((( 11895 -(% class="col-xs-4" %) 11896 -((( 11897 -[[~[~[image:/download/Nieuws/Aankondiging%20update%20Syntess%206.9.0181/05-12-37-113_512.gif?width=600&rev=1.1~]~]>>path:/Nieuws/Aankondiging%20update%20Syntess%206.9.0181||class="thumbnail"]] 11898 -))) 11899 - 11900 -(% class="col-xs-8 art_det" %) 11901 -((( 11902 -(% class="text-left" %) 11903 -[[Aankondiging update Syntess 6.9.0181 11904 -(% class="date_info" %) Dec 12, 2023,>>path:/Nieuws/Aankondiging%20update%20Syntess%206.9.0181||class="thumbnail"]] 11905 - 11906 -(% class="row post-details" %) 11907 -((( 11908 -(% class="col-xs-8 detail" %) 11909 -((( 11910 -(% class="post-likes btn btn-default disabled badge" title="Number of likes on this page: 0" %) 11911 -((( 11912 -[[(% class="like-number" %)0>>path:/Nieuws/Aankondiging%20update%20Syntess%206.9.0181||class="thumbnail"]] 11913 -))) 11914 -))) 11915 - 11916 -(% class="col-xs-4 com_det" %) 11917 -((( 11918 -(% class="text-right" %) 11919 -[[(0)>>path:/Nieuws/Aankondiging%20update%20Syntess%206.9.0181||class="thumbnail"]] 11920 -))) 11921 -))) 11922 -))) 11923 -))) 11924 -))) 11925 - 11926 -(% class="macro" data-macro="startmacro:blogPostLayoutCards|-|reference=~"Nieuws.Nieuwsbrief oktober 2023~" params=~"displayTitle=true|useSummary=true|list-limit=10|list-layout=cards|list-blog=Nieuws.WebHome|list-paginated=no|list-results-count=10|postIndex=0|previousPostReference=|postIndex=1|previousPostReference=Nieuws.Nieuwsbrief januari 2024|postIndex=2|previousPostReference=Nieuws.Audit BMI en BORG|postIndex=3|previousPostReference=Nieuws.Nieuwsbrief december 2023|postIndex=4|previousPostReference=Nieuws.Nieuwsbrief november 2023|postIndex=5|previousPostReference=Nieuws.Feestelijke afsluiting, keuring materieel en tellen voorraden|postIndex=6|previousPostReference=Nieuws.RI&E 2023|postIndex=7|previousPostReference=Nieuws.Aankondiging update Syntess 6\\\\.9\\\\.0181~"" %) 11927 -((( 11928 -(% class="macro-placeholder hidden" %) 11929 -((( 11930 -macro:blogPostLayoutCards 11931 -))) 11932 - 11933 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogCode~"" %) 11934 -((( 11935 -(% class="macro-placeholder hidden" %) 11936 -((( 11937 -macro:include 11938 -))) 11939 - 11940 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogParameters~"" %) 11941 -((( 11942 -(% class="macro-placeholder hidden" %) 11943 -((( 11944 -macro:include 11945 -))) 11946 - 11947 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## Blog 11948 -#set($blogClassname = 'Blog.BlogClass') 11949 -#set($blogTemplate = 'Blog.BlogTemplate') 11950 -#set($blogSheet = 'Blog.BlogSheet') 11951 -## Blog entries 11952 -#set($blogPostClassname = 'Blog.BlogPostClass') 11953 -#set($blogPostTemplate = 'Blog.BlogPostTemplate') 11954 -#set($blogPostSheet = 'Blog.BlogPostSheet') 11955 -#set($blogPostObjectNumber = $xwiki.getDocument($blogPostTemplate).getObject($blogPostClassname).number) 11956 -#set($oldArticleClassname = 'XWiki.ArticleClass') 11957 -## Categories 11958 -#set($blogCategoryClassname = 'Blog.CategoryClass') 11959 -#set($blogCategoryTemplate = 'Blog.CategoryTemplate') 11960 -#set($blogCategorySheet = 'Blog.CategorySheet') 11961 -#set($blogCategoriesSheet = 'Blog.CategoriesSheet') 11962 -#set($oldBlogCategoryClassname = 'Blog.Categories') 11963 -#set($defaultCategoryParent = 'Blog.Categories') 11964 -## Style 11965 -#set($blogStyleDocumentName = 'Blog.BlogStyle') 11966 -#set($blogStyleDocument = $xwiki.getDocument($blogStyleDocumentName)) 11967 -## Clientside scripts 11968 -#set($blogScriptsDocumentName = 'Blog.BlogScripts') 11969 -#set($blogPublisher = $xwiki.getDocument('Blog.Publisher')) 11970 -## Misc 11971 -#set($thisURL = $doc.getURL($xcontext.action, $request.queryString)) 11972 -#set($isBlogPost = $doc.getObject($blogPostClassname)) 11973 -#set($defaultBlogSpace = 'Blog') 11974 -#set($isCategoryPage = $doc.getObject($blogCategoryClassname)) 11975 -#set($isCategoriesHomePage = $doc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 11976 -## 11977 -## 11978 -## 11979 -#** 11980 - * Displays an image, taken from the blog style document. 11981 - * 11982 - * @param $imgName The name of the icon from icons set to use. 11983 - *# 11984 -#macro(toolImage $imgName)(% class=~"icon-manage~"~%)$services.icon.render($imgName)(%~%)#end" %) 11985 -((( 11986 -(% class="macro-placeholder hidden" %) 11987 -((( 11988 -macro:velocity 11989 -))) 11990 -))) 11991 -))) 11992 - 11993 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## 11994 -## 11995 -## 11996 -## Import the blog skin and javascripts. 11997 -$!xwiki.ssx.use($blogStyleDocumentName)## 11998 -$!xwiki.jsx.use($blogScriptsDocumentName)## 11999 -## 12000 -## import the hierarchy for the path the blog post footer (in displayEntryBlogLocation) 12001 -#template('hierarchy_macros.vm')## 12002 -## 12003 -## 12004 -#** 12005 - * Prints a blog. This is the main macro used in the BlogSheet. 12006 - * 12007 - * @param blogDoc the XDocument holding the blog definition object. 12008 - *### 12009 -#macro(printBlog $blogDoc) 12010 - \{\{include reference='Blog.CreatePost'/}} 12011 - 12012 - ## Use the blogPostList macro to display the blogposts 12013 - ## The blogPostList is used only in case of 'all' or 'paged' blog display type because the blogPostList macro 12014 - ## do not support FTM the monthly and weekly blog display types 12015 - #getBlogDisplayType($blogDoc $displayType) 12016 - #if ($displayType == 'weekly' || $displayType == 'monthly') 12017 - #getBlogEntries($blogDoc $entries) 12018 - #displayBlog($entries 'index' true true) 12019 - #displayNavigationLinks($blogDoc) 12020 - #else 12021 - #getBlogDisplayType($blogDoc $displayType) 12022 - #set ($paginated = 'no') 12023 - #if ($displayType == 'paginated') 12024 - #set ($paginated = 'yes') 12025 - #end 12026 - #getBlogPostsLayout($blogDoc $postsLayout) 12027 - (% class=~"hfeed index~" ~%)(((\{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$paginated~" layout=~"$!postsLayout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" /}}))) 12028 - #end 12029 -#end 12030 -## 12031 -## 12032 -## 12033 -#** 12034 - * Shows blog information. In view mode, the description is printed. In edit mode, allows changing blog settings: title, 12035 - * description, blog type (global or in-space), index display type (fixed size pagination, weekly index, monthly index, 12036 - * all entries). 12037 - * 12038 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 12039 - *### 12040 -#macro(showBlogInfo $blogDoc) 12041 - #if($blogDoc.getObject($blogClassname)) 12042 - ## Keep testing for inline action for backward compatibility with older blogs. 12043 - #if($xcontext.action == 'edit' || $xcontext.action == 'inline') 12044 - #macro(displayProperty $blogDoc $propname) 12045 - ; #displayPropName($xwiki.getClass($blogClassname).get($propname)): 12046 - : $blogDoc.display($propname) 12047 - #end 12048 - #displayProperty($blogDoc 'title') 12049 - #displayProperty($blogDoc 'description') 12050 - #displayProperty($blogDoc 'displayType') 12051 - #displayProperty($blogDoc 'itemsPerPage') 12052 - #displayProperty($blogDoc 'postsLayout') 12053 - #displayProperty($blogDoc 'postsLayoutParameters') 12054 - #else 12055 - $blogDoc.display('description') 12056 - #end 12057 - #elseif($doc.fullName == $blogSheet) 12058 -= $services.localization.render('blog.code.blogsheet') = 12059 - \{\{translation key='blog.code.sheetexplanation'/}} 12060 - #else 12061 - \{\{warning}}\{\{translation key='blog.code.notblog'/}}\{\{/warning}} 12062 - #end 12063 -#end 12064 -## 12065 -## 12066 -## 12067 -#** 12068 - * Retrieve the blog document, which usually is either <tt><Space>.WebHome</tt> for whole-spaces blogs, or 12069 - * <tt><Space>.Blog</tt> for in-space blogs. If none of these documents contains a blog object, then the first 12070 - * (alphabetically) document in the target space that contains one is returned. Finally, if no document in the current 12071 - * space contains a blog object, then <tt>Blog.WebHome</tt> is returned as the default blog. 12072 - * 12073 - * @param space A <tt>String</tt>, the name of the space where to search. 12074 - * @param blogDoc The resulting XDocument. 12075 - *### 12076 -#macro(getBlogDocument $space $blogDoc) 12077 - #set ($result = $NULL) 12078 - ## Check if the current space has a WebPreferences page that contains a Blog.EnablePanelsConfigurationClass object. 12079 - ## It is possible to display a blog's panels info in a page that is not inside a blog and in that case we need to 12080 - ## identify the right blog based on a configuration object in a WebPreferences page. 12081 - #set ($spaceReference = $services.model.resolveSpace($space)) 12082 - #set ($preferencesDocRef = $services.model.createDocumentReference('WebPreferences', $spaceReference)) 12083 - #set ($preferencesDoc = $xwiki.getDocument($preferencesDocRef)) 12084 - #set ($preferencesObj = $preferencesDoc.getObject('Blog.EnablePanelsConfigurationClass')) 12085 - #if ($preferencesObj) 12086 - #set ($result = $xwiki.getDocument( $preferencesObj.getValue('blog'))) 12087 - #end 12088 - ## If no special case occurs (like the previous one), identify a blog by checking the current location from its hierarchy. 12089 - #if (~"$!result~" == '') 12090 - ## First, try the Space.WebHome, for a whole-space blog 12091 - #set($result = $xwiki.getDocument(~"$\{space}.WebHome~")) 12092 - #if(!$result.getObject($blogClassname)) 12093 - ## Second, try the Space.Blog document 12094 - #set($result = $xwiki.getDocument(~"$\{space}.Blog~")) 12095 - #if(!$result.getObject($blogClassname)) 12096 - ## Third, try searching for a blog document in the current space 12097 - ## Prevent the query fail when the space contains dots '.' 12098 - #set($blogDocs = $services.query.hql(~", BaseObject obj where doc.space = :space and obj.name = doc.fullName and obj.className = '$blogClassname' order by doc.name~").setLimit(1).setOffset(0).bindValue('space', $space).execute()) 12099 - #if($blogDocs.size() > 0) 12100 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 12101 - #else 12102 - ## Fourth, try searching for a blog document that have the its 'postsLocation' set to the current space 12103 - #set($blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as postsLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=postsLocationProp.id.id and postsLocationProp.id.name='postsLocation' and postsLocationProp.value=:postsLocation order by doc.name~").setLimit(1).setOffset(0).bindValue('postsLocation', $space).execute()) 12104 - #if($blogDocs.size() > 0) 12105 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 12106 - #else 12107 - ## Last, fallback to Blog.WebHome, the default blog 12108 - #set($result = $xwiki.getDocument('Blog.WebHome')) 12109 - #end 12110 - #end 12111 - #end 12112 - #end 12113 - #end 12114 - #set ($blogDoc = $NULL) 12115 - #setVariable (~"$blogDoc~" $result) 12116 -#end 12117 -## 12118 -## 12119 -## 12120 -#** 12121 - * Retrieve the blog title. 12122 - * 12123 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass<tt> object with the <tt>title</tt> property set. 12124 - * @param title The resulting title. 12125 - *### 12126 -#macro(getBlogTitle $blogDoc $title) 12127 - ## Titles can contain velocity code (most commonly translations), so we should evaluate them. 12128 - #set ($title = $NULL) 12129 - #setVariable (~"$title~" $!blogDoc.displayTitle) 12130 -#end 12131 -## 12132 -## 12133 -## 12134 -#** 12135 - * Retrieve the blog description. 12136 - * 12137 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>description</tt> 12138 - * property set. 12139 - * @param description The resulting description. 12140 - *### 12141 -#macro(getBlogDescription $blogDoc $description) 12142 - #getBlogProperty($blogDoc 'description' '' $result) 12143 - #set ($description = $NULL) 12144 - #setVariable (~"$description~" $result) 12145 -#end 12146 -## 12147 -## 12148 -## 12149 -#** 12150 - * Retrieves a list of entries to be displayed. The entries are either part of the blog's space, or have the blog 12151 - * document set as a parent. The number and range of entries returned (from all those belonging to this blog) depends on 12152 - * the blog display type: paginated (fixed number of entries), weekly (all entries in a week), monthly (all entries in a 12153 - * month), or all. 12154 - * 12155 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 12156 - * @param entries The resulting list of entries to display, a list of XDocument names. 12157 - *### 12158 -#macro(getBlogEntries $blogDoc $entries) 12159 - #if (!$entries) 12160 - #setVariable (~"$entries~" []) 12161 - #end 12162 - #getAllBlogPostsQuery($query) 12163 - #isDefaultBlog($blogDoc $isDefault) 12164 - #set($queryParams = \{}) 12165 - #if ($isDefault) 12166 - #getCategoryAllBlogPostsQuery($query) 12167 - #set($query = ~"$\{query} and (doc.creator = :creator or (isPublished.value = 1 and hidden.value = 0)) and (doc.space = :space or catList like :catList escape '!')~") 12168 - #set($discard = $queryParams.put('creator', $xcontext.user)) 12169 - #set($discard = $queryParams.put('space', $blogDoc.space)) 12170 - #set($sanitizedBlogSpace = $blogDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 12171 - #set($discard = $queryParams.put('catList', $sanitizedBlogSpace)) 12172 - #else 12173 - #set($query = ~"$\{query} and (doc.space = :space or doc.parent = :parent)~") 12174 - #getBlogPostsLocation($blogDoc.space $blogPostsLocation) 12175 - #set($discard = $queryParams.put('space', $blogPostsLocation)) 12176 - #set($discard = $queryParams.put('parent', $blogDoc.space)) 12177 - #end 12178 - #getBlogDisplayType($blogDoc $displayType) 12179 - #if($displayType == 'weekly') 12180 - #getWeeklyBlogEntries($blogDoc $query $entries $queryParams) 12181 - #elseif($displayType == 'monthly') 12182 - #getMonthlyBlogEntries($blogDoc $query $entries $queryParams) 12183 - #elseif($displayType == 'all') 12184 - #getAllBlogEntries($blogDoc $query $entries $queryParams) 12185 - #else 12186 - #getPagedBlogEntries($blogDoc $query $entries $queryParams) 12187 - #end 12188 -#end 12189 -## 12190 -## 12191 -## 12192 -#** 12193 - * Retrieves a list of entries to be displayed. The entries are taken from a ~"page~" of the blog, a sequence of documents 12194 - * defined by the request parameters <tt>ipp</tt> (items per page) and <tt>page</tt> (the current page). Initially the 12195 - * first page is displayed, with the number of entries defined in the blog object in the <tt>itemsPerPage</tt> property 12196 - * (10 if not defined). 12197 - * 12198 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 12199 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 12200 - * refined to restrict to a given space, or to a given search criteria, etc. 12201 - * @param entries The resulting list of entries to display, a list of XDocument names. 12202 - * @param queryParams The parameters to bind with the query. 12203 - *### 12204 -#macro(getPagedBlogEntries $blogDoc $query $entries $queryParams) 12205 - #if (!$entries) 12206 - #setVariable (~"$entries~" []) 12207 - #end 12208 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 12209 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~")) 12210 - #bindQueryParameters($countQueryObj $queryParams) 12211 - #bindQueryParameters($queryObj $queryParams) 12212 - #set($totalEntries = $countQueryObj.count()) 12213 - #getBlogProperty($blogDoc 'itemsPerPage' '10' $defaultItemsPerPage) 12214 - #set($defaultItemsPerPage = $numbertool.toNumber($defaultItemsPerPage).intValue()) 12215 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 12216 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 12217 - #set($discard = $entries.addAll($queryObj.setLimit($itemsPerPage).setOffset($startAt).addFilter(~"unique~").execute())) 12218 -#end 12219 -## 12220 -## 12221 -## 12222 -#** 12223 - * Retrieves a list of entries to be displayed. The entries are taken from a week of the blog. The target week is 12224 - * defined by the request parameters <tt>week</tt> (the week number in the year, from 1 to 52) and <tt>year</tt> (4 12225 - * digit year). Initially the current week is displayed. 12226 - * 12227 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 12228 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 12229 - * refined to restrict to a given space, or to a given search criteria, etc. 12230 - * @param entries The resulting list of entries to display, a list of XDocument names. 12231 - * @param queryParams The parameters to bind with the query. 12232 - *### 12233 -#macro(getWeeklyBlogEntries $blogDoc $query $entries $queryParams) 12234 - #if (!$entries) 12235 - #setVariable (~"$entries~" []) 12236 - #end 12237 - #getRequestedWeek($weekDate) 12238 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 12239 - #set($minDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundFloor())) 12240 - #set($maxDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundCeiling())) 12241 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 12242 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 12243 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 12244 - #bindQueryParameters($countQueryObj $queryParams) 12245 - #bindQueryParameters($queryObj $queryParams) 12246 - #set($totalEntries = $countQueryObj.count()) 12247 - #set($discard = $entries.addAll($queryObj.execute())) 12248 -#end 12249 -## 12250 -## 12251 -## 12252 -#** 12253 - * Retrieves a list of entries to be displayed. The entries are taken from a month of the blog. The target month is 12254 - * defined by the request parameters <tt>month</tt> (the month number, from 1 to 12) and <tt>year</tt> (4 12255 - * digit year). Initially the current month is displayed. 12256 - * 12257 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 12258 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 12259 - * refined to restrict to a given space, or to a given search criteria, etc. 12260 - * @param entries The resulting list of entries to display, a list of XDocument names. 12261 - * @param queryParams The parameters to bind with the query. 12262 - *### 12263 -#macro(getMonthlyBlogEntries $blogDoc $query $entries) 12264 - #if (!$entries) 12265 - #setVariable (~"$entries~" []) 12266 - #end 12267 - #getRequestedMonth($monthDate) 12268 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 12269 - #set($minDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundFloor())) 12270 - #set($maxDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundCeiling())) 12271 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 12272 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 12273 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 12274 - #bindQueryParameters($countQueryObj $queryParams) 12275 - #bindQueryParameters($queryObj $queryParams) 12276 - #set($totalEntries = $countQueryObj.count()) 12277 - #set($discard = $entries.addAll($queryObj.execute())) 12278 -#end 12279 -## 12280 -## 12281 -## 12282 -#** 12283 - * Retrieves a list of entries to be displayed. All entries belonging to the current blog are returned. 12284 - * 12285 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 12286 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 12287 - * refined to restrict to a given space, or to a given search criteria, etc. 12288 - * @param entries The resulting list of entries to display, a list of XDocument names. 12289 - * @param queryParams The parameters to bind with the query. 12290 - *### 12291 -#macro(getAllBlogEntries $blogDoc $query $entries $queryParams) 12292 - #if (!$entries) 12293 - #setVariable (~"$entries~" []) 12294 - #end 12295 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 12296 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 12297 - #bindQueryParameters($countQueryObj $queryParams) 12298 - #bindQueryParameters($queryObj $queryParams) 12299 - #set($totalEntries = $countQueryObj.count()) 12300 - #set($discard = $entries.addAll($queryObj.execute())) 12301 -#end 12302 -## 12303 -## 12304 -## 12305 -#** 12306 - * Retrieves a list of entries to be displayed. Only (and all) unpublished entries are returned. 12307 - * 12308 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 12309 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 12310 - * refined to restrict to a given space, or to a given search criteria, etc. 12311 - * @param queryParams The parameters to bind with the query. 12312 - * @param entries The resulting list of entries to display, a list of XDocument names. 12313 - *### 12314 -#macro(getUnpublishedBlogEntries $blogDoc $query $queryParams $entries) 12315 - #if (!$entries) 12316 - #setVariable (~"$entries~" []) 12317 - #end 12318 - #set($query = ~"$\{query} and isPublished.value = 0~") 12319 - #set ($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 12320 - #set ($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 12321 - #bindQueryParameters($countQueryObj $queryParams) 12322 - #bindQueryParameters($queryObj $queryParams) 12323 - #set($totalEntries = $countQueryObj.count()) 12324 - #set($discard = $entries.addAll($queryObj.execute())) 12325 -#end 12326 -## 12327 -## 12328 -## 12329 -#** 12330 - * Retrieves a list of entries to be displayed. The entries are taken from all the wiki, and not from a specific blog. 12331 - * 12332 - * @param entries The resulting list of entries to display, a list of XDocument names. 12333 - *### 12334 -#macro(getGlobalBlogEntries $entries) 12335 - #if (!$entries) 12336 - #setVariable (~"$entries~" []) 12337 - #end 12338 - #getAllBlogPostsQuery($query) 12339 - #set($totalEntries = $services.query.hql($query).count()) 12340 - #set($defaultItemsPerPage = 20) 12341 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 12342 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 12343 - #set($discard = $entries.addAll($services.query.hql(~"$\{query} order by publishDate.value desc~").setLimit($itemsPerPage).setOffset($startAt).execute())) 12344 -#end 12345 -#** 12346 - * Return the base query for selecting blog entries. It filters only visible entries, but does not bind to a specific 12347 - * blog, nor specify a range or an ordering criteria. 12348 - * 12349 - * This macro is a duplicate of #getAllBlogPostsQuery($query). Keep it in case it's used outside, in custom code. 12350 - * 12351 - * @param query The basic query for selecting blog entries. 12352 - *# 12353 -#macro(getBlogEntriesBaseQuery $query) 12354 - #getAllBlogPostsQuery($query) 12355 -#end 12356 -#** 12357 - * Return the Query for selecting the all wiki blog posts without filtering 12358 - * 12359 - * @param query The basic query for selecting blog entries. 12360 - *# 12361 -#macro(getAllBlogPostsQuery $query) 12362 - #set ($query = $NULL) 12363 - #setVariable(~"$query~" ~", BaseObject as obj, IntegerProperty isPublished, 12364 - IntegerProperty hidden, DateProperty publishDate 12365 - where doc.fullName <> '$blogPostTemplate' and 12366 - obj.name=doc.fullName and obj.className='$blogPostClassname' and 12367 - isPublished.id.id = obj.id and isPublished.id.name = 'published' and 12368 - hidden.id.id = obj.id and hidden.id.name='hidden' and 12369 - publishDate.id.id = obj.id and publishDate.id.name='publishDate' and 12370 - (doc.creator = '$escapetool.sql($xcontext.user)' or (isPublished.value = 1 and hidden.value = 0))~") 12371 -#end 12372 -## 12373 -## 12374 -## 12375 -###** 12376 - * Return the Query for selecting the all wiki blog posts with categories filtering 12377 - * 12378 - * @param query The basic query for selecting blog entries. 12379 - *### 12380 -#macro(getCategoryAllBlogPostsQuery $query) 12381 - #set ($query = $NULL) 12382 - #getAllBlogPostsQuery($baseQuery) 12383 - #set ($baseQuery = $baseQuery.replace('DateProperty publishDate', 'DateProperty publishDate, DBStringListProperty as category left join category.list catList')) 12384 - #setVariable(~"$query~" ~"$\{baseQuery} and obj.id=category.id.id and category.id.name='category'~") 12385 -#end 12386 -## 12387 -## 12388 -## 12389 -#** 12390 - * Determines how is the blog index split into pages: paginated (fixed number of entries), weekly (all entries in a 12391 - * week), monthly (all entries in a month), or all. 12392 - * 12393 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>displayType</tt> 12394 - * property set. 12395 - * @param displayType The resulting string. If the blog object does not define anything, it is considered paginated. 12396 - *### 12397 -#macro(getBlogDisplayType $blogDoc $displayType) 12398 - #getBlogProperty($blogDoc 'displayType' 'paginated' $result) 12399 - #set ($displayType = $NULL) 12400 - #setVariable (~"$displayType~" $result) 12401 -#end 12402 -## 12403 -## 12404 -## 12405 -#** 12406 - * Displays a list of entries. 12407 - * 12408 - * @param entries The entries to display, a list of XDocument names. 12409 - * @param displaying What exactly is displayed: blog index, a single blog entry, a blog category, search results, 12410 - * unpublished entries, etc. This will be used as the classname(s) for the container div (hfeed). Currently 12411 - * used values: index, single, category, search, unpublished, hidden. 12412 - * @param onlyExtract If <tt>true</tt>, only display the extract of articles where available, otherwise display the full content. 12413 - * @param shouldDisplayTitles If <tt>true</tt>, display the blog title (blog posts shouldn't display the title when they're 12414 - * displayed alone on their page since it's the page title which is used in this case) 12415 - *### 12416 -#macro(displayBlog $entries $displaying $onlyExtract $shouldDisplayTitles) 12417 - #set($blogDay = '') 12418 - (% class=~"hfeed $!\{displaying}~" ~%)((( 12419 - (% class=~"blogDay~" ~%)((( 12420 - #foreach ($entryDoc in $xwiki.wrapDocs($entries)) 12421 - #getEntryObject($entryDoc $entryObj) 12422 - ## Although all entries should have one of the two objects, better check to be sure. 12423 - #if(~"$!\{entryObj}~" != '') 12424 - #getEntryDate($entryDoc $entryObj $entryDate) 12425 - ## Display a ~"calendar sheet~" for each day. All entries posted on the same day share one such sheet. 12426 - #set($entryDateStr = $xwiki.formatDate($entryDate, 'yyyyMMMMdd')) 12427 - #if($blogDay != $entryDateStr) 12428 - #if($blogDay != '') 12429 - ))) 12430 - (% class=~"blogDay~" ~%)((( 12431 - #end 12432 - #displayBlogDate($entryDate) 12433 - #set ($blogDay = $entryDateStr) 12434 - #end 12435 - ## Finally, display the entry. 12436 - #displayEntry($entryDoc $entryObj $onlyExtract $shouldDisplayTitles true) 12437 - #end 12438 - #end 12439 - )))## blogDay 12440 - )))## hfeed 12441 -#end 12442 -## 12443 -## 12444 -## 12445 -#** 12446 - * Get the entry object, either a new BlogPost or an old Article. 12447 - * 12448 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 12449 - * @param entryObj The resulting xobject of the blog post. 12450 - *### 12451 -#macro(getEntryObject $entryDoc $__entryObj) 12452 - #set($result = $entryDoc.getObject(~"$\{blogPostClassname}~")) 12453 - #if(!$result) 12454 - #set($result = $entryDoc.getObject(~"$\{oldArticleClassname}~")) 12455 - #end 12456 - ## NOTE: The reason we put an underscore in front of the variable name is to prevent the following line from 12457 - ## overwriting the $entryObj variable that may be defined before this macro is called. Of course, $__entryObj may be 12458 - ## overwritten in this case but it's less likely to have such a variable defined before. 12459 - #set ($__entryObj = $NULL) 12460 - #setVariable (~"$__entryObj~" $result) 12461 -#end 12462 -## 12463 -## 12464 -## 12465 -#** 12466 - * Gets the date associated with a blog entry. This is the publication date. For unpublished entries, initially this is 12467 - * the document creation date, but can be edited by the user. 12468 - * 12469 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 12470 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 12471 - * @param result The resulting date, an instance of <tt>java.util.Date</tt>. 12472 - *### 12473 -#macro(getEntryDate $entryDoc $entryObj $result) 12474 - #set ($result = $NULL) 12475 - #setVariable (~"$result~" $entryObj.getProperty('publishDate').value) 12476 -#end 12477 -## 12478 -## 12479 -## 12480 -#** 12481 - * Displays a date, nicely formatted as a calendar page. 12482 - * 12483 - * @param date The date to display, an instance of <tt>java.util.Date</tt>. 12484 - *### 12485 -#macro(displayBlogDate $date) 12486 - #set($year = $xwiki.formatDate($date, 'yyyy')) 12487 - ## 3 letter month name, like Jan, Dec. 12488 - #set($month = $xwiki.formatDate($date, 'MMM')) 12489 - ## Uncomment to get a full length month name, like January, December. 12490 - ## TODO: this could be defined somewhere in the blog style. 12491 - ## #set($month = $xwiki.formatDate($date, 'MMMM')) 12492 - #set($day = $xwiki.formatDate($date, 'dd')) 12493 - (% class=~"blogdate~" ~%) 12494 - == (% class=~"month~" ~%)$month(%~%) (% class=~"day~" ~%)$day(%~%) (% class=~"year~" ~%)$year(%~%) == 12495 -#end 12496 -## 12497 -## 12498 -## 12499 -#** 12500 - * Displays a blog article: management tools, header, content, footer. 12501 - * 12502 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 12503 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 12504 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 12505 - * @param shouldDisplayTitle If <tt>true</tt>, display the blog title (blog posts shouldn't display the title 12506 - * when they're displayed alone on their page since it's the page title which is used in this case) 12507 - * @param shouldDisplayActions If <tt>true</tt>, display the blog post actions buttons 12508 - *### 12509 -#macro(displayEntry $entryDoc $entryObj $onlyExtract $shouldDisplayTitle $shouldDisplayActions) 12510 - ## Only articles with an explicit hidden setting or an explicit unpublished setting are hidden 12511 - #isPublished($entryObj $isPublished) 12512 - #isHidden($entryObj $isHidden) 12513 - #if($doc.fullName == $entryDoc.fullName) 12514 - (% class=~"hentry single-article~" ~%)((( 12515 - #else 12516 - (% class=~"hentry#if(!$isPublished) unpublished-article#elseif($isHidden) hidden-article#end~" ~%)((( 12517 - #end 12518 - #if ($shouldDisplayActions) 12519 - #displayEntryTools($entryDoc $entryObj) 12520 - #end 12521 - #if($shouldDisplayTitle) 12522 - #displayEntryTitle($entryDoc $entryObj) 12523 - #end 12524 - #if($doc.fullName == $entryDoc.fullName) 12525 - #if(!$isPublished) 12526 - \{\{warning}}\{\{translation key='blog.code.published'/}}\{\{/warning}} 12527 - #elseif($isHidden) 12528 - \{\{warning}}\{\{translation key='blog.code.hidden'/}}\{\{/warning}} 12529 - #end 12530 - #end 12531 - #displayEntryContent($entryDoc $entryObj $onlyExtract) 12532 - #displayEntryFooter($entryDoc $entryObj) 12533 - )))## hentry 12534 -#end 12535 -## 12536 -## 12537 -## 12538 -#** 12539 - * Checks if the provided blog is published or not. 12540 - * 12541 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 12542 - * @param isPublished The resulting boolean, true if the entry is considered published. 12543 - *### 12544 -#macro(isPublished $entryObj $isPublished) 12545 - #set ($isPublished = $NULL) 12546 - ## This should work for both old articles, which don't have the 'published' property at all, and 12547 - ## are considered published by default, and new entries, that should have 1 if published. 12548 - #if (~"$!\{entryObj.getProperty('published').value}~" != '0') 12549 - #setVariable (~"$isPublished~" true) 12550 - #else 12551 - #setVariable (~"$isPublished~" false) 12552 - #end 12553 -#end 12554 -## 12555 -## 12556 -## 12557 -#** 12558 - * Checks if the provided blog is hidden or not. 12559 - * 12560 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass<tt> xclass. 12561 - * @param isHiddel The resulting boolean, true if the entry is considered hidden. 12562 - *### 12563 -#macro(isHidden $entryObj $isHidden) 12564 - #set ($isHidden = $NULL) 12565 - ## This should work for both old articles, which don't have the 'hidden' property at all, and 12566 - ## are considered visible by default, and new entries, that should have 1 if hidden. 12567 - #if (~"$!\{entryObj.getProperty('hidden').value}~" == '1') 12568 - #setVariable (~"$isHidden~" true) 12569 - #else 12570 - #setVariable (~"$isHidden~" false) 12571 - #end 12572 -#end 12573 -## 12574 -## 12575 -## 12576 -#** 12577 - * Displays several ~"tools~" for manipulating blog posts: hide/show, publish, edit. 12578 - * 12579 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 12580 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 12581 - *### 12582 -#macro(displayEntryTools $entryDoc $entryObj) 12583 - #if($xcontext.action == 'view') 12584 - (% class=~"blog-entry-toolbox~" ~%)((( 12585 - #displayPublishButton($entryDoc $entryObj) 12586 - #displayHideShowButton($entryDoc $entryObj) 12587 - #displayEditButton($entryDoc $entryObj) 12588 - #displayDeleteButton($entryDoc $entryObj) 12589 - ))) 12590 - #end 12591 -#end 12592 -## 12593 -## 12594 -## 12595 -#** 12596 - * Displays the publish button to the entry <strong>creator</strong>, if the article is not published yet. 12597 - * 12598 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 12599 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 12600 - * @todo AJAX calls. 12601 - *### 12602 -#macro(displayPublishButton $entryDoc $entryObj) 12603 - #isPublished($entryObj $isPublished) 12604 - #if(!$isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 12605 - [[#toolImage('world')>>path:$blogPublisher.getURL('view', ~"entryName=$\{escapetool.url($entryDoc.fullName)}&xredirect=$\{escapetool.url($thisURL)}&form_token=$!\{services.csrf.getToken()}~")||title=~"$services.localization.render('blog.code.notpublished')~"]]## 12606 - #end 12607 -#end 12608 -## 12609 -## 12610 -## 12611 -#** 12612 - * Displays the hide or show button to the entry <strong>creator</strong>, if the article is already published. 12613 - * 12614 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 12615 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 12616 - *### 12617 -#macro(displayHideShowButton $entryDoc $entryObj) 12618 - #isPublished($entryObj $isPublished) 12619 - #isHidden($entryObj $isHidden) 12620 - ## Only published articles can be hidden. Unpublished articles are considered already hidden. 12621 - #if($isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 12622 - #set ($queryString = \{ 12623 - 'xredirect' : $thisURL, 12624 - 'form_token' : $services.csrf.getToken() 12625 - }) 12626 - #if ($isHidden) 12627 - #set ($discard = $queryString.putAll(\{ 12628 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 0, 12629 - 'comment' : $services.localization.render('blog.code.madevisible') 12630 - })) 12631 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 12632 - [[#toolImage('unlock')>>path:$lockURL||class=~"blog-tool-show~" title=~"$services.localization.render('blog.code.makevisible')~"]]## 12633 - #else 12634 - #set ($discard = $queryString.putAll(\{ 12635 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 1, 12636 - 'comment' : $services.localization.render('blog.code.hid') 12637 - })) 12638 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 12639 - [[#toolImage('lock')>>path:$lockURL||class=~"blog-tool-hide~" title=~"$services.localization.render('blog.code.hide')~"]]## 12640 - #end 12641 - #end 12642 -#end 12643 -## 12644 -## 12645 -## 12646 -#** 12647 - * Displays the edit button to those that can edit the article. 12648 - * 12649 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 12650 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 12651 - *### 12652 -#macro(displayEditButton $entryDoc $entryObj) 12653 - #if($xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 12654 - ## Call getDefaultEditMode() for backward compatibility with older blog posts. 12655 - [[#toolImage('pencil')>>path:$entryDoc.getURL('edit')||title=~"$services.localization.render('blog.code.editpost')~"]]## 12656 - #end 12657 -#end 12658 -## 12659 -## 12660 -## 12661 -#** 12662 - * Displays the delete button to those that can edit the article. 12663 - * 12664 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 12665 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 12666 - * @todo AJAX calls. 12667 - *### 12668 -#macro(displayDeleteButton $entryDoc $entryObj) 12669 - #if($xwiki.hasAccessLevel('delete', $xcontext.user, $entryDoc.fullName)) 12670 - [[#toolImage('cross')>>path:$entryDoc.getURL('delete')||title=~"$services.localization.render('blog.code.deletepost')~"]]## 12671 - #end 12672 -#end 12673 -## 12674 -## 12675 -## 12676 -#** 12677 - * Displays the title of the entry. 12678 - * 12679 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 12680 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 12681 - *### 12682 -#macro(displayEntryTitle $entryDoc $entryObj) 12683 - #if($doc.fullName == $entryDoc.fullName) 12684 - (% class=~"entry-title~" ~%) 12685 - = $services.rendering.escape($entryDoc.display('title', 'view', $entryObj), $xwiki.getCurrentContentSyntaxId()) = 12686 - #else 12687 - (% class=~"entry-title~" ~%) 12688 - === [[$services.rendering.escape($entryDoc.display('title', 'view', $entryObj),$xwiki.getCurrentContentSyntaxId())>>doc:$services.rendering.escape($services.model.serialize($entryDoc.getDocumentReference(),'default'),$xwiki.getCurrentContentSyntaxId())]] === 12689 - #end 12690 -#end 12691 -## 12692 -## 12693 -## 12694 -#** 12695 - * Displays the body of the entry. 12696 - * 12697 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 12698 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 12699 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 12700 - *### 12701 -#macro(displayEntryContent $entryDoc $entryObj $onlyExtract) 12702 - (% class=~"#if($onlyExtract)entry-summary#\{else}entry-content#end~" ~%)((( 12703 - #getEntryContent($entryDoc $entryObj $onlyExtract $entryContent) 12704 - ## FIXME: This causes the blog's content to not be annotatable. See http://jira.xwiki.org/browse/XWIKI-6328 12705 - ## Should probably be replaced by a display macro call with a reference to the object property holding the post's content 12706 - \{\{html wiki=~"false~"}}$entryDoc.getRenderedContent($entryContent, $entryDoc.syntax.toIdString())\{\{/html}} 12707 - ))) ## entry-content 12708 - (% class=~"clearfloats~" ~%)((())) 12709 -#end 12710 -## 12711 -## 12712 -## 12713 -#** 12714 - * Extracts the body of the entry that should be displayed. If <tt>onlyExtract</tt> is <tt>true</tt>, display the content 12715 - * of the <tt>extract</tt> field (if not empty). 12716 - * 12717 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 12718 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 12719 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 12720 - * @param entryContent The resulting content. 12721 - * @param removeEllipsis If <tt>true</tt>, then don't display an ellipsis at the end of the content (only used when 12722 - * <tt>onlyExtract</tt> is <tt>true</tt>) 12723 - *### 12724 -#macro(getEntryContent $entryDoc $entryObj $onlyExtract $entryContent $removeEllipsis) 12725 - #if ($onlyExtract) 12726 - ## Note: We trim the summary so that if there's some white space it won't cause the summary to be used instead 12727 - ## of the content. 12728 - #set ($macro.result = $entryObj.getProperty('extract').value.trim()) 12729 - #end 12730 - #if(~"$!macro.result~" == '') 12731 - #set($macro.result = $entryObj.getProperty('content').value) 12732 -#* Disabled until the content can be cleanly cut. 12733 -* #if($onlyExtract && $result.length()>$maxchars) 12734 -* #set($i = $macro.result.lastIndexOf(~" ~", $maxchars)) 12735 -* #set($i = $i + 1) 12736 -* #set($macro.result = ~"$\{macro.result.substring(0,$i)} *[...>$\{entryDoc.fullName}]*~") 12737 -* #end 12738 -## *### 12739 - #elseif (!$removeEllipsis) 12740 - #if($entryDoc.syntax.toIdString() == 'xwiki/1.0') 12741 - #set($macro.result = ~"$\{macro.result} <a href='$\{entryDoc.getExternalURL()}' title='$services.localization.render('blog.code.readpost')'>...</a>~") 12742 - #elseif($entryDoc.syntax.toIdString() == 'xwiki/2.0' || $entryDoc.syntax.toIdString() == 'xwiki/2.1') 12743 - #set($macro.result = ~"$\{macro.result} [[...>>$\{services.rendering.escape($entryDoc.getFullName(), $entryDoc.getSyntax())}||title='$services.localization.render('blog.code.readpost')']]~") 12744 - #end 12745 - #end 12746 - #set ($entryContent = $NULL) 12747 - #setVariable (~"$entryContent~" $macro.result) 12748 -#end 12749 -## 12750 -## 12751 -## 12752 -#** 12753 - * Displays the footer of the entry. 12754 - * 12755 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 12756 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 12757 - *### 12758 -#macro(displayEntryFooter $entryDoc $entryObj) 12759 - (% class=~"entry-footer~" ~%)((( 12760 - #isPublished($entryObj $isPublished) 12761 - (% class='entry-author-label' ~%) 12762 - #if($isPublished) 12763 - \{\{translation key='blog.code.postedby'/}} ## 12764 - #else 12765 - \{\{translation key='blog.code.createdby'/}} ## 12766 - #end 12767 - \{\{html wiki=~"false~" clean=~"false~"}}<span class='author vcard'>#userfn($entryDoc.creator)</span>\{\{/html}} ## 12768 - #getEntryDate($entryDoc $entryObj $entryDate) 12769 - #listCategories($entryObj) #* 12770 - ## Since the publish date and update date are not set at the exact same time, there could be a small difference that 12771 - ## we assume cannot be more than 3 seconds. 12772 - *#(% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.permalink'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||rel=~"bookmark~"]] ## 12773 - #if ($showcomments) 12774 - (% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.comments'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||anchor=~"Comments~"]] (% class=~"itemCount~" ~%)($entryDoc.comments.size())(%~%) ## 12775 - #end ## 12776 - #if($entryDoc != $doc) ## 12777 - #displayEntryBlogLocation($entryDoc $entryObj) ## 12778 - #end 12779 - )))## entry-footer 12780 -#end 12781 -## 12782 -## 12783 -#** 12784 - * Display the blog for the entry (if it is not the currently displayed blog) 12785 - * 12786 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 12787 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 12788 - *### 12789 -#macro(displayEntryBlogLocation $entryDoc $entryObj) 12790 - #getBlogPostsLocation($entryDoc.getSpace() $blogPostsLocation) ## 12791 - #if(~"$!blogPostsLocation~" != ~"~") ## 12792 - #set($blogSpaceRef = $services.model.resolveSpace($blogPostsLocation)) ## 12793 - #set($blogDocRef = $services.model.createDocumentReference($services.model.getEntityReference('DOCUMENT', 'default').getName(), $blogSpaceRef)) ## 12794 - #if($doc.documentReference != $blogDocRef) ## 12795 - #set($blogDoc = $xwiki.getDocument($blogDocRef)) ## 12796 - #set($blogObj = $blogDoc.getObject('Blog.BlogClass')) ## 12797 - #if($blogObj) (% class=~"blogrefpath~" ~%)((( ## 12798 - $services.localization.render('blog.code.postedin') \{\{html clean=~"false~" wiki=~"false~"}} #hierarchy($blogDocRef, \{'selfIsActive' : true, 'local': true}) \{\{/html}} ## 12799 - )))(%~%)## 12800 - #end 12801 - #end 12802 - #end 12803 -#end 12804 -## 12805 -## 12806 -## 12807 -## 12808 -#** 12809 - * List the categories an entry belongs to. Used in the footer. The categories are instances of <tt>Blog.CategoryClass</tt>. 12810 - * 12811 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 12812 - *### 12813 -#macro(listCategories $entryObj) 12814 - #if($entryObj.getxWikiClass().getName() == $blogPostClassname) 12815 - #set($categories = $entryObj.getProperty('category').value) 12816 - #set($first = true) 12817 - #if($categories.size() > 0) 12818 - #foreach($category in $categories) 12819 - #set($categoryDoc = $!xwiki.getDocument($category)) 12820 - #if(!$categoryDoc.isNew() && $categoryDoc.getObject($\{blogCategoryClassname})) 12821 - #if($foreach.count == 1) 12822 - (% class='separator' ~%)·(%~%) $services.localization.render('blog.code.categories') ## 12823 - #else 12824 - , ## 12825 - #end## 12826 - [[$!\{categoryDoc.getObject($blogCategoryClassname).getValue('name')}>>$\{category}||rel='tag']]## 12827 - #end## 12828 - #end## 12829 - #end 12830 - #end 12831 -#end 12832 -## 12833 -## 12834 -## 12835 -#** 12836 - * Displays blog pagination links (older and newer entries). 12837 - * 12838 - * @param blogDoc the XDocument holding the blog definition object. 12839 - *### 12840 -#macro(displayNavigationLinks $blogDoc) 12841 - (% class=~"clearfloats~" ~%)((())) 12842 - #getBlogDisplayType($blogDoc $displayType) 12843 - #if($displayType == 'weekly') 12844 - (% class=~"pagingLinks~" ~%)((( 12845 - #getRequestedWeek($weekDate) 12846 - $weekDate.addWeeks(-1)## 12847 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousweek'/}}>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 12848 - #sep() 12849 - $weekDate.addWeeks(2)## 2 because we already subtracted 1 above 12850 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextweek'/}} »>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 12851 - ))) 12852 - #elseif($displayType == 'monthly') 12853 - (% class=~"pagingLinks~" ~%)((( 12854 - #getRequestedMonth($monthDate) 12855 - $monthDate.addMonths(-1)## 12856 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousmonth'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 12857 - #sep() 12858 - $monthDate.addMonths(2)## 2 because we already subtracted 1 above 12859 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextmonth'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 12860 - ))) 12861 - #elseif($displayType == 'all') 12862 - #else 12863 - ## Paginated 12864 - #if(($totalPages > 1)) 12865 - #set($queryString = '') 12866 - #foreach($p in $request.getParameterNames()) 12867 - #if($p != 'page' && $p != 'ipp') 12868 - #foreach($v in $request.getParameterValues($p)) 12869 - #set($queryString = ~"$\{queryString}&$\{escapetool.url($p)}=$\{escapetool.url($v)}~") 12870 - #end 12871 - #end 12872 - #end 12873 - (% class=~"pagingLinks~" ~%)((( 12874 - #if ($currentPageNumber < $totalPages) 12875 - #set($currentPageNumber = $currentPageNumber + 1) 12876 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.olderposts'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 12877 - #set($currentPageNumber = $currentPageNumber - 1) 12878 - #end 12879 - #if ($currentPageNumber > 1) 12880 - #if ($currentPageNumber < $totalPages) 12881 - #sep() 12882 - #end 12883 - #set($currentPageNumber = $currentPageNumber - 1) 12884 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.newerposts'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 12885 - #set($currentPageNumber = $currentPageNumber + 1) 12886 - #end 12887 - (% class=~"clear~" ~%)(%~%) 12888 - )))## pagingLinks 12889 - #end 12890 - #end 12891 -#end 12892 -## 12893 -## 12894 -## 12895 -#** 12896 - * Displays a message box with ~"publish~" icon. 12897 - * 12898 - * @param message A text message concerning blog article publishing 12899 - *### 12900 -#macro(publishMessageBox $message) 12901 -(% class=~"plainmessage publish-message~" ~%)((($services.icon.render('world') $message))) 12902 -#end 12903 -#** 12904 - * Displays a message box with ~"show/hide~" icon. 12905 - * 12906 - * @param message A text message concerning blog article hiding 12907 - *### 12908 -#macro(hideMessageBox $message) 12909 -(% class=~"plainmessage hide-message~" ~%)((($services.icon.render('unlock') $message))) 12910 -#end 12911 -## 12912 -## 12913 -## 12914 -#** 12915 - * Determine the requested week, for using in a weekly-indexed blog. The relevant request parameters are 12916 - * <tt>year</tt> and <tt>week</tt>. By default, the current week is used. 12917 - * 12918 - * @param monthDate The resulting week, a JODATime MutableDateTime. 12919 - *### 12920 -#macro(getRequestedWeek $weekDate) 12921 - #set ($weekDate = $NULL) 12922 - #setVariable (~"$weekDate~" $xwiki.jodatime.mutableDateTime) 12923 - #if(~"$!\{request.year}~" != '') 12924 - #set ($discard = $weekDate.setYear($numbertool.toNumber($request.year).intValue())) 12925 - #end 12926 - #if(~"$!\{request.week}~" != '') 12927 - #set ($discard = $weekDate.setWeekOfWeekyear($numbertool.toNumber($request.week).intValue())) 12928 - #end 12929 -#end 12930 -## 12931 -## 12932 -## 12933 -#** 12934 - * Determine the requested month, for using in a monthly-indexed blog. The relevant request parameters are 12935 - * <tt>year</tt> and <tt>month</tt>. By default, the current month is used. 12936 - * 12937 - * @param monthDate The resulting month, a JODATime MutableDateTime. 12938 - *### 12939 -#macro(getRequestedMonth $monthDate) 12940 - #set ($monthDate = $NULL) 12941 - #setVariable (~"$monthDate~" $xwiki.jodatime.mutableDateTime) 12942 - #if(~"$!\{request.year}~" != '') 12943 - #set ($discard = $monthDate.setYear($numbertool.toNumber($request.year).intValue())) 12944 - #end 12945 - #if(~"$!\{request.month}~" != '') 12946 - #set ($discard = $monthDate.setMonthOfYear($numbertool.toNumber($request.month).intValue())) 12947 - #end 12948 -#end 12949 -## 12950 -## 12951 -## 12952 -#** 12953 - * Retrieve a blog property (title, display type, etc). 12954 - * 12955 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 12956 - * @param propertyName The name of the property to be retrieved. One of the <tt>Blog.BlogClass</tt>'s properties. 12957 - * @param defaultValue The default value to use in case the blog object does not define one. 12958 - * @param propertyValue The resulting value. 12959 - *### 12960 -#macro(getBlogProperty $blogDoc $propertyName $defaultValue $propertyValue) 12961 - #set($result = ~"$!\{blogDoc.getObject($\{blogClassname}).getProperty($propertyName).value}~") 12962 - #if($result == '') 12963 - #set($result = $defaultValue) 12964 - #end 12965 - #set ($propertyValue = $NULL) 12966 - #setVariable (~"$propertyValue~" $result) 12967 -#end 12968 - 12969 -#** 12970 - * If an error occurs when executing an action, set a specific response status and display an error message. 12971 - * 12972 - * @param status The response status. 12973 - * @param text The user readable error to be displayed. Can be a translation key. 12974 - * @param parameters The parameters to use when decoding the translation key. 12975 - *### 12976 -#macro(blog__actionResponseError $status $text $parameters) 12977 - $response.setStatus($status) 12978 - #if($request.ajax) 12979 - $services.localization.render($text, $!parameters) 12980 - #else 12981 - \{\{error}}$services.localization.render($text, $!parameters)\{\{/error}} 12982 - #end 12983 -#end 12984 -## 12985 -## 12986 -## 12987 -#** 12988 - * Check if a blog is the Default blog (The one in the 'Blog' space). 12989 - * 12990 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 12991 - * @param isDefault The resulting boolean. 12992 - *### 12993 -#macro(isDefaultBlog $blogDoc $isDefault) 12994 - #set ($result = false) 12995 - #if ($blogDoc.space == 'Blog') 12996 - #set ($result = true) 12997 - #end 12998 - #setVariable(~"$isDefault~" $result) 12999 -#end 13000 -## 13001 -## 13002 -## 13003 -#** 13004 - * Retrieve the blog posts location (space). 13005 - * 13006 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 13007 - * @param postsLocation The resulting location. 13008 - *### 13009 -#macro(getBlogPostsLocation $blogSpace $postsLocation) 13010 - #getBlogDocument($blogSpace $blogDoc) 13011 - #getBlogProperty($blogDoc 'postsLocation' $blogDoc.space $result) 13012 - #set ($postsLocation = $NULL) 13013 - #setVariable (~"$postsLocation~" $result) 13014 -#end 13015 -## 13016 -## 13017 -## 13018 -#** 13019 - * Retrieve the blog categories location (space). 13020 - * 13021 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 13022 - * @param categoriesLocation The resulting location. 13023 - *### 13024 -#macro(getBlogCategoriesLocation $blogSpace $categoriesLocation) 13025 - #getBlogDocument($blogSpace $blogDoc) 13026 - #getBlogProperty($blogDoc 'categoriesLocation' 'Blog' $result) 13027 - #set ($postsLocation = $NULL) 13028 - #setVariable (~"$categoriesLocation~" $result) 13029 -#end 13030 -###** 13031 - * Return the Query for selecting the blog posts based on the context where the posts are displayed. 13032 - * for example there is 4 different panel contexts: 13033 - * aBlog.aPost or aBlog.WebHome 13034 - * aCategorySpace.aCategory 13035 - * aCategorySpace.WebHome 13036 - * Blog.aPost or Blog.WebHome 13037 - * 13038 - * @param query The query for selecting blog entries. 13039 - * @param queryParams The parameters to bind with the generated query. 13040 - * @param targetDoc The document in which the articles will be displayed. 13041 - *### 13042 -#macro(getAllBlogPostsQueryBasedOnDisplayContext $targetDoc $query $queryParams) 13043 - #set ($query = $NULL) 13044 - #set ($queryParams = $NULL) 13045 - #getCategoryAllBlogPostsQuery($resultQuery) 13046 - #set ($resultQueryParams = \{}) 13047 - #set($sanitizedSpace = $targetDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 13048 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 13049 - ## Get all posts that are in the default blog space('Blog') or in category 'Blog.%' 13050 - #set ($discard = $resultQueryParams.put('space', $targetDoc.space)) 13051 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 13052 - #set($resultQuery = ~"$\{resultQuery} and (doc.space = :space or catList like :catList escape '!')~") 13053 - #elseif($targetDoc.getObject($blogCategoryClassname)) 13054 - ## Get all posts that are in a category aCategorySpace.aCategory 13055 - #set ($discard = $resultQueryParams.put('catList', $targetDoc.fullName)) 13056 - #set($resultQuery = ~"$\{resultQuery} and (catList=:catList)~") 13057 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 13058 - ## Get all posts that are in a category aCategorySpace.% 13059 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 13060 - ## Exclude incategorized posts 13061 - #set ($excludedCategory = ~"$\{targetDoc.space}.WebHome~") 13062 - #if ($targetDoc.space == $defaultBlogSpace) 13063 - #set ($excludedCategory = ~"Blog.Categories.WebHome~") 13064 - #end 13065 - #set ($discard = $resultQueryParams.put('excludedCategory', $excludedCategory)) 13066 - #set($resultQuery = ~"$\{resultQuery} and (catList<>:excludedCategory) and (catList like :catList escape '!')~") 13067 - #else 13068 - ## Get all posts in blog space aBlog 13069 - #getAllBlogPostsQuery($resultQuery) 13070 - #getBlogPostsLocation($targetDoc.space $postsLocation) 13071 - #set ($discard = $resultQueryParams.put('space', $postsLocation)) 13072 - #set($resultQuery = ~"$\{resultQuery} and doc.space = :space~") 13073 - #end 13074 - #setVariable(~"$query~" $resultQuery) 13075 - #setVariable(~"$queryParams~" $resultQueryParams) 13076 -#end 13077 -## 13078 -## 13079 -## 13080 -###** 13081 - * Display blog posts based on the context where the posts are displayed. 13082 - * for example there is 4 different panel contexts: 13083 - * aBlog.aPost or aBlog.WebHome 13084 - * aCategorySpace.aCategory 13085 - * aCategorySpace.WebHome 13086 - * Blog.aPost or Blog.WebHome 13087 - * 13088 - * @param targetDoc The document in which the articles will be displayed. 13089 - * @param postsVisiblity The visibility of the posts to display: recent, unpublished, ... 13090 - * @param layout Layout of the the posts to display 13091 - * @param layoutParams additional layout parameters, it is a string like 'param1=val1|...|paramN=valueN' 13092 - * @param limit the number of posts to display 13093 - *### 13094 -#macro(displayBlogPostsBasedOnContext $targetDoc $postsVisiblity $layout $layoutParams $limit) 13095 - #if ($postLayout == 'full') 13096 - #set ($macro.paginated = 'yes') 13097 - #end 13098 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 13099 - ## Display all posts that are in the default blog space('Blog') or in category 'Blog.%' 13100 - #getBlogPostsLayout($xwiki.getDocument(~"$\{defaultBlogSpace}.WebHome~") $postsLayout) 13101 - #if (~"$!layout~" == '') 13102 - #set ($layout = $postsLayout) 13103 - #end 13104 - #if ($postsVisiblity == 'recent') 13105 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 13106 - #elseif($postsVisiblity == 'unpublished') 13107 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 13108 - #end 13109 - #elseif($targetDoc.getObject($blogCategoryClassname)) 13110 - ## Display all posts that are in a category aCategorySpace.aCategory 13111 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 13112 - #getBlogPostsLayout($blogDoc $postsLayout) 13113 - #if (~"$!layout~" == '') 13114 - #set ($layout = $postsLayout) 13115 - #end 13116 - #if ($postsVisiblity == 'recent') 13117 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 13118 - #elseif($postsVisiblity == 'unpublished') 13119 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 13120 - #end 13121 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 13122 - ## Display all posts that are in a category aCategorySpace.% 13123 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 13124 - #getBlogPostsLayout($blogDoc $postsLayout) 13125 - #if (~"$!layout~" == '') 13126 - #set ($layout = $postsLayout) 13127 - #end 13128 - #if ($postsVisiblity == 'recent') 13129 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 13130 - #elseif($postsVisiblity == 'unpublished') 13131 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 13132 - #end 13133 - #else 13134 - ## Display all posts in blog space aBlog 13135 - #getBlogDocument($targetDoc.space $blogDoc) 13136 - #getBlogPostsLayout($blogDoc $postsLayout) 13137 - #if (~"$!layout~" == '') 13138 - #set ($layout = $postsLayout) 13139 - #end 13140 - #if ($postsVisiblity == 'recent') 13141 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 13142 - #elseif($postsVisiblity == 'unpublished') 13143 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 13144 - #end 13145 - #end 13146 -#end 13147 -## 13148 -## 13149 -## 13150 -#** 13151 - * Bind parameters to a query object. 13152 - * 13153 - * @param queryObj The query object (org.xwiki.query.internal.ScriptQuery object) 13154 - * @param queryParams the query parameters. 13155 - *### 13156 -#macro(bindQueryParameters $queryObj $queryParams) 13157 - #set ($output = $queryObj) 13158 - #foreach( $key in $queryParams.keySet() ) 13159 - #set($output = $queryObj.bindValue($key, $queryParams.get($key))) 13160 - #end 13161 - #setVariable(~"$queryObj~" $output) 13162 -#end 13163 -## 13164 -## 13165 -## 13166 -#** 13167 - * Determines the blogposts layout: Default layout (Calendar), Image thumbnail 13168 - * 13169 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>postsLayout</tt> 13170 - * property set. 13171 - * @param postsLayout The resulting string. If the blog object does not define anything, it is considered full (default). 13172 - *### 13173 -#macro(getBlogPostsLayout $blogDoc $postsLayout) 13174 - #getBlogProperty($blogDoc 'postsLayout' 'full' $res) 13175 - #set ($postsLayout = $NULL) 13176 - #setVariable (~"$postsLayout~" $res) 13177 -#end 13178 -## 13179 -## 13180 -## 13181 -#** 13182 - * Retrieve the blog document of a categories space, which is the blog descriptor that have its categoriesLocation property set to the categories space 13183 - * 13184 - * @param categoriesSpace A <tt>String</tt>, the name of the space. 13185 - * @param blogDoc The resulting XDocument. 13186 - *### 13187 -#macro(getBlogDocumentForCategoriesSpace $categoriesSpace $blogDoc) 13188 - #set($macro.blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as categoriesLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=categoriesLocationProp.id.id and categoriesLocationProp.id.name='categoriesLocation' and categoriesLocationProp.value=:categoriesLocation order by doc.creationDate~").setLimit(1).setOffset(0).bindValue('categoriesLocation', $categoriesSpace).execute()) 13189 - #if($macro.blogDocs.size() > 0 && $categoriesSpace != $defaultBlogSpace) 13190 - #set($macro.result = $xwiki.getDocument($macro.blogDocs.get(0))) 13191 - #else 13192 - ## Fallback to Blog.WebHome, the default blog 13193 - #set($macro.result = $xwiki.getDocument('Blog.WebHome')) 13194 - #end 13195 - #set ($blogDoc = $NULL) 13196 - #setVariable (~"$blogDoc~" $macro.result) 13197 -#end" %) 13198 -((( 13199 -(% class="macro-placeholder hidden" %) 13200 -((( 13201 -macro:velocity 13202 -))) 13203 -))) 13204 -))) 13205 - 13206 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogPostLayoutMacros~"" %) 13207 -((( 13208 -(% class="macro-placeholder hidden" %) 13209 -((( 13210 -macro:include 13211 -))) 13212 - 13213 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|#** 13214 - * Extract the layout parameters from a string. 13215 - * 13216 - * @param layoutParamsString The string representation of the layout parameters. 13217 - * It should contain a String following this format ~"paramName1=Value1|paramName2=Value2|...|paramNameK=ValueK~" 13218 - * @param layoutsParameters The resulting layout parameters Map. 13219 - *### 13220 -#macro(extractLayoutParametersFromString $layoutParamsString $layoutsParameters) 13221 - #set ($layoutsParameters = $NULL) 13222 - #set ($macro.layoutParams = \{}) 13223 - #if (~"$!layoutParamsString~" != '') 13224 - #set ($macro.paramsArr = $layoutParamsString.split('\\|')) 13225 - #foreach ($item in $macro.paramsArr) 13226 - #set ($itemSplit = $item.split('=')) 13227 - #if ($itemSplit.size() == 2) 13228 - #set ($discard = $macro.layoutParams.put($itemSplit[0].trim(), $itemSplit[1].trim())) 13229 - #end 13230 - #end 13231 - #end 13232 - #setVariable(~"$layoutsParameters~" $macro.layoutParams) 13233 -#end" %) 13234 -((( 13235 -(% class="macro-placeholder hidden" %) 13236 -((( 13237 -macro:velocity 13238 -))) 13239 -))) 13240 -))) 13241 - 13242 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-| #macro(displaySmallPost $pDoc $pObj) 13243 - #initLayoutVars($pDoc $pObj) 13244 - <div class=~"col-xs-12 col-sm-6 next_blog~"> 13245 - <a href=~"$pDoc.uRL~" class=~"thumbnail~"> 13246 - <div class=~"row~"> 13247 - <div class=~"col-xs-4~"> 13248 - #if ($imageAtt) 13249 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 13250 - #end 13251 - </div> 13252 - <div class=~"col-xs-8 art_det~"> 13253 - <p class=~"text-left~"> 13254 - #if($displayTitle)$!postTitle #end 13255 - <br/><span class=~"date_info~"> $!dateStr </span> 13256 - </p> 13257 - #displayPostDetails($pDoc) 13258 - </div> 13259 - </div> 13260 - </a> 13261 - </div> 13262 - #end 13263 - ## 13264 - ## 13265 - ## 13266 - #macro(displayPinnedPost $pDoc $pObj) 13267 - #initLayoutVars($pDoc $pObj) 13268 - <div class=~"col-xs-12 col-sm-4 col-md-4 blog_pin~"> 13269 - <a href=~"$pDoc.uRL~" class=~"all-post-link~"> 13270 - <div class=~"thumbnail~"> 13271 - #if ($displayTitle && $displayTitleFirstOnPinnedPosts) 13272 - <h5 class=~"title-top~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 13273 - #end 13274 - #if ($imageAtt) 13275 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 13276 - #end 13277 - <div class=~"caption~"> 13278 - #if ($displayTitle && !$displayTitleFirstOnPinnedPosts) 13279 - <h5 class=~"text-left~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 13280 - #end 13281 - #if ($displaySummaryOnPinnedPosts) 13282 - <div class=~"text-left post-summary~"> 13283 - #set ($postContent = $pObj.getProperty('extract').value) 13284 - $!pDoc.getRenderedContent($postContent, $pDoc.syntax.toIdString()) 13285 - </div> 13286 - #end 13287 - #displayPostDetails($pDoc) 13288 - </div> 13289 - </div> 13290 - </a> 13291 - </div> 13292 - #end 13293 - ## 13294 - ## 13295 - ## 13296 - #macro(formatPostDate $pDoc $pObj) 13297 - #set ($formattedDate = $NULL) 13298 - #set($dateStr = $datetool.format('medium', $postDate, $xcontext.locale)) 13299 - #if (~"$!dateStr~" != '') 13300 - #set ($dateArr = $dateStr.split(' ')) 13301 - #if ($dateArr.size() > 3) 13302 - #set ($dateStr = ~"~") 13303 - #foreach($s in $dateArr.subList(0, 3)) 13304 - #set ($dateStr = ~"$\{dateStr}$\{s} ~") 13305 - #end 13306 - #end 13307 - #end 13308 - #setVariable(~"$formattedDate~" $dateStr) 13309 - #end 13310 - ## 13311 - ## 13312 - ## 13313 - #macro(displayPostDetails $pDoc) 13314 - <div class=~"row post-details~"> 13315 - <div class=~"col-xs-8 detail~"> 13316 - #if ($services.like.displayButton($pDoc.documentReference)) 13317 - #set ($optLikeRecord = $services.like.getLikes($pDoc.documentReference)) 13318 - ## Retrieve the likes number in XWiki 12.9+ 13319 - #set ($likeNumber = $optLikeRecord.get()) 13320 - #if (!$stringtool.isNumeric($likeNumber.toString())) 13321 - ## Retrieve the likes number in XWiki versions greater than 12.7 and lower than 12.9. 13322 - #set ($likeNumber = $optLikeRecord.get().likeNumber) 13323 - #end 13324 - #if ($stringtool.isNumeric($likeNumber.toString())) 13325 - <div class=~"post-likes btn btn-default disabled badge~" 13326 - title=~"$escapetool.xml($services.localization.render('like.button.title', [$likeNumber]))~"> 13327 - $services.icon.renderHTML('heart') <span class=~"like-number~">$likeNumber</span> 13328 - </div> 13329 - #end 13330 - #elseif ($services.ratings) 13331 - #set ($ratingsConfigDoc = $services.ratings.getConfigurationDocument($pDoc.documentReference)) 13332 - #if ($ratingsConfigDoc.getValue('displayRatings') == 1) 13333 - <ul class=~"pull-left note list-inline~"> 13334 - #foreach ($x in [1..5]) 13335 - #set ($cls = ~"~") 13336 - #if ($x > $averageVote) 13337 - #set ($cls = ~"-o~") 13338 - #end 13339 - <li><span class=~"fa fa-star$\{cls}~"></span></li> 13340 - #end 13341 - </ul> 13342 - #end 13343 - #end 13344 - </div> 13345 - #if ($showPostComments) 13346 - <div class=~"col-xs-4 com_det~"> 13347 - <p class=~"text-right~">$services.icon.renderHTML('comments') ($!nbComments)</p> 13348 - </div> 13349 - #end 13350 - </div> 13351 - #end 13352 - ## 13353 - ## 13354 - ## 13355 - #macro(initLayoutVars $pDoc $pObj) 13356 - #set ($postTitle = $pDoc.display('title', 'view', $pObj)) 13357 - #set ($imageAtt = $pDoc.getAttachment($pObj.getValue('image'))) 13358 - #isPublished($pObj $isPublished) 13359 - #isHidden($pObj $isHidden) 13360 - #getEntryDate($pDoc $pObj $postDate) 13361 - #formatPostDate($postDate $dateStr) 13362 - #set ($averageVote = $mathtool.round($services.ratings.getAverageRating($pDoc.documentReference).getAverageVote())) 13363 - #set ($nbComments = $pDoc.getComments().size()) 13364 - #set ($showPostComments = true) 13365 - #if ($xwiki.getSpacePreferenceFor('showcomments', $pDoc.documentReference.lastSpaceReference, '1') == '0') 13366 - #set ($showPostComments = false) 13367 - #end 13368 - #end 13369 - ## 13370 - ## 13371 - ## 13372 - #macro(displayEditPinnedPostsButton) 13373 - #if (~"$!macroAdditionalParams.get('postIndex')~" == '0' && $services.security.authorization.hasAccess('edit', $pinnedPostsSourceDoc.fullName)) 13374 - #set ($discard = $xwiki.ssx.use('Blog.PinnedPostsSheet')) 13375 - #set ($discard = $xwiki.jsx.use('Blog.PinnedPostsSheet')) 13376 - #set ($editPinnedPostsURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'get', 'sheet=Blog.PinnedPostsSheet')) 13377 - #set ($newPinnedPostsObjectURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'objectadd', ~"classname=Blog.PinnedPostsClass&form_token=$!\{services.csrf.getToken()}~")) 13378 - <div class=~"edit-pinned-posts-container~"> 13379 - <div class=~"col-xs-12 col-sm-12 col-md-12 text-right edit-pinned-posts~"> 13380 - <a href=~"javascript:;~" class=~"editPinnedPosts~"> 13381 - <span class=~"glyphicon glyphicon-edit~" aria-hidden=~"true~"></span> $services.localization.render('blog.post.layout.cards.pinnedposts.edit') 13382 - </a> 13383 - <input type=~"hidden~" id=~"editPinnedPostsURL~" value=~"$escapetool.xml($editPinnedPostsURL)~"/> 13384 - <input type=~"hidden~" id=~"newPinnedPostsObjectURL~" value=~"$escapetool.xml($newPinnedPostsObjectURL)~"/> 13385 - </div> 13386 - </div> 13387 - #if (~"$!pinnedPostsObj~" == '') 13388 - <input type=~"hidden~" name=~"createPinnedPostsObject~" value=~"1~"/> 13389 - #end 13390 - #end 13391 - #end" %) 13392 -((( 13393 -(% class="macro-placeholder hidden" %) 13394 -((( 13395 -macro:velocity 13396 -))) 13397 -))) 13398 - 13399 -(% class="macro" data-macro="startmacro:velocity|-||-| #if ($services.security.authorization.hasAccess('view', $xcontext.macro.params.reference)) 13400 - #set ($postDoc = $xwiki.getDocument($xcontext.macro.params.reference)) 13401 - #getEntryObject($postDoc $postObj) 13402 - #if (~"$!postObj~" != '') 13403 - #extractLayoutParametersFromString($xcontext.macro.params.params $macroAdditionalParams) 13404 - ## 13405 - #set ($displayTitle = true) 13406 - #if (~"$!macroAdditionalParams.get('displayTitle')~" == 'false') 13407 - #set ($displayTitle = false) 13408 - #end 13409 - ## 13410 - #set ($displayTitleFirstOnPinnedPosts = false) 13411 - #if (~"$!macroAdditionalParams.get('displayTitleFirstOnPinnedPosts')~" == 'true') 13412 - #set ($displayTitleFirstOnPinnedPosts = true) 13413 - #end 13414 - ## 13415 - #set ($displaySummaryOnPinnedPosts = true) 13416 - #if (~"$!macroAdditionalParams.get('displaySummaryOnPinnedPosts')~" == 'false') 13417 - #set ($displaySummaryOnPinnedPosts = false) 13418 - #end 13419 - ## 13420 - #set ($postIndex = $numbertool.toNumber($macroAdditionalParams.get('postIndex')).intValue()) 13421 - #if ($postIndex == 0) 13422 - #set ($stopBlogPostsDisplay = false) 13423 - #end 13424 - #set ($listResultsCount = $numbertool.toNumber($macroAdditionalParams.get('list-results-count')).intValue()) 13425 - #set($discard = $xwiki.ssx.use('Blog.BlogPostLayoutCards')) 13426 - #set($scaleWidth = 600) 13427 - #set($imgQs=~"width=$scaleWidth~") 13428 - ## Display pinned posts 13429 - ## Get the list of pinned posts 13430 - #set ($pinnedPosts = []) 13431 - #set ($pinnedPostsSourceDoc = $NULL) 13432 - #if (~"$!macroAdditionalParams.get('forceDisplayPinnedPosts')~" == 'true' && ~"$!macroAdditionalParams.get('list-blog')~" != '') 13433 - #set ($pinnedPostsSourceDoc = $xwiki.getDocument($macroAdditionalParams.get('list-blog'))) 13434 - ## Note that the 'list-blog' parameter contains the value of the 'blog' parameter of the blogpostlist macro passed to the current layout macro 13435 - #end 13436 - #if (~"$!pinnedPostsSourceDoc~" != '') 13437 - #set ($pinnedPostsObj = $pinnedPostsSourceDoc.getObject('Blog.PinnedPostsClass')) 13438 - #if (~"$!pinnedPostsObj~" != '') 13439 - #set ($orderedPinnedPostsJSON = $pinnedPostsObj.getProperty('orderedPosts').value) 13440 - #if (~"$!orderedPinnedPostsJSON~" != '') 13441 - #set ($pinnedPosts = $jsontool.parse($orderedPinnedPostsJSON)) 13442 - #else 13443 - #set ($pinnedPosts = $pinnedPostsObj.getProperty('posts').value) 13444 - #end 13445 - #end 13446 - #if ($postIndex == 0 && $pinnedPosts.size() > 0) 13447 - \{\{html clean=~"false~"}} 13448 - #set ($x = 0) 13449 - #set ($showPinnedPostsButton = true) 13450 - #foreach ($pinnedPost in $pinnedPosts) 13451 - #if ($x == 0) 13452 - <div class=~"row flex-container~"> 13453 - #if ($showPinnedPostsButton) 13454 - #displayEditPinnedPostsButton() 13455 - #set($showPinnedPostsButton = false) 13456 - #end 13457 - #end 13458 - #set ($pinnedPostDoc = $xwiki.getDocument($pinnedPost)) 13459 - #getEntryObject($pinnedPostDoc $pinnedPostObj) 13460 - #if (~"$!pinnedPostObj~" != '') 13461 - #displayPinnedPost($pinnedPostDoc $pinnedPostObj) 13462 - #end 13463 - #set ($x = $mathtool.add($x, 1)) 13464 - #if ($x == 3) 13465 - #set ($x = 0) 13466 - </div> 13467 - #end 13468 - #end 13469 - #if ($mathtool.mod($x, 3) != 0) 13470 - </div> 13471 - #end 13472 - \{\{/html}} 13473 - 13474 - ## If the first post is a pinned post : this means that all the posts are pinned 13475 - ## In this case, avoid displaying the posts again after the pinned posts section. 13476 - #if ($pinnedPosts.contains($xcontext.macro.params.reference)) 13477 - #set ($stopBlogPostsDisplay = true) 13478 - #end 13479 - #elseif($postIndex == 0 && $pinnedPosts.size() == 0) 13480 - 13481 - \{\{html}} 13482 - <div class=~"row no-pinnded-posts~"> 13483 - #displayEditPinnedPostsButton() 13484 - </div> 13485 - \{\{/html}} 13486 - 13487 - #end 13488 - #end 13489 - #if (!$stopBlogPostsDisplay) 13490 - \{\{html clean=~"false~"}} 13491 - #if (~"$!nbDisplayedPosts~" == '' || $postIndex == 0) 13492 - #set ($nbDisplayedPosts = 0) 13493 - #end 13494 - #if($mathtool.mod($nbDisplayedPosts, 2) == 0) 13495 - #if ($nbDisplayedPosts != 0) 13496 - </div> 13497 - #set ($lastHtmlTag = 'c') 13498 - #end 13499 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 13500 - <div class=~"row~"> 13501 - #set ($lastHtmlTag = 'o') 13502 - #set ($lastRowClass = ~"~") 13503 - #else 13504 - <div class=~"row flex-container~"> 13505 - #set ($lastHtmlTag = 'o') 13506 - #set ($lastRowClass = ~"flex~") 13507 - #end 13508 - #end 13509 - #displaySmallPost($postDoc $postObj) 13510 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 13511 - </div> 13512 - #set ($lastHtmlTag = 'c') 13513 - #end 13514 - #set ($nbDisplayedPosts = $mathtool.add($nbDisplayedPosts, 1)) 13515 - #if ($postIndex == $mathtool.sub($listResultsCount, 1)) 13516 - #if (~"$!lastHtmlTag~" == 'o') 13517 - #if ($mathtool.mod($nbDisplayedPosts, 2) == 1 && $lastRowClass == ~"flex~") 13518 - <div class=~"col-xs-12 col-sm-6~"></div> 13519 - #end 13520 - </div> 13521 - #end 13522 - #end 13523 - \{\{/html}} 13524 - #end 13525 - #else 13526 - \{\{error}}$services.localization.render('blog.blogpostlayout.notpost', [$xcontext.macro.params.reference])\{\{/error}} 13527 - #end 13528 - #else 13529 - \{\{error}}$services.localization.render('blog.blogpostlayout.post_view_not_allowed', [$xcontext.macro.params.reference])\{\{/error}} 13530 - #end" %) 13531 -((( 13532 -(% class="macro-placeholder hidden" %) 13533 -((( 13534 -macro:velocity 13535 -))) 13536 - 13537 -(% class="macro" data-macro="startmacro:html|-|clean=~"false~"|-|<div class=~"col-xs-12 col-sm-6 next_blog~"> 13538 -<a href=~"/Nieuws/Nieuwsbrief%20oktober%202023~" class=~"thumbnail~"> 13539 -<div class=~"row~"> 13540 -<div class=~"col-xs-4~"> 13541 -<img src=~"/download/Nieuws/Nieuwsbrief%20oktober%202023/fall-flower-orange-food-harvest-produce-858531-pxhere.com.jpg?width=600&rev=1.1~" /> 13542 -</div> 13543 -<div class=~"col-xs-8 art_det~"> 13544 -<p class=~"text-left~"> 13545 -Nieuwsbrief oktober 2023 <br/><span class=~"date_info~"> Nov 28, 2023, </span> 13546 -</p> 13547 -<div class=~"row post-details~"> 13548 -<div class=~"col-xs-8 detail~"> 13549 -<div class=~"post-likes btn btn-default disabled badge~" 13550 -title=~"Number of likes on this page: 1~"> 13551 -<span class=~"fa fa-heart~"></span> <span class=~"like-number~">1</span> 13552 -</div> 13553 -</div> 13554 -<div class=~"col-xs-4 com_det~"> 13555 -<p class=~"text-right~"><span class=~"fa fa-comments~"></span> (0)</p> 13556 -</div> 13557 -</div> 13558 -</div> 13559 -</div> 13560 -</a> 13561 -</div>" %) 13562 -((( 13563 -(% class="macro-placeholder hidden" %) 13564 -((( 13565 -macro:html 13566 -))) 13567 - 13568 -(% class="col-xs-12 col-sm-6 next_blog" %) 13569 -((( 13570 -(% class="row" %) 13571 -((( 13572 -(% class="col-xs-4" %) 13573 -((( 13574 -[[~[~[image:/download/Nieuws/Nieuwsbrief%20oktober%202023/fall-flower-orange-food-harvest-produce-858531-pxhere.com.jpg?width=600&rev=1.1~]~]>>path:/Nieuws/Nieuwsbrief%20oktober%202023||class="thumbnail"]] 13575 -))) 13576 - 13577 -(% class="col-xs-8 art_det" %) 13578 -((( 13579 -(% class="text-left" %) 13580 -[[Nieuwsbrief oktober 2023 13581 -(% class="date_info" %) Nov 28, 2023,>>path:/Nieuws/Nieuwsbrief%20oktober%202023||class="thumbnail"]] 13582 - 13583 -(% class="row post-details" %) 13584 -((( 13585 -(% class="col-xs-8 detail" %) 13586 -((( 13587 -(% class="post-likes btn btn-default disabled badge" title="Number of likes on this page: 1" %) 13588 -((( 13589 -[[(% class="like-number" %)1>>path:/Nieuws/Nieuwsbrief%20oktober%202023||class="thumbnail"]] 13590 -))) 13591 -))) 13592 - 13593 -(% class="col-xs-4 com_det" %) 13594 -((( 13595 -(% class="text-right" %) 13596 -[[(0)>>path:/Nieuws/Nieuwsbrief%20oktober%202023||class="thumbnail"]] 13597 -))) 13598 -))) 13599 -))) 13600 -))) 13601 -))) 13602 -))) 13603 -))) 13604 -))) 13605 - 13606 -(% class="macro" data-macro="startmacro:blogPostLayoutCards|-|reference=~"Nieuws.Nieuw beveiligingspaneel Axon van Aritech~" params=~"displayTitle=true|useSummary=true|list-limit=10|list-layout=cards|list-blog=Nieuws.WebHome|list-paginated=no|list-results-count=10|postIndex=0|previousPostReference=|postIndex=1|previousPostReference=Nieuws.Nieuwsbrief januari 2024|postIndex=2|previousPostReference=Nieuws.Audit BMI en BORG|postIndex=3|previousPostReference=Nieuws.Nieuwsbrief december 2023|postIndex=4|previousPostReference=Nieuws.Nieuwsbrief november 2023|postIndex=5|previousPostReference=Nieuws.Feestelijke afsluiting, keuring materieel en tellen voorraden|postIndex=6|previousPostReference=Nieuws.RI&E 2023|postIndex=7|previousPostReference=Nieuws.Aankondiging update Syntess 6\\\\.9\\\\.0181|postIndex=8|previousPostReference=Nieuws.Nieuwsbrief oktober 2023~"" %) 13607 -((( 13608 -(% class="macro-placeholder hidden" %) 13609 -((( 13610 -macro:blogPostLayoutCards 13611 -))) 13612 - 13613 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogCode~"" %) 13614 -((( 13615 -(% class="macro-placeholder hidden" %) 13616 -((( 13617 -macro:include 13618 -))) 13619 - 13620 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogParameters~"" %) 13621 -((( 13622 -(% class="macro-placeholder hidden" %) 13623 -((( 13624 -macro:include 13625 -))) 13626 - 13627 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## Blog 13628 -#set($blogClassname = 'Blog.BlogClass') 13629 -#set($blogTemplate = 'Blog.BlogTemplate') 13630 -#set($blogSheet = 'Blog.BlogSheet') 13631 -## Blog entries 13632 -#set($blogPostClassname = 'Blog.BlogPostClass') 13633 -#set($blogPostTemplate = 'Blog.BlogPostTemplate') 13634 -#set($blogPostSheet = 'Blog.BlogPostSheet') 13635 -#set($blogPostObjectNumber = $xwiki.getDocument($blogPostTemplate).getObject($blogPostClassname).number) 13636 -#set($oldArticleClassname = 'XWiki.ArticleClass') 13637 -## Categories 13638 -#set($blogCategoryClassname = 'Blog.CategoryClass') 13639 -#set($blogCategoryTemplate = 'Blog.CategoryTemplate') 13640 -#set($blogCategorySheet = 'Blog.CategorySheet') 13641 -#set($blogCategoriesSheet = 'Blog.CategoriesSheet') 13642 -#set($oldBlogCategoryClassname = 'Blog.Categories') 13643 -#set($defaultCategoryParent = 'Blog.Categories') 13644 -## Style 13645 -#set($blogStyleDocumentName = 'Blog.BlogStyle') 13646 -#set($blogStyleDocument = $xwiki.getDocument($blogStyleDocumentName)) 13647 -## Clientside scripts 13648 -#set($blogScriptsDocumentName = 'Blog.BlogScripts') 13649 -#set($blogPublisher = $xwiki.getDocument('Blog.Publisher')) 13650 -## Misc 13651 -#set($thisURL = $doc.getURL($xcontext.action, $request.queryString)) 13652 -#set($isBlogPost = $doc.getObject($blogPostClassname)) 13653 -#set($defaultBlogSpace = 'Blog') 13654 -#set($isCategoryPage = $doc.getObject($blogCategoryClassname)) 13655 -#set($isCategoriesHomePage = $doc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 13656 -## 13657 -## 13658 -## 13659 -#** 13660 - * Displays an image, taken from the blog style document. 13661 - * 13662 - * @param $imgName The name of the icon from icons set to use. 13663 - *# 13664 -#macro(toolImage $imgName)(% class=~"icon-manage~"~%)$services.icon.render($imgName)(%~%)#end" %) 13665 -((( 13666 -(% class="macro-placeholder hidden" %) 13667 -((( 13668 -macro:velocity 13669 -))) 13670 -))) 13671 -))) 13672 - 13673 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## 13674 -## 13675 -## 13676 -## Import the blog skin and javascripts. 13677 -$!xwiki.ssx.use($blogStyleDocumentName)## 13678 -$!xwiki.jsx.use($blogScriptsDocumentName)## 13679 -## 13680 -## import the hierarchy for the path the blog post footer (in displayEntryBlogLocation) 13681 -#template('hierarchy_macros.vm')## 13682 -## 13683 -## 13684 -#** 13685 - * Prints a blog. This is the main macro used in the BlogSheet. 13686 - * 13687 - * @param blogDoc the XDocument holding the blog definition object. 13688 - *### 13689 -#macro(printBlog $blogDoc) 13690 - \{\{include reference='Blog.CreatePost'/}} 13691 - 13692 - ## Use the blogPostList macro to display the blogposts 13693 - ## The blogPostList is used only in case of 'all' or 'paged' blog display type because the blogPostList macro 13694 - ## do not support FTM the monthly and weekly blog display types 13695 - #getBlogDisplayType($blogDoc $displayType) 13696 - #if ($displayType == 'weekly' || $displayType == 'monthly') 13697 - #getBlogEntries($blogDoc $entries) 13698 - #displayBlog($entries 'index' true true) 13699 - #displayNavigationLinks($blogDoc) 13700 - #else 13701 - #getBlogDisplayType($blogDoc $displayType) 13702 - #set ($paginated = 'no') 13703 - #if ($displayType == 'paginated') 13704 - #set ($paginated = 'yes') 13705 - #end 13706 - #getBlogPostsLayout($blogDoc $postsLayout) 13707 - (% class=~"hfeed index~" ~%)(((\{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$paginated~" layout=~"$!postsLayout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" /}}))) 13708 - #end 13709 -#end 13710 -## 13711 -## 13712 -## 13713 -#** 13714 - * Shows blog information. In view mode, the description is printed. In edit mode, allows changing blog settings: title, 13715 - * description, blog type (global or in-space), index display type (fixed size pagination, weekly index, monthly index, 13716 - * all entries). 13717 - * 13718 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 13719 - *### 13720 -#macro(showBlogInfo $blogDoc) 13721 - #if($blogDoc.getObject($blogClassname)) 13722 - ## Keep testing for inline action for backward compatibility with older blogs. 13723 - #if($xcontext.action == 'edit' || $xcontext.action == 'inline') 13724 - #macro(displayProperty $blogDoc $propname) 13725 - ; #displayPropName($xwiki.getClass($blogClassname).get($propname)): 13726 - : $blogDoc.display($propname) 13727 - #end 13728 - #displayProperty($blogDoc 'title') 13729 - #displayProperty($blogDoc 'description') 13730 - #displayProperty($blogDoc 'displayType') 13731 - #displayProperty($blogDoc 'itemsPerPage') 13732 - #displayProperty($blogDoc 'postsLayout') 13733 - #displayProperty($blogDoc 'postsLayoutParameters') 13734 - #else 13735 - $blogDoc.display('description') 13736 - #end 13737 - #elseif($doc.fullName == $blogSheet) 13738 -= $services.localization.render('blog.code.blogsheet') = 13739 - \{\{translation key='blog.code.sheetexplanation'/}} 13740 - #else 13741 - \{\{warning}}\{\{translation key='blog.code.notblog'/}}\{\{/warning}} 13742 - #end 13743 -#end 13744 -## 13745 -## 13746 -## 13747 -#** 13748 - * Retrieve the blog document, which usually is either <tt><Space>.WebHome</tt> for whole-spaces blogs, or 13749 - * <tt><Space>.Blog</tt> for in-space blogs. If none of these documents contains a blog object, then the first 13750 - * (alphabetically) document in the target space that contains one is returned. Finally, if no document in the current 13751 - * space contains a blog object, then <tt>Blog.WebHome</tt> is returned as the default blog. 13752 - * 13753 - * @param space A <tt>String</tt>, the name of the space where to search. 13754 - * @param blogDoc The resulting XDocument. 13755 - *### 13756 -#macro(getBlogDocument $space $blogDoc) 13757 - #set ($result = $NULL) 13758 - ## Check if the current space has a WebPreferences page that contains a Blog.EnablePanelsConfigurationClass object. 13759 - ## It is possible to display a blog's panels info in a page that is not inside a blog and in that case we need to 13760 - ## identify the right blog based on a configuration object in a WebPreferences page. 13761 - #set ($spaceReference = $services.model.resolveSpace($space)) 13762 - #set ($preferencesDocRef = $services.model.createDocumentReference('WebPreferences', $spaceReference)) 13763 - #set ($preferencesDoc = $xwiki.getDocument($preferencesDocRef)) 13764 - #set ($preferencesObj = $preferencesDoc.getObject('Blog.EnablePanelsConfigurationClass')) 13765 - #if ($preferencesObj) 13766 - #set ($result = $xwiki.getDocument( $preferencesObj.getValue('blog'))) 13767 - #end 13768 - ## If no special case occurs (like the previous one), identify a blog by checking the current location from its hierarchy. 13769 - #if (~"$!result~" == '') 13770 - ## First, try the Space.WebHome, for a whole-space blog 13771 - #set($result = $xwiki.getDocument(~"$\{space}.WebHome~")) 13772 - #if(!$result.getObject($blogClassname)) 13773 - ## Second, try the Space.Blog document 13774 - #set($result = $xwiki.getDocument(~"$\{space}.Blog~")) 13775 - #if(!$result.getObject($blogClassname)) 13776 - ## Third, try searching for a blog document in the current space 13777 - ## Prevent the query fail when the space contains dots '.' 13778 - #set($blogDocs = $services.query.hql(~", BaseObject obj where doc.space = :space and obj.name = doc.fullName and obj.className = '$blogClassname' order by doc.name~").setLimit(1).setOffset(0).bindValue('space', $space).execute()) 13779 - #if($blogDocs.size() > 0) 13780 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 13781 - #else 13782 - ## Fourth, try searching for a blog document that have the its 'postsLocation' set to the current space 13783 - #set($blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as postsLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=postsLocationProp.id.id and postsLocationProp.id.name='postsLocation' and postsLocationProp.value=:postsLocation order by doc.name~").setLimit(1).setOffset(0).bindValue('postsLocation', $space).execute()) 13784 - #if($blogDocs.size() > 0) 13785 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 13786 - #else 13787 - ## Last, fallback to Blog.WebHome, the default blog 13788 - #set($result = $xwiki.getDocument('Blog.WebHome')) 13789 - #end 13790 - #end 13791 - #end 13792 - #end 13793 - #end 13794 - #set ($blogDoc = $NULL) 13795 - #setVariable (~"$blogDoc~" $result) 13796 -#end 13797 -## 13798 -## 13799 -## 13800 -#** 13801 - * Retrieve the blog title. 13802 - * 13803 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass<tt> object with the <tt>title</tt> property set. 13804 - * @param title The resulting title. 13805 - *### 13806 -#macro(getBlogTitle $blogDoc $title) 13807 - ## Titles can contain velocity code (most commonly translations), so we should evaluate them. 13808 - #set ($title = $NULL) 13809 - #setVariable (~"$title~" $!blogDoc.displayTitle) 13810 -#end 13811 -## 13812 -## 13813 -## 13814 -#** 13815 - * Retrieve the blog description. 13816 - * 13817 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>description</tt> 13818 - * property set. 13819 - * @param description The resulting description. 13820 - *### 13821 -#macro(getBlogDescription $blogDoc $description) 13822 - #getBlogProperty($blogDoc 'description' '' $result) 13823 - #set ($description = $NULL) 13824 - #setVariable (~"$description~" $result) 13825 -#end 13826 -## 13827 -## 13828 -## 13829 -#** 13830 - * Retrieves a list of entries to be displayed. The entries are either part of the blog's space, or have the blog 13831 - * document set as a parent. The number and range of entries returned (from all those belonging to this blog) depends on 13832 - * the blog display type: paginated (fixed number of entries), weekly (all entries in a week), monthly (all entries in a 13833 - * month), or all. 13834 - * 13835 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 13836 - * @param entries The resulting list of entries to display, a list of XDocument names. 13837 - *### 13838 -#macro(getBlogEntries $blogDoc $entries) 13839 - #if (!$entries) 13840 - #setVariable (~"$entries~" []) 13841 - #end 13842 - #getAllBlogPostsQuery($query) 13843 - #isDefaultBlog($blogDoc $isDefault) 13844 - #set($queryParams = \{}) 13845 - #if ($isDefault) 13846 - #getCategoryAllBlogPostsQuery($query) 13847 - #set($query = ~"$\{query} and (doc.creator = :creator or (isPublished.value = 1 and hidden.value = 0)) and (doc.space = :space or catList like :catList escape '!')~") 13848 - #set($discard = $queryParams.put('creator', $xcontext.user)) 13849 - #set($discard = $queryParams.put('space', $blogDoc.space)) 13850 - #set($sanitizedBlogSpace = $blogDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 13851 - #set($discard = $queryParams.put('catList', $sanitizedBlogSpace)) 13852 - #else 13853 - #set($query = ~"$\{query} and (doc.space = :space or doc.parent = :parent)~") 13854 - #getBlogPostsLocation($blogDoc.space $blogPostsLocation) 13855 - #set($discard = $queryParams.put('space', $blogPostsLocation)) 13856 - #set($discard = $queryParams.put('parent', $blogDoc.space)) 13857 - #end 13858 - #getBlogDisplayType($blogDoc $displayType) 13859 - #if($displayType == 'weekly') 13860 - #getWeeklyBlogEntries($blogDoc $query $entries $queryParams) 13861 - #elseif($displayType == 'monthly') 13862 - #getMonthlyBlogEntries($blogDoc $query $entries $queryParams) 13863 - #elseif($displayType == 'all') 13864 - #getAllBlogEntries($blogDoc $query $entries $queryParams) 13865 - #else 13866 - #getPagedBlogEntries($blogDoc $query $entries $queryParams) 13867 - #end 13868 -#end 13869 -## 13870 -## 13871 -## 13872 -#** 13873 - * Retrieves a list of entries to be displayed. The entries are taken from a ~"page~" of the blog, a sequence of documents 13874 - * defined by the request parameters <tt>ipp</tt> (items per page) and <tt>page</tt> (the current page). Initially the 13875 - * first page is displayed, with the number of entries defined in the blog object in the <tt>itemsPerPage</tt> property 13876 - * (10 if not defined). 13877 - * 13878 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 13879 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 13880 - * refined to restrict to a given space, or to a given search criteria, etc. 13881 - * @param entries The resulting list of entries to display, a list of XDocument names. 13882 - * @param queryParams The parameters to bind with the query. 13883 - *### 13884 -#macro(getPagedBlogEntries $blogDoc $query $entries $queryParams) 13885 - #if (!$entries) 13886 - #setVariable (~"$entries~" []) 13887 - #end 13888 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 13889 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~")) 13890 - #bindQueryParameters($countQueryObj $queryParams) 13891 - #bindQueryParameters($queryObj $queryParams) 13892 - #set($totalEntries = $countQueryObj.count()) 13893 - #getBlogProperty($blogDoc 'itemsPerPage' '10' $defaultItemsPerPage) 13894 - #set($defaultItemsPerPage = $numbertool.toNumber($defaultItemsPerPage).intValue()) 13895 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 13896 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 13897 - #set($discard = $entries.addAll($queryObj.setLimit($itemsPerPage).setOffset($startAt).addFilter(~"unique~").execute())) 13898 -#end 13899 -## 13900 -## 13901 -## 13902 -#** 13903 - * Retrieves a list of entries to be displayed. The entries are taken from a week of the blog. The target week is 13904 - * defined by the request parameters <tt>week</tt> (the week number in the year, from 1 to 52) and <tt>year</tt> (4 13905 - * digit year). Initially the current week is displayed. 13906 - * 13907 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 13908 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 13909 - * refined to restrict to a given space, or to a given search criteria, etc. 13910 - * @param entries The resulting list of entries to display, a list of XDocument names. 13911 - * @param queryParams The parameters to bind with the query. 13912 - *### 13913 -#macro(getWeeklyBlogEntries $blogDoc $query $entries $queryParams) 13914 - #if (!$entries) 13915 - #setVariable (~"$entries~" []) 13916 - #end 13917 - #getRequestedWeek($weekDate) 13918 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 13919 - #set($minDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundFloor())) 13920 - #set($maxDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundCeiling())) 13921 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 13922 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 13923 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 13924 - #bindQueryParameters($countQueryObj $queryParams) 13925 - #bindQueryParameters($queryObj $queryParams) 13926 - #set($totalEntries = $countQueryObj.count()) 13927 - #set($discard = $entries.addAll($queryObj.execute())) 13928 -#end 13929 -## 13930 -## 13931 -## 13932 -#** 13933 - * Retrieves a list of entries to be displayed. The entries are taken from a month of the blog. The target month is 13934 - * defined by the request parameters <tt>month</tt> (the month number, from 1 to 12) and <tt>year</tt> (4 13935 - * digit year). Initially the current month is displayed. 13936 - * 13937 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 13938 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 13939 - * refined to restrict to a given space, or to a given search criteria, etc. 13940 - * @param entries The resulting list of entries to display, a list of XDocument names. 13941 - * @param queryParams The parameters to bind with the query. 13942 - *### 13943 -#macro(getMonthlyBlogEntries $blogDoc $query $entries) 13944 - #if (!$entries) 13945 - #setVariable (~"$entries~" []) 13946 - #end 13947 - #getRequestedMonth($monthDate) 13948 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 13949 - #set($minDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundFloor())) 13950 - #set($maxDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundCeiling())) 13951 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 13952 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 13953 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 13954 - #bindQueryParameters($countQueryObj $queryParams) 13955 - #bindQueryParameters($queryObj $queryParams) 13956 - #set($totalEntries = $countQueryObj.count()) 13957 - #set($discard = $entries.addAll($queryObj.execute())) 13958 -#end 13959 -## 13960 -## 13961 -## 13962 -#** 13963 - * Retrieves a list of entries to be displayed. All entries belonging to the current blog are returned. 13964 - * 13965 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 13966 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 13967 - * refined to restrict to a given space, or to a given search criteria, etc. 13968 - * @param entries The resulting list of entries to display, a list of XDocument names. 13969 - * @param queryParams The parameters to bind with the query. 13970 - *### 13971 -#macro(getAllBlogEntries $blogDoc $query $entries $queryParams) 13972 - #if (!$entries) 13973 - #setVariable (~"$entries~" []) 13974 - #end 13975 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 13976 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 13977 - #bindQueryParameters($countQueryObj $queryParams) 13978 - #bindQueryParameters($queryObj $queryParams) 13979 - #set($totalEntries = $countQueryObj.count()) 13980 - #set($discard = $entries.addAll($queryObj.execute())) 13981 -#end 13982 -## 13983 -## 13984 -## 13985 -#** 13986 - * Retrieves a list of entries to be displayed. Only (and all) unpublished entries are returned. 13987 - * 13988 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 13989 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 13990 - * refined to restrict to a given space, or to a given search criteria, etc. 13991 - * @param queryParams The parameters to bind with the query. 13992 - * @param entries The resulting list of entries to display, a list of XDocument names. 13993 - *### 13994 -#macro(getUnpublishedBlogEntries $blogDoc $query $queryParams $entries) 13995 - #if (!$entries) 13996 - #setVariable (~"$entries~" []) 13997 - #end 13998 - #set($query = ~"$\{query} and isPublished.value = 0~") 13999 - #set ($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 14000 - #set ($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 14001 - #bindQueryParameters($countQueryObj $queryParams) 14002 - #bindQueryParameters($queryObj $queryParams) 14003 - #set($totalEntries = $countQueryObj.count()) 14004 - #set($discard = $entries.addAll($queryObj.execute())) 14005 -#end 14006 -## 14007 -## 14008 -## 14009 -#** 14010 - * Retrieves a list of entries to be displayed. The entries are taken from all the wiki, and not from a specific blog. 14011 - * 14012 - * @param entries The resulting list of entries to display, a list of XDocument names. 14013 - *### 14014 -#macro(getGlobalBlogEntries $entries) 14015 - #if (!$entries) 14016 - #setVariable (~"$entries~" []) 14017 - #end 14018 - #getAllBlogPostsQuery($query) 14019 - #set($totalEntries = $services.query.hql($query).count()) 14020 - #set($defaultItemsPerPage = 20) 14021 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 14022 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 14023 - #set($discard = $entries.addAll($services.query.hql(~"$\{query} order by publishDate.value desc~").setLimit($itemsPerPage).setOffset($startAt).execute())) 14024 -#end 14025 -#** 14026 - * Return the base query for selecting blog entries. It filters only visible entries, but does not bind to a specific 14027 - * blog, nor specify a range or an ordering criteria. 14028 - * 14029 - * This macro is a duplicate of #getAllBlogPostsQuery($query). Keep it in case it's used outside, in custom code. 14030 - * 14031 - * @param query The basic query for selecting blog entries. 14032 - *# 14033 -#macro(getBlogEntriesBaseQuery $query) 14034 - #getAllBlogPostsQuery($query) 14035 -#end 14036 -#** 14037 - * Return the Query for selecting the all wiki blog posts without filtering 14038 - * 14039 - * @param query The basic query for selecting blog entries. 14040 - *# 14041 -#macro(getAllBlogPostsQuery $query) 14042 - #set ($query = $NULL) 14043 - #setVariable(~"$query~" ~", BaseObject as obj, IntegerProperty isPublished, 14044 - IntegerProperty hidden, DateProperty publishDate 14045 - where doc.fullName <> '$blogPostTemplate' and 14046 - obj.name=doc.fullName and obj.className='$blogPostClassname' and 14047 - isPublished.id.id = obj.id and isPublished.id.name = 'published' and 14048 - hidden.id.id = obj.id and hidden.id.name='hidden' and 14049 - publishDate.id.id = obj.id and publishDate.id.name='publishDate' and 14050 - (doc.creator = '$escapetool.sql($xcontext.user)' or (isPublished.value = 1 and hidden.value = 0))~") 14051 -#end 14052 -## 14053 -## 14054 -## 14055 -###** 14056 - * Return the Query for selecting the all wiki blog posts with categories filtering 14057 - * 14058 - * @param query The basic query for selecting blog entries. 14059 - *### 14060 -#macro(getCategoryAllBlogPostsQuery $query) 14061 - #set ($query = $NULL) 14062 - #getAllBlogPostsQuery($baseQuery) 14063 - #set ($baseQuery = $baseQuery.replace('DateProperty publishDate', 'DateProperty publishDate, DBStringListProperty as category left join category.list catList')) 14064 - #setVariable(~"$query~" ~"$\{baseQuery} and obj.id=category.id.id and category.id.name='category'~") 14065 -#end 14066 -## 14067 -## 14068 -## 14069 -#** 14070 - * Determines how is the blog index split into pages: paginated (fixed number of entries), weekly (all entries in a 14071 - * week), monthly (all entries in a month), or all. 14072 - * 14073 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>displayType</tt> 14074 - * property set. 14075 - * @param displayType The resulting string. If the blog object does not define anything, it is considered paginated. 14076 - *### 14077 -#macro(getBlogDisplayType $blogDoc $displayType) 14078 - #getBlogProperty($blogDoc 'displayType' 'paginated' $result) 14079 - #set ($displayType = $NULL) 14080 - #setVariable (~"$displayType~" $result) 14081 -#end 14082 -## 14083 -## 14084 -## 14085 -#** 14086 - * Displays a list of entries. 14087 - * 14088 - * @param entries The entries to display, a list of XDocument names. 14089 - * @param displaying What exactly is displayed: blog index, a single blog entry, a blog category, search results, 14090 - * unpublished entries, etc. This will be used as the classname(s) for the container div (hfeed). Currently 14091 - * used values: index, single, category, search, unpublished, hidden. 14092 - * @param onlyExtract If <tt>true</tt>, only display the extract of articles where available, otherwise display the full content. 14093 - * @param shouldDisplayTitles If <tt>true</tt>, display the blog title (blog posts shouldn't display the title when they're 14094 - * displayed alone on their page since it's the page title which is used in this case) 14095 - *### 14096 -#macro(displayBlog $entries $displaying $onlyExtract $shouldDisplayTitles) 14097 - #set($blogDay = '') 14098 - (% class=~"hfeed $!\{displaying}~" ~%)((( 14099 - (% class=~"blogDay~" ~%)((( 14100 - #foreach ($entryDoc in $xwiki.wrapDocs($entries)) 14101 - #getEntryObject($entryDoc $entryObj) 14102 - ## Although all entries should have one of the two objects, better check to be sure. 14103 - #if(~"$!\{entryObj}~" != '') 14104 - #getEntryDate($entryDoc $entryObj $entryDate) 14105 - ## Display a ~"calendar sheet~" for each day. All entries posted on the same day share one such sheet. 14106 - #set($entryDateStr = $xwiki.formatDate($entryDate, 'yyyyMMMMdd')) 14107 - #if($blogDay != $entryDateStr) 14108 - #if($blogDay != '') 14109 - ))) 14110 - (% class=~"blogDay~" ~%)((( 14111 - #end 14112 - #displayBlogDate($entryDate) 14113 - #set ($blogDay = $entryDateStr) 14114 - #end 14115 - ## Finally, display the entry. 14116 - #displayEntry($entryDoc $entryObj $onlyExtract $shouldDisplayTitles true) 14117 - #end 14118 - #end 14119 - )))## blogDay 14120 - )))## hfeed 14121 -#end 14122 -## 14123 -## 14124 -## 14125 -#** 14126 - * Get the entry object, either a new BlogPost or an old Article. 14127 - * 14128 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 14129 - * @param entryObj The resulting xobject of the blog post. 14130 - *### 14131 -#macro(getEntryObject $entryDoc $__entryObj) 14132 - #set($result = $entryDoc.getObject(~"$\{blogPostClassname}~")) 14133 - #if(!$result) 14134 - #set($result = $entryDoc.getObject(~"$\{oldArticleClassname}~")) 14135 - #end 14136 - ## NOTE: The reason we put an underscore in front of the variable name is to prevent the following line from 14137 - ## overwriting the $entryObj variable that may be defined before this macro is called. Of course, $__entryObj may be 14138 - ## overwritten in this case but it's less likely to have such a variable defined before. 14139 - #set ($__entryObj = $NULL) 14140 - #setVariable (~"$__entryObj~" $result) 14141 -#end 14142 -## 14143 -## 14144 -## 14145 -#** 14146 - * Gets the date associated with a blog entry. This is the publication date. For unpublished entries, initially this is 14147 - * the document creation date, but can be edited by the user. 14148 - * 14149 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 14150 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 14151 - * @param result The resulting date, an instance of <tt>java.util.Date</tt>. 14152 - *### 14153 -#macro(getEntryDate $entryDoc $entryObj $result) 14154 - #set ($result = $NULL) 14155 - #setVariable (~"$result~" $entryObj.getProperty('publishDate').value) 14156 -#end 14157 -## 14158 -## 14159 -## 14160 -#** 14161 - * Displays a date, nicely formatted as a calendar page. 14162 - * 14163 - * @param date The date to display, an instance of <tt>java.util.Date</tt>. 14164 - *### 14165 -#macro(displayBlogDate $date) 14166 - #set($year = $xwiki.formatDate($date, 'yyyy')) 14167 - ## 3 letter month name, like Jan, Dec. 14168 - #set($month = $xwiki.formatDate($date, 'MMM')) 14169 - ## Uncomment to get a full length month name, like January, December. 14170 - ## TODO: this could be defined somewhere in the blog style. 14171 - ## #set($month = $xwiki.formatDate($date, 'MMMM')) 14172 - #set($day = $xwiki.formatDate($date, 'dd')) 14173 - (% class=~"blogdate~" ~%) 14174 - == (% class=~"month~" ~%)$month(%~%) (% class=~"day~" ~%)$day(%~%) (% class=~"year~" ~%)$year(%~%) == 14175 -#end 14176 -## 14177 -## 14178 -## 14179 -#** 14180 - * Displays a blog article: management tools, header, content, footer. 14181 - * 14182 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 14183 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 14184 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 14185 - * @param shouldDisplayTitle If <tt>true</tt>, display the blog title (blog posts shouldn't display the title 14186 - * when they're displayed alone on their page since it's the page title which is used in this case) 14187 - * @param shouldDisplayActions If <tt>true</tt>, display the blog post actions buttons 14188 - *### 14189 -#macro(displayEntry $entryDoc $entryObj $onlyExtract $shouldDisplayTitle $shouldDisplayActions) 14190 - ## Only articles with an explicit hidden setting or an explicit unpublished setting are hidden 14191 - #isPublished($entryObj $isPublished) 14192 - #isHidden($entryObj $isHidden) 14193 - #if($doc.fullName == $entryDoc.fullName) 14194 - (% class=~"hentry single-article~" ~%)((( 14195 - #else 14196 - (% class=~"hentry#if(!$isPublished) unpublished-article#elseif($isHidden) hidden-article#end~" ~%)((( 14197 - #end 14198 - #if ($shouldDisplayActions) 14199 - #displayEntryTools($entryDoc $entryObj) 14200 - #end 14201 - #if($shouldDisplayTitle) 14202 - #displayEntryTitle($entryDoc $entryObj) 14203 - #end 14204 - #if($doc.fullName == $entryDoc.fullName) 14205 - #if(!$isPublished) 14206 - \{\{warning}}\{\{translation key='blog.code.published'/}}\{\{/warning}} 14207 - #elseif($isHidden) 14208 - \{\{warning}}\{\{translation key='blog.code.hidden'/}}\{\{/warning}} 14209 - #end 14210 - #end 14211 - #displayEntryContent($entryDoc $entryObj $onlyExtract) 14212 - #displayEntryFooter($entryDoc $entryObj) 14213 - )))## hentry 14214 -#end 14215 -## 14216 -## 14217 -## 14218 -#** 14219 - * Checks if the provided blog is published or not. 14220 - * 14221 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 14222 - * @param isPublished The resulting boolean, true if the entry is considered published. 14223 - *### 14224 -#macro(isPublished $entryObj $isPublished) 14225 - #set ($isPublished = $NULL) 14226 - ## This should work for both old articles, which don't have the 'published' property at all, and 14227 - ## are considered published by default, and new entries, that should have 1 if published. 14228 - #if (~"$!\{entryObj.getProperty('published').value}~" != '0') 14229 - #setVariable (~"$isPublished~" true) 14230 - #else 14231 - #setVariable (~"$isPublished~" false) 14232 - #end 14233 -#end 14234 -## 14235 -## 14236 -## 14237 -#** 14238 - * Checks if the provided blog is hidden or not. 14239 - * 14240 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass<tt> xclass. 14241 - * @param isHiddel The resulting boolean, true if the entry is considered hidden. 14242 - *### 14243 -#macro(isHidden $entryObj $isHidden) 14244 - #set ($isHidden = $NULL) 14245 - ## This should work for both old articles, which don't have the 'hidden' property at all, and 14246 - ## are considered visible by default, and new entries, that should have 1 if hidden. 14247 - #if (~"$!\{entryObj.getProperty('hidden').value}~" == '1') 14248 - #setVariable (~"$isHidden~" true) 14249 - #else 14250 - #setVariable (~"$isHidden~" false) 14251 - #end 14252 -#end 14253 -## 14254 -## 14255 -## 14256 -#** 14257 - * Displays several ~"tools~" for manipulating blog posts: hide/show, publish, edit. 14258 - * 14259 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 14260 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 14261 - *### 14262 -#macro(displayEntryTools $entryDoc $entryObj) 14263 - #if($xcontext.action == 'view') 14264 - (% class=~"blog-entry-toolbox~" ~%)((( 14265 - #displayPublishButton($entryDoc $entryObj) 14266 - #displayHideShowButton($entryDoc $entryObj) 14267 - #displayEditButton($entryDoc $entryObj) 14268 - #displayDeleteButton($entryDoc $entryObj) 14269 - ))) 14270 - #end 14271 -#end 14272 -## 14273 -## 14274 -## 14275 -#** 14276 - * Displays the publish button to the entry <strong>creator</strong>, if the article is not published yet. 14277 - * 14278 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 14279 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 14280 - * @todo AJAX calls. 14281 - *### 14282 -#macro(displayPublishButton $entryDoc $entryObj) 14283 - #isPublished($entryObj $isPublished) 14284 - #if(!$isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 14285 - [[#toolImage('world')>>path:$blogPublisher.getURL('view', ~"entryName=$\{escapetool.url($entryDoc.fullName)}&xredirect=$\{escapetool.url($thisURL)}&form_token=$!\{services.csrf.getToken()}~")||title=~"$services.localization.render('blog.code.notpublished')~"]]## 14286 - #end 14287 -#end 14288 -## 14289 -## 14290 -## 14291 -#** 14292 - * Displays the hide or show button to the entry <strong>creator</strong>, if the article is already published. 14293 - * 14294 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 14295 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 14296 - *### 14297 -#macro(displayHideShowButton $entryDoc $entryObj) 14298 - #isPublished($entryObj $isPublished) 14299 - #isHidden($entryObj $isHidden) 14300 - ## Only published articles can be hidden. Unpublished articles are considered already hidden. 14301 - #if($isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 14302 - #set ($queryString = \{ 14303 - 'xredirect' : $thisURL, 14304 - 'form_token' : $services.csrf.getToken() 14305 - }) 14306 - #if ($isHidden) 14307 - #set ($discard = $queryString.putAll(\{ 14308 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 0, 14309 - 'comment' : $services.localization.render('blog.code.madevisible') 14310 - })) 14311 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 14312 - [[#toolImage('unlock')>>path:$lockURL||class=~"blog-tool-show~" title=~"$services.localization.render('blog.code.makevisible')~"]]## 14313 - #else 14314 - #set ($discard = $queryString.putAll(\{ 14315 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 1, 14316 - 'comment' : $services.localization.render('blog.code.hid') 14317 - })) 14318 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 14319 - [[#toolImage('lock')>>path:$lockURL||class=~"blog-tool-hide~" title=~"$services.localization.render('blog.code.hide')~"]]## 14320 - #end 14321 - #end 14322 -#end 14323 -## 14324 -## 14325 -## 14326 -#** 14327 - * Displays the edit button to those that can edit the article. 14328 - * 14329 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 14330 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 14331 - *### 14332 -#macro(displayEditButton $entryDoc $entryObj) 14333 - #if($xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 14334 - ## Call getDefaultEditMode() for backward compatibility with older blog posts. 14335 - [[#toolImage('pencil')>>path:$entryDoc.getURL('edit')||title=~"$services.localization.render('blog.code.editpost')~"]]## 14336 - #end 14337 -#end 14338 -## 14339 -## 14340 -## 14341 -#** 14342 - * Displays the delete button to those that can edit the article. 14343 - * 14344 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 14345 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 14346 - * @todo AJAX calls. 14347 - *### 14348 -#macro(displayDeleteButton $entryDoc $entryObj) 14349 - #if($xwiki.hasAccessLevel('delete', $xcontext.user, $entryDoc.fullName)) 14350 - [[#toolImage('cross')>>path:$entryDoc.getURL('delete')||title=~"$services.localization.render('blog.code.deletepost')~"]]## 14351 - #end 14352 -#end 14353 -## 14354 -## 14355 -## 14356 -#** 14357 - * Displays the title of the entry. 14358 - * 14359 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 14360 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 14361 - *### 14362 -#macro(displayEntryTitle $entryDoc $entryObj) 14363 - #if($doc.fullName == $entryDoc.fullName) 14364 - (% class=~"entry-title~" ~%) 14365 - = $services.rendering.escape($entryDoc.display('title', 'view', $entryObj), $xwiki.getCurrentContentSyntaxId()) = 14366 - #else 14367 - (% class=~"entry-title~" ~%) 14368 - === [[$services.rendering.escape($entryDoc.display('title', 'view', $entryObj),$xwiki.getCurrentContentSyntaxId())>>doc:$services.rendering.escape($services.model.serialize($entryDoc.getDocumentReference(),'default'),$xwiki.getCurrentContentSyntaxId())]] === 14369 - #end 14370 -#end 14371 -## 14372 -## 14373 -## 14374 -#** 14375 - * Displays the body of the entry. 14376 - * 14377 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 14378 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 14379 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 14380 - *### 14381 -#macro(displayEntryContent $entryDoc $entryObj $onlyExtract) 14382 - (% class=~"#if($onlyExtract)entry-summary#\{else}entry-content#end~" ~%)((( 14383 - #getEntryContent($entryDoc $entryObj $onlyExtract $entryContent) 14384 - ## FIXME: This causes the blog's content to not be annotatable. See http://jira.xwiki.org/browse/XWIKI-6328 14385 - ## Should probably be replaced by a display macro call with a reference to the object property holding the post's content 14386 - \{\{html wiki=~"false~"}}$entryDoc.getRenderedContent($entryContent, $entryDoc.syntax.toIdString())\{\{/html}} 14387 - ))) ## entry-content 14388 - (% class=~"clearfloats~" ~%)((())) 14389 -#end 14390 -## 14391 -## 14392 -## 14393 -#** 14394 - * Extracts the body of the entry that should be displayed. If <tt>onlyExtract</tt> is <tt>true</tt>, display the content 14395 - * of the <tt>extract</tt> field (if not empty). 14396 - * 14397 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 14398 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 14399 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 14400 - * @param entryContent The resulting content. 14401 - * @param removeEllipsis If <tt>true</tt>, then don't display an ellipsis at the end of the content (only used when 14402 - * <tt>onlyExtract</tt> is <tt>true</tt>) 14403 - *### 14404 -#macro(getEntryContent $entryDoc $entryObj $onlyExtract $entryContent $removeEllipsis) 14405 - #if ($onlyExtract) 14406 - ## Note: We trim the summary so that if there's some white space it won't cause the summary to be used instead 14407 - ## of the content. 14408 - #set ($macro.result = $entryObj.getProperty('extract').value.trim()) 14409 - #end 14410 - #if(~"$!macro.result~" == '') 14411 - #set($macro.result = $entryObj.getProperty('content').value) 14412 -#* Disabled until the content can be cleanly cut. 14413 -* #if($onlyExtract && $result.length()>$maxchars) 14414 -* #set($i = $macro.result.lastIndexOf(~" ~", $maxchars)) 14415 -* #set($i = $i + 1) 14416 -* #set($macro.result = ~"$\{macro.result.substring(0,$i)} *[...>$\{entryDoc.fullName}]*~") 14417 -* #end 14418 -## *### 14419 - #elseif (!$removeEllipsis) 14420 - #if($entryDoc.syntax.toIdString() == 'xwiki/1.0') 14421 - #set($macro.result = ~"$\{macro.result} <a href='$\{entryDoc.getExternalURL()}' title='$services.localization.render('blog.code.readpost')'>...</a>~") 14422 - #elseif($entryDoc.syntax.toIdString() == 'xwiki/2.0' || $entryDoc.syntax.toIdString() == 'xwiki/2.1') 14423 - #set($macro.result = ~"$\{macro.result} [[...>>$\{services.rendering.escape($entryDoc.getFullName(), $entryDoc.getSyntax())}||title='$services.localization.render('blog.code.readpost')']]~") 14424 - #end 14425 - #end 14426 - #set ($entryContent = $NULL) 14427 - #setVariable (~"$entryContent~" $macro.result) 14428 -#end 14429 -## 14430 -## 14431 -## 14432 -#** 14433 - * Displays the footer of the entry. 14434 - * 14435 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 14436 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 14437 - *### 14438 -#macro(displayEntryFooter $entryDoc $entryObj) 14439 - (% class=~"entry-footer~" ~%)((( 14440 - #isPublished($entryObj $isPublished) 14441 - (% class='entry-author-label' ~%) 14442 - #if($isPublished) 14443 - \{\{translation key='blog.code.postedby'/}} ## 14444 - #else 14445 - \{\{translation key='blog.code.createdby'/}} ## 14446 - #end 14447 - \{\{html wiki=~"false~" clean=~"false~"}}<span class='author vcard'>#userfn($entryDoc.creator)</span>\{\{/html}} ## 14448 - #getEntryDate($entryDoc $entryObj $entryDate) 14449 - #listCategories($entryObj) #* 14450 - ## Since the publish date and update date are not set at the exact same time, there could be a small difference that 14451 - ## we assume cannot be more than 3 seconds. 14452 - *#(% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.permalink'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||rel=~"bookmark~"]] ## 14453 - #if ($showcomments) 14454 - (% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.comments'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||anchor=~"Comments~"]] (% class=~"itemCount~" ~%)($entryDoc.comments.size())(%~%) ## 14455 - #end ## 14456 - #if($entryDoc != $doc) ## 14457 - #displayEntryBlogLocation($entryDoc $entryObj) ## 14458 - #end 14459 - )))## entry-footer 14460 -#end 14461 -## 14462 -## 14463 -#** 14464 - * Display the blog for the entry (if it is not the currently displayed blog) 14465 - * 14466 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 14467 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 14468 - *### 14469 -#macro(displayEntryBlogLocation $entryDoc $entryObj) 14470 - #getBlogPostsLocation($entryDoc.getSpace() $blogPostsLocation) ## 14471 - #if(~"$!blogPostsLocation~" != ~"~") ## 14472 - #set($blogSpaceRef = $services.model.resolveSpace($blogPostsLocation)) ## 14473 - #set($blogDocRef = $services.model.createDocumentReference($services.model.getEntityReference('DOCUMENT', 'default').getName(), $blogSpaceRef)) ## 14474 - #if($doc.documentReference != $blogDocRef) ## 14475 - #set($blogDoc = $xwiki.getDocument($blogDocRef)) ## 14476 - #set($blogObj = $blogDoc.getObject('Blog.BlogClass')) ## 14477 - #if($blogObj) (% class=~"blogrefpath~" ~%)((( ## 14478 - $services.localization.render('blog.code.postedin') \{\{html clean=~"false~" wiki=~"false~"}} #hierarchy($blogDocRef, \{'selfIsActive' : true, 'local': true}) \{\{/html}} ## 14479 - )))(%~%)## 14480 - #end 14481 - #end 14482 - #end 14483 -#end 14484 -## 14485 -## 14486 -## 14487 -## 14488 -#** 14489 - * List the categories an entry belongs to. Used in the footer. The categories are instances of <tt>Blog.CategoryClass</tt>. 14490 - * 14491 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 14492 - *### 14493 -#macro(listCategories $entryObj) 14494 - #if($entryObj.getxWikiClass().getName() == $blogPostClassname) 14495 - #set($categories = $entryObj.getProperty('category').value) 14496 - #set($first = true) 14497 - #if($categories.size() > 0) 14498 - #foreach($category in $categories) 14499 - #set($categoryDoc = $!xwiki.getDocument($category)) 14500 - #if(!$categoryDoc.isNew() && $categoryDoc.getObject($\{blogCategoryClassname})) 14501 - #if($foreach.count == 1) 14502 - (% class='separator' ~%)·(%~%) $services.localization.render('blog.code.categories') ## 14503 - #else 14504 - , ## 14505 - #end## 14506 - [[$!\{categoryDoc.getObject($blogCategoryClassname).getValue('name')}>>$\{category}||rel='tag']]## 14507 - #end## 14508 - #end## 14509 - #end 14510 - #end 14511 -#end 14512 -## 14513 -## 14514 -## 14515 -#** 14516 - * Displays blog pagination links (older and newer entries). 14517 - * 14518 - * @param blogDoc the XDocument holding the blog definition object. 14519 - *### 14520 -#macro(displayNavigationLinks $blogDoc) 14521 - (% class=~"clearfloats~" ~%)((())) 14522 - #getBlogDisplayType($blogDoc $displayType) 14523 - #if($displayType == 'weekly') 14524 - (% class=~"pagingLinks~" ~%)((( 14525 - #getRequestedWeek($weekDate) 14526 - $weekDate.addWeeks(-1)## 14527 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousweek'/}}>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 14528 - #sep() 14529 - $weekDate.addWeeks(2)## 2 because we already subtracted 1 above 14530 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextweek'/}} »>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 14531 - ))) 14532 - #elseif($displayType == 'monthly') 14533 - (% class=~"pagingLinks~" ~%)((( 14534 - #getRequestedMonth($monthDate) 14535 - $monthDate.addMonths(-1)## 14536 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousmonth'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 14537 - #sep() 14538 - $monthDate.addMonths(2)## 2 because we already subtracted 1 above 14539 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextmonth'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 14540 - ))) 14541 - #elseif($displayType == 'all') 14542 - #else 14543 - ## Paginated 14544 - #if(($totalPages > 1)) 14545 - #set($queryString = '') 14546 - #foreach($p in $request.getParameterNames()) 14547 - #if($p != 'page' && $p != 'ipp') 14548 - #foreach($v in $request.getParameterValues($p)) 14549 - #set($queryString = ~"$\{queryString}&$\{escapetool.url($p)}=$\{escapetool.url($v)}~") 14550 - #end 14551 - #end 14552 - #end 14553 - (% class=~"pagingLinks~" ~%)((( 14554 - #if ($currentPageNumber < $totalPages) 14555 - #set($currentPageNumber = $currentPageNumber + 1) 14556 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.olderposts'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 14557 - #set($currentPageNumber = $currentPageNumber - 1) 14558 - #end 14559 - #if ($currentPageNumber > 1) 14560 - #if ($currentPageNumber < $totalPages) 14561 - #sep() 14562 - #end 14563 - #set($currentPageNumber = $currentPageNumber - 1) 14564 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.newerposts'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 14565 - #set($currentPageNumber = $currentPageNumber + 1) 14566 - #end 14567 - (% class=~"clear~" ~%)(%~%) 14568 - )))## pagingLinks 14569 - #end 14570 - #end 14571 -#end 14572 -## 14573 -## 14574 -## 14575 -#** 14576 - * Displays a message box with ~"publish~" icon. 14577 - * 14578 - * @param message A text message concerning blog article publishing 14579 - *### 14580 -#macro(publishMessageBox $message) 14581 -(% class=~"plainmessage publish-message~" ~%)((($services.icon.render('world') $message))) 14582 -#end 14583 -#** 14584 - * Displays a message box with ~"show/hide~" icon. 14585 - * 14586 - * @param message A text message concerning blog article hiding 14587 - *### 14588 -#macro(hideMessageBox $message) 14589 -(% class=~"plainmessage hide-message~" ~%)((($services.icon.render('unlock') $message))) 14590 -#end 14591 -## 14592 -## 14593 -## 14594 -#** 14595 - * Determine the requested week, for using in a weekly-indexed blog. The relevant request parameters are 14596 - * <tt>year</tt> and <tt>week</tt>. By default, the current week is used. 14597 - * 14598 - * @param monthDate The resulting week, a JODATime MutableDateTime. 14599 - *### 14600 -#macro(getRequestedWeek $weekDate) 14601 - #set ($weekDate = $NULL) 14602 - #setVariable (~"$weekDate~" $xwiki.jodatime.mutableDateTime) 14603 - #if(~"$!\{request.year}~" != '') 14604 - #set ($discard = $weekDate.setYear($numbertool.toNumber($request.year).intValue())) 14605 - #end 14606 - #if(~"$!\{request.week}~" != '') 14607 - #set ($discard = $weekDate.setWeekOfWeekyear($numbertool.toNumber($request.week).intValue())) 14608 - #end 14609 -#end 14610 -## 14611 -## 14612 -## 14613 -#** 14614 - * Determine the requested month, for using in a monthly-indexed blog. The relevant request parameters are 14615 - * <tt>year</tt> and <tt>month</tt>. By default, the current month is used. 14616 - * 14617 - * @param monthDate The resulting month, a JODATime MutableDateTime. 14618 - *### 14619 -#macro(getRequestedMonth $monthDate) 14620 - #set ($monthDate = $NULL) 14621 - #setVariable (~"$monthDate~" $xwiki.jodatime.mutableDateTime) 14622 - #if(~"$!\{request.year}~" != '') 14623 - #set ($discard = $monthDate.setYear($numbertool.toNumber($request.year).intValue())) 14624 - #end 14625 - #if(~"$!\{request.month}~" != '') 14626 - #set ($discard = $monthDate.setMonthOfYear($numbertool.toNumber($request.month).intValue())) 14627 - #end 14628 -#end 14629 -## 14630 -## 14631 -## 14632 -#** 14633 - * Retrieve a blog property (title, display type, etc). 14634 - * 14635 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 14636 - * @param propertyName The name of the property to be retrieved. One of the <tt>Blog.BlogClass</tt>'s properties. 14637 - * @param defaultValue The default value to use in case the blog object does not define one. 14638 - * @param propertyValue The resulting value. 14639 - *### 14640 -#macro(getBlogProperty $blogDoc $propertyName $defaultValue $propertyValue) 14641 - #set($result = ~"$!\{blogDoc.getObject($\{blogClassname}).getProperty($propertyName).value}~") 14642 - #if($result == '') 14643 - #set($result = $defaultValue) 14644 - #end 14645 - #set ($propertyValue = $NULL) 14646 - #setVariable (~"$propertyValue~" $result) 14647 -#end 14648 - 14649 -#** 14650 - * If an error occurs when executing an action, set a specific response status and display an error message. 14651 - * 14652 - * @param status The response status. 14653 - * @param text The user readable error to be displayed. Can be a translation key. 14654 - * @param parameters The parameters to use when decoding the translation key. 14655 - *### 14656 -#macro(blog__actionResponseError $status $text $parameters) 14657 - $response.setStatus($status) 14658 - #if($request.ajax) 14659 - $services.localization.render($text, $!parameters) 14660 - #else 14661 - \{\{error}}$services.localization.render($text, $!parameters)\{\{/error}} 14662 - #end 14663 -#end 14664 -## 14665 -## 14666 -## 14667 -#** 14668 - * Check if a blog is the Default blog (The one in the 'Blog' space). 14669 - * 14670 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 14671 - * @param isDefault The resulting boolean. 14672 - *### 14673 -#macro(isDefaultBlog $blogDoc $isDefault) 14674 - #set ($result = false) 14675 - #if ($blogDoc.space == 'Blog') 14676 - #set ($result = true) 14677 - #end 14678 - #setVariable(~"$isDefault~" $result) 14679 -#end 14680 -## 14681 -## 14682 -## 14683 -#** 14684 - * Retrieve the blog posts location (space). 14685 - * 14686 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 14687 - * @param postsLocation The resulting location. 14688 - *### 14689 -#macro(getBlogPostsLocation $blogSpace $postsLocation) 14690 - #getBlogDocument($blogSpace $blogDoc) 14691 - #getBlogProperty($blogDoc 'postsLocation' $blogDoc.space $result) 14692 - #set ($postsLocation = $NULL) 14693 - #setVariable (~"$postsLocation~" $result) 14694 -#end 14695 -## 14696 -## 14697 -## 14698 -#** 14699 - * Retrieve the blog categories location (space). 14700 - * 14701 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 14702 - * @param categoriesLocation The resulting location. 14703 - *### 14704 -#macro(getBlogCategoriesLocation $blogSpace $categoriesLocation) 14705 - #getBlogDocument($blogSpace $blogDoc) 14706 - #getBlogProperty($blogDoc 'categoriesLocation' 'Blog' $result) 14707 - #set ($postsLocation = $NULL) 14708 - #setVariable (~"$categoriesLocation~" $result) 14709 -#end 14710 -###** 14711 - * Return the Query for selecting the blog posts based on the context where the posts are displayed. 14712 - * for example there is 4 different panel contexts: 14713 - * aBlog.aPost or aBlog.WebHome 14714 - * aCategorySpace.aCategory 14715 - * aCategorySpace.WebHome 14716 - * Blog.aPost or Blog.WebHome 14717 - * 14718 - * @param query The query for selecting blog entries. 14719 - * @param queryParams The parameters to bind with the generated query. 14720 - * @param targetDoc The document in which the articles will be displayed. 14721 - *### 14722 -#macro(getAllBlogPostsQueryBasedOnDisplayContext $targetDoc $query $queryParams) 14723 - #set ($query = $NULL) 14724 - #set ($queryParams = $NULL) 14725 - #getCategoryAllBlogPostsQuery($resultQuery) 14726 - #set ($resultQueryParams = \{}) 14727 - #set($sanitizedSpace = $targetDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 14728 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 14729 - ## Get all posts that are in the default blog space('Blog') or in category 'Blog.%' 14730 - #set ($discard = $resultQueryParams.put('space', $targetDoc.space)) 14731 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 14732 - #set($resultQuery = ~"$\{resultQuery} and (doc.space = :space or catList like :catList escape '!')~") 14733 - #elseif($targetDoc.getObject($blogCategoryClassname)) 14734 - ## Get all posts that are in a category aCategorySpace.aCategory 14735 - #set ($discard = $resultQueryParams.put('catList', $targetDoc.fullName)) 14736 - #set($resultQuery = ~"$\{resultQuery} and (catList=:catList)~") 14737 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 14738 - ## Get all posts that are in a category aCategorySpace.% 14739 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 14740 - ## Exclude incategorized posts 14741 - #set ($excludedCategory = ~"$\{targetDoc.space}.WebHome~") 14742 - #if ($targetDoc.space == $defaultBlogSpace) 14743 - #set ($excludedCategory = ~"Blog.Categories.WebHome~") 14744 - #end 14745 - #set ($discard = $resultQueryParams.put('excludedCategory', $excludedCategory)) 14746 - #set($resultQuery = ~"$\{resultQuery} and (catList<>:excludedCategory) and (catList like :catList escape '!')~") 14747 - #else 14748 - ## Get all posts in blog space aBlog 14749 - #getAllBlogPostsQuery($resultQuery) 14750 - #getBlogPostsLocation($targetDoc.space $postsLocation) 14751 - #set ($discard = $resultQueryParams.put('space', $postsLocation)) 14752 - #set($resultQuery = ~"$\{resultQuery} and doc.space = :space~") 14753 - #end 14754 - #setVariable(~"$query~" $resultQuery) 14755 - #setVariable(~"$queryParams~" $resultQueryParams) 14756 -#end 14757 -## 14758 -## 14759 -## 14760 -###** 14761 - * Display blog posts based on the context where the posts are displayed. 14762 - * for example there is 4 different panel contexts: 14763 - * aBlog.aPost or aBlog.WebHome 14764 - * aCategorySpace.aCategory 14765 - * aCategorySpace.WebHome 14766 - * Blog.aPost or Blog.WebHome 14767 - * 14768 - * @param targetDoc The document in which the articles will be displayed. 14769 - * @param postsVisiblity The visibility of the posts to display: recent, unpublished, ... 14770 - * @param layout Layout of the the posts to display 14771 - * @param layoutParams additional layout parameters, it is a string like 'param1=val1|...|paramN=valueN' 14772 - * @param limit the number of posts to display 14773 - *### 14774 -#macro(displayBlogPostsBasedOnContext $targetDoc $postsVisiblity $layout $layoutParams $limit) 14775 - #if ($postLayout == 'full') 14776 - #set ($macro.paginated = 'yes') 14777 - #end 14778 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 14779 - ## Display all posts that are in the default blog space('Blog') or in category 'Blog.%' 14780 - #getBlogPostsLayout($xwiki.getDocument(~"$\{defaultBlogSpace}.WebHome~") $postsLayout) 14781 - #if (~"$!layout~" == '') 14782 - #set ($layout = $postsLayout) 14783 - #end 14784 - #if ($postsVisiblity == 'recent') 14785 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 14786 - #elseif($postsVisiblity == 'unpublished') 14787 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 14788 - #end 14789 - #elseif($targetDoc.getObject($blogCategoryClassname)) 14790 - ## Display all posts that are in a category aCategorySpace.aCategory 14791 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 14792 - #getBlogPostsLayout($blogDoc $postsLayout) 14793 - #if (~"$!layout~" == '') 14794 - #set ($layout = $postsLayout) 14795 - #end 14796 - #if ($postsVisiblity == 'recent') 14797 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 14798 - #elseif($postsVisiblity == 'unpublished') 14799 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 14800 - #end 14801 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 14802 - ## Display all posts that are in a category aCategorySpace.% 14803 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 14804 - #getBlogPostsLayout($blogDoc $postsLayout) 14805 - #if (~"$!layout~" == '') 14806 - #set ($layout = $postsLayout) 14807 - #end 14808 - #if ($postsVisiblity == 'recent') 14809 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 14810 - #elseif($postsVisiblity == 'unpublished') 14811 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 14812 - #end 14813 - #else 14814 - ## Display all posts in blog space aBlog 14815 - #getBlogDocument($targetDoc.space $blogDoc) 14816 - #getBlogPostsLayout($blogDoc $postsLayout) 14817 - #if (~"$!layout~" == '') 14818 - #set ($layout = $postsLayout) 14819 - #end 14820 - #if ($postsVisiblity == 'recent') 14821 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 14822 - #elseif($postsVisiblity == 'unpublished') 14823 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 14824 - #end 14825 - #end 14826 -#end 14827 -## 14828 -## 14829 -## 14830 -#** 14831 - * Bind parameters to a query object. 14832 - * 14833 - * @param queryObj The query object (org.xwiki.query.internal.ScriptQuery object) 14834 - * @param queryParams the query parameters. 14835 - *### 14836 -#macro(bindQueryParameters $queryObj $queryParams) 14837 - #set ($output = $queryObj) 14838 - #foreach( $key in $queryParams.keySet() ) 14839 - #set($output = $queryObj.bindValue($key, $queryParams.get($key))) 14840 - #end 14841 - #setVariable(~"$queryObj~" $output) 14842 -#end 14843 -## 14844 -## 14845 -## 14846 -#** 14847 - * Determines the blogposts layout: Default layout (Calendar), Image thumbnail 14848 - * 14849 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>postsLayout</tt> 14850 - * property set. 14851 - * @param postsLayout The resulting string. If the blog object does not define anything, it is considered full (default). 14852 - *### 14853 -#macro(getBlogPostsLayout $blogDoc $postsLayout) 14854 - #getBlogProperty($blogDoc 'postsLayout' 'full' $res) 14855 - #set ($postsLayout = $NULL) 14856 - #setVariable (~"$postsLayout~" $res) 14857 -#end 14858 -## 14859 -## 14860 -## 14861 -#** 14862 - * Retrieve the blog document of a categories space, which is the blog descriptor that have its categoriesLocation property set to the categories space 14863 - * 14864 - * @param categoriesSpace A <tt>String</tt>, the name of the space. 14865 - * @param blogDoc The resulting XDocument. 14866 - *### 14867 -#macro(getBlogDocumentForCategoriesSpace $categoriesSpace $blogDoc) 14868 - #set($macro.blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as categoriesLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=categoriesLocationProp.id.id and categoriesLocationProp.id.name='categoriesLocation' and categoriesLocationProp.value=:categoriesLocation order by doc.creationDate~").setLimit(1).setOffset(0).bindValue('categoriesLocation', $categoriesSpace).execute()) 14869 - #if($macro.blogDocs.size() > 0 && $categoriesSpace != $defaultBlogSpace) 14870 - #set($macro.result = $xwiki.getDocument($macro.blogDocs.get(0))) 14871 - #else 14872 - ## Fallback to Blog.WebHome, the default blog 14873 - #set($macro.result = $xwiki.getDocument('Blog.WebHome')) 14874 - #end 14875 - #set ($blogDoc = $NULL) 14876 - #setVariable (~"$blogDoc~" $macro.result) 14877 -#end" %) 14878 -((( 14879 -(% class="macro-placeholder hidden" %) 14880 -((( 14881 -macro:velocity 14882 -))) 14883 -))) 14884 -))) 14885 - 14886 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogPostLayoutMacros~"" %) 14887 -((( 14888 -(% class="macro-placeholder hidden" %) 14889 -((( 14890 -macro:include 14891 -))) 14892 - 14893 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|#** 14894 - * Extract the layout parameters from a string. 14895 - * 14896 - * @param layoutParamsString The string representation of the layout parameters. 14897 - * It should contain a String following this format ~"paramName1=Value1|paramName2=Value2|...|paramNameK=ValueK~" 14898 - * @param layoutsParameters The resulting layout parameters Map. 14899 - *### 14900 -#macro(extractLayoutParametersFromString $layoutParamsString $layoutsParameters) 14901 - #set ($layoutsParameters = $NULL) 14902 - #set ($macro.layoutParams = \{}) 14903 - #if (~"$!layoutParamsString~" != '') 14904 - #set ($macro.paramsArr = $layoutParamsString.split('\\|')) 14905 - #foreach ($item in $macro.paramsArr) 14906 - #set ($itemSplit = $item.split('=')) 14907 - #if ($itemSplit.size() == 2) 14908 - #set ($discard = $macro.layoutParams.put($itemSplit[0].trim(), $itemSplit[1].trim())) 14909 - #end 14910 - #end 14911 - #end 14912 - #setVariable(~"$layoutsParameters~" $macro.layoutParams) 14913 -#end" %) 14914 -((( 14915 -(% class="macro-placeholder hidden" %) 14916 -((( 14917 -macro:velocity 14918 -))) 14919 -))) 14920 -))) 14921 - 14922 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-| #macro(displaySmallPost $pDoc $pObj) 14923 - #initLayoutVars($pDoc $pObj) 14924 - <div class=~"col-xs-12 col-sm-6 next_blog~"> 14925 - <a href=~"$pDoc.uRL~" class=~"thumbnail~"> 14926 - <div class=~"row~"> 14927 - <div class=~"col-xs-4~"> 14928 - #if ($imageAtt) 14929 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 14930 - #end 14931 - </div> 14932 - <div class=~"col-xs-8 art_det~"> 14933 - <p class=~"text-left~"> 14934 - #if($displayTitle)$!postTitle #end 14935 - <br/><span class=~"date_info~"> $!dateStr </span> 14936 - </p> 14937 - #displayPostDetails($pDoc) 14938 - </div> 14939 - </div> 14940 - </a> 14941 - </div> 14942 - #end 14943 - ## 14944 - ## 14945 - ## 14946 - #macro(displayPinnedPost $pDoc $pObj) 14947 - #initLayoutVars($pDoc $pObj) 14948 - <div class=~"col-xs-12 col-sm-4 col-md-4 blog_pin~"> 14949 - <a href=~"$pDoc.uRL~" class=~"all-post-link~"> 14950 - <div class=~"thumbnail~"> 14951 - #if ($displayTitle && $displayTitleFirstOnPinnedPosts) 14952 - <h5 class=~"title-top~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 14953 - #end 14954 - #if ($imageAtt) 14955 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 14956 - #end 14957 - <div class=~"caption~"> 14958 - #if ($displayTitle && !$displayTitleFirstOnPinnedPosts) 14959 - <h5 class=~"text-left~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 14960 - #end 14961 - #if ($displaySummaryOnPinnedPosts) 14962 - <div class=~"text-left post-summary~"> 14963 - #set ($postContent = $pObj.getProperty('extract').value) 14964 - $!pDoc.getRenderedContent($postContent, $pDoc.syntax.toIdString()) 14965 - </div> 14966 - #end 14967 - #displayPostDetails($pDoc) 14968 - </div> 14969 - </div> 14970 - </a> 14971 - </div> 14972 - #end 14973 - ## 14974 - ## 14975 - ## 14976 - #macro(formatPostDate $pDoc $pObj) 14977 - #set ($formattedDate = $NULL) 14978 - #set($dateStr = $datetool.format('medium', $postDate, $xcontext.locale)) 14979 - #if (~"$!dateStr~" != '') 14980 - #set ($dateArr = $dateStr.split(' ')) 14981 - #if ($dateArr.size() > 3) 14982 - #set ($dateStr = ~"~") 14983 - #foreach($s in $dateArr.subList(0, 3)) 14984 - #set ($dateStr = ~"$\{dateStr}$\{s} ~") 14985 - #end 14986 - #end 14987 - #end 14988 - #setVariable(~"$formattedDate~" $dateStr) 14989 - #end 14990 - ## 14991 - ## 14992 - ## 14993 - #macro(displayPostDetails $pDoc) 14994 - <div class=~"row post-details~"> 14995 - <div class=~"col-xs-8 detail~"> 14996 - #if ($services.like.displayButton($pDoc.documentReference)) 14997 - #set ($optLikeRecord = $services.like.getLikes($pDoc.documentReference)) 14998 - ## Retrieve the likes number in XWiki 12.9+ 14999 - #set ($likeNumber = $optLikeRecord.get()) 15000 - #if (!$stringtool.isNumeric($likeNumber.toString())) 15001 - ## Retrieve the likes number in XWiki versions greater than 12.7 and lower than 12.9. 15002 - #set ($likeNumber = $optLikeRecord.get().likeNumber) 15003 - #end 15004 - #if ($stringtool.isNumeric($likeNumber.toString())) 15005 - <div class=~"post-likes btn btn-default disabled badge~" 15006 - title=~"$escapetool.xml($services.localization.render('like.button.title', [$likeNumber]))~"> 15007 - $services.icon.renderHTML('heart') <span class=~"like-number~">$likeNumber</span> 15008 - </div> 15009 - #end 15010 - #elseif ($services.ratings) 15011 - #set ($ratingsConfigDoc = $services.ratings.getConfigurationDocument($pDoc.documentReference)) 15012 - #if ($ratingsConfigDoc.getValue('displayRatings') == 1) 15013 - <ul class=~"pull-left note list-inline~"> 15014 - #foreach ($x in [1..5]) 15015 - #set ($cls = ~"~") 15016 - #if ($x > $averageVote) 15017 - #set ($cls = ~"-o~") 15018 - #end 15019 - <li><span class=~"fa fa-star$\{cls}~"></span></li> 15020 - #end 15021 - </ul> 15022 - #end 15023 - #end 15024 - </div> 15025 - #if ($showPostComments) 15026 - <div class=~"col-xs-4 com_det~"> 15027 - <p class=~"text-right~">$services.icon.renderHTML('comments') ($!nbComments)</p> 15028 - </div> 15029 - #end 15030 - </div> 15031 - #end 15032 - ## 15033 - ## 15034 - ## 15035 - #macro(initLayoutVars $pDoc $pObj) 15036 - #set ($postTitle = $pDoc.display('title', 'view', $pObj)) 15037 - #set ($imageAtt = $pDoc.getAttachment($pObj.getValue('image'))) 15038 - #isPublished($pObj $isPublished) 15039 - #isHidden($pObj $isHidden) 15040 - #getEntryDate($pDoc $pObj $postDate) 15041 - #formatPostDate($postDate $dateStr) 15042 - #set ($averageVote = $mathtool.round($services.ratings.getAverageRating($pDoc.documentReference).getAverageVote())) 15043 - #set ($nbComments = $pDoc.getComments().size()) 15044 - #set ($showPostComments = true) 15045 - #if ($xwiki.getSpacePreferenceFor('showcomments', $pDoc.documentReference.lastSpaceReference, '1') == '0') 15046 - #set ($showPostComments = false) 15047 - #end 15048 - #end 15049 - ## 15050 - ## 15051 - ## 15052 - #macro(displayEditPinnedPostsButton) 15053 - #if (~"$!macroAdditionalParams.get('postIndex')~" == '0' && $services.security.authorization.hasAccess('edit', $pinnedPostsSourceDoc.fullName)) 15054 - #set ($discard = $xwiki.ssx.use('Blog.PinnedPostsSheet')) 15055 - #set ($discard = $xwiki.jsx.use('Blog.PinnedPostsSheet')) 15056 - #set ($editPinnedPostsURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'get', 'sheet=Blog.PinnedPostsSheet')) 15057 - #set ($newPinnedPostsObjectURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'objectadd', ~"classname=Blog.PinnedPostsClass&form_token=$!\{services.csrf.getToken()}~")) 15058 - <div class=~"edit-pinned-posts-container~"> 15059 - <div class=~"col-xs-12 col-sm-12 col-md-12 text-right edit-pinned-posts~"> 15060 - <a href=~"javascript:;~" class=~"editPinnedPosts~"> 15061 - <span class=~"glyphicon glyphicon-edit~" aria-hidden=~"true~"></span> $services.localization.render('blog.post.layout.cards.pinnedposts.edit') 15062 - </a> 15063 - <input type=~"hidden~" id=~"editPinnedPostsURL~" value=~"$escapetool.xml($editPinnedPostsURL)~"/> 15064 - <input type=~"hidden~" id=~"newPinnedPostsObjectURL~" value=~"$escapetool.xml($newPinnedPostsObjectURL)~"/> 15065 - </div> 15066 - </div> 15067 - #if (~"$!pinnedPostsObj~" == '') 15068 - <input type=~"hidden~" name=~"createPinnedPostsObject~" value=~"1~"/> 15069 - #end 15070 - #end 15071 - #end" %) 15072 -((( 15073 -(% class="macro-placeholder hidden" %) 15074 -((( 15075 -macro:velocity 15076 -))) 15077 -))) 15078 - 15079 -(% data-macro="startmacro:velocity|-||-| #if ($services.security.authorization.hasAccess('view', $xcontext.macro.params.reference)) 15080 - #set ($postDoc = $xwiki.getDocument($xcontext.macro.params.reference)) 15081 - #getEntryObject($postDoc $postObj) 15082 - #if (~"$!postObj~" != '') 15083 - #extractLayoutParametersFromString($xcontext.macro.params.params $macroAdditionalParams) 15084 - ## 15085 - #set ($displayTitle = true) 15086 - #if (~"$!macroAdditionalParams.get('displayTitle')~" == 'false') 15087 - #set ($displayTitle = false) 15088 - #end 15089 - ## 15090 - #set ($displayTitleFirstOnPinnedPosts = false) 15091 - #if (~"$!macroAdditionalParams.get('displayTitleFirstOnPinnedPosts')~" == 'true') 15092 - #set ($displayTitleFirstOnPinnedPosts = true) 15093 - #end 15094 - ## 15095 - #set ($displaySummaryOnPinnedPosts = true) 15096 - #if (~"$!macroAdditionalParams.get('displaySummaryOnPinnedPosts')~" == 'false') 15097 - #set ($displaySummaryOnPinnedPosts = false) 15098 - #end 15099 - ## 15100 - #set ($postIndex = $numbertool.toNumber($macroAdditionalParams.get('postIndex')).intValue()) 15101 - #if ($postIndex == 0) 15102 - #set ($stopBlogPostsDisplay = false) 15103 - #end 15104 - #set ($listResultsCount = $numbertool.toNumber($macroAdditionalParams.get('list-results-count')).intValue()) 15105 - #set($discard = $xwiki.ssx.use('Blog.BlogPostLayoutCards')) 15106 - #set($scaleWidth = 600) 15107 - #set($imgQs=~"width=$scaleWidth~") 15108 - ## Display pinned posts 15109 - ## Get the list of pinned posts 15110 - #set ($pinnedPosts = []) 15111 - #set ($pinnedPostsSourceDoc = $NULL) 15112 - #if (~"$!macroAdditionalParams.get('forceDisplayPinnedPosts')~" == 'true' && ~"$!macroAdditionalParams.get('list-blog')~" != '') 15113 - #set ($pinnedPostsSourceDoc = $xwiki.getDocument($macroAdditionalParams.get('list-blog'))) 15114 - ## Note that the 'list-blog' parameter contains the value of the 'blog' parameter of the blogpostlist macro passed to the current layout macro 15115 - #end 15116 - #if (~"$!pinnedPostsSourceDoc~" != '') 15117 - #set ($pinnedPostsObj = $pinnedPostsSourceDoc.getObject('Blog.PinnedPostsClass')) 15118 - #if (~"$!pinnedPostsObj~" != '') 15119 - #set ($orderedPinnedPostsJSON = $pinnedPostsObj.getProperty('orderedPosts').value) 15120 - #if (~"$!orderedPinnedPostsJSON~" != '') 15121 - #set ($pinnedPosts = $jsontool.parse($orderedPinnedPostsJSON)) 15122 - #else 15123 - #set ($pinnedPosts = $pinnedPostsObj.getProperty('posts').value) 15124 - #end 15125 - #end 15126 - #if ($postIndex == 0 && $pinnedPosts.size() > 0) 15127 - \{\{html clean=~"false~"}} 15128 - #set ($x = 0) 15129 - #set ($showPinnedPostsButton = true) 15130 - #foreach ($pinnedPost in $pinnedPosts) 15131 - #if ($x == 0) 15132 - <div class=~"row flex-container~"> 15133 - #if ($showPinnedPostsButton) 15134 - #displayEditPinnedPostsButton() 15135 - #set($showPinnedPostsButton = false) 15136 - #end 15137 - #end 15138 - #set ($pinnedPostDoc = $xwiki.getDocument($pinnedPost)) 15139 - #getEntryObject($pinnedPostDoc $pinnedPostObj) 15140 - #if (~"$!pinnedPostObj~" != '') 15141 - #displayPinnedPost($pinnedPostDoc $pinnedPostObj) 15142 - #end 15143 - #set ($x = $mathtool.add($x, 1)) 15144 - #if ($x == 3) 15145 - #set ($x = 0) 15146 - </div> 15147 - #end 15148 - #end 15149 - #if ($mathtool.mod($x, 3) != 0) 15150 - </div> 15151 - #end 15152 - \{\{/html}} 15153 - 15154 - ## If the first post is a pinned post : this means that all the posts are pinned 15155 - ## In this case, avoid displaying the posts again after the pinned posts section. 15156 - #if ($pinnedPosts.contains($xcontext.macro.params.reference)) 15157 - #set ($stopBlogPostsDisplay = true) 15158 - #end 15159 - #elseif($postIndex == 0 && $pinnedPosts.size() == 0) 15160 - 15161 - \{\{html}} 15162 - <div class=~"row no-pinnded-posts~"> 15163 - #displayEditPinnedPostsButton() 15164 - </div> 15165 - \{\{/html}} 15166 - 15167 - #end 15168 - #end 15169 - #if (!$stopBlogPostsDisplay) 15170 - \{\{html clean=~"false~"}} 15171 - #if (~"$!nbDisplayedPosts~" == '' || $postIndex == 0) 15172 - #set ($nbDisplayedPosts = 0) 15173 - #end 15174 - #if($mathtool.mod($nbDisplayedPosts, 2) == 0) 15175 - #if ($nbDisplayedPosts != 0) 15176 - </div> 15177 - #set ($lastHtmlTag = 'c') 15178 - #end 15179 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 15180 - <div class=~"row~"> 15181 - #set ($lastHtmlTag = 'o') 15182 - #set ($lastRowClass = ~"~") 15183 - #else 15184 - <div class=~"row flex-container~"> 15185 - #set ($lastHtmlTag = 'o') 15186 - #set ($lastRowClass = ~"flex~") 15187 - #end 15188 - #end 15189 - #displaySmallPost($postDoc $postObj) 15190 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 15191 - </div> 15192 - #set ($lastHtmlTag = 'c') 15193 - #end 15194 - #set ($nbDisplayedPosts = $mathtool.add($nbDisplayedPosts, 1)) 15195 - #if ($postIndex == $mathtool.sub($listResultsCount, 1)) 15196 - #if (~"$!lastHtmlTag~" == 'o') 15197 - #if ($mathtool.mod($nbDisplayedPosts, 2) == 1 && $lastRowClass == ~"flex~") 15198 - <div class=~"col-xs-12 col-sm-6~"></div> 15199 - #end 15200 - </div> 15201 - #end 15202 - #end 15203 - \{\{/html}} 15204 - #end 15205 - #else 15206 - \{\{error}}$services.localization.render('blog.blogpostlayout.notpost', [$xcontext.macro.params.reference])\{\{/error}} 15207 - #end 15208 - #else 15209 - \{\{error}}$services.localization.render('blog.blogpostlayout.post_view_not_allowed', [$xcontext.macro.params.reference])\{\{/error}} 15210 - #end" class="macro hidden macro-placeholder" %)macro:velocity(% data-macro="startmacro:html|-|clean=~"false~"|-|</div> 15211 -<div class=~"row flex-container~"> 15212 -<div class=~"col-xs-12 col-sm-6 next_blog~"> 15213 -<a href=~"/Nieuws/Nieuw%20beveiligingspaneel%20Axon%20van%20Aritech~" class=~"thumbnail~"> 15214 -<div class=~"row~"> 15215 -<div class=~"col-xs-4~"> 15216 -<img src=~"/download/Nieuws/Nieuw%20beveiligingspaneel%20Axon%20van%20Aritech/axon.png?width=600&rev=1.1~" /> 15217 -</div> 15218 -<div class=~"col-xs-8 art_det~"> 15219 -<p class=~"text-left~"> 15220 -Nieuw beveiligingspaneel Axon van Aritech <br/><span class=~"date_info~"> Nov 22, 2023, </span> 15221 -</p> 15222 -<div class=~"row post-details~"> 15223 -<div class=~"col-xs-8 detail~"> 15224 -<div class=~"post-likes btn btn-default disabled badge~" 15225 -title=~"Number of likes on this page: 1~"> 15226 -<span class=~"fa fa-heart~"></span> <span class=~"like-number~">1</span> 15227 -</div> 15228 -</div> 15229 -<div class=~"col-xs-4 com_det~"> 15230 -<p class=~"text-right~"><span class=~"fa fa-comments~"></span> (1)</p> 15231 -</div> 15232 -</div> 15233 -</div> 15234 -</div> 15235 -</a> 15236 -</div>" class="macro macro hidden macro-placeholder" %)macro:html 15237 -))) 15238 -))) 15239 - 15240 -(% class="row flex-container" %) 15241 -((( 15242 -(% class="col-xs-12 col-sm-6 next_blog" %) 15243 -((( 15244 -(% class="row" %) 15245 -((( 15246 -(% class="col-xs-4" %) 15247 -((( 15248 -[[~[~[image:/download/Nieuws/Nieuw%20beveiligingspaneel%20Axon%20van%20Aritech/axon.png?width=600&rev=1.1~]~]>>path:/Nieuws/Nieuw%20beveiligingspaneel%20Axon%20van%20Aritech||class="thumbnail"]] 15249 -))) 15250 - 15251 -(% class="col-xs-8 art_det" %) 15252 -((( 15253 -(% class="text-left" %) 15254 -[[Nieuw beveiligingspaneel Axon van Aritech 15255 -(% class="date_info" %) Nov 22, 2023,>>path:/Nieuws/Nieuw%20beveiligingspaneel%20Axon%20van%20Aritech||class="thumbnail"]] 15256 - 15257 -(% class="row post-details" %) 15258 -((( 15259 -(% class="col-xs-8 detail" %) 15260 -((( 15261 -(% class="post-likes btn btn-default disabled badge" title="Number of likes on this page: 1" %) 15262 -((( 15263 -[[(% class="like-number" %)1>>path:/Nieuws/Nieuw%20beveiligingspaneel%20Axon%20van%20Aritech||class="thumbnail"]] 15264 -))) 15265 -))) 15266 - 15267 -(% class="col-xs-4 com_det" %) 15268 -((( 15269 -(% class="text-right" %) 15270 -[[(1)>>path:/Nieuws/Nieuw%20beveiligingspaneel%20Axon%20van%20Aritech||class="thumbnail"]] 15271 -))) 15272 -))) 15273 -))) 15274 -))) 15275 -))) 15276 - 15277 -(% class="macro" data-macro="startmacro:blogPostLayoutCards|-|reference=~"Nieuws.Aankondiging update Syntess 6\\\\.9\\\\.0\\\\.0166~" params=~"displayTitle=true|useSummary=true|list-limit=10|list-layout=cards|list-blog=Nieuws.WebHome|list-paginated=no|list-results-count=10|postIndex=0|previousPostReference=|postIndex=1|previousPostReference=Nieuws.Nieuwsbrief januari 2024|postIndex=2|previousPostReference=Nieuws.Audit BMI en BORG|postIndex=3|previousPostReference=Nieuws.Nieuwsbrief december 2023|postIndex=4|previousPostReference=Nieuws.Nieuwsbrief november 2023|postIndex=5|previousPostReference=Nieuws.Feestelijke afsluiting, keuring materieel en tellen voorraden|postIndex=6|previousPostReference=Nieuws.RI&E 2023|postIndex=7|previousPostReference=Nieuws.Aankondiging update Syntess 6\\\\.9\\\\.0181|postIndex=8|previousPostReference=Nieuws.Nieuwsbrief oktober 2023|postIndex=9|previousPostReference=Nieuws.Nieuw beveiligingspaneel Axon van Aritech~"" %) 15278 -((( 15279 -(% class="macro-placeholder hidden" %) 15280 -((( 15281 -macro:blogPostLayoutCards 15282 -))) 15283 - 15284 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogCode~"" %) 15285 -((( 15286 -(% class="macro-placeholder hidden" %) 15287 -((( 15288 -macro:include 15289 -))) 15290 - 15291 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogParameters~"" %) 15292 -((( 15293 -(% class="macro-placeholder hidden" %) 15294 -((( 15295 -macro:include 15296 -))) 15297 - 15298 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## Blog 15299 -#set($blogClassname = 'Blog.BlogClass') 15300 -#set($blogTemplate = 'Blog.BlogTemplate') 15301 -#set($blogSheet = 'Blog.BlogSheet') 15302 -## Blog entries 15303 -#set($blogPostClassname = 'Blog.BlogPostClass') 15304 -#set($blogPostTemplate = 'Blog.BlogPostTemplate') 15305 -#set($blogPostSheet = 'Blog.BlogPostSheet') 15306 -#set($blogPostObjectNumber = $xwiki.getDocument($blogPostTemplate).getObject($blogPostClassname).number) 15307 -#set($oldArticleClassname = 'XWiki.ArticleClass') 15308 -## Categories 15309 -#set($blogCategoryClassname = 'Blog.CategoryClass') 15310 -#set($blogCategoryTemplate = 'Blog.CategoryTemplate') 15311 -#set($blogCategorySheet = 'Blog.CategorySheet') 15312 -#set($blogCategoriesSheet = 'Blog.CategoriesSheet') 15313 -#set($oldBlogCategoryClassname = 'Blog.Categories') 15314 -#set($defaultCategoryParent = 'Blog.Categories') 15315 -## Style 15316 -#set($blogStyleDocumentName = 'Blog.BlogStyle') 15317 -#set($blogStyleDocument = $xwiki.getDocument($blogStyleDocumentName)) 15318 -## Clientside scripts 15319 -#set($blogScriptsDocumentName = 'Blog.BlogScripts') 15320 -#set($blogPublisher = $xwiki.getDocument('Blog.Publisher')) 15321 -## Misc 15322 -#set($thisURL = $doc.getURL($xcontext.action, $request.queryString)) 15323 -#set($isBlogPost = $doc.getObject($blogPostClassname)) 15324 -#set($defaultBlogSpace = 'Blog') 15325 -#set($isCategoryPage = $doc.getObject($blogCategoryClassname)) 15326 -#set($isCategoriesHomePage = $doc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 15327 -## 15328 -## 15329 -## 15330 -#** 15331 - * Displays an image, taken from the blog style document. 15332 - * 15333 - * @param $imgName The name of the icon from icons set to use. 15334 - *# 15335 -#macro(toolImage $imgName)(% class=~"icon-manage~"~%)$services.icon.render($imgName)(%~%)#end" %) 15336 -((( 15337 -(% class="macro-placeholder hidden" %) 15338 -((( 15339 -macro:velocity 15340 -))) 15341 -))) 15342 -))) 15343 - 15344 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|## 15345 -## 15346 -## 15347 -## Import the blog skin and javascripts. 15348 -$!xwiki.ssx.use($blogStyleDocumentName)## 15349 -$!xwiki.jsx.use($blogScriptsDocumentName)## 15350 -## 15351 -## import the hierarchy for the path the blog post footer (in displayEntryBlogLocation) 15352 -#template('hierarchy_macros.vm')## 15353 -## 15354 -## 15355 -#** 15356 - * Prints a blog. This is the main macro used in the BlogSheet. 15357 - * 15358 - * @param blogDoc the XDocument holding the blog definition object. 15359 - *### 15360 -#macro(printBlog $blogDoc) 15361 - \{\{include reference='Blog.CreatePost'/}} 15362 - 15363 - ## Use the blogPostList macro to display the blogposts 15364 - ## The blogPostList is used only in case of 'all' or 'paged' blog display type because the blogPostList macro 15365 - ## do not support FTM the monthly and weekly blog display types 15366 - #getBlogDisplayType($blogDoc $displayType) 15367 - #if ($displayType == 'weekly' || $displayType == 'monthly') 15368 - #getBlogEntries($blogDoc $entries) 15369 - #displayBlog($entries 'index' true true) 15370 - #displayNavigationLinks($blogDoc) 15371 - #else 15372 - #getBlogDisplayType($blogDoc $displayType) 15373 - #set ($paginated = 'no') 15374 - #if ($displayType == 'paginated') 15375 - #set ($paginated = 'yes') 15376 - #end 15377 - #getBlogPostsLayout($blogDoc $postsLayout) 15378 - (% class=~"hfeed index~" ~%)(((\{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$paginated~" layout=~"$!postsLayout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" /}}))) 15379 - #end 15380 -#end 15381 -## 15382 -## 15383 -## 15384 -#** 15385 - * Shows blog information. In view mode, the description is printed. In edit mode, allows changing blog settings: title, 15386 - * description, blog type (global or in-space), index display type (fixed size pagination, weekly index, monthly index, 15387 - * all entries). 15388 - * 15389 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 15390 - *### 15391 -#macro(showBlogInfo $blogDoc) 15392 - #if($blogDoc.getObject($blogClassname)) 15393 - ## Keep testing for inline action for backward compatibility with older blogs. 15394 - #if($xcontext.action == 'edit' || $xcontext.action == 'inline') 15395 - #macro(displayProperty $blogDoc $propname) 15396 - ; #displayPropName($xwiki.getClass($blogClassname).get($propname)): 15397 - : $blogDoc.display($propname) 15398 - #end 15399 - #displayProperty($blogDoc 'title') 15400 - #displayProperty($blogDoc 'description') 15401 - #displayProperty($blogDoc 'displayType') 15402 - #displayProperty($blogDoc 'itemsPerPage') 15403 - #displayProperty($blogDoc 'postsLayout') 15404 - #displayProperty($blogDoc 'postsLayoutParameters') 15405 - #else 15406 - $blogDoc.display('description') 15407 - #end 15408 - #elseif($doc.fullName == $blogSheet) 15409 -= $services.localization.render('blog.code.blogsheet') = 15410 - \{\{translation key='blog.code.sheetexplanation'/}} 15411 - #else 15412 - \{\{warning}}\{\{translation key='blog.code.notblog'/}}\{\{/warning}} 15413 - #end 15414 -#end 15415 -## 15416 -## 15417 -## 15418 -#** 15419 - * Retrieve the blog document, which usually is either <tt><Space>.WebHome</tt> for whole-spaces blogs, or 15420 - * <tt><Space>.Blog</tt> for in-space blogs. If none of these documents contains a blog object, then the first 15421 - * (alphabetically) document in the target space that contains one is returned. Finally, if no document in the current 15422 - * space contains a blog object, then <tt>Blog.WebHome</tt> is returned as the default blog. 15423 - * 15424 - * @param space A <tt>String</tt>, the name of the space where to search. 15425 - * @param blogDoc The resulting XDocument. 15426 - *### 15427 -#macro(getBlogDocument $space $blogDoc) 15428 - #set ($result = $NULL) 15429 - ## Check if the current space has a WebPreferences page that contains a Blog.EnablePanelsConfigurationClass object. 15430 - ## It is possible to display a blog's panels info in a page that is not inside a blog and in that case we need to 15431 - ## identify the right blog based on a configuration object in a WebPreferences page. 15432 - #set ($spaceReference = $services.model.resolveSpace($space)) 15433 - #set ($preferencesDocRef = $services.model.createDocumentReference('WebPreferences', $spaceReference)) 15434 - #set ($preferencesDoc = $xwiki.getDocument($preferencesDocRef)) 15435 - #set ($preferencesObj = $preferencesDoc.getObject('Blog.EnablePanelsConfigurationClass')) 15436 - #if ($preferencesObj) 15437 - #set ($result = $xwiki.getDocument( $preferencesObj.getValue('blog'))) 15438 - #end 15439 - ## If no special case occurs (like the previous one), identify a blog by checking the current location from its hierarchy. 15440 - #if (~"$!result~" == '') 15441 - ## First, try the Space.WebHome, for a whole-space blog 15442 - #set($result = $xwiki.getDocument(~"$\{space}.WebHome~")) 15443 - #if(!$result.getObject($blogClassname)) 15444 - ## Second, try the Space.Blog document 15445 - #set($result = $xwiki.getDocument(~"$\{space}.Blog~")) 15446 - #if(!$result.getObject($blogClassname)) 15447 - ## Third, try searching for a blog document in the current space 15448 - ## Prevent the query fail when the space contains dots '.' 15449 - #set($blogDocs = $services.query.hql(~", BaseObject obj where doc.space = :space and obj.name = doc.fullName and obj.className = '$blogClassname' order by doc.name~").setLimit(1).setOffset(0).bindValue('space', $space).execute()) 15450 - #if($blogDocs.size() > 0) 15451 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 15452 - #else 15453 - ## Fourth, try searching for a blog document that have the its 'postsLocation' set to the current space 15454 - #set($blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as postsLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=postsLocationProp.id.id and postsLocationProp.id.name='postsLocation' and postsLocationProp.value=:postsLocation order by doc.name~").setLimit(1).setOffset(0).bindValue('postsLocation', $space).execute()) 15455 - #if($blogDocs.size() > 0) 15456 - #set($result = $xwiki.getDocument($blogDocs.get(0))) 15457 - #else 15458 - ## Last, fallback to Blog.WebHome, the default blog 15459 - #set($result = $xwiki.getDocument('Blog.WebHome')) 15460 - #end 15461 - #end 15462 - #end 15463 - #end 15464 - #end 15465 - #set ($blogDoc = $NULL) 15466 - #setVariable (~"$blogDoc~" $result) 15467 -#end 15468 -## 15469 -## 15470 -## 15471 -#** 15472 - * Retrieve the blog title. 15473 - * 15474 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass<tt> object with the <tt>title</tt> property set. 15475 - * @param title The resulting title. 15476 - *### 15477 -#macro(getBlogTitle $blogDoc $title) 15478 - ## Titles can contain velocity code (most commonly translations), so we should evaluate them. 15479 - #set ($title = $NULL) 15480 - #setVariable (~"$title~" $!blogDoc.displayTitle) 15481 -#end 15482 -## 15483 -## 15484 -## 15485 -#** 15486 - * Retrieve the blog description. 15487 - * 15488 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>description</tt> 15489 - * property set. 15490 - * @param description The resulting description. 15491 - *### 15492 -#macro(getBlogDescription $blogDoc $description) 15493 - #getBlogProperty($blogDoc 'description' '' $result) 15494 - #set ($description = $NULL) 15495 - #setVariable (~"$description~" $result) 15496 -#end 15497 -## 15498 -## 15499 -## 15500 -#** 15501 - * Retrieves a list of entries to be displayed. The entries are either part of the blog's space, or have the blog 15502 - * document set as a parent. The number and range of entries returned (from all those belonging to this blog) depends on 15503 - * the blog display type: paginated (fixed number of entries), weekly (all entries in a week), monthly (all entries in a 15504 - * month), or all. 15505 - * 15506 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 15507 - * @param entries The resulting list of entries to display, a list of XDocument names. 15508 - *### 15509 -#macro(getBlogEntries $blogDoc $entries) 15510 - #if (!$entries) 15511 - #setVariable (~"$entries~" []) 15512 - #end 15513 - #getAllBlogPostsQuery($query) 15514 - #isDefaultBlog($blogDoc $isDefault) 15515 - #set($queryParams = \{}) 15516 - #if ($isDefault) 15517 - #getCategoryAllBlogPostsQuery($query) 15518 - #set($query = ~"$\{query} and (doc.creator = :creator or (isPublished.value = 1 and hidden.value = 0)) and (doc.space = :space or catList like :catList escape '!')~") 15519 - #set($discard = $queryParams.put('creator', $xcontext.user)) 15520 - #set($discard = $queryParams.put('space', $blogDoc.space)) 15521 - #set($sanitizedBlogSpace = $blogDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 15522 - #set($discard = $queryParams.put('catList', $sanitizedBlogSpace)) 15523 - #else 15524 - #set($query = ~"$\{query} and (doc.space = :space or doc.parent = :parent)~") 15525 - #getBlogPostsLocation($blogDoc.space $blogPostsLocation) 15526 - #set($discard = $queryParams.put('space', $blogPostsLocation)) 15527 - #set($discard = $queryParams.put('parent', $blogDoc.space)) 15528 - #end 15529 - #getBlogDisplayType($blogDoc $displayType) 15530 - #if($displayType == 'weekly') 15531 - #getWeeklyBlogEntries($blogDoc $query $entries $queryParams) 15532 - #elseif($displayType == 'monthly') 15533 - #getMonthlyBlogEntries($blogDoc $query $entries $queryParams) 15534 - #elseif($displayType == 'all') 15535 - #getAllBlogEntries($blogDoc $query $entries $queryParams) 15536 - #else 15537 - #getPagedBlogEntries($blogDoc $query $entries $queryParams) 15538 - #end 15539 -#end 15540 -## 15541 -## 15542 -## 15543 -#** 15544 - * Retrieves a list of entries to be displayed. The entries are taken from a ~"page~" of the blog, a sequence of documents 15545 - * defined by the request parameters <tt>ipp</tt> (items per page) and <tt>page</tt> (the current page). Initially the 15546 - * first page is displayed, with the number of entries defined in the blog object in the <tt>itemsPerPage</tt> property 15547 - * (10 if not defined). 15548 - * 15549 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 15550 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 15551 - * refined to restrict to a given space, or to a given search criteria, etc. 15552 - * @param entries The resulting list of entries to display, a list of XDocument names. 15553 - * @param queryParams The parameters to bind with the query. 15554 - *### 15555 -#macro(getPagedBlogEntries $blogDoc $query $entries $queryParams) 15556 - #if (!$entries) 15557 - #setVariable (~"$entries~" []) 15558 - #end 15559 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 15560 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~")) 15561 - #bindQueryParameters($countQueryObj $queryParams) 15562 - #bindQueryParameters($queryObj $queryParams) 15563 - #set($totalEntries = $countQueryObj.count()) 15564 - #getBlogProperty($blogDoc 'itemsPerPage' '10' $defaultItemsPerPage) 15565 - #set($defaultItemsPerPage = $numbertool.toNumber($defaultItemsPerPage).intValue()) 15566 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 15567 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 15568 - #set($discard = $entries.addAll($queryObj.setLimit($itemsPerPage).setOffset($startAt).addFilter(~"unique~").execute())) 15569 -#end 15570 -## 15571 -## 15572 -## 15573 -#** 15574 - * Retrieves a list of entries to be displayed. The entries are taken from a week of the blog. The target week is 15575 - * defined by the request parameters <tt>week</tt> (the week number in the year, from 1 to 52) and <tt>year</tt> (4 15576 - * digit year). Initially the current week is displayed. 15577 - * 15578 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 15579 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 15580 - * refined to restrict to a given space, or to a given search criteria, etc. 15581 - * @param entries The resulting list of entries to display, a list of XDocument names. 15582 - * @param queryParams The parameters to bind with the query. 15583 - *### 15584 -#macro(getWeeklyBlogEntries $blogDoc $query $entries $queryParams) 15585 - #if (!$entries) 15586 - #setVariable (~"$entries~" []) 15587 - #end 15588 - #getRequestedWeek($weekDate) 15589 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 15590 - #set($minDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundFloor())) 15591 - #set($maxDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundCeiling())) 15592 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 15593 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 15594 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 15595 - #bindQueryParameters($countQueryObj $queryParams) 15596 - #bindQueryParameters($queryObj $queryParams) 15597 - #set($totalEntries = $countQueryObj.count()) 15598 - #set($discard = $entries.addAll($queryObj.execute())) 15599 -#end 15600 -## 15601 -## 15602 -## 15603 -#** 15604 - * Retrieves a list of entries to be displayed. The entries are taken from a month of the blog. The target month is 15605 - * defined by the request parameters <tt>month</tt> (the month number, from 1 to 12) and <tt>year</tt> (4 15606 - * digit year). Initially the current month is displayed. 15607 - * 15608 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 15609 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 15610 - * refined to restrict to a given space, or to a given search criteria, etc. 15611 - * @param entries The resulting list of entries to display, a list of XDocument names. 15612 - * @param queryParams The parameters to bind with the query. 15613 - *### 15614 -#macro(getMonthlyBlogEntries $blogDoc $query $entries) 15615 - #if (!$entries) 15616 - #setVariable (~"$entries~" []) 15617 - #end 15618 - #getRequestedMonth($monthDate) 15619 - #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) 15620 - #set($minDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundFloor())) 15621 - #set($maxDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundCeiling())) 15622 - #set($query = ~"$\{query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'~") 15623 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 15624 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 15625 - #bindQueryParameters($countQueryObj $queryParams) 15626 - #bindQueryParameters($queryObj $queryParams) 15627 - #set($totalEntries = $countQueryObj.count()) 15628 - #set($discard = $entries.addAll($queryObj.execute())) 15629 -#end 15630 -## 15631 -## 15632 -## 15633 -#** 15634 - * Retrieves a list of entries to be displayed. All entries belonging to the current blog are returned. 15635 - * 15636 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 15637 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 15638 - * refined to restrict to a given space, or to a given search criteria, etc. 15639 - * @param entries The resulting list of entries to display, a list of XDocument names. 15640 - * @param queryParams The parameters to bind with the query. 15641 - *### 15642 -#macro(getAllBlogEntries $blogDoc $query $entries $queryParams) 15643 - #if (!$entries) 15644 - #setVariable (~"$entries~" []) 15645 - #end 15646 - #set($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 15647 - #set($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 15648 - #bindQueryParameters($countQueryObj $queryParams) 15649 - #bindQueryParameters($queryObj $queryParams) 15650 - #set($totalEntries = $countQueryObj.count()) 15651 - #set($discard = $entries.addAll($queryObj.execute())) 15652 -#end 15653 -## 15654 -## 15655 -## 15656 -#** 15657 - * Retrieves a list of entries to be displayed. Only (and all) unpublished entries are returned. 15658 - * 15659 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 15660 - * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be 15661 - * refined to restrict to a given space, or to a given search criteria, etc. 15662 - * @param queryParams The parameters to bind with the query. 15663 - * @param entries The resulting list of entries to display, a list of XDocument names. 15664 - *### 15665 -#macro(getUnpublishedBlogEntries $blogDoc $query $queryParams $entries) 15666 - #if (!$entries) 15667 - #setVariable (~"$entries~" []) 15668 - #end 15669 - #set($query = ~"$\{query} and isPublished.value = 0~") 15670 - #set ($countQueryObj = $services.query.hql($query).addFilter(~"unique~")) 15671 - #set ($queryObj = $services.query.hql(~"$\{query} order by publishDate.value desc~").addFilter(~"unique~")) 15672 - #bindQueryParameters($countQueryObj $queryParams) 15673 - #bindQueryParameters($queryObj $queryParams) 15674 - #set($totalEntries = $countQueryObj.count()) 15675 - #set($discard = $entries.addAll($queryObj.execute())) 15676 -#end 15677 -## 15678 -## 15679 -## 15680 -#** 15681 - * Retrieves a list of entries to be displayed. The entries are taken from all the wiki, and not from a specific blog. 15682 - * 15683 - * @param entries The resulting list of entries to display, a list of XDocument names. 15684 - *### 15685 -#macro(getGlobalBlogEntries $entries) 15686 - #if (!$entries) 15687 - #setVariable (~"$entries~" []) 15688 - #end 15689 - #getAllBlogPostsQuery($query) 15690 - #set($totalEntries = $services.query.hql($query).count()) 15691 - #set($defaultItemsPerPage = 20) 15692 - ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. 15693 - #preparePagedViewParams($totalEntries $defaultItemsPerPage) 15694 - #set($discard = $entries.addAll($services.query.hql(~"$\{query} order by publishDate.value desc~").setLimit($itemsPerPage).setOffset($startAt).execute())) 15695 -#end 15696 -#** 15697 - * Return the base query for selecting blog entries. It filters only visible entries, but does not bind to a specific 15698 - * blog, nor specify a range or an ordering criteria. 15699 - * 15700 - * This macro is a duplicate of #getAllBlogPostsQuery($query). Keep it in case it's used outside, in custom code. 15701 - * 15702 - * @param query The basic query for selecting blog entries. 15703 - *# 15704 -#macro(getBlogEntriesBaseQuery $query) 15705 - #getAllBlogPostsQuery($query) 15706 -#end 15707 -#** 15708 - * Return the Query for selecting the all wiki blog posts without filtering 15709 - * 15710 - * @param query The basic query for selecting blog entries. 15711 - *# 15712 -#macro(getAllBlogPostsQuery $query) 15713 - #set ($query = $NULL) 15714 - #setVariable(~"$query~" ~", BaseObject as obj, IntegerProperty isPublished, 15715 - IntegerProperty hidden, DateProperty publishDate 15716 - where doc.fullName <> '$blogPostTemplate' and 15717 - obj.name=doc.fullName and obj.className='$blogPostClassname' and 15718 - isPublished.id.id = obj.id and isPublished.id.name = 'published' and 15719 - hidden.id.id = obj.id and hidden.id.name='hidden' and 15720 - publishDate.id.id = obj.id and publishDate.id.name='publishDate' and 15721 - (doc.creator = '$escapetool.sql($xcontext.user)' or (isPublished.value = 1 and hidden.value = 0))~") 15722 -#end 15723 -## 15724 -## 15725 -## 15726 -###** 15727 - * Return the Query for selecting the all wiki blog posts with categories filtering 15728 - * 15729 - * @param query The basic query for selecting blog entries. 15730 - *### 15731 -#macro(getCategoryAllBlogPostsQuery $query) 15732 - #set ($query = $NULL) 15733 - #getAllBlogPostsQuery($baseQuery) 15734 - #set ($baseQuery = $baseQuery.replace('DateProperty publishDate', 'DateProperty publishDate, DBStringListProperty as category left join category.list catList')) 15735 - #setVariable(~"$query~" ~"$\{baseQuery} and obj.id=category.id.id and category.id.name='category'~") 15736 -#end 15737 -## 15738 -## 15739 -## 15740 -#** 15741 - * Determines how is the blog index split into pages: paginated (fixed number of entries), weekly (all entries in a 15742 - * week), monthly (all entries in a month), or all. 15743 - * 15744 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>displayType</tt> 15745 - * property set. 15746 - * @param displayType The resulting string. If the blog object does not define anything, it is considered paginated. 15747 - *### 15748 -#macro(getBlogDisplayType $blogDoc $displayType) 15749 - #getBlogProperty($blogDoc 'displayType' 'paginated' $result) 15750 - #set ($displayType = $NULL) 15751 - #setVariable (~"$displayType~" $result) 15752 -#end 15753 -## 15754 -## 15755 -## 15756 -#** 15757 - * Displays a list of entries. 15758 - * 15759 - * @param entries The entries to display, a list of XDocument names. 15760 - * @param displaying What exactly is displayed: blog index, a single blog entry, a blog category, search results, 15761 - * unpublished entries, etc. This will be used as the classname(s) for the container div (hfeed). Currently 15762 - * used values: index, single, category, search, unpublished, hidden. 15763 - * @param onlyExtract If <tt>true</tt>, only display the extract of articles where available, otherwise display the full content. 15764 - * @param shouldDisplayTitles If <tt>true</tt>, display the blog title (blog posts shouldn't display the title when they're 15765 - * displayed alone on their page since it's the page title which is used in this case) 15766 - *### 15767 -#macro(displayBlog $entries $displaying $onlyExtract $shouldDisplayTitles) 15768 - #set($blogDay = '') 15769 - (% class=~"hfeed $!\{displaying}~" ~%)((( 15770 - (% class=~"blogDay~" ~%)((( 15771 - #foreach ($entryDoc in $xwiki.wrapDocs($entries)) 15772 - #getEntryObject($entryDoc $entryObj) 15773 - ## Although all entries should have one of the two objects, better check to be sure. 15774 - #if(~"$!\{entryObj}~" != '') 15775 - #getEntryDate($entryDoc $entryObj $entryDate) 15776 - ## Display a ~"calendar sheet~" for each day. All entries posted on the same day share one such sheet. 15777 - #set($entryDateStr = $xwiki.formatDate($entryDate, 'yyyyMMMMdd')) 15778 - #if($blogDay != $entryDateStr) 15779 - #if($blogDay != '') 15780 - ))) 15781 - (% class=~"blogDay~" ~%)((( 15782 - #end 15783 - #displayBlogDate($entryDate) 15784 - #set ($blogDay = $entryDateStr) 15785 - #end 15786 - ## Finally, display the entry. 15787 - #displayEntry($entryDoc $entryObj $onlyExtract $shouldDisplayTitles true) 15788 - #end 15789 - #end 15790 - )))## blogDay 15791 - )))## hfeed 15792 -#end 15793 -## 15794 -## 15795 -## 15796 -#** 15797 - * Get the entry object, either a new BlogPost or an old Article. 15798 - * 15799 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 15800 - * @param entryObj The resulting xobject of the blog post. 15801 - *### 15802 -#macro(getEntryObject $entryDoc $__entryObj) 15803 - #set($result = $entryDoc.getObject(~"$\{blogPostClassname}~")) 15804 - #if(!$result) 15805 - #set($result = $entryDoc.getObject(~"$\{oldArticleClassname}~")) 15806 - #end 15807 - ## NOTE: The reason we put an underscore in front of the variable name is to prevent the following line from 15808 - ## overwriting the $entryObj variable that may be defined before this macro is called. Of course, $__entryObj may be 15809 - ## overwritten in this case but it's less likely to have such a variable defined before. 15810 - #set ($__entryObj = $NULL) 15811 - #setVariable (~"$__entryObj~" $result) 15812 -#end 15813 -## 15814 -## 15815 -## 15816 -#** 15817 - * Gets the date associated with a blog entry. This is the publication date. For unpublished entries, initially this is 15818 - * the document creation date, but can be edited by the user. 15819 - * 15820 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 15821 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 15822 - * @param result The resulting date, an instance of <tt>java.util.Date</tt>. 15823 - *### 15824 -#macro(getEntryDate $entryDoc $entryObj $result) 15825 - #set ($result = $NULL) 15826 - #setVariable (~"$result~" $entryObj.getProperty('publishDate').value) 15827 -#end 15828 -## 15829 -## 15830 -## 15831 -#** 15832 - * Displays a date, nicely formatted as a calendar page. 15833 - * 15834 - * @param date The date to display, an instance of <tt>java.util.Date</tt>. 15835 - *### 15836 -#macro(displayBlogDate $date) 15837 - #set($year = $xwiki.formatDate($date, 'yyyy')) 15838 - ## 3 letter month name, like Jan, Dec. 15839 - #set($month = $xwiki.formatDate($date, 'MMM')) 15840 - ## Uncomment to get a full length month name, like January, December. 15841 - ## TODO: this could be defined somewhere in the blog style. 15842 - ## #set($month = $xwiki.formatDate($date, 'MMMM')) 15843 - #set($day = $xwiki.formatDate($date, 'dd')) 15844 - (% class=~"blogdate~" ~%) 15845 - == (% class=~"month~" ~%)$month(%~%) (% class=~"day~" ~%)$day(%~%) (% class=~"year~" ~%)$year(%~%) == 15846 -#end 15847 -## 15848 -## 15849 -## 15850 -#** 15851 - * Displays a blog article: management tools, header, content, footer. 15852 - * 15853 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 15854 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 15855 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 15856 - * @param shouldDisplayTitle If <tt>true</tt>, display the blog title (blog posts shouldn't display the title 15857 - * when they're displayed alone on their page since it's the page title which is used in this case) 15858 - * @param shouldDisplayActions If <tt>true</tt>, display the blog post actions buttons 15859 - *### 15860 -#macro(displayEntry $entryDoc $entryObj $onlyExtract $shouldDisplayTitle $shouldDisplayActions) 15861 - ## Only articles with an explicit hidden setting or an explicit unpublished setting are hidden 15862 - #isPublished($entryObj $isPublished) 15863 - #isHidden($entryObj $isHidden) 15864 - #if($doc.fullName == $entryDoc.fullName) 15865 - (% class=~"hentry single-article~" ~%)((( 15866 - #else 15867 - (% class=~"hentry#if(!$isPublished) unpublished-article#elseif($isHidden) hidden-article#end~" ~%)((( 15868 - #end 15869 - #if ($shouldDisplayActions) 15870 - #displayEntryTools($entryDoc $entryObj) 15871 - #end 15872 - #if($shouldDisplayTitle) 15873 - #displayEntryTitle($entryDoc $entryObj) 15874 - #end 15875 - #if($doc.fullName == $entryDoc.fullName) 15876 - #if(!$isPublished) 15877 - \{\{warning}}\{\{translation key='blog.code.published'/}}\{\{/warning}} 15878 - #elseif($isHidden) 15879 - \{\{warning}}\{\{translation key='blog.code.hidden'/}}\{\{/warning}} 15880 - #end 15881 - #end 15882 - #displayEntryContent($entryDoc $entryObj $onlyExtract) 15883 - #displayEntryFooter($entryDoc $entryObj) 15884 - )))## hentry 15885 -#end 15886 -## 15887 -## 15888 -## 15889 -#** 15890 - * Checks if the provided blog is published or not. 15891 - * 15892 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 15893 - * @param isPublished The resulting boolean, true if the entry is considered published. 15894 - *### 15895 -#macro(isPublished $entryObj $isPublished) 15896 - #set ($isPublished = $NULL) 15897 - ## This should work for both old articles, which don't have the 'published' property at all, and 15898 - ## are considered published by default, and new entries, that should have 1 if published. 15899 - #if (~"$!\{entryObj.getProperty('published').value}~" != '0') 15900 - #setVariable (~"$isPublished~" true) 15901 - #else 15902 - #setVariable (~"$isPublished~" false) 15903 - #end 15904 -#end 15905 -## 15906 -## 15907 -## 15908 -#** 15909 - * Checks if the provided blog is hidden or not. 15910 - * 15911 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass<tt> xclass. 15912 - * @param isHiddel The resulting boolean, true if the entry is considered hidden. 15913 - *### 15914 -#macro(isHidden $entryObj $isHidden) 15915 - #set ($isHidden = $NULL) 15916 - ## This should work for both old articles, which don't have the 'hidden' property at all, and 15917 - ## are considered visible by default, and new entries, that should have 1 if hidden. 15918 - #if (~"$!\{entryObj.getProperty('hidden').value}~" == '1') 15919 - #setVariable (~"$isHidden~" true) 15920 - #else 15921 - #setVariable (~"$isHidden~" false) 15922 - #end 15923 -#end 15924 -## 15925 -## 15926 -## 15927 -#** 15928 - * Displays several ~"tools~" for manipulating blog posts: hide/show, publish, edit. 15929 - * 15930 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 15931 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 15932 - *### 15933 -#macro(displayEntryTools $entryDoc $entryObj) 15934 - #if($xcontext.action == 'view') 15935 - (% class=~"blog-entry-toolbox~" ~%)((( 15936 - #displayPublishButton($entryDoc $entryObj) 15937 - #displayHideShowButton($entryDoc $entryObj) 15938 - #displayEditButton($entryDoc $entryObj) 15939 - #displayDeleteButton($entryDoc $entryObj) 15940 - ))) 15941 - #end 15942 -#end 15943 -## 15944 -## 15945 -## 15946 -#** 15947 - * Displays the publish button to the entry <strong>creator</strong>, if the article is not published yet. 15948 - * 15949 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 15950 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 15951 - * @todo AJAX calls. 15952 - *### 15953 -#macro(displayPublishButton $entryDoc $entryObj) 15954 - #isPublished($entryObj $isPublished) 15955 - #if(!$isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 15956 - [[#toolImage('world')>>path:$blogPublisher.getURL('view', ~"entryName=$\{escapetool.url($entryDoc.fullName)}&xredirect=$\{escapetool.url($thisURL)}&form_token=$!\{services.csrf.getToken()}~")||title=~"$services.localization.render('blog.code.notpublished')~"]]## 15957 - #end 15958 -#end 15959 -## 15960 -## 15961 -## 15962 -#** 15963 - * Displays the hide or show button to the entry <strong>creator</strong>, if the article is already published. 15964 - * 15965 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 15966 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 15967 - *### 15968 -#macro(displayHideShowButton $entryDoc $entryObj) 15969 - #isPublished($entryObj $isPublished) 15970 - #isHidden($entryObj $isHidden) 15971 - ## Only published articles can be hidden. Unpublished articles are considered already hidden. 15972 - #if($isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 15973 - #set ($queryString = \{ 15974 - 'xredirect' : $thisURL, 15975 - 'form_token' : $services.csrf.getToken() 15976 - }) 15977 - #if ($isHidden) 15978 - #set ($discard = $queryString.putAll(\{ 15979 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 0, 15980 - 'comment' : $services.localization.render('blog.code.madevisible') 15981 - })) 15982 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 15983 - [[#toolImage('unlock')>>path:$lockURL||class=~"blog-tool-show~" title=~"$services.localization.render('blog.code.makevisible')~"]]## 15984 - #else 15985 - #set ($discard = $queryString.putAll(\{ 15986 - ~"$\{entryObj.getxWikiClass().getName()}_$\{entryObj.number}_hidden~" : 1, 15987 - 'comment' : $services.localization.render('blog.code.hid') 15988 - })) 15989 - #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) 15990 - [[#toolImage('lock')>>path:$lockURL||class=~"blog-tool-hide~" title=~"$services.localization.render('blog.code.hide')~"]]## 15991 - #end 15992 - #end 15993 -#end 15994 -## 15995 -## 15996 -## 15997 -#** 15998 - * Displays the edit button to those that can edit the article. 15999 - * 16000 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 16001 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 16002 - *### 16003 -#macro(displayEditButton $entryDoc $entryObj) 16004 - #if($xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) 16005 - ## Call getDefaultEditMode() for backward compatibility with older blog posts. 16006 - [[#toolImage('pencil')>>path:$entryDoc.getURL('edit')||title=~"$services.localization.render('blog.code.editpost')~"]]## 16007 - #end 16008 -#end 16009 -## 16010 -## 16011 -## 16012 -#** 16013 - * Displays the delete button to those that can edit the article. 16014 - * 16015 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 16016 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 16017 - * @todo AJAX calls. 16018 - *### 16019 -#macro(displayDeleteButton $entryDoc $entryObj) 16020 - #if($xwiki.hasAccessLevel('delete', $xcontext.user, $entryDoc.fullName)) 16021 - [[#toolImage('cross')>>path:$entryDoc.getURL('delete')||title=~"$services.localization.render('blog.code.deletepost')~"]]## 16022 - #end 16023 -#end 16024 -## 16025 -## 16026 -## 16027 -#** 16028 - * Displays the title of the entry. 16029 - * 16030 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 16031 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 16032 - *### 16033 -#macro(displayEntryTitle $entryDoc $entryObj) 16034 - #if($doc.fullName == $entryDoc.fullName) 16035 - (% class=~"entry-title~" ~%) 16036 - = $services.rendering.escape($entryDoc.display('title', 'view', $entryObj), $xwiki.getCurrentContentSyntaxId()) = 16037 - #else 16038 - (% class=~"entry-title~" ~%) 16039 - === [[$services.rendering.escape($entryDoc.display('title', 'view', $entryObj),$xwiki.getCurrentContentSyntaxId())>>doc:$services.rendering.escape($services.model.serialize($entryDoc.getDocumentReference(),'default'),$xwiki.getCurrentContentSyntaxId())]] === 16040 - #end 16041 -#end 16042 -## 16043 -## 16044 -## 16045 -#** 16046 - * Displays the body of the entry. 16047 - * 16048 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 16049 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 16050 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 16051 - *### 16052 -#macro(displayEntryContent $entryDoc $entryObj $onlyExtract) 16053 - (% class=~"#if($onlyExtract)entry-summary#\{else}entry-content#end~" ~%)((( 16054 - #getEntryContent($entryDoc $entryObj $onlyExtract $entryContent) 16055 - ## FIXME: This causes the blog's content to not be annotatable. See http://jira.xwiki.org/browse/XWIKI-6328 16056 - ## Should probably be replaced by a display macro call with a reference to the object property holding the post's content 16057 - \{\{html wiki=~"false~"}}$entryDoc.getRenderedContent($entryContent, $entryDoc.syntax.toIdString())\{\{/html}} 16058 - ))) ## entry-content 16059 - (% class=~"clearfloats~" ~%)((())) 16060 -#end 16061 -## 16062 -## 16063 -## 16064 -#** 16065 - * Extracts the body of the entry that should be displayed. If <tt>onlyExtract</tt> is <tt>true</tt>, display the content 16066 - * of the <tt>extract</tt> field (if not empty). 16067 - * 16068 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 16069 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 16070 - * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. 16071 - * @param entryContent The resulting content. 16072 - * @param removeEllipsis If <tt>true</tt>, then don't display an ellipsis at the end of the content (only used when 16073 - * <tt>onlyExtract</tt> is <tt>true</tt>) 16074 - *### 16075 -#macro(getEntryContent $entryDoc $entryObj $onlyExtract $entryContent $removeEllipsis) 16076 - #if ($onlyExtract) 16077 - ## Note: We trim the summary so that if there's some white space it won't cause the summary to be used instead 16078 - ## of the content. 16079 - #set ($macro.result = $entryObj.getProperty('extract').value.trim()) 16080 - #end 16081 - #if(~"$!macro.result~" == '') 16082 - #set($macro.result = $entryObj.getProperty('content').value) 16083 -#* Disabled until the content can be cleanly cut. 16084 -* #if($onlyExtract && $result.length()>$maxchars) 16085 -* #set($i = $macro.result.lastIndexOf(~" ~", $maxchars)) 16086 -* #set($i = $i + 1) 16087 -* #set($macro.result = ~"$\{macro.result.substring(0,$i)} *[...>$\{entryDoc.fullName}]*~") 16088 -* #end 16089 -## *### 16090 - #elseif (!$removeEllipsis) 16091 - #if($entryDoc.syntax.toIdString() == 'xwiki/1.0') 16092 - #set($macro.result = ~"$\{macro.result} <a href='$\{entryDoc.getExternalURL()}' title='$services.localization.render('blog.code.readpost')'>...</a>~") 16093 - #elseif($entryDoc.syntax.toIdString() == 'xwiki/2.0' || $entryDoc.syntax.toIdString() == 'xwiki/2.1') 16094 - #set($macro.result = ~"$\{macro.result} [[...>>$\{services.rendering.escape($entryDoc.getFullName(), $entryDoc.getSyntax())}||title='$services.localization.render('blog.code.readpost')']]~") 16095 - #end 16096 - #end 16097 - #set ($entryContent = $NULL) 16098 - #setVariable (~"$entryContent~" $macro.result) 16099 -#end 16100 -## 16101 -## 16102 -## 16103 -#** 16104 - * Displays the footer of the entry. 16105 - * 16106 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 16107 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 16108 - *### 16109 -#macro(displayEntryFooter $entryDoc $entryObj) 16110 - (% class=~"entry-footer~" ~%)((( 16111 - #isPublished($entryObj $isPublished) 16112 - (% class='entry-author-label' ~%) 16113 - #if($isPublished) 16114 - \{\{translation key='blog.code.postedby'/}} ## 16115 - #else 16116 - \{\{translation key='blog.code.createdby'/}} ## 16117 - #end 16118 - \{\{html wiki=~"false~" clean=~"false~"}}<span class='author vcard'>#userfn($entryDoc.creator)</span>\{\{/html}} ## 16119 - #getEntryDate($entryDoc $entryObj $entryDate) 16120 - #listCategories($entryObj) #* 16121 - ## Since the publish date and update date are not set at the exact same time, there could be a small difference that 16122 - ## we assume cannot be more than 3 seconds. 16123 - *#(% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.permalink'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||rel=~"bookmark~"]] ## 16124 - #if ($showcomments) 16125 - (% class=~"separator~" ~%)·(%~%) [[\{\{translation key='blog.code.comments'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||anchor=~"Comments~"]] (% class=~"itemCount~" ~%)($entryDoc.comments.size())(%~%) ## 16126 - #end ## 16127 - #if($entryDoc != $doc) ## 16128 - #displayEntryBlogLocation($entryDoc $entryObj) ## 16129 - #end 16130 - )))## entry-footer 16131 -#end 16132 -## 16133 -## 16134 -#** 16135 - * Display the blog for the entry (if it is not the currently displayed blog) 16136 - * 16137 - * @param entryDoc The xdocument of the blog post. Each post resides in its own document. 16138 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 16139 - *### 16140 -#macro(displayEntryBlogLocation $entryDoc $entryObj) 16141 - #getBlogPostsLocation($entryDoc.getSpace() $blogPostsLocation) ## 16142 - #if(~"$!blogPostsLocation~" != ~"~") ## 16143 - #set($blogSpaceRef = $services.model.resolveSpace($blogPostsLocation)) ## 16144 - #set($blogDocRef = $services.model.createDocumentReference($services.model.getEntityReference('DOCUMENT', 'default').getName(), $blogSpaceRef)) ## 16145 - #if($doc.documentReference != $blogDocRef) ## 16146 - #set($blogDoc = $xwiki.getDocument($blogDocRef)) ## 16147 - #set($blogObj = $blogDoc.getObject('Blog.BlogClass')) ## 16148 - #if($blogObj) (% class=~"blogrefpath~" ~%)((( ## 16149 - $services.localization.render('blog.code.postedin') \{\{html clean=~"false~" wiki=~"false~"}} #hierarchy($blogDocRef, \{'selfIsActive' : true, 'local': true}) \{\{/html}} ## 16150 - )))(%~%)## 16151 - #end 16152 - #end 16153 - #end 16154 -#end 16155 -## 16156 -## 16157 -## 16158 -## 16159 -#** 16160 - * List the categories an entry belongs to. Used in the footer. The categories are instances of <tt>Blog.CategoryClass</tt>. 16161 - * 16162 - * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. 16163 - *### 16164 -#macro(listCategories $entryObj) 16165 - #if($entryObj.getxWikiClass().getName() == $blogPostClassname) 16166 - #set($categories = $entryObj.getProperty('category').value) 16167 - #set($first = true) 16168 - #if($categories.size() > 0) 16169 - #foreach($category in $categories) 16170 - #set($categoryDoc = $!xwiki.getDocument($category)) 16171 - #if(!$categoryDoc.isNew() && $categoryDoc.getObject($\{blogCategoryClassname})) 16172 - #if($foreach.count == 1) 16173 - (% class='separator' ~%)·(%~%) $services.localization.render('blog.code.categories') ## 16174 - #else 16175 - , ## 16176 - #end## 16177 - [[$!\{categoryDoc.getObject($blogCategoryClassname).getValue('name')}>>$\{category}||rel='tag']]## 16178 - #end## 16179 - #end## 16180 - #end 16181 - #end 16182 -#end 16183 -## 16184 -## 16185 -## 16186 -#** 16187 - * Displays blog pagination links (older and newer entries). 16188 - * 16189 - * @param blogDoc the XDocument holding the blog definition object. 16190 - *### 16191 -#macro(displayNavigationLinks $blogDoc) 16192 - (% class=~"clearfloats~" ~%)((())) 16193 - #getBlogDisplayType($blogDoc $displayType) 16194 - #if($displayType == 'weekly') 16195 - (% class=~"pagingLinks~" ~%)((( 16196 - #getRequestedWeek($weekDate) 16197 - $weekDate.addWeeks(-1)## 16198 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousweek'/}}>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 16199 - #sep() 16200 - $weekDate.addWeeks(2)## 2 because we already subtracted 1 above 16201 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextweek'/}} »>>$doc.documentReference.name||queryString=~"year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear~" class=~"button~"]]**(%~%) 16202 - ))) 16203 - #elseif($displayType == 'monthly') 16204 - (% class=~"pagingLinks~" ~%)((( 16205 - #getRequestedMonth($monthDate) 16206 - $monthDate.addMonths(-1)## 16207 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.previousmonth'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 16208 - #sep() 16209 - $monthDate.addMonths(2)## 2 because we already subtracted 1 above 16210 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.nextmonth'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"year=$monthDate.year&month=$monthDate.monthOfYear~" class=~"button~"]]**(%~%) 16211 - ))) 16212 - #elseif($displayType == 'all') 16213 - #else 16214 - ## Paginated 16215 - #if(($totalPages > 1)) 16216 - #set($queryString = '') 16217 - #foreach($p in $request.getParameterNames()) 16218 - #if($p != 'page' && $p != 'ipp') 16219 - #foreach($v in $request.getParameterValues($p)) 16220 - #set($queryString = ~"$\{queryString}&$\{escapetool.url($p)}=$\{escapetool.url($v)}~") 16221 - #end 16222 - #end 16223 - #end 16224 - (% class=~"pagingLinks~" ~%)((( 16225 - #if ($currentPageNumber < $totalPages) 16226 - #set($currentPageNumber = $currentPageNumber + 1) 16227 - (% class=~"prevPage~" ~%)**[[« \{\{translation key='blog.code.olderposts'/}}>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 16228 - #set($currentPageNumber = $currentPageNumber - 1) 16229 - #end 16230 - #if ($currentPageNumber > 1) 16231 - #if ($currentPageNumber < $totalPages) 16232 - #sep() 16233 - #end 16234 - #set($currentPageNumber = $currentPageNumber - 1) 16235 - (% class=~"nextPage~" ~%)**[[\{\{translation key='blog.code.newerposts'/}} »>>$services.rendering.escape($doc.documentReference.name,$doc.syntax)||queryString=~"page=$\{currentPageNumber}&ipp=$\{itemsPerPage}$queryString~" class=~"button~"]]**(%~%) 16236 - #set($currentPageNumber = $currentPageNumber + 1) 16237 - #end 16238 - (% class=~"clear~" ~%)(%~%) 16239 - )))## pagingLinks 16240 - #end 16241 - #end 16242 -#end 16243 -## 16244 -## 16245 -## 16246 -#** 16247 - * Displays a message box with ~"publish~" icon. 16248 - * 16249 - * @param message A text message concerning blog article publishing 16250 - *### 16251 -#macro(publishMessageBox $message) 16252 -(% class=~"plainmessage publish-message~" ~%)((($services.icon.render('world') $message))) 16253 -#end 16254 -#** 16255 - * Displays a message box with ~"show/hide~" icon. 16256 - * 16257 - * @param message A text message concerning blog article hiding 16258 - *### 16259 -#macro(hideMessageBox $message) 16260 -(% class=~"plainmessage hide-message~" ~%)((($services.icon.render('unlock') $message))) 16261 -#end 16262 -## 16263 -## 16264 -## 16265 -#** 16266 - * Determine the requested week, for using in a weekly-indexed blog. The relevant request parameters are 16267 - * <tt>year</tt> and <tt>week</tt>. By default, the current week is used. 16268 - * 16269 - * @param monthDate The resulting week, a JODATime MutableDateTime. 16270 - *### 16271 -#macro(getRequestedWeek $weekDate) 16272 - #set ($weekDate = $NULL) 16273 - #setVariable (~"$weekDate~" $xwiki.jodatime.mutableDateTime) 16274 - #if(~"$!\{request.year}~" != '') 16275 - #set ($discard = $weekDate.setYear($numbertool.toNumber($request.year).intValue())) 16276 - #end 16277 - #if(~"$!\{request.week}~" != '') 16278 - #set ($discard = $weekDate.setWeekOfWeekyear($numbertool.toNumber($request.week).intValue())) 16279 - #end 16280 -#end 16281 -## 16282 -## 16283 -## 16284 -#** 16285 - * Determine the requested month, for using in a monthly-indexed blog. The relevant request parameters are 16286 - * <tt>year</tt> and <tt>month</tt>. By default, the current month is used. 16287 - * 16288 - * @param monthDate The resulting month, a JODATime MutableDateTime. 16289 - *### 16290 -#macro(getRequestedMonth $monthDate) 16291 - #set ($monthDate = $NULL) 16292 - #setVariable (~"$monthDate~" $xwiki.jodatime.mutableDateTime) 16293 - #if(~"$!\{request.year}~" != '') 16294 - #set ($discard = $monthDate.setYear($numbertool.toNumber($request.year).intValue())) 16295 - #end 16296 - #if(~"$!\{request.month}~" != '') 16297 - #set ($discard = $monthDate.setMonthOfYear($numbertool.toNumber($request.month).intValue())) 16298 - #end 16299 -#end 16300 -## 16301 -## 16302 -## 16303 -#** 16304 - * Retrieve a blog property (title, display type, etc). 16305 - * 16306 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 16307 - * @param propertyName The name of the property to be retrieved. One of the <tt>Blog.BlogClass</tt>'s properties. 16308 - * @param defaultValue The default value to use in case the blog object does not define one. 16309 - * @param propertyValue The resulting value. 16310 - *### 16311 -#macro(getBlogProperty $blogDoc $propertyName $defaultValue $propertyValue) 16312 - #set($result = ~"$!\{blogDoc.getObject($\{blogClassname}).getProperty($propertyName).value}~") 16313 - #if($result == '') 16314 - #set($result = $defaultValue) 16315 - #end 16316 - #set ($propertyValue = $NULL) 16317 - #setVariable (~"$propertyValue~" $result) 16318 -#end 16319 - 16320 -#** 16321 - * If an error occurs when executing an action, set a specific response status and display an error message. 16322 - * 16323 - * @param status The response status. 16324 - * @param text The user readable error to be displayed. Can be a translation key. 16325 - * @param parameters The parameters to use when decoding the translation key. 16326 - *### 16327 -#macro(blog__actionResponseError $status $text $parameters) 16328 - $response.setStatus($status) 16329 - #if($request.ajax) 16330 - $services.localization.render($text, $!parameters) 16331 - #else 16332 - \{\{error}}$services.localization.render($text, $!parameters)\{\{/error}} 16333 - #end 16334 -#end 16335 -## 16336 -## 16337 -## 16338 -#** 16339 - * Check if a blog is the Default blog (The one in the 'Blog' space). 16340 - * 16341 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. 16342 - * @param isDefault The resulting boolean. 16343 - *### 16344 -#macro(isDefaultBlog $blogDoc $isDefault) 16345 - #set ($result = false) 16346 - #if ($blogDoc.space == 'Blog') 16347 - #set ($result = true) 16348 - #end 16349 - #setVariable(~"$isDefault~" $result) 16350 -#end 16351 -## 16352 -## 16353 -## 16354 -#** 16355 - * Retrieve the blog posts location (space). 16356 - * 16357 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 16358 - * @param postsLocation The resulting location. 16359 - *### 16360 -#macro(getBlogPostsLocation $blogSpace $postsLocation) 16361 - #getBlogDocument($blogSpace $blogDoc) 16362 - #getBlogProperty($blogDoc 'postsLocation' $blogDoc.space $result) 16363 - #set ($postsLocation = $NULL) 16364 - #setVariable (~"$postsLocation~" $result) 16365 -#end 16366 -## 16367 -## 16368 -## 16369 -#** 16370 - * Retrieve the blog categories location (space). 16371 - * 16372 - * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object 16373 - * @param categoriesLocation The resulting location. 16374 - *### 16375 -#macro(getBlogCategoriesLocation $blogSpace $categoriesLocation) 16376 - #getBlogDocument($blogSpace $blogDoc) 16377 - #getBlogProperty($blogDoc 'categoriesLocation' 'Blog' $result) 16378 - #set ($postsLocation = $NULL) 16379 - #setVariable (~"$categoriesLocation~" $result) 16380 -#end 16381 -###** 16382 - * Return the Query for selecting the blog posts based on the context where the posts are displayed. 16383 - * for example there is 4 different panel contexts: 16384 - * aBlog.aPost or aBlog.WebHome 16385 - * aCategorySpace.aCategory 16386 - * aCategorySpace.WebHome 16387 - * Blog.aPost or Blog.WebHome 16388 - * 16389 - * @param query The query for selecting blog entries. 16390 - * @param queryParams The parameters to bind with the generated query. 16391 - * @param targetDoc The document in which the articles will be displayed. 16392 - *### 16393 -#macro(getAllBlogPostsQueryBasedOnDisplayContext $targetDoc $query $queryParams) 16394 - #set ($query = $NULL) 16395 - #set ($queryParams = $NULL) 16396 - #getCategoryAllBlogPostsQuery($resultQuery) 16397 - #set ($resultQueryParams = \{}) 16398 - #set($sanitizedSpace = $targetDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) 16399 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 16400 - ## Get all posts that are in the default blog space('Blog') or in category 'Blog.%' 16401 - #set ($discard = $resultQueryParams.put('space', $targetDoc.space)) 16402 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 16403 - #set($resultQuery = ~"$\{resultQuery} and (doc.space = :space or catList like :catList escape '!')~") 16404 - #elseif($targetDoc.getObject($blogCategoryClassname)) 16405 - ## Get all posts that are in a category aCategorySpace.aCategory 16406 - #set ($discard = $resultQueryParams.put('catList', $targetDoc.fullName)) 16407 - #set($resultQuery = ~"$\{resultQuery} and (catList=:catList)~") 16408 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 16409 - ## Get all posts that are in a category aCategorySpace.% 16410 - #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) 16411 - ## Exclude incategorized posts 16412 - #set ($excludedCategory = ~"$\{targetDoc.space}.WebHome~") 16413 - #if ($targetDoc.space == $defaultBlogSpace) 16414 - #set ($excludedCategory = ~"Blog.Categories.WebHome~") 16415 - #end 16416 - #set ($discard = $resultQueryParams.put('excludedCategory', $excludedCategory)) 16417 - #set($resultQuery = ~"$\{resultQuery} and (catList<>:excludedCategory) and (catList like :catList escape '!')~") 16418 - #else 16419 - ## Get all posts in blog space aBlog 16420 - #getAllBlogPostsQuery($resultQuery) 16421 - #getBlogPostsLocation($targetDoc.space $postsLocation) 16422 - #set ($discard = $resultQueryParams.put('space', $postsLocation)) 16423 - #set($resultQuery = ~"$\{resultQuery} and doc.space = :space~") 16424 - #end 16425 - #setVariable(~"$query~" $resultQuery) 16426 - #setVariable(~"$queryParams~" $resultQueryParams) 16427 -#end 16428 -## 16429 -## 16430 -## 16431 -###** 16432 - * Display blog posts based on the context where the posts are displayed. 16433 - * for example there is 4 different panel contexts: 16434 - * aBlog.aPost or aBlog.WebHome 16435 - * aCategorySpace.aCategory 16436 - * aCategorySpace.WebHome 16437 - * Blog.aPost or Blog.WebHome 16438 - * 16439 - * @param targetDoc The document in which the articles will be displayed. 16440 - * @param postsVisiblity The visibility of the posts to display: recent, unpublished, ... 16441 - * @param layout Layout of the the posts to display 16442 - * @param layoutParams additional layout parameters, it is a string like 'param1=val1|...|paramN=valueN' 16443 - * @param limit the number of posts to display 16444 - *### 16445 -#macro(displayBlogPostsBasedOnContext $targetDoc $postsVisiblity $layout $layoutParams $limit) 16446 - #if ($postLayout == 'full') 16447 - #set ($macro.paginated = 'yes') 16448 - #end 16449 - #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) 16450 - ## Display all posts that are in the default blog space('Blog') or in category 'Blog.%' 16451 - #getBlogPostsLayout($xwiki.getDocument(~"$\{defaultBlogSpace}.WebHome~") $postsLayout) 16452 - #if (~"$!layout~" == '') 16453 - #set ($layout = $postsLayout) 16454 - #end 16455 - #if ($postsVisiblity == 'recent') 16456 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 16457 - #elseif($postsVisiblity == 'unpublished') 16458 - \{\{blogpostlist blog=~"$\{defaultBlogSpace.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')}.WebHome~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 16459 - #end 16460 - #elseif($targetDoc.getObject($blogCategoryClassname)) 16461 - ## Display all posts that are in a category aCategorySpace.aCategory 16462 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 16463 - #getBlogPostsLayout($blogDoc $postsLayout) 16464 - #if (~"$!layout~" == '') 16465 - #set ($layout = $postsLayout) 16466 - #end 16467 - #if ($postsVisiblity == 'recent') 16468 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 16469 - #elseif($postsVisiblity == 'unpublished') 16470 - \{\{blogpostlist category=~"$targetDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 16471 - #end 16472 - #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') 16473 - ## Display all posts that are in a category aCategorySpace.% 16474 - #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) 16475 - #getBlogPostsLayout($blogDoc $postsLayout) 16476 - #if (~"$!layout~" == '') 16477 - #set ($layout = $postsLayout) 16478 - #end 16479 - #if ($postsVisiblity == 'recent') 16480 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 16481 - #elseif($postsVisiblity == 'unpublished') 16482 - \{\{blogpostlist category=~"$targetDoc.space.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 16483 - #end 16484 - #else 16485 - ## Display all posts in blog space aBlog 16486 - #getBlogDocument($targetDoc.space $blogDoc) 16487 - #getBlogPostsLayout($blogDoc $postsLayout) 16488 - #if (~"$!layout~" == '') 16489 - #set ($layout = $postsLayout) 16490 - #end 16491 - #if ($postsVisiblity == 'recent') 16492 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='yes' hidden='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" limit=~"$limit~" /}} 16493 - #elseif($postsVisiblity == 'unpublished') 16494 - \{\{blogpostlist blog=~"$blogDoc.fullName.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" published='no' layout=~"$!layout.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" layoutParams=~"$!layoutParams.replaceAll('~~', '~~~~').replaceAll('~"', '~~~"')~" paginated=~"$!macro.paginated~" limit=~"$limit~" /}} 16495 - #end 16496 - #end 16497 -#end 16498 -## 16499 -## 16500 -## 16501 -#** 16502 - * Bind parameters to a query object. 16503 - * 16504 - * @param queryObj The query object (org.xwiki.query.internal.ScriptQuery object) 16505 - * @param queryParams the query parameters. 16506 - *### 16507 -#macro(bindQueryParameters $queryObj $queryParams) 16508 - #set ($output = $queryObj) 16509 - #foreach( $key in $queryParams.keySet() ) 16510 - #set($output = $queryObj.bindValue($key, $queryParams.get($key))) 16511 - #end 16512 - #setVariable(~"$queryObj~" $output) 16513 -#end 16514 -## 16515 -## 16516 -## 16517 -#** 16518 - * Determines the blogposts layout: Default layout (Calendar), Image thumbnail 16519 - * 16520 - * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>postsLayout</tt> 16521 - * property set. 16522 - * @param postsLayout The resulting string. If the blog object does not define anything, it is considered full (default). 16523 - *### 16524 -#macro(getBlogPostsLayout $blogDoc $postsLayout) 16525 - #getBlogProperty($blogDoc 'postsLayout' 'full' $res) 16526 - #set ($postsLayout = $NULL) 16527 - #setVariable (~"$postsLayout~" $res) 16528 -#end 16529 -## 16530 -## 16531 -## 16532 -#** 16533 - * Retrieve the blog document of a categories space, which is the blog descriptor that have its categoriesLocation property set to the categories space 16534 - * 16535 - * @param categoriesSpace A <tt>String</tt>, the name of the space. 16536 - * @param blogDoc The resulting XDocument. 16537 - *### 16538 -#macro(getBlogDocumentForCategoriesSpace $categoriesSpace $blogDoc) 16539 - #set($macro.blogDocs = $services.query.hql(~", BaseObject obj, StringProperty as categoriesLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=categoriesLocationProp.id.id and categoriesLocationProp.id.name='categoriesLocation' and categoriesLocationProp.value=:categoriesLocation order by doc.creationDate~").setLimit(1).setOffset(0).bindValue('categoriesLocation', $categoriesSpace).execute()) 16540 - #if($macro.blogDocs.size() > 0 && $categoriesSpace != $defaultBlogSpace) 16541 - #set($macro.result = $xwiki.getDocument($macro.blogDocs.get(0))) 16542 - #else 16543 - ## Fallback to Blog.WebHome, the default blog 16544 - #set($macro.result = $xwiki.getDocument('Blog.WebHome')) 16545 - #end 16546 - #set ($blogDoc = $NULL) 16547 - #setVariable (~"$blogDoc~" $macro.result) 16548 -#end" %) 16549 -((( 16550 -(% class="macro-placeholder hidden" %) 16551 -((( 16552 -macro:velocity 16553 -))) 16554 -))) 16555 -))) 16556 - 16557 -(% class="macro" data-macro="startmacro:include|-|reference=~"Blog.BlogPostLayoutMacros~"" %) 16558 -((( 16559 -(% class="macro-placeholder hidden" %) 16560 -((( 16561 -macro:include 16562 -))) 16563 - 16564 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-|#** 16565 - * Extract the layout parameters from a string. 16566 - * 16567 - * @param layoutParamsString The string representation of the layout parameters. 16568 - * It should contain a String following this format ~"paramName1=Value1|paramName2=Value2|...|paramNameK=ValueK~" 16569 - * @param layoutsParameters The resulting layout parameters Map. 16570 - *### 16571 -#macro(extractLayoutParametersFromString $layoutParamsString $layoutsParameters) 16572 - #set ($layoutsParameters = $NULL) 16573 - #set ($macro.layoutParams = \{}) 16574 - #if (~"$!layoutParamsString~" != '') 16575 - #set ($macro.paramsArr = $layoutParamsString.split('\\|')) 16576 - #foreach ($item in $macro.paramsArr) 16577 - #set ($itemSplit = $item.split('=')) 16578 - #if ($itemSplit.size() == 2) 16579 - #set ($discard = $macro.layoutParams.put($itemSplit[0].trim(), $itemSplit[1].trim())) 16580 - #end 16581 - #end 16582 - #end 16583 - #setVariable(~"$layoutsParameters~" $macro.layoutParams) 16584 -#end" %) 16585 -((( 16586 -(% class="macro-placeholder hidden" %) 16587 -((( 16588 -macro:velocity 16589 -))) 16590 -))) 16591 -))) 16592 - 16593 -(% class="macro" data-macro="startmacro:velocity|-|output=~"false~"|-| #macro(displaySmallPost $pDoc $pObj) 16594 - #initLayoutVars($pDoc $pObj) 16595 - <div class=~"col-xs-12 col-sm-6 next_blog~"> 16596 - <a href=~"$pDoc.uRL~" class=~"thumbnail~"> 16597 - <div class=~"row~"> 16598 - <div class=~"col-xs-4~"> 16599 - #if ($imageAtt) 16600 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 16601 - #end 16602 - </div> 16603 - <div class=~"col-xs-8 art_det~"> 16604 - <p class=~"text-left~"> 16605 - #if($displayTitle)$!postTitle #end 16606 - <br/><span class=~"date_info~"> $!dateStr </span> 16607 - </p> 16608 - #displayPostDetails($pDoc) 16609 - </div> 16610 - </div> 16611 - </a> 16612 - </div> 16613 - #end 16614 - ## 16615 - ## 16616 - ## 16617 - #macro(displayPinnedPost $pDoc $pObj) 16618 - #initLayoutVars($pDoc $pObj) 16619 - <div class=~"col-xs-12 col-sm-4 col-md-4 blog_pin~"> 16620 - <a href=~"$pDoc.uRL~" class=~"all-post-link~"> 16621 - <div class=~"thumbnail~"> 16622 - #if ($displayTitle && $displayTitleFirstOnPinnedPosts) 16623 - <h5 class=~"title-top~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 16624 - #end 16625 - #if ($imageAtt) 16626 - <img src=~"$escapetool.xml($pDoc.getAttachmentURL($pObj.getValue('image'),'download',$imgQs))~" /> 16627 - #end 16628 - <div class=~"caption~"> 16629 - #if ($displayTitle && !$displayTitleFirstOnPinnedPosts) 16630 - <h5 class=~"text-left~">$!postTitle <br/> <span class=~"date_info~"> $!dateStr </span> </h5> 16631 - #end 16632 - #if ($displaySummaryOnPinnedPosts) 16633 - <div class=~"text-left post-summary~"> 16634 - #set ($postContent = $pObj.getProperty('extract').value) 16635 - $!pDoc.getRenderedContent($postContent, $pDoc.syntax.toIdString()) 16636 - </div> 16637 - #end 16638 - #displayPostDetails($pDoc) 16639 - </div> 16640 - </div> 16641 - </a> 16642 - </div> 16643 - #end 16644 - ## 16645 - ## 16646 - ## 16647 - #macro(formatPostDate $pDoc $pObj) 16648 - #set ($formattedDate = $NULL) 16649 - #set($dateStr = $datetool.format('medium', $postDate, $xcontext.locale)) 16650 - #if (~"$!dateStr~" != '') 16651 - #set ($dateArr = $dateStr.split(' ')) 16652 - #if ($dateArr.size() > 3) 16653 - #set ($dateStr = ~"~") 16654 - #foreach($s in $dateArr.subList(0, 3)) 16655 - #set ($dateStr = ~"$\{dateStr}$\{s} ~") 16656 - #end 16657 - #end 16658 - #end 16659 - #setVariable(~"$formattedDate~" $dateStr) 16660 - #end 16661 - ## 16662 - ## 16663 - ## 16664 - #macro(displayPostDetails $pDoc) 16665 - <div class=~"row post-details~"> 16666 - <div class=~"col-xs-8 detail~"> 16667 - #if ($services.like.displayButton($pDoc.documentReference)) 16668 - #set ($optLikeRecord = $services.like.getLikes($pDoc.documentReference)) 16669 - ## Retrieve the likes number in XWiki 12.9+ 16670 - #set ($likeNumber = $optLikeRecord.get()) 16671 - #if (!$stringtool.isNumeric($likeNumber.toString())) 16672 - ## Retrieve the likes number in XWiki versions greater than 12.7 and lower than 12.9. 16673 - #set ($likeNumber = $optLikeRecord.get().likeNumber) 16674 - #end 16675 - #if ($stringtool.isNumeric($likeNumber.toString())) 16676 - <div class=~"post-likes btn btn-default disabled badge~" 16677 - title=~"$escapetool.xml($services.localization.render('like.button.title', [$likeNumber]))~"> 16678 - $services.icon.renderHTML('heart') <span class=~"like-number~">$likeNumber</span> 16679 - </div> 16680 - #end 16681 - #elseif ($services.ratings) 16682 - #set ($ratingsConfigDoc = $services.ratings.getConfigurationDocument($pDoc.documentReference)) 16683 - #if ($ratingsConfigDoc.getValue('displayRatings') == 1) 16684 - <ul class=~"pull-left note list-inline~"> 16685 - #foreach ($x in [1..5]) 16686 - #set ($cls = ~"~") 16687 - #if ($x > $averageVote) 16688 - #set ($cls = ~"-o~") 16689 - #end 16690 - <li><span class=~"fa fa-star$\{cls}~"></span></li> 16691 - #end 16692 - </ul> 16693 - #end 16694 - #end 16695 - </div> 16696 - #if ($showPostComments) 16697 - <div class=~"col-xs-4 com_det~"> 16698 - <p class=~"text-right~">$services.icon.renderHTML('comments') ($!nbComments)</p> 16699 - </div> 16700 - #end 16701 - </div> 16702 - #end 16703 - ## 16704 - ## 16705 - ## 16706 - #macro(initLayoutVars $pDoc $pObj) 16707 - #set ($postTitle = $pDoc.display('title', 'view', $pObj)) 16708 - #set ($imageAtt = $pDoc.getAttachment($pObj.getValue('image'))) 16709 - #isPublished($pObj $isPublished) 16710 - #isHidden($pObj $isHidden) 16711 - #getEntryDate($pDoc $pObj $postDate) 16712 - #formatPostDate($postDate $dateStr) 16713 - #set ($averageVote = $mathtool.round($services.ratings.getAverageRating($pDoc.documentReference).getAverageVote())) 16714 - #set ($nbComments = $pDoc.getComments().size()) 16715 - #set ($showPostComments = true) 16716 - #if ($xwiki.getSpacePreferenceFor('showcomments', $pDoc.documentReference.lastSpaceReference, '1') == '0') 16717 - #set ($showPostComments = false) 16718 - #end 16719 - #end 16720 - ## 16721 - ## 16722 - ## 16723 - #macro(displayEditPinnedPostsButton) 16724 - #if (~"$!macroAdditionalParams.get('postIndex')~" == '0' && $services.security.authorization.hasAccess('edit', $pinnedPostsSourceDoc.fullName)) 16725 - #set ($discard = $xwiki.ssx.use('Blog.PinnedPostsSheet')) 16726 - #set ($discard = $xwiki.jsx.use('Blog.PinnedPostsSheet')) 16727 - #set ($editPinnedPostsURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'get', 'sheet=Blog.PinnedPostsSheet')) 16728 - #set ($newPinnedPostsObjectURL = $xwiki.getURL($pinnedPostsSourceDoc.fullName, 'objectadd', ~"classname=Blog.PinnedPostsClass&form_token=$!\{services.csrf.getToken()}~")) 16729 - <div class=~"edit-pinned-posts-container~"> 16730 - <div class=~"col-xs-12 col-sm-12 col-md-12 text-right edit-pinned-posts~"> 16731 - <a href=~"javascript:;~" class=~"editPinnedPosts~"> 16732 - <span class=~"glyphicon glyphicon-edit~" aria-hidden=~"true~"></span> $services.localization.render('blog.post.layout.cards.pinnedposts.edit') 16733 - </a> 16734 - <input type=~"hidden~" id=~"editPinnedPostsURL~" value=~"$escapetool.xml($editPinnedPostsURL)~"/> 16735 - <input type=~"hidden~" id=~"newPinnedPostsObjectURL~" value=~"$escapetool.xml($newPinnedPostsObjectURL)~"/> 16736 - </div> 16737 - </div> 16738 - #if (~"$!pinnedPostsObj~" == '') 16739 - <input type=~"hidden~" name=~"createPinnedPostsObject~" value=~"1~"/> 16740 - #end 16741 - #end 16742 - #end" %) 16743 -((( 16744 -(% class="macro-placeholder hidden" %) 16745 -((( 16746 -macro:velocity 16747 -))) 16748 -))) 16749 - 16750 -(% class="macro" data-macro="startmacro:velocity|-||-| #if ($services.security.authorization.hasAccess('view', $xcontext.macro.params.reference)) 16751 - #set ($postDoc = $xwiki.getDocument($xcontext.macro.params.reference)) 16752 - #getEntryObject($postDoc $postObj) 16753 - #if (~"$!postObj~" != '') 16754 - #extractLayoutParametersFromString($xcontext.macro.params.params $macroAdditionalParams) 16755 - ## 16756 - #set ($displayTitle = true) 16757 - #if (~"$!macroAdditionalParams.get('displayTitle')~" == 'false') 16758 - #set ($displayTitle = false) 16759 - #end 16760 - ## 16761 - #set ($displayTitleFirstOnPinnedPosts = false) 16762 - #if (~"$!macroAdditionalParams.get('displayTitleFirstOnPinnedPosts')~" == 'true') 16763 - #set ($displayTitleFirstOnPinnedPosts = true) 16764 - #end 16765 - ## 16766 - #set ($displaySummaryOnPinnedPosts = true) 16767 - #if (~"$!macroAdditionalParams.get('displaySummaryOnPinnedPosts')~" == 'false') 16768 - #set ($displaySummaryOnPinnedPosts = false) 16769 - #end 16770 - ## 16771 - #set ($postIndex = $numbertool.toNumber($macroAdditionalParams.get('postIndex')).intValue()) 16772 - #if ($postIndex == 0) 16773 - #set ($stopBlogPostsDisplay = false) 16774 - #end 16775 - #set ($listResultsCount = $numbertool.toNumber($macroAdditionalParams.get('list-results-count')).intValue()) 16776 - #set($discard = $xwiki.ssx.use('Blog.BlogPostLayoutCards')) 16777 - #set($scaleWidth = 600) 16778 - #set($imgQs=~"width=$scaleWidth~") 16779 - ## Display pinned posts 16780 - ## Get the list of pinned posts 16781 - #set ($pinnedPosts = []) 16782 - #set ($pinnedPostsSourceDoc = $NULL) 16783 - #if (~"$!macroAdditionalParams.get('forceDisplayPinnedPosts')~" == 'true' && ~"$!macroAdditionalParams.get('list-blog')~" != '') 16784 - #set ($pinnedPostsSourceDoc = $xwiki.getDocument($macroAdditionalParams.get('list-blog'))) 16785 - ## Note that the 'list-blog' parameter contains the value of the 'blog' parameter of the blogpostlist macro passed to the current layout macro 16786 - #end 16787 - #if (~"$!pinnedPostsSourceDoc~" != '') 16788 - #set ($pinnedPostsObj = $pinnedPostsSourceDoc.getObject('Blog.PinnedPostsClass')) 16789 - #if (~"$!pinnedPostsObj~" != '') 16790 - #set ($orderedPinnedPostsJSON = $pinnedPostsObj.getProperty('orderedPosts').value) 16791 - #if (~"$!orderedPinnedPostsJSON~" != '') 16792 - #set ($pinnedPosts = $jsontool.parse($orderedPinnedPostsJSON)) 16793 - #else 16794 - #set ($pinnedPosts = $pinnedPostsObj.getProperty('posts').value) 16795 - #end 16796 - #end 16797 - #if ($postIndex == 0 && $pinnedPosts.size() > 0) 16798 - \{\{html clean=~"false~"}} 16799 - #set ($x = 0) 16800 - #set ($showPinnedPostsButton = true) 16801 - #foreach ($pinnedPost in $pinnedPosts) 16802 - #if ($x == 0) 16803 - <div class=~"row flex-container~"> 16804 - #if ($showPinnedPostsButton) 16805 - #displayEditPinnedPostsButton() 16806 - #set($showPinnedPostsButton = false) 16807 - #end 16808 - #end 16809 - #set ($pinnedPostDoc = $xwiki.getDocument($pinnedPost)) 16810 - #getEntryObject($pinnedPostDoc $pinnedPostObj) 16811 - #if (~"$!pinnedPostObj~" != '') 16812 - #displayPinnedPost($pinnedPostDoc $pinnedPostObj) 16813 - #end 16814 - #set ($x = $mathtool.add($x, 1)) 16815 - #if ($x == 3) 16816 - #set ($x = 0) 16817 - </div> 16818 - #end 16819 - #end 16820 - #if ($mathtool.mod($x, 3) != 0) 16821 - </div> 16822 - #end 16823 - \{\{/html}} 16824 - 16825 - ## If the first post is a pinned post : this means that all the posts are pinned 16826 - ## In this case, avoid displaying the posts again after the pinned posts section. 16827 - #if ($pinnedPosts.contains($xcontext.macro.params.reference)) 16828 - #set ($stopBlogPostsDisplay = true) 16829 - #end 16830 - #elseif($postIndex == 0 && $pinnedPosts.size() == 0) 16831 - 16832 - \{\{html}} 16833 - <div class=~"row no-pinnded-posts~"> 16834 - #displayEditPinnedPostsButton() 16835 - </div> 16836 - \{\{/html}} 16837 - 16838 - #end 16839 - #end 16840 - #if (!$stopBlogPostsDisplay) 16841 - \{\{html clean=~"false~"}} 16842 - #if (~"$!nbDisplayedPosts~" == '' || $postIndex == 0) 16843 - #set ($nbDisplayedPosts = 0) 16844 - #end 16845 - #if($mathtool.mod($nbDisplayedPosts, 2) == 0) 16846 - #if ($nbDisplayedPosts != 0) 16847 - </div> 16848 - #set ($lastHtmlTag = 'c') 16849 - #end 16850 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 16851 - <div class=~"row~"> 16852 - #set ($lastHtmlTag = 'o') 16853 - #set ($lastRowClass = ~"~") 16854 - #else 16855 - <div class=~"row flex-container~"> 16856 - #set ($lastHtmlTag = 'o') 16857 - #set ($lastRowClass = ~"flex~") 16858 - #end 16859 - #end 16860 - #displaySmallPost($postDoc $postObj) 16861 - #if ($nbDisplayedPosts == $mathtool.sub($listResultsCount, 1)) 16862 - </div> 16863 - #set ($lastHtmlTag = 'c') 16864 - #end 16865 - #set ($nbDisplayedPosts = $mathtool.add($nbDisplayedPosts, 1)) 16866 - #if ($postIndex == $mathtool.sub($listResultsCount, 1)) 16867 - #if (~"$!lastHtmlTag~" == 'o') 16868 - #if ($mathtool.mod($nbDisplayedPosts, 2) == 1 && $lastRowClass == ~"flex~") 16869 - <div class=~"col-xs-12 col-sm-6~"></div> 16870 - #end 16871 - </div> 16872 - #end 16873 - #end 16874 - \{\{/html}} 16875 - #end 16876 - #else 16877 - \{\{error}}$services.localization.render('blog.blogpostlayout.notpost', [$xcontext.macro.params.reference])\{\{/error}} 16878 - #end 16879 - #else 16880 - \{\{error}}$services.localization.render('blog.blogpostlayout.post_view_not_allowed', [$xcontext.macro.params.reference])\{\{/error}} 16881 - #end" %) 16882 -((( 16883 -(% class="macro-placeholder hidden" %) 16884 -((( 16885 -macro:velocity 16886 -))) 16887 - 16888 -(% class="macro" data-macro="startmacro:html|-|clean=~"false~"|-|<div class=~"col-xs-12 col-sm-6 next_blog~"> 16889 -<a href=~"/Nieuws/Aankondiging%20update%20Syntess%206.9.0.0166~" class=~"thumbnail~"> 16890 -<div class=~"row~"> 16891 -<div class=~"col-xs-4~"> 16892 -<img src=~"/download/Nieuws/Aankondiging%20update%20Syntess%206.9.0.0166/giphy9.gif?width=600&rev=1.1~" /> 16893 -</div> 16894 -<div class=~"col-xs-8 art_det~"> 16895 -<p class=~"text-left~"> 16896 -Aankondiging update Syntess 6.9.0.0166 <br/><span class=~"date_info~"> Nov 21, 2023, </span> 16897 -</p> 16898 -<div class=~"row post-details~"> 16899 -<div class=~"col-xs-8 detail~"> 16900 -<div class=~"post-likes btn btn-default disabled badge~" 16901 -title=~"Number of likes on this page: 0~"> 16902 -<span class=~"fa fa-heart~"></span> <span class=~"like-number~">0</span> 16903 -</div> 16904 -</div> 16905 -<div class=~"col-xs-4 com_det~"> 16906 -<p class=~"text-right~"><span class=~"fa fa-comments~"></span> (0)</p> 16907 -</div> 16908 -</div> 16909 -</div> 16910 -</div> 16911 -</a> 16912 -</div> 16913 -</div>" %) 16914 -((( 16915 -(% class="macro-placeholder hidden" %) 16916 -((( 16917 -macro:html 16918 -))) 16919 - 16920 -(% class="col-xs-12 col-sm-6 next_blog" %) 16921 -((( 16922 -(% class="row" %) 16923 -((( 16924 -(% class="col-xs-4" %) 16925 -((( 16926 -[[~[~[image:/download/Nieuws/Aankondiging%20update%20Syntess%206.9.0.0166/giphy9.gif?width=600&rev=1.1~]~]>>path:/Nieuws/Aankondiging%20update%20Syntess%206.9.0.0166||class="thumbnail"]] 16927 -))) 16928 - 16929 -(% class="col-xs-8 art_det" %) 16930 -((( 16931 -(% class="text-left" %) 16932 -[[Aankondiging update Syntess 6.9.0.0166 16933 -(% class="date_info" %) Nov 21, 2023,>>path:/Nieuws/Aankondiging%20update%20Syntess%206.9.0.0166||class="thumbnail"]] 16934 - 16935 -(% class="row post-details" %) 16936 -((( 16937 -(% class="col-xs-8 detail" %) 16938 -((( 16939 -(% class="post-likes btn btn-default disabled badge" title="Number of likes on this page: 0" %) 16940 -((( 16941 -[[(% class="like-number" %)0>>path:/Nieuws/Aankondiging%20update%20Syntess%206.9.0.0166||class="thumbnail"]] 16942 -))) 16943 -))) 16944 - 16945 -(% class="col-xs-4 com_det" %) 16946 -((( 16947 -(% class="text-right" %) 16948 -[[(0)>>path:/Nieuws/Aankondiging%20update%20Syntess%206.9.0.0166||class="thumbnail"]] 16949 -))) 16950 -))) 16951 -))) 16952 -))) 16953 -))) 16954 -))) 16955 -))) 16956 -))) 16957 -))) 16958 -))) 16959 -))) 16960 -))) 16961 -))) 16962 -))) 16963 -))) 16964 - 16965 -(% style="background:url(~"https://kennis.wardenburg.nl/webjars/wiki%3Axwiki/xwiki-platform-ckeditor-webjar/15.8/plugins/widget/images/handle.png~") rgba(220, 220, 220, 0.5); left:0px; top:-15px" %)[[image:data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==||height="15" role="presentation" title="Click and drag to move" width="15"]] 16966 -))) 16967 - 16968 - 16969 - 16970 -))) 16971 - 16972 -(% aria-label="macro:velocity widget" contenteditable="false" role="region" tabindex="-1" %) 16973 -((( 16974 -(% class="macro" data-macro="startmacro:velocity|-||-|#if (!$hasEdit) 47 +{{velocity}} 48 +#if (!$hasEdit) 16975 16975 ## Verstop tabs 16976 16976 #set($displayDocExtra = false) 16977 16977 ## En de balken onderin 16978 16978 #set ($displayShortcuts = false) 16979 -#end" data-widget="xwiki-macro" data-xwiki-dom-updated="true" %) 16980 -((( 16981 -(% class="macro-placeholder" %) 16982 -((( 16983 -macro:velocity 16984 -))) 16985 -))) 16986 - 16987 -(% style="background-color:rgba(220,220,220,0.5)" %)[[image:data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==||height="15" role="presentation" title="Click and drag to move" width="15"]] 16988 -))) 53 +#end 54 +{{/velocity}}
- Preloader_blauw.gif
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.Jesse - Size
-
... ... @@ -1,0 +1,1 @@ 1 +3.3 MB - Content
- Preloader_oranje.gif
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.Jesse - Size
-
... ... @@ -1,0 +1,1 @@ 1 +2.0 MB - Content