Changeset 28
- Timestamp:
- 19/08/04 16:06:52 (4 years ago)
- Files:
-
- trunk/airspeed.py (modified) (8 diffs)
- trunk/airspeed_test.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/airspeed.py
r27 r28 65 65 66 66 class FileLoader: 67 def __init__(self, basedir): 68 self.basedir = basedir 69 67 70 def load_text(self, name): 68 f = open(name) 71 import os 72 f = open(os.path.join(self.basedir, name)) 69 73 try: return f.read() 70 74 finally: f.close() … … 194 198 195 199 class StringLiteral(_Element): 196 STRING = re.compile(r'"((?:\\["nrbt\\\\]|[^"\n\r "\\])+)"(.*)', re.S)200 STRING = re.compile(r'"((?:\\["nrbt\\\\]|[^"\n\r\\])+)"(.*)', re.S) 197 201 ESCAPED_CHAR = re.compile(r'\\([nrbt"\\])') 198 202 … … 200 204 value, = self.identity_match(self.STRING) 201 205 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)] 203 207 self.value = self.ESCAPED_CHAR.sub(unescape, value) 204 208 … … 207 211 208 212 213 class SingleQuotedStringLiteral(StringLiteral): 214 STRING = re.compile(r"'((?:\\['nrbt\\\\]|[^'\n\r\\])+)'(.*)", re.S) 215 ESCAPED_CHAR = re.compile(r"\\([nrbt'\\])") 216 217 209 218 class Value(_Element): 210 219 def parse(self): 211 self.expression = self.next_element((SimpleReference, IntegerLiteral, StringLiteral ))220 self.expression = self.next_element((SimpleReference, IntegerLiteral, StringLiteral, SingleQuotedStringLiteral)) 212 221 213 222 def calculate(self, namespace): … … 350 359 if self.binary_operator is None: 351 360 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) 355 363 356 364 … … 389 397 self.identity_match(self.START) 390 398 self.condition = self.next_element(Condition) 391 self.block = self. next_element(Block)399 self.block = self.require_next_element(Block, "block") 392 400 self.elseifs = [] 393 401 while True: … … 492 500 self.identity_match(self.START) 493 501 self.require_match(self.OPEN_PAREN, '(') 494 self.name = self.require_next_element((StringLiteral, Si mpleReference), 'template name')502 self.name = self.require_next_element((StringLiteral, SingleQuotedStringLiteral, SimpleReference), 'template name') 495 503 self.require_match(self.CLOSE_PAREN, ')') 496 504 … … 507 515 self.identity_match(self.START) 508 516 self.require_match(self.OPEN_PAREN, '(') 509 self.name = self.require_next_element((StringLiteral, Si mpleReference), 'template name')517 self.name = self.require_next_element((StringLiteral, SingleQuotedStringLiteral, SimpleReference), 'template name') 510 518 self.require_match(self.CLOSE_PAREN, ')') 511 519 trunk/airspeed_test.py
r27 r28 131 131 def test_can_use_a_string_variable_defined_in_template(self): 132 132 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") 133 137 self.assertEquals("Steve", template.merge({})) 134 138 … … 364 368 template = airspeed.Template('Message is: #parse ("foo.tmpl")!') 365 369 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())) 366 372 367 373 # … … 372 378 # range literals 373 379 # list literals 374 # #parse375 380 # Bind #macro calls at compile time? 376 381 # Interpolated strings
