#************************************************************** # # 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 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # #************************************************************** from optparse import OptionParser from sdf import SdfData from pseudo import PseudoSet import sys import os import shutil class AbstractL10nTool: _options = {} _args = "" _resource_type = "" _source_language = "en-US" ##### Implement these abstract methods ##### Nameing scheme for the output files def get_outputfile_format_str(self): # filename,fileNoExt,language,extension,pathPrefix,pathPostFix,path #return "{path}/{fileNoExt}_{language}.{extension}" return self._options.pattern ################################# Merge single files ########################################### ##### Merge a single file def merge_file(self, inputfilename, outputfilename, parsed_file_ref, lang, is_forced_lang, sdfdata): pass ##### Helper for parse-once-use-often like parsing a xml file is needed implement it here def parse_file(self, filename): return None ################### Merge one big file containing all strings in all languages ################# def merge_one_big_file(self, inputfile, outputfilename, parsed_file_ref, lang, sdfdata): pass ################### Extract a single File ###################################################### def extract_file(self, inputfile): pass ################################################################################################ def format_outputfile(self, filename, language): extension = filename[filename.rfind('.')+1:] file = filename[:filename.rfind('.')] # Python 2.3.x friendly return self.get_outputfile_format_str().replace('[', '%(').replace(']',')s') % \ { 'filename': filename, 'fileNoExt': file, 'language': language, 'extension': extension, 'path_prefix': self._options.path_prefix, 'path_postfix': self._options.path_postfix, 'path': self.get_path() } #return self.get_outputfile_format_str().replace('[', '{').replace(']','}').format( # filename=filename, fileNoExt=file, language=language, extension=extension, path_prefix=self._options.path_prefix, # path_postfix=self._options.path_postfix, path=self.get_path()) def get_path(self): if self._options.outputfile.find('/') == -1: return "" else: return self._options.outputfile[:self._options.outputfile.rfind('/')] def merge(self, sdfdata): langset,forcedset, foundset = PseudoSet(), PseudoSet() , PseudoSet() if self._options.languages: langset = PseudoSet(self._options.languages) if self._options.forcedlanguages: forcedset = PseudoSet(self._options.forcedlanguages) if sdfdata.get_languages_found_in_sdf(): foundset = sdfdata.get_languages_found_in_sdf() if self.has_multi_inputfiles(): filelist = self.read_inputfile_list() else: filelist = self._options.inputfile for inputfile in filelist: ref = self.parse_file(inputfile) # Don't write that files if there is no l10n present if ((langset & foundset) - forcedset): # all langs given and found in sdf without enforced [self.merge_file(inputfile,self.format_outputfile(inputfile, lang), ref, lang, False, sdfdata) for lang in ((langset & foundset) - forcedset)] # Always write those files even if there is no l10n available if forcedset: # all enforced langs [self.merge_file(inputfile, self.format_outputfile(inputfile, lang), ref, lang, True, sdfdata) for lang in forcedset] # In case a big file have to be written if ((langset & foundset) | forcedset): # all langs given ,found in sdf and enforced ones self.merge_one_big_file(inputfile, self.format_outputfile(inputfile, lang), ref, ((langset & foundset) | forcedset), sdfdata) def has_multi_inputfiles(self): return self._options.inputfile[0] == '@' def copy_file(self, inputfilename, outputfilename): try: os.remove(outputfilename) except: pass try: os.remove(outputfilename) except: pass try: shutil.copy(inputfilename, outputfilename) except IOError: print "ERROR: Can not copy file '" + inputfilename + "' to " + "'" + outputfilename + "'" sys.exit(-1) def extract(self): try: f = open(self._options.outputfile, "w+") f.write(self.extract_file(self._options.inputfile)) except IOError: print "ERROR: Can not write file " + self._options.outputfile else: f.close() # Parse the common options def parse_options(self): parser = OptionParser() parser.add_option("-i", "--inputfile", dest="inputfile", metavar="FILE", help="resource file to read" ) parser.add_option("-o", "--outputfile", dest="outputfile", metavar="FILE", help="extracted sdf or merged file" ) parser.add_option("-m", "--inputsdffile", dest="input_sdf_file", metavar="FILE", help="merge this sdf file" ) parser.add_option("-x", "--pathprefix", dest="path_prefix", metavar="PATH", help="" ) parser.add_option("-y", "--pathpostfix", dest="path_postfix", metavar="PATH", help="" ) parser.add_option("-p", "--projectname", dest="project_name", metavar="NAME", help="" ) parser.add_option("-r", "--projectroot", dest="project_root", metavar="PATH", help="" ) parser.add_option("-f", "--forcedlanguages", dest="forcedlanguages", metavar="ISOCODE[,ISOCODE]", help="Always merge those langs even if no l10n is available for those langs" ) parser.add_option("-l", "--languages", dest="languages", metavar="ISOCODE[,ISOCODE]", help="Merge those langs if l10n is found for each") parser.add_option("-s", "--pattern", dest="pattern", metavar="", help="" ) parser.add_option("-q", "--quiet", action="store_true", dest="quietmode", help="",default=False) (self._options, self.args) = parser.parse_args() # -l "de,pr,pt-BR" => [ "de" , "pt" , "pt-BR" ] parse_complex_arg = lambda arg: arg.split(",") if self._options.forcedlanguages: self._options.forcedlanguages = parse_complex_arg(self._options.forcedlanguages) if self._options.languages: self._options.languages = parse_complex_arg(self._options.languages) self.test_options() def __init__(self): self.parse_options() if self._options.input_sdf_file != None and len(self._options.input_sdf_file): sdfdata = SdfData(self._options.input_sdf_file) sdfdata.read() self.merge(sdfdata) else: self.extract() def make_dirs(self, filename): dir = filename[:filename.rfind('/')] if os.path.exists(dir): if os.path.isfile(dir): print "ERROR: There is a file '"+dir+"' where I want create a directory" sys.exit(-1) else: return else: try: os.makedirs(dir) except IOError: print "Error: Can not create dir " + dir sys.exit(-1) def test_options(self): opt = self._options is_valid = lambda x: x != None and len(x) > 0 return is_valid(opt.project_root) and is_valid(opt.project_name) and is_valid(opt.languages) and \ ( is_valid(opt.inputfile) and (( is_valid(opt.path_prefix) and is_valid(opt.path_postfix) ) or is_valid(opt.outputfile)) and \ ( ( is_valid(opt.input_sdf_file) and ( is_valid(opt.outputfile) or ( is_valid(opt.path_prefix) and is_valid(opt.path_postfix) ) or \ ( is_valid(opt.inputfile) and is_valid(opt.outputFile)) )))) print "Strange options ..." sys.exit( -1 ) def read_inputfile_list(self): if self.has_multi_inputfiles(): lines = [] try: f = open(self._options.inputfile[1:], "r") lines = [line.strip('\n') for line in f.readlines()] except IOError: print "ERROR: Can not read file list " + self._options.inputfile[2:] sys.exit(-1) else: f.close() return lines def get_filename_string(self, inputfile): absfile = os.path.realpath(os.path.abspath(inputfile)) absroot = os.path.realpath(os.path.abspath(self._options.project_root)) return absfile[len(absroot)+1:].replace('/','\\')