jinja.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # **************************************************************************
  4. # Copyright © 2016 jianglin
  5. # File Name: jinja.py
  6. # Author: jianglin
  7. # Email: xiyang0807@gmail.com
  8. # Created: 2016-11-07 21:00:32 (CST)
  9. # Last Update: 星期日 2018-02-11 15:06:58 (CST)
  10. # By:
  11. # Description:
  12. # **************************************************************************
  13. from datetime import datetime
  14. from config import SITE
  15. from bleach import clean
  16. from flask import Markup, g
  17. from flask_babelex import format_datetime
  18. from misaka import HtmlRenderer, Markdown
  19. def safe_clean(text):
  20. tags = ['b', 'i', 'font', 'br', 'blockquote', 'div', 'h2', 'a', 'p']
  21. attrs = {'*': ['style', 'id', 'class'], 'font': ['color'], 'a': ['href']}
  22. styles = ['color']
  23. return Markup(clean(text, tags=tags, attributes=attrs, styles=styles))
  24. def markdown(text):
  25. renderer = HtmlRenderer()
  26. md = Markdown(renderer, extensions=('fenced-code', ))
  27. return Markup(md(text))
  28. def safe_markdown(text):
  29. renderer = HtmlRenderer()
  30. md = Markdown(renderer, extensions=('fenced-code', ))
  31. return Markup(safe_clean(md(text)))
  32. def timesince(dt, default="just now"):
  33. now = datetime.utcnow()
  34. diff = now - dt
  35. if diff.days > 10:
  36. return format_datetime(dt, 'Y-M-d H:m')
  37. elif diff.days <= 10 and diff.days > 0:
  38. periods = ((diff.days, "day", "days"), )
  39. elif diff.days <= 0 and diff.seconds > 3600:
  40. periods = ((diff.seconds / 3600, "hour", "hours"), )
  41. elif diff.seconds <= 3600 and diff.seconds > 90:
  42. periods = ((diff.seconds / 60, "minute", "minutes"), )
  43. else:
  44. return default
  45. for period, singular, plural in periods:
  46. if period:
  47. return "%d %s ago" % (period, singular if period == 1 else plural)
  48. return default
  49. def show_time():
  50. from flask_babelex import format_datetime
  51. if g.user.is_authenticated:
  52. return 'LOCALE:' + format_datetime(datetime.utcnow())
  53. else:
  54. return 'UTC:' + format_datetime(datetime.utcnow())
  55. def hot_tags():
  56. from forums.api.tag.models import Tags
  57. tags = Tags.query.limit(9).all()
  58. return tags
  59. def recent_tags():
  60. from forums.api.tag.models import Tags
  61. tags = Tags.query.limit(12).all()
  62. return tags
  63. def forums_count():
  64. from forums.extension import redis_data
  65. key = 'count:forums'
  66. return redis_data.hgetall(key)
  67. def init_app(app):
  68. app.jinja_env.globals['SITE'] = SITE
  69. app.jinja_env.globals['hot_tags'] = hot_tags
  70. app.jinja_env.globals['recent_tags'] = recent_tags
  71. app.jinja_env.globals['show_time'] = show_time
  72. app.jinja_env.globals['forums_count'] = forums_count
  73. app.jinja_env.filters['timesince'] = timesince
  74. app.jinja_env.filters['safe_clean'] = safe_clean