aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRuben Beltran del Rio <ruben@unlimited.pizza>2023-04-18 19:14:40 +0200
committerRuben Beltran del Rio <ruben@unlimited.pizza>2023-04-18 19:14:40 +0200
commitdd0a540c2002f479ac56a7e0169e86d0f6f14d85 (patch)
treea50d034305cee8a92bf86cfffee859ee4f80349c /src
parent160a27bd2aa334a881f7c54847ef406925f87633 (diff)
Generate gemini and html separately
Diffstat (limited to 'src')
-rw-r--r--src/file_handler/file_strategies/file.rs22
-rw-r--r--src/file_handler/file_strategies/gemini.rs30
-rw-r--r--src/file_handler/file_strategies/layout.rs3
-rw-r--r--src/file_handler/mod.rs13
-rw-r--r--src/main.rs16
5 files changed, 66 insertions, 18 deletions
diff --git a/src/file_handler/file_strategies/file.rs b/src/file_handler/file_strategies/file.rs
index 8eafdaa..2346128 100644
--- a/src/file_handler/file_strategies/file.rs
+++ b/src/file_handler/file_strategies/file.rs
@@ -5,6 +5,16 @@ use std::fs::{copy, create_dir_all};
use crate::file_handler::{File, FileType, FileHandlerStrategy};
+impl Strategy {
+ fn handle(&self, source: &PathBuf, destination: &PathBuf, file: &File) {
+ let relative_path = file.path.strip_prefix(&source).unwrap();
+ let complete_destination = destination.join(relative_path);
+ let destination_parent = complete_destination.parent().unwrap();
+ create_dir_all(destination_parent).unwrap();
+ copy(&file.path, &complete_destination).unwrap();
+ }
+}
+
impl FileHandlerStrategy for Strategy {
fn is(&self, path: &PathBuf) -> bool {
!path.is_dir()
@@ -21,11 +31,11 @@ impl FileHandlerStrategy for Strategy {
}
}
- fn handle(&self, source: &PathBuf, destination: &PathBuf, file: &File, _l: &String) {
- let relative_path = file.path.strip_prefix(&source).unwrap();
- let complete_destination = destination.join(relative_path);
- let destination_parent = complete_destination.parent().unwrap();
- create_dir_all(destination_parent).unwrap();
- copy(&file.path, &complete_destination).unwrap();
+ fn handle_html(&self, source: &PathBuf, destination: &PathBuf, file: &File, _l: &String) {
+ return self.handle(source, destination, file);
+ }
+
+ fn handle_gemini(&self, source: &PathBuf, destination: &PathBuf, file: &File) {
+ return self.handle(source, destination, file);
}
}
diff --git a/src/file_handler/file_strategies/gemini.rs b/src/file_handler/file_strategies/gemini.rs
index 1c8a111..977464c 100644
--- a/src/file_handler/file_strategies/gemini.rs
+++ b/src/file_handler/file_strategies/gemini.rs
@@ -44,7 +44,7 @@ impl FileHandlerStrategy for Strategy {
}
}
- fn handle(&self, source: &PathBuf, destination: &PathBuf, file: &File, layout: &String) {
+ fn handle_html(&self, source: &PathBuf, destination: &PathBuf, file: &File, layout: &String) {
let gemini_contents = read_to_string(&file.path).unwrap();
// Front matter extraction
@@ -83,4 +83,32 @@ impl FileHandlerStrategy for Strategy {
let mut destination_file = IOFile::create(&complete_destination).unwrap();
destination_file.write_all(generated_html.as_bytes()).unwrap();
}
+
+ fn handle_gemini(&self, source: &PathBuf, destination: &PathBuf, file: &File) {
+ let gemini_contents = read_to_string(&file.path).unwrap();
+
+ // Front matter extraction
+ let lines: Vec<&str> = gemini_contents.split("\n").collect();
+ let mut lines_found = 0;
+ for line in lines[..2].iter() {
+ if self.is_title(&line) {
+ lines_found = lines_found + 1;
+ continue;
+ }
+ if self.is_description(&line) {
+ lines_found = lines_found + 1;
+ continue;
+ }
+ }
+
+ let gemini_source = lines[lines_found..].join("\n");
+
+ let relative_path = file.path.strip_prefix(&source).unwrap();
+ let complete_destination = destination.join(relative_path);
+ let destination_parent = complete_destination.parent().unwrap();
+ create_dir_all(destination_parent).unwrap();
+
+ let mut destination_file = IOFile::create(&complete_destination).unwrap();
+ destination_file.write_all(gemini_source.as_bytes()).unwrap();
+ }
}
diff --git a/src/file_handler/file_strategies/layout.rs b/src/file_handler/file_strategies/layout.rs
index 793b460..f51bf7a 100644
--- a/src/file_handler/file_strategies/layout.rs
+++ b/src/file_handler/file_strategies/layout.rs
@@ -22,5 +22,6 @@ impl FileHandlerStrategy for Strategy {
// We don't implement handling for layout, as we assume there's only one
// and it got handled before.
- fn handle(&self, _s: &PathBuf, _d: &PathBuf, _f: &File, _l: &String) {}
+ fn handle_html(&self, _s: &PathBuf, _d: &PathBuf, _f: &File, _l: &String) {}
+ fn handle_gemini(&self, _s: &PathBuf, _d: &PathBuf, _f: &File) {}
}
diff --git a/src/file_handler/mod.rs b/src/file_handler/mod.rs
index 4932ef1..9a0133a 100644
--- a/src/file_handler/mod.rs
+++ b/src/file_handler/mod.rs
@@ -49,17 +49,19 @@ impl FileHandler {
Err("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>) {
+ pub fn handle_all(&self, source: &PathBuf, html_destination: &PathBuf, gemini_destination: &PathBuf, files: &Vec<File>) {
for file in files {
- self.handle(source, destination, file);
+ self.handle(source, html_destination, gemini_destination, file);
}
}
- pub fn handle(&self, source: &PathBuf, destination: &PathBuf, file: &File) {
+ pub fn handle(&self, source: &PathBuf, html_destination: &PathBuf, gemini_destination: &PathBuf, file: &File) {
for strategy in self.strategies.iter() {
if strategy.can_handle(&file.file_type) {
let layout = self.layout.as_ref().unwrap();
- return strategy.handle(source, destination, file, layout);
+ strategy.handle_html(source, html_destination, file, layout);
+ strategy.handle_gemini(source, gemini_destination, file);
+ return;
}
}
}
@@ -69,7 +71,8 @@ pub trait FileHandlerStrategy {
fn is(&self, path: &PathBuf) -> bool;
fn identify(&self) -> FileType;
fn can_handle(&self, file_type: &FileType) -> bool;
- fn handle(&self, source: &PathBuf, destination: &PathBuf, file: &File, layout: &String);
+ fn handle_html(&self, source: &PathBuf, destination: &PathBuf, file: &File, layout: &String);
+ fn handle_gemini(&self, source: &PathBuf, destination: &PathBuf, file: &File);
}
pub enum FileType {
diff --git a/src/main.rs b/src/main.rs
index c6de435..fc085d8 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -14,17 +14,23 @@ fn main() -> Result<()> {
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);
+ let gemini_destination_name = format!("{}_gemini", source_name);
+ let gemini_destination = parent.join(gemini_destination_name);
+ let html_destination_name = format!("{}_html", source_name);
+ let html_destination = parent.join(html_destination_name);
// Step 1. Identify the files
let files = find_files(&source);
// Step 2. Prepare the target priority
- match remove_dir_all(&destination) {
+ match remove_dir_all(&html_destination) {
_ => {}
};
- create_dir_all(&destination)?;
+ create_dir_all(&html_destination)?;
+ match remove_dir_all(&gemini_destination) {
+ _ => {}
+ };
+ create_dir_all(&gemini_destination)?;
// Step 3. Load the layout
let mut file_handler = FileHandler::default();
@@ -37,6 +43,6 @@ fn main() -> Result<()> {
}
// Step 4. Process all files
- file_handler.handle_all(&source, &destination, &files);
+ file_handler.handle_all(&source, &html_destination, &gemini_destination, &files);
Ok(())
}