Changeset 2

Show
Ignore:
Timestamp:
11/08/04 18:32:32 (4 years ago)
Author:
steve
Message:

newlines in templates

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/airspeed.py

    r1 r2  
    33import re 
    44 
    5 class SyntaxError(Exception): 
    6     pass 
    7  
     5class SyntaxError(Exception): pass 
    86 
    97class Tokeniser: 
    108    PLAIN, IF, PLACEHOLDER, END = range(4) 
    119 
    12     REST = '(.*)$'     
    1310    UP_TO_NEXT_TEMPLATE_BIT = re.compile('^(.*?)((?:#|\$).*)', re.MULTILINE + re.DOTALL) 
    14  
     11    REST = '(.*)$' 
    1512    NAME_OR_CALL = '[a-z0-9_]+(?:\(\))?' 
    1613    EXPRESSION = '(' + NAME_OR_CALL + '(?:\.' + NAME_OR_CALL + ')*)' 
    17     PLACEHOLDER_PATTERN = re.compile('^\$(!?)({?)' + EXPRESSION + '(}?)' + REST, re.IGNORECASE
    18     BEGIN_IF_PATTERN = re.compile('^#if[ \t]*\([ \t]*\$' + EXPRESSION + '[ \t]*\)' + REST, re.IGNORECASE
    19     END_PATTERN = re.compile('^#end' + REST, re.IGNORECASE
    20      
     14    PLACEHOLDER_PATTERN = re.compile('^\$(!?)({?)' + EXPRESSION + '(}?)' + REST, re.IGNORECASE + re.DOTALL + re.MULTILINE
     15    BEGIN_IF_PATTERN = re.compile('^#if[ \t]*\([ \t]*\$' + EXPRESSION + '[ \t]*\)' + REST, re.IGNORECASE + re.DOTALL + re.MULTILINE
     16    END_PATTERN = re.compile('^#end' + REST, re.IGNORECASE + re.DOTALL + re.MULTILINE
     17 
    2118    def tokenise(self, text): 
    2219        while True: 
     
    4340                continue 
    4441            raise SyntaxError("invalid token: %s" % text[:40]) 
    45          
     42 
    4643    def get_placeholder(self, match): 
    4744        silent, open_brace, var_name, close_brace, rest = match.groups() 
     
    5754 
    5855class Parser: 
    59      
     56 
    6057    def __init__(self): 
    6158        self.data = {} 
    62          
     59 
    6360    def merge(self, content): 
    6461        output = [] 
    6562        filter_output_at_nesting_level = [False] 
    66         for token_type, token_value in Tokeniser().tokenise(str(content)): 
     63        tokens = Tokeniser().tokenise(str(content)) 
     64        for token_type, token_value in tokens: 
    6765            filter_at_this_level = filter_output_at_nesting_level[-1] 
    6866            if token_type == Tokeniser.PLAIN: 
     
    9088                continue 
    9189            raise SyntaxError("invalid token: %s" % text[:40]) 
    92                  
     90 
    9391        if len(filter_output_at_nesting_level) > 1: 
    9492            raise SyntaxError("Unclosed block") 
    9593        return ''.join(output) 
    96          
     94 
    9795 
    9896    def find(self, expression): 
     
    111109            if o in (None, self.data): return None 
    112110        return o 
    113                  
    114          
     111 
     112 
    115113    def __setitem__(self, name, value): 
    116114        self.data[name] = value 
     
    121119    def __init__(self, content): 
    122120        self.content = content 
    123          
     121 
    124122    def __str__(self): 
    125123        return self.content 
    126      
    127124 
    128      
    129          
     125 
  • trunk/airspeed_test.py

    r1 r2  
    3939        parser["name"] = "World" 
    4040        self.assertEquals("Hello World.", parser.merge(template)) 
    41          
     41 
    4242    def test_unmatched_braces_raises_exception(self): 
    4343        parser = airspeed.Parser() 
     
    5151        parser["name"] = "World" 
    5252        self.assertEquals("Hello World}.", parser.merge(template)) 
    53          
     53 
    5454    def test_can_return_value_from_an_attribute_of_a_context_object(self): 
    5555        parser = airspeed.Parser() 
     
    6969        parser["name"] = o 
    7070        self.assertEquals("Hello Chris", parser.merge(template)) 
    71          
     71 
    7272    def test_can_return_value_from_a_method_of_a_context_object(self): 
    7373        parser = airspeed.Parser() 
     
    8383        parser["name"] = "Steve" 
    8484        self.assertEquals("Hello your name is Steve Good to see you", parser.merge(template)) 
    85          
     85 
    8686    def test_when_if_statement_resolves_to_false_the_content_is_skipped(self): 
    8787        parser = airspeed.Parser() 
     
    108108        parser["show_greeting"] = True 
    109109        parser["is_birthday"] = True 
    110         self.assertEquals("Hello Steve.\nHappy Birthday\n.\nOff out later?", parser.merge(template)) 
    111          
    112          
     110        self.assertEquals("hello Steve.\nHappy Birthday\n.\nOff out later?", parser.merge(template)) 
     111 
     112 
    113113if __name__ == '__main__': 
     114    reload(airspeed) 
    114115    try: main() 
    115116    except SystemExit: pass