diff options
author | Lars Wirzenius <liw@liw.fi> | 2022-09-03 11:39:03 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2022-09-03 11:39:03 +0300 |
commit | ac65d482c4bae8a98feb0d74e2cbe797b61c1d84 (patch) | |
tree | b6bfd55c918f7f79e6e3819a5692d844bfdd3766 | |
parent | 1898ff35ddbc717304c2afd1e25257013919b995 (diff) | |
download | subplot-ac65d482c4bae8a98feb0d74e2cbe797b61c1d84.tar.gz |
refactor: AST only parses Markdown, YAML is extracted outside it
Sponsored-by: author
-rw-r--r-- | src/ast.rs | 31 | ||||
-rw-r--r-- | src/doc.rs | 4 |
2 files changed, 10 insertions, 25 deletions
@@ -29,10 +29,9 @@ pub struct AbstractSyntaxTree { } impl AbstractSyntaxTree { - // Create a new AST. - // - // Note that this is not public. - fn new(meta: YamlMetadata, blocks: Vec<Block>) -> Self { + /// Create a new AST. + pub fn new(meta: YamlMetadata, markdown: &str) -> Self { + let blocks = parse_blocks(markdown); Self { blocks, meta } } @@ -46,20 +45,6 @@ impl AbstractSyntaxTree { } } -impl std::str::FromStr for AbstractSyntaxTree { - type Err = Error; - - /// Create an abstract syntax tree from a string. - fn from_str(markdown: &str) -> Result<Self, Self::Err> { - trace!("Parsing markdown into AST"); - let (meta, markdown) = extract_metadata(markdown)?; - let blocks = parse_blocks(markdown); - let ast = AbstractSyntaxTree::new(meta, blocks); - trace!("Parsing markdown: OK"); - Ok(ast) - } -} - /// Extract YAML metadata from a Markdown document. pub fn extract_metadata(markdown: &str) -> Result<(YamlMetadata, &str), Error> { trace!("Extracting YAML from Markdown"); @@ -382,10 +367,8 @@ fn meta_path_bufs(v: &[PathBuf]) -> MetaValue { #[cfg(test)] mod test { - use super::{parse_code_block_attrs, AbstractSyntaxTree, YamlMetadata}; - use super::{Block, Inline}; + use super::{extract_metadata, parse_code_block_attrs, AbstractSyntaxTree, YamlMetadata}; use std::path::PathBuf; - use std::str::FromStr; #[test] fn code_block_attrs() { @@ -411,7 +394,8 @@ mod test { #[test] fn parses_leading_meta() { let markdown = "\n\n---\ntitle: Foo Bar\n...\nfoobar\n"; - let ast = AbstractSyntaxTree::from_str(markdown).unwrap(); + let (meta, markdown) = extract_metadata(markdown).unwrap(); + let ast = AbstractSyntaxTree::new(meta, markdown); let doc = ast.to_pandoc(); let keys: Vec<String> = doc.meta.keys().cloned().collect(); assert_eq!(keys, ["title"]); @@ -420,7 +404,8 @@ mod test { #[test] fn parses_trailing_meta() { let markdown = "foobar\n---\ntitle: Foo Bar\n...\n\n\n"; - let ast = AbstractSyntaxTree::from_str(markdown).unwrap(); + let (meta, markdown) = extract_metadata(markdown).unwrap(); + let ast = AbstractSyntaxTree::new(meta, markdown); let doc = ast.to_pandoc(); let keys: Vec<String> = doc.meta.keys().cloned().collect(); assert_eq!(keys, ["title"]); @@ -20,7 +20,6 @@ use std::default::Default; use std::fmt::Debug; use std::ops::Deref; use std::path::{Path, PathBuf}; -use std::str::FromStr; use pandoc_ast::{MutVisitor, Pandoc}; @@ -208,7 +207,8 @@ impl Document { let filename = filename.to_path_buf(); let markdown = std::fs::read_to_string(&filename) .map_err(|err| SubplotError::ReadFile(filename.clone(), err))?; - let ast = ast::AbstractSyntaxTree::from_str(&markdown)?; + let (meta, markdown) = ast::extract_metadata(&markdown)?; + let ast = ast::AbstractSyntaxTree::new(meta, markdown); trace!("Parsed document OK"); Self::from_ast(basedir, vec![filename], ast.to_pandoc(), style, template) |