--- a/svghmi/gen_index_xhtml.xslt Fri Feb 21 16:18:53 2020 +0100
+++ b/svghmi/gen_index_xhtml.xslt Fri Feb 21 16:22:44 2020 +0100
@@ -102,8 +102,8 @@
<xsl:template mode="inline_svg" match="svg:svg/@width"/>
<xsl:template mode="inline_svg" match="svg:svg/@height"/>
- <xsl:template mode="inline_svg" match="svg:svg">
+ <xsl:template xmlns="http://www.w3.org/2000/svg" mode="inline_svg" match="svg:svg"> <xsl:attribute name="preserveAspectRatio">
<xsl:text>none</xsl:text>
@@ -114,7 +114,7 @@
<xsl:text>100vw</xsl:text>
<xsl:apply-templates mode="inline_svg" select="@* | node()"/>
<xsl:template mode="inline_svg" match="svg:svg[@viewBox!=concat('0 0 ', @width, ' ', @height)]">
<xsl:message terminate="yes">
@@ -126,6 +126,40 @@
<xsl:text>All units must be set to "px" in Inkscape's document properties</xsl:text>
+ <xsl:template xmlns="http://www.w3.org/2000/svg" mode="inline_svg" match="svg:use"> + <xsl:attribute name="style"> + <xsl:value-of select="@style"/> + <xsl:attribute name="transform"> + <xsl:value-of select="@transform"/> + <xsl:attribute name="id"> + <xsl:value-of select="@id"/> + <xsl:variable name="targetid" select="substring-after(@xlink:href,'#')"/> + <xsl:apply-templates mode="unlink_clone" select="//svg:*[@id = $targetid]"/> + <xsl:template xmlns="http://www.w3.org/2000/svg" mode="unlink_clone" match="@*"> + <xsl:template xmlns="http://www.w3.org/2000/svg" mode="unlink_clone" match="svg:*"> + <xsl:when test="@id = $hmi_elements/@id"> + <xsl:attribute name="xlink:href"> + <xsl:value-of select="concat('#',@id)"/> + <xsl:apply-templates mode="unlink_clone" select="@* | node()"/> <xsl:text>Made with SVGHMI. https://beremiz.org</xsl:text>
@@ -139,7 +173,7 @@
<xsl:apply-templates mode="testtree" select="$indexed_hmitree"/>
- <html xmlns="http://www.w3.org/1999/xhtml">
+ <html xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/1999/xhtml"> <body style="margin:0;overflow:hidden;">
<xsl:apply-templates mode="inline_svg" select="svg:svg"/>
@@ -333,9 +367,9 @@
<xsl:value-of select="$desc/arg[1]/@value"/>
- <xsl:text> id: "</xsl:text>
+ <xsl:text> widget: hmi_widgets["</xsl:text> <xsl:value-of select="@id"/>
<xsl:text> bbox: [</xsl:text>
<xsl:value-of select="$p/@x"/>
@@ -824,17 +858,43 @@
<xsl:text> let new_desc = page_desc[page_name];
- <xsl:text> /* TODO hide / show widgets */
+ <xsl:text> if(new_desc == undefined){ <xsl:text> /* remove subsribers of previous page if any */
- <xsl:text> if(old_desc) for(let widget of old_desc.widgets){
+ <xsl:text> if(old_desc){ + <xsl:text> for(let widget of old_desc.widgets){ + <xsl:text> for(let index of widget.indexes){ + <xsl:text> subscribers[index].delete(widget); - <xsl:text> for(let index of widget.indexes){
+ <xsl:text> old_desc.widget.element.style.display = "none"; + <xsl:text> /* initial page switch : set everybody hidden */ - <xsl:text> subscribers[index].delete(widget);
+ <xsl:text> for(let name in page_desc){ + <xsl:text> if(name != new_desc){ + <xsl:text> page_desc[name].widget.element.style.display = "none"; @@ -842,31 +902,33 @@
- <xsl:text> if(new_desc) {
+ <xsl:text> /* add new subsribers if any */ - <xsl:text> /* add new subsribers if any */
+ <xsl:text> for(let widget of new_desc.widgets){ - <xsl:text> for(let widget of new_desc.widgets){
+ <xsl:text> for(let index of widget.indexes){ - <xsl:text> for(let index of widget.indexes){
+ <xsl:text> subscribers[index].add(widget); - <xsl:text> subscribers[index].add(widget);
+ <xsl:text> /* dispatch current cache in newly opened page widgets */ - <xsl:text> let cached_val = cache[index];
+ <xsl:text> let cached_val = cache[index]; - <xsl:text> if(cached_val != undefined)
+ <xsl:text> if(cached_val != undefined) - <xsl:text> dispatch_value_to_widget(widget, index, cached_val, cached_val);
+ <xsl:text> dispatch_value_to_widget(widget, index, cached_val, cached_val); - <xsl:text> svg_root.setAttribute('viewBox',new_desc.bbox.join(" "));
- <xsl:text> // TODO dispatch current cache in newly opened page
+ <xsl:text> new_desc.widget.element.style.display = "inline";
+ <xsl:text> svg_root.setAttribute('viewBox',new_desc.bbox.join(" ")); <xsl:text> current_page = page_name;
--- a/svghmi/gen_index_xhtml.ysl2 Fri Feb 21 16:18:53 2020 +0100
+++ b/svghmi/gen_index_xhtml.ysl2 Fri Feb 21 16:22:44 2020 +0100
@@ -133,6 +133,43 @@
error > All units must be set to "px" in Inkscape's document properties
+ /* clone unlinkink until widget for better perf with webkit */ + svgtmpl "svg:use", mode="inline_svg" + attrib "style" > «@style» + attrib "transform" > «@transform» + /* keep same id and label in case it is a widget */ + //attrib "inkscape:label","@inkscape:label"; + const "targetid","substring-after(@xlink:href,'#')"; + apply "//svg:*[@id = $targetid]", mode="unlink_clone"; + svgtmpl "@*", mode="unlink_clone" xsl:copy; + svgtmpl "svg:*", mode="unlink_clone" { + when "@id = $hmi_elements/@id" { + attrib "xlink:href" > «concat('#',@id)» + xsl:copy apply "@* | node()", mode="unlink_clone"; + // template "svg:use/@style", mode="inline_svg"{ + // attrib "style" > all:initial; + // template "svg:*[concat('#',@id) = //svg:use/@xlink:href]/@style", mode="inline_svg"{ + // attrib "style" > all:unset; /*const "mark" > =HMI=\n*/
/* copy root node and add geometry as comment for a test */