| Armin Ronacher | 0a1742e | 2007-03-03 21:58:44 +0100 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | """ |
| 3 | jinja webpage generator |
| 4 | ~~~~~~~~~~~~~~~~~~~~~~~ |
| 5 | """ |
| 6 | import os |
| Armin Ronacher | 9356b7b | 2007-03-13 22:29:01 +0100 | [diff] [blame] | 7 | import sys |
| 8 | import re |
| Armin Ronacher | 0a1742e | 2007-03-03 21:58:44 +0100 | [diff] [blame] | 9 | from codecs import open |
| 10 | from jinja import Environment, FileSystemLoader |
| 11 | from jinja.filters import stringfilter |
| 12 | from pygments import highlight |
| 13 | from pygments.lexers import get_lexer_by_name |
| 14 | from pygments.formatters import HtmlFormatter |
| 15 | |
| Armin Ronacher | 1560b62 | 2007-03-22 14:36:38 +0100 | [diff] [blame] | 16 | |
| Armin Ronacher | 9356b7b | 2007-03-13 22:29:01 +0100 | [diff] [blame] | 17 | _data_re = re.compile( |
| 18 | r'<!-- TITLE -->(?P<page_title>.*?)<!-- ENDTITLE -->.*?' |
| 19 | r'<!-- TOC -->(?P<page_toc>.*?)<!-- ENDTOC -->.*?' |
| 20 | r'<!-- BODY -->(?P<page_body>.*?)<!-- ENDBODY -->(?sm)' |
| 21 | ) |
| Armin Ronacher | 0a1742e | 2007-03-03 21:58:44 +0100 | [diff] [blame] | 22 | |
| 23 | formatter = HtmlFormatter(cssclass='syntax', encoding=None, style='pastie') |
| 24 | |
| Armin Ronacher | 34a18bf | 2007-03-11 15:09:44 +0100 | [diff] [blame] | 25 | env = Environment('<%', '%>', '<%=', '%>', loader=FileSystemLoader('.', |
| 26 | cache_folder='/tmp'), trim_blocks=True) |
| Armin Ronacher | 0a1742e | 2007-03-03 21:58:44 +0100 | [diff] [blame] | 27 | env.filters['pygmentize'] = stringfilter(lambda v, l: |
| 28 | highlight(v.strip(), get_lexer_by_name(l), formatter)) |
| 29 | |
| 30 | |
| 31 | def get_files(folder): |
| 32 | for fn in os.listdir(folder): |
| 33 | fn = os.path.join(folder, fn) |
| 34 | if os.path.isdir(fn): |
| 35 | for item in get_files(fn): |
| 36 | yield item |
| 37 | elif fn.endswith('.tmpl'): |
| 38 | yield fn |
| 39 | |
| 40 | |
| Armin Ronacher | 9356b7b | 2007-03-13 22:29:01 +0100 | [diff] [blame] | 41 | # generate static stuff |
| Armin Ronacher | 0a1742e | 2007-03-03 21:58:44 +0100 | [diff] [blame] | 42 | for filename in get_files('.'): |
| 43 | root = './' + ''.join(['../' for _ in os.path.dirname(filename). |
| 44 | split(os.path.sep)[1:]]) |
| 45 | |
| 46 | t = env.get_template(filename) |
| 47 | f = open(filename[:-5] + '.html', 'w', 'utf-8') |
| 48 | f.write(t.render( |
| Armin Ronacher | 0a1742e | 2007-03-03 21:58:44 +0100 | [diff] [blame] | 49 | root=root |
| 50 | )) |
| 51 | f.close() |
| Armin Ronacher | 9356b7b | 2007-03-13 22:29:01 +0100 | [diff] [blame] | 52 | print filename |
| Armin Ronacher | 0a1742e | 2007-03-03 21:58:44 +0100 | [diff] [blame] | 53 | |
| Armin Ronacher | 9356b7b | 2007-03-13 22:29:01 +0100 | [diff] [blame] | 54 | # generate pygments stylesheet |
| Armin Ronacher | 0a1742e | 2007-03-03 21:58:44 +0100 | [diff] [blame] | 55 | f = file('static/pygments.css', 'w') |
| 56 | f.write(formatter.get_style_defs('.syntax')) |
| 57 | f.close() |
| Armin Ronacher | 9356b7b | 2007-03-13 22:29:01 +0100 | [diff] [blame] | 58 | |
| 59 | # generate documentation |
| 60 | os.system(sys.executable + ' ../docs/generate.py documentation true') |
| 61 | |
| 62 | # render documentation with documentation template |
| 63 | tmpl = env.get_template('documentation/item.tmpl') |
| 64 | |
| 65 | for filename in os.listdir('documentation'): |
| 66 | if not filename.endswith('.html'): |
| 67 | continue |
| 68 | filename = 'documentation/' + filename |
| 69 | f = open(filename, 'r', 'utf-8') |
| 70 | try: |
| 71 | data = f.read() |
| 72 | finally: |
| 73 | f.close() |
| 74 | match = _data_re.search(data) |
| 75 | if match is None: |
| 76 | continue |
| 77 | data = match.groupdict() |
| 78 | data['page_toc'] = data['page_toc'].strip() |
| 79 | if data['page_toc'].count('</li') < 2: |
| 80 | data['page_toc'] = '' |
| 81 | f = open(filename, 'w', 'utf-8') |
| 82 | f.write(tmpl.render( |
| 83 | root='./../', |
| 84 | **data |
| 85 | )) |
| 86 | f.close() |
| 87 | print 'postprocessed', filename |