web.py
2848 lines
| 109.0 KiB
| text/x-python
|
PythonLexer
Jeandet Alexis
|
r0 | # -*- coding: utf-8 -*- | ||
""" | ||||
pygments.lexers.web | ||||
~~~~~~~~~~~~~~~~~~~ | ||||
Lexers for web-related languages and markup. | ||||
:copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS. | ||||
:license: BSD, see LICENSE for details. | ||||
""" | ||||
import re | ||||
import copy | ||||
from pygments.lexer import RegexLexer, ExtendedRegexLexer, bygroups, using, \ | ||||
include, this | ||||
from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ | ||||
Number, Other, Punctuation, Literal | ||||
from pygments.util import get_bool_opt, get_list_opt, looks_like_xml, \ | ||||
html_doctype_matches | ||||
from pygments.lexers.agile import RubyLexer | ||||
from pygments.lexers.compiled import ScalaLexer | ||||
__all__ = ['HtmlLexer', 'XmlLexer', 'JavascriptLexer', 'JSONLexer', 'CssLexer', | ||||
'PhpLexer', 'ActionScriptLexer', 'XsltLexer', 'ActionScript3Lexer', | ||||
'MxmlLexer', 'HaxeLexer', 'HamlLexer', 'SassLexer', 'ScssLexer', | ||||
'ObjectiveJLexer', 'CoffeeScriptLexer', 'DuelLexer', 'ScamlLexer', | ||||
'JadeLexer', 'XQueryLexer', 'DtdLexer', 'DartLexer'] | ||||
class JavascriptLexer(RegexLexer): | ||||
""" | ||||
For JavaScript source code. | ||||
""" | ||||
name = 'JavaScript' | ||||
aliases = ['js', 'javascript'] | ||||
filenames = ['*.js', ] | ||||
mimetypes = ['application/javascript', 'application/x-javascript', | ||||
'text/x-javascript', 'text/javascript', ] | ||||
flags = re.DOTALL | ||||
tokens = { | ||||
'commentsandwhitespace': [ | ||||
(r'\s+', Text), | ||||
(r'<!--', Comment), | ||||
(r'//.*?\n', Comment.Single), | ||||
(r'/\*.*?\*/', Comment.Multiline) | ||||
], | ||||
'slashstartsregex': [ | ||||
include('commentsandwhitespace'), | ||||
(r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/' | ||||
r'([gim]+\b|\B)', String.Regex, '#pop'), | ||||
(r'(?=/)', Text, ('#pop', 'badregex')), | ||||
(r'', Text, '#pop') | ||||
], | ||||
'badregex': [ | ||||
(r'\n', Text, '#pop') | ||||
], | ||||
'root': [ | ||||
(r'^(?=\s|/|<!--)', Text, 'slashstartsregex'), | ||||
include('commentsandwhitespace'), | ||||
(r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|' | ||||
r'(<<|>>>?|==?|!=?|[-<>+*%&\|\^/])=?', Operator, 'slashstartsregex'), | ||||
(r'[{(\[;,]', Punctuation, 'slashstartsregex'), | ||||
(r'[})\].]', Punctuation), | ||||
(r'(for|in|while|do|break|return|continue|switch|case|default|if|else|' | ||||
r'throw|try|catch|finally|new|delete|typeof|instanceof|void|' | ||||
r'this)\b', Keyword, 'slashstartsregex'), | ||||
(r'(var|let|with|function)\b', Keyword.Declaration, 'slashstartsregex'), | ||||
(r'(abstract|boolean|byte|char|class|const|debugger|double|enum|export|' | ||||
r'extends|final|float|goto|implements|import|int|interface|long|native|' | ||||
r'package|private|protected|public|short|static|super|synchronized|throws|' | ||||
r'transient|volatile)\b', Keyword.Reserved), | ||||
(r'(true|false|null|NaN|Infinity|undefined)\b', Keyword.Constant), | ||||
(r'(Array|Boolean|Date|Error|Function|Math|netscape|' | ||||
r'Number|Object|Packages|RegExp|String|sun|decodeURI|' | ||||
r'decodeURIComponent|encodeURI|encodeURIComponent|' | ||||
r'Error|eval|isFinite|isNaN|parseFloat|parseInt|document|this|' | ||||
r'window)\b', Name.Builtin), | ||||
(r'[$a-zA-Z_][a-zA-Z0-9_]*', Name.Other), | ||||
(r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float), | ||||
(r'0x[0-9a-fA-F]+', Number.Hex), | ||||
(r'[0-9]+', Number.Integer), | ||||
(r'"(\\\\|\\"|[^"])*"', String.Double), | ||||
(r"'(\\\\|\\'|[^'])*'", String.Single), | ||||
] | ||||
} | ||||
class JSONLexer(RegexLexer): | ||||
""" | ||||
For JSON data structures. | ||||
*New in Pygments 1.5.* | ||||
""" | ||||
name = 'JSON' | ||||
aliases = ['json'] | ||||
filenames = ['*.json'] | ||||
mimetypes = [ 'application/json', ] | ||||
flags = re.DOTALL | ||||
tokens = { | ||||
'whitespace': [ | ||||
(r'\s+', Text), | ||||
], | ||||
# represents a simple terminal value | ||||
'simplevalue':[ | ||||
(r'(true|false|null)\b', Keyword.Constant), | ||||
(r'-?[0-9]+', Number.Integer), | ||||
(r'"(\\\\|\\"|[^"])*"', String.Double), | ||||
], | ||||
# the right hand side of an object, after the attribute name | ||||
'objectattribute': [ | ||||
include('value'), | ||||
(r':', Punctuation), | ||||
# comma terminates the attribute but expects more | ||||
(r',', Punctuation, '#pop'), | ||||
# a closing bracket terminates the entire object, so pop twice | ||||
(r'}', Punctuation, ('#pop', '#pop')), | ||||
], | ||||
# a json object - { attr, attr, ... } | ||||
'objectvalue': [ | ||||
include('whitespace'), | ||||
(r'"(\\\\|\\"|[^"])*"', Name.Tag, 'objectattribute'), | ||||
(r'}', Punctuation, '#pop'), | ||||
], | ||||
# json array - [ value, value, ... } | ||||
'arrayvalue': [ | ||||
include('whitespace'), | ||||
include('value'), | ||||
(r',', Punctuation), | ||||
(r']', Punctuation, '#pop'), | ||||
], | ||||
# a json value - either a simple value or a complex value (object or array) | ||||
'value': [ | ||||
include('whitespace'), | ||||
include('simplevalue'), | ||||
(r'{', Punctuation, 'objectvalue'), | ||||
(r'\[', Punctuation, 'arrayvalue'), | ||||
], | ||||
# the root of a json document whould be a value | ||||
'root': [ | ||||
include('value'), | ||||
], | ||||
} | ||||
class ActionScriptLexer(RegexLexer): | ||||
""" | ||||
For ActionScript source code. | ||||
*New in Pygments 0.9.* | ||||
""" | ||||
name = 'ActionScript' | ||||
aliases = ['as', 'actionscript'] | ||||
filenames = ['*.as'] | ||||
mimetypes = ['application/x-actionscript3', 'text/x-actionscript3', | ||||
'text/actionscript3'] | ||||
flags = re.DOTALL | ||||
tokens = { | ||||
'root': [ | ||||
(r'\s+', Text), | ||||
(r'//.*?\n', Comment.Single), | ||||
(r'/\*.*?\*/', Comment.Multiline), | ||||
(r'/(\\\\|\\/|[^/\n])*/[gim]*', String.Regex), | ||||
(r'[~\^\*!%&<>\|+=:;,/?\\-]+', Operator), | ||||
(r'[{}\[\]();.]+', Punctuation), | ||||
(r'(case|default|for|each|in|while|do|break|return|continue|if|else|' | ||||
r'throw|try|catch|var|with|new|typeof|arguments|instanceof|this|' | ||||
r'switch)\b', Keyword), | ||||
(r'(class|public|final|internal|native|override|private|protected|' | ||||
r'static|import|extends|implements|interface|intrinsic|return|super|' | ||||
r'dynamic|function|const|get|namespace|package|set)\b', | ||||
Keyword.Declaration), | ||||
(r'(true|false|null|NaN|Infinity|-Infinity|undefined|Void)\b', | ||||
Keyword.Constant), | ||||
(r'(Accessibility|AccessibilityProperties|ActionScriptVersion|' | ||||
r'ActivityEvent|AntiAliasType|ApplicationDomain|AsBroadcaster|Array|' | ||||
r'AsyncErrorEvent|AVM1Movie|BevelFilter|Bitmap|BitmapData|' | ||||
r'BitmapDataChannel|BitmapFilter|BitmapFilterQuality|BitmapFilterType|' | ||||
r'BlendMode|BlurFilter|Boolean|ByteArray|Camera|Capabilities|CapsStyle|' | ||||
r'Class|Color|ColorMatrixFilter|ColorTransform|ContextMenu|' | ||||
r'ContextMenuBuiltInItems|ContextMenuEvent|ContextMenuItem|' | ||||
r'ConvultionFilter|CSMSettings|DataEvent|Date|DefinitionError|' | ||||
r'DeleteObjectSample|Dictionary|DisplacmentMapFilter|DisplayObject|' | ||||
r'DisplacmentMapFilterMode|DisplayObjectContainer|DropShadowFilter|' | ||||
r'Endian|EOFError|Error|ErrorEvent|EvalError|Event|EventDispatcher|' | ||||
r'EventPhase|ExternalInterface|FileFilter|FileReference|' | ||||
r'FileReferenceList|FocusDirection|FocusEvent|Font|FontStyle|FontType|' | ||||
r'FrameLabel|FullScreenEvent|Function|GlowFilter|GradientBevelFilter|' | ||||
r'GradientGlowFilter|GradientType|Graphics|GridFitType|HTTPStatusEvent|' | ||||
r'IBitmapDrawable|ID3Info|IDataInput|IDataOutput|IDynamicPropertyOutput' | ||||
r'IDynamicPropertyWriter|IEventDispatcher|IExternalizable|' | ||||
r'IllegalOperationError|IME|IMEConversionMode|IMEEvent|int|' | ||||
r'InteractiveObject|InterpolationMethod|InvalidSWFError|InvokeEvent|' | ||||
r'IOError|IOErrorEvent|JointStyle|Key|Keyboard|KeyboardEvent|KeyLocation|' | ||||
r'LineScaleMode|Loader|LoaderContext|LoaderInfo|LoadVars|LocalConnection|' | ||||
r'Locale|Math|Matrix|MemoryError|Microphone|MorphShape|Mouse|MouseEvent|' | ||||
r'MovieClip|MovieClipLoader|Namespace|NetConnection|NetStatusEvent|' | ||||
r'NetStream|NewObjectSample|Number|Object|ObjectEncoding|PixelSnapping|' | ||||
r'Point|PrintJob|PrintJobOptions|PrintJobOrientation|ProgressEvent|Proxy|' | ||||
r'QName|RangeError|Rectangle|ReferenceError|RegExp|Responder|Sample|Scene|' | ||||
r'ScriptTimeoutError|Security|SecurityDomain|SecurityError|' | ||||
r'SecurityErrorEvent|SecurityPanel|Selection|Shape|SharedObject|' | ||||
r'SharedObjectFlushStatus|SimpleButton|Socket|Sound|SoundChannel|' | ||||
r'SoundLoaderContext|SoundMixer|SoundTransform|SpreadMethod|Sprite|' | ||||
r'StackFrame|StackOverflowError|Stage|StageAlign|StageDisplayState|' | ||||
r'StageQuality|StageScaleMode|StaticText|StatusEvent|String|StyleSheet|' | ||||
r'SWFVersion|SyncEvent|SyntaxError|System|TextColorType|TextField|' | ||||
r'TextFieldAutoSize|TextFieldType|TextFormat|TextFormatAlign|' | ||||
r'TextLineMetrics|TextRenderer|TextSnapshot|Timer|TimerEvent|Transform|' | ||||
r'TypeError|uint|URIError|URLLoader|URLLoaderDataFormat|URLRequest|' | ||||
r'URLRequestHeader|URLRequestMethod|URLStream|URLVariabeles|VerifyError|' | ||||
r'Video|XML|XMLDocument|XMLList|XMLNode|XMLNodeType|XMLSocket|XMLUI)\b', | ||||
Name.Builtin), | ||||
(r'(decodeURI|decodeURIComponent|encodeURI|escape|eval|isFinite|isNaN|' | ||||
r'isXMLName|clearInterval|fscommand|getTimer|getURL|getVersion|' | ||||
r'isFinite|parseFloat|parseInt|setInterval|trace|updateAfterEvent|' | ||||
r'unescape)\b',Name.Function), | ||||
(r'[$a-zA-Z_][a-zA-Z0-9_]*', Name.Other), | ||||
(r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float), | ||||
(r'0x[0-9a-f]+', Number.Hex), | ||||
(r'[0-9]+', Number.Integer), | ||||
(r'"(\\\\|\\"|[^"])*"', String.Double), | ||||
(r"'(\\\\|\\'|[^'])*'", String.Single), | ||||
] | ||||
} | ||||
class ActionScript3Lexer(RegexLexer): | ||||
""" | ||||
For ActionScript 3 source code. | ||||
*New in Pygments 0.11.* | ||||
""" | ||||
name = 'ActionScript 3' | ||||
aliases = ['as3', 'actionscript3'] | ||||
filenames = ['*.as'] | ||||
mimetypes = ['application/x-actionscript', 'text/x-actionscript', | ||||
'text/actionscript'] | ||||
identifier = r'[$a-zA-Z_][a-zA-Z0-9_]*' | ||||
typeidentifier = identifier + '(?:\.<\w+>)?' | ||||
flags = re.DOTALL | re.MULTILINE | ||||
tokens = { | ||||
'root': [ | ||||
(r'\s+', Text), | ||||
(r'(function\s+)(' + identifier + r')(\s*)(\()', | ||||
bygroups(Keyword.Declaration, Name.Function, Text, Operator), | ||||
'funcparams'), | ||||
(r'(var|const)(\s+)(' + identifier + r')(\s*)(:)(\s*)(' + | ||||
typeidentifier + r')', | ||||
bygroups(Keyword.Declaration, Text, Name, Text, Punctuation, Text, | ||||
Keyword.Type)), | ||||
(r'(import|package)(\s+)((?:' + identifier + r'|\.)+)(\s*)', | ||||
bygroups(Keyword, Text, Name.Namespace, Text)), | ||||
(r'(new)(\s+)(' + typeidentifier + r')(\s*)(\()', | ||||
bygroups(Keyword, Text, Keyword.Type, Text, Operator)), | ||||
(r'//.*?\n', Comment.Single), | ||||
(r'/\*.*?\*/', Comment.Multiline), | ||||
(r'/(\\\\|\\/|[^\n])*/[gisx]*', String.Regex), | ||||
(r'(\.)(' + identifier + r')', bygroups(Operator, Name.Attribute)), | ||||
(r'(case|default|for|each|in|while|do|break|return|continue|if|else|' | ||||
r'throw|try|catch|with|new|typeof|arguments|instanceof|this|' | ||||
r'switch|import|include|as|is)\b', | ||||
Keyword), | ||||
(r'(class|public|final|internal|native|override|private|protected|' | ||||
r'static|import|extends|implements|interface|intrinsic|return|super|' | ||||
r'dynamic|function|const|get|namespace|package|set)\b', | ||||
Keyword.Declaration), | ||||
(r'(true|false|null|NaN|Infinity|-Infinity|undefined|void)\b', | ||||
Keyword.Constant), | ||||
(r'(decodeURI|decodeURIComponent|encodeURI|escape|eval|isFinite|isNaN|' | ||||
r'isXMLName|clearInterval|fscommand|getTimer|getURL|getVersion|' | ||||
r'isFinite|parseFloat|parseInt|setInterval|trace|updateAfterEvent|' | ||||
r'unescape)\b', Name.Function), | ||||
(identifier, Name), | ||||
(r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float), | ||||
(r'0x[0-9a-f]+', Number.Hex), | ||||
(r'[0-9]+', Number.Integer), | ||||
(r'"(\\\\|\\"|[^"])*"', String.Double), | ||||
(r"'(\\\\|\\'|[^'])*'", String.Single), | ||||
(r'[~\^\*!%&<>\|+=:;,/?\\{}\[\]().-]+', Operator), | ||||
], | ||||
'funcparams': [ | ||||
(r'\s+', Text), | ||||
(r'(\s*)(\.\.\.)?(' + identifier + r')(\s*)(:)(\s*)(' + | ||||
typeidentifier + r'|\*)(\s*)', | ||||
bygroups(Text, Punctuation, Name, Text, Operator, Text, | ||||
Keyword.Type, Text), 'defval'), | ||||
(r'\)', Operator, 'type') | ||||
], | ||||
'type': [ | ||||
(r'(\s*)(:)(\s*)(' + typeidentifier + r'|\*)', | ||||
bygroups(Text, Operator, Text, Keyword.Type), '#pop:2'), | ||||
(r'\s*', Text, '#pop:2') | ||||
], | ||||
'defval': [ | ||||
(r'(=)(\s*)([^(),]+)(\s*)(,?)', | ||||
bygroups(Operator, Text, using(this), Text, Operator), '#pop'), | ||||
(r',?', Operator, '#pop') | ||||
] | ||||
} | ||||
def analyse_text(text): | ||||
if re.match(r'\w+\s*:\s*\w', text): | ||||
return 0.3 | ||||
return 0 | ||||
class CssLexer(RegexLexer): | ||||
""" | ||||
For CSS (Cascading Style Sheets). | ||||
""" | ||||
name = 'CSS' | ||||
aliases = ['css'] | ||||
filenames = ['*.css'] | ||||
mimetypes = ['text/css'] | ||||
tokens = { | ||||
'root': [ | ||||
include('basics'), | ||||
], | ||||
'basics': [ | ||||
(r'\s+', Text), | ||||
(r'/\*(?:.|\n)*?\*/', Comment), | ||||
(r'{', Punctuation, 'content'), | ||||
(r'\:[a-zA-Z0-9_-]+', Name.Decorator), | ||||
(r'\.[a-zA-Z0-9_-]+', Name.Class), | ||||
(r'\#[a-zA-Z0-9_-]+', Name.Function), | ||||
(r'@[a-zA-Z0-9_-]+', Keyword, 'atrule'), | ||||
(r'[a-zA-Z0-9_-]+', Name.Tag), | ||||
(r'[~\^\*!%&\[\]\(\)<>\|+=@:;,./?-]', Operator), | ||||
(r'"(\\\\|\\"|[^"])*"', String.Double), | ||||
(r"'(\\\\|\\'|[^'])*'", String.Single) | ||||
], | ||||
'atrule': [ | ||||
(r'{', Punctuation, 'atcontent'), | ||||
(r';', Punctuation, '#pop'), | ||||
include('basics'), | ||||
], | ||||
'atcontent': [ | ||||
include('basics'), | ||||
(r'}', Punctuation, '#pop:2'), | ||||
], | ||||
'content': [ | ||||
(r'\s+', Text), | ||||
(r'}', Punctuation, '#pop'), | ||||
(r'url\(.*?\)', String.Other), | ||||
(r'^@.*?$', Comment.Preproc), | ||||
(r'(azimuth|background-attachment|background-color|' | ||||
r'background-image|background-position|background-repeat|' | ||||
r'background|border-bottom-color|border-bottom-style|' | ||||
r'border-bottom-width|border-left-color|border-left-style|' | ||||
r'border-left-width|border-right|border-right-color|' | ||||
r'border-right-style|border-right-width|border-top-color|' | ||||
r'border-top-style|border-top-width|border-bottom|' | ||||
r'border-collapse|border-left|border-width|border-color|' | ||||
r'border-spacing|border-style|border-top|border|caption-side|' | ||||
r'clear|clip|color|content|counter-increment|counter-reset|' | ||||
r'cue-after|cue-before|cue|cursor|direction|display|' | ||||
r'elevation|empty-cells|float|font-family|font-size|' | ||||
r'font-size-adjust|font-stretch|font-style|font-variant|' | ||||
r'font-weight|font|height|letter-spacing|line-height|' | ||||
r'list-style-type|list-style-image|list-style-position|' | ||||
r'list-style|margin-bottom|margin-left|margin-right|' | ||||
r'margin-top|margin|marker-offset|marks|max-height|max-width|' | ||||
r'min-height|min-width|opacity|orphans|outline|outline-color|' | ||||
r'outline-style|outline-width|overflow(?:-x|-y)?|padding-bottom|' | ||||
r'padding-left|padding-right|padding-top|padding|page|' | ||||
r'page-break-after|page-break-before|page-break-inside|' | ||||
r'pause-after|pause-before|pause|pitch|pitch-range|' | ||||
r'play-during|position|quotes|richness|right|size|' | ||||
r'speak-header|speak-numeral|speak-punctuation|speak|' | ||||
r'speech-rate|stress|table-layout|text-align|text-decoration|' | ||||
r'text-indent|text-shadow|text-transform|top|unicode-bidi|' | ||||
r'vertical-align|visibility|voice-family|volume|white-space|' | ||||
r'widows|width|word-spacing|z-index|bottom|left|' | ||||
r'above|absolute|always|armenian|aural|auto|avoid|baseline|' | ||||
r'behind|below|bidi-override|blink|block|bold|bolder|both|' | ||||
r'capitalize|center-left|center-right|center|circle|' | ||||
r'cjk-ideographic|close-quote|collapse|condensed|continuous|' | ||||
r'crop|crosshair|cross|cursive|dashed|decimal-leading-zero|' | ||||
r'decimal|default|digits|disc|dotted|double|e-resize|embed|' | ||||
r'extra-condensed|extra-expanded|expanded|fantasy|far-left|' | ||||
r'far-right|faster|fast|fixed|georgian|groove|hebrew|help|' | ||||
r'hidden|hide|higher|high|hiragana-iroha|hiragana|icon|' | ||||
r'inherit|inline-table|inline|inset|inside|invert|italic|' | ||||
r'justify|katakana-iroha|katakana|landscape|larger|large|' | ||||
r'left-side|leftwards|level|lighter|line-through|list-item|' | ||||
r'loud|lower-alpha|lower-greek|lower-roman|lowercase|ltr|' | ||||
r'lower|low|medium|message-box|middle|mix|monospace|' | ||||
r'n-resize|narrower|ne-resize|no-close-quote|no-open-quote|' | ||||
r'no-repeat|none|normal|nowrap|nw-resize|oblique|once|' | ||||
r'open-quote|outset|outside|overline|pointer|portrait|px|' | ||||
r'relative|repeat-x|repeat-y|repeat|rgb|ridge|right-side|' | ||||
r'rightwards|s-resize|sans-serif|scroll|se-resize|' | ||||
r'semi-condensed|semi-expanded|separate|serif|show|silent|' | ||||
r'slow|slower|small-caps|small-caption|smaller|soft|solid|' | ||||
r'spell-out|square|static|status-bar|super|sw-resize|' | ||||
r'table-caption|table-cell|table-column|table-column-group|' | ||||
r'table-footer-group|table-header-group|table-row|' | ||||
r'table-row-group|text|text-bottom|text-top|thick|thin|' | ||||
r'transparent|ultra-condensed|ultra-expanded|underline|' | ||||
r'upper-alpha|upper-latin|upper-roman|uppercase|url|' | ||||
r'visible|w-resize|wait|wider|x-fast|x-high|x-large|x-loud|' | ||||
r'x-low|x-small|x-soft|xx-large|xx-small|yes)\b', Keyword), | ||||
(r'(indigo|gold|firebrick|indianred|yellow|darkolivegreen|' | ||||
r'darkseagreen|mediumvioletred|mediumorchid|chartreuse|' | ||||
r'mediumslateblue|black|springgreen|crimson|lightsalmon|brown|' | ||||
r'turquoise|olivedrab|cyan|silver|skyblue|gray|darkturquoise|' | ||||
r'goldenrod|darkgreen|darkviolet|darkgray|lightpink|teal|' | ||||
r'darkmagenta|lightgoldenrodyellow|lavender|yellowgreen|thistle|' | ||||
r'violet|navy|orchid|blue|ghostwhite|honeydew|cornflowerblue|' | ||||
r'darkblue|darkkhaki|mediumpurple|cornsilk|red|bisque|slategray|' | ||||
r'darkcyan|khaki|wheat|deepskyblue|darkred|steelblue|aliceblue|' | ||||
r'gainsboro|mediumturquoise|floralwhite|coral|purple|lightgrey|' | ||||
r'lightcyan|darksalmon|beige|azure|lightsteelblue|oldlace|' | ||||
r'greenyellow|royalblue|lightseagreen|mistyrose|sienna|' | ||||
r'lightcoral|orangered|navajowhite|lime|palegreen|burlywood|' | ||||
r'seashell|mediumspringgreen|fuchsia|papayawhip|blanchedalmond|' | ||||
r'peru|aquamarine|white|darkslategray|ivory|dodgerblue|' | ||||
r'lemonchiffon|chocolate|orange|forestgreen|slateblue|olive|' | ||||
r'mintcream|antiquewhite|darkorange|cadetblue|moccasin|' | ||||
r'limegreen|saddlebrown|darkslateblue|lightskyblue|deeppink|' | ||||
r'plum|aqua|darkgoldenrod|maroon|sandybrown|magenta|tan|' | ||||
r'rosybrown|pink|lightblue|palevioletred|mediumseagreen|' | ||||
r'dimgray|powderblue|seagreen|snow|mediumblue|midnightblue|' | ||||
r'paleturquoise|palegoldenrod|whitesmoke|darkorchid|salmon|' | ||||
r'lightslategray|lawngreen|lightgreen|tomato|hotpink|' | ||||
r'lightyellow|lavenderblush|linen|mediumaquamarine|green|' | ||||
r'blueviolet|peachpuff)\b', Name.Builtin), | ||||
(r'\!important', Comment.Preproc), | ||||
(r'/\*(?:.|\n)*?\*/', Comment), | ||||
(r'\#[a-zA-Z0-9]{1,6}', Number), | ||||
(r'[\.-]?[0-9]*[\.]?[0-9]+(em|px|\%|pt|pc|in|mm|cm|ex|s)\b', Number), | ||||
(r'-?[0-9]+', Number), | ||||
(r'[~\^\*!%&<>\|+=@:,./?-]+', Operator), | ||||
(r'[\[\]();]+', Punctuation), | ||||
(r'"(\\\\|\\"|[^"])*"', String.Double), | ||||
(r"'(\\\\|\\'|[^'])*'", String.Single), | ||||
(r'[a-zA-Z_][a-zA-Z0-9_]+', Name) | ||||
] | ||||
} | ||||
class ObjectiveJLexer(RegexLexer): | ||||
""" | ||||
For Objective-J source code with preprocessor directives. | ||||
*New in Pygments 1.3.* | ||||
""" | ||||
name = 'Objective-J' | ||||
aliases = ['objective-j', 'objectivej', 'obj-j', 'objj'] | ||||
filenames = ['*.j'] | ||||
mimetypes = ['text/x-objective-j'] | ||||
#: optional Comment or Whitespace | ||||
_ws = r'(?:\s|//.*?\n|/[*].*?[*]/)*' | ||||
flags = re.DOTALL | re.MULTILINE | ||||
tokens = { | ||||
'root': [ | ||||
include('whitespace'), | ||||
# function definition | ||||
(r'^(' + _ws + r'[\+-]' + _ws + r')([\(a-zA-Z_].*?[^\(])(' + _ws + '{)', | ||||
bygroups(using(this), using(this, state='function_signature'), | ||||
using(this))), | ||||
# class definition | ||||
(r'(@interface|@implementation)(\s+)', bygroups(Keyword, Text), | ||||
'classname'), | ||||
(r'(@class|@protocol)(\s*)', bygroups(Keyword, Text), | ||||
'forward_classname'), | ||||
(r'(\s*)(@end)(\s*)', bygroups(Text, Keyword, Text)), | ||||
include('statements'), | ||||
('[{\(\)}]', Punctuation), | ||||
(';', Punctuation), | ||||
], | ||||
'whitespace': [ | ||||
(r'(@import)(\s+)("(?:\\\\|\\"|[^"])*")', | ||||
bygroups(Comment.Preproc, Text, String.Double)), | ||||
(r'(@import)(\s+)(<(?:\\\\|\\>|[^>])*>)', | ||||
bygroups(Comment.Preproc, Text, String.Double)), | ||||
(r'(#(?:include|import))(\s+)("(?:\\\\|\\"|[^"])*")', | ||||
bygroups(Comment.Preproc, Text, String.Double)), | ||||
(r'(#(?:include|import))(\s+)(<(?:\\\\|\\>|[^>])*>)', | ||||
bygroups(Comment.Preproc, Text, String.Double)), | ||||
(r'#if\s+0', Comment.Preproc, 'if0'), | ||||
(r'#', Comment.Preproc, 'macro'), | ||||
(r'\n', Text), | ||||
(r'\s+', Text), | ||||
(r'\\\n', Text), # line continuation | ||||
(r'//(\n|(.|\n)*?[^\\]\n)', Comment.Single), | ||||
(r'/(\\\n)?[*](.|\n)*?[*](\\\n)?/', Comment.Multiline), | ||||
(r'<!--', Comment), | ||||
], | ||||
'slashstartsregex': [ | ||||
include('whitespace'), | ||||
(r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/' | ||||
r'([gim]+\b|\B)', String.Regex, '#pop'), | ||||
(r'(?=/)', Text, ('#pop', 'badregex')), | ||||
(r'', Text, '#pop'), | ||||
], | ||||
'badregex': [ | ||||
(r'\n', Text, '#pop'), | ||||
], | ||||
'statements': [ | ||||
(r'(L|@)?"', String, 'string'), | ||||
(r"(L|@)?'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'", | ||||
String.Char), | ||||
(r'"(\\\\|\\"|[^"])*"', String.Double), | ||||
(r"'(\\\\|\\'|[^'])*'", String.Single), | ||||
(r'(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[lL]?', Number.Float), | ||||
(r'(\d+\.\d*|\.\d+|\d+[fF])[fF]?', Number.Float), | ||||
(r'0x[0-9a-fA-F]+[Ll]?', Number.Hex), | ||||
(r'0[0-7]+[Ll]?', Number.Oct), | ||||
(r'\d+[Ll]?', Number.Integer), | ||||
(r'^(?=\s|/|<!--)', Text, 'slashstartsregex'), | ||||
(r'\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|' | ||||
r'(<<|>>>?|==?|!=?|[-<>+*%&\|\^/])=?', | ||||
Operator, 'slashstartsregex'), | ||||
(r'[{(\[;,]', Punctuation, 'slashstartsregex'), | ||||
(r'[})\].]', Punctuation), | ||||
(r'(for|in|while|do|break|return|continue|switch|case|default|if|' | ||||
r'else|throw|try|catch|finally|new|delete|typeof|instanceof|void|' | ||||
r'prototype|__proto__)\b', Keyword, 'slashstartsregex'), | ||||
(r'(var|with|function)\b', Keyword.Declaration, 'slashstartsregex'), | ||||
(r'(@selector|@private|@protected|@public|@encode|' | ||||
r'@synchronized|@try|@throw|@catch|@finally|@end|@property|' | ||||
r'@synthesize|@dynamic|@for|@accessors|new)\b', Keyword), | ||||
(r'(int|long|float|short|double|char|unsigned|signed|void|' | ||||
r'id|BOOL|bool|boolean|IBOutlet|IBAction|SEL|@outlet|@action)\b', | ||||
Keyword.Type), | ||||
(r'(self|super)\b', Name.Builtin), | ||||
(r'(TRUE|YES|FALSE|NO|Nil|nil|NULL)\b', Keyword.Constant), | ||||
(r'(true|false|null|NaN|Infinity|undefined)\b', Keyword.Constant), | ||||
(r'(ABS|ASIN|ACOS|ATAN|ATAN2|SIN|COS|TAN|EXP|POW|CEIL|FLOOR|ROUND|' | ||||
r'MIN|MAX|RAND|SQRT|E|LN2|LN10|LOG2E|LOG10E|PI|PI2|PI_2|SQRT1_2|' | ||||
r'SQRT2)\b', Keyword.Constant), | ||||
(r'(Array|Boolean|Date|Error|Function|Math|netscape|' | ||||
r'Number|Object|Packages|RegExp|String|sun|decodeURI|' | ||||
r'decodeURIComponent|encodeURI|encodeURIComponent|' | ||||
r'Error|eval|isFinite|isNaN|parseFloat|parseInt|document|this|' | ||||
r'window)\b', Name.Builtin), | ||||
(r'([$a-zA-Z_][a-zA-Z0-9_]*)(' + _ws + r')(?=\()', | ||||
bygroups(Name.Function, using(this))), | ||||
(r'[$a-zA-Z_][a-zA-Z0-9_]*', Name), | ||||
], | ||||
'classname' : [ | ||||
# interface definition that inherits | ||||
(r'([a-zA-Z_][a-zA-Z0-9_]*)(' + _ws + r':' + _ws + | ||||
r')([a-zA-Z_][a-zA-Z0-9_]*)?', | ||||
bygroups(Name.Class, using(this), Name.Class), '#pop'), | ||||
# interface definition for a category | ||||
(r'([a-zA-Z_][a-zA-Z0-9_]*)(' + _ws + r'\()([a-zA-Z_][a-zA-Z0-9_]*)(\))', | ||||
bygroups(Name.Class, using(this), Name.Label, Text), '#pop'), | ||||
# simple interface / implementation | ||||
(r'([a-zA-Z_][a-zA-Z0-9_]*)', Name.Class, '#pop'), | ||||
], | ||||
'forward_classname' : [ | ||||
(r'([a-zA-Z_][a-zA-Z0-9_]*)(\s*,\s*)', | ||||
bygroups(Name.Class, Text), '#push'), | ||||
(r'([a-zA-Z_][a-zA-Z0-9_]*)(\s*;?)', | ||||
bygroups(Name.Class, Text), '#pop'), | ||||
], | ||||
'function_signature': [ | ||||
include('whitespace'), | ||||
# start of a selector w/ parameters | ||||
(r'(\(' + _ws + r')' # open paren | ||||
r'([a-zA-Z_][a-zA-Z0-9_]+)' # return type | ||||
r'(' + _ws + r'\)' + _ws + r')' # close paren | ||||
r'([$a-zA-Z_][a-zA-Z0-9_]+' + _ws + r':)', # function name | ||||
bygroups(using(this), Keyword.Type, using(this), | ||||
Name.Function), 'function_parameters'), | ||||
# no-param function | ||||
(r'(\(' + _ws + r')' # open paren | ||||
r'([a-zA-Z_][a-zA-Z0-9_]+)' # return type | ||||
r'(' + _ws + r'\)' + _ws + r')' # close paren | ||||
r'([$a-zA-Z_][a-zA-Z0-9_]+)', # function name | ||||
bygroups(using(this), Keyword.Type, using(this), | ||||
Name.Function), "#pop"), | ||||
# no return type given, start of a selector w/ parameters | ||||
(r'([$a-zA-Z_][a-zA-Z0-9_]+' + _ws + r':)', # function name | ||||
bygroups (Name.Function), 'function_parameters'), | ||||
# no return type given, no-param function | ||||
(r'([$a-zA-Z_][a-zA-Z0-9_]+)', # function name | ||||
bygroups(Name.Function), "#pop"), | ||||
('', Text, '#pop'), | ||||
], | ||||
'function_parameters': [ | ||||
include('whitespace'), | ||||
# parameters | ||||
(r'(\(' + _ws + ')' # open paren | ||||
r'([^\)]+)' # type | ||||
r'(' + _ws + r'\)' + _ws + r')' # close paren | ||||
r'([$a-zA-Z_][a-zA-Z0-9_]+)', # param name | ||||
bygroups(using(this), Keyword.Type, using(this), Text)), | ||||
# one piece of a selector name | ||||
(r'([$a-zA-Z_][a-zA-Z0-9_]+' + _ws + r':)', # function name | ||||
Name.Function), | ||||
# smallest possible selector piece | ||||
(r'(:)', Name.Function), | ||||
# var args | ||||
(r'(,' + _ws + r'\.\.\.)', using(this)), | ||||
# param name | ||||
(r'([$a-zA-Z_][a-zA-Z0-9_]+)', Text), | ||||
], | ||||
'expression' : [ | ||||
(r'([$a-zA-Z_][a-zA-Z0-9_]*)(\()', bygroups(Name.Function, | ||||
Punctuation)), | ||||
(r'(\))', Punctuation, "#pop"), | ||||
], | ||||
'string': [ | ||||
(r'"', String, '#pop'), | ||||
(r'\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})', String.Escape), | ||||
(r'[^\\"\n]+', String), # all other characters | ||||
(r'\\\n', String), # line continuation | ||||
(r'\\', String), # stray backslash | ||||
], | ||||
'macro': [ | ||||
(r'[^/\n]+', Comment.Preproc), | ||||
(r'/[*](.|\n)*?[*]/', Comment.Multiline), | ||||
(r'//.*?\n', Comment.Single, '#pop'), | ||||
(r'/', Comment.Preproc), | ||||
(r'(?<=\\)\n', Comment.Preproc), | ||||
(r'\n', Comment.Preproc, '#pop'), | ||||
], | ||||
'if0': [ | ||||
(r'^\s*#if.*?(?<!\\)\n', Comment.Preproc, '#push'), | ||||
(r'^\s*#endif.*?(?<!\\)\n', Comment.Preproc, '#pop'), | ||||
(r'.*?\n', Comment), | ||||
] | ||||
} | ||||
def analyse_text(text): | ||||
if re.search('^\s*@import\s+[<"]', text, re.MULTILINE): | ||||
# special directive found in most Objective-J files | ||||
return True | ||||
return False | ||||
class HtmlLexer(RegexLexer): | ||||
""" | ||||
For HTML 4 and XHTML 1 markup. Nested JavaScript and CSS is highlighted | ||||
by the appropriate lexer. | ||||
""" | ||||
name = 'HTML' | ||||
aliases = ['html'] | ||||
filenames = ['*.html', '*.htm', '*.xhtml', '*.xslt'] | ||||
mimetypes = ['text/html', 'application/xhtml+xml'] | ||||
flags = re.IGNORECASE | re.DOTALL | ||||
tokens = { | ||||
'root': [ | ||||
('[^<&]+', Text), | ||||
(r'&\S*?;', Name.Entity), | ||||
(r'\<\!\[CDATA\[.*?\]\]\>', Comment.Preproc), | ||||
('<!--', Comment, 'comment'), | ||||
(r'<\?.*?\?>', Comment.Preproc), | ||||
('<![^>]*>', Comment.Preproc), | ||||
(r'<\s*script\s*', Name.Tag, ('script-content', 'tag')), | ||||
(r'<\s*style\s*', Name.Tag, ('style-content', 'tag')), | ||||
(r'<\s*[a-zA-Z0-9:]+', Name.Tag, 'tag'), | ||||
(r'<\s*/\s*[a-zA-Z0-9:]+\s*>', Name.Tag), | ||||
], | ||||
'comment': [ | ||||
('[^-]+', Comment), | ||||
('-->', Comment, '#pop'), | ||||
('-', Comment), | ||||
], | ||||
'tag': [ | ||||
(r'\s+', Text), | ||||
(r'[a-zA-Z0-9_:-]+\s*=', Name.Attribute, 'attr'), | ||||
(r'[a-zA-Z0-9_:-]+', Name.Attribute), | ||||
(r'/?\s*>', Name.Tag, '#pop'), | ||||
], | ||||
'script-content': [ | ||||
(r'<\s*/\s*script\s*>', Name.Tag, '#pop'), | ||||
(r'.+?(?=<\s*/\s*script\s*>)', using(JavascriptLexer)), | ||||
], | ||||
'style-content': [ | ||||
(r'<\s*/\s*style\s*>', Name.Tag, '#pop'), | ||||
(r'.+?(?=<\s*/\s*style\s*>)', using(CssLexer)), | ||||
], | ||||
'attr': [ | ||||
('".*?"', String, '#pop'), | ||||
("'.*?'", String, '#pop'), | ||||
(r'[^\s>]+', String, '#pop'), | ||||
], | ||||
} | ||||
def analyse_text(text): | ||||
if html_doctype_matches(text): | ||||
return 0.5 | ||||
class PhpLexer(RegexLexer): | ||||
""" | ||||
For `PHP <http://www.php.net/>`_ source code. | ||||
For PHP embedded in HTML, use the `HtmlPhpLexer`. | ||||
Additional options accepted: | ||||
`startinline` | ||||
If given and ``True`` the lexer starts highlighting with | ||||
php code (i.e.: no starting ``<?php`` required). The default | ||||
is ``False``. | ||||
`funcnamehighlighting` | ||||
If given and ``True``, highlight builtin function names | ||||
(default: ``True``). | ||||
`disabledmodules` | ||||
If given, must be a list of module names whose function names | ||||
should not be highlighted. By default all modules are highlighted | ||||
except the special ``'unknown'`` module that includes functions | ||||
that are known to php but are undocumented. | ||||
To get a list of allowed modules have a look into the | ||||
`_phpbuiltins` module: | ||||
.. sourcecode:: pycon | ||||
>>> from pygments.lexers._phpbuiltins import MODULES | ||||
>>> MODULES.keys() | ||||
['PHP Options/Info', 'Zip', 'dba', ...] | ||||
In fact the names of those modules match the module names from | ||||
the php documentation. | ||||
""" | ||||
name = 'PHP' | ||||
aliases = ['php', 'php3', 'php4', 'php5'] | ||||
filenames = ['*.php', '*.php[345]'] | ||||
mimetypes = ['text/x-php'] | ||||
flags = re.IGNORECASE | re.DOTALL | re.MULTILINE | ||||
tokens = { | ||||
'root': [ | ||||
(r'<\?(php)?', Comment.Preproc, 'php'), | ||||
(r'[^<]+', Other), | ||||
(r'<', Other) | ||||
], | ||||
'php': [ | ||||
(r'\?>', Comment.Preproc, '#pop'), | ||||
(r'<<<(\'?)([a-zA-Z_][a-zA-Z0-9_]*)\1\n.*?\n\2\;?\n', String), | ||||
(r'\s+', Text), | ||||
(r'#.*?\n', Comment.Single), | ||||
(r'//.*?\n', Comment.Single), | ||||
# put the empty comment here, it is otherwise seen as | ||||
# the start of a docstring | ||||
(r'/\*\*/', Comment.Multiline), | ||||
(r'/\*\*.*?\*/', String.Doc), | ||||
(r'/\*.*?\*/', Comment.Multiline), | ||||
(r'(->|::)(\s*)([a-zA-Z_][a-zA-Z0-9_]*)', | ||||
bygroups(Operator, Text, Name.Attribute)), | ||||
(r'[~!%^&*+=|:.<>/?@-]+', Operator), | ||||
(r'[\[\]{}();,]+', Punctuation), | ||||
(r'(class)(\s+)', bygroups(Keyword, Text), 'classname'), | ||||
(r'(function)(\s*)(?=\()', bygroups(Keyword, Text)), | ||||
(r'(function)(\s+)(&?)(\s*)', | ||||
bygroups(Keyword, Text, Operator, Text), 'functionname'), | ||||
(r'(const)(\s+)([a-zA-Z_][a-zA-Z0-9_]*)', | ||||
bygroups(Keyword, Text, Name.Constant)), | ||||
(r'(and|E_PARSE|old_function|E_ERROR|or|as|E_WARNING|parent|' | ||||
r'eval|PHP_OS|break|exit|case|extends|PHP_VERSION|cfunction|' | ||||
r'FALSE|print|for|require|continue|foreach|require_once|' | ||||
r'declare|return|default|static|do|switch|die|stdClass|' | ||||
r'echo|else|TRUE|elseif|var|empty|if|xor|enddeclare|include|' | ||||
r'virtual|endfor|include_once|while|endforeach|global|__FILE__|' | ||||
r'endif|list|__LINE__|endswitch|new|__sleep|endwhile|not|' | ||||
r'array|__wakeup|E_ALL|NULL|final|php_user_filter|interface|' | ||||
r'implements|public|private|protected|abstract|clone|try|' | ||||
r'catch|throw|this|use|namespace)\b', Keyword), | ||||
(r'(true|false|null)\b', Keyword.Constant), | ||||
(r'\$\{\$+[a-zA-Z_][a-zA-Z0-9_]*\}', Name.Variable), | ||||
(r'\$+[a-zA-Z_][a-zA-Z0-9_]*', Name.Variable), | ||||
(r'[\\a-zA-Z_][\\a-zA-Z0-9_]*', Name.Other), | ||||
(r'(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?', Number.Float), | ||||
(r'\d+[eE][+-]?[0-9]+', Number.Float), | ||||
(r'0[0-7]+', Number.Oct), | ||||
(r'0[xX][a-fA-F0-9]+', Number.Hex), | ||||
(r'\d+', Number.Integer), | ||||
(r"'([^'\\]*(?:\\.[^'\\]*)*)'", String.Single), | ||||
(r'`([^`\\]*(?:\\.[^`\\]*)*)`', String.Backtick), | ||||
(r'"', String.Double, 'string'), | ||||
], | ||||
'classname': [ | ||||
(r'[a-zA-Z_][\\a-zA-Z0-9_]*', Name.Class, '#pop') | ||||
], | ||||
'functionname': [ | ||||
(r'[a-zA-Z_][a-zA-Z0-9_]*', Name.Function, '#pop') | ||||
], | ||||
'string': [ | ||||
(r'"', String.Double, '#pop'), | ||||
(r'[^{$"\\]+', String.Double), | ||||
(r'\\([nrt\"$\\]|[0-7]{1,3}|x[0-9A-Fa-f]{1,2})', String.Escape), | ||||
(r'\$[a-zA-Z_][a-zA-Z0-9_]*(\[\S+\]|->[a-zA-Z_][a-zA-Z0-9_]*)?', | ||||
String.Interpol), | ||||
(r'(\{\$\{)(.*?)(\}\})', | ||||
bygroups(String.Interpol, using(this, _startinline=True), | ||||
String.Interpol)), | ||||
(r'(\{)(\$.*?)(\})', | ||||
bygroups(String.Interpol, using(this, _startinline=True), | ||||
String.Interpol)), | ||||
(r'(\$\{)(\S+)(\})', | ||||
bygroups(String.Interpol, Name.Variable, String.Interpol)), | ||||
(r'[${\\]+', String.Double) | ||||
], | ||||
} | ||||
def __init__(self, **options): | ||||
self.funcnamehighlighting = get_bool_opt( | ||||
options, 'funcnamehighlighting', True) | ||||
self.disabledmodules = get_list_opt( | ||||
options, 'disabledmodules', ['unknown']) | ||||
self.startinline = get_bool_opt(options, 'startinline', False) | ||||
# private option argument for the lexer itself | ||||
if '_startinline' in options: | ||||
self.startinline = options.pop('_startinline') | ||||
# collect activated functions in a set | ||||
self._functions = set() | ||||
if self.funcnamehighlighting: | ||||
from pygments.lexers._phpbuiltins import MODULES | ||||
for key, value in MODULES.iteritems(): | ||||
if key not in self.disabledmodules: | ||||
self._functions.update(value) | ||||
RegexLexer.__init__(self, **options) | ||||
def get_tokens_unprocessed(self, text): | ||||
stack = ['root'] | ||||
if self.startinline: | ||||
stack.append('php') | ||||
for index, token, value in \ | ||||
RegexLexer.get_tokens_unprocessed(self, text, stack): | ||||
if token is Name.Other: | ||||
if value in self._functions: | ||||
yield index, Name.Builtin, value | ||||
continue | ||||
yield index, token, value | ||||
def analyse_text(text): | ||||
rv = 0.0 | ||||
if re.search(r'<\?(?!xml)', text): | ||||
rv += 0.3 | ||||
if '?>' in text: | ||||
rv += 0.1 | ||||
return rv | ||||
class DtdLexer(RegexLexer): | ||||
""" | ||||
A lexer for DTDs (Document Type Definitions). | ||||
*New in Pygments 1.5.* | ||||
""" | ||||
flags = re.MULTILINE | re.DOTALL | ||||
name = 'DTD' | ||||
aliases = ['dtd'] | ||||
filenames = ['*.dtd'] | ||||
mimetypes = ['application/xml-dtd'] | ||||
tokens = { | ||||
'root': [ | ||||
include('common'), | ||||
(r'(<!ELEMENT)(\s+)(\S+)', | ||||
bygroups(Keyword, Text, Name.Tag), 'element'), | ||||
(r'(<!ATTLIST)(\s+)(\S+)', | ||||
bygroups(Keyword, Text, Name.Tag), 'attlist'), | ||||
(r'(<!ENTITY)(\s+)(\S+)', | ||||
bygroups(Keyword, Text, Name.Entity), 'entity'), | ||||
(r'(<!NOTATION)(\s+)(\S+)', | ||||
bygroups(Keyword, Text, Name.Tag), 'notation'), | ||||
(r'(<!\[)([^\[\s]+)(\s*)(\[)', # conditional sections | ||||
bygroups(Keyword, Name.Entity, Text, Keyword)), | ||||
(r'(<!DOCTYPE)(\s+)([^>\s]+)', | ||||
bygroups(Keyword, Text, Name.Tag)), | ||||
(r'PUBLIC|SYSTEM', Keyword.Constant), | ||||
(r'[\[\]>]', Keyword), | ||||
], | ||||
'common': [ | ||||
(r'\s+', Text), | ||||
(r'(%|&)[^;]*;', Name.Entity), | ||||
('<!--', Comment, 'comment'), | ||||
(r'[(|)*,?+]', Operator), | ||||
(r'"[^"]*"', String.Double), | ||||
(r'\'[^\']*\'', String.Single), | ||||
], | ||||
'comment': [ | ||||
('[^-]+', Comment), | ||||
('-->', Comment, '#pop'), | ||||
('-', Comment), | ||||
], | ||||
'element': [ | ||||
include('common'), | ||||
(r'EMPTY|ANY|#PCDATA', Keyword.Constant), | ||||
(r'[^>\s\|()?+*,]+', Name.Tag), | ||||
(r'>', Keyword, '#pop'), | ||||
], | ||||
'attlist': [ | ||||
include('common'), | ||||
(r'CDATA|IDREFS|IDREF|ID|NMTOKENS|NMTOKEN|ENTITIES|ENTITY|NOTATION', Keyword.Constant), | ||||
(r'#REQUIRED|#IMPLIED|#FIXED', Keyword.Constant), | ||||
(r'xml:space|xml:lang', Keyword.Reserved), | ||||
(r'[^>\s\|()?+*,]+', Name.Attribute), | ||||
(r'>', Keyword, '#pop'), | ||||
], | ||||
'entity': [ | ||||
include('common'), | ||||
(r'SYSTEM|PUBLIC|NDATA', Keyword.Constant), | ||||
(r'[^>\s\|()?+*,]+', Name.Entity), | ||||
(r'>', Keyword, '#pop'), | ||||
], | ||||
'notation': [ | ||||
include('common'), | ||||
(r'SYSTEM|PUBLIC', Keyword.Constant), | ||||
(r'[^>\s\|()?+*,]+', Name.Attribute), | ||||
(r'>', Keyword, '#pop'), | ||||
], | ||||
} | ||||
def analyse_text(text): | ||||
if not looks_like_xml(text) and \ | ||||
('<!ELEMENT' in text or '<!ATTLIST' in text or '<!ENTITY' in text): | ||||
return 0.8 | ||||
class XmlLexer(RegexLexer): | ||||
""" | ||||
Generic lexer for XML (eXtensible Markup Language). | ||||
""" | ||||
flags = re.MULTILINE | re.DOTALL | ||||
name = 'XML' | ||||
aliases = ['xml'] | ||||
filenames = ['*.xml', '*.xsl', '*.rss', '*.xslt', '*.xsd', '*.wsdl'] | ||||
mimetypes = ['text/xml', 'application/xml', 'image/svg+xml', | ||||
'application/rss+xml', 'application/atom+xml'] | ||||
tokens = { | ||||
'root': [ | ||||
('[^<&]+', Text), | ||||
(r'&\S*?;', Name.Entity), | ||||
(r'\<\!\[CDATA\[.*?\]\]\>', Comment.Preproc), | ||||
('<!--', Comment, 'comment'), | ||||
(r'<\?.*?\?>', Comment.Preproc), | ||||
('<![^>]*>', Comment.Preproc), | ||||
(r'<\s*[a-zA-Z0-9:._-]+', Name.Tag, 'tag'), | ||||
(r'<\s*/\s*[a-zA-Z0-9:._-]+\s*>', Name.Tag), | ||||
], | ||||
'comment': [ | ||||
('[^-]+', Comment), | ||||
('-->', Comment, '#pop'), | ||||
('-', Comment), | ||||
], | ||||
'tag': [ | ||||
(r'\s+', Text), | ||||
(r'[a-zA-Z0-9_.:-]+\s*=', Name.Attribute, 'attr'), | ||||
(r'/?\s*>', Name.Tag, '#pop'), | ||||
], | ||||
'attr': [ | ||||
('\s+', Text), | ||||
('".*?"', String, '#pop'), | ||||
("'.*?'", String, '#pop'), | ||||
(r'[^\s>]+', String, '#pop'), | ||||
], | ||||
} | ||||
def analyse_text(text): | ||||
if looks_like_xml(text): | ||||
return 0.5 | ||||
class XsltLexer(XmlLexer): | ||||
''' | ||||
A lexer for XSLT. | ||||
*New in Pygments 0.10.* | ||||
''' | ||||
name = 'XSLT' | ||||
aliases = ['xslt'] | ||||
filenames = ['*.xsl', '*.xslt'] | ||||
mimetypes = ['application/xsl+xml', 'application/xslt+xml'] | ||||
EXTRA_KEYWORDS = set([ | ||||
'apply-imports', 'apply-templates', 'attribute', | ||||
'attribute-set', 'call-template', 'choose', 'comment', | ||||
'copy', 'copy-of', 'decimal-format', 'element', 'fallback', | ||||
'for-each', 'if', 'import', 'include', 'key', 'message', | ||||
'namespace-alias', 'number', 'otherwise', 'output', 'param', | ||||
'preserve-space', 'processing-instruction', 'sort', | ||||
'strip-space', 'stylesheet', 'template', 'text', 'transform', | ||||
'value-of', 'variable', 'when', 'with-param' | ||||
]) | ||||
def get_tokens_unprocessed(self, text): | ||||
for index, token, value in XmlLexer.get_tokens_unprocessed(self, text): | ||||
m = re.match('</?xsl:([^>]*)/?>?', value) | ||||
if token is Name.Tag and m and m.group(1) in self.EXTRA_KEYWORDS: | ||||
yield index, Keyword, value | ||||
else: | ||||
yield index, token, value | ||||
def analyse_text(text): | ||||
if looks_like_xml(text) and '<xsl' in text: | ||||
return 0.8 | ||||
class MxmlLexer(RegexLexer): | ||||
""" | ||||
For MXML markup. | ||||
Nested AS3 in <script> tags is highlighted by the appropriate lexer. | ||||
""" | ||||
flags = re.MULTILINE | re.DOTALL | ||||
name = 'MXML' | ||||
aliases = ['mxml'] | ||||
filenames = ['*.mxml'] | ||||
mimetimes = ['text/xml', 'application/xml'] | ||||
tokens = { | ||||
'root': [ | ||||
('[^<&]+', Text), | ||||
(r'&\S*?;', Name.Entity), | ||||
(r'(\<\!\[CDATA\[)(.*?)(\]\]\>)', | ||||
bygroups(String, using(ActionScript3Lexer), String)), | ||||
('<!--', Comment, 'comment'), | ||||
(r'<\?.*?\?>', Comment.Preproc), | ||||
('<![^>]*>', Comment.Preproc), | ||||
(r'<\s*[a-zA-Z0-9:._-]+', Name.Tag, 'tag'), | ||||
(r'<\s*/\s*[a-zA-Z0-9:._-]+\s*>', Name.Tag), | ||||
], | ||||
'comment': [ | ||||
('[^-]+', Comment), | ||||
('-->', Comment, '#pop'), | ||||
('-', Comment), | ||||
], | ||||
'tag': [ | ||||
(r'\s+', Text), | ||||
(r'[a-zA-Z0-9_.:-]+\s*=', Name.Attribute, 'attr'), | ||||
(r'/?\s*>', Name.Tag, '#pop'), | ||||
], | ||||
'attr': [ | ||||
('\s+', Text), | ||||
('".*?"', String, '#pop'), | ||||
("'.*?'", String, '#pop'), | ||||
(r'[^\s>]+', String, '#pop'), | ||||
], | ||||
} | ||||
class HaxeLexer(RegexLexer): | ||||
""" | ||||
For haXe source code (http://haxe.org/). | ||||
""" | ||||
name = 'haXe' | ||||
aliases = ['hx', 'haXe'] | ||||
filenames = ['*.hx'] | ||||
mimetypes = ['text/haxe'] | ||||
ident = r'(?:[a-zA-Z_][a-zA-Z0-9_]*)' | ||||
typeid = r'(?:(?:[a-z0-9_\.])*[A-Z_][A-Za-z0-9_]*)' | ||||
key_prop = r'(?:default|null|never)' | ||||
key_decl_mod = r'(?:public|private|override|static|inline|extern|dynamic)' | ||||
flags = re.DOTALL | re.MULTILINE | ||||
tokens = { | ||||
'root': [ | ||||
include('whitespace'), | ||||
include('comments'), | ||||
(key_decl_mod, Keyword.Declaration), | ||||
include('enumdef'), | ||||
include('typedef'), | ||||
include('classdef'), | ||||
include('imports'), | ||||
], | ||||
# General constructs | ||||
'comments': [ | ||||
(r'//.*?\n', Comment.Single), | ||||
(r'/\*.*?\*/', Comment.Multiline), | ||||
(r'#[^\n]*', Comment.Preproc), | ||||
], | ||||
'whitespace': [ | ||||
include('comments'), | ||||
(r'\s+', Text), | ||||
], | ||||
'codekeywords': [ | ||||
(r'\b(if|else|while|do|for|in|break|continue|' | ||||
r'return|switch|case|try|catch|throw|null|trace|' | ||||
r'new|this|super|untyped|cast|callback|here)\b', | ||||
Keyword.Reserved), | ||||
], | ||||
'literals': [ | ||||
(r'0[xX][0-9a-fA-F]+', Number.Hex), | ||||
(r'[0-9]+', Number.Integer), | ||||
(r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float), | ||||
(r"'(\\\\|\\'|[^'])*'", String.Single), | ||||
(r'"(\\\\|\\"|[^"])*"', String.Double), | ||||
(r'~/([^\n])*?/[gisx]*', String.Regex), | ||||
(r'\b(true|false|null)\b', Keyword.Constant), | ||||
], | ||||
'codeblock': [ | ||||
include('whitespace'), | ||||
include('new'), | ||||
include('case'), | ||||
include('anonfundef'), | ||||
include('literals'), | ||||
include('vardef'), | ||||
include('codekeywords'), | ||||
(r'[();,\[\]]', Punctuation), | ||||
(r'(?:=|\+=|-=|\*=|/=|%=|&=|\|=|\^=|<<=|>>=|>>>=|\|\||&&|' | ||||
r'\.\.\.|==|!=|>|<|>=|<=|\||&|\^|<<|>>>|>>|\+|\-|\*|/|%|' | ||||
r'!|\+\+|\-\-|~|\.|\?|\:)', | ||||
Operator), | ||||
(ident, Name), | ||||
(r'}', Punctuation,'#pop'), | ||||
(r'{', Punctuation,'#push'), | ||||
], | ||||
# Instance/Block level constructs | ||||
'propertydef': [ | ||||
(r'(\()(' + key_prop + ')(,)(' + key_prop + ')(\))', | ||||
bygroups(Punctuation, Keyword.Reserved, Punctuation, | ||||
Keyword.Reserved, Punctuation)), | ||||
], | ||||
'new': [ | ||||
(r'\bnew\b', Keyword, 'typedecl'), | ||||
], | ||||
'case': [ | ||||
(r'\b(case)(\s+)(' + ident + ')(\s*)(\()', | ||||
bygroups(Keyword.Reserved, Text, Name, Text, Punctuation), | ||||
'funargdecl'), | ||||
], | ||||
'vardef': [ | ||||
(r'\b(var)(\s+)(' + ident + ')', | ||||
bygroups(Keyword.Declaration, Text, Name.Variable), 'vardecl'), | ||||
], | ||||
'vardecl': [ | ||||
include('whitespace'), | ||||
include('typelabel'), | ||||
(r'=', Operator,'#pop'), | ||||
(r';', Punctuation,'#pop'), | ||||
], | ||||
'instancevardef': [ | ||||
(key_decl_mod,Keyword.Declaration), | ||||
(r'\b(var)(\s+)(' + ident + ')', | ||||
bygroups(Keyword.Declaration, Text, Name.Variable.Instance), | ||||
'instancevardecl'), | ||||
], | ||||
'instancevardecl': [ | ||||
include('vardecl'), | ||||
include('propertydef'), | ||||
], | ||||
'anonfundef': [ | ||||
(r'\bfunction\b', Keyword.Declaration, 'fundecl'), | ||||
], | ||||
'instancefundef': [ | ||||
(key_decl_mod, Keyword.Declaration), | ||||
(r'\b(function)(\s+)(' + ident + ')', | ||||
bygroups(Keyword.Declaration, Text, Name.Function), 'fundecl'), | ||||
], | ||||
'fundecl': [ | ||||
include('whitespace'), | ||||
include('typelabel'), | ||||
include('generictypedecl'), | ||||
(r'\(',Punctuation,'funargdecl'), | ||||
(r'(?=[a-zA-Z0-9_])',Text,'#pop'), | ||||
(r'{',Punctuation,('#pop','codeblock')), | ||||
(r';',Punctuation,'#pop'), | ||||
], | ||||
'funargdecl': [ | ||||
include('whitespace'), | ||||
(ident, Name.Variable), | ||||
include('typelabel'), | ||||
include('literals'), | ||||
(r'=', Operator), | ||||
(r',', Punctuation), | ||||
(r'\?', Punctuation), | ||||
(r'\)', Punctuation, '#pop'), | ||||
], | ||||
'typelabel': [ | ||||
(r':', Punctuation, 'type'), | ||||
], | ||||
'typedecl': [ | ||||
include('whitespace'), | ||||
(typeid, Name.Class), | ||||
(r'<', Punctuation, 'generictypedecl'), | ||||
(r'(?=[{}()=,a-z])', Text,'#pop'), | ||||
], | ||||
'type': [ | ||||
include('whitespace'), | ||||
(typeid, Name.Class), | ||||
(r'<', Punctuation, 'generictypedecl'), | ||||
(r'->', Keyword.Type), | ||||
(r'(?=[{}(),;=])', Text, '#pop'), | ||||
], | ||||
'generictypedecl': [ | ||||
include('whitespace'), | ||||
(typeid, Name.Class), | ||||
(r'<', Punctuation, '#push'), | ||||
(r'>', Punctuation, '#pop'), | ||||
(r',', Punctuation), | ||||
], | ||||
# Top level constructs | ||||
'imports': [ | ||||
(r'(package|import|using)(\s+)([^;]+)(;)', | ||||
bygroups(Keyword.Namespace, Text, Name.Namespace,Punctuation)), | ||||
], | ||||
'typedef': [ | ||||
(r'typedef', Keyword.Declaration, ('typedefprebody', 'typedecl')), | ||||
], | ||||
'typedefprebody': [ | ||||
include('whitespace'), | ||||
(r'(=)(\s*)({)', bygroups(Punctuation, Text, Punctuation), | ||||
('#pop', 'typedefbody')), | ||||
], | ||||
'enumdef': [ | ||||
(r'enum', Keyword.Declaration, ('enumdefprebody', 'typedecl')), | ||||
], | ||||
'enumdefprebody': [ | ||||
include('whitespace'), | ||||
(r'{', Punctuation, ('#pop','enumdefbody')), | ||||
], | ||||
'classdef': [ | ||||
(r'class', Keyword.Declaration, ('classdefprebody', 'typedecl')), | ||||
], | ||||
'classdefprebody': [ | ||||
include('whitespace'), | ||||
(r'(extends|implements)', Keyword.Declaration,'typedecl'), | ||||
(r'{', Punctuation, ('#pop', 'classdefbody')), | ||||
], | ||||
'interfacedef': [ | ||||
(r'interface', Keyword.Declaration, | ||||
('interfacedefprebody', 'typedecl')), | ||||
], | ||||
'interfacedefprebody': [ | ||||
include('whitespace'), | ||||
(r'(extends)', Keyword.Declaration, 'typedecl'), | ||||
(r'{', Punctuation, ('#pop', 'classdefbody')), | ||||
], | ||||
'typedefbody': [ | ||||
include('whitespace'), | ||||
include('instancevardef'), | ||||
include('instancefundef'), | ||||
(r'>', Punctuation, 'typedecl'), | ||||
(r',', Punctuation), | ||||
(r'}', Punctuation, '#pop'), | ||||
], | ||||
'enumdefbody': [ | ||||
include('whitespace'), | ||||
(ident, Name.Variable.Instance), | ||||
(r'\(', Punctuation, 'funargdecl'), | ||||
(r';', Punctuation), | ||||
(r'}', Punctuation, '#pop'), | ||||
], | ||||
'classdefbody': [ | ||||
include('whitespace'), | ||||
include('instancevardef'), | ||||
include('instancefundef'), | ||||
(r'}', Punctuation, '#pop'), | ||||
include('codeblock'), | ||||
], | ||||
} | ||||
def analyse_text(text): | ||||
if re.match(r'\w+\s*:\s*\w', text): return 0.3 | ||||
def _indentation(lexer, match, ctx): | ||||
indentation = match.group(0) | ||||
yield match.start(), Text, indentation | ||||
ctx.last_indentation = indentation | ||||
ctx.pos = match.end() | ||||
if hasattr(ctx, 'block_state') and ctx.block_state and \ | ||||
indentation.startswith(ctx.block_indentation) and \ | ||||
indentation != ctx.block_indentation: | ||||
ctx.stack.append(ctx.block_state) | ||||
else: | ||||
ctx.block_state = None | ||||
ctx.block_indentation = None | ||||
ctx.stack.append('content') | ||||
def _starts_block(token, state): | ||||
def callback(lexer, match, ctx): | ||||
yield match.start(), token, match.group(0) | ||||
if hasattr(ctx, 'last_indentation'): | ||||
ctx.block_indentation = ctx.last_indentation | ||||
else: | ||||
ctx.block_indentation = '' | ||||
ctx.block_state = state | ||||
ctx.pos = match.end() | ||||
return callback | ||||
class HamlLexer(ExtendedRegexLexer): | ||||
""" | ||||
For Haml markup. | ||||
*New in Pygments 1.3.* | ||||
""" | ||||
name = 'Haml' | ||||
aliases = ['haml', 'HAML'] | ||||
filenames = ['*.haml'] | ||||
mimetypes = ['text/x-haml'] | ||||
flags = re.IGNORECASE | ||||
# Haml can include " |\n" anywhere, | ||||
# which is ignored and used to wrap long lines. | ||||
# To accomodate this, use this custom faux dot instead. | ||||
_dot = r'(?: \|\n(?=.* \|)|.)' | ||||
# In certain places, a comma at the end of the line | ||||
# allows line wrapping as well. | ||||
_comma_dot = r'(?:,\s*\n|' + _dot + ')' | ||||
tokens = { | ||||
'root': [ | ||||
(r'[ \t]*\n', Text), | ||||
(r'[ \t]*', _indentation), | ||||
], | ||||
'css': [ | ||||
(r'\.[a-z0-9_:-]+', Name.Class, 'tag'), | ||||
(r'\#[a-z0-9_:-]+', Name.Function, 'tag'), | ||||
], | ||||
'eval-or-plain': [ | ||||
(r'[&!]?==', Punctuation, 'plain'), | ||||
(r'([&!]?[=~])(' + _comma_dot + r'*\n)', | ||||
bygroups(Punctuation, using(RubyLexer)), | ||||
'root'), | ||||
(r'', Text, 'plain'), | ||||
], | ||||
'content': [ | ||||
include('css'), | ||||
(r'%[a-z0-9_:-]+', Name.Tag, 'tag'), | ||||
(r'!!!' + _dot + r'*\n', Name.Namespace, '#pop'), | ||||
(r'(/)(\[' + _dot + '*?\])(' + _dot + r'*\n)', | ||||
bygroups(Comment, Comment.Special, Comment), | ||||
'#pop'), | ||||
(r'/' + _dot + r'*\n', _starts_block(Comment, 'html-comment-block'), | ||||
'#pop'), | ||||
(r'-#' + _dot + r'*\n', _starts_block(Comment.Preproc, | ||||
'haml-comment-block'), '#pop'), | ||||
(r'(-)(' + _comma_dot + r'*\n)', | ||||
bygroups(Punctuation, using(RubyLexer)), | ||||
'#pop'), | ||||
(r':' + _dot + r'*\n', _starts_block(Name.Decorator, 'filter-block'), | ||||
'#pop'), | ||||
include('eval-or-plain'), | ||||
], | ||||
'tag': [ | ||||
include('css'), | ||||
(r'\{(,\n|' + _dot + ')*?\}', using(RubyLexer)), | ||||
(r'\[' + _dot + '*?\]', using(RubyLexer)), | ||||
(r'\(', Text, 'html-attributes'), | ||||
(r'/[ \t]*\n', Punctuation, '#pop:2'), | ||||
(r'[<>]{1,2}(?=[ \t=])', Punctuation), | ||||
include('eval-or-plain'), | ||||
], | ||||
'plain': [ | ||||
(r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Text), | ||||
(r'(#\{)(' + _dot + '*?)(\})', | ||||
bygroups(String.Interpol, using(RubyLexer), String.Interpol)), | ||||
(r'\n', Text, 'root'), | ||||
], | ||||
'html-attributes': [ | ||||
(r'\s+', Text), | ||||
(r'[a-z0-9_:-]+[ \t]*=', Name.Attribute, 'html-attribute-value'), | ||||
(r'[a-z0-9_:-]+', Name.Attribute), | ||||
(r'\)', Text, '#pop'), | ||||
], | ||||
'html-attribute-value': [ | ||||
(r'[ \t]+', Text), | ||||
(r'[a-z0-9_]+', Name.Variable, '#pop'), | ||||
(r'@[a-z0-9_]+', Name.Variable.Instance, '#pop'), | ||||
(r'\$[a-z0-9_]+', Name.Variable.Global, '#pop'), | ||||
(r"'(\\\\|\\'|[^'\n])*'", String, '#pop'), | ||||
(r'"(\\\\|\\"|[^"\n])*"', String, '#pop'), | ||||
], | ||||
'html-comment-block': [ | ||||
(_dot + '+', Comment), | ||||
(r'\n', Text, 'root'), | ||||
], | ||||
'haml-comment-block': [ | ||||
(_dot + '+', Comment.Preproc), | ||||
(r'\n', Text, 'root'), | ||||
], | ||||
'filter-block': [ | ||||
(r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Name.Decorator), | ||||
(r'(#\{)(' + _dot + '*?)(\})', | ||||
bygroups(String.Interpol, using(RubyLexer), String.Interpol)), | ||||
(r'\n', Text, 'root'), | ||||
], | ||||
} | ||||
common_sass_tokens = { | ||||
'value': [ | ||||
(r'[ \t]+', Text), | ||||
(r'[!$][\w-]+', Name.Variable), | ||||
(r'url\(', String.Other, 'string-url'), | ||||
(r'[a-z_-][\w-]*(?=\()', Name.Function), | ||||
(r'(azimuth|background-attachment|background-color|' | ||||
r'background-image|background-position|background-repeat|' | ||||
r'background|border-bottom-color|border-bottom-style|' | ||||
r'border-bottom-width|border-left-color|border-left-style|' | ||||
r'border-left-width|border-right|border-right-color|' | ||||
r'border-right-style|border-right-width|border-top-color|' | ||||
r'border-top-style|border-top-width|border-bottom|' | ||||
r'border-collapse|border-left|border-width|border-color|' | ||||
r'border-spacing|border-style|border-top|border|caption-side|' | ||||
r'clear|clip|color|content|counter-increment|counter-reset|' | ||||
r'cue-after|cue-before|cue|cursor|direction|display|' | ||||
r'elevation|empty-cells|float|font-family|font-size|' | ||||
r'font-size-adjust|font-stretch|font-style|font-variant|' | ||||
r'font-weight|font|height|letter-spacing|line-height|' | ||||
r'list-style-type|list-style-image|list-style-position|' | ||||
r'list-style|margin-bottom|margin-left|margin-right|' | ||||
r'margin-top|margin|marker-offset|marks|max-height|max-width|' | ||||
r'min-height|min-width|opacity|orphans|outline|outline-color|' | ||||
r'outline-style|outline-width|overflow|padding-bottom|' | ||||
r'padding-left|padding-right|padding-top|padding|page|' | ||||
r'page-break-after|page-break-before|page-break-inside|' | ||||
r'pause-after|pause-before|pause|pitch|pitch-range|' | ||||
r'play-during|position|quotes|richness|right|size|' | ||||
r'speak-header|speak-numeral|speak-punctuation|speak|' | ||||
r'speech-rate|stress|table-layout|text-align|text-decoration|' | ||||
r'text-indent|text-shadow|text-transform|top|unicode-bidi|' | ||||
r'vertical-align|visibility|voice-family|volume|white-space|' | ||||
r'widows|width|word-spacing|z-index|bottom|left|' | ||||
r'above|absolute|always|armenian|aural|auto|avoid|baseline|' | ||||
r'behind|below|bidi-override|blink|block|bold|bolder|both|' | ||||
r'capitalize|center-left|center-right|center|circle|' | ||||
r'cjk-ideographic|close-quote|collapse|condensed|continuous|' | ||||
r'crop|crosshair|cross|cursive|dashed|decimal-leading-zero|' | ||||
r'decimal|default|digits|disc|dotted|double|e-resize|embed|' | ||||
r'extra-condensed|extra-expanded|expanded|fantasy|far-left|' | ||||
r'far-right|faster|fast|fixed|georgian|groove|hebrew|help|' | ||||
r'hidden|hide|higher|high|hiragana-iroha|hiragana|icon|' | ||||
r'inherit|inline-table|inline|inset|inside|invert|italic|' | ||||
r'justify|katakana-iroha|katakana|landscape|larger|large|' | ||||
r'left-side|leftwards|level|lighter|line-through|list-item|' | ||||
r'loud|lower-alpha|lower-greek|lower-roman|lowercase|ltr|' | ||||
r'lower|low|medium|message-box|middle|mix|monospace|' | ||||
r'n-resize|narrower|ne-resize|no-close-quote|no-open-quote|' | ||||
r'no-repeat|none|normal|nowrap|nw-resize|oblique|once|' | ||||
r'open-quote|outset|outside|overline|pointer|portrait|px|' | ||||
r'relative|repeat-x|repeat-y|repeat|rgb|ridge|right-side|' | ||||
r'rightwards|s-resize|sans-serif|scroll|se-resize|' | ||||
r'semi-condensed|semi-expanded|separate|serif|show|silent|' | ||||
r'slow|slower|small-caps|small-caption|smaller|soft|solid|' | ||||
r'spell-out|square|static|status-bar|super|sw-resize|' | ||||
r'table-caption|table-cell|table-column|table-column-group|' | ||||
r'table-footer-group|table-header-group|table-row|' | ||||
r'table-row-group|text|text-bottom|text-top|thick|thin|' | ||||
r'transparent|ultra-condensed|ultra-expanded|underline|' | ||||
r'upper-alpha|upper-latin|upper-roman|uppercase|url|' | ||||
r'visible|w-resize|wait|wider|x-fast|x-high|x-large|x-loud|' | ||||
r'x-low|x-small|x-soft|xx-large|xx-small|yes)\b', Name.Constant), | ||||
(r'(indigo|gold|firebrick|indianred|darkolivegreen|' | ||||
r'darkseagreen|mediumvioletred|mediumorchid|chartreuse|' | ||||
r'mediumslateblue|springgreen|crimson|lightsalmon|brown|' | ||||
r'turquoise|olivedrab|cyan|skyblue|darkturquoise|' | ||||
r'goldenrod|darkgreen|darkviolet|darkgray|lightpink|' | ||||
r'darkmagenta|lightgoldenrodyellow|lavender|yellowgreen|thistle|' | ||||
r'violet|orchid|ghostwhite|honeydew|cornflowerblue|' | ||||
r'darkblue|darkkhaki|mediumpurple|cornsilk|bisque|slategray|' | ||||
r'darkcyan|khaki|wheat|deepskyblue|darkred|steelblue|aliceblue|' | ||||
r'gainsboro|mediumturquoise|floralwhite|coral|lightgrey|' | ||||
r'lightcyan|darksalmon|beige|azure|lightsteelblue|oldlace|' | ||||
r'greenyellow|royalblue|lightseagreen|mistyrose|sienna|' | ||||
r'lightcoral|orangered|navajowhite|palegreen|burlywood|' | ||||
r'seashell|mediumspringgreen|papayawhip|blanchedalmond|' | ||||
r'peru|aquamarine|darkslategray|ivory|dodgerblue|' | ||||
r'lemonchiffon|chocolate|orange|forestgreen|slateblue|' | ||||
r'mintcream|antiquewhite|darkorange|cadetblue|moccasin|' | ||||
r'limegreen|saddlebrown|darkslateblue|lightskyblue|deeppink|' | ||||
r'plum|darkgoldenrod|sandybrown|magenta|tan|' | ||||
r'rosybrown|pink|lightblue|palevioletred|mediumseagreen|' | ||||
r'dimgray|powderblue|seagreen|snow|mediumblue|midnightblue|' | ||||
r'paleturquoise|palegoldenrod|whitesmoke|darkorchid|salmon|' | ||||
r'lightslategray|lawngreen|lightgreen|tomato|hotpink|' | ||||
r'lightyellow|lavenderblush|linen|mediumaquamarine|' | ||||
r'blueviolet|peachpuff)\b', Name.Entity), | ||||
(r'(black|silver|gray|white|maroon|red|purple|fuchsia|green|' | ||||
r'lime|olive|yellow|navy|blue|teal|aqua)\b', Name.Builtin), | ||||
(r'\!(important|default)', Name.Exception), | ||||
(r'(true|false)', Name.Pseudo), | ||||
(r'(and|or|not)', Operator.Word), | ||||
(r'/\*', Comment.Multiline, 'inline-comment'), | ||||
(r'//[^\n]*', Comment.Single), | ||||
(r'\#[a-z0-9]{1,6}', Number.Hex), | ||||
(r'(-?\d+)(\%|[a-z]+)?', bygroups(Number.Integer, Keyword.Type)), | ||||
(r'(-?\d*\.\d+)(\%|[a-z]+)?', bygroups(Number.Float, Keyword.Type)), | ||||
(r'#{', String.Interpol, 'interpolation'), | ||||
(r'[~\^\*!&%<>\|+=@:,./?-]+', Operator), | ||||
(r'[\[\]()]+', Punctuation), | ||||
(r'"', String.Double, 'string-double'), | ||||
(r"'", String.Single, 'string-single'), | ||||
(r'[a-z_-][\w-]*', Name), | ||||
], | ||||
'interpolation': [ | ||||
(r'\}', String.Interpol, '#pop'), | ||||
include('value'), | ||||
], | ||||
'selector': [ | ||||
(r'[ \t]+', Text), | ||||
(r'\:', Name.Decorator, 'pseudo-class'), | ||||
(r'\.', Name.Class, 'class'), | ||||
(r'\#', Name.Namespace, 'id'), | ||||
(r'[a-zA-Z0-9_-]+', Name.Tag), | ||||
(r'#\{', String.Interpol, 'interpolation'), | ||||
(r'&', Keyword), | ||||
(r'[~\^\*!&\[\]\(\)<>\|+=@:;,./?-]', Operator), | ||||
(r'"', String.Double, 'string-double'), | ||||
(r"'", String.Single, 'string-single'), | ||||
], | ||||
'string-double': [ | ||||
(r'(\\.|#(?=[^\n{])|[^\n"#])+', String.Double), | ||||
(r'#\{', String.Interpol, 'interpolation'), | ||||
(r'"', String.Double, '#pop'), | ||||
], | ||||
'string-single': [ | ||||
(r"(\\.|#(?=[^\n{])|[^\n'#])+", String.Double), | ||||
(r'#\{', String.Interpol, 'interpolation'), | ||||
(r"'", String.Double, '#pop'), | ||||
], | ||||
'string-url': [ | ||||
(r'(\\#|#(?=[^\n{])|[^\n#)])+', String.Other), | ||||
(r'#\{', String.Interpol, 'interpolation'), | ||||
(r'\)', String.Other, '#pop'), | ||||
], | ||||
'pseudo-class': [ | ||||
(r'[\w-]+', Name.Decorator), | ||||
(r'#\{', String.Interpol, 'interpolation'), | ||||
(r'', Text, '#pop'), | ||||
], | ||||
'class': [ | ||||
(r'[\w-]+', Name.Class), | ||||
(r'#\{', String.Interpol, 'interpolation'), | ||||
(r'', Text, '#pop'), | ||||
], | ||||
'id': [ | ||||
(r'[\w-]+', Name.Namespace), | ||||
(r'#\{', String.Interpol, 'interpolation'), | ||||
(r'', Text, '#pop'), | ||||
], | ||||
'for': [ | ||||
(r'(from|to|through)', Operator.Word), | ||||
include('value'), | ||||
], | ||||
} | ||||
class SassLexer(ExtendedRegexLexer): | ||||
""" | ||||
For Sass stylesheets. | ||||
*New in Pygments 1.3.* | ||||
""" | ||||
name = 'Sass' | ||||
aliases = ['sass', 'SASS'] | ||||
filenames = ['*.sass'] | ||||
mimetypes = ['text/x-sass'] | ||||
flags = re.IGNORECASE | ||||
tokens = { | ||||
'root': [ | ||||
(r'[ \t]*\n', Text), | ||||
(r'[ \t]*', _indentation), | ||||
], | ||||
'content': [ | ||||
(r'//[^\n]*', _starts_block(Comment.Single, 'single-comment'), | ||||
'root'), | ||||
(r'/\*[^\n]*', _starts_block(Comment.Multiline, 'multi-comment'), | ||||
'root'), | ||||
(r'@import', Keyword, 'import'), | ||||
(r'@for', Keyword, 'for'), | ||||
(r'@(debug|warn|if|while)', Keyword, 'value'), | ||||
(r'(@mixin)( [\w-]+)', bygroups(Keyword, Name.Function), 'value'), | ||||
(r'(@include)( [\w-]+)', bygroups(Keyword, Name.Decorator), 'value'), | ||||
(r'@extend', Keyword, 'selector'), | ||||
(r'@[a-z0-9_-]+', Keyword, 'selector'), | ||||
(r'=[\w-]+', Name.Function, 'value'), | ||||
(r'\+[\w-]+', Name.Decorator, 'value'), | ||||
(r'([!$][\w-]\w*)([ \t]*(?:(?:\|\|)?=|:))', | ||||
bygroups(Name.Variable, Operator), 'value'), | ||||
(r':', Name.Attribute, 'old-style-attr'), | ||||
(r'(?=.+?[=:]([^a-z]|$))', Name.Attribute, 'new-style-attr'), | ||||
(r'', Text, 'selector'), | ||||
], | ||||
'single-comment': [ | ||||
(r'.+', Comment.Single), | ||||
(r'\n', Text, 'root'), | ||||
], | ||||
'multi-comment': [ | ||||
(r'.+', Comment.Multiline), | ||||
(r'\n', Text, 'root'), | ||||
], | ||||
'import': [ | ||||
(r'[ \t]+', Text), | ||||
(r'\S+', String), | ||||
(r'\n', Text, 'root'), | ||||
], | ||||
'old-style-attr': [ | ||||
(r'[^\s:="\[]+', Name.Attribute), | ||||
(r'#{', String.Interpol, 'interpolation'), | ||||
(r'[ \t]*=', Operator, 'value'), | ||||
(r'', Text, 'value'), | ||||
], | ||||
'new-style-attr': [ | ||||
(r'[^\s:="\[]+', Name.Attribute), | ||||
(r'#{', String.Interpol, 'interpolation'), | ||||
(r'[ \t]*[=:]', Operator, 'value'), | ||||
], | ||||
'inline-comment': [ | ||||
(r"(\\#|#(?=[^\n{])|\*(?=[^\n/])|[^\n#*])+", Comment.Multiline), | ||||
(r'#\{', String.Interpol, 'interpolation'), | ||||
(r"\*/", Comment, '#pop'), | ||||
], | ||||
} | ||||
for group, common in common_sass_tokens.iteritems(): | ||||
tokens[group] = copy.copy(common) | ||||
tokens['value'].append((r'\n', Text, 'root')) | ||||
tokens['selector'].append((r'\n', Text, 'root')) | ||||
class ScssLexer(RegexLexer): | ||||
""" | ||||
For SCSS stylesheets. | ||||
""" | ||||
name = 'SCSS' | ||||
aliases = ['scss'] | ||||
filenames = ['*.scss'] | ||||
mimetypes = ['text/x-scss'] | ||||
flags = re.IGNORECASE | re.DOTALL | ||||
tokens = { | ||||
'root': [ | ||||
(r'\s+', Text), | ||||
(r'//.*?\n', Comment.Single), | ||||
(r'/\*.*?\*/', Comment.Multiline), | ||||
(r'@import', Keyword, 'value'), | ||||
(r'@for', Keyword, 'for'), | ||||
(r'@(debug|warn|if|while)', Keyword, 'value'), | ||||
(r'(@mixin)( [\w-]+)', bygroups(Keyword, Name.Function), 'value'), | ||||
(r'(@include)( [\w-]+)', bygroups(Keyword, Name.Decorator), 'value'), | ||||
(r'@extend', Keyword, 'selector'), | ||||
(r'@[a-z0-9_-]+', Keyword, 'selector'), | ||||
(r'(\$[\w-]\w*)([ \t]*:)', bygroups(Name.Variable, Operator), 'value'), | ||||
(r'(?=[^;{}][;}])', Name.Attribute, 'attr'), | ||||
(r'(?=[^;{}:]+:[^a-z])', Name.Attribute, 'attr'), | ||||
(r'', Text, 'selector'), | ||||
], | ||||
'attr': [ | ||||
(r'[^\s:="\[]+', Name.Attribute), | ||||
(r'#{', String.Interpol, 'interpolation'), | ||||
(r'[ \t]*:', Operator, 'value'), | ||||
], | ||||
'inline-comment': [ | ||||
(r"(\\#|#(?=[^{])|\*(?=[^/])|[^#*])+", Comment.Multiline), | ||||
(r'#\{', String.Interpol, 'interpolation'), | ||||
(r"\*/", Comment, '#pop'), | ||||
], | ||||
} | ||||
for group, common in common_sass_tokens.iteritems(): | ||||
tokens[group] = copy.copy(common) | ||||
tokens['value'].extend([(r'\n', Text), (r'[;{}]', Punctuation, 'root')]) | ||||
tokens['selector'].extend([(r'\n', Text), (r'[;{}]', Punctuation, 'root')]) | ||||
class CoffeeScriptLexer(RegexLexer): | ||||
""" | ||||
For `CoffeeScript`_ source code. | ||||
.. _CoffeeScript: http://coffeescript.org | ||||
*New in Pygments 1.3.* | ||||
""" | ||||
name = 'CoffeeScript' | ||||
aliases = ['coffee-script', 'coffeescript'] | ||||
filenames = ['*.coffee'] | ||||
mimetypes = ['text/coffeescript'] | ||||
flags = re.DOTALL | ||||
tokens = { | ||||
'commentsandwhitespace': [ | ||||
(r'\s+', Text), | ||||
(r'###.*?###', Comment.Multiline), | ||||
(r'#.*?\n', Comment.Single), | ||||
], | ||||
'multilineregex': [ | ||||
include('commentsandwhitespace'), | ||||
(r'///([gim]+\b|\B)', String.Regex, '#pop'), | ||||
(r'/', String.Regex), | ||||
(r'[^/#]+', String.Regex) | ||||
], | ||||
'slashstartsregex': [ | ||||
include('commentsandwhitespace'), | ||||
(r'///', String.Regex, ('#pop', 'multilineregex')), | ||||
(r'/(?! )(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/' | ||||
r'([gim]+\b|\B)', String.Regex, '#pop'), | ||||
(r'', Text, '#pop'), | ||||
], | ||||
'root': [ | ||||
# this next expr leads to infinite loops root -> slashstartsregex | ||||
#(r'^(?=\s|/|<!--)', Text, 'slashstartsregex'), | ||||
include('commentsandwhitespace'), | ||||
(r'\+\+|--|~|&&|\band\b|\bor\b|\bis\b|\bisnt\b|\bnot\b|\?|:|=|' | ||||
r'\|\||\\(?=\n)|(<<|>>>?|==?|!=?|[-<>+*`%&\|\^/])=?', | ||||
Operator, 'slashstartsregex'), | ||||
(r'\([^()]*\)\s*->', Name.Function), | ||||
(r'[{(\[;,]', Punctuation, 'slashstartsregex'), | ||||
(r'[})\].]', Punctuation), | ||||
(r'(for|in|of|while|break|return|continue|switch|when|then|if|else|' | ||||
r'throw|try|catch|finally|new|delete|typeof|instanceof|super|' | ||||
r'extends|this|class|by)\b', Keyword, 'slashstartsregex'), | ||||
(r'(true|false|yes|no|on|off|null|NaN|Infinity|undefined)\b', | ||||
Keyword.Constant), | ||||
(r'(Array|Boolean|Date|Error|Function|Math|netscape|' | ||||
r'Number|Object|Packages|RegExp|String|sun|decodeURI|' | ||||
r'decodeURIComponent|encodeURI|encodeURIComponent|' | ||||
r'eval|isFinite|isNaN|parseFloat|parseInt|document|window)\b', | ||||
Name.Builtin), | ||||
(r'[$a-zA-Z_][a-zA-Z0-9_\.:]*\s*[:=]\s', Name.Variable, | ||||
'slashstartsregex'), | ||||
(r'@[$a-zA-Z_][a-zA-Z0-9_\.:]*\s*[:=]\s', Name.Variable.Instance, | ||||
'slashstartsregex'), | ||||
(r'@', Name.Other, 'slashstartsregex'), | ||||
(r'@?[$a-zA-Z_][a-zA-Z0-9_]*', Name.Other, 'slashstartsregex'), | ||||
(r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float), | ||||
(r'0x[0-9a-fA-F]+', Number.Hex), | ||||
(r'[0-9]+', Number.Integer), | ||||
('"""', String, 'tdqs'), | ||||
("'''", String, 'tsqs'), | ||||
('"', String, 'dqs'), | ||||
("'", String, 'sqs'), | ||||
], | ||||
'strings': [ | ||||
(r'[^#\\\'"]+', String), | ||||
# note that all coffee script strings are multi-line. | ||||
# hashmarks, quotes and backslashes must be parsed one at a time | ||||
], | ||||
'interpoling_string' : [ | ||||
(r'}', String.Interpol, "#pop"), | ||||
include('root') | ||||
], | ||||
'dqs': [ | ||||
(r'"', String, '#pop'), | ||||
(r'\\.|\'', String), # double-quoted string don't need ' escapes | ||||
(r'#{', String.Interpol, "interpoling_string"), | ||||
include('strings') | ||||
], | ||||
'sqs': [ | ||||
(r"'", String, '#pop'), | ||||
(r'#|\\.|"', String), # single quoted strings don't need " escapses | ||||
include('strings') | ||||
], | ||||
'tdqs': [ | ||||
(r'"""', String, '#pop'), | ||||
(r'\\.|\'|"', String), # no need to escape quotes in triple-string | ||||
(r'#{', String.Interpol, "interpoling_string"), | ||||
include('strings'), | ||||
], | ||||
'tsqs': [ | ||||
(r"'''", String, '#pop'), | ||||
(r'#|\\.|\'|"', String), # no need to escape quotes in triple-strings | ||||
include('strings') | ||||
], | ||||
} | ||||
class DuelLexer(RegexLexer): | ||||
""" | ||||
Lexer for Duel Views Engine (formerly JBST) markup with JavaScript code blocks. | ||||
See http://duelengine.org/. | ||||
See http://jsonml.org/jbst/. | ||||
*New in Pygments 1.4.* | ||||
""" | ||||
name = 'Duel' | ||||
aliases = ['duel', 'Duel Engine', 'Duel View', 'JBST', 'jbst', 'JsonML+BST'] | ||||
filenames = ['*.duel','*.jbst'] | ||||
mimetypes = ['text/x-duel','text/x-jbst'] | ||||
flags = re.DOTALL | ||||
tokens = { | ||||
'root': [ | ||||
(r'(<%[@=#!:]?)(.*?)(%>)', | ||||
bygroups(Name.Tag, using(JavascriptLexer), Name.Tag)), | ||||
(r'(<%\$)(.*?)(:)(.*?)(%>)', | ||||
bygroups(Name.Tag, Name.Function, Punctuation, String, Name.Tag)), | ||||
(r'(<%--)(.*?)(--%>)', | ||||
bygroups(Name.Tag, Comment.Multiline, Name.Tag)), | ||||
(r'(<script.*?>)(.*?)(</script>)', | ||||
bygroups(using(HtmlLexer), | ||||
using(JavascriptLexer), using(HtmlLexer))), | ||||
(r'(.+?)(?=<)', using(HtmlLexer)), | ||||
(r'.+', using(HtmlLexer)), | ||||
], | ||||
} | ||||
class ScamlLexer(ExtendedRegexLexer): | ||||
""" | ||||
For `Scaml markup <http://scalate.fusesource.org/>`_. Scaml is Haml for Scala. | ||||
*New in Pygments 1.4.* | ||||
""" | ||||
name = 'Scaml' | ||||
aliases = ['scaml', 'SCAML'] | ||||
filenames = ['*.scaml'] | ||||
mimetypes = ['text/x-scaml'] | ||||
flags = re.IGNORECASE | ||||
# Scaml does not yet support the " |\n" notation to | ||||
# wrap long lines. Once it does, use the custom faux | ||||
# dot instead. | ||||
# _dot = r'(?: \|\n(?=.* \|)|.)' | ||||
_dot = r'.' | ||||
tokens = { | ||||
'root': [ | ||||
(r'[ \t]*\n', Text), | ||||
(r'[ \t]*', _indentation), | ||||
], | ||||
'css': [ | ||||
(r'\.[a-z0-9_:-]+', Name.Class, 'tag'), | ||||
(r'\#[a-z0-9_:-]+', Name.Function, 'tag'), | ||||
], | ||||
'eval-or-plain': [ | ||||
(r'[&!]?==', Punctuation, 'plain'), | ||||
(r'([&!]?[=~])(' + _dot + r'*\n)', | ||||
bygroups(Punctuation, using(ScalaLexer)), | ||||
'root'), | ||||
(r'', Text, 'plain'), | ||||
], | ||||
'content': [ | ||||
include('css'), | ||||
(r'%[a-z0-9_:-]+', Name.Tag, 'tag'), | ||||
(r'!!!' + _dot + r'*\n', Name.Namespace, '#pop'), | ||||
(r'(/)(\[' + _dot + '*?\])(' + _dot + r'*\n)', | ||||
bygroups(Comment, Comment.Special, Comment), | ||||
'#pop'), | ||||
(r'/' + _dot + r'*\n', _starts_block(Comment, 'html-comment-block'), | ||||
'#pop'), | ||||
(r'-#' + _dot + r'*\n', _starts_block(Comment.Preproc, | ||||
'scaml-comment-block'), '#pop'), | ||||
(r'(-@\s*)(import)?(' + _dot + r'*\n)', | ||||
bygroups(Punctuation, Keyword, using(ScalaLexer)), | ||||
'#pop'), | ||||
(r'(-)(' + _dot + r'*\n)', | ||||
bygroups(Punctuation, using(ScalaLexer)), | ||||
'#pop'), | ||||
(r':' + _dot + r'*\n', _starts_block(Name.Decorator, 'filter-block'), | ||||
'#pop'), | ||||
include('eval-or-plain'), | ||||
], | ||||
'tag': [ | ||||
include('css'), | ||||
(r'\{(,\n|' + _dot + ')*?\}', using(ScalaLexer)), | ||||
(r'\[' + _dot + '*?\]', using(ScalaLexer)), | ||||
(r'\(', Text, 'html-attributes'), | ||||
(r'/[ \t]*\n', Punctuation, '#pop:2'), | ||||
(r'[<>]{1,2}(?=[ \t=])', Punctuation), | ||||
include('eval-or-plain'), | ||||
], | ||||
'plain': [ | ||||
(r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Text), | ||||
(r'(#\{)(' + _dot + '*?)(\})', | ||||
bygroups(String.Interpol, using(ScalaLexer), String.Interpol)), | ||||
(r'\n', Text, 'root'), | ||||
], | ||||
'html-attributes': [ | ||||
(r'\s+', Text), | ||||
(r'[a-z0-9_:-]+[ \t]*=', Name.Attribute, 'html-attribute-value'), | ||||
(r'[a-z0-9_:-]+', Name.Attribute), | ||||
(r'\)', Text, '#pop'), | ||||
], | ||||
'html-attribute-value': [ | ||||
(r'[ \t]+', Text), | ||||
(r'[a-z0-9_]+', Name.Variable, '#pop'), | ||||
(r'@[a-z0-9_]+', Name.Variable.Instance, '#pop'), | ||||
(r'\$[a-z0-9_]+', Name.Variable.Global, '#pop'), | ||||
(r"'(\\\\|\\'|[^'\n])*'", String, '#pop'), | ||||
(r'"(\\\\|\\"|[^"\n])*"', String, '#pop'), | ||||
], | ||||
'html-comment-block': [ | ||||
(_dot + '+', Comment), | ||||
(r'\n', Text, 'root'), | ||||
], | ||||
'scaml-comment-block': [ | ||||
(_dot + '+', Comment.Preproc), | ||||
(r'\n', Text, 'root'), | ||||
], | ||||
'filter-block': [ | ||||
(r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Name.Decorator), | ||||
(r'(#\{)(' + _dot + '*?)(\})', | ||||
bygroups(String.Interpol, using(ScalaLexer), String.Interpol)), | ||||
(r'\n', Text, 'root'), | ||||
], | ||||
} | ||||
class JadeLexer(ExtendedRegexLexer): | ||||
""" | ||||
For Jade markup. | ||||
Jade is a variant of Scaml, see: | ||||
http://scalate.fusesource.org/documentation/scaml-reference.html | ||||
*New in Pygments 1.4.* | ||||
""" | ||||
name = 'Jade' | ||||
aliases = ['jade', 'JADE'] | ||||
filenames = ['*.jade'] | ||||
mimetypes = ['text/x-jade'] | ||||
flags = re.IGNORECASE | ||||
_dot = r'.' | ||||
tokens = { | ||||
'root': [ | ||||
(r'[ \t]*\n', Text), | ||||
(r'[ \t]*', _indentation), | ||||
], | ||||
'css': [ | ||||
(r'\.[a-z0-9_:-]+', Name.Class, 'tag'), | ||||
(r'\#[a-z0-9_:-]+', Name.Function, 'tag'), | ||||
], | ||||
'eval-or-plain': [ | ||||
(r'[&!]?==', Punctuation, 'plain'), | ||||
(r'([&!]?[=~])(' + _dot + r'*\n)', | ||||
bygroups(Punctuation, using(ScalaLexer)), 'root'), | ||||
(r'', Text, 'plain'), | ||||
], | ||||
'content': [ | ||||
include('css'), | ||||
(r'!!!' + _dot + r'*\n', Name.Namespace, '#pop'), | ||||
(r'(/)(\[' + _dot + '*?\])(' + _dot + r'*\n)', | ||||
bygroups(Comment, Comment.Special, Comment), | ||||
'#pop'), | ||||
(r'/' + _dot + r'*\n', _starts_block(Comment, 'html-comment-block'), | ||||
'#pop'), | ||||
(r'-#' + _dot + r'*\n', _starts_block(Comment.Preproc, | ||||
'scaml-comment-block'), '#pop'), | ||||
(r'(-@\s*)(import)?(' + _dot + r'*\n)', | ||||
bygroups(Punctuation, Keyword, using(ScalaLexer)), | ||||
'#pop'), | ||||
(r'(-)(' + _dot + r'*\n)', | ||||
bygroups(Punctuation, using(ScalaLexer)), | ||||
'#pop'), | ||||
(r':' + _dot + r'*\n', _starts_block(Name.Decorator, 'filter-block'), | ||||
'#pop'), | ||||
(r'[a-z0-9_:-]+', Name.Tag, 'tag'), | ||||
(r'\|', Text, 'eval-or-plain'), | ||||
], | ||||
'tag': [ | ||||
include('css'), | ||||
(r'\{(,\n|' + _dot + ')*?\}', using(ScalaLexer)), | ||||
(r'\[' + _dot + '*?\]', using(ScalaLexer)), | ||||
(r'\(', Text, 'html-attributes'), | ||||
(r'/[ \t]*\n', Punctuation, '#pop:2'), | ||||
(r'[<>]{1,2}(?=[ \t=])', Punctuation), | ||||
include('eval-or-plain'), | ||||
], | ||||
'plain': [ | ||||
(r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Text), | ||||
(r'(#\{)(' + _dot + '*?)(\})', | ||||
bygroups(String.Interpol, using(ScalaLexer), String.Interpol)), | ||||
(r'\n', Text, 'root'), | ||||
], | ||||
'html-attributes': [ | ||||
(r'\s+', Text), | ||||
(r'[a-z0-9_:-]+[ \t]*=', Name.Attribute, 'html-attribute-value'), | ||||
(r'[a-z0-9_:-]+', Name.Attribute), | ||||
(r'\)', Text, '#pop'), | ||||
], | ||||
'html-attribute-value': [ | ||||
(r'[ \t]+', Text), | ||||
(r'[a-z0-9_]+', Name.Variable, '#pop'), | ||||
(r'@[a-z0-9_]+', Name.Variable.Instance, '#pop'), | ||||
(r'\$[a-z0-9_]+', Name.Variable.Global, '#pop'), | ||||
(r"'(\\\\|\\'|[^'\n])*'", String, '#pop'), | ||||
(r'"(\\\\|\\"|[^"\n])*"', String, '#pop'), | ||||
], | ||||
'html-comment-block': [ | ||||
(_dot + '+', Comment), | ||||
(r'\n', Text, 'root'), | ||||
], | ||||
'scaml-comment-block': [ | ||||
(_dot + '+', Comment.Preproc), | ||||
(r'\n', Text, 'root'), | ||||
], | ||||
'filter-block': [ | ||||
(r'([^#\n]|#[^{\n]|(\\\\)*\\#\{)+', Name.Decorator), | ||||
(r'(#\{)(' + _dot + '*?)(\})', | ||||
bygroups(String.Interpol, using(ScalaLexer), String.Interpol)), | ||||
(r'\n', Text, 'root'), | ||||
], | ||||
} | ||||
class XQueryLexer(ExtendedRegexLexer): | ||||
""" | ||||
An XQuery lexer, parsing a stream and outputting the tokens needed to | ||||
highlight xquery code. | ||||
*New in Pygments 1.4.* | ||||
""" | ||||
name = 'XQuery' | ||||
aliases = ['xquery', 'xqy'] | ||||
filenames = ['*.xqy', '*.xquery'] | ||||
mimetypes = ['text/xquery', 'application/xquery'] | ||||
xquery_parse_state = [] | ||||
# FIX UNICODE LATER | ||||
#ncnamestartchar = ( | ||||
# ur"[A-Z]|_|[a-z]|[\u00C0-\u00D6]|[\u00D8-\u00F6]|[\u00F8-\u02FF]|" | ||||
# ur"[\u0370-\u037D]|[\u037F-\u1FFF]|[\u200C-\u200D]|[\u2070-\u218F]|" | ||||
# ur"[\u2C00-\u2FEF]|[\u3001-\uD7FF]|[\uF900-\uFDCF]|[\uFDF0-\uFFFD]|" | ||||
# ur"[\u10000-\uEFFFF]" | ||||
#) | ||||
ncnamestartchar = r"(?:[A-Z]|_|[a-z])" | ||||
# FIX UNICODE LATER | ||||
#ncnamechar = ncnamestartchar + (ur"|-|\.|[0-9]|\u00B7|[\u0300-\u036F]|" | ||||
# ur"[\u203F-\u2040]") | ||||
ncnamechar = r"(?:" + ncnamestartchar + r"|-|\.|[0-9])" | ||||
ncname = "(?:%s+%s*)" % (ncnamestartchar, ncnamechar) | ||||
pitarget_namestartchar = r"(?:[A-KN-WY-Z]|_|:|[a-kn-wy-z])" | ||||
pitarget_namechar = r"(?:" + pitarget_namestartchar + r"|-|\.|[0-9])" | ||||
pitarget = "%s+%s*" % (pitarget_namestartchar, pitarget_namechar) | ||||
prefixedname = "%s:%s" % (ncname, ncname) | ||||
unprefixedname = ncname | ||||
qname = "(?:%s|%s)" % (prefixedname, unprefixedname) | ||||
entityref = r'(?:&(?:lt|gt|amp|quot|apos|nbsp);)' | ||||
charref = r'(?:&#[0-9]+;|&#x[0-9a-fA-F]+;)' | ||||
stringdouble = r'(?:"(?:' + entityref + r'|' + charref + r'|""|[^&"])*")' | ||||
stringsingle = r"(?:'(?:" + entityref + r"|" + charref + r"|''|[^&'])*')" | ||||
# FIX UNICODE LATER | ||||
#elementcontentchar = (ur'\t|\r|\n|[\u0020-\u0025]|[\u0028-\u003b]|' | ||||
# ur'[\u003d-\u007a]|\u007c|[\u007e-\u007F]') | ||||
elementcontentchar = r'[A-Za-z]|\s|\d|[!"#$%\(\)\*\+,\-\./\:;=\?\@\[\\\]^_\'`\|~]' | ||||
#quotattrcontentchar = (ur'\t|\r|\n|[\u0020-\u0021]|[\u0023-\u0025]|' | ||||
# ur'[\u0027-\u003b]|[\u003d-\u007a]|\u007c|[\u007e-\u007F]') | ||||
quotattrcontentchar = r'[A-Za-z]|\s|\d|[!#$%\(\)\*\+,\-\./\:;=\?\@\[\\\]^_\'`\|~]' | ||||
#aposattrcontentchar = (ur'\t|\r|\n|[\u0020-\u0025]|[\u0028-\u003b]|' | ||||
# ur'[\u003d-\u007a]|\u007c|[\u007e-\u007F]') | ||||
aposattrcontentchar = r'[A-Za-z]|\s|\d|[!"#$%\(\)\*\+,\-\./\:;=\?\@\[\\\]^_`\|~]' | ||||
# CHAR elements - fix the above elementcontentchar, quotattrcontentchar, | ||||
# aposattrcontentchar | ||||
#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] | ||||
flags = re.DOTALL | re.MULTILINE | re.UNICODE | ||||
def punctuation_root_callback(lexer, match, ctx): | ||||
yield match.start(), Punctuation, match.group(1) | ||||
# transition to root always - don't pop off stack | ||||
ctx.stack = ['root'] | ||||
ctx.pos = match.end() | ||||
def operator_root_callback(lexer, match, ctx): | ||||
yield match.start(), Operator, match.group(1) | ||||
# transition to root always - don't pop off stack | ||||
ctx.stack = ['root'] | ||||
ctx.pos = match.end() | ||||
def popstate_tag_callback(lexer, match, ctx): | ||||
yield match.start(), Name.Tag, match.group(1) | ||||
ctx.stack.append(lexer.xquery_parse_state.pop()) | ||||
ctx.pos = match.end() | ||||
def popstate_xmlcomment_callback(lexer, match, ctx): | ||||
yield match.start(), String.Doc, match.group(1) | ||||
ctx.stack.append(lexer.xquery_parse_state.pop()) | ||||
ctx.pos = match.end() | ||||
def popstate_kindtest_callback(lexer, match, ctx): | ||||
yield match.start(), Punctuation, match.group(1) | ||||
next_state = lexer.xquery_parse_state.pop() | ||||
if next_state == 'occurrenceindicator': | ||||
if re.match("[?*+]+", match.group(2)): | ||||
yield match.start(), Punctuation, match.group(2) | ||||
ctx.stack.append('operator') | ||||
ctx.pos = match.end() | ||||
else: | ||||
ctx.stack.append('operator') | ||||
ctx.pos = match.end(1) | ||||
else: | ||||
ctx.stack.append(next_state) | ||||
ctx.pos = match.end(1) | ||||
def popstate_callback(lexer, match, ctx): | ||||
yield match.start(), Punctuation, match.group(1) | ||||
# if we have run out of our state stack, pop whatever is on the pygments | ||||
# state stack | ||||
if len(lexer.xquery_parse_state) == 0: | ||||
ctx.stack.pop() | ||||
elif len(ctx.stack) > 1: | ||||
ctx.stack.append(lexer.xquery_parse_state.pop()) | ||||
else: | ||||
# i don't know if i'll need this, but in case, default back to root | ||||
ctx.stack = ['root'] | ||||
ctx.pos = match.end() | ||||
def pushstate_element_content_starttag_callback(lexer, match, ctx): | ||||
yield match.start(), Name.Tag, match.group(1) | ||||
lexer.xquery_parse_state.append('element_content') | ||||
ctx.stack.append('start_tag') | ||||
ctx.pos = match.end() | ||||
def pushstate_cdata_section_callback(lexer, match, ctx): | ||||
yield match.start(), String.Doc, match.group(1) | ||||
ctx.stack.append('cdata_section') | ||||
lexer.xquery_parse_state.append(ctx.state.pop) | ||||
ctx.pos = match.end() | ||||
def pushstate_starttag_callback(lexer, match, ctx): | ||||
yield match.start(), Name.Tag, match.group(1) | ||||
lexer.xquery_parse_state.append(ctx.state.pop) | ||||
ctx.stack.append('start_tag') | ||||
ctx.pos = match.end() | ||||
def pushstate_operator_order_callback(lexer, match, ctx): | ||||
yield match.start(), Keyword, match.group(1) | ||||
yield match.start(), Text, match.group(2) | ||||
yield match.start(), Punctuation, match.group(3) | ||||
ctx.stack = ['root'] | ||||
lexer.xquery_parse_state.append('operator') | ||||
ctx.pos = match.end() | ||||
def pushstate_operator_root_validate(lexer, match, ctx): | ||||
yield match.start(), Keyword, match.group(1) | ||||
yield match.start(), Text, match.group(2) | ||||
yield match.start(), Punctuation, match.group(3) | ||||
ctx.stack = ['root'] | ||||
lexer.xquery_parse_state.append('operator') | ||||
ctx.pos = match.end() | ||||
def pushstate_operator_root_validate_withmode(lexer, match, ctx): | ||||
yield match.start(), Keyword, match.group(1) | ||||
yield match.start(), Text, match.group(2) | ||||
yield match.start(), Keyword, match.group(3) | ||||
ctx.stack = ['root'] | ||||
lexer.xquery_parse_state.append('operator') | ||||
ctx.pos = match.end() | ||||
def pushstate_operator_processing_instruction_callback(lexer, match, ctx): | ||||
yield match.start(), String.Doc, match.group(1) | ||||
ctx.stack.append('processing_instruction') | ||||
lexer.xquery_parse_state.append('operator') | ||||
ctx.pos = match.end() | ||||
def pushstate_element_content_processing_instruction_callback(lexer, match, ctx): | ||||
yield match.start(), String.Doc, match.group(1) | ||||
ctx.stack.append('processing_instruction') | ||||
lexer.xquery_parse_state.append('element_content') | ||||
ctx.pos = match.end() | ||||
def pushstate_element_content_cdata_section_callback(lexer, match, ctx): | ||||
yield match.start(), String.Doc, match.group(1) | ||||
ctx.stack.append('cdata_section') | ||||
lexer.xquery_parse_state.append('element_content') | ||||
ctx.pos = match.end() | ||||
def pushstate_operator_cdata_section_callback(lexer, match, ctx): | ||||
yield match.start(), String.Doc, match.group(1) | ||||
ctx.stack.append('cdata_section') | ||||
lexer.xquery_parse_state.append('operator') | ||||
ctx.pos = match.end() | ||||
def pushstate_element_content_xmlcomment_callback(lexer, match, ctx): | ||||
yield match.start(), String.Doc, match.group(1) | ||||
ctx.stack.append('xml_comment') | ||||
lexer.xquery_parse_state.append('element_content') | ||||
ctx.pos = match.end() | ||||
def pushstate_operator_xmlcomment_callback(lexer, match, ctx): | ||||
yield match.start(), String.Doc, match.group(1) | ||||
ctx.stack.append('xml_comment') | ||||
lexer.xquery_parse_state.append('operator') | ||||
ctx.pos = match.end() | ||||
def pushstate_kindtest_callback(lexer, match, ctx): | ||||
yield match.start(), Keyword, match.group(1) | ||||
yield match.start(), Text, match.group(2) | ||||
yield match.start(), Punctuation, match.group(3) | ||||
lexer.xquery_parse_state.append('kindtest') | ||||
ctx.stack.append('kindtest') | ||||
ctx.pos = match.end() | ||||
def pushstate_operator_kindtestforpi_callback(lexer, match, ctx): | ||||
yield match.start(), Keyword, match.group(1) | ||||
yield match.start(), Text, match.group(2) | ||||
yield match.start(), Punctuation, match.group(3) | ||||
lexer.xquery_parse_state.append('operator') | ||||
ctx.stack.append('kindtestforpi') | ||||
ctx.pos = match.end() | ||||
def pushstate_operator_kindtest_callback(lexer, match, ctx): | ||||
yield match.start(), Keyword, match.group(1) | ||||
yield match.start(), Text, match.group(2) | ||||
yield match.start(), Punctuation, match.group(3) | ||||
lexer.xquery_parse_state.append('operator') | ||||
ctx.stack.append('kindtest') | ||||
ctx.pos = match.end() | ||||
def pushstate_occurrenceindicator_kindtest_callback(lexer, match, ctx): | ||||
yield match.start(), Name.Tag, match.group(1) | ||||
yield match.start(), Text, match.group(2) | ||||
yield match.start(), Punctuation, match.group(3) | ||||
lexer.xquery_parse_state.append('occurrenceindicator') | ||||
ctx.stack.append('kindtest') | ||||
ctx.pos = match.end() | ||||
def pushstate_operator_starttag_callback(lexer, match, ctx): | ||||
yield match.start(), Name.Tag, match.group(1) | ||||
lexer.xquery_parse_state.append('operator') | ||||
ctx.stack.append('start_tag') | ||||
ctx.pos = match.end() | ||||
def pushstate_operator_root_callback(lexer, match, ctx): | ||||
yield match.start(), Punctuation, match.group(1) | ||||
lexer.xquery_parse_state.append('operator') | ||||
ctx.stack = ['root']#.append('root') | ||||
ctx.pos = match.end() | ||||
def pushstate_operator_root_construct_callback(lexer, match, ctx): | ||||
yield match.start(), Keyword, match.group(1) | ||||
yield match.start(), Text, match.group(2) | ||||
yield match.start(), Punctuation, match.group(3) | ||||
lexer.xquery_parse_state.append('operator') | ||||
ctx.stack = ['root'] | ||||
ctx.pos = match.end() | ||||
def pushstate_root_callback(lexer, match, ctx): | ||||
yield match.start(), Punctuation, match.group(1) | ||||
cur_state = ctx.stack.pop() | ||||
lexer.xquery_parse_state.append(cur_state) | ||||
ctx.stack = ['root']#.append('root') | ||||
ctx.pos = match.end() | ||||
def pushstate_operator_attribute_callback(lexer, match, ctx): | ||||
yield match.start(), Name.Attribute, match.group(1) | ||||
ctx.stack.append('operator') | ||||
ctx.pos = match.end() | ||||
def pushstate_operator_callback(lexer, match, ctx): | ||||
yield match.start(), Keyword, match.group(1) | ||||
yield match.start(), Text, match.group(2) | ||||
yield match.start(), Punctuation, match.group(3) | ||||
lexer.xquery_parse_state.append('operator') | ||||
ctx.pos = match.end() | ||||
tokens = { | ||||
'comment': [ | ||||
# xquery comments | ||||
(r'(:\))', Comment, '#pop'), | ||||
(r'(\(:)', Comment, '#push'), | ||||
(r'[^:)]', Comment), | ||||
(r'([^:)]|:|\))', Comment), | ||||
], | ||||
'whitespace': [ | ||||
(r'\s+', Text), | ||||
], | ||||
'operator': [ | ||||
include('whitespace'), | ||||
(r'(\})', popstate_callback), | ||||
(r'\(:', Comment, 'comment'), | ||||
(r'(\{)', pushstate_root_callback), | ||||
(r'then|else|external|at|div|except', Keyword, 'root'), | ||||
(r'order by', Keyword, 'root'), | ||||
(r'is|mod|order\s+by|stable\s+order\s+by', Keyword, 'root'), | ||||
(r'and|or', Operator.Word, 'root'), | ||||
(r'(eq|ge|gt|le|lt|ne|idiv|intersect|in)(?=\b)', | ||||
Operator.Word, 'root'), | ||||
(r'return|satisfies|to|union|where|preserve\s+strip', | ||||
Keyword, 'root'), | ||||
(r'(>=|>>|>|<=|<<|<|-|\*|!=|\+|\||:=|=)', | ||||
operator_root_callback), | ||||
(r'(::|;|\[|//|/|,)', | ||||
punctuation_root_callback), | ||||
(r'(castable|cast)(\s+)(as)\b', | ||||
bygroups(Keyword, Text, Keyword), 'singletype'), | ||||
(r'(instance)(\s+)(of)\b', | ||||
bygroups(Keyword, Text, Keyword), 'itemtype'), | ||||
(r'(treat)(\s+)(as)\b', | ||||
bygroups(Keyword, Text, Keyword), 'itemtype'), | ||||
(r'(case|as)\b', Keyword, 'itemtype'), | ||||
(r'(\))(\s*)(as)', | ||||
bygroups(Punctuation, Text, Keyword), 'itemtype'), | ||||
(r'\$', Name.Variable, 'varname'), | ||||
(r'(for|let)(\s+)(\$)', | ||||
bygroups(Keyword, Text, Name.Variable), 'varname'), | ||||
#(r'\)|\?|\]', Punctuation, '#push'), | ||||
(r'\)|\?|\]', Punctuation), | ||||
(r'(empty)(\s+)(greatest|least)', bygroups(Keyword, Text, Keyword)), | ||||
(r'ascending|descending|default', Keyword, '#push'), | ||||
(r'external', Keyword), | ||||
(r'collation', Keyword, 'uritooperator'), | ||||
# finally catch all string literals and stay in operator state | ||||
(stringdouble, String.Double), | ||||
(stringsingle, String.Single), | ||||
(r'(catch)(\s*)', bygroups(Keyword, Text), 'root'), | ||||
], | ||||
'uritooperator': [ | ||||
(stringdouble, String.Double, '#pop'), | ||||
(stringsingle, String.Single, '#pop'), | ||||
], | ||||
'namespacedecl': [ | ||||
include('whitespace'), | ||||
(r'\(:', Comment, 'comment'), | ||||
(r'(at)(\s+)('+stringdouble+')', bygroups(Keyword, Text, String.Double)), | ||||
(r"(at)(\s+)("+stringsingle+')', bygroups(Keyword, Text, String.Single)), | ||||
(stringdouble, String.Double), | ||||
(stringsingle, String.Single), | ||||
(r',', Punctuation), | ||||
(r'=', Operator), | ||||
(r';', Punctuation, 'root'), | ||||
(ncname, Name.Namespace), | ||||
], | ||||
'namespacekeyword': [ | ||||
include('whitespace'), | ||||
(r'\(:', Comment, 'comment'), | ||||
(stringdouble, String.Double, 'namespacedecl'), | ||||
(stringsingle, String.Single, 'namespacedecl'), | ||||
(r'inherit|no-inherit', Keyword, 'root'), | ||||
(r'namespace', Keyword, 'namespacedecl'), | ||||
(r'(default)(\s+)(element)', bygroups(Keyword, Text, Keyword)), | ||||
(r'preserve|no-preserve', Keyword), | ||||
(r',', Punctuation), | ||||
], | ||||
'varname': [ | ||||
(r'\(:', Comment, 'comment'), | ||||
(qname, Name.Variable, 'operator'), | ||||
], | ||||
'singletype': [ | ||||
(r'\(:', Comment, 'comment'), | ||||
(ncname + r'(:\*)', Name.Variable, 'operator'), | ||||
(qname, Name.Variable, 'operator'), | ||||
], | ||||
'itemtype': [ | ||||
include('whitespace'), | ||||
(r'\(:', Comment, 'comment'), | ||||
(r'\$', Punctuation, 'varname'), | ||||
(r'(void)(\s*)(\()(\s*)(\))', | ||||
bygroups(Keyword, Text, Punctuation, Text, Punctuation), 'operator'), | ||||
(r'(element|attribute|schema-element|schema-attribute|comment|text|' | ||||
r'node|binary|document-node|empty-sequence)(\s*)(\()', | ||||
pushstate_occurrenceindicator_kindtest_callback), | ||||
# Marklogic specific type? | ||||
(r'(processing-instruction)(\s*)(\()', | ||||
bygroups(Keyword, Text, Punctuation), | ||||
('occurrenceindicator', 'kindtestforpi')), | ||||
(r'(item)(\s*)(\()(\s*)(\))(?=[*+?])', | ||||
bygroups(Keyword, Text, Punctuation, Text, Punctuation), | ||||
'occurrenceindicator'), | ||||
(r'\(\#', Punctuation, 'pragma'), | ||||
(r';', Punctuation, '#pop'), | ||||
(r'then|else', Keyword, '#pop'), | ||||
(r'(at)(\s+)(' + stringdouble + ')', | ||||
bygroups(Keyword, Text, String.Double), 'namespacedecl'), | ||||
(r'(at)(\s+)(' + stringsingle + ')', | ||||
bygroups(Keyword, Text, String.Single), 'namespacedecl'), | ||||
(r'except|intersect|in|is|return|satisfies|to|union|where', | ||||
Keyword, 'root'), | ||||
(r'and|div|eq|ge|gt|le|lt|ne|idiv|mod|or', Operator.Word, 'root'), | ||||
(r':=|=|,|>=|>>|>|\[|\(|<=|<<|<|-|!=|\|', Operator, 'root'), | ||||
(r'external|at', Keyword, 'root'), | ||||
(r'(stable)(\s+)(order)(\s+)(by)', | ||||
bygroups(Keyword, Text, Keyword, Text, Keyword), 'root'), | ||||
(r'(castable|cast)(\s+)(as)', | ||||
bygroups(Keyword, Text, Keyword), 'singletype'), | ||||
(r'(treat)(\s+)(as)', bygroups(Keyword, Text, Keyword)), | ||||
(r'(instance)(\s+)(of)', bygroups(Keyword, Text, Keyword)), | ||||
(r'case|as', Keyword, 'itemtype'), | ||||
(r'(\))(\s*)(as)', bygroups(Operator, Text, Keyword), 'itemtype'), | ||||
(ncname + r':\*', Keyword.Type, 'operator'), | ||||
(qname, Keyword.Type, 'occurrenceindicator'), | ||||
], | ||||
'kindtest': [ | ||||
(r'\(:', Comment, 'comment'), | ||||
(r'{', Punctuation, 'root'), | ||||
(r'(\))([*+?]?)', popstate_kindtest_callback), | ||||
(r'\*', Name, 'closekindtest'), | ||||
(qname, Name, 'closekindtest'), | ||||
(r'(element|schema-element)(\s*)(\()', pushstate_kindtest_callback), | ||||
], | ||||
'kindtestforpi': [ | ||||
(r'\(:', Comment, 'comment'), | ||||
(r'\)', Punctuation, '#pop'), | ||||
(ncname, Name.Variable), | ||||
(stringdouble, String.Double), | ||||
(stringsingle, String.Single), | ||||
], | ||||
'closekindtest': [ | ||||
(r'\(:', Comment, 'comment'), | ||||
(r'(\))', popstate_callback), | ||||
(r',', Punctuation), | ||||
(r'(\{)', pushstate_operator_root_callback), | ||||
(r'\?', Punctuation), | ||||
], | ||||
'xml_comment': [ | ||||
(r'(-->)', popstate_xmlcomment_callback), | ||||
(r'[^-]{1,2}', Literal), | ||||
(ur'\t|\r|\n|[\u0020-\U0000D7FF]|[\U0000E000-\U0000FFFD]|' | ||||
ur'[\U00010000-\U0010FFFF]', Literal), | ||||
], | ||||
'processing_instruction': [ | ||||
(r'\s+', Text, 'processing_instruction_content'), | ||||
(r'\?>', String.Doc, '#pop'), | ||||
(pitarget, Name), | ||||
], | ||||
'processing_instruction_content': [ | ||||
(r'\?>', String.Doc, '#pop'), | ||||
(ur'\t|\r|\n|[\u0020-\uD7FF]|[\uE000-\uFFFD]|' | ||||
ur'[\U00010000-\U0010FFFF]', Literal), | ||||
], | ||||
'cdata_section': [ | ||||
(r']]>', String.Doc, '#pop'), | ||||
(ur'\t|\r|\n|[\u0020-\uD7FF]|[\uE000-\uFFFD]|' | ||||
ur'[\U00010000-\U0010FFFF]', Literal), | ||||
], | ||||
'start_tag': [ | ||||
include('whitespace'), | ||||
(r'(/>)', popstate_tag_callback), | ||||
(r'>', Name.Tag, 'element_content'), | ||||
(r'"', Punctuation, 'quot_attribute_content'), | ||||
(r"'", Punctuation, 'apos_attribute_content'), | ||||
(r'=', Operator), | ||||
(qname, Name.Tag), | ||||
], | ||||
'quot_attribute_content': [ | ||||
(r'"', Punctuation, 'start_tag'), | ||||
(r'(\{)', pushstate_root_callback), | ||||
(r'""', Name.Attribute), | ||||
(quotattrcontentchar, Name.Attribute), | ||||
(entityref, Name.Attribute), | ||||
(charref, Name.Attribute), | ||||
(r'\{\{|\}\}', Name.Attribute), | ||||
], | ||||
'apos_attribute_content': [ | ||||
(r"'", Punctuation, 'start_tag'), | ||||
(r'\{', Punctuation, 'root'), | ||||
(r"''", Name.Attribute), | ||||
(aposattrcontentchar, Name.Attribute), | ||||
(entityref, Name.Attribute), | ||||
(charref, Name.Attribute), | ||||
(r'\{\{|\}\}', Name.Attribute), | ||||
], | ||||
'element_content': [ | ||||
(r'</', Name.Tag, 'end_tag'), | ||||
(r'(\{)', pushstate_root_callback), | ||||
(r'(<!--)', pushstate_element_content_xmlcomment_callback), | ||||
(r'(<\?)', pushstate_element_content_processing_instruction_callback), | ||||
(r'(<!\[CDATA\[)', pushstate_element_content_cdata_section_callback), | ||||
(r'(<)', pushstate_element_content_starttag_callback), | ||||
(elementcontentchar, Literal), | ||||
(entityref, Literal), | ||||
(charref, Literal), | ||||
(r'\{\{|\}\}', Literal), | ||||
], | ||||
'end_tag': [ | ||||
include('whitespace'), | ||||
(r'(>)', popstate_tag_callback), | ||||
(qname, Name.Tag), | ||||
], | ||||
'xmlspace_decl': [ | ||||
(r'\(:', Comment, 'comment'), | ||||
(r'preserve|strip', Keyword, '#pop'), | ||||
], | ||||
'declareordering': [ | ||||
(r'\(:', Comment, 'comment'), | ||||
include('whitespace'), | ||||
(r'ordered|unordered', Keyword, '#pop'), | ||||
], | ||||
'xqueryversion': [ | ||||
include('whitespace'), | ||||
(r'\(:', Comment, 'comment'), | ||||
(stringdouble, String.Double), | ||||
(stringsingle, String.Single), | ||||
(r'encoding', Keyword), | ||||
(r';', Punctuation, '#pop'), | ||||
], | ||||
'pragma': [ | ||||
(qname, Name.Variable, 'pragmacontents'), | ||||
], | ||||
'pragmacontents': [ | ||||
(r'#\)', Punctuation, 'operator'), | ||||
(ur'\t|\r|\n|[\u0020-\U0000D7FF]|[\U0000E000-\U0000FFFD]|' | ||||
ur'[\U00010000-\U0010FFFF]', Literal), | ||||
(r'(\s+)', Text), | ||||
], | ||||
'occurrenceindicator': [ | ||||
include('whitespace'), | ||||
(r'\(:', Comment, 'comment'), | ||||
(r'\*|\?|\+', Operator, 'operator'), | ||||
(r':=', Operator, 'root'), | ||||
(r'', Text, 'operator'), | ||||
], | ||||
'option': [ | ||||
include('whitespace'), | ||||
(qname, Name.Variable, '#pop'), | ||||
], | ||||
'qname_braren': [ | ||||
include('whitespace'), | ||||
(r'(\{)', pushstate_operator_root_callback), | ||||
(r'(\()', Punctuation, 'root'), | ||||
], | ||||
'element_qname': [ | ||||
(qname, Name.Variable, 'root'), | ||||
], | ||||
'attribute_qname': [ | ||||
(qname, Name.Variable, 'root'), | ||||
], | ||||
'root': [ | ||||
include('whitespace'), | ||||
(r'\(:', Comment, 'comment'), | ||||
# handle operator state | ||||
# order on numbers matters - handle most complex first | ||||
(r'\d+(\.\d*)?[eE][\+\-]?\d+', Number.Double, 'operator'), | ||||
(r'(\.\d+)[eE][\+\-]?\d+', Number.Double, 'operator'), | ||||
(r'(\.\d+|\d+\.\d*)', Number, 'operator'), | ||||
(r'(\d+)', Number.Integer, 'operator'), | ||||
(r'(\.\.|\.|\)|\*)', Punctuation, 'operator'), | ||||
(r'(declare)(\s+)(construction)', | ||||
bygroups(Keyword, Text, Keyword), 'operator'), | ||||
(r'(declare)(\s+)(default)(\s+)(order)', | ||||
bygroups(Keyword, Text, Keyword, Text, Keyword), 'operator'), | ||||
(ncname + ':\*', Name, 'operator'), | ||||
(stringdouble, String.Double, 'operator'), | ||||
(stringsingle, String.Single, 'operator'), | ||||
(r'(\})', popstate_callback), | ||||
#NAMESPACE DECL | ||||
(r'(declare)(\s+)(default)(\s+)(collation)', | ||||
bygroups(Keyword, Text, Keyword, Text, Keyword)), | ||||
(r'(module|declare)(\s+)(namespace)', | ||||
bygroups(Keyword, Text, Keyword), 'namespacedecl'), | ||||
(r'(declare)(\s+)(base-uri)', | ||||
bygroups(Keyword, Text, Keyword), 'namespacedecl'), | ||||
#NAMESPACE KEYWORD | ||||
(r'(declare)(\s+)(default)(\s+)(element|function)', | ||||
bygroups(Keyword, Text, Keyword, Text, Keyword), 'namespacekeyword'), | ||||
(r'(import)(\s+)(schema|module)', | ||||
bygroups(Keyword.Pseudo, Text, Keyword.Pseudo), 'namespacekeyword'), | ||||
(r'(declare)(\s+)(copy-namespaces)', | ||||
bygroups(Keyword, Text, Keyword), 'namespacekeyword'), | ||||
#VARNAMEs | ||||
(r'(for|let|some|every)(\s+)(\$)', | ||||
bygroups(Keyword, Text, Name.Variable), 'varname'), | ||||
(r'\$', Name.Variable, 'varname'), | ||||
(r'(declare)(\s+)(variable)(\s+)(\$)', | ||||
bygroups(Keyword, Text, Keyword, Text, Name.Variable), 'varname'), | ||||
#ITEMTYPE | ||||
(r'(\))(\s+)(as)', bygroups(Operator, Text, Keyword), 'itemtype'), | ||||
(r'(element|attribute|schema-element|schema-attribute|comment|' | ||||
r'text|node|document-node|empty-sequence)(\s+)(\()', | ||||
pushstate_operator_kindtest_callback), | ||||
(r'(processing-instruction)(\s+)(\()', | ||||
pushstate_operator_kindtestforpi_callback), | ||||
(r'(<!--)', pushstate_operator_xmlcomment_callback), | ||||
(r'(<\?)', pushstate_operator_processing_instruction_callback), | ||||
(r'(<!\[CDATA\[)', pushstate_operator_cdata_section_callback), | ||||
# (r'</', Name.Tag, 'end_tag'), | ||||
(r'(<)', pushstate_operator_starttag_callback), | ||||
(r'(declare)(\s+)(boundary-space)', | ||||
bygroups(Keyword, Text, Keyword), 'xmlspace_decl'), | ||||
(r'(validate)(\s+)(lax|strict)', | ||||
pushstate_operator_root_validate_withmode), | ||||
(r'(validate)(\s*)(\{)', pushstate_operator_root_validate), | ||||
(r'(typeswitch)(\s*)(\()', bygroups(Keyword, Text, Punctuation)), | ||||
(r'(element|attribute)(\s*)(\{)', | ||||
pushstate_operator_root_construct_callback), | ||||
(r'(document|text|processing-instruction|comment)(\s*)(\{)', | ||||
pushstate_operator_root_construct_callback), | ||||
#ATTRIBUTE | ||||
(r'(attribute)(\s+)(?=' + qname + r')', | ||||
bygroups(Keyword, Text), 'attribute_qname'), | ||||
#ELEMENT | ||||
(r'(element)(\s+)(?=' +qname+ r')', | ||||
bygroups(Keyword, Text), 'element_qname'), | ||||
#PROCESSING_INSTRUCTION | ||||
(r'(processing-instruction)(\s+)(' + ncname + r')(\s*)(\{)', | ||||
bygroups(Keyword, Text, Name.Variable, Text, Punctuation), | ||||
'operator'), | ||||
(r'(declare|define)(\s+)(function)', | ||||
bygroups(Keyword, Text, Keyword)), | ||||
(r'(\{)', pushstate_operator_root_callback), | ||||
(r'(unordered|ordered)(\s*)(\{)', | ||||
pushstate_operator_order_callback), | ||||
(r'(declare)(\s+)(ordering)', | ||||
bygroups(Keyword, Text, Keyword), 'declareordering'), | ||||
(r'(xquery)(\s+)(version)', | ||||
bygroups(Keyword.Pseudo, Text, Keyword.Pseudo), 'xqueryversion'), | ||||
(r'(\(#)', Punctuation, 'pragma'), | ||||
# sometimes return can occur in root state | ||||
(r'return', Keyword), | ||||
(r'(declare)(\s+)(option)', bygroups(Keyword, Text, Keyword), | ||||
'option'), | ||||
#URI LITERALS - single and double quoted | ||||
(r'(at)(\s+)('+stringdouble+')', String.Double, 'namespacedecl'), | ||||
(r'(at)(\s+)('+stringsingle+')', String.Single, 'namespacedecl'), | ||||
(r'(ancestor-or-self|ancestor|attribute|child|descendant-or-self)(::)', | ||||
bygroups(Keyword, Punctuation)), | ||||
(r'(descendant|following-sibling|following|parent|preceding-sibling' | ||||
r'|preceding|self)(::)', bygroups(Keyword, Punctuation)), | ||||
(r'(if)(\s*)(\()', bygroups(Keyword, Text, Punctuation)), | ||||
(r'then|else', Keyword), | ||||
# ML specific | ||||
(r'(try)(\s*)', bygroups(Keyword, Text), 'root'), | ||||
(r'(catch)(\s*)(\()(\$)', | ||||
bygroups(Keyword, Text, Punctuation, Name.Variable), 'varname'), | ||||
(r'(@' + qname + ')', pushstate_operator_attribute_callback), | ||||
(r'(@\*)', pushstate_operator_attribute_callback), | ||||
(r'(@' + ncname + ')', pushstate_operator_attribute_callback), | ||||
(r'//|/|\+|-|;|,|\(|\)', Punctuation), | ||||
# STANDALONE QNAMES | ||||
(qname + r'(?=\s*{)', Name.Variable, 'qname_braren'), | ||||
(qname + r'(?=\s*\()', Name.Function, 'qname_braren'), | ||||
(qname, Name.Variable, 'operator'), | ||||
] | ||||
} | ||||
class DartLexer(RegexLexer): | ||||
""" | ||||
For `Dart <http://dartlang.org/>`_ source code. | ||||
*New in Pygments 1.5.* | ||||
""" | ||||
name = 'Dart' | ||||
aliases = ['dart'] | ||||
filenames = ['*.dart'] | ||||
mimetypes = ['text/x-dart'] | ||||
flags = re.MULTILINE | re.DOTALL | ||||
tokens = { | ||||
'root': [ | ||||
(r'#!(.*?)$', Comment.Preproc), | ||||
(r'(#)(import|library|source)', bygroups(Text, Keyword)), | ||||
(r'[^\S\n]+', Text), | ||||
(r'//.*?\n', Comment.Single), | ||||
(r'/\*.*?\*/', Comment.Multiline), | ||||
(r'(class|interface)(\s+)', | ||||
bygroups(Keyword.Declaration, Text), 'class'), | ||||
(r'(assert|break|case|catch|continue|default|do|else|finally|for|' | ||||
r'if|in|is|new|return|super|switch|this|throw|try|while)\b', | ||||
Keyword), | ||||
(r'(abstract|const|extends|factory|final|get|implements|' | ||||
r'native|operator|set|static|typedef|var)\b', Keyword.Declaration), | ||||
(r'(bool|double|Dynamic|int|num|Object|String|void)', Keyword.Type), | ||||
(r'(false|null|true)', Keyword.Constant), | ||||
(r'@"(\\\\|\\"|[^"])*"', String.Double), # raw string | ||||
(r"@'(\\\\|\\'|[^'])*'", String.Single), # raw string | ||||
(r'"', String.Double, 'string_double'), | ||||
(r"'", String.Single, 'string_single'), | ||||
(r'[a-zA-Z_$][a-zA-Z0-9_]*:', Name.Label), | ||||
(r'[a-zA-Z_$][a-zA-Z0-9_]*', Name), | ||||
(r'[~!%^&*+=|?:<>/-]', Operator), | ||||
(r'[(){}\[\],.;]', Punctuation), | ||||
(r'0[xX][0-9a-fA-F]+', Number.Hex), | ||||
# DIGIT+ (‘.’ DIGIT*)? EXPONENT? | ||||
(r'\d+(\.\d*)?([eE][+-]?\d+)?', Number), | ||||
(r'\.\d+([eE][+-]?\d+)?', Number), # ‘.’ DIGIT+ EXPONENT? | ||||
(r'\n', Text) | ||||
# pseudo-keyword negate intentionally left out | ||||
], | ||||
'class': [ | ||||
(r'[a-zA-Z_$][a-zA-Z0-9_]*', Name.Class, '#pop') | ||||
], | ||||
'string_double': [ | ||||
(r'"', String.Double, '#pop'), | ||||
(r'[^"$]+', String.Double), | ||||
(r'(\$)([a-zA-Z_][a-zA-Z0-9_]*)', bygroups(String.Interpol, Name)), | ||||
(r'(\$\{)(.*?)(\})', | ||||
bygroups(String.Interpol, using(this), String.Interpol)), | ||||
(r'\$+', String.Double) | ||||
], | ||||
'string_single': [ | ||||
(r"'", String.Single, '#pop'), | ||||
(r"[^'$]+", String.Single), | ||||
(r'(\$)([a-zA-Z_][a-zA-Z0-9_]*)', bygroups(String.Interpol, Name)), | ||||
(r'(\$\{)(.*?)(\})', | ||||
bygroups(String.Interpol, using(this), String.Interpol)), | ||||
(r'\$+', String.Single) | ||||
] | ||||
} | ||||