svghmi/parse_labels.ysl2
branchsvghmi
changeset 3221 3d307ad803ea
parent 3205 62753288be74
child 3229 c5be4fd425e7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svghmi/parse_labels.ysl2	Fri Apr 02 21:16:18 2021 +0200
@@ -0,0 +1,80 @@
+// 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»
+                    }
+                }
+                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»
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+