svghmi/inline_svg.ysl2
author Edouard Tisserant
Wed, 01 Dec 2021 09:54:02 +0100
branchRuntimeLists
changeset 3394 9ea29ac18837
parent 3393 a65bcbb6af20
child 3625 bb1eff4091ab
permissions -rw-r--r--
RUNTIME: Variable trace now uses limited list and buffer instead of flags in instance tree that was requiring systematical instance tree traversal, and worst size buffer. Forcing and retain still use tree traversal.
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
     1
// inline_svg.ysl2
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
     2
//
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
     3
// Produce Inline SVG element of resulting XHTML page.
2779
75c6a31caca6 SVGHMI: Work In Progress : fixed pointer types in ctypes interface, cleaned up server startup and cleanup code, changed document type to XHTML, cleaner JS script : encapsulated in a function and in CDATA.
Edouard Tisserant
parents: 2763
diff changeset
     4
2937
9226a830fbc3 SVGHMI: moving code wher it belongs, and reformulate some declarations for better readability.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2909
diff changeset
     5
// Since stylesheet output namespace is xhtml, templates that output svg have to be explicitely declared as such 
9226a830fbc3 SVGHMI: moving code wher it belongs, and reformulate some declarations for better readability.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2909
diff changeset
     6
in xsl decl svgtmpl(match, xmlns="http://www.w3.org/2000/svg") alias template;
9226a830fbc3 SVGHMI: moving code wher it belongs, and reformulate some declarations for better readability.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2909
diff changeset
     7
in xsl decl svgfunc(name, xmlns="http://www.w3.org/2000/svg") alias template;
9226a830fbc3 SVGHMI: moving code wher it belongs, and reformulate some declarations for better readability.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2909
diff changeset
     8
9226a830fbc3 SVGHMI: moving code wher it belongs, and reformulate some declarations for better readability.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2909
diff changeset
     9
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    10
// Identity template :
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    11
//  - copy every attributes 
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    12
//  - copy every sub-elements
3030
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
    13
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
    14
svgtmpl "@*", mode="inline_svg" xsl:copy;
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
    15
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
    16
template "node()", mode="inline_svg" {
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    17
  // use real xsl:copy instead copy-of alias from yslt.yml2
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    18
  if "not(@id = $discardable_elements/@id)"
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    19
      xsl:copy apply "@* | node()", mode="inline_svg";
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    20
}
2792
0c0d3895b036 SVGHMI: moved/fixed some templates, avoided namespace problems, added parsing of HMI:* inkscape labels
Edouard Tisserant
parents: 2791
diff changeset
    21
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    22
// replaces inkscape's height and width hints. forces fit
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    23
template "svg:svg/@width", mode="inline_svg";
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    24
template "svg:svg/@height", mode="inline_svg";
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    25
svgtmpl "svg:svg", mode="inline_svg" svg {
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    26
    attrib "preserveAspectRatio" > none
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    27
    attrib "height" > 100vh
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    28
    attrib "width" > 100vw
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    29
    apply "@* | node()", mode="inline_svg";
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    30
}
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    31
// ensure that coordinate in CSV file generated by inkscape are in default reference frame
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    32
template "svg:svg[@viewBox!=concat('0 0 ', @width, ' ', @height)]", mode="inline_svg" {
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    33
    error > ViewBox settings other than X=0, Y=0 and Scale=1 are not supported
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    34
}
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    35
// ensure that coordinate in CSV file generated by inkscape match svg default unit
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    36
template "sodipodi:namedview[@units!='px' or @inkscape:document-units!='px']", mode="inline_svg" {
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    37
    error > All units must be set to "px" in Inkscape's document properties
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    38
}
2792
0c0d3895b036 SVGHMI: moved/fixed some templates, avoided namespace problems, added parsing of HMI:* inkscape labels
Edouard Tisserant
parents: 2791
diff changeset
    39
3108
079419e7228d SVGHMI: Intermediate commit while implementing i18n. WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3030
diff changeset
    40
// remove i18n markers, so that defs_by_labels can find text elements
079419e7228d SVGHMI: Intermediate commit while implementing i18n. WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3030
diff changeset
    41
svgtmpl "svg:text/@inkscape:label[starts-with(., '_')]", mode="inline_svg" {
079419e7228d SVGHMI: Intermediate commit while implementing i18n. WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3030
diff changeset
    42
    attrib "{name()}" > «substring(., 2)»
079419e7228d SVGHMI: Intermediate commit while implementing i18n. WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3030
diff changeset
    43
}
079419e7228d SVGHMI: Intermediate commit while implementing i18n. WIP.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3030
diff changeset
    44
2941
ef13a4007538 SVGHMI: spread JS code from svghmi/scripts.ysl2 in other .ysl2 files, using dedicated preamble and epilogue namespaces
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2940
diff changeset
    45
////// Clone unlinking
ef13a4007538 SVGHMI: spread JS code from svghmi/scripts.ysl2 in other .ysl2 files, using dedicated preamble and epilogue namespaces
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2940
diff changeset
    46
//
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    47
// svg:use (inkscape's clones) inside a widgets are
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    48
// replaced by real elements they refer in order to :
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    49
//  - allow finding "needle" element in "meter" widget,
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    50
//    even if "needle" is in a group refered by a svg use.
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    51
//  - if "needle" is visible through a svg:use for
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    52
//    each instance of the widget, then needle would show
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    53
//    the same position in all instances
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    54
//
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    55
// For now, clone unlinkink applies to descendants of all widget except HMI:Page
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    56
// TODO: narrow application of clone unlinking to active elements,
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    57
//       while keeping static decoration cloned
3027
d660b1b6bf4f SVGHMI: Deeper clone unlinking. Was actually not recursive, and clones in clones where not unlinked. Stack successive ids to avoid collisions.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2995
diff changeset
    58
const "targets_not_to_unlink", "$hmi_lists/descendant-or-self::svg:*";
3384
bd337d21f686 SVGHMI: changes that should fix some corner cases about unlinking and discardable element that still didn't show until now.
Edouard Tisserant
parents: 3186
diff changeset
    59
const "to_unlink", "$hmi_widgets/descendant-or-self::svg:use";
3030
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
    60
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
    61
def "func:is_unlinkable" {
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
    62
    param "targetid";
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
    63
    param "eltid";
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
    64
    result "$eltid = $to_unlink/@id and not($targetid = $targets_not_to_unlink/@id)";
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
    65
}
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
    66
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
    67
svgtmpl "svg:use", mode="inline_svg"{
2995
7769e7c7f925 SVGHMI: Minimal support for HMI:List : clones pointing to elements of any HMI:List are never unlinked, widgets using HMI:List will rely on this.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2968
diff changeset
    68
    const "targetid","substring-after(@xlink:href,'#')";
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    69
    choose {
3030
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
    70
        when "func:is_unlinkable($targetid, @id)" {
3027
d660b1b6bf4f SVGHMI: Deeper clone unlinking. Was actually not recursive, and clones in clones where not unlinked. Stack successive ids to avoid collisions.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2995
diff changeset
    71
            call "unlink_clone" {
d660b1b6bf4f SVGHMI: Deeper clone unlinking. Was actually not recursive, and clones in clones where not unlinked. Stack successive ids to avoid collisions.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2995
diff changeset
    72
                with "targetid", "$targetid";
3030
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
    73
            }
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
    74
        }
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
    75
        otherwise xsl:copy apply "@*", mode="inline_svg";
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    76
    }
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    77
}
2877
682bce953795 SVGHMI: detachable_elements.ysl2 becomes detachable_pages.ysl2, and includes logic to process pages elements. Other minor code moves.
Edouard Tisserant
parents: 2876
diff changeset
    78
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    79
// to unlink a clone, an group containing a copy of target element is created
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    80
// that way, style and transforms can be preserved
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    81
const "_excluded_use_attrs" {
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    82
    name > href
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    83
    name > width
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    84
    name > height
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    85
    name > x
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    86
    name > y
3027
d660b1b6bf4f SVGHMI: Deeper clone unlinking. Was actually not recursive, and clones in clones where not unlinked. Stack successive ids to avoid collisions.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2995
diff changeset
    87
    name > id
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    88
}
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    89
const "excluded_use_attrs","exsl:node-set($_excluded_use_attrs)";
2794
c10069a02ed0 SVGHMI: deduce pages content out of geometry (elements contained in page bounding box are in)
Edouard Tisserant
parents: 2793
diff changeset
    90
2968
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
    91
const "_merge_use_attrs" {
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
    92
    name > transform
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
    93
    name > style
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
    94
}
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
    95
const "merge_use_attrs","exsl:node-set($_merge_use_attrs)";
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
    96
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
    97
svgfunc "unlink_clone"{
2995
7769e7c7f925 SVGHMI: Minimal support for HMI:List : clones pointing to elements of any HMI:List are never unlinked, widgets using HMI:List will rely on this.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2968
diff changeset
    98
    param "targetid";
3030
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
    99
    param "seed","''";
2968
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   100
    const "target", "//svg:*[@id = $targetid]";
3030
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   101
    const "seeded_id" choose {
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   102
        when "string-length($seed) > 0" > «$seed»_«@id»
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   103
        otherwise value "@id";
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   104
    }
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   105
    g{
3027
d660b1b6bf4f SVGHMI: Deeper clone unlinking. Was actually not recursive, and clones in clones where not unlinked. Stack successive ids to avoid collisions.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2995
diff changeset
   106
        attrib "id" value "$seeded_id";
3030
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   107
        attrib "original" value "@id";
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   108
2968
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   109
        choose {
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   110
            when "$target[self::svg:g]" {
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   111
                foreach "@*[not(local-name() = $excluded_use_attrs/name | $merge_use_attrs)]"
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   112
                    attrib "{name()}" > «.»
2853
6d39beb19f38 SVGHMI: whitespaces and comments
Edouard Tisserant
parents: 2852
diff changeset
   113
2968
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   114
                if "@style | $target/@style"
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   115
                    attrib "style" {
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   116
                        > «@style»
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   117
                        if "@style and $target/@style" > ;
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   118
                        > «$target/@style»
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   119
                    }
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   120
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   121
                if "@transform | $target/@transform"
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   122
                    attrib "transform" {
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   123
                        > «@transform»
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   124
                        if "@transform and $target/@transform" >  
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   125
                        > «$target/@transform»
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   126
                    }
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   127
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   128
                apply "$target/*", mode="unlink_clone"{
3030
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   129
                    with "seed","$seeded_id";
2968
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   130
                }
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   131
            }
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   132
            otherwise {
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   133
                // include non excluded attributes
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   134
                foreach "@*[not(local-name() = $excluded_use_attrs/name)]"
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   135
                    attrib "{name()}" > «.»
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   136
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   137
                apply "$target", mode="unlink_clone"{
3030
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   138
                    with "seed","$seeded_id";
2968
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   139
                }
556ef07a7e31 SVGHMI: When unlinking a clone of a group, do not create additional group, but merge transformation and styles, and replace label. This allows svg:use based widgets to directly access elements of svg:use targeted element.
Edouard Tisserant
parents: 2967
diff changeset
   140
            }
2854
c7d5f46cc306 SVGHMI: unlink clones (i.e. deep copy elements refered by svg:use) inside widget.
Edouard Tisserant
parents: 2853
diff changeset
   141
        }
c7d5f46cc306 SVGHMI: unlink clones (i.e. deep copy elements refered by svg:use) inside widget.
Edouard Tisserant
parents: 2853
diff changeset
   142
    }
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   143
}
2854
c7d5f46cc306 SVGHMI: unlink clones (i.e. deep copy elements refered by svg:use) inside widget.
Edouard Tisserant
parents: 2853
diff changeset
   144
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   145
// clone unlinking is really similar to deep-copy
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   146
// all nodes are sytematically copied
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   147
svgtmpl "@id", mode="unlink_clone" {
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   148
    param "seed";
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   149
    attrib "id" > «$seed»_«.»
3030
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   150
    attrib "original" > «.»
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   151
}
2854
c7d5f46cc306 SVGHMI: unlink clones (i.e. deep copy elements refered by svg:use) inside widget.
Edouard Tisserant
parents: 2853
diff changeset
   152
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   153
svgtmpl "@*", mode="unlink_clone" xsl:copy;
2854
c7d5f46cc306 SVGHMI: unlink clones (i.e. deep copy elements refered by svg:use) inside widget.
Edouard Tisserant
parents: 2853
diff changeset
   154
3027
d660b1b6bf4f SVGHMI: Deeper clone unlinking. Was actually not recursive, and clones in clones where not unlinked. Stack successive ids to avoid collisions.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2995
diff changeset
   155
svgtmpl "svg:use", mode="unlink_clone" {
d660b1b6bf4f SVGHMI: Deeper clone unlinking. Was actually not recursive, and clones in clones where not unlinked. Stack successive ids to avoid collisions.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2995
diff changeset
   156
    param "seed";
3030
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   157
    const "targetid","substring-after(@xlink:href,'#')";
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   158
    choose {
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   159
        when "func:is_unlinkable($targetid, @id)" {
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   160
            call "unlink_clone" {
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   161
                with "targetid", "$targetid";
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   162
                with "seed","$seed";
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   163
            }
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   164
        }
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   165
        otherwise xsl:copy apply "@*", mode="unlink_clone" {
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   166
            with "seed","$seed";
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   167
        }
2d13a4379e2f SVGHMI: Fix again clone unlinking, and this time add an "original" attribute to track the id of the original object before unlinking.
Edouard Tisserant
parents: 3027
diff changeset
   168
    }
3027
d660b1b6bf4f SVGHMI: Deeper clone unlinking. Was actually not recursive, and clones in clones where not unlinked. Stack successive ids to avoid collisions.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2995
diff changeset
   169
}
d660b1b6bf4f SVGHMI: Deeper clone unlinking. Was actually not recursive, and clones in clones where not unlinked. Stack successive ids to avoid collisions.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2995
diff changeset
   170
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   171
// copying widgets would have unwanted effect
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   172
// instead widget is refered through a svg:use.
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   173
svgtmpl "svg:*", mode="unlink_clone" {
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   174
    param "seed";
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   175
    choose {
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   176
        // node recursive copy ends when finding a widget
3393
a65bcbb6af20 SVGHMI: more accurate filtering of elements to unlink or not
Edouard Tisserant
parents: 3384
diff changeset
   177
        when "@id = $hmi_widgets/@id" {
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   178
            // place a clone instead of copying
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   179
            use{
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   180
                attrib "xlink:href" > «concat('#',@id)»
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   181
            }
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   182
        }
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   183
        otherwise {
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   184
            xsl:copy apply "@* | node()", mode="unlink_clone" {
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   185
                with "seed","$seed";
2854
c7d5f46cc306 SVGHMI: unlink clones (i.e. deep copy elements refered by svg:use) inside widget.
Edouard Tisserant
parents: 2853
diff changeset
   186
            }
c7d5f46cc306 SVGHMI: unlink clones (i.e. deep copy elements refered by svg:use) inside widget.
Edouard Tisserant
parents: 2853
diff changeset
   187
        }
c7d5f46cc306 SVGHMI: unlink clones (i.e. deep copy elements refered by svg:use) inside widget.
Edouard Tisserant
parents: 2853
diff changeset
   188
    }
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   189
}
2854
c7d5f46cc306 SVGHMI: unlink clones (i.e. deep copy elements refered by svg:use) inside widget.
Edouard Tisserant
parents: 2853
diff changeset
   190
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   191
const "result_svg" apply "/", mode="inline_svg";
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   192
const "result_svg_ns", "exsl:node-set($result_svg)";
2854
c7d5f46cc306 SVGHMI: unlink clones (i.e. deep copy elements refered by svg:use) inside widget.
Edouard Tisserant
parents: 2853
diff changeset
   193
2941
ef13a4007538 SVGHMI: spread JS code from svghmi/scripts.ysl2 in other .ysl2 files, using dedicated preamble and epilogue namespaces
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2940
diff changeset
   194
emit "preamble:inline-svg" {
ef13a4007538 SVGHMI: spread JS code from svghmi/scripts.ysl2 in other .ysl2 files, using dedicated preamble and epilogue namespaces
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2940
diff changeset
   195
    | let id = document.getElementById.bind(document);
ef13a4007538 SVGHMI: spread JS code from svghmi/scripts.ysl2 in other .ysl2 files, using dedicated preamble and epilogue namespaces
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2940
diff changeset
   196
    | var svg_root = id("«$svg/@id»");
ef13a4007538 SVGHMI: spread JS code from svghmi/scripts.ysl2 in other .ysl2 files, using dedicated preamble and epilogue namespaces
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2940
diff changeset
   197
}
ef13a4007538 SVGHMI: spread JS code from svghmi/scripts.ysl2 in other .ysl2 files, using dedicated preamble and epilogue namespaces
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2940
diff changeset
   198
ef13a4007538 SVGHMI: spread JS code from svghmi/scripts.ysl2 in other .ysl2 files, using dedicated preamble and epilogue namespaces
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2940
diff changeset
   199
emit "debug:clone-unlinking" {
ef13a4007538 SVGHMI: spread JS code from svghmi/scripts.ysl2 in other .ysl2 files, using dedicated preamble and epilogue namespaces
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2940
diff changeset
   200
    |
2904
92d115d8828d SVGHMI: collect debug data through xslt reflectivity instead of yml2/python trick
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2878
diff changeset
   201
    | Unlinked :
2878
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   202
    foreach "$to_unlink"{
bec552270ad1 SVGHMI: added inline_svg.ysl2
Edouard Tisserant
parents: 2877
diff changeset
   203
        | «@id»
2808
dc78ffa5253d SVGHMI: SVG viewport now defined so that HMI take scales and fit to the view. Implemented page switch through viewport change, no hiding of widget for now.
Edouard Tisserant
parents: 2807
diff changeset
   204
    }
2995
7769e7c7f925 SVGHMI: Minimal support for HMI:List : clones pointing to elements of any HMI:List are never unlinked, widgets using HMI:List will rely on this.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2968
diff changeset
   205
    | Not to unlink :
7769e7c7f925 SVGHMI: Minimal support for HMI:List : clones pointing to elements of any HMI:List are never unlinked, widgets using HMI:List will rely on this.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2968
diff changeset
   206
    foreach "$targets_not_to_unlink"{
7769e7c7f925 SVGHMI: Minimal support for HMI:List : clones pointing to elements of any HMI:List are never unlinked, widgets using HMI:List will rely on this.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2968
diff changeset
   207
        | «@id»
7769e7c7f925 SVGHMI: Minimal support for HMI:List : clones pointing to elements of any HMI:List are never unlinked, widgets using HMI:List will rely on this.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2968
diff changeset
   208
    }
2753
9a7e12e96399 SVGHMI: Added XSLT transformation, Makefile to get XSLT from ysl2 (copy of plcopen/Makefile) and a minimal stylesheet to start with.
Edouard Tisserant
parents:
diff changeset
   209
}