man: generate xml not html for index

This way we also get a man page. The output is not as polished.
I hope that it doesn't matter too much.

index.html is not generated now, the page is called
systemd.index.html. If necessary, an install hook should be added.
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2013-01-14 22:17:49 -05:00
parent 9cc2c8b763
commit f6b6728d1d
4 changed files with 96 additions and 74 deletions

View File

@ -682,22 +682,10 @@ CLEANFILES += \
${XML_FILES:.xml=.html}
if HAVE_PYTHON
noinst_DATA += \
man/index.html
CLEANFILES += \
man/index.html
man/index.html: make-man-index.py $(XML_FILES)
$(AM_V_at)$(MKDIR_P) $(dir $@)
$(AM_V_GEN)$(PYTHON) $^ > $@
MANPAGES += \
man/systemd.index.7 \
man/systemd.directives.7
EXTRA_DIST += \
man/index.html
XML_DIRECTIVE_FILES = \
man/systemd.xml \
man/systemd.unit.xml \
@ -718,11 +706,16 @@ XML_DIRECTIVE_FILES = \
man/systemd.time.xml \
man/bootchart.conf.xml
man/systemd.index.xml: make-man-index.py $(filter-out man/systemd.index.xml,$(XML_FILES))
$(AM_V_at)$(MKDIR_P) $(dir $@)
$(AM_V_GEN)$(PYTHON) $^ > $@
man/systemd.directives.xml: make-directive-index.py $(XML_DIRECTIVE_FILES)
$(AM_V_at)$(MKDIR_P) $(dir $@)
$(AM_V_GEN)$(PYTHON) $^ > $@
EXTRA_DIST += \
man/systemd.index.xml \
man/systemd.directives.xml
endif

2
TODO
View File

@ -32,8 +32,6 @@ Features:
* support high-level cgroup setting syntax in systemctl. Example: "systemctl set-cgroup-attr MemoryLimit 5K"
* add a man page "systemdall" that lists all of systemd's man pages, inspired by zsh's "zshall" page
* print a nicer explanation if people use variable/specifier expansion in ExecStart= for the first word
* kernel cmdline switch to turn off predictable network interface names

View File

@ -1,8 +1,9 @@
# -*- Mode: python; indent-tabs-mode: nil -*- */
# -*- 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
@ -17,79 +18,108 @@
# You should have received a copy of the GNU Lesser General Public License
# along with systemd; If not, see <http://www.gnu.org/licenses/>.
from xml.etree.ElementTree import parse, Element, SubElement, tostring
from sys import argv, stdout
import collections
import xml.etree.ElementTree as tree
import sys
index = {}
TEMPLATE = '''\
<refentry id="systemd.index">
def prettify(elem, indent = 0):
s = "\n" + indent * " "
if len(elem):
if not elem.text or not elem.text.strip():
elem.text = s + " "
for e in elem:
prettify(e, indent + 1)
if not e.tail or not e.tail.strip():
e.tail = s + " "
if not e.tail or not e.tail.strip():
e.tail = s
else:
if indent and (not elem.tail or not elem.tail.strip()):
elem.tail = s
<refentryinfo>
<title>systemd.index</title>
<productname>systemd</productname>
for p in argv[1:]:
t = parse(p)
<authorgroup>
<author>
<contrib>Developer</contrib>
<firstname>Lennart</firstname>
<surname>Poettering</surname>
<email>lennart@poettering.net</email>
</author>
</authorgroup>
</refentryinfo>
<refmeta>
<refentrytitle>systemd.index</refentrytitle>
<manvolnum>7</manvolnum>
</refmeta>
<refnamediv>
<refname>systemd.index</refname>
<refpurpose>List all manpages from the systemd project</refpurpose>
</refnamediv>
</refentry>
'''
SUMMARY = '''\
<refsect1>
<title>See Also</title>
<para>
<citerefentry><refentrytitle>systemd.directives</refentrytitle><manvolnum>7</manvolnum></citerefentry>
</para>
<para id='counts' />
</refsect1>
'''
COUNTS = '\
This index contains {count} entries, referring to {pages} individual manual pages.'
def make_index(pages):
index = collections.defaultdict(list)
for p in pages:
t = tree.parse(p)
section = t.find('./refmeta/manvolnum').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)
infos = (f.text, section, purpose, refname)
index[f.text[0].upper()].append(infos)
return index
html = Element('html')
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
head = SubElement(html, 'head')
title = SubElement(head, 'title')
title.text = 'Manual Page Index'
b = tree.SubElement(para, 'citerefentry')
c = tree.SubElement(b, 'refentrytitle')
c.text = refname
d = tree.SubElement(b, 'manvolnum')
d.text = section
body = SubElement(html, 'body')
h1 = SubElement(body, 'h1')
h1.text = 'Manual Page Index'
b.tail = '' + purpose # + ' (' + p + ')'
letter = None
for n in sorted(index.keys(), key = str.lower):
path, section, purpose = index[n]
tree.SubElement(para, 'sbr')
if path.endswith('.xml'):
path = path[:-4] + ".html"
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))
c = path.rfind('/')
if c >= 0:
path = path[c+1:]
refsect1 = tree.fromstring(SUMMARY)
template.append(refsect1)
if letter is None or n[0].upper() != letter:
letter = n[0].upper()
para = template.find(".//para[@id='counts']")
para.text = COUNTS.format(count=count, pages=len(pages))
h2 = SubElement(body, 'h2')
h2.text = letter
def make_page(xml_files):
template = tree.fromstring(TEMPLATE)
index = make_index(xml_files)
ul = SubElement(body, 'ul')
ul.set('style', 'list-style-type:none')
for letter in sorted(index):
add_letter(template, letter, index[letter])
li = SubElement(ul, 'li')
add_summary(template, index.values())
a = SubElement(li, 'a')
a.set('href', path)
a.text = n + '(' + section + ')'
a.tail = ' -- '
return template
i = SubElement(li, 'i')
i.text = purpose
hr = SubElement(body, 'hr')
p = SubElement(body, 'p')
p.text = "This index contains %s entries, referring to %i individual manual pages." % (len(index), len(argv)-1)
if hasattr(stdout, "buffer"):
stdout = stdout.buffer
prettify(html)
stdout.write(tostring(html))
if __name__ == '__main__':
tree.dump(make_page(sys.argv[1:]))

1
man/.gitignore vendored
View File

@ -1,2 +1,3 @@
/systemd.directives.xml
/systemd.index.xml
/*.[13578]