diff --git a/secretary.py b/secretary.py
index 723b81b..0fae7ac 100644
--- a/secretary.py
+++ b/secretary.py
@@ -431,7 +431,7 @@ class Renderer(object):
"""
Replace line feed and/or tabs within text:span entities.
"""
- find_pattern = r'(?is)([^>]*?([\n|\t])[^<]*?)'
+ find_pattern = r'(?is)([^>]*?([\n\t])[^<]*?)'
for m in re.findall(find_pattern, xml_text):
replacement = m[1].replace('\n', '')
replacement = replacement.replace('\t', '')
diff --git a/test_secretary.py b/test_secretary.py
index 9e21bca..9000a0b 100644
--- a/test_secretary.py
+++ b/test_secretary.py
@@ -79,12 +79,23 @@ class RenderTestCase(TestCase):
def test_create_text_span_node(self):
assert self.engine.create_text_span_node(self.document, 'text').toxml() == 'text'
- def test_newline(self):
- xml_text = 'Teststraße 5\n1234 Lünen'
- result = Renderer._encode_escape_chars(xml_text)
- assert result == 'Teststraße 51234 Lünen'
- def test_evil_newline(self):
- xml_text = '\n\n'
- result = Renderer._encode_escape_chars(xml_text)
- assert result == '\n'
+class EncodeLFAndFWithinTextNamespace(TestCase):
+ """Test encoding of line feed and tab chars within text: namespace"""
+ def test_encode_linefeed_char(self):
+ xml = 'This\nLF'
+ espected = 'ThisLF'
+ assert (Renderer._encode_escape_chars(xml) == espected)
+
+ def test_encode_tab_char(self):
+ xml = 'This\tTab'
+ espected = 'ThisTab'
+ assert (Renderer._encode_escape_chars(xml) == espected)
+
+ def test_escape_elem_with_attributes(self):
+ """A bug in _encode_escape_chars was preventing it from escaping
+ LF and tabs inside text elements with tag attributes. See:
+ https://github.com/christopher-ramirez/secretary/issues/39"""
+ xml = 'This\nLF'
+ espected = 'ThisLF'
+ assert (Renderer._encode_escape_chars(xml) == espected)