日志消息中也去除链接
[gaetalk.git] / utils.py
blob861af367b86900ec30e337ce10427f10a0f10187
1 #!/usr/bin/env python2
2 # vim:fileencoding=utf-8
4 import re
5 import unicodedata
6 import time
7 import config
8 import urllib
10 from google.appengine.api import memcache
11 from google.appengine.api import urlfetch
13 timeParser = re.compile(r'^(\d+)([smhd])?$')
14 linkre = re.compile(r' <https?://(?!i.imgur.com/)[^>]+>')
15 linkjsre = re.compile(r' <javascript:[^>]+>')
16 timeUnitMap = {
17 '': 1,
18 's': 1,
19 'm': 60,
20 'h': 3600,
21 'd': 86400,
23 timeZhUnitMap = (60, 60, 24, 36524)
24 timeZhUnits = (u'秒', u'分', u'小时', u'天')
26 def filesize(size):
27 '''将 数字 转化为 xxKiB 的形式'''
28 units = 'KMGT'
29 left = abs(size)
30 unit = -1
31 while left > 1100 and unit < 3:
32 left = left / 1024
33 unit += 1
34 if unit == -1:
35 return '%dB' % size
36 else:
37 if size < 0:
38 left = -left
39 return '%.1f%siB' % (left, units[unit])
41 def strftime(time, timezone, show_date=False):
42 '''将时间转换为字符串,考虑时区,可能带日期'''
43 if not show_date:
44 format = '%H:%M:%S'
45 else:
46 format = '%m-%d %H:%M:%S'
47 return (time + timezone).strftime(format)
49 def parseTime(s):
50 '''将 3s,5d,1h,6m 等转换成秒数'''
51 m = timeParser.match(s)
52 if m is None:
53 raise ValueError('not a time')
54 n = int(m.group(1))
55 u = m.group(2)
56 if u is None:
57 return n
58 else:
59 return n * timeUnitMap[u]
61 def displayTime(t):
62 '''友好地显示时间'''
63 r = []
64 for i in timeZhUnitMap:
65 r.append(t % i)
66 t = t // i
67 if t == 0:
68 break
69 return u''.join(reversed(map(lambda x, y: unicode(x)+y if x else u'', r, timeZhUnits)))
71 def checkNick(nick):
72 '''判断一个昵称是否合法'''
73 if len(nick.encode('utf-8')) > config.nick_maxlen:
74 return False
75 for i in nick:
76 cat = unicodedata.category(i)
77 # Lt & Lm are special chars
78 if (not (cat.startswith('L') or cat.startswith('N')) or cat in ('Lm', 'Lt')) \
79 and i not in config.allowedSymbolInNick:
80 return False
81 return True
83 def removelinks(msg):
84 '''清除多余的链接文本'''
85 links = linkre.findall(msg)
86 if len(links) != 1:
87 msg = linkre.sub('', msg)
88 msg = linkjsre.sub('', msg)
89 return msg
91 class MemLock:
92 def __init__(self, name):
93 self.name = name
95 def require(self):
96 while memcache.get(self.name):
97 time.sleep(0.001)
98 memcache.set(self.name, True)
100 def release(self):
101 memcache.set(self.name, False)