It's just a JSON file, so you can use it in any environment. Sourced from GitHub's Linguist project (defines all 18 prose languages known to GitHub). Data is updated via script and released via new package version.
pip install prose-languagesimport prose_languages
md_lang_data = prose_languages['Markdown']
print(md_lang_data['extensions']) # => ['.livemd', '.markdown', '.md', ...]Note: Most type checkers will falsely warn prose_languages is not subscriptable because they are incapable of analyzing runtime behavior (where the module is replaced w/ a dictionary for cleaner, direct access). You can safely suppress such warnings using # type: ignore.
Get language(s) from an extension:
def get_lang(file_ext):
lang_matches = [
lang for lang, data in prose_languages.items()
if file_ext in data['extensions']
]
return lang_matches[0] if len(lang_matches) == 1 else lang_matches
print(get_lang('.gmi')) # => GeminiGet language(s) from a file path:
def get_lang_from_path(filepath):
from pathlib import Path
file_ext = Path(filepath).suffix
lang_matches = [
lang for lang, data in prose_languages.items()
if file_ext in data['extensions']
]
return lang_matches[0] if len(matches) == 1 else lang_matches
print(get_lang_from_path('document.adoc')) # => AsciiDoc
print(get_lang_from_path('README.md')) # => Markdown
print(get_lang_from_path('index.mdx')) # => [] (use markup-languages pkg)Copyright © 2026 Adam Lui
</> markup-languages - File extensions for markup languages.
#! programming-languages - File extensions for programming languages.
{ } data-languages - File extensions for data languages.


