filters.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #!/usr/bin/env python
  2. # -*- coding=UTF-8 -*-
  3. # **************************************************************************
  4. # Copyright © 2016 jianglin
  5. # File Name: filter.py
  6. # Author: jianglin
  7. # Email: xiyang0807@gmail.com
  8. # Created: 2016-06-15 00:39:29 (CST)
  9. # Last Update:星期三 2016-7-20 17:39:39 (CST)
  10. # By:
  11. # Description:
  12. # **************************************************************************
  13. from datetime import datetime
  14. from maple import redis_data
  15. from maple.settings import setting
  16. from maple.topic.models import Reply, Topic
  17. from maple.user.models import User
  18. from flask import Markup
  19. from misaka import Markdown, HtmlRenderer
  20. from pygments import highlight
  21. from pygments.formatters import HtmlFormatter
  22. from pygments.lexers import get_lexer_by_name
  23. from bleach import clean
  24. def safe_clean(text):
  25. tags = ['b', 'i', 'font', 'br', 'blockquote', 'div', 'h2']
  26. attrs = {'*': ['style', 'id', 'class'], 'font': ['color']}
  27. styles = ['color']
  28. return Markup(clean(text, tags=tags, attributes=attrs, styles=styles))
  29. class Filters(object):
  30. def safe_markdown(text):
  31. class HighlighterRenderer(HtmlRenderer):
  32. def blockcode(self, text, lang):
  33. lang = 'python'
  34. if not lang:
  35. return '\n<pre><code>{}</code></pre>\n'.format(text.strip(
  36. ))
  37. lexer = get_lexer_by_name(lang, stripall=True)
  38. formatter = HtmlFormatter()
  39. return highlight(text, lexer, formatter)
  40. renderer = HighlighterRenderer()
  41. md = Markdown(renderer, extensions=('fenced-code', ))
  42. return Markup(md(safe_clean(text)))
  43. # return Markup(md(text))
  44. def timesince(dt, default="just now"):
  45. now = datetime.now()
  46. diff = now - dt
  47. if diff.days > 10:
  48. return dt.strftime('%Y-%m-%d %H:%M')
  49. elif diff.days <= 10 and diff.days > 0:
  50. periods = ((diff.days, "day", "days"), )
  51. elif diff.days <= 0 and diff.seconds > 3600:
  52. periods = ((diff.seconds / 3600, "hour", "hours"), )
  53. elif diff.seconds <= 3600 and diff.seconds > 90:
  54. periods = ((diff.seconds / 60, "minute", "minutes"), )
  55. else:
  56. return default
  57. for period, singular, plural in periods:
  58. if period:
  59. return "%d %s ago" % (period, singular if period == 1 else
  60. plural)
  61. return default
  62. def get_last_reply(uid):
  63. reply = Reply.query.join(Reply.topic).filter(Topic.id == uid).first()
  64. return reply
  65. def get_user_infor(name):
  66. user = User.query.filter(User.username == name).first()
  67. return user
  68. def get_read_count(id):
  69. read = redis_data.hget('topic:%s' % str(id), 'read')
  70. replies = redis_data.hget('topic:%s' % str(id), 'replies')
  71. if not read:
  72. read = 0
  73. else:
  74. read = int(read)
  75. if not replies:
  76. replies = 0
  77. else:
  78. replies = int(replies)
  79. return replies, read
  80. def is_collected(topicId):
  81. from maple.topic.models import CollectTopic
  82. from flask_login import current_user
  83. for collect in current_user.collects:
  84. cid = CollectTopic.query.filter_by(collect_id=collect.id,
  85. topic_id=topicId).first()
  86. if cid is not None:
  87. return True
  88. return False
  89. def notice_count():
  90. from maple.forums.models import Notice
  91. from flask import g
  92. if g.user.is_authenticated:
  93. count = Notice.query.filter_by(rece_id=g.user.id,
  94. is_read=False).count()
  95. if count > 0:
  96. return count
  97. return None
  98. def hot_tags():
  99. from maple.tag.models import Tags
  100. tags = Tags.query.order_by(Tags.time.desc()).limit(9).all()
  101. return tags
  102. def recent_tags():
  103. from maple.tag.models import Tags
  104. tags = Tags.query.order_by(Tags.time.desc()).limit(12).all()
  105. return tags
  106. class Title(object):
  107. title = setting['title']
  108. picture = setting['picture']
  109. description = setting['description']