parent
fcbaf6eee3
commit
2870642cfa
@ -5,13 +5,14 @@ use rocket::{
|
|||||||
http::uri::Uri,
|
http::uri::Uri,
|
||||||
response::{Redirect, Flash}
|
response::{Redirect, Flash}
|
||||||
};
|
};
|
||||||
|
use std::borrow::Cow;
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
|
||||||
/// Generates an hexadecimal representation of 32 bytes of random data
|
/// Generates an hexadecimal representation of 32 bytes of random data
|
||||||
pub fn random_hex() -> String {
|
pub fn random_hex() -> String {
|
||||||
let mut bytes = [0; 32];
|
let mut bytes = [0; 32];
|
||||||
rand_bytes(&mut bytes).expect("Error while generating client id");
|
rand_bytes(&mut bytes).expect("Error while generating client id");
|
||||||
bytes.into_iter().fold(String::new(), |res, byte| format!("{}{:x}", res, byte))
|
bytes.iter().fold(String::new(), |res, byte| format!("{}{:x}", res, byte))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Remove non alphanumeric characters and CamelCase a string
|
/// Remove non alphanumeric characters and CamelCase a string
|
||||||
@ -43,12 +44,33 @@ enum State {
|
|||||||
pub fn md_to_html(md: &str) -> (String, HashSet<String>, HashSet<String>) {
|
pub fn md_to_html(md: &str) -> (String, HashSet<String>, HashSet<String>) {
|
||||||
let parser = Parser::new_ext(md, Options::all());
|
let parser = Parser::new_ext(md, Options::all());
|
||||||
|
|
||||||
let (parser, mentions, hashtags): (Vec<Event>, Vec<String>, Vec<String>) = parser.map(|evt| match evt {
|
let (parser, mentions, hashtags): (Vec<Event>, Vec<String>, Vec<String>) = parser
|
||||||
|
.scan(None, |state: &mut Option<String>, evt|{
|
||||||
|
let (s, res) = match evt {
|
||||||
|
Event::Text(txt) => match state.take() {
|
||||||
|
Some(mut prev_txt) => {
|
||||||
|
prev_txt.push_str(&txt);
|
||||||
|
(Some(prev_txt), vec![])
|
||||||
|
},
|
||||||
|
None => {
|
||||||
|
(Some(txt.into_owned()), vec![])
|
||||||
|
}
|
||||||
|
},
|
||||||
|
e => match state.take() {
|
||||||
|
Some(prev) => (None, vec![Event::Text(Cow::Owned(prev)), e]),
|
||||||
|
None => (None, vec![e]),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
*state = s;
|
||||||
|
Some(res)
|
||||||
|
})
|
||||||
|
.flat_map(|v| v.into_iter())
|
||||||
|
.map(|evt| match evt {
|
||||||
Event::Text(txt) => {
|
Event::Text(txt) => {
|
||||||
let (evts, _, _, _, new_mentions, new_hashtags) = txt.chars().fold((vec![], State::Ready, String::new(), 0, vec![], vec![]), |(mut events, state, mut text_acc, n, mut mentions, mut hashtags), c| {
|
let (evts, _, _, _, new_mentions, new_hashtags) = txt.chars().fold((vec![], State::Ready, String::new(), 0, vec![], vec![]), |(mut events, state, mut text_acc, n, mut mentions, mut hashtags), c| {
|
||||||
match state {
|
match state {
|
||||||
State::Mention => {
|
State::Mention => {
|
||||||
let char_matches = c.is_alphanumeric() || c == '@' || c == '.' || c == '-' || c == '_';
|
let char_matches = c.is_alphanumeric() || "@.-_".contains(c);
|
||||||
if char_matches && (n < (txt.chars().count() - 1)) {
|
if char_matches && (n < (txt.chars().count() - 1)) {
|
||||||
text_acc.push(c);
|
text_acc.push(c);
|
||||||
(events, State::Mention, text_acc, n + 1, mentions, hashtags)
|
(events, State::Mention, text_acc, n + 1, mentions, hashtags)
|
||||||
@ -69,7 +91,7 @@ pub fn md_to_html(md: &str) -> (String, HashSet<String>, HashSet<String>) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
State::Hashtag => {
|
State::Hashtag => {
|
||||||
let char_matches = c.is_alphanumeric();
|
let char_matches = c.is_alphanumeric() || "-_".contains(c);
|
||||||
if char_matches && (n < (txt.chars().count() -1)) {
|
if char_matches && (n < (txt.chars().count() -1)) {
|
||||||
text_acc.push(c);
|
text_acc.push(c);
|
||||||
(events, State::Hashtag, text_acc, n+1, mentions, hashtags)
|
(events, State::Hashtag, text_acc, n+1, mentions, hashtags)
|
||||||
@ -161,6 +183,7 @@ mod tests {
|
|||||||
("between parenthesis (@test)", vec!["test"]),
|
("between parenthesis (@test)", vec!["test"]),
|
||||||
("with some punctuation @test!", vec!["test"]),
|
("with some punctuation @test!", vec!["test"]),
|
||||||
(" @spaces ", vec!["spaces"]),
|
(" @spaces ", vec!["spaces"]),
|
||||||
|
("@is_a@mention", vec!["is_a@mention"]),
|
||||||
("not_a@mention", vec![]),
|
("not_a@mention", vec![]),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user