123 lines
4.4 KiB
Python
123 lines
4.4 KiB
Python
|
# ext/pygmentplugin.py
|
||
|
# Copyright (C) 2006-2013 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)
|
||
|
|