Compare commits

..

No commits in common. "main" and "v0.1.2" have entirely different histories.
main ... v0.1.2

5 changed files with 56 additions and 32 deletions

31
Cargo.lock generated
View file

@ -690,6 +690,12 @@ dependencies = [
"percent-encoding", "percent-encoding",
] ]
[[package]]
name = "fs_extra"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c"
[[package]] [[package]]
name = "fsevent-sys" name = "fsevent-sys"
version = "4.1.0" version = "4.1.0"
@ -1291,6 +1297,15 @@ version = "1.70.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
[[package]]
name = "itertools"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
dependencies = [
"either",
]
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "1.0.15" version = "1.0.15"
@ -2637,9 +2652,21 @@ dependencies = [
"mio 1.0.4", "mio 1.0.4",
"pin-project-lite", "pin-project-lite",
"socket2", "socket2",
"tokio-macros",
"windows-sys 0.52.0", "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]] [[package]]
name = "tokio-tungstenite" name = "tokio-tungstenite"
version = "0.21.0" version = "0.21.0"
@ -2992,17 +3019,19 @@ dependencies = [
[[package]] [[package]]
name = "webdog" name = "webdog"
version = "0.1.3" version = "0.1.2"
dependencies = [ dependencies = [
"clap", "clap",
"color-eyre", "color-eyre",
"extract-frontmatter", "extract-frontmatter",
"eyre", "eyre",
"fs_extra",
"futures", "futures",
"grass", "grass",
"hotwatch", "hotwatch",
"html5ever 0.31.0", "html5ever 0.31.0",
"include_dir", "include_dir",
"itertools",
"kuchikiki", "kuchikiki",
"lol_html", "lol_html",
"minifier", "minifier",

View file

@ -6,18 +6,20 @@ license = "AGPL-3.0-or-later"
name = "webdog" name = "webdog"
readme = "README.md" readme = "README.md"
repository = "https://github.com/zyllian/webdog" repository = "https://github.com/zyllian/webdog"
version = "0.1.3" version = "0.1.2"
[dependencies] [dependencies]
clap = { version = "4", features = ["derive"] } clap = { version = "4", features = ["derive"] }
color-eyre = { version = "0.6", optional = true } color-eyre = { version = "0.6", optional = true }
extract-frontmatter = "4" extract-frontmatter = "4"
eyre = "0.6" eyre = "0.6"
fs_extra = "1.2"
futures = { version = "0.3", optional = true } futures = { version = "0.3", optional = true }
grass = { version = "0.13", default-features = false } grass = { version = "0.13", default-features = false }
hotwatch = { version = "0.5", optional = true } hotwatch = { version = "0.5", optional = true }
html5ever = "0.31" html5ever = "0.31"
include_dir = "0.7" include_dir = "0.7"
itertools = "0.14"
kuchikiki = "0.8.8-speedreader" kuchikiki = "0.8.8-speedreader"
lol_html = "2" lol_html = "2"
minifier = { version = "0.3", features = ["html"] } minifier = { version = "0.3", features = ["html"] }
@ -33,7 +35,10 @@ serde_yaml_ng = "0.10"
syntect = "5" syntect = "5"
tera = "1" tera = "1"
time = { version = "0.3", features = ["serde-human-readable"] } 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"] } url = { version = "2", features = ["serde"] }
walkdir = "2" walkdir = "2"
warp = { version = "0.3", optional = true } warp = { version = "0.3", optional = true }

View file

@ -2,15 +2,15 @@
use std::{collections::HashMap, path::PathBuf}; use std::{collections::HashMap, path::PathBuf};
use eyre::{Context, OptionExt, eyre}; use eyre::{eyre, Context, OptionExt};
use lol_html::{HtmlRewriter, Settings, element, html_content::ContentType}; use lol_html::{element, html_content::ContentType, HtmlRewriter, Settings};
use rayon::prelude::*; use rayon::prelude::*;
use serde::Serialize; use serde::Serialize;
use syntect::{highlighting::ThemeSet, parsing::SyntaxSet}; use syntect::{highlighting::ThemeSet, parsing::SyntaxSet};
use tera::Tera; use tera::Tera;
use url::Url; 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. /// Default path for static webdog resources included with the site build.
const WEBDOG_DEFAULT_PATH: &str = "webdog"; const WEBDOG_DEFAULT_PATH: &str = "webdog";
@ -161,7 +161,6 @@ impl SiteBuilder {
} }
/// Function to rewrite HTML wow. /// Function to rewrite HTML wow.
#[allow(clippy::too_many_arguments)]
pub fn rewrite_html( pub fn rewrite_html(
&self, &self,
html: String, html: String,
@ -170,7 +169,6 @@ impl SiteBuilder {
scripts: &[String], scripts: &[String],
styles: &[String], styles: &[String],
is_partial: bool, is_partial: bool,
webdog_path: &str,
) -> eyre::Result<String> { ) -> eyre::Result<String> {
use kuchikiki::traits::*; use kuchikiki::traits::*;
@ -259,9 +257,7 @@ impl SiteBuilder {
); );
} }
el.append( el.append(
&format!( r#"<script type="text/javascript" src="/webdog/webdog.js" defer></script>"#,
r#"<script type="text/javascript" src="/{webdog_path}/webdog.js" defer></script>"#
),
ContentType::Html, ContentType::Html,
); );
if self.serving { if self.serving {
@ -387,12 +383,6 @@ impl SiteBuilder {
&page_metadata.scripts, &page_metadata.scripts,
&page_metadata.styles, &page_metadata.styles,
page_metadata.is_partial, page_metadata.is_partial,
&self
.site
.config
.webdog_path
.clone()
.unwrap_or_else(|| WEBDOG_DEFAULT_PATH.to_string()),
)?; )?;
if let Some(data) = extra { if let Some(data) = extra {

View file

@ -1,4 +1,5 @@
use lol_html::{RewriteStrSettings, element}; use itertools::Itertools;
use lol_html::{element, RewriteStrSettings};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::{builder::SiteBuilder, resource::ResourceTemplateData}; use crate::{builder::SiteBuilder, resource::ResourceTemplateData};
@ -110,13 +111,11 @@ fn resource_list_outside(
) )
.map(|ts| (id, v, ts)) .map(|ts| (id, v, ts))
}) })
.map(|v| { .map_ok(|(id, v, ts)| ResourceTemplateData {
v.map(|(id, v, ts)| ResourceTemplateData {
resource: v, resource: v,
id: id.clone(), id: id.clone(),
readable_timestamp: ts, readable_timestamp: ts,
}) })
})
.collect::<eyre::Result<Vec<_>>>()?, .collect::<eyre::Result<Vec<_>>>()?,
})?, })?,
)?; )?;

View file

@ -4,16 +4,17 @@ use std::{
}; };
use eyre::Context; use eyre::Context;
use rss::{ChannelBuilder, ItemBuilder, validation::Validate}; use itertools::Itertools;
use rss::{validation::Validate, ChannelBuilder, ItemBuilder};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use time::{OffsetDateTime, format_description::well_known::Rfc2822}; use time::{format_description::well_known::Rfc2822, OffsetDateTime};
use crate::{ use crate::{
PageMetadata,
builder::SiteBuilder, builder::SiteBuilder,
frontmatter::FrontMatterRequired, frontmatter::FrontMatterRequired,
link_list::Link, link_list::Link,
util::{self, format_timestamp}, util::{self, format_timestamp},
PageMetadata,
}; };
/// Metadata for resources. /// 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 page_max = list.len() / items_per_page + (list.len() % items_per_page).min(1);
let mut previous = None; let mut previous = None;
let mut next; 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); next = (page + 1 != page_max).then_some(page + 2);
let out = builder.build_page_raw( let out = builder.build_page_raw(
PageMetadata { PageMetadata {
@ -328,7 +329,7 @@ impl ResourceBuilder {
}, },
"", "",
ResourceListTemplateData { ResourceListTemplateData {
resources: iter.to_vec(), resources: iter.copied().collect(),
tag, tag,
rss_enabled: config.rss.is_some(), rss_enabled: config.rss.is_some(),
page: page + 1, page: page + 1,
@ -371,7 +372,7 @@ impl ResourceBuilder {
// Build list of tags // Build list of tags
{ {
let mut links: Vec<_> = tags let links = tags
.iter() .iter()
.map(|(tag, data)| { .map(|(tag, data)| {
let count = data.len(); let count = data.len();
@ -383,9 +384,9 @@ impl ResourceBuilder {
count, count,
) )
}) })
.sorted_by(|(_, a), (_, b)| b.cmp(a))
.map(|(l, _)| l)
.collect(); .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( let out = crate::link_list::render_basic_link_list(
builder, builder,
&self.config.tag_list_template, &self.config.tag_list_template,