// https://www.graphviz.org/doc/info/lang.html
(function (Prism) {
  var ID =
    '(?:' +
    [
      // an identifier
      /[a-zA-Z_\x80-\uFFFF][\w\x80-\uFFFF]*/.source,
      // a number
      /-?(?:\.\d+|\d+(?:\.\d*)?)/.source,
      // a double-quoted string
      /"[^"\\]*(?:\\[\s\S][^"\\]*)*"/.source,
      // HTML-like string
      /<(?:[^<>]|(?!)*>/
        .source,
    ].join('|') +
    ')';
  var IDInside = {
    markup: {
      pattern: /(^<)[\s\S]+(?=>$)/,
      lookbehind: true,
      alias: ['language-markup', 'language-html', 'language-xml'],
      inside: Prism.languages.markup,
    },
  };
  /**
   * @param {string} source
   * @param {string} flags
   * @returns {RegExp}
   */
  function withID(source, flags) {
    return RegExp(
      source.replace(//g, function () {
        return ID;
      }),
      flags
    );
  }
  Prism.languages.dot = {
    comment: {
      pattern: /\/\/.*|\/\*[\s\S]*?\*\/|^#.*/m,
      greedy: true,
    },
    'graph-name': {
      pattern: withID(
        /(\b(?:digraph|graph|subgraph)[ \t\r\n]+)/.source,
        'i'
      ),
      lookbehind: true,
      greedy: true,
      alias: 'class-name',
      inside: IDInside,
    },
    'attr-value': {
      pattern: withID(/(=[ \t\r\n]*)/.source),
      lookbehind: true,
      greedy: true,
      inside: IDInside,
    },
    'attr-name': {
      pattern: withID(/([\[;, \t\r\n])(?=[ \t\r\n]*=)/.source),
      lookbehind: true,
      greedy: true,
      inside: IDInside,
    },
    keyword: /\b(?:digraph|edge|graph|node|strict|subgraph)\b/i,
    'compass-point': {
      pattern: /(:[ \t\r\n]*)(?:[ewc_]|[ns][ew]?)(?![\w\x80-\uFFFF])/,
      lookbehind: true,
      alias: 'builtin',
    },
    node: {
      pattern: withID(/(^|[^-.\w\x80-\uFFFF\\])/.source),
      lookbehind: true,
      greedy: true,
      inside: IDInside,
    },
    operator: /[=:]|-[->]/,
    punctuation: /[\[\]{};,]/,
  };
  Prism.languages.gv = Prism.languages.dot;
})(Prism);