From ecc8dab3ab8d2d58a0faadc16fa928e8eda5f314 Mon Sep 17 00:00:00 2001 From: Mike Bayer <mike_mp@zzzcomputing.com> Date: Sat, 9 Dec 2006 01:56:46 +0000 Subject: [PATCH] lexer picks up on magic encoding comment --- examples/wsgi/htdocs/index.html | 3 +++ lib/mako/codegen.py | 3 +++ lib/mako/lexer.py | 12 ++++++++++++ test/lexer.py | 1 + test/lookup.py | 20 +++++++++++--------- test/template.py | 17 ++++++++++++++++- 6 files changed, 46 insertions(+), 10 deletions(-) diff --git a/examples/wsgi/htdocs/index.html b/examples/wsgi/htdocs/index.html index 79a5af2..0f0ce9d 100644 --- a/examples/wsgi/htdocs/index.html +++ b/examples/wsgi/htdocs/index.html @@ -1,3 +1,6 @@ +<% +%> + <%inherit file="root.html"/> This is index.html diff --git a/lib/mako/codegen.py b/lib/mako/codegen.py index 71f8152..a06ef26 100644 --- a/lib/mako/codegen.py +++ b/lib/mako/codegen.py @@ -66,6 +66,8 @@ class _GenerateRenderMethod(object): namespaces = {} module_code = [] pagetag = [None] + encoding =[None] + class FindTopLevel(object): def visitInheritTag(s, node): inherit.append(node) @@ -76,6 +78,7 @@ class _GenerateRenderMethod(object): def visitCode(self, node): if node.ismodule: module_code.append(node) + f = FindTopLevel() for n in self.node.nodes: n.accept_visitor(f) diff --git a/lib/mako/lexer.py b/lib/mako/lexer.py index 921d206..d032b5a 100644 --- a/lib/mako/lexer.py +++ b/lib/mako/lexer.py @@ -88,7 +88,12 @@ class Lexer(object): raise exceptions.SyntaxException("Keyword '%s' not a legal ternary for keyword '%s'" % (node.keyword, self.control_line[-1].keyword), self.matched_lineno, self.matched_charpos, self.filename) def parse(self): + encoding = self.match_encoding() + if encoding: + self.text = self.text.decode(encoding) + length = len(self.text) + while (True): if self.match_position > length: break @@ -116,6 +121,13 @@ class Lexer(object): raise exceptions.SyntaxException("Unclosed tag: <%%%s>" % self.tag[-1].keyword, self.matched_lineno, self.matched_charpos, self.filename) return self.template + def match_encoding(self): + match = self.match(r'#\s*-\*- encoding: (.+?) -\*-\n') + if match: + return match.group(1) + else: + return None + def match_tag_start(self): match = self.match(r''' \<% # opening tag diff --git a/test/lexer.py b/test/lexer.py index 8b7fe67..db9d4c8 100644 --- a/test/lexer.py +++ b/test/lexer.py @@ -14,6 +14,7 @@ class LexerTest(unittest.TestCase): and some more text. """ node = Lexer(template).parse() + print repr(node) assert repr(node) == r"""TemplateNode({}, [Text('\n<b>Hello world</b>\n ', (1, 1)), DefTag('def', {'name': 'foo'}, (3, 9), ["Text('\\n this is a def.\\n ', (3, 26))"]), Text('\n \n and some more text.\n', (5, 16))])""" def test_unclosed_tag(self): diff --git a/test/lookup.py b/test/lookup.py index 25d54e3..5986f64 100644 --- a/test/lookup.py +++ b/test/lookup.py @@ -7,16 +7,18 @@ import os if not os.access('./test_htdocs', os.F_OK): os.mkdir('./test_htdocs') - file('./test_htdocs/index.html', 'w').write("this is index") - file('./test_htdocs/incl.html', 'w').write("this is include 1") +file('./test_htdocs/index.html', 'w').write("this is index") +file('./test_htdocs/incl.html', 'w').write("this is include 1") +if not os.access('./test_htdocs/subdir', os.F_OK): os.mkdir('./test_htdocs/subdir') - file('./test_htdocs/subdir/incl.html', 'w').write(""" - this is include 2 - """) - file('./test_htdocs/subdir/index.html', 'w').write(""" - this is sub index - <%include file="incl.html"/> - """) +file('./test_htdocs/subdir/incl.html', 'w').write(""" + this is include 2 +""") +file('./test_htdocs/subdir/index.html', 'w').write(""" + this is sub index + <%include file="incl.html"/> +""") + tl = lookup.TemplateLookup(directories=['./test_htdocs']) class LookupTest(unittest.TestCase): def test_basic(self): diff --git a/test/template.py b/test/template.py index 6c9c4ef..5700d76 100644 --- a/test/template.py +++ b/test/template.py @@ -1,9 +1,14 @@ # -*- encoding: utf-8 -*- from mako.template import Template -import unittest, re +import unittest, re, os from util import flatten_result, result_lines +if not os.access('./test_htdocs', os.F_OK): + os.mkdir('./test_htdocs') +file('./test_htdocs/unicode.html', 'w').write("""# -*- encoding: utf-8 -*- +Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »""") + class EncodingTest(unittest.TestCase): def test_unicode(self): template = Template(u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »""") @@ -14,6 +19,16 @@ class EncodingTest(unittest.TestCase): template = Template("${val}") assert template.render_unicode(val=val) == u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »""" + def test_unicode_file(self): + template = Template(filename='./test_htdocs/unicode.html', module_directory='./test_htdocs') + assert template.render_unicode() == u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »""" + + def test_unicode_memory(self): + val = u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »""" + val = "# -*- encoding: utf-8 -*-\n" + val.encode('utf-8') + template = Template(val) + assert template.render_unicode() == u"""Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »""" + class ControlTest(unittest.TestCase): def test_control(self): t = Template(""" -- GitLab