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
import collections
2022-03-22 23:51:33 +03:00
import glob
2023-07-17 23:39:37 +03:00
import pprint
2013-02-03 07:47:47 +04:00
import sys
2022-03-22 23:51:33 +03:00
from pathlib import Path
2023-07-17 23:39:37 +03:00
2017-07-03 03:26:32 +03:00
from xml_helper import xml_parse
2013-02-03 07:47:47 +04:00
2023-07-17 23:39:37 +03:00
2013-02-03 07:47:47 +04:00
def man ( page , number ) :
2023-07-17 23:39:37 +03:00
return f ' { 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 = ''' \
2021-01-05 06:55:10 +03:00
# SPDX-License-Identifier: LGPL-2.1-or-later
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:
2021-01-27 11:10:25 +03:00
# ninja -C build update-man-rules
2017-04-05 06:21:04 +03:00
manpages = [ '''
MESON_FOOTER = ''' \
]
2022-03-22 23:51:33 +03:00
# Really, do not edit.
'''
2017-04-05 06:21:04 +03:00
2023-07-17 23:39:37 +03:00
def make_mesonfile ( rules , _dist_files ) :
2017-04-05 06:21:04 +03:00
# 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 ) )
2023-07-17 23:39:37 +03:00
def main ( ) :
2022-03-22 23:51:33 +03:00
source_glob = sys . argv [ 1 ]
target = Path ( sys . argv [ 2 ] )
pages = glob . glob ( source_glob )
2020-06-13 17:29:43 +03:00
pages = ( p for p in pages
2022-03-22 23:51:33 +03:00
if Path ( p ) . name not in {
2020-06-13 17:29:43 +03:00
' systemd.directives.xml ' ,
' systemd.index.xml ' ,
' directives-template.xml ' } )
2017-04-05 06:21:04 +03:00
rules = create_rules ( pages )
2022-03-22 23:51:33 +03:00
dist_files = ( Path ( p ) . name for p in pages )
text = make_mesonfile ( rules , dist_files )
tmp = target . with_suffix ( ' .tmp ' )
tmp . write_text ( text )
tmp . rename ( target )
2023-07-17 23:39:37 +03:00
if __name__ == ' __main__ ' :
main ( )