summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-02-10 04:55:20 +0800
committer魏曹先生 <1992414357@qq.com>2026-02-10 04:59:03 +0800
commit0832256f17f6e28c128adea7d5ab6dc2629e188a (patch)
tree3bd376e34bd12a385b18347e5d72b001d349c9a5
parent275084f025b81da78f2a6c5cb23bc4a846a7b909 (diff)
Add support for bold_italic formatting in markdown parser
The parser now correctly handles triple asterisk (***) syntax for bold_italic text. Previously, nested bold and italic formatting would not combine properly.
-rw-r--r--converter/src/parse.rs76
-rw-r--r--gen/macros/src/lib.rs22
2 files changed, 56 insertions, 42 deletions
diff --git a/converter/src/parse.rs b/converter/src/parse.rs
index 02119d3..f5b0170 100644
--- a/converter/src/parse.rs
+++ b/converter/src/parse.rs
@@ -1020,34 +1020,61 @@ pub mod markdown_split_and_encode {
if chars.peek() == Some(&'*') {
chars.next(); // Consume the second '*'
- if in_bold {
- // End bold
- if !current_text.is_empty() {
- let encoded_text = encode_unicode(&current_text);
- result.push_str(&format!("[bold:[{}]]", encoded_text));
- current_text.clear();
- }
- in_bold = false;
- } else if in_italic {
- if !current_text.is_empty() {
- let encoded_text = encode_unicode(&current_text);
- result.push_str(&format!("[italic:[{}]]", encoded_text));
- current_text.clear();
+ // Check for bold_italic (***)
+ if chars.peek() == Some(&'*') {
+ chars.next(); // Consume the third '*'
+
+ if in_bold && in_italic {
+ // End bold_italic
+ if !current_text.is_empty() {
+ let encoded_text = encode_unicode(&current_text);
+ result.push_str(&format!("[bold_italic:[{}]]", encoded_text));
+ current_text.clear();
+ }
+ in_bold = false;
+ in_italic = false;
+ } else {
+ // Start bold_italic
+ if !current_text.is_empty() {
+ let encoded_text = encode_unicode(&current_text);
+ result.push_str(&format!("[text:[{}]]", encoded_text));
+ current_text.clear();
+ }
+ in_bold = true;
+ in_italic = true;
}
- in_italic = false;
- // Start bold_italic
- in_bold = true;
} else {
- // Start bold
- if !current_text.is_empty() {
- let encoded_text = encode_unicode(&current_text);
- result.push_str(&format!("[text:[{}]]", encoded_text));
- current_text.clear();
+ // Handle ** (bold)
+ if in_bold && !in_italic {
+ // End bold
+ if !current_text.is_empty() {
+ let encoded_text = encode_unicode(&current_text);
+ result.push_str(&format!("[bold:[{}]]", encoded_text));
+ current_text.clear();
+ }
+ in_bold = false;
+ } else if in_italic {
+ // Currently in italic, encountering ** means we need to end italic and start bold_italic
+ if !current_text.is_empty() {
+ let encoded_text = encode_unicode(&current_text);
+ result.push_str(&format!("[italic:[{}]]", encoded_text));
+ current_text.clear();
+ }
+ in_italic = false;
+ in_bold = true;
+ } else {
+ // Start bold
+ if !current_text.is_empty() {
+ let encoded_text = encode_unicode(&current_text);
+ result.push_str(&format!("[text:[{}]]", encoded_text));
+ current_text.clear();
+ }
+ in_bold = true;
}
- in_bold = true;
}
} else {
- if in_italic {
+ // Single * (italic)
+ if in_italic && !in_bold {
// End italic
if !current_text.is_empty() {
let encoded_text = encode_unicode(&current_text);
@@ -1056,13 +1083,12 @@ pub mod markdown_split_and_encode {
}
in_italic = false;
} else if in_bold {
+ // Currently in bold, encountering * means we need to start bold_italic
if !current_text.is_empty() {
let encoded_text = encode_unicode(&current_text);
result.push_str(&format!("[bold:[{}]]", encoded_text));
current_text.clear();
}
- // Start bold_italic
- in_bold = true;
in_italic = true;
} else {
// Start italic
diff --git a/gen/macros/src/lib.rs b/gen/macros/src/lib.rs
index f66b7a9..f74f944 100644
--- a/gen/macros/src/lib.rs
+++ b/gen/macros/src/lib.rs
@@ -319,25 +319,14 @@ fn parse_content_block(block: &str) -> std::result::Result<TokenData, String> {
// Handle Unicode escape sequences
let decoded_content = decode_unicode_escapes(content)?;
- // Check for formatting markers
+ // Remove backticks if present
let trimmed_content = decoded_content.trim_matches('`');
match label {
- "text" => {
- // Check text formatting
- if trimmed_content.starts_with("**") && trimmed_content.ends_with("**") {
- let inner = &trimmed_content[2..trimmed_content.len() - 2];
- Ok(TokenData::BoldText(inner.to_string()))
- } else if trimmed_content.starts_with("*") && trimmed_content.ends_with("*") {
- let inner = &trimmed_content[1..trimmed_content.len() - 1];
- Ok(TokenData::ItalicText(inner.to_string()))
- } else if trimmed_content.starts_with("***") && trimmed_content.ends_with("***") {
- let inner = &trimmed_content[3..trimmed_content.len() - 3];
- Ok(TokenData::BoldItalicText(inner.to_string()))
- } else {
- Ok(TokenData::Text(trimmed_content.to_string()))
- }
- }
+ "text" => Ok(TokenData::Text(trimmed_content.to_string())),
+ "bold" => Ok(TokenData::BoldText(trimmed_content.to_string())),
+ "italic" => Ok(TokenData::ItalicText(trimmed_content.to_string())),
+ "bold_italic" => Ok(TokenData::BoldItalicText(trimmed_content.to_string())),
"code" => Ok(TokenData::Code(trimmed_content.to_string())),
_ => Err(format!("Unknown label: {}", label)),
}
@@ -348,7 +337,6 @@ fn parse_next_step(block: &str) -> std::result::Result<Option<String>, String> {
return Ok(None);
}
- // 格式: [#step_id]
if !block.starts_with("[#") || !block.ends_with(']') {
return Err(format!("Invalid next step format: {}", block));
}