diff --git a/MicroWebSrv2/mods/PyhtmlTemplate.py b/MicroWebSrv2/mods/PyhtmlTemplate.py
index a0f6886..da97cb3 100644
--- a/MicroWebSrv2/mods/PyhtmlTemplate.py
+++ b/MicroWebSrv2/mods/PyhtmlTemplate.py
@@ -174,40 +174,32 @@ def _parseCode(self, pyGlobalVars, pyLocalVars, execute) :
# ------------------------------------------------------------------------
def _parseBloc(self, execute) :
- while self._pos <= self._endPos :
- c = self._code[self._pos]
- if c == CodeTemplate.TOKEN_OPEN[0] and \
- self._code[ self._pos : self._pos + CodeTemplate.TOKEN_OPEN_LEN ] == CodeTemplate.TOKEN_OPEN :
- self._pos += CodeTemplate.TOKEN_OPEN_LEN
- tokenContent = ''
- x = self._pos
- while True :
- if x > self._endPos :
- raise CodeTemplateException("%s is missing (line %s)" % (CodeTemplate.TOKEN_CLOSE, self._line))
- c = self._code[x]
- if c == CodeTemplate.TOKEN_CLOSE[0] and \
- self._code[ x : x + CodeTemplate.TOKEN_CLOSE_LEN ] == CodeTemplate.TOKEN_CLOSE :
- self._pos = x + CodeTemplate.TOKEN_CLOSE_LEN
- break
- elif c == '\n' :
- self._line += 1
- tokenContent += c
- x += 1
- newTokenToProcess = self._processToken(tokenContent, execute)
- if newTokenToProcess is not None :
- return newTokenToProcess
- continue
- elif c == '\n' :
- self._line += 1
+ while True :
+ idx = self._code.find(CodeTemplate.TOKEN_OPEN, self._pos)
+ end = (idx < 0)
+ if end :
+ idx = self._endPos+1
+ code = self._code[self._pos:idx]
+ self._line += code.count('\n')
if execute :
- self._rendered += c
- self._pos += 1
- return None
+ self._rendered += code
+ if end :
+ self._pos = idx
+ return None
+ self._pos = idx + CodeTemplate.TOKEN_OPEN_LEN
+ idx = self._code.find(CodeTemplate.TOKEN_CLOSE, self._pos)
+ if idx < 0 :
+ raise CodeTemplateException('"%s" is required but the end of code has been found' % CodeTemplate.TOKEN_CLOSE)
+ tokenContent = self._code[self._pos:idx].strip()
+ self._line += tokenContent.count('\n')
+ self._pos = idx + CodeTemplate.TOKEN_CLOSE_LEN
+ newTokenToProcess = self._processToken(tokenContent, execute)
+ if newTokenToProcess is not None :
+ return newTokenToProcess
# ------------------------------------------------------------------------
def _processToken(self, tokenContent, execute) :
- tokenContent = tokenContent.strip()
parts = tokenContent.split(' ', 1)
instructName = parts[0].strip()
instructBody = parts[1].strip() if len(parts) > 1 else None
@@ -236,39 +228,21 @@ def _processInstructionPYTHON(self, instructionBody, execute) :
if instructionBody is not None :
raise CodeTemplateException( 'Instruction "%s" is invalid (line %s)'
% (CodeTemplate.INSTRUCTION_PYTHON, self._line) )
- pyCode = ''
- while True :
- if self._pos > self._endPos :
- raise CodeTemplateException( '"%s" instruction is missing (line %s)'
- % (CodeTemplate.INSTRUCTION_END, self._line) )
- c = self._code[self._pos]
- if c == CodeTemplate.TOKEN_OPEN[0] and \
- self._code[ self._pos : self._pos + CodeTemplate.TOKEN_OPEN_LEN ] == CodeTemplate.TOKEN_OPEN :
- self._pos += CodeTemplate.TOKEN_OPEN_LEN
- tokenContent = ''
- x = self._pos
- while True :
- if x > self._endPos :
- raise CodeTemplateException("%s is missing (line %s)" % (CodeTemplate.TOKEN_CLOSE, self._line))
- c = self._code[x]
- if c == CodeTemplate.TOKEN_CLOSE[0] and \
- self._code[ x : x + CodeTemplate.TOKEN_CLOSE_LEN ] == CodeTemplate.TOKEN_CLOSE :
- self._pos = x + CodeTemplate.TOKEN_CLOSE_LEN
- break
- elif c == '\n' :
- self._line += 1
- tokenContent += c
- x += 1
- tokenContent = tokenContent.strip()
- if tokenContent == CodeTemplate.INSTRUCTION_END :
- break
- raise CodeTemplateException( '"%s" is a bad instruction in a python bloc (line %s)'
- % (tokenContent, self._line) )
- elif c == '\n' :
- self._line += 1
- if execute :
- pyCode += c
- self._pos += 1
+ idx = self._code.find(CodeTemplate.TOKEN_OPEN, self._pos)
+ if idx < 0 :
+ raise CodeTemplateException('"%s" is required but the end of code has been found' % CodeTemplate.TOKEN_OPEN)
+ pyCode = self._code[self._pos:idx]
+ self._line += pyCode.count('\n')
+ self._pos = idx + CodeTemplate.TOKEN_OPEN_LEN
+ idx = self._code.find(CodeTemplate.TOKEN_CLOSE, self._pos)
+ if idx < 0 :
+ raise CodeTemplateException('"%s" is required but the end of code has been found' % CodeTemplate.TOKEN_CLOSE)
+ tokenContent = self._code[self._pos:idx].strip()
+ self._line += tokenContent.count('\n')
+ self._pos = idx + CodeTemplate.TOKEN_CLOSE_LEN
+ if tokenContent != CodeTemplate.INSTRUCTION_END :
+ raise CodeTemplateException( '"%s" is a bad instruction in a python bloc (line %s)'
+ % (tokenContent, self._line) )
if execute :
lines = pyCode.split('\n')
indent = ''
@@ -280,11 +254,13 @@ def _processInstructionPYTHON(self, instructionBody, execute) :
else :
break
break
- pyCode = ''
- for line in lines :
- if line.find(indent) == 0 :
- line = line[len(indent):]
- pyCode += line + '\n'
+ indentLen = len(indent)
+ for i in range(len(lines)) :
+ if lines[i].startswith(indent) :
+ lines[i] = lines[i][indentLen:] + '\n'
+ else :
+ lines[i] += '\n'
+ pyCode = ''.join(lines)
try :
exec(pyCode, self._pyGlobalVars, self._pyLocalVars)
except Exception as ex :