"""
    pygments.lexers.graphviz
    ~~~~~~~~~~~~~~~~~~~~~~~~

    Lexer for the DOT language (graphviz).

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

from pygments.lexer import RegexLexer, bygroups
from pygments.token import Comment, Keyword, Operator, Name, String, Number, Punctuation, Whitespace


__all__ = ["GraphvizLexer"]


class GraphvizLexer(RegexLexer):
    """
    For graphviz DOT graph description language.

    .. versionadded:: 2.8
    """

    name = "Graphviz"
    url = "https://www.graphviz.org/doc/info/lang.html"
    aliases = ["graphviz", "dot"]
    filenames = ["*.gv", "*.dot"]
    mimetypes = ["text/x-graphviz", "text/vnd.graphviz"]
    tokens = {
        "root": [
            (r"\s+", Whitespace),
            (r"(#|//).*?$", Comment.Single),
            (r"/(\\\n)?[*](.|\n)*?[*](\\\n)?/", Comment.Multiline),
            (r"(?i)(node|edge|graph|digraph|subgraph|strict)\b", Keyword),
            (r"--|->", Operator),
            (r"[{}[\]:;,]", Punctuation),
            (r"(\b\D\w*)(\s*)(=)(\s*)", bygroups(Name.Attribute, Whitespace, Punctuation, Whitespace), "attr_id"),
            (r"\b(n|ne|e|se|s|sw|w|nw|c|_)\b", Name.Builtin),
            (r"\b\D\w*", Name.Tag),  # node
            (r"[-]?((\.[0-9]+)|([0-9]+(\.[0-9]*)?))", Number),
            (r'"(\\"|[^"])*?"', Name.Tag),  # quoted node
            (r"<", Punctuation, "xml"),
        ],
        "attr_id": [
            (r"\b\D\w*", String, "#pop"),
            (r"[-]?((\.[0-9]+)|([0-9]+(\.[0-9]*)?))", Number, "#pop"),
            (r'"(\\"|[^"])*?"', String.Double, "#pop"),
            (r"<", Punctuation, ("#pop", "xml")),
        ],
        "xml": [
            (r"<", Punctuation, "#push"),
            (r">", Punctuation, "#pop"),
            (r"\s+", Whitespace),
            (r"[^<>\s]", Name.Tag),
        ],
    }
