1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
#!/usr/bin/env python3
########################################################################
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
########################################################################
import xml.parsers.expat
import zipfile
import argparse
import sys
import token_util
class XMLParser:
def __init__ (self, strm):
self.__strm = strm
self.__elem = None
self.tokens = []
def start_element(self, name, attrs):
self.__elem = name
if name in ['xs:element', 'xs:attribute', 'xsd:element', 'xsd:attribute'] and "name" in attrs:
token = attrs['name']
if len(token) > 0:
self.tokens.append(token)
def end_element(self, name):
pass
def character(self, data):
pass
def parse (self):
p = xml.parsers.expat.ParserCreate()
p.StartElementHandler = self.start_element
p.EndElementHandler = self.end_element
p.CharacterDataHandler = self.character
p.Parse(self.__strm, 1)
def get_all_tokens_from_zip(fpath):
with zipfile.ZipFile(fpath, 'r') as zip:
tokens = set()
for item in zip.namelist():
fd = zip.open(item, 'r')
parser = XMLParser(fd.read())
fd.close()
parser.parse()
tokens.update(parser.tokens)
return tokens
def main():
parser = argparse.ArgumentParser()
parser.add_argument(
"-i", "--input", required=True, type=str,
help="Zip file containing schemas.")
parser.add_argument("--extra-input", type=argparse.FileType("r"), help="Optional input file containing extra token names.")
parser.add_argument(
"constant_file", metavar="CONSTANT-FILE", nargs=1, type=argparse.FileType("w"),
help="Output file to store constant values.")
parser.add_argument(
"name_file", metavar="NAME-FILE", nargs=1, type=argparse.FileType("w"),
help="Output file to store constant string names.")
args = parser.parse_args()
tokens = get_all_tokens_from_zip(args.input)
if args.extra_input:
extra_tokens = [x.strip() for x in args.extra_input.readlines()]
tokens.update(extra_tokens)
tokens = sorted(list(tokens))
token_util.gen_token_constants(args.constant_file[0], tokens)
token_util.gen_token_names(args.name_file[0], tokens)
if __name__ == '__main__':
main()
|