svghmi/parse_labels.ysl2
author Edouard Tisserant <edouard.tisserant@gmail.com>
Tue, 13 Apr 2021 21:04:46 +0200
branchsvghmi
changeset 3229 c5be4fd425e7
parent 3221 3d307ad803ea
child 3230 95f07764991f
permissions -rw-r--r--
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...
// parse_labels.ysl2


//  Parses:
//  "HMI:WidgetType:param1:param2@path1,path1min,path1max@path2"
//
//  Into:
//  widget type="WidgetType" id="blah456" {
//      arg value="param1";
//      arg value="param2";
//      path value=".path1" index=".path1" min="path1min" max="path1max" type="PAGE_LOCAL";
//      path value="/path1" index="348" type="HMI_INT";
//      path value="path4" index="path4" type="HMI_LOCAL";
//  }
//
template "*", mode="parselabel" {
    const "label","@inkscape:label";
    const "id","@id";
    const "description", "substring-after($label,'HMI:')";

    const "_args", "substring-before($description,'@')";
    const "args" choose {
        when "$_args" value "$_args";
        otherwise value "$description";
    }

    const "_type", "substring-before($args,':')";
    const "type" choose {
        when "$_type" value "$_type";
        otherwise value "$args";
    }

    if "$type" widget {
        attrib "id" > «$id»
        attrib "type" > «$type»
        foreach "str:split(substring-after($args, ':'), ':')" {
            arg {
                attrib "value" > «.»
            }
        }
        const "paths", "substring-after($description,'@')";
        foreach "str:split($paths, '@')" {
            if "string-length(.) > 0" path {
                const "pathminmax", "str:split(.,',')";
                const "path", "$pathminmax[1]";
                const "pathminmaxcount", "count($pathminmax)";
                attrib "value" > «$path»
                choose {
                    when "$pathminmaxcount = 3" {
                        attrib "min" > «$pathminmax[2]»
                        attrib "max" > «$pathminmax[3]»
                    }
                    when "$pathminmaxcount = 2" {
                        error > Widget id:«$id» label:«$label» has wrong syntax of path section «$pathminmax»
                    }
                }
                if "$indexed_hmitree" choose {
                    when "regexp:test($path,'^\.[a-zA-Z0-9_]+$')" {
                        attrib "type" > PAGE_LOCAL
                    }
                    when "regexp:test($path,'^[a-zA-Z0-9_]+$')" {
                        attrib "type" > HMI_LOCAL
                    }
                    otherwise {
                        const "item", "$indexed_hmitree/*[@hmipath = $path]";
                        const "pathtype", "local-name($item)";
                        if "$pathminmaxcount = 3 and not($pathtype = 'HMI_INT' or $pathtype = 'HMI_REAL')" {
                            error > Widget id:«$id» label:«$label» path section «$pathminmax» use min and max on non mumeric value
                        }
                        if "count($item) = 1" {
                            attrib "index" > «$item/@index»
                            attrib "type" > «$pathtype»
                        }
                    }
                }
            }
        }
    }
}


// Templates to generate label back from parsed tree
template "arg", mode="genlabel" > :«@value»

template "path", mode="genlabel" {
    > @«@value»
    if "string-length(@min)>0 or string-length(@max)>0"  > :«@min»:«@max»
}

template "widget", mode="genlabel" {
    > HMI:«@type»
    apply "arg", mode="genlabel";
    apply "path", mode="genlabel";
}