diff --git a/src/elements/media.rs b/src/elements/media.rs index a78ee53..c46dc9f 100644 --- a/src/elements/media.rs +++ b/src/elements/media.rs @@ -3,6 +3,8 @@ use std::rc::Rc; use std::str::FromStr; use ariadne::Fmt; +use lsp::semantic::Semantics; +use parser::util::escape_source; use regex::Captures; use regex::Match; use regex::Regex; @@ -449,13 +451,30 @@ impl RegexRule for MediaRule { .ok() .map(|(_, value)| value); + if let Some((sems, tokens)) = + Semantics::from_source(token.source(), &state.shared.lsp) + { + sems.add(matches.get(0).unwrap().start()..matches.get(0).unwrap().start()+1, tokens.media_sep); + // Refname + sems.add(matches.get(0).unwrap().start()+1..matches.get(0).unwrap().start()+2, tokens.media_refname_sep); + sems.add(matches.get(1).unwrap().range(), tokens.media_refname); + sems.add(matches.get(1).unwrap().end()..matches.get(1).unwrap().end()+1, tokens.media_refname_sep); + // Uri + sems.add(matches.get(2).unwrap().start()-1..matches.get(2).unwrap().start(), tokens.media_uri_sep); + sems.add(matches.get(2).unwrap().range(), tokens.media_uri); + sems.add(matches.get(2).unwrap().end()..matches.get(2).unwrap().end()+1, tokens.media_uri_sep); + // Props + if let Some(props) = matches.get(3) + { + sems.add(props.start()-1..props.start(), tokens.media_props_sep); + sems.add(props.range(), tokens.media_props); + sems.add(props.end()..props.end()+1, tokens.media_props_sep); + } + } + let description = match matches.get(4) { Some(content) => { - let source = Rc::new(VirtualSource::new( - Token::new(content.range(), token.source()), - format!("Media[{refname}] description"), - content.as_str().trim_start().trim_end().to_string(), - )); + let source = escape_source(token.source(), content.range(), format!("Media[{refname}] description"), '\\', "\n"); if source.content().is_empty() { None } else { diff --git a/src/lsp/semantic.rs b/src/lsp/semantic.rs index 2eaa726..ea28258 100644 --- a/src/lsp/semantic.rs +++ b/src/lsp/semantic.rs @@ -174,6 +174,14 @@ pub struct Tokens { pub layout_props_sep: (u32, u32), pub layout_props: (u32, u32), pub layout_type: (u32, u32), + + pub media_sep: (u32, u32), + pub media_refname_sep: (u32, u32), + pub media_refname: (u32, u32), + pub media_uri_sep: (u32, u32), + pub media_uri: (u32, u32), + pub media_props_sep: (u32, u32), + pub media_props: (u32, u32), } impl Tokens { @@ -262,6 +270,14 @@ impl Tokens { layout_props_sep: token!("operator"), layout_props: token!("enum"), layout_type: token!("function"), + + media_sep: token!("macro"), + media_refname_sep: token!("macro"), + media_refname: token!("enum"), + media_uri_sep: token!("macro"), + media_uri: token!("function"), + media_props_sep: token!("operator"), + media_props: token!("enum"), } } }