Commit 8456e516 authored by Jim Fulton's avatar Jim Fulton

Various fixes to parsing code.

parent 2abb619c
...@@ -25,13 +25,15 @@ class String: ...@@ -25,13 +25,15 @@ class String:
def tagre(self): def tagre(self):
return regex.symcomp( return regex.symcomp(
'%(' # beginning '%(' # beginning
'\(<name>[a-z]+\)' # tag name '\(<name>[a-zA-Z0-9_/.-]+\)' # tag name
'[\0- ]*' # space after tag name '\('
'[\0- ]+' # space after tag name
'\(<args>\([^)"]+\("[^"]*"\)?\)*\)' # arguments '\(<args>\([^)"]+\("[^"]*"\)?\)*\)' # arguments
'\)?'
')\(<fmt>[0-9]*[.]?[0-9]*[a-z]\|[]![]\)' # end ')\(<fmt>[0-9]*[.]?[0-9]*[a-z]\|[]![]\)' # end
, regex.casefold) , regex.casefold)
def parseTag(self, tagre, command=None): def parseTag(self, tagre, command=None, sargs=''):
"""Parse a tag using an already matched re """Parse a tag using an already matched re
Return: tag, args, command, coname Return: tag, args, command, coname
...@@ -44,13 +46,23 @@ class String: ...@@ -44,13 +46,23 @@ class String:
or None otherwise or None otherwise
""" """
tag, name, args, fmt =tagre.group(0, 'name', 'args', 'fmt') tag, name, args, fmt =tagre.group(0, 'name', 'args', 'fmt')
args=args and strip(args) or ''
if fmt==']': if fmt==']':
if not command or name != command.name: if not command or name != command.name:
raise ParseError, 'unexpected end tag' raise ParseError, ('unexpected end tag', tag)
return tag, args, None, None return tag, args, None, None
elif fmt=='[' or fmt=='!': elif fmt=='[' or fmt=='!':
if command and name in command.blockContinuations: if command and name in command.blockContinuations:
if name=='else' and args:
# Waaaaaah! Have to special case else because of
# old else start tag usage. Waaaaaaah!
l=len(args)
if not (args==sargs or
args==sargs[:l] and sargs[l:l+1] in ' \t\n'):
return tag, args, self.commands[name], None
return tag, args, None, name return tag, args, None, name
try: return tag, args, self.commands[name], None try: return tag, args, self.commands[name], None
...@@ -58,7 +70,7 @@ class String: ...@@ -58,7 +70,7 @@ class String:
raise ParseError, ('Unexpected tag', tag) raise ParseError, ('Unexpected tag', tag)
else: else:
# Var command # Var command
args="%s %s" % (name, args) args=args and ("%s %s" % (name, args)) or name
return tag, args, Var, None return tag, args, Var, None
def varExtra(self,tagre): return tagre.group('fmt') def varExtra(self,tagre): return tagre.group('fmt')
...@@ -80,10 +92,12 @@ class String: ...@@ -80,10 +92,12 @@ class String:
start=self.parse_block(text, start, result, tagre, start=self.parse_block(text, start, result, tagre,
tag, l, args, command) tag, l, args, command)
else: else:
if command is Var: try:
result.append(command(args, self.varExtra(tagre))) if command is Var:
else: result.append(command(args, self.varExtra(tagre)))
result.append(command(args)) else:
result.append(command(args))
except ParseError, m: self.parse_error(m,tag,text,l)
l=tagre.search(text,start) l=tagre.search(text,start)
...@@ -106,19 +120,21 @@ class String: ...@@ -106,19 +120,21 @@ class String:
tname=scommand.name tname=scommand.name
sname=stag sname=stag
sstart=start sstart=start
sa=sargs
while 1: while 1:
l=tagre.search(text,start) l=tagre.search(text,start)
if l < 0: self.parse_error('No closing tag', stag, text, sloc) if l < 0: self.parse_error('No closing tag', stag, text, sloc)
try: tag, args, command, coname= self.parseTag(tagre,scommand) try: tag, args, command, coname= self.parseTag(tagre,scommand,sa)
except ParseError, m: self.parse_error(m[0],m[1], text, l) except ParseError, m: self.parse_error(m[0],m[1], text, l)
if command: if command:
start=l+len(tag) start=l+len(tag)
if hasattr(command, 'blockContinuations'): if hasattr(command, 'blockContinuations'):
# New open tag. Need to find closing tag. # New open tag. Need to find closing tag.
start=self.parse_close(text, start, tagre, tag, l, command) start=self.parse_close(text, start, tagre, tag, l,
command, args)
else: else:
# Either a continuation tag or an end tag # Either a continuation tag or an end tag
section=self.SubTemplate(sname) section=self.SubTemplate(sname)
...@@ -134,22 +150,25 @@ class String: ...@@ -134,22 +150,25 @@ class String:
sargs=args sargs=args
sstart=start sstart=start
else: else:
result.append(scommand(blocks)) try: result.append(scommand(blocks))
except ParseError, m: self.parse_error(m,stag,text,l)
return start return start
def parse_close(self, text, start, tagre, stag, sloc, scommand): def parse_close(self, text, start, tagre, stag, sloc, scommand, sa):
while 1: while 1:
l=tagre.search(text,start) l=tagre.search(text,start)
if l < 0: self.parse_error('No closing tag', stag, text, sloc) if l < 0: self.parse_error('No closing tag', stag, text, sloc)
try: tag, args, command, coname= self.parseTag(tagre,scommand) try: tag, args, command, coname= self.parseTag(tagre,scommand,sa)
except ParseError, m: self.parse_error(m[0],m[1], text, l) except ParseError, m: self.parse_error(m[0],m[1], text, l)
start=l+len(tag) start=l+len(tag)
if command: if command:
if hasattr(command, 'blockContinuations'): if hasattr(command, 'blockContinuations'):
# New open tag. Need to find closing tag. # New open tag. Need to find closing tag.
start=self.parse_close(text, start, tagre, tag, l, command) start=self.parse_close(text, start, tagre, tag, l,
command,args)
elif not coname: return start elif not coname: return start
shared_globals={} shared_globals={}
......
'''$Id: DT_Util.py,v 1.1 1997/08/27 18:55:43 jim Exp $''' '''$Id: DT_Util.py,v 1.2 1997/09/02 20:35:09 jim Exp $'''
############################################################################ ############################################################################
# Copyright # Copyright
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
# (540) 371-6909 # (540) 371-6909
# #
############################################################################ ############################################################################
__version__='$Revision: 1.1 $'[11:-2] __version__='$Revision: 1.2 $'[11:-2]
import sys, regex, string, types, math, os import sys, regex, string, types, math, os
from string import rfind, strip, joinfields, atoi,lower,upper,capitalize from string import rfind, strip, joinfields, atoi,lower,upper,capitalize
...@@ -133,7 +133,9 @@ def parse_params(text, ...@@ -133,7 +133,9 @@ def parse_params(text,
l=len(unparmre.group(1)) l=len(unparmre.group(1))
if result.has_key(''): if result.has_key(''):
if parms.has_key(name): result[name]=parms[name] if parms.has_key(name): result[name]=parms[name]
else: raise InvalidParameter, name else: raise ParseError, (
'Invalid parameter name, %s <!--%s--> <!--u-->'
% (name, text))
else: else:
result['']=name result['']=name
return apply(parse_params,(text[l:],result),parms) return apply(parse_params,(text[l:],result),parms)
...@@ -141,7 +143,8 @@ def parse_params(text, ...@@ -141,7 +143,8 @@ def parse_params(text,
if not text or not strip(text): return result if not text or not strip(text): return result
raise InvalidParameter, text raise InvalidParameter, text
if not parms.has_key(name): raise ParseError, name if not parms.has_key(name):
raise ParseError, 'Invalid parameter name, %s <!--%s-->' % (name, text)
result[name]=value result[name]=value
...@@ -154,6 +157,9 @@ except: from pDocumentTemplate import InstanceDict, TemplateDict, render_blocks ...@@ -154,6 +157,9 @@ except: from pDocumentTemplate import InstanceDict, TemplateDict, render_blocks
############################################################################ ############################################################################
# $Log: DT_Util.py,v $ # $Log: DT_Util.py,v $
# Revision 1.2 1997/09/02 20:35:09 jim
# Various fixes to parsing code.
#
# Revision 1.1 1997/08/27 18:55:43 jim # Revision 1.1 1997/08/27 18:55:43 jim
# initial # initial
# #
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment