Skip to content

Commit 5f0f1ae

Browse files
committed
fix(html): honor explicit code languages
1 parent 7d3df70 commit 5f0f1ae

2 files changed

Lines changed: 26 additions & 4 deletions

File tree

‎packages/markitdown/src/markitdown/converters/_markdown.py‎

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class _CustomMarkdown:
7070

7171
def __init__(self, **options: Any) -> None:
7272
self._code_language: Final[str] = options.get("code_language", "")
73+
self._explicit_code_language: Final[str | None] = options.get("code_language")
7374
self._code_language_callback: Final[Callable[[Tag], str | None] | None] = (
7475
options.get("code_language_callback")
7576
)
@@ -97,9 +98,13 @@ def __init__(self, **options: Any) -> None:
9798
if symbol[:1] == "<" and symbol[-1:] == ">"
9899
else symbol
99100
)
100-
converters[tag] = lambda el, text, symbol=symbol, closing=closing: (
101-
f"{symbol}{text}{closing}"
102-
)
101+
102+
def convert_symbol(
103+
el: Element, text: str, symbol: str = symbol, closing: str = closing
104+
) -> str:
105+
return f"{symbol}{text}{closing}"
106+
107+
converters[tag] = convert_symbol
103108
# Tags that are stripped, or not converted, render as plain text, so
104109
# none of the converters above may apply to them
105110
strip = options.get("strip")
@@ -169,7 +174,7 @@ def convert(self, node: Document | Element) -> str:
169174
pre,
170175
self._code_language_callback(tags[pre]) or self._code_language
171176
if self._code_language_callback is not None and pre.text
172-
else None,
177+
else self._explicit_code_language,
173178
)
174179
# An underline around nothing but whitespace or a line break would
175180
# render as nothing at all, so let its content render in its place

‎packages/markitdown/tests/test_html_code.py‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import pytest
55
from bs4 import Tag
6+
67
from markitdown.converters import HtmlConverter
78

89

@@ -39,6 +40,22 @@ def test_html_code_default_language() -> None:
3940
)
4041

4142

43+
@pytest.mark.parametrize(
44+
"language",
45+
[pytest.param("ruby", id="override"), pytest.param("", id="disable")],
46+
)
47+
def test_html_code_explicit_language_overrides_class(language: str) -> None:
48+
assert (
49+
HtmlConverter()
50+
.convert_string(
51+
'<pre><code class="language-python">one</code></pre>',
52+
code_language=language,
53+
)
54+
.markdown
55+
== f"```{language}\none\n```"
56+
)
57+
58+
4259
def test_html_code_invalid_trimming() -> None:
4360
with pytest.raises(ValueError, match="Invalid value for strip_pre: unknown"):
4461
HtmlConverter().convert_string("<pre>one</pre>", strip_pre="unknown")

0 commit comments

Comments
 (0)