diff --git a/src/Highlighter.php b/src/Highlighter.php index 1c76e06..1e24796 100644 --- a/src/Highlighter.php +++ b/src/Highlighter.php @@ -17,6 +17,7 @@ use Tempest\Highlight\Languages\JavaScript\JavaScriptLanguage; use Tempest\Highlight\Languages\Json\JsonLanguage; use Tempest\Highlight\Languages\Php\PhpLanguage; +use Tempest\Highlight\Languages\Python\PythonLanguage; use Tempest\Highlight\Languages\Sql\SqlLanguage; use Tempest\Highlight\Languages\Text\TextLanguage; use Tempest\Highlight\Languages\Twig\TwigLanguage; @@ -49,6 +50,7 @@ public function __construct( ->addLanguage(new JavaScriptLanguage()) ->addLanguage(new JsonLanguage()) ->addLanguage(new PhpLanguage()) + ->addLanguage(new PythonLanguage()) ->addLanguage(new SqlLanguage()) ->addLanguage(new XmlLanguage()) ->addLanguage(new YamlLanguage()) diff --git a/src/Languages/Python/Patterns/PyArgumentPattern.php b/src/Languages/Python/Patterns/PyArgumentPattern.php new file mode 100644 index 0000000..05f74ac --- /dev/null +++ b/src/Languages/Python/Patterns/PyArgumentPattern.php @@ -0,0 +1,24 @@ +\w+)s*='; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::VARIABLE; + } +} diff --git a/src/Languages/Python/Patterns/PyBooleanPattern.php b/src/Languages/Python/Patterns/PyBooleanPattern.php new file mode 100644 index 0000000..e42d3af --- /dev/null +++ b/src/Languages/Python/Patterns/PyBooleanPattern.php @@ -0,0 +1,24 @@ +(?:False|None|True))\b'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::BOOLEAN; + } +} diff --git a/src/Languages/Python/Patterns/PyBuiltinPattern.php b/src/Languages/Python/Patterns/PyBuiltinPattern.php new file mode 100644 index 0000000..061aa2c --- /dev/null +++ b/src/Languages/Python/Patterns/PyBuiltinPattern.php @@ -0,0 +1,40 @@ +builtinFunctions); + + return "\b(?(?:{$builtinFunctions}))\b"; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::TYPE; + } +} diff --git a/src/Languages/Python/Patterns/PyClassNamePattern.php b/src/Languages/Python/Patterns/PyClassNamePattern.php new file mode 100644 index 0000000..b667051 --- /dev/null +++ b/src/Languages/Python/Patterns/PyClassNamePattern.php @@ -0,0 +1,27 @@ +\w*)(?=[\s*\:(])'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::PROPERTY; + } +} diff --git a/src/Languages/Python/Patterns/PyCommentPattern.php b/src/Languages/Python/Patterns/PyCommentPattern.php new file mode 100644 index 0000000..bb96a8d --- /dev/null +++ b/src/Languages/Python/Patterns/PyCommentPattern.php @@ -0,0 +1,24 @@ +#.*)'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::COMMENT; + } +} diff --git a/src/Languages/Python/Patterns/PyDecoratorPattern.php b/src/Languages/Python/Patterns/PyDecoratorPattern.php new file mode 100644 index 0000000..7989504 --- /dev/null +++ b/src/Languages/Python/Patterns/PyDecoratorPattern.php @@ -0,0 +1,27 @@ +@\s*\w*(?:\.\w+)*)'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::PROPERTY; + } +} diff --git a/src/Languages/Python/Patterns/PyFunctionPattern.php b/src/Languages/Python/Patterns/PyFunctionPattern.php new file mode 100644 index 0000000..cc92274 --- /dev/null +++ b/src/Languages/Python/Patterns/PyFunctionPattern.php @@ -0,0 +1,26 @@ +\w*)(?=\s*\()'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::PROPERTY; + } +} diff --git a/src/Languages/Python/Patterns/PyKeywordPattern.php b/src/Languages/Python/Patterns/PyKeywordPattern.php new file mode 100644 index 0000000..eb13e4c --- /dev/null +++ b/src/Languages/Python/Patterns/PyKeywordPattern.php @@ -0,0 +1,35 @@ +keywords); + + return "\b(?(?:_(?=\s*:){$keywords}))\b"; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::KEYWORD; + } +} diff --git a/src/Languages/Python/Patterns/PyNumberPattern.php b/src/Languages/Python/Patterns/PyNumberPattern.php new file mode 100644 index 0000000..b8e14aa --- /dev/null +++ b/src/Languages/Python/Patterns/PyNumberPattern.php @@ -0,0 +1,24 @@ +\b0(?:[bB](?:_?[01])+|[oO](?:_?[0-7])+|[xX](?:_?[a-fA-F0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:[eE][+-]?\d+(?:_\d+)*)?j?(?!\w))'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::NUMBER; + } +} diff --git a/src/Languages/Python/Patterns/PyOperatorPattern.php b/src/Languages/Python/Patterns/PyOperatorPattern.php new file mode 100644 index 0000000..9920a9d --- /dev/null +++ b/src/Languages/Python/Patterns/PyOperatorPattern.php @@ -0,0 +1,24 @@ +([-+&%=]=?|!=|:=|>>=|<<=|\|=|\^=|\*\*?=?|\/\/?=?|<[<=]?|>[=>]?|[\|^~]))"; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::OPERATOR; + } +} diff --git a/src/Languages/Python/Patterns/PyTripleDoubleQuoteStringPattern.php b/src/Languages/Python/Patterns/PyTripleDoubleQuoteStringPattern.php new file mode 100644 index 0000000..7f249b7 --- /dev/null +++ b/src/Languages/Python/Patterns/PyTripleDoubleQuoteStringPattern.php @@ -0,0 +1,24 @@ +"""(.|\n)*?""")/m'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::VALUE; + } +} diff --git a/src/Languages/Python/Patterns/PyTripleSingleQuoteStringPattern.php b/src/Languages/Python/Patterns/PyTripleSingleQuoteStringPattern.php new file mode 100644 index 0000000..7f12024 --- /dev/null +++ b/src/Languages/Python/Patterns/PyTripleSingleQuoteStringPattern.php @@ -0,0 +1,24 @@ +\'\'\'(.|\n)*?\'\'\')/m'; + } + + public function getTokenType(): TokenTypeEnum + { + return TokenTypeEnum::VALUE; + } +} diff --git a/src/Languages/Python/PythonLanguage.php b/src/Languages/Python/PythonLanguage.php new file mode 100644 index 0000000..9b0ced0 --- /dev/null +++ b/src/Languages/Python/PythonLanguage.php @@ -0,0 +1,80 @@ +assertSame( + $expected, + $highlighter->parse($content, 'python'), + ); + + $this->assertSame( + $expected, + $highlighter->parse($content, 'py'), + ); + } + + public static function data(): array + { + return [ + [<<def fib(n): # write Fibonacci series up to n + """Print a Fibonacci series up to n.""" + a, b = 0, 1 + while a < n: + print(a, end=' ') + a, b = b, a+b + print() + +# Now call the function we just defined: +fib(2000) +TXT], + ]; + } +}