def convert_forward(self, input_fname, template=None, output_fname=None, **options): """Convert the given input file to the next type in the process: Source document (eg. ODT) -> Translation file (eg. XLIFF) -> Translated document (eg. ODT). :type input_fname: basestring :param input_fname: The project name of the file to convert :type convert_options: Dictionary (optional) :param convert_options: Passed as-is to :meth:`translate.convert.factory.convert`. :returns 2-tuple: the converted file object and its project name. """ inputfile = self.get_file(input_fname) input_type = self.store.get_filename_type(input_fname) if input_type == 'tgt': raise ValueError('Cannot convert a target document further: %s' % (input_fname)) templ_fname = None if isinstance(template, str): template, templ_fname = self.get_file(template) if template and not templ_fname: templ_fname = template.name # Check if we can determine a template from the conversion map if template is None: convert_map = self.store.convert_map if input_fname in convert_map: templ_fname = convert_map[input_fname][1] template = self.get_file(templ_fname) elif input_type == 'trans': # inputfile is a translatable file, so it needed to be converted # from some input document. Let's try and use that document as a # template for this conversion. for in_name, (out_name, tmpl_name) in self.store.convert_map.items(): if input_fname == out_name: template, templ_fname = self.get_file(in_name), in_name break # Populate the conv_options dict with the options we can detect conv_options = dict(in_fname=input_fname) if input_fname in self.store.convert_map: out_name, tmpl_name = self.store.convert_map[input_fname] if out_name in self.store._files and options.get( 'overwrite_output', True): self.remove_file(out_name) converted_file, converted_ext = convert_factory.convert( inputfile, template=template, options=conv_options, convert_options=options.get('convert_options', None)) # Determine the file name and path where the output should be moved. if not output_fname: _dir, fname = os.path.split(input_fname) directory = '' if hasattr(inputfile, 'name'): # Prefer to put it in the same directory as the input file directory, _fn = os.path.split(inputfile.name) else: # Otherwise put it in the current working directory directory = os.getcwd() output_fname = os.path.join(directory, fname) output_fname, output_ext = split_extensions(output_fname) output_ext_parts = output_ext.split(os.extsep) # Add the output suffix, if supplied if 'output_suffix' in options: output_fname += options['output_suffix'] # Check if we are in the situation where the output has an extension # of, for example, .odt.xlf.odt. If so, we want to change that to only # .odt. if len(output_ext_parts ) >= 2 and output_ext_parts[-2] == converted_ext: output_ext_parts = output_ext_parts[:-1] else: output_ext_parts.append(converted_ext) output_fname += os.extsep.join([''] + output_ext_parts) if os.path.isfile(output_fname): # If the output file already exist, we can't assume that it's safe # to overwrite it. os.unlink(converted_file.name) raise IOError("Output file already exists: %s" % (output_fname)) os.rename(converted_file.name, output_fname) output_type = self.store.TYPE_INFO['next_type'][input_type] outputfile, output_fname = self.store.append_file(output_fname, None, ftype=output_type, delete_orig=True) self.store.convert_map[input_fname] = (output_fname, templ_fname) return outputfile, output_fname
def convert_forward(self, input_fname, template=None, output_fname=None, **options): """Convert the given input file to the next type in the process: Source document (eg. ODT) -> Translation file (eg. XLIFF) -> Translated document (eg. ODT). :type input_fname: basestring :param input_fname: The project name of the file to convert :type convert_options: dict (optional) :param convert_options: Passed as-is to :meth:`translate.convert.factory.convert`. :returns 2-tuple: the converted file object and its project name.""" inputfile = self.get_file(input_fname) input_type = self.store.get_filename_type(input_fname) if input_type == 'tgt': raise ValueError('Cannot convert a target document further: %s' % (input_fname)) templ_fname = None if isinstance(template, six.string_types): template, templ_fname = self.get_file(template) if template and not templ_fname: templ_fname = template.name # Check if we can determine a template from the conversion map if template is None: convert_map = self.store.convert_map if input_fname in convert_map: templ_fname = convert_map[input_fname][1] template = self.get_file(templ_fname) elif input_type == 'trans': # inputfile is a translatable file, so it needed to be converted # from some input document. Let's try and use that document as a # template for this conversion. for in_name, (out_name, tmpl_name) in self.store.convert_map.items(): if input_fname == out_name: template, templ_fname = self.get_file(in_name), in_name break # Populate the conv_options dict with the options we can detect conv_options = dict(in_fname=input_fname) if input_fname in self.store.convert_map: out_name, tmpl_name = self.store.convert_map[input_fname] if out_name in self.store._files and options.get('overwrite_output', True): self.remove_file(out_name) converted_file, converted_ext = convert_factory.convert( inputfile, template=template, options=conv_options, convert_options=options.get('convert_options', None)) # Determine the file name and path where the output should be moved. if not output_fname: _dir, fname = os.path.split(input_fname) directory = '' if hasattr(inputfile, 'name'): # Prefer to put it in the same directory as the input file directory, _fn = os.path.split(inputfile.name) else: # Otherwise put it in the current working directory directory = os.getcwd() output_fname = os.path.join(directory, fname) output_fname, output_ext = split_extensions(output_fname) output_ext_parts = output_ext.split(os.extsep) # Add the output suffix, if supplied if 'output_suffix' in options: output_fname += options['output_suffix'] # Check if we are in the situation where the output has an extension # of, for example, .odt.xlf.odt. If so, we want to change that to only # .odt. if len(output_ext_parts) >= 2 and output_ext_parts[-2] == converted_ext: output_ext_parts = output_ext_parts[:-1] else: output_ext_parts.append(converted_ext) output_fname += os.extsep.join([''] + output_ext_parts) if os.path.isfile(output_fname): # If the output file already exist, we can't assume that it's safe # to overwrite it. os.unlink(converted_file.name) raise IOError("Output file already exists: %s" % (output_fname)) os.rename(converted_file.name, output_fname) output_type = self.store.TYPE_INFO['next_type'][input_type] outputfile, output_fname = self.store.append_file( output_fname, None, ftype=output_type, delete_orig=True) self.store.convert_map[input_fname] = (output_fname, templ_fname) return outputfile, output_fname