├── .gitignore
├── demo_tornado.py
├── readme.md
└── simple_avatar.py
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 |
5 | # C extensions
6 | *.so
7 |
8 | # Distribution / packaging
9 | .Python
10 | env/
11 | build/
12 | develop-eggs/
13 | dist/
14 | eggs/
15 | lib64/
16 | parts/
17 | sdist/
18 | var/
19 | *.egg-info/
20 | .installed.cfg
21 | *.egg
22 |
23 | # Installer logs
24 | pip-log.txt
25 | pip-delete-this-directory.txt
26 |
27 | # Unit test / coverage reports
28 | htmlcov/
29 | .tox/
30 | .coverage
31 | .cache
32 | nosetests.xml
33 | coverage.xml
34 |
35 | # Translations
36 | *.mo
37 | *.pot
38 |
39 | # Django stuff:
40 | *.log
41 |
42 | # Sphinx documentation
43 | docs/_build/
44 |
45 | .idea
46 | database.db
47 | .py~
48 | .md~
49 | .gitignore~
50 |
--------------------------------------------------------------------------------
/demo_tornado.py:
--------------------------------------------------------------------------------
1 | # coding:utf-8
2 |
3 | import sys
4 | import tornado.ioloop
5 | import tornado.web
6 | from simple_avatar import get_avatar_html
7 |
8 | py_ver = sys.version_info.major
9 |
10 | if py_ver == 3:
11 | unichr = chr
12 |
13 | tmpl = """
14 |
15 |
16 |
17 |
46 |
47 |
48 |
49 | Demo 1 |
50 | Demo 2
51 |
52 |
53 | %s
54 |
55 |
56 |
57 | """
58 |
59 |
60 | class MainHandler(tornado.web.RequestHandler):
61 | def get(self):
62 | self.redirect('/demo1')
63 |
64 |
65 | class DemoHandler1(tornado.web.RequestHandler):
66 | def get(self):
67 | self.write(tmpl % """
68 | %s
69 | %s
70 | %s
71 | %s
72 | %s
73 | %s
74 |
75 | %s
76 | %s
77 | %s
78 | %s
79 | """ % (get_avatar_html('s', 48),get_avatar_html('i', 32),get_avatar_html('m', 32),get_avatar_html('p', 32),get_avatar_html('l', 32), get_avatar_html('e', 32),
80 | get_avatar_html('中', 56), get_avatar_html('文', 56), get_avatar_html('测中文测试', 56), get_avatar_html('试中文测试', 56)
81 | ))
82 |
83 |
84 | class DemoHandler2(tornado.web.RequestHandler):
85 | def get(self):
86 | lst = []
87 | for i in range(1, 51):
88 | lst.append(get_avatar_html(str(i), 48, ecls=['avatar-box']))
89 | for i in range(ord(u'一'), ord(u'一') + 50):
90 | lst.append(get_avatar_html(unichr(i), 48, ecls=['avatar-box']))
91 | text = ' '.join(lst)
92 |
93 | self.write(tmpl % text)
94 |
95 |
96 | def make_app():
97 | return tornado.web.Application([
98 | (r"/", MainHandler),
99 | (r"/demo1", DemoHandler1),
100 | (r"/demo2", DemoHandler2),
101 | ], debug=True)
102 |
103 | if __name__ == "__main__":
104 | app = make_app()
105 | app.listen(8888)
106 | tornado.ioloop.IOLoop.current().start()
107 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | # Simple Avatar
2 |
3 | 
4 |
5 | Use first character to generate avatar.
6 |
7 | Tested on py2.7/py3.4
8 |
9 | ```python
10 | >>>> from simple_avatar import get_background_color, avatar_generate, get_avatar_html
11 |
12 | >>>> print(get_background_color('Test'))
13 | #0cbc66
14 |
15 | >>>> print(avatar_generate('Test', '#0cbc66', 32))
16 | T
17 |
18 | >>>> print(get_avatar_html('测试', 32))
19 | 测
20 |
21 | ```
22 |
23 | demo:
24 |
25 | ```bash
26 | python demo_tornado.py
27 | ```
28 |
--------------------------------------------------------------------------------
/simple_avatar.py:
--------------------------------------------------------------------------------
1 | # coding: utf-8
2 |
3 | """
4 | CSS:
5 | .sa-avatar {
6 | color: white;
7 | text-align: center;
8 | display: inline-block;
9 | -ms-user-select:none;
10 | -moz-user-select:none;
11 | -webkit-user-select: none;
12 | font-family: "Helvetica Neue",Arial,"Hiragino Sans GB","Hiragino Sans GB W3","Microsoft YaHei","Wenquanyi Micro Hei",sans-serif;
13 | }
14 | """
15 |
16 | import sys
17 | import hashlib
18 |
19 | py_ver = sys.version_info.major
20 |
21 |
22 | def get_background_color(txt):
23 | if py_ver == 3:
24 | return '#%s' % hashlib.md5(bytes(txt, 'utf-8')).hexdigest()[:6]
25 | else:
26 | # fix for py2
27 | if type(txt) == unicode:
28 | return '#%s' % hashlib.md5(txt.encode('utf-8')).hexdigest()[:6]
29 | else:
30 | return '#%s' % hashlib.md5(txt).hexdigest()[:6]
31 |
32 |
33 | def avatar_generate(txt, color, size, css_class='sa-avatar', ecls=None):
34 | """
35 | :param txt: text for generate
36 | :param color: css color, like #abc
37 | :param size: integer, box size
38 | :param css_class: str, default css_class
39 | :param ecls: list, extra css classes
40 | :return: html of avatar
41 | """
42 |
43 | params = {
44 | 'width': '%spx' % size,
45 | 'height': '%spx' % size,
46 | 'line-height': '%spx' % size,
47 | 'font-size': '%spx' % (size-10),
48 | 'background-color': color,
49 | }
50 |
51 | if py_ver == 3:
52 | char = txt[0]
53 | else:
54 | if type(txt) == str:
55 | char = txt.decode('utf-8')[0]
56 | else:
57 | char = txt[0]
58 |
59 | if ecls:
60 | css_classes = '%s %s' % (css_class, ' '.join(ecls))
61 | else:
62 | css_classes = css_class
63 |
64 | return u"""%s
"""\
65 | % (css_classes, ';'.join('%s:%s' % x for x in params.items()), char.upper())
66 |
67 |
68 | def get_avatar_html(txt, size, css_class='sa-avatar', ecls=None, color_func=get_background_color):
69 | return avatar_generate(txt, color_func(txt), size, css_class, ecls)
70 |
71 |
72 | if __name__ == '__main__':
73 | print(get_avatar_html('Test', 32))
74 | print(get_avatar_html('测试', 64))
75 | print(get_avatar_html('测试', 64, ecls=['test']))
76 |
--------------------------------------------------------------------------------