]> gitweb.factorcode.org Git - factor.git/blob - basis/xmode/catalog/modes/xsl.xml
basis/xmode: refactor to be deploy friendly.
[factor.git] / basis / xmode / catalog / modes / xsl.xml
1 <?xml version="1.0"?>
2 <!DOCTYPE MODE SYSTEM "xmode.dtd"><!--
3   ======================================================================
4   Edit mode for XSLT 1.0 and XSLT 2.0
5   ======================================================================
6   Token types:
7
8   COMMENT1    XML comments
9   COMMENT2    XPath 2.0 comments - top or nested within COMMENT3
10   COMMENT3    XPath 2.0 comments - nested within COMMENT2
11   COMMENT4    Default task names used in Task List
12   DIGIT       Digits
13   FUNCTION    Functions
14   INVALID     -
15   KEYWORD1    XSLT element names
16   KEYWORD2    XSLT attribute names
17   KEYWORD3    Attribute values
18   KEYWORD4    Axes specifiers
19   LABEL       Namespace prefixes
20   LITERAL1    String literals
21   LITERAL2    Parameter and variable references
22   LITERAL3    Entity references and processing instructions
23   LITERAL4    DTD constructs and CDATA sections
24   MARKUP      Result elements and extension elements
25   OPERATOR    XPath 2.0 keywords + some other stuff
26   ======================================================================
27 -->
28
29 <MODE>
30
31   <PROPS>
32     <PROPERTY NAME="commentStart" VALUE="&lt;!--"/>
33     <PROPERTY NAME="commentEnd" VALUE="--&gt;"/>
34   </PROPS>
35
36   <RULES HIGHLIGHT_DIGITS="FALSE" IGNORE_CASE="FALSE">
37
38     <!-- XML comments -->
39     <SPAN DELEGATE="TASKS" TYPE="COMMENT1">
40       <BEGIN>&lt;!--</BEGIN>
41       <END>--&gt;</END>
42     </SPAN>
43
44     <!-- Assume 'xsl' prefix for XSLT elements -->
45     <SPAN_REGEXP HASH_CHAR="&lt;" DELEGATE="XSLTAGS" TYPE="KEYWORD2">
46       <BEGIN>&lt;(?=xsl:)</BEGIN>
47       <END>&gt;</END>
48     </SPAN_REGEXP>
49
50     <SPAN_REGEXP HASH_CHAR="&lt;" DELEGATE="XSLTAGS" TYPE="KEYWORD2">
51       <BEGIN>&lt;(?=/xsl:)</BEGIN>
52       <END>&gt;</END>
53     </SPAN_REGEXP>
54
55     <!-- CDATA marked sections. Reuse common xml mode -->
56     <SPAN TYPE="KEYWORD2" DELEGATE="xml::CDATA">
57       <BEGIN>&lt;![CDATA[</BEGIN>
58       <END>]]&gt;</END>
59     </SPAN>
60
61     <!-- DTD constructs. Reuse common xml mode  -->
62     <SPAN TYPE="KEYWORD2" DELEGATE="xml::DTD-TAGS">
63       <BEGIN>&lt;!</BEGIN>
64       <END>&gt;</END>
65     </SPAN>
66
67     <!-- Entity references -->
68     <SPAN TYPE="LITERAL3" NO_WORD_BREAK="TRUE">
69       <BEGIN>&amp;</BEGIN>
70       <END>;</END>
71     </SPAN>
72
73     <!-- Processing instructions -->
74     <SPAN TYPE="LITERAL3">
75       <BEGIN>&lt;?</BEGIN>
76       <END>?&gt;</END>
77     </SPAN>
78
79     <!-- Result elements and extension elements -->
80     <SPAN DELEGATE="TAGS" TYPE="MARKUP">
81       <BEGIN>&lt;</BEGIN>
82       <END>&gt;</END>
83     </SPAN>
84   </RULES>
85
86   <!-- XML comments -->
87   <RULES DEFAULT="COMMENT1" IGNORE_CASE="FALSE" SET="TASKS">
88     <!-- Default task names used in Task List -->
89     <KEYWORDS>
90       <COMMENT4>DEBUG:</COMMENT4>
91       <COMMENT4>DONE:</COMMENT4>
92       <COMMENT4>FIXME:</COMMENT4>
93       <COMMENT4>IDEA:</COMMENT4>
94       <COMMENT4>NOTE:</COMMENT4>
95       <COMMENT4>QUESTION:</COMMENT4>
96       <COMMENT4>TODO:</COMMENT4>
97       <COMMENT4>XXX</COMMENT4>
98       <COMMENT4>???</COMMENT4>
99     </KEYWORDS>
100   </RULES>
101
102   <!-- Result elements and extension elements -->
103   <RULES DEFAULT="MARKUP" HIGHLIGHT_DIGITS="FALSE" NO_WORD_SEP=".-_:" SET="TAGS">
104
105     <!-- Highlight all AVTs in result attribute values. -->
106     <SPAN TYPE="MARKUP" DELEGATE="AVT">
107       <BEGIN>"</BEGIN>
108       <END>"</END>
109     </SPAN>
110     <SPAN TYPE="MARKUP" DELEGATE="AVT">
111       <BEGIN>'</BEGIN>
112       <END>'</END>
113     </SPAN>
114
115     <!-- Namespace declarations -->
116     <SEQ TYPE="OPERATOR">xmlns:</SEQ>
117     <!-- Default namespace declaration. Not really used in XSLT -->
118     <SEQ TYPE="OPERATOR">xmlns</SEQ>
119
120     <!-- Namespace prefixes -->
121     <MARK_PREVIOUS TYPE="LABEL">:</MARK_PREVIOUS>
122
123   </RULES>
124
125   <!-- AVTs -->
126   <RULES DEFAULT="KEYWORD3" HIGHLIGHT_DIGITS="FALSE" NO_WORD_SEP=".-_:" SET="AVT">
127
128     <!-- Literal curly braces ({}) must be written as {{ or }} -->
129     <SEQ>{{</SEQ>
130     <SEQ>}}</SEQ><!-- Does nothing. Is overridden by the SPAN below. -->
131
132     <!-- The AVT itself -->
133     <SPAN DELEGATE="XPATH" TYPE="OPERATOR">
134       <BEGIN>{</BEGIN>
135       <END>}</END>
136     </SPAN>
137
138     <!-- Entity references -->
139     <SPAN TYPE="LITERAL3" NO_WORD_BREAK="TRUE">
140       <BEGIN>&amp;</BEGIN>
141       <END>;</END>
142     </SPAN>
143
144   </RULES>
145
146   <!-- XSLT tags -->
147   <RULES DEFAULT="KEYWORD2" HIGHLIGHT_DIGITS="FALSE" NO_WORD_SEP=".-_:" SET="XSLTAGS">
148
149     <!-- If we spot something that looks like an AVT, assume it is. Lazy, I know... -->
150     <SPAN TYPE="KEYWORD2" DELEGATE="AVT">
151       <BEGIN>"</BEGIN>
152       <END>"</END>
153     </SPAN>
154     <SPAN TYPE="KEYWORD2" DELEGATE="AVT">
155       <BEGIN>'</BEGIN>
156       <END>'</END>
157     </SPAN>
158
159     <!-- XSLT attributes that contains XPath expressions or match patterns -->
160     <!-- count -->
161     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="count" DELEGATE="XPATH">
162       <BEGIN>count[\p{Space}]*=[\p{Space}]*"</BEGIN>
163       <END>"</END>
164     </SPAN_REGEXP>
165     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="count" DELEGATE="XPATH">
166       <BEGIN>count[\p{Space}]*=[\p{Space}]*'</BEGIN>
167       <END>'</END>
168     </SPAN_REGEXP>
169     <!-- from -->
170     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="from" DELEGATE="XPATH">
171       <BEGIN>from[\p{Space}]*=[\p{Space}]*"</BEGIN>
172       <END>"</END>
173     </SPAN_REGEXP>
174     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="from" DELEGATE="XPATH">
175       <BEGIN>from[\p{Space}]*=[\p{Space}]*'</BEGIN>
176       <END>'</END>
177     </SPAN_REGEXP>
178     <!-- group-adjacent -->
179     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-adjacent" DELEGATE="XPATH">
180       <BEGIN>group-adjacent[\p{Space}]*=[\p{Space}]*"</BEGIN>
181       <END>"</END>
182     </SPAN_REGEXP>
183     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-adjacent" DELEGATE="XPATH">
184       <BEGIN>group-adjacent[\p{Space}]*=[\p{Space}]*'</BEGIN>
185       <END>'</END>
186     </SPAN_REGEXP>
187     <!-- group-by -->
188     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-by" DELEGATE="XPATH">
189       <BEGIN>group-by[\p{Space}]*=[\p{Space}]*"</BEGIN>
190       <END>"</END>
191     </SPAN_REGEXP>
192     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-by" DELEGATE="XPATH">
193       <BEGIN>group-by[\p{Space}]*=[\p{Space}]*'</BEGIN>
194       <END>'</END>
195     </SPAN_REGEXP>
196     <!-- group-ending-with -->
197     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-ending-with" DELEGATE="XPATH">
198       <BEGIN>group-ending-with[\p{Space}]*=[\p{Space}]*"</BEGIN>
199       <END>"</END>
200     </SPAN_REGEXP>
201     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-ending-with" DELEGATE="XPATH">
202       <BEGIN>group-ending-with[\p{Space}]*=[\p{Space}]*'</BEGIN>
203       <END>'</END>
204     </SPAN_REGEXP>
205     <!-- group-starting-with -->
206     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-starting-with" DELEGATE="XPATH">
207       <BEGIN>group-starting-with[\p{Space}]*=[\p{Space}]*"</BEGIN>
208       <END>"</END>
209     </SPAN_REGEXP>
210     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="group-starting-with" DELEGATE="XPATH">
211       <BEGIN>group-starting-with[\p{Space}]*=[\p{Space}]*'</BEGIN>
212       <END>'</END>
213     </SPAN_REGEXP>
214     <!-- match -->
215     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="match" DELEGATE="XPATH">
216       <BEGIN>match[\p{Space}]*=[\p{Space}]*"</BEGIN>
217       <END>"</END>
218     </SPAN_REGEXP>
219     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="match" DELEGATE="XPATH">
220       <BEGIN>match[\p{Space}]*=[\p{Space}]*'</BEGIN>
221       <END>'</END>
222     </SPAN_REGEXP>
223     <!-- select -->
224     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="select" DELEGATE="XPATH">
225       <BEGIN>select[\p{Space}]*=[\p{Space}]*"</BEGIN>
226       <END>"</END>
227     </SPAN_REGEXP>
228     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="select" DELEGATE="XPATH">
229       <BEGIN>select[\p{Space}]*=[\p{Space}]*'</BEGIN>
230       <END>'</END>
231     </SPAN_REGEXP>
232     <!-- test -->
233     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="test" DELEGATE="XPATH">
234       <BEGIN>test[\p{Space}]*=[\p{Space}]*"</BEGIN>
235       <END>"</END>
236     </SPAN_REGEXP>
237     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="test" DELEGATE="XPATH">
238       <BEGIN>test[\p{Space}]*=[\p{Space}]*'</BEGIN>
239       <END>'</END>
240     </SPAN_REGEXP>
241     <!-- use -->
242     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="use" DELEGATE="XPATH">
243       <BEGIN>use[\p{Space}]*=[\p{Space}]*"</BEGIN>
244       <END>"</END>
245     </SPAN_REGEXP>
246     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="use" DELEGATE="XPATH">
247       <BEGIN>use[\p{Space}]*=[\p{Space}]*'</BEGIN>
248       <END>'</END>
249     </SPAN_REGEXP>
250     <!-- value -->
251     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="value" DELEGATE="XPATH">
252       <BEGIN>value[\p{Space}]*=[\p{Space}]*"</BEGIN>
253       <END>"</END>
254     </SPAN_REGEXP>
255     <SPAN_REGEXP TYPE="KEYWORD2" HASH_CHAR="select" DELEGATE="XPATH">
256       <BEGIN>select[\p{Space}]*=[\p{Space}]*'</BEGIN>
257       <END>'</END>
258     </SPAN_REGEXP>
259
260     <!-- Namespace declarations -->
261     <SEQ TYPE="OPERATOR">xmlns:</SEQ>
262     <!-- Default namespace declaration. Not really used in XSLT -->
263     <SEQ TYPE="OPERATOR">xmlns</SEQ>
264
265     <!-- Namespace prefixes -->
266     <MARK_PREVIOUS TYPE="LABEL">:</MARK_PREVIOUS>
267
268     <!-- XSLT 2.0 element names -->
269     <KEYWORDS>
270       <KEYWORD1>analyze-string</KEYWORD1>
271       <KEYWORD1>apply-imports</KEYWORD1>
272       <KEYWORD1>apply-templates</KEYWORD1>
273       <KEYWORD1>attribute</KEYWORD1>
274       <KEYWORD1>attribute-set</KEYWORD1>
275       <KEYWORD1>call-template</KEYWORD1>
276       <KEYWORD1>character-map</KEYWORD1>
277       <KEYWORD1>choose</KEYWORD1>
278       <KEYWORD1>comment</KEYWORD1>
279       <KEYWORD1>copy</KEYWORD1>
280       <KEYWORD1>copy-of</KEYWORD1>
281       <KEYWORD1>decimal-format</KEYWORD1>
282       <KEYWORD1>document</KEYWORD1>
283       <KEYWORD1>element</KEYWORD1>
284       <KEYWORD1>fallback</KEYWORD1>
285       <KEYWORD1>for-each</KEYWORD1>
286       <KEYWORD1>for-each-group</KEYWORD1>
287       <KEYWORD1>function</KEYWORD1>
288       <KEYWORD1>if</KEYWORD1>
289       <KEYWORD1>import</KEYWORD1>
290       <KEYWORD1>import-schema</KEYWORD1>
291       <KEYWORD1>include</KEYWORD1>
292       <KEYWORD1>key</KEYWORD1>
293       <KEYWORD1>matching-substring</KEYWORD1>
294       <KEYWORD1>message</KEYWORD1>
295       <KEYWORD1>namespace</KEYWORD1>
296       <KEYWORD1>namespace-alias</KEYWORD1>
297       <KEYWORD1>next-match</KEYWORD1>
298       <KEYWORD1>non-matching-substring</KEYWORD1>
299       <KEYWORD1>number</KEYWORD1>
300       <KEYWORD1>otherwise</KEYWORD1>
301       <KEYWORD1>output</KEYWORD1>
302       <KEYWORD1>output-character</KEYWORD1>
303       <KEYWORD1>param</KEYWORD1>
304       <KEYWORD1>perform-sort</KEYWORD1>
305       <KEYWORD1>preserve-space</KEYWORD1>
306       <KEYWORD1>processing-instruction</KEYWORD1>
307       <KEYWORD1>result-document</KEYWORD1>
308       <KEYWORD1>sequence</KEYWORD1>
309       <KEYWORD1>sort</KEYWORD1>
310       <KEYWORD1>strip-space</KEYWORD1>
311       <KEYWORD1>stylesheet</KEYWORD1>
312       <KEYWORD1>template</KEYWORD1>
313       <KEYWORD1>text</KEYWORD1>
314       <KEYWORD1>transform</KEYWORD1>
315       <KEYWORD1>value-of</KEYWORD1>
316       <KEYWORD1>variable</KEYWORD1>
317       <KEYWORD1>when</KEYWORD1>
318       <KEYWORD1>with-param</KEYWORD1>
319     </KEYWORDS>
320
321   </RULES>
322
323   <RULES DEFAULT="KEYWORD3" HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[\p{Digit}]+([\p{Punct}][\p{Digit}]+)?" NO_WORD_SEP=".-_" SET="XPATH">
324     <!-- String literals -->
325     <SPAN TYPE="LITERAL1">
326       <BEGIN>"</BEGIN>
327       <END>"</END>
328     </SPAN>
329     <SPAN TYPE="LITERAL1">
330       <BEGIN>'</BEGIN>
331       <END>'</END>
332     </SPAN>
333
334     <!-- XPath comments -->
335     <SPAN TYPE="COMMENT2" DELEGATE="XPATHCOMMENT2">
336       <BEGIN>(:</BEGIN>
337       <END>:)</END>
338     </SPAN>
339
340     <!-- Axes specifiers -->
341     <MARK_PREVIOUS TYPE="KEYWORD4">::</MARK_PREVIOUS>
342     <!-- Abbreviated 'attribute::' -->
343     <SEQ TYPE="KEYWORD4">@</SEQ>
344
345     <!-- XPath 2.0 operators + some other stuff -->
346     <!-- Comparison expressions -->
347     <SEQ TYPE="OPERATOR">=</SEQ>
348     <SEQ TYPE="OPERATOR">!=</SEQ>
349     <SEQ TYPE="OPERATOR">&gt;</SEQ>
350     <SEQ TYPE="OPERATOR">&amp;gt;</SEQ><!-- Treat as operator -->
351     <SEQ TYPE="OPERATOR">&amp;lt;</SEQ><!-- Treat as operator -->
352     <!-- Optional occurrence indicator -->
353     <SEQ TYPE="OPERATOR">?</SEQ>
354     <!-- Addition operator, one-or-more occurrence indicator-->
355     <SEQ TYPE="OPERATOR">+</SEQ>
356     <!-- Multiplication operator, zero-or-more occurrence indicator, node test -->
357     <SEQ TYPE="OPERATOR">*</SEQ>
358     <!-- Path expression step separator -->
359     <SEQ TYPE="OPERATOR">/</SEQ>
360     <!-- Union operator -->
361     <SEQ TYPE="OPERATOR">|</SEQ>
362     <!-- Sequence expression item separator -->
363     <SEQ TYPE="OPERATOR">,</SEQ>
364
365     <!-- Predicates -->
366     <SPAN TYPE="OPERATOR" DELEGATE="XPATH">
367       <BEGIN>[</BEGIN>
368       <END>]</END>
369     </SPAN>
370
371     <!-- Entity references -->
372     <SPAN TYPE="LITERAL3" NO_WORD_BREAK="TRUE">
373       <BEGIN>&amp;</BEGIN>
374       <END>;</END>
375     </SPAN>
376
377     <!-- Namespace prefixes -->
378     <MARK_PREVIOUS TYPE="LABEL">:</MARK_PREVIOUS>
379
380     <!-- Functions -->
381     <MARK_PREVIOUS TYPE="FUNCTION" MATCH_TYPE="OPERATOR">(</MARK_PREVIOUS>
382         <SEQ TYPE="OPERATOR">)</SEQ>
383
384     <!-- Variables -->
385     <MARK_FOLLOWING TYPE="LITERAL2">$</MARK_FOLLOWING>
386     <!-- XPath 2.0 keywords + some other stuff -->
387     <KEYWORDS>
388       <!-- Keywords -->
389       <OPERATOR>and</OPERATOR>
390       <OPERATOR>as</OPERATOR>
391       <OPERATOR>castable</OPERATOR>
392       <OPERATOR>div</OPERATOR>
393       <OPERATOR>else</OPERATOR>
394       <OPERATOR>eq</OPERATOR>
395       <OPERATOR>every</OPERATOR>
396       <OPERATOR>except</OPERATOR>
397       <OPERATOR>for</OPERATOR>
398       <OPERATOR>ge</OPERATOR>
399       <OPERATOR>gt</OPERATOR>
400       <OPERATOR>idiv</OPERATOR>
401       <OPERATOR>if</OPERATOR>
402       <OPERATOR>in</OPERATOR>
403       <OPERATOR>instance</OPERATOR>
404       <OPERATOR>intersect</OPERATOR>
405       <OPERATOR>is</OPERATOR>
406       <OPERATOR>isnot</OPERATOR>
407       <OPERATOR>le</OPERATOR>
408       <OPERATOR>lt</OPERATOR>
409       <OPERATOR>mod</OPERATOR>
410       <OPERATOR>nillable</OPERATOR>
411       <OPERATOR>ne</OPERATOR>
412       <OPERATOR>of</OPERATOR>
413       <OPERATOR>or</OPERATOR>
414       <OPERATOR>return</OPERATOR>
415       <OPERATOR>satisfies</OPERATOR>
416       <OPERATOR>some</OPERATOR>
417       <OPERATOR>then</OPERATOR>
418       <OPERATOR>to</OPERATOR>
419       <OPERATOR>treat</OPERATOR>
420       <OPERATOR>union</OPERATOR>
421
422       <!-- Subtraction operator -->
423       <OPERATOR>-</OPERATOR>
424
425     </KEYWORDS>
426
427   </RULES>
428
429   <!-- XPath comments - top or nested within COMMENT3 -->
430   <RULES DEFAULT="COMMENT2" SET="XPATHCOMMENT2">
431     <SPAN TYPE="COMMENT3" DELEGATE="XPATHCOMMENT3">
432       <BEGIN>(:</BEGIN>
433       <END>:)</END>
434     </SPAN>
435   </RULES>
436
437   <!-- XPath comments - nested within COMMENT2 -->
438   <RULES DEFAULT="COMMENT3" SET="XPATHCOMMENT3">
439     <SPAN TYPE="COMMENT2" DELEGATE="XPATHCOMMENT2">
440       <BEGIN>(:</BEGIN>
441       <END>:)</END>
442     </SPAN>
443   </RULES>
444
445 </MODE>
446
447