]> git.huck.website - metaforge.git/commitdiff
edited: pandoc header to run on pattern files
authorHuck Boles <huck@huck.website>
Wed, 31 May 2023 21:24:42 +0000 (16:24 -0500)
committerHuck Boles <huck@huck.website>
Wed, 31 May 2023 21:24:42 +0000 (16:24 -0500)
files/README/source/docs/header.meta
files/README/source/index.meta
files/test_site/pattern/test/pandoc.meta [new file with mode: 0644]
files/test_site/source/unit_tests/header/expandoc.meta [new file with mode: 0644]
src/lib.rs
src/metafile/file.rs
src/metafile/file/patterns.rs
src/metafile/file/source.rs
src/metafile/header.rs
src/tests.rs

index 5df7eb2b6ddc6ccb8d3e370b203160072107d592..48dca529078b89feee5146287654797281c27f94 100644 (file)
@@ -37,12 +37,12 @@ normal definition blocks.
 - blank = **BOOL** - if true, stops parsing and returns an empty string
 - panic_default = **BOOL** - if true, panics on an undefined default pattern
 - panic_undefined = **BOOL** - if true, panics on an undefined variable or array
+- source = **STRING** - change the the filetype of the source file
+- filetype = **STRING** - change the filetype of the output file
 - equal_arrays = **BOOL** - if true, panics if arrays in the same pattern have different sizes
+- pandoc = **BOOL** - toggles if pandoc is ran on this file to convert between filetypes, defaults to *true* in **source** dir, and *false* in **pattern** dir.
 
 ### source
 
 - ignore = **BOOL** - stops parsing and skips this file, useful for ignoring directories with scoped definitions
-- source = **STRING** - change the the filetype of the source file
-- filetype = **STRING** - change the filetype of the output file
-- pandoc = **BOOL** - toggles if pandoc is ran on this file to convert between filetypes
 - copy_only = **BOOL** - copys file or directory without processing anything
index 34fde86c538d8a92daba618099c3283b8cd036dd..dfbb4bd31d219bcb1bed322c592c029f321aef01 100644 (file)
@@ -25,8 +25,9 @@ you rebuild it.
 
 - spaces are correctly preserved between directly adjacent substitutions
 - copy_only header directive
+- pandoc header now works on pattern files
 
 ## versions
-- 0.1.3: grammar update
+- 0.1.3: grammar update, new header directives
 - 0.1.2: multithreading
 - 0.1.1: initial release
diff --git a/files/test_site/pattern/test/pandoc.meta b/files/test_site/pattern/test/pandoc.meta
new file mode 100644 (file)
index 0000000..6d3869a
--- /dev/null
@@ -0,0 +1,3 @@
+#{ pandoc = true }
+
+# GOOD
diff --git a/files/test_site/source/unit_tests/header/expandoc.meta b/files/test_site/source/unit_tests/header/expandoc.meta
new file mode 100644 (file)
index 0000000..aa6c241
--- /dev/null
@@ -0,0 +1,3 @@
+&{test = 'pandoc'}
+
+source
index 1f341057ef98043d89212ae7b63a3b8f849131df..696d5eb0ada24f6934fe759b76c4ac3489029021 100644 (file)
@@ -83,7 +83,7 @@ pub fn single_file(opts: &Options) -> Result<String> {
         })),
     }?;
 
-    let file = parse_string(source, opts)?;
+    let mut file = parse_string(source, opts)?;
 
     Ok(file.construct()?)
 }
index 4e7a51b9c1dc30667983711c82c7861aeacb0daa..b86570942cca1a019d91c64fbb425a7261e6788a 100644 (file)
@@ -10,6 +10,7 @@ use pandoc::{InputFormat, InputKind, OutputFormat, OutputKind, Pandoc};
 use std::{collections::HashMap, path::PathBuf};
 
 use super::*;
+
 #[derive(Debug, Clone)]
 pub struct MetaFile<'a> {
     pub opts: &'a Options,
@@ -54,7 +55,7 @@ impl<'a> MetaFile<'a> {
         Ok(metafile)
     }
 
-    pub fn construct(&self) -> Result<String, Box<MetaError>> {
+    pub fn construct(&mut self) -> Result<String, Box<MetaError>> {
         log!(self.opts, format!("building {}", self.path.display()), 1);
 
         if self.header.blank {
@@ -70,7 +71,12 @@ impl<'a> MetaFile<'a> {
             return Err(Box::new(MetaError::Ignored));
         }
 
-        let html = self.to_html().map_err(MetaError::from)?;
+        let src_str: String;
+        if self.header.pandoc.map_or(true, |x| x) {
+            src_str = self.pandoc().map_err(MetaError::from)?;
+        } else {
+            src_str = self.get_source().map_err(MetaError::from)?;
+        }
 
         let pattern = self.get_pattern("base").map_err(MetaError::from)?;
         let mut base = parse_string(pattern, self.opts).map_err(|e| MetaError::ParserError {
@@ -79,7 +85,8 @@ impl<'a> MetaFile<'a> {
         })?;
 
         base.merge(self);
-        base.patterns.insert(Scope::create_global("SOURCE"), html);
+        base.patterns
+            .insert(Scope::create_global("SOURCE"), src_str);
         let mut base_path = self.opts.pattern.join("base").join(
             self.patterns
                 .get(&Scope::create_global("base"))
index d019484dc260d9e8583c91fa4493bae18bc3924e..f50fd6fbc25758416bed1d100a4a5a47ea09f852 100644 (file)
@@ -69,6 +69,10 @@ impl<'a> MetaFile<'a> {
         // copy over maps for expanding contained variables
         pattern.merge(self);
 
-        pattern.get_source()
+        if pattern.header.pandoc.unwrap_or(false) {
+            pattern.pandoc()
+        } else {
+            pattern.get_source()
+        }
     }
 }
index 6ffad587e85757090313f0d7c8edcac0d6260409..3aca3b4fb886f4bc0b031175319089f86a177cfb 100644 (file)
@@ -1,10 +1,10 @@
 use super::*;
 
 impl<'a> MetaFile<'a> {
-    pub fn to_html(&self) -> Result<String> {
+    pub fn pandoc(&mut self) -> Result<String> {
         let string = self.get_source()?;
 
-        if self.opts.no_pandoc || !self.header.pandoc || string.is_empty() {
+        if self.opts.no_pandoc || string.is_empty() {
             return Ok(string);
         }
 
@@ -28,6 +28,7 @@ impl<'a> MetaFile<'a> {
             .set_output_format(output, vec![]);
 
         if let pandoc::PandocOutput::ToBuffer(s) = pandoc.execute()? {
+            self.header.pandoc = Some(false);
             Ok(s)
         } else {
             Err(MetaError::Pandoc { file: self.name()? }.into())
index 7f88674369e89c8a52f4ebb61c613cefac2627e7..d99d5c4ae4f8c0780f1512107e1580c0d30accad 100644 (file)
@@ -8,7 +8,7 @@ pub struct Header {
     pub equal_arrays: bool,
     pub filetype: String,
     pub source: String,
-    pub pandoc: bool,
+    pub pandoc: Option<bool>,
     pub ignore: bool,
     pub copy_only: bool,
 }
@@ -22,7 +22,7 @@ impl Header {
             equal_arrays: false,
             filetype: String::from("html"),
             source: String::from("markdown"),
-            pandoc: true,
+            pandoc: None,
             ignore: false,
             copy_only: false,
         }
@@ -38,7 +38,7 @@ impl From<HashMap<String, String>> for Header {
                 "panic_default" => header.panic_default = val == "true",
                 "panic_undefined" => header.panic_undefined = val == "true",
                 "equal_arrays" => header.equal_arrays = val == "true",
-                "pandoc" => header.pandoc = val == "true",
+                "pandoc" => header.pandoc = Some(val == "true"),
                 "filetype" => header.filetype = val.to_string(),
                 "source" => header.source = val.to_string(),
                 "ignore" => header.ignore = val == "true",
index f265a7f419002ad7bdb3fd00871f4511ae9ae2db..b0086f6ddf7925738ee26dc4c8f5a06534b28b8a 100644 (file)
@@ -17,7 +17,7 @@ macro_rules! unit_test (
             let test_dir = opts.source.join("unit_tests");
             let mut path = test_dir.join($file);
             path.set_extension("meta");
-            let file = MetaFile::build(path, &opts)?;
+            let mut file = MetaFile::build(path, &opts)?;
 
             let str = match file.construct() {
                 Ok(f) => f,
@@ -50,7 +50,7 @@ macro_rules! panic_test (
             let test_dir = opts.source.join("unit_tests");
             let mut path = test_dir.join($file);
             path.set_extension("meta");
-            let file = MetaFile::build(path, &opts).unwrap();
+            let mut file = MetaFile::build(path, &opts).unwrap();
             assert_eq!(file.construct().unwrap(), $test);
         }
     };
@@ -141,6 +141,12 @@ unit_test!(
     r#"variable: ${this} should get copied verbatim"#
 );
 
+unit_test!(
+    expandoc,
+    "header/expandoc",
+    "<html>\n<h1 id=\"good\">GOOD</h1>\n\n\n</html>\n"
+);
+
 panic_test!(ignore, "ignore.meta", "");
 
 #[test]