diff options
-rw-r--r-- | AUTHORS | 1 | ||||
-rw-r--r-- | doc/languages.rst | 1 | ||||
-rw-r--r-- | pygments/lexers/_mapping.py | 1 | ||||
-rw-r--r-- | pygments/lexers/pointless.py | 70 | ||||
-rw-r--r-- | tests/examplefiles/example.ptls | 30 |
5 files changed, 103 insertions, 0 deletions
@@ -155,6 +155,7 @@ Other contributors, listed alphabetically, are: * Nam T. Nguyen -- Monokai style * Jesper Noehr -- HTML formatter "anchorlinenos" * Mike Nolta -- Julia lexer +* Avery Nortonsmith -- Pointless lexer * Jonas Obrist -- BBCode lexer * Edward O'Callaghan -- Cryptol lexer * David Oliva -- Rebol lexer diff --git a/doc/languages.rst b/doc/languages.rst index a2c957da..e4b7b09d 100644 --- a/doc/languages.rst +++ b/doc/languages.rst @@ -128,6 +128,7 @@ Programming languages * `PHP <https://www.php.net/>`_ * `Perl 5 <https://perl.org>`_ * `Pike <https://pike.lysator.liu.se/>`_ +* `Pointless <https://ptls.dev/>`_ * `Pony <https://www.ponylang.io/>`_ * `PovRay <http://www.povray.org/>`_ * `PostScript <https://en.wikipedia.org/wiki/PostScript>`_ diff --git a/pygments/lexers/_mapping.py b/pygments/lexers/_mapping.py index 9cdddb6a..b98f3de4 100644 --- a/pygments/lexers/_mapping.py +++ b/pygments/lexers/_mapping.py @@ -339,6 +339,7 @@ LEXERS = { 'PikeLexer': ('pygments.lexers.c_like', 'Pike', ('pike',), ('*.pike', '*.pmod'), ('text/x-pike',)), 'PkgConfigLexer': ('pygments.lexers.configs', 'PkgConfig', ('pkgconfig',), ('*.pc',), ()), 'PlPgsqlLexer': ('pygments.lexers.sql', 'PL/pgSQL', ('plpgsql',), (), ('text/x-plpgsql',)), + 'PointlessLexer': ('pygments.lexers.pointless', 'Pointless', ('pointless',), ('*.ptls',), ()), 'PonyLexer': ('pygments.lexers.pony', 'Pony', ('pony',), ('*.pony',), ()), 'PostScriptLexer': ('pygments.lexers.graphics', 'PostScript', ('postscript', 'postscr'), ('*.ps', '*.eps'), ('application/postscript',)), 'PostgresConsoleLexer': ('pygments.lexers.sql', 'PostgreSQL console (psql)', ('psql', 'postgresql-console', 'postgres-console'), (), ('text/x-postgresql-psql',)), diff --git a/pygments/lexers/pointless.py b/pygments/lexers/pointless.py new file mode 100644 index 00000000..a0a5cefa --- /dev/null +++ b/pygments/lexers/pointless.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +""" + pygments.lexers.pointless + ~~~~~~~~~~~~~~~~~~~~ + + Lexers for Pointless. + + :copyright: Copyright 2006-2019 by the Pygments team, see AUTHORS. + :license: BSD, see LICENSE for details. +""" + +from pygments.lexer import RegexLexer, bygroups, words +from pygments.token import * + +__all__ = ['PointlessLexer'] + + +class PointlessLexer(RegexLexer): + """ + For `Pointless <https://ptls.dev>`_ source code. + + .. versionadded:: 2.7 + """ + + name = 'Pointless' + aliases = ['pointless'] + filenames = ['*.ptls'] + + ops = words([ + "+", "-", "*", "/", "**", "%", "+=", "-=", "*=", + "/=", "**=", "%=", "|>", "=", "==", "!=", "<", ">", + "<=", ">=", "=>", "$", "++", + ]) + + keywords = words([ + "if", "then", "else", "where", "with", "cond", + "case", "and", "or", "not", "in", "as", "for", + "requires", "throw", "try", "catch", "when", + "yield", "upval", + ], suffix=r'\b') + + tokens = { + 'root': [ + (r'[ \n\r]+', Text), + (r'--.*$', Comment.Single), + (r'"""', String, 'multiString'), + (r'"', String, 'string'), + (r'[\[\](){}:;,.]', Punctuation), + (ops, Operator), + (keywords, Keyword), + (r'\d+|\d*\.\d+', Number), + (r'(true|false)\b', Name.Builtin), + (r'[A-Z][a-zA-Z0-9]*\b', String.Symbol), + (r'output\b', Name.Variable.Magic), + (r'(export|import)\b', Keyword.Namespace), + (r'[a-z][a-zA-Z0-9]*\b', Name.Variable) + ], + 'multiString': [ + (r'\\.', String.Escape), + (r'"""', String, '#pop'), + (r'"', String), + (r'[^\\"]+', String), + ], + 'string': [ + (r'\\.', String.Escape), + (r'"', String, '#pop'), + (r'\n', Error), + (r'[^\\"]+', String), + ], + } diff --git a/tests/examplefiles/example.ptls b/tests/examplefiles/example.ptls new file mode 100644 index 00000000..f3dc641a --- /dev/null +++ b/tests/examplefiles/example.ptls @@ -0,0 +1,30 @@ + +----------------------------------------------------------- +-- Print the lyrics to the song '99 bottles of beer' + +output = + range(99, 1) + |> map(showBeer) + |> printLines + +beerFmt = """{} of beer on the wall! +{} of beer! +You take one down, pass it around +{}""" + +showBeer(n) = + format( + beerFmt, + [showBottle(n), showBottle(n), nextBeer(n - 1)] + ) + +nextBeer(n) = + if n == 0 then "No more bottles of beer on the wall!" + else format("{} of beer on the wall!\n", [showBottle(n)]) + +----------------------------------------------------------- +-- Get appropriate singular / plural form of 'n bottle(s)' + +showBottle(n) = + format("{} {}", [n, bottleStr]) + where bottleStr = if n == 1 then "bottle" else "bottles" |