Mercurial > hg > xslscript
annotate xslscript.pl @ 12:cc0402def1f9 default tip
XSLScript: added CDATA support.
Notably, this simplifies adding javascript code to templates, which otherwise
require complex escaping.
Requested by Igor Sysoev.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Sun, 14 Apr 2024 23:11:11 +0300 |
parents | 01dc9ba12e1b |
children |
rev | line source |
---|---|
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
1 #!/usr/bin/perl |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
2 |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
3 # (C) Maxim Dounin |
10
cb41e7c634c5
XSLScript: README and LICENSE.
Maxim Dounin <mdounin@mdounin.ru>
parents:
9
diff
changeset
|
4 # (C) Nginx, Inc. |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
5 |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
6 # Convert from XSLScript to XSLT. |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
7 # |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
8 # Originally XSLScript was written by Paul Tchistopolskii. It is believed |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
9 # to be mostly identical to XSLT, but uses shorter syntax. Original |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
10 # implementation has major Java dependency, no longer supported and hard |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
11 # to find. |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
12 # |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
13 # This code doesn't pretend to be a full replacement, but rather an attempt |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
14 # to provide functionality needed for nginx documentation. |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
15 |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
16 ############################################################################### |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
17 |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
18 use warnings; |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
19 use strict; |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
20 |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
21 use Parse::RecDescent; |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
22 use Getopt::Long; |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
23 use Data::Dumper qw/Dumper/; |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
24 |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
25 ############################################################################### |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
26 |
7 | 27 my $dump = 0; |
9 | 28 my $output; |
7 | 29 |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
30 GetOptions( |
9 | 31 "output|o=s" => \$output, |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
32 "trace!" => \$::RD_TRACE, |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
33 "hint!" => \$::RD_HINT, |
7 | 34 "dump!" => \$dump, |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
35 ) |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
36 or die "oops\n"; |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
37 |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
38 ############################################################################### |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
39 |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
40 my $grammar = <<'EOF'; |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
41 |
11 | 42 # XSLScript grammar, reconstructed |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
43 |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
44 startrule : <skip:""> item(s) eofile |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
45 { $return = $item{'item(s)'}; 1 } |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
46 |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
47 item : "<!--" <commit> comment |
12
cc0402def1f9
XSLScript: added CDATA support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
11
diff
changeset
|
48 | "<![CDATA[" <commit> cdata |
3
0fa786e03744
XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
49 | "!!" <commit> exclam_double |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
50 | "!{" <commit> exclam_xpath |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
51 | "!" name <commit> params |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
52 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
53 "X:call-template", "name", $item{name}, [], |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
54 $item{params} |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
55 ]; 1 } |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
56 | "<%" <commit> space instruction space "%>" |
3
0fa786e03744
XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
57 { $return = $item{instruction}; 1 } |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
58 | "<" name attrs space ">" <commit> item(s?) "</" name ">" |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
59 { $return = [ "tag", $item{name}, $item{attrs}, $item{'item(s?)'} ]; 1 } |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
60 | "<" <commit> name attrs space "/>" |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
61 { $return = [ "tag", $item{name}, $item{attrs} ]; 1 } |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
62 | "X:variable" space <commit> xvariable |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
63 | "X:var" space <commit> xvariable |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
64 | "X:template" space <commit> xtemplate |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
65 | "X:if" space <commit> xif |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
66 | "X:param" space <commit> xparam |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
67 | "X:for-each" space <commit> xforeach |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
68 | "X:sort" space <commit> xsort |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
69 | "X:when" space <commit> xwhen |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
70 | "X:attribute" space <commit> xattribute |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
71 | "X:output" space <commit> xoutput |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
72 | "X:copy-of" space <commit> xcopyof |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
73 | instruction space <commit> attrs body |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
74 { $return = [ $item{instruction}, $item{attrs}, $item{body} ]; 1 } |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
75 | space_notempty |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
76 | text |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
77 | <error> |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
78 |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
79 # list of simple instructions |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
80 |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
81 instruction : "X:stylesheet" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
82 | "X:transform" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
83 | "X:attribute-set" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
84 | "X:element" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
85 | "X:apply-templates" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
86 | "X:choose" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
87 | "X:otherwise" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
88 | "X:value-of" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
89 | "X:apply-imports" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
90 | "X:number" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
91 | "X:include" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
92 | "X:import" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
93 | "X:strip-space" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
94 | "X:preserve-space" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
95 | "X:copy" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
96 | "X:text" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
97 | "X:comment" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
98 | "X:processing-instruction" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
99 | "X:decimal-format" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
100 | "X:namespace-alias" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
101 | "X:key" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
102 | "X:fallback" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
103 | "X:message" |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
104 |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
105 # comments, <!-- ... --> |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
106 # not sure if it's something to be interpreted specially |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
107 # likely an artifact of our dump process |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
108 |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
109 comment : /((?!-->).)*/ms "-->" |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
110 { $return = "<!--" . $item[1] . "-->"; 1 } |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
111 |
12
cc0402def1f9
XSLScript: added CDATA support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
11
diff
changeset
|
112 # cdata, <![CDATA[ ... ]]> |
cc0402def1f9
XSLScript: added CDATA support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
11
diff
changeset
|
113 |
cc0402def1f9
XSLScript: added CDATA support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
11
diff
changeset
|
114 cdata : /((?!]]>).)*/ms "]]>" |
cc0402def1f9
XSLScript: added CDATA support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
11
diff
changeset
|
115 { $return = "<![CDATA[" . $item[1] . "]]>"; 1 } |
cc0402def1f9
XSLScript: added CDATA support.
Maxim Dounin <mdounin@mdounin.ru>
parents:
11
diff
changeset
|
116 |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
117 # special chars: ', ", {, }, \ |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
118 # if used in text, they needs to be escaped with backslash |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
119 |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
120 text : quoted | unreserved | "'" | "\"" | "{" |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
121 quoted : "\\" special |
3
0fa786e03744
XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
122 { $return = $item{special}; 1; } |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
123 special : "'" | "\"" | "\\" | "{" | "}" |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
124 unreserved : /[^'"\\{}<\s]+\s*/ms |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
125 |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
126 # whitespace |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
127 |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
128 space : /\s*/ms |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
129 space_notempty : /\s+/ms |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
130 |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
131 # shortcuts: |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
132 # |
3
0fa786e03744
XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
133 # !! for X:apply-templates |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
134 # !{xpath-expression} for X:value-of select="xpath-expression"; |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
135 # !foo() for X:call-template name="foo" |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
136 |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
137 # !root (path = { !{ substring($DIRNAME, 2) } }) |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
138 # !root (path = "substring-after($path, '/')") |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
139 |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
140 exclam_double : space value(?) params(?) attrs space ";" |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
141 { $return = [ |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
142 "X:apply-templates", "select", $item{'value(?)'}[0], |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
143 $item{attrs}, $item{'params(?)'}[0] |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
144 ]; 1 } |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
145 |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
146 exclam_xpath : xpath "}" |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
147 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
148 "X:value-of", "select", $item{xpath}, [] |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
149 ]; 1 } |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
150 xpath : /("[^"]*"|'[^']*'|[^}'"])*/ms |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
151 |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
152 # instruction attributes |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
153 # name="value" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
154 |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
155 attrs : attr(s?) |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
156 attr : space name space "=" space value |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
157 { $return = $item{name} . "=" . $item{value}; } |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
158 name : /[a-z0-9_:-]+/i |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
159 value : /"[^"]*"/ |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
160 |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
161 # template parameters |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
162 # ( bar="init", baz={markup} ) |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
163 |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
164 params : space "(" param(s? /\s*,\s*/) ")" space |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
165 { $return = $item[3]; 1 } |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
166 param : space name space "=" space value space |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
167 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
168 "X:with-param", |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
169 "select", $item{value}, |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
170 "name", $item{name}, |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
171 [] |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
172 ]; 1 } |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
173 | space name space "=" <commit> space "{" item(s) "}" |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
174 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
175 "X:with-param", "name", $item{name}, [], |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
176 $item{'item(s)'} |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
177 ]; 1 } |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
178 | space name |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
179 { $return = [ |
5 | 180 "X:param", "name", $item{name}, [] |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
181 ]; 1 } |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
182 |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
183 # instruction body |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
184 # ";" for empty body, "{ ... }" otherwise |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
185 |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
186 body : space ";" |
3
0fa786e03744
XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
187 { $return = ""; } |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
188 | space "{" <commit> item(s?) "}" (space ";")(?) |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
189 { $return = $item{'item(s?)'}; 1 } |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
190 |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
191 # special handling of some instructions |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
192 # X:if attribute is test= |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
193 |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
194 xif : value body space "else" <commit> body |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
195 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
196 "X:choose", [], [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
197 [ "X:when", "test", $item[1], [], $item[2] ], |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
198 [ "X:otherwise", [], $item[6] ] |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
199 ] |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
200 ]; 1 } |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
201 | value attrs body |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
202 { $return = [ |
5 | 203 "X:if", "test", $item{value}, $item{attrs}, $item{body}, |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
204 ]; 1 } |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
205 | attrs body |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
206 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
207 "X:if", $item{attrs}, $item{body}, |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
208 ]; 1 } |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
209 | <error> |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
210 |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
211 # X:template name(params) = "match" { |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
212 # X:template name( bar="init", baz={markup} ) = "match" mode="some" { |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
213 |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
214 xtemplate : name(?) params(?) space |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
215 (space "=" space value)(?) attrs body |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
216 { $return = [ |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
217 "X:template", |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
218 "name", $item{'name(?)'}[0], |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
219 "match", $item[4][0], |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
220 $item{attrs}, |
5 | 221 [ ($item[2][0] ? @{$item[2][0]} : ()), @{$item{body}} ] |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
222 ]; 1 } |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
223 |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
224 # X:var LINK = "/article/@link"; |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
225 # X:var year = { ... } |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
226 # semicolon is optional |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
227 |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
228 xvariable : name space "=" space value attrs body |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
229 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
230 "X:variable", |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
231 "select", $item{value}, |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
232 "name", $item{name}, |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
233 $item{attrs}, $item{body} |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
234 ]; 1 } |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
235 | name space "=" space attrs body |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
236 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
237 "X:variable", |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
238 "name", $item{name}, |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
239 $item{attrs}, $item{body} |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
240 ]; 1 } |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
241 | name space "=" space value |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
242 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
243 "X:variable", |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
244 "select", $item{value}, |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
245 "name", $item{name}, |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
246 [] |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
247 ]; 1 } |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
248 | name space "=" |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
249 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
250 "X:variable", |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
251 "name", $item{name}, |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
252 [] |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
253 ]; 1 } |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
254 | <error> |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
255 |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
256 # X:param XML = "'../xml'"; |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
257 # X:param YEAR; |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
258 |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
259 xparam : name space "=" space value attrs body |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
260 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
261 "X:param", |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
262 "select", $item{value}, |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
263 "name", $item{name}, |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
264 $item{attrs}, $item{body} |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
265 ]; 1 } |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
266 | name attrs body |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
267 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
268 "X:param", "name", $item{name}, |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
269 $item{attrs}, $item{body} |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
270 ]; 1 } |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
271 |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
272 # X:for-each "section[@id and @name]" { ... } |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
273 # X:for-each "link", X:sort "@id" { |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
274 |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
275 xforeach : value attrs body |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
276 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
277 "X:for-each", "select", $item{value}, $item{attrs}, $item{body} |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
278 ]; 1 } |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
279 | value attrs space |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
280 "," space "X:sort" <commit> space value attrs body |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
281 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
282 "X:for-each", "select", $item[1], $item[2], [ |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
283 [ "X:sort", "select", $item[9], $item[10] ], |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
284 @{$item{body}} |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
285 ] |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
286 ]; 1 } |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
287 |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
288 # X:sort select |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
289 # X:sort "@id" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
290 |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
291 xsort : value attrs body |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
292 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
293 "X:sort", "select", $item{value}, $item{attrs}, $item{body} |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
294 ]; 1 } |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
295 |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
296 # X:when "position() = 1" { ... } |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
297 |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
298 xwhen : value attrs body |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
299 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
300 "X:when", "test", $item{value}, $item{attrs}, $item{body} |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
301 ]; 1 } |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
302 |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
303 # X:attribute "href" { ... } |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
304 |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
305 xattribute : value attrs body |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
306 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
307 "X:attribute", "name", $item{value}, $item{attrs}, $item{body} |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
308 ]; 1 } |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
309 |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
310 # X:output |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
311 # semicolon is optional |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
312 |
3
0fa786e03744
XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
313 xoutput : attrs body(?) |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
314 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
315 "X:output", undef, undef, $item{attrs}, $item{body} |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
316 ]; 1 } |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
317 |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
318 # "X:copy-of" |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
319 # semicolon is optional |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
320 |
3
0fa786e03744
XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
321 xcopyof : value attrs body(?) |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
322 { $return = [ |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
323 "X:copy-of", "select", $item{value}, $item{attrs}, $item{body} |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
324 ]; 1 } |
2
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
325 |
bcd96c403898
XSLScript: rewritten grammar, matches all xsls.
Maxim Dounin <mdounin@mdounin.ru>
parents:
1
diff
changeset
|
326 # eof |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
327 |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
328 eofile : /^\Z/ |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
329 |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
330 EOF |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
331 |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
332 ############################################################################### |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
333 |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
334 sub format_tree { |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
335 my ($tree, $indent) = @_; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
336 my $s = ''; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
337 |
5 | 338 if (!defined $indent) { |
339 $indent = 0; | |
340 $s .= '<?xml version="1.0" encoding="utf-8"?>' . "\n"; | |
341 } | |
342 | |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
343 my $space = " " x $indent; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
344 |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
345 foreach my $el (@{$tree}) { |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
346 if (!defined $el) { |
5 | 347 warn "Undefined element in output.\n"; |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
348 $s .= $space . "(undef)" . "\n"; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
349 next; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
350 } |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
351 |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
352 if (not ref($el) && defined $el) { |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
353 if ($el =~ /^<!--(.*)-->$/s) { |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
354 my $comment = $1; |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
355 $comment =~ s/--/../sg; |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
356 $el = "<!--" . $comment . "-->"; |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
357 } |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
358 |
5 | 359 $s .= $el; |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
360 next; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
361 } |
3
0fa786e03744
XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
362 |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
363 die if ref($el) ne 'ARRAY'; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
364 |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
365 my $tag = $el->[0]; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
366 |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
367 if ($tag eq 'tag') { |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
368 my (undef, $name, $attrs, $body) = @{$el}; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
369 |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
370 $s .= "<" . join(" ", $name, @{$attrs}); |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
371 if ($body) { |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
372 $s .= ">" . format_tree($body, $indent + 1) |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
373 . "</$name>"; |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
374 } else { |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
375 $s .= "/>"; |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
376 } |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
377 |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
378 next; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
379 } |
3
0fa786e03744
XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
380 |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
381 if ($tag =~ m/^X:(.*)/) { |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
382 my $name = "xsl:" . $1; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
383 my (undef, @a) = @{$el}; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
384 my @attrs; |
3
0fa786e03744
XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
385 |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
386 while (@a) { |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
387 last if ref($a[0]) eq 'ARRAY'; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
388 my $name = shift @a; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
389 my $value = shift @a; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
390 next unless defined $value; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
391 $value = '"' . $value . '"' |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
392 unless $value =~ /^"/; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
393 push @attrs, "$name=$value"; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
394 } |
3
0fa786e03744
XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
395 |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
396 if ($name eq "xsl:stylesheet") { |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
397 push @attrs, 'xmlns:xsl="http://www.w3.org/1999/XSL/Transform"'; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
398 push @attrs, 'version="1.0"'; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
399 } |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
400 |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
401 my ($attrs, $body) = @a; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
402 $attrs = [ @{$attrs}, @attrs ]; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
403 |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
404 $s .= "<" . join(" ", $name, @{$attrs}); |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
405 |
5 | 406 if ($body && scalar @{$body} > 0) { |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
407 $s .= ">" . format_tree($body, $indent + 1) |
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
408 . "</$name>"; |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
409 } else { |
8
86721b270ebb
XSLScript: explicit whitespace handling.
Maxim Dounin <mdounin@mdounin.ru>
parents:
7
diff
changeset
|
410 $s .= "/>"; |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
411 } |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
412 |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
413 next; |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
414 } |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
415 |
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
416 $s .= format_tree($el, $indent + 1); |
3
0fa786e03744
XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
417 } |
0fa786e03744
XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
418 |
0fa786e03744
XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
419 return $s; |
0fa786e03744
XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
420 } |
0fa786e03744
XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
421 |
0fa786e03744
XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
422 ############################################################################### |
0fa786e03744
XSLScript: some preliminary work on conversion.
Maxim Dounin <mdounin@mdounin.ru>
parents:
2
diff
changeset
|
423 |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
424 my $parser = Parse::RecDescent->new($grammar) |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
425 or die "Failed to create parser.\n"; |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
426 |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
427 my $lines; |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
428 |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
429 { |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
430 local $/; |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
431 $lines = <>; |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
432 } |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
433 |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
434 my $tree = $parser->startrule($lines) |
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
435 or die "Failed to parse $ARGV.\n"; |
9 | 436 my $formatted = format_tree($tree); |
437 | |
438 if (defined $output) { | |
439 open STDOUT, ">", $output | |
440 or die "Can't open $output: $!\n"; | |
441 } | |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
442 |
7 | 443 if ($dump) { |
444 print Dumper($tree); | |
445 exit(0); | |
446 } | |
447 | |
9 | 448 print $formatted; |
4
eb959dce273b
XSLScript: tree construction and printing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3
diff
changeset
|
449 |
1
f082f8c2ebb0
XSLScript: some preliminary grammar, incomplete.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff
changeset
|
450 ############################################################################### |