Commit 68eebc78 authored by Michal Čihař's avatar Michal Čihař

Update aresource support

parent 2fccf71f
...@@ -25,6 +25,7 @@ from lxml import etree ...@@ -25,6 +25,7 @@ from lxml import etree
from StringIO import StringIO from StringIO import StringIO
import re import re
import pdb
from translate.storage import lisa from translate.storage import lisa
from translate.storage import base from translate.storage import base
...@@ -33,21 +34,23 @@ from translate.lang import data ...@@ -33,21 +34,23 @@ from translate.lang import data
EOF = None EOF = None
WHITESPACE = ' \n\t' # Whitespace that we collapse WHITESPACE = ' \n\t' # Whitespace that we collapse
MULTIWHITESPACE = re.compile('[ \n\t]{2}') MULTIWHITESPACE = re.compile('[ \n\t]{2}')
OPEN_TAG_TO_ESCAPE = re.compile('<(?!/?\S*>)')
class AndroidResourceUnit(base.TranslationUnit): class AndroidResourceUnit(base.TranslationUnit):
"""A single term in the Android resource file.""" """A single term in the Android resource file."""
rootNode = "string" rootNode = "string"
languageNode = "string" languageNode = "string"
def __init__(self, source, empty=False, **kwargs): def __init__(self, source, empty=False, xmlelement = None, **kwargs):
self.xmlelement = etree.Element(self.rootNode) if xmlelement is not None:
self.xmlelement.tail = '\n' self.xmlelement = xmlelement
if source is not None: else:
self.xmlelement.set('name', source) self.xmlelement = etree.Element(self.rootNode)
self.xmlelement.tail = '\n'
super(AndroidResourceUnit, self).__init__(source) super(AndroidResourceUnit, self).__init__(source)
def _parse(self):
self.source = self.getid()
def getid(self): def getid(self):
return self.xmlelement.get("name") return self.xmlelement.get("name")
...@@ -57,7 +60,6 @@ class AndroidResourceUnit(base.TranslationUnit): ...@@ -57,7 +60,6 @@ class AndroidResourceUnit(base.TranslationUnit):
def setid(self, newid): def setid(self, newid):
return self.xmlelement.set("name", newid) return self.xmlelement.set("name", newid)
def unescape(self, text): def unescape(self, text):
''' '''
Remove escaping from Android resource. Remove escaping from Android resource.
...@@ -208,6 +210,7 @@ class AndroidResourceUnit(base.TranslationUnit): ...@@ -208,6 +210,7 @@ class AndroidResourceUnit(base.TranslationUnit):
text = text.replace('\t', '\\t') text = text.replace('\t', '\\t')
text = text.replace('\'', '\\\'') text = text.replace('\'', '\\\'')
text = text.replace('"', '\\"') text = text.replace('"', '\\"')
# @ needs to be escaped at start # @ needs to be escaped at start
if text.startswith('@'): if text.startswith('@'):
text = '\\@' + text[1:] text = '\\@' + text[1:]
...@@ -216,14 +219,32 @@ class AndroidResourceUnit(base.TranslationUnit): ...@@ -216,14 +219,32 @@ class AndroidResourceUnit(base.TranslationUnit):
return '"%s"' % text return '"%s"' % text
return text return text
def setsource(self, source):
super(AndroidResourceUnit, self).setsource(source)
def getsource(self, lang=None):
if (super(AndroidResourceUnit, self).source is None):
return self.target
else:
return super(AndroidResourceUnit, self).source
source = property(getsource, setsource)
def settarget(self, target): def settarget(self, target):
if '<' in target: if '<' in target:
# Handle text with markup # Handle text with markup
newtarget = etree.parse(StringIO('<string>' + self.escape(target) + '</string>')).getroot() target = self.escape(target).replace('&', '&amp;')
for attr in self.xmlelement.attrib: target = OPEN_TAG_TO_ESCAPE.sub('&lt;', target)
newtarget.set(attr, self.xmlelement.attrib[attr]) # Parse new XML
self.xmlelement.getparent().replace(self.xmlelement, newtarget) newstring = etree.parse(StringIO('<string>' + target + '</string>')).getroot()
self.xmlelement = newtarget # Update text
self.xmlelement.text = newstring.text
# Remove old elements
for x in self.xmlelement.iterchildren():
self.xmlelement.remove(x)
# Add new elements
for x in newstring.iterchildren():
self.xmlelement.append(x)
else: else:
# Handle text only # Handle text only
self.xmlelement.text = self.escape(target) self.xmlelement.text = self.escape(target)
...@@ -231,22 +252,51 @@ class AndroidResourceUnit(base.TranslationUnit): ...@@ -231,22 +252,51 @@ class AndroidResourceUnit(base.TranslationUnit):
def gettarget(self, lang=None): def gettarget(self, lang=None):
# Grab inner text # Grab inner text
target = (self.xmlelement.text or '') target = (self.xmlelement.text or u'')
# Include markup as well # Include markup as well
target += ''.join([etree.tostring(child, encoding = 'utf-8') for child in self.xmlelement.iterchildren()]) target += u''.join([data.forceunicode(etree.tostring(child, encoding = 'utf-8')) for child in self.xmlelement.iterchildren()])
return self.unescape(data.forceunicode(target)) return self.unescape(data.forceunicode(target))
target = property(gettarget, settarget) target = property(gettarget, settarget)
def getlanguageNode(self, lang=None, index=None): def getlanguageNode(self, lang=None, index=None):
return self.xmlelement return self.xmlelement
def createfromxmlElement(cls, element): def createfromxmlElement(cls, element):
term = cls(None, empty=True) term = cls(None, xmlelement = element)
term.xmlelement = element
term._parse()
return term return term
createfromxmlElement = classmethod(createfromxmlElement) createfromxmlElement = classmethod(createfromxmlElement)
# Notes are handled as previous sibling comments.
def addnote(self, text, origin=None, position="append"):
if origin in ['programmer', 'developer', 'source code', None]:
self.xmlelement.addprevious(etree.Comment(text))
else:
return super(AndroidResourceUnit, self).addnote(text, origin=origin,
position=position)
def getnotes(self, origin=None):
if origin in ['programmer', 'developer', 'source code', None]:
comments = []
if (self.xmlelement is not None):
prevSibling = self.xmlelement.getprevious()
while ((prevSibling is not None) and (prevSibling.tag is etree.Comment)):
comments.insert(0, prevSibling.text)
prevSibling = prevSibling.getprevious()
return u'\n'.join(comments)
else:
return super(AndroidResourceUnit, self).getnotes(origin)
def removenotes(self):
if ((self.xmlelement is not None) and (self.xmlelement.getparent is not None)):
prevSibling = self.xmlelement.getprevious()
while ((prevSibling is not None) and (prevSibling.tag is etree.Comment)):
prevSibling.getparent().remove(prevSibling)
prevSibling = self.xmlelement.getprevious()
super(AndroidResourceUnit, self).removenotes()
def __str__(self): def __str__(self):
return etree.tostring(self.xmlelement, pretty_print=True, return etree.tostring(self.xmlelement, pretty_print=True,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment