xref: /aoo4110/main/sc/workben/celltrans/parse.py (revision b1cdbd2c)
1#!/usr/bin/env python
2#**************************************************************
3#
4#  Licensed to the Apache Software Foundation (ASF) under one
5#  or more contributor license agreements.  See the NOTICE file
6#  distributed with this work for additional information
7#  regarding copyright ownership.  The ASF licenses this file
8#  to you under the Apache License, Version 2.0 (the
9#  "License"); you may not use this file except in compliance
10#  with the License.  You may obtain a copy of the License at
11#
12#    http://www.apache.org/licenses/LICENSE-2.0
13#
14#  Unless required by applicable law or agreed to in writing,
15#  software distributed under the License is distributed on an
16#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17#  KIND, either express or implied.  See the License for the
18#  specific language governing permissions and limitations
19#  under the License.
20#
21#**************************************************************
22
23import sys
24
25localeNames = {'fr': 'French', 'hu': 'Hungarian', 'de': 'German'}
26def getLocaleName (code):
27    global localeNames
28    if code in localeNames:
29        return localeNames[code]
30    else:
31        return "(unknown locale)"
32
33def getAscii (ords):
34    ascii = ''
35    for c in ords:
36        ascii += chr(c)
37    return ascii
38
39class LocaleData(object):
40    def __init__ (self, locale):
41        self.locale = locale
42        self.funcList = {}
43
44    def addKeywordMap (self, funcName, localeName, engName):
45        if funcName not in self.funcList:
46            self.funcList[funcName] = []
47
48        self.funcList[funcName].append([localeName, engName])
49
50    def getLocaleFuncVarName (self, func, pair):
51        return func.lower() + "_" + getAscii(pair[1]).lower() + "_" + self.locale
52
53    def dumpCode (self):
54        chars = ""
55
56        # locale output
57        chars += "// " + "-"*75 + "\n"
58        chars += "// %s language locale (automatically generated)\n"%getLocaleName(self.locale)
59        chars += "// " + "-"*75 + "\n"
60        chars += "static const Locale a" + self.locale.capitalize() + "(OUString::createFromAscii(\""
61        chars += self.locale
62        chars += "\"), OUString(), OUString());\n\n"
63
64        # pre instantiations of localized function names.
65        funcs = sorted(self.funcList.keys())
66        chars += "// pre instantiations of localized function names\n"
67        for func in funcs:
68            for item in self.funcList[func]:
69                chars += "static const sal_Unicode " + self.getLocaleFuncVarName(func, item) + "[] = {\n"
70                chars += "    "
71                isFirst = True
72                # Dump the UTF-16 bytes.
73                for uval in item[0]:
74                    if isFirst:
75                        isFirst = False
76                    else:
77                        chars += ", "
78                    chars += "0x%.4X"%uval
79
80                # Don't forget to null-terminate the string.
81                if not isFirst:
82                    chars += ", "
83                chars += "0x0000"
84
85                chars += "};\n"
86
87        # map item instantiations
88        chars += "\n"
89        chars += "static const TransItem p" + self.locale.capitalize() + "[] = {\n"
90        for func in funcs:
91            for item in self.funcList[func]:
92                chars += "    "
93                chars += "{%s, \"%s\", %s},\n"%(self.getLocaleFuncVarName(func, item),
94                                                getAscii(item[1]),
95                                                "oc"+func.capitalize())
96
97        chars += "    {NULL, NULL, ocNone}\n"
98        chars += "};\n\n"
99
100        # addToMap call
101        chars += "addToMap(%s, %s);\n"%(
102            "p"+self.locale.capitalize(), "a"+self.locale.capitalize())
103
104        return chars
105
106class Parser(object):
107
108    def __init__ (self, args):
109        # default input & output files.
110        self.infile = "./keywords_utf16.txt"
111        self.outfile = "../../source/core/tool/cellkeywords.inl"
112
113        if len(args) >= 2:
114            self.infile = args[1]
115        if len(args) >= 3:
116            self.outfile = args[2]
117
118    def getDByte (self):
119        # Assume little endian.
120        bh = ord(self.bytes[self.i])
121        bl = ord(self.bytes[self.i+1])
122        dbyte = bl*256 + bh
123        self.i += 2
124        return dbyte
125
126    def parseLine (self):
127        buf = []
128        while self.i < self.size:
129            dbyte = self.getDByte()
130            if dbyte == 0x000A:
131                break
132            buf.append(dbyte)
133        return buf
134
135    def dumpBuf (self, buf, linefeed=True):
136        for item in buf:
137            sys.stdout.write(chr(item))
138        if linefeed:
139            print('')
140
141    def parse (self):
142
143        file = open(self.infile, 'r')
144        self.bytes = file.read()
145        file.close()
146
147        self.size = len(self.bytes)
148        self.i = 0
149
150        localeList = []  # stores an array of locale data objects.
151        funcName = None
152        word = []
153        wordPair = []
154
155        while self.i < self.size:
156            dbyte = self.getDByte()
157            if dbyte == 0xFEFF and self.i == 2:
158                # unicode signature - ignore it.
159                pass
160            elif dbyte == 0x0024:
161                # $ - locale name
162                buf = self.parseLine()
163                locale = getAscii(buf)
164                localeList.append(LocaleData(locale))
165
166            elif dbyte == 0x0040:
167                # @ - function name
168                buf = self.parseLine()
169                funcName = getAscii(buf)
170
171            elif dbyte == 0x002C:
172                # , - comma separator
173                if len(word) > 0:
174                    wordPair.append(word)
175                    word = []
176            elif dbyte == 0x000A:
177                # linefeed
178                if len(word) > 0:
179                    wordPair.append(word)
180                    word = []
181                if len(wordPair) >= 2:
182                    localeList[-1].addKeywordMap(funcName, wordPair[0], wordPair[1])
183                wordPair = []
184            elif dbyte in [0x0009, 0x0020]:
185                # whitespace - ignore it.
186                pass
187            else:
188                word.append(dbyte)
189
190        chars = "// This file has been automatically generated.  Do not hand-edit this!\n"
191        for obj in localeList:
192            chars += "\n" + obj.dumpCode()
193
194        # Write to output file.
195        file = open(self.outfile, 'w')
196        file.write(chars)
197        file.close()
198
199if __name__=='__main__':
200    parser = Parser(sys.argv)
201    parser.parse()
202