diff --git a/codeinclude/languages.py b/codeinclude/languages.py new file mode 100644 index 0000000..8862ff3 --- /dev/null +++ b/codeinclude/languages.py @@ -0,0 +1,20 @@ +from pygments.lexers import get_lexer_for_filename +from pygments.util import ClassNotFound + + +def get_lang_class(filename: str) -> str: + """Returns the Pygments _language alias_ for the filename. + + Pygments is used by codehilite, a widely used extension for code highlighting: + https://squidfunk.github.io/mkdocs-material/extensions/codehilite/ + + The Pygments language aliases are expected to be compatible with highlight.js language classes, + which are used by some MkDocs themes: https://www.mkdocs.org/user-guide/styling-your-docs/#built-in-themes + For a table of 'Language -> Language Classes' in _highlight.js_, + see https://github.com/highlightjs/highlight.js#supported-languages + """ + try: + lexer = get_lexer_for_filename(filename) + return lexer.aliases[0] + except ClassNotFound: + return "none" diff --git a/codeinclude/plugin.py b/codeinclude/plugin.py index b0f3931..f1cb423 100644 --- a/codeinclude/plugin.py +++ b/codeinclude/plugin.py @@ -5,6 +5,7 @@ from mkdocs.plugins import BasePlugin from codeinclude.resolver import select +from codeinclude.languages import get_lang_class RE_START = r"""(?x) ^ @@ -44,8 +45,13 @@ def get_substitute(page, title, filename, lines, block, inside_block): ) dedented = textwrap.dedent(selected_content) + lang_code = get_lang_class(filename) + return f''' +```{lang_code} tab="{title}" +{dedented} +``` - return '\n```java tab="' + title + '"\n' + dedented + "\n```\n\n" +''' class CodeIncludePlugin(BasePlugin): diff --git a/setup.py b/setup.py index e56283a..f3fdd10 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ def read_file(fname): python_requires='>=3.6', install_requires=[ 'mkdocs>=0.17', - 'mkdocs' + 'pygments' ], classifiers=[ 'Development Status :: 5 - Production/Stable', diff --git a/tests/codeinclude/test_languages.py b/tests/codeinclude/test_languages.py new file mode 100644 index 0000000..7479120 --- /dev/null +++ b/tests/codeinclude/test_languages.py @@ -0,0 +1,18 @@ +import unittest +from codeinclude.languages import get_lang_class + + +class MyTestCase(unittest.TestCase): + def test_get_lang_class(self): + self.assertEquals('java', get_lang_class('HelloWorld.java')) + self.assertEquals('python', get_lang_class('HelloWorld.py')) + self.assertEquals('csharp', get_lang_class('HelloWorld.cs')) + self.assertEquals('rust', get_lang_class('HelloWorld.rs')) + self.assertEquals('docker', get_lang_class('Dockerfile')) + self.assertEquals('xml', get_lang_class('HelloWorld.xml')) + self.assertEquals('toml', get_lang_class('HelloWorld.toml')) + self.assertEquals('json', get_lang_class('HelloWorld.json')) + + +if __name__ == '__main__': + unittest.main()