# HG changeset patch # User cmlenz # Date 1158070116 0 # Node ID 4501f2fef82f1da05f5de6eefccf8c4c0d61915b # Parent 7a426ab6407a4a35cfbf4e84d1da156374c8a29d * Minor simplification of XPath engine. * Updated change log. diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,8 @@ http://svn.edgewall.org/repos/genshi/tags/0.3.0/ (?, from branches/stable/0.3.x) + * The project name was changed from "Markup" to "Genshi". See UPGRADE.txt + for upgrade instructions. * Expression evaluation now differentiates between undefined variables and variables that are defined but set to `None`. This also means that local variables can override built-ins even if the local variable are set to @@ -34,6 +36,8 @@ to multiple elements (ticket #49). * Using namespace prefixes in XPath expressions is now supported. * Expressions now correctly handle slices (ticket #51). + * A simple text-based template language is now included for generating + plain text output (ticket #47). Version 0.2 diff --git a/genshi/path.py b/genshi/path.py --- a/genshi/path.py +++ b/genshi/path.py @@ -559,7 +559,7 @@ def __call__(self, kind, data, pos, namespaces, variables): if kind is START: if self.principal_type is ATTRIBUTE and self.name in data[1]: - return TEXT, data[1].get(self.name), pos + return data[1].get(self.name) else: return data[0].localname == self.name def __repr__(self): @@ -578,7 +578,7 @@ qname = QName('%s}%s' % (namespaces.get(self.prefix), self.name)) if kind is START: if self.principal_type is ATTRIBUTE and qname in data[1]: - return TEXT, data[1].get(qname), pos + return data[1].get(qname) else: return data[0] == qname def __repr__(self): @@ -731,7 +731,7 @@ __slots__ = [] def __call__(self, kind, data, pos, namespaces, variables): if kind is START: - return TEXT, data[0].localname, pos + return data[0].localname def __repr__(self): return 'local-name()' @@ -742,7 +742,7 @@ __slots__ = [] def __call__(self, kind, data, pos, namespaces, variables): if kind is START: - return TEXT, data[0], pos + return data[0] def __repr__(self): return 'name()' @@ -753,7 +753,7 @@ __slots__ = [] def __call__(self, kind, data, pos, namespaces, variables): if kind is START: - return TEXT, data[0].namespace, pos + return data[0].namespace def __repr__(self): return 'namespace-uri()' diff --git a/genshi/tests/path.py b/genshi/tests/path.py --- a/genshi/tests/path.py +++ b/genshi/tests/path.py @@ -90,7 +90,7 @@ path = Path('./@foo') self.assertEqual('', repr(path)) - self.assertEqual('bar', Path('./@foo').select(xml).render()) + self.assertEqual('bar', path.select(xml).render()) def test_1step_text(self): xml = XML('Hey') @@ -181,8 +181,7 @@ def test_3step(self): xml = XML('') path = Path('foo/*') - self.assertEqual('', - repr(path)) + self.assertEqual('', repr(path)) self.assertEqual('', path.select(xml).render()) def test_3step_complex(self): @@ -233,57 +232,57 @@ def test_simple_union(self): xml = XML('Oh my') path = Path('*|text()') - self.assertEqual('', - repr(path)) + self.assertEqual('', repr(path)) self.assertEqual('Oh my', path.select(xml).render()) def test_predicate_name(self): xml = XML('') - self.assertEqual('', - Path('*[name()="foo"]').select(xml).render()) + path = Path('*[name()="foo"]') + self.assertEqual('', path.select(xml).render()) def test_predicate_localname(self): xml = XML('') - self.assertEqual('', - Path('*[local-name()="foo"]').select(xml).render()) + path = Path('*[local-name()="foo"]') + self.assertEqual('', path.select(xml).render()) def test_predicate_namespace(self): xml = XML('') - self.assertEqual('', - Path('*[namespace-uri()="NS"]').select(xml).render()) + path = Path('*[namespace-uri()="NS"]') + self.assertEqual('', path.select(xml).render()) def test_predicate_not_name(self): xml = XML('') - self.assertEqual('', - Path('*[not(name()="foo")]').select(xml).render()) + path = Path('*[not(name()="foo")]') + self.assertEqual('', path.select(xml).render()) def test_predicate_attr(self): xml = XML('') - self.assertEqual('', - Path('item[@important]').select(xml).render()) - self.assertEqual('', - Path('item[@important="very"]').select(xml).render()) + path = Path('item[@important]') + self.assertEqual('', path.select(xml).render()) + path = Path('item[@important="very"]') + self.assertEqual('', path.select(xml).render()) def test_predicate_attr_equality(self): xml = XML('') - self.assertEqual('', - Path('item[@important="very"]').select(xml).render()) + path = Path('item[@important="very"]') + self.assertEqual('', path.select(xml).render()) + path = Path('item[@important!="very"]') self.assertEqual('', - Path('item[@important!="very"]').select(xml).render()) + path.select(xml).render()) def test_predicate_attr_greater_than(self): xml = XML('') - self.assertEqual('', - Path('item[@priority>3]').select(xml).render()) - self.assertEqual('', - Path('item[@priority>2]').select(xml).render()) + path = Path('item[@priority>3]') + self.assertEqual('', path.select(xml).render()) + path = Path('item[@priority>2]') + self.assertEqual('', path.select(xml).render()) def test_predicate_attr_less_than(self): xml = XML('') - self.assertEqual('', - Path('item[@priority<3]').select(xml).render()) - self.assertEqual('', - Path('item[@priority<4]').select(xml).render()) + path = Path('item[@priority<3]') + self.assertEqual('', path.select(xml).render()) + path = Path('item[@priority<4]') + self.assertEqual('', path.select(xml).render()) def test_predicate_attr_and(self): xml = XML('')