diff options
-rw-r--r-- | AUTHORS | 1 | ||||
-rw-r--r-- | CHANGES | 1 | ||||
-rw-r--r-- | pygments/lexers/_mapping.py | 3 | ||||
-rw-r--r-- | pygments/lexers/templates.py | 88 | ||||
-rw-r--r-- | tests/examplefiles/test.evoque | 33 |
5 files changed, 125 insertions, 1 deletions
@@ -36,6 +36,7 @@ Other contributors, listed alphabetically, are: * Ronny Pfannschmidt -- BBCode lexer * Benjamin Peterson -- Test suite refactoring * Andre Roberge -- Tango style +* Mario Ruggier -- Evoque lexers * Stou Sandalski -- NumPy, FORTRAN, tcsh and XSLT lexers * Matteo Sasso -- Common Lisp lexer * Ken Schutte -- Matlab lexers @@ -12,6 +12,7 @@ Version 1.1 * Erlang shell * GLSL * Prolog + * Evoque - Fix a bug lexing extended Ruby strings. diff --git a/pygments/lexers/_mapping.py b/pygments/lexers/_mapping.py index 1b4b8c37..898ca010 100644 --- a/pygments/lexers/_mapping.py +++ b/pygments/lexers/_mapping.py @@ -63,6 +63,9 @@ LEXERS = { 'ErbLexer': ('pygments.lexers.templates', 'ERB', ('erb',), (), ('application/x-ruby-templating',)), 'ErlangLexer': ('pygments.lexers.functional', 'Erlang', ('erlang',), ('*.erl', '*.hrl'), ('text/x-erlang',)), 'ErlangShellLexer': ('pygments.lexers.functional', 'Erlang erl session', ('erl',), ('*.erl-sh',), ('text/x-erl-shellsession',)), + 'EvoqueHtmlLexer': ('pygments.lexers.templates', 'HTML+Evoque', ('html+evoque',), ('*.html',), ('text/html+evoque',)), + 'EvoqueLexer': ('pygments.lexers.templates', 'Evoque', ('evoque',), ('*.evoque',), ('application/x-evoque',)), + 'EvoqueXmlLexer': ('pygments.lexers.templates', 'XML+Evoque', ('xml+evoque',), ('*.xml',), ('application/xml+evoque',)), 'FortranLexer': ('pygments.lexers.compiled', 'Fortran', ('fortran',), ('*.f', '*.f90'), ('text/x-fortran',)), 'GLShaderLexer': ('pygments.lexers.compiled', 'GLSL', ('glsl',), ('*.vert', '*.frag', '*.geo'), ('text/x-glslsrc',)), 'GasLexer': ('pygments.lexers.asm', 'GAS', ('gas',), ('*.s', '*.S'), ('text/x-gas',)), diff --git a/pygments/lexers/templates.py b/pygments/lexers/templates.py index f34a69a8..2677f965 100644 --- a/pygments/lexers/templates.py +++ b/pygments/lexers/templates.py @@ -37,7 +37,8 @@ __all__ = ['HtmlPhpLexer', 'XmlPhpLexer', 'CssPhpLexer', 'MyghtyCssLexer', 'MyghtyJavascriptLexer', 'MakoLexer', 'MakoHtmlLexer', 'MakoXmlLexer', 'MakoJavascriptLexer', 'MakoCssLexer', 'JspLexer', 'CheetahLexer', 'CheetahHtmlLexer', - 'CheetahXmlLexer', 'CheetahJavascriptLexer'] + 'CheetahXmlLexer', 'CheetahJavascriptLexer', + 'EvoqueLexer', 'EvoqueHtmlLexer', 'EvoqueXmlLexer'] class ErbLexer(Lexer): @@ -1215,3 +1216,88 @@ class JspLexer(DelegatingLexer): if '<%' in text and '%>' in text: rv += 0.1 return rv + + +class EvoqueLexer(RegexLexer): + """ + For files using the Evoque templating system. + + *New in Pygments 1.1.* + """ + name = 'Evoque' + aliases = ['evoque'] + filenames = ['*.evoque'] + mimetypes = ['application/x-evoque'] + + flags = re.DOTALL + + tokens = { + 'root': [ + (r'[^#$]+', Other), + (r'#\[', Comment.Multiline, 'comment'), + (r'\$\$', Other), + # svn keywords + (r'\$\w+:[^$\n]*\$', Comment.Multiline), + # directives: begin, end + (r'(\$)(begin|end)(\{(%)?)(.*?)((?(4)%)\})', + bygroups(Punctuation, Name.Builtin, Punctuation, None, + String, Punctuation, None)), + # directives: evoque, overlay + # see doc for handling first name arg: /directives/evoque/ + #+ minor inconsistency: the "name" in e.g. $overlay{name=site_base} + # should be using(PythonLexer), not passed out as String + (r'(\$)(evoque|overlay)(\{(%)?)(\s*[#\w\-"\'.]+[^=,%}]+?)?' + r'(.*?)((?(4)%)\})', + bygroups(Punctuation, Name.Builtin, Punctuation, None, + String, using(PythonLexer), Punctuation, None)), + # directives: if, for, prefer, test + (r'(\$)(\w+)(\{(%)?)(.*?)((?(4)%)\})', + bygroups(Punctuation, Name.Builtin, Punctuation, None, + using(PythonLexer), Punctuation, None)), + # directive clauses (no {} expression) + (r'(\$)(else|rof|fi)', bygroups(Punctuation, Name.Builtin)), + # expressions + (r'(\$\{(%)?)(.*?)((!)(.*?))?((?(2)%)\})', + bygroups(Punctuation, None, using(PythonLexer), + Name.Builtin, None, None, Punctuation, None)), + (r'#', Other), + ], + 'comment': [ + (r'[^\]#]', Comment.Multiline), + (r'#\[', Comment.Multiline, '#push'), + (r'\]#', Comment.Multiline, '#pop'), + (r'[\]#]', Comment.Multiline) + ], + } + +class EvoqueHtmlLexer(DelegatingLexer): + """ + Subclass of the `EvoqueLexer` that highlights unlexed data with the + `HtmlLexer`. + + *New in Pygments 1.1.* + """ + name = 'HTML+Evoque' + aliases = ['html+evoque'] + filenames = ['*.html'] + mimetypes = ['text/html+evoque'] + + def __init__(self, **options): + super(EvoqueHtmlLexer, self).__init__(HtmlLexer, EvoqueLexer, + **options) + +class EvoqueXmlLexer(DelegatingLexer): + """ + Subclass of the `EvoqueLexer` that highlights unlexed data with the + `XmlLexer`. + + *New in Pygments 1.1.* + """ + name = 'XML+Evoque' + aliases = ['xml+evoque'] + filenames = ['*.xml'] + mimetypes = ['application/xml+evoque'] + + def __init__(self, **options): + super(EvoqueXmlLexer, self).__init__(XmlLexer, EvoqueLexer, + **options) diff --git a/tests/examplefiles/test.evoque b/tests/examplefiles/test.evoque new file mode 100644 index 00000000..5a98d3bb --- /dev/null +++ b/tests/examplefiles/test.evoque @@ -0,0 +1,33 @@ +$overlay{name=site_base} + +$begin{table_row} + $for{ col in row } + <td>${col}</td>\ + $else + <td class="empty" colspan="7">empty row</td> + $rof +$end{table_row} + +<table> + $for{ i, row in enumerate(rows) } + <tr$if{i%2} class="odd"$fi> #[ "odd" rows get a special style ]# + $evoque{#table_row} + $evoque{ + #table_row + } + $evoque{'#table_row'} + $evoque{ '#table_row', collection=None, quoting="str"} + $evoque{name="#table_row"} + $evoque{name=var_table_row} + $evoque{%#table_row%} + $evoque{% #table_row %} + </tr> + $rof +</table> + +$evoque{disclaimer, collection="legals"} +$evoque{ disclaimer , collection="legals", abc=123} +$evoque{% disclaimer, collection="legals"%} + +$test{% site_base="site.html", + rows=[("a", "b", 3.0, {"one":1}, "<escape-me/>", "i", "j")] %} |