"""
    pygments.lexers.rnc
    ~~~~~~~~~~~~~~~~~~~

    Lexer for Relax-NG Compact syntax

    :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS.
    :license: BSD, see LICENSE for details.
"""

from pygments.lexer import RegexLexer
from pygments.token import Text, Comment, Operator, Keyword, Name, String, Punctuation

__all__ = ["RNCCompactLexer"]


class RNCCompactLexer(RegexLexer):
    """
    For RelaxNG-compact syntax.

    .. versionadded:: 2.2
    """

    name = "Relax-NG Compact"
    url = "http://relaxng.org"
    aliases = ["rng-compact", "rnc"]
    filenames = ["*.rnc"]

    tokens = {
        "root": [
            (r"namespace\b", Keyword.Namespace),
            (r"(?:default|datatypes)\b", Keyword.Declaration),
            (r"##.*$", Comment.Preproc),
            (r"#.*$", Comment.Single),
            (r'"[^"]*"', String.Double),
            # TODO single quoted strings and escape sequences outside of
            # double-quoted strings
            (r"(?:element|attribute|mixed)\b", Keyword.Declaration, "variable"),
            (r"(text\b|xsd:[^ ]+)", Keyword.Type, "maybe_xsdattributes"),
            (r"[,?&*=|~]|>>", Operator),
            (r"[(){}]", Punctuation),
            (r".", Text),
        ],
        # a variable has been declared using `element` or `attribute`
        "variable": [
            (r"[^{]+", Name.Variable),
            (r"\{", Punctuation, "#pop"),
        ],
        # after an xsd:<datatype> declaration there may be attributes
        "maybe_xsdattributes": [
            (r"\{", Punctuation, "xsdattributes"),
            (r"\}", Punctuation, "#pop"),
            (r".", Text),
        ],
        # attributes take the form { key1 = value1 key2 = value2 ... }
        "xsdattributes": [
            (r"[^ =}]", Name.Attribute),
            (r"=", Operator),
            (r'"[^"]*"', String.Double),
            (r"\}", Punctuation, "#pop"),
            (r".", Text),
        ],
    }
