filters.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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-6-17 13:36:44 (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', 'a', 'div', 'ul', 'li', 'h2']
  26. attrs = {'*': ['style', 'id', 'class'], 'font': ['color'], 'a': ['href']}
  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. if diff.days <= 10 and diff.days > 0:
  50. periods = ((diff.days, "day", "days"), )
  51. if diff.days <= 0 and diff.seconds > 3600:
  52. periods = ((diff.seconds / 3600, "hour", "hours"), )
  53. if diff.seconds <= 3600 and diff.seconds > 90:
  54. periods = ((diff.seconds / 60, "minute", "minutes"), )
  55. if diff.seconds <= 90:
  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. class Title(object):
  81. title = setting['title']
  82. picture = setting['picture']
  83. description = setting['description']