svghmi/gen_dnd_widget_svg.ysl2
author Edouard Tisserant <edouard.tisserant@gmail.com>
Tue, 22 Mar 2022 14:50:46 +0100
branchwxPython4
changeset 3442 29dbdb09da2e
parent 3263 1205b2d0acf2
permissions -rw-r--r--
Tests: fix project edit test sikuli IDE test.

Background click based on bitmap matching doesn't work.
Grid dots are not good match candidates.
Rendering probably affected by virtual display's bpp or rasterizer approximations.
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" {

    const "hmi_elements", "//svg:*[starts-with(@inkscape:label, 'HMI:')]";
    const "widgetparams", "ns:GetWidgetParams()";

    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 "svg_widget", "$parsed_widgets/widget[1]";
    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_params" {
        xsl:copy apply "@* | node()", mode="replace_params";
    }

    template "arg", mode="replace_params";
    template "path", mode="replace_params";
    template "widget", mode="replace_params" {
        xsl:copy {
            apply "@* | node()", mode="replace_params";
            copy "$widgetparams/*";
        };
    }

    // 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_params";
          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";
    }

    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
        }

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