mirror of https://github.com/chubin/cheat.sh.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
274 lines
7.2 KiB
274 lines
7.2 KiB
"""
|
|
|
|
Programming languages information.
|
|
Will be (probably) moved to a separate file/directory
|
|
from the project tree.
|
|
|
|
"""
|
|
|
|
import pygments.lexers
|
|
|
|
LEXER = {
|
|
"assembly": pygments.lexers.NasmLexer,
|
|
"awk": pygments.lexers.AwkLexer,
|
|
"bash": pygments.lexers.BashLexer,
|
|
"basic": pygments.lexers.QBasicLexer,
|
|
"bf": pygments.lexers.BrainfuckLexer,
|
|
"chapel": pygments.lexers.ChapelLexer,
|
|
"clojure": pygments.lexers.ClojureLexer,
|
|
"coffee": pygments.lexers.CoffeeScriptLexer,
|
|
"cpp": pygments.lexers.CppLexer,
|
|
"c": pygments.lexers.CLexer,
|
|
"csharp": pygments.lexers.CSharpLexer,
|
|
"d": pygments.lexers.DLexer,
|
|
"dart": pygments.lexers.DartLexer,
|
|
"delphi": pygments.lexers.DelphiLexer,
|
|
"elisp": pygments.lexers.EmacsLispLexer,
|
|
"elixir": pygments.lexers.ElixirLexer,
|
|
"elm": pygments.lexers.ElmLexer,
|
|
"erlang": pygments.lexers.ErlangLexer,
|
|
"factor": pygments.lexers.FactorLexer,
|
|
"forth": pygments.lexers.ForthLexer,
|
|
"fortran": pygments.lexers.FortranLexer,
|
|
"fsharp": pygments.lexers.FSharpLexer,
|
|
"git": pygments.lexers.BashLexer,
|
|
"go": pygments.lexers.GoLexer,
|
|
"groovy": pygments.lexers.GroovyLexer,
|
|
"haskell": pygments.lexers.HaskellLexer,
|
|
"java": pygments.lexers.JavaLexer,
|
|
"js": pygments.lexers.JavascriptLexer,
|
|
"julia": pygments.lexers.JuliaLexer,
|
|
"kotlin": pygments.lexers.KotlinLexer,
|
|
"latex": pygments.lexers.TexLexer,
|
|
"lisp": pygments.lexers.CommonLispLexer,
|
|
"lua": pygments.lexers.LuaLexer,
|
|
"mathematica": pygments.lexers.MathematicaLexer,
|
|
"matlab": pygments.lexers.MatlabLexer,
|
|
"mongo": pygments.lexers.JavascriptLexer,
|
|
"nim": pygments.lexers.NimrodLexer,
|
|
"objective-c": pygments.lexers.ObjectiveCppLexer,
|
|
"ocaml": pygments.lexers.OcamlLexer,
|
|
"octave": pygments.lexers.OctaveLexer,
|
|
"perl": pygments.lexers.PerlLexer,
|
|
"perl6": pygments.lexers.Perl6Lexer,
|
|
"php": pygments.lexers.PhpLexer,
|
|
"psql": pygments.lexers.PostgresLexer,
|
|
"python": pygments.lexers.PythonLexer,
|
|
"python3": pygments.lexers.Python3Lexer,
|
|
"r": pygments.lexers.SLexer,
|
|
"racket": pygments.lexers.RacketLexer,
|
|
"ruby": pygments.lexers.RubyLexer,
|
|
"rust": pygments.lexers.RustLexer,
|
|
"solidity": pygments.lexers.JavascriptLexer,
|
|
"scala": pygments.lexers.ScalaLexer,
|
|
"scheme": pygments.lexers.SchemeLexer,
|
|
"psql": pygments.lexers.SqlLexer,
|
|
"sql": pygments.lexers.SqlLexer,
|
|
"swift": pygments.lexers.SwiftLexer,
|
|
"tcl": pygments.lexers.TclLexer,
|
|
"tcsh": pygments.lexers.TcshLexer,
|
|
"vb": pygments.lexers.VbNetLexer,
|
|
"vbnet": pygments.lexers.VbNetLexer,
|
|
"vim": pygments.lexers.VimLexer,
|
|
# experimental
|
|
"arduino": pygments.lexers.ArduinoLexer,
|
|
"pike": pygments.lexers.PikeLexer,
|
|
"eiffel": pygments.lexers.EiffelLexer,
|
|
"clean": pygments.lexers.CleanLexer,
|
|
"dylan": pygments.lexers.DylanLexer,
|
|
# not languages
|
|
"cmake": pygments.lexers.CMakeLexer,
|
|
"django": pygments.lexers.PythonLexer,
|
|
"flask": pygments.lexers.PythonLexer,
|
|
}
|
|
|
|
# canonical names are on the right side
|
|
LANGUAGE_ALIAS = {
|
|
"asm": "assembly",
|
|
"assembler": "assembly",
|
|
"c++": "cpp",
|
|
"c#": "csharp",
|
|
"clisp": "lisp",
|
|
"coffeescript": "coffee",
|
|
"cplusplus": "cpp",
|
|
"dlang": "d",
|
|
"f#": "fsharp",
|
|
"golang": "go",
|
|
"javascript": "js",
|
|
"objc": "objective-c",
|
|
"p6": "perl6",
|
|
"sh": "bash",
|
|
"visualbasic": "vb",
|
|
"vba": "vb",
|
|
"wolfram": "mathematica",
|
|
"mma": "mathematica",
|
|
"wolfram-mathematica": "mathematica",
|
|
"m": "octave",
|
|
}
|
|
|
|
VIM_NAME = {
|
|
"assembly": "asm",
|
|
"bash": "sh",
|
|
"coffeescript": "coffee",
|
|
"csharp": "cs",
|
|
"delphi": "pascal",
|
|
"dlang": "d",
|
|
"elisp": "newlisp",
|
|
"latex": "tex",
|
|
"forth": "fs",
|
|
"nim": "nimrod",
|
|
"perl6": "perl",
|
|
"python3": "python",
|
|
"python-3.x": "python",
|
|
"tcsh": "sh",
|
|
"solidity": "js",
|
|
"mathematica": "mma",
|
|
"wolfram-mathematica": "mma",
|
|
"psql": "sql",
|
|
# not languages
|
|
"cmake": "sh",
|
|
"git": "sh",
|
|
"django": "python",
|
|
"flask": "python",
|
|
}
|
|
|
|
SO_NAME = {
|
|
"coffee": "coffeescript",
|
|
"js": "javascript",
|
|
"python3": "python-3.x",
|
|
"vb": "vba",
|
|
"mathematica": "wolfram-mathematica",
|
|
}
|
|
|
|
|
|
#
|
|
# conversion of internal programmin language names
|
|
# into canonical cheat.sh names
|
|
#
|
|
|
|
ATOM_FT_NAME = {}
|
|
|
|
EMACS_FT_NAME = {
|
|
"asm-mode": "asm",
|
|
"awk-mode": "awk",
|
|
"sh-mode": "bash",
|
|
# basic
|
|
"brainfuck-mode": "bf",
|
|
# chapel
|
|
"clojure-mode": "clojure",
|
|
"coffee-mode": "coffee",
|
|
"c++-mode": "cpp",
|
|
"c-mode": "c",
|
|
"csharp-mode": "csharp",
|
|
"d-mode": "d",
|
|
"dart-mode": "dart",
|
|
"dylan-mode": "dylan",
|
|
"delphi-mode": "delphi",
|
|
"emacs-lisp-mode": "elisp",
|
|
# elixir
|
|
"elm-mode": "elm",
|
|
"erlang-mode": "erlang",
|
|
# factor
|
|
"forth-mode": "forth",
|
|
"fortran-mode": "fortran",
|
|
"fsharp-mode": "fsharp",
|
|
"go-mode": "go",
|
|
"groovy-mode": "groovy",
|
|
"haskell-mode": "haskell",
|
|
# "hy-mode"
|
|
"java-mode": "java",
|
|
"js-jsx-mode": "js",
|
|
"js-mode": "js",
|
|
"js2-jsx-mode": "js",
|
|
"js2-mode": "js",
|
|
"julia-mode": "julia",
|
|
"kotlin-mode": "kotlin",
|
|
"lisp-interaction-mode": "lisp",
|
|
"lisp-mode": "lisp",
|
|
"lua-mode": "lua",
|
|
# mathematica
|
|
"matlab-mode": "matlab",
|
|
# mongo
|
|
"objc-mode": "objective-c",
|
|
# ocaml
|
|
"perl-mode": "perl",
|
|
"perl6-mode": "perl6",
|
|
"php-mode": "php",
|
|
# psql
|
|
"python-mode": "python",
|
|
# python3
|
|
# r -- ess looks it, but I don't know the mode name off hand
|
|
"racket-mode": "racket",
|
|
"ruby-mode": "ruby",
|
|
"rust-mode": "rust",
|
|
"solidity-mode": "solidity",
|
|
"scala-mode": "scala",
|
|
"scheme-mode": "scheme",
|
|
"sql-mode": "sql",
|
|
"swift-mode": "swift",
|
|
"tcl-mode": "tcl",
|
|
# tcsh
|
|
"visual-basic-mode": "vb",
|
|
# vbnet
|
|
# vim
|
|
}
|
|
|
|
SUBLIME_FT_NAME = {}
|
|
|
|
VIM_FT_NAME = {
|
|
"asm": "assembler",
|
|
"javascript": "js",
|
|
"octave": "matlab",
|
|
}
|
|
|
|
VSCODE_FT_NAME = {}
|
|
|
|
|
|
def rewrite_editor_section_name(section_name):
|
|
"""
|
|
section name cen be specified in form "editor:editor-filetype"
|
|
and it will be rewritten into form "filetype"
|
|
basing on the editor filetypes names data.
|
|
If editor name is unknown, it is just cut off: notepad:js => js
|
|
|
|
Known editors:
|
|
* atom
|
|
* vim
|
|
* emacs
|
|
* sublime
|
|
* vscode
|
|
|
|
>>> rewrite_editor_section_name('js')
|
|
'js'
|
|
>>> rewrite_editor_section_name('vscode:js')
|
|
'js'
|
|
"""
|
|
if ":" not in section_name:
|
|
return section_name
|
|
|
|
editor_name, section_name = section_name.split(":", 1)
|
|
editor_name_mapping = {
|
|
"atom": ATOM_FT_NAME,
|
|
"emacs": EMACS_FT_NAME,
|
|
"sublime": SUBLIME_FT_NAME,
|
|
"vim": VIM_FT_NAME,
|
|
"vscode": VSCODE_FT_NAME,
|
|
}
|
|
if editor_name not in editor_name_mapping:
|
|
return section_name
|
|
return editor_name_mapping[editor_name].get(section_name, section_name)
|
|
|
|
|
|
def get_lexer_name(section_name):
|
|
"""
|
|
Rewrite `section_name` for the further lexer search (for syntax highlighting)
|
|
"""
|
|
if ":" in section_name:
|
|
section_name = rewrite_editor_section_name(section_name)
|
|
return LANGUAGE_ALIAS.get(section_name, section_name)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import doctest
|
|
|
|
doctest.testmod()
|