blob: 9298041be85d7ce77f46588e62fe332b0c5913c5 [file] [log] [blame]
Tim-Philipp Müller57a224f2020-07-31 07:26:11 +00001#!/usr/bin/env python3
2#
3# fontconfig/doc/extract-man-list.py
4#
5# Parses .fncs files and extracts list of man pages that will be generated
6#
7# Copyright © 2020 Tim-Philipp Müller
8#
9# Permission to use, copy, modify, distribute, and sell this software and its
10# documentation for any purpose is hereby granted without fee, provided that
11# the above copyright notice appear in all copies and that both that
12# copyright notice and this permission notice appear in supporting
13# documentation, and that the name of the author(s) not be used in
14# advertising or publicity pertaining to distribution of the software without
15# specific, written prior permission. The authors make no
16# representations about the suitability of this software for any purpose. It
17# is provided "as is" without express or implied warranty.
18#
19# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
20# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
21# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
22# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
23# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
24# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
25# PERFORMANCE OF THIS SOFTWARE.
26
27import sys
28import re
29
30replacement_sets = []
31
32# -------------------------------------
33# Read replacement sets from .fncs file
34# -------------------------------------
35
36def read_fncs_file(fn):
37 global replacement_sets
38
39 with open(fn, 'r', encoding='utf8') as f:
40 fncs_text = f.read()
41
42 # split into replacement sets
43 fncs_chunks = fncs_text.strip().split('@@')
44
45 for chunk in fncs_chunks:
46 # get rid of any preamble such as license and FcFreeTypeQueryAll decl in fcfreetype.fncs
47 start = chunk.find('@')
48 if start:
49 chunk = chunk[start:]
50
51 # split at '@' and remove empty lines (keep it simple instead of doing fancy
52 # things with regular expression matches, we control the input after all)
53 lines = [line for line in chunk.split('@') if line.strip()]
54
55 replacement_set = {}
56
57 while lines:
58 tag = lines.pop(0).strip()
59 # FIXME: this hard codes the tag used in funcs.sgml - we're lazy
60 if tag.startswith('PROTOTYPE'):
61 text = ''
62 else:
63 text = lines.pop(0).strip()
64 if text.endswith('%'):
65 text = text[:-1] + ' '
66
67 replacement_set[tag] = text
68
69 if replacement_set:
70 replacement_sets += [replacement_set]
71
72# ----------------------------------------------------------------------------
73# Main
74# ----------------------------------------------------------------------------
75
76if len(sys.argv) < 2:
77 sys.exit('Usage: {} FILE1.FNCS [FILE2.FNCS...]'.format(sys.argv[0]))
78
79fout = sys.stdout
80
81for input_fn in sys.argv[1:]:
82 read_fncs_file(input_fn)
83
84# process template for each replacement set
85for rep in replacement_sets:
86 if 'FUNC+' in rep:
87 man_page_title = rep.get('TITLE', rep['FUNC'])
88 else:
89 man_page_title = rep['FUNC']
90 print(man_page_title)