💾 Archived View for bbs.geminispace.org › u › cthulhu › file › 323 captured on 2024-12-17 at 15:27:31.

View Raw

More Information

⬅️ Previous capture (2024-08-19)

-=-=-=-=-=-=-

#!/opt/lagrange-pygments/.venv/bin/python3
import re
import sys
from typing import Tuple

from rich.console import Console
from rich.syntax import Syntax

LEXERS_NAMES = {
    'abap', 'abl', 'abnf', 'aconf', 'actionscript', 'actionscript3', 'ada',
    'ada2005', 'ada95', 'adl', 'agda', 'aheui', 'ahk', 'alloy', 'ambienttalk',
    'ambienttalk/2', 'amdgpu', 'ampl', 'androidbp', 'ansys', 'antlr',
    'antlr-actionscript', 'antlr-as', 'antlr-c#', 'antlr-cpp', 'antlr-csharp',
    'antlr-java', 'antlr-objc', 'antlr-perl', 'antlr-python', 'antlr-rb',
    'antlr-ruby', 'apache', 'apacheconf', 'apdl', 'apl', 'applescript',
    'arduino', 'arexx', 'arrow', 'art', 'arturo', 'as', 'as3', 'asc', 'asm',
    'asn1', 'aspectj', 'aspx-cs', 'aspx-vb', 'asy', 'asymptote', 'at', 'augeas',
    'autohotkey', 'autoit', 'awk', 'b3d', 'bare', 'basemake', 'bash', 'basic',
    'bat', 'batch', 'bazel', 'bbcbasic', 'bbcode', 'bc', 'bdd', 'be', 'befunge',
    'berry', 'bf', 'bib', 'bibtex', 'blitzbasic', 'blitzmax', 'blueprint',
    'bmax', 'bnf', 'boa', 'boo', 'boogie', 'bp', 'bplus', 'bqn', 'brainfuck',
    'bro', 'bsdmake', 'bst', 'bst-pybtex', 'bugs', 'c#', 'c', 'c++',
    'c++-objdumb', 'c-objdump', 'ca65', 'cadl', 'camkes', 'capdl', 'capnp',
    'carbon', 'cbmbas', 'cddl', 'ceylon', 'cf3', 'cfc', 'cfengine3', 'cfg',
    'cfm', 'cfs', 'chai', 'chaiscript', 'chapel', 'charmci', 'cheetah', 'chpl',
    'cirru', 'cl', 'clay', 'clean', 'clipper', 'clj', 'cljs', 'clojure',
    'clojurescript', 'cmake', 'cobol', 'cobolfree', 'coffee', 'coffee-script',
    'coffeescript', 'comal', 'comal80', 'common-lisp', 'componentpascal',
    'console', 'control', 'coq', 'cp', 'cplint', 'cpp', 'cpp-objdump', 'cpsa',
    'cr', 'crmsh', 'croc', 'cry', 'cryptol', 'crystal', 'cs', 'csh', 'csharp',
    'csound', 'csound-csd', 'csound-document', 'csound-orc', 'csound-sco',
    'csound-score', 'css', 'css+django', 'css+erb', 'css+genshi',
    'css+genshitext', 'css+jinja', 'css+lasso', 'css+mako', 'css+mozpreproc',
    'css+myghty', 'css+php', 'css+ruby', 'css+smarty', 'css+ul4', 'cu',
    'cucumber', 'cuda', 'cxx-objdump', 'cypher', 'cython', 'd', 'd-objdump',
    'dart', 'dasm16', 'dax', 'debcontrol', 'debsources', 'delphi', 'desktop',
    'devicetree', 'dg', 'diff', 'django', 'dmesg', 'do', 'docker', 'dockerfile',
    'dosbatch', 'doscon', 'dosini', 'dot', 'dpatch', 'dtd', 'dts', 'duby',
    'duel', 'dylan', 'dylan-console', 'dylan-lid', 'dylan-repl', 'earl-grey',
    'earlgrey', 'easytrieve', 'ebnf', 'ec', 'ecl', 'eg', 'eiffel', 'elisp',
    'elixir', 'elm', 'elpi', 'emacs', 'emacs-lisp', 'email', 'eml', 'erb',
    'erl', 'erlang', 'evoque', 'ex', 'execline', 'exs', 'extempore', 'ezhil',
    'f#', 'f90', 'factor', 'fan', 'fancy', 'fc', 'felix', 'fennel', 'fif',
    'fift', 'fish', 'fishshell', 'flatline', 'flo', 'floscript', 'flx', 'fnl',
    'forth', 'fortran', 'fortranfixed', 'foxpro', 'freefem', 'fsharp', 'fstar',
    'func', 'futhark', 'fy', 'gap', 'gap-console', 'gap-repl', 'gas', 'gawk',
    'gcode', 'gd', 'gdscript', 'genshi', 'genshitext', 'gherkin', 'glsl',
    'gnuplot', 'go', 'golang', 'golo', 'gooddata-cl', 'gosu', 'graphql',
    'graphviz', 'groff', 'groovy', 'gsed', 'gsql', 'gst', 'haml', 'handlebars',
    'haskell', 'haxe', 'haxeml', 'hcl', 'hexdump', 'hlsl', 'hs', 'hsa', 'hsail',
    'hspec', 'html', 'html+cheetah', 'html+django', 'html+erb', 'html+evoque',
    'html+genshi', 'html+handlebars', 'html+jinja', 'html+kid', 'html+lasso',
    'html+mako', 'html+myghty', 'html+ng2', 'html+php', 'html+ruby',
    'html+smarty', 'html+spitfire', 'html+twig', 'html+ul4', 'html+velocity',
    'htmlcheetah', 'htmldjango', 'http', 'hx', 'hxml', 'hxsl', 'hy', 'hybris',
    'hylang', 'i6', 'i6t', 'i7', 'icon', 'idl', 'idl4', 'idr', 'idris', 'iex',
    'igor', 'igorpro', 'ik', 'inform6', 'inform7', 'ini', 'io', 'ioke', 'irb',
    'irc', 'isabelle', 'j', 'jade', 'jags', 'janet', 'jasmin', 'jasminxt',
    'java', 'javascript', 'javascript+cheetah', 'javascript+django',
    'javascript+erb', 'javascript+genshi', 'javascript+genshitext',
    'javascript+jinja', 'javascript+lasso', 'javascript+mako',
    'javascript+mozpreproc', 'javascript+myghty', 'javascript+php',
    'javascript+ruby', 'javascript+smarty', 'javascript+spitfire', 'jbst',
    'jcl', 'jinja', 'jl', 'jlcon', 'jmespath', 'jp', 'jproperties', 'js',
    'js+cheetah', 'js+django', 'js+erb', 'js+genshi', 'js+genshitext',
    'js+jinja', 'js+lasso', 'js+mako', 'js+myghty', 'js+php', 'js+ruby',
    'js+smarty', 'js+spitfire', 'js+ul4', 'jsgf', 'jslt', 'json', 'json-ld',
    'json-object', 'jsonld', 'jsonml+bst', 'jsonnet', 'jsp', 'jsx', 'julia',
    'julia-repl', 'juttle', 'k', 'kal', 'kconfig', 'kernel-config', 'kid',
    'kmsg', 'koka', 'kotlin', 'kql', 'ksh', 'kuin', 'kusto', 'lagda', 'lasso',
    'lassoscript', 'latex', 'lcry', 'lcryptol', 'ldapconf', 'ldaprc', 'ldif',
    'lean', 'lean3', 'lean4', 'less', 'lhaskell', 'lhs', 'lid', 'lidr',
    'lidris', 'lighttpd', 'lighty', 'lilypond', 'limbo', 'linux-config',
    'linuxconfig', 'liquid', 'lisp', 'literate-agda', 'literate-cryptol',
    'literate-haskell', 'literate-idris', 'live-script', 'livescript', 'llvm',
    'llvm-mir', 'llvm-mir-body', 'lobas', 'logos', 'logtalk', 'lsl', 'lua',
    'luau', 'm2', 'macaulay2', 'macsyma', 'make', 'makefile', 'mako', 'man',
    'maql', 'markdown', 'mask', 'mason', 'mathematica', 'matlab',
    'matlabsession', 'mawk', 'maxima', 'mcf', 'mcfunction', 'mcschema', 'md',
    'mediawiki', 'menuconfig', 'meson', 'meson.build', 'mf', 'mime', 'minid',
    'miniscript', 'mips', 'mma', 'modelica', 'modula2', 'moin', 'mojo',
    'monkey', 'monte', 'moo', 'moocode', 'moon', 'moonscript', 'mosel',
    'mozhashpreproc', 'mozpercentpreproc', 'mq4', 'mq5', 'mql', 'mql4', 'mql5',
    'ms', 'msc', 'mscgen', 'mupad', 'mxml', 'myghty', 'mysql', 'nasm', 'nawk',
    'nb', 'ncl', 'nemerle', 'nesc', 'nestedtext', 'newlisp', 'newspeak', 'ng2',
    'nginx', 'nim', 'nimrod', 'nit', 'nix', 'nixos', 'nodejsrepl', 'notmuch',
    'nroff', 'nsh', 'nsi', 'nsis', 'nt', 'numpy', 'nusmv', 'obj-c', 'obj-c++',
    'obj-j', 'objc', 'objc++', 'objdump', 'objdump-nasm', 'objective-c',
    'objective-c++', 'objective-j', 'objectivec', 'objectivec++', 'objectivej',
    'objectpascal', 'objj', 'ocaml', 'octave', 'odin', 'omg-idl', 'oobas',
    'ooc', 'opa', 'openbugs', 'openedge', 'openrc', 'openscad', 'org',
    'org-mode', 'orgmode', 'output', 'pacmanconf', 'pan', 'parasail', 'pas',
    'pascal', 'pawn', 'pcmk', 'peg', 'pem', 'perl', 'perl6', 'phix', 'php',
    'php3', 'php4', 'php5', 'pig', 'pike', 'pkgconfig', 'pl', 'pl6', 'plpgsql',
    'po', 'pointless', 'pony', 'portugol', 'posh', 'postgres',
    'postgres-console', 'postgres-explain', 'postgresql', 'postgresql-console',
    'postscr', 'postscript', 'pot', 'pov', 'powershell', 'praat', 'procfile',
    'progress', 'prolog', 'promela', 'promql', 'properties', 'proto',
    'protobuf', 'prql', 'ps1', 'ps1con', 'psm1', 'psql', 'psysh', 'ptx', 'pug',
    'puppet', 'pwsh', 'pwsh-session', 'py', 'py+ul4', 'py2', 'py2tb', 'py3',
    'py3tb', 'pycon', 'pypy', 'pypylog', 'pyrex', 'pytb', 'python',
    'python-console', 'python2', 'python3', 'pyx', 'q', 'qbasic', 'qbs', 'qlik',
    'qlikscript', 'qliksense', 'qlikview', 'qml', 'qvt', 'qvto', 'r', 'racket',
    'ragel', 'ragel-c', 'ragel-cpp', 'ragel-d', 'ragel-em', 'ragel-java',
    'ragel-objc', 'ragel-rb', 'ragel-ruby', 'raku', 'rb', 'rbcon', 'rconsole',
    'rd', 'react', 'reason', 'reasonml', 'rebol', 'red', 'red/system',
    'redcode', 'registry', 'resource', 'resourcebundle', 'rest',
    'restructuredtext', 'rexx', 'rhtml', 'ride', 'rita', 'rkt', 'rnc',
    'rng-compact', 'roboconf-graph', 'roboconf-instances', 'robotframework',
    'rout', 'rql', 'rs', 'rsl', 'rst', 'rts', 'ruby', 'rust', 's', 'sage',
    'salt', 'sarl', 'sas', 'sass', 'savi', 'sbatch', 'sc', 'scala', 'scaml',
    'scd', 'scdoc', 'scheme', 'scilab', 'scm', 'scss', 'sed', 'sgf', 'sh',
    'shell', 'shell-session', 'shen', 'shex', 'shexc', 'sieve', 'silver',
    'singularity', 'slash', 'slim', 'sls', 'slurm', 'smali', 'smalltalk',
    'smarty', 'smithy', 'sml', 'snbt', 'snobol', 'snowball', 'sobas',
    'solidity', 'soong', 'sophia', 'sources.list', 'sourceslist', 'sp',
    'sparql', 'spec', 'spice', 'spicelang', 'spitfire', 'splus', 'sql',
    'sql+jinja', 'sqlite3', 'squeak', 'squid', 'squid.conf', 'squidconf',
    'srcinfo', 'ssed', 'ssp', 'st', 'stan', 'starlark', 'stata',
    'supercollider', 'sv', 'swift', 'swig', 'systemd', 'systemverilog', 't-sql',
    'tact', 'tads3', 'tal', 'tap', 'tasm', 'tcl', 'tcsh', 'tcshcon', 'tea',
    'teal', 'teraterm', 'teratermmacro', 'termcap', 'terminfo', 'terraform',
    'tex', 'text', 'tf', 'thingsdb', 'thrift', 'ti', 'tid', 'tlb', 'tls', 'tnt',
    'todotxt', 'toml', 'trac-wiki', 'trafficscript', 'treetop', 'ts', 'tsql',
    'ttl', 'turtle', 'twig', 'typescript', 'typoscript', 'typoscriptcssdata',
    'typoscripthtmldata', 'typst', 'ucode', 'udiff', 'ul4', 'unicon',
    'unixconfig', 'urbiscript', 'urlencoded', 'usd', 'usda', 'uxntal', 'v',
    'vala', 'vapi', 'vb.net', 'vbnet', 'vbscript', 'vcl', 'vclsnippet',
    'vclsnippets', 'vctreestatus', 'velocity', 'verifpal', 'verilog', 'vfp',
    'vgl', 'vhdl', 'vim', 'visual-basic', 'visualbasic', 'visualprolog',
    'visualprologgrammar', 'vyper', 'wast', 'wat', 'wdiff', 'webidl', 'wgsl',
    'whiley', 'wikitext', 'winbatch', 'winbugs', 'wowtoc', 'wren', 'x++', 'x10',
    'xbase', 'xml', 'xml+cheetah', 'xml+django', 'xml+erb', 'xml+evoque',
    'xml+genshi', 'xml+jinja', 'xml+kid', 'xml+lasso', 'xml+mako', 'xml+myghty',
    'xml+php', 'xml+ruby', 'xml+smarty', 'xml+spitfire', 'xml+ul4',
    'xml+velocity', 'xorg.conf', 'xpp', 'xq', 'xql', 'xqm', 'xquery', 'xqy',
    'xslt', 'xten', 'xtend', 'xul+mozpreproc', 'yaml', 'yaml+jinja', 'yang',
    'yar', 'yara', 'zeek', 'zephir', 'zig', 'zone', 'zsh', '🔥'
}
LEXERS_BY_MIME = {
    'application/atom+xml': 'xml',
    'application/javascript': 'js',
    'application/jsgf': 'jsgf',
    'application/json': 'json-object',
    'application/json-object': 'json-object',
    'application/json-seq': 'json-object',
    'application/jsonl': 'json-object',
    'application/juttle': 'juttle',
    'application/kal': 'kal',
    'application/ld+json': 'json-ld',
    'application/mathematica': 'nb',
    'application/pem-certificate-chain': 'pem',
    'application/pgp-encrypted': 'pem',
    'application/pgp-keys': 'pem',
    'application/pgp-signature': 'pem',
    'application/postscript': 'postscr',
    'application/prql': 'prql',
    'application/rss+xml': 'xml',
    'application/sparql-query': 'sparql',
    'application/supercollider': 'sc',
    'application/toml': 'toml',
    'application/vnd.wolfram.cdf': 'nb',
    'application/vnd.wolfram.mathematica': 'nb',
    'application/vnd.wolfram.mathematica.package': 'nb',
    'application/x-actionscript': 'as',
    'application/x-actionscript3': 'as3',
    'application/x-awk': 'nawk',
    'application/x-befunge': 'befunge',
    'application/x-berry': 'be',
    'application/x-brainfuck': 'bf',
    'application/x-chaiscript': 'chai',
    'application/x-cheetah': 'spitfire',
    'application/x-clojure': 'clj',
    'application/x-clojurescript': 'cljs',
    'application/x-coldfusion': 'cfm',
    'application/x-csh': 'csh',
    'application/x-cython': 'pyrex',
    'application/x-desktop': 'desktop',
    'application/x-django-templating': 'jinja',
    'application/x-dos-batch': 'winbatch',
    'application/x-ecl': 'ecl',
    'application/x-elisp': 'emacs',
    'application/x-evoque': 'evoque',
    'application/x-fantom': 'fan',
    'application/x-fish': 'fishshell',
    'application/x-forth': 'forth',
    'application/x-gdscript': 'gd',
    'application/x-genshi': 'xml+kid',
    'application/x-genshi-text': 'genshitext',
    'application/x-gettext': 'po',
    'application/x-gooddata-maql': 'maql',
    'application/x-httpd-lasso': 'html+lasso',
    'application/x-httpd-lasso[89]': 'html+lasso',
    'application/x-httpd-php': 'html+php',
    'application/x-httpd-php3': 'html+php',
    'application/x-httpd-php4': 'html+php',
    'application/x-httpd-php5': 'html+php',
    'application/x-hy': 'hy',
    'application/x-hybris': 'hybris',
    'application/x-janet': 'janet',
    'application/x-javascript': 'js',
    'application/x-javascript+cheetah': 'js+spitfire',
    'application/x-javascript+django': 'js+jinja',
    'application/x-javascript+genshi': 'javascript+genshi',
    'application/x-javascript+jinja': 'js+jinja',
    'application/x-javascript+lasso': 'js+lasso',
    'application/x-javascript+mako': 'js+mako',
    'application/x-javascript+myghty': 'js+myghty',
    'application/x-javascript+php': 'js+php',
    'application/x-javascript+ruby': 'js+erb',
    'application/x-javascript+smarty': 'js+smarty',
    'application/x-javascript+spitfire': 'js+spitfire',
    'application/x-jinja': 'jinja',
    'application/x-jsgf': 'jsgf',
    'application/x-jsp': 'jsp',
    'application/x-julia': 'jl',
    'application/x-juttle': 'juttle',
    'application/x-kid': 'xml+kid',
    'application/x-lua': 'lua',
    'application/x-mako': 'mako',
    'application/x-mason': 'mason',
    'application/x-miniscript': 'ms',
    'application/x-mojo': '🔥',
    'application/x-moonscript': 'moon',
    'application/x-myghty': 'myghty',
    'application/x-ndjson': 'json-object',
    'application/x-newlisp': 'newlisp',
    'application/x-openedge': 'progress',
    'application/x-openscad': 'openscad',
    'application/x-perl': 'pl',
    'application/x-perl6': 'raku',
    'application/x-php': 'html+php',
    'application/x-prql': 'prql',
    'application/x-pypylog': 'pypy',
    'application/x-python': 'starlark',
    'application/x-python2': 'py2',
    'application/x-python3': 'starlark',
    'application/x-qml': 'qbs',
    'application/x-qt.qbs+qml': 'qbs',
    'application/x-racket': 'rkt',
    'application/x-ruby': 'duby',
    'application/x-ruby-templating': 'erb',
    'application/x-sas': 'sas',
    'application/x-scheme': 'scm',
    'application/x-sh': 'openrc',
    'application/x-sh-session': 'shell-session',
    'application/x-shell-session': 'shell-session',
    'application/x-shellscript': 'openrc',
    'application/x-shen': 'shen',
    'application/x-smarty': 'smarty',
    'application/x-spitfire': 'spitfire',
    'application/x-ssp': 'ssp',
    'application/x-standardml': 'sml',
    'application/x-stata': 'do',
    'application/x-tcl': 'tcl',
    'application/x-terraform': 'hcl',
    'application/x-tf': 'hcl',
    'application/x-thrift': 'thrift',
    'application/x-troff': 'man',
    'application/x-turtle': 'turtle',
    'application/x-twig': 'twig',
    'application/x-typescript': 'ts',
    'application/x-urbiscript': 'urbiscript',
    'application/x-www-form-urlencoded': 'urlencoded',
    'application/xhtml+xml': 'html',
    'application/xml': 'xml',
    'application/xml+cheetah': 'xml+spitfire',
    'application/xml+django': 'xml+jinja',
    'application/xml+evoque': 'xml+evoque',
    'application/xml+jinja': 'xml+jinja',
    'application/xml+lasso': 'xml+lasso',
    'application/xml+mako': 'xml+mako',
    'application/xml+myghty': 'xml+myghty',
    'application/xml+php': 'xml+php',
    'application/xml+ruby': 'xml+erb',
    'application/xml+smarty': 'xml+smarty',
    'application/xml+spitfire': 'xml+spitfire',
    'application/xml+velocity': 'xml+velocity',
    'application/xml-dtd': 'dtd',
    'application/xquery': 'xqm',
    'application/xsl+xml': 'xslt',
    'application/xslt+xml': 'xslt',
    'application/yang': 'yang',
    'image/svg+xml': 'xml',
    'image/x-xbitmap': 'c',
    'image/x-xpixmap': 'c',
    'message/rfc822': 'eml',
    'multipart/alternative': 'mime',
    'multipart/mixed': 'mime',
    'multipart/related': 'mime',
    'text/S': 'r',
    'text/S-plus': 'r',
    'text/actionscript': 'as',
    'text/actionscript3': 'as3',
    'text/basic': 'basic',
    'text/coffeescript': 'coffee',
    'text/css': 'css',
    'text/css+django': 'css+jinja',
    'text/css+genshi': 'css+genshi',
    'text/css+jinja': 'css+jinja',
    'text/css+lasso': 'css+lasso',
    'text/css+mako': 'css+mako',
    'text/css+myghty': 'css+myghty',
    'text/css+php': 'css+php',
    'text/css+ruby': 'css+erb',
    'text/css+smarty': 'css+smarty',
    'text/dns': 'zone',
    'text/gettext': 'po',
    'text/haxe': 'hx',
    'text/html': 'html',
    'text/html+cheetah': 'htmlcheetah',
    'text/html+django': 'htmldjango',
    'text/html+evoque': 'html+evoque',
    'text/html+genshi': 'html+kid',
    'text/html+handlebars': 'html+handlebars',
    'text/html+jinja': 'htmldjango',
    'text/html+lasso': 'html+lasso',
    'text/html+mako': 'html+mako',
    'text/html+myghty': 'html+myghty',
    'text/html+ruby': 'html+ruby',
    'text/html+smarty': 'html+smarty',
    'text/html+spitfire': 'htmlcheetah',
    'text/html+twig': 'html+twig',
    'text/html+velocity': 'html+velocity',
    'text/idl': 'idl',
    'text/inf': 'dosini',
    'text/ipf': 'igorpro',
    'text/javascript': 'js',
    'text/javascript+cheetah': 'js+spitfire',
    'text/javascript+django': 'js+jinja',
    'text/javascript+genshi': 'javascript+genshi',
    'text/javascript+jinja': 'js+jinja',
    'text/javascript+lasso': 'js+lasso',
    'text/javascript+mako': 'js+mako',
    'text/javascript+mygthy': 'js+myghty',
    'text/javascript+php': 'js+php',
    'text/javascript+ruby': 'js+erb',
    'text/javascript+smarty': 'js+smarty',
    'text/javascript+spitfire': 'js+spitfire',
    'text/jsgf': 'jsgf',
    'text/jsx': 'react',
    'text/juttle': 'juttle',
    'text/kal': 'kal',
    'text/limbo': 'limbo',
    'text/livescript': 'live-script',
    'text/matlab': 'matlab',
    'text/mcfunction': 'mcf',
    'text/mcschema': 'mcschema',
    'text/ncl': 'ncl',
    'text/octave': 'octave',
    'text/odin': 'odin',
    'text/org': 'org-mode',
    'text/plain': 'text',
    'text/prs.fallenstein.rst': 'rest',
    'text/rita': 'rita',
    'text/rsl': 'rsl',
    'text/rust': 'rs',
    'text/sas': 'sas',
    'text/scilab': 'scilab',
    'text/shex': 'shex',
    'text/smali': 'smali',
    'text/snbt': 'snbt',
    'text/stata': 'do',
    'text/supercollider': 'sc',
    'text/swig': 'swig',
    'text/troff': 'man',
    'text/turtle': 'turtle',
    'text/typescript-jsx': 'react',
    'text/unicon': 'unicon',
    'text/vnd.graphviz': 'dot',
    'text/vnd.tiddlywiki': 'tid',
    'text/wgsl': 'wgsl',
    'text/x-R': 'r',
    'text/x-abap': 'abap',
    'text/x-abnf': 'abnf',
    'text/x-actionscript': 'as',
    'text/x-actionscript3': 'as3',
    'text/x-ada': 'ada2005',
    'text/x-agda': 'agda',
    'text/x-alloy': 'alloy',
    'text/x-ambienttalk': 'at',
    'text/x-apacheconf': 'apache',
    'text/x-arduino': 'arduino',
    'text/x-aspectj': 'aspectj',
    'text/x-asymptote': 'asy',
    'text/x-autohotkey': 'ahk',
    'text/x-autoit': 'autoit',
    'text/x-bb': 'bplus',
    'text/x-bbcode': 'bbcode',
    'text/x-bdd': 'bdd',
    'text/x-berry': 'be',
    'text/x-bibtex': 'bib',
    'text/x-blueprint': 'blueprint',
    'text/x-bmx': 'bmax',
    'text/x-bnf': 'bnf',
    'text/x-boo': 'boo',
    'text/x-c': 'dts',
    'text/x-c++hdr': 'c++',
    'text/x-c++src': 'c++',
    'text/x-c-objdump': 'c-objdump',
    'text/x-carbon': 'carbon',
    'text/x-cddl': 'cddl',
    'text/x-ceylon': 'ceylon',
    'text/x-chaiscript': 'chai',
    'text/x-chdr': 'c',
    'text/x-cirru': 'cirru',
    'text/x-clay': 'clay',
    'text/x-clojure': 'clj',
    'text/x-clojurescript': 'cljs',
    'text/x-cmake': 'cmake',
    'text/x-cobol': 'cobol',
    'text/x-common-lisp': 'lisp',
    'text/x-component-pascal': 'cp',
    'text/x-coq': 'coq',
    'text/x-cplint': 'cplint',
    'text/x-cpp-objdump': 'cxx-objdump',
    'text/x-crocsrc': 'croc',
    'text/x-cryptol': 'cry',
    'text/x-crystal': 'crystal',
    'text/x-csharp': 'cs',
    'text/x-csrc': 'c',
    'text/x-cuda': 'cu',
    'text/x-cython': 'pyrex',
    'text/x-d-objdump': 'd-objdump',
    'text/x-dart': 'dart',
    'text/x-dasm16': 'dasm16',
    'text/x-dg': 'dg',
    'text/x-diff': 'udiff',
    'text/x-dockerfile-config': 'dockerfile',
    'text/x-dsrc': 'd',
    'text/x-duel': 'jsonml+bst',
    'text/x-dylan': 'dylan',
    'text/x-dylan-console': 'dylan-repl',
    'text/x-dylan-lid': 'lid',
    'text/x-earl-grey': 'eg',
    'text/x-easytrieve': 'easytrieve',
    'text/x-ebnf': 'ebnf',
    'text/x-echdr': 'ec',
    'text/x-ecsrc': 'ec',
    'text/x-eiffel': 'eiffel',
    'text/x-elisp': 'emacs',
    'text/x-elixir': 'exs',
    'text/x-elixir-shellsession': 'iex',
    'text/x-elm': 'elm',
    'text/x-elpi': 'elpi',
    'text/x-erl-shellsession': 'erl',
    'text/x-erlang': 'erlang',
    'text/x-ezhil': 'ezhil',
    'text/x-factor': 'factor',
    'text/x-fancysrc': 'fy',
    'text/x-felix': 'flx',
    'text/x-flatline': 'flatline',
    'text/x-fortran': 'f90',
    'text/x-freefem': 'freefem',
    'text/x-fsharp': 'f#',
    'text/x-fstar': 'fstar',
    'text/x-futhark': 'futhark',
    'text/x-gas': 'asm',
    'text/x-gdscript': 'gd',
    'text/x-genshi': 'genshitext',
    'text/x-gettext': 'po',
    'text/x-gherkin': 'cucumber',
    'text/x-glslsrc': 'glsl',
    'text/x-gnuplot': 'gnuplot',
    'text/x-gooddata-cl': 'gooddata-cl',
    'text/x-gooddata-maql': 'maql',
    'text/x-gosrc': 'golang',
    'text/x-gosu': 'gosu',
    'text/x-gosu-template': 'gst',
    'text/x-graphviz': 'dot',
    'text/x-groovy': 'groovy',
    'text/x-haml': 'haml',
    'text/x-handlebars-template': 'html+handlebars',
    'text/x-haskell': 'hs',
    'text/x-haxe': 'hx',
    'text/x-hlsl': 'hlsl',
    'text/x-hsail': 'hsa',
    'text/x-hx': 'hx',
    'text/x-hy': 'hy',
    'text/x-hybris': 'hybris',
    'text/x-idris': 'idr',
    'text/x-ini': 'dosini',
    'text/x-iokesrc': 'ik',
    'text/x-iosrc': 'io',
    'text/x-irclog': 'irc',
    'text/x-isabelle': 'isabelle',
    'text/x-j': 'j',
    'text/x-jade': 'jade',
    'text/x-janet': 'janet',
    'text/x-java': 'java',
    'text/x-java-properties': 'jproperties',
    'text/x-javascript': 'js',
    'text/x-javascript+cheetah': 'js+spitfire',
    'text/x-javascript+django': 'js+jinja',
    'text/x-javascript+genshi': 'javascript+genshi',
    'text/x-javascript+jinja': 'js+jinja',
    'text/x-javascript+lasso': 'js+lasso',
    'text/x-javascript+mako': 'js+mako',
    'text/x-javascript+myghty': 'js+myghty',
    'text/x-javascript+php': 'js+php',
    'text/x-javascript+ruby': 'js+erb',
    'text/x-javascript+smarty': 'js+smarty',
    'text/x-javascript+spitfire': 'js+spitfire',
    'text/x-jbst': 'jsonml+bst',
    'text/x-jcl': 'jcl',
    'text/x-jslt': 'jslt',
    'text/x-julia': 'jl',
    'text/x-juttle': 'juttle',
    'text/x-kconfig': 'kernel-config',
    'text/x-koka': 'koka',
    'text/x-kotlin': 'kotlin',
    'text/x-lasso': 'lassoscript',
    'text/x-latex': 'latex',
    'text/x-ldapconf': 'ldaprc',
    'text/x-ldif': 'ldif',
    'text/x-lean': 'lean3',
    'text/x-lean3': 'lean3',
    'text/x-lean4': 'lean4',
    'text/x-less-css': 'less',
    'text/x-lighttpd-conf': 'lighty',
    'text/x-literate-agda': 'lagda',
    'text/x-literate-cryptol': 'lcry',
    'text/x-literate-haskell': 'lhs',
    'text/x-literate-idris': 'lidr',
    'text/x-llvm': 'llvm',
    'text/x-logos': 'logos',
    'text/x-logtalk': 'logtalk',
    'text/x-lsl': 'lsl',
    'text/x-lua': 'lua',
    'text/x-makefile': 'bsdmake',
    'text/x-markdown': 'md',
    'text/x-mask': 'mask',
    'text/x-meson': 'meson.build',
    'text/x-minicript': 'ms',
    'text/x-minidsrc': 'minid',
    'text/x-modelica': 'modelica',
    'text/x-modula2': 'm2',
    'text/x-mojo': '🔥',
    'text/x-monkey': 'monkey',
    'text/x-moocode': 'moo',
    'text/x-moonscript': 'moon',
    'text/x-mql': 'mql5',
    'text/x-mysql': 'mysql',
    'text/x-nasm': 'nasm',
    'text/x-nasm-objdump': 'objdump-nasm',
    'text/x-nemerle': 'nemerle',
    'text/x-nescsrc': 'nesc',
    'text/x-newlisp': 'newlisp',
    'text/x-newspeak': 'newspeak',
    'text/x-nginx-conf': 'nginx',
    'text/x-nim': 'nim',
    'text/x-nix': 'nix',
    'text/x-nodejsrepl': 'nodejsrepl',
    'text/x-nsis': 'nsh',
    'text/x-objdump': 'objdump',
    'text/x-objective-c': 'objc',
    'text/x-objective-c++': 'objc++',
    'text/x-objective-j': 'objj',
    'text/x-ocaml': 'ocaml',
    'text/x-ooc': 'ooc',
    'text/x-opa': 'opa',
    'text/x-openedge': 'progress',
    'text/x-parasail': 'parasail',
    'text/x-pascal': 'objectpascal',
    'text/x-patch': 'udiff',
    'text/x-pawn': 'pawn',
    'text/x-peg': 'peg',
    'text/x-perl': 'pl',
    'text/x-perl6': 'raku',
    'text/x-phix': 'phix',
    'text/x-php': 'php5',
    'text/x-pig': 'pig',
    'text/x-pike': 'pike',
    'text/x-plpgsql': 'plpgsql',
    'text/x-postgresql': 'postgres',
    'text/x-postgresql-explain': 'postgres-explain',
    'text/x-postgresql-psql': 'postgres-console',
    'text/x-povray': 'pov',
    'text/x-powershell': 'psm1',
    'text/x-prolog': 'prolog',
    'text/x-promela': 'promela',
    'text/x-ptx': 'ptx',
    'text/x-pug': 'jade',
    'text/x-python': 'starlark',
    'text/x-python-doctest': 'python-console',
    'text/x-python-traceback': 'py3tb',
    'text/x-python2': 'py2',
    'text/x-python2-traceback': 'py2tb',
    'text/x-python3': 'starlark',
    'text/x-python3-traceback': 'py3tb',
    'text/x-r': 'r',
    'text/x-r-doc': 'rd',
    'text/x-r-history': 'r',
    'text/x-r-profile': 'r',
    'text/x-r-source': 'r',
    'text/x-racket': 'rkt',
    'text/x-reasonml': 'reason',
    'text/x-rebol': 'rebol',
    'text/x-red': 'red/system',
    'text/x-red-system': 'red/system',
    'text/x-rexx': 'arexx',
    'text/x-ride': 'ride',
    'text/x-robotframework': 'robotframework',
    'text/x-rpm-spec': 'spec',
    'text/x-rql': 'rql',
    'text/x-rst': 'rest',
    'text/x-ruby': 'duby',
    'text/x-ruby-shellsession': 'irb',
    'text/x-rust': 'rs',
    'text/x-sarl': 'sarl',
    'text/x-sas': 'sas',
    'text/x-sass': 'sass',
    'text/x-scala': 'scala',
    'text/x-scaml': 'scaml',
    'text/x-scheme': 'scm',
    'text/x-script.tcl': 'tcl',
    'text/x-scss': 'scss',
    'text/x-sed': 'ssed',
    'text/x-shellscript': 'openrc',
    'text/x-shen': 'shen',
    'text/x-slim': 'slim',
    'text/x-sls': 'sls',
    'text/x-smalltalk': 'st',
    'text/x-snobol': 'snobol',
    'text/x-sourcepawn': 'sp',
    'text/x-spice': 'spicelang',
    'text/x-sql': 'sql',
    'text/x-sqlite3-console': 'sqlite3',
    'text/x-squidconf': 'squid',
    'text/x-standardml': 'sml',
    'text/x-stata': 'do',
    'text/x-swift': 'swift',
    'text/x-systemverilog': 'sv',
    'text/x-tasm': 'tasm',
    'text/x-tcl': 'tcl',
    'text/x-tea': 'tea',
    'text/x-teratermmacro': 'ttl',
    'text/x-tex': 'latex',
    'text/x-todo': 'todotxt',
    'text/x-trac-wiki': 'moin',
    'text/x-tsql': 't-sql',
    'text/x-typescript': 'ts',
    'text/x-typoscript': 'typoscript',
    'text/x-typst': 'typst',
    'text/x-uxntal': 'uxntal',
    'text/x-vala': 'vapi',
    'text/x-vba': 'visualbasic',
    'text/x-vbnet': 'visualbasic',
    'text/x-vclsnippet': 'vclsnippet',
    'text/x-vclsrc': 'vcl',
    'text/x-verifpal': 'verifpal',
    'text/x-verilog': 'v',
    'text/x-vhdl': 'vhdl',
    'text/x-vim': 'vim',
    'text/x-whiley': 'whiley',
    'text/x-wiki': 'mediawiki',
    'text/x-windows-registry': 'registry',
    'text/x-x10': 'xten',
    'text/x-xtend': 'xtend',
    'text/x-yaml': 'yaml',
    'text/x-yaml+jinja': 'sls',
    'text/x-yara': 'yar',
    'text/xml': 'xml',
    'text/xquery': 'xqm',
    'text/zig': 'zig'
}


def prepare_lexers():
    from pygments.lexers import LEXERS
    for v in LEXERS.values():
        for lexer_name in v[2]:
            LEXERS_NAMES.add(lexer_name)
            for mime in v[4]:
                LEXERS_BY_MIME[mime] = lexer_name


def next_line():
    while line := sys.stdin.readline():
        yield line


def rich_pygments(meta: list[str]):
    if not meta:
        return  # unknown mime-type

    mime = meta[0].lower()
    lexer = LEXERS_BY_MIME.get(mime)
    if lexer:
        raw_pygmented_gemini(lexer, meta)
        # raw_pygmented(lexer, meta)
        return  # full file

    if 'text/gemini' != mime:
        return  # unknown mime-type

    # read a text/gemini and pygment pre-formatted code blocks
    print(f'20 {"; ".join(meta)}', end='\r\n')
    for line in next_line():
        if match := re.match(r'^```?([/#+\-\dA-z]*)?($|\s)', line):
            lexer = match.groups()[0]
            if lexer not in LEXERS_NAMES:
                print(line.rstrip('\r\n'))
                continue  #

            print(line.rstrip('\r\n'))
            code, max_len, trailing = read_code_block(preformatted=True)
            print_code(code, lexer, max_len, line_numbers=True)
            print(trailing.rstrip('\r\n'))
        else:
            print(line.rstrip('\r\n'))


def raw_pygmented(lexer, meta):
    print(f'20 {"; ".join(meta)}', end='\r\n')
    code, max_len, _ = read_code_block(preformatted=False)
    print_code(code, lexer, max_len, line_numbers=False)
    return


def raw_pygmented_gemini(lexer, meta):
    print(f'20 text/gemini; {"; ".join(meta[1:])}', end='\r\n')
    print(f'```{meta[0]}')
    code, max_len, _ = read_code_block(preformatted=False)
    print_code(code, lexer, max_len, line_numbers=False)
    print('```')


def print_code(code, lexer, code_width, line_numbers):
    syntax = Syntax(code, lexer, theme="solarized-dark",
                    line_numbers=line_numbers, code_width=code_width + 1)
    con = Console(color_system="truecolor",
                  width=code_width + (6 if line_numbers else 1))
    con.print(syntax)


def read_code_block(preformatted: bool) -> Tuple[str, int, str]:
    code = ''
    trailing = ''
    max_len = 0
    for code_line in next_line():
        if preformatted and re.match(r'^```', code_line):
            trailing = code_line
            break
        code += code_line
        max_len = max(len(code_line.rstrip('\r\n')), max_len)
    return code.rstrip('\r\n'), max_len, trailing


if __name__ == '__main__':
    rich_pygments(sys.argv[1:])