# -*- coding: utf-8 -*- # # frozen_string_literal: true module Rouge module Lexers class Python < RegexLexer title "Python" desc "The Python programming language (python.org)" tag 'python' aliases 'py' filenames '*.py', '*.pyw', '*.sc', 'SConstruct', 'SConscript', '*.tac' mimetypes 'text/x-python', 'application/x-python' def self.detect?(text) return true if text.shebang?(/pythonw?(?:[23](?:\.\d+)?)?/) end def self.keywords @keywords ||= %w( assert break continue del elif else except exec finally for global if lambda pass print raise return try while yield as with from import yield async await nonlocal ) end def self.builtins @builtins ||= %w( __import__ abs all any apply ascii basestring bin bool buffer bytearray bytes callable chr classmethod cmp coerce compile complex delattr dict dir divmod enumerate eval execfile exit file filter float format frozenset getattr globals hasattr hash hex id input int intern isinstance issubclass iter len list locals long map max memoryview min next object oct open ord pow property range raw_input reduce reload repr reversed round set setattr slice sorted staticmethod str sum super tuple type unichr unicode vars xrange zip ) end def self.builtins_pseudo @builtins_pseudo ||= %w(self None Ellipsis NotImplemented False True) end def self.exceptions @exceptions ||= %w( ArithmeticError AssertionError AttributeError BaseException BlockingIOError BrokenPipeError BufferError BytesWarning ChildProcessError ConnectionAbortedError ConnectionError ConnectionRefusedError ConnectionResetError DeprecationWarning EOFError EnvironmentError Exception FileExistsError FileNotFoundError FloatingPointError FutureWarning GeneratorExit IOError ImportError ImportWarning IndentationError IndexError InterruptedError IsADirectoryError KeyError KeyboardInterrupt LookupError MemoryError ModuleNotFoundError NameError NotADirectoryError NotImplemented NotImplementedError OSError OverflowError OverflowWarning PendingDeprecationWarning ProcessLookupError RecursionError ReferenceError ResourceWarning RuntimeError RuntimeWarning StandardError StopAsyncIteration StopIteration SyntaxError SyntaxWarning SystemError SystemExit TabError TimeoutError TypeError UnboundLocalError UnicodeDecodeError UnicodeEncodeError UnicodeError UnicodeTranslateError UnicodeWarning UserWarning ValueError VMSError Warning WindowsError ZeroDivisionError ) end identifier = /[a-z_][a-z0-9_]*/i dotted_identifier = /[a-z_.][a-z0-9_.]*/i state :root do rule %r/\n+/m, Text rule %r/^(:)(\s*)([ru]{,2}""".*?""")/mi do groups Punctuation, Text, Str::Doc end rule %r/[^\S\n]+/, Text rule %r(#(.*)?\n?), Comment::Single rule %r/[\[\]{}:(),;]/, Punctuation rule %r/\\\n/, Text rule %r/\\/, Text rule %r/(in|is|and|or|not)\b/, Operator::Word rule %r/(<<|>>|\/\/|\*\*)=?/, Operator rule %r/[-~+\/*%=<>&^|@]=?|!=/, Operator rule %r/\.(?![0-9])/, Operator # so it doesn't match float literals rule %r/(from)((?:\\\s|\s)+)(#{dotted_identifier})((?:\\\s|\s)+)(import)/ do groups Keyword::Namespace, Text, Name::Namespace, Text, Keyword::Namespace end rule %r/(import)(\s+)(#{dotted_identifier})/ do groups Keyword::Namespace, Text, Name::Namespace end rule %r/(def)((?:\s|\\\s)+)/ do groups Keyword, Text push :funcname end rule %r/(class)((?:\s|\\\s)+)/ do groups Keyword, Text push :classname end # TODO: not in python 3 rule %r/`.*?`/, Str::Backtick rule %r/(?:r|ur|ru)"""/i, Str, :raw_tdqs rule %r/(?:r|ur|ru)'''/i, Str, :raw_tsqs rule %r/(?:r|ur|ru)"/i, Str, :raw_dqs rule %r/(?:r|ur|ru)'/i, Str, :raw_sqs rule %r/u?"""/i, Str, :tdqs rule %r/u?'''/i, Str, :tsqs rule %r/u?"/i, Str, :dqs rule %r/u?'/i, Str, :sqs rule %r/@#{dotted_identifier}/i, Name::Decorator # using negative lookbehind so we don't match property names rule %r/(?