Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
textedit.py206 linesDownload Raw Back to lexers
1"""2    pygments.lexers.textedit3    ~~~~~~~~~~~~~~~~~~~~~~~~4 5    Lexers for languages related to text processing.6 7    :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.8    :license: BSD, see LICENSE for details.9"""10 11import re12from bisect import bisect13 14from pygments.lexer import RegexLexer, bygroups, default, include, this, using15from pygments.lexers.python import PythonLexer16from pygments.token import Comment, Keyword, Name, Number, Operator, \17    Punctuation, String, Text, Whitespace18 19__all__ = ['AwkLexer', 'SedLexer', 'VimLexer']20 21 22class AwkLexer(RegexLexer):23    """24    For Awk scripts.25    """26 27    name = 'Awk'28    aliases = ['awk', 'gawk', 'mawk', 'nawk']29    filenames = ['*.awk']30    mimetypes = ['application/x-awk']31    url = 'https://en.wikipedia.org/wiki/AWK'32    version_added = '1.5'33 34    tokens = {35        'commentsandwhitespace': [36            (r'\s+', Text),37            (r'#.*$', Comment.Single)38        ],39        'slashstartsregex': [40            include('commentsandwhitespace'),41            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'42             r'\B', String.Regex, '#pop'),43            (r'(?=/)', Text, ('#pop', 'badregex')),44            default('#pop')45        ],46        'badregex': [47            (r'\n', Text, '#pop')48        ],49        'root': [50            (r'^(?=\s|/)', Text, 'slashstartsregex'),51            include('commentsandwhitespace'),52            (r'\+\+|--|\|\||&&|in\b|\$|!?~|\?|:|'53             r'(\*\*|[-<>+*%\^/!=|])=?', Operator, 'slashstartsregex'),54            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),55            (r'[})\].]', Punctuation),56            (r'(break|continue|do|while|exit|for|if|else|'57             r'return)\b', Keyword, 'slashstartsregex'),58            (r'function\b', Keyword.Declaration, 'slashstartsregex'),59            (r'(atan2|cos|exp|int|log|rand|sin|sqrt|srand|gensub|gsub|index|'60             r'length|match|split|sprintf|sub|substr|tolower|toupper|close|'61             r'fflush|getline|next|nextfile|print|printf|strftime|systime|'62             r'delete|system)\b', Keyword.Reserved),63            (r'(ARGC|ARGIND|ARGV|BEGIN|CONVFMT|ENVIRON|END|ERRNO|FIELDWIDTHS|'64             r'FILENAME|FNR|FS|IGNORECASE|NF|NR|OFMT|OFS|ORFS|RLENGTH|RS|'65             r'RSTART|RT|SUBSEP)\b', Name.Builtin),66            (r'[$a-zA-Z_]\w*', Name.Other),67            (r'[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?', Number.Float),68            (r'0x[0-9a-fA-F]+', Number.Hex),69            (r'[0-9]+', Number.Integer),70            (r'"(\\\\|\\[^\\]|[^"\\])*"', String.Double),71            (r"'(\\\\|\\[^\\]|[^'\\])*'", String.Single),72        ]73    }74 75 76class SedLexer(RegexLexer):77    """78    Lexer for Sed script files.79    """80    name = 'Sed'81    aliases = ['sed', 'gsed', 'ssed']82    filenames = ['*.sed', '*.[gs]sed']83    mimetypes = ['text/x-sed']84    url = 'https://en.wikipedia.org/wiki/Sed'85    version_added = ''86    flags = re.MULTILINE87 88    # Match the contents within delimiters such as /<contents>/89    _inside_delims = r'((?:(?:\\[^\n]|[^\\])*?\\\n)*?(?:\\.|[^\\])*?)'90 91    tokens = {92        'root': [93            (r'\s+', Whitespace),94            (r'#.*$', Comment.Single),95            (r'[0-9]+', Number.Integer),96            (r'\$', Operator),97            (r'[{};,!]', Punctuation),98            (r'[dDFgGhHlnNpPqQxz=]', Keyword),99            (r'([berRtTvwW:])([^;\n]*)', bygroups(Keyword, String.Single)),100            (r'([aci])((?:.*?\\\n)*(?:.*?[^\\]$))', bygroups(Keyword, String.Double)),101            (r'([qQ])([0-9]*)', bygroups(Keyword, Number.Integer)),102            (r'(/)' + _inside_delims + r'(/)', bygroups(Punctuation, String.Regex, Punctuation)),103            (r'(\\(.))' + _inside_delims + r'(\2)',104             bygroups(Punctuation, None, String.Regex, Punctuation)),105            (r'(y)(.)' + _inside_delims + r'(\2)' + _inside_delims + r'(\2)',106             bygroups(Keyword, Punctuation, String.Single, Punctuation, String.Single, Punctuation)),107            (r'(s)(.)' + _inside_delims + r'(\2)' + _inside_delims + r'(\2)((?:[gpeIiMm]|[0-9])*)',108             bygroups(Keyword, Punctuation, String.Regex, Punctuation, String.Single, Punctuation,109                      Keyword))110        ]111    }112 113class VimLexer(RegexLexer):114    """115    Lexer for VimL script files.116    """117    name = 'VimL'118    aliases = ['vim']119    filenames = ['*.vim', '.vimrc', '.exrc', '.gvimrc',120                 '_vimrc', '_exrc', '_gvimrc', 'vimrc', 'gvimrc']121    mimetypes = ['text/x-vim']122    url = 'https://www.vim.org'123    version_added = '0.8'124 125    flags = re.MULTILINE126 127    _python = r'py(?:t(?:h(?:o(?:n)?)?)?)?'128 129    tokens = {130        'root': [131            (r'^([ \t:]*)(' + _python + r')([ \t]*)(<<)([ \t]*)(.*)((?:\n|.)*)(\6)',132             bygroups(using(this), Keyword, Text, Operator, Text, Text,133                      using(PythonLexer), Text)),134            (r'^([ \t:]*)(' + _python + r')([ \t])(.*)',135             bygroups(using(this), Keyword, Text, using(PythonLexer))),136 137            (r'^\s*".*', Comment),138 139            (r'[ \t]+', Text),140            # TODO: regexes can have other delims141            (r'/[^/\\\n]*(?:\\[\s\S][^/\\\n]*)*/', String.Regex),142            (r'"[^"\\\n]*(?:\\[\s\S][^"\\\n]*)*"', String.Double),143            (r"'[^\n']*(?:''[^\n']*)*'", String.Single),144 145            # Who decided that doublequote was a good comment character??146            (r'(?<=\s)"[^\-:.%#=*].*', Comment),147            (r'-?\d+', Number),148            (r'#[0-9a-f]{6}', Number.Hex),149            (r'^:', Punctuation),150            (r'[()<>+=!|,~-]', Punctuation),  # Inexact list.  Looks decent.151            (r'\b(let|if|else|endif|elseif|fun|function|endfunction)\b',152             Keyword),153            (r'\b(NONE|bold|italic|underline|dark|light)\b', Name.Builtin),154            (r'\b\w+\b', Name.Other),  # These are postprocessed below155            (r'.', Text),156        ],157    }158 159    def __init__(self, **options):160        from pygments.lexers._vim_builtins import auto, command, option161        self._cmd = command162        self._opt = option163        self._aut = auto164 165        RegexLexer.__init__(self, **options)166 167    def is_in(self, w, mapping):168        r"""169        It's kind of difficult to decide if something might be a keyword170        in VimL because it allows you to abbreviate them.  In fact,171        'ab[breviate]' is a good example.  :ab, :abbre, or :abbreviate are172        valid ways to call it so rather than making really awful regexps173        like::174 175            \bab(?:b(?:r(?:e(?:v(?:i(?:a(?:t(?:e)?)?)?)?)?)?)?)?\b176 177        we match `\b\w+\b` and then call is_in() on those tokens.  See178        `scripts/get_vimkw.py` for how the lists are extracted.179        """180        p = bisect(mapping, (w,))181        if p > 0:182            if mapping[p-1][0] == w[:len(mapping[p-1][0])] and \183               mapping[p-1][1][:len(w)] == w:184                return True185        if p < len(mapping):186            return mapping[p][0] == w[:len(mapping[p][0])] and \187                mapping[p][1][:len(w)] == w188        return False189 190    def get_tokens_unprocessed(self, text):191        # TODO: builtins are only subsequent tokens on lines192        #       and 'keywords' only happen at the beginning except193        #       for :au ones194        for index, token, value in \195                RegexLexer.get_tokens_unprocessed(self, text):196            if token is Name.Other:197                if self.is_in(value, self._cmd):198                    yield index, Keyword, value199                elif self.is_in(value, self._opt) or \200                        self.is_in(value, self._aut):201                    yield index, Name.Builtin, value202                else:203                    yield index, Text, value204            else:205                yield index, token, value206 
codekingpro/portable-devtools · Team Ai