💾 Archived View for bbs.geminispace.org › u › cthulhu › file › 323 captured on 2024-08-31 at 15:53:48.
⬅️ 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:])