in xsl decl labels(*ptr, name="defs_by_labels") alias call-template {
with "hmi_element", "$hmi_element";
with "labels"{text *ptr};
decl optional_labels(*ptr) alias - {
/* TODO add some per label xslt variable to check if exist */
decl activable_labels(*ptr) alias - {
with "subelements","'active inactive'";
template "svg:*", mode="hmi_elements" {
const "widget", "func:widget(@id)";
| type: "«$widget/@type»",
| "«@value»"`if "position()!=last()" > ,`
warning > Widget «$widget/@type» id="«$eltid»" : No match for path "«@value»" in HMI tree
| «@index» /* «@value» */ `if "position()!=last()" > ,`
apply "$widget", mode="widget_defs" with "hmi_element",".";
apply "$widget", mode="widget_subscribe" with "hmi_element",".";
| }`if "position()!=last()" > ,`
def "func:unique_types" {
when "count($elts_with_type) > 1" {
const "prior_results","func:unique_types($elts_with_type[position()!=last()])";
when "$elts_with_type[last()][@type = $prior_results/@type]"{
result "$prior_results | $elts_with_type[last()]";
result "$elts_with_type";
emit "preamble:hmi-classes" {
const "used_widget_types", "func:unique_types($parsed_widgets/widget)";
apply "$used_widget_types", mode="widget_class";
emit "preamble:hmi-elements" {
apply "$hmi_elements", mode="hmi_elements";
// default : normal subscribing
template "widget", mode="widget_subscribe" {
| apply_cache: widget_apply_cache,
// page aren't subscribers
template "widget[@type='Page']", mode="widget_subscribe";
function "defs_by_labels" {
param "mandatory","'yes'";
param "subelements","/..";
const "widget_type","@type";
foreach "str:split($labels)" {
const "elt","$result_svg_ns//*[@id = $hmi_element/@id]//*[@inkscape:label=$name][1]";
error > «$widget_type» widget must have a «$name» element
// otherwise produce nothing
| «$name»_elt: id("«$elt/@id»"),
foreach "str:split($subelements)" {
const "subelt","$elt/*[@inkscape:label=$subname][1]";
when "not($subelt/@id)" {
error > «$widget_type» widget must have a «$name»/«$subname» element
| /* missing «$name»/«$subname» element */
| "«$subname»": id("«$subelt/@id»")`if "position()!=last()" > ,`
def "func:escape_quotes" {
// have to use a python string to enter escaped quote
const "frst", !"substring-before($txt,'\"')"!;
const "frstln", "string-length($frst)";
when "$frstln > 0 and string-length($txt) > $frstln" {
result !"concat($frst,'\\\"',func:escape_quotes(substring-after($txt,'\"')))"!;