use cmark_writer::ast::Node;
use typst::html::HtmlElement;
use crate::attributes::{FigureAttr, ImageAttr, LinkAttr, TypliteAttrsParser};
use crate::common::{FigureNode, HighlightNode};
use crate::Result;
use super::core::HtmlToAstParser;
pub struct InlineParser;
impl InlineParser {
pub fn convert_strong(parser: &mut HtmlToAstParser, element: &HtmlElement) -> Result<()> {
let mut content = Vec::new();
parser.convert_children_into(&mut content, element)?;
parser.inline_buffer.push(Node::Strong(content));
Ok(())
}
pub fn convert_emphasis(parser: &mut HtmlToAstParser, element: &HtmlElement) -> Result<()> {
let mut content = Vec::new();
parser.convert_children_into(&mut content, element)?;
parser.inline_buffer.push(Node::Emphasis(content));
Ok(())
}
pub fn convert_highlight(parser: &mut HtmlToAstParser, element: &HtmlElement) -> Result<()> {
let mut content = Vec::new();
parser.convert_children_into(&mut content, element)?;
parser
.inline_buffer
.push(Node::Custom(Box::new(HighlightNode { content })));
Ok(())
}
pub fn convert_strikethrough(
parser: &mut HtmlToAstParser,
element: &HtmlElement,
) -> Result<()> {
let mut content = Vec::new();
parser.convert_children_into(&mut content, element)?;
parser.inline_buffer.push(Node::Strikethrough(content));
Ok(())
}
pub fn convert_link(parser: &mut HtmlToAstParser, element: &HtmlElement) -> Result<()> {
let attrs = LinkAttr::parse(&element.attrs)?;
let mut content = Vec::new();
parser.convert_children_into(&mut content, element)?;
parser.inline_buffer.push(Node::Link {
url: attrs.dest.into(),
title: None,
content,
});
Ok(())
}
pub fn convert_image(parser: &mut HtmlToAstParser, element: &HtmlElement) -> Result<()> {
let attrs = ImageAttr::parse(&element.attrs)?;
let src = attrs.src.as_str();
parser.inline_buffer.push(Node::Image {
url: src.to_string(),
title: None,
alt: vec![Node::Text(attrs.alt.into())],
});
Ok(())
}
pub fn convert_figure(parser: &mut HtmlToAstParser, element: &HtmlElement) -> Result<()> {
parser.flush_inline_buffer();
let attrs = FigureAttr::parse(&element.attrs)?;
let caption = attrs.caption.to_string();
let mut body_content = Vec::new();
parser.convert_children_into(&mut body_content, element)?;
let body = Box::new(Node::Paragraph(body_content));
parser
.blocks
.push(Node::Custom(Box::new(FigureNode { body, caption })));
Ok(())
}
}