diff --git a/README.rst b/README.rst index f961257..8aa5b68 100644 --- a/README.rst +++ b/README.rst @@ -102,6 +102,19 @@ code_language should be annotated with `````python`` or similar. Defaults to ``''`` (empty string) and can be any string. +code_language_callback + When the HTML code contains ``pre`` tags that in some way provide the code + language, for example as class, this callback can be used to extract the + language from the tag and prefix it to the converted ``pre`` tag. + The callback gets one single argument, an BeautifylSoup object, and returns + a string containing the code language, or ``None``. + An example to use the class name as code language could be:: + + def callback(el): + return el['class'][0] if el.has_attr('class') else None + + Defaults to ``None``. + escape_asterisks If set to ``False``, do not escape ``*`` to ``\*`` in text. Defaults to ``True``. diff --git a/markdownify/__init__.py b/markdownify/__init__.py index 4ef539b..d6d36a0 100644 --- a/markdownify/__init__.py +++ b/markdownify/__init__.py @@ -63,6 +63,7 @@ class MarkdownConverter(object): autolinks = True bullets = '*+-' # An iterable of bullet types. code_language = '' + code_language_callback = None convert = None default_title = False escape_asterisks = True @@ -335,7 +336,12 @@ class MarkdownConverter(object): def convert_pre(self, el, text, convert_as_inline): if not text: return '' - return '\n```%s\n%s\n```\n' % (self.options['code_language'], text) + code_language = self.options['code_language'] + + if self.options['code_language_callback']: + code_language = self.options['code_language_callback'](el) or code_language + + return '\n```%s\n%s\n```\n' % (code_language, text) convert_s = convert_del diff --git a/tests/test_conversions.py b/tests/test_conversions.py index 018b7c1..cef8cd6 100644 --- a/tests/test_conversions.py +++ b/tests/test_conversions.py @@ -216,3 +216,12 @@ def test_sup(): def test_lang(): assert md('
test\n foo\nbar', code_language='python') == '\n```python\ntest\n foo\nbar\n```\n' assert md('
test\n foo\nbar', code_language='javascript') == '\n```javascript\ntest\n foo\nbar\n```\n'
+
+
+def test_lang_callback():
+ def callback(el):
+ return el['class'][0] if el.has_attr('class') else None
+
+ assert md('test\n foo\nbar', code_language_callback=callback) == '\n```python\ntest\n foo\nbar\n```\n' + assert md('
test\n foo\nbar', code_language_callback=callback) == '\n```javascript\ntest\n foo\nbar\n```\n'
+ assert md('test\n foo\nbar', code_language_callback=callback) == '\n```javascript\ntest\n foo\nbar\n```\n'