comparison src/server/blog.py @ 702:d94feb0d849e

server_side: give a better look to the static blog
author souliane <souliane@mailoo.org>
date Mon, 11 May 2015 14:54:41 +0200
parents 82123705474b
children 5319110a862c
comparison
equal deleted inserted replaced
701:9aa2e251a993 702:d94feb0d849e
233 base_url = root_url + 'blog/' + user 233 base_url = root_url + 'blog/' + user
234 234
235 def getOption(key): 235 def getOption(key):
236 return sanitizeHtml(options[key]).encode('utf-8') if key in options else '' 236 return sanitizeHtml(options[key]).encode('utf-8') if key in options else ''
237 237
238 def getImageOption(key, alt): 238 def getImageOption(key, default, alt):
239 """regexp from http://answers.oreilly.com/topic/280-how-to-validate-urls-with-regular-expressions/""" 239 """regexp from http://answers.oreilly.com/topic/280-how-to-validate-urls-with-regular-expressions/"""
240 url = options[key].encode('utf-8') if key in options else '' 240 url = options[key].encode('utf-8') if key in options else ''
241 regexp = r"^(https?|ftp)://[a-z0-9-]+(\.[a-z0-9-]+)+(/[\w-]+)*/[\w-]+\.(gif|png|jpg)$" 241 regexp = r"^(https?|ftp)://[a-z0-9-]+(\.[a-z0-9-]+)+(/[\w-]+)*/[\w-]+\.(gif|png|jpg)$"
242 return "<img src='%(url)s' alt='%(alt)s'/>" % {'alt': alt, 'url': url} if re.match(regexp, url) else alt 242 if re.match(regexp, url):
243 243 url = url
244 suffix = "<br/>"
245 else:
246 url = default
247 suffix = ""
248 return "<img src='%(url)s' alt='%(alt)s'/>%(suffix)s" % {'alt': alt, 'url': url, 'suffix': suffix}
249
250 avatar = os.path.normpath(root_url + getOption('avatar'))
251 title = getOption(C.STATIC_BLOG_PARAM_TITLE) or user
244 request.write(""" 252 request.write("""
245 <html> 253 <html>
246 <head> 254 <head>
247 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 255 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
248 <meta name="keywords" content="%(keywords)s"> 256 <meta name="keywords" content="%(keywords)s">
251 <link rel="stylesheet" type="text/css" href="%(root)scss/blog.css" /> 259 <link rel="stylesheet" type="text/css" href="%(root)scss/blog.css" />
252 <link rel="icon" type="image/png" href="%(favicon)s"> 260 <link rel="icon" type="image/png" href="%(favicon)s">
253 <title>%(title)s</title> 261 <title>%(title)s</title>
254 </head> 262 </head>
255 <body> 263 <body>
256 <div class="mblog_title"><a href="%(base)s">%(banner_elt)s</a></div> 264 <div class="mblog_title"><a href="%(base)s">%(banner_elt)s%(title_elt)s</a></div>
257 """ % {'base': base_url, 265 """ % {'base': base_url,
258 'root': root_url, 266 'root': root_url,
259 'user': user, 267 'user': user,
260 'keywords': getOption(C.STATIC_BLOG_PARAM_KEYWORDS), 268 'keywords': getOption(C.STATIC_BLOG_PARAM_KEYWORDS),
261 'description': getOption(C.STATIC_BLOG_PARAM_DESCRIPTION), 269 'description': getOption(C.STATIC_BLOG_PARAM_DESCRIPTION),
262 'title': getOption(C.STATIC_BLOG_PARAM_TITLE) or "%s's microblog" % user, 270 'title': getOption(C.STATIC_BLOG_PARAM_TITLE) or "%s's microblog" % user,
263 'favicon': os.path.normpath(root_url + getOption('avatar')), 271 'favicon': avatar,
264 'banner_elt': getImageOption(C.STATIC_BLOG_PARAM_BANNER, getOption(C.STATIC_BLOG_PARAM_TITLE) or user)}) 272 'banner_elt': getImageOption(C.STATIC_BLOG_PARAM_BANNER, avatar, title),
273 'title_elt': title,
274 })
265 mblog_data, main_rsm = mblog_data 275 mblog_data, main_rsm = mblog_data
266 display_single = len(mblog_data) == 1 276 display_single = len(mblog_data) == 1
267 277
268 # build the navigation links 278 # build the navigation links
269 count = int(main_rsm['count']) if 'count' in main_rsm else 0 279 count = int(main_rsm['count']) if 'count' in main_rsm else 0
271 index = int(main_rsm['index']) 281 index = int(main_rsm['index'])
272 if index > 0: 282 if index > 0:
273 before_link = ("%(base)s?before=%(item_id)s" % {'base': base_url, 'item_id': main_rsm['first']}).encode('utf-8') 283 before_link = ("%(base)s?before=%(item_id)s" % {'base': base_url, 'item_id': main_rsm['first']}).encode('utf-8')
274 if display_single: 284 if display_single:
275 before_link += '&max=1' 285 before_link += '&max=1'
276 tmp_text = D_("Later message") 286 tmp_text = D_("later message")
277 class_ = 'later_message' 287 class_ = 'later_message'
278 else: 288 else:
279 tmp_text = D_("Later messages") 289 tmp_text = D_("later messages")
280 class_ = 'later_messages' 290 class_ = 'later_messages'
281 before_tag = """<a href="%(link)s" class="%(class)s">%(text)s</a>""" % {'link': before_link, 'class': class_, 'text': tmp_text} 291 before_tag = """<a href="%(link)s" class="%(class)s">%(text)s</a>""" % {'link': before_link, 'class': class_, 'text': tmp_text}
282 else: 292 else:
283 before_tag = None 293 before_tag = None
284 if index + len(mblog_data) < count: 294 if index + len(mblog_data) < count:
285 after_link = ("%(base)s?after=%(item_id)s" % {'base': base_url, 'item_id': main_rsm['last']}).encode('utf-8') 295 after_link = ("%(base)s?after=%(item_id)s" % {'base': base_url, 'item_id': main_rsm['last']}).encode('utf-8')
286 if display_single: 296 if display_single:
287 after_link += '&max=1' 297 after_link += '&max=1'
288 text = D_("Older message") 298 text = D_("older message")
289 class_ = 'older_message' 299 class_ = 'older_message'
290 else: 300 else:
291 text = D_("Older messages") 301 text = D_("older messages")
292 class_ = 'older_messages' 302 class_ = 'older_messages'
293 after_tag = """<a href="%(link)s" class="%(class)s">%(text)s</a>""" % {'link': after_link, 'class': class_, 'text': text} 303 after_tag = """<a href="%(link)s" class="%(class)s">%(text)s</a>""" % {'link': after_link, 'class': class_, 'text': text}
294 else: 304 else:
295 after_tag = None 305 after_tag = None
296 306
297 # display navigation header 307 # display navigation header
298 request.write("""<div class="header">""") 308 request.write("""<div class="header">""")
309 request.write("""<div class="header_content">""")
299 if before_tag: 310 if before_tag:
300 request.write(before_tag) 311 request.write(before_tag)
301 request.write("&nbsp;")
302 if display_single and after_tag: 312 if display_single and after_tag:
303 request.write(after_tag) 313 request.write(after_tag)
304 request.write("""</div>""") 314 request.write("""</div></div>""")
305 315
306 mblog_data = [(entry if isinstance(entry, tuple) else (entry, ([], {}))) for entry in mblog_data] 316 mblog_data = [(entry if isinstance(entry, tuple) else (entry, ([], {}))) for entry in mblog_data]
307 mblog_data = sorted(mblog_data, key=lambda entry: (-float(entry[0].get('updated', 0)))) 317 mblog_data = sorted(mblog_data, key=lambda entry: (-float(entry[0].get('updated', 0))))
308 for main_data, comments_data in mblog_data: 318 for main_data, comments_data in mblog_data:
309 self.__render_html_entry(main_data, base_url, request) 319 self.__render_html_entry(main_data, base_url, request)
324 for comment in comments: 334 for comment in comments:
325 self.__render_html_entry(comment, base_url, request) 335 self.__render_html_entry(comment, base_url, request)
326 336
327 # display navigation footer 337 # display navigation footer
328 request.write("""<div class="footer">""") 338 request.write("""<div class="footer">""")
339 request.write("""<div class="footer_content">""")
329 if not display_single and after_tag: 340 if not display_single and after_tag:
330 request.write(after_tag) 341 request.write(after_tag)
331 request.write("""</div>""") 342 request.write("""</div></div>""")
332 343
333 request.write('</body></html>') 344 request.write('</body></html>')
334 request.finish() 345 request.finish()
335 346
336 def __render_html_entry(self, entry, base_url, request): 347 def __render_html_entry(self, entry, base_url, request):