"""
    pygments.lexers.resource
    ~~~~~~~~~~~~~~~~~~~~~~~~

    Lexer for resource definition files.

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

import re

from pygments.lexer import RegexLexer, bygroups, words
from pygments.token import Comment, String, Number, Operator, Text, Keyword, Name

__all__ = ["ResourceLexer"]


class ResourceLexer(RegexLexer):
    """Lexer for `ICU Resource bundles
    <http://userguide.icu-project.org/locale/resources>`_.

    .. versionadded:: 2.0
    """

    name = "ResourceBundle"
    aliases = ["resourcebundle", "resource"]
    filenames = []

    _types = (":table", ":array", ":string", ":bin", ":import", ":intvector", ":int", ":alias")

    flags = re.MULTILINE | re.IGNORECASE
    tokens = {
        "root": [
            (r"//.*?$", Comment),
            (r'"', String, "string"),
            (r"-?\d+", Number.Integer),
            (r"[,{}]", Operator),
            (r"([^\s{:]+)(\s*)(%s?)" % "|".join(_types), bygroups(Name, Text, Keyword)),
            (r"\s+", Text),
            (words(_types), Keyword),
        ],
        "string": [
            (
                r"(\\x[0-9a-f]{2}|\\u[0-9a-f]{4}|\\U00[0-9a-f]{6}|"
                r'\\[0-7]{1,3}|\\c.|\\[abtnvfre\'"?\\]|\\\{|[^"{\\])+',
                String,
            ),
            (r"\{", String.Escape, "msgname"),
            (r'"', String, "#pop"),
        ],
        "msgname": [(r"([^{},]+)(\s*)", bygroups(Name, String.Escape), ("#pop", "message"))],
        "message": [
            (r"\{", String.Escape, "msgname"),
            (r"\}", String.Escape, "#pop"),
            (r"(,)(\s*)([a-z]+)(\s*\})", bygroups(Operator, String.Escape, Keyword, String.Escape), "#pop"),
            (
                r"(,)(\s*)([a-z]+)(\s*)(,)(\s*)(offset)(\s*)(:)(\s*)(-?\d+)(\s*)",
                bygroups(
                    Operator,
                    String.Escape,
                    Keyword,
                    String.Escape,
                    Operator,
                    String.Escape,
                    Operator.Word,
                    String.Escape,
                    Operator,
                    String.Escape,
                    Number.Integer,
                    String.Escape,
                ),
                "choice",
            ),
            (
                r"(,)(\s*)([a-z]+)(\s*)(,)(\s*)",
                bygroups(Operator, String.Escape, Keyword, String.Escape, Operator, String.Escape),
                "choice",
            ),
            (r"\s+", String.Escape),
        ],
        "choice": [
            (r"(=|<|>|<=|>=|!=)(-?\d+)(\s*\{)", bygroups(Operator, Number.Integer, String.Escape), "message"),
            (r"([a-z]+)(\s*\{)", bygroups(Keyword.Type, String.Escape), "str"),
            (r"\}", String.Escape, ("#pop", "#pop")),
            (r"\s+", String.Escape),
        ],
        "str": [(r"\}", String.Escape, "#pop"), (r"\{", String.Escape, "msgname"), (r"[^{}]+", String)],
    }

    def analyse_text(text):
        if text.startswith("root:table"):
            return 1.0
