Package translate :: Package filters :: Module prefilters

[hide private]
[frames] | no frames]

# Source Code for Module translate.filters.prefilters

      1  #!/usr/bin/env python
      2  # -*- coding: utf-8 -*-
      3  #
      4  # Copyright 2004-2008,2010 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  """This is a set of string filters that strings can be passed through before
     23  certain tests."""
     24
     25  import re
     26
     27  from translate.filters import decoration
     28  from translate.misc import quote
     29
     30
     31 -def removekdecomments(str1):
     32      """removed kde-style po comments i.e. starting with _: and ending with litteral \\n"""
     33      assert isinstance(str1, unicode)
     34      iskdecomment = False
     35      lines = str1.split("\n")
     36      removelines = []
     37      for linenum in range(len(lines)):
     38          line = lines[linenum]
     39          if line.startswith("_:"):
     40              lines[linenum] = ""
     41              iskdecomment = True
     42          if iskdecomment:
     43              removelines.append(linenum)
     44          if line.strip() and not iskdecomment:
     45              break
     46          if iskdecomment and line.strip().endswith("\\n"):
     47              iskdecomment = False
     48      lines = [lines[linenum] for linenum in range(len(lines)) if linenum not in removelines]
     49      return "\n".join(lines)
     50
     51
     52 -def filteraccelerators(accelmarker):
     53      """returns a function that filters accelerators marked using accelmarker in strings"""
     54      if accelmarker is None:
     55          accelmarkerlen = 0
     56      else:
     57          accelmarkerlen = len(accelmarker)
     58
     59      def filtermarkedaccelerators(str1, acceptlist=None):
     60          """modifies the accelerators in str1 marked with a given marker, using a given filter"""
     61          acclocs, badlocs = decoration.findaccelerators(str1, accelmarker, acceptlist)
     62          fstr1, pos = "", 0
     63          for accelstart, accelerator in acclocs:
     64              fstr1 += str1[pos:accelstart]
     65              fstr1 += accelerator
     66              pos = accelstart + accelmarkerlen + len(accelerator)
     67          fstr1 += str1[pos:]
     68          return fstr1
     69      return filtermarkedaccelerators
     70
     71
     72 -def varname(variable, startmarker, endmarker):
     73      """a simple variable filter that returns the variable name without the marking punctuation"""
     74      return variable
     75      # if the punctuation were included, we'd do the following:
     76      if startmarker is None:
     77          return variable[:variable.rfind(endmarker)]
     78      elif endmarker is None:
     79          return variable[variable.find(startmarker)+len(startmarker):]
     80      else:
     81          return variable[variable.find(startmarker)+len(startmarker):variable.rfind(endmarker)]
     82
     83
     84 -def varnone(variable, startmarker, endmarker):
     85      """a simple variable filter that returns an emoty string"""
     86      return ""
     87
     88
     89 -def filtervariables(startmarker, endmarker, varfilter):
     90      """returns a function that filters variables marked using startmarker and
     91      endmarker in strings"""
     92      if startmarker is None:
     93          startmarkerlen = 0
     94      else:
     95          startmarkerlen = len(startmarker)
     96      if endmarker is None:
     97          endmarkerlen = 0
     98      elif type(endmarker) == int:
     99          endmarkerlen = 0
    100      else:
    101          endmarkerlen = len(endmarker)
    102
    103      def filtermarkedvariables(str1):
    104          """modifies the variables in str1 marked with a given marker, using a given filter"""
    105          varlocs = decoration.findmarkedvariables(str1, startmarker, endmarker)
    106          fstr1, pos = "", 0
    107          for varstart, variable in varlocs:
    108              fstr1 += str1[pos:varstart]
    109              fstr1 += varfilter(variable, startmarker, endmarker)
    110              pos = varstart + startmarkerlen + len(variable) + endmarkerlen
    111          fstr1 += str1[pos:]
    112          return fstr1
    113      return filtermarkedvariables
    114
    115  # a list of special words with punctuation
    116  # all apostrophes in the middle of the word are handled already
    117  wordswithpunctuation = ["'n", "'t", # Afrikaans
    118                         ]
    119  # map all the words to their non-punctified equivalent
    120  wordswithpunctuation = dict([(word, filter(str.isalnum, word)) for word in wordswithpunctuation])
    121
    122  word_with_apos_re = re.compile("(?u)\w+'\w+")
    123
    124 -def filterwordswithpunctuation(str1):
    125      """goes through a list of known words that have punctuation and removes the
    126      punctuation from them"""
    127      if u"'" not in str1:
    128          return str1
    129      occurrences = []
    130      for word, replacement in wordswithpunctuation.iteritems():
    131          occurrences.extend([(pos, word, replacement) for pos in quote.find_all(str1, word)])
    132      for match in word_with_apos_re.finditer(str1):
    133          word = match.group()
    134          replacement = filter(unicode.isalnum, word)
    135          occurrences.append((match.start(), word, replacement))
    136      occurrences.sort()
    137      if occurrences:
    138          lastpos = 0
    139          newstr1 = ""
    140          for pos, word, replacement in occurrences:
    141              newstr1 += str1[lastpos:pos]
    142              newstr1 += replacement
    143              lastpos = pos + len(word)
    144          newstr1 += str1[lastpos:]
    145          return newstr1
    146      else:
    147          return str1
    148