svghmi/gen_index_xhtml.xslt
branchsvghmi
changeset 2869 d9eb50c015d1
parent 2867 901c89c0cc08
child 2870 634b43d69897
equal deleted inserted replaced
2868:8d9757191f05 2869:d9eb50c015d1
   196       <xsl:with-param name="parentpath">
   196       <xsl:with-param name="parentpath">
   197         <xsl:value-of select="$parentpath"/>
   197         <xsl:value-of select="$parentpath"/>
   198       </xsl:with-param>
   198       </xsl:with-param>
   199     </xsl:apply-templates>
   199     </xsl:apply-templates>
   200   </xsl:template>
   200   </xsl:template>
       
   201   <func:function name="func:is_descendant_path">
       
   202     <xsl:param name="ancest"/>
       
   203     <xsl:param name="descend"/>
       
   204     <func:result select="starts-with($descend,$ancest)"/>
       
   205   </func:function>
   201   <xsl:template mode="inline_svg" match="@* | node()">
   206   <xsl:template mode="inline_svg" match="@* | node()">
   202     <xsl:if test="not(@id = $discardable_elements/@id)">
   207     <xsl:if test="not(@id = $discardable_elements/@id)">
   203       <xsl:copy>
   208       <xsl:copy>
   204         <xsl:apply-templates mode="inline_svg" select="@* | node()"/>
   209         <xsl:apply-templates mode="inline_svg" select="@* | node()"/>
   205       </xsl:copy>
   210       </xsl:copy>
   397               </xsl:attribute>
   402               </xsl:attribute>
   398             </arg>
   403             </arg>
   399           </xsl:for-each>
   404           </xsl:for-each>
   400           <xsl:variable name="paths" select="substring-after($description,'@')"/>
   405           <xsl:variable name="paths" select="substring-after($description,'@')"/>
   401           <xsl:for-each select="str:split($paths, '@')">
   406           <xsl:for-each select="str:split($paths, '@')">
   402             <path>
   407             <xsl:if test="string-length(.) &gt; 0">
   403               <xsl:attribute name="value">
   408               <path>
   404                 <xsl:value-of select="."/>
   409                 <xsl:attribute name="value">
   405               </xsl:attribute>
   410                   <xsl:value-of select="."/>
   406             </path>
   411                 </xsl:attribute>
       
   412                 <xsl:variable name="path" select="."/>
       
   413                 <xsl:variable name="item" select="$indexed_hmitree/*[@hmipath = $path]"/>
       
   414                 <xsl:if test="count($item) = 1">
       
   415                   <xsl:attribute name="index">
       
   416                     <xsl:value-of select="$item/@index"/>
       
   417                   </xsl:attribute>
       
   418                 </xsl:if>
       
   419               </path>
       
   420             </xsl:if>
   407           </xsl:for-each>
   421           </xsl:for-each>
   408         </widget>
   422         </widget>
   409       </xsl:if>
   423       </xsl:if>
   410     </xsl:variable>
   424     </xsl:variable>
   411     <func:result select="exsl:node-set($ast)"/>
   425     <func:result select="exsl:node-set($ast)"/>
   451       <xsl:text>    ],
   465       <xsl:text>    ],
   452 </xsl:text>
   466 </xsl:text>
   453       <xsl:text>    indexes: [
   467       <xsl:text>    indexes: [
   454 </xsl:text>
   468 </xsl:text>
   455       <xsl:for-each select="$widget/path">
   469       <xsl:for-each select="$widget/path">
   456         <xsl:variable name="hmipath" select="@value"/>
       
   457         <xsl:variable name="hmitree_match" select="$indexed_hmitree/*[@hmipath = $hmipath]"/>
       
   458         <xsl:choose>
   470         <xsl:choose>
   459           <xsl:when test="count($hmitree_match) = 0">
   471           <xsl:when test="not(@index)">
   460             <xsl:message terminate="no">
   472             <xsl:message terminate="no">
   461               <xsl:text>Widget </xsl:text>
   473               <xsl:text>Widget </xsl:text>
   462               <xsl:value-of select="$widget/@type"/>
   474               <xsl:value-of select="$widget/@type"/>
   463               <xsl:text> id="</xsl:text>
   475               <xsl:text> id="</xsl:text>
   464               <xsl:value-of select="$eltid"/>
   476               <xsl:value-of select="$eltid"/>
   465               <xsl:text>" : No match for path "</xsl:text>
   477               <xsl:text>" : No match for path "</xsl:text>
   466               <xsl:value-of select="$hmipath"/>
   478               <xsl:value-of select="@value"/>
   467               <xsl:text>" in HMI tree</xsl:text>
   479               <xsl:text>" in HMI tree</xsl:text>
   468             </xsl:message>
   480             </xsl:message>
   469           </xsl:when>
   481           </xsl:when>
   470           <xsl:otherwise>
   482           <xsl:otherwise>
   471             <xsl:text>            </xsl:text>
   483             <xsl:text>            </xsl:text>
   472             <xsl:value-of select="$hmitree_match/@index"/>
   484             <xsl:value-of select="@index"/>
   473             <xsl:if test="position()!=last()">
   485             <xsl:if test="position()!=last()">
   474               <xsl:text>,</xsl:text>
   486               <xsl:text>,</xsl:text>
   475             </xsl:if>
   487             </xsl:if>
   476             <xsl:text>
   488             <xsl:text>
   477 </xsl:text>
   489 </xsl:text>
   549     <xsl:for-each select="$hmi_pages">
   561     <xsl:for-each select="$hmi_pages">
   550       <xsl:variable name="desc" select="func:parselabel(@inkscape:label)/widget"/>
   562       <xsl:variable name="desc" select="func:parselabel(@inkscape:label)/widget"/>
   551       <xsl:variable name="page" select="."/>
   563       <xsl:variable name="page" select="."/>
   552       <xsl:variable name="p" select="$geometry[@Id = $page/@id]"/>
   564       <xsl:variable name="p" select="$geometry[@Id = $page/@id]"/>
   553       <xsl:variable name="page_all_elements" select="func:all_related_elements($page)"/>
   565       <xsl:variable name="page_all_elements" select="func:all_related_elements($page)"/>
   554       <xsl:variable name="all_page_ids" select="$page_all_elements[@id = $hmi_elements/@id and @id != $page/@id]/@id"/>
   566       <xsl:variable name="all_page_widgets" select="$hmi_elements[@id = $page_all_elements/@id and @id != $page/@id]"/>
       
   567       <xsl:variable name="page_relative_widgets" select="$all_page_widgets[func:is_descendant_path($desc/path/@value, path/@value)]"/>
   555       <xsl:variable name="required_detachables" select="func:sumarized_elements($page_all_elements)/&#10;                   ancestor-or-self::*[@id = $detachable_elements/@id]"/>
   568       <xsl:variable name="required_detachables" select="func:sumarized_elements($page_all_elements)/&#10;                   ancestor-or-self::*[@id = $detachable_elements/@id]"/>
   556       <xsl:text>  "</xsl:text>
   569       <xsl:text>  "</xsl:text>
   557       <xsl:value-of select="$desc/arg[1]/@value"/>
   570       <xsl:value-of select="$desc/arg[1]/@value"/>
   558       <xsl:text>": {
   571       <xsl:text>": {
   559 </xsl:text>
   572 </xsl:text>
   569       <xsl:value-of select="$p/@w"/>
   582       <xsl:value-of select="$p/@w"/>
   570       <xsl:text>, </xsl:text>
   583       <xsl:text>, </xsl:text>
   571       <xsl:value-of select="$p/@h"/>
   584       <xsl:value-of select="$p/@h"/>
   572       <xsl:text>],
   585       <xsl:text>],
   573 </xsl:text>
   586 </xsl:text>
   574       <xsl:text>    widgets: [
   587       <xsl:if test="$desc/path/@value">
   575 </xsl:text>
   588         <xsl:if test="count($desc/path/@index)=0">
   576       <xsl:for-each select="$all_page_ids">
   589           <xsl:message terminate="no">
       
   590             <xsl:text>Page id="</xsl:text>
       
   591             <xsl:value-of select="$page/@id"/>
       
   592             <xsl:text>" : No match for path "</xsl:text>
       
   593             <xsl:value-of select="$desc/path/@value"/>
       
   594             <xsl:text>" in HMI tree</xsl:text>
       
   595           </xsl:message>
       
   596         </xsl:if>
       
   597         <xsl:text>    page_index: </xsl:text>
       
   598         <xsl:value-of select="$desc/path/@index"/>
       
   599         <xsl:text>,
       
   600 </xsl:text>
       
   601       </xsl:if>
       
   602       <xsl:text>    relative_widgets: [
       
   603 </xsl:text>
       
   604       <xsl:for-each select="$page_relative_widgets">
   577         <xsl:text>        hmi_widgets["</xsl:text>
   605         <xsl:text>        hmi_widgets["</xsl:text>
   578         <xsl:value-of select="."/>
   606         <xsl:value-of select="@id"/>
       
   607         <xsl:text>"]</xsl:text>
       
   608         <xsl:if test="position()!=last()">
       
   609           <xsl:text>,</xsl:text>
       
   610         </xsl:if>
       
   611         <xsl:text>
       
   612 </xsl:text>
       
   613       </xsl:for-each>
       
   614       <xsl:text>    ],
       
   615 </xsl:text>
       
   616       <xsl:text>    absolute_widgets: [
       
   617 </xsl:text>
       
   618       <xsl:for-each select="$all_page_widgets[not(@id = $page_relative_widgets/@id)]">
       
   619         <xsl:text>        hmi_widgets["</xsl:text>
       
   620         <xsl:value-of select="@id"/>
   579         <xsl:text>"]</xsl:text>
   621         <xsl:text>"]</xsl:text>
   580         <xsl:if test="position()!=last()">
   622         <xsl:if test="position()!=last()">
   581           <xsl:text>,</xsl:text>
   623           <xsl:text>,</xsl:text>
   582         </xsl:if>
   624         </xsl:if>
   583         <xsl:text>
   625         <xsl:text>
  1136 </xsl:text>
  1178 </xsl:text>
  1137     <xsl:text>};
  1179     <xsl:text>};
  1138 </xsl:text>
  1180 </xsl:text>
  1139     <xsl:text>
  1181     <xsl:text>
  1140 </xsl:text>
  1182 </xsl:text>
  1141     <xsl:text>function switch_page(page_name) {
  1183     <xsl:text>function switch_page(page_name, root_index) {
  1142 </xsl:text>
  1184 </xsl:text>
  1143     <xsl:text>    if(current_subscribed_page != current_visible_page){
  1185     <xsl:text>    if(current_subscribed_page != current_visible_page){
  1144 </xsl:text>
  1186 </xsl:text>
  1145     <xsl:text>        /* page switch already going */
  1187     <xsl:text>        /* page switch already going */
  1146 </xsl:text>
  1188 </xsl:text>
  1162 </xsl:text>
  1204 </xsl:text>
  1163     <xsl:text>};
  1205     <xsl:text>};
  1164 </xsl:text>
  1206 </xsl:text>
  1165     <xsl:text>
  1207     <xsl:text>
  1166 </xsl:text>
  1208 </xsl:text>
       
  1209     <xsl:text>function* chain(a,b){
       
  1210 </xsl:text>
       
  1211     <xsl:text>    yield* a;
       
  1212 </xsl:text>
       
  1213     <xsl:text>    yield* b;
       
  1214 </xsl:text>
       
  1215     <xsl:text>};
       
  1216 </xsl:text>
       
  1217     <xsl:text>
       
  1218 </xsl:text>
  1167     <xsl:text>function switch_subscribed_page(page_name) {
  1219     <xsl:text>function switch_subscribed_page(page_name) {
  1168 </xsl:text>
  1220 </xsl:text>
  1169     <xsl:text>    let old_desc = page_desc[current_subscribed_page];
  1221     <xsl:text>    let old_desc = page_desc[current_subscribed_page];
  1170 </xsl:text>
  1222 </xsl:text>
  1171     <xsl:text>    let new_desc = page_desc[page_name];
  1223     <xsl:text>    let new_desc = page_desc[page_name];
  1182 </xsl:text>
  1234 </xsl:text>
  1183     <xsl:text>
  1235     <xsl:text>
  1184 </xsl:text>
  1236 </xsl:text>
  1185     <xsl:text>    if(old_desc){
  1237     <xsl:text>    if(old_desc){
  1186 </xsl:text>
  1238 </xsl:text>
  1187     <xsl:text>        for(let widget of old_desc.widgets){
  1239     <xsl:text>        for(let widget of chain(old_desc.absolute_widgets,old_desc.relative_widgets)){
  1188 </xsl:text>
  1240 </xsl:text>
  1189     <xsl:text>            /* remove subsribers */
  1241     <xsl:text>            /* remove subsribers */
  1190 </xsl:text>
  1242 </xsl:text>
  1191     <xsl:text>            for(let index of widget.indexes){
  1243     <xsl:text>            for(let index of widget.indexes){
  1192 </xsl:text>
  1244 </xsl:text>
  1196 </xsl:text>
  1248 </xsl:text>
  1197     <xsl:text>        }
  1249     <xsl:text>        }
  1198 </xsl:text>
  1250 </xsl:text>
  1199     <xsl:text>    }
  1251     <xsl:text>    }
  1200 </xsl:text>
  1252 </xsl:text>
  1201     <xsl:text>    for(let widget of new_desc.widgets){
  1253     <xsl:text>    for(let widget of chain(new_desc.absolute_widgets,new_desc.relative_widgets)){
  1202 </xsl:text>
  1254 </xsl:text>
  1203     <xsl:text>        /* add widget's subsribers */
  1255     <xsl:text>        /* add widget's subsribers */
  1204 </xsl:text>
  1256 </xsl:text>
  1205     <xsl:text>        for(let index of widget.indexes){
  1257     <xsl:text>        for(let index of widget.indexes){
  1206 </xsl:text>
  1258 </xsl:text>
  1274 </xsl:text>
  1326 </xsl:text>
  1275     <xsl:text>    }
  1327     <xsl:text>    }
  1276 </xsl:text>
  1328 </xsl:text>
  1277     <xsl:text>
  1329     <xsl:text>
  1278 </xsl:text>
  1330 </xsl:text>
  1279     <xsl:text>    for(let widget of new_desc.widgets){
  1331     <xsl:text>    for(let widget of chain(new_desc.absolute_widgets,new_desc.relative_widgets)){
  1280 </xsl:text>
  1332 </xsl:text>
  1281     <xsl:text>        for(let index of widget.indexes){
  1333     <xsl:text>        for(let index of widget.indexes){
  1282 </xsl:text>
  1334 </xsl:text>
  1283     <xsl:text>            /* dispatch current cache in newly opened page widgets */
  1335     <xsl:text>            /* dispatch current cache in newly opened page widgets */
  1284 </xsl:text>
  1336 </xsl:text>
  1619   </xsl:template>
  1671   </xsl:template>
  1620   <xsl:template mode="widget_defs" match="widget[@type='Jump']">
  1672   <xsl:template mode="widget_defs" match="widget[@type='Jump']">
  1621     <xsl:param name="hmi_element"/>
  1673     <xsl:param name="hmi_element"/>
  1622     <xsl:text>    on_click: function(evt) {
  1674     <xsl:text>    on_click: function(evt) {
  1623 </xsl:text>
  1675 </xsl:text>
  1624     <xsl:text>        switch_page(this.args[0]);
  1676     <xsl:text>        switch_page(this.args[0], this.indexes[0]);
  1625 </xsl:text>
  1677 </xsl:text>
  1626     <xsl:text>    },
  1678     <xsl:text>    },
  1627 </xsl:text>
  1679 </xsl:text>
  1628     <xsl:text>    init: function() {
  1680     <xsl:text>    init: function() {
  1629 </xsl:text>
  1681 </xsl:text>