Package translate :: Package tools :: Module porestructure |
[hide private]
[frames] | no frames]

# Source Code for Module translate.tools.porestructure

      1  #!/usr/bin/env python
      2  # -*- coding: utf-8 -*-
      3  #
      4  # Copyright 2005, 2006 Zuza Software Foundation
      5  #
      6  # This file is part of translate.
      7  #
      8  # translate is free software; you can redistribute it and/or modify
      9  # it under the terms of the GNU General Public License as published by
     10  # the Free Software Foundation; either version 2 of the License, or
     11  # (at your option) any later version.
     12  #
     13  # translate is distributed in the hope that it will be useful,
     14  # but WITHOUT ANY WARRANTY; without even the implied warranty of
     15  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16  # GNU General Public License for more details.
     17  #
     18  # You should have received a copy of the GNU General Public License
     19  # along with translate; if not, write to the Free Software
     20  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     21
     22  """Restructure Gettxt PO files produced by poconflicts into the original
     23  directory tree for merging using pomerge
     24
     25  See: http://translate.sourceforge.net/wiki/toolkit/porestructure for examples and
     26  usage instructions
     27  """
     28
     29  import sys, os
     30  from translate.storage import po
     31  from translate.misc import optrecurse
     32
     33 -class SplitOptionParser(optrecurse.RecursiveOptionParser):
     34      """a specialized Option Parser for posplit"""
     35 -    def parse_args(self, args=None, values=None):
     36          """parses the command line options, handling implicit input/output args"""
     37          (options, args) = optrecurse.RecursiveOptionParser.parse_args(self, args, values)
     38          if not options.output:
     39              self.error("Output file is rquired")
     40          return (options, args)
     41
     42 -    def set_usage(self, usage=None):
     43          """sets the usage string - if usage not given, uses getusagestring for each option"""
     44          if usage is None:
     45              self.usage = "%prog " + " ".join([self.getusagestring(option) for option in self.option_list]) + \
     46              "\n  input directory is searched for PO files with (poconflicts) comments, all entries are written to files in a directory structure for pomerge"
     47          else:
     48              super(SplitOptionParser, self).set_usage(usage)
     49
     50 -    def recursiveprocess(self, options):
     51          """recurse through directories and process files"""
     52          if not self.isrecursive(options.output, 'output'):
     53              try:
     54                  self.warning("Output directory does not exist. Attempting to create")
     55                  #TODO: maybe we should only allow it to be created, otherwise we mess up an existing tree...
     56                  os.mkdir(options.output)
     57              except:
     58                  self.error(optrecurse.optparse.OptionValueError("Output directory does not exist, attempt to create failed"))
     59          if self.isrecursive(options.input, 'input') and getattr(options, "allowrecursiveinput", True):
     60              if isinstance(options.input, list):
     61                  inputfiles = self.recurseinputfilelist(options)
     62              else:
     63                  inputfiles = self.recurseinputfiles(options)
     64          else:
     65              if options.input:
     66                  inputfiles = [os.path.basename(options.input)]
     67                  options.input = os.path.dirname(options.input)
     68              else:
     69                  inputfiles = [options.input]
     70          self.textmap = {}
     71          self.initprogressbar(inputfiles, options)
     72          for inputpath in inputfiles:
     73              fullinputpath = self.getfullinputpath(options, inputpath)
     74              try:
     75                  success = self.processfile(options, fullinputpath)
     76              except Exception, error:
     77                  if isinstance(error, KeyboardInterrupt):
     78                      raise self.warning("Error processing: input %s" % (fullinputpath), options, sys.exc_info())
     79                  success = False
     80              self.reportprogress(inputpath, success)
     81          del self.progressbar
     82
     83 -    def processfile(self, options, fullinputpath):
     84          """process an individual file"""
     85          inputfile = self.openinputfile(options, fullinputpath)
     86          inputpofile = po.pofile(inputfile)
     87          for pounit in inputpofile.units:
     88              if not (pounit.isheader() or pounit.hasplural()): #XXX
     89                  if pounit.hasmarkedcomment("poconflicts"):
     90                      for comment in pounit.othercomments:
     91                          if comment.find("# (poconflicts)") == 0:
     92                              pounit.othercomments.remove(comment)
     93                              break
     94                      #TODO: refactor writing out
     95                      outputpath = comment[comment.find(")") + 2:].strip()
     96                      self.checkoutputsubdir(options, os.path.dirname(outputpath))
     97                      fulloutputpath = os.path.join(options.output, outputpath)
     98                      if os.path.isfile(fulloutputpath):
     99                          outputfile = open(fulloutputpath, 'r')
    100                          outputpofile = po.pofile(outputfile)
    101                      else:
    102                          outputpofile = po.pofile()
    103                      outputpofile.units.append(pounit)   #TODO:perhaps check to see if it's already there...
    104                      outputfile = open(fulloutputpath, 'w')
    105                      outputfile.write(str(outputpofile))
    106
    107 -def main():
    108      #outputfile extentions will actually be determined by the comments in the po files
    109      pooutput = ("po", None)
    110      formats = {(None, None): pooutput, ("po", "po"): pooutput, "po": pooutput}
    111      parser = SplitOptionParser(formats, description=__doc__)
    112      parser.set_usage()
    113      parser.run()
    114
    115
    116  if __name__ == '__main__':
    117      main()
    118