sta-log-gopher-index.py - stahg-gopher - Static Mercurial page generator for gopher
(HTM) hg clone https://bitbucket.org/iamleot/stahg-gopher
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
sta-log-gopher-index.py
---
1 #!/usr/bin/env python3.7
2
3
4 import re
5 import os
6
7
8 def gph_escape_entry(text):
9 """Render text entry `[...]' by escaping/translating characters"""
10 escaped_text = text.expandtabs().replace('|', '\|')
11
12 return escaped_text
13
14
15 def shorten(text, n=80):
16 """Shorten text to the first `n' character of first line"""
17 s, _, _ = text.partition('\n')
18
19 if len(s) > n:
20 s = s[:n - 1] + '…'
21
22 return s
23
24 if __name__ == '__main__':
25 import getopt
26 import sys
27
28 def usage():
29 print('usage: {} [-b baseprefix] stagit-dir|stahg-dir ...'.format(
30 sys.argv[0]))
31 exit(1)
32
33 try:
34 opts, args = getopt.getopt(sys.argv[1:], 'b:')
35 except:
36 usage()
37
38 if len(args) == 0:
39 usage()
40
41 base_prefix = ''
42 limit = None
43 for o, a in opts:
44 if o == '-b':
45 base_prefix = a
46
47 print('{:20} {:40} {}'.format('Name', 'Description', 'Last commit'))
48 for sd in args:
49 repo = description = date = ''
50 repo = os.path.basename(os.path.normpath(sd))
51 with open(os.path.join(sd, 'log.gph')) as f:
52 for l in f:
53 if not description and 'Log - ' in l:
54 description = l.split(' - ', maxsplit=2)[-1]
55 description = description.strip()
56 # XXX: simplify that
57 elif re.match('^\[1\|[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+', l):
58 r = re.match('^\[1\|([0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+)', l)
59 date = r.group(1)
60 f.close()
61 break
62
63 if repo and description and date:
64 print('[1|{desc}|{path}|server|port]'.format(
65 desc=gph_escape_entry(
66 '{repo:20} {description:40} {date}'.format(
67 repo=repo,
68 description=shorten(description, 40),
69 date=date)),
70 path='{base_path}{repo}'.format(
71 base_path=base_prefix,
72 repo=repo)))