summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS1
-rw-r--r--CHANGES1
-rw-r--r--pygments/lexers/_mapping.py3
-rw-r--r--pygments/lexers/templates.py88
-rw-r--r--tests/examplefiles/test.evoque33
5 files changed, 125 insertions, 1 deletions
diff --git a/AUTHORS b/AUTHORS
index 0227f374..f2bd0018 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -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
diff --git a/CHANGES b/CHANGES
index 95839a12..6529a6e7 100644
--- a/CHANGES
+++ b/CHANGES
@@ -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")] %}