diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-02-10 04:55:20 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-02-10 04:59:03 +0800 |
| commit | 0832256f17f6e28c128adea7d5ab6dc2629e188a (patch) | |
| tree | 3bd376e34bd12a385b18347e5d72b001d349c9a5 | |
| parent | 275084f025b81da78f2a6c5cb23bc4a846a7b909 (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.rs | 76 | ||||
| -rw-r--r-- | gen/macros/src/lib.rs | 22 |
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(¤t_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(¤t_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(¤t_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(¤t_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(¤t_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(¤t_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(¤t_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(¤t_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(¤t_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(¤t_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)); } |
