123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391 |
- """
- pygments.lexers.minecraft
- ~~~~~~~~~~~~~~~~~~~~~~~~~
- Lexers for Minecraft related languages.
- SNBT. A data communication format used in Minecraft.
- wiki: https://minecraft.wiki/w/NBT_format
- MCFunction. The Function file for Minecraft Data packs and Add-ons.
- official: https://learn.microsoft.com/en-us/minecraft/creator/documents/functionsintroduction
- wiki: https://minecraft.wiki/w/Function
- MCSchema. A kind of data Schema for Minecraft Add-on Development.
- official: https://learn.microsoft.com/en-us/minecraft/creator/reference/content/schemasreference/
- community example: https://www.mcbe-dev.net/addons/data-driven/manifest.html
- :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
- :license: BSD, see LICENSE for details.
- """
- from pygments.lexer import RegexLexer, default, include, bygroups
- from pygments.token import Comment, Keyword, Literal, Name, Number, Operator, \
- Punctuation, String, Text, Whitespace
- __all__ = ['SNBTLexer', 'MCFunctionLexer', 'MCSchemaLexer']
- class SNBTLexer(RegexLexer):
- """Lexer for stringified NBT, a data format used in Minecraft
- """
- name = "SNBT"
- url = "https://minecraft.wiki/w/NBT_format"
- aliases = ["snbt"]
- filenames = ["*.snbt"]
- mimetypes = ["text/snbt"]
- version_added = '2.12'
- tokens = {
- "root": [
- # We only look for the open bracket here since square bracket
- # is only valid in NBT pathing (which is a mcfunction idea).
- (r"\{", Punctuation, "compound"),
- (r"[^\{]+", Text),
- ],
- "whitespace": [
- (r"\s+", Whitespace),
- ],
- "operators": [
- (r"[,:;]", Punctuation),
- ],
- "literals": [
- (r"(true|false)", Keyword.Constant),
- (r"-?\d+[eE]-?\d+", Number.Float),
- (r"-?\d*\.\d+[fFdD]?", Number.Float),
- (r"-?\d+[bBsSlLfFdD]?", Number.Integer),
- # Separate states for both types of strings so they don't entangle
- (r'"', String.Double, "literals.string_double"),
- (r"'", String.Single, "literals.string_single"),
- ],
- "literals.string_double": [
- (r"\\.", String.Escape),
- (r'[^\\"\n]+', String.Double),
- (r'"', String.Double, "#pop"),
- ],
- "literals.string_single": [
- (r"\\.", String.Escape),
- (r"[^\\'\n]+", String.Single),
- (r"'", String.Single, "#pop"),
- ],
- "compound": [
- # this handles the unquoted snbt keys
- # note: stringified keys still work
- (r"[A-Z_a-z]+", Name.Attribute),
- include("operators"),
- include("whitespace"),
- include("literals"),
- (r"\{", Punctuation, "#push"),
- (r"\[", Punctuation, "list"),
- (r"\}", Punctuation, "#pop"),
- ],
- "list": [
- (r"[A-Z_a-z]+", Name.Attribute),
- include("literals"),
- include("operators"),
- include("whitespace"),
- (r"\[", Punctuation, "#push"),
- (r"\{", Punctuation, "compound"),
- (r"\]", Punctuation, "#pop"),
- ],
- }
- class MCFunctionLexer(RegexLexer):
- """Lexer for the mcfunction scripting language used in Minecraft
- Modelled somewhat after the `GitHub mcfunction grammar <https://github.com/Arcensoth/language-mcfunction>`_.
- """
- name = "MCFunction"
- url = "https://minecraft.wiki/w/Commands"
- aliases = ["mcfunction", "mcf"]
- filenames = ["*.mcfunction"]
- mimetypes = ["text/mcfunction"]
- version_added = '2.12'
- # Used to denotate the start of a block comment, borrowed from Github's mcfunction
- _block_comment_prefix = "[>!]"
- tokens = {
- "root": [
- include("names"),
- include("comments"),
- include("literals"),
- include("whitespace"),
- include("property"),
- include("operators"),
- include("selectors"),
- ],
- "names": [
- # The start of a command (either beginning of line OR after the run keyword)
- # We don't encode a list of keywords since mods, plugins, or even pre-processors
- # may add new commands, so we have a 'close-enough' regex which catches them.
- (r"^(\s*)([a-z_]+)", bygroups(Whitespace, Name.Builtin)),
- (r"(?<=run)\s+[a-z_]+", Name.Builtin),
- # UUID
- (r"\b[0-9a-fA-F]+(?:-[0-9a-fA-F]+){4}\b", Name.Variable),
- include("resource-name"),
- # normal command names and scoreboards
- # there's no way to know the differences unfortuntely
- (r"[A-Za-z_][\w.#%$]+", Keyword.Constant),
- (r"[#%$][\w.#%$]+", Name.Variable.Magic),
- ],
- "resource-name": [
- # resource names have to be lowercase
- (r"#?[a-z_][a-z_.-]*:[a-z0-9_./-]+", Name.Function),
- # similar to above except optional `:``
- # a `/` must be present "somewhere"
- (r"#?[a-z0-9_\.\-]+\/[a-z0-9_\.\-\/]+", Name.Function),
- ],
- "whitespace": [
- (r"\s+", Whitespace),
- ],
- "comments": [
- (rf"^\s*(#{_block_comment_prefix})", Comment.Multiline,
- ("comments.block", "comments.block.emphasized")),
- (r"#.*$", Comment.Single),
- ],
- "comments.block": [
- (rf"^\s*#{_block_comment_prefix}", Comment.Multiline,
- "comments.block.emphasized"),
- (r"^\s*#", Comment.Multiline, "comments.block.normal"),
- default("#pop"),
- ],
- "comments.block.normal": [
- include("comments.block.special"),
- (r"\S+", Comment.Multiline),
- (r"\n", Text, "#pop"),
- include("whitespace"),
- ],
- "comments.block.emphasized": [
- include("comments.block.special"),
- (r"\S+", String.Doc),
- (r"\n", Text, "#pop"),
- include("whitespace"),
- ],
- "comments.block.special": [
- # Params
- (r"@\S+", Name.Decorator),
- include("resource-name"),
- # Scoreboard player names
- (r"[#%$][\w.#%$]+", Name.Variable.Magic),
- ],
- "operators": [
- (r"[\-~%^?!+*<>\\/|&=.]", Operator),
- ],
- "literals": [
- (r"\.\.", Literal),
- (r"(true|false)", Keyword.Pseudo),
- # these are like unquoted strings and appear in many places
- (r"[A-Za-z_]+", Name.Variable.Class),
- (r"[0-7]b", Number.Byte),
- (r"[+-]?\d*\.?\d+([eE]?[+-]?\d+)?[df]?\b", Number.Float),
- (r"[+-]?\d+\b", Number.Integer),
- (r'"', String.Double, "literals.string-double"),
- (r"'", String.Single, "literals.string-single"),
- ],
- "literals.string-double": [
- (r"\\.", String.Escape),
- (r'[^\\"\n]+', String.Double),
- (r'"', String.Double, "#pop"),
- ],
- "literals.string-single": [
- (r"\\.", String.Escape),
- (r"[^\\'\n]+", String.Single),
- (r"'", String.Single, "#pop"),
- ],
- "selectors": [
- (r"@[a-z]", Name.Variable),
- ],
- ## Generic Property Container
- # There are several, differing instances where the language accepts
- # specific contained keys or contained key, value pairings.
- #
- # Property Maps:
- # - Starts with either `[` or `{`
- # - Key separated by `:` or `=`
- # - Deliminated by `,`
- #
- # Property Lists:
- # - Starts with `[`
- # - Deliminated by `,`
- #
- # For simplicity, these patterns match a generic, nestable structure
- # which follow a key, value pattern. For normal lists, there's only keys.
- # This allow some "illegal" structures, but we'll accept those for
- # sake of simplicity
- #
- # Examples:
- # - `[facing=up, powered=true]` (blockstate)
- # - `[name="hello world", nbt={key: 1b}]` (selector + nbt)
- # - `[{"text": "value"}, "literal"]` (json)
- ##
- "property": [
- # This state gets included in root and also several substates
- # We do this to shortcut the starting of new properties
- # within other properties. Lists can have sublists and compounds
- # and values can start a new property (see the `difficult_1.txt`
- # snippet).
- (r"\{", Punctuation, ("property.curly", "property.key")),
- (r"\[", Punctuation, ("property.square", "property.key")),
- ],
- "property.curly": [
- include("whitespace"),
- include("property"),
- (r"\}", Punctuation, "#pop"),
- ],
- "property.square": [
- include("whitespace"),
- include("property"),
- (r"\]", Punctuation, "#pop"),
- # lists can have sequences of items
- (r",", Punctuation),
- ],
- "property.key": [
- include("whitespace"),
- # resource names (for advancements)
- # can omit `:` to default `minecraft:`
- # must check if there is a future equals sign if `:` is in the name
- (r"#?[a-z_][a-z_\.\-]*\:[a-z0-9_\.\-/]+(?=\s*\=)", Name.Attribute, "property.delimiter"),
- (r"#?[a-z_][a-z0-9_\.\-/]+", Name.Attribute, "property.delimiter"),
- # unquoted NBT key
- (r"[A-Za-z_\-\+]+", Name.Attribute, "property.delimiter"),
- # quoted JSON or NBT key
- (r'"', Name.Attribute, "property.delimiter", "literals.string-double"),
- (r"'", Name.Attribute, "property.delimiter", "literals.string-single"),
- # index for a list
- (r"-?\d+", Number.Integer, "property.delimiter"),
- default("#pop"),
- ],
- "property.key.string-double": [
- (r"\\.", String.Escape),
- (r'[^\\"\n]+', Name.Attribute),
- (r'"', Name.Attribute, "#pop"),
- ],
- "property.key.string-single": [
- (r"\\.", String.Escape),
- (r"[^\\'\n]+", Name.Attribute),
- (r"'", Name.Attribute, "#pop"),
- ],
- "property.delimiter": [
- include("whitespace"),
- (r"[:=]!?", Punctuation, "property.value"),
- (r",", Punctuation),
- default("#pop"),
- ],
- "property.value": [
- include("whitespace"),
- # unquoted resource names are valid literals here
- (r"#?[a-z_][a-z_\.\-]*\:[a-z0-9_\.\-/]+", Name.Tag),
- (r"#?[a-z_][a-z0-9_\.\-/]+", Name.Tag),
- include("literals"),
- include("property"),
- default("#pop"),
- ],
- }
- class MCSchemaLexer(RegexLexer):
- """Lexer for Minecraft Add-ons data Schemas, an interface structure standard used in Minecraft
- """
- name = 'MCSchema'
- url = 'https://learn.microsoft.com/en-us/minecraft/creator/reference/content/schemasreference/'
- aliases = ['mcschema']
- filenames = ['*.mcschema']
- mimetypes = ['text/mcschema']
- version_added = '2.14'
- tokens = {
- 'commentsandwhitespace': [
- (r'\s+', Whitespace),
- (r'//.*?$', Comment.Single),
- (r'/\*.*?\*/', Comment.Multiline)
- ],
- 'slashstartsregex': [
- include('commentsandwhitespace'),
- (r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/'
- r'([gimuysd]+\b|\B)', String.Regex, '#pop'),
- (r'(?=/)', Text, ('#pop', 'badregex')),
- default('#pop')
- ],
- 'badregex': [
- (r'\n', Whitespace, '#pop')
- ],
- 'singlestring': [
- (r'\\.', String.Escape),
- (r"'", String.Single, '#pop'),
- (r"[^\\']+", String.Single),
- ],
- 'doublestring': [
- (r'\\.', String.Escape),
- (r'"', String.Double, '#pop'),
- (r'[^\\"]+', String.Double),
- ],
- 'root': [
- (r'^(?=\s|/|<!--)', Text, 'slashstartsregex'),
- include('commentsandwhitespace'),
- # keywords for optional word and field types
- (r'(?<=: )opt', Operator.Word),
- (r'(?<=\s)[\w-]*(?=(\s+"|\n))', Keyword.Declaration),
- # numeric literals
- (r'0[bB][01]+', Number.Bin),
- (r'0[oO]?[0-7]+', Number.Oct),
- (r'0[xX][0-9a-fA-F]+', Number.Hex),
- (r'\d+', Number.Integer),
- (r'(\.\d+|\d+\.\d*|\d+)([eE][-+]?\d+)?', Number.Float),
- # possible punctuations
- (r'\.\.\.|=>', Punctuation),
- (r'\+\+|--|~|\?\?=?|\?|:|\\(?=\n)|'
- r'(<<|>>>?|==?|!=?|(?:\*\*|\|\||&&|[-<>+*%&|^/]))=?', Operator, 'slashstartsregex'),
- (r'[{(\[;,]', Punctuation, 'slashstartsregex'),
- (r'[})\].]', Punctuation),
- # strings
- (r"'", String.Single, 'singlestring'),
- (r'"', String.Double, 'doublestring'),
- # title line
- (r'[\w-]*?(?=:\{?\n)', String.Symbol),
- # title line with a version code, formatted
- # `major.minor.patch-prerelease+buildmeta`
- (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)),
- (r'.*\n', Text),
- ]
- }
|