--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/svghmi/detachable_elements.ysl2 Tue Mar 17 09:29:04 2020 +0100
@@ -0,0 +1,75 @@
+// detachable_elements.ysl2 +// compute what elements are required by pages +// and decide where to cut when removing/attaching +// pages elements on page switch +// returns all directly or indirectly refered elements +def "func:refered_elements" { + const "descend", "$elems/descendant-or-self::svg:*"; + const "clones", "$descend[self::svg:use]"; + const "originals", "//svg:*[concat('#',@id) = $clones/@xlink:href]"; + result "$descend | func:refered_elements($originals)"; +def "func:all_related_elements" { + const "page_overlapping_geometry", "func:overlapping_geometry($page)"; + const "page_overlapping_elements", "//svg:*[@id = $page_overlapping_geometry/@Id]"; + const "page_sub_elements", "func:refered_elements($page | $page_overlapping_elements)"; + result "$page_sub_elements"; +def "func:required_elements" { + result """func:all_related_elements($pages[1]) + | func:required_elements($pages[position()!=1])"""; +const "required_elements", + """//svg:defs/descendant-or-self::svg:* + | func:required_elements($hmi_pages)/ancestor-or-self::svg:*"""; +const "discardable_elements", "//svg:*[not(@id = $required_elements/@id)]"; +def "func:sumarized_elements" { + const "short_list", "$elements[not(ancestor::*/@id = $elements/@id)]"; + const "filled_groups", """$short_list/parent::svg:*[ + not(@id = $discardable_elements/@id) and + not(@id = $short_list/descendant-or-self::*[not(self::svg:g)]/@id) + const "groups_to_add", "$filled_groups[not(ancestor::*/@id = $filled_groups/@id)]"; + result "$groups_to_add | $short_list[not(ancestor::svg:g/@id = $filled_groups/@id)]"; +def "func:detachable_elements" { + result """func:sumarized_elements(func:all_related_elements($pages[1])) + | func:detachable_elements($pages[position()!=1])"""; +// Avoid nested detachables +const "_detachable_elements", "func:detachable_elements($hmi_pages)"; +const "detachable_elements", "$_detachable_elements[not(ancestor::*/@id = $_detachable_elements/@id)]"; --- a/svghmi/gen_index_xhtml.xslt Tue Mar 17 08:00:33 2020 +0100
+++ b/svghmi/gen_index_xhtml.xslt Tue Mar 17 09:29:04 2020 +0100
@@ -37,23 +37,9 @@
<xsl:variable name="categories" select="exsl:node-set($_categories)"/>
- <func:function name="func:refered_elements">
- <xsl:param name="elems"/>
- <xsl:variable name="descend" select="$elems/descendant-or-self::svg:*"/>
- <xsl:variable name="clones" select="$descend[self::svg:use]"/>
- <xsl:variable name="originals" select="//svg:*[concat('#',@id) = $clones/@xlink:href]"/>
- <xsl:when test="$originals">
- <func:result select="$descend | func:refered_elements($originals)"/>
- <func:result select="$descend"/>
<xsl:variable name="geometry" select="ns:GetSVGGeometry()"/>
<xsl:template name="debug_geometry">
- <xsl:text>GEOMETRY : ID, x, y, w, h
+ <xsl:text>ID, x, y, w, h <xsl:for-each select="$geometry[@Id = $hmi_elements/@id]">
@@ -116,6 +102,20 @@
<xsl:variable name="candidates" select="$geometry[@Id != $elt/@id]"/>
<func:result select="$candidates[(@Id = $groups/@id and (func:intersect($g, .) = 9)) or (not(@Id = $groups/@id) and (func:intersect($g, .) > 0 ))]"/>
+ <func:function name="func:refered_elements"> + <xsl:param name="elems"/> + <xsl:variable name="descend" select="$elems/descendant-or-self::svg:*"/> + <xsl:variable name="clones" select="$descend[self::svg:use]"/> + <xsl:variable name="originals" select="//svg:*[concat('#',@id) = $clones/@xlink:href]"/> + <xsl:when test="$originals"> + <func:result select="$descend | func:refered_elements($originals)"/> + <func:result select="$descend"/> <func:function name="func:all_related_elements">
<xsl:variable name="page_overlapping_geometry" select="func:overlapping_geometry($page)"/>
@@ -127,19 +127,19 @@
<xsl:param name="pages"/>
- <func:result select="func:all_related_elements($pages[1]) | func:required_elements($pages[position()!=1])"/>
+ <func:result select="func:all_related_elements($pages[1]) | func:required_elements($pages[position()!=1])"/> <func:result select="/.."/>
- <xsl:variable name="required_elements" select="//svg:defs/descendant-or-self::svg:* | func:required_elements($hmi_pages)/ancestor-or-self::svg:*"/>
+ <xsl:variable name="required_elements" select="//svg:defs/descendant-or-self::svg:* | func:required_elements($hmi_pages)/ancestor-or-self::svg:*"/> <xsl:variable name="discardable_elements" select="//svg:*[not(@id = $required_elements/@id)]"/>
<func:function name="func:sumarized_elements">
<xsl:param name="elements"/>
<xsl:variable name="short_list" select="$elements[not(ancestor::*/@id = $elements/@id)]"/>
- <xsl:variable name="filled_groups" select="$short_list/parent::svg:*[ not(descendant::*[ not(self::svg:g) and not(@id = $discardable_elements/@id) and not(@id = $short_list/descendant-or-self::*[not(self::svg:g)]/@id) ])]"/>
+ <xsl:variable name="filled_groups" select="$short_list/parent::svg:*[ not(descendant::*[ not(self::svg:g) and not(@id = $discardable_elements/@id) and not(@id = $short_list/descendant-or-self::*[not(self::svg:g)]/@id) ])]"/> <xsl:variable name="groups_to_add" select="$filled_groups[not(ancestor::*/@id = $filled_groups/@id)]"/>
<func:result select="$groups_to_add | $short_list[not(ancestor::svg:g/@id = $filled_groups/@id)]"/>
@@ -147,7 +147,7 @@
<xsl:param name="pages"/>
- <func:result select="func:sumarized_elements(func:all_related_elements($pages[1])) | func:detachable_elements($pages[position()!=1])"/>
+ <func:result select="func:sumarized_elements(func:all_related_elements($pages[1])) | func:detachable_elements($pages[position()!=1])"/> <func:result select="/.."/>
--- a/svghmi/gen_index_xhtml.ysl2 Tue Mar 17 08:00:33 2020 +0100
+++ b/svghmi/gen_index_xhtml.ysl2 Tue Mar 17 09:29:04 2020 +0100
@@ -65,79 +65,9 @@
const "categories", "exsl:node-set($_categories)";
- // returns all directly or indirectly refered elements
- def "func:refered_elements" {
- const "descend", "$elems/descendant-or-self::svg:*";
- const "clones", "$descend[self::svg:use]";
- const "originals", "//svg:*[concat('#',@id) = $clones/@xlink:href]";
- result "$descend | func:refered_elements($originals)";
- def "func:all_related_elements" {
- const "page_overlapping_geometry", "func:overlapping_geometry($page)";
- const "page_overlapping_elements", "//svg:*[@id = $page_overlapping_geometry/@Id]";
- const "page_sub_elements", "func:refered_elements($page | $page_overlapping_elements)";
- result "$page_sub_elements";
- def "func:required_elements" {
- result """func:all_related_elements($pages[1])
- | func:required_elements($pages[position()!=1])""";
- const "required_elements",
- """//svg:defs/descendant-or-self::svg:*
- | func:required_elements($hmi_pages)/ancestor-or-self::svg:*""";
- const "discardable_elements", "//svg:*[not(@id = $required_elements/@id)]";
- def "func:sumarized_elements" {
- const "short_list", "$elements[not(ancestor::*/@id = $elements/@id)]";
- const "filled_groups", """$short_list/parent::svg:*[
- not(@id = $discardable_elements/@id) and
- not(@id = $short_list/descendant-or-self::*[not(self::svg:g)]/@id)
- const "groups_to_add", "$filled_groups[not(ancestor::*/@id = $filled_groups/@id)]";
- result "$groups_to_add | $short_list[not(ancestor::svg:g/@id = $filled_groups/@id)]";
- def "func:detachable_elements" {
- result """func:sumarized_elements(func:all_related_elements($pages[1]))
- | func:detachable_elements($pages[position()!=1])""";
- // Avoid nested detachables
- const "_detachable_elements", "func:detachable_elements($hmi_pages)";
- const "detachable_elements", "$_detachable_elements[not(ancestor::*/@id = $_detachable_elements/@id)]";
+ include detachable_elements.ysl2 --- a/svghmi/geometry.ysl2 Tue Mar 17 08:00:33 2020 +0100
+++ b/svghmi/geometry.ysl2 Tue Mar 17 09:29:04 2020 +0100
@@ -9,7 +9,7 @@
function "debug_geometry" {
- | GEOMETRY : ID, x, y, w, h
foreach "$geometry[@Id = $hmi_elements/@id]"
| «@Id» «@x» «@y» «@w» «@h»