Conversation
Reviewer's GuideIntroduce a pre-processing step that masks spaces inside backtick-delimited code spans with non-breaking spaces to prevent internal wrapping, integrate this into the paragraph flush routine, and add a regression test to verify the behavior. Class diagram for new code span handling in text wrappingclassDiagram
class flush_paragraph {
+flush_paragraph(out: &mut Vec<String>, buf: &[(String, bool)], indent: &str, width: usize)
}
class replace_spaces_in_code {
+replace_spaces_in_code(text: &str) String
}
flush_paragraph --> replace_spaces_in_code : calls
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
|
Warning Rate limit exceeded@leynos has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 5 minutes and 8 seconds before requesting another review. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. 📒 Files selected for processing (1)
Summary by CodeRabbit
WalkthroughIntroduce a helper function to replace spaces within inline code spans with non-breaking spaces, ensuring code spans are not split during text wrapping. Update the paragraph flushing logic to apply this transformation before and after wrapping. Add a test verifying that code spans remain intact after wrapping. Changes
Possibly related PRs
Poem
✨ Finishing Touches
🧪 Generate unit tests
🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Hey @leynos - I've reviewed your changes - here's some feedback:
- There’s duplicate logic in both the hard-break and final wrap branches where you call replace_spaces_in_code, fill, then restore spaces—consider extracting that into a small helper to DRY up the code.
- The replace_spaces_in_code function could use a doc comment or a more descriptive name (e.g. protect_code_span_spaces) to make its purpose and behavior clearer.
- The manual backtick counting/state logic may miss some edge cases (e.g. varying backtick delimiters or backticks inside code); consider adding targeted tests or using a regex-based split to simplify and harden this logic.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- There’s duplicate logic in both the hard-break and final wrap branches where you call replace_spaces_in_code, fill, then restore spaces—consider extracting that into a small helper to DRY up the code.
- The replace_spaces_in_code function could use a doc comment or a more descriptive name (e.g. protect_code_span_spaces) to make its purpose and behavior clearer.
- The manual backtick counting/state logic may miss some edge cases (e.g. varying backtick delimiters or backticks inside code); consider adding targeted tests or using a regex-based split to simplify and harden this logic.
## Individual Comments
### Comment 1
<location> `src/lib.rs:258` </location>
<code_context>
/// wrapped lines to the output vector with the given indentation. Lines are wrapped to the
/// specified width minus the indentation length. Hard breaks in the buffer force a line break at
/// that point.
+fn replace_spaces_in_code(text: &str) -> String {
+ let mut out = String::with_capacity(text.len());
+ let mut chars = text.chars().peekable();
</code_context>
<issue_to_address>
Consider refactoring the code to use a regex-based helper for code span handling and a single wrap function to simplify logic.
```suggestion
You can simplify the “protect‐fill‐restore” logic by splitting out a small helper and using a regex to find code spans instead of manual backtick counting. For example:
```rust
use regex::Regex;
// Protect only spaces inside inline code spans:
fn protect_code_spaces(text: &str) -> String {
// this matches any sequence of backticks + content + same number of backticks
lazy_static::lazy_static! {
static ref CODE_RX: Regex = Regex::new(r"(`+[^`]*`+)").unwrap();
}
CODE_RX.replace_all(text, |caps: ®ex::Captures| {
caps[0].replace(' ', "\u{00A0}")
}).into_owned()
}
// Single helper for wrap-and-restore:
fn wrap_segment(
seg: &str,
indent: &str,
width: usize,
out: &mut Vec<String>,
) {
let opts = Options::new(width - indent.len())
.word_splitter(WordSplitter::NoHyphenation);
let protected = protect_code_spaces(seg);
for line in fill(&protected, &opts).lines() {
// restore NBSP → space only after wrapping
let restored = line.replace('\u{00A0}', " ");
out.push(format!("{indent}{restored}"));
}
}
// Then flush_paragraph becomes:
fn flush_paragraph(
out: &mut Vec<String>,
buf: &[(String, bool)],
indent: &str,
width: usize,
) {
if buf.is_empty() { return; }
let mut seg = String::new();
for (text, hard) in buf {
if !seg.is_empty() {
seg.push(' ');
}
seg.push_str(text);
if *hard {
wrap_segment(&seg, indent, width, out);
seg.clear();
}
}
if !seg.is_empty() {
wrap_segment(&seg, indent, width, out);
}
}
```
This
- removes manual iterator/peek logic,
- handles arbitrary backtick spans via regex,
- factors out the duplicate wrap loops into `wrap_segment`.
</issue_to_address>Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
There was a problem hiding this comment.
Actionable comments posted: 2
📜 Review details
Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (1)
src/lib.rs(3 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.rs
Instructions used from:
Sources:
📄 CodeRabbit Inference Engine
- AGENTS.md
⚙️ CodeRabbit Configuration File
⏰ Context from checks skipped due to timeout of 240000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: build-test
🔇 Additional comments (2)
src/lib.rs (2)
303-307: Approve the protected wrapping implementation.The logic correctly protects code spans before wrapping and restores normal spaces afterwards. The two-step process ensures code spans remain intact during text wrapping whilst preserving original formatting in the output.
313-317: Approve the consistent protection pattern.The same protection logic is correctly applied to the remaining segment after hard breaks, maintaining consistency in code span handling throughout the paragraph flushing process.
Summary
wrap_textwithin backtick code spansTesting
cargo +nightly-2025-06-10 fmt --allcargo clippy -- -D warningsRUSTFLAGS="-D warnings" cargo testmarkdownlint docsnixie docshttps://chatgpt.com/codex/tasks/task_e_687441775cc08322a81bb3c844dfadf4
Summary by Sourcery
Preserve inline code spans during text wrapping by protecting spaces inside backtick-delimited segments from being split and restoring them after wrapping
Bug Fixes:
Enhancements:
Tests: