| # ext/pygmentplugin.py |
| # Copyright (C) 2006-2015 the Mako authors and contributors <see AUTHORS file> |
| # |
| # This module is part of Mako and is released under |
| # the MIT License: http://www.opensource.org/licenses/mit-license.php |
| |
| from pygments.lexers.web import \ |
| HtmlLexer, XmlLexer, JavascriptLexer, CssLexer |
| from pygments.lexers.agile import PythonLexer, Python3Lexer |
| from pygments.lexer import DelegatingLexer, RegexLexer, bygroups, \ |
| include, using |
| from pygments.token import \ |
| Text, Comment, Operator, Keyword, Name, String, Other |
| from pygments.formatters.html import HtmlFormatter |
| from pygments import highlight |
| from mako import compat |
| |
| |
| class MakoLexer(RegexLexer): |
| name = 'Mako' |
| aliases = ['mako'] |
| filenames = ['*.mao'] |
| |
| tokens = { |
| 'root': [ |
| (r'(\s*)(\%)(\s*end(?:\w+))(\n|\Z)', |
| bygroups(Text, Comment.Preproc, Keyword, Other)), |
| (r'(\s*)(\%(?!%))([^\n]*)(\n|\Z)', |
| bygroups(Text, Comment.Preproc, using(PythonLexer), Other)), |
| (r'(\s*)(##[^\n]*)(\n|\Z)', |
| bygroups(Text, Comment.Preproc, Other)), |
| (r'''(?s)<%doc>.*?</%doc>''', Comment.Preproc), |
| (r'(<%)([\w\.\:]+)', |
| bygroups(Comment.Preproc, Name.Builtin), 'tag'), |
| (r'(</%)([\w\.\:]+)(>)', |
| bygroups(Comment.Preproc, Name.Builtin, Comment.Preproc)), |
| (r'<%(?=([\w\.\:]+))', Comment.Preproc, 'ondeftags'), |
| (r'(<%(?:!?))(.*?)(%>)(?s)', |
| bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc)), |
| (r'(\$\{)(.*?)(\})', |
| bygroups(Comment.Preproc, using(PythonLexer), Comment.Preproc)), |
| (r'''(?sx) |
| (.+?) # anything, followed by: |
| (?: |
| (?<=\n)(?=%(?!%)|\#\#) | # an eval or comment line |
| (?=\#\*) | # multiline comment |
| (?=</?%) | # a python block |
| # call start or end |
| (?=\$\{) | # a substitution |
| (?<=\n)(?=\s*%) | |
| # - don't consume |
| (\\\n) | # an escaped newline |
| \Z # end of string |
| ) |
| ''', bygroups(Other, Operator)), |
| (r'\s+', Text), |
| ], |
| 'ondeftags': [ |
| (r'<%', Comment.Preproc), |
| (r'(?<=<%)(include|inherit|namespace|page)', Name.Builtin), |
| include('tag'), |
| ], |
| 'tag': [ |
| (r'((?:\w+)\s*=)\s*(".*?")', |
| bygroups(Name.Attribute, String)), |
| (r'/?\s*>', Comment.Preproc, '#pop'), |
| (r'\s+', Text), |
| ], |
| 'attr': [ |
| ('".*?"', String, '#pop'), |
| ("'.*?'", String, '#pop'), |
| (r'[^\s>]+', String, '#pop'), |
| ], |
| } |
| |
| |
| class MakoHtmlLexer(DelegatingLexer): |
| name = 'HTML+Mako' |
| aliases = ['html+mako'] |
| |
| def __init__(self, **options): |
| super(MakoHtmlLexer, self).__init__(HtmlLexer, MakoLexer, |
| **options) |
| |
| |
| class MakoXmlLexer(DelegatingLexer): |
| name = 'XML+Mako' |
| aliases = ['xml+mako'] |
| |
| def __init__(self, **options): |
| super(MakoXmlLexer, self).__init__(XmlLexer, MakoLexer, |
| **options) |
| |
| |
| class MakoJavascriptLexer(DelegatingLexer): |
| name = 'JavaScript+Mako' |
| aliases = ['js+mako', 'javascript+mako'] |
| |
| def __init__(self, **options): |
| super(MakoJavascriptLexer, self).__init__(JavascriptLexer, |
| MakoLexer, **options) |
| |
| |
| class MakoCssLexer(DelegatingLexer): |
| name = 'CSS+Mako' |
| aliases = ['css+mako'] |
| |
| def __init__(self, **options): |
| super(MakoCssLexer, self).__init__(CssLexer, MakoLexer, |
| **options) |
| |
| |
| pygments_html_formatter = HtmlFormatter(cssclass='syntax-highlighted', |
| linenos=True) |
| |
| |
| def syntax_highlight(filename='', language=None): |
| mako_lexer = MakoLexer() |
| if compat.py3k: |
| python_lexer = Python3Lexer() |
| else: |
| python_lexer = PythonLexer() |
| if filename.startswith('memory:') or language == 'mako': |
| return lambda string: highlight(string, mako_lexer, |
| pygments_html_formatter) |
| return lambda string: highlight(string, python_lexer, |
| pygments_html_formatter) |