##############################################################################
##
# This file is part of Sardana
##
# http://www.sardana-controls.org/
##
# Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
##
# Sardana is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
##
# Sardana is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
##
# You should have received a copy of the GNU Lesser General Public License
# along with Sardana. If not, see <http://www.gnu.org/licenses/>.
##
##############################################################################
"""This is the sequence macro module"""
__all__ = ["sequence"]
import xml.dom.minidom
from sardana.macroserver.macro import Macro, Type
TAG_MACRO = "macro"
TAG_PARAM = "param"
TAG_PARAMREPEAT = "paramrepeat"
TAG_REPEAT = "repeat"
TAG_PARAMS = "params"
TAG_SEQUENCE = "sequence"
ATTRIBUTE_NAME = "name"
ATTRIBUTE_VALUE = "value"
ATTRIBUTE_INDEX = "nr"
ATTRIBUTE_DESCRIPTION = "description"
ATTRIBUTE_DEFVALUE = "defvalue"
ATTRIBUTE_TYPE = "type"
ATTRIBUTE_ALLOWEDHOOKS = "allowedHooks"
ATTRIBUTE_HASPARAMS = "hasParams"
ATTRIBUTE_MIN = "min"
[docs]
class sequence(Macro):
"""This macro executes a sequence of macros. As a parameter
it receives a string which is a xml structure. These macros which allow
hooks can nest another sequence (xml structure). In such a case,
this macro is executed recursively."""
param_def = [["xml", Type.String, None, "Xml string representing a sequence"]]
[docs]
def run(self, *pars):
xmlDoc = xml.dom.minidom.parseString(pars[0])
macros = self.parseXml(xmlDoc)
for macro in macros:
self.runMacro(macro)
# self.pausePoint()
def parseXml(self, xmlDoc):
macros = []
sequenceElement = xmlDoc.getElementsByTagName(TAG_SEQUENCE)[0]
childElement = sequenceElement.firstChild
while childElement:
if childElement.localName == TAG_MACRO:
params, hookElement = self.parseMacro(childElement)
macro = self.createMacro(params)
if hookElement is not None:
hook = self.createExecMacroHook(
[self.__class__.__name__, hookElement.toxml()]
)
macro.hooks = [hook]
macros.append(macro)
childElement = childElement.nextSibling
return macros
def parseMacro(self, xmlElement):
name = str(xmlElement.getAttribute(ATTRIBUTE_NAME))
params = (name,)
hookElement = None
childElement = xmlElement.firstChild
while childElement:
if childElement.localName == TAG_PARAM:
params += self.parseParam(childElement)
elif childElement.localName == TAG_PARAMREPEAT:
params += self.parseParamRepeat(childElement)
elif childElement.localName == TAG_SEQUENCE:
hookElement = childElement
childElement = childElement.nextSibling
return (params, hookElement)
def parseParam(self, xmlElement):
return (str(xmlElement.getAttribute(ATTRIBUTE_VALUE)),)
def parseParamRepeat(self, xmlElement):
params = ()
childElement = xmlElement.firstChild
while childElement:
if childElement.localName == TAG_REPEAT:
params += self.parseRepeat(childElement)
childElement = childElement.nextSibling
return params
def parseRepeat(self, xmlElement):
params = ()
childElement = xmlElement.firstChild
while childElement:
if childElement.localName == TAG_PARAM:
params += self.parseParam(childElement)
elif childElement.localName == TAG_PARAMREPEAT:
params += self.parseParamRepeat(childElement)
childElement = childElement.nextSibling
return params