summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2023-01-28 20:01:53 +0200
committerLars Wirzenius <liw@liw.fi>2023-02-01 17:49:03 +0200
commitb160ad5b9f0e38859b0a6d3c3262afbb39067584 (patch)
tree7f2fe57569bdf9d77d0bc30e3fac78ba2d32ff92
parent4892ab97637c3727834248aba19b0407439c1f5f (diff)
downloadsubplot-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.rs3
-rw-r--r--src/md.rs52
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<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.