summaryrefslogtreecommitdiff
path: root/Cheetah/SourceReader.py
diff options
context:
space:
mode:
Diffstat (limited to 'Cheetah/SourceReader.py')
-rw-r--r--Cheetah/SourceReader.py71
1 files changed, 37 insertions, 34 deletions
diff --git a/Cheetah/SourceReader.py b/Cheetah/SourceReader.py
index 4d56ba9..44eb3ba 100644
--- a/Cheetah/SourceReader.py
+++ b/Cheetah/SourceReader.py
@@ -1,22 +1,23 @@
"""SourceReader class for Cheetah's Parser and CodeGenerator
"""
import re
-import sys
from Cheetah.compat import unicode
EOLre = re.compile(r'[ \f\t]*(?:\r\n|\r|\n)')
EOLZre = re.compile(r'(?:\r\n|\r|\n|\Z)')
ENCODINGsearch = re.compile("coding[=:]\s*([-\w.]+)").search
+
class Error(Exception):
pass
+
class SourceReader(object):
def __init__(self, src, filename=None, breakPoint=None, encoding=None):
self._src = src
self._filename = filename
self._srcLen = len(src)
- if breakPoint == None:
+ if breakPoint is None:
self._breakPoint = self._srcLen
else:
self.setBreakPoint(breakPoint)
@@ -24,7 +25,7 @@ class SourceReader(object):
self._bookmarks = {}
self._posTobookmarkMap = {}
- ## collect some meta-information
+ # collect some meta-information
self._EOLs = []
pos = 0
while pos < len(self):
@@ -54,7 +55,8 @@ class SourceReader(object):
return self._src[i]
def __getslice__(self, i, j):
- i = max(i, 0); j = max(j, 0)
+ i = max(i, 0)
+ j = max(j, 0)
return self._src[i:j]
def splitlines(self):
@@ -63,7 +65,7 @@ class SourceReader(object):
return self._srcLines
def lineNum(self, pos=None):
- if pos == None:
+ if pos is None:
pos = self._pos
for i in range(len(self._BOLs)):
@@ -71,20 +73,20 @@ class SourceReader(object):
return i
def getRowCol(self, pos=None):
- if pos == None:
+ if pos is None:
pos = self._pos
lineNum = self.lineNum(pos)
- BOL, EOL = self._BOLs[lineNum], self._EOLs[lineNum]
+ BOL = self._BOLs[lineNum]
return lineNum+1, pos-BOL+1
def getRowColLine(self, pos=None):
- if pos == None:
+ if pos is None:
pos = self._pos
row, col = self.getRowCol(pos)
return row, col, self.splitlines()[row-1]
def getLine(self, pos):
- if pos == None:
+ if pos is None:
pos = self._pos
lineNum = self.lineNum(pos)
return self.splitlines()[lineNum]
@@ -96,27 +98,29 @@ class SourceReader(object):
self.checkPos(pos)
self._pos = pos
-
def validPos(self, pos):
- return pos <= self._breakPoint and pos >=0
+ return pos <= self._breakPoint and pos >= 0
def checkPos(self, pos):
if not pos <= self._breakPoint:
- raise Error("pos (" + str(pos) + ") is invalid: beyond the stream's end (" +
- str(self._breakPoint-1) + ")" )
- elif not pos >=0:
- raise Error("pos (" + str(pos) + ") is invalid: less than 0" )
+ raise Error(
+ "pos (" + str(pos) + ") is invalid: beyond the stream's end ("
+ + str(self._breakPoint-1) + ")")
+ elif not pos >= 0:
+ raise Error("pos (" + str(pos) + ") is invalid: less than 0")
def breakPoint(self):
return self._breakPoint
def setBreakPoint(self, pos):
if pos > self._srcLen:
- raise Error("New breakpoint (" + str(pos) +
- ") is invalid: beyond the end of stream's source string (" +
- str(self._srcLen) + ")" )
+ raise Error(
+ "New breakpoint (" + str(pos) +
+ ") is invalid: beyond the end of stream's source string (" +
+ str(self._srcLen) + ")")
elif not pos >= 0:
- raise Error("New breakpoint (" + str(pos) + ") is invalid: less than 0" )
+ raise Error(
+ "New breakpoint (" + str(pos) + ") is invalid: less than 0")
self._breakPoint = pos
@@ -129,11 +133,12 @@ class SourceReader(object):
def gotoBookmark(self, name):
if not self.hasBookmark(name):
- raise Error("Invalid bookmark (" + name + ") is invalid: does not exist")
+ raise Error(
+ "Invalid bookmark (" + name + ") is invalid: does not exist")
pos = self._bookmarks[name]
if not self.validPos(pos):
- raise Error("Invalid bookmark (" + name + ', '+
- str(pos) + ") is invalid: pos is out of range" )
+ raise Error("Invalid bookmark (" + name + ', ' +
+ str(pos) + ") is invalid: pos is out of range")
self._pos = pos
def atEnd(self):
@@ -158,7 +163,7 @@ class SourceReader(object):
raise Error('Already at beginning of stream')
self._pos -= 1
- if not c==None:
+ if c is not None:
self._src[self._pos] = c
def advance(self, offset=1):
@@ -177,12 +182,11 @@ class SourceReader(object):
def readTo(self, to, start=None):
self.checkPos(to)
- if start == None:
+ if start is None:
start = self._pos
self._pos = to
return self._src[start:to]
-
def readToEOL(self, start=None, gobble=True):
EOLmatch = EOLZre.search(self.src(), self.pos())
if gobble:
@@ -191,11 +195,10 @@ class SourceReader(object):
pos = EOLmatch.start()
return self.readTo(to=pos, start=start)
-
def find(self, it, pos=None):
- if pos == None:
+ if pos is None:
pos = self._pos
- return self._src.find(it, pos )
+ return self._src.find(it, pos)
def startswith(self, it, pos=None):
if self.find(it, pos) == self.pos():
@@ -204,18 +207,18 @@ class SourceReader(object):
return False
def rfind(self, it, pos):
- if pos == None:
+ if pos is None:
pos = self._pos
return self._src.rfind(it, pos)
def findBOL(self, pos=None):
- if pos == None:
+ if pos is None:
pos = self._pos
src = self.src()
return max(src.rfind('\n', 0, pos)+1, src.rfind('\r', 0, pos)+1, 0)
def findEOL(self, pos=None, gobble=False):
- if pos == None:
+ if pos is None:
pos = self._pos
match = EOLZre.search(self.src(), pos)
@@ -225,7 +228,7 @@ class SourceReader(object):
return match.start()
def isLineClearToPos(self, pos=None):
- if pos == None:
+ if pos is None:
pos = self.pos()
self.checkPos(pos)
src = self.src()
@@ -235,11 +238,11 @@ class SourceReader(object):
def matches(self, strOrRE):
if isinstance(strOrRE, (str, unicode)):
return self.startswith(strOrRE, pos=self.pos())
- else: # assume an re object
+ else: # assume an re object
return strOrRE.match(self.src(), self.pos())
def matchWhiteSpace(self, WSchars=' \f\t'):
- return (not self.atEnd()) and self.peek() in WSchars
+ return (not self.atEnd()) and self.peek() in WSchars
def getWhiteSpace(self, max=None, WSchars=' \f\t'):
if not self.matchWhiteSpace(WSchars):