Changeset 28

Show
Ignore:
Timestamp:
19/08/04 16:06:52 (4 years ago)
Author:
steve
Message:

single-quoted string literals

Files:

Legend:

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

    r27 r28  
    6565 
    6666class FileLoader: 
     67    def __init__(self, basedir): 
     68        self.basedir = basedir 
     69 
    6770    def load_text(self, name): 
    68         f = open(name) 
     71        import os 
     72        f = open(os.path.join(self.basedir, name)) 
    6973        try: return f.read() 
    7074        finally: f.close() 
     
    194198 
    195199class StringLiteral(_Element): 
    196     STRING = re.compile(r'"((?:\\["nrbt\\\\]|[^"\n\r"\\])+)"(.*)', re.S) 
     200    STRING = re.compile(r'"((?:\\["nrbt\\\\]|[^"\n\r\\])+)"(.*)', re.S) 
    197201    ESCAPED_CHAR = re.compile(r'\\([nrbt"\\])') 
    198202 
     
    200204        value, = self.identity_match(self.STRING) 
    201205        def unescape(match): 
    202             return {'n': '\n', 'r': '\r', 'b': '\b', 't': '\t', '"': '"', '\\': '\\'}[match.group(1)] 
     206            return {'n': '\n', 'r': '\r', 'b': '\b', 't': '\t', '"': '"', '\\': '\\', "'": "'"}[match.group(1)] 
    203207        self.value = self.ESCAPED_CHAR.sub(unescape, value) 
    204208 
     
    207211 
    208212 
     213class SingleQuotedStringLiteral(StringLiteral): 
     214    STRING = re.compile(r"'((?:\\['nrbt\\\\]|[^'\n\r\\])+)'(.*)", re.S) 
     215    ESCAPED_CHAR = re.compile(r"\\([nrbt'\\])") 
     216 
     217 
    209218class Value(_Element): 
    210219    def parse(self): 
    211         self.expression = self.next_element((SimpleReference, IntegerLiteral, StringLiteral)) 
     220        self.expression = self.next_element((SimpleReference, IntegerLiteral, StringLiteral, SingleQuotedStringLiteral)) 
    212221 
    213222    def calculate(self, namespace): 
     
    350359        if self.binary_operator is None: 
    351360            return self.value.calculate(namespace) 
    352         else: 
    353             value1, value2 = self.value.calculate(namespace), self.value2.calculate(namespace) 
    354             return self.binary_operator.apply_to(value1, value2) 
     361        value1, value2 = self.value.calculate(namespace), self.value2.calculate(namespace) 
     362        return self.binary_operator.apply_to(value1, value2) 
    355363 
    356364 
     
    389397        self.identity_match(self.START) 
    390398        self.condition = self.next_element(Condition) 
    391         self.block = self.next_element(Block
     399        self.block = self.require_next_element(Block, "block"
    392400        self.elseifs = [] 
    393401        while True: 
     
    492500        self.identity_match(self.START) 
    493501        self.require_match(self.OPEN_PAREN, '(') 
    494         self.name = self.require_next_element((StringLiteral, SimpleReference), 'template name') 
     502        self.name = self.require_next_element((StringLiteral, SingleQuotedStringLiteral, SimpleReference), 'template name') 
    495503        self.require_match(self.CLOSE_PAREN, ')') 
    496504 
     
    507515        self.identity_match(self.START) 
    508516        self.require_match(self.OPEN_PAREN, '(') 
    509         self.name = self.require_next_element((StringLiteral, SimpleReference), 'template name') 
     517        self.name = self.require_next_element((StringLiteral, SingleQuotedStringLiteral, SimpleReference), 'template name') 
    510518        self.require_match(self.CLOSE_PAREN, ')') 
    511519 
  • trunk/airspeed_test.py

    r27 r28  
    131131    def test_can_use_a_string_variable_defined_in_template(self): 
    132132        template = airspeed.Template('#set ($value = "Steve")$value') 
     133        self.assertEquals("Steve", template.merge({})) 
     134 
     135    def test_can_use_a_single_quoted_string_variable_defined_in_template(self): 
     136        template = airspeed.Template("#set ($value = 'Steve')$value") 
    133137        self.assertEquals("Steve", template.merge({})) 
    134138 
     
    364368        template = airspeed.Template('Message is: #parse ("foo.tmpl")!') 
    365369        self.assertEquals('Message is: hola!', template.merge({'message': 'hola'}, loader=WorkingLoader())) 
     370        template = airspeed.Template('Message is: #parse ($foo)!') 
     371        self.assertEquals('Message is: hola!', template.merge({'foo': 'foo.tmpl', 'message': 'hola'}, loader=WorkingLoader())) 
    366372 
    367373# 
     
    372378#  range literals 
    373379#  list literals 
    374 #  #parse 
    375380#  Bind #macro calls at compile time? 
    376381#  Interpolated strings