author | Andrey Skvortsov <andrej.skvortzov@gmail.com> |
Fri, 28 Sep 2018 13:07:46 +0300 | |
changeset 2350 | 9f7028ab8294 |
parent 1953 | 5736d25bb393 |
child 2627 | 3ba6a2d26507 |
permissions | -rw-r--r-- |
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 |
|
1944
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
14 |
|
1940
8dc4ebc97777
Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff
changeset
|
15 |
class XSLTModelQuery(object): |
8dc4ebc97777
Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff
changeset
|
16 |
""" a class to handle XSLT queries on project and libs """ |
1953
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1945
diff
changeset
|
17 |
def __init__(self, controller, xsltpath, ext=None): |
1940
8dc4ebc97777
Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff
changeset
|
18 |
# 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
|
19 |
self.debug = False |
8dc4ebc97777
Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff
changeset
|
20 |
|
8dc4ebc97777
Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff
changeset
|
21 |
# 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
|
22 |
xsltext = [ |
1953
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1945
diff
changeset
|
23 |
("GetProject", lambda *_ignored: |
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1945
diff
changeset
|
24 |
[controller.GetProject(self.debug)]), |
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1945
diff
changeset
|
25 |
("GetStdLibs", lambda *_ignored: |
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1945
diff
changeset
|
26 |
[lib for lib in StdBlckLibs.values()]), |
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1945
diff
changeset
|
27 |
("GetExtensions", lambda *_ignored: |
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1945
diff
changeset
|
28 |
[ctn["types"] for ctn in controller.ConfNodeTypes]) |
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1945
diff
changeset
|
29 |
] |
1940
8dc4ebc97777
Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff
changeset
|
30 |
|
1953
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1945
diff
changeset
|
31 |
if ext is not None: |
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1945
diff
changeset
|
32 |
xsltext.extend(ext) |
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1945
diff
changeset
|
33 |
|
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1945
diff
changeset
|
34 |
# parse and compile. "beremiz" arbitrary namespace for extensions |
1940
8dc4ebc97777
Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff
changeset
|
35 |
self.xslt = etree.XSLT( |
8dc4ebc97777
Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff
changeset
|
36 |
etree.parse( |
8dc4ebc97777
Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff
changeset
|
37 |
os.path.join(ScriptDirectory, xsltpath), |
8dc4ebc97777
Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff
changeset
|
38 |
etree.XMLParser()), |
1953
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1945
diff
changeset
|
39 |
extensions={("beremiz", name): call for name, call in xsltext}) |
1940
8dc4ebc97777
Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff
changeset
|
40 |
|
8dc4ebc97777
Moved XSLTModelQuery class to own module in plcopen package.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
diff
changeset
|
41 |
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
|
42 |
self.debug = debug |
1953
5736d25bb393
PEP8 and PyLint conformance: whitespaces and stuff
Edouard Tisserant
parents:
1945
diff
changeset
|
43 |
res = self.xslt(root, **{k: etree.XSLT.strparam(v) for k, v in kwargs.iteritems()}) |
1943
9dc0e38552b2
GetPouVariables optimized with XSLTModelQuery
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1940
diff
changeset
|
44 |
# print(self.xslt.error_log) |
9dc0e38552b2
GetPouVariables optimized with XSLTModelQuery
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1940
diff
changeset
|
45 |
return res |
1944
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
46 |
|
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
47 |
|
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
48 |
# ------------------------------------------------------------------------------- |
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
49 |
# Helpers functions for translating list of arguments |
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
50 |
# from xslt to valid arguments |
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
51 |
# ------------------------------------------------------------------------------- |
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
52 |
|
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
53 |
|
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
54 |
def _StringValue(x): |
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
55 |
return x |
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
56 |
|
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
57 |
|
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
58 |
def _BoolValue(x): |
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
59 |
return x in ["true", "0"] |
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
60 |
|
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
61 |
|
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
62 |
def _translate_args(translations, args): |
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
63 |
return [translate(arg[0]) if len(arg) > 0 else None |
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
64 |
for translate, arg in |
6162e34fb246
Moved some code from PLCController.py to other modules. Added necessary imports.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents:
1943
diff
changeset
|
65 |
zip(translations, args)] |