From ac65d482c4bae8a98feb0d74e2cbe797b61c1d84 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sat, 3 Sep 2022 11:39:03 +0300 Subject: refactor: AST only parses Markdown, YAML is extracted outside it Sponsored-by: author --- src/ast.rs | 31 ++++++++----------------------- src/doc.rs | 4 ++-- 2 files changed, 10 insertions(+), 25 deletions(-) diff --git a/src/ast.rs b/src/ast.rs index afa8b3b..f02fdd1 100644 --- a/src/ast.rs +++ b/src/ast.rs @@ -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) -> 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 { - 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 = 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 = doc.meta.keys().cloned().collect(); assert_eq!(keys, ["title"]); diff --git a/src/doc.rs b/src/doc.rs index ace3e67..2f3368e 100644 --- a/src/doc.rs +++ b/src/doc.rs @@ -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) -- cgit v1.2.1