SVGHMI: still quite naive path substitution whn prepearing widget for DnD, but now uses label generation.
Multiple widget DnD and mutiple variable still make no sense because all path are replaced with same path, but atleast min/max value are preserved...
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"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
/* 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 "svg", "/svg:svg";
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:GiveDetails($testmsg)";
apply "/", mode="inline_svg";
}
}