X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=make-man-index.py;h=74a47b821a9538d4e8531fc123ac05edb934a170;hp=29e3578758d80601ea00b62aa85d339896248f0b;hb=3ae83f9896bff49679c8a60e6ff9520557df8b16;hpb=a6c9b1c492378a093fe7db69c42a19b8f8193814 diff --git a/make-man-index.py b/make-man-index.py index 29e357875..74a47b821 100755 --- a/make-man-index.py +++ b/make-man-index.py @@ -1,60 +1,136 @@ -#!/usr/bin/env python - -from xml.etree.ElementTree import parse, Element, SubElement, tostring -from sys import argv, stdout - -index = {} - -for p in argv[1:]: - t = parse(p) +# -*- Mode: python; coding: utf-8; indent-tabs-mode: nil -*- */ +# +# This file is part of systemd. +# +# Copyright 2012 Lennart Poettering +# Copyright 2013 Zbigniew Jędrzejewski-Szmek +# +# systemd 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. +# +# systemd 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 systemd; If not, see . + +import collections +import sys +import re +from xml_helper import * + +MDASH = ' — ' if sys.version_info.major >= 3 else ' -- ' + +TEMPLATE = '''\ + + + + systemd.index + systemd + + + + Developer + Lennart + Poettering + lennart@poettering.net + + + + + + systemd.index + 7 + + + + systemd.index + List all manpages from the systemd project + + +''' + +SUMMARY = '''\ + + See Also + + systemd.directives7 + + + + +''' + +COUNTS = '\ +This index contains {count} entries, referring to {pages} individual manual pages.' + + +def check_id(page, t): + id = t.getroot().get('id') + if not re.search('/' + id + '[.]', page): + raise ValueError("id='{}' is not the same as page name '{}'".format(id, page)) + +def make_index(pages): + index = collections.defaultdict(list) + for p in pages: + t = xml_parse(p) + check_id(p, t) section = t.find('./refmeta/manvolnum').text - purpose = t.find('./refnamediv/refpurpose').text + refname = t.find('./refnamediv/refname').text + purpose = ' '.join(t.find('./refnamediv/refpurpose').text.split()) for f in t.findall('./refnamediv/refname'): - index[f.text] = (p, section, purpose) - -html = Element('html') - -head = SubElement(html, 'head') -title = SubElement(head, 'title') -title.text = 'Manual Page Index' - -body = SubElement(html, 'body') -h1 = SubElement(body, 'h1') -h1.text = 'Manual Page Index' + infos = (f.text, section, purpose, refname) + index[f.text[0].upper()].append(infos) + return index -letter = None -for n in sorted(index.keys(), key = str.lower): - path, section, purpose = index[n] +def add_letter(template, letter, pages): + refsect1 = tree.SubElement(template, 'refsect1') + title = tree.SubElement(refsect1, 'title') + title.text = letter + para = tree.SubElement(refsect1, 'para') + for info in sorted(pages, key=lambda info: str.lower(info[0])): + refname, section, purpose, realname = info - if path.endswith('.xml'): - path = path[:-4] + ".html" + b = tree.SubElement(para, 'citerefentry') + c = tree.SubElement(b, 'refentrytitle') + c.text = refname + d = tree.SubElement(b, 'manvolnum') + d.text = section - c = path.rfind('/') - if c >= 0: - path = path[c+1:] + b.tail = MDASH + purpose # + ' (' + p + ')' - if letter is None or n[0].upper() != letter: - letter = n[0].upper() + tree.SubElement(para, 'sbr') - h2 = SubElement(body, 'h2') - h2.text = letter +def add_summary(template, indexpages): + count = 0 + pages = set() + for group in indexpages: + count += len(group) + for info in group: + refname, section, purpose, realname = info + pages.add((realname, section)) - ul = SubElement(body, 'ul') - ul.set('style', 'list-style-type:none') + refsect1 = tree.fromstring(SUMMARY) + template.append(refsect1) - li = SubElement(ul, 'li') + para = template.find(".//para[@id='counts']") + para.text = COUNTS.format(count=count, pages=len(pages)) - a = SubElement(li, 'a') - a.set('href', path) - a.text = n + '(' + section + ')' - a.tail = ' -- ' +def make_page(*xml_files): + template = tree.fromstring(TEMPLATE) + index = make_index(xml_files) - i = SubElement(li, 'i') - i.text = purpose + for letter in sorted(index): + add_letter(template, letter, index[letter]) -hr = SubElement(body, 'hr') + add_summary(template, index.values()) -p = SubElement(body, 'p') -p.text = "This index contains %s entries, referring to %i individual manual pages." % (len(index), len(argv)-1) + return template -stdout.write(tostring(html)) +if __name__ == '__main__': + with open(sys.argv[1], 'wb') as f: + f.write(xml_print(make_page(*sys.argv[2:])))