1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
#!/usr/bin/env python2
#
# Copyright 2017 Lars Wirzenius
import os
import sys
import tempfile
import cliapp
def parse_markdown(f, tmpdir):
lines = f.readlines()
result = []
uml_filenames = []
while lines:
prefix, uml, lines = extract_uml(lines)
result.extend(prefix)
if uml:
filename = create_uml_file(tmpdir, uml)
uml_filenames.append(filename)
result.extend(include(uml, filename))
return result, uml_filenames
def extract_uml(lines):
start = find_line(lines, '@startuml\n')
if start is None:
return lines, None, []
end = find_line(lines, '@enduml\n')
if end is None:
return lines, None, []
return lines[:start], lines[start:end+1], lines[end+1:]
def find_line(lines, pattern):
for i, line in enumerate(lines):
if line.startswith(pattern):
return i
return None
def create_uml_file(tmpdir, lines):
fd, filename = tempfile.mkstemp(dir=tmpdir)
os.write(fd, ''.join(lines))
os.close(fd)
return filename
def include(uml, filename):
title = get_title(uml)
return [
'![{}]({}.png)\\ \n'.format(title, filename),
'\n',
]
def get_title(uml):
i = find_line(uml, 'title ')
if i is not None:
return uml[i].split(' ', 1)[1]
def plantuml(filename):
cliapp.runcmd(['plantuml', '-tpng', '-output', '.', filename])
def main():
tmpdir = sys.argv[1]
lines, filenames = parse_markdown(sys.stdin, tmpdir)
sys.stdout.write(''.join(lines))
for filename in filenames:
plantuml(filename)
if __name__ == '__main__':
main()
|