Skip to content

Commit

Permalink
Make conditionals tests pass with django syntax.
Browse files Browse the repository at this point in the history
  • Loading branch information
Maxim Avanov committed Mar 23, 2014
1 parent 717ac26 commit b910c4c
Show file tree
Hide file tree
Showing 5 changed files with 138 additions and 12 deletions.
62 changes: 51 additions & 11 deletions plim/lexer.py
Expand Up @@ -1108,17 +1108,20 @@ def parse_statements(indent_level, __, matched, source, syntax):
"""
stmnt = matched.group('stmnt')
expr = matched.group('expr')
buf = ['\n%{statement}'.format(statement=stmnt)]
buf = ['\n{statement_start}{statement}'.format(
statement_start=syntax.STATEMENT_START_START_SEQUENCE,
statement=stmnt
)]
if expr:
expr, source = extract_statement_expression(expr, source)
expr, tail_line, source = extract_identifier(expr, source, '', STATEMENT_TERMINATORS)
expr = expr.lstrip()
tail_line = tail_line[1:].lstrip()
parsed, tail_indent, tail_line, source = parse_plim_tail(0, indent_level, tail_line, source, syntax)
buf.append(joined([' ', expr, ':\n', joined(parsed)]))
buf.append(joined([' ', expr, syntax.STATEMENT_START_END_SEQUENCE, '\n', joined(parsed)]))
else:
# So far only the "-try" statement has empty ``expr`` part
buf.append(':\n')
buf.extend([syntax.STATEMENT_START_END_SEQUENCE, '\n'])
try:
lineno, tail_line = next(source)
except StopIteration:
Expand All @@ -1142,7 +1145,14 @@ def parse_statements(indent_level, __, matched, source, syntax):
expr = expr.lstrip()
tail_line = tail_line[1:].lstrip()
parsed, tail_indent, tail_line, source = parse_plim_tail(0, indent_level, tail_line, source, syntax)
buf.append(joined(['\n%elif {expr}:\n'.format(expr=expr), joined(parsed)]))
buf.append(joined([
'\n',
syntax.STATEMENT_START_START_SEQUENCE,
'elif {expr}'.format(expr=expr),
syntax.STATEMENT_START_END_SEQUENCE,
'\n',
joined(parsed)
]))
if tail_line:
continue
break
Expand All @@ -1155,18 +1165,43 @@ def parse_statements(indent_level, __, matched, source, syntax):
expr = expr.lstrip()
tail_line = tail_line[1:].lstrip()
parsed, tail_indent, tail_line, source = parse_plim_tail(0, indent_level, tail_line, source, syntax)
buf.append(joined(['\n%else:\n'.format(expr=expr), joined(parsed)]))
buf.append(joined([
'\n',
syntax.STATEMENT_START_START_SEQUENCE,
'else',
syntax.STATEMENT_START_END_SEQUENCE,
'\n',
joined(parsed)
]))
if tail_line:
continue
buf.append(joined(['\n%else:\n'.format(expr=expr)]))
buf.append(joined([
'\n',
syntax.STATEMENT_START_START_SEQUENCE,
'else',
syntax.STATEMENT_START_END_SEQUENCE,
'\n'
]))
break
else:
# elif/else is not found, finalize and return buffer
buf.append('\n%end{statement}\n'.format(statement=stmnt))
buf.extend([
'\n',
syntax.STATEMENT_END_START_SEQUENCE,
'end{statement}'.format(statement=stmnt),
syntax.STATEMENT_END_END_SEQUENCE,
'\n'
])
return joined(buf), tail_indent, tail_line, source

elif tail_indent < indent_level:
buf.append('\n%end{statement}\n'.format(statement=stmnt))
buf.extend([
'\n',
syntax.STATEMENT_END_START_SEQUENCE,
'end{statement}'.format(statement=stmnt),
syntax.STATEMENT_END_END_SEQUENCE,
'\n'
])
return joined(buf), tail_indent, tail_line, source

# tail_indent > indent_level
Expand Down Expand Up @@ -1220,8 +1255,13 @@ def parse_statements(indent_level, __, matched, source, syntax):
break
tail_indent, tail_line = scan_line(tail_line)


buf.append('\n%end{statement}\n'.format(statement=stmnt))
buf.extend([
'\n',
syntax.STATEMENT_END_START_SEQUENCE,
'end{statement}'.format(statement=stmnt),
syntax.STATEMENT_END_END_SEQUENCE,
'\n'
])
return joined(buf), 0, '', source


Expand Down Expand Up @@ -1361,7 +1401,7 @@ def _inject_n_filter(line):


def parse_variable(indent_level, __, matched, source, syntax):
"""
""" = variable or == variable
:param indent_level:
:param __:
Expand Down
10 changes: 10 additions & 0 deletions plim/syntax.py
Expand Up @@ -4,6 +4,12 @@
class BaseSyntax(object):
VARIABLE_PLACEHOLDER_START_SEQUENCE = '${'
VARIABLE_PLACEHOLDER_END_SEQUENCE = '}'

STATEMENT_START_START_SEQUENCE = '%'
STATEMENT_START_END_SEQUENCE = ':'
STATEMENT_END_START_SEQUENCE = '%'
STATEMENT_END_END_SEQUENCE = ''

STANDARD_PARSERS = l.STANDARD_PARSERS

def __init__(self, custom_parsers=None):
Expand All @@ -24,3 +30,7 @@ class Mako(BaseSyntax):
class Django(BaseSyntax):
VARIABLE_PLACEHOLDER_START_SEQUENCE = '{{'
VARIABLE_PLACEHOLDER_END_SEQUENCE = '}}'
STATEMENT_START_START_SEQUENCE = '{% '
STATEMENT_START_END_SEQUENCE = ' %}'
STATEMENT_END_START_SEQUENCE = STATEMENT_START_START_SEQUENCE
STATEMENT_END_END_SEQUENCE = STATEMENT_START_END_SEQUENCE
13 changes: 12 additions & 1 deletion tests/django_test/__init__.py
@@ -1,5 +1,7 @@
# -*- coding: utf-8 -*-
import os

import plim
from plim import lexer as l
from plim import syntax
from plim.errors import PlimSyntaxError, ParserNotFound
Expand All @@ -11,4 +13,13 @@ class TestDjangoSyntax(TestCaseBase):

def setUp(self):
super(TestDjangoSyntax, self).setUp()
self.syntax = syntax.Django()
self.preprocessor = plim.preprocessor_factory(syntax='django')
here = os.path.abspath(os.path.dirname(__file__))
self.templates_dir = os.path.join(here, 'fixtures')

def test_conditionals(self):
test_case = 'if'
source = self.get_file_contents(test_case + '_test.plim')
result = self.get_file_contents(test_case + '_result.djhtml')
data = self.preprocessor(source)
self.check_relevant_chars(data.strip(), result.strip())
31 changes: 31 additions & 0 deletions tests/django_test/fixtures/if_result.djhtml
@@ -0,0 +1,31 @@
{% if True %}
<div>1 Test</div>
{% endif %}
<div>2 Test</div>------------------------------------

{% if False %}
<div>3 False Test</div>
{% if True %}
<div>4 Test</div>
{% endif %}
<div>5 Test</div>
{% elif True %}
<div>6 True Test</div>
{% elif 1 == 1 %}
<div>7 Test</div>
{% else %}
<div>8 Else Test</div>
{% endif %}

{% if False %}

{% elif True %}

{% else %}

{% endif %}
{% if (a == b) or (c == d) %}
Test
{% elif (e == f) %}
Test2
{% endif %}
34 changes: 34 additions & 0 deletions tests/django_test/fixtures/if_test.plim
@@ -0,0 +1,34 @@


- if True
div 1 Test
div 2 Test

|------------------------------------

-if False
div 3 False Test
- if True
div 4 Test
div 5 Test
-elif True
div 6 True Test
- elif 1 == 1
div 7 Test
-else
div 8 Else Test

-if False
-elif True
-else

/--------------------------------
- if (
a == b
) or (
c == d)
|Test
-elif (
e == f
)
|Test2

0 comments on commit b910c4c

Please sign in to comment.