2017-05-01 03:26:56 +03:00
#!/usr/bin/env python3
2018-12-09 21:17:33 +03:00
# SPDX-License-Identifier: LGPL-2.1+
2013-02-03 07:47:47 +04:00
from __future__ import print_function
import collections
import sys
2013-12-22 03:11:35 +04:00
import os . path
2017-04-05 06:21:04 +03:00
import pprint
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
2013-12-22 03:11:35 +04:00
def xml ( file ) :
2017-07-03 03:22:35 +03:00
return os . path . basename ( file )
2013-12-22 03:11:35 +04:00
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 = ''' \
# Do not edit. Generated by make-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 : ]
2017-04-05 06:21:04 +03:00
rules = create_rules ( pages )
dist_files = ( xml ( file ) for file in pages
2015-06-30 16:56:44 +03:00
if not file . endswith ( " .directives.xml " ) and
not file . endswith ( " .index.xml " ) )
2017-07-03 03:22:35 +03:00
print ( make_mesonfile ( rules , dist_files ) )