From b018457e54c66862f163cb5aacbca71a3321c9ae Mon Sep 17 00:00:00 2001 From: Gaurav Date: Tue, 2 Aug 2022 20:44:10 -0400 Subject: Add support for readme rendering --- Cargo.lock | 18 ++++++++++++++++++ Cargo.toml | 2 ++ src/listing.rs | 8 +++++++- src/renderer.rs | 9 +++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 54b5b99..3d106ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1360,6 +1360,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" +[[package]] +name = "markdown" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef3aab6a1d529b112695f72beec5ee80e729cb45af58663ec902c8fac764ecdd" +dependencies = [ + "lazy_static", + "pipeline", + "regex", +] + [[package]] name = "markup5ever" version = "0.10.1" @@ -1462,6 +1473,7 @@ dependencies = [ "httparse", "libflate", "log", + "markdown", "maud", "mime", "nanoid", @@ -1761,6 +1773,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pipeline" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d15b6607fa632996eb8a17c9041cb6071cb75ac057abd45dece578723ea8c7c0" + [[package]] name = "port_check" version = "0.1.5" diff --git a/Cargo.toml b/Cargo.toml index 6037d87..4c91032 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,6 +55,8 @@ tar = "0.4" thiserror = "1" yansi = "0.5" zip = { version = "0.6.2", default-features = false } +get_if_addrs = "0.5" +markdown = "0.3.0" [features] default = ["tls"] diff --git a/src/listing.rs b/src/listing.rs index 25f50fa..3c77c14 100644 --- a/src/listing.rs +++ b/src/listing.rs @@ -232,6 +232,7 @@ pub fn directory_listing( } let mut entries: Vec = Vec::new(); + let mut readme: Option = None; for entry in dir.path.read_dir()? { if dir.is_visible(&entry) || conf.show_hidden { @@ -275,13 +276,17 @@ pub fn directory_listing( )); } else if metadata.is_file() { entries.push(Entry::new( - file_name, + file_name.clone(), EntryType::File, file_url, Some(ByteSize::b(metadata.len())), last_modification_date, symlink_dest, )); + // TODO: Pattern match, or user arg for readme name? + if file_name.to_lowercase() == "readme.md"{ + readme = Some(file_name); + } } } else { continue; @@ -372,6 +377,7 @@ pub fn directory_listing( HttpResponse::Ok().content_type(mime::TEXT_HTML_UTF_8).body( renderer::page( entries, + readme, is_root, query_params, breadcrumbs, diff --git a/src/renderer.rs b/src/renderer.rs index 75d2c71..775d7c8 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -5,6 +5,7 @@ use clap::{crate_name, crate_version}; use maud::{html, Markup, PreEscaped, DOCTYPE}; use std::time::SystemTime; use strum::IntoEnumIterator; +use std::path::Path; use crate::auth::CurrentUser; use crate::listing::{Breadcrumb, Entry, QueryParameters, SortingMethod, SortingOrder}; @@ -13,6 +14,7 @@ use crate::{archive::ArchiveMethod, MiniserveConfig}; /// Renders the file listing pub fn page( entries: Vec, + readme: Option, is_root: bool, query_params: QueryParameters, breadcrumbs: Vec, @@ -165,6 +167,13 @@ pub fn page( } } } + @if readme.is_some() { + div { + h3 { (readme.as_ref().unwrap()) } + (PreEscaped + (markdown::file_to_html(Path::new(&readme.unwrap())).unwrap())); + } + } a.back href="#top" { (arrow_up()) } -- cgit v1.2.3