Última modificación por Administrator el 2014/10/29 07:38

Mostrar los últimos autores
1 {{include reference="Blog.BlogCode"/}}
2
3 {{velocity output="false"}}
4 ##
5 ##
6 ##
7 #**
8 * Display a blog as a RSS feed. The output corresponds to the RSS 1.0 specification, and it makes use of the Dublin
9 * Core module to specify metadata.
10 *
11 * @param blogDoc The XDocument corresponding to the blog to be syndicated.
12 * @param entries The entries to display. Usually, these are the last entries belonging to the blog.
13 *###
14 #macro(displayBlogRss $blogDoc $entries)
15 ## Create a Jodatime date formatter that will be used to format dates
16 #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern("yyyy-MM-dd'T'hh:mm:ssZZ"))
17 ## Set the right mimetype
18 $!response.setContentType('application/rss+xml')##
19 #setBlogRssCacheSettings()
20 #printBlogRssHeader()
21 #printBlogRssChannelDescription($blogDoc $entries)
22 #printBlogRssImage($blogDoc)
23 #printBlogRssItems($entries)
24 #printBlogRssFooter()
25 #end
26 ##
27 ##
28 ##
29 #**
30 * Display blog entries from all the wiki as a RSS feed. The output corresponds to the RSS 1.0 specification, and it
31 * makes use of the Dublin Core module to specify metadata.
32 *
33 * @param entries The entries to display. Usually, these are the last entries belonging to the blog.
34 *###
35 #macro(displayGlobalBlogRss $entries)
36 ## Create a Jodatime date formatter that will be used to format dates
37 #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern("yyyy-MM-dd'T'hh:mm:ssZZ"))
38 ## Set the right mimetype
39 $!response.setContentType('application/rss+xml')##
40 #setBlogRssCacheSettings()
41 #printBlogRssHeader()
42 #printGlobalBlogRssChannelDescription($entries)
43 #printWikiRssImage($blogDoc)
44 #printBlogRssItems($entries)
45 #printBlogRssFooter()
46 #end
47 ##
48 ##
49 ##
50 #**
51 * Display blog entries belonging to a target category as a RSS feed. The output corresponds to the RSS 1.0
52 * specification, and it makes use of the Dublin Core module to specify metadata.
53 *
54 * @param blogDoc The XDocument corresponding to the blog to be syndicated.
55 * @param categoryDoc The XDocument corresponding to the blog category to be syndicated.
56 * @param entries The entries to display. Usually, these are the last entries belonging to the blog.
57 *###
58 #macro(displayBlogCategoryRss $blogDoc $categoryDoc $entries)
59 ## Create a Jodatime date formatter that will be used to format dates
60 #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern("yyyy-MM-dd'T'hh:mm:ssZZ"))
61 ## Set the right mimetype
62 $!response.setContentType('application/rss+xml')##
63 #setBlogRssCacheSettings()
64 #printBlogRssHeader()
65 #printBlogCategoryRssChannelDescription($categoryDoc $entries)
66 #printBlogRssItems($entries)
67 #printBlogRssFooter()
68 #end
69 ##
70 ##
71 ##
72 #**
73 * Set the proper cache settings, both for the client (HTTP headers) and for the server (rendering cache).
74 *###
75 #macro(setBlogRssCacheSettings)
76 ## Internally cache the rendered RSS for 30 minutes, for better performance
77 ## TODO: This is disabled for security reasons. Since the cache doesn't take into account the current user, it might
78 ## serve hidden/unpublished entries to non-creators.
79 ## $!xcontext.setCacheDuration(1800)
80 ## Instruct the client to cache the response for 1 hour
81 #set($expires = $xwiki.jodatime.getMutableDateTime())##
82 $!expires.addHours(1)##
83 ## TODO: This has no effect, as the core contains a no-cache setting in com.xpn.xwiki.web.Utils
84 $!response.setDateHeader('Expires', $expires.millis)##
85 $!response.setHeader('Cache-Control', 'public')##
86 #end
87 ##
88 ##
89 ##
90 #**
91 * Print the start of the RSS: XML declaration and open root element.
92 *###
93 #macro(printBlogRssHeader)
94 <?xml version="1.0" encoding="$xwiki.encoding" ?>
95 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/">
96 #end
97 ##
98 ##
99 ##
100 #**
101 * Print the blog channel description: title, link, description, logo, creator, copyright, and the list of entries.
102 *
103 * @param blogDoc The XDocument corresponding to the blog to be displayed.
104 * @param entries The entries to display. Usually, these are the last entries belonging to the blog.
105 *###
106 #macro(printBlogRssChannelDescription $blogDoc $entries)
107 <channel rdf:about="$blogDoc.getURL()">
108 #getBlogTitle($blogDoc $title)
109 <title>$title</title>
110 <link>$blogDoc.getExternalURL()</link>
111 ## TODO: Add a Description field in the blog class
112 <description>$services.localization.render('xe.blog.code.description.space', [$blogDoc.space])</description>
113 #getWikiLogo($logoUrl)
114 <image rdf:resource="$logoUrl"/>
115 <dc:language>$blogDoc.defaultLanguage</dc:language>
116 <dc:rights>$escapetool.xml($xwiki.spaceCopyright)</dc:rights>
117 ## TODO: Usually this is not something meaningful. Maybe add some Blog object properties for these.
118 ## <dc:publisher>$escapetool.xml($xwiki.getUserName($blogDoc.author, false))</dc:publisher>
119 ## <dc:creator>$escapetool.xml($xwiki.getUserName($blogDoc.creator, false))</dc:creator>
120 <items>
121 <rdf:Seq>
122 ## This is just a list of blog entries, which are detailed below.
123 #foreach ($entryDoc in $entries)
124 #if($xwiki.hasAccessLevel('view', ${entryDoc.fullName}))
125 <rdf:li rdf:resource="$entryDoc.getExternalURL('view', "language=${entryDoc.realLanguage}")" />
126 #end
127 #end
128 </rdf:Seq>
129 </items>
130 </channel>
131 #end
132 ##
133 ##
134 ##
135 #**
136 * Print the wiki-wide channel description: title, link, description, logo, creator, copyright, and the list of entries.
137 *
138 * @param entries The entries to display. Usually, these are the last entries published in the wiki.
139 *###
140 #macro(printGlobalBlogRssChannelDescription $entries)
141 #set ($mainDoc = $xwiki.getDocument($services.model.resolveDocument('', 'default', $doc.documentReference.extractReference('WIKI'))))
142 <channel rdf:about="$mainDoc.getExternalURL()">
143 <title>$escapetool.xml($mainDoc.plainTitle)</title>
144 <link>$mainDoc.getExternalURL()</link>
145 ## TODO: Add a Description field in the blog class
146 <description>$services.localization.render('xe.blog.code.description.wiki')</description>
147 #getWikiLogo($logoUrl)
148 <image rdf:resource="$logoUrl"/>
149 <dc:rights>$escapetool.xml($xwiki.spaceCopyright)</dc:rights>
150 <dc:publisher>XWiki</dc:publisher>
151 <items>
152 <rdf:Seq>
153 ## This is just a list of blog entries, which are detailed below.
154 #foreach ($entryDoc in $entries)
155 #if($xwiki.hasAccessLevel('view', ${entryDoc.fullName}))
156 <rdf:li rdf:resource="$entryDoc.getExternalURL('view', "language=${entryDoc.realLanguage}")" />
157 #end
158 #end
159 </rdf:Seq>
160 </items>
161 </channel>
162 #end
163 ##
164 ##
165 ##
166 #**
167 * Print the blog channel description: title, link, description, logo, creator, copyright, and the list of entries.
168 *
169 * @param blogDoc The XDocument corresponding to the blog to be displayed.
170 * @param entries The entries to display. Usually, these are the last entries belonging to the blog.
171 *###
172 #macro(printBlogCategoryRssChannelDescription $categoryDoc $entries)
173 <channel rdf:about="$categoryDoc.getURL()">
174 <title>$services.localization.render($categoryDoc.getValue('name'))</title>
175 <link>$categoryDoc.getExternalURL()</link>
176 ## TODO: Add a Description field in the blog class
177 <description>$services.localization.render('xe.blog.code.description.category', [$categoryDoc.display('name')])</description>
178 <dc:rights>$escapetool.xml($xwiki.spaceCopyright)</dc:rights>
179 <items>
180 <rdf:Seq>
181 ## This is just a list of blog entries, which are detailed below.
182 #foreach ($entryDoc in $entries)
183 #if($xwiki.hasAccessLevel('view', ${entryDoc.fullName}))
184 <rdf:li rdf:resource="$entryDoc.getExternalURL('view', "language=${entryDoc.realLanguage}")" />
185 #end
186 #end
187 </rdf:Seq>
188 </items>
189 </channel>
190 #end
191 ##
192 ##
193 ##
194 #**
195 * Print the blog image description. Currently, this is the logo of the wiki.
196 *
197 * @param blogDoc The XDocument corresponding to the displayed blog.
198 *###
199 #macro(printBlogRssImage $blogDoc)
200 #getWikiLogo($logoUrl)
201 <image rdf:about="$logoUrl">
202 <title>Wiki Logo</title>
203 <url>$logoUrl</url>
204 <link>$blogDoc.getExternalURL()</link>
205 </image>
206 #end
207 ##
208 ##
209 ##
210 #**
211 * Print the syndicated blog entries. These are the detailed "item"s, which must be referenced above, in the channel
212 * description, as otherwise they are ignored.
213 *
214 * @param entries The entries to display. Usually, these are the last entries belonging to the blog.
215 *###
216 #macro(printBlogRssItems $entries)
217 ## Print all the entry details
218 #foreach ($entryDoc in $entries)
219 #if($xwiki.hasAccessLevel('view', ${entryDoc.fullName}))
220 #printBlogRssItem($entryDoc)
221 #end
222 #end
223 #end
224 ##
225 ##
226 ##
227 #**
228 * Print a blog entry in the RSS feed. besides the mandatory RSS elements (title, link, and description), also print
229 * some metadata in the Dublin Core vocabulary (creator, categories, date).
230 *
231 * @param entryDoc The XDocument corresponding to the displayed blog entry.
232 *###
233 #macro(printBlogRssItem $entryDoc)
234 #set($entryUrl = $entryDoc.getExternalURL('view', "language=${entryDoc.realLanguage}"))
235 #getEntryObject($entryDoc $entryObj)
236 #getEntryContent($entryDoc $entryObj true $entryContent)
237 #if($!entryDoc.syntax.toIdString() == 'xwiki/1.0')
238 #set($desc = $entryContent)
239 #else
240 #set($desc = $entryDoc.getRenderedContent($entryContent, $entryDoc.getSyntax().toIdString()))
241 #end
242 #set($desc = $escapetool.xml($desc))
243 <item rdf:about="$entryUrl">
244 <title>$escapetool.xml($entryDoc.display("title", "view", $entryObj))</title>
245 <link>$entryUrl</link>
246 <description>$desc</description>
247 ## Some metadata, using the Dublin Core extension to RSS.
248 ## TODO: Display this in a better way.
249 <dc:subject>$escapetool.xml($entryObj.display('category', 'view'))</dc:subject>
250 <dc:date>$dateFormatter.print($entryDoc.date.time)</dc:date>
251 <dc:creator>$escapetool.xml($xwiki.getUserName($entryDoc.creator, false))</dc:creator>
252 #if($entryDoc.creator != $entryDoc.author)
253 <dc:contributor>
254 <rdf:Description link="$xwiki.getURL($entryDoc.author)">
255 <rdf:value>$escapetool.xml($xwiki.getUserName($entryDoc.author, false))</rdf:value>
256 </rdf:Description>
257 </dc:contributor>
258 #end
259 </item>
260 #end
261 ##
262 ##
263 ##
264 #**
265 * Print the end of the RSS: close the root element.
266 *###
267 #macro(printBlogRssFooter)
268 </rdf:RDF>
269 #end
270 ##
271 ##
272 ##
273 #**
274 * Normally, this should be a Template eXtension, which would be used to display a blog as a RSS feed. Since TX are not
275 * yet implemented, the target blog should be passed in the URL. This macro determines exactly which blog should be
276 * syndicated. If the "blog" request parameter is not present, then the default Blog is used.
277 *
278 * @param blogDoc The resulting XDocument of the target blog.
279 *###
280 #macro(getTargetBlog $blogDoc)
281 #if("$!{request.blog}" != '')
282 #set($result = $xwiki.getDocument($request.blog))
283 #else
284 #getBlogDocument('Blog' $result)
285 #end
286 #set ($blogDoc = $NULL)
287 #setVariable ("$blogDoc" $result)
288 ## TODO: Check if the document has a Blog.BlogClass object.
289 #end
290 ##
291 ##
292 ##
293 #macro(printFieldContent $entryDoc $entryObj $fieldName)
294 $escapetool.xml($entryDoc.display($fieldName, 'view', $entryObj))#end
295 ##
296 ##
297 ##
298 #macro(getWikiLogo $logoUrl)
299 #set ($path = $xwiki.getSkinFile($xwiki.getSkinPreference('logo', 'logo.png')))
300 #set ($port = '')
301 #if (($request.scheme == 'http') && ($request.serverPort != 80))
302 #set ($port = ":${request.serverPort}")
303 #elseif (($request.scheme == 'https') && ($request.serverPort != 443))
304 #set ($port = ":${request.serverPort}")
305 #end
306 #set ($logoUrl = $NULL)
307 #setVariable ("$logoUrl" "${request.scheme}://${request.serverName}${port}${path}")
308 #end
309 {{/velocity}}