edouard@1940: #!/usr/bin/env python edouard@1940: # -*- coding: utf-8 -*- edouard@1940: # This file is part of Beremiz. edouard@1940: # See COPYING file for copyrights details. edouard@1940: edouard@1940: from __future__ import absolute_import edouard@1940: import os edouard@1940: from lxml import etree edouard@1940: import util.paths as paths edouard@1940: from plcopen.structures import StdBlckLibs edouard@1940: edouard@1940: ScriptDirectory = paths.AbsDir(__file__) edouard@1940: edouard@1944: edouard@1940: class XSLTModelQuery(object): edouard@1940: """ a class to handle XSLT queries on project and libs """ Edouard@1953: def __init__(self, controller, xsltpath, ext=None): edouard@1940: # arbitrary set debug to false, updated later edouard@1940: self.debug = False edouard@1940: edouard@1940: # merge xslt extensions for library access to query specific ones edouard@1940: xsltext = [ Edouard@1953: ("GetProject", lambda *_ignored: Edouard@1953: [controller.GetProject(self.debug)]), Edouard@1953: ("GetStdLibs", lambda *_ignored: Edouard@1953: [lib for lib in StdBlckLibs.values()]), Edouard@1953: ("GetExtensions", lambda *_ignored: Edouard@1953: [ctn["types"] for ctn in controller.ConfNodeTypes]) Edouard@1953: ] edouard@1940: Edouard@1953: if ext is not None: Edouard@1953: xsltext.extend(ext) Edouard@1953: Edouard@1953: # parse and compile. "beremiz" arbitrary namespace for extensions edouard@1940: self.xslt = etree.XSLT( edouard@1940: etree.parse( edouard@1940: os.path.join(ScriptDirectory, xsltpath), edouard@1940: etree.XMLParser()), Edouard@1953: extensions={("beremiz", name): call for name, call in xsltext}) edouard@1940: edouard@1940: def _process_xslt(self, root, debug, **kwargs): edouard@1940: self.debug = debug Edouard@1953: res = self.xslt(root, **{k: etree.XSLT.strparam(v) for k, v in kwargs.iteritems()}) edouard@1943: # print(self.xslt.error_log) edouard@1943: return res edouard@1944: edouard@1944: edouard@1944: # ------------------------------------------------------------------------------- edouard@1944: # Helpers functions for translating list of arguments edouard@1944: # from xslt to valid arguments edouard@1944: # ------------------------------------------------------------------------------- edouard@1944: edouard@1944: edouard@1944: def _StringValue(x): edouard@1944: return x edouard@1944: edouard@1944: edouard@1944: def _BoolValue(x): edouard@1944: return x in ["true", "0"] edouard@1944: edouard@1944: edouard@1944: def _translate_args(translations, args): edouard@1944: return [translate(arg[0]) if len(arg) > 0 else None edouard@1944: for translate, arg in edouard@1944: zip(translations, args)]