Some template lexers

This commit is contained in:
Roberto Alsina 2024-08-22 16:11:30 -03:00
parent 746abe53ea
commit 7f4296e9d7
5 changed files with 1404 additions and 1166 deletions

1
.gitignore vendored
View File

@ -8,3 +8,4 @@ pygments/
shard.lock shard.lock
.vscode/ .vscode/
.crystal/ .crystal/
venv/

130
lexers/LiquidLexer.xml Normal file
View File

@ -0,0 +1,130 @@
<lexer>
<config>
<name>liquid</name>
<alias>liquid</alias>
<filename>*.liquid</filename>
</config>
<rules>
<state name="root">
<rule pattern="[^{]+"><token type="Text"/></rule>
<rule pattern="(\{%)(\s*)"><bygroups><token type="Punctuation"/><token type="TextWhitespace"/></bygroups><push state="tag-or-block"/></rule>
<rule pattern="(\{\{)(\s*)([^\s}]+)"><bygroups><token type="Punctuation"/><token type="TextWhitespace"/><usingself state="generic"/></bygroups><push state="output"/></rule>
<rule pattern="\{"><token type="Text"/></rule>
</state>
<state name="tag-or-block">
<rule pattern="(if|unless|elsif|case)(?=\s+)"><token type="KeywordReserved"/><push state="condition"/></rule>
<rule pattern="(when)(\s+)"><bygroups><token type="KeywordReserved"/><token type="TextWhitespace"/></bygroups><combined state="end-of-block" state="whitespace" state="generic"/></rule>
<rule pattern="(else)(\s*)(%\})"><bygroups><token type="KeywordReserved"/><token type="TextWhitespace"/><token type="Punctuation"/></bygroups><pop depth="1"/></rule>
<rule pattern="(capture)(\s+)([^\s%]+)(\s*)(%\})"><bygroups><token type="NameTag"/><token type="TextWhitespace"/><usingself state="variable"/><token type="TextWhitespace"/><token type="Punctuation"/></bygroups><pop depth="1"/></rule>
<rule pattern="(comment)(\s*)(%\})"><bygroups><token type="NameTag"/><token type="TextWhitespace"/><token type="Punctuation"/></bygroups><push state="comment"/></rule>
<rule pattern="(raw)(\s*)(%\})"><bygroups><token type="NameTag"/><token type="TextWhitespace"/><token type="Punctuation"/></bygroups><push state="raw"/></rule>
<rule pattern="(end(case|unless|if))(\s*)(%\})"><bygroups><token type="KeywordReserved"/>None<token type="TextWhitespace"/><token type="Punctuation"/></bygroups><pop depth="1"/></rule>
<rule pattern="(end([^\s%]+))(\s*)(%\})"><bygroups><token type="NameTag"/>None<token type="TextWhitespace"/><token type="Punctuation"/></bygroups><pop depth="1"/></rule>
<rule pattern="(cycle)(\s+)(?:([^\s:]*)(:))?(\s*)"><bygroups><token type="NameTag"/><token type="TextWhitespace"/><usingself state="generic"/><token type="Punctuation"/><token type="TextWhitespace"/></bygroups><push state="variable-tag-markup"/></rule>
<rule pattern="([^\s%]+)(\s*)"><bygroups><token type="NameTag"/><token type="TextWhitespace"/></bygroups><push state="tag-markup"/></rule>
</state>
<state name="output">
<rule><include state="whitespace"/></rule>
<rule pattern="\}\}"><token type="Punctuation"/><pop depth="1"/></rule>
<rule pattern="\|"><token type="Punctuation"/><push state="filters"/></rule>
</state>
<state name="filters">
<rule><include state="whitespace"/></rule>
<rule pattern="\}\}"><token type="Punctuation"/><push state="#pop" state="#pop"/></rule>
<rule pattern="([^\s|:]+)(:?)(\s*)"><bygroups><token type="NameFunction"/><token type="Punctuation"/><token type="TextWhitespace"/></bygroups><push state="filter-markup"/></rule>
</state>
<state name="filter-markup">
<rule pattern="\|"><token type="Punctuation"/><pop depth="1"/></rule>
<rule><include state="end-of-tag"/></rule>
<rule><include state="default-param-markup"/></rule>
</state>
<state name="condition">
<rule><include state="end-of-block"/></rule>
<rule><include state="whitespace"/></rule>
<rule pattern="([^\s=!&gt;&lt;]+)(\s*)([=!&gt;&lt;]=?)(\s*)(\S+)(\s*)(%\})"><bygroups><usingself state="generic"/><token type="TextWhitespace"/><token type="Operator"/><token type="TextWhitespace"/><usingself state="generic"/><token type="TextWhitespace"/><token type="Punctuation"/></bygroups></rule>
<rule pattern="\b!"><token type="Operator"/></rule>
<rule pattern="\bnot\b"><token type="OperatorWord"/></rule>
<rule pattern="([\w.\&#x27;&quot;]+)(\s+)(contains)(\s+)([\w.\&#x27;&quot;]+)"><bygroups><usingself state="generic"/><token type="TextWhitespace"/><token type="OperatorWord"/><token type="TextWhitespace"/><usingself state="generic"/></bygroups></rule>
<rule><include state="generic"/></rule>
<rule><include state="whitespace"/></rule>
</state>
<state name="generic-value">
<rule><include state="generic"/></rule>
<rule><include state="end-at-whitespace"/></rule>
</state>
<state name="operator">
<rule pattern="(\s*)((=|!|&gt;|&lt;)=?)(\s*)"><bygroups><token type="TextWhitespace"/><token type="Operator"/>None<token type="TextWhitespace"/></bygroups><pop depth="1"/></rule>
<rule pattern="(\s*)(\bcontains\b)(\s*)"><bygroups><token type="TextWhitespace"/><token type="OperatorWord"/><token type="TextWhitespace"/></bygroups><pop depth="1"/></rule>
</state>
<state name="end-of-tag">
<rule pattern="\}\}"><token type="Punctuation"/><pop depth="1"/></rule>
</state>
<state name="end-of-block">
<rule pattern="%\}"><token type="Punctuation"/><push state="#pop" state="#pop"/></rule>
</state>
<state name="end-at-whitespace">
<rule pattern="\s+"><token type="TextWhitespace"/><pop depth="1"/></rule>
</state>
<state name="param-markup">
<rule><include state="whitespace"/></rule>
<rule pattern="([^\s=:]+)(\s*)(=|:)"><bygroups><token type="NameAttribute"/><token type="TextWhitespace"/><token type="Operator"/></bygroups></rule>
<rule pattern="(\{\{)(\s*)([^\s}])(\s*)(\}\})"><bygroups><token type="Punctuation"/><token type="TextWhitespace"/><usingself state="variable"/><token type="TextWhitespace"/><token type="Punctuation"/></bygroups></rule>
<rule><include state="string"/></rule>
<rule><include state="number"/></rule>
<rule><include state="keyword"/></rule>
<rule pattern=","><token type="Punctuation"/></rule>
</state>
<state name="default-param-markup">
<rule><include state="param-markup"/></rule>
<rule pattern="."><token type="Text"/></rule>
</state>
<state name="variable-param-markup">
<rule><include state="param-markup"/></rule>
<rule><include state="variable"/></rule>
<rule pattern="."><token type="Text"/></rule>
</state>
<state name="tag-markup">
<rule pattern="%\}"><token type="Punctuation"/><push state="#pop" state="#pop"/></rule>
<rule><include state="default-param-markup"/></rule>
</state>
<state name="variable-tag-markup">
<rule pattern="%\}"><token type="Punctuation"/><push state="#pop" state="#pop"/></rule>
<rule><include state="variable-param-markup"/></rule>
</state>
<state name="keyword">
<rule pattern="\b(false|true)\b"><token type="KeywordConstant"/></rule>
</state>
<state name="variable">
<rule pattern="[a-zA-Z_]\w*"><token type="NameVariable"/></rule>
<rule pattern="(?&lt;=\w)\.(?=\w)"><token type="Punctuation"/></rule>
</state>
<state name="string">
<rule pattern="&#x27;[^&#x27;]*&#x27;"><token type="LiteralStringSingle"/></rule>
<rule pattern="&quot;[^&quot;]*&quot;"><token type="LiteralStringDouble"/></rule>
</state>
<state name="number">
<rule pattern="\d+\.\d+"><token type="LiteralNumberFloat"/></rule>
<rule pattern="\d+"><token type="LiteralNumberInteger"/></rule>
</state>
<state name="generic">
<rule><include state="keyword"/></rule>
<rule><include state="string"/></rule>
<rule><include state="number"/></rule>
<rule><include state="variable"/></rule>
</state>
<state name="whitespace">
<rule pattern="[ \t]+"><token type="TextWhitespace"/></rule>
</state>
<state name="comment">
<rule pattern="(\{%)(\s*)(endcomment)(\s*)(%\})"><bygroups><token type="Punctuation"/><token type="TextWhitespace"/><token type="NameTag"/><token type="TextWhitespace"/><token type="Punctuation"/></bygroups><push state="#pop" state="#pop"/></rule>
<rule pattern="."><token type="Comment"/></rule>
</state>
<state name="raw">
<rule pattern="[^{]+"><token type="Text"/></rule>
<rule pattern="(\{%)(\s*)(endraw)(\s*)(%\})"><bygroups><token type="Punctuation"/><token type="TextWhitespace"/><token type="NameTag"/><token type="TextWhitespace"/><token type="Punctuation"/></bygroups><pop depth="1"/></rule>
<rule pattern="\{"><token type="Text"/></rule>
</state>
</rules>
</lexer>

47
lexers/TwigLexer.xml Normal file
View File

@ -0,0 +1,47 @@
<lexer>
<config>
<name>Twig</name>
<alias>twig</alias>
<mime_type>application/x-twig</mime_type>
<dot_all>true</dot_all>
</config>
<rules>
<state name="root">
<rule pattern="[^{]+"><token type="Other"/></rule>
<rule pattern="\{\{"><token type="CommentPreproc"/><push state="var"/></rule>
<rule pattern="\{\#.*?\#\}"><token type="Comment"/></rule>
<rule pattern="(\{%)(-?\s*)(raw)(\s*-?)(%\})(.*?)(\{%)(-?\s*)(endraw)(\s*-?)(%\})"><bygroups><token type="CommentPreproc"/><token type="Text"/><token type="Keyword"/><token type="Text"/><token type="CommentPreproc"/><token type="Other"/><token type="CommentPreproc"/><token type="Text"/><token type="Keyword"/><token type="Text"/><token type="CommentPreproc"/></bygroups></rule>
<rule pattern="(\{%)(-?\s*)(verbatim)(\s*-?)(%\})(.*?)(\{%)(-?\s*)(endverbatim)(\s*-?)(%\})"><bygroups><token type="CommentPreproc"/><token type="Text"/><token type="Keyword"/><token type="Text"/><token type="CommentPreproc"/><token type="Other"/><token type="CommentPreproc"/><token type="Text"/><token type="Keyword"/><token type="Text"/><token type="CommentPreproc"/></bygroups></rule>
<rule pattern="(\{%)(-?\s*)(filter)(\s+)((?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w-]|[^\x00-\x7f])*)"><bygroups><token type="CommentPreproc"/><token type="Text"/><token type="Keyword"/><token type="Text"/><token type="NameFunction"/></bygroups><push state="tag"/></rule>
<rule pattern="(\{%)(-?\s*)([a-zA-Z_]\w*)"><bygroups><token type="CommentPreproc"/><token type="Text"/><token type="Keyword"/></bygroups><push state="tag"/></rule>
<rule pattern="\{"><token type="Other"/></rule>
</state>
<state name="varnames">
<rule pattern="(\|)(\s*)((?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w-]|[^\x00-\x7f])*)"><bygroups><token type="Operator"/><token type="Text"/><token type="NameFunction"/></bygroups></rule>
<rule pattern="(is)(\s+)(not)?(\s*)((?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w-]|[^\x00-\x7f])*)"><bygroups><token type="Keyword"/><token type="Text"/><token type="Keyword"/><token type="Text"/><token type="NameFunction"/></bygroups></rule>
<rule pattern="(?i)(true|false|none|null)\b"><token type="KeywordPseudo"/></rule>
<rule pattern="(in|not|and|b-and|or|b-or|b-xor|isif|elseif|else|importconstant|defined|divisibleby|empty|even|iterable|odd|sameasmatches|starts\s+with|ends\s+with)\b"><token type="Keyword"/></rule>
<rule pattern="(loop|block|parent)\b"><token type="NameBuiltin"/></rule>
<rule pattern="(?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w-]|[^\x00-\x7f])*"><token type="NameVariable"/></rule>
<rule pattern="\.(?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w-]|[^\x00-\x7f])*"><token type="NameVariable"/></rule>
<rule pattern="\.[0-9]+"><token type="LiteralNumber"/></rule>
<rule pattern=":?&quot;(\\\\|\\[^\\]|[^&quot;\\])*&quot;"><token type="LiteralStringDouble"/></rule>
<rule pattern=":?&#x27;(\\\\|\\[^\\]|[^&#x27;\\])*&#x27;"><token type="LiteralStringSingle"/></rule>
<rule pattern="([{}()\[\]+\-*/,:~%]|\.\.|\?|:|\*\*|\/\/|!=|[&gt;&lt;=]=?)"><token type="Operator"/></rule>
<rule pattern="[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?"><token type="LiteralNumber"/></rule>
</state>
<state name="var">
<rule pattern="\s+"><token type="Text"/></rule>
<rule pattern="(-?)(\}\})"><bygroups><token type="Text"/><token type="CommentPreproc"/></bygroups><pop depth="1"/></rule>
<rule><include state="varnames"/></rule>
</state>
<state name="tag">
<rule pattern="\s+"><token type="Text"/></rule>
<rule pattern="(-?)(%\})"><bygroups><token type="Text"/><token type="CommentPreproc"/></bygroups><pop depth="1"/></rule>
<rule><include state="varnames"/></rule>
<rule pattern="."><token type="Punctuation"/></rule>
</state>
</rules>
</lexer>

55
lexers/VelocityLexer.xml Normal file
View File

@ -0,0 +1,55 @@
<lexer>
<config>
<name>Velocity</name>
<alias>velocity</alias>
<filename>*.vm</filename>
<filename>*.fhtml</filename>
<dot_all>true</dot_all>
</config>
<rules>
<state name="root">
<rule pattern="[^{#$]+"><token type="Other"/></rule>
<rule pattern="(#)(\*.*?\*)(#)"><bygroups><token type="CommentPreproc"/><token type="Comment"/><token type="CommentPreproc"/></bygroups></rule>
<rule pattern="(##)(.*?$)"><bygroups><token type="CommentPreproc"/><token type="Comment"/></bygroups></rule>
<rule pattern="(#\{?)([a-zA-Z_]\w*)(\}?)(\s?\()"><bygroups><token type="CommentPreproc"/><token type="NameFunction"/><token type="CommentPreproc"/><token type="Punctuation"/></bygroups><push state="directiveparams"/></rule>
<rule pattern="(#\{?)([a-zA-Z_]\w*)(\}|\b)"><bygroups><token type="CommentPreproc"/><token type="NameFunction"/><token type="CommentPreproc"/></bygroups></rule>
<rule pattern="\$!?\{?"><token type="Punctuation"/><push state="variable"/></rule>
</state>
<state name="variable">
<rule pattern="[a-zA-Z_]\w*"><token type="NameVariable"/></rule>
<rule pattern="\("><token type="Punctuation"/><push state="funcparams"/></rule>
<rule pattern="(\.)([a-zA-Z_]\w*)"><bygroups><token type="Punctuation"/><token type="NameVariable"/></bygroups><push/></rule>
<rule pattern="\}"><token type="Punctuation"/><pop depth="1"/></rule>
<rule><pop depth="1"/></rule>
</state>
<state name="directiveparams">
<rule pattern="(&amp;&amp;|\|\||==?|!=?|[-&lt;&gt;+*%&amp;|^/])|\b(eq|ne|gt|lt|ge|le|not|in)\b"><token type="Operator"/></rule>
<rule pattern="\["><token type="Operator"/><push state="rangeoperator"/></rule>
<rule pattern="\b[a-zA-Z_]\w*\b"><token type="NameFunction"/></rule>
<rule><include state="funcparams"/></rule>
</state>
<state name="rangeoperator">
<rule pattern="\.\."><token type="Operator"/></rule>
<rule><include state="funcparams"/></rule>
<rule pattern="\]"><token type="Operator"/><pop depth="1"/></rule>
</state>
<state name="funcparams">
<rule pattern="\$!?\{?"><token type="Punctuation"/><push state="variable"/></rule>
<rule pattern="\s+"><token type="Text"/></rule>
<rule pattern="[,:]"><token type="Punctuation"/></rule>
<rule pattern="&quot;(\\\\|\\[^\\]|[^&quot;\\])*&quot;"><token type="LiteralStringDouble"/></rule>
<rule pattern="&#x27;(\\\\|\\[^\\]|[^&#x27;\\])*&#x27;"><token type="LiteralStringSingle"/></rule>
<rule pattern="0[xX][0-9a-fA-F]+[Ll]?"><token type="LiteralNumber"/></rule>
<rule pattern="\b[0-9]+\b"><token type="LiteralNumber"/></rule>
<rule pattern="(true|false|null)\b"><token type="KeywordConstant"/></rule>
<rule pattern="\("><token type="Punctuation"/><push/></rule>
<rule pattern="\)"><token type="Punctuation"/><pop depth="1"/></rule>
<rule pattern="\{"><token type="Punctuation"/><push/></rule>
<rule pattern="\}"><token type="Punctuation"/><pop depth="1"/></rule>
<rule pattern="\["><token type="Punctuation"/><push/></rule>
<rule pattern="\]"><token type="Punctuation"/><pop depth="1"/></rule>
</state>
</rules>
</lexer>

View File

@ -189,6 +189,7 @@ module Tartrazine
"lighttpd" => "lighttpd_configuration_file", "lighttpd" => "lighttpd_configuration_file",
"lighttpd configuration file" => "lighttpd_configuration_file", "lighttpd configuration file" => "lighttpd_configuration_file",
"lighty" => "lighttpd_configuration_file", "lighty" => "lighttpd_configuration_file",
"liquid" => "LiquidLexer",
"lisp" => "common_lisp", "lisp" => "common_lisp",
"llvm" => "llvm", "llvm" => "llvm",
"lua" => "lua", "lua" => "lua",
@ -394,7 +395,7 @@ module Tartrazine
"turing" => "turing", "turing" => "turing",
"turtle" => "turtle", "turtle" => "turtle",
"tv" => "tradingview", "tv" => "tradingview",
"twig" => "twig", "twig" => "TwigLexer",
"typescript" => "typescript", "typescript" => "typescript",
"typoscript" => "typoscript", "typoscript" => "typoscript",
"typoscriptcssdata" => "typoscriptcssdata", "typoscriptcssdata" => "typoscriptcssdata",
@ -408,6 +409,7 @@ module Tartrazine
"vapi" => "vala", "vapi" => "vala",
"vb.net" => "vb_net", "vb.net" => "vb_net",
"vbnet" => "vb_net", "vbnet" => "vb_net",
"velocity" => "VelocityLexer",
"verilog" => "verilog", "verilog" => "verilog",
"vhdl" => "vhdl", "vhdl" => "vhdl",
"vhs" => "vhs", "vhs" => "vhs",
@ -498,7 +500,7 @@ module Tartrazine
"application/x-thrift" => "thrift", "application/x-thrift" => "thrift",
"application/x-troff" => "groff", "application/x-troff" => "groff",
"application/x-turtle" => "turtle", "application/x-turtle" => "turtle",
"application/x-twig" => "twig", "application/x-twig" => "TwigLexer",
"application/x-vue" => "vue", "application/x-vue" => "vue",
"application/x.ucode" => "ucode", "application/x.ucode" => "ucode",
"application/xhtml+xml" => "html", "application/xhtml+xml" => "html",
@ -723,8 +725,8 @@ module Tartrazine
"*.applescript" => ["applescript"], "*.applescript" => ["applescript"],
"*.aql" => ["arangodb_aql"], "*.aql" => ["arangodb_aql"],
"*.arexx" => ["rexx"], "*.arexx" => ["rexx"],
"*.as" => ["actionscript_3", "actionscript"], "*.as" => ["actionscript", "actionscript_3"],
"*.asm" => ["z80_assembly", "tasm", "nasm"], "*.asm" => ["nasm", "z80_assembly", "tasm"],
"*.au3" => ["autoit"], "*.au3" => ["autoit"],
"*.automount" => ["systemd"], "*.automount" => ["systemd"],
"*.aux" => ["tex"], "*.aux" => ["tex"],
@ -743,7 +745,7 @@ module Tartrazine
"*.bnf" => ["bnf"], "*.bnf" => ["bnf"],
"*.bqn" => ["bqn"], "*.bqn" => ["bqn"],
"*.bzl" => ["python"], "*.bzl" => ["python"],
"*.c" => ["c++", "c"], "*.c" => ["c", "c++"],
"*.c++" => ["c++"], "*.c++" => ["c++"],
"*.capnp" => ["cap_n_proto"], "*.capnp" => ["cap_n_proto"],
"*.cc" => ["c++"], "*.cc" => ["c++"],
@ -820,6 +822,7 @@ module Tartrazine
"*.factor" => ["factor"], "*.factor" => ["factor"],
"*.feature" => ["gherkin"], "*.feature" => ["gherkin"],
"*.fennel" => ["fennel"], "*.fennel" => ["fennel"],
"*.fhtml" => ["VelocityLexer"],
"*.fish" => ["fish"], "*.fish" => ["fish"],
"*.frag" => ["glsl"], "*.frag" => ["glsl"],
"*.frt" => ["forth"], "*.frt" => ["forth"],
@ -841,7 +844,7 @@ module Tartrazine
"*.graphql" => ["graphql"], "*.graphql" => ["graphql"],
"*.graphqls" => ["graphql"], "*.graphqls" => ["graphql"],
"*.groovy" => ["groovy"], "*.groovy" => ["groovy"],
"*.h" => ["objective-c", "c++", "c"], "*.h" => ["objective-c", "c", "c++"],
"*.h++" => ["c++"], "*.h++" => ["c++"],
"*.ha" => ["hare"], "*.ha" => ["hare"],
"*.handlebars" => ["handlebars"], "*.handlebars" => ["handlebars"],
@ -849,7 +852,7 @@ module Tartrazine
"*.hc" => ["holyc"], "*.hc" => ["holyc"],
"*.hc.z" => ["holyc"], "*.hc.z" => ["holyc"],
"*.hcl" => ["hcl"], "*.hcl" => ["hcl"],
"*.hh" => ["c++", "holyc"], "*.hh" => ["holyc", "c++"],
"*.hlb" => ["hlb"], "*.hlb" => ["hlb"],
"*.hlsl" => ["hlsl"], "*.hlsl" => ["hlsl"],
"*.hlsli" => ["hlsl"], "*.hlsli" => ["hlsl"],
@ -864,7 +867,7 @@ module Tartrazine
"*.idc" => ["c"], "*.idc" => ["c"],
"*.idr" => ["idris"], "*.idr" => ["idris"],
"*.ijs" => ["j"], "*.ijs" => ["j"],
"*.inc" => ["povray", "objectpascal", "php", "sourcepawn"], "*.inc" => ["php", "sourcepawn", "objectpascal", "povray"],
"*.inf" => ["ini"], "*.inf" => ["ini"],
"*.ini" => ["ini"], "*.ini" => ["ini"],
"*.ino" => ["arduino"], "*.ino" => ["arduino"],
@ -883,19 +886,20 @@ module Tartrazine
"*.ksh" => ["bash"], "*.ksh" => ["bash"],
"*.kt" => ["kotlin"], "*.kt" => ["kotlin"],
"*.link" => ["systemd"], "*.link" => ["systemd"],
"*.liquid" => ["LiquidLexer"],
"*.lisp" => ["common_lisp"], "*.lisp" => ["common_lisp"],
"*.ll" => ["llvm"], "*.ll" => ["llvm"],
"*.load" => ["fish"], "*.load" => ["fish"],
"*.lpk" => ["objectpascal"], "*.lpk" => ["objectpascal"],
"*.lpr" => ["objectpascal"], "*.lpr" => ["objectpascal"],
"*.lua" => ["lua"], "*.lua" => ["lua"],
"*.m" => ["matlab", "mason", "mathematica", "objective-c", "octave"], "*.m" => ["mason", "mathematica", "matlab", "octave", "objective-c"],
"*.ma" => ["mathematica"], "*.ma" => ["mathematica"],
"*.mak" => ["makefile"], "*.mak" => ["makefile"],
"*.man" => ["groff"], "*.man" => ["groff"],
"*.mao" => ["mako"], "*.mao" => ["mako"],
"*.markdown" => ["markdown"], "*.markdown" => ["markdown"],
"*.mc" => ["mason", "monkeyc"], "*.mc" => ["monkeyc", "mason"],
"*.mcfunction" => ["mcfunction"], "*.mcfunction" => ["mcfunction"],
"*.md" => ["markdown"], "*.md" => ["markdown"],
"*.metal" => ["metal"], "*.metal" => ["metal"],
@ -944,7 +948,7 @@ module Tartrazine
"*.php" => ["php"], "*.php" => ["php"],
"*.php[345]" => ["php"], "*.php[345]" => ["php"],
"*.pig" => ["pig"], "*.pig" => ["pig"],
"*.pl" => ["perl", "prolog"], "*.pl" => ["prolog", "perl"],
"*.plc" => ["plutus_core"], "*.plc" => ["plutus_core"],
"*.plot" => ["gnuplot"], "*.plot" => ["gnuplot"],
"*.plt" => ["gnuplot"], "*.plt" => ["gnuplot"],
@ -952,7 +956,7 @@ module Tartrazine
"*.pml" => ["promela"], "*.pml" => ["promela"],
"*.pony" => ["pony"], "*.pony" => ["pony"],
"*.pov" => ["povray"], "*.pov" => ["povray"],
"*.pp" => ["puppet", "objectpascal"], "*.pp" => ["objectpascal", "puppet"],
"*.pq" => ["powerquery"], "*.pq" => ["powerquery"],
"*.pr" => ["promela"], "*.pr" => ["promela"],
"*.prm" => ["promela"], "*.prm" => ["promela"],
@ -999,7 +1003,7 @@ module Tartrazine
"*.rss" => ["xml"], "*.rss" => ["xml"],
"*.rvt" => ["tcl"], "*.rvt" => ["tcl"],
"*.rx" => ["rexx"], "*.rx" => ["rexx"],
"*.s" => ["armasm", "gas", "r"], "*.s" => ["r", "armasm", "gas"],
"*.sage" => ["python"], "*.sage" => ["python"],
"*.sas" => ["sas"], "*.sas" => ["sas"],
"*.sass" => ["sass"], "*.sass" => ["sass"],
@ -1028,7 +1032,7 @@ module Tartrazine
"*.sparql" => ["sparql"], "*.sparql" => ["sparql"],
"*.spec" => ["rpm_spec"], "*.spec" => ["rpm_spec"],
"*.spt" => ["cheetah"], "*.spt" => ["cheetah"],
"*.sql" => ["sql", "mysql"], "*.sql" => ["mysql", "sql"],
"*.ss" => ["scheme"], "*.ss" => ["scheme"],
"*.st" => ["smalltalk"], "*.st" => ["smalltalk"],
"*.stas" => ["stas"], "*.stas" => ["stas"],
@ -1057,7 +1061,7 @@ module Tartrazine
"*.tpl" => ["smarty"], "*.tpl" => ["smarty"],
"*.tpp" => ["c++"], "*.tpp" => ["c++"],
"*.trig" => ["psl"], "*.trig" => ["psl"],
"*.ts" => ["typescript", "typoscript"], "*.ts" => ["typoscript", "typescript"],
"*.tst" => ["scilab"], "*.tst" => ["scilab"],
"*.tsx" => ["typescript"], "*.tsx" => ["typescript"],
"*.ttl" => ["turtle"], "*.ttl" => ["turtle"],
@ -1067,7 +1071,7 @@ module Tartrazine
"*.twig" => ["twig"], "*.twig" => ["twig"],
"*.txt" => ["plaintext"], "*.txt" => ["plaintext"],
"*.uc" => ["ucode"], "*.uc" => ["ucode"],
"*.v" => ["coq", "verilog", "v"], "*.v" => ["coq", "v", "verilog"],
"*.vala" => ["vala"], "*.vala" => ["vala"],
"*.vapi" => ["vala"], "*.vapi" => ["vala"],
"*.vb" => ["vb_net"], "*.vb" => ["vb_net"],
@ -1076,6 +1080,7 @@ module Tartrazine
"*.vhd" => ["vhdl"], "*.vhd" => ["vhdl"],
"*.vhdl" => ["vhdl"], "*.vhdl" => ["vhdl"],
"*.vim" => ["viml"], "*.vim" => ["viml"],
"*.vm" => ["VelocityLexer"],
"*.vsh" => ["v_shell"], "*.vsh" => ["v_shell"],
"*.vue" => ["vue"], "*.vue" => ["vue"],
"*.vv" => ["v"], "*.vv" => ["v"],