svghmi/gen_dnd_widget_svg.ysl2
author Edouard Tisserant
Mon, 14 Jun 2021 16:48:39 +0200
branchsvghmi
changeset 3257 095c73591b7e
parent 3234 f2bfb047d0e6
child 3261 06ea7a1152af
permissions -rw-r--r--
IDE: Cleaned up some useless tests in variable trace data handling code, changed from bare numpy arrays to RingBuffers inorder to avoid RAM outage and crash after long tracing session.
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";
    }
}