Merge pull request #1037 from YouKnow-sys/master

Changed `escape` functions in both html and markdown utils to do less allocations and also be slightly faster
This commit is contained in:
Tima Kinsart 2024-04-10 01:45:11 +00:00 committed by GitHub
commit f811061566
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 33 additions and 21 deletions

View file

@ -101,7 +101,15 @@ pub fn code_inline(s: &str) -> String {
#[must_use = "This function returns a new string, rather than mutating the argument, so calling it \
without using its output does nothing useful"]
pub fn escape(s: &str) -> String {
s.replace('&', "&amp;").replace('<', "&lt;").replace('>', "&gt;")
s.chars().fold(String::with_capacity(s.len()), |mut s, c| {
match c {
'&' => s.push_str("&amp;"),
'<' => s.push_str("&lt;"),
'>' => s.push_str("&gt;"),
c => s.push(c),
}
s
})
}
#[must_use = "This function returns a new string, rather than mutating the argument, so calling it \

View file

@ -109,24 +109,16 @@ pub fn code_inline(s: &str) -> String {
#[must_use = "This function returns a new string, rather than mutating the argument, so calling it \
without using its output does nothing useful"]
pub fn escape(s: &str) -> String {
s.replace('_', r"\_")
.replace('*', r"\*")
.replace('[', r"\[")
.replace(']', r"\]")
.replace('(', r"\(")
.replace(')', r"\)")
.replace('~', r"\~")
.replace('`', r"\`")
.replace('>', r"\>")
.replace('#', r"\#")
.replace('+', r"\+")
.replace('-', r"\-")
.replace('=', r"\=")
.replace('|', r"\|")
.replace('{', r"\{")
.replace('}', r"\}")
.replace('.', r"\.")
.replace('!', r"\!")
const CHARS: [char; 18] =
['_', '*', '[', ']', '(', ')', '~', '`', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!'];
s.chars().fold(String::with_capacity(s.len()), |mut s, c| {
if CHARS.contains(&c) {
s.push('\\');
}
s.push(c);
s
})
}
/// Escapes all markdown special characters specific for the inline link URL
@ -134,7 +126,13 @@ pub fn escape(s: &str) -> String {
#[must_use = "This function returns a new string, rather than mutating the argument, so calling it \
without using its output does nothing useful"]
pub fn escape_link_url(s: &str) -> String {
s.replace('`', r"\`").replace(')', r"\)")
s.chars().fold(String::with_capacity(s.len()), |mut s, c| {
if ['`', ')'].contains(&c) {
s.push('\\');
}
s.push(c);
s
})
}
/// Escapes all markdown special characters specific for the code block (``` and
@ -142,7 +140,13 @@ pub fn escape_link_url(s: &str) -> String {
#[must_use = "This function returns a new string, rather than mutating the argument, so calling it \
without using its output does nothing useful"]
pub fn escape_code(s: &str) -> String {
s.replace('\\', r"\\").replace('`', r"\`")
s.chars().fold(String::with_capacity(s.len()), |mut s, c| {
if ['`', '\\'].contains(&c) {
s.push('\\');
}
s.push(c);
s
})
}
#[must_use = "This function returns a new string, rather than mutating the argument, so calling it \