diff --git a/src/app/browser/window/tab/item/page/content/text/markdown/tags.rs b/src/app/browser/window/tab/item/page/content/text/markdown/tags.rs index e33ed470..c17f4aad 100644 --- a/src/app/browser/window/tab/item/page/content/text/markdown/tags.rs +++ b/src/app/browser/window/tab/item/page/content/text/markdown/tags.rs @@ -81,12 +81,16 @@ impl Tags { reference::render_links(buffer, base, link_color, links); // Cleanup unformatted escape chars - let mut cursor = buffer.start_iter(); - while let Some((mut match_start, mut match_end)) = - cursor.forward_search(ESC, TextSearchFlags::CASE_INSENSITIVE, None) - { - buffer.delete(&mut match_start, &mut match_end); - cursor = match_end; + for escapes in ESCAPES { + for escape in *escapes { + let mut cursor = buffer.start_iter(); + while let Some((mut match_start, mut match_end)) = + cursor.forward_search(escape, TextSearchFlags::CASE_INSENSITIVE, None) + { + buffer.delete(&mut match_start, &mut match_end); + cursor = match_end; + } + } } // Render placeholders @@ -99,7 +103,12 @@ impl Tags { s = reference::strip_tags(&s); s = strike::strip_tags(&s); s = underline::strip_tags(&s); - s.replace(ESC, "") + for escapes in ESCAPES { + for escape in *escapes { + s = s.replace(escape, ""); + } + } + s }) } } @@ -109,4 +118,17 @@ pub fn format_header_fragment(value: &str) -> GString { Uri::escape_string(&value.to_lowercase().replace(" ", "-"), None, true) } -const ESC: &str = "\\"; +const ESCAPES: &[&[&str]] = &[ + &["\\\n"], + bold::ESCAPES, + // same with pre + // code::ESCAPES, + header::ESCAPES, + // same with bold and reference + // list::ESCAPES, + pre::ESCAPES, + quote::ESCAPES, + reference::ESCAPES, + strike::ESCAPES, + underline::ESCAPES, +]; diff --git a/src/app/browser/window/tab/item/page/content/text/markdown/tags/bold.rs b/src/app/browser/window/tab/item/page/content/text/markdown/tags/bold.rs index 56bd09c3..70436faa 100644 --- a/src/app/browser/window/tab/item/page/content/text/markdown/tags/bold.rs +++ b/src/app/browser/window/tab/item/page/content/text/markdown/tags/bold.rs @@ -7,6 +7,8 @@ use regex::Regex; const REGEX_BOLD: &str = r"\*\*(?P[^*]+)\*\*"; +pub const ESCAPES: &[&str] = &["\\*"]; // same with list + pub struct Bold(TextTag); impl Bold { diff --git a/src/app/browser/window/tab/item/page/content/text/markdown/tags/code.rs b/src/app/browser/window/tab/item/page/content/text/markdown/tags/code.rs index 5d79041f..501fa270 100644 --- a/src/app/browser/window/tab/item/page/content/text/markdown/tags/code.rs +++ b/src/app/browser/window/tab/item/page/content/text/markdown/tags/code.rs @@ -12,6 +12,9 @@ use syntax::Syntax; const REGEX_CODE: &str = r"(?s)```[ \t]*(?P.*?)\n(?P.*?)```"; +// same with pre +// pub const ESCAPES: &[&str] = &["\\`"]; + struct Entry { alt: Option, data: String, diff --git a/src/app/browser/window/tab/item/page/content/text/markdown/tags/header.rs b/src/app/browser/window/tab/item/page/content/text/markdown/tags/header.rs index e399d92c..471f2a57 100644 --- a/src/app/browser/window/tab/item/page/content/text/markdown/tags/header.rs +++ b/src/app/browser/window/tab/item/page/content/text/markdown/tags/header.rs @@ -8,6 +8,8 @@ use std::collections::HashMap; const REGEX_HEADER: &str = r"(?m)^(?P#{1,6})\s+(?P.*)$"; +pub const ESCAPES: &[&str] = &["\\#"]; + pub struct Header { h1: TextTag, h2: TextTag, diff --git a/src/app/browser/window/tab/item/page/content/text/markdown/tags/list.rs b/src/app/browser/window/tab/item/page/content/text/markdown/tags/list.rs index 304167c8..4796e99a 100644 --- a/src/app/browser/window/tab/item/page/content/text/markdown/tags/list.rs +++ b/src/app/browser/window/tab/item/page/content/text/markdown/tags/list.rs @@ -7,6 +7,9 @@ use regex::Regex; const REGEX_LIST: &str = r"(?m)^(?P<level>[ \t]*)\*[ \t]+(?:(?P<state>\[[ xX]\])[ \t]+)?(?P<text>.*)"; +// same with bold and reference +// pub const ESCAPES: &[&str] = &["\\*","\\[","\\]"]; + struct State(bool); impl State { diff --git a/src/app/browser/window/tab/item/page/content/text/markdown/tags/pre.rs b/src/app/browser/window/tab/item/page/content/text/markdown/tags/pre.rs index 473067dc..3d867761 100644 --- a/src/app/browser/window/tab/item/page/content/text/markdown/tags/pre.rs +++ b/src/app/browser/window/tab/item/page/content/text/markdown/tags/pre.rs @@ -10,6 +10,8 @@ const REGEX_PRE: &str = r"`(?P<text>[^`]+)`"; const TAG_FONT: &str = "monospace"; // @TODO const TAG_SCALE: f64 = 0.9; +pub const ESCAPES: &[&str] = &["\\`"]; // same with code + pub struct Pre(TextTag); impl Pre { diff --git a/src/app/browser/window/tab/item/page/content/text/markdown/tags/quote.rs b/src/app/browser/window/tab/item/page/content/text/markdown/tags/quote.rs index e7a79849..e6161b3b 100644 --- a/src/app/browser/window/tab/item/page/content/text/markdown/tags/quote.rs +++ b/src/app/browser/window/tab/item/page/content/text/markdown/tags/quote.rs @@ -8,6 +8,8 @@ use regex::Regex; const REGEX_QUOTE: &str = r"(?m)>\s*(?P<text>.*)$"; +pub const ESCAPES: &[&str] = &["\\>"]; + pub struct Quote(TextTag); impl Quote { diff --git a/src/app/browser/window/tab/item/page/content/text/markdown/tags/reference.rs b/src/app/browser/window/tab/item/page/content/text/markdown/tags/reference.rs index b69622b1..57eb3546 100644 --- a/src/app/browser/window/tab/item/page/content/text/markdown/tags/reference.rs +++ b/src/app/browser/window/tab/item/page/content/text/markdown/tags/reference.rs @@ -12,6 +12,8 @@ const REGEX_IMAGE: &str = r"!\[(?P<alt>[^\]]*)\]\((?P<url>[^\)]+)\)"; const REGEX_IMAGE_LINK: &str = r"\[(?P<is_img>!)\[(?P<alt>[^\]]*)\]\((?P<img_url>[^\)]+)\)\]\((?P<link_url>[^\)]+)\)"; +pub const ESCAPES: &[&str] = &["\\!", "\\[", "\\]", "\\(", "\\)"]; + struct Reference { uri: Uri, alt: String, diff --git a/src/app/browser/window/tab/item/page/content/text/markdown/tags/strike.rs b/src/app/browser/window/tab/item/page/content/text/markdown/tags/strike.rs index 13b4ef08..cdabe70b 100644 --- a/src/app/browser/window/tab/item/page/content/text/markdown/tags/strike.rs +++ b/src/app/browser/window/tab/item/page/content/text/markdown/tags/strike.rs @@ -7,6 +7,8 @@ use regex::Regex; const REGEX_STRIKE: &str = r"~~(?P<text>.+?)~~"; +pub const ESCAPES: &[&str] = &["\\~"]; + pub struct Strike(TextTag); impl Strike { diff --git a/src/app/browser/window/tab/item/page/content/text/markdown/tags/underline.rs b/src/app/browser/window/tab/item/page/content/text/markdown/tags/underline.rs index fe7dbd3f..242291e6 100644 --- a/src/app/browser/window/tab/item/page/content/text/markdown/tags/underline.rs +++ b/src/app/browser/window/tab/item/page/content/text/markdown/tags/underline.rs @@ -8,6 +8,8 @@ use regex::Regex; const REGEX_UNDERLINE: &str = r"\b_(?P<text>[^_]+)_\b"; +pub const ESCAPES: &[&str] = &["\\_"]; + pub struct Underline(TextTag); impl Underline {