svghmi/gen_dnd_widget_svg.ysl2
author Edouard Tisserant <edouard.tisserant@gmail.com>
Tue, 15 Nov 2022 20:43:39 +0100
branchwxPython4
changeset 3677 6d9040e07c32
parent 3263 1205b2d0acf2
permissions -rw-r--r--
OPC-UA: only support the encryption policy selected in config.

By default open62541 client accepts all supported policies, but in makes problem
when negociating with some servers while most clients seems to only support
one policy at a time.
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";
    }
}