#!/usr/bin/env python # -*- coding=UTF-8 -*- # ************************************************************************** # Copyright © 2016 jianglin # File Name: filter.py # Author: jianglin # Email: xiyang0807@gmail.com # Created: 2016-06-15 00:39:29 (CST) # Last Update:星期一 2016-7-25 20:58:51 (CST) # By: # Description: # ************************************************************************** from datetime import datetime from maple import redis_data, cache from maple.settings import setting from maple.topic.models import Reply, Topic from maple.user.models import User from flask import Markup, g from misaka import Markdown, HtmlRenderer from pygments import highlight from pygments.formatters import HtmlFormatter from pygments.lexers import get_lexer_by_name from bleach import clean def safe_clean(text): tags = ['b', 'i', 'font', 'br', 'blockquote', 'div', 'h2'] attrs = {'*': ['style', 'id', 'class'], 'font': ['color']} styles = ['color'] return Markup(clean(text, tags=tags, attributes=attrs, styles=styles)) class Filters(object): def safe_markdown(text): class HighlighterRenderer(HtmlRenderer): def blockcode(self, text, lang): lang = 'python' if not lang: return '\n
{}
\n'.format(text.strip(
))
lexer = get_lexer_by_name(lang, stripall=True)
formatter = HtmlFormatter()
return highlight(text, lexer, formatter)
renderer = HighlighterRenderer()
md = Markdown(renderer, extensions=('fenced-code', ))
return Markup(md(safe_clean(text)))
# return Markup(md(text))
def timesince(dt, default="just now"):
from flask_babelex import format_datetime
now = datetime.utcnow()
diff = now - dt
if diff.days > 10:
return format_datetime(dt, 'Y-M-d H:m')
elif diff.days <= 10 and diff.days > 0:
periods = ((diff.days, "day", "days"), )
elif diff.days <= 0 and diff.seconds > 3600:
periods = ((diff.seconds / 3600, "hour", "hours"), )
elif diff.seconds <= 3600 and diff.seconds > 90:
periods = ((diff.seconds / 60, "minute", "minutes"), )
else:
return default
for period, singular, plural in periods:
if period:
return "%d %s ago" % (period, singular if period == 1 else
plural)
return default
def show_time():
from flask_babelex import format_datetime
if g.user.is_authenticated:
return 'LOCALE:' + format_datetime(datetime.utcnow())
else:
return 'UTC:' + format_datetime(datetime.utcnow())
def get_user_infor(name):
user = User.query.filter(User.username == name).first()
return user
@cache.memoize(timeout=60)
def get_last_reply(uid):
reply = Reply.query.join(Reply.topic).filter(Topic.id == uid).first()
return reply
@cache.memoize(timeout=30)
def get_read_count(id):
read = redis_data.hget('topic:%s' % str(id), 'read')
replies = redis_data.hget('topic:%s' % str(id), 'replies')
if not read:
read = 0
else:
read = int(read)
if not replies:
replies = 0
else:
replies = int(replies)
return replies, read
@cache.memoize(timeout=30)
def is_collected(topicId):
from maple.topic.models import CollectTopic
from flask_login import current_user
for collect in current_user.collects:
cid = CollectTopic.query.filter_by(collect_id=collect.id,
topic_id=topicId).first()
if cid is not None:
return True
return False
def notice_count():
from maple.forums.models import Notice
if g.user.is_authenticated:
count = Notice.query.filter_by(rece_id=g.user.id,
is_read=False).count()
if count > 0:
return count
return None
@cache.memoize(timeout=60)
def hot_tags():
from maple.tag.models import Tags
tags = Tags.query.order_by(Tags.time.desc()).limit(9).all()
return tags
@cache.memoize(timeout=60)
def recent_tags():
from maple.tag.models import Tags
tags = Tags.query.order_by(Tags.time.desc()).limit(12).all()
return tags
class Title(object):
title = setting['title']
picture = setting['picture']
description = setting['description']