124 <xsl:template mode="inline_svg" match="sodipodi:namedview[@units!='px' or @inkscape:document-units!='px']"> |
124 <xsl:template mode="inline_svg" match="sodipodi:namedview[@units!='px' or @inkscape:document-units!='px']"> |
125 <xsl:message terminate="yes"> |
125 <xsl:message terminate="yes"> |
126 <xsl:text>All units must be set to "px" in Inkscape's document properties</xsl:text> |
126 <xsl:text>All units must be set to "px" in Inkscape's document properties</xsl:text> |
127 </xsl:message> |
127 </xsl:message> |
128 </xsl:template> |
128 </xsl:template> |
129 <xsl:template xmlns="http://www.w3.org/2000/svg" mode="inline_svg" match="svg:use"> |
|
130 <g> |
|
131 <xsl:attribute name="style"> |
|
132 <xsl:value-of select="@style"/> |
|
133 </xsl:attribute> |
|
134 <xsl:attribute name="transform"> |
|
135 <xsl:value-of select="@transform"/> |
|
136 </xsl:attribute> |
|
137 <xsl:attribute name="id"> |
|
138 <xsl:value-of select="@id"/> |
|
139 </xsl:attribute> |
|
140 <xsl:variable name="targetid" select="substring-after(@xlink:href,'#')"/> |
|
141 <xsl:apply-templates mode="unlink_clone" select="//svg:*[@id = $targetid]"/> |
|
142 </g> |
|
143 </xsl:template> |
|
144 <xsl:template xmlns="http://www.w3.org/2000/svg" mode="unlink_clone" match="@*"> |
|
145 <xsl:copy/> |
|
146 </xsl:template> |
|
147 <xsl:template xmlns="http://www.w3.org/2000/svg" mode="unlink_clone" match="svg:*"> |
|
148 <xsl:choose> |
|
149 <xsl:when test="@id = $hmi_elements/@id"> |
|
150 <use> |
|
151 <xsl:attribute name="xlink:href"> |
|
152 <xsl:value-of select="concat('#',@id)"/> |
|
153 </xsl:attribute> |
|
154 </use> |
|
155 </xsl:when> |
|
156 <xsl:otherwise> |
|
157 <xsl:copy> |
|
158 <xsl:apply-templates mode="unlink_clone" select="@* | node()"/> |
|
159 </xsl:copy> |
|
160 </xsl:otherwise> |
|
161 </xsl:choose> |
|
162 </xsl:template> |
|
163 <xsl:template match="/"> |
129 <xsl:template match="/"> |
164 <xsl:comment> |
130 <xsl:comment> |
165 <xsl:text>Made with SVGHMI. https://beremiz.org</xsl:text> |
131 <xsl:text>Made with SVGHMI. https://beremiz.org</xsl:text> |
166 </xsl:comment> |
132 </xsl:comment> |
167 <xsl:comment> |
133 <xsl:comment> |
236 </func:function> |
202 </func:function> |
237 <func:function name="func:refered_elements"> |
203 <func:function name="func:refered_elements"> |
238 <xsl:param name="elems"/> |
204 <xsl:param name="elems"/> |
239 <xsl:variable name="descend" select="$elems/descendant-or-self::svg:*"/> |
205 <xsl:variable name="descend" select="$elems/descendant-or-self::svg:*"/> |
240 <xsl:variable name="clones" select="$descend[self::svg:use]"/> |
206 <xsl:variable name="clones" select="$descend[self::svg:use]"/> |
241 <xsl:variable name="reals" select="$descend[not(self::svg:use)]"/> |
|
242 <xsl:variable name="originals" select="//svg:*[concat('#',@id) = $clones/@xlink:href]"/> |
207 <xsl:variable name="originals" select="//svg:*[concat('#',@id) = $clones/@xlink:href]"/> |
243 <xsl:choose> |
208 <xsl:choose> |
244 <xsl:when test="$originals"> |
209 <xsl:when test="$originals"> |
245 <func:result select="$reals | func:refered_elements($originals)"/> |
210 <func:result select="$descend | func:refered_elements($originals)"/> |
246 </xsl:when> |
211 </xsl:when> |
247 <xsl:otherwise> |
212 <xsl:otherwise> |
248 <func:result select="$reals"/> |
213 <func:result select="$descend"/> |
249 </xsl:otherwise> |
214 </xsl:otherwise> |
250 </xsl:choose> |
215 </xsl:choose> |
|
216 </func:function> |
|
217 <func:function name="func:included_geometry"> |
|
218 <xsl:param name="elt"/> |
|
219 <xsl:variable name="g" select="$geometry[@Id = $elt/@id]"/> |
|
220 <func:result select="$geometry[@Id != $elt/@id and @x >= $g/@x and @y >= $g/@y and @x+@w <= $g/@x+$g/@w and @y+@h <= $g/@y+$g/@h]"/> |
|
221 </func:function> |
|
222 <func:function name="func:sumarized_elements"> |
|
223 <xsl:param name="elements"/> |
|
224 <xsl:variable name="short_list" select="$elements[not(ancestor::*/@id = $elements/@id)]"/> |
|
225 <xsl:variable name="filled_groups" select="$short_list/parent::svg:*[not(descendant::*[not(self::svg:g)][not(@id = $short_list/descendant-or-self::*[not(self::svg:g)]/@id)])]"/> |
|
226 <xsl:variable name="groups_to_add" select="$filled_groups[not(ancestor::*/@id = $filled_groups/@id)]"/> |
|
227 <func:result select="$groups_to_add | $short_list[not(ancestor::svg:g/@id = $filled_groups/@id)]"/> |
|
228 </func:function> |
|
229 <func:function name="func:all_related_elements"> |
|
230 <xsl:param name="page"/> |
|
231 <xsl:variable name="page_included_geometry" select="func:included_geometry($page)"/> |
|
232 <xsl:variable name="page_sub_elements" select="func:refered_elements($page)"/> |
|
233 <xsl:variable name="page_included_elements" select="//svg:*[@id = $page_included_geometry/@Id]"/> |
|
234 <func:result select="$page_sub_elements | $page_included_elements"/> |
251 </func:function> |
235 </func:function> |
252 <xsl:template name="scripts"> |
236 <xsl:template name="scripts"> |
253 <xsl:text>//(function(){ |
237 <xsl:text>//(function(){ |
254 </xsl:text> |
238 </xsl:text> |
255 <xsl:text> |
239 <xsl:text> |
357 <xsl:text>var page_desc = { |
341 <xsl:text>var page_desc = { |
358 </xsl:text> |
342 </xsl:text> |
359 <xsl:for-each select="$hmi_pages"> |
343 <xsl:for-each select="$hmi_pages"> |
360 <xsl:variable name="desc" select="func:parselabel(@inkscape:label)/widget"/> |
344 <xsl:variable name="desc" select="func:parselabel(@inkscape:label)/widget"/> |
361 <xsl:variable name="page" select="."/> |
345 <xsl:variable name="page" select="."/> |
362 <xsl:variable name="p" select="$hmi_geometry[@Id = $page/@id]"/> |
346 <xsl:variable name="p" select="$geometry[@Id = $page/@id]"/> |
363 <xsl:variable name="page_ids" select="$hmi_geometry[@Id != $page/@id and @x >= $p/@x and @y >= $p/@y and @x+@w <= $p/@x+$p/@w and @y+@h <= $p/@y+$p/@h]/@Id"/> |
347 <xsl:variable name="page_all_elements" select="func:all_related_elements($page)"/> |
364 <xsl:variable name="page_sub_ids" select="func:refered_elements($page)[@id = $hmi_elements/@id]/@id"/> |
348 <xsl:variable name="all_page_ids" select="$page_all_elements[@id = $hmi_elements/@id and @id != $page/@id]/@id"/> |
365 <xsl:variable name="all_page_ids" select="$page_ids | $page_sub_ids[not(. = $page_ids)]"/> |
349 <xsl:variable name="shorter_list" select="func:sumarized_elements($page_all_elements)"/> |
366 <xsl:text> "</xsl:text> |
350 <xsl:text> "</xsl:text> |
367 <xsl:value-of select="$desc/arg[1]/@value"/> |
351 <xsl:value-of select="$desc/arg[1]/@value"/> |
368 <xsl:text>": { |
352 <xsl:text>": { |
369 </xsl:text> |
353 </xsl:text> |
370 <xsl:text> widget: hmi_widgets["</xsl:text> |
354 <xsl:text> widget: hmi_widgets["</xsl:text> |
850 </xsl:text> |
844 </xsl:text> |
851 <xsl:text>var current_page; |
845 <xsl:text>var current_page; |
852 </xsl:text> |
846 </xsl:text> |
853 <xsl:text> |
847 <xsl:text> |
854 </xsl:text> |
848 </xsl:text> |
|
849 <xsl:text>function prepare_svg() { |
|
850 </xsl:text> |
|
851 <xsl:text> /* set everybody hidden initially for better performance */ |
|
852 </xsl:text> |
|
853 <xsl:text> for(let widget in hmi_widgets){ |
|
854 </xsl:text> |
|
855 <xsl:text> if(widget.element != undefined) |
|
856 </xsl:text> |
|
857 <xsl:text> widget.element.style.display = "none"; |
|
858 </xsl:text> |
|
859 <xsl:text> } |
|
860 </xsl:text> |
|
861 <xsl:text> /*for(let name in page_desc){ |
|
862 </xsl:text> |
|
863 <xsl:text> if(name != new_desc){ |
|
864 </xsl:text> |
|
865 <xsl:text> page_desc[name].widget.element.style.display = "none"; |
|
866 </xsl:text> |
|
867 <xsl:text> } |
|
868 </xsl:text> |
|
869 <xsl:text> }*/ |
|
870 </xsl:text> |
|
871 <xsl:text>}; |
|
872 </xsl:text> |
|
873 <xsl:text> |
|
874 </xsl:text> |
855 <xsl:text>function switch_page(page_name) { |
875 <xsl:text>function switch_page(page_name) { |
856 </xsl:text> |
876 </xsl:text> |
857 <xsl:text> let old_desc = page_desc[current_page]; |
877 <xsl:text> let old_desc = page_desc[current_page]; |
858 </xsl:text> |
878 </xsl:text> |
859 <xsl:text> let new_desc = page_desc[page_name]; |
879 <xsl:text> let new_desc = page_desc[page_name]; |
860 </xsl:text> |
880 </xsl:text> |
861 <xsl:text> |
881 <xsl:text> |
862 </xsl:text> |
882 </xsl:text> |
863 <xsl:text> if(new_desc == undefined){ |
883 <xsl:text> if(new_desc == undefined){ |
864 </xsl:text> |
884 </xsl:text> |
|
885 <xsl:text> /* TODO LOG ERROR */ |
|
886 </xsl:text> |
865 <xsl:text> return; |
887 <xsl:text> return; |
866 </xsl:text> |
888 </xsl:text> |
867 <xsl:text> } |
889 <xsl:text> } |
868 </xsl:text> |
890 </xsl:text> |
869 <xsl:text> |
891 <xsl:text> |
870 </xsl:text> |
892 </xsl:text> |
871 <xsl:text> /* remove subsribers of previous page if any */ |
|
872 </xsl:text> |
|
873 <xsl:text> if(old_desc){ |
893 <xsl:text> if(old_desc){ |
874 </xsl:text> |
894 </xsl:text> |
875 <xsl:text> for(let widget of old_desc.widgets){ |
895 <xsl:text> for(let widget of old_desc.widgets){ |
876 </xsl:text> |
896 </xsl:text> |
|
897 <xsl:text> |
|
898 </xsl:text> |
|
899 <xsl:text> /* hide widget */ |
|
900 </xsl:text> |
|
901 <xsl:text> if(widget.element != undefined) |
|
902 </xsl:text> |
|
903 <xsl:text> widget.element.style.display = "none"; |
|
904 </xsl:text> |
|
905 <xsl:text> |
|
906 </xsl:text> |
|
907 <xsl:text> /* remove subsribers */ |
|
908 </xsl:text> |
877 <xsl:text> for(let index of widget.indexes){ |
909 <xsl:text> for(let index of widget.indexes){ |
878 </xsl:text> |
910 </xsl:text> |
879 <xsl:text> subscribers[index].delete(widget); |
911 <xsl:text> subscribers[index].delete(widget); |
880 </xsl:text> |
912 </xsl:text> |
881 <xsl:text> } |
913 <xsl:text> } |
882 </xsl:text> |
914 </xsl:text> |
883 <xsl:text> } |
915 <xsl:text> } |
884 </xsl:text> |
916 </xsl:text> |
885 <xsl:text> old_desc.widget.element.style.display = "none"; |
917 <xsl:text> old_desc.widget.element.style.display = "none"; |
886 </xsl:text> |
918 </xsl:text> |
887 <xsl:text> } else { |
919 <xsl:text> } |
888 </xsl:text> |
920 </xsl:text> |
889 <xsl:text> /* initial page switch : set everybody hidden */ |
921 <xsl:text> |
890 </xsl:text> |
922 </xsl:text> |
891 <xsl:text> for(let name in page_desc){ |
923 <xsl:text> for(let widget of new_desc.widgets){ |
892 </xsl:text> |
924 </xsl:text> |
893 <xsl:text> if(name != new_desc){ |
925 <xsl:text> |
894 </xsl:text> |
926 </xsl:text> |
895 <xsl:text> page_desc[name].widget.element.style.display = "none"; |
927 <xsl:text> /* unhide widget */ |
896 </xsl:text> |
928 </xsl:text> |
897 <xsl:text> } |
929 <xsl:text> if(widget.element != undefined) |
|
930 </xsl:text> |
|
931 <xsl:text> widget.element.style.display = "inline"; |
|
932 </xsl:text> |
|
933 <xsl:text> |
|
934 </xsl:text> |
|
935 <xsl:text> /* add widget's subsribers */ |
|
936 </xsl:text> |
|
937 <xsl:text> for(let index of widget.indexes){ |
|
938 </xsl:text> |
|
939 <xsl:text> subscribers[index].add(widget); |
|
940 </xsl:text> |
|
941 <xsl:text> /* dispatch current cache in newly opened page widgets */ |
|
942 </xsl:text> |
|
943 <xsl:text> let cached_val = cache[index]; |
|
944 </xsl:text> |
|
945 <xsl:text> if(cached_val != undefined) |
|
946 </xsl:text> |
|
947 <xsl:text> dispatch_value_to_widget(widget, index, cached_val, cached_val); |
898 </xsl:text> |
948 </xsl:text> |
899 <xsl:text> } |
949 <xsl:text> } |
900 </xsl:text> |
950 </xsl:text> |
901 <xsl:text> } |
951 <xsl:text> } |
902 </xsl:text> |
952 </xsl:text> |
903 <xsl:text> |
953 <xsl:text> |
904 </xsl:text> |
954 </xsl:text> |
905 <xsl:text> /* add new subsribers if any */ |
|
906 </xsl:text> |
|
907 <xsl:text> for(let widget of new_desc.widgets){ |
|
908 </xsl:text> |
|
909 <xsl:text> for(let index of widget.indexes){ |
|
910 </xsl:text> |
|
911 <xsl:text> subscribers[index].add(widget); |
|
912 </xsl:text> |
|
913 <xsl:text> /* dispatch current cache in newly opened page widgets */ |
|
914 </xsl:text> |
|
915 <xsl:text> let cached_val = cache[index]; |
|
916 </xsl:text> |
|
917 <xsl:text> if(cached_val != undefined) |
|
918 </xsl:text> |
|
919 <xsl:text> dispatch_value_to_widget(widget, index, cached_val, cached_val); |
|
920 </xsl:text> |
|
921 <xsl:text> } |
|
922 </xsl:text> |
|
923 <xsl:text> } |
|
924 </xsl:text> |
|
925 <xsl:text> |
|
926 </xsl:text> |
|
927 <xsl:text> new_desc.widget.element.style.display = "inline"; |
955 <xsl:text> new_desc.widget.element.style.display = "inline"; |
928 </xsl:text> |
956 </xsl:text> |
929 <xsl:text> |
957 <xsl:text> |
930 </xsl:text> |
958 </xsl:text> |
931 <xsl:text> svg_root.setAttribute('viewBox',new_desc.bbox.join(" ")); |
959 <xsl:text> svg_root.setAttribute('viewBox',new_desc.bbox.join(" ")); |