From 8ddb857ba82debed6e5d96ec7cf9e8d707638ab1 Mon Sep 17 00:00:00 2001 From: Kuzin Andrey Date: Tue, 29 Sep 2026 10:48:03 +0300 Subject: [PATCH] syntax: add Jinja2 template syntax highlighting Add jinja2.syntax for Jinja2 templates (*.j2, *.jinja, *.jinja2): {% %} statement and {{ }} expression tag contexts, {# #} and # comments, strings, numbers, operators and literals, with every builtin filter, test and global function colored as a builtin name per https://jinja.palletsprojects.com/en/stable/templates/. Signed-off-by: Kuzin Andrey --- misc/filehighlight.ini | 2 +- misc/syntax/Makefile.am | 1 + misc/syntax/Syntax.in | 3 + misc/syntax/jinja2.syntax | 294 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 299 insertions(+), 1 deletion(-) create mode 100644 misc/syntax/jinja2.syntax diff --git a/misc/filehighlight.ini b/misc/filehighlight.ini index c123b0395..8dddbec22 100644 --- a/misc/filehighlight.ini +++ b/misc/filehighlight.ini @@ -30,7 +30,7 @@ extensions=7z;aab;aar;ace;apk;arc;arj;ark;br;bz2;cab;cpio;ddeb;deb;gz;lha;lz;lz4;lzh;lzma;lzo;rar;rpm;tar;tbz;tbz2;tgz;tlz;txz;tzo;tzst;udeb;vsix;xapk;xz;Z;zip;zoo;zst [doc] - extensions=chm;css;ctl;diz;doc;docm;docx;dtd;fodg;fodp;fods;fodt;htm;html;json;letter;lsm;mail;man;markdown;md;me;mkd;msg;nroff;odg;odp;ods;odt;pdf;po;ppt;pptm;pptx;ps;rtf;sgml;shtml;tex;text;txt;xls;xlsm;xlsx;xml;xsd;xslt + extensions=chm;css;ctl;diz;doc;docm;docx;dtd;fodg;fodp;fods;fodt;htm;html;j2;jinja;jinja2;json;letter;lsm;mail;man;markdown;md;me;mkd;msg;nroff;odg;odp;ods;odt;pdf;po;ppt;pptm;pptx;ps;rtf;sgml;shtml;tex;text;txt;xls;xlsm;xlsx;xml;xsd;xslt [source] extensions=ada;asm;awk;bash;bnf;c;c++;caml;cc;cgi;cpp;cxx;diff;ebnf;erl;go;h;h++;hh;hi;hpp;hs;inc;jasm;jav;java;js;m2;m2o;m4;mak;mib;mjs;ml;mli;mll;mlp;mly;pas;patch;php;phps;pl;pm;prg;py;rb;s;sas;sh;sl;st;swift;tcl;tk;tm;tmo;tsx;xq diff --git a/misc/syntax/Makefile.am b/misc/syntax/Makefile.am index 716fa76b1..26faea41b 100644 --- a/misc/syntax/Makefile.am +++ b/misc/syntax/Makefile.am @@ -49,6 +49,7 @@ SYNTAXFILES = \ j.syntax \ jal.syntax \ java.syntax \ + jinja2.syntax \ js.syntax \ json.syntax \ kotlin.syntax \ diff --git a/misc/syntax/Syntax.in b/misc/syntax/Syntax.in index 12e8809dc..ad71cdb60 100644 --- a/misc/syntax/Syntax.in +++ b/misc/syntax/Syntax.in @@ -303,6 +303,9 @@ include dlink.syntax file ..\*\\.(?i:mib)$ SNMP\sMIB\sFile include mib.syntax +file (?i)\\.j2$|\\.jinja$|\\.jinja2$ Jinja2\sTemplate +include jinja2.syntax + file ..\*\\.(?i:jalt?)$ Jal\ssource include jal.syntax diff --git a/misc/syntax/jinja2.syntax b/misc/syntax/jinja2.syntax new file mode 100644 index 000000000..42729c04d --- /dev/null +++ b/misc/syntax/jinja2.syntax @@ -0,0 +1,294 @@ +# Jinja2 template syntax highlighting +# +# Reference: +# https://jinja.palletsprojects.com/en/stable/templates/ +# +# Highlights the Jinja2 template constructs: +# {{ ... }} output / expression tags +# {% ... %} statement / block tags (if / for / set / block / macro / ...) +# {# ... #} comments +# # ... line comments (typical in config templates) +# "..." '...' strings +# numbers +# and colors every builtin filter, test and global function as a builtin name. + +context default + # numbers in the template body (engine takes the first matching rule at a + # position, so most specific forms go first: decimal+exp, exp, decimal, int) + keyword whole \{0123456789\}\[0123456789\]\.\{0123456789\}\[0123456789\]\{eE\}\{\+-\}\{0123456789\}\[0123456789\] cyan + keyword whole \{0123456789\}\[0123456789\]\.\{0123456789\}\[0123456789\]\{eE\}\{0123456789\}\[0123456789\] cyan + keyword whole \{0123456789\}\[0123456789\]\{eE\}\{\+-\}\{0123456789\}\[0123456789\] cyan + keyword whole \{0123456789\}\[0123456789\]\{eE\}\{0123456789\}\[0123456789\] cyan + keyword whole \{0123456789\}\[0123456789\]\.\{0123456789\}\[0123456789\] cyan + keyword whole \{0123456789\}\[0123456789\] cyan + keyword whole \{0123456789\} cyan + + # jinja2 statement / block tag: {% ... %} + context {% %} brightcyan + # statement keywords + keyword whole if white + keyword whole elif white + keyword whole else white + keyword whole endif white + keyword whole for white + keyword whole endfor white + keyword whole set white + keyword whole endset white + keyword whole macro white + keyword whole endmacro white + keyword whole call white + keyword whole endcall white + keyword whole filter white + keyword whole endfilter white + keyword whole extends white + keyword whole block white + keyword whole endblock white + keyword whole include white + keyword whole import white + keyword whole from white + keyword whole as white + keyword whole raw white + keyword whole endraw white + keyword whole autoescape white + keyword whole endautoescape white + keyword whole scoped white + keyword whole required white + keyword whole recursive white + keyword whole ignore white + keyword whole missing white + keyword whole with white + keyword whole without white + keyword whole context white + + # operators + keyword whole and brightmagenta + keyword whole or brightmagenta + keyword whole not brightmagenta + keyword whole in brightmagenta + keyword whole is brightmagenta + + # literals + keyword whole true magenta + keyword whole false magenta + keyword whole none magenta + + # pipe (filter separator) + keyword | brightmagenta + + # builtin filters + keyword whole abs brightgreen + keyword whole attr brightgreen + keyword whole batch brightgreen + keyword whole capitalize brightgreen + keyword whole center brightgreen + keyword whole default brightgreen + keyword whole dictsort brightgreen + keyword whole escape brightgreen + keyword whole filesizeformat brightgreen + keyword whole first brightgreen + keyword whole float brightgreen + keyword whole forceescape brightgreen + keyword whole format brightgreen + keyword whole groupby brightgreen + keyword whole indent brightgreen + keyword whole int brightgreen + keyword whole items brightgreen + keyword whole join brightgreen + keyword whole last brightgreen + keyword whole length brightgreen + keyword whole list brightgreen + keyword whole lower brightgreen + keyword whole map brightgreen + keyword whole max brightgreen + keyword whole min brightgreen + keyword whole pprint brightgreen + keyword whole random brightgreen + keyword whole reject brightgreen + keyword whole rejectattr brightgreen + keyword whole replace brightgreen + keyword whole reverse brightgreen + keyword whole round brightgreen + keyword whole safe brightgreen + keyword whole select brightgreen + keyword whole selectattr brightgreen + keyword whole slice brightgreen + keyword whole sort brightgreen + keyword whole string brightgreen + keyword whole striptags brightgreen + keyword whole sum brightgreen + keyword whole title brightgreen + keyword whole tojson brightgreen + keyword whole trim brightgreen + keyword whole truncate brightgreen + keyword whole unique brightgreen + keyword whole upper brightgreen + keyword whole urlencode brightgreen + keyword whole urlize brightgreen + keyword whole wordcount brightgreen + keyword whole wordwrap brightgreen + keyword whole xmlattr brightgreen + + # builtin tests + keyword whole boolean yellow + keyword whole callable yellow + keyword whole defined yellow + keyword whole divisibleby yellow + keyword whole eq yellow + keyword whole escaped yellow + keyword whole even yellow + keyword whole ge yellow + keyword whole gt yellow + keyword whole integer yellow + keyword whole iterable yellow + keyword whole le yellow + keyword whole lt yellow + keyword whole mapping yellow + keyword whole ne yellow + keyword whole number yellow + keyword whole odd yellow + keyword whole sameas yellow + keyword whole sequence yellow + keyword whole test yellow + keyword whole undefined yellow + + # builtin global functions + keyword whole cycler brightblue + keyword whole dict brightblue + keyword whole joiner brightblue + keyword whole lipsum brightblue + keyword whole namespace brightblue + keyword whole range brightblue + + # numbers (most specific first, see note in default context) + keyword whole \{0123456789\}\[0123456789\]\.\{0123456789\}\[0123456789\]\{eE\}\{\+-\}\{0123456789\}\[0123456789\] cyan + keyword whole \{0123456789\}\[0123456789\]\.\{0123456789\}\[0123456789\]\{eE\}\{0123456789\}\[0123456789\] cyan + keyword whole \{0123456789\}\[0123456789\]\{eE\}\{\+-\}\{0123456789\}\[0123456789\] cyan + keyword whole \{0123456789\}\[0123456789\]\{eE\}\{0123456789\}\[0123456789\] cyan + keyword whole \{0123456789\}\[0123456789\]\.\{0123456789\}\[0123456789\] cyan + keyword whole \{0123456789\}\[0123456789\] cyan + keyword whole \{0123456789\} cyan + + # jinja2 expression tag: {{ ... }} + context {{ }} brightred + # operators (incl. inline if-expression) + keyword whole and brightmagenta + keyword whole or brightmagenta + keyword whole not brightmagenta + keyword whole in brightmagenta + keyword whole is brightmagenta + keyword whole if brightgreen + keyword whole else brightgreen + + # literals + keyword whole true magenta + keyword whole false magenta + keyword whole none magenta + + # pipe (filter separator) + keyword | brightmagenta + + # builtin filters + keyword whole abs brightgreen + keyword whole attr brightgreen + keyword whole batch brightgreen + keyword whole capitalize brightgreen + keyword whole center brightgreen + keyword whole default brightgreen + keyword whole dictsort brightgreen + keyword whole escape brightgreen + keyword whole filesizeformat brightgreen + keyword whole first brightgreen + keyword whole float brightgreen + keyword whole forceescape brightgreen + keyword whole format brightgreen + keyword whole groupby brightgreen + keyword whole indent brightgreen + keyword whole int brightgreen + keyword whole items brightgreen + keyword whole join brightgreen + keyword whole last brightgreen + keyword whole length brightgreen + keyword whole list brightgreen + keyword whole lower brightgreen + keyword whole map brightgreen + keyword whole max brightgreen + keyword whole min brightgreen + keyword whole pprint brightgreen + keyword whole random brightgreen + keyword whole reject brightgreen + keyword whole rejectattr brightgreen + keyword whole replace brightgreen + keyword whole reverse brightgreen + keyword whole round brightgreen + keyword whole safe brightgreen + keyword whole select brightgreen + keyword whole selectattr brightgreen + keyword whole slice brightgreen + keyword whole sort brightgreen + keyword whole string brightgreen + keyword whole striptags brightgreen + keyword whole sum brightgreen + keyword whole title brightgreen + keyword whole tojson brightgreen + keyword whole trim brightgreen + keyword whole truncate brightgreen + keyword whole unique brightgreen + keyword whole upper brightgreen + keyword whole urlencode brightgreen + keyword whole urlize brightgreen + keyword whole wordcount brightgreen + keyword whole wordwrap brightgreen + keyword whole xmlattr brightgreen + + # builtin tests + keyword whole boolean yellow + keyword whole callable yellow + keyword whole defined yellow + keyword whole divisibleby yellow + keyword whole eq yellow + keyword whole escaped yellow + keyword whole even yellow + keyword whole ge yellow + keyword whole gt yellow + keyword whole integer yellow + keyword whole iterable yellow + keyword whole le yellow + keyword whole lt yellow + keyword whole mapping yellow + keyword whole ne yellow + keyword whole number yellow + keyword whole odd yellow + keyword whole sameas yellow + keyword whole sequence yellow + keyword whole test yellow + keyword whole undefined yellow + + # builtin global functions + keyword whole cycler brightblue + keyword whole dict brightblue + keyword whole joiner brightblue + keyword whole lipsum brightblue + keyword whole namespace brightblue + keyword whole range brightblue + + # builtin function + keyword whole super yellow + + # numbers (most specific first, see note in default context) + keyword whole \{0123456789\}\[0123456789\]\.\{0123456789\}\[0123456789\]\{eE\}\{\+-\}\{0123456789\}\[0123456789\] cyan + keyword whole \{0123456789\}\[0123456789\]\.\{0123456789\}\[0123456789\]\{eE\}\{0123456789\}\[0123456789\] cyan + keyword whole \{0123456789\}\[0123456789\]\{eE\}\{\+-\}\{0123456789\}\[0123456789\] cyan + keyword whole \{0123456789\}\[0123456789\]\{eE\}\{0123456789\}\[0123456789\] cyan + keyword whole \{0123456789\}\[0123456789\]\.\{0123456789\}\[0123456789\] cyan + keyword whole \{0123456789\}\[0123456789\] cyan + keyword whole \{0123456789\} cyan + + # jinja2 comment: {# ... #} + context {# #} brown + + # line comment: # to end of line + context # \n brown + + # strings + context " " green + context ' ' green