Package translate :: Package storage :: Package placeables :: Module xliff |
[hide private]
[frames] | no frames]

# Source Code for Module translate.storage.placeables.xliff

      1  #!/usr/bin/env python
      2  # -*- coding: utf-8 -*-
      3  #
      4  # Copyright 2008-2009 Zuza Software Foundation
      5  #
      6  # This file is part of the Translate Toolkit.
      7  #
      8  # This program 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  # This program 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 this program; if not, see <http://www.gnu.org/licenses/>.
     20
     21  """Contains XLIFF-specific placeables."""
     22
     23  from translate.storage.placeables import base
     24  from translate.storage.placeables.strelem import StringElem
     25
     26  __all__ = ['Bpt', 'Ept', 'X', 'Bx', 'Ex', 'G', 'It', 'Sub', 'Ph', 'UnknownXML', 'parsers', 'to_xliff_placeables']
     27
     28
     29 -class Bpt(base.Bpt):
     30      pass
     31
     32
     33 -class Ept(base.Ept):
     34      pass
     35
     36
     37 -class Ph(base.Ph):
     38      pass
     39
     40
     41 -class It(base.It):
     42      pass
     43
     44
     45 -class G(base.G):
     46      pass
     47
     48
     49 -class Bx(base.Bx):
     50      pass
     51
     52
     53 -class Ex(base.Ex):
     54      pass
     55
     56
     57 -class X(base.X):
     58      pass
     59
     60
     61 -class Sub(base.Sub):
     62      pass
     63
     64
     65 -class UnknownXML(StringElem):
     66      """Placeable for unrecognized or umimplemented XML nodes. It's main
     67          purpose is to preserve all associated XML data."""
     68      iseditable = True
     69
     70      # INITIALIZERS #
     71 -    def __init__(self, sub=None, id=None, rid=None, xid=None, xml_node=None, **kwargs):
     72          super(UnknownXML, self).__init__(sub=sub, id=id, rid=rid, xid=xid, **kwargs)
     73          if xml_node is None:
     74              raise ValueError('xml_node must be a lxml node')
     75          self.xml_node = xml_node
     76
     77          if sub:
     78              self.has_content = True
     79
     80
     81      # SPECIAL METHODS #
     82 -    def __repr__(self):
     83          """String representation of the sub-tree with the current node as the
     84              root.
     85
     86              Copied from L{StringElem.__repr__}, but includes C{self.xml_node.tag}."""
     87          tag = self.xml_node.tag
     88          if tag.startswith('{'):
     89              tag = tag[tag.index('}')+1:]
     90
     91          elemstr = ', '.join([repr(elem) for elem in self.sub])
     92
     93          return '<%(class)s{%(tag)s}(%(id)s%(rid)s%(xid)s[%(subs)s])>' % {
     94              'class': self.__class__.__name__,
     95              'tag': tag,
     96              'id':  self.id  is not None and 'id="%s" '  % (self.id) or '',
     97              'rid': self.rid is not None and 'rid="%s" ' % (self.rid) or '',
     98              'xid': self.xid is not None and 'xid="%s" ' % (self.xid) or '',
     99              'subs': elemstr
    100          }
    101
    102
    103      # METHODS #
    104 -    def copy(self):
    105          """Returns a copy of the sub-tree.
    106              This should be overridden in sub-classes with more data.
    107
    108              NOTE: C{self.renderer} is B{not} copied."""
    109          from copy import copy
    110          cp = self.__class__(id=self.id, rid=self.rid, xid=self.xid, xml_node=copy(self.xml_node))
    111          for sub in self.sub:
    112              if isinstance(sub, StringElem):
    113                  cp.sub.append(sub.copy())
    114              else:
    115                  cp.sub.append(sub.__class__(sub))
    116          return cp
    117
    118
    119 -def to_xliff_placeables(tree):
    120      if not isinstance(tree, StringElem):
    121          return tree
    122
    123      newtree = None
    124
    125      classmap = {
    126          base.Bpt: Bpt,
    127          base.Ept: Ept,
    128          base.Ph:  Ph,
    129          base.It:  It,
    130          base.G:   G,
    131          base.Bx:  Bx,
    132          base.Ex:  Ex,
    133          base.X:   X,
    134          base.Sub: Sub
    135      }
    136      for baseclass, xliffclass in classmap.items():
    137          if isinstance(tree, baseclass):
    138              newtree = xliffclass()
    139
    140      if newtree is None:
    141          newtree = tree.__class__()
    142
    143      newtree.id = tree.id
    144      newtree.rid = tree.rid
    145      newtree.xid = tree.xid
    146      newtree.sub = []
    147
    148      for subtree in tree.sub:
    149          newtree.sub.append(to_xliff_placeables(subtree))
    150
    151      return newtree
    152
    153
    154  parsers = []
    155