39 |
39 |
40 |
40 |
41 const "hmi_textstylelists_descs", "$parsed_widgets/widget[@type = 'TextStyleList']"; |
41 const "hmi_textstylelists_descs", "$parsed_widgets/widget[@type = 'TextStyleList']"; |
42 const "hmi_textstylelists", "$hmi_elements[@id = $hmi_textstylelists_descs/@id]"; |
42 const "hmi_textstylelists", "$hmi_elements[@id = $hmi_textstylelists_descs/@id]"; |
43 |
43 |
|
44 const "textstylelist_related" foreach "$hmi_textstylelists" list { |
|
45 attrib "listid" value "@id"; |
|
46 foreach "func:refered_elements(.)" elt { |
|
47 attrib "eltid" value "@id"; |
|
48 } |
|
49 } |
|
50 const "textstylelist_related_ns", "exsl:node-set($textstylelist_related)"; |
|
51 |
|
52 def "func:json_expressions" { |
|
53 param "expressions"; |
|
54 param "label"; |
|
55 |
|
56 // compute javascript expressions to access JSON data |
|
57 // desscribed in given svg element's "label" |
|
58 // knowing that parent element already has given "expressions". |
|
59 |
|
60 choose { |
|
61 when "$label" { |
|
62 const "suffixes", "str:split($label)"; |
|
63 const "res" foreach "$suffixes" expression { |
|
64 const "suffix","."; |
|
65 const "pos","position()"; |
|
66 // take last available expression (i.e can have more suffixes than expressions) |
|
67 const "expr","$expressions[position() <= $pos][last()]/expression"; |
|
68 choose { |
|
69 when "contains($suffix,'=')" { |
|
70 const "name", "substring-before($suffix,'=')"; |
|
71 if "$expr/@name[. != $name]" |
|
72 error > JsonTable : missplaced '=' or inconsistent names in Json data expressions. |
|
73 attrib "name" value "$name"; |
|
74 attrib "content" > «$expr/@content»«substring-after($suffix,'=')» |
|
75 } |
|
76 otherwise { |
|
77 copy "$expr/@name"; |
|
78 attrib "content" > «$expr/@content»«$suffix» |
|
79 } |
|
80 } |
|
81 } |
|
82 result "exsl:node-set($res)"; |
|
83 } |
|
84 // Empty labels are ignored, expressions are then passed as-is. |
|
85 otherwise result "$expressions"; |
|
86 } |
|
87 |
|
88 } |
|
89 |
|
90 const "initexpr" expression attrib "content" > jdata |
|
91 const "initexpr_ns", "exsl:node-set($initexpr)"; |
|
92 |
44 template "svg:use", mode="json_table_elt_render" { |
93 template "svg:use", mode="json_table_elt_render" { |
45 param "value_expr"; |
94 param "expressions"; |
46 // cloned element must be part of a HMI:List |
95 // cloned element must be part of a HMI:List |
47 const "targetid", "substring-after(@xlink:href,'#')"; |
96 const "targetid", "substring-after(@xlink:href,'#')"; |
48 const "from_list", "$hmi_lists[(@id | */@id) = $targetid]"; |
97 const "from_list", "$hmi_lists[(@id | */@id) = $targetid]"; |
49 const "from_textstylelist", "$hmi_textstylelists[(@id | */@id) = $targetid]"; |
|
50 |
98 |
51 choose { |
99 choose { |
52 when "count($from_list) > 0" { |
100 when "count($from_list) > 0" { |
53 | id("«@id»").setAttribute("xlink:href", |
101 | id("«@id»").setAttribute("xlink:href", |
54 // obtain new target id from HMI:List widget |
102 // obtain new target id from HMI:List widget |
55 | "#"+hmi_widgets["«$from_list/@id»"].items[«$value_expr»]); |
103 | "#"+hmi_widgets["«$from_list/@id»"].items[«$expressions/expression[1]/@content»]); |
56 } |
|
57 when "count($from_textstylelist) > 0" { |
|
58 | console.log("from_textsylelist","«@id»", "«$value_expr»", «$value_expr», |
|
59 // obtain new style from HMI:TextStyleList widget |
|
60 | hmi_widgets["«$from_textstylelist/@id»"].items[«$value_expr»]); |
|
61 } |
104 } |
62 otherwise |
105 otherwise |
63 warning > Clones (svg:use) in JsonTable Widget must point to a valid HMI:List or HMI:TextStyleList widget or item. Reference "«@xlink:href»" is not valid and will not be updated. |
106 warning > Clones (svg:use) in JsonTable Widget must point to a valid HMI:List widget or item. Reference "«@xlink:href»" is not valid and will not be updated. |
64 } |
107 } |
65 } |
108 } |
66 |
109 |
67 template "svg:text", mode="json_table_elt_render" { |
110 template "svg:text", mode="json_table_elt_render" { |
68 param "value_expr"; |
111 param "expressions"; |
69 | id("«@id»").textContent = String(«$value_expr»); |
112 const "value_expr", "$expressions/expression[1]/@content"; |
|
113 const "original", "@original"; |
|
114 const "from_textstylelist", "$textstylelist_related_ns/list[elt/@eltid = $original]"; |
|
115 choose { |
|
116 |
|
117 when "count($from_textstylelist) > 0" { |
|
118 const "content_expr", "$expressions/expression[2]/@content"; |
|
119 if "string-length($content_expr) = 0 or $expressions/expression[2]/@name != 'textContent'" |
|
120 error > Clones (svg:use) in JsonTable Widget pointing to a HMI:TextStyleList widget or item must have a "textContent=.someVal" assignement following value expression in label. |
|
121 | { |
|
122 | let elt = id("«@id»"); |
|
123 | elt.textContent = String(«$content_expr»); |
|
124 | elt.style = hmi_widgets["«$from_textstylelist/@listid»"].styles[«$value_expr»]; |
|
125 | } |
|
126 } |
|
127 otherwise { |
|
128 | id("«@id»").textContent = String(«$value_expr»); |
|
129 } |
|
130 } |
|
131 } |
|
132 |
|
133 |
|
134 // only labels comming from Json widget are counted in |
|
135 def "func:filter_non_widget_label" { |
|
136 param "elt"; |
|
137 param "widget_elts"; |
|
138 const "eltid" choose { |
|
139 when "$elt/@original" value "$elt/@original"; |
|
140 otherwise value "$elt/@id"; |
|
141 } |
|
142 result "$widget_elts[@id=$eltid]/@inkscape:label"; |
70 } |
143 } |
71 |
144 |
72 template "svg:*", mode="json_table_render" { |
145 template "svg:*", mode="json_table_render" { |
73 param "objname"; |
146 param "expressions"; |
74 apply ".", mode="json_table_elt_render" with "value_expr" > «$objname»«substring-before(@inkscape:label, ' ')» |
147 param "widget_elts"; |
|
148 const "label", "func:filter_non_widget_label(., $widget_elts)"; |
|
149 apply ".", mode="json_table_elt_render" { |
|
150 with "expressions", "func:json_expressions($expressions, $label)"; |
|
151 } |
75 } |
152 } |
76 |
153 |
77 template "svg:g", mode="json_table_render" { |
154 template "svg:g", mode="json_table_render" { |
78 param "objname"; |
155 param "expressions"; |
79 | let obj_«@id» = «$objname»«substring-before(@inkscape:label, ' ')»; |
156 param "widget_elts"; |
80 apply "*[@inkscape:label]", mode="json_table_render" |
157 /* TODO : use intermediate variables for optimization |
81 with "objname" > obj_«@id» |
158 foreach "$new_expressions" |
|
159 | let obj_«@id»_«position()» = «.»; |
|
160 */ |
|
161 const "label", "func:filter_non_widget_label(., $widget_elts)"; |
|
162 apply "*", mode="json_table_render" { |
|
163 with "expressions", "func:json_expressions($expressions, $label)"; |
|
164 with "widget_elts", "$widget_elts"; |
|
165 } |
82 } |
166 } |
83 |
167 |
84 template "widget[@type='JsonTable']", mode="widget_defs" { |
168 template "widget[@type='JsonTable']", mode="widget_defs" { |
85 param "hmi_element"; |
169 param "hmi_element"; |
86 labels("data"); |
170 labels("data"); |
87 optional_labels("forward backward cursor"); |
171 optional_labels("forward backward cursor"); |
88 const "data_elt", "$result_svg_ns//*[@id = $hmi_element/@id]/*[@inkscape:label = 'data']"; |
172 const "data_elt", "$result_svg_ns//*[@id = $hmi_element/@id]/*[@inkscape:label = 'data']"; |
89 | spread_json_data: function(jdata) { |
173 | spread_json_data: function(jdata) { |
90 apply "$data_elt/*", mode="json_table_render" with "objname","'jdata'"; |
174 apply "$data_elt/*", mode="json_table_render" { |
|
175 with "expressions","$initexpr_ns"; |
|
176 with "widget_elts","$hmi_element/*[@inkscape:label = 'data']/descendant::svg:*"; |
|
177 } |
91 | } |
178 | } |
92 } |
179 } |