forked from amazingfate/loongoffice
This is largely unnecessary when working with OUString Change-Id: I3cf4d68357a43665d01162ef4a2d5346a45da9be
203 lines
6.3 KiB
Python
203 lines
6.3 KiB
Python
#!/usr/bin/env python
|
|
#
|
|
# This file is part of the LibreOffice project.
|
|
#
|
|
# 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/.
|
|
#
|
|
# This file incorporates work covered by the following license notice:
|
|
#
|
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
|
# contributor license agreements. See the NOTICE file distributed
|
|
# with this work for additional information regarding copyright
|
|
# ownership. The ASF licenses this file to you under the Apache
|
|
# License, Version 2.0 (the "License"); you may not use this file
|
|
# except in compliance with the License. You may obtain a copy of
|
|
# the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
#
|
|
|
|
import sys
|
|
|
|
localeNames = {'fr': 'French', 'hu': 'Hungarian', 'de': 'German'}
|
|
def getLocaleName (code):
|
|
global localeNames
|
|
if code in localeNames:
|
|
return localeNames[code]
|
|
else:
|
|
return "(unknown locale)"
|
|
|
|
def getAscii (ords):
|
|
ascii = ''
|
|
for c in ords:
|
|
ascii += chr(c)
|
|
return ascii
|
|
|
|
class LocaleData(object):
|
|
def __init__ (self, locale):
|
|
self.locale = locale
|
|
self.funcList = {}
|
|
|
|
def addKeywordMap (self, funcName, localeName, engName):
|
|
if not funcName in self.funcList:
|
|
self.funcList[funcName] = []
|
|
|
|
self.funcList[funcName].append([localeName, engName])
|
|
|
|
def getLocaleFuncVarName (self, func, pair):
|
|
return func.lower() + "_" + getAscii(pair[1]).lower() + "_" + self.locale
|
|
|
|
def dumpCode (self):
|
|
chars = ""
|
|
|
|
# locale output
|
|
chars += "// " + "-"*75 + "\n"
|
|
chars += "// %s language locale (automatically generated)\n"%getLocaleName(self.locale)
|
|
chars += "// " + "-"*75 + "\n"
|
|
chars += "static const Locale a" + self.locale.capitalize() + "(OUString(\""
|
|
chars += self.locale
|
|
chars += "\"), OUString(), OUString());\n\n"
|
|
|
|
# pre instantiations of localized function names.
|
|
funcs = sorted(self.funcList.keys())
|
|
chars += "// pre instantiations of localized function names\n"
|
|
for func in funcs:
|
|
for item in self.funcList[func]:
|
|
chars += "static const sal_Unicode " + self.getLocaleFuncVarName(func, item) + "[] = {\n"
|
|
chars += " "
|
|
isFirst = True
|
|
# Dump the UTF-16 bytes.
|
|
for uval in item[0]:
|
|
if isFirst:
|
|
isFirst = False
|
|
else:
|
|
chars += ", "
|
|
chars += "0x%.4X"%uval
|
|
|
|
# Don't forget to null-terminate the string.
|
|
if not isFirst:
|
|
chars += ", "
|
|
chars += "0x0000"
|
|
|
|
chars += "};\n"
|
|
|
|
# map item instantiations
|
|
chars += "\n"
|
|
chars += "static const TransItem p" + self.locale.capitalize() + "[] = {\n"
|
|
for func in funcs:
|
|
for item in self.funcList[func]:
|
|
chars += " "
|
|
chars += "{%s, \"%s\", %s},\n"%(self.getLocaleFuncVarName(func, item),
|
|
getAscii(item[1]),
|
|
"oc"+func.capitalize())
|
|
|
|
chars += " {NULL, NULL, ocNone}\n"
|
|
chars += "};\n\n"
|
|
|
|
# addToMap call
|
|
chars += "addToMap(%s, %s);\n"%(
|
|
"p"+self.locale.capitalize(), "a"+self.locale.capitalize())
|
|
|
|
return chars
|
|
|
|
class Parser(object):
|
|
|
|
def __init__ (self, args):
|
|
# default input & output files.
|
|
self.infile = "./keywords_utf16.txt"
|
|
self.outfile = "../../source/core/tool/cellkeywords.inl"
|
|
|
|
if len(args) >= 2:
|
|
self.infile = args[1]
|
|
if len(args) >= 3:
|
|
self.outfile = args[2]
|
|
|
|
def getDByte (self):
|
|
# Assume little endian.
|
|
bh = self.bytes[self.i]
|
|
bl = self.bytes[self.i+1]
|
|
try:
|
|
dbyte = ord(bl)*256 + ord(bh)
|
|
except:
|
|
dbyte = bl*256 + bh
|
|
self.i += 2
|
|
return dbyte
|
|
|
|
def parseLine (self):
|
|
buf = []
|
|
while self.i < self.size:
|
|
dbyte = self.getDByte()
|
|
if dbyte == 0x000A:
|
|
break
|
|
buf.append(dbyte)
|
|
return buf
|
|
|
|
def dumpBuf (self, buf, linefeed=True):
|
|
for item in buf:
|
|
sys.stdout.write(chr(item))
|
|
if linefeed:
|
|
print ('')
|
|
|
|
def parse (self):
|
|
|
|
file = open(self.infile, 'rb')
|
|
self.bytes = file.read()
|
|
file.close()
|
|
|
|
self.size = len(self.bytes)
|
|
self.i = 0
|
|
|
|
localeList = [] # stores an array of locale data objects.
|
|
funcName = None
|
|
word = []
|
|
wordPair = []
|
|
|
|
while self.i < self.size:
|
|
dbyte = self.getDByte()
|
|
if dbyte == 0xFEFF and self.i == 2:
|
|
# unicode signature - ignore it.
|
|
pass
|
|
elif dbyte == 0x0024:
|
|
# $ - locale name
|
|
buf = self.parseLine()
|
|
locale = getAscii(buf)
|
|
localeList.append(LocaleData(locale))
|
|
|
|
elif dbyte == 0x0040:
|
|
# @ - function name
|
|
buf = self.parseLine()
|
|
funcName = getAscii(buf)
|
|
|
|
elif dbyte == 0x002C:
|
|
# , - comma separator
|
|
if len(word) > 0:
|
|
wordPair.append(word)
|
|
word = []
|
|
elif dbyte == 0x000A:
|
|
# linefeed
|
|
if len(word) > 0:
|
|
wordPair.append(word)
|
|
word = []
|
|
if len(wordPair) >= 2:
|
|
localeList[-1].addKeywordMap(funcName, wordPair[0], wordPair[1])
|
|
wordPair = []
|
|
elif dbyte in [0x0009, 0x0020]:
|
|
# whitespace - ignore it.
|
|
pass
|
|
else:
|
|
word.append(dbyte)
|
|
|
|
chars = "// This file has been automatically generated. Do not hand-edit this!\n"
|
|
for obj in localeList:
|
|
chars += "\n" + obj.dumpCode()
|
|
|
|
# Write to output file.
|
|
file = open(self.outfile, 'w')
|
|
file.write(chars)
|
|
file.close()
|
|
|
|
if __name__=='__main__':
|
|
parser = Parser(sys.argv)
|
|
parser.parse()
|
|
|