(
dom: &D,
root: D::NodeId,
diff --git a/moli-html2md/src/machine.rs b/moli-html2md/src/machine.rs
index fe780200d0..914a0bccb7 100644
--- a/moli-html2md/src/machine.rs
+++ b/moli-html2md/src/machine.rs
@@ -354,14 +354,15 @@ impl<'a, D: Dom + ?Sized> Machine<'a, D> {
}
"code" | "pre" => {
let remaining = self.options.max_depth - depth;
- if subtree_has_link(self.dom, node, remaining)
- || (!self.anchor_targets.is_empty()
- && crate::anchors::contains(
- self.dom,
- node,
- remaining,
- &self.anchor_targets,
- ))
+ if tag == "code"
+ && (subtree_has_link(self.dom, node, remaining)
+ || (!self.anchor_targets.is_empty()
+ && crate::anchors::contains(
+ self.dom,
+ node,
+ remaining,
+ &self.anchor_targets,
+ )))
{
let html = crate::html_table::render(
self.dom,
@@ -370,13 +371,18 @@ impl<'a, D: Dom + ?Sized> Machine<'a, D> {
self.options.max_depth,
&self.anchor_targets,
);
- if tag == "pre" {
- self.writer().block(html.into(), 2, 2);
- } else {
- self.writer().inline_html(&html);
- }
+ self.writer().inline_html(&html);
return;
}
+ if tag == "pre" && !self.anchor_targets.is_empty() {
+ for id in
+ crate::anchors::within(self.dom, node, remaining, &self.anchor_targets)
+ {
+ if self.emitted_anchors.insert(id.clone()) {
+ self.writer().inline_html(&crate::anchors::markup(&id));
+ }
+ }
+ }
self.raw.clear();
let end = if tag == "pre" {
Task::EndPre(self.language(node))
diff --git a/moli-html2md/tests/regressions.rs b/moli-html2md/tests/regressions.rs
index 88bb7e28e2..e74808454e 100644
--- a/moli-html2md/tests/regressions.rs
+++ b/moli-html2md/tests/regressions.rs
@@ -867,6 +867,8 @@ fn html_fallback_preserves_referenced_targets_for_special_nodes() {
false,
);
assert!(code.contains(""), "{code}");
+ assert!(code.contains("```\nlet x = 1;\n```"), "{code}");
+ assert!(!code.contains(""), "{code}");
let table = markdown(
"EmailEquationVideo",
false,
@@ -888,18 +890,15 @@ fn invalid_nested_and_empty_headings_do_not_emit_literal_markers() {
}
#[test]
-fn preformatted_navigation_retains_link_targets() {
+fn preformatted_navigation_retains_literal_content_as_markdown_code() {
let result = markdown(
"ALL GAMES: HOME GAMES : AWAY GAMES\nScores stay aligned
",
false,
);
- assert!(result.contains(""), "{result}");
+ assert!(result.starts_with("```\n"), "{result}");
+ assert!(!result.contains(""), "{result}");
assert!(
- result.contains("HOME GAMES"),
- "{result}"
- );
- assert!(
- result.contains("AWAY GAMES"),
+ result.contains("ALL GAMES: HOME GAMES : AWAY GAMES"),
"{result}"
);
assert!(result.contains("Scores stay aligned"), "{result}");
@@ -912,10 +911,12 @@ fn preformatted_code_preserves_externally_referenced_targets() {
false,
);
assert!(result.contains("[Line 1](#L1)"), "{result}");
+ assert!(result.contains(""), "{result}");
assert!(
- result.contains("let x = 1;"),
+ result.contains("```\nlet x = 1;\nlet y = 2;\n```"),
"{result}"
);
+ assert!(!result.contains(""), "{result}");
}
#[test]