diff options
Diffstat (limited to 'Cheetah/SourceReader.py')
-rw-r--r-- | Cheetah/SourceReader.py | 71 |
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): |