From b160ad5b9f0e38859b0a6d3c3262afbb39067584 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sat, 28 Jan 2023 20:01:53 +0200 Subject: 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 --- src/doc.rs | 3 +-- src/md.rs | 52 ++++++++++++++++++++++++---------------------------- 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/src/doc.rs b/src/doc.rs index e860726..faa3a84 100644 --- a/src/doc.rs +++ b/src/doc.rs @@ -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]; diff --git a/src/md.rs b/src/md.rs index 59fdc1e..f43b462 100644 --- a/src/md.rs +++ b/src/md.rs @@ -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 { + 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 { - 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, usize), SubplotError> { if e.is_empty() { // If we get here, it's a programming error. -- cgit v1.2.1