--- a/svghmi/gen_dnd_widget_svg.xslt Tue Apr 13 21:00:34 2021 +0200
+++ b/svghmi/gen_dnd_widget_svg.xslt Tue Apr 13 21:04:46 2021 +0200
@@ -1,5 +1,5 @@
-<xsl:stylesheet xmlns:func="http://exslt.org/functions" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg" xmlns:str="http://exslt.org/strings" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:exsl="http://exslt.org/common" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ns="beremiz" xmlns:cc="http://creativecommons.org/ns#" xmlns:regexp="http://exslt.org/regular-expressions" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dc="http://purl.org/dc/elements/1.1/" extension-element-prefixes="ns func exsl regexp str dyn" version="1.0" exclude-result-prefixes="ns func exsl regexp str dyn">
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" xmlns:regexp="http://exslt.org/regular-expressions" xmlns:str="http://exslt.org/strings" xmlns:func="http://exslt.org/functions" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:ns="beremiz" version="1.0" extension-element-prefixes="ns func exsl regexp str dyn" exclude-result-prefixes="ns func exsl regexp str dyn"> <xsl:output method="xml"/>
<xsl:param name="hmi_path"/>
<xsl:variable name="svg" select="/svg:svg"/>
@@ -77,47 +77,69 @@
- <xsl:when test="regexp:test($path,'^\.[a-zA-Z0-9_]+$')">
- <xsl:attribute name="type">
- <xsl:text>PAGE_LOCAL</xsl:text>
- <xsl:when test="regexp:test($path,'^[a-zA-Z0-9_]+$')">
- <xsl:attribute name="type">
- <xsl:text>HMI_LOCAL</xsl:text>
- <xsl:variable name="item" select="$indexed_hmitree/*[@hmipath = $path]"/>
- <xsl:variable name="pathtype" select="local-name($item)"/>
- <xsl:if test="$pathminmaxcount = 3 and not($pathtype = 'HMI_INT' or $pathtype = 'HMI_REAL')">
- <xsl:message terminate="yes">
- <xsl:text>Widget id:</xsl:text>
- <xsl:value-of select="$id"/>
- <xsl:text> label:</xsl:text>
- <xsl:value-of select="$label"/>
- <xsl:text> path section </xsl:text>
- <xsl:value-of select="$pathminmax"/>
- <xsl:text> use min and max on non mumeric value</xsl:text>
- <xsl:if test="count($item) = 1">
- <xsl:attribute name="index">
- <xsl:value-of select="$item/@index"/>
+ <xsl:if test="$indexed_hmitree"> + <xsl:when test="regexp:test($path,'^\.[a-zA-Z0-9_]+$')"> + <xsl:attribute name="type"> + <xsl:text>PAGE_LOCAL</xsl:text> + <xsl:when test="regexp:test($path,'^[a-zA-Z0-9_]+$')"> + <xsl:attribute name="type"> + <xsl:text>HMI_LOCAL</xsl:text> - <xsl:attribute name="type">
- <xsl:value-of select="$pathtype"/>
+ <xsl:variable name="item" select="$indexed_hmitree/*[@hmipath = $path]"/> + <xsl:variable name="pathtype" select="local-name($item)"/> + <xsl:if test="$pathminmaxcount = 3 and not($pathtype = 'HMI_INT' or $pathtype = 'HMI_REAL')"> + <xsl:message terminate="yes"> + <xsl:text>Widget id:</xsl:text> + <xsl:value-of select="$id"/> + <xsl:text> label:</xsl:text> + <xsl:value-of select="$label"/> + <xsl:text> path section </xsl:text> + <xsl:value-of select="$pathminmax"/> + <xsl:text> use min and max on non mumeric value</xsl:text> + <xsl:if test="count($item) = 1"> + <xsl:attribute name="index"> + <xsl:value-of select="$item/@index"/> + <xsl:attribute name="type"> + <xsl:value-of select="$pathtype"/> + <xsl:template mode="genlabel" match="arg"> + <xsl:value-of select="@value"/> + <xsl:template mode="genlabel" match="path"> + <xsl:value-of select="@value"/> + <xsl:if test="string-length(@min)>0 or string-length(@max)>0"> + <xsl:value-of select="@min"/> + <xsl:value-of select="@max"/> + <xsl:template mode="genlabel" match="widget"> + <xsl:text>HMI:</xsl:text> + <xsl:value-of select="@type"/> + <xsl:apply-templates mode="genlabel" select="arg"/> + <xsl:apply-templates mode="genlabel" select="path"/> <xsl:variable name="_parsed_widgets">
<xsl:apply-templates mode="parselabel" select="$hmi_elements"/>
@@ -127,18 +149,34 @@
<xsl:variable name="svg_widget_type" select="$svg_widget/@type"/>
<xsl:variable name="svg_widget_path" select="$svg_widget/@path"/>
<xsl:variable name="svg_widget_count" select="count($parsed_widgets/widget)"/>
+ <xsl:template mode="replace_path" match="@* | node()"> + <xsl:apply-templates mode="replace_path" select="@* | node()"/> + <xsl:template mode="replace_path" match="path/@value"> + <xsl:attribute name="value"> + <xsl:value-of select="$hmi_path"/> <xsl:template xmlns="http://www.w3.org/2000/svg" mode="inline_svg" match="@*">
- <xsl:template xmlns="http://www.w3.org/2000/svg" mode="inline_svg" match="@inkscape:label[starts-with(., 'HMI:')]">
- <xsl:attribute name="inkscape:label">
- <xsl:value-of select="substring-before(., '@')"/>
- <xsl:value-of select="$hmi_path"/>
+ <xsl:template xmlns="http://www.w3.org/2000/svg" mode="inline_svg" match="@inkscape:label[starts-with(., 'HMI:')]"/> <xsl:template mode="inline_svg" match="node()">
+ <xsl:if test="@id = $svg_widget/@id"> + <xsl:variable name="substituted_widget"> + <xsl:apply-templates mode="replace_path" select="$svg_widget"/> + <xsl:variable name="substituted_widget_ns" select="exsl:node-set($substituted_widget)"/> + <xsl:variable name="new_label"> + <xsl:apply-templates mode="genlabel" select="$substituted_widget_ns"/> + <xsl:attribute name="inkscape:label"> + <xsl:value-of select="$new_label"/> <xsl:apply-templates mode="inline_svg" select="@* | node()"/>
--- a/svghmi/gen_dnd_widget_svg.ysl2 Tue Apr 13 21:00:34 2021 +0200
+++ b/svghmi/gen_dnd_widget_svg.ysl2 Tue Apr 13 21:04:46 2021 +0200
@@ -30,22 +30,39 @@
const "parsed_widgets","exsl:node-set($_parsed_widgets)";
const "selected_node_type","local-name($subhmitree)";
- const "svg_widget", "$parsed_widgets/widget[1]";
+ const "svg_widget", "$parsed_widgets/widget[1]"; // TODO take all widgets const "svg_widget_type", "$svg_widget/@type";
const "svg_widget_path", "$svg_widget/@path";
const "svg_widget_count", "count($parsed_widgets/widget)";
+ // Templates to change label paths(s) + template "@* | node()", mode="replace_path" { + xsl:copy apply "@* | node()", mode="replace_path"; + template "path/@value", mode="replace_path" { + attrib "value" > «$hmi_path» + // all attribs are usually copied svgtmpl "@*", mode="inline_svg" xsl:copy;
- svgtmpl "@inkscape:label[starts-with(., 'HMI:')]", mode="inline_svg" {
- attrib "inkscape:label" > «substring-before(., '@')»@«$hmi_path»
+ // except labels, ignored + svgtmpl "@inkscape:label[starts-with(., 'HMI:')]", mode="inline_svg"; + template "node()", mode="inline_svg" xsl:copy { - template "node()", mode="inline_svg" {
- xsl:copy apply "@* | node()", mode="inline_svg";
+ // in case this node widget's main element inject label + if "@id = $svg_widget/@id" { + const "substituted_widget" apply "$svg_widget", mode="replace_path"; + const "substituted_widget_ns", "exsl:node-set($substituted_widget)"; + const "new_label" apply "$substituted_widget_ns", mode="genlabel"; + attrib "inkscape:label" > «$new_label» + // all nodes are copied as well + apply "@* | node()", mode="inline_svg";
const "NODES_TYPES","str:split('HMI_ROOT HMI_NODE')";
const "HMI_NODES_COMPAT","str:split('Page Jump Foreach')";
--- a/svghmi/gen_index_xhtml.xslt Tue Apr 13 21:00:34 2021 +0200
+++ b/svghmi/gen_index_xhtml.xslt Tue Apr 13 21:04:46 2021 +0200
@@ -207,47 +207,69 @@
- <xsl:when test="regexp:test($path,'^\.[a-zA-Z0-9_]+$')">
- <xsl:attribute name="type">
- <xsl:text>PAGE_LOCAL</xsl:text>
- <xsl:when test="regexp:test($path,'^[a-zA-Z0-9_]+$')">
- <xsl:attribute name="type">
- <xsl:text>HMI_LOCAL</xsl:text>
- <xsl:variable name="item" select="$indexed_hmitree/*[@hmipath = $path]"/>
- <xsl:variable name="pathtype" select="local-name($item)"/>
- <xsl:if test="$pathminmaxcount = 3 and not($pathtype = 'HMI_INT' or $pathtype = 'HMI_REAL')">
- <xsl:message terminate="yes">
- <xsl:text>Widget id:</xsl:text>
- <xsl:value-of select="$id"/>
- <xsl:text> label:</xsl:text>
- <xsl:value-of select="$label"/>
- <xsl:text> path section </xsl:text>
- <xsl:value-of select="$pathminmax"/>
- <xsl:text> use min and max on non mumeric value</xsl:text>
- <xsl:if test="count($item) = 1">
- <xsl:attribute name="index">
- <xsl:value-of select="$item/@index"/>
+ <xsl:if test="$indexed_hmitree"> + <xsl:when test="regexp:test($path,'^\.[a-zA-Z0-9_]+$')"> + <xsl:attribute name="type"> + <xsl:text>PAGE_LOCAL</xsl:text> + <xsl:when test="regexp:test($path,'^[a-zA-Z0-9_]+$')"> + <xsl:attribute name="type"> + <xsl:text>HMI_LOCAL</xsl:text> - <xsl:attribute name="type">
- <xsl:value-of select="$pathtype"/>
+ <xsl:variable name="item" select="$indexed_hmitree/*[@hmipath = $path]"/> + <xsl:variable name="pathtype" select="local-name($item)"/> + <xsl:if test="$pathminmaxcount = 3 and not($pathtype = 'HMI_INT' or $pathtype = 'HMI_REAL')"> + <xsl:message terminate="yes"> + <xsl:text>Widget id:</xsl:text> + <xsl:value-of select="$id"/> + <xsl:text> label:</xsl:text> + <xsl:value-of select="$label"/> + <xsl:text> path section </xsl:text> + <xsl:value-of select="$pathminmax"/> + <xsl:text> use min and max on non mumeric value</xsl:text> + <xsl:if test="count($item) = 1"> + <xsl:attribute name="index"> + <xsl:value-of select="$item/@index"/> + <xsl:attribute name="type"> + <xsl:value-of select="$pathtype"/> + <xsl:template mode="genlabel" match="arg"> + <xsl:value-of select="@value"/> + <xsl:template mode="genlabel" match="path"> + <xsl:value-of select="@value"/> + <xsl:if test="string-length(@min)>0 or string-length(@max)>0"> + <xsl:value-of select="@min"/> + <xsl:value-of select="@max"/> + <xsl:template mode="genlabel" match="widget"> + <xsl:text>HMI:</xsl:text> + <xsl:value-of select="@type"/> + <xsl:apply-templates mode="genlabel" select="arg"/> + <xsl:apply-templates mode="genlabel" select="path"/> <xsl:variable name="_parsed_widgets">
<widget type="VarInitPersistent">
--- a/svghmi/parse_labels.ysl2 Tue Apr 13 21:00:34 2021 +0200
+++ b/svghmi/parse_labels.ysl2 Tue Apr 13 21:04:46 2021 +0200
@@ -54,7 +54,7 @@
error > Widget id:«$id» label:«$label» has wrong syntax of path section «$pathminmax»
+ if "$indexed_hmitree" choose { when "regexp:test($path,'^\.[a-zA-Z0-9_]+$')" {
attrib "type" > PAGE_LOCAL
@@ -78,3 +78,18 @@
+// Templates to generate label back from parsed tree +template "arg", mode="genlabel" > :«@value» +template "path", mode="genlabel" { + if "string-length(@min)>0 or string-length(@max)>0" > :«@min»:«@max» +template "widget", mode="genlabel" { + apply "arg", mode="genlabel"; + apply "path", mode="genlabel"; --- a/svghmi/widgetlib/voltmeter.svg Tue Apr 13 21:00:34 2021 +0200
+++ b/svghmi/widgetlib/voltmeter.svg Tue Apr 13 21:04:46 2021 +0200
@@ -93,16 +93,16 @@
inkscape:pageopacity="0.0"
- inkscape:cx="-64.606209"
- inkscape:cy="537.51037"
+ inkscape:zoom="3.312923" inkscape:document-units="mm"
inkscape:current-layer="svg2354"
- inkscape:window-width="1452"
- inkscape:window-height="940"
- inkscape:window-x="1645"
+ inkscape:window-width="1605" + inkscape:window-height="1099" + inkscape:window-x="3543" + inkscape:window-y="375" inkscape:window-maximized="0" />
@@ -112,7 +112,7 @@
<dc:format>image/svg+xml</dc:format>
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
@@ -438,7 +438,7 @@
- inkscape:label="HMI:Meter@/PUMP0/SLOTH"
+ inkscape:label="HMI:Meter@/PUMP0/SLOTH,0,666" transform="matrix(0.57180538,0,0,0.57180538,88.118425,163.79208)"