summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2022-09-03 11:39:03 +0300
committerLars Wirzenius <liw@liw.fi>2022-09-03 11:39:03 +0300
commitac65d482c4bae8a98feb0d74e2cbe797b61c1d84 (patch)
treeb6bfd55c918f7f79e6e3819a5692d844bfdd3766
parent1898ff35ddbc717304c2afd1e25257013919b995 (diff)
downloadsubplot-ac65d482c4bae8a98feb0d74e2cbe797b61c1d84.tar.gz
refactor: AST only parses Markdown, YAML is extracted outside it
Sponsored-by: author
-rw-r--r--src/ast.rs31
-rw-r--r--src/doc.rs4
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<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"]);
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)