svghmi/gen_index_xhtml.xslt
branchsvghmi
changeset 2843 94696b3f69fb
parent 2842 2f73f001955a
child 2844 eee5dcd9fc92
equal deleted inserted replaced
2842:2f73f001955a 2843:94696b3f69fb
   124   <xsl:template mode="inline_svg" match="sodipodi:namedview[@units!='px' or @inkscape:document-units!='px']">
   124   <xsl:template mode="inline_svg" match="sodipodi:namedview[@units!='px' or @inkscape:document-units!='px']">
   125     <xsl:message terminate="yes">
   125     <xsl:message terminate="yes">
   126       <xsl:text>All units must be set to "px" in Inkscape's document properties</xsl:text>
   126       <xsl:text>All units must be set to "px" in Inkscape's document properties</xsl:text>
   127     </xsl:message>
   127     </xsl:message>
   128   </xsl:template>
   128   </xsl:template>
   129   <xsl:template xmlns="http://www.w3.org/2000/svg" mode="inline_svg" match="svg:use">
       
   130     <g>
       
   131       <xsl:attribute name="style">
       
   132         <xsl:value-of select="@style"/>
       
   133       </xsl:attribute>
       
   134       <xsl:attribute name="transform">
       
   135         <xsl:value-of select="@transform"/>
       
   136       </xsl:attribute>
       
   137       <xsl:attribute name="id">
       
   138         <xsl:value-of select="@id"/>
       
   139       </xsl:attribute>
       
   140       <xsl:variable name="targetid" select="substring-after(@xlink:href,'#')"/>
       
   141       <xsl:apply-templates mode="unlink_clone" select="//svg:*[@id = $targetid]"/>
       
   142     </g>
       
   143   </xsl:template>
       
   144   <xsl:template xmlns="http://www.w3.org/2000/svg" mode="unlink_clone" match="@*">
       
   145     <xsl:copy/>
       
   146   </xsl:template>
       
   147   <xsl:template xmlns="http://www.w3.org/2000/svg" mode="unlink_clone" match="svg:*">
       
   148     <xsl:choose>
       
   149       <xsl:when test="@id = $hmi_elements/@id">
       
   150         <use>
       
   151           <xsl:attribute name="xlink:href">
       
   152             <xsl:value-of select="concat('#',@id)"/>
       
   153           </xsl:attribute>
       
   154         </use>
       
   155       </xsl:when>
       
   156       <xsl:otherwise>
       
   157         <xsl:copy>
       
   158           <xsl:apply-templates mode="unlink_clone" select="@* | node()"/>
       
   159         </xsl:copy>
       
   160       </xsl:otherwise>
       
   161     </xsl:choose>
       
   162   </xsl:template>
       
   163   <xsl:template match="/">
   129   <xsl:template match="/">
   164     <xsl:comment>
   130     <xsl:comment>
   165       <xsl:text>Made with SVGHMI. https://beremiz.org</xsl:text>
   131       <xsl:text>Made with SVGHMI. https://beremiz.org</xsl:text>
   166     </xsl:comment>
   132     </xsl:comment>
   167     <xsl:comment>
   133     <xsl:comment>
   236   </func:function>
   202   </func:function>
   237   <func:function name="func:refered_elements">
   203   <func:function name="func:refered_elements">
   238     <xsl:param name="elems"/>
   204     <xsl:param name="elems"/>
   239     <xsl:variable name="descend" select="$elems/descendant-or-self::svg:*"/>
   205     <xsl:variable name="descend" select="$elems/descendant-or-self::svg:*"/>
   240     <xsl:variable name="clones" select="$descend[self::svg:use]"/>
   206     <xsl:variable name="clones" select="$descend[self::svg:use]"/>
   241     <xsl:variable name="reals" select="$descend[not(self::svg:use)]"/>
       
   242     <xsl:variable name="originals" select="//svg:*[concat('#',@id) = $clones/@xlink:href]"/>
   207     <xsl:variable name="originals" select="//svg:*[concat('#',@id) = $clones/@xlink:href]"/>
   243     <xsl:choose>
   208     <xsl:choose>
   244       <xsl:when test="$originals">
   209       <xsl:when test="$originals">
   245         <func:result select="$reals | func:refered_elements($originals)"/>
   210         <func:result select="$descend | func:refered_elements($originals)"/>
   246       </xsl:when>
   211       </xsl:when>
   247       <xsl:otherwise>
   212       <xsl:otherwise>
   248         <func:result select="$reals"/>
   213         <func:result select="$descend"/>
   249       </xsl:otherwise>
   214       </xsl:otherwise>
   250     </xsl:choose>
   215     </xsl:choose>
       
   216   </func:function>
       
   217   <func:function name="func:included_geometry">
       
   218     <xsl:param name="elt"/>
       
   219     <xsl:variable name="g" select="$geometry[@Id = $elt/@id]"/>
       
   220     <func:result select="$geometry[@Id != $elt/@id and&#10;                           @x &gt;= $g/@x and @y &gt;= $g/@y and &#10;                           @x+@w &lt;= $g/@x+$g/@w and @y+@h &lt;= $g/@y+$g/@h]"/>
       
   221   </func:function>
       
   222   <func:function name="func:sumarized_elements">
       
   223     <xsl:param name="elements"/>
       
   224     <xsl:variable name="short_list" select="$elements[not(ancestor::*/@id = $elements/@id)]"/>
       
   225     <xsl:variable name="filled_groups" select="$short_list/parent::svg:*[not(descendant::*[not(self::svg:g)][not(@id = $short_list/descendant-or-self::*[not(self::svg:g)]/@id)])]"/>
       
   226     <xsl:variable name="groups_to_add" select="$filled_groups[not(ancestor::*/@id = $filled_groups/@id)]"/>
       
   227     <func:result select="$groups_to_add | $short_list[not(ancestor::svg:g/@id = $filled_groups/@id)]"/>
       
   228   </func:function>
       
   229   <func:function name="func:all_related_elements">
       
   230     <xsl:param name="page"/>
       
   231     <xsl:variable name="page_included_geometry" select="func:included_geometry($page)"/>
       
   232     <xsl:variable name="page_sub_elements" select="func:refered_elements($page)"/>
       
   233     <xsl:variable name="page_included_elements" select="//svg:*[@id = $page_included_geometry/@Id]"/>
       
   234     <func:result select="$page_sub_elements | $page_included_elements"/>
   251   </func:function>
   235   </func:function>
   252   <xsl:template name="scripts">
   236   <xsl:template name="scripts">
   253     <xsl:text>//(function(){
   237     <xsl:text>//(function(){
   254 </xsl:text>
   238 </xsl:text>
   255     <xsl:text>
   239     <xsl:text>
   357     <xsl:text>var page_desc = {
   341     <xsl:text>var page_desc = {
   358 </xsl:text>
   342 </xsl:text>
   359     <xsl:for-each select="$hmi_pages">
   343     <xsl:for-each select="$hmi_pages">
   360       <xsl:variable name="desc" select="func:parselabel(@inkscape:label)/widget"/>
   344       <xsl:variable name="desc" select="func:parselabel(@inkscape:label)/widget"/>
   361       <xsl:variable name="page" select="."/>
   345       <xsl:variable name="page" select="."/>
   362       <xsl:variable name="p" select="$hmi_geometry[@Id = $page/@id]"/>
   346       <xsl:variable name="p" select="$geometry[@Id = $page/@id]"/>
   363       <xsl:variable name="page_ids" select="$hmi_geometry[@Id != $page/@id and &#10;                                @x &gt;= $p/@x and @y &gt;= $p/@y and &#10;                                @x+@w &lt;= $p/@x+$p/@w and @y+@h &lt;= $p/@y+$p/@h]/@Id"/>
   347       <xsl:variable name="page_all_elements" select="func:all_related_elements($page)"/>
   364       <xsl:variable name="page_sub_ids" select="func:refered_elements($page)[@id = $hmi_elements/@id]/@id"/>
   348       <xsl:variable name="all_page_ids" select="$page_all_elements[@id = $hmi_elements/@id and @id != $page/@id]/@id"/>
   365       <xsl:variable name="all_page_ids" select="$page_ids | $page_sub_ids[not(. = $page_ids)]"/>
   349       <xsl:variable name="shorter_list" select="func:sumarized_elements($page_all_elements)"/>
   366       <xsl:text>    "</xsl:text>
   350       <xsl:text>    "</xsl:text>
   367       <xsl:value-of select="$desc/arg[1]/@value"/>
   351       <xsl:value-of select="$desc/arg[1]/@value"/>
   368       <xsl:text>": {
   352       <xsl:text>": {
   369 </xsl:text>
   353 </xsl:text>
   370       <xsl:text>        widget: hmi_widgets["</xsl:text>
   354       <xsl:text>        widget: hmi_widgets["</xsl:text>
   393         <xsl:text>
   377         <xsl:text>
   394 </xsl:text>
   378 </xsl:text>
   395       </xsl:for-each>
   379       </xsl:for-each>
   396       <xsl:text>        ]
   380       <xsl:text>        ]
   397 </xsl:text>
   381 </xsl:text>
       
   382       <xsl:text>        required_elements: [
       
   383 </xsl:text>
       
   384       <xsl:for-each select="$shorter_list">
       
   385         <xsl:text>            "</xsl:text>
       
   386         <xsl:value-of select="@id"/>
       
   387         <xsl:text>",
       
   388 </xsl:text>
       
   389       </xsl:for-each>
       
   390       <xsl:text>        ]
       
   391 </xsl:text>
   398       <xsl:text>    }</xsl:text>
   392       <xsl:text>    }</xsl:text>
   399       <xsl:if test="position()!=last()">
   393       <xsl:if test="position()!=last()">
   400         <xsl:text>,</xsl:text>
   394         <xsl:text>,</xsl:text>
   401       </xsl:if>
   395       </xsl:if>
   402       <xsl:text>
   396       <xsl:text>
   850 </xsl:text>
   844 </xsl:text>
   851     <xsl:text>var current_page;
   845     <xsl:text>var current_page;
   852 </xsl:text>
   846 </xsl:text>
   853     <xsl:text>
   847     <xsl:text>
   854 </xsl:text>
   848 </xsl:text>
       
   849     <xsl:text>function prepare_svg() {
       
   850 </xsl:text>
       
   851     <xsl:text>    /* set everybody hidden initially for better performance */
       
   852 </xsl:text>
       
   853     <xsl:text>    for(let widget in hmi_widgets){
       
   854 </xsl:text>
       
   855     <xsl:text>        if(widget.element != undefined)
       
   856 </xsl:text>
       
   857     <xsl:text>            widget.element.style.display = "none";
       
   858 </xsl:text>
       
   859     <xsl:text>    }
       
   860 </xsl:text>
       
   861     <xsl:text>        /*for(let name in page_desc){
       
   862 </xsl:text>
       
   863     <xsl:text>            if(name != new_desc){
       
   864 </xsl:text>
       
   865     <xsl:text>                page_desc[name].widget.element.style.display = "none";
       
   866 </xsl:text>
       
   867     <xsl:text>            }
       
   868 </xsl:text>
       
   869     <xsl:text>        }*/
       
   870 </xsl:text>
       
   871     <xsl:text>};
       
   872 </xsl:text>
       
   873     <xsl:text>
       
   874 </xsl:text>
   855     <xsl:text>function switch_page(page_name) {
   875     <xsl:text>function switch_page(page_name) {
   856 </xsl:text>
   876 </xsl:text>
   857     <xsl:text>    let old_desc = page_desc[current_page];
   877     <xsl:text>    let old_desc = page_desc[current_page];
   858 </xsl:text>
   878 </xsl:text>
   859     <xsl:text>    let new_desc = page_desc[page_name];
   879     <xsl:text>    let new_desc = page_desc[page_name];
   860 </xsl:text>
   880 </xsl:text>
   861     <xsl:text>
   881     <xsl:text>
   862 </xsl:text>
   882 </xsl:text>
   863     <xsl:text>    if(new_desc == undefined){
   883     <xsl:text>    if(new_desc == undefined){
   864 </xsl:text>
   884 </xsl:text>
       
   885     <xsl:text>        /* TODO LOG ERROR */
       
   886 </xsl:text>
   865     <xsl:text>        return;
   887     <xsl:text>        return;
   866 </xsl:text>
   888 </xsl:text>
   867     <xsl:text>    }
   889     <xsl:text>    }
   868 </xsl:text>
   890 </xsl:text>
   869     <xsl:text>
   891     <xsl:text>
   870 </xsl:text>
   892 </xsl:text>
   871     <xsl:text>    /* remove subsribers of previous page if any */
       
   872 </xsl:text>
       
   873     <xsl:text>    if(old_desc){
   893     <xsl:text>    if(old_desc){
   874 </xsl:text>
   894 </xsl:text>
   875     <xsl:text>        for(let widget of old_desc.widgets){
   895     <xsl:text>        for(let widget of old_desc.widgets){
   876 </xsl:text>
   896 </xsl:text>
       
   897     <xsl:text>
       
   898 </xsl:text>
       
   899     <xsl:text>            /* hide widget */
       
   900 </xsl:text>
       
   901     <xsl:text>            if(widget.element != undefined)
       
   902 </xsl:text>
       
   903     <xsl:text>                widget.element.style.display = "none";
       
   904 </xsl:text>
       
   905     <xsl:text>
       
   906 </xsl:text>
       
   907     <xsl:text>            /* remove subsribers */
       
   908 </xsl:text>
   877     <xsl:text>            for(let index of widget.indexes){
   909     <xsl:text>            for(let index of widget.indexes){
   878 </xsl:text>
   910 </xsl:text>
   879     <xsl:text>                subscribers[index].delete(widget);
   911     <xsl:text>                subscribers[index].delete(widget);
   880 </xsl:text>
   912 </xsl:text>
   881     <xsl:text>            }
   913     <xsl:text>            }
   882 </xsl:text>
   914 </xsl:text>
   883     <xsl:text>        }
   915     <xsl:text>        }
   884 </xsl:text>
   916 </xsl:text>
   885     <xsl:text>        old_desc.widget.element.style.display = "none";
   917     <xsl:text>        old_desc.widget.element.style.display = "none";
   886 </xsl:text>
   918 </xsl:text>
   887     <xsl:text>    } else {
   919     <xsl:text>    }
   888 </xsl:text>
   920 </xsl:text>
   889     <xsl:text>        /* initial page switch : set everybody hidden */
   921     <xsl:text>
   890 </xsl:text>
   922 </xsl:text>
   891     <xsl:text>        for(let name in page_desc){
   923     <xsl:text>    for(let widget of new_desc.widgets){
   892 </xsl:text>
   924 </xsl:text>
   893     <xsl:text>            if(name != new_desc){
   925     <xsl:text>
   894 </xsl:text>
   926 </xsl:text>
   895     <xsl:text>                page_desc[name].widget.element.style.display = "none";
   927     <xsl:text>        /* unhide widget */
   896 </xsl:text>
   928 </xsl:text>
   897     <xsl:text>            }
   929     <xsl:text>        if(widget.element != undefined)
       
   930 </xsl:text>
       
   931     <xsl:text>            widget.element.style.display = "inline";
       
   932 </xsl:text>
       
   933     <xsl:text>
       
   934 </xsl:text>
       
   935     <xsl:text>        /* add widget's subsribers */
       
   936 </xsl:text>
       
   937     <xsl:text>        for(let index of widget.indexes){
       
   938 </xsl:text>
       
   939     <xsl:text>            subscribers[index].add(widget);
       
   940 </xsl:text>
       
   941     <xsl:text>            /* dispatch current cache in newly opened page widgets */
       
   942 </xsl:text>
       
   943     <xsl:text>            let cached_val = cache[index];
       
   944 </xsl:text>
       
   945     <xsl:text>            if(cached_val != undefined)
       
   946 </xsl:text>
       
   947     <xsl:text>                dispatch_value_to_widget(widget, index, cached_val, cached_val);
   898 </xsl:text>
   948 </xsl:text>
   899     <xsl:text>        }
   949     <xsl:text>        }
   900 </xsl:text>
   950 </xsl:text>
   901     <xsl:text>    }
   951     <xsl:text>    }
   902 </xsl:text>
   952 </xsl:text>
   903     <xsl:text>
   953     <xsl:text>
   904 </xsl:text>
   954 </xsl:text>
   905     <xsl:text>    /* add new subsribers if any */
       
   906 </xsl:text>
       
   907     <xsl:text>    for(let widget of new_desc.widgets){
       
   908 </xsl:text>
       
   909     <xsl:text>        for(let index of widget.indexes){
       
   910 </xsl:text>
       
   911     <xsl:text>            subscribers[index].add(widget);
       
   912 </xsl:text>
       
   913     <xsl:text>            /* dispatch current cache in newly opened page widgets */
       
   914 </xsl:text>
       
   915     <xsl:text>            let cached_val = cache[index];
       
   916 </xsl:text>
       
   917     <xsl:text>            if(cached_val != undefined)
       
   918 </xsl:text>
       
   919     <xsl:text>                dispatch_value_to_widget(widget, index, cached_val, cached_val);
       
   920 </xsl:text>
       
   921     <xsl:text>        }
       
   922 </xsl:text>
       
   923     <xsl:text>    }
       
   924 </xsl:text>
       
   925     <xsl:text>
       
   926 </xsl:text>
       
   927     <xsl:text>    new_desc.widget.element.style.display = "inline";
   955     <xsl:text>    new_desc.widget.element.style.display = "inline";
   928 </xsl:text>
   956 </xsl:text>
   929     <xsl:text>
   957     <xsl:text>
   930 </xsl:text>
   958 </xsl:text>
   931     <xsl:text>    svg_root.setAttribute('viewBox',new_desc.bbox.join(" "));
   959     <xsl:text>    svg_root.setAttribute('viewBox',new_desc.bbox.join(" "));
   949     <xsl:text>    init_widgets();
   977     <xsl:text>    init_widgets();
   950 </xsl:text>
   978 </xsl:text>
   951     <xsl:text>    send_reset();
   979     <xsl:text>    send_reset();
   952 </xsl:text>
   980 </xsl:text>
   953     <xsl:text>    // show main page
   981     <xsl:text>    // show main page
       
   982 </xsl:text>
       
   983     <xsl:text>    prepare_svg();
   954 </xsl:text>
   984 </xsl:text>
   955     <xsl:text>    switch_page(default_page);
   985     <xsl:text>    switch_page(default_page);
   956 </xsl:text>
   986 </xsl:text>
   957     <xsl:text>};
   987     <xsl:text>};
   958 </xsl:text>
   988 </xsl:text>