diff --git a/Cargo.lock b/Cargo.lock index 7949417..14e834d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -690,6 +690,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "fsevent-sys" version = "4.1.0" @@ -1291,6 +1297,15 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.15" @@ -2637,9 +2652,21 @@ dependencies = [ "mio 1.0.4", "pin-project-lite", "socket2", + "tokio-macros", "windows-sys 0.52.0", ] +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "tokio-tungstenite" version = "0.21.0" @@ -2992,17 +3019,19 @@ dependencies = [ [[package]] name = "webdog" -version = "0.1.3" +version = "0.1.2" dependencies = [ "clap", "color-eyre", "extract-frontmatter", "eyre", + "fs_extra", "futures", "grass", "hotwatch", "html5ever 0.31.0", "include_dir", + "itertools", "kuchikiki", "lol_html", "minifier", diff --git a/Cargo.toml b/Cargo.toml index 1148bfe..78542fe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,18 +6,20 @@ license = "AGPL-3.0-or-later" name = "webdog" readme = "README.md" repository = "https://github.com/zyllian/webdog" -version = "0.1.3" +version = "0.1.2" [dependencies] clap = { version = "4", features = ["derive"] } color-eyre = { version = "0.6", optional = true } extract-frontmatter = "4" eyre = "0.6" +fs_extra = "1.2" futures = { version = "0.3", optional = true } grass = { version = "0.13", default-features = false } hotwatch = { version = "0.5", optional = true } html5ever = "0.31" include_dir = "0.7" +itertools = "0.14" kuchikiki = "0.8.8-speedreader" lol_html = "2" minifier = { version = "0.3", features = ["html"] } @@ -33,7 +35,10 @@ serde_yaml_ng = "0.10" syntect = "5" tera = "1" time = { version = "0.3", features = ["serde-human-readable"] } -tokio = { version = "1", features = ["rt-multi-thread"], optional = true } +tokio = { version = "1", features = [ + "macros", + "rt-multi-thread", +], optional = true } url = { version = "2", features = ["serde"] } walkdir = "2" warp = { version = "0.3", optional = true } diff --git a/src/builder.rs b/src/builder.rs index 7ca49a6..d08a916 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -2,15 +2,15 @@ use std::{collections::HashMap, path::PathBuf}; -use eyre::{Context, OptionExt, eyre}; -use lol_html::{HtmlRewriter, Settings, element, html_content::ContentType}; +use eyre::{eyre, Context, OptionExt}; +use lol_html::{element, html_content::ContentType, HtmlRewriter, Settings}; use rayon::prelude::*; use serde::Serialize; use syntect::{highlighting::ThemeSet, parsing::SyntaxSet}; use tera::Tera; use url::Url; -use crate::{PageMetadata, ROOT_PATH, SASS_PATH, Site, resource::ResourceBuilder, util}; +use crate::{resource::ResourceBuilder, util, PageMetadata, Site, ROOT_PATH, SASS_PATH}; /// Default path for static webdog resources included with the site build. const WEBDOG_DEFAULT_PATH: &str = "webdog"; @@ -161,7 +161,6 @@ impl SiteBuilder { } /// Function to rewrite HTML wow. - #[allow(clippy::too_many_arguments)] pub fn rewrite_html( &self, html: String, @@ -170,7 +169,6 @@ impl SiteBuilder { scripts: &[String], styles: &[String], is_partial: bool, - webdog_path: &str, ) -> eyre::Result { use kuchikiki::traits::*; @@ -259,9 +257,7 @@ impl SiteBuilder { ); } el.append( - &format!( - r#""# - ), + r#""#, ContentType::Html, ); if self.serving { @@ -387,12 +383,6 @@ impl SiteBuilder { &page_metadata.scripts, &page_metadata.styles, page_metadata.is_partial, - &self - .site - .config - .webdog_path - .clone() - .unwrap_or_else(|| WEBDOG_DEFAULT_PATH.to_string()), )?; if let Some(data) = extra { diff --git a/src/extras.rs b/src/extras.rs index 60e1d93..94250bd 100644 --- a/src/extras.rs +++ b/src/extras.rs @@ -1,4 +1,5 @@ -use lol_html::{RewriteStrSettings, element}; +use itertools::Itertools; +use lol_html::{element, RewriteStrSettings}; use serde::{Deserialize, Serialize}; use crate::{builder::SiteBuilder, resource::ResourceTemplateData}; @@ -110,12 +111,10 @@ fn resource_list_outside( ) .map(|ts| (id, v, ts)) }) - .map(|v| { - v.map(|(id, v, ts)| ResourceTemplateData { - resource: v, - id: id.clone(), - readable_timestamp: ts, - }) + .map_ok(|(id, v, ts)| ResourceTemplateData { + resource: v, + id: id.clone(), + readable_timestamp: ts, }) .collect::>>()?, })?, diff --git a/src/resource.rs b/src/resource.rs index f04f8a3..a59a4f7 100644 --- a/src/resource.rs +++ b/src/resource.rs @@ -4,16 +4,17 @@ use std::{ }; use eyre::Context; -use rss::{ChannelBuilder, ItemBuilder, validation::Validate}; +use itertools::Itertools; +use rss::{validation::Validate, ChannelBuilder, ItemBuilder}; use serde::{Deserialize, Serialize}; -use time::{OffsetDateTime, format_description::well_known::Rfc2822}; +use time::{format_description::well_known::Rfc2822, OffsetDateTime}; use crate::{ - PageMetadata, builder::SiteBuilder, frontmatter::FrontMatterRequired, link_list::Link, util::{self, format_timestamp}, + PageMetadata, }; /// Metadata for resources. @@ -318,7 +319,7 @@ impl ResourceBuilder { let page_max = list.len() / items_per_page + (list.len() % items_per_page).min(1); let mut previous = None; let mut next; - for (page, iter) in list.chunks(items_per_page).enumerate() { + for (page, iter) in list.iter().chunks(items_per_page).into_iter().enumerate() { next = (page + 1 != page_max).then_some(page + 2); let out = builder.build_page_raw( PageMetadata { @@ -328,7 +329,7 @@ impl ResourceBuilder { }, "", ResourceListTemplateData { - resources: iter.to_vec(), + resources: iter.copied().collect(), tag, rss_enabled: config.rss.is_some(), page: page + 1, @@ -371,7 +372,7 @@ impl ResourceBuilder { // Build list of tags { - let mut links: Vec<_> = tags + let links = tags .iter() .map(|(tag, data)| { let count = data.len(); @@ -383,9 +384,9 @@ impl ResourceBuilder { count, ) }) + .sorted_by(|(_, a), (_, b)| b.cmp(a)) + .map(|(l, _)| l) .collect(); - links.sort_by(|(_, a), (_, b)| b.cmp(a)); - let links = links.into_iter().map(|(l, _)| l).collect(); let out = crate::link_list::render_basic_link_list( builder, &self.config.tag_list_template,