summaryrefslogtreecommitdiffstats
path: root/bin/html
diff options
context:
space:
mode:
Diffstat (limited to 'bin/html')
-rw-r--r--bin/html134
1 files changed, 134 insertions, 0 deletions
diff --git a/bin/html b/bin/html
new file mode 100644
index 0000000..503a254
--- /dev/null
+++ b/bin/html
@@ -0,0 +1,134 @@
+#!/usr/bin/env python3
+#
+# SPDX-License-Identifier: ISC
+#
+# Copyright © 2019 Free Software Foundation of India.
+#
+
+import datetime
+import os
+import os.path
+import re
+import subprocess as subp
+import sys
+
+
+# placeholders
+PH = {
+ 'title': '<!-- NEWS-ITEM-TITLE -->',
+ 'date': '<!-- DATE -->',
+ 'content': '<!-- MAIN-CONTENT -->',
+}
+
+
+def err(s):
+ print('Error: {}'.format(s))
+ sys.exit(1)
+
+
+def files():
+ return os.scandir('md/news')
+
+
+def read(f):
+ with open(f) as f:
+ c = f.read()
+ return c
+
+
+def write(p, c):
+ d = os.path.dirname(p)
+
+ if not os.path.exists(d):
+ os.makedirs(d)
+
+ with open(p, 'w') as f:
+ f.write(c)
+
+
+def slug(p):
+ m = re.search(r'([a-zA-Z\-]+)\.md', p)
+
+ if not m:
+ err('Unable to get slug')
+
+ return m.group(1)
+
+
+def title(c):
+ m = re.search(r'^\# (.+)$', c, re.M)
+
+ if not m:
+ err('Title not found')
+
+ return m.group(1)
+
+
+def date(c):
+ m = re.search(r'pubdate: ([0-9]{8})', c)
+
+ if not m:
+ err('Publication date not found')
+
+ return m.group(1)
+
+
+def content(c):
+ m = re.search(r'^\# (.+)$', c, re.M)
+
+ if not m:
+ err('Unable to slurp content')
+
+ return c[m.end():]
+
+
+def template(type):
+ return read('templates/html/{}.html'.format(type))
+
+
+def datefmt(d):
+ return datetime.datetime.strptime(d, '%Y%m%d').strftime('%B %d, %Y')
+
+
+def markdown(c):
+ try:
+ r = subp.run(['bin/markdown'],
+ input=c,
+ stdout=subp.PIPE,
+ check=True,
+ universal_newlines=True)
+ except Exception as e:
+ p('Markdown failed for {}'.format(c))
+
+ return r.stdout
+
+
+def html(t, d, c):
+ h = template('news')
+ h = h.replace(PH['title'], t, 2)
+ h = h.replace(PH['date'], datefmt(d), 1)
+ h = h.replace(PH['content'], markdown(c), 1)
+
+ return h
+
+
+def process(f):
+ c = read(f.path)
+
+ s = slug(f.path)
+ t = title(c)
+ d = date(c)
+ c = content(c)
+
+ h = html(t, d, c)
+
+ write('/'.join(['_build', 'news', s, 'index.html']), h)
+
+
+def run():
+ for f in files():
+ process(f)
+
+
+if __name__ == "__main__":
+ run()