Commit 6a8155da authored by Guido van Rossum's avatar Guido van Rossum

Prepare for a separate optimization pass:

- add getCode() interface to TALGenerator

- remove premature optimization from emitRawText()

- rework unEmitNewlineWhitespace() so it works with unoptimized code

- use getCode() in HTMLTALParser and TALParser
parent edf5ff68
...@@ -86,7 +86,7 @@ class HTMLTALParser(SGMLParser): ...@@ -86,7 +86,7 @@ class HTMLTALParser(SGMLParser):
assert self.nsdict == {}, self.nsdict assert self.nsdict == {}, self.nsdict
def getCode(self): def getCode(self):
return self.gen.program, self.gen.macros return self.gen.getCode()
# Overriding SGMLParser methods # Overriding SGMLParser methods
......
...@@ -86,6 +86,7 @@ ...@@ -86,6 +86,7 @@
Code generator for TALInterpreter intermediate code. Code generator for TALInterpreter intermediate code.
""" """
import string
import re import re
import cgi import cgi
...@@ -109,6 +110,12 @@ class TALGenerator: ...@@ -109,6 +110,12 @@ class TALGenerator:
self.slots = {} self.slots = {}
self.slotStack = [] self.slotStack = []
def getCode(self):
return self.optimize(self.program), self.macros
def optimize(self, program):
return program # XXX later
def todoPush(self, todo): def todoPush(self, todo):
self.todoStack.append(todo) self.todoStack.append(todo)
...@@ -125,7 +132,7 @@ class TALGenerator: ...@@ -125,7 +132,7 @@ class TALGenerator:
def popProgram(self): def popProgram(self):
program = self.program program = self.program
self.program = self.stack.pop() self.program = self.stack.pop()
return program return self.optimize(program)
def pushSlots(self): def pushSlots(self):
self.slotStack.append(self.slots) self.slotStack.append(self.slots)
...@@ -150,10 +157,6 @@ class TALGenerator: ...@@ -150,10 +157,6 @@ class TALGenerator:
self.program.append(("endTag", name)) self.program.append(("endTag", name))
def emitRawText(self, text): def emitRawText(self, text):
if self.program and self.program[-1][0] == "rawtext":
# Concatenate text
self.program[-1] = ("rawtext", self.program[-1][1] + text)
return
self.program.append(("rawtext", text)) self.program.append(("rawtext", text))
def emitText(self, text): def emitText(self, text):
...@@ -223,13 +226,27 @@ class TALGenerator: ...@@ -223,13 +226,27 @@ class TALGenerator:
self.emit("fillSlot", slotName, program) self.emit("fillSlot", slotName, program)
def unEmitNewlineWhitespace(self): def unEmitNewlineWhitespace(self):
if self.program and self.program[-1][0] == "rawtext": collect = []
text = self.program[-1][1] i = len(self.program)
m = re.match(r"(?s)^(.*)(\n[ \t]*)$", text) while i > 0:
if m: i = i-1
text, rest = m.group(1, 2) item = self.program[i]
self.program[-1] = ("rawtext", text) if item[0] != "rawtext":
return rest break
text = item[1]
if re.match(r"\A[ \t]*\Z", text):
collect.append(text)
continue
m = re.match(r"(?s)^(.*)(\n[ \t]*)\Z", text)
if not m:
break
text, rest = m.group(1, 2)
collect.reverse()
rest = rest + string.join(collect, "")
del self.program[i:]
if text:
self.program.append(("rawtext", text))
return rest
return None return None
def replaceAttrs(self, attrlist, repldict): def replaceAttrs(self, attrlist, repldict):
......
...@@ -105,7 +105,7 @@ class TALParser(XMLParser): ...@@ -105,7 +105,7 @@ class TALParser(XMLParser):
self.nsNew = [] self.nsNew = []
def getCode(self): def getCode(self):
return self.gen.program, self.gen.macros return self.gen.getCode()
def StartNamespaceDeclHandler(self, prefix, uri): def StartNamespaceDeclHandler(self, prefix, uri):
self.nsStack.append(self.nsDict.copy()) self.nsStack.append(self.nsDict.copy())
......
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