# HG changeset patch # User cmlenz # Date 1181938769 0 # Node ID 5b59e911e6c30df2a3c4e6962d6c42169eb456ff # Parent c8b6d3c0d389c2cb6aaf5804f05ffbc24c78f59e Ported [626] to 0.4.x branch. diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,9 @@ * `TextTemplate` can now handle unicode source (ticket #125). * A `` processing instruction containing trailing whitespace no longer causes a syntax error (ticket #127). + * The I18n filter now skips the content of elements that have an `xml:lang` + attribute with a fixed string value. Basically, `xml:lang` can now be used + as a flag to mark specific sections as not needing localization. Version 0.4.1 diff --git a/genshi/filters/i18n.py b/genshi/filters/i18n.py --- a/genshi/filters/i18n.py +++ b/genshi/filters/i18n.py @@ -8,7 +8,8 @@ from opcode import opmap import re -from genshi.core import Attrs, Namespace, QName, START, END, TEXT, _ensure +from genshi.core import Attrs, Namespace, QName, START, END, TEXT, \ + XML_NAMESPACE, _ensure from genshi.template.base import Template, EXPR, SUB from genshi.template.markup import EXEC @@ -65,6 +66,10 @@

Hallo, Hans

+ + Note that elements defining ``xml:lang`` attributes that do not contain + variable expressions are ignored by this filter. That can be used to + exclude specific parts of a template from being extracted and translated. """ IGNORE_TAGS = frozenset([ @@ -106,25 +111,24 @@ include_attrs = self.include_attrs translate = self.translate skip = 0 + xml_lang = XML_NAMESPACE['lang'] for kind, data, pos in stream: # skip chunks that should not be localized if skip: if kind is START: - tag, attrs = data - if tag in ignore_tags: - skip += 1 + skip += 1 elif kind is END: - if tag in ignore_tags: - skip -= 1 + skip -= 1 yield kind, data, pos continue # handle different events that can be localized if kind is START: tag, attrs = data - if tag in ignore_tags: + if tag in self.ignore_tags or \ + isinstance(attrs.get(xml_lang), basestring): skip += 1 yield kind, data, pos continue @@ -213,22 +217,20 @@ """ tagname = None skip = 0 + xml_lang = XML_NAMESPACE['lang'] for kind, data, pos in stream: if skip: if kind is START: - tag, attrs = data - if tag in self.ignore_tags: - skip += 1 + skip += 1 if kind is END: - tag = data - if tag in self.ignore_tags: - skip -= 1 + skip -= 1 continue if kind is START: tag, attrs = data - if tag in self.ignore_tags: + if tag in self.ignore_tags or \ + isinstance(attrs.get(xml_lang), basestring): skip += 1 continue diff --git a/genshi/filters/tests/i18n.py b/genshi/filters/tests/i18n.py --- a/genshi/filters/tests/i18n.py +++ b/genshi/filters/tests/i18n.py @@ -66,6 +66,23 @@ self.assertEqual(1, len(messages)) self.assertEqual((2, None, u'Foo'), messages[0]) + def test_ignore_tag_with_fixed_xml_lang(self): + tmpl = MarkupTemplate(""" +

(c) 2007 Edgewall Software

+ """) + translator = Translator() + messages = list(translator.extract(tmpl.stream)) + self.assertEqual(0, len(messages)) + + def test_extract_tag_with_variable_xml_lang(self): + tmpl = MarkupTemplate(""" +

(c) 2007 Edgewall Software

+ """) + translator = Translator() + messages = list(translator.extract(tmpl.stream)) + self.assertEqual(1, len(messages)) + self.assertEqual((2, None, u'(c) 2007 Edgewall Software'), messages[0]) + def suite(): suite = unittest.TestSuite()