app-ai-solution-exp 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/bin/app-ai-solution-exp.js +20 -0
  2. package/out/main/index.js +1631 -0
  3. package/out/preload/index.js +108 -0
  4. package/out/renderer/assets/abap-D5KwWAsZ.js +1399 -0
  5. package/out/renderer/assets/apex-DVGUZ64i.js +331 -0
  6. package/out/renderer/assets/azcli-BEAhqcuE.js +69 -0
  7. package/out/renderer/assets/bat-Bqkp9Cfu.js +101 -0
  8. package/out/renderer/assets/bicep-DIlfshcM.js +110 -0
  9. package/out/renderer/assets/cameligo-CLaaYNMV.js +175 -0
  10. package/out/renderer/assets/clojure-fcgFaMHx.js +762 -0
  11. package/out/renderer/assets/codicon-ngg6Pgfi.ttf +0 -0
  12. package/out/renderer/assets/coffee-CzJ5oEdj.js +233 -0
  13. package/out/renderer/assets/cpp-CcN6f0ik.js +390 -0
  14. package/out/renderer/assets/csharp-BJeIuvde.js +327 -0
  15. package/out/renderer/assets/csp-D_3BK2Wp.js +54 -0
  16. package/out/renderer/assets/css-i3rI3_64.js +186 -0
  17. package/out/renderer/assets/css.worker-umuuUiIb.js +53567 -0
  18. package/out/renderer/assets/cssMode-BlKZF8mS.js +208 -0
  19. package/out/renderer/assets/cypher-D0--_GAN.js +264 -0
  20. package/out/renderer/assets/dart-vLMHv35g.js +282 -0
  21. package/out/renderer/assets/dockerfile--oxj0cAH.js +131 -0
  22. package/out/renderer/assets/ecl-CeuUgzaZ.js +457 -0
  23. package/out/renderer/assets/editor.worker-CNgWLVu7.js +13695 -0
  24. package/out/renderer/assets/elixir-eLfY1jWH.js +570 -0
  25. package/out/renderer/assets/flow9-ZSTChSMd.js +143 -0
  26. package/out/renderer/assets/freemarker2-BTb0QKKy.js +995 -0
  27. package/out/renderer/assets/fsharp-D2uoxuLH.js +218 -0
  28. package/out/renderer/assets/go-brnMpFrj.js +219 -0
  29. package/out/renderer/assets/graphql-BeiGgjIU.js +152 -0
  30. package/out/renderer/assets/handlebars-DKVnkZoO.js +414 -0
  31. package/out/renderer/assets/hcl-CrX1Es2W.js +184 -0
  32. package/out/renderer/assets/html-DSHBWNSF.js +303 -0
  33. package/out/renderer/assets/html.worker-BT47iy49.js +29777 -0
  34. package/out/renderer/assets/htmlMode-hdSFcfq-.js +224 -0
  35. package/out/renderer/assets/index-ByP1RhpK.js +309272 -0
  36. package/out/renderer/assets/index-CgixHIqL.css +11502 -0
  37. package/out/renderer/assets/ini-BcQysCTb.js +72 -0
  38. package/out/renderer/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
  39. package/out/renderer/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
  40. package/out/renderer/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
  41. package/out/renderer/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
  42. package/out/renderer/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
  43. package/out/renderer/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
  44. package/out/renderer/assets/inter-cyrillic-700-normal-CjBOestx.woff2 +0 -0
  45. package/out/renderer/assets/inter-cyrillic-700-normal-DrXBdSj3.woff +0 -0
  46. package/out/renderer/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
  47. package/out/renderer/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
  48. package/out/renderer/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
  49. package/out/renderer/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
  50. package/out/renderer/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
  51. package/out/renderer/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
  52. package/out/renderer/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 +0 -0
  53. package/out/renderer/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff +0 -0
  54. package/out/renderer/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
  55. package/out/renderer/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
  56. package/out/renderer/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
  57. package/out/renderer/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
  58. package/out/renderer/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
  59. package/out/renderer/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
  60. package/out/renderer/assets/inter-greek-700-normal-BUv2fZ6O.woff +0 -0
  61. package/out/renderer/assets/inter-greek-700-normal-C3JjAnD8.woff2 +0 -0
  62. package/out/renderer/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
  63. package/out/renderer/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
  64. package/out/renderer/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
  65. package/out/renderer/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
  66. package/out/renderer/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
  67. package/out/renderer/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
  68. package/out/renderer/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff +0 -0
  69. package/out/renderer/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 +0 -0
  70. package/out/renderer/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  71. package/out/renderer/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  72. package/out/renderer/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
  73. package/out/renderer/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  74. package/out/renderer/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
  75. package/out/renderer/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  76. package/out/renderer/assets/inter-latin-700-normal-BLAVimhd.woff +0 -0
  77. package/out/renderer/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
  78. package/out/renderer/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
  79. package/out/renderer/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
  80. package/out/renderer/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
  81. package/out/renderer/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
  82. package/out/renderer/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
  83. package/out/renderer/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
  84. package/out/renderer/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2 +0 -0
  85. package/out/renderer/assets/inter-latin-ext-700-normal-TidjK2hL.woff +0 -0
  86. package/out/renderer/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
  87. package/out/renderer/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  88. package/out/renderer/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
  89. package/out/renderer/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
  90. package/out/renderer/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
  91. package/out/renderer/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
  92. package/out/renderer/assets/inter-vietnamese-700-normal-BZaoP0fm.woff +0 -0
  93. package/out/renderer/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 +0 -0
  94. package/out/renderer/assets/java-Dt3iMn2o.js +233 -0
  95. package/out/renderer/assets/javascript-Ae6t5gfn.js +72 -0
  96. package/out/renderer/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
  97. package/out/renderer/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
  98. package/out/renderer/assets/jetbrains-mono-cyrillic-500-normal-DJqRU3vO.woff +0 -0
  99. package/out/renderer/assets/jetbrains-mono-cyrillic-500-normal-DmUKJPL_.woff2 +0 -0
  100. package/out/renderer/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
  101. package/out/renderer/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
  102. package/out/renderer/assets/jetbrains-mono-greek-500-normal-D7SFKleX.woff +0 -0
  103. package/out/renderer/assets/jetbrains-mono-greek-500-normal-JpySY46c.woff2 +0 -0
  104. package/out/renderer/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  105. package/out/renderer/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  106. package/out/renderer/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
  107. package/out/renderer/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
  108. package/out/renderer/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
  109. package/out/renderer/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
  110. package/out/renderer/assets/jetbrains-mono-latin-ext-500-normal-Cut-4mMH.woff2 +0 -0
  111. package/out/renderer/assets/jetbrains-mono-latin-ext-500-normal-ckzbgY84.woff +0 -0
  112. package/out/renderer/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
  113. package/out/renderer/assets/jetbrains-mono-vietnamese-500-normal-DNRqzVM1.woff +0 -0
  114. package/out/renderer/assets/json.worker-D4JVmXIe.js +21424 -0
  115. package/out/renderer/assets/jsonMode-B3dQSNhP.js +931 -0
  116. package/out/renderer/assets/julia-Cm3ItYL_.js +512 -0
  117. package/out/renderer/assets/kotlin-Ddo1SjA5.js +253 -0
  118. package/out/renderer/assets/less-B7Qaxw-O.js +162 -0
  119. package/out/renderer/assets/lexon-C1U0m2n9.js +158 -0
  120. package/out/renderer/assets/liquid-Zgyb8DZ5.js +235 -0
  121. package/out/renderer/assets/lspLanguageFeatures-CkDn9c2y.js +1841 -0
  122. package/out/renderer/assets/lua-hNsuGJkO.js +163 -0
  123. package/out/renderer/assets/m3-6ko6q9-_.js +211 -0
  124. package/out/renderer/assets/markdown-B0YTnTxW.js +230 -0
  125. package/out/renderer/assets/mdx-C8e8DFOf.js +159 -0
  126. package/out/renderer/assets/mips-CJm71dS3.js +199 -0
  127. package/out/renderer/assets/msdax-BBeIktCY.js +376 -0
  128. package/out/renderer/assets/mysql-BWiizXSn.js +879 -0
  129. package/out/renderer/assets/objective-c-B1L1C5EC.js +184 -0
  130. package/out/renderer/assets/pascal-DMQyD4Xk.js +252 -0
  131. package/out/renderer/assets/pascaligo-VA_LQ1oU.js +165 -0
  132. package/out/renderer/assets/perl-DC0Z0tlO.js +627 -0
  133. package/out/renderer/assets/pgsql-DaSGFTLp.js +852 -0
  134. package/out/renderer/assets/php-Bkx1qpkQ.js +501 -0
  135. package/out/renderer/assets/pla-DEV89yYj.js +138 -0
  136. package/out/renderer/assets/postiats-CVVurEnu.js +908 -0
  137. package/out/renderer/assets/powerquery-BQ_t1ZiQ.js +891 -0
  138. package/out/renderer/assets/powershell-BXiKvz7Z.js +240 -0
  139. package/out/renderer/assets/protobuf-CndvAUGu.js +421 -0
  140. package/out/renderer/assets/pug-BxCXwerb.js +403 -0
  141. package/out/renderer/assets/python-8eSQckTG.js +295 -0
  142. package/out/renderer/assets/qsharp-BWK6YLKm.js +302 -0
  143. package/out/renderer/assets/r-CtqYUQ6l.js +244 -0
  144. package/out/renderer/assets/razor-eAkN4Qfv.js +545 -0
  145. package/out/renderer/assets/redis-O7gSt3oh.js +303 -0
  146. package/out/renderer/assets/redshift-CvYMMYZY.js +810 -0
  147. package/out/renderer/assets/restructuredtext-B-KQCVu_.js +175 -0
  148. package/out/renderer/assets/ruby-DCd4DmAr.js +512 -0
  149. package/out/renderer/assets/rust-B1c0VCeq.js +344 -0
  150. package/out/renderer/assets/sb-Chfc_wZF.js +116 -0
  151. package/out/renderer/assets/scala-DbVzH-3O.js +371 -0
  152. package/out/renderer/assets/scheme-D7PxodDG.js +109 -0
  153. package/out/renderer/assets/scss-B42qMyAu.js +261 -0
  154. package/out/renderer/assets/shell-vZEubQ82.js +222 -0
  155. package/out/renderer/assets/solidity-yHOxYChb.js +1368 -0
  156. package/out/renderer/assets/sophia-D7pU0Y1d.js +200 -0
  157. package/out/renderer/assets/sparql-DxuVdnRl.js +202 -0
  158. package/out/renderer/assets/sql-BAGepFCR.js +854 -0
  159. package/out/renderer/assets/st-C-b0Dh53.js +417 -0
  160. package/out/renderer/assets/swift-BmOZGynf.js +313 -0
  161. package/out/renderer/assets/systemverilog-BOC0OOdC.js +577 -0
  162. package/out/renderer/assets/tcl-Bb4GCwBr.js +233 -0
  163. package/out/renderer/assets/ts.worker-C7hW3aY-.js +225330 -0
  164. package/out/renderer/assets/tsMode-D7ET908H.js +1265 -0
  165. package/out/renderer/assets/twig-DvgEGWAV.js +393 -0
  166. package/out/renderer/assets/typescript-BhqUlrW4.js +337 -0
  167. package/out/renderer/assets/typespec-R77Ln7Jb.js +128 -0
  168. package/out/renderer/assets/vb-Bm6ESA0Q.js +373 -0
  169. package/out/renderer/assets/wgsl-_KPae5vw.js +454 -0
  170. package/out/renderer/assets/xml-Bg3Ctug6.js +89 -0
  171. package/out/renderer/assets/yaml-C9aCL4uU.js +200 -0
  172. package/out/renderer/index.html +13 -0
  173. package/package.json +110 -0
@@ -0,0 +1,995 @@
1
+ import { l as languages } from "./index-ByP1RhpK.js";
2
+ const EMPTY_ELEMENTS = [
3
+ "assign",
4
+ "flush",
5
+ "ftl",
6
+ "return",
7
+ "global",
8
+ "import",
9
+ "include",
10
+ "break",
11
+ "continue",
12
+ "local",
13
+ "nested",
14
+ "nt",
15
+ "setting",
16
+ "stop",
17
+ "t",
18
+ "lt",
19
+ "rt",
20
+ "fallback"
21
+ ];
22
+ const BLOCK_ELEMENTS = [
23
+ "attempt",
24
+ "autoesc",
25
+ "autoEsc",
26
+ "compress",
27
+ "comment",
28
+ "escape",
29
+ "noescape",
30
+ "function",
31
+ "if",
32
+ "list",
33
+ "items",
34
+ "sep",
35
+ "macro",
36
+ "noparse",
37
+ "noParse",
38
+ "noautoesc",
39
+ "noAutoEsc",
40
+ "outputformat",
41
+ "switch",
42
+ "visit",
43
+ "recurse"
44
+ ];
45
+ const TagSyntaxAngle = {
46
+ close: ">",
47
+ id: "angle",
48
+ open: "<"
49
+ };
50
+ const TagSyntaxBracket = {
51
+ close: "\\]",
52
+ id: "bracket",
53
+ open: "\\["
54
+ };
55
+ const TagSyntaxAuto = {
56
+ close: "[>\\]]",
57
+ id: "auto",
58
+ open: "[<\\[]"
59
+ };
60
+ const InterpolationSyntaxDollar = {
61
+ close: "\\}",
62
+ id: "dollar",
63
+ open1: "\\$",
64
+ open2: "\\{"
65
+ };
66
+ const InterpolationSyntaxBracket = {
67
+ close: "\\]",
68
+ id: "bracket",
69
+ open1: "\\[",
70
+ open2: "="
71
+ };
72
+ function createLangConfiguration(ts) {
73
+ return {
74
+ brackets: [
75
+ ["<", ">"],
76
+ ["[", "]"],
77
+ ["(", ")"],
78
+ ["{", "}"]
79
+ ],
80
+ comments: {
81
+ blockComment: [`${ts.open}--`, `--${ts.close}`]
82
+ },
83
+ autoCloseBefore: "\n\r }]),.:;=",
84
+ autoClosingPairs: [
85
+ { open: "{", close: "}" },
86
+ { open: "[", close: "]" },
87
+ { open: "(", close: ")" },
88
+ { open: '"', close: '"', notIn: ["string"] },
89
+ { open: "'", close: "'", notIn: ["string"] }
90
+ ],
91
+ surroundingPairs: [
92
+ { open: '"', close: '"' },
93
+ { open: "'", close: "'" },
94
+ { open: "{", close: "}" },
95
+ { open: "[", close: "]" },
96
+ { open: "(", close: ")" },
97
+ { open: "<", close: ">" }
98
+ ],
99
+ folding: {
100
+ markers: {
101
+ start: new RegExp(
102
+ `${ts.open}#(?:${BLOCK_ELEMENTS.join("|")})([^/${ts.close}]*(?!/)${ts.close})[^${ts.open}]*$`
103
+ ),
104
+ end: new RegExp(`${ts.open}/#(?:${BLOCK_ELEMENTS.join("|")})[\\r\\n\\t ]*>`)
105
+ }
106
+ },
107
+ onEnterRules: [
108
+ {
109
+ beforeText: new RegExp(
110
+ `${ts.open}#(?!(?:${EMPTY_ELEMENTS.join("|")}))([a-zA-Z_]+)([^/${ts.close}]*(?!/)${ts.close})[^${ts.open}]*$`
111
+ ),
112
+ afterText: new RegExp(`^${ts.open}/#([a-zA-Z_]+)[\\r\\n\\t ]*${ts.close}$`),
113
+ action: {
114
+ indentAction: languages.IndentAction.IndentOutdent
115
+ }
116
+ },
117
+ {
118
+ beforeText: new RegExp(
119
+ `${ts.open}#(?!(?:${EMPTY_ELEMENTS.join("|")}))([a-zA-Z_]+)([^/${ts.close}]*(?!/)${ts.close})[^${ts.open}]*$`
120
+ ),
121
+ action: { indentAction: languages.IndentAction.Indent }
122
+ }
123
+ ]
124
+ };
125
+ }
126
+ function createLangConfigurationAuto() {
127
+ return {
128
+ // Cannot set block comment delimiter in auto mode...
129
+ // It depends on the content and the cursor position of the file...
130
+ brackets: [
131
+ ["<", ">"],
132
+ ["[", "]"],
133
+ ["(", ")"],
134
+ ["{", "}"]
135
+ ],
136
+ autoCloseBefore: "\n\r }]),.:;=",
137
+ autoClosingPairs: [
138
+ { open: "{", close: "}" },
139
+ { open: "[", close: "]" },
140
+ { open: "(", close: ")" },
141
+ { open: '"', close: '"', notIn: ["string"] },
142
+ { open: "'", close: "'", notIn: ["string"] }
143
+ ],
144
+ surroundingPairs: [
145
+ { open: '"', close: '"' },
146
+ { open: "'", close: "'" },
147
+ { open: "{", close: "}" },
148
+ { open: "[", close: "]" },
149
+ { open: "(", close: ")" },
150
+ { open: "<", close: ">" }
151
+ ],
152
+ folding: {
153
+ markers: {
154
+ start: new RegExp(`[<\\[]#(?:${BLOCK_ELEMENTS.join("|")})([^/>\\]]*(?!/)[>\\]])[^<\\[]*$`),
155
+ end: new RegExp(`[<\\[]/#(?:${BLOCK_ELEMENTS.join("|")})[\\r\\n\\t ]*>`)
156
+ }
157
+ },
158
+ onEnterRules: [
159
+ {
160
+ beforeText: new RegExp(
161
+ `[<\\[]#(?!(?:${EMPTY_ELEMENTS.join("|")}))([a-zA-Z_]+)([^/>\\]]*(?!/)[>\\]])[^[<\\[]]*$`
162
+ ),
163
+ afterText: new RegExp(`^[<\\[]/#([a-zA-Z_]+)[\\r\\n\\t ]*[>\\]]$`),
164
+ action: {
165
+ indentAction: languages.IndentAction.IndentOutdent
166
+ }
167
+ },
168
+ {
169
+ beforeText: new RegExp(
170
+ `[<\\[]#(?!(?:${EMPTY_ELEMENTS.join("|")}))([a-zA-Z_]+)([^/>\\]]*(?!/)[>\\]])[^[<\\[]]*$`
171
+ ),
172
+ action: { indentAction: languages.IndentAction.Indent }
173
+ }
174
+ ]
175
+ };
176
+ }
177
+ function createMonarchLanguage(ts, is) {
178
+ const id = `_${ts.id}_${is.id}`;
179
+ const s = (name) => name.replace(/__id__/g, id);
180
+ const r = (regexp) => {
181
+ const source = regexp.source.replace(/__id__/g, id);
182
+ return new RegExp(source, regexp.flags);
183
+ };
184
+ return {
185
+ // Settings
186
+ unicode: true,
187
+ includeLF: false,
188
+ start: s("default__id__"),
189
+ ignoreCase: false,
190
+ defaultToken: "invalid",
191
+ tokenPostfix: `.freemarker2`,
192
+ brackets: [
193
+ { open: "{", close: "}", token: "delimiter.curly" },
194
+ { open: "[", close: "]", token: "delimiter.square" },
195
+ { open: "(", close: ")", token: "delimiter.parenthesis" },
196
+ { open: "<", close: ">", token: "delimiter.angle" }
197
+ ],
198
+ // Dynamic RegExp
199
+ [s("open__id__")]: new RegExp(ts.open),
200
+ [s("close__id__")]: new RegExp(ts.close),
201
+ [s("iOpen1__id__")]: new RegExp(is.open1),
202
+ [s("iOpen2__id__")]: new RegExp(is.open2),
203
+ [s("iClose__id__")]: new RegExp(is.close),
204
+ // <#START_TAG : "<" | "<#" | "[#">
205
+ // <#END_TAG : "</" | "</#" | "[/#">
206
+ [s("startTag__id__")]: r(/(@open__id__)(#)/),
207
+ [s("endTag__id__")]: r(/(@open__id__)(\/#)/),
208
+ [s("startOrEndTag__id__")]: r(/(@open__id__)(\/?#)/),
209
+ // <#CLOSE_TAG1 : (<BLANK>)* (">" | "]")>
210
+ [s("closeTag1__id__")]: r(/((?:@blank)*)(@close__id__)/),
211
+ // <#CLOSE_TAG2 : (<BLANK>)* ("/")? (">" | "]")>
212
+ [s("closeTag2__id__")]: r(/((?:@blank)*\/?)(@close__id__)/),
213
+ // Static RegExp
214
+ // <#BLANK : " " | "\t" | "\n" | "\r">
215
+ blank: /[ \t\n\r]/,
216
+ // <FALSE : "false">
217
+ // <TRUE : "true">
218
+ // <IN : "in">
219
+ // <AS : "as">
220
+ // <USING : "using">
221
+ keywords: ["false", "true", "in", "as", "using"],
222
+ // Directive names that cannot have an expression parameters and cannot be self-closing
223
+ // E.g. <#if id==2> ... </#if>
224
+ directiveStartCloseTag1: /attempt|recover|sep|auto[eE]sc|no(?:autoe|AutoE)sc|compress|default|no[eE]scape|comment|no[pP]arse/,
225
+ // Directive names that cannot have an expression parameter and can be self-closing
226
+ // E.g. <#if> ... <#else> ... </#if>
227
+ // E.g. <#if> ... <#else /></#if>
228
+ directiveStartCloseTag2: /else|break|continue|return|stop|flush|t|lt|rt|nt|nested|recurse|fallback|ftl/,
229
+ // Directive names that can have an expression parameter and cannot be self-closing
230
+ // E.g. <#if id==2> ... </#if>
231
+ directiveStartBlank: /if|else[iI]f|list|for[eE]ach|switch|case|assign|global|local|include|import|function|macro|transform|visit|stop|return|call|setting|output[fF]ormat|nested|recurse|escape|ftl|items/,
232
+ // Directive names that can have an end tag
233
+ // E.g. </#if>
234
+ directiveEndCloseTag1: /if|list|items|sep|recover|attempt|for[eE]ach|local|global|assign|function|macro|output[fF]ormat|auto[eE]sc|no(?:autoe|AutoE)sc|compress|transform|switch|escape|no[eE]scape/,
235
+ // <#ESCAPED_CHAR :
236
+ // "\\"
237
+ // (
238
+ // ("n" | "t" | "r" | "f" | "b" | "g" | "l" | "a" | "\\" | "'" | "\"" | "{" | "=")
239
+ // |
240
+ // ("x" ["0"-"9", "A"-"F", "a"-"f"])
241
+ // )
242
+ // >
243
+ // Note: While the JavaCC tokenizer rule only specifies one hex digit,
244
+ // FreeMarker actually interprets up to 4 hex digits.
245
+ escapedChar: /\\(?:[ntrfbgla\\'"\{=]|(?:x[0-9A-Fa-f]{1,4}))/,
246
+ // <#ASCII_DIGIT: ["0" - "9"]>
247
+ asciiDigit: /[0-9]/,
248
+ // <INTEGER : (["0"-"9"])+>
249
+ integer: /[0-9]+/,
250
+ // <#NON_ESCAPED_ID_START_CHAR:
251
+ // [
252
+ // // This was generated on JDK 1.8.0_20 Win64 with src/main/misc/identifierChars/IdentifierCharGenerator.java
253
+ // ...
254
+ // ]
255
+ nonEscapedIdStartChar: /[\$@-Z_a-z\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u1FFF\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183-\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3006\u3031-\u3035\u303B-\u303C\u3040-\u318F\u31A0-\u31BA\u31F0-\u31FF\u3300-\u337F\u3400-\u4DB5\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,
256
+ // <#ESCAPED_ID_CHAR: "\\" ("-" | "." | ":" | "#")>
257
+ escapedIdChar: /\\[\-\.:#]/,
258
+ // <#ID_START_CHAR: <NON_ESCAPED_ID_START_CHAR>|<ESCAPED_ID_CHAR>>
259
+ idStartChar: /(?:@nonEscapedIdStartChar)|(?:@escapedIdChar)/,
260
+ // <ID: <ID_START_CHAR> (<ID_START_CHAR>|<ASCII_DIGIT>)*>
261
+ id: /(?:@idStartChar)(?:(?:@idStartChar)|(?:@asciiDigit))*/,
262
+ // Certain keywords / operators are allowed to index hashes
263
+ //
264
+ // Expression DotVariable(Expression exp) :
265
+ // {
266
+ // Token t;
267
+ // }
268
+ // {
269
+ // <DOT>
270
+ // (
271
+ // t = <ID> | t = <TIMES> | t = <DOUBLE_STAR>
272
+ // |
273
+ // (
274
+ // t = <LESS_THAN>
275
+ // |
276
+ // t = <LESS_THAN_EQUALS>
277
+ // |
278
+ // t = <ESCAPED_GT>
279
+ // |
280
+ // t = <ESCAPED_GTE>
281
+ // |
282
+ // t = <FALSE>
283
+ // |
284
+ // t = <TRUE>
285
+ // |
286
+ // t = <IN>
287
+ // |
288
+ // t = <AS>
289
+ // |
290
+ // t = <USING>
291
+ // )
292
+ // {
293
+ // if (!Character.isLetter(t.image.charAt(0))) {
294
+ // throw new ParseException(t.image + " is not a valid identifier.", template, t);
295
+ // }
296
+ // }
297
+ // )
298
+ // {
299
+ // notListLiteral(exp, "hash");
300
+ // notStringLiteral(exp, "hash");
301
+ // notBooleanLiteral(exp, "hash");
302
+ // Dot dot = new Dot(exp, t.image);
303
+ // dot.setLocation(template, exp, t);
304
+ // return dot;
305
+ // }
306
+ // }
307
+ specialHashKeys: /\*\*|\*|false|true|in|as|using/,
308
+ // <DOUBLE_EQUALS : "==">
309
+ // <EQUALS : "=">
310
+ // <NOT_EQUALS : "!=">
311
+ // <PLUS_EQUALS : "+=">
312
+ // <MINUS_EQUALS : "-=">
313
+ // <TIMES_EQUALS : "*=">
314
+ // <DIV_EQUALS : "/=">
315
+ // <MOD_EQUALS : "%=">
316
+ // <PLUS_PLUS : "++">
317
+ // <MINUS_MINUS : "--">
318
+ // <LESS_THAN_EQUALS : "lte" | "\\lte" | "<=" | "&lt;=">
319
+ // <LESS_THAN : "lt" | "\\lt" | "<" | "&lt;">
320
+ // <ESCAPED_GTE : "gte" | "\\gte" | "&gt;=">
321
+ // <ESCAPED_GT: "gt" | "\\gt" | "&gt;">
322
+ // <DOUBLE_STAR : "**">
323
+ // <PLUS : "+">
324
+ // <MINUS : "-">
325
+ // <TIMES : "*">
326
+ // <PERCENT : "%">
327
+ // <AND : "&" | "&&" | "&amp;&amp;" | "\\and" >
328
+ // <OR : "|" | "||">
329
+ // <EXCLAM : "!">
330
+ // <COMMA : ",">
331
+ // <SEMICOLON : ";">
332
+ // <COLON : ":">
333
+ // <ELLIPSIS : "...">
334
+ // <DOT_DOT_ASTERISK : "..*" >
335
+ // <DOT_DOT_LESS : "..<" | "..!" >
336
+ // <DOT_DOT : "..">
337
+ // <EXISTS : "??">
338
+ // <BUILT_IN : "?">
339
+ // <LAMBDA_ARROW : "->" | "-&gt;">
340
+ namedSymbols: /&lt;=|&gt;=|\\lte|\\lt|&lt;|\\gte|\\gt|&gt;|&amp;&amp;|\\and|-&gt;|->|==|!=|\+=|-=|\*=|\/=|%=|\+\+|--|<=|&&|\|\||:|\.\.\.|\.\.\*|\.\.<|\.\.!|\?\?|=|<|\+|-|\*|\/|%|\||\.\.|\?|!|&|\.|,|;/,
341
+ arrows: ["->", "-&gt;"],
342
+ delimiters: [";", ":", ",", "."],
343
+ stringOperators: ["lte", "lt", "gte", "gt"],
344
+ noParseTags: ["noparse", "noParse", "comment"],
345
+ tokenizer: {
346
+ // Parser states
347
+ // Plain text
348
+ [s("default__id__")]: [
349
+ { include: s("@directive_token__id__") },
350
+ { include: s("@interpolation_and_text_token__id__") }
351
+ ],
352
+ // A FreeMarker expression inside a directive, e.g. <#if 2<3>
353
+ [s("fmExpression__id__.directive")]: [
354
+ { include: s("@blank_and_expression_comment_token__id__") },
355
+ { include: s("@directive_end_token__id__") },
356
+ { include: s("@expression_token__id__") }
357
+ ],
358
+ // A FreeMarker expression inside an interpolation, e.g. ${2+3}
359
+ [s("fmExpression__id__.interpolation")]: [
360
+ { include: s("@blank_and_expression_comment_token__id__") },
361
+ { include: s("@expression_token__id__") },
362
+ { include: s("@greater_operators_token__id__") }
363
+ ],
364
+ // In an expression and inside a not-yet closed parenthesis / bracket
365
+ [s("inParen__id__.plain")]: [
366
+ { include: s("@blank_and_expression_comment_token__id__") },
367
+ { include: s("@directive_end_token__id__") },
368
+ { include: s("@expression_token__id__") }
369
+ ],
370
+ [s("inParen__id__.gt")]: [
371
+ { include: s("@blank_and_expression_comment_token__id__") },
372
+ { include: s("@expression_token__id__") },
373
+ { include: s("@greater_operators_token__id__") }
374
+ ],
375
+ // Expression for the unified call, e.g. <@createMacro() ... >
376
+ [s("noSpaceExpression__id__")]: [
377
+ { include: s("@no_space_expression_end_token__id__") },
378
+ { include: s("@directive_end_token__id__") },
379
+ { include: s("@expression_token__id__") }
380
+ ],
381
+ // For the function of a unified call. Special case for when the
382
+ // expression is a simple identifier.
383
+ // <@join [1,2] ",">
384
+ // <@null!join [1,2] ",">
385
+ [s("unifiedCall__id__")]: [{ include: s("@unified_call_token__id__") }],
386
+ // For singly and doubly quoted string (that may contain interpolations)
387
+ [s("singleString__id__")]: [{ include: s("@string_single_token__id__") }],
388
+ [s("doubleString__id__")]: [{ include: s("@string_double_token__id__") }],
389
+ // For singly and doubly quoted string (that may not contain interpolations)
390
+ [s("rawSingleString__id__")]: [{ include: s("@string_single_raw_token__id__") }],
391
+ [s("rawDoubleString__id__")]: [{ include: s("@string_double_raw_token__id__") }],
392
+ // For a comment in an expression
393
+ // ${ 1 + <#-- comment --> 2}
394
+ [s("expressionComment__id__")]: [{ include: s("@expression_comment_token__id__") }],
395
+ // For <#noparse> ... </#noparse>
396
+ // For <#noParse> ... </#noParse>
397
+ // For <#comment> ... </#comment>
398
+ [s("noParse__id__")]: [{ include: s("@no_parse_token__id__") }],
399
+ // For <#-- ... -->
400
+ [s("terseComment__id__")]: [{ include: s("@terse_comment_token__id__") }],
401
+ // Common rules
402
+ [s("directive_token__id__")]: [
403
+ // <ATTEMPT : <START_TAG> "attempt" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
404
+ // <RECOVER : <START_TAG> "recover" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
405
+ // <SEP : <START_TAG> "sep" <CLOSE_TAG1>>
406
+ // <AUTOESC : <START_TAG> "auto" ("e"|"E") "sc" <CLOSE_TAG1>> {
407
+ // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 4), DEFAULT);
408
+ // }
409
+ // <NOAUTOESC : <START_TAG> "no" ("autoe"|"AutoE") "sc" <CLOSE_TAG1>> {
410
+ // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 2), DEFAULT);
411
+ // }
412
+ // <COMPRESS : <START_TAG> "compress" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
413
+ // <DEFAUL : <START_TAG> "default" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
414
+ // <NOESCAPE : <START_TAG> "no" ("e" | "E") "scape" <CLOSE_TAG1>> {
415
+ // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 2), DEFAULT);
416
+ // }
417
+ //
418
+ // <COMMENT : <START_TAG> "comment" <CLOSE_TAG1>> {
419
+ // handleTagSyntaxAndSwitch(matchedToken, NO_PARSE); noparseTag = "comment";
420
+ // }
421
+ // <NOPARSE: <START_TAG> "no" ("p" | "P") "arse" <CLOSE_TAG1>> {
422
+ // int tagNamingConvention = getTagNamingConvention(matchedToken, 2);
423
+ // handleTagSyntaxAndSwitch(matchedToken, tagNamingConvention, NO_PARSE);
424
+ // noparseTag = tagNamingConvention == Configuration.CAMEL_CASE_NAMING_CONVENTION ? "noParse" : "noparse";
425
+ // }
426
+ [
427
+ r(/(?:@startTag__id__)(@directiveStartCloseTag1)(?:@closeTag1__id__)/),
428
+ ts.id === "auto" ? {
429
+ cases: {
430
+ "$1==<": { token: "@rematch", switchTo: `@default_angle_${is.id}` },
431
+ "$1==[": { token: "@rematch", switchTo: `@default_bracket_${is.id}` }
432
+ }
433
+ } : [
434
+ { token: "@brackets.directive" },
435
+ { token: "delimiter.directive" },
436
+ {
437
+ cases: {
438
+ "@noParseTags": { token: "tag", next: s("@noParse__id__.$3") },
439
+ "@default": { token: "tag" }
440
+ }
441
+ },
442
+ { token: "delimiter.directive" },
443
+ { token: "@brackets.directive" }
444
+ ]
445
+ ],
446
+ // <ELSE : <START_TAG> "else" <CLOSE_TAG2>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
447
+ // <BREAK : <START_TAG> "break" <CLOSE_TAG2>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
448
+ // <CONTINUE : <START_TAG> "continue" <CLOSE_TAG2>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
449
+ // <SIMPLE_RETURN : <START_TAG> "return" <CLOSE_TAG2>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
450
+ // <HALT : <START_TAG> "stop" <CLOSE_TAG2>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
451
+ // <FLUSH : <START_TAG> "flush" <CLOSE_TAG2>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
452
+ // <TRIM : <START_TAG> "t" <CLOSE_TAG2>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
453
+ // <LTRIM : <START_TAG> "lt" <CLOSE_TAG2>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
454
+ // <RTRIM : <START_TAG> "rt" <CLOSE_TAG2>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
455
+ // <NOTRIM : <START_TAG> "nt" <CLOSE_TAG2>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
456
+ // <SIMPLE_NESTED : <START_TAG> "nested" <CLOSE_TAG2>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
457
+ // <SIMPLE_RECURSE : <START_TAG> "recurse" <CLOSE_TAG2>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
458
+ // <FALLBACK : <START_TAG> "fallback" <CLOSE_TAG2>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
459
+ // <TRIVIAL_FTL_HEADER : ("<#ftl" | "[#ftl") ("/")? (">" | "]")> { ftlHeader(matchedToken); }
460
+ [
461
+ r(/(?:@startTag__id__)(@directiveStartCloseTag2)(?:@closeTag2__id__)/),
462
+ ts.id === "auto" ? {
463
+ cases: {
464
+ "$1==<": { token: "@rematch", switchTo: `@default_angle_${is.id}` },
465
+ "$1==[": { token: "@rematch", switchTo: `@default_bracket_${is.id}` }
466
+ }
467
+ } : [
468
+ { token: "@brackets.directive" },
469
+ { token: "delimiter.directive" },
470
+ { token: "tag" },
471
+ { token: "delimiter.directive" },
472
+ { token: "@brackets.directive" }
473
+ ]
474
+ ],
475
+ // <IF : <START_TAG> "if" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
476
+ // <ELSE_IF : <START_TAG> "else" ("i" | "I") "f" <BLANK>> {
477
+ // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 4), FM_EXPRESSION);
478
+ // }
479
+ // <LIST : <START_TAG> "list" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
480
+ // <FOREACH : <START_TAG> "for" ("e" | "E") "ach" <BLANK>> {
481
+ // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 3), FM_EXPRESSION);
482
+ // }
483
+ // <SWITCH : <START_TAG> "switch" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
484
+ // <CASE : <START_TAG> "case" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
485
+ // <ASSIGN : <START_TAG> "assign" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
486
+ // <GLOBALASSIGN : <START_TAG> "global" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
487
+ // <LOCALASSIGN : <START_TAG> "local" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
488
+ // <_INCLUDE : <START_TAG> "include" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
489
+ // <IMPORT : <START_TAG> "import" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
490
+ // <FUNCTION : <START_TAG> "function" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
491
+ // <MACRO : <START_TAG> "macro" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
492
+ // <TRANSFORM : <START_TAG> "transform" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
493
+ // <VISIT : <START_TAG> "visit" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
494
+ // <STOP : <START_TAG> "stop" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
495
+ // <RETURN : <START_TAG> "return" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
496
+ // <CALL : <START_TAG> "call" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
497
+ // <SETTING : <START_TAG> "setting" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
498
+ // <OUTPUTFORMAT : <START_TAG> "output" ("f"|"F") "ormat" <BLANK>> {
499
+ // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 6), FM_EXPRESSION);
500
+ // }
501
+ // <NESTED : <START_TAG> "nested" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
502
+ // <RECURSE : <START_TAG> "recurse" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
503
+ // <ESCAPE : <START_TAG> "escape" <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
504
+ //
505
+ // Note: FreeMarker grammar appears to treat the FTL header as a special case,
506
+ // in order to remove new lines after the header (?), but since we only need
507
+ // to tokenize for highlighting, we can include this directive here.
508
+ // <FTL_HEADER : ("<#ftl" | "[#ftl") <BLANK>> { ftlHeader(matchedToken); }
509
+ //
510
+ // Note: FreeMarker grammar appears to treat the items directive as a special case for
511
+ // the AST parsing process, but since we only need to tokenize, we can include this
512
+ // directive here.
513
+ // <ITEMS : <START_TAG> "items" (<BLANK>)+ <AS> <BLANK>> { handleTagSyntaxAndSwitch(matchedToken, FM_EXPRESSION); }
514
+ [
515
+ r(/(?:@startTag__id__)(@directiveStartBlank)(@blank)/),
516
+ ts.id === "auto" ? {
517
+ cases: {
518
+ "$1==<": { token: "@rematch", switchTo: `@default_angle_${is.id}` },
519
+ "$1==[": { token: "@rematch", switchTo: `@default_bracket_${is.id}` }
520
+ }
521
+ } : [
522
+ { token: "@brackets.directive" },
523
+ { token: "delimiter.directive" },
524
+ { token: "tag" },
525
+ { token: "", next: s("@fmExpression__id__.directive") }
526
+ ]
527
+ ],
528
+ // <END_IF : <END_TAG> "if" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
529
+ // <END_LIST : <END_TAG> "list" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
530
+ // <END_SEP : <END_TAG> "sep" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
531
+ // <END_RECOVER : <END_TAG> "recover" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
532
+ // <END_ATTEMPT : <END_TAG> "attempt" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
533
+ // <END_FOREACH : <END_TAG> "for" ("e" | "E") "ach" <CLOSE_TAG1>> {
534
+ // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 3), DEFAULT);
535
+ // }
536
+ // <END_LOCAL : <END_TAG> "local" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
537
+ // <END_GLOBAL : <END_TAG> "global" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
538
+ // <END_ASSIGN : <END_TAG> "assign" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
539
+ // <END_FUNCTION : <END_TAG> "function" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
540
+ // <END_MACRO : <END_TAG> "macro" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
541
+ // <END_OUTPUTFORMAT : <END_TAG> "output" ("f" | "F") "ormat" <CLOSE_TAG1>> {
542
+ // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 6), DEFAULT);
543
+ // }
544
+ // <END_AUTOESC : <END_TAG> "auto" ("e" | "E") "sc" <CLOSE_TAG1>> {
545
+ // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 4), DEFAULT);
546
+ // }
547
+ // <END_NOAUTOESC : <END_TAG> "no" ("autoe"|"AutoE") "sc" <CLOSE_TAG1>> {
548
+ // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 2), DEFAULT);
549
+ // }
550
+ // <END_COMPRESS : <END_TAG> "compress" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
551
+ // <END_TRANSFORM : <END_TAG> "transform" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
552
+ // <END_SWITCH : <END_TAG> "switch" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
553
+ // <END_ESCAPE : <END_TAG> "escape" <CLOSE_TAG1>> { handleTagSyntaxAndSwitch(matchedToken, DEFAULT); }
554
+ // <END_NOESCAPE : <END_TAG> "no" ("e" | "E") "scape" <CLOSE_TAG1>> {
555
+ // handleTagSyntaxAndSwitch(matchedToken, getTagNamingConvention(matchedToken, 2), DEFAULT);
556
+ // }
557
+ [
558
+ r(/(?:@endTag__id__)(@directiveEndCloseTag1)(?:@closeTag1__id__)/),
559
+ ts.id === "auto" ? {
560
+ cases: {
561
+ "$1==<": { token: "@rematch", switchTo: `@default_angle_${is.id}` },
562
+ "$1==[": { token: "@rematch", switchTo: `@default_bracket_${is.id}` }
563
+ }
564
+ } : [
565
+ { token: "@brackets.directive" },
566
+ { token: "delimiter.directive" },
567
+ { token: "tag" },
568
+ { token: "delimiter.directive" },
569
+ { token: "@brackets.directive" }
570
+ ]
571
+ ],
572
+ // <UNIFIED_CALL : "<@" | "[@" > { unifiedCall(matchedToken); }
573
+ [
574
+ r(/(@open__id__)(@)/),
575
+ ts.id === "auto" ? {
576
+ cases: {
577
+ "$1==<": { token: "@rematch", switchTo: `@default_angle_${is.id}` },
578
+ "$1==[": { token: "@rematch", switchTo: `@default_bracket_${is.id}` }
579
+ }
580
+ } : [
581
+ { token: "@brackets.directive" },
582
+ { token: "delimiter.directive", next: s("@unifiedCall__id__") }
583
+ ]
584
+ ],
585
+ // <UNIFIED_CALL_END : ("<" | "[") "/@" ((<ID>) ("."<ID>)*)? <CLOSE_TAG1>> { unifiedCallEnd(matchedToken); }
586
+ [
587
+ r(/(@open__id__)(\/@)((?:(?:@id)(?:\.(?:@id))*)?)(?:@closeTag1__id__)/),
588
+ [
589
+ { token: "@brackets.directive" },
590
+ { token: "delimiter.directive" },
591
+ { token: "tag" },
592
+ { token: "delimiter.directive" },
593
+ { token: "@brackets.directive" }
594
+ ]
595
+ ],
596
+ // <TERSE_COMMENT : ("<" | "[") "#--" > { noparseTag = "-->"; handleTagSyntaxAndSwitch(matchedToken, NO_PARSE); }
597
+ [
598
+ r(/(@open__id__)#--/),
599
+ ts.id === "auto" ? {
600
+ cases: {
601
+ "$1==<": { token: "@rematch", switchTo: `@default_angle_${is.id}` },
602
+ "$1==[": { token: "@rematch", switchTo: `@default_bracket_${is.id}` }
603
+ }
604
+ } : { token: "comment", next: s("@terseComment__id__") }
605
+ ],
606
+ // <UNKNOWN_DIRECTIVE : ("[#" | "[/#" | "<#" | "</#") (["a"-"z", "A"-"Z", "_"])+>
607
+ [
608
+ r(/(?:@startOrEndTag__id__)([a-zA-Z_]+)/),
609
+ ts.id === "auto" ? {
610
+ cases: {
611
+ "$1==<": { token: "@rematch", switchTo: `@default_angle_${is.id}` },
612
+ "$1==[": { token: "@rematch", switchTo: `@default_bracket_${is.id}` }
613
+ }
614
+ } : [
615
+ { token: "@brackets.directive" },
616
+ { token: "delimiter.directive" },
617
+ { token: "tag.invalid", next: s("@fmExpression__id__.directive") }
618
+ ]
619
+ ]
620
+ ],
621
+ // <DEFAULT, NO_DIRECTIVE> TOKEN :
622
+ [s("interpolation_and_text_token__id__")]: [
623
+ // <DOLLAR_INTERPOLATION_OPENING : "${"> { startInterpolation(matchedToken); }
624
+ // <SQUARE_BRACKET_INTERPOLATION_OPENING : "[="> { startInterpolation(matchedToken); }
625
+ [
626
+ r(/(@iOpen1__id__)(@iOpen2__id__)/),
627
+ [
628
+ { token: is.id === "bracket" ? "@brackets.interpolation" : "delimiter.interpolation" },
629
+ {
630
+ token: is.id === "bracket" ? "delimiter.interpolation" : "@brackets.interpolation",
631
+ next: s("@fmExpression__id__.interpolation")
632
+ }
633
+ ]
634
+ ],
635
+ // <STATIC_TEXT_FALSE_ALARM : "$" | "#" | "<" | "[" | "{"> // to handle a lone dollar sign or "<" or "# or <@ with whitespace after"
636
+ // <STATIC_TEXT_WS : ("\n" | "\r" | "\t" | " ")+>
637
+ // <STATIC_TEXT_NON_WS : (~["$", "<", "#", "[", "{", "\n", "\r", "\t", " "])+>
638
+ [/[\$#<\[\{]|(?:@blank)+|[^\$<#\[\{\n\r\t ]+/, { token: "source" }]
639
+ ],
640
+ // <STRING_LITERAL :
641
+ // (
642
+ // "\""
643
+ // ((~["\"", "\\"]) | <ESCAPED_CHAR>)*
644
+ // "\""
645
+ // )
646
+ // |
647
+ // (
648
+ // "'"
649
+ // ((~["'", "\\"]) | <ESCAPED_CHAR>)*
650
+ // "'"
651
+ // )
652
+ // >
653
+ [s("string_single_token__id__")]: [
654
+ [/[^'\\]/, { token: "string" }],
655
+ [/@escapedChar/, { token: "string.escape" }],
656
+ [/'/, { token: "string", next: "@pop" }]
657
+ ],
658
+ [s("string_double_token__id__")]: [
659
+ [/[^"\\]/, { token: "string" }],
660
+ [/@escapedChar/, { token: "string.escape" }],
661
+ [/"/, { token: "string", next: "@pop" }]
662
+ ],
663
+ // <RAW_STRING : "r" (("\"" (~["\""])* "\"") | ("'" (~["'"])* "'"))>
664
+ [s("string_single_raw_token__id__")]: [
665
+ [/[^']+/, { token: "string.raw" }],
666
+ [/'/, { token: "string.raw", next: "@pop" }]
667
+ ],
668
+ [s("string_double_raw_token__id__")]: [
669
+ [/[^"]+/, { token: "string.raw" }],
670
+ [/"/, { token: "string.raw", next: "@pop" }]
671
+ ],
672
+ // <FM_EXPRESSION, IN_PAREN, NO_SPACE_EXPRESSION, NAMED_PARAMETER_EXPRESSION> TOKEN :
673
+ [s("expression_token__id__")]: [
674
+ // Strings
675
+ [
676
+ /(r?)(['"])/,
677
+ {
678
+ cases: {
679
+ "r'": [
680
+ { token: "keyword" },
681
+ { token: "string.raw", next: s("@rawSingleString__id__") }
682
+ ],
683
+ 'r"': [
684
+ { token: "keyword" },
685
+ { token: "string.raw", next: s("@rawDoubleString__id__") }
686
+ ],
687
+ "'": [{ token: "source" }, { token: "string", next: s("@singleString__id__") }],
688
+ '"': [{ token: "source" }, { token: "string", next: s("@doubleString__id__") }]
689
+ }
690
+ }
691
+ ],
692
+ // Numbers
693
+ // <INTEGER : (["0"-"9"])+>
694
+ // <DECIMAL : <INTEGER> "." <INTEGER>>
695
+ [
696
+ /(?:@integer)(?:\.(?:@integer))?/,
697
+ {
698
+ cases: {
699
+ "(?:@integer)": { token: "number" },
700
+ "@default": { token: "number.float" }
701
+ }
702
+ }
703
+ ],
704
+ // Special hash keys that must not be treated as identifiers
705
+ // after a period, e.g. a.** is accessing the key "**" of a
706
+ [
707
+ /(\.)(@blank*)(@specialHashKeys)/,
708
+ [{ token: "delimiter" }, { token: "" }, { token: "identifier" }]
709
+ ],
710
+ // Symbols / operators
711
+ [
712
+ /(?:@namedSymbols)/,
713
+ {
714
+ cases: {
715
+ "@arrows": { token: "meta.arrow" },
716
+ "@delimiters": { token: "delimiter" },
717
+ "@default": { token: "operators" }
718
+ }
719
+ }
720
+ ],
721
+ // Identifiers
722
+ [
723
+ /@id/,
724
+ {
725
+ cases: {
726
+ "@keywords": { token: "keyword.$0" },
727
+ "@stringOperators": { token: "operators" },
728
+ "@default": { token: "identifier" }
729
+ }
730
+ }
731
+ ],
732
+ // <OPEN_BRACKET : "[">
733
+ // <CLOSE_BRACKET : "]">
734
+ // <OPEN_PAREN : "(">
735
+ // <CLOSE_PAREN : ")">
736
+ // <OPENING_CURLY_BRACKET : "{">
737
+ // <CLOSING_CURLY_BRACKET : "}">
738
+ [
739
+ /[\[\]\(\)\{\}]/,
740
+ {
741
+ cases: {
742
+ "\\[": {
743
+ cases: {
744
+ "$S2==gt": { token: "@brackets", next: s("@inParen__id__.gt") },
745
+ "@default": { token: "@brackets", next: s("@inParen__id__.plain") }
746
+ }
747
+ },
748
+ "\\]": {
749
+ cases: {
750
+ ...is.id === "bracket" ? {
751
+ "$S2==interpolation": { token: "@brackets.interpolation", next: "@popall" }
752
+ } : {},
753
+ // This cannot happen while in auto mode, since this applies only to an
754
+ // fmExpression inside a directive. But once we encounter the start of a
755
+ // directive, we can establish the tag syntax mode.
756
+ ...ts.id === "bracket" ? {
757
+ "$S2==directive": { token: "@brackets.directive", next: "@popall" }
758
+ } : {},
759
+ // Ignore mismatched paren
760
+ [s("$S1==inParen__id__")]: { token: "@brackets", next: "@pop" },
761
+ "@default": { token: "@brackets" }
762
+ }
763
+ },
764
+ "\\(": { token: "@brackets", next: s("@inParen__id__.gt") },
765
+ "\\)": {
766
+ cases: {
767
+ [s("$S1==inParen__id__")]: { token: "@brackets", next: "@pop" },
768
+ "@default": { token: "@brackets" }
769
+ }
770
+ },
771
+ "\\{": {
772
+ cases: {
773
+ "$S2==gt": { token: "@brackets", next: s("@inParen__id__.gt") },
774
+ "@default": { token: "@brackets", next: s("@inParen__id__.plain") }
775
+ }
776
+ },
777
+ "\\}": {
778
+ cases: {
779
+ ...is.id === "bracket" ? {} : {
780
+ "$S2==interpolation": { token: "@brackets.interpolation", next: "@popall" }
781
+ },
782
+ // Ignore mismatched paren
783
+ [s("$S1==inParen__id__")]: { token: "@brackets", next: "@pop" },
784
+ "@default": { token: "@brackets" }
785
+ }
786
+ }
787
+ }
788
+ }
789
+ ],
790
+ // <OPEN_MISPLACED_INTERPOLATION : "${" | "#{" | "[=">
791
+ [/\$\{/, { token: "delimiter.invalid" }]
792
+ ],
793
+ // <FM_EXPRESSION, IN_PAREN, NAMED_PARAMETER_EXPRESSION> SKIP :
794
+ [s("blank_and_expression_comment_token__id__")]: [
795
+ // < ( " " | "\t" | "\n" | "\r" )+ >
796
+ [/(?:@blank)+/, { token: "" }],
797
+ // < ("<" | "[") ("#" | "!") "--"> : EXPRESSION_COMMENT
798
+ [/[<\[][#!]--/, { token: "comment", next: s("@expressionComment__id__") }]
799
+ ],
800
+ // <FM_EXPRESSION, NO_SPACE_EXPRESSION, NAMED_PARAMETER_EXPRESSION> TOKEN :
801
+ [s("directive_end_token__id__")]: [
802
+ // <DIRECTIVE_END : ">">
803
+ // {
804
+ // if (inFTLHeader) {
805
+ // eatNewline();
806
+ // inFTLHeader = false;
807
+ // }
808
+ // if (squBracTagSyntax || postInterpolationLexState != -1 /* We are in an interpolation */) {
809
+ // matchedToken.kind = NATURAL_GT;
810
+ // } else {
811
+ // SwitchTo(DEFAULT);
812
+ // }
813
+ // }
814
+ // This cannot happen while in auto mode, since this applies only to an
815
+ // fmExpression inside a directive. But once we encounter the start of a
816
+ // directive, we can establish the tag syntax mode.
817
+ [
818
+ />/,
819
+ ts.id === "bracket" ? { token: "operators" } : { token: "@brackets.directive", next: "@popall" }
820
+ ],
821
+ // <EMPTY_DIRECTIVE_END : "/>" | "/]">
822
+ // It is a syntax error to end a tag with the wrong close token
823
+ // Let's indicate that to the user by not closing the tag
824
+ [
825
+ r(/(\/)(@close__id__)/),
826
+ [{ token: "delimiter.directive" }, { token: "@brackets.directive", next: "@popall" }]
827
+ ]
828
+ ],
829
+ // <IN_PAREN> TOKEN :
830
+ [s("greater_operators_token__id__")]: [
831
+ // <NATURAL_GT : ">">
832
+ [/>/, { token: "operators" }],
833
+ // <NATURAL_GTE : ">=">
834
+ [/>=/, { token: "operators" }]
835
+ ],
836
+ // <NO_SPACE_EXPRESSION> TOKEN :
837
+ [s("no_space_expression_end_token__id__")]: [
838
+ // <TERMINATING_WHITESPACE : (["\n", "\r", "\t", " "])+> : FM_EXPRESSION
839
+ [/(?:@blank)+/, { token: "", switchTo: s("@fmExpression__id__.directive") }]
840
+ ],
841
+ [s("unified_call_token__id__")]: [
842
+ // Special case for a call where the expression is just an ID
843
+ // <UNIFIED_CALL> <ID> <BLANK>+
844
+ [
845
+ /(@id)((?:@blank)+)/,
846
+ [{ token: "tag" }, { token: "", next: s("@fmExpression__id__.directive") }]
847
+ ],
848
+ [
849
+ r(/(@id)(\/?)(@close__id__)/),
850
+ [
851
+ { token: "tag" },
852
+ { token: "delimiter.directive" },
853
+ { token: "@brackets.directive", next: "@popall" }
854
+ ]
855
+ ],
856
+ [/./, { token: "@rematch", next: s("@noSpaceExpression__id__") }]
857
+ ],
858
+ // <NO_PARSE> TOKEN :
859
+ [s("no_parse_token__id__")]: [
860
+ // <MAYBE_END :
861
+ // ("<" | "[")
862
+ // "/"
863
+ // ("#")?
864
+ // (["a"-"z", "A"-"Z"])+
865
+ // ( " " | "\t" | "\n" | "\r" )*
866
+ // (">" | "]")
867
+ // >
868
+ [
869
+ r(/(@open__id__)(\/#?)([a-zA-Z]+)((?:@blank)*)(@close__id__)/),
870
+ {
871
+ cases: {
872
+ "$S2==$3": [
873
+ { token: "@brackets.directive" },
874
+ { token: "delimiter.directive" },
875
+ { token: "tag" },
876
+ { token: "" },
877
+ { token: "@brackets.directive", next: "@popall" }
878
+ ],
879
+ "$S2==comment": [
880
+ { token: "comment" },
881
+ { token: "comment" },
882
+ { token: "comment" },
883
+ { token: "comment" },
884
+ { token: "comment" }
885
+ ],
886
+ "@default": [
887
+ { token: "source" },
888
+ { token: "source" },
889
+ { token: "source" },
890
+ { token: "source" },
891
+ { token: "source" }
892
+ ]
893
+ }
894
+ }
895
+ ],
896
+ // <KEEP_GOING : (~["<", "[", "-"])+>
897
+ // <LONE_LESS_THAN_OR_DASH : ["<", "[", "-"]>
898
+ [
899
+ /[^<\[\-]+|[<\[\-]/,
900
+ {
901
+ cases: {
902
+ "$S2==comment": { token: "comment" },
903
+ "@default": { token: "source" }
904
+ }
905
+ }
906
+ ]
907
+ ],
908
+ // <EXPRESSION_COMMENT> SKIP:
909
+ [s("expression_comment_token__id__")]: [
910
+ // < "-->" | "--]">
911
+ [
912
+ /--[>\]]/,
913
+ {
914
+ token: "comment",
915
+ next: "@pop"
916
+ }
917
+ ],
918
+ // < (~["-", ">", "]"])+ >
919
+ // < ">">
920
+ // < "]">
921
+ // < "-">
922
+ [/[^\->\]]+|[>\]\-]/, { token: "comment" }]
923
+ ],
924
+ [s("terse_comment_token__id__")]: [
925
+ // <TERSE_COMMENT_END : "-->" | "--]">
926
+ [r(/--(?:@close__id__)/), { token: "comment", next: "@popall" }],
927
+ // <KEEP_GOING : (~["<", "[", "-"])+>
928
+ // <LONE_LESS_THAN_OR_DASH : ["<", "[", "-"]>
929
+ [/[^<\[\-]+|[<\[\-]/, { token: "comment" }]
930
+ ]
931
+ }
932
+ };
933
+ }
934
+ function createMonarchLanguageAuto(is) {
935
+ const angle = createMonarchLanguage(TagSyntaxAngle, is);
936
+ const bracket = createMonarchLanguage(TagSyntaxBracket, is);
937
+ const auto = createMonarchLanguage(TagSyntaxAuto, is);
938
+ return {
939
+ // Angle and bracket syntax mode
940
+ // We switch to one of these once we have determined the mode
941
+ ...angle,
942
+ ...bracket,
943
+ ...auto,
944
+ // Settings
945
+ unicode: true,
946
+ includeLF: false,
947
+ start: `default_auto_${is.id}`,
948
+ ignoreCase: false,
949
+ defaultToken: "invalid",
950
+ tokenPostfix: `.freemarker2`,
951
+ brackets: [
952
+ { open: "{", close: "}", token: "delimiter.curly" },
953
+ { open: "[", close: "]", token: "delimiter.square" },
954
+ { open: "(", close: ")", token: "delimiter.parenthesis" },
955
+ { open: "<", close: ">", token: "delimiter.angle" }
956
+ ],
957
+ tokenizer: {
958
+ ...angle.tokenizer,
959
+ ...bracket.tokenizer,
960
+ ...auto.tokenizer
961
+ }
962
+ };
963
+ }
964
+ const TagAngleInterpolationDollar = {
965
+ conf: createLangConfiguration(TagSyntaxAngle),
966
+ language: createMonarchLanguage(TagSyntaxAngle, InterpolationSyntaxDollar)
967
+ };
968
+ const TagBracketInterpolationDollar = {
969
+ conf: createLangConfiguration(TagSyntaxBracket),
970
+ language: createMonarchLanguage(TagSyntaxBracket, InterpolationSyntaxDollar)
971
+ };
972
+ const TagAngleInterpolationBracket = {
973
+ conf: createLangConfiguration(TagSyntaxAngle),
974
+ language: createMonarchLanguage(TagSyntaxAngle, InterpolationSyntaxBracket)
975
+ };
976
+ const TagBracketInterpolationBracket = {
977
+ conf: createLangConfiguration(TagSyntaxBracket),
978
+ language: createMonarchLanguage(TagSyntaxBracket, InterpolationSyntaxBracket)
979
+ };
980
+ const TagAutoInterpolationDollar = {
981
+ conf: createLangConfigurationAuto(),
982
+ language: createMonarchLanguageAuto(InterpolationSyntaxDollar)
983
+ };
984
+ const TagAutoInterpolationBracket = {
985
+ conf: createLangConfigurationAuto(),
986
+ language: createMonarchLanguageAuto(InterpolationSyntaxBracket)
987
+ };
988
+ export {
989
+ TagAngleInterpolationBracket,
990
+ TagAngleInterpolationDollar,
991
+ TagAutoInterpolationBracket,
992
+ TagAutoInterpolationDollar,
993
+ TagBracketInterpolationBracket,
994
+ TagBracketInterpolationDollar
995
+ };