appy.pod: variable named 'loop' is now available in the POD context of any section within a 'for' statement, with attributes like loop.[iterVariableName].length (=total number of looped elements) and loop.[iterVariableName].nb (=index of currently looped element).
This commit is contained in:
parent
0dd8b72dca
commit
cbb8d5cd12
|
@ -979,7 +979,8 @@ class ToolMixin(BaseMixin):
|
||||||
rolesToShow = [r for r in appyUser.roles \
|
rolesToShow = [r for r in appyUser.roles \
|
||||||
if r not in ('Authenticated', 'Member')]
|
if r not in ('Authenticated', 'Member')]
|
||||||
if rolesToShow:
|
if rolesToShow:
|
||||||
res.append(', '.join([self.translate(r) for r in rolesToShow]))
|
res.append(', '.join([self.translate('role_%s'%r) \
|
||||||
|
for r in rolesToShow]))
|
||||||
return (' | '.join(res), appyUser.o.getUrl(mode='edit'))
|
return (' | '.join(res), appyUser.o.getUrl(mode='edit'))
|
||||||
|
|
||||||
def generateUid(self, className):
|
def generateUid(self, className):
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,USA.
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
from appy import Object
|
||||||
from appy.pod import PodError
|
from appy.pod import PodError
|
||||||
from appy.pod.elements import *
|
from appy.pod.elements import *
|
||||||
|
|
||||||
|
@ -128,6 +129,34 @@ class ForAction(BufferAction):
|
||||||
fromExpr)
|
fromExpr)
|
||||||
self.iter = iter # Name of the iterator variable used in the each loop
|
self.iter = iter # Name of the iterator variable used in the each loop
|
||||||
|
|
||||||
|
def initialiseLoop(self):
|
||||||
|
'''Initialises information about the loop, before entering into it.'''
|
||||||
|
context = self.buffer.env.context
|
||||||
|
# The "loop" object, made available in the POD context, contains info
|
||||||
|
# about all currently walked loops. For every walked loop, a specific
|
||||||
|
# object, le'ts name it curLoop, accessible at getattr(loop, self.iter),
|
||||||
|
# stores info about its status:
|
||||||
|
# * curLoop.length gives the total number of walked elements withhin
|
||||||
|
# the loop
|
||||||
|
# * curLoop.nb gives the index (starting at 0) if the currently
|
||||||
|
# walked element.
|
||||||
|
# For example, if you have a "for" statement like this:
|
||||||
|
# for elem in myListOfElements
|
||||||
|
# Within the part of the ODT document impacted by this statement, you
|
||||||
|
# may access to:
|
||||||
|
# * loop.elem.length to know the total length of myListOfElements
|
||||||
|
# * loop.elem.nb to know the index of the current elem within
|
||||||
|
# myListOfElements.
|
||||||
|
if 'loop' not in context:
|
||||||
|
context['loop'] = Object()
|
||||||
|
try:
|
||||||
|
total = len(self.exprResult)
|
||||||
|
except:
|
||||||
|
total = 0
|
||||||
|
curLoop = Object(length=total)
|
||||||
|
setattr(context['loop'], self.iter, curLoop)
|
||||||
|
return curLoop
|
||||||
|
|
||||||
def do(self):
|
def do(self):
|
||||||
context = self.buffer.env.context
|
context = self.buffer.env.context
|
||||||
# Check self.exprResult type
|
# Check self.exprResult type
|
||||||
|
@ -156,7 +185,11 @@ class ForAction(BufferAction):
|
||||||
if not self.exprResult:
|
if not self.exprResult:
|
||||||
self.result.dumpElement(Cell.OD.elem)
|
self.result.dumpElement(Cell.OD.elem)
|
||||||
# Enter the "for" loop
|
# Enter the "for" loop
|
||||||
|
loop = self.initialiseLoop()
|
||||||
|
i = -1
|
||||||
for item in self.exprResult:
|
for item in self.exprResult:
|
||||||
|
i += 1
|
||||||
|
loop.nb = i
|
||||||
context[self.iter] = item
|
context[self.iter] = item
|
||||||
# Cell: add a new row if we are at the end of a row
|
# Cell: add a new row if we are at the end of a row
|
||||||
if isCell and (currentColIndex == nbOfColumns):
|
if isCell and (currentColIndex == nbOfColumns):
|
||||||
|
@ -191,6 +224,11 @@ class ForAction(BufferAction):
|
||||||
context[self.iter] = ''
|
context[self.iter] = ''
|
||||||
for i in range(nbOfMissingCellsLastLine):
|
for i in range(nbOfMissingCellsLastLine):
|
||||||
self.buffer.evaluate(subElements=False)
|
self.buffer.evaluate(subElements=False)
|
||||||
|
# Delete the object representing info about the current loop.
|
||||||
|
try:
|
||||||
|
delattr(context['loop'], self.iter)
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
# Restore hidden variable if any
|
# Restore hidden variable if any
|
||||||
if hasHiddenVariable:
|
if hasHiddenVariable:
|
||||||
context[self.iter] = hiddenVariable
|
context[self.iter] = hiddenVariable
|
||||||
|
|
|
@ -127,6 +127,24 @@ def copyData(data, target, targetMethod, type='string', encoding=None,
|
||||||
dump(encodeData(data.data, encoding))
|
dump(encodeData(data.data, encoding))
|
||||||
data = data.next
|
data = data.next
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
def splitList(l, sub):
|
||||||
|
'''Returns a list that was build from list p_l whose elements were
|
||||||
|
re-grouped into sub-lists of p_sub elements.
|
||||||
|
|
||||||
|
For example, if l = [1,2,3,4,5] and sub = 3, the method returns
|
||||||
|
[ [1,2,3], [4,5] ].'''
|
||||||
|
res = []
|
||||||
|
i = -1
|
||||||
|
for elem in l:
|
||||||
|
i += 1
|
||||||
|
if (i % sub) == 0:
|
||||||
|
# A new sub-list must be created
|
||||||
|
res.append([elem])
|
||||||
|
else:
|
||||||
|
res[-1].append(elem)
|
||||||
|
return res
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
class Traceback:
|
class Traceback:
|
||||||
'''Dumps the last traceback into a string.'''
|
'''Dumps the last traceback into a string.'''
|
||||||
|
|
Loading…
Reference in a new issue