#!/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-4 19:10:0 (CST) # By: # Description: # ************************************************************************** from datetime import datetime from maple import redis_data from maple.settings import setting from maple.topic.models import Reply, Topic from maple.user.models import User from flask import Markup 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"): now = datetime.now() diff = now - dt if diff.days > 10: return dt.strftime('%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 get_last_reply(uid): reply = Reply.query.join(Reply.topic).filter(Topic.id == uid).first() return reply def get_user_infor(name): user = User.query.filter(User.username == name).first() return user 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 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 from flask import g 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 def hot_tags(): from maple.topic.models import Tags tags = Tags.query.order_by(Tags.time.desc()).limit(9).all() return tags def recent_tags(): from maple.topic.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']