]> git.huck.website - metaforge.git/commitdiff
builds html file from metafile
authorHuck Boles <huck@huck.website>
Wed, 10 May 2023 16:22:28 +0000 (11:22 -0500)
committerHuck Boles <huck@huck.website>
Wed, 10 May 2023 16:22:28 +0000 (11:22 -0500)
.gitignore
src/filetype/builder.rs
src/filetype/structs.rs
test_site/source/expand_html.meta [new file with mode: 0644]
tests/files/expanded_html
tests/metafile_builder.rs

index ea8c4bf7f35f6f77f75d92ad8ce8349f6e81ddba..17e283cd95005e5c428249ba54d5865f60c22681 100644 (file)
@@ -1 +1,2 @@
 /target
+/test_site/site
index d9eb1d63c9ed53abf067bd6de621c23c8e87f1cb..5dbdaa2839a62fbe3da5586df8f12f3b0c6e4a0d 100644 (file)
@@ -8,15 +8,14 @@ use std::{
 };
 
 pub fn build_metafile(path: &Path, dirs: &RootDirs) -> Result<()> {
-    eprintln!("{:?}", path);
     let file = fs::read_to_string(path)?;
     let file = parse_file(&file)?;
 
+    let html = get_source_html(&file, dirs)?;
+
     let pattern = get_pattern("base", &file, dirs)?;
     let mut base = parse_file(&pattern)?;
 
-    let html = get_source_html(&file, dirs)?;
-
     base.variables = file.variables;
     base.arrays = file.arrays;
     base.patterns = file.patterns;
@@ -25,7 +24,8 @@ pub fn build_metafile(path: &Path, dirs: &RootDirs) -> Result<()> {
 
     let output = metafile_to_string(&base, dirs, Some("base"))?;
 
-    fs::write(find_dest(path, dirs)?, output)?;
+    // want newline to end file
+    fs::write(find_dest(path, dirs)?, output + "\n")?;
     Ok(())
 }
 
@@ -93,7 +93,20 @@ fn get_pattern(key: &str, file: &MetaFile, dirs: &RootDirs) -> Result<String> {
         return Ok(source.to_string());
     }
 
+    // anything not defined should have a default.meta file to fall back to
     let mut filename = file.get_pat(key).unwrap_or("default");
+
+    // if we're building from base pattern we need to wait on
+    // parsing/expansion so we can build and convert source to html
+    // we just want to return the string right now
+    if key == "base" {
+        let pattern_path = key.to_string() + "/" + filename;
+        let mut path = dirs.pattern.join(pattern_path);
+        path.set_extension("meta");
+
+        return Ok(fs::read_to_string(path.to_str().unwrap_or_default())?);
+    }
+
     // BLANK returns nothing, so no more processing needs to be done
     if filename == "BLANK" {
         return Ok(String::new());
@@ -119,12 +132,16 @@ fn get_pattern(key: &str, file: &MetaFile, dirs: &RootDirs) -> Result<String> {
 }
 
 fn find_dest(path: &Path, dirs: &RootDirs) -> Result<PathBuf> {
-    let path = path.to_string_lossy().to_string().replace(
-        dirs.source.to_str().unwrap_or_default(),
-        dirs.build.to_str().unwrap_or_default(),
-    );
+    let source = dirs.source.to_string_lossy().to_string();
+    let build = dirs.build.to_string_lossy().to_string();
+
+    let path = path.canonicalize()?.to_string_lossy().to_string();
+    let path = path.replace(&source, &build);
+    let mut path = PathBuf::from(path);
+
+    path.set_extension("html");
 
-    Ok(PathBuf::from(path).canonicalize()?)
+    Ok(path)
 }
 
 fn expand_arrays(output: String, file: &MetaFile, name: Option<&str>) -> Result<String> {
@@ -142,12 +159,13 @@ fn expand_arrays(output: String, file: &MetaFile, name: Option<&str>) -> Result<
         // make a hash map of [keys in source] -> [defined arrays]
         .map(|array| {
             let key: String;
+            // concat array to pattern name to get key in HashMap
             if let Some(name) = name {
                 key = name.to_owned() + "." + array;
             } else {
+                // keys for arrays in this file don't have a preceding pattern
                 key = array.to_string();
             }
-            // let key = dbg!(name.unwrap_or_default().to_owned() + "." + array);
             let value = file.get_arr(&key).unwrap_or_default();
             (*array, value)
         })
index a6db5fdd3b7d6b744098880679dc8e70bd69c9eb..60d293c9052aa3bb6a0b630b0bd2b4dd03ec963b 100644 (file)
@@ -23,6 +23,7 @@ pub enum Substitution<'a> {
 
 #[derive(Debug, Clone, Default)]
 pub struct RootDirs {
+    pub root: PathBuf,
     pub source: PathBuf,
     pub build: PathBuf,
     pub pattern: PathBuf,
@@ -31,6 +32,7 @@ pub struct RootDirs {
 impl RootDirs {
     pub fn new() -> Self {
         Self {
+            root: PathBuf::new(),
             source: PathBuf::new(),
             build: PathBuf::new(),
             pattern: PathBuf::new(),
diff --git a/test_site/source/expand_html.meta b/test_site/source/expand_html.meta
new file mode 100644 (file)
index 0000000..2643a44
--- /dev/null
@@ -0,0 +1,19 @@
+${
+    var = 'GOOD'
+}
+
+@{
+    test.arr = ["GOOD", 'GOOD GOOD']
+}
+
+&{
+    test = 'array'
+}
+
+## This is a test
+
+<p>Inline html</p>
+
+variable: ${var}
+
+pattern: &{test}
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0a9c518632ebd5b63ee697eb1ed00398fd107972 100644 (file)
@@ -0,0 +1,14 @@
+<body>
+<h2 id="this-is-a-test">This is a test</h2>
+<p>
+Inline html
+</p>
+variable: GOOD pattern:
+<p>
+GOOD
+</p>
+<p>
+GOOD GOOD
+</p>
+
+</body>
index fd1da34ff6b23862f1483d63caa07529022d34ad..ff1350f1eb14836a16f6d130f8618a9d02100f69 100644 (file)
@@ -4,9 +4,10 @@ use pretty_assertions::assert_eq;
 use std::{fs, path::PathBuf};
 
 static PRE_EXPAND: &str = include_str!("../test_site/source/expand.meta");
-static POST_EXPAND: &str = include_str!("./files/expanded");
+static POST_EXPAND: &str = include_str!("files/expanded");
 
 #[test]
+#[ignore = "don't want to interfere with builder right now"]
 fn test_metafile_to_str() -> Result<()> {
     let metafile = parse_file(PRE_EXPAND)?;
     let dirs = build_rootdir()?;
@@ -20,13 +21,12 @@ fn test_metafile_to_str() -> Result<()> {
 }
 
 #[test]
-#[ignore = "use different source file than expanded"]
 fn test_metafile_builder() -> Result<()> {
     let dirs = build_rootdir()?;
     let path = PathBuf::from("test_site/source/expand_html.meta");
     build_metafile(&path, &dirs)?;
-    let source = fs::read_to_string("../test_site/site/expand_html.html")?;
-    let html = fs::read_to_string("./files/expand_html")?;
+    let source = fs::read_to_string("test_site/site/expand_html.html")?;
+    let html = fs::read_to_string("tests/files/expanded_html")?;
 
     assert_eq!(source, html);
 
@@ -37,13 +37,14 @@ fn build_rootdir() -> Result<RootDirs> {
     let dir = PathBuf::from("./test_site").canonicalize()?;
 
     let dirs = RootDirs {
+        root: dir.clone(),
         source: dir.join("source"),
         build: dir.join("site"),
         pattern: dir.join("pattern"),
     };
 
     if dirs.build.exists() {
-        fs::remove_dir(&dirs.build)?;
+        fs::remove_dir_all(&dirs.build)?;
     }
     fs::create_dir(&dirs.build)?;