diff options
Diffstat (limited to 'src/line.rs')
-rw-r--r-- | src/line.rs | 36 |
1 files changed, 16 insertions, 20 deletions
diff --git a/src/line.rs b/src/line.rs index fce628c..b60b55c 100644 --- a/src/line.rs +++ b/src/line.rs @@ -82,31 +82,27 @@ impl ToString for Line { } -fn unlabeled_extern_link(path: String) -> Option<Token> { - Some( Token::ExternalLink { path, label:String::new() } ) -} - -fn labelled_extern_link(s: String) -> Option<Token> { - let (label, path) = match s.split_once("](") { - Some((l, t)) => (l.to_string(), t.to_string()), - None => return None, - }; - if label.contains("]") || path.contains("]") { return None } - Some( Token::ExternalLink { label, path } ) +fn external_link(inside: String) -> Option<Token> { + if let Some((label, path)) = inside.split_once("::") { + let label = label.trim().to_string(); + let path = path.trim().to_string(); + Some( Token::ExternalLink { label, path } ) + } else { + Some( Token::ExternalLink { label: String::new(), path: inside }) + } } -macro_rules! con { +macro_rules! make { ($v:expr) => {|s| Some($v(s)) }; } -const DELIMITERS: [(fn(String)->Option<Token>, &str, &str, &str); 7] = [ - ( con!(Token::Bold), "**", "**", "*" ), - ( con!(Token::Italic), "_", "_", "_" ), - ( con!(Token::Monospace), "`", "`", "`" ), - ( con!(Token::Math), "$", "$", "$" ), - ( con!(Token::InternalLink), "[[", "]]", "[]" ), - ( labelled_extern_link, "[", ")", "[]()" ), - ( unlabeled_extern_link, "<", ">", "<>" ), +const DELIMITERS: [(fn(String)->Option<Token>, &str, &str, &str); 6] = [ + ( make!(Token::Bold), "*", "*", "*" ), + ( make!(Token::Italic), "_", "_", "_" ), + ( make!(Token::Monospace), "`", "`", "`" ), + ( make!(Token::Math), "$", "$", "$" ), + ( make!(Token::InternalLink), "{", "}", "{}" ), + ( external_link, "<", ">", "<>" ), ]; fn is_whitespace(c: &char) -> bool { |