view pygments_lexer_pseudocode2/fr_pseudocode.py @ 123:4d96ace53ba1

Make it work on Python2 too with all tests by explicitely declaring some strings to be Unicode strings. No tests need to be skipped on Python2 now.
author Franz Glasner <fzglas.hg@dom66.de>
date Wed, 06 May 2026 15:53:24 +0200
parents c02d59f04133
children 10212741b98f
line wrap: on
line source

# -*- coding: utf-8 -*-
# :-
# SPDX-FileCopyrightText: © 2015 Simon Wachter
# SPDX-FileCopyrightText: © 2026 Franz Glasner
# SPDX-License-Identifier: MIT
# :-
r"""
:Author:    Simon Wachter
:Author:    Franz Glasner
:Copyright: © 2015 Simon Wachter
:Copyright: © 2026 Franz Glasner
:License:   MIT License.
            See :file:`MIT.txt` for details.
            If you cannot find MIT.txt see
            <http://opensource.org/licenses/MIT>.
"""

__all__ = ["FrPseudocodeLexer"]


import re

from pygments.lexer import RegexLexer, include
from pygments.token import Punctuation, Whitespace, Comment, Operator, Keyword, Name, String, Number


class FrPseudocodeLexer(RegexLexer):
    '''
    A Pseudo code (fr) lexer
    '''
    name = 'FrPseudocode'
    aliases = ['fr-pseudocode', 'fr-pseudo', 'fr-algorithm', 'fr-algo']
    filenames = ['*.fr-algo', '*.fr-pseudocode']
    mimetypes = []
    flags = re.MULTILINE

    REPLACEMENTS = {
        '<=': '≤',
        '>=': '≥',
        '<>': '≠',
        '!=': '≠',
        '<-': '←',
        '->': '→',
        '=>': '⇒',
        '<->': '↔',
        '<=>': '⇔',
        '^': '↑',
    }

    def op_replace(lexer, match):
        op = match.group(0)
        yield match.start(), Operator, lexer.REPLACEMENTS.get(op, op)

    def scomment(lexer, match):
        s = match.group(1).lower().strip()
        c = Comment

        directives = ['passage par copie', 'passage par valeur', 'passage par référence', 'passage par reference', 'passage par adresse', 've', 'vs', 've/s']

        if s in directives:
            c = Comment.Special

        yield match.start(), c, match.group(0)

    tokens = {
        'root': [
                 (r'\/\*.*\*\/', Comment),
                 (r'(\/\/|#).*\n', Comment),
                 (r'\|', Comment),
                 (r'\{(.*)\}', scomment),
                 include('strings'),
                 include('core'),
                 (r'(?i)[a-zéàùçèÉÀÙÇÈ][a-z0-9éàùçèÉÀÙÇÈ_]*', Name.Variable),
                 include('numbers'),
                 (r'[\s]+', Whitespace)
        ],
        'core': [ # Statements
                 (r'(?i)\b(debut|début|fin|si|alors|sinon|fin[_ ]si|tant[ _]que|tantque|fin[ _]tantque|faire|répéter'
                  r'repeter|type|structure|fin[ _]structure|fonction|procédure|procedure|retourner|renvoyer|'
                  r'pour|fin[ _]pour|à|déclarations?|juqsque|spécialise|specialise|comporte|super|public|privé|protégé|'
                  r'classe'
                  r')\s*\b', Keyword),

                 # Data Types
                 (r'(?i)\b(entiers?|chaines?|chaînes?|réels?|reels?|caractères?|caracteres?|booléens?|'
                  r'booleens?|tableaux?|rien)\s*\b',
                  Keyword.Type),

                  (r'(?i)\b(vrai|faux|nil)\s*\b',
                   Name.Constant),

                 # Operators
                 (r'(?i)(<->|<=>|<=|>=|<>|!=|<-|->|=>|\^|\*|\+|-|\/|<|>|=|\\\\|mod|←|↑|≤|≥|≠|÷|×|\.\.|\[|\]|\.|non|xou|et|ou)',
                  op_replace),

                 (r'(\(|\)|\,|\;|:)',
                  Punctuation),

                 #(r'\b(\[(VE|VS|VE/S)\])\s*\b',
                 # Keyword.Declaration),

                  # Intrinsics
                 (r'(?i)\b(sqrt|pow|cos|sin|tan|arccos|arcsin|arctan|arctan2|lire|ecrire|écrire|'
                  r'exp|ln|log|détruire|detruire'
                  r')\s*\b', Name.Builtin)
                ],

        'strings': [
                 (r'"([^"])*"', String.Double),
                 (r"'([^'])*'", String.Single),
                ],
#
# This is stolen from the Pygment's Python lexer.
#
# SPDX-SnippetBegin
# SPDX-License-Identifier: BSD-2-Clause
# SPDX-SnippetCopyrightText: Copyright 2006-2023 by the Pygments team
        'numbers': [
            (r'(\d(?:_?\d)*\.(?:\d(?:_?\d)*)?|(?:\d(?:_?\d)*)?\.\d(?:_?\d)*)'
             r'([eE][+-]?\d(?:_?\d)*)?', Number.Float),
            (r'\d(?:_?\d)*[eE][+-]?\d(?:_?\d)*j?', Number.Float),
            (r'0[oO](?:_?[0-7])+', Number.Oct),
            (r'0[bB](?:_?[01])+', Number.Bin),
            (r'0[xX](?:_?[a-fA-F0-9])+', Number.Hex),
            (r'\d(?:_?\d)*', Number.Integer),
        ],
# SPDX-SnippetEnd
        }