use crate::ast::*;
use crate::lexer::TokenKind;
use tsv_lang::{Error, Span};
use super::find_raw_text_close;
use super::parser_impl::SvelteParser;
impl<'a, 'arena> SvelteParser<'a, 'arena> {
pub(crate) fn parse_style_tag(&mut self) -> Result<Style<'arena>, Error> {
let start = self.current_start();
self.expect(TokenKind::LeftAngle)?;
if !self.check(TokenKind::Identifier) || self.current_value() != "style" {
return Err(self.error_expected_found("'style'"));
}
self.advance()?;
let attributes = self.parse_attributes_literal()?;
if !self.check(TokenKind::RightAngle) {
return Err(self.error_expected_found("'>'"));
}
let content_start = self.current_end();
let content_end = find_raw_text_close(self.source, content_start, b"style")
.ok_or_else(|| self.error_msg_at("Unterminated style tag", start))?;
self.advance_to_position(content_end)?;
let end = self.parse_closing_tag("style")?;
let css_content = &self.source[content_start..content_end];
let css_stylesheet = tsv_css::__private::parse_embedded(
css_content,
content_start,
self.island_nesting(),
self.arena,
)?;
Ok(Style {
span: Span {
start: start as u32,
end,
},
content_span: Span {
start: content_start as u32,
end: content_end as u32,
},
attributes: attributes.into_bump_slice(),
css_stylesheet,
})
}
}