]> git.r.bdr.sh - rbdr/page/commitdiff
Add logic to read and assign files / layout
authorRuben Beltran del Rio <redacted>
Sun, 16 Apr 2023 11:11:39 +0000 (13:11 +0200)
committerRuben Beltran del Rio <redacted>
Sun, 16 Apr 2023 11:11:45 +0000 (13:11 +0200)
README.gmi
src/file_finder.rs
src/file_handler/file_strategies/file.rs
src/file_handler/file_strategies/gemini.rs
src/file_handler/file_strategies/layout.rs
src/file_handler/mod.rs
src/main.rs

index 62390d4ce1a4d7472e5dcabb0b20d7ee125202f2..22d159f28a78fd4be450ea0b5c13596adb6ff590 100644 (file)
@@ -51,7 +51,9 @@ page expects a file called _layout.html in the root. It expects three placeholde
 
 ## Hidden folders
 
-Hidden folders get ignored, except for the .well-known folder.
+Hidden folders are copied as well, we only make an exception for `.git`, which
+is explicitly ignored. This is handy for folders like .well-known, but could
+cause unwanted behavior if there's other hidden files in the directory.
 
 ## What happens to files that aren't gemini?
 
index 598f8684155be33b02288045c51b4874ca674bc6..105a99928a0df5fd9b04921f275df189d22bc776 100644 (file)
@@ -2,8 +2,8 @@ use crate::file_handler::{File, FileHandler};
 use std::fs::read_dir;
 use std::path::PathBuf;
 
-pub fn find_files(directory_path: PathBuf) -> Vec<File> {
-    return find_files_recursively(&directory_path, &directory_path);
+pub fn find_files(directory_path: &PathBuf) -> Vec<File> {
+    return find_files_recursively(directory_path, directory_path);
 }
 
 fn find_files_recursively(root_path: &PathBuf, directory_path: &PathBuf) -> Vec<File> {
@@ -13,7 +13,7 @@ fn find_files_recursively(root_path: &PathBuf, directory_path: &PathBuf) -> Vec<
     for entry in entries {
         let path = entry.unwrap().path();
         let relative_path = path.strip_prefix(&root_path).unwrap();
-        if relative_path.starts_with(".") && !relative_path.starts_with(".well-known") {
+        if relative_path.starts_with(".git") {
             continue;
         }
         if path.is_dir() {
index c9e8c9654816fbb24ea130136f8e650c6244bdd7..b1de596f110e70060b89517f09a8969714b1d341 100644 (file)
@@ -2,7 +2,7 @@ pub struct Strategy {}
 
 use std::path::PathBuf;
 
-use crate::file_handler::{FileType, FileHandlerStrategy};
+use crate::file_handler::{File, FileType, FileHandlerStrategy};
 
 impl FileHandlerStrategy for Strategy {
     fn is(&self, path: &PathBuf) -> bool {
@@ -13,11 +13,14 @@ impl FileHandlerStrategy for Strategy {
         FileType::File
     }
 
-    fn can_handle(&self, path: &PathBuf) -> bool {
-        self.is(path)
+    fn can_handle(&self, file_type: &FileType) -> bool {
+        match file_type {
+            FileType::File => true,
+            _ => false,
+        }
     }
 
-    fn handle(&self, path: &PathBuf) {
-        println!("Should copy {}", path.display())
+    fn handle(&self, file: &File) {
+        println!("Should copy {}", file.path.display())
     }
 }
index ffa2a9f1e8a0930cafa1f6f691f710ca80f8f53f..905e1a9f07ecd7ba9a2dcc3efb07e928bfbaafb6 100644 (file)
@@ -2,7 +2,7 @@ pub struct Strategy {}
 
 use std::path::PathBuf;
 
-use crate::file_handler::{FileType, FileHandlerStrategy};
+use crate::file_handler::{File, FileType, FileHandlerStrategy};
 
 impl FileHandlerStrategy for Strategy {
     fn is(&self, path: &PathBuf) -> bool {
@@ -16,11 +16,14 @@ impl FileHandlerStrategy for Strategy {
         FileType::Gemini
     }
 
-    fn can_handle(&self, path: &PathBuf) -> bool {
-        self.is(path)
+    fn can_handle(&self, file_type: &FileType) -> bool {
+        match file_type {
+            FileType::Gemini => true,
+            _ => false,
+        }
     }
 
-    fn handle(&self, path: &PathBuf) {
-        println!("Should convert {}", path.display())
+    fn handle(&self, file: &File) {
+        println!("Should parse and copy {}", file.path.display())
     }
 }
index cf1bb9ff9a7f86b3511093cd1ec43cba1f55ba51..bac105994c3280abe39cea202f0d29af054317ae 100644 (file)
@@ -2,7 +2,7 @@ pub struct Strategy {}
 
 use std::path::PathBuf;
 
-use crate::file_handler::{FileType, FileHandlerStrategy};
+use crate::file_handler::{File, FileType, FileHandlerStrategy};
 
 impl FileHandlerStrategy for Strategy {
     fn is(&self, path: &PathBuf) -> bool {
@@ -13,12 +13,12 @@ impl FileHandlerStrategy for Strategy {
         FileType::Layout
     }
 
-    fn can_handle(&self, path: &PathBuf) -> bool {
-        self.is(path)
+    fn can_handle(&self, file_type: &FileType) -> bool {
+        match file_type {
+            FileType::Layout => true,
+            _ => false,
+        }
     }
 
-    fn handle(&self, path: &PathBuf) {
-        println!("Should convert {}", path.display())
-    }
+    fn handle(&self, _file: &File) {}
 }
-
index 44fec6db5589df43d12f6767f5eee687215b4b18..53aaba9d3011e5d33149e5ce8834c06145c54237 100644 (file)
@@ -5,9 +5,11 @@ use file_strategies::gemini::Strategy as GeminiStrategy;
 use file_strategies::layout::Strategy as LayoutStrategy;
 
 use std::path::PathBuf;
+use std::fs::read_to_string;
 
 pub struct FileHandler {
-   pub strategies: Vec<Box<dyn FileHandlerStrategy>>
+   pub strategies: Vec<Box<dyn FileHandlerStrategy>>,
+   pub layout: Option<String>
 }
 
 impl Default for FileHandler {
@@ -17,7 +19,8 @@ impl Default for FileHandler {
                 Box::new(GeminiStrategy{}),
                 Box::new(LayoutStrategy{}),
                 Box::new(FileStrategy{}),
-            ]
+            ],
+            layout: None
         }
     }
 }
@@ -32,10 +35,30 @@ impl FileHandler {
         FileType::Unknown
     }
 
-    pub fn handle(&self, path: &PathBuf) {
+    pub fn get_layout_or_panic(&mut self, files: &Vec<File>) {
+        for file in files {
+            match file.file_type {
+                FileType::Layout => {
+                    let layout_text = read_to_string(&file.path).unwrap();
+                    self.layout = Some(layout_text);
+                    return;
+                },
+                _ => {}
+            }
+        }
+        panic!("No layout found. Please ensure there's a _layout.html file at the root");
+    }
+
+    pub fn handle_all(&self, source: &PathBuf, destination: &PathBuf, files: &Vec<File>) {
+        for file in files {
+            self.handle(source, destination, file);
+        }
+    }
+
+    pub fn handle(&self, source: &PathBuf, destination: &PathBuf, file: &File) {
         for strategy in self.strategies.iter() {
-            if strategy.can_handle(path) {
-                return strategy.handle(path);
+            if strategy.can_handle(&file.file_type) {
+                return strategy.handle(file);
             }
         }
     }
@@ -44,8 +67,8 @@ impl FileHandler {
 pub trait FileHandlerStrategy {
     fn is(&self, path: &PathBuf) -> bool;
     fn identify(&self) -> FileType;
-    fn can_handle(&self, path: &PathBuf) -> bool;
-    fn handle(&self, path: &PathBuf);
+    fn can_handle(&self, file_type: &FileType) -> bool;
+    fn handle(&self, file: &File);
 }
 
 pub enum FileType {
index 4b8a79f42a71cc030c5658c200f7fc1fca1e15b0..e04da8abb815f787d599ef457fe23c70b7a0d6d2 100644 (file)
@@ -2,16 +2,38 @@ mod gemini_parser;
 mod file_finder;
 mod file_handler;
 
+use std::io::Result;
 use std::env::current_dir;
+use std::fs::create_dir_all;
 
 use crate::gemini_parser::parse;
 use crate::file_finder::find_files;
+use crate::file_handler::FileHandler;
 
-fn main() {
+fn main() -> Result<()> {
     let gemini_source = "# Test\n## 2nd H\na line\n another line\n```\npreformat\n=> preformat\n```\n=> http://lol.com\n=> http://lol.com lol\n* lol\nbla\n* lol\n* lmao\n> blabla\n> blabla";
     let html = parse(gemini_source);
     println!("{}", html);
 
-    let files = find_files(current_dir().unwrap());
+    let source = current_dir()?;
+    let source_name = source.file_name().unwrap().to_string_lossy();
+    let parent = source.parent().unwrap();
+    let destination_name = format!("{}_html", source_name);
+    let destination = parent.join(destination_name);
+
+    // Step 1. Identify the files
+    let files = find_files(&source);
+
+    // Step 2. Prepare the target priority
+    create_dir_all(&destination)?;
+
     println!("Found {} files", files.len());
+
+    // Step 3. Load the layout
+    let mut file_handler = FileHandler::default();
+    file_handler.get_layout_or_panic(&files);
+
+    // Step 4. Process all files
+    file_handler.handle_all(&source, &destination, &files);
+    Ok(())
 }