plcopen/XSLTModelQuery.py
author Edouard Tisserant <edouard.tisserant@gmail.com>
Fri, 16 Feb 2018 18:24:55 +0100
changeset 1940 8dc4ebc97777
child 1943 9dc0e38552b2
permissions -rw-r--r--
Moved XSLTModelQuery class to own module in plcopen package.
1940
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
     1
#!/usr/bin/env python
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
     2
# -*- coding: utf-8 -*-
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
     3
# This file is part of Beremiz.
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
     4
# See COPYING file for copyrights details.
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
     5
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
     6
from __future__ import absolute_import
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
     7
import os
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
     8
from lxml import etree
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
     9
import util.paths as paths
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    10
from plcopen.structures import StdBlckLibs
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    11
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    12
ScriptDirectory = paths.AbsDir(__file__)
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    13
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    14
class XSLTModelQuery(object):
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    15
    """ a class to handle XSLT queries on project and libs """
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    16
    def __init__(self, controller, xsltpath, ext = []):
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    17
        # arbitrary set debug to false, updated later
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    18
        self.debug = False
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    19
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    20
        # merge xslt extensions for library access to query specific ones
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    21
        xsltext = [
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    22
            ("GetProject", lambda *_ignored: 
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    23
                controller.GetProject(self.debug)),
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    24
            ("GetStdLibs", lambda *_ignored: 
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    25
                [lib for lib in StdBlckLibs.values()]),
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    26
            ("GetExtensions", lambda *_ignored: 
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    27
                [ctn["types"] for ctn in controller.ConfNodeTypes])
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    28
        ] + ext
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    29
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    30
        # parse and compile. "beremiz" arbitrary namespace for extensions 
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    31
        self.xslt = etree.XSLT(
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    32
            etree.parse(
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    33
                os.path.join(ScriptDirectory, xsltpath),
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    34
                etree.XMLParser()),
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    35
            extensions={ ("beremiz", name):call for name, call in xsltext})
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    36
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    37
    def _process_xslt(self, root, debug, **kwargs):
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    38
        self.debug = debug
8dc4ebc97777 Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff changeset
    39
        return self.xslt(root,**{k:etree.XSLT.strparam(v) for k,v in kwargs.iteritems()})