Team Ai
Datasetpublic

codekingpro/portable-devtools

sourceHugging Faceupdated 5mo agoView on Hugging Face
1likes14kdownloads
minecraft.py393 linesDownload Raw Back to lexers
1"""2    pygments.lexers.minecraft3    ~~~~~~~~~~~~~~~~~~~~~~~~~4 5    Lexers for Minecraft related languages.6 7    SNBT. A data communication format used in Minecraft.8    wiki: https://minecraft.wiki/w/NBT_format9 10    MCFunction. The Function file for Minecraft Data packs and Add-ons.11    official: https://learn.microsoft.com/en-us/minecraft/creator/documents/functionsintroduction12    wiki: https://minecraft.wiki/w/Function13 14    MCSchema. A kind of data Schema for Minecraft Add-on Development.15    official: https://learn.microsoft.com/en-us/minecraft/creator/reference/content/schemasreference/16    community example: https://www.mcbe-dev.net/addons/data-driven/manifest.html17 18    :copyright: Copyright 2006-present by the Pygments team, see AUTHORS.19    :license: BSD, see LICENSE for details.20"""21 22from pygments.lexer import RegexLexer, default, include, bygroups23from pygments.token import Comment, Keyword, Literal, Name, Number, Operator, \24    Punctuation, String, Text, Whitespace25 26__all__ = ['SNBTLexer', 'MCFunctionLexer', 'MCSchemaLexer']27 28 29class SNBTLexer(RegexLexer):30    """Lexer for stringified NBT, a data format used in Minecraft31    """32 33    name = "SNBT"34    url = "https://minecraft.wiki/w/NBT_format"35    aliases = ["snbt"]36    filenames = ["*.snbt"]37    mimetypes = ["text/snbt"]38    version_added = '2.12'39 40    tokens = {41        "root": [42            # We only look for the open bracket here since square bracket43            #  is only valid in NBT pathing (which is a mcfunction idea).44            (r"\{", Punctuation, "compound"),45            (r"[^\{]+", Text),46        ],47 48        "whitespace": [49            (r"\s+", Whitespace),50        ],51 52        "operators": [53            (r"[,:;]", Punctuation),54        ],55 56        "literals": [57            (r"(true|false)", Keyword.Constant),58            (r"-?\d+[eE]-?\d+", Number.Float),59            (r"-?\d*\.\d+[fFdD]?", Number.Float),60            (r"-?\d+[bBsSlLfFdD]?", Number.Integer),61 62            # Separate states for both types of strings so they don't entangle63            (r'"', String.Double, "literals.string_double"),64            (r"'", String.Single, "literals.string_single"),65        ],66        "literals.string_double": [67            (r"\\.", String.Escape),68            (r'[^\\"\n]+', String.Double),69            (r'"', String.Double, "#pop"),70        ],71        "literals.string_single": [72            (r"\\.", String.Escape),73            (r"[^\\'\n]+", String.Single),74            (r"'", String.Single, "#pop"),75        ],76 77        "compound": [78            # this handles the unquoted snbt keys79            #  note: stringified keys still work80            (r"[A-Z_a-z]+", Name.Attribute),81            include("operators"),82            include("whitespace"),83            include("literals"),84            (r"\{", Punctuation, "#push"),85            (r"\[", Punctuation, "list"),86            (r"\}", Punctuation, "#pop"),87        ],88 89        "list": [90            (r"[A-Z_a-z]+", Name.Attribute),91            include("literals"),92            include("operators"),93            include("whitespace"),94            (r"\[", Punctuation, "#push"),95            (r"\{", Punctuation, "compound"),96            (r"\]", Punctuation, "#pop"),97        ],98    }99 100 101class MCFunctionLexer(RegexLexer):102    """Lexer for the mcfunction scripting language used in Minecraft.103 104    Modelled somewhat after the `GitHub mcfunction grammar <https://github.com/Arcensoth/language-mcfunction>`_.105    """106 107    name = "MCFunction"108    url = "https://minecraft.wiki/w/Commands"109    aliases = ["mcfunction", "mcf"]110    filenames = ["*.mcfunction"]111    mimetypes = ["text/mcfunction"]112    version_added = '2.12'113 114    # Used to denotate the start of a block comment, borrowed from Github's mcfunction115    _block_comment_prefix = "[>!]"116 117    tokens = {118        "root": [119            include("names"),120            include("comments"),121            include("literals"),122            include("whitespace"),123            include("property"),124            include("operators"),125            include("selectors"),126        ],127 128        "names": [129            # The start of a command (either beginning of line OR after the run keyword)130            #  We don't encode a list of keywords since mods, plugins, or even pre-processors131            #  may add new commands, so we have a 'close-enough' regex which catches them.132            (r"^(\s*)([a-z_]+)", bygroups(Whitespace, Name.Builtin)),133            (r"(?<=run)\s+[a-z_]+", Name.Builtin),134 135            # UUID136            (r"\b[0-9a-fA-F]+(?:-[0-9a-fA-F]+){4}\b", Name.Variable),137            include("resource-name"),138            # normal command names and scoreboards139            #  there's no way to know the differences unfortuntely140            (r"[A-Za-z_][\w.#%$]+", Keyword.Constant),141            (r"[#%$][\w.#%$]+", Name.Variable.Magic),142        ],143 144        "resource-name": [145            # resource names have to be lowercase146            (r"#?[a-z_][a-z_.-]*:[a-z0-9_./-]+", Name.Function),147            # similar to above except optional `:``148            #  a `/` must be present "somewhere"149            (r"#?[a-z0-9_\.\-]+\/[a-z0-9_\.\-\/]+", Name.Function),150        ],151 152        "whitespace": [153            (r"\s+", Whitespace),154        ],155 156        "comments": [157            (rf"^\s*(#{_block_comment_prefix})", Comment.Multiline,158             ("comments.block", "comments.block.emphasized")),159            (r"#.*$", Comment.Single),160        ],161        "comments.block": [162            (rf"^\s*#{_block_comment_prefix}", Comment.Multiline,163             "comments.block.emphasized"),164            (r"^\s*#", Comment.Multiline, "comments.block.normal"),165            default("#pop"),166        ],167        "comments.block.normal": [168            include("comments.block.special"),169            (r"\S+", Comment.Multiline),170            (r"\n", Text, "#pop"),171            include("whitespace"),172        ],173        "comments.block.emphasized": [174            include("comments.block.special"),175            (r"\S+", String.Doc),176            (r"\n", Text, "#pop"),177            include("whitespace"),178        ],179        "comments.block.special": [180            # Params181            (r"@\S+", Name.Decorator),182 183            include("resource-name"),184 185            # Scoreboard player names186            (r"[#%$][\w.#%$]+", Name.Variable.Magic),187        ],188 189        "operators": [190            (r"[\-~%^?!+*<>\\/|&=.]", Operator),191        ],192 193        "literals": [194            (r"\.\.", Literal),195            (r"(true|false)", Keyword.Pseudo),196 197            # these are like unquoted strings and appear in many places198            (r"[A-Za-z_]+", Name.Variable.Class),199 200            (r"[0-7]b", Number.Byte),201            (r"[+-]?\d*\.?\d+([eE]?[+-]?\d+)?[df]?\b", Number.Float),202            (r"[+-]?\d+\b", Number.Integer),203            (r'"', String.Double, "literals.string-double"),204            (r"'", String.Single, "literals.string-single"),205        ],206        "literals.string-double": [207            (r"\\.", String.Escape),208            (r'[^\\"\n]+', String.Double),209            (r'"', String.Double, "#pop"),210        ],211        "literals.string-single": [212            (r"\\.", String.Escape),213            (r"[^\\'\n]+", String.Single),214            (r"'", String.Single, "#pop"),215        ],216 217        "selectors": [218            (r"@[a-z]", Name.Variable),219        ],220 221 222        ## Generic Property Container223        # There are several, differing instances where the language accepts224        #  specific contained keys or contained key, value pairings.225        #226        # Property Maps:227        # - Starts with either `[` or `{`228        # - Key separated by `:` or `=`229        # - Deliminated by `,`230        #231        # Property Lists:232        # - Starts with `[`233        # - Deliminated by `,`234        #235        # For simplicity, these patterns match a generic, nestable structure236        #  which follow a key, value pattern. For normal lists, there's only keys.237        # This allow some "illegal" structures, but we'll accept those for238        #  sake of simplicity239        #240        # Examples:241        # - `[facing=up, powered=true]` (blockstate)242        # - `[name="hello world", nbt={key: 1b}]` (selector + nbt)243        # - `[{"text": "value"}, "literal"]` (json)244        ##245        "property": [246            # This state gets included in root and also several substates247            # We do this to shortcut the starting of new properties248            #  within other properties. Lists can have sublists and compounds249            #  and values can start a new property (see the `difficult_1.txt`250            #  snippet).251            (r"\{", Punctuation, ("property.curly", "property.key")),252            (r"\[", Punctuation, ("property.square", "property.key")),253        ],254        "property.curly": [255            include("whitespace"),256            include("property"),257            (r"\}", Punctuation, "#pop"),258        ],259        "property.square": [260            include("whitespace"),261            include("property"),262            (r"\]", Punctuation, "#pop"),263 264            # lists can have sequences of items265            (r",", Punctuation),266        ],267        "property.key": [268            include("whitespace"),269 270            # resource names (for advancements)271            #  can omit `:` to default `minecraft:`272            # must check if there is a future equals sign if `:` is in the name273            (r"#?[a-z_][a-z_\.\-]*\:[a-z0-9_\.\-/]+(?=\s*\=)", Name.Attribute, "property.delimiter"),274            (r"#?[a-z_][a-z0-9_\.\-/]+", Name.Attribute, "property.delimiter"),275 276            # unquoted NBT key277            (r"[A-Za-z_\-\+]+", Name.Attribute, "property.delimiter"),278 279            # quoted JSON or NBT key280            (r'"', Name.Attribute, "property.delimiter", "literals.string-double"),281            (r"'", Name.Attribute, "property.delimiter", "literals.string-single"),282 283            # index for a list284            (r"-?\d+", Number.Integer, "property.delimiter"),285 286            default("#pop"),287        ],288        "property.key.string-double": [289            (r"\\.", String.Escape),290            (r'[^\\"\n]+', Name.Attribute),291            (r'"', Name.Attribute, "#pop"),292        ],293        "property.key.string-single": [294            (r"\\.", String.Escape),295            (r"[^\\'\n]+", Name.Attribute),296            (r"'", Name.Attribute, "#pop"),297        ],298        "property.delimiter": [299            include("whitespace"),300 301            (r"[:=]!?", Punctuation, "property.value"),302            (r",", Punctuation),303 304            default("#pop"),305        ],306        "property.value": [307            include("whitespace"),308 309            # unquoted resource names are valid literals here310            (r"#?[a-z_][a-z_\.\-]*\:[a-z0-9_\.\-/]+", Name.Tag),311            (r"#?[a-z_][a-z0-9_\.\-/]+", Name.Tag),312 313            include("literals"),314            include("property"),315 316            default("#pop"),317        ],318    }319 320 321class MCSchemaLexer(RegexLexer):322    """Lexer for Minecraft Add-ons data Schemas, an interface structure standard used in Minecraft323    """324 325    name = 'MCSchema'326    url = 'https://learn.microsoft.com/en-us/minecraft/creator/reference/content/schemasreference/'327    aliases = ['mcschema']328    filenames = ['*.mcschema']329    mimetypes = ['text/mcschema']330    version_added = '2.14'331 332    tokens = {333        'commentsandwhitespace': [334            (r'\s+', Whitespace),335            (r'//.*?$', Comment.Single),336            (r'/\*.*?\*/', Comment.Multiline)337        ],338        'slashstartsregex': [339            include('commentsandwhitespace'),340            (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'341             r'([gimuysd]+\b|\B)', String.Regex, '#pop'),342            (r'(?=/)', Text, ('#pop', 'badregex')),343            default('#pop')344        ],345        'badregex': [346            (r'\n', Whitespace, '#pop')347        ],348        'singlestring': [349            (r'\\.', String.Escape),350            (r"'", String.Single, '#pop'),351            (r"[^\\']+", String.Single),352        ],353        'doublestring': [354            (r'\\.', String.Escape),355            (r'"', String.Double, '#pop'),356            (r'[^\\"]+', String.Double),357        ],358        'root': [359            (r'^(?=\s|/|<!--)', Text, 'slashstartsregex'),360            include('commentsandwhitespace'),361 362            # keywords for optional word and field types363            (r'(?<=: )opt', Operator.Word),364            (r'(?<=\s)[\w-]*(?=(\s+"|\n))', Keyword.Declaration),365 366            # numeric literals367            (r'0[bB][01]+', Number.Bin),368            (r'0[oO]?[0-7]+', Number.Oct),369            (r'0[xX][0-9a-fA-F]+', Number.Hex),370            (r'\d+', Number.Integer),371            (r'(\.\d+|\d+\.\d*|\d+)([eE][-+]?\d+)?', Number.Float),372 373            # possible punctuations374            (r'\.\.\.|=>', Punctuation),375            (r'\+\+|--|~|\?\?=?|\?|:|\\(?=\n)|'376             r'(<<|>>>?|==?|!=?|(?:\*\*|\|\||&&|[-<>+*%&|^/]))=?', Operator, 'slashstartsregex'),377            (r'[{(\[;,]', Punctuation, 'slashstartsregex'),378            (r'[})\].]', Punctuation),379 380            # strings381            (r"'", String.Single, 'singlestring'),382            (r'"', String.Double, 'doublestring'),383 384            # title line385            (r'[\w-]*?(?=:\{?\n)', String.Symbol),386            # title line with a version code, formatted387            # `major.minor.patch-prerelease+buildmeta`388            (r'([\w-]*?)(:)(\d+)(?:(\.)(\d+)(?:(\.)(\d+)(?:(\-)((?:[^\W_]|-)*(?:\.(?:[^\W_]|-)*)*))?(?:(\+)((?:[^\W_]|-)+(?:\.(?:[^\W_]|-)+)*))?)?)?(?=:\{?\n)', bygroups(String.Symbol, Operator, Number.Integer, Operator, Number.Integer, Operator, Number.Integer, Operator, String, Operator, String)),389 390            (r'.*\n', Text),391        ]392    }393 
codekingpro/portable-devtools · Team Ai