21e42c66a4c09774a9e794c85f801007b22d71a8
[rsync.git] / packaging / md2html
1 #!/usr/bin/env python3
2
3 # Copyright (C) 2020 Wayne Davison
4 #
5 # This program is freely redistributable.
6
7 import os, re, argparse
8
9 HTML_START = """\
10 <html><head>
11 <title>%s</title>
12 <link href="https://fonts.googleapis.com/css2?family=Roboto&family=Roboto+Mono&display=swap" rel="stylesheet">
13 <style>
14 body {
15   max-width: 50em;
16   margin: auto;
17 }
18 body, b, strong, u {
19   font-family: 'Roboto', sans-serif;
20 }
21 code {
22   font-family: 'Roboto Mono', monospace;
23   font-weight: bold;
24 }
25 pre code {
26   display: block;
27   font-weight: normal;
28 }
29 blockquote pre code {
30   background: #f1f1f1;
31 }
32 dd p:first-of-type {
33   margin-block-start: 0em;
34 }
35 table {
36   border-color: grey;
37   border-spacing: 0;
38 }
39 tr {
40   border-top: 1px solid grey;
41 }
42 tr:nth-child(2n) {
43   background-color: #f6f8fa;
44 }
45 th, td {
46   border: 1px solid #dfe2e5;
47   text-align: center;
48   padding-left: 1em;
49   padding-right: 1em;
50 }
51 </style>
52 </head><body>
53 """
54
55 HTML_END = """\
56 </body></html>
57 """
58
59 md_parser = None
60
61 def main():
62     for mdfn in args.mdfiles:
63         if not mdfn.endswith('.md'):
64             print('Ignoring non-md input file:', mdfn)
65             continue
66         title = re.sub(r'.*/', '', mdfn).replace('.md', '')
67         htfn = mdfn.replace('.md', '.html')
68
69         print("Parsing", mdfn, '->', htfn)
70
71         with open(mdfn, 'r', encoding='utf-8') as fh:
72             txt = fh.read()
73
74         txt = re.sub(r'\s--\s', '\xa0-- ', txt)
75
76         html = md_parser(txt)
77
78         html = re.sub(r'(?<!<pre>)(<code>)([\s\S]*?)(</code>)', lambda m: m[1] + re.sub(r'\s', '\xa0', m[2]) + m[3], html)
79         html = html.replace('--', '&#8209;&#8209;').replace("\xa0-", '&nbsp;&#8209;').replace("\xa0", '&nbsp;')
80         html = re.sub(r'(\W)-', r'\1&#8209;', html)
81
82         if os.path.lexists(htfn):
83             os.unlink(htfn)
84
85         with open(htfn, 'w', encoding='utf-8') as fh:
86             fh.write(HTML_START % title)
87             fh.write(html)
88             fh.write(HTML_END)
89
90
91 if __name__ == '__main__':
92     parser = argparse.ArgumentParser(description='Output html for md pages.', add_help=False)
93     parser.add_argument("--help", "-h", action="help", help="Output this help message and exit.")
94     parser.add_argument("mdfiles", nargs='+', help="The .md files to turn into .html files.")
95     args = parser.parse_args()
96
97     try:
98         import cmarkgfm
99         # Our NEWS.md file has a gfm table in it.
100         md_parser = cmarkgfm.github_flavored_markdown_to_html
101     except:
102         die("Failed to find cmarkgfm for python3.")
103
104     main()