2017-05-01 03:26:56 +03:00
#!/usr/bin/env python3
2020-11-09 07:23:58 +03:00
# SPDX-License-Identifier: LGPL-2.1-or-later
2013-02-03 07:47:47 +04:00
from __future__ import print_function
import collections
import sys
2017-04-05 06:21:04 +03:00
import pprint
2020-06-13 17:29:43 +03:00
from os . path import basename
2017-07-03 03:26:32 +03:00
from xml_helper import xml_parse
2013-02-03 07:47:47 +04:00
def man ( page , number ) :
2017-07-03 03:22:35 +03:00
return ' {} . {} ' . format ( page , number )
2013-02-03 07:47:47 +04:00
def add_rules ( rules , name ) :
2013-03-29 22:22:27 +04:00
xml = xml_parse ( name )
2013-02-03 07:47:47 +04:00
# print('parsing {}'.format(name), file=sys.stderr)
2014-02-20 01:06:10 +04:00
if xml . getroot ( ) . tag != ' refentry ' :
return
2013-02-03 07:47:47 +04:00
conditional = xml . getroot ( ) . get ( ' conditional ' ) or ' '
rulegroup = rules [ conditional ]
refmeta = xml . find ( ' ./refmeta ' )
title = refmeta . find ( ' ./refentrytitle ' ) . text
number = refmeta . find ( ' ./manvolnum ' ) . text
refnames = xml . findall ( ' ./refnamediv/refname ' )
target = man ( refnames [ 0 ] . text , number )
if title != refnames [ 0 ] . text :
raise ValueError ( ' refmeta and refnamediv disagree: ' + name )
for refname in refnames :
assert all ( refname not in group
for group in rules . values ( ) ) , " duplicate page name "
alias = man ( refname . text , number )
rulegroup [ alias ] = target
# print('{} => {} [{}]'.format(alias, target, conditional), file=sys.stderr)
2013-12-22 03:11:35 +04:00
def create_rules ( xml_files ) :
2013-02-03 07:47:47 +04:00
" { conditional => { alias-name => source-name}} "
rules = collections . defaultdict ( dict )
for name in xml_files :
2014-02-20 01:06:10 +04:00
try :
add_rules ( rules , name )
except Exception :
print ( " Failed to process " , name , file = sys . stderr )
raise
2013-02-03 07:47:47 +04:00
return rules
def mjoin ( files ) :
return ' \\ \n \t ' . join ( sorted ( files ) or ' # ' )
2017-04-05 06:21:04 +03:00
MESON_HEADER = ''' \
2020-05-07 15:01:09 +03:00
# Do not edit. Generated by update-man-rules.py.
2019-07-18 23:27:45 +03:00
# Update with:
# ninja -C build man/update-man-rules
2017-04-05 06:21:04 +03:00
manpages = [ '''
MESON_FOOTER = ''' \
]
# Really, do not edit.'''
def make_mesonfile ( rules , dist_files ) :
# reformat rules as
# grouped = [ [name, section, [alias...], condition], ...]
#
# but first create a dictionary like
# lists = { (name, condition) => [alias...]
grouped = collections . defaultdict ( list )
for condition , items in rules . items ( ) :
for alias , name in items . items ( ) :
group = grouped [ ( name , condition ) ]
if name != alias :
group . append ( alias )
lines = [ [ p [ 0 ] [ : - 2 ] , p [ 0 ] [ - 1 ] , sorted ( a [ : - 2 ] for a in aliases ) , p [ 1 ] ]
for p , aliases in sorted ( grouped . items ( ) ) ]
return ' \n ' . join ( ( MESON_HEADER , pprint . pformat ( lines ) [ 1 : - 1 ] , MESON_FOOTER ) )
2013-02-03 07:47:47 +04:00
if __name__ == ' __main__ ' :
2017-07-03 03:22:35 +03:00
pages = sys . argv [ 1 : ]
2020-06-13 17:29:43 +03:00
pages = ( p for p in pages
if basename ( p ) not in {
' systemd.directives.xml ' ,
' systemd.index.xml ' ,
' directives-template.xml ' } )
2017-04-05 06:21:04 +03:00
rules = create_rules ( pages )
2020-06-13 17:29:43 +03:00
dist_files = ( basename ( p ) for p in pages )
2017-07-03 03:22:35 +03:00
print ( make_mesonfile ( rules , dist_files ) )