diff options
Diffstat (limited to 'src/md.rs')
-rw-r--r-- | src/md.rs | 38 |
1 files changed, 17 insertions, 21 deletions
@@ -7,6 +7,7 @@ use crate::{ use log::trace; 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}; @@ -20,21 +21,19 @@ use visitor::LintingVisitor; /// A parsed Markdown document. #[derive(Debug)] pub struct Markdown { - pandoc: Pandoc, + pandoc: RefCell<Pandoc>, } impl Markdown { fn new(pandoc: Pandoc) -> Self { - Self { pandoc } - } - - fn pandoc(&mut self) -> &mut Pandoc { - &mut self.pandoc + Self { + pandoc: RefCell::new(pandoc), + } } /// Set document metadata from subplot. pub fn set_metadata(&mut self, meta: &YamlMetadata) { - self.pandoc.meta = to_pandoc_meta(meta); + self.pandoc.borrow_mut().meta = to_pandoc_meta(meta); } /// JSON representation of Pandoc AST. @@ -44,17 +43,17 @@ impl Markdown { } /// Find problems. - pub fn lint(&mut self) -> Vec<SubplotError> { + pub fn lint(&self) -> Vec<SubplotError> { let mut linter = LintingVisitor::default(); - linter.walk_pandoc(self.pandoc()); + linter.walk_pandoc(&mut self.pandoc.borrow_mut()); linter.issues } /// Find included images. - pub fn images(&mut self) -> Vec<PathBuf> { + pub fn images(&self) -> Vec<PathBuf> { let mut names = vec![]; let mut visitor = visitor::ImageVisitor::new(); - visitor.walk_pandoc(self.pandoc()); + visitor.walk_pandoc(&mut self.pandoc.borrow_mut()); for x in visitor.images().iter() { names.push(x.to_path_buf()); } @@ -62,31 +61,28 @@ impl Markdown { } /// Find classes used for fenced blocks. - pub fn block_classes(&mut self) -> HashSet<String> { + pub fn block_classes(&self) -> HashSet<String> { let mut visitor = visitor::BlockClassVisitor::default(); - // Irritatingly we can't immutably visit the AST for some reason - // This clone() is expensive and unwanted, but I'm not sure how - // to get around it for now - visitor.walk_pandoc(self.pandoc()); + visitor.walk_pandoc(&mut self.pandoc.borrow_mut()); visitor.classes } /// Typeset. pub fn typeset(&mut self, style: Style, bindings: &Bindings) -> Vec<Warning> { let mut visitor = visitor::TypesettingVisitor::new(style, bindings); - visitor.walk_pandoc(self.pandoc()); + visitor.walk_pandoc(&mut self.pandoc.borrow_mut()); visitor.warnings().warnings().to_vec() } /// Find scenarios. - pub fn scenarios(&mut self) -> Result<Vec<Scenario>, SubplotError> { + pub fn scenarios(&self) -> Result<Vec<Scenario>, SubplotError> { trace!( "Metadata::scenarios: looking for scenarios: {:#?}", self.pandoc ); let mut visitor = visitor::StructureVisitor::new(); - visitor.walk_pandoc(self.pandoc()); + visitor.walk_pandoc(&mut self.pandoc.borrow_mut()); trace!( "Metadata::scenarios: visitor found {} elements: {:#?}", visitor.elements.len(), @@ -108,9 +104,9 @@ impl Markdown { } /// Find embedded files. - pub fn embedded_files(&mut self) -> EmbeddedFiles { + pub fn embedded_files(&self) -> EmbeddedFiles { let mut files = EmbeddedFiles::default(); - files.walk_pandoc(self.pandoc()); + files.walk_pandoc(&mut self.pandoc.borrow_mut()); files } } |