]> xenbits.xensource.com Git - libvirt.git/commitdiff
NEWS: Reformat at generation time
authorAndrea Bolognani <abologna@redhat.com>
Tue, 3 Jan 2017 16:50:34 +0000 (17:50 +0100)
committerAndrea Bolognani <abologna@redhat.com>
Tue, 10 Jan 2017 18:37:55 +0000 (19:37 +0100)
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
docs/reformat-news.py [new file with mode: 0755]

index fa45388803e2b28c6b729dc6da44d6b3dac4249e..c6324f54a2b1f6609c20b569d076e976130f8510 100644 (file)
@@ -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 (executable)
index 0000000..39499d9
--- /dev/null
@@ -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
+# <http://www.gnu.org/licenses/>.
+#
+# Authors:
+#     Andrea Bolognani <abologna@redhat.com>
+
+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)