Index: grit/gather/muppet_strings.py |
=================================================================== |
--- grit/gather/muppet_strings.py (revision 0) |
+++ grit/gather/muppet_strings.py (revision 0) |
@@ -0,0 +1,142 @@ |
+#!/usr/bin/python2.4 |
+# Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+'''Support for "strings.xml" format used by Muppet plug-ins in Google Desktop.''' |
+ |
+import StringIO |
+import types |
+import re |
+import xml.sax |
+import xml.sax.handler |
+import xml.sax.saxutils |
+ |
+from grit.gather import regexp |
+from grit import util |
+from grit import tclib |
+ |
+# Placeholders can be defined in strings.xml files by putting the name of the |
+# placeholder between [![ and ]!] e.g. <MSG>Hello [![USER]!] how are you<MSG> |
+PLACEHOLDER_RE = re.compile('(\[!\[|\]!\])') |
+ |
+ |
+class MuppetStringsContentHandler(xml.sax.handler.ContentHandler): |
+ '''A very dumb parser for splitting the strings.xml file into translateable |
+ and nontranslateable chunks.''' |
+ |
+ def __init__(self, parent): |
+ self.curr_elem = '' |
+ self.curr_text = '' |
+ self.parent = parent |
+ self.description = '' |
+ self.meaning = '' |
+ self.translateable = True |
+ |
+ def startElement(self, name, attrs): |
+ if (name != 'strings'): |
+ self.curr_elem = name |
+ |
+ attr_names = attrs.getQNames() |
+ if 'desc' in attr_names: |
+ self.description = attrs.getValueByQName('desc') |
+ if 'meaning' in attr_names: |
+ self.meaning = attrs.getValueByQName('meaning') |
+ if 'translateable' in attr_names: |
+ value = attrs.getValueByQName('translateable') |
+ if value.lower() not in ['true', 'yes']: |
+ self.translateable = False |
+ |
+ att_text = [] |
+ for attr_name in attr_names: |
+ att_text.append(' ') |
+ att_text.append(attr_name) |
+ att_text.append('=') |
+ att_text.append( |
+ xml.sax.saxutils.quoteattr(attrs.getValueByQName(attr_name))) |
+ |
+ self.parent._AddNontranslateableChunk("<%s%s>" % |
+ (name, ''.join(att_text))) |
+ |
+ def characters(self, content): |
+ if self.curr_elem != '': |
+ self.curr_text += content |
+ |
+ def endElement(self, name): |
+ if name != 'strings': |
+ self.parent.AddMessage(self.curr_text, self.description, |
+ self.meaning, self.translateable) |
+ self.parent._AddNontranslateableChunk("</%s>\n" % name) |
+ self.curr_elem = '' |
+ self.curr_text = '' |
+ self.description = '' |
+ self.meaning = '' |
+ self.translateable = True |
+ |
+ def ignorableWhitespace(self, whitespace): |
+ pass |
+ |
+class MuppetStrings(regexp.RegexpGatherer): |
+ '''Supports the strings.xml format used by Muppet gadgets.''' |
+ |
+ def __init__(self, text): |
+ if util.IsExtraVerbose(): |
+ print text |
+ regexp.RegexpGatherer.__init__(self, text) |
+ |
+ def AddMessage(self, msgtext, description, meaning, translateable): |
+ if msgtext == '': |
+ return |
+ |
+ msg = tclib.Message(description=description, meaning=meaning) |
+ |
+ unescaped_text = self.UnEscape(msgtext) |
+ parts = PLACEHOLDER_RE.split(unescaped_text) |
+ in_placeholder = False |
+ for part in parts: |
+ if part == '': |
+ continue |
+ elif part == '[![': |
+ in_placeholder = True |
+ elif part == ']!]': |
+ in_placeholder = False |
+ else: |
+ if in_placeholder: |
+ msg.AppendPlaceholder(tclib.Placeholder(part, '[![%s]!]' % part, |
+ '(placeholder)')) |
+ else: |
+ msg.AppendText(part) |
+ |
+ self.skeleton_.append( |
+ self.uberclique.MakeClique(msg, translateable=translateable)) |
+ |
+ # if statement needed because this is supposed to be idempotent (so never |
+ # set back to false) |
+ if translateable: |
+ self.translatable_chunk_ = True |
+ |
+ # Although we use the RegexpGatherer base class, we do not use the |
+ # _RegExpParse method of that class to implement Parse(). Instead, we |
+ # parse using a SAX parser. |
+ def Parse(self): |
+ if (self.have_parsed_): |
+ return |
+ self.have_parsed_ = True |
+ self._AddNontranslateableChunk(u'<strings>\n') |
+ stream = StringIO.StringIO(self.text_) |
+ handler = MuppetStringsContentHandler(self) |
+ xml.sax.parse(stream, handler) |
+ self._AddNontranslateableChunk(u'</strings>\n') |
+ |
+ def Escape(self, text): |
+ return util.EncodeCdata(text) |
+ |
+ def FromFile(filename_or_stream, extkey=None, encoding='cp1252'): |
+ if isinstance(filename_or_stream, types.StringTypes): |
+ if util.IsVerbose(): |
+ print "MuppetStrings reading file %s, encoding %s" % ( |
+ filename_or_stream, encoding) |
+ filename_or_stream = util.WrapInputStream(file(filename_or_stream, 'r'), encoding) |
+ return MuppetStrings(filename_or_stream.read()) |
+ FromFile = staticmethod(FromFile) |
+ |
Property changes on: grit/gather/muppet_strings.py |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |