From b7b9cd5e678ca824f0b12d0b8c44107587ffd051 Mon Sep 17 00:00:00 2001 From: Dezhi Wu Date: Wed, 20 Oct 2021 15:05:32 +0800 Subject: [PATCH 1/2] Fix: only shows one # when we encounter ## --- crates/rust-analyzer/src/markdown.rs | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/crates/rust-analyzer/src/markdown.rs b/crates/rust-analyzer/src/markdown.rs index 35eaffba8ca..9ffd085b0c3 100644 --- a/crates/rust-analyzer/src/markdown.rs +++ b/crates/rust-analyzer/src/markdown.rs @@ -1,4 +1,6 @@ //! Transforms markdown +use std::borrow::Cow; + use ide_db::helpers::rust_doc::is_rust_fence; const RUSTDOC_FENCE: &str = "```"; @@ -8,8 +10,9 @@ pub(crate) fn format_docs(src: &str) -> String { let mut in_code_block = false; let mut is_rust = false; - for mut line in src.lines() { - if in_code_block && is_rust && code_line_ignored_by_rustdoc(line) { + for line in src.lines() { + let mut line = Cow::from(line); + if in_code_block && is_rust && code_line_ignored_by_rustdoc(&line) { continue; } @@ -20,11 +23,18 @@ pub(crate) fn format_docs(src: &str) -> String { is_rust = is_rust_fence(header); if is_rust { - line = "```rust"; + line = Cow::Borrowed("```rust"); } } } + if in_code_block { + let trimmed = line.trim(); + if trimmed.starts_with("##") { + line = Cow::Owned(line.replacen("##", "#", 1)); + } + } + processed_lines.push(line); } processed_lines.join("\n") @@ -136,4 +146,14 @@ let a = 1; "```text\nfiller\ntext\n```\nSome comment.\n```rust\nlet a = 1;\n```" ); } + + #[test] + fn test_format_docs_handles_escape_double_hashes() { + let comment = r#"```rust +let s = "foo +## bar # baz"; +```"#; + + assert_eq!(format_docs(comment), "```rust\nlet s = \"foo\n# bar # baz\";\n```"); + } } From 31af94b73ae98e979f6e4b11a01d2a1c742f1bf4 Mon Sep 17 00:00:00 2001 From: Dezhi Wu Date: Tue, 26 Oct 2021 20:55:58 +0800 Subject: [PATCH 2/2] perf: avoid allocating by just slicing. Signed-off-by: Dezhi Wu --- crates/rust-analyzer/src/markdown.rs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/crates/rust-analyzer/src/markdown.rs b/crates/rust-analyzer/src/markdown.rs index 9ffd085b0c3..59c904f86e7 100644 --- a/crates/rust-analyzer/src/markdown.rs +++ b/crates/rust-analyzer/src/markdown.rs @@ -1,6 +1,4 @@ //! Transforms markdown -use std::borrow::Cow; - use ide_db::helpers::rust_doc::is_rust_fence; const RUSTDOC_FENCE: &str = "```"; @@ -10,9 +8,8 @@ pub(crate) fn format_docs(src: &str) -> String { let mut in_code_block = false; let mut is_rust = false; - for line in src.lines() { - let mut line = Cow::from(line); - if in_code_block && is_rust && code_line_ignored_by_rustdoc(&line) { + for mut line in src.lines() { + if in_code_block && is_rust && code_line_ignored_by_rustdoc(line) { continue; } @@ -23,15 +20,15 @@ pub(crate) fn format_docs(src: &str) -> String { is_rust = is_rust_fence(header); if is_rust { - line = Cow::Borrowed("```rust"); + line = "```rust"; } } } if in_code_block { - let trimmed = line.trim(); + let trimmed = line.trim_start(); if trimmed.starts_with("##") { - line = Cow::Owned(line.replacen("##", "#", 1)); + line = &trimmed[1..]; } }