krik 0.1.27

A fast static site generator written in Rust with internationalization, theming, and modern web features
Documentation
use pathdiff::diff_paths;
use std::path::{Path, PathBuf};

pub fn calculate_relative_path(file_path: &str, target: &str) -> String {
    let current_path = PathBuf::from(file_path);
    let target_path = PathBuf::from(target.trim_start_matches('/'));

    let current_dir = current_path.parent().unwrap_or_else(|| Path::new(""));
    if let Some(relative_path) = diff_paths(&target_path, current_dir) {
        relative_path.to_string_lossy().replace('\\', "/")
    } else {
        target.trim_start_matches('/').to_string()
    }
}

pub fn determine_output_path(document_file_path: &str, output_dir: &Path) -> PathBuf {
    let mut path = PathBuf::from(document_file_path);
    path.set_extension("html");
    output_dir.join(path)
}

pub fn get_base_path(path: &Path) -> String {
    let stem = path
        .file_stem()
        .map(|s| s.to_string_lossy())
        .unwrap_or_default();
    let parent = path
        .parent()
        .map(|p| p.to_string_lossy())
        .unwrap_or_default();

    let base_stem = if let Some(dot_pos) = stem.rfind('.') {
        let (base, lang) = stem.split_at(dot_pos);
        if lang.len() == 3 && lang.chars().nth(1).unwrap_or('.') != '.' {
            base
        } else {
            &stem
        }
    } else {
        &stem
    };

    if parent.is_empty() {
        base_stem.to_string()
    } else {
        format!("{parent}/{base_stem}")
    }
}