diff options
author | Lars Wirzenius <liw@liw.fi> | 2023-01-28 20:01:53 +0200 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2023-02-01 17:49:03 +0200 |
commit | b160ad5b9f0e38859b0a6d3c3262afbb39067584 (patch) | |
tree | 7f2fe57569bdf9d77d0bc30e3fac78ba2d32ff92 | |
parent | 4892ab97637c3727834248aba19b0407439c1f5f (diff) | |
download | subplot-b160ad5b9f0e38859b0a6d3c3262afbb39067584.tar.gz |
refactor: turn loading Markdown from a file into a constructor
Previously, we used the TryFrom<&Path> trait, but it's not clear that
converting a pathname into a Markdown value means reading it. An
associated function that reads a file is clearer.
Sponsored-by: author
-rw-r--r-- | src/doc.rs | 3 | ||||
-rw-r--r-- | src/md.rs | 52 |
2 files changed, 25 insertions, 30 deletions
@@ -13,7 +13,6 @@ use crate::{Metadata, YamlMetadata}; use crate::{Warning, Warnings}; use std::collections::HashSet; -use std::convert::TryFrom; use std::default::Default; use std::fmt::Debug; use std::fs::read; @@ -147,7 +146,7 @@ impl Document { let mdfile = meta.markdown(); let mdfile = basedir.join(mdfile); - let mut md = Markdown::try_from(mdfile.as_path())?; + let mut md = Markdown::load_file(mdfile.as_path())?; md.set_metadata(&meta); let markdowns = vec![mdfile]; @@ -9,7 +9,6 @@ use pandoc_ast::{Map, MetaValue, MutVisitor, Pandoc}; use serde_yaml::{Mapping, Value}; use std::cell::RefCell; use std::collections::HashSet; -use std::convert::TryFrom; use std::path::{Path, PathBuf}; mod panhelper; @@ -25,6 +24,30 @@ pub struct Markdown { } impl Markdown { + /// Load a Markdown file. + pub fn load_file(filename: &Path) -> Result<Self, SubplotError> { + trace!("parsing file as markdown: {}", filename.display()); + let mut pandoc = pandoc::new(); + pandoc.add_input(&filename); + pandoc.set_input_format( + pandoc::InputFormat::Markdown, + vec![pandoc::MarkdownExtension::Citations], + ); + pandoc.set_output_format(pandoc::OutputFormat::Json, vec![]); + pandoc.set_output(pandoc::OutputKind::Pipe); + + // Add external Pandoc filters. + crate::policy::add_citeproc(&mut pandoc); + + let json = match pandoc.execute().map_err(SubplotError::Pandoc)? { + pandoc::PandocOutput::ToBuffer(o) => o, + _ => return Err(SubplotError::NotJson), + }; + + let ast: Pandoc = serde_json::from_str(&json).map_err(SubplotError::AstJson)?; + Ok(Self::new(ast)) + } + fn new(pandoc: Pandoc) -> Self { Self { pandoc: RefCell::new(pandoc), @@ -211,33 +234,6 @@ fn meta_path_bufs(v: &[PathBuf]) -> MetaValue { MetaValue::MetaList(v.iter().map(|p| meta_path_buf(p)).collect()) } -impl TryFrom<&Path> for Markdown { - type Error = SubplotError; - - fn try_from(filename: &Path) -> Result<Self, Self::Error> { - trace!("parsing file as markdown: {}", filename.display()); - let mut pandoc = pandoc::new(); - pandoc.add_input(&filename); - pandoc.set_input_format( - pandoc::InputFormat::Markdown, - vec![pandoc::MarkdownExtension::Citations], - ); - pandoc.set_output_format(pandoc::OutputFormat::Json, vec![]); - pandoc.set_output(pandoc::OutputKind::Pipe); - - // Add external Pandoc filters. - crate::policy::add_citeproc(&mut pandoc); - - let json = match pandoc.execute().map_err(SubplotError::Pandoc)? { - pandoc::PandocOutput::ToBuffer(o) => o, - _ => return Err(SubplotError::NotJson), - }; - - let ast: Pandoc = serde_json::from_str(&json).map_err(SubplotError::AstJson)?; - Ok(Self::new(ast)) - } -} - fn extract_scenario(e: &[visitor::Element]) -> Result<(Option<Scenario>, usize), SubplotError> { if e.is_empty() { // If we get here, it's a programming error. |