svghmi/gen_dnd_widget_svg.ysl2
author Edouard Tisserant
Mon, 24 May 2021 14:33:54 +0200
branchsvghmi
changeset 3246 0e8dbc2c390e
parent 3234 f2bfb047d0e6
child 3261 06ea7a1152af
permissions -rw-r--r--
Finished fixing Wx IDs abuse. There was still some wasted IDs because of wx.NewId calls in many places where it wasn't needed, and those IDs were not re-used. As a consequence Beremiz was making exception crashing after a few hours of intensive use.
include yslt_noindent.yml2

in xsl decl svgtmpl(match, xmlns="http://www.w3.org/2000/svg") alias template;

istylesheet
            /* From Inkscape */
            xmlns:dc="http://purl.org/dc/elements/1.1/"
            xmlns:cc="http://creativecommons.org/ns#"
            xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
            xmlns:svg="http://www.w3.org/2000/svg"
            xmlns:xlink="http://www.w3.org/1999/xlink"
            xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
            xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"

            /* Namespace to invoke python code */
            xmlns:ns="beremiz"

            extension-element-prefixes="ns func exsl regexp str dyn"
            exclude-result-prefixes="ns func exsl regexp str dyn" {

    param "hmi_path";
    const "hmi_elements", "//svg:*[starts-with(@inkscape:label, 'HMI:')]";
    const "subhmitree", "ns:GetSubHMITree()";

    const "indexed_hmitree", "/.."; // compatibility with parse_labels.ysl2
    include parse_labels.ysl2
    const "_parsed_widgets" apply "$hmi_elements", mode="parselabel";
    const "parsed_widgets","exsl:node-set($_parsed_widgets)";

    const "selected_node_type","local-name($subhmitree)";
    const "svg_widget", "$parsed_widgets/widget[1]"; // TODO take all widgets
    const "svg_widget_type", "$svg_widget/@type";
    const "svg_widget_path", "$svg_widget/@path";
    const "svg_widget_count", "count($parsed_widgets/widget)";

    // Templates to change label paths(s)
    template "@* | node()", mode="replace_path" {
        xsl:copy apply "@* | node()", mode="replace_path";
    }

    template "path/@value", mode="replace_path" {
        attrib "value" > «$hmi_path»
    }

    // all attribs are usually copied
    svgtmpl "@*", mode="inline_svg" xsl:copy;

    // except labels, ignored
    svgtmpl "@inkscape:label[starts-with(., 'HMI:')]", mode="inline_svg";

    template "node()", mode="inline_svg" xsl:copy {

      // in case this node widget's main element inject label
      if "@id = $svg_widget/@id" {
          const "substituted_widget" apply "$svg_widget", mode="replace_path";
          const "substituted_widget_ns", "exsl:node-set($substituted_widget)";
          const "new_label" apply "$substituted_widget_ns", mode="genlabel";
          attrib "inkscape:label" > «$new_label»
      }
      // all nodes are copied as well
      apply "@* | node()", mode="inline_svg";
    }

    const "NODES_TYPES","str:split('HMI_ROOT HMI_NODE')";
    const "HMI_NODES_COMPAT","str:split('Page Jump Foreach')";
    template "/" {
        comment > Widget dropped in Inkscape from Beremiz

        choose {
            when "$svg_widget_count < 1"
                error > No widget detected on selected SVG
            when "$svg_widget_count > 1"
                error > Multiple widget DnD not yet supported
            when """$selected_node_type = $NODES_TYPES and \
                    not($svg_widget_type = $HMI_NODES_COMPAT)"""
                error > Widget incompatible with selected HMI tree node
        }

        const "testmsg" {
            msg value "$hmi_path";
            msg value "$selected_node_type";
            msg value "$svg_widget_type";
        }

        value "ns:PassMessage($testmsg)";

        apply "/", mode="inline_svg";
    }
}