From 6a5b3127307704950c4d8b6b5949715b2a02270a Mon Sep 17 00:00:00 2001 From: Andrea Bolognani Date: Tue, 3 Jan 2017 17:50:34 +0100 Subject: [PATCH] NEWS: Reformat at generation time Instead of encoding formatting information inside the corresponding XSLT stylesheet, use a Python script to reformat the text appropriately based on a few simple markers. Splitting the task between the XSLT stylesheet and the Python script allows us to keep both parts very simple. --- Makefile.am | 23 ++++++---- docs/reformat-news.py | 104 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+), 8 deletions(-) create mode 100755 docs/reformat-news.py diff --git a/Makefile.am b/Makefile.am index fa45388803..c6324f54a2 100644 --- a/Makefile.am +++ b/Makefile.am @@ -48,16 +48,23 @@ pkgconfig_DATA = libvirt.pc libvirt-qemu.pc libvirt-lxc.pc libvirt-admin.pc NEWS: \ $(srcdir)/docs/news.xml \ - $(srcdir)/docs/news-ascii.xsl - $(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \ - $(XSLTPROC) --nonet $(srcdir)/docs/news-ascii.xsl \ - $(srcdir)/docs/news.xml \ - | perl -0777 -pe 's/\n\n+$$/\n/' \ - | perl -pe 's/[ \t]+$$//' \ - > $@-t && mv $@-t $@ ; fi + $(srcdir)/docs/news-ascii.xsl \ + $(srcdir)/docs/reformat-news.py + $(AM_V_GEN) \ + if [ -x $(XSLTPROC) ]; then \ + $(XSLTPROC) --nonet \ + $(srcdir)/docs/news-ascii.xsl \ + $(srcdir)/docs/news.xml \ + >$@-tmp \ + || { rm -f $@-tmp; exit 1; }; \ + $(srcdir)/docs/reformat-news.py $@-tmp >$@ \ + || { rm -f $@-tmp; exit 1; }; \ + rm -f $@-tmp; \ + fi EXTRA_DIST += \ $(srcdir)/docs/news.xml \ - $(srcdir)/docs/news-ascii.xsl + $(srcdir)/docs/news-ascii.xsl \ + $(srcdir)/docs/reformat-news.py $(top_srcdir)/HACKING: $(top_srcdir)/docs/hacking1.xsl \ $(top_srcdir)/docs/hacking2.xsl \ diff --git a/docs/reformat-news.py b/docs/reformat-news.py new file mode 100755 index 0000000000..39499d9330 --- /dev/null +++ b/docs/reformat-news.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python + +# reformat-news.py: Reformat the NEWS file properly +# +# Copyright (C) 2017 Red Hat, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. If not, see +# . +# +# Authors: +# Andrea Bolognani + +import sys + +COLUMNS = 80 + +def reformat_with_indent(text, initial_indent, indent): + + res = "" + line = initial_indent + + for word in text.split(): + + # If adding one more word (plus a whitespace, plus a newline) + # to the current line would push us over the desired number + # of columns we start a new line instead + if len(line) + len(word) > (COLUMNS - 2): + res = res + line + "\n" + line = indent + + # We need to take care when we've just started a new line, + # as we don't want to add any additional leading whitespace + # in that case + if line == indent or line == initial_indent: + line = line + word + else: + line = line + " " + word + + # Append whatever's left + res = res + line + + return res + + +def reformat(line): + + # Empty lines don't need to be reformatted or even inspected + if len(line) == 0: + return line + + # For all non-empty lines, we decide the indentation level based + # on the first character + marker = line[0] + + # Release + if marker == '#': + initial_indent = 0 + indent = 2 + # Section + elif marker == '*': + initial_indent = 2 + indent = 4 + # Change summary + elif marker == '-': + initial_indent = 4 + indent = 6 + # Change description + elif marker == '|': + initial_indent = 8 + indent = 8 + # In this one case, the marker should not ultimately show + # up in the output file, so we strip it before moving on + line = line[1:] + # Anything else should be left as-is + else: + return line + + return reformat_with_indent(line, " " * initial_indent, " " * indent) + + +def main(args): + + if len(args) < 2: + sys.stdout.write("Usage: " + args[0] + " FILE\n") + sys.exit(1) + + with open(args[1], 'r') as f: + for line in f: + print(reformat(line.strip())) + + +if __name__ == "__main__": + main(sys.argv)