"""
highlight.js language definitions for Python.

Auto-generated by scripts/extract_hljs_languages.py
Source: highlight.js v11.11.1

This module provides keyword data for language auto-detection that matches
the highlight.js frontend algorithm.
"""

from typing import Dict, List, Set, Any


# Common keywords with zero relevance (from highlight.js core.js)
# These words are too common across languages to provide meaningful signal
COMMON_KEYWORDS: Set[str] = {'for', 'list', 'if', 'then', 'of', 'not', 'parent', 'value', 'and', 'or', 'in'}


# Maximum keyword hits per word before capping relevance
MAX_KEYWORD_HITS: int = 7


# Superset relationships: {superset_lang: base_lang}
# When tied, the base language wins over its superset
SUPERSETS: Dict[str, str] = {'arduino': 'cpp', 'pgsql': 'sql', 'typescript': 'javascript'}


# Language definitions
# Each language has:
#   - name: Display name
#   - aliases: Alternative names for the language
#   - case_insensitive: Whether keyword matching is case-insensitive
#   - keywords: Dict of keyword categories (keyword, built_in, literal, type)
LANGUAGES: Dict[str, Dict[str, Any]] = {
    'bash': {
        "name": 'Bash',
        "aliases": ['sh', 'zsh'],
        "case_insensitive": False,
        "keywords": {
            'keyword': ['if', 'then', 'else', 'elif', 'fi', 'for', 'while', 'in', 'do', 'done', 'case', 'esac', 'function', 'select', 'until', 'return', 'exit', 'break', 'continue', 'declare', 'typeset', 'local', 'export', 'readonly', 'unset', 'shift', 'eval', 'exec', 'set', 'shopt', 'trap', 'source'],
            'built_in': ['echo', 'printf', 'read', 'cd', 'pwd', 'pushd', 'popd', 'dirs', 'let', 'test', 'true', 'false', 'alias', 'unalias', 'bind', 'builtin', 'caller', 'command', 'compgen', 'complete', 'compopt', 'enable', 'getopts', 'hash', 'help', 'history', 'jobs', 'kill', 'logout', 'mapfile', 'readarray', 'suspend', 'times', 'type', 'ulimit', 'umask', 'wait', 'bg', 'fg', 'disown', 'coproc'],
            'literal': ['true', 'false'],
        },
    },
    'c': {
        "name": 'C',
        "aliases": ['h'],
        "case_insensitive": False,
        "keywords": {
            'keyword': ['auto', 'break', 'case', 'const', 'continue', 'default', 'do', 'else', 'enum', 'extern', 'for', 'goto', 'if', 'inline', 'register', 'restrict', 'return', 'sizeof', 'static', 'struct', 'switch', 'typedef', 'union', 'volatile', 'while', '_Alignas', '_Alignof', '_Atomic', '_Generic', '_Noreturn', '_Static_assert', '_Thread_local'],
            'type': ['char', 'double', 'float', 'int', 'long', 'short', 'signed', 'unsigned', 'void', '_Bool', '_Complex', '_Imaginary', 'int8_t', 'int16_t', 'int32_t', 'int64_t', 'uint8_t', 'uint16_t', 'uint32_t', 'uint64_t', 'size_t', 'ptrdiff_t', 'intptr_t', 'uintptr_t'],
            'literal': ['true', 'false', 'NULL'],
        },
    },
    'cpp': {
        "name": 'C++',
        "aliases": ['cc', 'c++', 'h++', 'hpp', 'hh', 'hxx', 'cxx'],
        "case_insensitive": False,
        "keywords": {
            'keyword': ['auto', 'break', 'case', 'catch', 'class', 'const', 'const_cast', 'constexpr', 'continue', 'decltype', 'default', 'delete', 'do', 'dynamic_cast', 'else', 'enum', 'explicit', 'export', 'extern', 'false', 'final', 'for', 'friend', 'goto', 'if', 'inline', 'mutable', 'namespace', 'new', 'noexcept', 'nullptr', 'operator', 'override', 'private', 'protected', 'public', 'register', 'reinterpret_cast', 'return', 'sizeof', 'static', 'static_assert', 'static_cast', 'struct', 'switch', 'template', 'this', 'thread_local', 'throw', 'true', 'try', 'typedef', 'typeid', 'typename', 'union', 'using', 'virtual', 'volatile', 'while', 'alignas', 'alignof', 'char8_t', 'char16_t', 'char32_t', 'concept', 'consteval', 'constinit', 'co_await', 'co_return', 'co_yield', 'requires'],
            'type': ['bool', 'char', 'double', 'float', 'int', 'long', 'short', 'signed', 'unsigned', 'void', 'wchar_t', 'int8_t', 'int16_t', 'int32_t', 'int64_t', 'uint8_t', 'uint16_t', 'uint32_t', 'uint64_t', 'size_t', 'ptrdiff_t', 'intptr_t', 'uintptr_t', 'string', 'vector', 'map', 'set', 'list', 'deque', 'array', 'pair', 'tuple', 'shared_ptr', 'unique_ptr', 'weak_ptr'],
            'literal': ['true', 'false', 'nullptr', 'NULL'],
        },
    },
    'css': {
        "name": 'CSS',
        "aliases": [],
        "case_insensitive": True,
        "keywords": {
            'keyword': ['@import', '@media', '@font-face', '@keyframes', '@supports', '@page', '@charset', '@namespace', '!important'],
            'built_in': ['color', 'background', 'background-color', 'background-image', 'border', 'border-radius', 'margin', 'padding', 'width', 'height', 'display', 'position', 'top', 'right', 'bottom', 'left', 'float', 'clear', 'font', 'font-size', 'font-family', 'font-weight', 'text-align', 'text-decoration', 'line-height', 'letter-spacing', 'overflow', 'visibility', 'opacity', 'z-index', 'flex', 'grid', 'transform', 'transition', 'animation', 'box-shadow', 'cursor', 'content', 'list-style', 'vertical-align', 'white-space', 'word-wrap', 'box-sizing', 'outline', 'min-width', 'max-width', 'min-height', 'max-height'],
            'literal': ['inherit', 'initial', 'unset', 'none', 'auto', 'transparent'],
        },
    },
    'go': {
        "name": 'Go',
        "aliases": ['golang'],
        "case_insensitive": False,
        "keywords": {
            'keyword': ['break', 'case', 'chan', 'const', 'continue', 'default', 'defer', 'else', 'fallthrough', 'for', 'func', 'go', 'goto', 'if', 'import', 'interface', 'map', 'package', 'range', 'return', 'select', 'struct', 'switch', 'type', 'var'],
            'type': ['bool', 'byte', 'complex64', 'complex128', 'error', 'float32', 'float64', 'int', 'int8', 'int16', 'int32', 'int64', 'rune', 'string', 'uint', 'uint8', 'uint16', 'uint32', 'uint64', 'uintptr'],
            'built_in': ['append', 'cap', 'close', 'complex', 'copy', 'delete', 'imag', 'len', 'make', 'new', 'panic', 'print', 'println', 'real', 'recover'],
            'literal': ['true', 'false', 'nil', 'iota'],
        },
    },
    'java': {
        "name": 'Java',
        "aliases": ['jsp'],
        "case_insensitive": False,
        "keywords": {
            'keyword': ['abstract', 'assert', 'break', 'case', 'catch', 'class', 'const', 'continue', 'default', 'do', 'else', 'enum', 'exports', 'extends', 'final', 'finally', 'for', 'goto', 'if', 'implements', 'import', 'instanceof', 'interface', 'module', 'native', 'new', 'non-sealed', 'open', 'opens', 'package', 'permits', 'private', 'protected', 'provides', 'public', 'record', 'requires', 'return', 'sealed', 'static', 'strictfp', 'super', 'switch', 'synchronized', 'this', 'throw', 'throws', 'to', 'transient', 'transitive', 'try', 'uses', 'var', 'void', 'volatile', 'while', 'with', 'yield'],
            'literal': ['true', 'false', 'null'],
            'type': ['byte', 'short', 'char', 'int', 'long', 'float', 'double', 'boolean'],
        },
    },
    'javascript': {
        "name": 'JavaScript',
        "aliases": ['js', 'jsx', 'mjs', 'cjs'],
        "case_insensitive": False,
        "keywords": {
            'keyword': ['as', 'in', 'of', 'if', 'for', 'while', 'finally', 'var', 'new', 'function', 'do', 'return', 'void', 'else', 'break', 'catch', 'instanceof', 'with', 'throw', 'case', 'default', 'try', 'switch', 'continue', 'typeof', 'delete', 'let', 'yield', 'const', 'class', 'debugger', 'async', 'await', 'static', 'import', 'from', 'export', 'extends', 'using'],
            'built_in': ['setInterval', 'setTimeout', 'clearInterval', 'clearTimeout', 'require', 'exports', 'eval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object', 'Function', 'Boolean', 'Symbol', 'Math', 'Date', 'Number', 'BigInt', 'String', 'RegExp', 'Array', 'Float32Array', 'Float64Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Int32Array', 'Uint16Array', 'Uint32Array', 'BigInt64Array', 'BigUint64Array', 'Set', 'Map', 'WeakSet', 'WeakMap', 'ArrayBuffer', 'SharedArrayBuffer', 'Atomics', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'AsyncFunction', 'Reflect', 'Proxy', 'Intl', 'WebAssembly', 'Error', 'EvalError', 'InternalError', 'RangeError', 'ReferenceError', 'SyntaxError', 'TypeError', 'URIError'],
            'literal': ['true', 'false', 'null', 'undefined', 'NaN', 'Infinity'],
        },
    },
    'json': {
        "name": 'JSON',
        "aliases": ['jsonc', 'json5'],
        "case_insensitive": False,
        "keywords": {
            'literal': ['true', 'false', 'null'],
        },
    },
    'php': {
        "name": 'PHP',
        "aliases": [],
        "case_insensitive": True,
        "keywords": {
            'keyword': ['abstract', 'and', 'array', 'as', 'break', 'callable', 'case', 'catch', 'class', 'clone', 'const', 'continue', 'declare', 'default', 'die', 'do', 'echo', 'else', 'elseif', 'empty', 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', 'eval', 'exit', 'extends', 'final', 'finally', 'fn', 'for', 'foreach', 'function', 'global', 'goto', 'if', 'implements', 'include', 'include_once', 'instanceof', 'insteadof', 'interface', 'isset', 'list', 'match', 'namespace', 'new', 'or', 'print', 'private', 'protected', 'public', 'readonly', 'require', 'require_once', 'return', 'static', 'switch', 'throw', 'trait', 'try', 'unset', 'use', 'var', 'while', 'xor', 'yield', 'yield from'],
            'type': ['array', 'bool', 'boolean', 'callable', 'double', 'false', 'float', 'int', 'integer', 'iterable', 'mixed', 'never', 'null', 'numeric', 'object', 'resource', 'self', 'static', 'string', 'true', 'void'],
            'built_in': ['isset', 'unset', 'empty', 'die', 'exit', 'echo', 'print', 'var_dump', 'print_r', 'strlen', 'substr', 'strpos', 'str_replace', 'array_push', 'array_pop', 'array_shift', 'array_unshift', 'array_merge', 'array_keys', 'array_values', 'count', 'sizeof', 'in_array', 'array_search', 'sort', 'rsort', 'asort', 'ksort', 'usort', 'json_encode', 'json_decode', 'file_get_contents', 'file_put_contents', 'fopen', 'fclose', 'fread', 'fwrite', 'preg_match', 'preg_replace'],
            'literal': ['true', 'false', 'null', 'TRUE', 'FALSE', 'NULL'],
        },
    },
    'python': {
        "name": 'Python',
        "aliases": ['py', 'gyp', 'ipython'],
        "case_insensitive": False,
        "keywords": {
            'keyword': ['and', 'as', 'assert', 'async', 'await', 'break', 'case', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'match', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'],
            'built_in': ['__import__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip'],
            'literal': ['__debug__', 'Ellipsis', 'False', 'None', 'NotImplemented', 'True'],
            'type': ['Any', 'Callable', 'Coroutine', 'Dict', 'List', 'Literal', 'Generic', 'Optional', 'Sequence', 'Set', 'Tuple', 'Type', 'Union'],
        },
    },
    'ruby': {
        "name": 'Ruby',
        "aliases": ['rb', 'gemspec', 'podspec', 'thor', 'irb'],
        "case_insensitive": False,
        "keywords": {
            'keyword': ['alias', 'and', 'begin', 'break', 'case', 'class', 'def', 'defined', 'do', 'else', 'elsif', 'end', 'ensure', 'false', 'for', 'if', 'in', 'module', 'next', 'nil', 'not', 'or', 'redo', 'rescue', 'retry', 'return', 'self', 'super', 'then', 'true', 'undef', 'unless', 'until', 'when', 'while', 'yield', 'raise', 'require', 'require_relative', 'include', 'extend', 'prepend', 'attr_accessor', 'attr_reader', 'attr_writer', 'private', 'protected', 'public'],
            'built_in': ['puts', 'print', 'p', 'gets', 'chomp', 'each', 'map', 'select', 'reject', 'reduce', 'inject', 'find', 'any?', 'all?', 'none?', 'sort', 'sort_by', 'reverse', 'first', 'last', 'take', 'drop', 'length', 'size', 'count', 'empty?', 'nil?', 'to_s', 'to_i', 'to_f', 'to_a', 'to_h', 'split', 'join', 'gsub', 'sub', 'match', 'scan', 'strip', 'upcase', 'downcase', 'capitalize'],
            'literal': ['true', 'false', 'nil'],
        },
    },
    'rust': {
        "name": 'Rust',
        "aliases": ['rs'],
        "case_insensitive": False,
        "keywords": {
            'keyword': ['as', 'async', 'await', 'break', 'const', 'continue', 'crate', 'dyn', 'else', 'enum', 'extern', 'false', 'fn', 'for', 'if', 'impl', 'in', 'let', 'loop', 'match', 'mod', 'move', 'mut', 'pub', 'ref', 'return', 'self', 'Self', 'static', 'struct', 'super', 'trait', 'true', 'type', 'unsafe', 'use', 'where', 'while', 'macro_rules'],
            'type': ['bool', 'char', 'f32', 'f64', 'i8', 'i16', 'i32', 'i64', 'i128', 'isize', 'str', 'u8', 'u16', 'u32', 'u64', 'u128', 'usize', 'Box', 'Option', 'Result', 'String', 'Vec', 'HashMap', 'HashSet', 'Rc', 'Arc', 'Cell', 'RefCell', 'Mutex', 'RwLock'],
            'built_in': ['drop', 'Some', 'None', 'Ok', 'Err', 'println', 'print', 'eprintln', 'eprint', 'format', 'panic', 'assert', 'assert_eq', 'assert_ne', 'debug_assert', 'vec', 'clone', 'to_string', 'to_owned', 'into', 'from', 'default'],
            'literal': ['true', 'false'],
        },
    },
    'sql': {
        "name": 'SQL',
        "aliases": [],
        "case_insensitive": True,
        "keywords": {
            'keyword': ['ADD', 'ALL', 'ALTER', 'AND', 'AS', 'ASC', 'BETWEEN', 'BY', 'CASE', 'CHECK', 'COLUMN', 'CONSTRAINT', 'CREATE', 'CROSS', 'DATABASE', 'DELETE', 'DESC', 'DISTINCT', 'DROP', 'ELSE', 'END', 'EXISTS', 'FOREIGN', 'FROM', 'FULL', 'GROUP', 'HAVING', 'IN', 'INDEX', 'INNER', 'INSERT', 'INTO', 'IS', 'JOIN', 'KEY', 'LEFT', 'LIKE', 'LIMIT', 'NOT', 'NULL', 'ON', 'OR', 'ORDER', 'OUTER', 'PRIMARY', 'REFERENCES', 'RIGHT', 'SELECT', 'SET', 'TABLE', 'THEN', 'TOP', 'TRUNCATE', 'UNION', 'UNIQUE', 'UPDATE', 'VALUES', 'VIEW', 'WHEN', 'WHERE', 'WITH'],
            'built_in': ['AVG', 'COUNT', 'MAX', 'MIN', 'SUM', 'COALESCE', 'NULLIF', 'CAST', 'CONVERT', 'SUBSTRING', 'TRIM', 'UPPER', 'LOWER', 'LENGTH', 'CONCAT', 'NOW', 'CURRENT_DATE', 'CURRENT_TIME', 'CURRENT_TIMESTAMP', 'EXTRACT', 'DATE_ADD', 'DATE_SUB', 'DATEDIFF', 'ROUND', 'FLOOR', 'CEIL', 'ABS', 'MOD', 'IFNULL', 'IIF', 'NVL', 'DECODE'],
            'type': ['INT', 'INTEGER', 'BIGINT', 'SMALLINT', 'TINYINT', 'FLOAT', 'REAL', 'DOUBLE', 'DECIMAL', 'NUMERIC', 'CHAR', 'VARCHAR', 'TEXT', 'NCHAR', 'NVARCHAR', 'NTEXT', 'BINARY', 'VARBINARY', 'IMAGE', 'DATE', 'TIME', 'DATETIME', 'TIMESTAMP', 'BOOLEAN', 'BOOL', 'BIT', 'BLOB', 'CLOB'],
            'literal': ['TRUE', 'FALSE', 'NULL'],
        },
    },
    'typescript': {
        "name": 'TypeScript',
        "aliases": ['ts', 'tsx', 'mts', 'cts'],
        "case_insensitive": False,
        "keywords": {
            'keyword': ['as', 'in', 'of', 'if', 'for', 'while', 'finally', 'var', 'new', 'function', 'do', 'return', 'void', 'else', 'break', 'catch', 'instanceof', 'with', 'throw', 'case', 'default', 'try', 'switch', 'continue', 'typeof', 'delete', 'let', 'yield', 'const', 'class', 'debugger', 'async', 'await', 'static', 'import', 'from', 'export', 'extends', 'using', 'type', 'interface', 'namespace', 'declare', 'enum', 'keyof', 'readonly', 'abstract', 'implements', 'infer', 'is', 'override', 'private', 'protected', 'public', 'satisfies'],
            'built_in': ['setInterval', 'setTimeout', 'clearInterval', 'clearTimeout', 'require', 'exports', 'eval', 'isFinite', 'isNaN', 'parseFloat', 'parseInt', 'decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent', 'escape', 'unescape', 'Object', 'Function', 'Boolean', 'Symbol', 'Math', 'Date', 'Number', 'BigInt', 'String', 'RegExp', 'Array', 'Float32Array', 'Float64Array', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Int32Array', 'Uint16Array', 'Uint32Array', 'BigInt64Array', 'BigUint64Array', 'Set', 'Map', 'WeakSet', 'WeakMap', 'ArrayBuffer', 'SharedArrayBuffer', 'Atomics', 'DataView', 'JSON', 'Promise', 'Generator', 'GeneratorFunction', 'AsyncFunction', 'Reflect', 'Proxy', 'Intl', 'WebAssembly', 'Error', 'EvalError', 'InternalError', 'RangeError', 'ReferenceError', 'SyntaxError', 'TypeError', 'URIError'],
            'literal': ['true', 'false', 'null', 'undefined', 'NaN', 'Infinity'],
        },
    },
    'xml': {
        "name": 'XML',
        "aliases": ['html', 'xhtml', 'rss', 'atom', 'xjb', 'xsd', 'xsl', 'plist', 'svg'],
        "case_insensitive": True,
        "keywords": {
            'keyword': ['DOCTYPE', 'CDATA'],
            'built_in': ['html', 'head', 'body', 'div', 'span', 'p', 'a', 'img', 'table', 'tr', 'td', 'th', 'form', 'input', 'button', 'script', 'style', 'link', 'meta', 'title', 'header', 'footer', 'nav', 'section', 'article', 'aside', 'main', 'ul', 'ol', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'br', 'hr', 'pre', 'code', 'blockquote', 'em', 'strong', 'b', 'i', 'u', 'select', 'option', 'textarea', 'label'],
        },
    },
    'yaml': {
        "name": 'YAML',
        "aliases": ['yml'],
        "case_insensitive": True,
        "keywords": {
            'literal': ['true', 'false', 'yes', 'no', 'null', 'True', 'False', 'Yes', 'No', 'Null', 'NULL'],
        },
    },
}


# Build reverse lookup for aliases
ALIAS_MAP: Dict[str, str] = {}
for lang_id, lang_data in LANGUAGES.items():
    ALIAS_MAP[lang_id] = lang_id
    for alias in lang_data.get("aliases", []):
        ALIAS_MAP[alias] = lang_id
