Skip to content

Commit bda367d

Browse files
committed
Merge branch 'tdgroot-code_language_callback' into develop
closes #64
2 parents b589863 + 61e8940 commit bda367d

File tree

3 files changed

+29
-1
lines changed

3 files changed

+29
-1
lines changed

README.rst

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,19 @@ code_language
102102
should be annotated with `````python`` or similar.
103103
Defaults to ``''`` (empty string) and can be any string.
104104

105+
code_language_callback
106+
When the HTML code contains ``pre`` tags that in some way provide the code
107+
language, for example as class, this callback can be used to extract the
108+
language from the tag and prefix it to the converted ``pre`` tag.
109+
The callback gets one single argument, an BeautifylSoup object, and returns
110+
a string containing the code language, or ``None``.
111+
An example to use the class name as code language could be::
112+
113+
def callback(el):
114+
return el['class'][0] if el.has_attr('class') else None
115+
116+
Defaults to ``None``.
117+
105118
escape_asterisks
106119
If set to ``False``, do not escape ``*`` to ``\*`` in text.
107120
Defaults to ``True``.

markdownify/__init__.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class DefaultOptions:
6363
autolinks = True
6464
bullets = '*+-' # An iterable of bullet types.
6565
code_language = ''
66+
code_language_callback = None
6667
convert = None
6768
default_title = False
6869
escape_asterisks = True
@@ -335,7 +336,12 @@ def convert_p(self, el, text, convert_as_inline):
335336
def convert_pre(self, el, text, convert_as_inline):
336337
if not text:
337338
return ''
338-
return '\n```%s\n%s\n```\n' % (self.options['code_language'], text)
339+
code_language = self.options['code_language']
340+
341+
if self.options['code_language_callback']:
342+
code_language = self.options['code_language_callback'](el) or code_language
343+
344+
return '\n```%s\n%s\n```\n' % (code_language, text)
339345

340346
convert_s = convert_del
341347

tests/test_conversions.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,3 +216,12 @@ def test_sup():
216216
def test_lang():
217217
assert md('<pre>test\n foo\nbar</pre>', code_language='python') == '\n```python\ntest\n foo\nbar\n```\n'
218218
assert md('<pre><code>test\n foo\nbar</code></pre>', code_language='javascript') == '\n```javascript\ntest\n foo\nbar\n```\n'
219+
220+
221+
def test_lang_callback():
222+
def callback(el):
223+
return el['class'][0] if el.has_attr('class') else None
224+
225+
assert md('<pre class="python">test\n foo\nbar</pre>', code_language_callback=callback) == '\n```python\ntest\n foo\nbar\n```\n'
226+
assert md('<pre class="javascript"><code>test\n foo\nbar</code></pre>', code_language_callback=callback) == '\n```javascript\ntest\n foo\nbar\n```\n'
227+
assert md('<pre class="javascript"><code class="javascript">test\n foo\nbar</code></pre>', code_language_callback=callback) == '\n```javascript\ntest\n foo\nbar\n```\n'

0 commit comments

Comments
 (0)