svghmi/gen_index_xhtml.xslt
branchsvghmi
changeset 2870 634b43d69897
parent 2869 d9eb50c015d1
child 2872 83adf8859c55
equal deleted inserted replaced
2869:d9eb50c015d1 2870:634b43d69897
   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">
   201   <func:function name="func:is_descendant_path">
       
   202     <xsl:param name="descend"/>
   202     <xsl:param name="ancest"/>
   203     <xsl:param name="ancest"/>
   203     <xsl:param name="descend"/>
   204     <func:result select="string-length($ancest) &gt; 0 and starts-with($descend,$ancest)"/>
   204     <func:result select="starts-with($descend,$ancest)"/>
       
   205   </func:function>
   205   </func:function>
   206   <xsl:template mode="inline_svg" match="@* | node()">
   206   <xsl:template mode="inline_svg" match="@* | node()">
   207     <xsl:if test="not(@id = $discardable_elements/@id)">
   207     <xsl:if test="not(@id = $discardable_elements/@id)">
   208       <xsl:copy>
   208       <xsl:copy>
   209         <xsl:apply-templates mode="inline_svg" select="@* | node()"/>
   209         <xsl:apply-templates mode="inline_svg" select="@* | node()"/>
   562       <xsl:variable name="desc" select="func:parselabel(@inkscape:label)/widget"/>
   562       <xsl:variable name="desc" select="func:parselabel(@inkscape:label)/widget"/>
   563       <xsl:variable name="page" select="."/>
   563       <xsl:variable name="page" select="."/>
   564       <xsl:variable name="p" select="$geometry[@Id = $page/@id]"/>
   564       <xsl:variable name="p" select="$geometry[@Id = $page/@id]"/>
   565       <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)"/>
   566       <xsl:variable name="all_page_widgets" select="$hmi_elements[@id = $page_all_elements/@id and @id != $page/@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)]"/>
   567       <xsl:variable name="page_relative_widgets" select="$all_page_widgets[func:is_descendant_path(func:parselabel(@inkscape:label)/widget/path/@value, $desc/path/@value)]"/>
   568       <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]"/>
   569       <xsl:text>  "</xsl:text>
   569       <xsl:text>  "</xsl:text>
   570       <xsl:value-of select="$desc/arg[1]/@value"/>
   570       <xsl:value-of select="$desc/arg[1]/@value"/>
   571       <xsl:text>": {
   571       <xsl:text>": {
   572 </xsl:text>
   572 </xsl:text>
   674 </xsl:text>
   674 </xsl:text>
   675     <xsl:text>function dispatch_value_to_widget(widget, index, value, oldval) {
   675     <xsl:text>function dispatch_value_to_widget(widget, index, value, oldval) {
   676 </xsl:text>
   676 </xsl:text>
   677     <xsl:text>    try {
   677     <xsl:text>    try {
   678 </xsl:text>
   678 </xsl:text>
   679     <xsl:text>        let idxidx = widget.indexes.indexOf(index);
   679     <xsl:text>        let idx = widget.offset ? index - widget.offset : index;
       
   680 </xsl:text>
       
   681     <xsl:text>        let idxidx = widget.indexes.indexOf(idx);
   680 </xsl:text>
   682 </xsl:text>
   681     <xsl:text>        let d = widget.dispatch;
   683     <xsl:text>        let d = widget.dispatch;
   682 </xsl:text>
   684 </xsl:text>
       
   685     <xsl:text>        console.log(index, idx, idxidx, value);
       
   686 </xsl:text>
   683     <xsl:text>        if(typeof(d) == "function" &amp;&amp; idxidx == 0){
   687     <xsl:text>        if(typeof(d) == "function" &amp;&amp; idxidx == 0){
   684 </xsl:text>
   688 </xsl:text>
   685     <xsl:text>            d.call(widget, value, oldval);
   689     <xsl:text>            d.call(widget, value, oldval);
   686 </xsl:text>
   690 </xsl:text>
   687     <xsl:text>        }else if(typeof(d) == "object" &amp;&amp; d.length &gt;= idxidx){
   691     <xsl:text>        }
       
   692 </xsl:text>
       
   693     <xsl:text>        /* TODO deal with multiple paths
       
   694 </xsl:text>
       
   695     <xsl:text>           and dispatch according to index+page_offset */
       
   696 </xsl:text>
       
   697     <xsl:text>        /*else if(typeof(d) == "object" &amp;&amp; d.length &gt;= idxidx){
   688 </xsl:text>
   698 </xsl:text>
   689     <xsl:text>            d[idxidx].call(widget, value, oldval);
   699     <xsl:text>            d[idxidx].call(widget, value, oldval);
   690 </xsl:text>
   700 </xsl:text>
   691     <xsl:text>        }/* else dispatch_0, ..., dispatch_n ? */
   701     <xsl:text>        }*/
       
   702 </xsl:text>
       
   703     <xsl:text>        /* else dispatch_0, ..., dispatch_n ? */
   692 </xsl:text>
   704 </xsl:text>
   693     <xsl:text>        /*else {
   705     <xsl:text>        /*else {
   694 </xsl:text>
   706 </xsl:text>
   695     <xsl:text>            throw new Error("Dunno how to dispatch to widget at index = " + index);
   707     <xsl:text>            throw new Error("Dunno how to dispatch to widget at index = " + index);
   696 </xsl:text>
   708 </xsl:text>
  1178 </xsl:text>
  1190 </xsl:text>
  1179     <xsl:text>};
  1191     <xsl:text>};
  1180 </xsl:text>
  1192 </xsl:text>
  1181     <xsl:text>
  1193     <xsl:text>
  1182 </xsl:text>
  1194 </xsl:text>
  1183     <xsl:text>function switch_page(page_name, root_index) {
  1195     <xsl:text>function switch_page(page_name, page_index) {
  1184 </xsl:text>
  1196 </xsl:text>
  1185     <xsl:text>    if(current_subscribed_page != current_visible_page){
  1197     <xsl:text>    if(current_subscribed_page != current_visible_page){
  1186 </xsl:text>
  1198 </xsl:text>
  1187     <xsl:text>        /* page switch already going */
  1199     <xsl:text>        /* page switch already going */
  1188 </xsl:text>
  1200 </xsl:text>
  1198 </xsl:text>
  1210 </xsl:text>
  1199     <xsl:text>        return;
  1211     <xsl:text>        return;
  1200 </xsl:text>
  1212 </xsl:text>
  1201     <xsl:text>    }
  1213     <xsl:text>    }
  1202 </xsl:text>
  1214 </xsl:text>
  1203     <xsl:text>    switch_subscribed_page(page_name);
  1215     <xsl:text>    switch_subscribed_page(page_name, page_index);
  1204 </xsl:text>
  1216 </xsl:text>
  1205     <xsl:text>};
  1217     <xsl:text>};
  1206 </xsl:text>
  1218 </xsl:text>
  1207     <xsl:text>
  1219     <xsl:text>
  1208 </xsl:text>
  1220 </xsl:text>
  1214 </xsl:text>
  1226 </xsl:text>
  1215     <xsl:text>};
  1227     <xsl:text>};
  1216 </xsl:text>
  1228 </xsl:text>
  1217     <xsl:text>
  1229     <xsl:text>
  1218 </xsl:text>
  1230 </xsl:text>
  1219     <xsl:text>function switch_subscribed_page(page_name) {
  1231     <xsl:text>function switch_subscribed_page(page_name, page_index) {
  1220 </xsl:text>
  1232 </xsl:text>
  1221     <xsl:text>    let old_desc = page_desc[current_subscribed_page];
  1233     <xsl:text>    let old_desc = page_desc[current_subscribed_page];
  1222 </xsl:text>
  1234 </xsl:text>
  1223     <xsl:text>    let new_desc = page_desc[page_name];
  1235     <xsl:text>    let new_desc = page_desc[page_name];
  1224 </xsl:text>
  1236 </xsl:text>
  1232 </xsl:text>
  1244 </xsl:text>
  1233     <xsl:text>    }
  1245     <xsl:text>    }
  1234 </xsl:text>
  1246 </xsl:text>
  1235     <xsl:text>
  1247     <xsl:text>
  1236 </xsl:text>
  1248 </xsl:text>
       
  1249     <xsl:text>    if(page_index == undefined){
       
  1250 </xsl:text>
       
  1251     <xsl:text>        page_index = new_desc.page_index;
       
  1252 </xsl:text>
       
  1253     <xsl:text>    }
       
  1254 </xsl:text>
       
  1255     <xsl:text>
       
  1256 </xsl:text>
  1237     <xsl:text>    if(old_desc){
  1257     <xsl:text>    if(old_desc){
  1238 </xsl:text>
  1258 </xsl:text>
  1239     <xsl:text>        for(let widget of chain(old_desc.absolute_widgets,old_desc.relative_widgets)){
  1259     <xsl:text>        for(let widget of old_desc.absolute_widgets){
  1240 </xsl:text>
  1260 </xsl:text>
  1241     <xsl:text>            /* remove subsribers */
  1261     <xsl:text>            /* remove subsribers */
  1242 </xsl:text>
  1262 </xsl:text>
  1243     <xsl:text>            for(let index of widget.indexes){
  1263     <xsl:text>            for(let index of widget.indexes){
  1244 </xsl:text>
  1264 </xsl:text>
  1246 </xsl:text>
  1266 </xsl:text>
  1247     <xsl:text>            }
  1267     <xsl:text>            }
  1248 </xsl:text>
  1268 </xsl:text>
  1249     <xsl:text>        }
  1269     <xsl:text>        }
  1250 </xsl:text>
  1270 </xsl:text>
  1251     <xsl:text>    }
  1271     <xsl:text>        for(let widget of old_desc.relative_widgets){
  1252 </xsl:text>
  1272 </xsl:text>
  1253     <xsl:text>    for(let widget of chain(new_desc.absolute_widgets,new_desc.relative_widgets)){
  1273     <xsl:text>            /* remove subsribers */
       
  1274 </xsl:text>
       
  1275     <xsl:text>            for(let index of widget.indexes){
       
  1276 </xsl:text>
       
  1277     <xsl:text>                let idx = widget.offset ? index + widget.offset : index;
       
  1278 </xsl:text>
       
  1279     <xsl:text>                subscribers[idx].delete(widget);
       
  1280 </xsl:text>
       
  1281     <xsl:text>            }
       
  1282 </xsl:text>
       
  1283     <xsl:text>            /* lose the offset */
       
  1284 </xsl:text>
       
  1285     <xsl:text>            delete widget.offset;
       
  1286 </xsl:text>
       
  1287     <xsl:text>        }
       
  1288 </xsl:text>
       
  1289     <xsl:text>    }
       
  1290 </xsl:text>
       
  1291     <xsl:text>    for(let widget of new_desc.absolute_widgets){
  1254 </xsl:text>
  1292 </xsl:text>
  1255     <xsl:text>        /* add widget's subsribers */
  1293     <xsl:text>        /* add widget's subsribers */
  1256 </xsl:text>
  1294 </xsl:text>
  1257     <xsl:text>        for(let index of widget.indexes){
  1295     <xsl:text>        for(let index of widget.indexes){
  1258 </xsl:text>
  1296 </xsl:text>
  1259     <xsl:text>            subscribers[index].add(widget);
  1297     <xsl:text>            subscribers[index].add(widget);
       
  1298 </xsl:text>
       
  1299     <xsl:text>        }
       
  1300 </xsl:text>
       
  1301     <xsl:text>    }
       
  1302 </xsl:text>
       
  1303     <xsl:text>    var new_offset = page_index == undefined ? 0 : page_index - new_desc.page_index;
       
  1304 </xsl:text>
       
  1305     <xsl:text>    for(let widget of new_desc.relative_widgets){
       
  1306 </xsl:text>
       
  1307     <xsl:text>        /* set the offset because relative */
       
  1308 </xsl:text>
       
  1309     <xsl:text>        widget.offset = new_offset;
       
  1310 </xsl:text>
       
  1311     <xsl:text>        /* add widget's subsribers */
       
  1312 </xsl:text>
       
  1313     <xsl:text>        for(let index of widget.indexes){
       
  1314 </xsl:text>
       
  1315     <xsl:text>            subscribers[index + new_offset].add(widget);
  1260 </xsl:text>
  1316 </xsl:text>
  1261     <xsl:text>        }
  1317     <xsl:text>        }
  1262 </xsl:text>
  1318 </xsl:text>
  1263     <xsl:text>    }
  1319     <xsl:text>    }
  1264 </xsl:text>
  1320 </xsl:text>