Skip to content
Snippets Groups Projects
Commit a02f5907 authored by Mike Bayer's avatar Mike Bayer
Browse files

- leading utf-8 BOM in template files is honored according to pep-0263

parent 7b56458e
No related branches found
No related tags found
No related merge requests found
......@@ -19,6 +19,7 @@
- control lines, i.e. % lines, support backslashes to continue long
lines (#32)
- fixed codegen bug when defining <%def> within <%call> within <%call>
- leading utf-8 BOM in template files is honored according to pep-0263
0.1.5
- AST expression generation - added in just about everything
......
......@@ -6,7 +6,7 @@
"""provides the Lexer class for parsing template strings into parse trees."""
import re
import re, codecs
from mako import parsetree, exceptions
from mako.pygen import adjust_whitespace
......@@ -116,10 +116,18 @@ class Lexer(object):
def parse(self):
for preproc in self.preprocessor:
self.text = preproc(self.text)
parsed_encoding = self.match_encoding()
if not isinstance(self.text, unicode) and self.text.startswith(codecs.BOM_UTF8):
self.text = self.text[len(codecs.BOM_UTF8):]
parsed_encoding = 'utf-8'
me = self.match_encoding()
if me is not None and me != 'utf-8':
raise exceptions.CompileException("Found utf-8 BOM in file, with conflicting magic encoding comment of '%s'" % me, self.text.decode('utf-8', 'ignore'), 0, 0, self.filename)
else:
parsed_encoding = self.match_encoding()
if parsed_encoding:
self.encoding = parsed_encoding
if not isinstance(self.text, unicode):
if self.encoding:
try:
self.text = self.text.decode(self.encoding)
......@@ -314,4 +322,4 @@ class Lexer(object):
return True
else:
return False
\ No newline at end of file
......@@ -6,6 +6,7 @@ from mako.ext.preprocessors import convert_comments
from mako import exceptions
import unittest, re, os
from util import flatten_result, result_lines
import codecs
if not os.access('./test_htdocs', os.F_OK):
os.mkdir('./test_htdocs')
......@@ -17,6 +18,12 @@ file('./test_htdocs/unicode_syntax_error.html', 'w').write("""## -*- coding: utf
<% print '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! » %>""")
file('./test_htdocs/unicode_runtime_error.html', 'w').write("""## -*- coding: utf-8 -*-
<% print '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! »' + int(5/0) %>""")
file('./test_htdocs/bommagic.html', 'w').write(codecs.BOM_UTF8 + """## -*- coding: 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! »""")
file('./test_htdocs/badbom.html', 'w').write(codecs.BOM_UTF8 + """## -*- coding: ascii -*-
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! »""")
file('./test_htdocs/bom.html', 'w').write(codecs.BOM_UTF8 + """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):
......@@ -32,6 +39,19 @@ class EncodingTest(unittest.TestCase):
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_bom(self):
template = Template(filename='./test_htdocs/bom.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! »"""
template = Template(filename='./test_htdocs/bommagic.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! »"""
try:
template = Template(filename='./test_htdocs/badbom.html', module_directory='./test_htdocs')
assert False
except exceptions.CompileException:
assert True
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 = "## coding: utf-8\n" + val.encode('utf-8')
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment