diff options
Diffstat (limited to 'scripts/unocommands.py')
-rwxr-xr-x | scripts/unocommands.py | 111 |
1 files changed, 79 insertions, 32 deletions
diff --git a/scripts/unocommands.py b/scripts/unocommands.py index 8e344e9e61..fa44e83497 100755 --- a/scripts/unocommands.py +++ b/scripts/unocommands.py @@ -7,11 +7,12 @@ # import os -import polib import re import sys +import polib from lxml import etree + def usageAndExit(): message = """usage: {program} [--check|--update|--translate] online_dir [...] @@ -34,11 +35,12 @@ Update the translations of unocommands.js before releasing: {program} --translate /path/to/online /path/to/translations """ - print(message.format(program = sys.argv[0])) + print(message.format(program=sys.argv[0])) exit(1) -# Extract uno commands name from lines like " 'Command1', 'Command2'," + def commandsFromLine(line): + """Extract uno commands name from lines like " 'Command1', 'Command2',""" commands = [] inCommand = False @@ -48,25 +50,27 @@ def commandsFromLine(line): inCommand = not inCommand # command ended, collect it if not inCommand and command != '': - commands += [ command ] + commands += [command] command = '' elif inCommand: command += c return commands + # Extract uno commands name from lines like " {uno: '.uno:Command3'," def commandFromMenuLine(line): m = re.search(r"\buno: *'\.uno:([^']*)'", line) if m: - return [ m.group(1) ] + return [m.group(1)] m = re.search(r"\b_UNO\('.uno:([^']*)'", line) if m: - return [ m.group(1) ] + return [m.group(1)] return [] + # Extract all the uno commands we are using in the Online menu def extractMenuCommands(path): commands = [] @@ -82,6 +86,7 @@ def extractMenuCommands(path): # may the list unique return set(commands) + # Extract all the uno commands we are using in the Online context menu def extractContextCommands(path): commandsToIgnore = ["FontDialogForParagraph"] @@ -113,10 +118,12 @@ def extractContextCommands(path): if line.find("_UNO(") >= 0: commands += commandFromMenuLine(line) - commands = [command for command in commands if command not in commandsToIgnore] + commands = [command for command in commands + if command not in commandsToIgnore] # may the list unique return set(commands) + # Extract all the uno commands we are using in the Online toolbar def extractToolbarCommands(path): commands = [] @@ -137,7 +144,8 @@ def extractToolbarCommands(path): if line.find("_UNO(") >= 0: commands += commandFromMenuLine(line) - f = open(path + '/loleaflet/src/control/Control.NotebookbarBuilder.js', 'r') + f = open(path + + '/loleaflet/src/control/Control.NotebookbarBuilder.js', 'r') for line in f: if line.find("_UNO(") >= 0: commands += commandFromMenuLine(line) @@ -157,7 +165,8 @@ def extractToolbarCommands(path): if line.find("_UNO(") >= 0: commands += commandFromMenuLine(line) - f = open(path + '/loleaflet/src/control/Control.NotebookbarImpress.js', 'r') + f = open(path + + '/loleaflet/src/control/Control.NotebookbarImpress.js', 'r') for line in f: if line.find("_UNO(") >= 0: commands += commandFromMenuLine(line) @@ -185,10 +194,11 @@ def extractToolbarCommands(path): # may the list unique return set(commands) + # Create mapping between the commands and appropriate strings def collectCommandsFromXCU(xcu, descriptions, commands, label, type): root = etree.parse(xcu) - nodes = root.xpath("/oor:component-data/node/node/node", namespaces = { + nodes = root.xpath("/oor:component-data/node/node/node", namespaces={ 'oor': 'http://openoffice.org/2001/registry', }) for node in nodes: @@ -198,10 +208,10 @@ def collectCommandsFromXCU(xcu, descriptions, commands, label, type): if unoCommand in commands: # normal labels - textElement = node.xpath('prop[@oor:name="' + label + '"]/value', namespaces = { - 'oor': 'http://openoffice.org/2001/registry', - }) - + textElement = node.xpath('prop[@oor:name="' + label + '"]/value', + namespaces={'oor': + 'http://open' + + 'office.org/2001/registry', }) if len(textElement) == 1: # extract the uno command's English text text = ''.join(textElement[0].itertext()) @@ -225,13 +235,16 @@ def collectCommandsFromXCU(xcu, descriptions, commands, label, type): return descriptions + # Print commands from all the XCU files, and collect them too -def writeUnocommandsJS(onlineDir, lofficeDir, menuCommands, contextCommands, toolbarCommands): +def writeUnocommandsJS( + onlineDir, lofficeDir, menuCommands, contextCommands, toolbarCommands): + descriptions = {} dir = lofficeDir + '/officecfg/registry/data/org/openoffice/Office/UI' for file in os.listdir(dir): if file.endswith('.xcu'): - type = 'global'; + type = 'global' if file.startswith('Writer'): type = 'text' elif file.startswith('Calc'): @@ -240,23 +253,46 @@ def writeUnocommandsJS(onlineDir, lofficeDir, menuCommands, contextCommands, too type = 'presentation' # main menu - descriptions = collectCommandsFromXCU(os.path.join(dir, file), descriptions, menuCommands, 'ContextLabel', type) - descriptions = collectCommandsFromXCU(os.path.join(dir, file), descriptions, contextCommands, 'ContextLabel', type) + descriptions = collectCommandsFromXCU(os.path.join(dir, file), + descriptions, menuCommands, + 'ContextLabel', type) + descriptions = collectCommandsFromXCU(os.path.join(dir, file), + descriptions, + contextCommands, + 'ContextLabel', type) # right-click menu - descriptions = collectCommandsFromXCU(os.path.join(dir, file), descriptions, contextCommands, 'PopupLabel', type) + descriptions = collectCommandsFromXCU(os.path.join(dir, file), + descriptions, + contextCommands, + 'PopupLabel', type) # toolbar - descriptions = collectCommandsFromXCU(os.path.join(dir, file), descriptions, toolbarCommands, 'PopupLabel', type) - descriptions = collectCommandsFromXCU(os.path.join(dir, file), descriptions, toolbarCommands, 'TooltipLabel', type) + descriptions = collectCommandsFromXCU(os.path.join(dir, file), + descriptions, + toolbarCommands, + 'PopupLabel', type) + descriptions = collectCommandsFromXCU(os.path.join(dir, file), + descriptions, + toolbarCommands, + 'TooltipLabel', type) # fallbacks - descriptions = collectCommandsFromXCU(os.path.join(dir, file), descriptions, menuCommands, 'Label', type) - descriptions = collectCommandsFromXCU(os.path.join(dir, file), descriptions, contextCommands, 'Label', type) - descriptions = collectCommandsFromXCU(os.path.join(dir, file), descriptions, toolbarCommands, 'Label', type) + descriptions = collectCommandsFromXCU(os.path.join(dir, file), + descriptions, menuCommands, + 'Label', type) + descriptions = collectCommandsFromXCU(os.path.join(dir, file), + descriptions, + contextCommands, + 'Label', type) + descriptions = collectCommandsFromXCU(os.path.join(dir, file), + descriptions, + toolbarCommands, + 'Label', type) # output the unocommands.js - f = open(onlineDir + '/loleaflet/src/unocommands.js', 'w', encoding='utf-8') + f = open(onlineDir + '/loleaflet/src/unocommands.js', 'w', + encoding='utf-8') f.write('''// Don't modify, generated using unocommands.py var unoCommandsArray = {\n''') @@ -266,7 +302,8 @@ var unoCommandsArray = {\n''') for type in sorted(descriptions[key].keys()): f.write(type + ':{') for menuType in sorted(descriptions[key][type].keys()): - f.write(menuType + ":_('" + descriptions[key][type][menuType] + "'),") + f.write(menuType + ":_('" + descriptions[key][type][menuType] + + "'),") f.write('},') f.write('},\n') @@ -312,11 +349,13 @@ window.removeAccessKey = function(text) { return descriptions + # Read the uno commands present in the unocommands.js for checking def parseUnocommandsJS(onlineDir): strings = {} - f = open(onlineDir + '/loleaflet/src/unocommands.js', 'r', encoding='utf-8') + f = open(onlineDir + '/loleaflet/src/unocommands.js', 'r', + encoding='utf-8') readingCommands = False for line in f: m = re.match(r"\t([^:]*):.*", line) @@ -329,19 +368,22 @@ def parseUnocommandsJS(onlineDir): return strings + # Generate translation JSONs for the .uno: commands def writeTranslations(onlineDir, translationsDir, strings): keys = set(strings.keys()) dir = translationsDir + '/source/' for lang in os.listdir(dir): - poFile = dir + lang + '/officecfg/registry/data/org/openoffice/Office/UI.po' + poFile = dir + lang + + '/officecfg/registry/data/org/openoffice/Office/UI.po' if not os.path.isfile(poFile): continue sys.stderr.write('Generating ' + lang + '...\n') - po = polib.pofile(poFile, autodetect_encoding=False, encoding="utf-8", wrapwidth=-1) + po = polib.pofile(poFile, autodetect_encoding=False, + encoding="utf-8", wrapwidth=-1) translations = {} for entry in po.translated_entries(): @@ -353,7 +395,8 @@ def writeTranslations(onlineDir, translationsDir, strings): if text == entry.msgid: translations[entry.msgid] = entry.msgstr - f = open(onlineDir + '/loleaflet/l10n/uno/' + lang + '.json', 'w', encoding='utf-8') + f = open(onlineDir + '/loleaflet/l10n/uno/' + + lang + '.json', 'w', encoding='utf-8') f.write('{\n') writeComma = False @@ -362,10 +405,12 @@ def writeTranslations(onlineDir, translationsDir, strings): f.write(',\n') else: writeComma = True - f.write('"' + key.replace('"','\\\"') + '":"' + translations[key].replace('"','\\\"') + '"') + f.write('"' + key.replace('"', '\\\"') + '":"' + + translations[key].replace('"', '\\\"') + '"') f.write('\n}\n') + if __name__ == "__main__": if len(sys.argv) < 2: usageAndExit() @@ -407,11 +452,13 @@ if __name__ == "__main__": parsed = parseUnocommandsJS(onlineDir) processedCommands = set(parsed.keys()) else: - written = writeUnocommandsJS(onlineDir, lofficeDir, menuCommands, contextCommands, toolbarCommands) + written = writeUnocommandsJS(onlineDir, lofficeDir, menuCommands, + contextCommands, toolbarCommands) processedCommands = set(written.keys()) # check that we have translations for everything dif = (menuCommands | contextCommands | toolbarCommands) - processedCommands + if len(dif) > 0: sys.stderr.write("ERROR: The following commands are not covered in unocommands.js, run scripts/unocommands.py --update:\n\n.uno:" + '\n.uno:'.join(dif) + "\n\n") exit(1) |