4 * @version 2.0.1 (2010-02-08)
5 * @author Mads Lie Jensen
6 * @author Rowan Collins
7 * Improved Smarty highlighting mode, based on http://www.palustris.dk/jedit/smarty.xml
8 * and the built-in PHP mode from jEdit 4.3
9 * @link http://rwec.co.uk/jedit for documentation and updates
12 To install, add this to the "catalog" file:
13 <MODE NAME="smarty" FILE="smarty.xml" FILE_NAME_GLOB="*.tpl"></MODE>
15 You might want to execute these lines of BeanShell code (e.g. with the Utilities->BeanShell menu):
17 jEdit.setProperty("mode.smarty.sidekick.parser","html");
18 jEdit.setProperty("mode.smarty.xml.completion-info",
19 "jeditresource:/XML.jar!/xml/completion/html-complete.xml");
21 to get tag-completion/matching on html in the templates-files if you have the XML-plugin installed
24 <!DOCTYPE MODE SYSTEM "xmode.dtd">
27 <PROPERTY NAME="commentStart" VALUE="{*" />
28 <PROPERTY NAME="commentEnd" VALUE="*}" />
31 <RULES IGNORE_CASE="TRUE" HIGHLIGHT_DIGITS="FALSE">
32 <SPAN TYPE="COMMENT1">
37 <!-- Highlight markup other than Smarty inside a {literal} block -->
38 <SPAN TYPE="LITERAL3" DELEGATE="NON_SMARTY">
39 <BEGIN>{LITERAL}</BEGIN>
43 <SPAN TYPE="MARKUP" DELEGATE="php::PHP" MATCH_TYPE="FUNCTION">
48 <SPAN TYPE="MARKUP" DELEGATE="SMARTY">
54 <SPAN TYPE="COMMENT1" DELEGATE="COMMENT1+SMARTY">
55 <BEGIN><!--</BEGIN>
60 <SPAN TYPE="MARKUP" DELEGATE="JAVASCRIPT_OPENTAG">
61 <BEGIN><SCRIPT</BEGIN>
62 <END></SCRIPT></END>
66 <SPAN TYPE="MARKUP" DELEGATE="CSS_OPENTAG">
67 <BEGIN><STYLE</BEGIN>
68 <END></STYLE></END>
72 <SEQ_REGEXP HASH_CHAR="<" TYPE="MARKUP" DELEGATE="TAGS"></?\w+</SEQ_REGEXP>
74 <IMPORT DELEGATE="NON_SMARTY" />
77 <RULES SET="NON_SMARTY" IGNORE_CASE="TRUE" HIGHLIGHT_DIGITS="FALSE">
80 <SPAN TYPE="COMMENT1">
81 <BEGIN><!--</BEGIN>
85 <!-- DTD instructions -->
86 <SPAN TYPE="KEYWORD2" DELEGATE="xml::DTD-TAGS">
92 <SPAN_REGEXP HASH_CHAR="<SCRIPT" TYPE="MARKUP" DELEGATE="javascript::MAIN">
93 <BEGIN><SCRIPT.*?></BEGIN>
94 <END></SCRIPT></END>
98 <SPAN_REGEXP HASH_CHAR="<STYLE" TYPE="MARKUP" DELEGATE="css::MAIN">
99 <BEGIN><STYLE.*?></BEGIN>
100 <END></STYLE></END>
104 <SEQ_REGEXP HASH_CHAR="<" TYPE="MARKUP" DELEGATE="html::TAGS"></?\w+</SEQ_REGEXP>
106 <!-- SGML entities -->
107 <SPAN TYPE="LITERAL2" NO_WORD_BREAK="TRUE">
114 <!-- HTML tags (from MAIN rule) -->
115 <RULES SET="TAGS" DEFAULT="MARKUP" ESCAPE="\">
116 <SEQ TYPE="MARKUP" DELEGATE="MAIN">></SEQ><!-- from SEQ_REGEXP delegate -->
118 <SPAN_REGEXP AT_WORD_START="TRUE" TYPE="MARKUP" DELEGATE="CSS_PROPERTIES+SMARTY" HASH_CHAR="style">
119 <BEGIN>style\s*=\s*(["'])</BEGIN>
123 <IMPORT DELEGATE="TO_LITERAL+SMARTY" />
124 <IMPORT DELEGATE="TO_SMARTY" />
125 <IMPORT DELEGATE="INVALID_LT" />
126 <IMPORT DELEGATE="html::TAGS" />
129 <!-- Handle literals, but allow switching to SMARTY therein, e.g. from html TAGS -->
130 <RULES SET="TO_LITERAL+SMARTY">
131 <SPAN TYPE="LITERAL1" DELEGATE="LITERAL1+SMARTY">
135 <SPAN TYPE="LITERAL2" DELEGATE="LITERAL2+SMARTY">
139 <IMPORT DELEGATE="TO_SMARTY"/>
142 <!-- Handle SMARTY tags in LITERAL1, e.g. in the "type" attribute of a <SCRIPT> tag -->
143 <RULES SET="LITERAL1+SMARTY" DEFAULT="LITERAL1" ESCAPE="\">
144 <IMPORT DELEGATE="TO_SMARTY"/>
147 <!-- Handle SMARTY tags in LITERAL2, e.g. in the "type" attribute of a <SCRIPT> tag -->
148 <RULES SET="LITERAL2+SMARTY" DEFAULT="LITERAL2" ESCAPE="\">
149 <IMPORT DELEGATE="TO_SMARTY"/>
152 <!-- Handle Smarty tags in HTML comments -->
153 <RULES SET="COMMENT1+SMARTY" DEFAULT="COMMENT1">
154 <IMPORT DELEGATE="TO_SMARTY"/>
157 <!-- Go to SMARTY mode again -->
158 <RULES SET="TO_SMARTY" DEFAULT="MARKUP">
159 <SPAN TYPE="MARKUP" DELEGATE="SMARTY">
165 <RULES SET="INVALID_LT" DEFAULT="INVALID">
166 <SEQ TYPE="INVALID"><</SEQ>
171 <!-- CSS where SMARTY code may be injected -->
172 <RULES SET="CSS_OPENTAG" DEFAULT="MARKUP">
173 <SEQ TYPE="MARKUP" DELEGATE="CSS+SMARTY">></SEQ>
175 <IMPORT DELEGATE="TO_LITERAL+SMARTY"/>
178 <RULES SET="CSS+SMARTY" DEFAULT="MARKUP">
179 <!-- Hacky support for highlighting of CSS not inside a {literal} block -->
180 <SPAN TYPE="FUNCTION" DELEGATE="CSS_PROPERTIES+SMARTY">
181 <BEGIN>{ldelim}</BEGIN>
184 <SPAN TYPE="KEYWORD3" DELEGATE="CSS_PROPERTIES+SMARTY">
185 <BEGIN>{$smarty.ldelim}</BEGIN>
186 <END>{$smarty.rdelim}</END>
189 <SEQ TYPE="OPERATOR" DELEGATE="CSS_PSEUDO">:</SEQ>
191 <IMPORT DELEGATE="TO_SMARTY"/>
192 <IMPORT DELEGATE="css::MAIN"/>
194 <RULES SET="CSS_PROPERTIES+SMARTY" ESCAPE="\">
195 <SEQ TYPE="OPERATOR" DELEGATE="CSS_PROP_VALUE+SMARTY">:</SEQ>
197 <IMPORT DELEGATE="TO_SMARTY"/>
198 <IMPORT DELEGATE="css::PROPERTIES"/>
200 <RULES SET="CSS_PROP_VALUE+SMARTY"
201 HIGHLIGHT_DIGITS="TRUE"
202 DIGIT_RE="-?\d+(\.\d+)?(pt|pc|in|mm|cm|em|ex|px|ms|s|%|)"
205 <SEQ TYPE="OPERATOR" DELEGATE="CSS_PROPERTIES+SMARTY">;</SEQ>
206 <SEQ TYPE="INVALID" DELEGATE="CSS+SMARTY">}</SEQ> <!-- end properties block, but it's invalid -->
208 <IMPORT DELEGATE="TO_SMARTY"/>
209 <IMPORT DELEGATE="css::PROP_VALUE"/>
211 <!-- Pseudo-classes like ":active" are handled specially in the CSS mode -->
212 <RULES SET="CSS_PSEUDO">
213 <SEQ TYPE="NULL" DELEGATE="CSS+SMARTY"> </SEQ>
214 <SEQ TYPE="OPERATOR" DELEGATE="CSS+SMARTY">,</SEQ>
216 <SPAN TYPE="FUNCTION" DELEGATE="CSS_PROPERTIES+SMARTY">
217 <BEGIN>{ldelim}</BEGIN>
220 <SPAN TYPE="KEYWORD3" DELEGATE="CSS_PROPERTIES+SMARTY">
221 <BEGIN>{$smarty.ldelim}</BEGIN>
222 <END>{$smarty.rdelim}</END>
225 <IMPORT DELEGATE="TO_SMARTY"/>
226 <IMPORT DELEGATE="css::PSEUDO"/>
230 <RULES SET="JAVASCRIPT_OPENTAG" DEFAULT="MARKUP">
231 <SEQ TYPE="MARKUP" DELEGATE="JAVASCRIPT">></SEQ>
232 <IMPORT DELEGATE="TO_LITERAL+SMARTY"/> <!-- handle SMARTY in <script> tag -->
233 <IMPORT DELEGATE="html::TAGS" /> <!-- handle e.g. 'style="width:1px"' -->
236 <RULES SET="JAVASCRIPT" DEFAULT="MARKUP" ESCAPE="\">
237 <IMPORT DELEGATE="TO_LITERAL+SMARTY"/>
238 <IMPORT DELEGATE="TO_SMARTY"/>
239 <IMPORT DELEGATE="javascript::MAIN"/>
244 <RULES DEFAULT="LITERAL2" SET="DOUBLE_QUOTED" IGNORE_CASE="TRUE">
245 <SPAN TYPE="LITERAL2" DELEGATE="BACK_TICKED">
250 <IMPORT DELEGATE="VARIABLES" />
253 <RULES DEFAULT="LITERAL2" SET="BACK_TICKED" IGNORE_CASE="TRUE">
254 <IMPORT DELEGATE="VARIABLES" />
255 <IMPORT DELEGATE="MATH_OPERATORS" />
259 <RULES SET="VARIABLES">
260 <MARK_FOLLOWING TYPE="KEYWORD3">$</MARK_FOLLOWING>
263 <RULES SET="MATH_OPERATORS" IGNORE_CASE="TRUE">
264 <SEQ TYPE="OPERATOR">.</SEQ>
265 <SEQ TYPE="OPERATOR">-></SEQ>
266 <SEQ TYPE="OPERATOR">*</SEQ>
267 <SEQ TYPE="OPERATOR">/</SEQ>
268 <SEQ TYPE="OPERATOR">+</SEQ>
269 <SEQ TYPE="OPERATOR">-</SEQ>
270 <SEQ TYPE="OPERATOR">%</SEQ>
273 <RULES SET="LOGIC_OPERATORS" IGNORE_CASE="TRUE">
274 <SEQ TYPE="OPERATOR">|</SEQ>
275 <SEQ TYPE="OPERATOR">:</SEQ>
276 <SEQ TYPE="OPERATOR">=</SEQ>
279 <OPERATOR>!=</OPERATOR>
280 <OPERATOR>></OPERATOR>
281 <OPERATOR>>=</OPERATOR>
282 <OPERATOR><</OPERATOR>
283 <OPERATOR><=</OPERATOR>
285 <OPERATOR>==</OPERATOR>
287 <OPERATOR>div by </OPERATOR>
288 <OPERATOR>even by </OPERATOR>
289 <OPERATOR>is even </OPERATOR>
290 <OPERATOR>is not even </OPERATOR>
291 <OPERATOR>is not odd </OPERATOR>
292 <OPERATOR>is odd </OPERATOR>
293 <OPERATOR>odd by </OPERATOR>
295 <OPERATOR>eq</OPERATOR>
296 <OPERATOR>ge</OPERATOR>
297 <OPERATOR>gt</OPERATOR>
298 <OPERATOR>gte</OPERATOR>
299 <OPERATOR>le</OPERATOR>
300 <OPERATOR>lt</OPERATOR>
301 <OPERATOR>lte</OPERATOR>
302 <OPERATOR>mod</OPERATOR>
303 <OPERATOR>ne</OPERATOR>
304 <OPERATOR>neq</OPERATOR>
305 <OPERATOR>not</OPERATOR>
310 <RULES SET="SMARTY" IGNORE_CASE="TRUE" HIGHLIGHT_DIGITS="TRUE" DEFAULT="LITERAL1">
311 <SPAN TYPE="LITERAL1">
316 <SPAN TYPE="LITERAL2" DELEGATE="DOUBLE_QUOTED">
321 <!-- Variables from config-files -->
322 <SPAN TYPE="KEYWORD3">
327 <IMPORT DELEGATE="VARIABLES" />
328 <IMPORT DELEGATE="MATH_OPERATORS" />
329 <IMPORT DELEGATE="LOGIC_OPERATORS" />
333 <!-- Built-in functions (in order of documentation) -->
334 <FUNCTION>capture</FUNCTION>
335 <FUNCTION>/capture</FUNCTION>
336 <FUNCTION>config_load</FUNCTION>
337 <FUNCTION>foreach</FUNCTION>
338 <FUNCTION>foreachelse</FUNCTION>
339 <FUNCTION>/foreach</FUNCTION>
340 <FUNCTION>if</FUNCTION>
341 <FUNCTION>else</FUNCTION>
342 <FUNCTION>elseif</FUNCTION>
343 <FUNCTION>/if</FUNCTION>
344 <FUNCTION>include</FUNCTION>
345 <FUNCTION>include_php</FUNCTION>
346 <FUNCTION>insert</FUNCTION>
347 <FUNCTION>ldelim</FUNCTION>
348 <FUNCTION>rdelim</FUNCTION>
349 <!-- {literal} is handled specially -->
350 <!-- {php} is handled specially -->
351 <FUNCTION>section</FUNCTION>
352 <FUNCTION>sectionelse</FUNCTION>
353 <FUNCTION>/section</FUNCTION>
354 <FUNCTION>strip</FUNCTION>
355 <FUNCTION>/strip</FUNCTION>
357 <!-- Default custom functions -->
358 <FUNCTION>assign</FUNCTION>
359 <FUNCTION>counter</FUNCTION>
360 <FUNCTION>cycle</FUNCTION>
361 <FUNCTION>debug</FUNCTION>
362 <FUNCTION>eval</FUNCTION>
363 <FUNCTION>fetch</FUNCTION>
364 <FUNCTION>html_checkboxes</FUNCTION>
365 <FUNCTION>html_image</FUNCTION>
366 <FUNCTION>html_options</FUNCTION>
367 <FUNCTION>html_radios</FUNCTION>
368 <FUNCTION>html_select_date</FUNCTION>
369 <FUNCTION>html_select_time</FUNCTION>
370 <FUNCTION>html_table</FUNCTION>
371 <FUNCTION>mailto</FUNCTION>
372 <FUNCTION>math</FUNCTION>
373 <FUNCTION>popup</FUNCTION>
374 <FUNCTION>popup_init</FUNCTION>
375 <FUNCTION>textformat</FUNCTION>
376 <FUNCTION>/textformat</FUNCTION>
380 'strip' is used in Smarty as both a variable modifier and a function.
381 I have them listed as both, but it will only be recognised as one of these possibilities.
382 At time of writing this is the last entry, ie. a KEYWORD1
384 <KEYWORD1>capitalize</KEYWORD1>
385 <KEYWORD1>cat</KEYWORD1>
386 <KEYWORD1>count_characters</KEYWORD1>
387 <KEYWORD1>count_paragraphs</KEYWORD1>
388 <KEYWORD1>count_sentences</KEYWORD1>
389 <KEYWORD1>count_words</KEYWORD1>
390 <KEYWORD1>date_format</KEYWORD1>
391 <KEYWORD1>default</KEYWORD1>
392 <KEYWORD1>escape</KEYWORD1>
393 <KEYWORD1>indent</KEYWORD1>
394 <KEYWORD1>lower</KEYWORD1>
395 <KEYWORD1>nl2br</KEYWORD1>
396 <KEYWORD1>regex_replace</KEYWORD1>
397 <KEYWORD1>replace</KEYWORD1>
398 <KEYWORD1>spacify</KEYWORD1>
399 <KEYWORD1>string_format</KEYWORD1>
400 <KEYWORD1>strip</KEYWORD1>
401 <KEYWORD1>strip_tags</KEYWORD1>
402 <KEYWORD1>truncate</KEYWORD1>
403 <KEYWORD1>upper</KEYWORD1>
404 <KEYWORD1>wordwrap</KEYWORD1>
406 <!-- attributes for Smarty built-in and custom functions -->
407 <KEYWORD3>above</KEYWORD3>
408 <KEYWORD3>advance</KEYWORD3>
409 <KEYWORD3>all_extra</KEYWORD3>
410 <KEYWORD3>assign</KEYWORD3>
411 <KEYWORD3>autostatus</KEYWORD3>
412 <KEYWORD3>autostatuscap</KEYWORD3>
413 <KEYWORD3>background</KEYWORD3>
414 <KEYWORD3>below</KEYWORD3>
415 <KEYWORD3>bgbackground</KEYWORD3>
416 <KEYWORD3>bgcolor</KEYWORD3>
417 <KEYWORD3>border</KEYWORD3>
418 <KEYWORD3>caparray</KEYWORD3>
419 <KEYWORD3>capcolor</KEYWORD3>
420 <KEYWORD3>capicon</KEYWORD3>
421 <KEYWORD3>caption</KEYWORD3>
422 <KEYWORD3>captionfont</KEYWORD3>
423 <KEYWORD3>captionsize</KEYWORD3>
424 <KEYWORD3>center</KEYWORD3>
425 <KEYWORD3>closecolor</KEYWORD3>
426 <KEYWORD3>closefont</KEYWORD3>
427 <KEYWORD3>closesize</KEYWORD3>
428 <KEYWORD3>closetext</KEYWORD3>
429 <KEYWORD3>day_extra</KEYWORD3>
430 <KEYWORD3>day_format</KEYWORD3>
431 <KEYWORD3>day_size</KEYWORD3>
432 <KEYWORD3>delay</KEYWORD3>
433 <KEYWORD3>delimiter</KEYWORD3>
434 <KEYWORD3>direction</KEYWORD3>
435 <KEYWORD3>display_days</KEYWORD3>
436 <KEYWORD3>display_hours</KEYWORD3>
437 <KEYWORD3>display_meridian</KEYWORD3>
438 <KEYWORD3>display_minutes</KEYWORD3>
439 <KEYWORD3>display_months</KEYWORD3>
440 <KEYWORD3>display_seconds</KEYWORD3>
441 <KEYWORD3>display_years</KEYWORD3>
442 <KEYWORD3>end_year</KEYWORD3>
443 <KEYWORD3>equation</KEYWORD3>
444 <KEYWORD3>fgbackground</KEYWORD3>
445 <KEYWORD3>fgcolor</KEYWORD3>
446 <KEYWORD3>field_array</KEYWORD3>
447 <KEYWORD3>field_order</KEYWORD3>
448 <KEYWORD3>field_separator</KEYWORD3>
449 <KEYWORD3>file</KEYWORD3>
450 <KEYWORD3>fixx</KEYWORD3>
451 <KEYWORD3>fixy</KEYWORD3>
452 <KEYWORD3>format</KEYWORD3>
453 <KEYWORD3>frame</KEYWORD3>
454 <KEYWORD3>from</KEYWORD3>
455 <KEYWORD3>fullhtml</KEYWORD3>
456 <KEYWORD3>hauto</KEYWORD3>
457 <KEYWORD3>height</KEYWORD3>
458 <KEYWORD3>hour_extra</KEYWORD3>
459 <KEYWORD3>inarray</KEYWORD3>
460 <KEYWORD3>indent</KEYWORD3>
461 <KEYWORD3>indent_char</KEYWORD3>
462 <KEYWORD3>indent_first</KEYWORD3>
463 <KEYWORD3>item</KEYWORD3>
464 <KEYWORD3>key</KEYWORD3>
465 <KEYWORD3>left</KEYWORD3>
466 <KEYWORD3>loop</KEYWORD3>
467 <KEYWORD3>max</KEYWORD3>
468 <KEYWORD3>meridian_extra</KEYWORD3>
469 <KEYWORD3>minute_extra</KEYWORD3>
470 <KEYWORD3>minute_interval</KEYWORD3>
471 <KEYWORD3>month_extra</KEYWORD3>
472 <KEYWORD3>month_format</KEYWORD3>
473 <KEYWORD3>month_size</KEYWORD3>
474 <KEYWORD3>month_value_format</KEYWORD3>
475 <KEYWORD3>name</KEYWORD3>
476 <KEYWORD3>noclose</KEYWORD3>
477 <KEYWORD3>offsetx</KEYWORD3>
478 <KEYWORD3>offsety</KEYWORD3>
479 <KEYWORD3>once</KEYWORD3>
480 <KEYWORD3>options</KEYWORD3>
481 <KEYWORD3>output</KEYWORD3>
482 <KEYWORD3>padx</KEYWORD3>
483 <KEYWORD3>pady</KEYWORD3>
484 <KEYWORD3>prefix</KEYWORD3>
485 <KEYWORD3>print</KEYWORD3>
486 <KEYWORD3>reverse_years</KEYWORD3>
487 <KEYWORD3>right</KEYWORD3>
488 <KEYWORD3>scope</KEYWORD3>
489 <KEYWORD3>script</KEYWORD3>
490 <KEYWORD3>second_extra</KEYWORD3>
491 <KEYWORD3>second_interval</KEYWORD3>
492 <KEYWORD3>section</KEYWORD3>
493 <KEYWORD3>selected</KEYWORD3>
494 <KEYWORD3>show</KEYWORD3>
495 <KEYWORD3>skip</KEYWORD3>
496 <KEYWORD3>snapx</KEYWORD3>
497 <KEYWORD3>snapy</KEYWORD3>
498 <KEYWORD3>start</KEYWORD3>
499 <KEYWORD3>start_year</KEYWORD3>
500 <KEYWORD3>status</KEYWORD3>
501 <KEYWORD3>step</KEYWORD3>
502 <KEYWORD3>sticky</KEYWORD3>
503 <KEYWORD3>stop</KEYWORD3>
504 <KEYWORD3>style</KEYWORD3>
505 <KEYWORD3>text</KEYWORD3>
506 <KEYWORD3>textcolor</KEYWORD3>
507 <KEYWORD3>textfont</KEYWORD3>
508 <KEYWORD3>textsize</KEYWORD3>
509 <KEYWORD3>time</KEYWORD3>
510 <KEYWORD3>timeout</KEYWORD3>
511 <KEYWORD3>trigger</KEYWORD3>
512 <KEYWORD3>use_24_hours</KEYWORD3>
513 <KEYWORD3>value</KEYWORD3>
514 <KEYWORD3>values</KEYWORD3>
515 <KEYWORD3>var</KEYWORD3>
516 <KEYWORD3>vauto</KEYWORD3>
517 <KEYWORD3>width</KEYWORD3>
518 <KEYWORD3>wrap</KEYWORD3>
519 <KEYWORD3>wrap_char</KEYWORD3>
520 <KEYWORD3>wrap_cut</KEYWORD3>
521 <KEYWORD3>year_as_text</KEYWORD3>
522 <KEYWORD3>year_extra</KEYWORD3>
523 <KEYWORD3>year_size</KEYWORD3>