#!/usr/bin/env python
"""
Output a combined news.adoc document
Also write an Atom feed document
"""
import os
import sys
import hashlib
import datetime
import time
OUTPUT_HEADER = """= News
"""
OUTPUT_FOOTER = """
link:https://savannah.nongnu.org/news/?group_id=10890[Old News Archive]
"""
ATOM_TEMPLATE = """
crmsh
Cluster manager shell news
%(id)s
%(updated)s
%(entries)s
"""
ATOM_NAME = "gen/atom.xml"
root_id = "tag:crmsh.github.io,2014:/atom"
def escape(s):
s = s.replace('&', '&')
s = s.replace('<', '<')
s = s.replace('>', '>')
s = s.replace('"', """)
return s
class Entry(object):
def __init__(self, fname):
self.filename = fname
self.name = os.path.splitext(os.path.basename(fname))[0]
with open(fname) as f:
self.title = f.readline().strip()
f.readline()
l = f.readline()
while l.startswith(':'):
k, v = l[1:].split(':', 1)
k = k.lower()
v = v.strip()
setattr(self, k, v)
l = f.readline()
self.content = l + f.read()
if not hasattr(self, 'author'):
raise ValueError("Missing author")
if not hasattr(self, 'email'):
raise ValueError("Missing email")
if not hasattr(self, 'date'):
raise ValueError("Missing date")
def atom_id(self):
return root_id + '::' + hashlib.sha1(self.filename).hexdigest()
def atom_date(self):
return self.date.replace(' ', 'T') + ':00' + time.tzname[0]
def date_obj(self):
from dateutil import parser
return (parser.parse(self.date))
def atom_content(self):
return escape('
\n' + self.content + '\n
\n')
def atom(self):
data = {'title': self.title,
'id': self.atom_id(),
'updated': self.atom_date(),
'name': self.name,
'content': self.atom_content(),
'author': self.author,
'email': self.email}
return """
%(title)s
%(id)s
%(updated)s
http://crmsh.github.io/news/%(name)s
%(content)s
%(author)s
%(email)s
""" % data
def sort_entries(entries):
return list(reversed(sorted(entries, key=lambda e: e.date_obj())))
def make_atom():
inputs = sort_entries([Entry(f) for f in sys.argv[2:]])
with open(ATOM_NAME, 'w') as output:
output.write(ATOM_TEMPLATE % {
'id': root_id,
'updated': inputs[0].atom_date(),
'entries': '\n'.join(f.atom() for f in inputs)
})
def main():
# TODO: sort by date
inputs = sort_entries([Entry(f) for f in sys.argv[2:]])
with open(sys.argv[1], 'w') as output:
output.write(OUTPUT_HEADER)
e = inputs[0]
output.write("link:/news/%s[%s]\n\n" % (e.name, e.date))
output.write(":leveloffset: 1\n\n")
output.write("include::%s[]\n\n" % (e.filename))
output.write(":leveloffset: 0\n\n")
output.write("''''\n")
for e in inputs[1:]:
output.write("* link:/news/%s[%s %s]\n" % (e.name, e.date, e.title))
output.write(OUTPUT_FOOTER)
if __name__ == "__main__":
if sys.argv[1] == ATOM_NAME:
make_atom()
else:
main()