From 691ad922a2d46974ebca9623498f9e00f264b434 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Tue, 24 Apr 2018 19:46:16 +0200 Subject: [PATCH 01/74] cargo update --- Cargo.lock | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e79010da..3dd94178 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -153,7 +153,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "chrono" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", @@ -187,7 +187,7 @@ dependencies = [ name = "config" version = "0.1.0" dependencies = [ - "chrono 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "errors 0.1.0", "globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "highlighting 0.1.0", @@ -285,9 +285,9 @@ dependencies = [ "rust-stemmers 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.21 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", "strum 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "strum_macros 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "strum_macros 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -335,7 +335,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "front_matter" version = "0.1.0" dependencies = [ - "chrono 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "errors 0.1.0", "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -422,7 +422,7 @@ dependencies = [ name = "gutenberg" version = "0.3.4" dependencies = [ - "chrono 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)", "content 0.1.0", "ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -464,7 +464,7 @@ dependencies = [ [[package]] name = "httparse" -version = "1.2.4" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -478,7 +478,7 @@ version = "0.10.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -606,7 +606,7 @@ dependencies = [ "phf_codegen 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.21 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_codegen 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "tendril 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -935,7 +935,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "chrono 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1212,7 +1212,7 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1339,11 +1339,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "strum_macros" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1399,7 +1400,7 @@ dependencies = [ "regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.21 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "yaml-rust 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1458,7 +1459,7 @@ name = "tera" version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "chrono 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "humansize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1467,7 +1468,7 @@ dependencies = [ "pest_derive 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.21 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1704,7 +1705,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1759,7 +1760,7 @@ dependencies = [ "checksum bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7dd32989a66957d3f0cba6588f15d4281a733f4e9ffc43fcd2385f57d3bf99ff" "checksum cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "49ec142f5768efb5b7622aebc3fdbdbb8950a4b9ba996393cb76ef7466e8747d" "checksum cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "405216fd8fe65f718daa7102ea808a946b6ce40c742998fbfd3463645552de18" -"checksum chrono 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a81892f0d5a53f46fc05ef0b917305a81c13f1f13bb59ac91ff595817f0764b1" +"checksum chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6962c635d530328acc53ac6a955e83093fedc91c5809dfac1fa60fa470830a37" "checksum clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0f16b89cbb9ee36d87483dc939fe9f1e13c05898d56d7b230a0d4dff033a536" "checksum cmake 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "95470235c31c726d72bf2e1f421adc1e65b9d561bf5529612cbe1a72da1467b3" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" @@ -1785,7 +1786,7 @@ dependencies = [ "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "checksum globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "142754da2c9b3722affd909f9e27f2a6700a7a303f362971e0a74c652005a43d" "checksum html5ever 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b04478cf718862650a0bf66acaf8f2f8c906fbc703f35c916c1f4211b069a364" -"checksum httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c2f407128745b78abc95c0ffbe4e5d37427fdc0d45470710cfef8c44522a2e37" +"checksum httparse 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23801d98b42eed0318e5709b0527894ba7c3793d0236814618d6a9b6224152ff" "checksum humansize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6cab2627acfc432780848602f3f558f7e9dd427352224b0d9324025796d2a5e" "checksum hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)" = "368cb56b2740ebf4230520e2b90ebb0461e69034d85d1945febd9b3971426db2" "checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d" @@ -1867,7 +1868,7 @@ dependencies = [ "checksum sequence_trie 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "32157204e5c9d3c04007bd7e56e96e987635ce0e8e23c085b1e403861b76c351" "checksum serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)" = "e9a2d9a9ac5120e0f768801ca2b58ad6eec929dc9d1d616c162f208869c2ce95" "checksum serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)" = "0a90213fa7e0f5eac3f7afe2d5ff6b088af515052cc7303bd68c7e3b91a3fb79" -"checksum serde_json 1.0.21 (registry+https://github.com/rust-lang/crates.io-index)" = "eb40600c756f02d7ea34943626cefa85732fdae5f95b90b31f9797b3c526d1e6" +"checksum serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)" = "84b8035cabe9b35878adec8ac5fe03d5f6bc97ff6edd7ccb96b44c1276ba390e" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum shared_child 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bcd5e483b3475af9bc2a35311c2f3bbf0bd98fde91410ab15a0d4ba3c3127b4e" "checksum siphasher 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0df90a788073e8d0235a67e50441d47db7c8ad9debd91cbf43736a2a92d36537" @@ -1881,7 +1882,7 @@ dependencies = [ "checksum string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc" "checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" "checksum strum 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "099e21b5dd6dd07b5adcf8c4b723a7c0b7efd7a9359bf963d58c0caae8532545" -"checksum strum_macros 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0dd9bd569e88028750e3ae5c25616b8278ac16a8e61aba4339195c72396d49e1" +"checksum strum_macros 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1292d85e688e4696ecb69b2db2648994fb8af266974e89be53cefdf003861a5d" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" "checksum syn 0.13.11 (registry+https://github.com/rust-lang/crates.io-index)" = "14f9bf6292f3a61d2c716723fdb789a41bbe104168e6f496dc6497e531ea1b9b" "checksum syn 0.14.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c67da57e61ebc7b7b6fff56bb34440ca3a83db037320b0507af4c10368deda7d" From 3e6054a9ac4fee91a9d62afe9e988aa06b5b0c06 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Wed, 25 Apr 2018 10:28:23 +0200 Subject: [PATCH 02/74] tempdir -> tempfile --- Cargo.lock | 17 ++++++++++------- components/content/Cargo.toml | 2 +- components/content/src/lib.rs | 2 +- components/content/src/page.rs | 8 ++++---- components/rebuild/Cargo.toml | 2 +- components/rebuild/tests/rebuild.rs | 10 +++++----- components/site/Cargo.toml | 2 +- components/site/benches/render.rs | 14 +++++++------- components/site/benches/site.rs | 4 ++-- components/site/src/lib.rs | 2 +- components/site/tests/site.rs | 22 +++++++++++----------- components/utils/Cargo.toml | 2 +- components/utils/src/fs.rs | 4 ++-- components/utils/src/lib.rs | 2 +- 14 files changed, 48 insertions(+), 45 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3dd94178..9023ba27 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -208,7 +208,7 @@ dependencies = [ "rendering 0.1.0", "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", @@ -1040,7 +1040,7 @@ dependencies = [ "fs_extra 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "highlighting 0.1.0", "site 0.1.0", - "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1256,7 +1256,7 @@ dependencies = [ "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "taxonomies 0.1.0", - "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "templates 0.1.0", "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", @@ -1421,12 +1421,15 @@ dependencies = [ ] [[package]] -name = "tempdir" -version = "0.3.7" +name = "tempfile" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1640,7 +1643,7 @@ name = "utils" version = "0.1.0" dependencies = [ "errors 0.1.0", - "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1888,7 +1891,7 @@ dependencies = [ "checksum syn 0.14.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c67da57e61ebc7b7b6fff56bb34440ca3a83db037320b0507af4c10368deda7d" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" "checksum syntect 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc8a6f0db88d4afc340522c20d260411e746b2225b257c6b238a75de9d7cec78" -"checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" +"checksum tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "47776f63b85777d984a50ce49d6b9e58826b6a3766a449fc95bc66cd5663c15b" "checksum tendril 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9de21546595a0873061940d994bbbc5c35f024ae4fd61ec5c5b159115684f508" "checksum tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)" = "fc0624177c585227fee0c5021bd6be3a1acf66bdb6f412acb92373637aad728b" "checksum term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1" diff --git a/components/content/Cargo.toml b/components/content/Cargo.toml index 73aaabff..80cfec13 100644 --- a/components/content/Cargo.toml +++ b/components/content/Cargo.toml @@ -16,6 +16,6 @@ rendering = { path = "../rendering" } front_matter = { path = "../front_matter" } [dev-dependencies] -tempdir = "0.3" +tempfile = "3" toml = "0.4" globset = "0.4" diff --git a/components/content/src/lib.rs b/components/content/src/lib.rs index b3a45183..a0fddac4 100644 --- a/components/content/src/lib.rs +++ b/components/content/src/lib.rs @@ -10,7 +10,7 @@ extern crate rendering; extern crate utils; #[cfg(test)] -extern crate tempdir; +extern crate tempfile; #[cfg(test)] extern crate toml; #[cfg(test)] diff --git a/components/content/src/page.rs b/components/content/src/page.rs index 7b403244..b3cd820b 100644 --- a/components/content/src/page.rs +++ b/components/content/src/page.rs @@ -255,7 +255,7 @@ mod tests { use std::path::Path; use tera::Tera; - use tempdir::TempDir; + use tempfile::tempdir; use globset::{Glob, GlobSetBuilder}; use config::Config; @@ -387,7 +387,7 @@ Hello world #[test] fn page_with_assets_gets_right_info() { - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let path = tmp_dir.path(); create_dir(&path.join("content")).expect("create content temp dir"); create_dir(&path.join("content").join("posts")).expect("create posts temp dir"); @@ -413,7 +413,7 @@ Hello world #[test] fn page_with_assets_and_slug_overrides_path() { - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let path = tmp_dir.path(); create_dir(&path.join("content")).expect("create content temp dir"); create_dir(&path.join("content").join("posts")).expect("create posts temp dir"); @@ -439,7 +439,7 @@ Hello world #[test] fn page_with_ignored_assets_filters_out_correct_files() { - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let path = tmp_dir.path(); create_dir(&path.join("content")).expect("create content temp dir"); create_dir(&path.join("content").join("posts")).expect("create posts temp dir"); diff --git a/components/rebuild/Cargo.toml b/components/rebuild/Cargo.toml index a6ae5b70..b8f37e7d 100644 --- a/components/rebuild/Cargo.toml +++ b/components/rebuild/Cargo.toml @@ -11,5 +11,5 @@ content = { path = "../content" } site = { path = "../site" } [dev-dependencies] -tempdir = "0.3" +tempfile = "3" fs_extra = "1.1" diff --git a/components/rebuild/tests/rebuild.rs b/components/rebuild/tests/rebuild.rs index 9aeabfbc..12cdb415 100644 --- a/components/rebuild/tests/rebuild.rs +++ b/components/rebuild/tests/rebuild.rs @@ -1,6 +1,6 @@ extern crate rebuild; extern crate site; -extern crate tempdir; +extern crate tempfile; extern crate fs_extra; use std::env; @@ -8,7 +8,7 @@ use std::fs::{remove_dir_all, File}; use std::io::prelude::*; use fs_extra::dir; -use tempdir::TempDir; +use tempfile::tempdir; use site::Site; use rebuild::after_content_change; @@ -74,7 +74,7 @@ macro_rules! file_contains { #[test] fn can_rebuild_after_simple_change_to_page_content() { - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let (site_path, mut site) = load_and_build_site!(tmp_dir); let file_path = edit_file!(site_path, "content/rebuild/first.md", br#" +++ @@ -92,7 +92,7 @@ Some content"#); #[test] fn can_rebuild_after_title_change_page_global_func_usage() { - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let (site_path, mut site) = load_and_build_site!(tmp_dir); let file_path = edit_file!(site_path, "content/rebuild/first.md", br#" +++ @@ -110,7 +110,7 @@ date = 2017-01-01 #[test] fn can_rebuild_after_sort_change_in_section() { - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let (site_path, mut site) = load_and_build_site!(tmp_dir); let file_path = edit_file!(site_path, "content/rebuild/_index.md", br#" +++ diff --git a/components/site/Cargo.toml b/components/site/Cargo.toml index 2299932f..eb70efa8 100644 --- a/components/site/Cargo.toml +++ b/components/site/Cargo.toml @@ -22,4 +22,4 @@ content = { path = "../content" } search = { path = "../search" } [dev-dependencies] -tempdir = "0.3" +tempfile = "3" diff --git a/components/site/benches/render.rs b/components/site/benches/render.rs index 3208abec..6d23277b 100644 --- a/components/site/benches/render.rs +++ b/components/site/benches/render.rs @@ -3,12 +3,12 @@ #![feature(test)] extern crate test; extern crate site; -extern crate tempdir; +extern crate tempfile; use std::env; use site::Site; -use tempdir::TempDir; +use tempfile::tempdir; #[bench] @@ -17,7 +17,7 @@ fn bench_rendering_small_blog(b: &mut test::Bencher) { path.push("benches"); path.push("small-blog"); let mut site = Site::new(&path, "config.toml").unwrap(); - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let public = &tmp_dir.path().join("public"); site.set_output_path(&public); site.load().unwrap(); @@ -31,7 +31,7 @@ fn bench_rendering_medium_blog(b: &mut test::Bencher) { path.push("benches"); path.push("medium-blog"); let mut site = Site::new(&path, "config.toml").unwrap(); - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let public = &tmp_dir.path().join("public"); site.set_output_path(&public); site.load().unwrap(); @@ -45,7 +45,7 @@ fn bench_rendering_medium_blog(b: &mut test::Bencher) { // path.push("benches"); // path.push("big-blog"); // let mut site = Site::new(&path, "config.toml").unwrap(); -// let tmp_dir = TempDir::new("example").expect("create temp dir"); +// let tmp_dir = tempdir().expect("create temp dir"); // let public = &tmp_dir.path().join("public"); // site.set_output_path(&public); // site.load().unwrap(); @@ -59,7 +59,7 @@ fn bench_rendering_small_kb(b: &mut test::Bencher) { path.push("benches"); path.push("small-kb"); let mut site = Site::new(&path, "config.toml").unwrap(); - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let public = &tmp_dir.path().join("public"); site.set_output_path(&public); site.load().unwrap(); @@ -73,7 +73,7 @@ fn bench_rendering_medium_kb(b: &mut test::Bencher) { path.push("benches"); path.push("medium-kb"); let mut site = Site::new(&path, "config.toml").unwrap(); - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let public = &tmp_dir.path().join("public"); site.set_output_path(&public); site.load().unwrap(); diff --git a/components/site/benches/site.rs b/components/site/benches/site.rs index 245e73aa..a3bf4692 100644 --- a/components/site/benches/site.rs +++ b/components/site/benches/site.rs @@ -1,11 +1,11 @@ #![feature(test)] extern crate test; extern crate site; -extern crate tempdir; +extern crate tempfile; use std::env; -use tempdir::TempDir; +use tempfile::tempdir; use site::Site; diff --git a/components/site/src/lib.rs b/components/site/src/lib.rs index 069d046a..d8e434dc 100644 --- a/components/site/src/lib.rs +++ b/components/site/src/lib.rs @@ -18,7 +18,7 @@ extern crate content; extern crate search; #[cfg(test)] -extern crate tempdir; +extern crate tempfile; use std::collections::HashMap; use std::fs::{create_dir_all, remove_dir_all, copy}; diff --git a/components/site/tests/site.rs b/components/site/tests/site.rs index f62b0e1c..8c78d15e 100644 --- a/components/site/tests/site.rs +++ b/components/site/tests/site.rs @@ -1,12 +1,12 @@ extern crate site; -extern crate tempdir; +extern crate tempfile; use std::env; use std::path::Path; use std::fs::File; use std::io::prelude::*; -use tempdir::TempDir; +use tempfile::tempdir; use site::Site; @@ -95,7 +95,7 @@ fn can_build_site_without_live_reload() { path.push("test_site"); let mut site = Site::new(&path, "config.toml").unwrap(); site.load().unwrap(); - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let public = &tmp_dir.path().join("public"); site.set_output_path(&public); site.build().unwrap(); @@ -168,7 +168,7 @@ fn can_build_site_with_live_reload() { path.push("test_site"); let mut site = Site::new(&path, "config.toml").unwrap(); site.load().unwrap(); - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let public = &tmp_dir.path().join("public"); site.set_output_path(&public); site.enable_live_reload(); @@ -220,7 +220,7 @@ fn can_build_site_with_categories() { }; } site.populate_tags_and_categories(); - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let public = &tmp_dir.path().join("public"); site.set_output_path(&public); site.build().unwrap(); @@ -275,7 +275,7 @@ fn can_build_site_with_tags() { } site.populate_tags_and_categories(); - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let public = &tmp_dir.path().join("public"); site.set_output_path(&public); site.build().unwrap(); @@ -317,7 +317,7 @@ fn can_build_site_and_insert_anchor_links() { let mut site = Site::new(&path, "config.toml").unwrap(); site.load().unwrap(); - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let public = &tmp_dir.path().join("public"); site.set_output_path(&public); site.build().unwrap(); @@ -340,7 +340,7 @@ fn can_build_site_with_pagination_for_section() { section.meta.paginate_by = Some(2); section.meta.template = Some("section_paginated.html".to_string()); } - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let public = &tmp_dir.path().join("public"); site.set_output_path(&public); site.build().unwrap(); @@ -397,7 +397,7 @@ fn can_build_site_with_pagination_for_index() { index.meta.paginate_by = Some(2); index.meta.template = Some("index_paginated.html".to_string()); } - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let public = &tmp_dir.path().join("public"); site.set_output_path(&public); site.build().unwrap(); @@ -437,7 +437,7 @@ fn can_build_rss_feed() { path.push("test_site"); let mut site = Site::new(&path, "config.toml").unwrap(); site.load().unwrap(); - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let public = &tmp_dir.path().join("public"); site.set_output_path(&public); site.build().unwrap(); @@ -458,7 +458,7 @@ fn can_build_search_index() { let mut site = Site::new(&path, "config.toml").unwrap(); site.load().unwrap(); site.config.build_search_index = true; - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); let public = &tmp_dir.path().join("public"); site.set_output_path(&public); site.build().unwrap(); diff --git a/components/utils/Cargo.toml b/components/utils/Cargo.toml index ee330ee1..2c5cc0f0 100644 --- a/components/utils/Cargo.toml +++ b/components/utils/Cargo.toml @@ -10,4 +10,4 @@ walkdir = "2" [dev-dependencies] -tempdir = "0.3" +tempfile = "3" diff --git a/components/utils/src/fs.rs b/components/utils/src/fs.rs index 06cd80ce..b783f7de 100644 --- a/components/utils/src/fs.rs +++ b/components/utils/src/fs.rs @@ -97,13 +97,13 @@ pub fn copy_directory(src: &PathBuf, dest: &PathBuf) -> Result<()> { mod tests { use std::fs::File; - use tempdir::TempDir; + use tempfile::tempdir; use super::{find_related_assets}; #[test] fn can_find_related_assets() { - let tmp_dir = TempDir::new("example").expect("create temp dir"); + let tmp_dir = tempdir().expect("create temp dir"); File::create(tmp_dir.path().join("index.md")).unwrap(); File::create(tmp_dir.path().join("example.js")).unwrap(); File::create(tmp_dir.path().join("graph.jpg")).unwrap(); diff --git a/components/utils/src/lib.rs b/components/utils/src/lib.rs index b529aa45..cddcb6ff 100644 --- a/components/utils/src/lib.rs +++ b/components/utils/src/lib.rs @@ -2,7 +2,7 @@ extern crate errors; #[cfg(test)] -extern crate tempdir; +extern crate tempfile; extern crate tera; extern crate walkdir; From a060646b9e48b957957233a6989bb6d83619d936 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Wed, 25 Apr 2018 11:03:01 +0200 Subject: [PATCH 03/74] Update test alternative config file --- test_site/config.staging.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test_site/config.staging.toml b/test_site/config.staging.toml index 123bc892..b15e8dae 100644 --- a/test_site/config.staging.toml +++ b/test_site/config.staging.toml @@ -1,7 +1,8 @@ title = "My site" base_url = "https://staging.com" highlight_code = true - +theme = "sample" [extra.author] name = "Vincent Prouillet" + From 50a79c52f3cae6e0a0125b17c723846759806135 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Thu, 26 Apr 2018 10:58:59 +0200 Subject: [PATCH 04/74] Fix serve not working with config flag Closes #294 --- CHANGELOG.md | 5 +++++ src/cmd/serve.rs | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index da995014..aab2ba8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog + +## 0.4.0 (unreleased) + +- Fix `serve` not working with the config flag + ## 0.3.4 (2018-06-22) - `cargo update` as some dependencies didn't compile with current Rust version diff --git a/src/cmd/serve.rs b/src/cmd/serve.rs index 67486d69..9a96459f 100644 --- a/src/cmd/serve.rs +++ b/src/cmd/serve.rs @@ -115,8 +115,8 @@ pub fn serve(interface: &str, port: &str, output_dir: &str, base_url: &str, conf .chain_err(|| "Can't watch the `content` folder. Does it exist?")?; watcher.watch("templates/", RecursiveMode::Recursive) .chain_err(|| "Can't watch the `templates` folder. Does it exist?")?; - watcher.watch("config.toml", RecursiveMode::Recursive) - .chain_err(|| "Can't watch the `config.toml` file. Does it exist?")?; + watcher.watch(config_file, RecursiveMode::Recursive) + .chain_err(|| "Can't watch the `config` file. Does it exist?")?; if Path::new("static").exists() { watching_static = true; From b892c07ed314214b3c7a66393ff17bfafb09c0c4 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Fri, 11 May 2018 13:54:16 +0200 Subject: [PATCH 05/74] Don't hardcode the ws port Closes #282 --- CHANGELOG.md | 1 + components/site/src/lib.rs | 13 +++++++------ components/site/tests/site.rs | 2 +- components/utils/src/lib.rs | 1 + components/utils/src/net.rs | 14 ++++++++++++++ components/utils/src/templates.rs | 2 +- src/cmd/serve.rs | 2 +- 7 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 components/utils/src/net.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index aab2ba8a..75864499 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ## 0.4.0 (unreleased) - Fix `serve` not working with the config flag +- Websocket port on `live` will not get the first available port instead of a fixed one ## 0.3.4 (2018-06-22) diff --git a/components/site/src/lib.rs b/components/site/src/lib.rs index d8e434dc..97968aa2 100644 --- a/components/site/src/lib.rs +++ b/components/site/src/lib.rs @@ -33,6 +33,7 @@ use errors::{Result, ResultExt}; use config::{Config, get_config}; use utils::fs::{create_file, copy_directory, create_directory, ensure_directory_exists}; use utils::templates::{render_template, rewrite_theme_paths}; +use utils::net::get_available_port; use content::{Page, Section, populate_previous_and_next_pages, sort_pages}; use templates::{GUTENBERG_TERA, global_fns, render_redirect_template}; use front_matter::{SortBy, InsertAnchor}; @@ -65,7 +66,8 @@ pub struct Site { pub pages: HashMap, pub sections: HashMap, pub tera: Tera, - live_reload: bool, + // the live reload port to be used if there is one + pub live_reload: Option, pub output_path: PathBuf, pub static_path: PathBuf, pub tags: Option, @@ -113,7 +115,7 @@ impl Site { tera, pages: HashMap::new(), sections: HashMap::new(), - live_reload: false, + live_reload: None, output_path: path.join("public"), static_path: path.join("static"), tags: None, @@ -129,9 +131,8 @@ impl Site { self.base_path.join("content").join("_index.md") } - /// What the function name says pub fn enable_live_reload(&mut self) { - self.live_reload = true; + self.live_reload = get_available_port(); } /// Get all the orphan (== without section) pages in the site @@ -413,10 +414,10 @@ impl Site { /// Inject live reload script tag if in live reload mode fn inject_livereload(&self, html: String) -> String { - if self.live_reload { + if let Some(port) = self.live_reload { return html.replace( "", - r#""# + &format!(r#""#, port) ); } diff --git a/components/site/tests/site.rs b/components/site/tests/site.rs index 8c78d15e..db2960e2 100644 --- a/components/site/tests/site.rs +++ b/components/site/tests/site.rs @@ -197,7 +197,7 @@ fn can_build_site_with_live_reload() { assert_eq!(file_exists!(public, "tags/index.html"), false); // no live reload code - assert!(file_contains!(public, "index.html", "/livereload.js?port=1112&mindelay=10")); + assert!(file_contains!(public, "index.html", "/livereload.js")); // the summary anchor link has been created assert!(file_contains!(public, "posts/python/index.html", r#""#)); diff --git a/components/utils/src/lib.rs b/components/utils/src/lib.rs index cddcb6ff..a1fdb178 100644 --- a/components/utils/src/lib.rs +++ b/components/utils/src/lib.rs @@ -9,3 +9,4 @@ extern crate walkdir; pub mod fs; pub mod site; pub mod templates; +pub mod net; diff --git a/components/utils/src/net.rs b/components/utils/src/net.rs new file mode 100644 index 00000000..29c9376a --- /dev/null +++ b/components/utils/src/net.rs @@ -0,0 +1,14 @@ +use std::net::TcpListener; + + +pub fn get_available_port() -> Option { + (1000..9000) + .find(|port| port_is_available(*port)) +} + +fn port_is_available(port: u16) -> bool { + match TcpListener::bind(("127.0.0.1", port)) { + Ok(_) => true, + Err(_) => false, + } +} diff --git a/components/utils/src/templates.rs b/components/utils/src/templates.rs index e4270be3..c7432abb 100644 --- a/components/utils/src/templates.rs +++ b/components/utils/src/templates.rs @@ -27,7 +27,7 @@ pub fn render_template(name: &str, tera: &Tera, context: &Context, theme: &Optio .map_err(|e| e.into()); } - if let &Some(ref t) = theme { + if let Some(ref t) = *theme { return tera .render(&format!("{}/templates/{}", t, name), context) .map_err(|e| e.into()); diff --git a/src/cmd/serve.rs b/src/cmd/serve.rs index 9a96459f..20fece10 100644 --- a/src/cmd/serve.rs +++ b/src/cmd/serve.rs @@ -127,7 +127,7 @@ pub fn serve(interface: &str, port: &str, output_dir: &str, base_url: &str, conf // Sass support is optional so don't make it an error to no have a sass folder let _ = watcher.watch("sass/", RecursiveMode::Recursive); - let ws_address = format!("{}:{}", interface, "1112"); + let ws_address = format!("{}:{}", interface, site.live_reload.unwrap()); // Start a webserver that serves the `output_dir` directory let mut mount = Mount::new(); From 204f514c0e2c1f45c99da67af45bb7f29045ac33 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Thu, 3 May 2018 20:50:30 +0200 Subject: [PATCH 06/74] WIP: new markdown rendering --- components/rendering/Cargo.toml | 3 + components/rendering/benches/all.rs | 21 +- components/rendering/src/content.pest | 74 ++++++ components/rendering/src/lib.rs | 9 +- components/rendering/src/shortcode.rs | 336 ++++++++++++++++++++++++++ 5 files changed, 441 insertions(+), 2 deletions(-) create mode 100644 components/rendering/src/content.pest create mode 100644 components/rendering/src/shortcode.rs diff --git a/components/rendering/Cargo.toml b/components/rendering/Cargo.toml index e9a19e29..92ff5c08 100644 --- a/components/rendering/Cargo.toml +++ b/components/rendering/Cargo.toml @@ -12,11 +12,14 @@ pulldown-cmark = "0" slug = "0.1" serde = "1" serde_derive = "1" +pest = "1" +pest_derive = "1" errors = { path = "../errors" } front_matter = { path = "../front_matter" } highlighting = { path = "../highlighting"} utils = { path = "../utils" } +config = { path = "../config" } [dev-dependencies] templates = { path = "../templates" } diff --git a/components/rendering/benches/all.rs b/components/rendering/benches/all.rs index 999268cf..e7a968b0 100644 --- a/components/rendering/benches/all.rs +++ b/components/rendering/benches/all.rs @@ -3,13 +3,15 @@ extern crate test; extern crate tera; extern crate rendering; +extern crate config; extern crate front_matter; use std::collections::HashMap; use tera::Tera; -use rendering::{Context, markdown_to_html}; +use rendering::{Context, markdown_to_html, render_shortcodes}; use front_matter::InsertAnchor; +use config::Config; static CONTENT: &'static str = r#" # Modus cognitius profanam ne duae virtutis mundi @@ -98,3 +100,20 @@ fn bench_markdown_to_html_without_highlighting(b: &mut test::Bencher) { let context = Context::new(&tera_ctx, false, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); b.iter(|| markdown_to_html(CONTENT, &context)); } + +#[bench] +fn bench_render_shortcodes_one_present(b: &mut test::Bencher) { + let mut tera = Tera::default(); + tera.add_raw_template("shortcodes/youtube.html", "{{id}}").unwrap(); + + b.iter(|| render_shortcodes(CONTENT, &tera, &Config::default())); +} + +#[bench] +fn bench_render_shortcodes_none(b: &mut test::Bencher) { + let mut tera = Tera::default(); + tera.add_raw_template("shortcodes/youtube.html", "{{id}}").unwrap(); + let content2 = CONTENT.replace(r#"{{ youtube(id="my_youtube_id") }}"#, ""); + + b.iter(|| render_shortcodes(&content2, &tera, &Config::default())); +} diff --git a/components/rendering/src/content.pest b/components/rendering/src/content.pest new file mode 100644 index 00000000..edd3403a --- /dev/null +++ b/components/rendering/src/content.pest @@ -0,0 +1,74 @@ +// Partly taken from Tera + +whitespace = _{ " " | "\t" | "\r" | "\n" } + +/// LITERALS +int = @{ "-" ? ~ ("0" | '1'..'9' ~ '0'..'9' * ) } +float = @{ + "-" ? ~ + ( + "0" ~ "." ~ '0'..'9' + | + '1'..'9' ~ '0'..'9' * ~ "." ~ '0'..'9' + + ) +} +// matches anything between 2 double quotes +double_quoted_string = @{ "\"" ~ (!("\"") ~ any)* ~ "\""} +// matches anything between 2 single quotes +single_quoted_string = @{ "\'" ~ (!("\'") ~ any)* ~ "\'"} +// matches anything between 2 backquotes\backticks +backquoted_quoted_string = @{ "`" ~ (!("`") ~ any)* ~ "`"} + +string = @{ + double_quoted_string | + single_quoted_string | + backquoted_quoted_string +} + +boolean = { "true" | "false" } + +literal = { boolean | string | float | int } +array = { "[" ~ (literal ~ ",")* ~ literal? ~ "]"} + +/// Idents + +all_chars = _{'a'..'z' | 'A'..'Z' | "_" | '0'..'9'} +ident = @{ + ('a'..'z' | 'A'..'Z' | "_") ~ + all_chars* +} + +/// Now specific to Gutenberg + +// shortcode is abbreviated to sc to keep things short + +kwarg = { ident ~ "=" ~ (literal | array) } +kwargs = _{ kwarg ~ ("," ~ kwarg )* } +sc_def = _{ ident ~ "(" ~ kwargs* ~ ")" } + +//sc_start = _{ "{{/*" | "{{" | "{%/*" | "{%" } + +inline_shortcode = !{ "{{" ~ sc_def ~ "}}" } +ignored_inline_shortcode = !{ "{{/*" ~ sc_def ~ "*/}}" } + +sc_body_start = !{ "{%" ~ sc_def ~ "%}" } +sc_body_end = !{ "{%" ~ "end" ~ "%}" } +ignored_sc_body_start = !{ "{%/*" ~ sc_def ~ "*/%}" } +ignored_sc_body_end = !{ "{%/*" ~ "end" ~ "*/%}" } + +shortcode_with_body = !{ sc_body_start ~ text_in_body_sc ~ sc_body_end } +ignored_shortcode_with_body = !{ ignored_sc_body_start ~ text_in_ignored_body_sc ~ ignored_sc_body_end } + +text_in_body_sc = ${ (!("{%") ~ any)+ } +text_in_ignored_body_sc = ${ (!("{%/*") ~ any)+ } +text = ${ (!("{{/*" | "{{" | "{%/*" | "{%") ~ any)+ } + +content = _{ + ignored_inline_shortcode | + inline_shortcode | + ignored_shortcode_with_body | + shortcode_with_body | + text +} + + +page = ${ soi ~ content* ~ eoi } diff --git a/components/rendering/src/lib.rs b/components/rendering/src/lib.rs index 1dfd39b5..185c006a 100644 --- a/components/rendering/src/lib.rs +++ b/components/rendering/src/lib.rs @@ -8,20 +8,27 @@ extern crate slug; #[macro_use] extern crate serde_derive; extern crate serde; +extern crate pest; +#[macro_use] +extern crate pest_derive; + extern crate errors; extern crate front_matter; extern crate highlighting; extern crate utils; +extern crate config; #[cfg(test)] extern crate templates; mod context; mod markdown; -mod short_code; mod table_of_contents; +mod shortcode; +mod short_code; pub use context::Context; pub use markdown::markdown_to_html; pub use table_of_contents::Header; +pub use shortcode::render_shortcodes; diff --git a/components/rendering/src/shortcode.rs b/components/rendering/src/shortcode.rs new file mode 100644 index 00000000..009a0cfe --- /dev/null +++ b/components/rendering/src/shortcode.rs @@ -0,0 +1,336 @@ +use pest::Parser; +use pest::iterators::Pair; +use tera::{Tera, Map, Context, Value, to_value}; + +use errors::{Result, ResultExt}; +use config::Config; + +// This include forces recompiling this source file if the grammar file changes. +// Uncomment it when doing changes to the .pest file +// const _GRAMMAR: &str = include_str!("content.pest"); + +#[derive(Parser)] +#[grammar = "content.pest"] +pub struct ContentParser; + + +fn replace_string_markers(input: &str) -> String { + match input.chars().next().unwrap() { + '"' => input.replace('"', "").to_string(), + '\'' => input.replace('\'', "").to_string(), + '`' => input.replace('`', "").to_string(), + _ => unreachable!("How did you even get there"), + } +} + +fn parse_literal(pair: Pair) -> Value { + let mut val = None; + for p in pair.into_inner() { + match p.as_rule() { + Rule::boolean => match p.as_str() { + "true" => val = Some(Value::Bool(true)), + "false" => val = Some(Value::Bool(false)), + _ => unreachable!(), + }, + Rule::string => val = Some(Value::String(replace_string_markers(p.as_str()))), + Rule::float => { + val = Some(to_value(p.as_str().parse::().unwrap()).unwrap()); + }, + Rule::int => { + val = Some(to_value(p.as_str().parse::().unwrap()).unwrap()); + }, + _ => unreachable!("Unknown literal: {:?}", p) + }; + } + + val.unwrap() +} + +/// Returns (shortcode_name, kwargs) +fn parse_shortcode_call(pair: Pair) -> (String, Map) { + let mut name = None; + let mut args = Map::new(); + + for p in pair.into_inner() { + match p.as_rule() { + Rule::ident => { name = Some(p.into_span().as_str().to_string()); }, + Rule::kwarg => { + let mut arg_name = None; + let mut arg_val = None; + for p2 in p.into_inner() { + match p2.as_rule() { + Rule::ident => { arg_name = Some(p2.into_span().as_str().to_string()); }, + Rule::literal => { arg_val = Some(parse_literal(p2)); }, + Rule::array => { + let mut vals = vec![]; + for p3 in p2.into_inner() { + match p3.as_rule() { + Rule::literal => vals.push(parse_literal(p3)), + _ => unreachable!("Got something other than literal in an array: {:?}", p3), + } + } + arg_val = Some(Value::Array(vals)); + }, + _ => unreachable!("Got something unexpected in a kwarg: {:?}", p2), + } + } + + args.insert(arg_name.unwrap(), arg_val.unwrap()); + }, + _ => unreachable!("Got something unexpected in a shortcode: {:?}", p) + } + } + (name.unwrap(), args) +} + + +fn render_shortcode(name: String, args: Map, tera: &Tera, config: &Config, body: Option<&str>) -> Result { + let mut context = Context::new(); + for (key, value) in args.iter() { + context.insert(key, value); + } + if let Some(ref b) = body { + context.insert("body", b); + } + context.insert("config", config); + let tpl_name = format!("shortcodes/{}.html", name); + + tera.render(&tpl_name, &context).chain_err(|| format!("Failed to render {} shortcode", name)) +} + +pub fn render_shortcodes(content: &str, tera: &Tera, config: &Config) -> Result { + // Don't do anything if there is nothing like a shortcode in the content + if !content.contains("{{") && !content.contains("{%") { + return Ok(content.to_string()); + } + + let mut res = String::with_capacity(content.len()); + + let mut pairs = match ContentParser::parse(Rule::page, content) { + Ok(p) => p, + Err(_) => panic!("TODO"), // TODO: error handling + }; + + // We have at least a `page` pair + for p in pairs.next().unwrap().into_inner() { + match p.as_rule() { + Rule::text | Rule::text_in_ignored_body_sc | Rule::text_in_body_sc => res.push_str(p.into_span().as_str()), + Rule::inline_shortcode => { + let (name, args) = parse_shortcode_call(p); + res.push_str(&render_shortcode(name, args, tera, config, None)?); + }, + Rule::shortcode_with_body => { + let mut inner = p.into_inner(); + // 3 items in inner: call, body, end + // we don't care about the closing tag + let (name, args) = parse_shortcode_call(inner.next().unwrap()); + let body = inner.next().unwrap().into_span().as_str(); + res.push_str(&render_shortcode(name, args, tera, config, Some(body))?); + }, + Rule::ignored_inline_shortcode => { + res.push_str( + &p.into_span().as_str() + .replacen("{{/*", "{{", 1) + .replacen("*/}}", "}}", 1) + ); + }, + Rule::ignored_shortcode_with_body => { + for p2 in p.into_inner() { + match p2.as_rule() { + Rule::ignored_sc_body_start | Rule::ignored_sc_body_end => { + res.push_str( + &p2.into_span().as_str() + .replacen("{%/*", "{%", 1) + .replacen("*/%}", "%}", 1) + ); + }, + Rule::text_in_ignored_body_sc => res.push_str(p2.into_span().as_str()), + _ => unreachable!("Got something weird in an ignored shortcode"), + } + } + }, + _ => unreachable!("unexpected page rule: {:?}", p.as_rule()), + } + } + + Ok(res) +} + +#[cfg(test)] +mod tests { + use super::*; + + macro_rules! assert_lex_rule { + ($rule: expr, $input: expr) => { + let res = ContentParser::parse($rule, $input); + println!("{:?}", $input); + println!("{:#?}", res); + if res.is_err() { + println!("{}", res.unwrap_err()); + panic!(); + } + assert!(res.is_ok()); + assert_eq!(res.unwrap().last().unwrap().into_span().end(), $input.len()); + }; + } + + #[test] + fn lex_text() { + let inputs = vec!["Hello world", "HEllo \n world", "Hello 1 2 true false 'hey'"]; + for i in inputs { + assert_lex_rule!(Rule::text, i); + } + } + + #[test] + fn lex_inline_shortcode() { + let inputs = vec![ + "{{ youtube() }}", + "{{ youtube(id=1, autoplay=true, url='hey') }}", + "{{ youtube(id=1, \nautoplay=true, url='hey') }}", + ]; + for i in inputs { + assert_lex_rule!(Rule::inline_shortcode, i); + } + } + + #[test] + fn lex_inline_ignored_shortcode() { + let inputs = vec![ + "{{/* youtube() */}}", + "{{/* youtube(id=1, autoplay=true, url='hey') */}}", + "{{/* youtube(id=1, \nautoplay=true, \nurl='hey') */}}", + ]; + for i in inputs { + assert_lex_rule!(Rule::ignored_inline_shortcode, i); + } + } + + #[test] + fn lex_shortcode_with_body() { + let inputs = vec![ + r#"{% youtube() %} + Some text + {% end %}"#, + + r#"{% youtube(id=1, + autoplay=true, url='hey') %} + Some text + {% end %}"#, + ]; + for i in inputs { + assert_lex_rule!(Rule::shortcode_with_body, i); + } + } + + #[test] + fn lex_ignored_shortcode_with_body() { + let inputs = vec![ + r#"{%/* youtube() */%} + Some text + {%/* end */%}"#, + + r#"{%/* youtube(id=1, + autoplay=true, url='hey') */%} + Some text + {%/* end */%}"#, + ]; + for i in inputs { + assert_lex_rule!(Rule::ignored_shortcode_with_body, i); + } + } + + #[test] + fn lex_page() { + let inputs = vec![ + "Some text and a shortcode `{{/* youtube() */}}`", + "{{ youtube(id=1, autoplay=true, url='hey') }}", + "{{ youtube(id=1, \nautoplay=true, url='hey') }} that's it", + r#" + This is a test + {% hello() %} + Body {{ var }} + {% end %} + "# + ]; + for i in inputs { + assert_lex_rule!(Rule::page, i); + } + } + + #[test] + fn does_nothing_with_no_shortcodes() { + let res = render_shortcodes("Hello World", &Tera::default(), &Config::default()); + assert_eq!(res.unwrap(), "Hello World"); + } + + #[test] + fn can_unignore_inline_shortcode() { + let res = render_shortcodes( + "Hello World {{/* youtube() */}}", + &Tera::default(), + &Config::default(), + ); + assert_eq!(res.unwrap(), "Hello World {{ youtube() }}"); + } + + #[test] + fn can_unignore_shortcode_with_body() { + let res = render_shortcodes(r#" +Hello World +{%/* youtube() */%}Some body {{ hello() }}{%/* end */%}"#, &Tera::default(), &Config::default()); + assert_eq!(res.unwrap(), "\nHello World\n{% youtube() %}Some body {{ hello() }}{% end %}"); + } + + #[test] + fn can_parse_shortcode_arguments() { + let inputs = vec![ + ("{{ youtube() }}", "youtube", Map::new()), + ( + "{{ youtube(id=1, autoplay=true, hello='salut', float=1.2) }}", + "youtube", + { + let mut m = Map::new(); + m.insert("id".to_string(), to_value(1).unwrap()); + m.insert("autoplay".to_string(), to_value(true).unwrap()); + m.insert("hello".to_string(), to_value("salut").unwrap()); + m.insert("float".to_string(), to_value(1.2).unwrap()); + m + } + ), + ( + "{{ gallery(photos=['something', 'else'], fullscreen=true) }}", + "gallery", + { + let mut m = Map::new(); + m.insert("photos".to_string(), to_value(["something", "else"]).unwrap()); + m.insert("fullscreen".to_string(), to_value(true).unwrap()); + m + } + ), + ]; + + for (i, n, a) in inputs { + let mut res = ContentParser::parse(Rule::inline_shortcode, i).unwrap(); + let (name, args) = parse_shortcode_call(res.next().unwrap()); + assert_eq!(name, n); + assert_eq!(args, a); + } + } + + #[test] + fn can_render_inline_shortcodes() { + let mut tera = Tera::default(); + tera.add_raw_template("shortcodes/youtube.html", "Hello {{id}}").unwrap(); + let res = render_shortcodes("Inline {{ youtube(id=1) }}.", &tera, &Config::default()).unwrap(); + assert_eq!(res, "Inline Hello 1."); + } + + #[test] + fn can_render_shortcodes_with_body() { + let mut tera = Tera::default(); + tera.add_raw_template("shortcodes/youtube.html", "{{body}}").unwrap(); + let res = render_shortcodes("Body\n {% youtube() %}Hey!{% end %}", &tera, &Config::default()).unwrap(); + assert_eq!(res, "Body\n Hey!"); + } +} From 85e13483ebc0514d7f577546de96a16ae15fb222 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Sun, 6 May 2018 22:58:39 +0200 Subject: [PATCH 07/74] Use the new shortcode parser --- Cargo.lock | 5 +- README.md | 4 +- components/content/src/page.rs | 14 +- components/content/src/section.rs | 9 +- components/front_matter/src/page.rs | 2 +- .../examples/generate_sublime.rs | 0 components/highlighting/src/lib.rs | 15 +- components/rendering/Cargo.toml | 2 - components/rendering/benches/all.rs | 43 ++- components/rendering/src/context.rs | 28 +- components/rendering/src/lib.rs | 22 +- components/rendering/src/markdown.rs | 361 ++++++------------ components/rendering/src/short_code.rs | 190 --------- components/rendering/src/shortcode.rs | 30 +- components/rendering/src/table_of_contents.rs | 12 +- components/rendering/tests/markdown.rs | 164 ++++---- sublime_syntaxes/newlines.packdump | Bin 413042 -> 416076 bytes sublime_syntaxes/nonewlines.packdump | Bin 413083 -> 416145 bytes 18 files changed, 322 insertions(+), 579 deletions(-) rename components/{rendering => highlighting}/examples/generate_sublime.rs (100%) delete mode 100644 components/rendering/src/short_code.rs diff --git a/Cargo.lock b/Cargo.lock index 9023ba27..513d8662 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1113,12 +1113,13 @@ dependencies = [ name = "rendering" version = "0.1.0" dependencies = [ + "config 0.1.0", "errors 0.1.0", "front_matter 0.1.0", "highlighting 0.1.0", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "pest_derive 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/README.md b/README.md index 95bb0f52..23454eb7 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ If you want a feature added or modified, please open an issue to discuss it befo Syntax highlighting depends on submodules so ensure you load them first: ```bash -$ git submodule update --init +$ git submodule update --init ``` Gutenberg only works with syntaxes in the `.sublime-syntax` format. If your syntax @@ -75,7 +75,7 @@ You can check for any updates to the current packages by running: $ git submodule update --remote --merge ``` -And finally from the root of the components/rendering crate run the following command: +And finally from the root of the components/highlighting crate run the following command: ```bash $ cargo run --example generate_sublime synpack ../../sublime_syntaxes ../../sublime_syntaxes/newlines.packdump ../../sublime_syntaxes/nonewlines.packdump diff --git a/components/content/src/page.rs b/components/content/src/page.rs index b3cd820b..f977c464 100644 --- a/components/content/src/page.rs +++ b/components/content/src/page.rs @@ -14,7 +14,7 @@ use utils::fs::{read_file, find_related_assets}; use utils::site::get_reading_analytics; use utils::templates::render_template; use front_matter::{PageFrontMatter, InsertAnchor, split_page_content}; -use rendering::{Context, Header, markdown_to_html}; +use rendering::{RenderContext, Header, render_content}; use file_info::FileInfo; @@ -162,21 +162,23 @@ impl Page { /// We need access to all pages url to render links relative to content /// so that can't happen at the same time as parsing pub fn render_markdown(&mut self, permalinks: &HashMap, tera: &Tera, config: &Config, anchor_insert: InsertAnchor) -> Result<()> { - let context = Context::new( + let context = RenderContext::new( tera, - config.highlight_code, - config.highlight_theme.clone(), + config, &self.permalink, permalinks, anchor_insert ); - let res = markdown_to_html(&self.raw_content.replacen("", "", 1), &context)?; + let res = render_content( + &self.raw_content.replacen("", "", 1), + &context + )?; self.content = res.0; self.toc = res.1; if self.raw_content.contains("") { self.summary = Some({ let summary = self.raw_content.splitn(2, "").collect::>()[0]; - markdown_to_html(summary, &context)?.0 + render_content(summary, &context)?.0 }) } diff --git a/components/content/src/section.rs b/components/content/src/section.rs index b75581c6..c864318e 100644 --- a/components/content/src/section.rs +++ b/components/content/src/section.rs @@ -11,7 +11,7 @@ use errors::{Result, ResultExt}; use utils::fs::read_file; use utils::templates::render_template; use utils::site::get_reading_analytics; -use rendering::{Context, Header, markdown_to_html}; +use rendering::{RenderContext, Header, render_content}; use page::Page; use file_info::FileInfo; @@ -98,15 +98,14 @@ impl Section { /// We need access to all pages url to render links relative to content /// so that can't happen at the same time as parsing pub fn render_markdown(&mut self, permalinks: &HashMap, tera: &Tera, config: &Config) -> Result<()> { - let context = Context::new( + let context = RenderContext::new( tera, - config.highlight_code, - config.highlight_theme.clone(), + config, &self.permalink, permalinks, self.meta.insert_anchor_links, ); - let res = markdown_to_html(&self.raw_content, &context)?; + let res = render_content(&self.raw_content, &context)?; self.content = res.0; self.toc = res.1; Ok(()) diff --git a/components/front_matter/src/page.rs b/components/front_matter/src/page.rs index 86cde2a9..0b33a3a2 100644 --- a/components/front_matter/src/page.rs +++ b/components/front_matter/src/page.rs @@ -21,7 +21,7 @@ fn from_toml_datetime<'de, D>(deserializer: D) -> StdResult, D::E fn convert_toml_date(table: Map) -> Value { let mut new = Map::new(); - for (k, v) in table.into_iter() { + for (k, v) in table { if k == "$__toml_private_datetime" { return v; } diff --git a/components/rendering/examples/generate_sublime.rs b/components/highlighting/examples/generate_sublime.rs similarity index 100% rename from components/rendering/examples/generate_sublime.rs rename to components/highlighting/examples/generate_sublime.rs diff --git a/components/highlighting/src/lib.rs b/components/highlighting/src/lib.rs index f0a80b83..10834dbe 100644 --- a/components/highlighting/src/lib.rs +++ b/components/highlighting/src/lib.rs @@ -4,7 +4,8 @@ extern crate syntect; use syntect::dumps::from_binary; use syntect::parsing::SyntaxSet; -use syntect::highlighting::ThemeSet; +use syntect::highlighting::{ThemeSet, Theme}; +use syntect::easy::HighlightLines; thread_local!{ pub static SYNTAX_SET: SyntaxSet = { @@ -17,3 +18,15 @@ thread_local!{ lazy_static!{ pub static ref THEME_SET: ThemeSet = from_binary(include_bytes!("../../../sublime_themes/all.themedump")); } + + +pub fn get_highlighter<'a>(theme: &'a Theme, info: &str) -> HighlightLines<'a> { + SYNTAX_SET.with(|ss| { + let syntax = info + .split(' ') + .next() + .and_then(|lang| ss.find_syntax_by_token(lang)) + .unwrap_or_else(|| ss.find_syntax_plain_text()); + HighlightLines::new(syntax, theme) + }) +} diff --git a/components/rendering/Cargo.toml b/components/rendering/Cargo.toml index 92ff5c08..029c5056 100644 --- a/components/rendering/Cargo.toml +++ b/components/rendering/Cargo.toml @@ -5,8 +5,6 @@ authors = ["Vincent Prouillet "] [dependencies] tera = "0.11" -regex = "1" -lazy_static = "1" syntect = "2" pulldown-cmark = "0" slug = "0.1" diff --git a/components/rendering/benches/all.rs b/components/rendering/benches/all.rs index e7a968b0..70244521 100644 --- a/components/rendering/benches/all.rs +++ b/components/rendering/benches/all.rs @@ -9,7 +9,7 @@ extern crate front_matter; use std::collections::HashMap; use tera::Tera; -use rendering::{Context, markdown_to_html, render_shortcodes}; +use rendering::{RenderContext, render_content, render_shortcodes}; use front_matter::InsertAnchor; use config::Config; @@ -86,19 +86,36 @@ if __name__ == "__main__": "#; #[bench] -fn bench_markdown_to_html_with_highlighting(b: &mut test::Bencher) { - let tera_ctx = Tera::default(); +fn bench_render_content_with_highlighting(b: &mut test::Bencher) { + let mut tera = Tera::default(); + tera.add_raw_template("shortcodes/youtube.html", "{{id}}").unwrap(); let permalinks_ctx = HashMap::new(); - let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); - b.iter(|| markdown_to_html(CONTENT, &context)); + let config = Config::default(); + let context = RenderContext::new(&tera, &config, "", &permalinks_ctx, InsertAnchor::None); + b.iter(|| render_content(CONTENT, &context).unwrap()); } #[bench] -fn bench_markdown_to_html_without_highlighting(b: &mut test::Bencher) { - let tera_ctx = Tera::default(); +fn bench_render_content_without_highlighting(b: &mut test::Bencher) { + let mut tera = Tera::default(); + tera.add_raw_template("shortcodes/youtube.html", "{{id}}").unwrap(); let permalinks_ctx = HashMap::new(); - let context = Context::new(&tera_ctx, false, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); - b.iter(|| markdown_to_html(CONTENT, &context)); + let mut config = Config::default(); + config.highlight_code = false; + let context = RenderContext::new(&tera, &config, "", &permalinks_ctx, InsertAnchor::None); + b.iter(|| render_content(CONTENT, &context).unwrap()); +} + +#[bench] +fn bench_render_content_no_shortcode(b: &mut test::Bencher) { + let tera = Tera::default(); + let content2 = CONTENT.replace(r#"{{ youtube(id="my_youtube_id") }}"#, ""); + let mut config = Config::default(); + config.highlight_code = false; + let permalinks_ctx = HashMap::new(); + let context = RenderContext::new(&tera, &config, "", &permalinks_ctx, InsertAnchor::None); + + b.iter(|| render_content(&content2, &context).unwrap()); } #[bench] @@ -109,11 +126,3 @@ fn bench_render_shortcodes_one_present(b: &mut test::Bencher) { b.iter(|| render_shortcodes(CONTENT, &tera, &Config::default())); } -#[bench] -fn bench_render_shortcodes_none(b: &mut test::Bencher) { - let mut tera = Tera::default(); - tera.add_raw_template("shortcodes/youtube.html", "{{id}}").unwrap(); - let content2 = CONTENT.replace(r#"{{ youtube(id="my_youtube_id") }}"#, ""); - - b.iter(|| render_shortcodes(&content2, &tera, &Config::default())); -} diff --git a/components/rendering/src/context.rs b/components/rendering/src/context.rs index aa866be6..d8a2513f 100644 --- a/components/rendering/src/context.rs +++ b/components/rendering/src/context.rs @@ -1,41 +1,35 @@ use std::collections::HashMap; use tera::Tera; - use front_matter::InsertAnchor; +use config::Config; /// All the information from the gutenberg site that is needed to render HTML from markdown #[derive(Debug)] -pub struct Context<'a> { +pub struct RenderContext<'a> { pub tera: &'a Tera, - pub highlight_code: bool, - pub highlight_theme: String, - pub current_page_permalink: String, + pub config: &'a Config, + pub current_page_permalink: &'a str, pub permalinks: &'a HashMap, pub insert_anchor: InsertAnchor, } -impl<'a> Context<'a> { +impl<'a> RenderContext<'a> { pub fn new( tera: &'a Tera, - highlight_code: bool, - highlight_theme: String, - current_page_permalink: &str, + config: &'a Config, + current_page_permalink: &'a str, permalinks: &'a HashMap, insert_anchor: InsertAnchor, - ) -> Context<'a> { - Context { + ) -> RenderContext<'a> { + RenderContext { tera, - current_page_permalink: current_page_permalink.to_string(), + current_page_permalink, permalinks, insert_anchor, - highlight_code, - highlight_theme, + config, } } - pub fn should_insert_anchor(&self) -> bool { - self.insert_anchor != InsertAnchor::None - } } diff --git a/components/rendering/src/lib.rs b/components/rendering/src/lib.rs index 185c006a..00715af2 100644 --- a/components/rendering/src/lib.rs +++ b/components/rendering/src/lib.rs @@ -1,6 +1,3 @@ -#[macro_use] -extern crate lazy_static; -extern crate regex; extern crate tera; extern crate syntect; extern crate pulldown_cmark; @@ -12,7 +9,7 @@ extern crate pest; #[macro_use] extern crate pest_derive; - +#[macro_use] extern crate errors; extern crate front_matter; extern crate highlighting; @@ -26,9 +23,20 @@ mod context; mod markdown; mod table_of_contents; mod shortcode; -mod short_code; -pub use context::Context; -pub use markdown::markdown_to_html; +use errors::Result; + +use markdown::markdown_to_html; pub use table_of_contents::Header; pub use shortcode::render_shortcodes; +pub use context::RenderContext; + +pub fn render_content(content: &str, context: &RenderContext) -> Result<(String, Vec
)> { + // Don't do anything if there is nothing like a shortcode in the content + if content.contains("{{") || content.contains("{%") { + let rendered = render_shortcodes(content, context.tera, context.config)?; + return markdown_to_html(&rendered, context); + } + + markdown_to_html(&content, context) +} diff --git a/components/rendering/src/markdown.rs b/components/rendering/src/markdown.rs index b993dd70..a6ac28c9 100644 --- a/components/rendering/src/markdown.rs +++ b/components/rendering/src/markdown.rs @@ -8,37 +8,36 @@ use syntect::html::{start_coloured_html_snippet, styles_to_coloured_html, Includ use errors::Result; use utils::site::resolve_internal_link; -use context::Context; -use highlighting::{SYNTAX_SET, THEME_SET}; -use short_code::{SHORTCODE_RE, ShortCode, parse_shortcode, render_simple_shortcode}; +use highlighting::{get_highlighter, THEME_SET}; + use table_of_contents::{TempHeader, Header, make_table_of_contents}; +use context::RenderContext; + +// We might have cases where the slug is already present in our list of anchor +// for example an article could have several titles named Example +// We add a counter after the slug if the slug is already present, which +// means we will have example, example-1, example-2 etc +fn find_anchor(anchors: &[String], name: String, level: u8) -> String { + if level == 0 && !anchors.contains(&name) { + return name.to_string(); + } + + let new_anchor = format!("{}-{}", name, level + 1); + if !anchors.contains(&new_anchor) { + return new_anchor; + } + + find_anchor(anchors, name, level + 1) +} -pub fn markdown_to_html(content: &str, context: &Context) -> Result<(String, Vec
)> { - // We try to be smart about highlighting code as it can be time-consuming - // If the global config disables it, then we do nothing. However, - // if we see a code block in the content, we assume that this page needs - // to be highlighted. It could potentially have false positive if the content - // has ``` in it but that seems kind of unlikely - let should_highlight = if context.highlight_code { - content.contains("```") - } else { - false - }; +pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<(String, Vec
)> { + // the rendered html + let mut html = String::new(); // Set while parsing let mut error = None; + let mut highlighter: Option = None; - // the markdown parser will send several Text event if a markdown character - // is present in it, for example `hello_test` will be split in 2: hello and _test. - // Since we can use those chars in shortcode arguments, we need to collect - // the full shortcode somehow first - let mut current_shortcode = String::new(); - let mut shortcode_block = None; - // shortcodes live outside of paragraph so we need to ensure we don't close - // a paragraph that has already been closed - let mut added_shortcode = false; - // Don't transform things that look like shortcodes in code blocks - let mut in_code_block = false; // If we get text in header, we need to insert the id and a anchor let mut in_header = false; // pulldown_cmark can send several text events for a title if there are markdown @@ -46,254 +45,128 @@ pub fn markdown_to_html(content: &str, context: &Context) -> Result<(String, Vec let mut header_created = false; let mut anchors: Vec = vec![]; - // the rendered html - let mut html = String::new(); - - // We might have cases where the slug is already present in our list of anchor - // for example an article could have several titles named Example - // We add a counter after the slug if the slug is already present, which - // means we will have example, example-1, example-2 etc - fn find_anchor(anchors: &[String], name: String, level: u8) -> String { - if level == 0 && !anchors.contains(&name) { - return name.to_string(); - } - - let new_anchor = format!("{}-{}", name, level + 1); - if !anchors.contains(&new_anchor) { - return new_anchor; - } - - find_anchor(anchors, name, level + 1) - } - let mut headers = vec![]; // Defaults to a 0 level so not a real header // It should be an Option ideally but not worth the hassle to update let mut temp_header = TempHeader::default(); - let mut clear_shortcode_block = false; let mut opts = Options::empty(); opts.insert(OPTION_ENABLE_TABLES); opts.insert(OPTION_ENABLE_FOOTNOTES); { - let parser = Parser::new_ext(content, opts).map(|event| { - if clear_shortcode_block { - clear_shortcode_block = false; - shortcode_block = None; - } - match event { - Event::Text(mut text) => { - // Header first - if in_header { - if header_created { - temp_header.push(&text); + Event::Text(text) => { + // Header first + if in_header { + if header_created { + temp_header.push(&text); + return Event::Html(Owned(String::new())); + } + let id = find_anchor(&anchors, slugify(&text), 0); + anchors.push(id.clone()); + // update the header and add it to the list + temp_header.id = id.clone(); + // += as we might have some or other things already there + temp_header.title += &text; + temp_header.permalink = format!("{}#{}", context.current_page_permalink, id); + header_created = true; return Event::Html(Owned(String::new())); } - let id = find_anchor(&anchors, slugify(&text), 0); - anchors.push(id.clone()); - // update the header and add it to the list - temp_header.id = id.clone(); - // += as we might have some or other things already there - temp_header.title += &text; - temp_header.permalink = format!("{}#{}", context.current_page_permalink, id); - header_created = true; - return Event::Html(Owned(String::new())); - } - // if we are in the middle of a code block - if let Some(ref mut highlighter) = highlighter { - let highlighted = &highlighter.highlight(&text); - let html = styles_to_coloured_html(highlighted, IncludeBackground::Yes); - return Event::Html(Owned(html)); - } - - if in_code_block { - return Event::Text(text); - } - - // Are we in the middle of a shortcode that somehow got cut off - // by the markdown parser? - if current_shortcode.is_empty() { - if text.starts_with("{{") && !text.ends_with("}}") { - current_shortcode += &text; - } else if text.starts_with("{%") && !text.ends_with("%}") { - current_shortcode += &text; + // if we are in the middle of a code block + if let Some(ref mut highlighter) = highlighter { + let highlighted = &highlighter.highlight(&text); + let html = styles_to_coloured_html(highlighted, IncludeBackground::Yes); + return Event::Html(Owned(html)); } - } else { - current_shortcode += &text; - } - if current_shortcode.ends_with("}}") || current_shortcode.ends_with("%}") { - text = Owned(current_shortcode.clone()); - current_shortcode = String::new(); - } - - // Shortcode without body - if shortcode_block.is_none() && text.starts_with("{{") && text.ends_with("}}") && SHORTCODE_RE.is_match(&text) { - let (name, args) = parse_shortcode(&text); - - added_shortcode = true; - match render_simple_shortcode(context.tera, &name, &args) { - // Make before and after cleaning up of extra

/

tags more parallel. - // Or, in other words: - // TERRIBLE HORRIBLE NO GOOD VERY BAD HACK - Ok(s) => return Event::Html(Owned(format!("

{}

", s))), - Err(e) => { - error = Some(e); - return Event::Html(Owned(String::new())); - } + // Business as usual + Event::Text(text) + }, + Event::Start(Tag::CodeBlock(ref info)) => { + if !context.config.highlight_code { + return Event::Html(Owned("

".to_owned()));
                     }
-                }
-
-                // Shortcode with a body
-                if shortcode_block.is_none() && text.starts_with("{%") && text.ends_with("%}") {
-                    if SHORTCODE_RE.is_match(&text) {
-                        let (name, args) = parse_shortcode(&text);
-                        shortcode_block = Some(ShortCode::new(&name, args));
+                    let theme = &THEME_SET.themes[&context.config.highlight_theme];
+                    highlighter = Some(get_highlighter(&theme, info));
+                    let snippet = start_coloured_html_snippet(theme);
+                    Event::Html(Owned(snippet))
+                },
+                Event::End(Tag::CodeBlock(_)) => {
+                    if !context.config.highlight_code {
+                        return Event::Html(Owned("
\n".to_owned())) } - // Don't return anything - return Event::Text(Owned(String::new())); - } - - // If we have some text while in a shortcode, it's either the body - // or the end tag - if shortcode_block.is_some() { - if let Some(ref mut shortcode) = shortcode_block { - if text.trim() == "{% end %}" { - added_shortcode = true; - clear_shortcode_block = true; - match shortcode.render(context.tera) { - Ok(s) => return Event::Html(Owned(format!("

{}", s))), - Err(e) => { - error = Some(e); - return Event::Html(Owned(String::new())); - } + // reset highlight and close the code block + highlighter = None; + Event::Html(Owned("".to_owned())) + }, + // Need to handle relative links + Event::Start(Tag::Link(ref link, ref title)) => { + if in_header { + return Event::Html(Owned("".to_owned())); + } + if link.starts_with("./") { + match resolve_internal_link(link, context.permalinks) { + Ok(url) => { + return Event::Start(Tag::Link(Owned(url), title.clone())); + }, + Err(_) => { + error = Some(format!("Relative link {} not found.", link).into()); + return Event::Html(Owned("".to_string())); } - } else { - shortcode.append(&text); - return Event::Html(Owned(String::new())); - } + }; } - } - // Business as usual - Event::Text(text) - }, - Event::Start(Tag::CodeBlock(ref info)) => { - in_code_block = true; - if !should_highlight { - return Event::Html(Owned("
".to_owned()));
+                    Event::Start(Tag::Link(link.clone(), title.clone()))
+                },
+                Event::End(Tag::Link(_, _)) => {
+                    if in_header {
+                        return Event::Html(Owned("".to_owned()));
+                    }
+                    event
                 }
-                let theme = &THEME_SET.themes[&context.highlight_theme];
-                highlighter = SYNTAX_SET.with(|ss| {
-                    let syntax = info
-                        .split(' ')
-                        .next()
-                        .and_then(|lang| ss.find_syntax_by_token(lang))
-                        .unwrap_or_else(|| ss.find_syntax_plain_text());
-                    Some(HighlightLines::new(syntax, theme))
-                });
-                let snippet = start_coloured_html_snippet(theme);
-                Event::Html(Owned(snippet))
-            },
-            Event::End(Tag::CodeBlock(_)) => {
-                in_code_block = false;
-                if !should_highlight{
-                    return Event::Html(Owned("
\n".to_owned())) - } - // reset highlight and close the code block - highlighter = None; - Event::Html(Owned("".to_owned())) - }, - // Need to handle relative links - Event::Start(Tag::Link(ref link, ref title)) => { - if in_header { - return Event::Html(Owned("".to_owned())); - } - if link.starts_with("./") { - match resolve_internal_link(link, context.permalinks) { - Ok(url) => { - return Event::Start(Tag::Link(Owned(url), title.clone())); - }, - Err(_) => { - error = Some(format!("Relative link {} not found.", link).into()); - return Event::Html(Owned("".to_string())); - } - }; - } - - Event::Start(Tag::Link(link.clone(), title.clone())) - }, - Event::End(Tag::Link(_, _)) => { - if in_header { - return Event::Html(Owned("".to_owned())); - } - event + Event::Start(Tag::Code) => { + if in_header { + temp_header.push(""); + return Event::Html(Owned(String::new())); + } + event + }, + Event::End(Tag::Code) => { + if in_header { + temp_header.push(""); + return Event::Html(Owned(String::new())); + } + event + }, + Event::Start(Tag::Header(num)) => { + in_header = true; + temp_header = TempHeader::new(num); + Event::Html(Owned(String::new())) + }, + Event::End(Tag::Header(_)) => { + // End of a header, reset all the things and return the stringified version of the header + in_header = false; + header_created = false; + let val = temp_header.to_string(context.tera, context.insert_anchor); + headers.push(temp_header.clone()); + temp_header = TempHeader::default(); + Event::Html(Owned(val)) + }, + _ => event, } - // need to know when we are in a code block to disable shortcodes in them - Event::Start(Tag::Code) => { - in_code_block = true; - if in_header { - temp_header.push(""); - return Event::Html(Owned(String::new())); - } - event - }, - Event::End(Tag::Code) => { - in_code_block = false; - if in_header { - temp_header.push(""); - return Event::Html(Owned(String::new())); - } - event - }, - Event::Start(Tag::Header(num)) => { - in_header = true; - temp_header = TempHeader::new(num); - Event::Html(Owned(String::new())) - }, - Event::End(Tag::Header(_)) => { - // End of a header, reset all the things and return the stringified version of the header - in_header = false; - header_created = false; - let val = temp_header.to_string(context); - headers.push(temp_header.clone()); - temp_header = TempHeader::default(); - Event::Html(Owned(val)) - }, - // If we added shortcodes, don't close a paragraph since there's none - Event::End(Tag::Paragraph) => { - if added_shortcode { - added_shortcode = false; - return Event::Html(Owned("".to_owned())); - } - event - }, - // Ignore softbreaks inside shortcodes - Event::SoftBreak => { - if shortcode_block.is_some() { - return Event::Html(Owned("".to_owned())); - } - event - }, - _ => { - // println!("event = {:?}", event); - event - }, - }}); + }); cmark::html::push_html(&mut html, parser); } - if !current_shortcode.is_empty() { - return Err(format!("A shortcode was not closed properly:\n{:?}", current_shortcode).into()); - } - match error { Some(e) => Err(e), - None => Ok((html.replace("

", "").replace("

", "

"), make_table_of_contents(&headers))), + None => Ok(( + html.replace("

", "").replace("

", "

"), + make_table_of_contents(&headers) + )), } } diff --git a/components/rendering/src/short_code.rs b/components/rendering/src/short_code.rs deleted file mode 100644 index f1cd3fbb..00000000 --- a/components/rendering/src/short_code.rs +++ /dev/null @@ -1,190 +0,0 @@ -use std::collections::HashMap; - -use regex::Regex; -use tera::{Tera, Context, Value, to_value}; - -use errors::{Result, ResultExt}; - -lazy_static!{ - // Does this look like a shortcode? - pub static ref SHORTCODE_RE: Regex = Regex::new( - r#"\{(?:%|\{)\s+(\w+?)\((\w+?="?(?:.|\n)+?"?)?\)\s+(?:%|\})\}"# - ).unwrap(); - - // Parse the shortcode args with capture groups named after their type - pub static ref SHORTCODE_ARGS_RE: Regex = Regex::new( - r#"(?P\w+)=\s*((?P".*?")|(?P[-+]?[0-9]+\.[0-9]+)|(?P[-+]?[0-9]+)|(?Ptrue|false))"# - ).unwrap(); -} - -/// A shortcode that has a body -/// Called by having some content like {% ... %} body {% end %} -/// We need the struct to hold the data while we're processing the markdown -#[derive(Debug)] -pub struct ShortCode { - name: String, - args: HashMap, - body: String, -} - -impl ShortCode { - pub fn new(name: &str, args: HashMap) -> ShortCode { - ShortCode { - name: name.to_string(), - args, - body: String::new(), - } - } - - pub fn append(&mut self, text: &str) { - self.body.push_str(text) - } - - pub fn render(&self, tera: &Tera) -> Result { - let mut context = Context::new(); - for (key, value) in &self.args { - context.add(key, value); - } - context.add("body", &self.body); - let tpl_name = format!("shortcodes/{}.html", self.name); - tera.render(&tpl_name, &context) - .chain_err(|| format!("Failed to render {} shortcode", self.name)) - } -} - -/// Parse a shortcode without a body -pub fn parse_shortcode(input: &str) -> (String, HashMap) { - let mut args = HashMap::new(); - let caps = SHORTCODE_RE.captures(input).unwrap(); - // caps[0] is the full match - let name = &caps[1]; - - if let Some(arg_list) = caps.get(2) { - for arg_cap in SHORTCODE_ARGS_RE.captures_iter(arg_list.as_str()) { - let arg_name = arg_cap["name"].trim().to_string(); - - if let Some(arg_val) = arg_cap.name("str") { - args.insert(arg_name, to_value(arg_val.as_str().replace("\"", "")).unwrap()); - continue; - } - - if let Some(arg_val) = arg_cap.name("int") { - args.insert(arg_name, to_value(arg_val.as_str().parse::().unwrap()).unwrap()); - continue; - } - - if let Some(arg_val) = arg_cap.name("float") { - args.insert(arg_name, to_value(arg_val.as_str().parse::().unwrap()).unwrap()); - continue; - } - - if let Some(arg_val) = arg_cap.name("bool") { - args.insert(arg_name, to_value(arg_val.as_str() == "true").unwrap()); - continue; - } - } - } - - (name.to_string(), args) -} - -/// Renders a shortcode or return an error -pub fn render_simple_shortcode(tera: &Tera, name: &str, args: &HashMap) -> Result { - let mut context = Context::new(); - for (key, value) in args.iter() { - context.add(key, value); - } - let tpl_name = format!("shortcodes/{}.html", name); - - tera.render(&tpl_name, &context).chain_err(|| format!("Failed to render {} shortcode", name)) -} - - -#[cfg(test)] -mod tests { - use super::{parse_shortcode, SHORTCODE_RE}; - - #[test] - fn can_match_all_kinds_of_shortcode() { - let inputs = vec![ - "{{ basic() }}", - "{{ basic(ho=1) }}", - "{{ basic(ho=\"hey\") }}", - "{{ basic(ho=\"hey_underscore\") }}", - "{{ basic(ho=\"hey-dash\") }}", - "{% basic(ho=\"hey-dash\") %}", - "{% basic(ho=\"hey_underscore\") %}", - "{% basic() %}", - "{% quo_te(author=\"Bob\") %}", - "{{ quo_te(author=\"Bob\") }}", - // https://github.com/Keats/gutenberg/issues/229 - r#"{{ youtube(id="dQw4w9WgXcQ", - - autoplay=true) }}"#, - ]; - - for i in inputs { - println!("{}", i); - assert!(SHORTCODE_RE.is_match(i)); - } - } - - // https://github.com/Keats/gutenberg/issues/228 - #[test] - fn doesnt_panic_on_invalid_shortcode() { - let (name, args) = parse_shortcode(r#"{{ youtube(id="dQw4w9WgXcQ", autoplay) }}"#); - assert_eq!(name, "youtube"); - assert_eq!(args["id"], "dQw4w9WgXcQ"); - assert!(args.get("autoplay").is_none()); - } - - #[test] - fn can_parse_simple_shortcode_no_arg() { - let (name, args) = parse_shortcode(r#"{{ basic() }}"#); - assert_eq!(name, "basic"); - assert!(args.is_empty()); - } - - #[test] - fn can_parse_simple_shortcode_one_arg() { - let (name, args) = parse_shortcode(r#"{{ youtube(id="w7Ft2ymGmfc") }}"#); - assert_eq!(name, "youtube"); - assert_eq!(args["id"], "w7Ft2ymGmfc"); - } - - #[test] - fn can_parse_simple_shortcode_several_arg() { - let (name, args) = parse_shortcode(r#"{{ youtube(id="w7Ft2ymGmfc", autoplay=true) }}"#); - assert_eq!(name, "youtube"); - assert_eq!(args["id"], "w7Ft2ymGmfc"); - assert_eq!(args["autoplay"], true); - } - - #[test] - fn can_parse_block_shortcode_several_arg() { - let (name, args) = parse_shortcode(r#"{% youtube(id="w7Ft2ymGmfc", autoplay=true) %}"#); - assert_eq!(name, "youtube"); - assert_eq!(args["id"], "w7Ft2ymGmfc"); - assert_eq!(args["autoplay"], true); - } - - #[test] - fn can_parse_shortcode_number() { - let (name, args) = parse_shortcode(r#"{% test(int=42, float=42.0, autoplay=false) %}"#); - assert_eq!(name, "test"); - assert_eq!(args["int"], 42); - assert_eq!(args["float"], 42.0); - assert_eq!(args["autoplay"], false); - } - - // https://github.com/Keats/gutenberg/issues/249 - #[test] - fn can_parse_shortcode_with_comma_in_it() { - let (name, args) = parse_shortcode( - r#"{% quote(author="C++ Standard Core Language Defect Reports and Accepted Issues, Revision 82, delete and user-written deallocation function", href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#348") %}"# - ); - assert_eq!(name, "quote"); - assert_eq!(args["author"], "C++ Standard Core Language Defect Reports and Accepted Issues, Revision 82, delete and user-written deallocation function"); - assert_eq!(args["href"], "http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#348"); - } -} diff --git a/components/rendering/src/shortcode.rs b/components/rendering/src/shortcode.rs index 009a0cfe..4f0d0f1a 100644 --- a/components/rendering/src/shortcode.rs +++ b/components/rendering/src/shortcode.rs @@ -90,7 +90,8 @@ fn render_shortcode(name: String, args: Map, tera: &Tera, config: context.insert(key, value); } if let Some(ref b) = body { - context.insert("body", b); + // Trimming right to avoid most shortcodes with bodies ending up with a HTML new line + context.insert("body", b.trim_right()); } context.insert("config", config); let tpl_name = format!("shortcodes/{}.html", name); @@ -99,16 +100,25 @@ fn render_shortcode(name: String, args: Map, tera: &Tera, config: } pub fn render_shortcodes(content: &str, tera: &Tera, config: &Config) -> Result { - // Don't do anything if there is nothing like a shortcode in the content - if !content.contains("{{") && !content.contains("{%") { - return Ok(content.to_string()); - } - let mut res = String::with_capacity(content.len()); let mut pairs = match ContentParser::parse(Rule::page, content) { Ok(p) => p, - Err(_) => panic!("TODO"), // TODO: error handling + Err(e) => { + let fancy_e = e.renamed_rules(|rule| { + match *rule { + Rule::int => "an integer".to_string(), + Rule::float => "a float".to_string(), + Rule::string => "a string".to_string(), + Rule::literal => "a literal (int, float, string, bool)".to_string(), + Rule::array => "an array".to_string(), + Rule::kwarg => "a keyword argument".to_string(), + Rule::ident => "an identifier".to_string(), + _ => format!("TODO error: {:?}", rule).to_string(), + } + }); + bail!("{}", fancy_e); + }, }; // We have at least a `page` pair @@ -333,4 +343,10 @@ Hello World let res = render_shortcodes("Body\n {% youtube() %}Hey!{% end %}", &tera, &Config::default()).unwrap(); assert_eq!(res, "Body\n Hey!"); } + + #[test] + fn errors_on_unterminated_shortcode() { + let res = render_shortcodes("{{ youtube(", &Tera::default(), &Config::default()); + assert!(res.is_err()); + } } diff --git a/components/rendering/src/table_of_contents.rs b/components/rendering/src/table_of_contents.rs index 70f75954..688c64d9 100644 --- a/components/rendering/src/table_of_contents.rs +++ b/components/rendering/src/table_of_contents.rs @@ -1,8 +1,6 @@ -use tera::{Context as TeraContext}; +use tera::{Tera, Context as TeraContext}; use front_matter::InsertAnchor; -use context::Context; - #[derive(Debug, PartialEq, Clone, Serialize)] pub struct Header { @@ -50,16 +48,16 @@ impl TempHeader { } /// Transform all the information we have about this header into the HTML string for it - pub fn to_string(&self, context: &Context) -> String { - let anchor_link = if context.should_insert_anchor() { + pub fn to_string(&self, tera: &Tera, insert_anchor: InsertAnchor) -> String { + let anchor_link = if insert_anchor != InsertAnchor::None { let mut c = TeraContext::new(); c.add("id", &self.id); - context.tera.render("anchor-link.html", &c).unwrap() + tera.render("anchor-link.html", &c).unwrap() } else { String::new() }; - match context.insert_anchor { + match insert_anchor { InsertAnchor::None => format!("{t}\n", lvl=self.level, t=self.title, id=self.id), InsertAnchor::Left => format!("{a}{t}\n", lvl=self.level, a=anchor_link, t=self.title, id=self.id), InsertAnchor::Right => format!("{t}{a}\n", lvl=self.level, a=anchor_link, t=self.title, id=self.id), diff --git a/components/rendering/tests/markdown.rs b/components/rendering/tests/markdown.rs index 8dbdcc73..2e547f33 100644 --- a/components/rendering/tests/markdown.rs +++ b/components/rendering/tests/markdown.rs @@ -2,22 +2,25 @@ extern crate tera; extern crate front_matter; extern crate templates; extern crate rendering; +extern crate config; use std::collections::HashMap; use tera::Tera; +use config::Config; use front_matter::InsertAnchor; use templates::GUTENBERG_TERA; -use rendering::{Context, markdown_to_html}; +use rendering::{RenderContext, render_content}; #[test] -fn can_do_markdown_to_html_simple() { +fn can_do_render_content_simple() { let tera_ctx = Tera::default(); let permalinks_ctx = HashMap::new(); - let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); - let res = markdown_to_html("hello", &context).unwrap(); + let config = Config::default(); + let context = RenderContext::new(&tera_ctx, &config, "", &permalinks_ctx, InsertAnchor::None); + let res = render_content("hello", &context).unwrap(); assert_eq!(res.0, "

hello

\n"); } @@ -25,9 +28,10 @@ fn can_do_markdown_to_html_simple() { fn doesnt_highlight_code_block_with_highlighting_off() { let tera_ctx = Tera::default(); let permalinks_ctx = HashMap::new(); - let mut context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); - context.highlight_code = false; - let res = markdown_to_html("```\n$ gutenberg server\n```", &context).unwrap(); + let mut config = Config::default(); + config.highlight_code = false; + let context = RenderContext::new(&tera_ctx, &config, "", &permalinks_ctx, InsertAnchor::None); + let res = render_content("```\n$ gutenberg server\n```", &context).unwrap(); assert_eq!( res.0, "
$ gutenberg server\n
\n" @@ -38,8 +42,9 @@ fn doesnt_highlight_code_block_with_highlighting_off() { fn can_highlight_code_block_no_lang() { let tera_ctx = Tera::default(); let permalinks_ctx = HashMap::new(); - let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); - let res = markdown_to_html("```\n$ gutenberg server\n$ ping\n```", &context).unwrap(); + let config = Config::default(); + let context = RenderContext::new(&tera_ctx, &config, "", &permalinks_ctx, InsertAnchor::None); + let res = render_content("```\n$ gutenberg server\n$ ping\n```", &context).unwrap(); assert_eq!( res.0, "
\n$ gutenberg server\n$ ping\n
" @@ -50,8 +55,9 @@ fn can_highlight_code_block_no_lang() { fn can_highlight_code_block_with_lang() { let tera_ctx = Tera::default(); let permalinks_ctx = HashMap::new(); - let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); - let res = markdown_to_html("```python\nlist.append(1)\n```", &context).unwrap(); + let config = Config::default(); + let context = RenderContext::new(&tera_ctx, &config, "", &permalinks_ctx, InsertAnchor::None); + let res = render_content("```python\nlist.append(1)\n```", &context).unwrap(); assert_eq!( res.0, "
\nlist.append(1)\n
" @@ -62,8 +68,9 @@ fn can_highlight_code_block_with_lang() { fn can_higlight_code_block_with_unknown_lang() { let tera_ctx = Tera::default(); let permalinks_ctx = HashMap::new(); - let context = Context::new(&tera_ctx, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); - let res = markdown_to_html("```yolo\nlist.append(1)\n```", &context).unwrap(); + let config = Config::default(); + let context = RenderContext::new(&tera_ctx, &config, "", &permalinks_ctx, InsertAnchor::None); + let res = render_content("```yolo\nlist.append(1)\n```", &context).unwrap(); // defaults to plain text assert_eq!( res.0, @@ -74,8 +81,9 @@ fn can_higlight_code_block_with_unknown_lang() { #[test] fn can_render_shortcode() { let permalinks_ctx = HashMap::new(); - let context = Context::new(&GUTENBERG_TERA, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); - let res = markdown_to_html(r#" + let config = Config::default(); + let context = RenderContext::new(&GUTENBERG_TERA, &config, "", &permalinks_ctx, InsertAnchor::None); + let res = render_content(r#" Hello {{ youtube(id="ub36ffWAqgQ") }} @@ -87,7 +95,8 @@ Hello #[test] fn can_render_shortcode_with_markdown_char_in_args_name() { let permalinks_ctx = HashMap::new(); - let context = Context::new(&GUTENBERG_TERA, true, "base16-ocean-dark".to_string(), "", &permalinks_ctx, InsertAnchor::None); + let config = Config::default(); + let context = RenderContext::new(&GUTENBERG_TERA, &config, "", &permalinks_ctx, InsertAnchor::None); let input = vec![ "name", "na_me", @@ -95,7 +104,7 @@ fn can_render_shortcode_with_markdown_char_in_args_name() { "n1", ]; for i in input { - let res = markdown_to_html(&format!("{{{{ youtube(id=\"hey\", {}=1) }}}}", i), &context).unwrap(); + let res = render_content(&format!("{{{{ youtube(id=\"hey\", {}=1) }}}}", i), &context).unwrap(); assert!(res.0.contains(r#" @@ -34,7 +34,7 @@ That's it, Gutenberg will now recognise this template as a shortcode named `yout ## Using shortcodes -There are two kinds of shortcodes: +There are two kinds of shortcodes: - ones that do not take a body like the YouTube example above - ones that do, a quote for example @@ -43,7 +43,7 @@ In both cases, their arguments must be named and they will all be passed to the Any shortcodes in code blocks will be ignored. -Lastly, a shortcode name (and thus the corresponding `.html` file) as well as the arguments name +Lastly, a shortcode name (and thus the corresponding `.html` file) as well as the arguments name can only contain numbers, letters and underscores, or in Regex terms the following: `[0-9A-Za-z_]`. While theoretically an argument name could be a number, it will not be possible to use it in the template in that case. @@ -64,11 +64,11 @@ calls of the YouTube shortcode. ```md Here is a YouTube video: -{{ youtube(id="dQw4w9WgXcQ") }} +{{/* youtube(id="dQw4w9WgXcQ") */}} -{{ youtube(id="dQw4w9WgXcQ", autoplay=true) }} +{{/* youtube(id="dQw4w9WgXcQ", autoplay=true) */}} -{{ youtube(id="dQw4w9WgXcQ", autoplay=true, class="youtube") }} +{{/* youtube(id="dQw4w9WgXcQ", autoplay=true, class="youtube") */}} ``` ### Shortcodes with body @@ -86,9 +86,9 @@ We could use it in our markup file like so: ```md As someone said: -{% quote(author="Vincent") %} +{%/* quote(author="Vincent") */%} A quote -{% end %} +{%/* end */%} ``` The body of the shortcode will be automatically passed down to the rendering context as the `body` variable and needs @@ -112,11 +112,11 @@ The arguments are: Usage example: ```md -{{ youtube(id="dQw4w9WgXcQ") }} +{{/* youtube(id="dQw4w9WgXcQ") */}} -{{ youtube(id="dQw4w9WgXcQ", autoplay=true) }} +{{/* youtube(id="dQw4w9WgXcQ", autoplay=true) */}} -{{ youtube(id="dQw4w9WgXcQ", autoplay=true, class="youtube") }} +{{/* youtube(id="dQw4w9WgXcQ", autoplay=true, class="youtube") */}} ``` Result example: @@ -134,9 +134,9 @@ The arguments are: Usage example: ```md -{{ vimeo(id="124313553") }} +{{/* vimeo(id="124313553") */}} -{{ vimeo(id="124313553", class="vimeo") }} +{{/* vimeo(id="124313553", class="vimeo") */}} ``` Result example: @@ -145,7 +145,7 @@ Result example: ### Streamable Embed a player for a Streamable video. - + The arguments are: - `id`: the video id (mandatory) @@ -154,9 +154,9 @@ The arguments are: Usage example: ```md -{{ streamable(id="2zt0") }} +{{/* streamable(id="2zt0") */}} -{{ streamable(id="2zt0", class="streamble") }} +{{/* streamable(id="2zt0", class="streamble") */}} ``` Result example: @@ -164,7 +164,7 @@ Result example: {{ streamable(id="2zt0") }} ### Gist -Embed a [Github gist](). +Embed a [Github gist](https://gist.github.com). The arguments are: @@ -175,9 +175,9 @@ The arguments are: Usage example: ```md -{{ gist(url="https://gist.github.com/Keats/e5fb6aad409f28721c0ba14161644c57") }} +{{/* gist(url="https://gist.github.com/Keats/e5fb6aad409f28721c0ba14161644c57") */}} -{{ gist(url="https://gist.github.com/Keats/e5fb6aad409f28721c0ba14161644c57", class="gist") }} +{{/* gist(url="https://gist.github.com/Keats/e5fb6aad409f28721c0ba14161644c57", class="gist") */}} ``` Result example: diff --git a/docs/content/documentation/templates/overview.md b/docs/content/documentation/templates/overview.md index 1d67e943..f843059d 100644 --- a/docs/content/documentation/templates/overview.md +++ b/docs/content/documentation/templates/overview.md @@ -74,14 +74,14 @@ This can also be used to get the permalinks for static assets for example if we want to link to the file that is located at `static/css/app.css`: ```jinja2 -{{ get_url(path="css/app.css") }} +{{/* get_url(path="css/app.css") */}} ``` For assets it is reccommended that you pass `trailing_slash=false` to the `get_url` function. This prevents errors when dealing with certain hosting providers. An example is: ```jinja2 -{{ get_url(path="css/app.css", trailing_slash=false) }} +{{/* get_url(path="css/app.css", trailing_slash=false) */}} ``` In the case of non-internal links, you can also add a cachebust of the format `?t=1290192` at the end of a URL @@ -102,6 +102,6 @@ the value should be the same as the one in the front-matter, not the slugified v Gets the translation of the given `key`, for the `default_language` or the `language given ```jinja2 -{{ trans(key="title") }} -{{ trans(key="title", lang="fr") }} +{{/* trans(key="title") */}} +{{/* trans(key="title", lang="fr") */}} ``` From d334b1cf46121da36ae2b641fbf1726d65ed0fed Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Thu, 17 May 2018 19:04:42 +0200 Subject: [PATCH 19/74] More shortcode docs update --- CHANGELOG.md | 4 ++++ Cargo.lock | 2 +- Cargo.toml | 2 +- components/rendering/src/shortcode.rs | 12 +++++----- .../documentation/content/shortcodes.md | 24 ++++++++++++------- 5 files changed, 27 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75864499..70d1e890 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ - Fix `serve` not working with the config flag - Websocket port on `live` will not get the first available port instead of a fixed one +- Rewrite markdown rendering to fix all known issues with shortcodes +- Add array arguments to shortcodes and allow single-quote/backtick strings +- Co-located assets are now permalinks +- Words are now counted using unicode rather than whitespaces ## 0.3.4 (2018-06-22) diff --git a/Cargo.lock b/Cargo.lock index a22e66c7..e28a6aa9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -420,7 +420,7 @@ dependencies = [ [[package]] name = "gutenberg" -version = "0.3.4" +version = "0.4.0" dependencies = [ "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index 43b5269c..117d9768 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gutenberg" -version = "0.3.4" +version = "0.4.0" authors = ["Vincent Prouillet "] license = "MIT" readme = "README.md" diff --git a/components/rendering/src/shortcode.rs b/components/rendering/src/shortcode.rs index 913a0d7c..6ccc12f8 100644 --- a/components/rendering/src/shortcode.rs +++ b/components/rendering/src/shortcode.rs @@ -153,14 +153,14 @@ pub fn render_shortcodes(content: &str, tera: &Tera, config: &Config) -> Result< for p2 in p.into_inner() { match p2.as_rule() { Rule::ignored_sc_body_start | Rule::ignored_sc_body_end => { - res.push_str( - &p2.into_span().as_str() - .replacen("{%/*", "{%", 1) - .replacen("*/%}", "%}", 1) - ); + res.push_str( + &p2.into_span().as_str() + .replacen("{%/*", "{%", 1) + .replacen("*/%}", "%}", 1) + ); }, Rule::text_in_ignored_body_sc => res.push_str(p2.into_span().as_str()), - _ => unreachable!("Got something weird in an ignored shortcode"), + _ => unreachable!("Got something weird in an ignored shortcode: {:?}", p2), } } }, diff --git a/docs/content/documentation/content/shortcodes.md b/docs/content/documentation/content/shortcodes.md index 3b7d50c5..8b878a0b 100644 --- a/docs/content/documentation/content/shortcodes.md +++ b/docs/content/documentation/content/shortcodes.md @@ -41,24 +41,23 @@ There are two kinds of shortcodes: In both cases, their arguments must be named and they will all be passed to the template. -Any shortcodes in code blocks will be ignored. - Lastly, a shortcode name (and thus the corresponding `.html` file) as well as the arguments name can only contain numbers, letters and underscores, or in Regex terms the following: `[0-9A-Za-z_]`. While theoretically an argument name could be a number, it will not be possible to use it in the template in that case. -Argument values can be of 4 types: +Argument values can be of 5 types: -- string: surrounded by double quotes `"..."` +- string: surrounded by double quotes, single quotes or backticks - bool: `true` or `false` - float: a number with a `.` in it - integer: a number without a `.` in it +- array: an array of any kind of values, except arrays Malformed values will be silently ignored. ### Shortcodes without body -On a new line, call the shortcode as if it was a Tera function in a variable block. All the examples below are valid +Simply call the shortcode as if it was a Tera function in a variable block. All the examples below are valid calls of the YouTube shortcode. ```md @@ -68,9 +67,12 @@ Here is a YouTube video: {{/* youtube(id="dQw4w9WgXcQ", autoplay=true) */}} -{{/* youtube(id="dQw4w9WgXcQ", autoplay=true, class="youtube") */}} +An inline {{/* youtube(id="dQw4w9WgXcQ", autoplay=true, class="youtube") */}} shortcode ``` +Note that if you want to have some content that looks like a shortcode but not have Gutenberg try to render it, +you will need to escape it by using `{{/*` and `*/}}` instead of `{{` and `}}`. + ### Shortcodes with body For example, let's imagine we have the following shortcode `quote.html` template: @@ -94,6 +96,10 @@ A quote The body of the shortcode will be automatically passed down to the rendering context as the `body` variable and needs to be in a newline. +If you want to have some content that looks like a shortcode but not have Gutenberg try to render it, +you will need to escape it by using `{%/*` and `*/%}` instead of `{%` and `%}`. You won't need to escape +anything else until the closing tag. + ## Built-in shortcodes Gutenberg comes with a few built-in shortcodes. If you want to override a default shortcode template, @@ -154,14 +160,14 @@ The arguments are: Usage example: ```md -{{/* streamable(id="2zt0") */}} +{{/* streamable(id="92ok4") */}} -{{/* streamable(id="2zt0", class="streamble") */}} +{{/* streamable(id="92ok4", class="streamble") */}} ``` Result example: -{{ streamable(id="2zt0") }} +{{ streamable(id="92ok4") }} ### Gist Embed a [Github gist](https://gist.github.com). From 28641fc22368b34b76e6df05740a5060531ac5a1 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Thu, 17 May 2018 19:08:56 +0200 Subject: [PATCH 20/74] Add HTML aliases to changelog --- CHANGELOG.md | 1 + components/utils/src/lib.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70d1e890..5e9384b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ - Add array arguments to shortcodes and allow single-quote/backtick strings - Co-located assets are now permalinks - Words are now counted using unicode rather than whitespaces +- Aliases can now be pointing directly to specific HTML files ## 0.3.4 (2018-06-22) diff --git a/components/utils/src/lib.rs b/components/utils/src/lib.rs index a1fdb178..9d8e9c10 100644 --- a/components/utils/src/lib.rs +++ b/components/utils/src/lib.rs @@ -5,6 +5,7 @@ extern crate errors; extern crate tempfile; extern crate tera; extern crate walkdir; +extern crate unicode_segmentation; pub mod fs; pub mod site; From f07bb38c37bb5eaff70d8c7dc919603221b7540f Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Fri, 18 May 2018 14:51:44 +0200 Subject: [PATCH 21/74] Fix image in markdown rendering --- components/rendering/src/markdown.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/rendering/src/markdown.rs b/components/rendering/src/markdown.rs index 78f6a5f5..50ba80ec 100644 --- a/components/rendering/src/markdown.rs +++ b/components/rendering/src/markdown.rs @@ -115,7 +115,7 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<(Strin ); } - Event::Start(Tag::Link(src, title)) + Event::Start(Tag::Image(src, title)) }, Event::Start(Tag::Link(link, title)) => { // A few situations here: From 3eb571fdbf08ea2b15e96768840d109dfdd2c297 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Sat, 19 May 2018 12:12:02 +0200 Subject: [PATCH 22/74] Trim left every line of a shortcode to avoid the accidental markdown codeblock --- components/rendering/src/shortcode.rs | 8 ++++++- components/rendering/tests/markdown.rs | 22 +++++++++++++++++++ .../documentation/content/shortcodes.md | 3 +++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/components/rendering/src/shortcode.rs b/components/rendering/src/shortcode.rs index 6ccc12f8..e88e8361 100644 --- a/components/rendering/src/shortcode.rs +++ b/components/rendering/src/shortcode.rs @@ -96,7 +96,13 @@ fn render_shortcode(name: String, args: Map, tera: &Tera, config: context.insert("config", config); let tpl_name = format!("shortcodes/{}.html", name); - tera.render(&tpl_name, &context).chain_err(|| format!("Failed to render {} shortcode", name)) + let res = tera + .render(&tpl_name, &context) + .chain_err(|| format!("Failed to render {} shortcode", name))?; + + // We trim left every single line of a shortcode to avoid the accidental + // shortcode counted as code block because of 4 spaces left padding + Ok(res.lines().map(|s| s.trim_left()).collect()) } pub fn render_shortcodes(content: &str, tera: &Tera, config: &Config) -> Result { diff --git a/components/rendering/tests/markdown.rs b/components/rendering/tests/markdown.rs index 2e77b21e..eda40362 100644 --- a/components/rendering/tests/markdown.rs +++ b/components/rendering/tests/markdown.rs @@ -515,3 +515,25 @@ fn can_make_permalinks_with_colocated_assets_for_image() { "

\"alt

\n" ); } + +#[test] +fn markdown_doesnt_wrap_html_in_paragraph() { + let permalinks_ctx = HashMap::new(); + let config = Config::default(); + let context = RenderContext::new(&GUTENBERG_TERA, &config, "https://vincent.is/about/", &permalinks_ctx, InsertAnchor::None); + let res = render_content(r#" +Some text + +

Helo

+ + + "#, &context).unwrap(); + assert_eq!( + res.0, + "

Some text

\n

Helo

\n
\n\n \"MobX\n \n
\n" + ); +} diff --git a/docs/content/documentation/content/shortcodes.md b/docs/content/documentation/content/shortcodes.md index 8b878a0b..584975f7 100644 --- a/docs/content/documentation/content/shortcodes.md +++ b/docs/content/documentation/content/shortcodes.md @@ -32,6 +32,9 @@ are in a `if` statement, we can assume they are optional. That's it, Gutenberg will now recognise this template as a shortcode named `youtube` (the filename minus the `.html` extension). +The markdown renderer will wrap an inline HTML node like `` or `` into a paragraph. If you want to disable that, +simply wrap your shortcode in a `div`. + ## Using shortcodes There are two kinds of shortcodes: From 6662014e5571e44b169a89cbef05450c8251a898 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Fri, 2 Feb 2018 21:35:04 +0100 Subject: [PATCH 23/74] Add image resizing support #225 --- Cargo.lock | 178 ++++++++++ Cargo.toml | 1 + components/content/Cargo.toml | 1 + components/content/src/lib.rs | 1 + components/content/src/page.rs | 26 +- components/content/src/section.rs | 5 +- components/errors/Cargo.toml | 1 + components/errors/src/lib.rs | 2 + components/imageproc/Cargo.toml | 15 + components/imageproc/src/lib.rs | 327 ++++++++++++++++++ components/rendering/src/context.rs | 6 +- components/rendering/src/lib.rs | 2 +- components/rendering/src/shortcode.rs | 55 +-- components/site/Cargo.toml | 1 + components/site/src/lib.rs | 52 ++- components/templates/Cargo.toml | 1 + components/templates/src/global_fns.rs | 68 +++- components/templates/src/lib.rs | 1 + components/utils/src/fs.rs | 26 ++ .../content/image-resizing/index.md | 8 + .../documentation/templates/pages-sections.md | 1 + docs/templates/shortcodes/gallery.html | 6 + docs/templates/shortcodes/resize_image.html | 1 + src/cmd/serve.rs | 4 +- src/console.rs | 3 +- 25 files changed, 738 insertions(+), 54 deletions(-) create mode 100644 components/imageproc/Cargo.toml create mode 100644 components/imageproc/src/lib.rs create mode 100644 docs/content/documentation/content/image-resizing/index.md create mode 100644 docs/templates/shortcodes/gallery.html create mode 100644 docs/templates/shortcodes/resize_image.html diff --git a/Cargo.lock b/Cargo.lock index e28a6aa9..f0d8aa10 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,3 +1,8 @@ +[[package]] +name = "adler32" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "aho-corasick" version = "0.6.4" @@ -183,6 +188,11 @@ dependencies = [ "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "color_quant" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "config" version = "0.1.0" @@ -204,6 +214,7 @@ dependencies = [ "errors 0.1.0", "front_matter 0.1.0", "globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "imageproc 0.1.0", "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "rendering 0.1.0", "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", @@ -254,6 +265,15 @@ dependencies = [ "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "deflate" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "dtoa" version = "0.4.2" @@ -290,6 +310,14 @@ dependencies = [ "strum_macros 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "enum_primitive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "error-chain" version = "0.11.0" @@ -303,6 +331,7 @@ name = "errors" version = "0.1.0" dependencies = [ "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "image 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -401,6 +430,15 @@ name = "getopts" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "gif" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "glob" version = "0.2.11" @@ -500,6 +538,44 @@ dependencies = [ "unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "image" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "gif 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", + "jpeg-decoder 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", + "num-rational 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "png 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "imageproc" +version = "0.1.0" +dependencies = [ + "errors 0.1.0", + "image 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", + "twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "utils 0.1.0", +] + +[[package]] +name = "inflate" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "inotify" version = "0.3.0" @@ -537,6 +613,15 @@ name = "itoa" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "jpeg-decoder" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "kernel32-sys" version = "0.2.2" @@ -587,6 +672,11 @@ dependencies = [ "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lzw" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "mac" version = "0.1.1" @@ -810,6 +900,32 @@ dependencies = [ "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "num-iter" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-rational" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-traits" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "num-traits" version = "0.2.5" @@ -948,6 +1064,17 @@ dependencies = [ "typemap 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "png" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "deflate 0.7.18 (registry+https://github.com/rust-lang/crates.io-index)", + "inflate 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "precomputed-hash" version = "0.1.1" @@ -999,6 +1126,16 @@ dependencies = [ "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rand" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rand" version = "0.4.2" @@ -1009,6 +1146,15 @@ dependencies = [ "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rayon" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rayon" version = "1.0.1" @@ -1175,6 +1321,11 @@ dependencies = [ "pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "scoped_threadpool" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "scopeguard" version = "0.3.3" @@ -1250,6 +1401,7 @@ dependencies = [ "errors 0.1.0", "front_matter 0.1.0", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "imageproc 0.1.0", "pagination 0.1.0", "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "sass-rs 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1441,6 +1593,7 @@ dependencies = [ "config 0.1.0", "content 0.1.0", "errors 0.1.0", + "imageproc 0.1.0", "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "taxonomies 0.1.0", @@ -1544,6 +1697,14 @@ name = "traitobject" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "twox-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "typeable" version = "0.1.2" @@ -1750,6 +1911,7 @@ dependencies = [ ] [metadata] +"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4" "checksum ammonia 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fd4c682378117e4186a492b2252b9537990e1617f44aed9788b9a1149de45477" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" @@ -1773,14 +1935,17 @@ dependencies = [ "checksum chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6962c635d530328acc53ac6a955e83093fedc91c5809dfac1fa60fa470830a37" "checksum clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0f16b89cbb9ee36d87483dc939fe9f1e13c05898d56d7b230a0d4dff033a536" "checksum cmake 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "95470235c31c726d72bf2e1f421adc1e65b9d561bf5529612cbe1a72da1467b3" +"checksum color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbbb57365263e881e805dc77d94697c9118fd94d8da011240555aa7b23445bd" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" "checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "630391922b1b893692c6334369ff528dcc3a9d8061ccf4c803aa8f83cb13db5e" +"checksum deflate 0.7.18 (registry+https://github.com/rust-lang/crates.io-index)" = "32c8120d981901a9970a3a1c97cf8b630e0fa8c3ca31e75b6fd6fd5f9f427b31" "checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab" "checksum duct 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "166298c17c5b4fe5997b962c2f22e887c7c5adc44308eb9103ce5b66af45a423" "checksum either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be565ca5c557d7f59e7cfcf1844f9e3033650c929c6566f511e8005f205c1d0" "checksum elasticlunr-rs 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4837d77a1e157489a3933b743fd774ae75074e0e390b2b7f071530048a0d87ee" +"checksum enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be4551092f4d519593039259a9ed8daedf0da12e5109c5280338073eaeb81180" "checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3" "checksum filetime 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "714653f3e34871534de23771ac7b26e999651a0a228f47beb324dfdf1dd4b10f" "checksum flate2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9fac2277e84e5e858483756647a9d0aa8d9a2b7cba517fd84325a0aaa69a0909" @@ -1793,6 +1958,7 @@ dependencies = [ "checksum futf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" "checksum getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "b900c08c1939860ce8b54dc6a89e26e00c04c380fd0e09796799bd7f12861e05" +"checksum gif 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2e41945ba23db3bf51b24756d73d81acb4f28d85c3dccc32c6fae904438c25f" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "checksum globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "142754da2c9b3722affd909f9e27f2a6700a7a303f362971e0a74c652005a43d" "checksum html5ever 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b04478cf718862650a0bf66acaf8f2f8c906fbc703f35c916c1f4211b069a364" @@ -1800,10 +1966,13 @@ dependencies = [ "checksum humansize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6cab2627acfc432780848602f3f558f7e9dd427352224b0d9324025796d2a5e" "checksum hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)" = "368cb56b2740ebf4230520e2b90ebb0461e69034d85d1945febd9b3971426db2" "checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d" +"checksum image 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "545f000e8aa4e569e93f49c446987133452e0091c2494ac3efd3606aa3d309f2" +"checksum inflate 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f5f9f47468e9a76a6452271efadc88fe865a82be91fe75e6c0c57b87ccea59d4" "checksum inotify 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887fcc180136e77a85e6a6128579a719027b1bab9b1c38ea4444244fe262c20c" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" "checksum iron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d8e17268922834707e1c29e8badbf9c712c9c43378e1b6a3388946baff10be2" "checksum itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c069bbec61e1ca5a596166e55dfe4773ff745c3d16b700013bcaff9a6df2c682" +"checksum jpeg-decoder 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "c8b7d43206b34b3f94ea9445174bda196e772049b9bddbc620c9d29b2d20110d" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" "checksum lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e6412c5e2ad9584b0b8e979393122026cdd6d2a80b933f890dcd694ddbe73739" @@ -1812,6 +1981,7 @@ dependencies = [ "checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6fddaa003a65722a7fb9e26b0ce95921fe4ba590542ced664d8ce2fa26f9f3ac" +"checksum lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084" "checksum mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" "checksum maplit 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08cbb6b4fef96b6d77bfc40ec491b1690c779e77b05cd9f07f787ed376fd4c43" "checksum markup5ever 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfedc97d5a503e96816d10fedcd5b42f760b2e525ce2f7ec71f6a41780548475" @@ -1835,6 +2005,9 @@ dependencies = [ "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum notify 4.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5c3812da3098f210a0bb440f9c008471a031aa4c1de07a264fdd75456c95a4eb" "checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" +"checksum num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "af3fdbbc3291a5464dc57b03860ec37ca6bf915ed6ee385e7c6c052c422b2124" +"checksum num-rational 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ee314c74bd753fc86b4780aa9475da469155f3848473a261d2d18e35245a784e" +"checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" "checksum num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "630de1ef5cc79d0cdd78b7e33b81f083cbfe90de0f4b2b2f07f905867c70e9fe" "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" "checksum onig 3.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f5eeb268a4620c74ea5768c6d2ccd492d60a47a8754666b91a46bfc35cd4d1ba" @@ -1850,6 +2023,7 @@ dependencies = [ "checksum pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "110d5ee3593dbb73f56294327fe5668bcc997897097cbc76b51e7aed3f52452f" "checksum plist 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c61ac2afed2856590ae79d6f358a24b85ece246d2aa134741a66d589519b7503" "checksum plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1a6a0dc3910bc8db877ffed8e457763b317cf880df4ae19109b9f77d277cf6e0" +"checksum png 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f0b0cabbbd20c2d7f06dbf015e06aad59b6ca3d9ed14848783e98af9aaf19925" "checksum precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" "checksum proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1b06e2f335f48d24442b35a19df506a835fb3547bc3c06ef27340da9acf5cae7" "checksum proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "effdb53b25cdad54f8f48843d67398f7ef2e14f12c1b4cb4effc549a6462a4d6" @@ -1857,7 +2031,9 @@ dependencies = [ "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" "checksum quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9949cfe66888ffe1d53e6ec9d9f3b70714083854be20fd5e271b232a017401e8" "checksum quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e44651a0dc4cdd99f71c83b561e221f714912d11af1a4dff0631f923d53af035" +"checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" +"checksum rayon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed02d09394c94ffbdfdc755ad62a132e94c3224a8354e78a1200ced34df12edf" "checksum rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80e811e76f1dbf68abf87a759083d34600017fc4e10b6bd5ad84a700f9dba4b1" "checksum rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d24ad214285a7729b174ed6d3bcfcb80177807f959d95fafd5bfc5c4f201ac8" "checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" @@ -1874,6 +2050,7 @@ dependencies = [ "checksum same-file 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfb6eded0b06a0b512c8ddbcf04089138c9b4362c2f696f3c3d76039d68f3637" "checksum sass-rs 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90f8cf6e645aa843ffffcbdc1e8752b1f221dfa314c81895aeb229a77aea7e05" "checksum sass-sys 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "bae88baa915f59c39820e544cfd9296d815a6b8efc3f276a78a0505866d2b4e9" +"checksum scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum sequence_trie 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "32157204e5c9d3c04007bd7e56e96e987635ce0e8e23c085b1e403861b76c351" "checksum serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)" = "e9a2d9a9ac5120e0f768801ca2b58ad6eec929dc9d1d616c162f208869c2ce95" @@ -1909,6 +2086,7 @@ dependencies = [ "checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b" "checksum toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a0263c6c02c4db6c8f7681f9fd35e90de799ebd4cfdeab77a38f4ff6b3d8c0d9" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" +"checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" "checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" "checksum typemap 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "653be63c80a3296da5551e1bfd2cca35227e13cdd08c6668903ae2f4f77aa1f6" "checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d" diff --git a/Cargo.toml b/Cargo.toml index 117d9768..bed693a3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,4 +53,5 @@ members = [ "components/templates", "components/utils", "components/search", + "components/imageproc", ] diff --git a/components/content/Cargo.toml b/components/content/Cargo.toml index 80cfec13..2e7724e7 100644 --- a/components/content/Cargo.toml +++ b/components/content/Cargo.toml @@ -14,6 +14,7 @@ config = { path = "../config" } utils = { path = "../utils" } rendering = { path = "../rendering" } front_matter = { path = "../front_matter" } +imageproc = { path = "../imageproc" } [dev-dependencies] tempfile = "3" diff --git a/components/content/src/lib.rs b/components/content/src/lib.rs index a0fddac4..dc5cf9c4 100644 --- a/components/content/src/lib.rs +++ b/components/content/src/lib.rs @@ -7,6 +7,7 @@ extern crate errors; extern crate config; extern crate front_matter; extern crate rendering; +extern crate imageproc; extern crate utils; #[cfg(test)] diff --git a/components/content/src/page.rs b/components/content/src/page.rs index d2f940d7..47d2ad8e 100644 --- a/components/content/src/page.rs +++ b/components/content/src/page.rs @@ -15,6 +15,7 @@ use utils::site::get_reading_analytics; use utils::templates::render_template; use front_matter::{PageFrontMatter, InsertAnchor, split_page_content}; use rendering::{RenderContext, Header, render_content}; +use imageproc; use file_info::FileInfo; @@ -162,13 +163,16 @@ impl Page { /// We need access to all pages url to render links relative to content /// so that can't happen at the same time as parsing pub fn render_markdown(&mut self, permalinks: &HashMap, tera: &Tera, config: &Config, anchor_insert: InsertAnchor) -> Result<()> { - let context = RenderContext::new( + let mut context = RenderContext::new( tera, config, &self.permalink, permalinks, anchor_insert ); + + context.teracontext.add("page", self); + let res = render_content( &self.raw_content.replacen("", "", 1), &context @@ -202,6 +206,23 @@ impl Page { render_template(&tpl_name, tera, &context, &config.theme) .chain_err(|| format!("Failed to render page '{}'", self.file.path.display())) } + + /// Creates two vectors of asset URLs. The first one contains all asset files, + /// the second one that which appear to be an image file. + fn serialize_assets(&self) -> (Vec, Vec) { + let mut assets = vec![]; + let mut images = vec![]; + for asset in self.assets.iter() { + if let Some(filename) = asset.file_name().and_then(|f| f.to_str()) { + let url = self.path.clone() + filename; + if imageproc::file_is_img(&asset) { + images.push(url.clone()); + } + assets.push(url); + } + } + (assets, images) + } } impl Default for Page { @@ -246,6 +267,9 @@ impl ser::Serialize for Page { state.serialize_field("next", &self.next)?; state.serialize_field("toc", &self.toc)?; state.serialize_field("draft", &self.is_draft())?; + let (assets, assets_imgs) = self.serialize_assets(); + state.serialize_field("assets", &assets)?; + state.serialize_field("assets_imgs", &assets_imgs)?; state.end() } } diff --git a/components/content/src/section.rs b/components/content/src/section.rs index 550acf76..b634dc96 100644 --- a/components/content/src/section.rs +++ b/components/content/src/section.rs @@ -98,13 +98,16 @@ impl Section { /// We need access to all pages url to render links relative to content /// so that can't happen at the same time as parsing pub fn render_markdown(&mut self, permalinks: &HashMap, tera: &Tera, config: &Config) -> Result<()> { - let context = RenderContext::new( + let mut context = RenderContext::new( tera, config, &self.permalink, permalinks, self.meta.insert_anchor_links, ); + + context.teracontext.add("section", self); + let res = render_content(&self.raw_content, &context) .chain_err(|| format!("Failed to render content of {}", self.file.path.display()))?; self.content = res.0; diff --git a/components/errors/Cargo.toml b/components/errors/Cargo.toml index 285bfeda..c742ca41 100644 --- a/components/errors/Cargo.toml +++ b/components/errors/Cargo.toml @@ -7,3 +7,4 @@ authors = ["Vincent Prouillet "] error-chain = "0.11" tera = "0.11" toml = "0.4" +image = "0.18.0" diff --git a/components/errors/src/lib.rs b/components/errors/src/lib.rs index cc698c61..a21041d2 100755 --- a/components/errors/src/lib.rs +++ b/components/errors/src/lib.rs @@ -4,6 +4,7 @@ extern crate error_chain; extern crate tera; extern crate toml; +extern crate image; error_chain! { errors {} @@ -15,6 +16,7 @@ error_chain! { foreign_links { Io(::std::io::Error); Toml(toml::de::Error); + Image(image::ImageError); } } diff --git a/components/imageproc/Cargo.toml b/components/imageproc/Cargo.toml new file mode 100644 index 00000000..571b2ede --- /dev/null +++ b/components/imageproc/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "imageproc" +version = "0.1.0" +authors = ["Vojtěch Král "] + +[dependencies] +lazy_static = "1" +regex = "0.2" +tera = "0.11.0" +image = "0.18.0" +rayon = "0.9" +twox-hash = "1.1" + +errors = { path = "../errors" } +utils = { path = "../utils" } diff --git a/components/imageproc/src/lib.rs b/components/imageproc/src/lib.rs new file mode 100644 index 00000000..78fa8044 --- /dev/null +++ b/components/imageproc/src/lib.rs @@ -0,0 +1,327 @@ +#[macro_use] +extern crate lazy_static; +extern crate regex; +extern crate image; +extern crate rayon; +extern crate twox_hash; + +extern crate utils; +extern crate errors; + +use std::path::{Path, PathBuf}; +use std::hash::{Hash, Hasher}; +use std::collections::HashMap; +use std::collections::hash_map::Entry as HEntry; +use std::fs::{self, File}; + +use regex::Regex; +use image::{GenericImage, FilterType}; +use image::jpeg::JPEGEncoder; +use rayon::prelude::*; +use twox_hash::XxHash; + +use utils::fs as ufs; +use errors::{Result, ResultExt}; + + +static RESIZED_SUBDIR: &'static str = "_resized_images"; +lazy_static!{ + pub static ref RESIZED_FILENAME: Regex = Regex::new(r#"([0-9a-f]{16})([0-9a-f]{2})[.]jpg"#).unwrap(); +} + +/// Describes the precise kind of a resize operation +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ResizeOp { + /// A simple scale operation that doesn't take aspect ratio into account + Scale(u32, u32), + /// Scales the image to a specified width with height computed such that aspect ratio is preserved + FitWidth(u32), + /// Scales the image to a specified height with width computed such that aspect ratio is preserved + FitHeight(u32), + /// Scales the image such that it fits within the specified width and height preserving aspect ratio. + /// Either dimension may end up being smaller, but never larger than specified. + Fit(u32, u32), + /// Scales the image such that it fills the specified width and height. Output will always have the exact dimensions specified. + /// The part of the image that doesn't fit in the thumbnail due to differing aspect ratio will be cropped away, if any. + Fill(u32, u32), +} + +impl ResizeOp { + pub fn from_args(op: &str, width: Option, height: Option) -> Result { + use ResizeOp::*; + + // Validate args: + match op { + "fitwidth" => if width.is_none() { return Err(format!("op=fitwidth requires a `width` argument").into()) }, + "fitheight" => if height.is_none() { return Err(format!("op=fitwidth requires a `height` argument").into()) }, + "scale" | "fit" | "fill" => if width.is_none() || height.is_none() { + return Err(format!("op={} requires a `width` and `height` argument", op).into()) + }, + _ => return Err(format!("Invalid image resize operation: {}", op).into()) + }; + + Ok(match op { + "scale" => Scale(width.unwrap(), height.unwrap()), + "fitwidth" => FitWidth(width.unwrap()), + "fitheight" => FitHeight(height.unwrap()), + "fit" => Fit(width.unwrap(), height.unwrap()), + "fill" => Fill(width.unwrap(), height.unwrap()), + _ => unreachable!(), + }) + } + + pub fn width(self) -> Option { + use ResizeOp::*; + + match self { + Scale(w, _) => Some(w), + FitWidth(w) => Some(w), + FitHeight(_) => None, + Fit(w, _) => Some(w), + Fill(w, _) => Some(w), + } + } + + pub fn height(self) -> Option { + use ResizeOp::*; + + match self { + Scale(_, h) => Some(h), + FitWidth(_) => None, + FitHeight(h) => Some(h), + Fit(_, h) => Some(h), + Fill(_, h) => Some(h), + } + } +} + +impl From for u8 { + fn from(op: ResizeOp) -> u8 { + use ResizeOp::*; + + match op { + Scale(_, _) => 1, + FitWidth(_) => 2, + FitHeight(_) => 3, + Fit(_, _) => 4, + Fill(_, _) => 5, + } + } +} + +impl Hash for ResizeOp { + fn hash(&self, hasher: &mut H) { + hasher.write_u8(u8::from(*self)); + if let Some(w) = self.width() { hasher.write_u32(w); } + if let Some(h) = self.height() { hasher.write_u32(h); } + } +} + +/// Holds all data needed to perform a resize operation +#[derive(Debug, PartialEq, Eq)] +pub struct ImageOp { + source: String, + op: ResizeOp, + quality: u8, + hash: u64, + collision: Option, +} + +impl ImageOp { + pub fn new(source: String, op: ResizeOp, quality: u8) -> ImageOp { + let mut hasher = XxHash::with_seed(0); + hasher.write(source.as_ref()); + op.hash(&mut hasher); + hasher.write_u8(quality); + let hash = hasher.finish(); + + ImageOp { source, op, quality, hash, collision: None } + } + + pub fn from_args(source: String, op: &str, width: Option, height: Option, quality: u8) -> Result { + let op = ResizeOp::from_args(op, width, height)?; + Ok(Self::new(source, op, quality)) + } + + fn num_colli(&self) -> u32 { self.collision.unwrap_or(0) } + + fn perform(&self, content_path: &Path, target_path: &Path) -> Result<()> { + use ResizeOp::*; + + let src_path = content_path.join(&self.source); + if !ufs::file_stale(&src_path, target_path) { + return Ok(()) + } + + let mut img = image::open(&src_path)?; + let (img_w, img_h) = img.dimensions(); + + const RESIZE_FILTER: FilterType = FilterType::Gaussian; + const RATIO_EPSILLION: f32 = 0.1; + + let img = match self.op { + Scale(w, h) => img.resize_exact(w, h, RESIZE_FILTER), + FitWidth(w) => img.resize(w, u32::max_value(), RESIZE_FILTER), + FitHeight(h) => img.resize(u32::max_value(), h, RESIZE_FILTER), + Fit(w, h) => img.resize(w, h, RESIZE_FILTER), + Fill(w, h) => { + let fw = img_w as f32 / w as f32; + let fh = img_h as f32 / h as f32; + + if (fw - fh).abs() <= RATIO_EPSILLION { + // The aspect is similar enough that there's not much point in cropping + img.resize_exact(w, h, RESIZE_FILTER) + } else { + // We perform the fill such that a crop is performed first and then resize_exact can be used, + // which should be cheaper than resizing and then cropping (smaller number of pixels to resize). + let (crop_w, crop_h) = match fw < fh { + true => (img_w, (fw * h as f32).round() as u32), + false => ((fh * w as f32).round() as u32, img_h), + }; + let (off_w, off_h) = match fw < fh { + true => (0, (img_h - crop_h) / 2), + false => ((img_w - crop_w) / 2, 0), + }; + img.crop(off_w, off_h, crop_w, crop_h).resize_exact(w, h, RESIZE_FILTER) + } + }, + }; + + let mut f = File::create(target_path)?; + let mut enc = JPEGEncoder::new_with_quality(&mut f, self.quality); + let (img_w, img_h) = img.dimensions(); + enc.encode(&img.raw_pixels(), img_w, img_h, img.color())?; + Ok(()) + } +} + + +/// A strcture into which image operations can be enqueued and then performed. +/// All output is written in a subdirectory in `static_path`, +/// taking care of file stale status based on timestamps and possible hash collisions. +#[derive(Debug)] +pub struct Processor { + content_path: PathBuf, + resized_path: PathBuf, + resized_url: String, + img_ops: HashMap, + // Hash collisions go here: + img_ops_colls: Vec, +} + +impl Processor { + pub fn new(content_path: PathBuf, static_path: &Path, base_url: &str) -> Processor { + Processor { + content_path, + resized_path: static_path.join(RESIZED_SUBDIR), + resized_url: Self::resized_url(base_url), + img_ops: HashMap::new(), + img_ops_colls: Vec::new(), + } + } + + fn resized_url(base_url: &str) -> String { + match base_url.ends_with('/') { + true => format!("{}{}", base_url, RESIZED_SUBDIR), + false => format!("{}/{}", base_url, RESIZED_SUBDIR), + } + } + + pub fn set_base_url(&mut self, base_url: &str) { + self.resized_url = Self::resized_url(base_url); + } + + pub fn source_exists(&self, source: &str) -> bool { + self.content_path.join(source).exists() + } + + pub fn num_img_ops(&self) -> usize { + self.img_ops.len() + self.img_ops_colls.len() + } + + fn insert_with_colls(&mut self, mut img_op: ImageOp) -> u32 { + match self.img_ops.entry(img_op.hash) { + HEntry::Occupied(entry) => if *entry.get() == img_op { return 0; }, + HEntry::Vacant(entry) => { + entry.insert(img_op); + return 0; + }, + } + + // If we get here, that means a hash collision. + let mut num = 1; + for op in self.img_ops_colls.iter().filter(|op| op.hash == img_op.hash) { + if *op == img_op { + return num; + } else { + num += 1; + } + } + + if num == 1 { + self.img_ops.get_mut(&img_op.hash).unwrap().collision = Some(0); + } + img_op.collision = Some(num); + self.img_ops_colls.push(img_op); + num + } + + fn op_filename(hash: u64, colli_num: u32) -> String { + // Please keep this in sync with RESIZED_FILENAME + assert!(colli_num < 256, "Unexpectedly large number of collisions: {}", colli_num); + format!("{:016x}{:02x}.jpg", hash, colli_num) + } + + fn op_url(&self, hash: u64, colli_num: u32) -> String { + format!("{}/{}", &self.resized_url, Self::op_filename(hash, colli_num)) + } + + pub fn insert(&mut self, img_op: ImageOp) -> String { + let hash = img_op.hash; + let num_colli = self.insert_with_colls(img_op); + self.op_url(hash, num_colli) + } + + pub fn prune(&self) -> Result<()> { + ufs::ensure_directory_exists(&self.resized_path)?; + let entries = fs::read_dir(&self.resized_path)?; + for entry in entries { + let entry_path = entry?.path(); + if entry_path.is_file() { + let filename = entry_path.file_name().unwrap().to_string_lossy(); + if let Some(capts) = RESIZED_FILENAME.captures(filename.as_ref()) { + let hash = u64::from_str_radix(capts.get(1).unwrap().as_str(), 16).unwrap(); + let num_colli = u32::from_str_radix(capts.get(2).unwrap().as_str(), 16).unwrap(); + if num_colli > 0 || !self.img_ops.contains_key(&hash) { + fs::remove_file(&entry_path)?; + } + } + } + } + Ok(()) + } + + pub fn do_process(&mut self) -> Result<()> { + self.img_ops.par_iter().map(|(hash, op)| { + let target = self.resized_path.join(Self::op_filename(*hash, op.num_colli())); + op.perform(&self.content_path, &target) + .chain_err(|| format!("Failed to process image: {}", op.source)) + }) + .fold(|| Ok(()), Result::and) + .reduce(|| Ok(()), Result::and) + } +} + + +/// Looks at file's extension and returns whether it's a supported image format +pub fn file_is_img>(p: P) -> bool { + p.as_ref().extension().and_then(|s| s.to_str()).map(|ext| { + match ext.to_lowercase().as_str() { + "jpg" | "jpeg" => true, + "png" => true, + "gif" => true, + "bmp" => true, + _ => false, + } + }).unwrap_or(false) +} diff --git a/components/rendering/src/context.rs b/components/rendering/src/context.rs index d8a2513f..b65997a0 100644 --- a/components/rendering/src/context.rs +++ b/components/rendering/src/context.rs @@ -1,6 +1,6 @@ use std::collections::HashMap; -use tera::Tera; +use tera::{Tera, Context}; use front_matter::InsertAnchor; use config::Config; @@ -10,6 +10,7 @@ use config::Config; pub struct RenderContext<'a> { pub tera: &'a Tera, pub config: &'a Config, + pub teracontext: Context, pub current_page_permalink: &'a str, pub permalinks: &'a HashMap, pub insert_anchor: InsertAnchor, @@ -23,8 +24,11 @@ impl<'a> RenderContext<'a> { permalinks: &'a HashMap, insert_anchor: InsertAnchor, ) -> RenderContext<'a> { + let mut teracontext = Context::new(); + teracontext.insert("config", config); RenderContext { tera, + teracontext, current_page_permalink, permalinks, insert_anchor, diff --git a/components/rendering/src/lib.rs b/components/rendering/src/lib.rs index 00715af2..9c5da90b 100644 --- a/components/rendering/src/lib.rs +++ b/components/rendering/src/lib.rs @@ -34,7 +34,7 @@ pub use context::RenderContext; pub fn render_content(content: &str, context: &RenderContext) -> Result<(String, Vec
)> { // Don't do anything if there is nothing like a shortcode in the content if content.contains("{{") || content.contains("{%") { - let rendered = render_shortcodes(content, context.tera, context.config)?; + let rendered = render_shortcodes(content, context)?; return markdown_to_html(&rendered, context); } diff --git a/components/rendering/src/shortcode.rs b/components/rendering/src/shortcode.rs index e88e8361..e01c860c 100644 --- a/components/rendering/src/shortcode.rs +++ b/components/rendering/src/shortcode.rs @@ -1,9 +1,9 @@ use pest::Parser; use pest::iterators::Pair; -use tera::{Tera, Map, Context, Value, to_value}; +use tera::{Map, Context, Value, to_value}; use errors::{Result, ResultExt}; -use config::Config; +use ::context::RenderContext; // This include forces recompiling this source file if the grammar file changes. // Uncomment it when doing changes to the .pest file @@ -84,20 +84,20 @@ fn parse_shortcode_call(pair: Pair) -> (String, Map) { } -fn render_shortcode(name: String, args: Map, tera: &Tera, config: &Config, body: Option<&str>) -> Result { - let mut context = Context::new(); +fn render_shortcode(name: String, args: Map, context: &RenderContext, body: Option<&str>) -> Result { + let mut teracontext = Context::new(); for (key, value) in args.iter() { - context.insert(key, value); + teracontext.insert(key, value); } if let Some(ref b) = body { // Trimming right to avoid most shortcodes with bodies ending up with a HTML new line - context.insert("body", b.trim_right()); + teracontext.insert("body", b.trim_right()); } - context.insert("config", config); + teracontext.extend(context.teracontext.clone()); let tpl_name = format!("shortcodes/{}.html", name); - let res = tera - .render(&tpl_name, &context) + let res = context.tera + .render(&tpl_name, &teracontext) .chain_err(|| format!("Failed to render {} shortcode", name))?; // We trim left every single line of a shortcode to avoid the accidental @@ -105,7 +105,7 @@ fn render_shortcode(name: String, args: Map, tera: &Tera, config: Ok(res.lines().map(|s| s.trim_left()).collect()) } -pub fn render_shortcodes(content: &str, tera: &Tera, config: &Config) -> Result { +pub fn render_shortcodes(content: &str, context: &RenderContext) -> Result { let mut res = String::with_capacity(content.len()); let mut pairs = match ContentParser::parse(Rule::page, content) { @@ -138,7 +138,7 @@ pub fn render_shortcodes(content: &str, tera: &Tera, config: &Config) -> Result< Rule::text | Rule::text_in_ignored_body_sc | Rule::text_in_body_sc => res.push_str(p.into_span().as_str()), Rule::inline_shortcode => { let (name, args) = parse_shortcode_call(p); - res.push_str(&render_shortcode(name, args, tera, config, None)?); + res.push_str(&render_shortcode(name, args, context, None)?); }, Rule::shortcode_with_body => { let mut inner = p.into_inner(); @@ -146,7 +146,7 @@ pub fn render_shortcodes(content: &str, tera: &Tera, config: &Config) -> Result< // we don't care about the closing tag let (name, args) = parse_shortcode_call(inner.next().unwrap()); let body = inner.next().unwrap().into_span().as_str(); - res.push_str(&render_shortcode(name, args, tera, config, Some(body))?); + res.push_str(&render_shortcode(name, args, context, Some(body))?); }, Rule::ignored_inline_shortcode => { res.push_str( @@ -179,6 +179,10 @@ pub fn render_shortcodes(content: &str, tera: &Tera, config: &Config) -> Result< #[cfg(test)] mod tests { + use std::collections::HashMap; + use tera::Tera; + use config::Config; + use front_matter::InsertAnchor; use super::*; macro_rules! assert_lex_rule { @@ -195,6 +199,13 @@ mod tests { }; } + fn render_shortcodes(code: &str, tera: &Tera) -> String { + let config = Config::default(); + let permalinks = HashMap::new(); + let context = RenderContext::new(&tera, &config, "", &permalinks, InsertAnchor::None); + super::render_shortcodes(code, &context).unwrap() + } + #[test] fn lex_text() { let inputs = vec!["Hello world", "HEllo \n world", "Hello 1 2 true false 'hey'"]; @@ -281,26 +292,22 @@ mod tests { #[test] fn does_nothing_with_no_shortcodes() { - let res = render_shortcodes("Hello World", &Tera::default(), &Config::default()); - assert_eq!(res.unwrap(), "Hello World"); + let res = render_shortcodes("Hello World", &Tera::default()); + assert_eq!(res, "Hello World"); } #[test] fn can_unignore_inline_shortcode() { - let res = render_shortcodes( - "Hello World {{/* youtube() */}}", - &Tera::default(), - &Config::default(), - ); - assert_eq!(res.unwrap(), "Hello World {{ youtube() }}"); + let res = render_shortcodes("Hello World {{/* youtube() */}}", &Tera::default()); + assert_eq!(res, "Hello World {{ youtube() }}"); } #[test] fn can_unignore_shortcode_with_body() { let res = render_shortcodes(r#" Hello World -{%/* youtube() */%}Some body {{ hello() }}{%/* end */%}"#, &Tera::default(), &Config::default()); - assert_eq!(res.unwrap(), "\nHello World\n{% youtube() %}Some body {{ hello() }}{% end %}"); +{%/* youtube() */%}Some body {{ hello() }}{%/* end */%}"#, &Tera::default()); + assert_eq!(res, "\nHello World\n{% youtube() %}Some body {{ hello() }}{% end %}"); } #[test] @@ -343,7 +350,7 @@ Hello World fn can_render_inline_shortcodes() { let mut tera = Tera::default(); tera.add_raw_template("shortcodes/youtube.html", "Hello {{id}}").unwrap(); - let res = render_shortcodes("Inline {{ youtube(id=1) }}.", &tera, &Config::default()).unwrap(); + let res = render_shortcodes("Inline {{ youtube(id=1) }}.", &tera); assert_eq!(res, "Inline Hello 1."); } @@ -351,7 +358,7 @@ Hello World fn can_render_shortcodes_with_body() { let mut tera = Tera::default(); tera.add_raw_template("shortcodes/youtube.html", "{{body}}").unwrap(); - let res = render_shortcodes("Body\n {% youtube() %}Hey!{% end %}", &tera, &Config::default()).unwrap(); + let res = render_shortcodes("Body\n {% youtube() %}Hey!{% end %}", &tera); assert_eq!(res, "Body\n Hey!"); } } diff --git a/components/site/Cargo.toml b/components/site/Cargo.toml index eb70efa8..b1abcd58 100644 --- a/components/site/Cargo.toml +++ b/components/site/Cargo.toml @@ -20,6 +20,7 @@ pagination = { path = "../pagination" } taxonomies = { path = "../taxonomies" } content = { path = "../content" } search = { path = "../search" } +imageproc = { path = "../imageproc" } [dev-dependencies] tempfile = "3" diff --git a/components/site/src/lib.rs b/components/site/src/lib.rs index 6c5fdd28..53ebc9d0 100644 --- a/components/site/src/lib.rs +++ b/components/site/src/lib.rs @@ -16,6 +16,7 @@ extern crate pagination; extern crate taxonomies; extern crate content; extern crate search; +extern crate imageproc; #[cfg(test)] extern crate tempfile; @@ -24,6 +25,7 @@ use std::collections::HashMap; use std::fs::{create_dir_all, remove_dir_all, copy}; use std::mem; use std::path::{Path, PathBuf}; +use std::sync::{Arc, Mutex}; use glob::glob; use tera::{Tera, Context}; @@ -66,9 +68,11 @@ pub struct Site { pub pages: HashMap, pub sections: HashMap, pub tera: Tera, + imageproc: Arc>, // the live reload port to be used if there is one pub live_reload: Option, pub output_path: PathBuf, + content_path: PathBuf, pub static_path: PathBuf, pub tags: Option, pub categories: Option, @@ -109,15 +113,21 @@ impl Site { // the `extend` above already does it but hey tera.build_inheritance_chains()?; + let content_path = path.join("content"); + let static_path = path.join("static"); + let imageproc = imageproc::Processor::new(content_path.clone(), &static_path, &config.base_url); + let site = Site { base_path: path.to_path_buf(), config, tera, pages: HashMap::new(), sections: HashMap::new(), + imageproc: Arc::new(Mutex::new(imageproc)), live_reload: None, output_path: path.join("public"), - static_path: path.join("static"), + content_path, + static_path, tags: None, categories: None, permalinks: HashMap::new(), @@ -128,7 +138,7 @@ impl Site { /// The index section is ALWAYS at that path pub fn index_section_path(&self) -> PathBuf { - self.base_path.join("content").join("_index.md") + self.content_path.join("_index.md") } pub fn enable_live_reload(&mut self) { @@ -153,6 +163,12 @@ impl Site { orphans } + pub fn set_base_url(&mut self, base_url: String) { + let mut imageproc = self.imageproc.lock().unwrap(); + imageproc.set_base_url(&base_url); + self.config.base_url = base_url; + } + pub fn set_output_path>(&mut self, path: P) { self.output_path = path.as_ref().to_path_buf(); } @@ -217,7 +233,7 @@ impl Site { if !self.sections.contains_key(&index_path) { let mut index_section = Section::default(); index_section.permalink = self.config.make_permalink(""); - index_section.file.parent = self.base_path.join("content"); + index_section.file.parent = self.content_path.clone(); index_section.file.relative = "_index.md".to_string(); self.sections.insert(index_path, index_section); } @@ -229,10 +245,10 @@ impl Site { self.add_page(p, false)?; } + self.register_early_global_fns(); self.render_markdown()?; self.populate_sections(); self.populate_tags_and_categories(); - self.register_tera_global_fns(); Ok(()) @@ -270,6 +286,16 @@ impl Site { Ok(()) } + /// Adds global fns that are to be available to shortcodes while rendering markdown + pub fn register_early_global_fns(&mut self) { + self.tera.register_global_function( + "get_url", global_fns::make_get_url(self.permalinks.clone(), self.config.clone()) + ); + self.tera.register_global_function( + "resize_image", global_fns::make_resize_image(self.imageproc.clone()) + ); + } + pub fn register_tera_global_fns(&mut self) { self.tera.register_global_function("trans", global_fns::make_trans(self.config.clone())); self.tera.register_global_function("get_page", global_fns::make_get_page(&self.pages)); @@ -278,10 +304,6 @@ impl Site { "get_taxonomy_url", global_fns::make_get_taxonomy_url(self.tags.clone(), self.categories.clone()) ); - self.tera.register_global_function( - "get_url", - global_fns::make_get_url(self.permalinks.clone(), self.config.clone()) - ); } /// Add a page to the site @@ -441,6 +463,17 @@ impl Site { Ok(()) } + pub fn num_img_ops(&self) -> usize { + let imageproc = self.imageproc.lock().unwrap(); + imageproc.num_img_ops() + } + + pub fn process_images(&self) -> Result<()> { + let mut imageproc = self.imageproc.lock().unwrap(); + imageproc.prune()?; + imageproc.do_process() + } + /// Deletes the `public` directory if it exists pub fn clean(&self) -> Result<()> { if self.output_path.exists() { @@ -510,6 +543,7 @@ impl Site { self.compile_sass(&self.base_path)?; } + self.process_images()?; self.copy_static_directories()?; if self.config.build_search_index { @@ -820,7 +854,7 @@ impl Site { /// Used only on reload pub fn render_index(&self) -> Result<()> { self.render_section( - &self.sections[&self.base_path.join("content").join("_index.md")], + &self.sections[&self.content_path.join("_index.md")], false ) } diff --git a/components/templates/Cargo.toml b/components/templates/Cargo.toml index 0d6ebe8a..377735a4 100644 --- a/components/templates/Cargo.toml +++ b/components/templates/Cargo.toml @@ -14,3 +14,4 @@ utils = { path = "../utils" } content = { path = "../content" } config = { path = "../config" } taxonomies = { path = "../taxonomies" } +imageproc = { path = "../imageproc" } diff --git a/components/templates/src/global_fns.rs b/components/templates/src/global_fns.rs index 468c910c..65aeabb4 100644 --- a/components/templates/src/global_fns.rs +++ b/components/templates/src/global_fns.rs @@ -1,5 +1,6 @@ use std::collections::HashMap; -use std::path::{PathBuf}; +use std::path::PathBuf; +use std::sync::{Arc, Mutex}; use tera::{GlobalFn, Value, from_value, to_value, Result}; @@ -7,29 +8,41 @@ use content::{Page, Section}; use config::Config; use utils::site::resolve_internal_link; use taxonomies::Taxonomy; +use imageproc; -macro_rules! required_string_arg { - ($e: expr, $err: expr) => { +macro_rules! required_arg { + ($ty: ty, $e: expr, $err: expr) => { match $e { - Some(v) => match from_value::(v.clone()) { + Some(v) => match from_value::<$ty>(v.clone()) { Ok(u) => u, Err(_) => return Err($err.into()) }, None => return Err($err.into()) - }; + } + }; +} + +macro_rules! optional_arg { + ($ty: ty, $e: expr, $err: expr) => { + match $e { + Some(v) => match from_value::<$ty>(v.clone()) { + Ok(u) => Some(u), + Err(_) => return Err($err.into()) + }, + None => None + } }; } pub fn make_trans(config: Config) -> GlobalFn { let translations_config = config.translations; - let default_lang = to_value(config.default_language).unwrap(); + let default_lang = config.default_language.clone(); Box::new(move |args| -> Result { - let key = required_string_arg!(args.get("key"), "`trans` requires a `key` argument."); - let lang_arg = args.get("lang").unwrap_or(&default_lang).clone(); - let lang = from_value::(lang_arg).unwrap(); + let key = required_arg!(String, args.get("key"), "`trans` requires a `key` argument."); + let lang = optional_arg!(String, args.get("lang"), "`trans`: `lang` must be a string.").unwrap_or(default_lang.clone()); let translations = &translations_config[lang.as_str()]; Ok(to_value(&translations[key.as_str()]).unwrap()) }) @@ -43,7 +56,7 @@ pub fn make_get_page(all_pages: &HashMap) -> GlobalFn { } Box::new(move |args| -> Result { - let path = required_string_arg!(args.get("path"), "`get_page` requires a `path` argument with a string value"); + let path = required_arg!(String, args.get("path"), "`get_page` requires a `path` argument with a string value"); match pages.get(&path) { Some(p) => Ok(to_value(p).unwrap()), None => Err(format!("Page `{}` not found.", path).into()) @@ -61,7 +74,7 @@ pub fn make_get_section(all_sections: &HashMap) -> GlobalFn { } Box::new(move |args| -> Result { - let path = required_string_arg!(args.get("path"), "`get_section` requires a `path` argument with a string value"); + let path = required_arg!(String, args.get("path"), "`get_section` requires a `path` argument with a string value"); //println!("Found {:#?}", sections.get(&path).unwrap().pages[0]); match sections.get(&path) { Some(p) => Ok(to_value(p).unwrap()), @@ -84,7 +97,7 @@ pub fn make_get_url(permalinks: HashMap, config: Config) -> Glob from_value::(c.clone()).unwrap_or(true) }); - let path = required_string_arg!(args.get("path"), "`get_url` requires a `path` argument with a string value"); + let path = required_arg!(String, args.get("path"), "`get_url` requires a `path` argument with a string value"); if path.starts_with("./") { match resolve_internal_link(&path, &permalinks) { Ok(url) => Ok(to_value(url).unwrap()), @@ -107,8 +120,8 @@ pub fn make_get_url(permalinks: HashMap, config: Config) -> Glob pub fn make_get_taxonomy_url(tags: Option, categories: Option) -> GlobalFn { Box::new(move |args| -> Result { - let kind = required_string_arg!(args.get("kind"), "`get_taxonomy_url` requires a `kind` argument with a string value"); - let name = required_string_arg!(args.get("name"), "`get_taxonomy_url` requires a `name` argument with a string value"); + let kind = required_arg!(String, args.get("kind"), "`get_taxonomy_url` requires a `kind` argument with a string value"); + let name = required_arg!(String, args.get("name"), "`get_taxonomy_url` requires a `name` argument with a string value"); let container = match kind.as_ref() { "tag" => &tags, "category" => &categories, @@ -128,6 +141,33 @@ pub fn make_get_taxonomy_url(tags: Option, categories: Option>) -> GlobalFn { + static DEFAULT_OP: &'static str = "fill"; + const DEFAULT_Q: u8 = 75; + + Box::new(move |args| -> Result { + let path = required_arg!(String, args.get("path"), "`resize_image` requires a `path` argument with a string value"); + let width = optional_arg!(u32, args.get("width"), "`resize_image`: `width` must be a non-negative integer"); + let height = optional_arg!(u32, args.get("height"), "`resize_image`: `height` must be a non-negative integer"); + let op = optional_arg!(String, args.get("op"), "`resize_image`: `op` must be a string").unwrap_or(DEFAULT_OP.to_owned()); + let quality = optional_arg!(u8, args.get("quality"), "`resize_image`: `quality` must be a number").unwrap_or(DEFAULT_Q); + if quality == 0 || quality > 100 { + return Err("`resize_image`: `quality` must be in range 1-100".to_string().into()); + } + + let mut imageproc = imageproc.lock().unwrap(); + if !imageproc.source_exists(&path) { + return Err(format!("`resize_image`: Cannot find path: {}", path).into()); + } + + let imageop = imageproc::ImageOp::from_args(path.clone(), &op, width, height, quality).map_err(|e| format!("`resize_image`: {}", e))?; + let url = imageproc.insert(imageop); + + to_value(url).map_err(|err| err.into()) + }) +} + + #[cfg(test)] mod tests { use super::{make_get_url, make_get_taxonomy_url, make_trans}; diff --git a/components/templates/src/lib.rs b/components/templates/src/lib.rs index 2e70f890..1c494038 100644 --- a/components/templates/src/lib.rs +++ b/components/templates/src/lib.rs @@ -11,6 +11,7 @@ extern crate utils; extern crate content; extern crate config; extern crate taxonomies; +extern crate imageproc; pub mod filters; pub mod global_fns; diff --git a/components/utils/src/fs.rs b/components/utils/src/fs.rs index b783f7de..4ca75f59 100644 --- a/components/utils/src/fs.rs +++ b/components/utils/src/fs.rs @@ -93,6 +93,32 @@ pub fn copy_directory(src: &PathBuf, dest: &PathBuf) -> Result<()> { Ok(()) } +/// Compares source and target files' timestamps and returns true if the source file +/// has been created _or_ updated after the target file has +pub fn file_stale(p_source: PS, p_target: PT) -> bool where PS: AsRef, PT: AsRef { + let p_source = p_source.as_ref(); + let p_target = p_target.as_ref(); + + if ! p_target.exists() { + return true; + } + + let get_time = |path: &Path| path.metadata().ok().and_then(|meta| { + Some(match (meta.created().ok(), meta.modified().ok()) { + (Some(tc), Some(tm)) => tc.max(tm), + (Some(tc), None) => tc, + (None, Some(tm)) => tm, + (None, None) => return None, + }) + }); + + let time_source = get_time(p_source); + let time_target = get_time(p_target); + + time_source.and_then(|ts| time_target.map(|tt| ts > tt)).unwrap_or(true) +} + + #[cfg(test)] mod tests { use std::fs::File; diff --git a/docs/content/documentation/content/image-resizing/index.md b/docs/content/documentation/content/image-resizing/index.md new file mode 100644 index 00000000..30554604 --- /dev/null +++ b/docs/content/documentation/content/image-resizing/index.md @@ -0,0 +1,8 @@ ++++ +title = "Image Resizing" +weight = 120 ++++ + +TODO: talk about resize_image + +{{ gallery() }} diff --git a/docs/content/documentation/templates/pages-sections.md b/docs/content/documentation/templates/pages-sections.md index 7580855c..7c90a803 100644 --- a/docs/content/documentation/templates/pages-sections.md +++ b/docs/content/documentation/templates/pages-sections.md @@ -37,6 +37,7 @@ previous: Page?; next: Page?; // See the Table of contents section below for more details toc: Array
; +// TODO: add assets & assets_imgs (also draft is missing?) ``` ## Section variables diff --git a/docs/templates/shortcodes/gallery.html b/docs/templates/shortcodes/gallery.html new file mode 100644 index 00000000..cda36fb0 --- /dev/null +++ b/docs/templates/shortcodes/gallery.html @@ -0,0 +1,6 @@ +{% for img in page.assets_imgs %} + + + +   +{% endfor %} diff --git a/docs/templates/shortcodes/resize_image.html b/docs/templates/shortcodes/resize_image.html new file mode 100644 index 00000000..f33bc3b5 --- /dev/null +++ b/docs/templates/shortcodes/resize_image.html @@ -0,0 +1 @@ + diff --git a/src/cmd/serve.rs b/src/cmd/serve.rs index 20fece10..8504ccbd 100644 --- a/src/cmd/serve.rs +++ b/src/cmd/serve.rs @@ -86,13 +86,13 @@ fn create_new_site(interface: &str, port: &str, output_dir: &str, base_url: &str let base_address = format!("{}:{}", base_url, port); let address = format!("{}:{}", interface, port); - - site.config.base_url = if site.config.base_url.ends_with('/') { + let base_url = if site.config.base_url.ends_with('/') { format!("http://{}/", base_address) } else { format!("http://{}", base_address) }; + site.set_base_url(base_url); site.set_output_path(output_dir); site.load()?; site.enable_live_reload(); diff --git a/src/console.rs b/src/console.rs index 9f0b5f0d..5905bbee 100644 --- a/src/console.rs +++ b/src/console.rs @@ -27,10 +27,11 @@ pub fn error(message: &str) { /// Display in the console the number of pages/sections in the site pub fn notify_site_size(site: &Site) { println!( - "-> Creating {} pages ({} orphan) and {} sections", + "-> Creating {} pages ({} orphan), {} sections, and processing {} images", site.pages.len(), site.get_all_orphan_pages().len(), site.sections.len() - 1, // -1 since we do not the index as a section + site.num_img_ops(), ); } From 7c8d39fe9c34111d5bb91a63da705288b599495f Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Sun, 8 Apr 2018 22:12:39 +0200 Subject: [PATCH 24/74] Docs for resize_image() --- .../content/image-resizing/example-00.jpg | Bin 0 -> 196291 bytes .../content/image-resizing/example-01.jpg | Bin 0 -> 208360 bytes .../content/image-resizing/example-02.jpg | Bin 0 -> 42987 bytes .../content/image-resizing/example-03.jpg | Bin 0 -> 256259 bytes .../content/image-resizing/gutenberg.jpg | Bin 0 -> 47783 bytes .../content/image-resizing/index.md | 124 +++++++++++++++++- .../documentation/templates/overview.md | 4 + .../documentation/templates/pages-sections.md | 5 +- .../_resized_images/2e13805bc51b68e800.jpg | Bin 0 -> 15042 bytes .../_resized_images/2fa5b43d38d9f5a600.jpg | Bin 0 -> 12953 bytes .../_resized_images/5a8ef01aac8b5c8700.jpg | Bin 0 -> 4854 bytes .../_resized_images/8b0ae741aed115a800.jpg | Bin 0 -> 5660 bytes .../_resized_images/b2435b04c4bd3cb400.jpg | Bin 0 -> 3900 bytes .../_resized_images/b9a9fe3b3dee28cc00.jpg | Bin 0 -> 4854 bytes .../_resized_images/ca684a0de40c030c00.jpg | Bin 0 -> 4508 bytes .../_resized_images/e13a85d2c34cbf6900.jpg | Bin 0 -> 5671 bytes .../_resized_images/f1f9e1ab29575d0f00.jpg | Bin 0 -> 18478 bytes .../_resized_images/f969dfdd99d2fe1500.jpg | Bin 0 -> 8265 bytes 18 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 docs/content/documentation/content/image-resizing/example-00.jpg create mode 100644 docs/content/documentation/content/image-resizing/example-01.jpg create mode 100644 docs/content/documentation/content/image-resizing/example-02.jpg create mode 100644 docs/content/documentation/content/image-resizing/example-03.jpg create mode 100644 docs/content/documentation/content/image-resizing/gutenberg.jpg create mode 100644 docs/static/_resized_images/2e13805bc51b68e800.jpg create mode 100644 docs/static/_resized_images/2fa5b43d38d9f5a600.jpg create mode 100644 docs/static/_resized_images/5a8ef01aac8b5c8700.jpg create mode 100644 docs/static/_resized_images/8b0ae741aed115a800.jpg create mode 100644 docs/static/_resized_images/b2435b04c4bd3cb400.jpg create mode 100644 docs/static/_resized_images/b9a9fe3b3dee28cc00.jpg create mode 100644 docs/static/_resized_images/ca684a0de40c030c00.jpg create mode 100644 docs/static/_resized_images/e13a85d2c34cbf6900.jpg create mode 100644 docs/static/_resized_images/f1f9e1ab29575d0f00.jpg create mode 100644 docs/static/_resized_images/f969dfdd99d2fe1500.jpg diff --git a/docs/content/documentation/content/image-resizing/example-00.jpg b/docs/content/documentation/content/image-resizing/example-00.jpg new file mode 100644 index 0000000000000000000000000000000000000000..77ed919c24e9eda0613b948020e6f53eaa4b570d GIT binary patch literal 196291 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 LkM^%tT7Uo9hwe~S literal 0 HcmV?d00001 diff --git a/docs/content/documentation/content/image-resizing/example-01.jpg b/docs/content/documentation/content/image-resizing/example-01.jpg new file mode 100644 index 0000000000000000000000000000000000000000..483a8428e818e5a3dccb2892a6697985c3279a0d GIT binary patch literal 208360 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촀O)es5nLbU>dJn&CJ7 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ν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 literal 0 HcmV?d00001 diff --git a/docs/content/documentation/content/image-resizing/example-02.jpg b/docs/content/documentation/content/image-resizing/example-02.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6972f7a9157131caa22f36b39d0a2c148afbb0df GIT binary patch literal 42987 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 literal 0 HcmV?d00001 diff --git a/docs/content/documentation/content/image-resizing/example-03.jpg b/docs/content/documentation/content/image-resizing/example-03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..99837c20ff7996f410451cfab12f0fe9e4ccaa8e GIT binary patch literal 256259 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%0DI#qd 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%0AqVS<5-W2ar9q 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

+0+c=?Z_iPzNmE{P+RI~ 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%0Af;uZTG$yO&YM$e|o=DRRG9nOLo=E(^)ayU5 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

_cO0C~9Jle7+X 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 Wb1eDz^vuexGO|wobff-a{{H}o;yfh) literal 0 HcmV?d00001 diff --git a/docs/content/documentation/content/image-resizing/gutenberg.jpg b/docs/content/documentation/content/image-resizing/gutenberg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b031e9c78bdc01bb9fc56755343eb14919a28a3 GIT binary patch literal 47783 zcmbSyWmFtN*X9fZ3~qto4uN37VQ@llC-~s*8r&gh(7}R3NRZ&}?oMzIFgU^8Ki=Iv z-=4F-cK3GGudc3hpVL*hZ{6qVmxY&g0FIoLtP}tU1Ohx?FTl$(Kmq_lK=@C4HN@A3 zgo1>Gh=_y+1|y?jpkZL3qoJc?V&UOnV&P(;qvO2A!F_{IKtOp9l}10RKOe z070+MAR?h6A)(@9qGRI!Kif+u02c-53uFNSX#fbgKoBnQr58X6005C*z5S2F|I2^~ zuRbD!QBcv)UkB9T01$v65CS6TKVH9%_Ite#K*UADqvjAtexqs(rg6sS3`)pDq5W9Z zMWFWQl#a{9B^VX$Eg=yx3H>_;#`jFzJiL7T5CMr#l2Xz#vT~o*H8i!fb#zV5%q=Xf ztZiJsxVd|HdU=O@4GjyAh>U_ICMBn&eossPk^l2oL19tx@9LV`y84F3rsnRR-oE~U z!J*-)>6zKN`Gv)$jZOI0_Rj9!{=wP##pTuY&F$U&e{cZ-p#KT$zmfePxNu)_As`}x z5W)Y!1w`<8?I2u4Bx(+1JaJX9vGW@m&L9;0j|q8IU8uBNYNrGyE`QM8(s6IlpZy2g z|3LPC2Q2vi3)z1I``@^h02m

&pY-0z?6)%xV6M&fEcJ=nn(mT<|17yMO?$dw*{( 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%0ARGaEEY-J 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 kY@jx z4Vk;0+A{m6DYcIn&!Dc9XqMLT7$V-0DQLoj+b0L=J5UFayT=(2%C8)mD$BQNKmiI4 z+~>D!t#MLSLg zN6dTUpQ+}6Ig54*H*MV+P$VF721ar3^{-0smyFX)&@UEvU+n?B`)OW2T0-$*bJ%i8 zA5UuY=>YR0QUMA;0F3eeNvpRFIh6B_661%Uqmc-0RP>sMy~08#zs7DB+N=l~0V2c-aXzAdsM;^I49 z&?K%VjX)}@gv%xa4&bmKfE}xux4#xvD9BZripb+>JFs6I_rcqd?^Y()ZtipoQ6mH9 zB$+tr^OMJ=a)Rza*v|+~2WkM?g744Y6q9*_7z)IW2VsiJxzbB9mfv)o9Ij6se}z2C zV|Cg9BclP&Us{OD?#c5N+&SCEXacnUa7L0qT?6EwQdf-e&q2?%OQp^bDo3~!kT6i# z`HuwqWMCY63a2X>nU(q5y9d7m)~ZV69hu>nDf(i7J1A~a`Su2y3yGi44y1)v%9Hqg z#s{_yHt$jUEwH>ken3=hA|$MdT1oLFhZlWq|t89y*$rHRkhv#qvU=@(DsB(j!VJcA{AbnX0I zah^W80Ihp?(O^0d>ZE@2IUHl5`hFE!-pXA{@*xUulyS9t@lTRNJZ|m*B%hZYb@Z$D za(#l;gdi!BCU$P;Zq@_oo^e1L`f^)nF~IOizfzR!TaB5HA&>!I;>!X?>|ke(e(g*7 zC7Mxr`@z3sq|C~svh3qlU(c|TVL%Yw- +``` + +## Creating picuture galleries + +The `resize_image()` can be used multiple times and/or in loops (it is designed to handle this efficiently). + +This can be used along with `assets_imgs` [page metadata](./documentation/templates/pages-sections.md) to create picture galleries. +The `assets_imgs` variable holds paths to all images in the directory of a page with resources +(see [Assets colocation](./documentation/content/overview.md#assets-colocation)). + +This can be used in shortcodes. For example, we can create a very simple html-only clickable +picture gallery with the following shortcode named `gallery.html`: + +```jinja2 +{% for img in page.assets_imgs %} + + + +   +{% endfor %} +``` + +As you can notice, we didn't specify an `op` argument, which means it'll default to `"fill"`. Similarly, the JPEG quality will default to `75`. + +To call it from a markdown file, simply do: + +```jinja2 +{{/* gallery() */}} +``` + +Here is the result: {{ gallery() }} + + + Image attribution: example-01: Willi Heidelbach, example-02: Daniel Ullrich, others: public domain. + diff --git a/docs/content/documentation/templates/overview.md b/docs/content/documentation/templates/overview.md index f843059d..6b88a98f 100644 --- a/docs/content/documentation/templates/overview.md +++ b/docs/content/documentation/templates/overview.md @@ -105,3 +105,7 @@ Gets the translation of the given `key`, for the `default_language` or the `lang {{/* trans(key="title") */}} {{/* trans(key="title", lang="fr") */}} ``` + +### `resize_image` +Resizes an image file. +Pease refer to [_Content / Image Resizing_](./documentation/content/image-resizing/index.md) for complete documentation. diff --git a/docs/content/documentation/templates/pages-sections.md b/docs/content/documentation/templates/pages-sections.md index 7c90a803..a4848b32 100644 --- a/docs/content/documentation/templates/pages-sections.md +++ b/docs/content/documentation/templates/pages-sections.md @@ -37,7 +37,10 @@ previous: Page?; next: Page?; // See the Table of contents section below for more details toc: Array

; -// TODO: add assets & assets_imgs (also draft is missing?) +// Paths of colocated assets, relative to the content directory +assets: Array; +// Paths of colocated image assets, ie. files with an extension of "jpg", "jpeg", "png", "gif", or "bmp" +assets_imgs: Array; ``` ## Section variables diff --git a/docs/static/_resized_images/2e13805bc51b68e800.jpg b/docs/static/_resized_images/2e13805bc51b68e800.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aa7f148e23bba459db87c41f25285d1277daadfe GIT binary patch literal 15042 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 Y`$TPXJIAokaD2xfE;2K~KHyjX*>i2k4*&oF literal 0 HcmV?d00001 diff --git a/docs/static/_resized_images/2fa5b43d38d9f5a600.jpg b/docs/static/_resized_images/2fa5b43d38d9f5a600.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe24b2ab02320083ece573068bcf8f326999cd77 GIT binary patch literal 12953 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 tOMXT{zJ{bF@O*N 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 literal 0 HcmV?d00001 diff --git a/docs/static/_resized_images/b2435b04c4bd3cb400.jpg b/docs/static/_resized_images/b2435b04c4bd3cb400.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b25d734cd8d921e2da481d74fefa2916394baf33 GIT binary patch literal 3900 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 IvTl$6*)$V*EdT%j literal 0 HcmV?d00001 diff --git a/docs/static/_resized_images/f969dfdd99d2fe1500.jpg b/docs/static/_resized_images/f969dfdd99d2fe1500.jpg new file mode 100644 index 0000000000000000000000000000000000000000..89e7b58cc9a8ff4615ce2cbc8701516735af1b78 GIT binary patch literal 8265 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 Date: Fri, 25 May 2018 18:30:22 +0200 Subject: [PATCH 25/74] imageproc: Fix naming, cleanup --- Cargo.lock | 61 ++++++------- components/content/src/page.rs | 4 +- components/errors/Cargo.toml | 2 +- components/imageproc/Cargo.toml | 2 +- components/imageproc/src/lib.rs | 89 +++++++++++-------- .../content/image-resizing/index.md | 22 ++--- .../documentation/templates/pages-sections.md | 4 +- docs/templates/shortcodes/gallery.html | 2 +- 8 files changed, 99 insertions(+), 87 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f0d8aa10..ddc608ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -310,14 +310,6 @@ dependencies = [ "strum_macros 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "enum_primitive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "error-chain" version = "0.11.0" @@ -331,7 +323,7 @@ name = "errors" version = "0.1.0" dependencies = [ "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "image 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -432,7 +424,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "gif" -version = "0.9.2" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -540,17 +532,18 @@ dependencies = [ [[package]] name = "image" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "gif 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", + "gif 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "jpeg-decoder 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-derive 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", "num-rational 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", - "png 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "png 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -559,7 +552,7 @@ name = "imageproc" version = "0.1.0" dependencies = [ "errors 0.1.0", - "image 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -570,7 +563,7 @@ dependencies = [ [[package]] name = "inflate" -version = "0.3.4" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -892,6 +885,17 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "num-derive" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "num-integer" version = "0.1.39" @@ -918,14 +922,6 @@ dependencies = [ "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "num-traits" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "num-traits" version = "0.2.5" @@ -1066,12 +1062,12 @@ dependencies = [ [[package]] name = "png" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "deflate 0.7.18 (registry+https://github.com/rust-lang/crates.io-index)", - "inflate 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "inflate 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1945,7 +1941,6 @@ dependencies = [ "checksum duct 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "166298c17c5b4fe5997b962c2f22e887c7c5adc44308eb9103ce5b66af45a423" "checksum either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be565ca5c557d7f59e7cfcf1844f9e3033650c929c6566f511e8005f205c1d0" "checksum elasticlunr-rs 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4837d77a1e157489a3933b743fd774ae75074e0e390b2b7f071530048a0d87ee" -"checksum enum_primitive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be4551092f4d519593039259a9ed8daedf0da12e5109c5280338073eaeb81180" "checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3" "checksum filetime 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "714653f3e34871534de23771ac7b26e999651a0a228f47beb324dfdf1dd4b10f" "checksum flate2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9fac2277e84e5e858483756647a9d0aa8d9a2b7cba517fd84325a0aaa69a0909" @@ -1958,7 +1953,7 @@ dependencies = [ "checksum futf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" "checksum getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "b900c08c1939860ce8b54dc6a89e26e00c04c380fd0e09796799bd7f12861e05" -"checksum gif 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2e41945ba23db3bf51b24756d73d81acb4f28d85c3dccc32c6fae904438c25f" +"checksum gif 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff3414b424657317e708489d2857d9575f4403698428b040b609b9d1c1a84a2c" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "checksum globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "142754da2c9b3722affd909f9e27f2a6700a7a303f362971e0a74c652005a43d" "checksum html5ever 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b04478cf718862650a0bf66acaf8f2f8c906fbc703f35c916c1f4211b069a364" @@ -1966,8 +1961,8 @@ dependencies = [ "checksum humansize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6cab2627acfc432780848602f3f558f7e9dd427352224b0d9324025796d2a5e" "checksum hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)" = "368cb56b2740ebf4230520e2b90ebb0461e69034d85d1945febd9b3971426db2" "checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d" -"checksum image 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "545f000e8aa4e569e93f49c446987133452e0091c2494ac3efd3606aa3d309f2" -"checksum inflate 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f5f9f47468e9a76a6452271efadc88fe865a82be91fe75e6c0c57b87ccea59d4" +"checksum image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebdff791af04e30089bde8ad2a632b86af433b40c04db8d70ad4b21487db7a6a" +"checksum inflate 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4ec18d981200fd14e65ee8e35fb60ed1ce55227a02407303f3a72517c6146dcc" "checksum inotify 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887fcc180136e77a85e6a6128579a719027b1bab9b1c38ea4444244fe262c20c" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" "checksum iron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d8e17268922834707e1c29e8badbf9c712c9c43378e1b6a3388946baff10be2" @@ -2004,10 +1999,10 @@ dependencies = [ "checksum nix 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bfb3ddedaa14746434a02041940495bf11325c22f6d36125d3bdd56090d50a79" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" "checksum notify 4.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5c3812da3098f210a0bb440f9c008471a031aa4c1de07a264fdd75456c95a4eb" +"checksum num-derive 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0d2c31b75c36a993d30c7a13d70513cb93f02acafdd5b7ba250f9b0e18615de7" "checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" "checksum num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "af3fdbbc3291a5464dc57b03860ec37ca6bf915ed6ee385e7c6c052c422b2124" "checksum num-rational 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ee314c74bd753fc86b4780aa9475da469155f3848473a261d2d18e35245a784e" -"checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" "checksum num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "630de1ef5cc79d0cdd78b7e33b81f083cbfe90de0f4b2b2f07f905867c70e9fe" "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" "checksum onig 3.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f5eeb268a4620c74ea5768c6d2ccd492d60a47a8754666b91a46bfc35cd4d1ba" @@ -2023,7 +2018,7 @@ dependencies = [ "checksum pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "110d5ee3593dbb73f56294327fe5668bcc997897097cbc76b51e7aed3f52452f" "checksum plist 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c61ac2afed2856590ae79d6f358a24b85ece246d2aa134741a66d589519b7503" "checksum plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1a6a0dc3910bc8db877ffed8e457763b317cf880df4ae19109b9f77d277cf6e0" -"checksum png 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f0b0cabbbd20c2d7f06dbf015e06aad59b6ca3d9ed14848783e98af9aaf19925" +"checksum png 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f54b9600d584d3b8a739e1662a595fab051329eff43f20e7d8cc22872962145b" "checksum precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" "checksum proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1b06e2f335f48d24442b35a19df506a835fb3547bc3c06ef27340da9acf5cae7" "checksum proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "effdb53b25cdad54f8f48843d67398f7ef2e14f12c1b4cb4effc549a6462a4d6" diff --git a/components/content/src/page.rs b/components/content/src/page.rs index 47d2ad8e..10bcf26b 100644 --- a/components/content/src/page.rs +++ b/components/content/src/page.rs @@ -267,9 +267,9 @@ impl ser::Serialize for Page { state.serialize_field("next", &self.next)?; state.serialize_field("toc", &self.toc)?; state.serialize_field("draft", &self.is_draft())?; - let (assets, assets_imgs) = self.serialize_assets(); + let (assets, images) = self.serialize_assets(); state.serialize_field("assets", &assets)?; - state.serialize_field("assets_imgs", &assets_imgs)?; + state.serialize_field("images", &images)?; state.end() } } diff --git a/components/errors/Cargo.toml b/components/errors/Cargo.toml index c742ca41..68dd911c 100644 --- a/components/errors/Cargo.toml +++ b/components/errors/Cargo.toml @@ -7,4 +7,4 @@ authors = ["Vincent Prouillet "] error-chain = "0.11" tera = "0.11" toml = "0.4" -image = "0.18.0" +image = "0.19.0" diff --git a/components/imageproc/Cargo.toml b/components/imageproc/Cargo.toml index 571b2ede..647873fb 100644 --- a/components/imageproc/Cargo.toml +++ b/components/imageproc/Cargo.toml @@ -7,7 +7,7 @@ authors = ["Vojtěch Král "] lazy_static = "1" regex = "0.2" tera = "0.11.0" -image = "0.18.0" +image = "0.19.0" rayon = "0.9" twox-hash = "1.1" diff --git a/components/imageproc/src/lib.rs b/components/imageproc/src/lib.rs index 78fa8044..bab13d80 100644 --- a/components/imageproc/src/lib.rs +++ b/components/imageproc/src/lib.rs @@ -52,8 +52,8 @@ impl ResizeOp { // Validate args: match op { - "fitwidth" => if width.is_none() { return Err(format!("op=fitwidth requires a `width` argument").into()) }, - "fitheight" => if height.is_none() { return Err(format!("op=fitwidth requires a `height` argument").into()) }, + "fit_width" => if width.is_none() { return Err(format!("op=\"fit_width\" requires a `width` argument").into()) }, + "fit_height" => if height.is_none() { return Err(format!("op=\"fit_height\" requires a `height` argument").into()) }, "scale" | "fit" | "fill" => if width.is_none() || height.is_none() { return Err(format!("op={} requires a `width` and `height` argument", op).into()) }, @@ -62,8 +62,8 @@ impl ResizeOp { Ok(match op { "scale" => Scale(width.unwrap(), height.unwrap()), - "fitwidth" => FitWidth(width.unwrap()), - "fitheight" => FitHeight(height.unwrap()), + "fit_width" => FitWidth(width.unwrap()), + "fit_height" => FitHeight(height.unwrap()), "fit" => Fit(width.unwrap(), height.unwrap()), "fill" => Fill(width.unwrap(), height.unwrap()), _ => unreachable!(), @@ -123,6 +123,7 @@ pub struct ImageOp { source: String, op: ResizeOp, quality: u8, + /// Hash of the above parameters hash: u64, collision: Option, } @@ -143,7 +144,7 @@ impl ImageOp { Ok(Self::new(source, op, quality)) } - fn num_colli(&self) -> u32 { self.collision.unwrap_or(0) } + fn num_collisions(&self) -> u32 { self.collision.unwrap_or(0) } fn perform(&self, content_path: &Path, target_path: &Path) -> Result<()> { use ResizeOp::*; @@ -165,24 +166,30 @@ impl ImageOp { FitHeight(h) => img.resize(u32::max_value(), h, RESIZE_FILTER), Fit(w, h) => img.resize(w, h, RESIZE_FILTER), Fill(w, h) => { - let fw = img_w as f32 / w as f32; - let fh = img_h as f32 / h as f32; + let factor_w = img_w as f32 / w as f32; + let factor_h = img_h as f32 / h as f32; - if (fw - fh).abs() <= RATIO_EPSILLION { - // The aspect is similar enough that there's not much point in cropping + if (factor_w - factor_h).abs() <= RATIO_EPSILLION { + // If the horizontal and vertical factor is very similar, that means the aspect is similar enough + // that there's not much point in cropping, so just perform a simple scale in this case. img.resize_exact(w, h, RESIZE_FILTER) } else { // We perform the fill such that a crop is performed first and then resize_exact can be used, // which should be cheaper than resizing and then cropping (smaller number of pixels to resize). - let (crop_w, crop_h) = match fw < fh { - true => (img_w, (fw * h as f32).round() as u32), - false => ((fh * w as f32).round() as u32, img_h), + + let (crop_w, crop_h) = if factor_w < factor_h { + (img_w, (factor_w * h as f32).round() as u32) + } else { + ((factor_h * w as f32).round() as u32, img_h) }; - let (off_w, off_h) = match fw < fh { - true => (0, (img_h - crop_h) / 2), - false => ((img_w - crop_w) / 2, 0), + + let (offset_w, offset_h) = if factor_w < factor_h { + (0, (img_h - crop_h) / 2) + } else { + ((img_w - crop_w) / 2, 0) }; - img.crop(off_w, off_h, crop_w, crop_h).resize_exact(w, h, RESIZE_FILTER) + + img.crop(offset_w, offset_h, crop_w, crop_h).resize_exact(w, h, RESIZE_FILTER) } }, }; @@ -204,9 +211,12 @@ pub struct Processor { content_path: PathBuf, resized_path: PathBuf, resized_url: String, + /// A map of a ImageOps by their stored hash. + /// Note that this cannot be a HashSet, because hashest handles collisions and we don't want that, + /// we need to be aware of and handle collisions ourselves. img_ops: HashMap, - // Hash collisions go here: - img_ops_colls: Vec, + /// Hash collisions go here: + img_ops_collisions: Vec, } impl Processor { @@ -216,14 +226,15 @@ impl Processor { resized_path: static_path.join(RESIZED_SUBDIR), resized_url: Self::resized_url(base_url), img_ops: HashMap::new(), - img_ops_colls: Vec::new(), + img_ops_collisions: Vec::new(), } } fn resized_url(base_url: &str) -> String { - match base_url.ends_with('/') { - true => format!("{}{}", base_url, RESIZED_SUBDIR), - false => format!("{}/{}", base_url, RESIZED_SUBDIR), + if base_url.ends_with('/') { + format!("{}{}", base_url, RESIZED_SUBDIR) + } else { + format!("{}/{}", base_url, RESIZED_SUBDIR) } } @@ -236,10 +247,10 @@ impl Processor { } pub fn num_img_ops(&self) -> usize { - self.img_ops.len() + self.img_ops_colls.len() + self.img_ops.len() + self.img_ops_collisions.len() } - fn insert_with_colls(&mut self, mut img_op: ImageOp) -> u32 { + fn insert_with_collisions(&mut self, mut img_op: ImageOp) -> u32 { match self.img_ops.entry(img_op.hash) { HEntry::Occupied(entry) => if *entry.get() == img_op { return 0; }, HEntry::Vacant(entry) => { @@ -249,37 +260,43 @@ impl Processor { } // If we get here, that means a hash collision. + // This is detected when there is an ImageOp with the same hash in the `img_ops` map but which is not equal to this one. + // To deal with this, all collisions get a (random) sequential ID number. + + // First try to look up this ImageOp in `img_ops_collisions`, maybe we've already seen the same ImageOp let mut num = 1; - for op in self.img_ops_colls.iter().filter(|op| op.hash == img_op.hash) { + for op in self.img_ops_collisions.iter().filter(|op| op.hash == img_op.hash) { if *op == img_op { + // This is a colliding ImageOp, but we've already seen the very same one, so just return its ID return num; } else { num += 1; } } + // If we get here, that means this is a new colliding ImageOp and `num` has the next free ID if num == 1 { self.img_ops.get_mut(&img_op.hash).unwrap().collision = Some(0); } img_op.collision = Some(num); - self.img_ops_colls.push(img_op); + self.img_ops_collisions.push(img_op); num } - fn op_filename(hash: u64, colli_num: u32) -> String { + fn op_filename(hash: u64, num_collisions: u32) -> String { // Please keep this in sync with RESIZED_FILENAME - assert!(colli_num < 256, "Unexpectedly large number of collisions: {}", colli_num); - format!("{:016x}{:02x}.jpg", hash, colli_num) + assert!(num_collisions < 256, "Unexpectedly large number of collisions: {}", num_collisions); + format!("{:016x}{:02x}.jpg", hash, num_collisions) } - fn op_url(&self, hash: u64, colli_num: u32) -> String { - format!("{}/{}", &self.resized_url, Self::op_filename(hash, colli_num)) + fn op_url(&self, hash: u64, num_collisions: u32) -> String { + format!("{}/{}", &self.resized_url, Self::op_filename(hash, num_collisions)) } pub fn insert(&mut self, img_op: ImageOp) -> String { let hash = img_op.hash; - let num_colli = self.insert_with_colls(img_op); - self.op_url(hash, num_colli) + let num_collisions = self.insert_with_collisions(img_op); + self.op_url(hash, num_collisions) } pub fn prune(&self) -> Result<()> { @@ -291,8 +308,8 @@ impl Processor { let filename = entry_path.file_name().unwrap().to_string_lossy(); if let Some(capts) = RESIZED_FILENAME.captures(filename.as_ref()) { let hash = u64::from_str_radix(capts.get(1).unwrap().as_str(), 16).unwrap(); - let num_colli = u32::from_str_radix(capts.get(2).unwrap().as_str(), 16).unwrap(); - if num_colli > 0 || !self.img_ops.contains_key(&hash) { + let num_collisions = u32::from_str_radix(capts.get(2).unwrap().as_str(), 16).unwrap(); + if num_collisions > 0 || !self.img_ops.contains_key(&hash) { fs::remove_file(&entry_path)?; } } @@ -303,7 +320,7 @@ impl Processor { pub fn do_process(&mut self) -> Result<()> { self.img_ops.par_iter().map(|(hash, op)| { - let target = self.resized_path.join(Self::op_filename(*hash, op.num_colli())); + let target = self.resized_path.join(Self::op_filename(*hash, op.num_collisions())); op.perform(&self.content_path, &target) .chain_err(|| format!("Failed to process image: {}", op.source)) }) diff --git a/docs/content/documentation/content/image-resizing/index.md b/docs/content/documentation/content/image-resizing/index.md index 81529ee2..d4442161 100644 --- a/docs/content/documentation/content/image-resizing/index.md +++ b/docs/content/documentation/content/image-resizing/index.md @@ -17,7 +17,7 @@ The function usage is as follows: - `path`: The path to the source image relative to the `content` directory in the [directory structure](./documentation/getting-started/directory-structure.md). - `width` and `height`: The dimensions in pixels of the resized image. Usage depends on the `op` argument. -- `op`: Resize operation. This can be one of five choices: `"scale"`, `"fitwidth"`, `"fitheight"`, `"fit"`, or `"fill"`. +- `op`: Resize operation. This can be one of five choices: `"scale"`, `"fit_width"`, `"fit_height"`, `"fit"`, or `"fill"`. What each of these does is explained below. This argument is optional, default value is `"fill"`. - `quality`: JPEG quality of the resized image, in percents. Optional argument, default value is `75`. @@ -48,24 +48,24 @@ The source for all examples is this 300 × 380 pixels image: {{ resize_image(path="documentation/content/image-resizing/gutenberg.jpg", width=150, height=150, op="scale") }} -### **`"fitwidth"`** +### **`"fit_width"`** Resizes the image such that the resulting width is `width` and height is whatever will preserve the aspect ratio. The `height` argument is not needed. - `resize_image(..., width=100, op="fitwidth")` + `resize_image(..., width=100, op="fit_width")` - {{ resize_image(path="documentation/content/image-resizing/gutenberg.jpg", width=100, height=0, op="fitwidth") }} + {{ resize_image(path="documentation/content/image-resizing/gutenberg.jpg", width=100, height=0, op="fit_width") }} -### **`"fitheight"`** +### **`"fit_height"`** Resizes the image such that the resulting height is `height` and width is whatever will preserve the aspect ratio. The `width` argument is not needed. - `resize_image(..., height=150, op="fitheight")` + `resize_image(..., height=150, op="fit_height")` - {{ resize_image(path="documentation/content/image-resizing/gutenberg.jpg", width=0, height=150, op="fitheight") }} + {{ resize_image(path="documentation/content/image-resizing/gutenberg.jpg", width=0, height=150, op="fit_height") }} ### **`"fit"`** - Like `"fitwidth"` and `"fitheight"` combined. + Like `"fit_width"` and `"fit_height"` combined. Resizes the image such that the result fits within `width` and `height` preserving aspect ratio. This means that both width or height will be at max `width` and `height`, respectively, but possibly one of them smaller so as to preserve the aspect ratio. @@ -97,15 +97,15 @@ The examples above were generated using a shortcode file named `resize_image.htm The `resize_image()` can be used multiple times and/or in loops (it is designed to handle this efficiently). -This can be used along with `assets_imgs` [page metadata](./documentation/templates/pages-sections.md) to create picture galleries. -The `assets_imgs` variable holds paths to all images in the directory of a page with resources +This can be used along with `images` [page metadata](./documentation/templates/pages-sections.md) to create picture galleries. +The `images` variable holds paths to all images in the directory of a page with resources (see [Assets colocation](./documentation/content/overview.md#assets-colocation)). This can be used in shortcodes. For example, we can create a very simple html-only clickable picture gallery with the following shortcode named `gallery.html`: ```jinja2 -{% for img in page.assets_imgs %} +{% for img in page.images %} diff --git a/docs/content/documentation/templates/pages-sections.md b/docs/content/documentation/templates/pages-sections.md index a4848b32..b8fa6446 100644 --- a/docs/content/documentation/templates/pages-sections.md +++ b/docs/content/documentation/templates/pages-sections.md @@ -40,11 +40,11 @@ toc: Array
; // Paths of colocated assets, relative to the content directory assets: Array; // Paths of colocated image assets, ie. files with an extension of "jpg", "jpeg", "png", "gif", or "bmp" -assets_imgs: Array; +images: Array; ``` ## Section variables -By default, Gutenberg will try to load `templates/index.html` for `content/_index.md` +By default, Gutenberg will try to load `templates/index.html` for `content/_index.md` and `templates/section.html` for others `_index.md` files. If there isn't one, it will render the built-in template: a blank page. diff --git a/docs/templates/shortcodes/gallery.html b/docs/templates/shortcodes/gallery.html index cda36fb0..fa1c84b6 100644 --- a/docs/templates/shortcodes/gallery.html +++ b/docs/templates/shortcodes/gallery.html @@ -1,4 +1,4 @@ -{% for img in page.assets_imgs %} +{% for img in page.images %} From 4a6244adcf750a59da3eb0b45c9e412f22b28c58 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Fri, 25 May 2018 18:37:27 +0200 Subject: [PATCH 26/74] imageproc: Cleanup and comments in hash collision resolution --- components/imageproc/src/lib.rs | 53 ++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/components/imageproc/src/lib.rs b/components/imageproc/src/lib.rs index bab13d80..fde98af8 100644 --- a/components/imageproc/src/lib.rs +++ b/components/imageproc/src/lib.rs @@ -125,7 +125,10 @@ pub struct ImageOp { quality: u8, /// Hash of the above parameters hash: u64, - collision: Option, + /// If there is a hash collision with another ImageOp, this contains a sequential ID > 1 + /// identifying the collision in the order as encountered (which is essentially random). + /// Therefore, ImageOps with collisions (ie. collision_id > 0) are always considered out of date. + collision_id: u32, } impl ImageOp { @@ -136,7 +139,7 @@ impl ImageOp { hasher.write_u8(quality); let hash = hasher.finish(); - ImageOp { source, op, quality, hash, collision: None } + ImageOp { source, op, quality, hash, collision_id: 0 } } pub fn from_args(source: String, op: &str, width: Option, height: Option, quality: u8) -> Result { @@ -144,8 +147,6 @@ impl ImageOp { Ok(Self::new(source, op, quality)) } - fn num_collisions(&self) -> u32 { self.collision.unwrap_or(0) } - fn perform(&self, content_path: &Path, target_path: &Path) -> Result<()> { use ResizeOp::*; @@ -263,40 +264,44 @@ impl Processor { // This is detected when there is an ImageOp with the same hash in the `img_ops` map but which is not equal to this one. // To deal with this, all collisions get a (random) sequential ID number. - // First try to look up this ImageOp in `img_ops_collisions`, maybe we've already seen the same ImageOp - let mut num = 1; + // First try to look up this ImageOp in `img_ops_collisions`, maybe we've already seen the same ImageOp. + // At the same time, count IDs to figure out the next free one. + // Start with the ID of 2, because we'll need to use 1 for the ImageOp already present in the map: + let mut collision_id = 2; for op in self.img_ops_collisions.iter().filter(|op| op.hash == img_op.hash) { if *op == img_op { - // This is a colliding ImageOp, but we've already seen the very same one, so just return its ID - return num; + // This is a colliding ImageOp, but we've already seen an equal one (not just by hash, but by content too), + // so just return its ID: + return collision_id; } else { - num += 1; + collision_id += 1; } } - // If we get here, that means this is a new colliding ImageOp and `num` has the next free ID - if num == 1 { - self.img_ops.get_mut(&img_op.hash).unwrap().collision = Some(0); + // If we get here, that means this is a new colliding ImageOp and `collision_id` is the next free ID + if collision_id == 2 { + // This is the first collision found with this hash, update the ID of the matching ImageOp in the map. + self.img_ops.get_mut(&img_op.hash).unwrap().collision_id = 1; } - img_op.collision = Some(num); + img_op.collision_id = collision_id; self.img_ops_collisions.push(img_op); - num + collision_id } - fn op_filename(hash: u64, num_collisions: u32) -> String { + fn op_filename(hash: u64, collision_id: u32) -> String { // Please keep this in sync with RESIZED_FILENAME - assert!(num_collisions < 256, "Unexpectedly large number of collisions: {}", num_collisions); - format!("{:016x}{:02x}.jpg", hash, num_collisions) + assert!(collision_id < 256, "Unexpectedly large number of collisions: {}", collision_id); + format!("{:016x}{:02x}.jpg", hash, collision_id) } - fn op_url(&self, hash: u64, num_collisions: u32) -> String { - format!("{}/{}", &self.resized_url, Self::op_filename(hash, num_collisions)) + fn op_url(&self, hash: u64, collision_id: u32) -> String { + format!("{}/{}", &self.resized_url, Self::op_filename(hash, collision_id)) } pub fn insert(&mut self, img_op: ImageOp) -> String { let hash = img_op.hash; - let num_collisions = self.insert_with_collisions(img_op); - self.op_url(hash, num_collisions) + let collision_id = self.insert_with_collisions(img_op); + self.op_url(hash, collision_id) } pub fn prune(&self) -> Result<()> { @@ -308,8 +313,8 @@ impl Processor { let filename = entry_path.file_name().unwrap().to_string_lossy(); if let Some(capts) = RESIZED_FILENAME.captures(filename.as_ref()) { let hash = u64::from_str_radix(capts.get(1).unwrap().as_str(), 16).unwrap(); - let num_collisions = u32::from_str_radix(capts.get(2).unwrap().as_str(), 16).unwrap(); - if num_collisions > 0 || !self.img_ops.contains_key(&hash) { + let collision_id = u32::from_str_radix(capts.get(2).unwrap().as_str(), 16).unwrap(); + if collision_id > 0 || !self.img_ops.contains_key(&hash) { fs::remove_file(&entry_path)?; } } @@ -320,7 +325,7 @@ impl Processor { pub fn do_process(&mut self) -> Result<()> { self.img_ops.par_iter().map(|(hash, op)| { - let target = self.resized_path.join(Self::op_filename(*hash, op.num_collisions())); + let target = self.resized_path.join(Self::op_filename(*hash, op.collision_id)); op.perform(&self.content_path, &target) .chain_err(|| format!("Failed to process image: {}", op.source)) }) From 8e8cdfeb7f53ba3b195350791a027072844905a8 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Wed, 30 May 2018 14:08:35 +0200 Subject: [PATCH 27/74] Add year, month and day to page context with a date --- CHANGELOG.md | 1 + Cargo.lock | 1 + components/content/Cargo.toml | 1 + components/content/src/lib.rs | 1 + components/content/src/page.rs | 14 ++++++++++++-- .../documentation/templates/pages-sections.md | 6 ++++-- 6 files changed, 20 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e9384b8..fb50842d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ - Co-located assets are now permalinks - Words are now counted using unicode rather than whitespaces - Aliases can now be pointing directly to specific HTML files +- Add `year`, `month` and `day` variables to pages with a date ## 0.3.4 (2018-06-22) diff --git a/Cargo.lock b/Cargo.lock index ddc608ea..4d495c19 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -210,6 +210,7 @@ dependencies = [ name = "content" version = "0.1.0" dependencies = [ + "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "config 0.1.0", "errors 0.1.0", "front_matter 0.1.0", diff --git a/components/content/Cargo.toml b/components/content/Cargo.toml index 2e7724e7..e9138738 100644 --- a/components/content/Cargo.toml +++ b/components/content/Cargo.toml @@ -8,6 +8,7 @@ tera = "0.11" serde = "1" slug = "0.1" rayon = "1" +chrono = "0.4" errors = { path = "../errors" } config = { path = "../config" } diff --git a/components/content/src/lib.rs b/components/content/src/lib.rs index dc5cf9c4..4cd93fac 100644 --- a/components/content/src/lib.rs +++ b/components/content/src/lib.rs @@ -2,6 +2,7 @@ extern crate tera; extern crate slug; extern crate serde; extern crate rayon; +extern crate chrono; extern crate errors; extern crate config; diff --git a/components/content/src/page.rs b/components/content/src/page.rs index 10bcf26b..704b0682 100644 --- a/components/content/src/page.rs +++ b/components/content/src/page.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use std::path::{Path, PathBuf}; use std::result::Result as StdResult; - +use chrono::Datelike; use tera::{Tera, Context as TeraContext}; use serde::ser::{SerializeStruct, self}; use slug::slugify; @@ -247,11 +247,21 @@ impl Default for Page { impl ser::Serialize for Page { fn serialize(&self, serializer: S) -> StdResult where S: ser::Serializer { - let mut state = serializer.serialize_struct("page", 18)?; + let mut state = serializer.serialize_struct("page", 21)?; state.serialize_field("content", &self.content)?; state.serialize_field("title", &self.meta.title)?; state.serialize_field("description", &self.meta.description)?; state.serialize_field("date", &self.meta.date)?; + if let Some(chrono_datetime) = self.meta.date() { + let d = chrono_datetime.date(); + state.serialize_field("year", &d.year())?; + state.serialize_field("month", &d.month())?; + state.serialize_field("day", &d.day())?; + } else { + state.serialize_field::>("year", &None)?; + state.serialize_field::>("month", &None)?; + state.serialize_field::>("day", &None)?; + } state.serialize_field("slug", &self.slug)?; state.serialize_field("path", &self.path)?; state.serialize_field("components", &self.components)?; diff --git a/docs/content/documentation/templates/pages-sections.md b/docs/content/documentation/templates/pages-sections.md index b8fa6446..b4caa1fa 100644 --- a/docs/content/documentation/templates/pages-sections.md +++ b/docs/content/documentation/templates/pages-sections.md @@ -39,8 +39,10 @@ next: Page?; toc: Array
; // Paths of colocated assets, relative to the content directory assets: Array; -// Paths of colocated image assets, ie. files with an extension of "jpg", "jpeg", "png", "gif", or "bmp" -images: Array; +// Year/month/day is only set if the page has a date and month/day are 1-indexed +year: Number?; +month: Number?; +day: Number?; ``` ## Section variables From 908f16855a3a5bce0b10d6f1ddcc52064dafe409 Mon Sep 17 00:00:00 2001 From: Owen Nelson Date: Sat, 26 May 2018 22:19:01 -0700 Subject: [PATCH 28/74] Fixes #279 switch from iron to actix-web. This implementation seems to match the behavior of the previous iron server. Static files are rendered as-is, and when a directory is requested, we attempt to render a `index.html` found inside, or 404 if it's not present. The actix docs mention using channels to send a message to the server to shut it down gracefully while running in another thread (as we're doing here), but it seems like there would have to be some reorganization in order to manage this effectively, perhaps holding the channel sender inside `main.rs` so we can push a message through to the server when the call to `cmd::serve()` finally returns. For the time being, I left things without any careful attempts to cleanup the server thread. This more or less matches the old iron implementation as far as I can see. The static file handling in actix is _just_ a little off from what we'd want. I left some comments in the source regarding why we can't just use their hook for directory index redirection. --- Cargo.lock | 919 ++++++++++++++++++++++++++++++++++++++++++----- Cargo.toml | 5 +- src/cmd/serve.rs | 62 +++- src/main.rs | 7 +- 4 files changed, 872 insertions(+), 121 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4d495c19..cdb8493e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,3 +1,82 @@ +[[package]] +name = "actix" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "actix_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-channel 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "skeptic 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-signal 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-resolver 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "actix-web" +version = "0.6.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "actix 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "brotli2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "cookie 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "flate2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "http-range 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "mime_guess 2.0.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_urlencoded 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "actix_derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "adler32" version = "1.0.3" @@ -50,6 +129,20 @@ dependencies = [ "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "backtrace" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace-sys 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "backtrace" version = "0.3.8" @@ -127,6 +220,29 @@ name = "bitflags" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "brotli-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "brotli2" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "brotli-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "bytecount" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "byteorder" version = "1.2.3" @@ -146,6 +262,18 @@ dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "cargo_metadata" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cc" version = "1.0.17" @@ -226,6 +354,27 @@ dependencies = [ "utils 0.1.0", ] +[[package]] +name = "cookie" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crossbeam-channel" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-epoch 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-deque" version = "0.2.0" @@ -235,6 +384,15 @@ dependencies = [ "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-deque" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-epoch 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-epoch" version = "0.3.1" @@ -249,6 +407,19 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-epoch" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-utils" version = "0.2.2" @@ -257,6 +428,14 @@ dependencies = [ "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-utils" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ctrlc" version = "3.1.1" @@ -266,6 +445,15 @@ dependencies = [ "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "dbghelp-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "deflate" version = "0.7.18" @@ -311,6 +499,79 @@ dependencies = [ "strum_macros 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "encoding" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "encoding-index-japanese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "encoding-index-korean" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "encoding-index-simpchinese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "encoding-index-singlebyte" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "encoding-index-tradchinese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "encoding_index_tests" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "error-chain" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "error-chain" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "error-chain" version = "0.11.0" @@ -329,6 +590,25 @@ dependencies = [ "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "failure" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "failure_derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "filetime" version = "0.1.15" @@ -413,6 +693,20 @@ dependencies = [ "new_debug_unreachable 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "futures" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "futures-cpupool" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "gcc" version = "0.3.54" @@ -453,18 +747,17 @@ dependencies = [ name = "gutenberg" version = "0.4.0" dependencies = [ + "actix 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-web 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)", "content 0.1.0", "ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "errors 0.1.0", "front_matter 0.1.0", - "iron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "mount 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "notify 4.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "rebuild 0.1.0", "site 0.1.0", - "staticfile 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "term-painter 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -472,6 +765,23 @@ dependencies = [ "ws 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "h2" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "string 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "highlighting" version = "0.1.0" @@ -480,6 +790,15 @@ dependencies = [ "syntect 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "hostname" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "winutil 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "html5ever" version = "0.22.3" @@ -493,6 +812,21 @@ dependencies = [ "syn 0.13.11 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "http" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "http-range" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "httparse" version = "1.3.1" @@ -503,24 +837,6 @@ name = "humansize" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "hyper" -version = "0.10.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "idna" version = "0.1.4" @@ -562,6 +878,11 @@ dependencies = [ "utils 0.1.0", ] +[[package]] +name = "indexmap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "inflate" version = "0.4.2" @@ -588,18 +909,15 @@ dependencies = [ ] [[package]] -name = "iron" -version = "0.6.0" +name = "ipconfig" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "mime_guess 1.8.4 (registry+https://github.com/rust-lang/crates.io-index)", - "modifier 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "typemap 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", + "socket2 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "widestring 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "winreg 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -630,6 +948,11 @@ name = "language-tags" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "lazy_static" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "lazy_static" version = "1.0.1" @@ -645,6 +968,11 @@ name = "libc" version = "0.2.42" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "linked-hash-map" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "linked-hash-map" version = "0.5.1" @@ -666,6 +994,14 @@ dependencies = [ "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lru-cache" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "linked-hash-map 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "lzw" version = "0.10.0" @@ -716,18 +1052,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "mime" -version = "0.2.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "mime_guess" -version = "1.8.4" +version = "2.0.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "phf 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)", "phf_codegen 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -776,6 +1112,16 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "mio-uds" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "miow" version = "0.1.5" @@ -798,20 +1144,6 @@ dependencies = [ "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "modifier" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "mount" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "iron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sequence_trie 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "net2" version = "0.2.32" @@ -967,6 +1299,14 @@ dependencies = [ "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "owning_ref" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "stable_deref_trait 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "pagination" version = "0.1.0" @@ -981,6 +1321,26 @@ dependencies = [ "utils 0.1.0", ] +[[package]] +name = "parking_lot" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "parking_lot_core" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "percent-encoding" version = "1.0.1" @@ -1053,14 +1413,6 @@ dependencies = [ "xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "plugin" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "typemap 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "png" version = "0.12.0" @@ -1102,6 +1454,11 @@ dependencies = [ "getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "quick-error" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "quote" version = "0.3.15" @@ -1143,6 +1500,14 @@ dependencies = [ "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rayon" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rayon" version = "0.9.0" @@ -1272,6 +1637,27 @@ dependencies = [ "utils 0.1.0", ] +[[package]] +name = "resolv-conf" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "hostname 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ring" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rust-stemmers" version = "1.0.2" @@ -1318,6 +1704,11 @@ dependencies = [ "pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "scoped-tls" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "scoped_threadpool" version = "0.1.9" @@ -1340,8 +1731,17 @@ dependencies = [ ] [[package]] -name = "sequence_trie" -version = "0.3.5" +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1369,6 +1769,17 @@ dependencies = [ "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "serde_urlencoded" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "sha1" version = "0.6.0" @@ -1412,6 +1823,21 @@ dependencies = [ "utils 0.1.0", ] +[[package]] +name = "skeptic" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytecount 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cargo_metadata 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "slab" version = "0.1.3" @@ -1436,16 +1862,31 @@ dependencies = [ ] [[package]] -name = "staticfile" -version = "0.5.0" +name = "smallvec" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "socket2" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "iron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "mount 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "stable_deref_trait" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "string" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "string_cache" version = "0.7.3" @@ -1535,6 +1976,15 @@ dependencies = [ "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "synstructure" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "syntect" version = "2.1.0" @@ -1570,6 +2020,15 @@ dependencies = [ "utils 0.1.0", ] +[[package]] +name = "tempdir" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tempfile" version = "3.0.2" @@ -1681,6 +2140,155 @@ dependencies = [ "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-fs 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-udp 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-codec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-core" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-executor" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-fs" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-io" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-reactor" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-signal" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "mio-uds 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-tcp" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-threadpool" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-timer" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-udp" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "toml" version = "0.4.6" @@ -1690,9 +2298,37 @@ dependencies = [ ] [[package]] -name = "traitobject" -version = "0.1.0" +name = "trust-dns-proto" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "trust-dns-resolver" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "error-chain 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "ipconfig 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "resolv-conf 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-proto 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "twox-hash" @@ -1702,19 +2338,6 @@ dependencies = [ "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "typeable" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "typemap" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "unsafe-any 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "ucd-util" version = "0.1.1" @@ -1728,6 +2351,14 @@ dependencies = [ "version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "unicase" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "unicode-bidi" version = "0.3.4" @@ -1775,18 +2406,16 @@ dependencies = [ ] [[package]] -name = "unsafe-any" -version = "0.4.2" +name = "untrusted" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "url" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1813,6 +2442,15 @@ dependencies = [ "walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "uuid" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "vec_map" version = "0.8.1" @@ -1837,6 +2475,11 @@ dependencies = [ "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "widestring" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "winapi" version = "0.2.8" @@ -1866,6 +2509,22 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "winreg" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "winutil" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "ws" version = "0.7.6" @@ -1908,12 +2567,16 @@ dependencies = [ ] [metadata] +"checksum actix 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7f0b2daad36916ccd2b162dbc5a04a74df642a29391b1a341c8ee3e82026cb16" +"checksum actix-web 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "e35bb192338dc7726564b0bdf2d49d43cbf4c7845231a82527f5f302bdb8f477" +"checksum actix_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4b1dc922654b9aca7a8a31eab875fde804fa9fbd67f220f2e457787b23590f2" "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4" "checksum ammonia 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fd4c682378117e4186a492b2252b9537990e1617f44aed9788b9a1149de45477" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" "checksum atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2fc4a1aa4c24c0718a250f0681885c1af91419d242f29eb8f2ab28502d80dbd1" +"checksum backtrace 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "346d7644f0b5f9bc73082d3b2236b69a05fd35cce0cfa3724e184e6a5c9e2a2f" "checksum backtrace 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dbdd17cd962b570302f5297aea8648d5923e22e555c2ed2d8b2e34eca646bf6d" "checksum backtrace-sys 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "bff67d0c06556c0b8e6b5f090f0eac52d950d9dfd1d35ba04e4ca3543eaf6a7e" "checksum base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96434f987501f0ed4eb336a411e0631ecd1afa11574fe148587adc4ff96143c9" @@ -1924,25 +2587,46 @@ dependencies = [ "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" "checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" "checksum bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c54bb8f454c567f21197eefcdbf5679d0bd99f2ddbe52e84c77061952e6789" +"checksum brotli-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4445dea95f4c2b41cde57cc9fee236ae4dbae88d8fcbdb4750fc1bb5d86aaecd" +"checksum brotli2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0cb036c3eade309815c15ddbacec5b22c4d1f3983a774ab2eac2e3e9ea85568e" +"checksum bytecount 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "882585cd7ec84e902472df34a5e01891202db3bf62614e1f0afe459c1afcf744" "checksum byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "74c0b906e9446b0a2e4f760cdb3fa4b2c48cdc6db8766a845c54b6ff063fd2e9" "checksum bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c129aff112dcc562970abb69e2508b40850dd24c274761bb50fb8a0067ba6c27" "checksum bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7dd32989a66957d3f0cba6588f15d4281a733f4e9ffc43fcd2385f57d3bf99ff" +"checksum cargo_metadata 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "682476b87b3e22cd3820d86b26cd8603cd84ab76dce7547b2631858347aa8967" "checksum cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "49ec142f5768efb5b7622aebc3fdbdbb8950a4b9ba996393cb76ef7466e8747d" "checksum cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "405216fd8fe65f718daa7102ea808a946b6ce40c742998fbfd3463645552de18" "checksum chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6962c635d530328acc53ac6a955e83093fedc91c5809dfac1fa60fa470830a37" "checksum clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0f16b89cbb9ee36d87483dc939fe9f1e13c05898d56d7b230a0d4dff033a536" "checksum cmake 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "95470235c31c726d72bf2e1f421adc1e65b9d561bf5529612cbe1a72da1467b3" "checksum color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbbb57365263e881e805dc77d94697c9118fd94d8da011240555aa7b23445bd" +"checksum cookie 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "746858cae4eae40fff37e1998320068df317bc247dc91a67c6cfa053afdc2abb" +"checksum crossbeam-channel 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "862becd07e73da5746de6d9b3ba055c9bb8b10afd0d2b51155a6e30d81cd20b3" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" +"checksum crossbeam-deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fe8153ef04a7594ded05b427ffad46ddeaf22e63fd48d42b3e1e3bb4db07cae7" "checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150" +"checksum crossbeam-epoch 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2af0e75710d6181e234c8ecc79f14a97907850a541b13b0be1dd10992f2e4620" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" +"checksum crossbeam-utils 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d636a8b3bcc1b409d7ffd3facef8f21dcb4009626adbd0c5e6c4305c07253c7b" "checksum ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "630391922b1b893692c6334369ff528dcc3a9d8061ccf4c803aa8f83cb13db5e" +"checksum dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97590ba53bcb8ac28279161ca943a924d1fd4a8fb3fa63302591647c4fc5b850" "checksum deflate 0.7.18 (registry+https://github.com/rust-lang/crates.io-index)" = "32c8120d981901a9970a3a1c97cf8b630e0fa8c3ca31e75b6fd6fd5f9f427b31" "checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab" "checksum duct 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "166298c17c5b4fe5997b962c2f22e887c7c5adc44308eb9103ce5b66af45a423" "checksum either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be565ca5c557d7f59e7cfcf1844f9e3033650c929c6566f511e8005f205c1d0" "checksum elasticlunr-rs 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4837d77a1e157489a3933b743fd774ae75074e0e390b2b7f071530048a0d87ee" +"checksum encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" +"checksum encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" +"checksum encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" +"checksum encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" +"checksum encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" +"checksum encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" +"checksum encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" +"checksum error-chain 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faa976b4fd2e4c2b2f3f486874b19e61944d3de3de8b61c9fcf835d583871bcc" "checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3" +"checksum error-chain 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6930e04918388a9a2e41d518c25cf679ccafe26733fb4127dbf21993f2575d46" +"checksum failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934799b6c1de475a012a02dab0ace1ace43789ee4b99bcfbf1a2e3e8ced5de82" +"checksum failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c7cdda555bb90c9bb67a3b670a0f42de8e73f5981524123ad8578aafec8ddb8b" "checksum filetime 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "714653f3e34871534de23771ac7b26e999651a0a228f47beb324dfdf1dd4b10f" "checksum flate2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9fac2277e84e5e858483756647a9d0aa8d9a2b7cba517fd84325a0aaa69a0909" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" @@ -1952,31 +2636,40 @@ dependencies = [ "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum futf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b" +"checksum futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "1a70b146671de62ec8c8ed572219ca5d594d9b06c0b364d5e67b722fc559b48c" +"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" "checksum getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "b900c08c1939860ce8b54dc6a89e26e00c04c380fd0e09796799bd7f12861e05" "checksum gif 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff3414b424657317e708489d2857d9575f4403698428b040b609b9d1c1a84a2c" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "checksum globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "142754da2c9b3722affd909f9e27f2a6700a7a303f362971e0a74c652005a43d" +"checksum h2 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "6229ac66d3392dd83288fe04defd4b353354b15bbe07820d53dda063a736afcc" +"checksum hostname 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "21ceb46a83a85e824ef93669c8b390009623863b5c195d1ba747292c0c72f94e" "checksum html5ever 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b04478cf718862650a0bf66acaf8f2f8c906fbc703f35c916c1f4211b069a364" +"checksum http 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "4fbced8864b04c030eebcb7d0dc3a81ba5231ac559f5116a29a8ba83ecee22cd" +"checksum http-range 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f2e4003e6fd05ea9109db00415e670b11f511a42e567ff2d5d771cbdfa24e02" "checksum httparse 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23801d98b42eed0318e5709b0527894ba7c3793d0236814618d6a9b6224152ff" "checksum humansize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6cab2627acfc432780848602f3f558f7e9dd427352224b0d9324025796d2a5e" -"checksum hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)" = "368cb56b2740ebf4230520e2b90ebb0461e69034d85d1945febd9b3971426db2" "checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d" "checksum image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebdff791af04e30089bde8ad2a632b86af433b40c04db8d70ad4b21487db7a6a" +"checksum indexmap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08173ba1e906efb6538785a8844dd496f5d34f0a2d88038e95195172fc667220" "checksum inflate 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4ec18d981200fd14e65ee8e35fb60ed1ce55227a02407303f3a72517c6146dcc" "checksum inotify 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887fcc180136e77a85e6a6128579a719027b1bab9b1c38ea4444244fe262c20c" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" -"checksum iron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d8e17268922834707e1c29e8badbf9c712c9c43378e1b6a3388946baff10be2" +"checksum ipconfig 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9ec4e18c0a0d4340870c14284293632d8421f419008371422dd327892b88877c" "checksum itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c069bbec61e1ca5a596166e55dfe4773ff745c3d16b700013bcaff9a6df2c682" "checksum jpeg-decoder 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "c8b7d43206b34b3f94ea9445174bda196e772049b9bddbc620c9d29b2d20110d" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" +"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" "checksum lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e6412c5e2ad9584b0b8e979393122026cdd6d2a80b933f890dcd694ddbe73739" "checksum lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a6f08839bc70ef4a3fe1d566d5350f519c5912ea86be0df1740a7d247c7fc0ef" "checksum libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "b685088df2b950fccadf07a7187c8ef846a959c142338a48f9dc0b94517eb5f1" +"checksum linked-hash-map 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7860ec297f7008ff7a1e3382d7f7e1dcd69efc94751a2284bafc3d013c2aa939" "checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6fddaa003a65722a7fb9e26b0ce95921fe4ba590542ced664d8ce2fa26f9f3ac" +"checksum lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4d06ff7ff06f729ce5f4e227876cb88d10bc59cd4ae1e09fbb2bde15c850dc21" "checksum lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084" "checksum mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" "checksum maplit 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08cbb6b4fef96b6d77bfc40ec491b1690c779e77b05cd9f07f787ed376fd4c43" @@ -1984,15 +2677,14 @@ dependencies = [ "checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376" "checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" -"checksum mime_guess 1.8.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b7e2b09d08313f84e0fb82d13a4d859109a17543fe9af3b6d941dc1431f7de79" +"checksum mime 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0b28683d0b09bbc20be1c9b3f6f24854efb1356ffcffee08ea3f6e65596e85fa" +"checksum mime_guess 2.0.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "130ea3c9c1b65dba905ab5a4d9ac59234a9585c24d135f264e187fe7336febbd" "checksum miniz-sys 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "609ce024854aeb19a0ef7567d348aaa5a746b32fb72e336df7fcc16869d7e2b4" "checksum mio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a637d1ca14eacae06296a008fa7ad955347e34efcb5891cfd8ba05491a37907e" "checksum mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "6d771e3ef92d58a8da8df7d6976bfca9371ed1de6619d9d5a5ce5b1f29b85bfe" +"checksum mio-uds 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "84c7b5caa3a118a6e34dbac36504503b1e8dc5835e833306b9d6af0e05929f79" "checksum miow 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3e690c5df6b2f60acd45d56378981e827ff8295562fc8d34f573deb267a59cd1" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" -"checksum modifier 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "41f5c9112cb662acd3b204077e0de5bc66305fa8df65c8019d5adb10e9ab6e58" -"checksum mount 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e25c06012941aaf8c75f2eaf7ec5c48cf69f9fc489ab3eb3589edc107e386f0b" "checksum net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)" = "9044faf1413a1057267be51b5afba8eb1090bd2231c693664aa1db716fe1eae0" "checksum new_debug_unreachable 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0cdc457076c78ab54d5e0d6fa7c47981757f1e34dc39ff92787f217dede586c4" "checksum nix 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fd5681d13fda646462cfbd4e5f2051279a89a544d50eb98c365b507246839f" @@ -2009,6 +2701,9 @@ dependencies = [ "checksum onig 3.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f5eeb268a4620c74ea5768c6d2ccd492d60a47a8754666b91a46bfc35cd4d1ba" "checksum onig_sys 68.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c6be7c4f985508684e54f18dd37f71e66f3e1ad9318336a520d7e42f0d3ea8e" "checksum os_pipe 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934868c3f86ed7a39ef63d88edeac5bd49a0c843192651900e9ce1178cbbf157" +"checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" +"checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" +"checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0fce5d8b5cc33983fc74f78ad552b5522ab41442c4ca91606e4236eb4b5ceefc" "checksum pest_derive 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "ab94faafeb93f4c5e3ce81ca0e5a779529a602ad5d09ae6d21996bfb8b6a52bf" @@ -2018,17 +2713,18 @@ dependencies = [ "checksum phf_shared 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)" = "c2261d544c2bb6aa3b10022b0be371b9c7c64f762ef28c6f5d4f1ef6d97b5930" "checksum pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "110d5ee3593dbb73f56294327fe5668bcc997897097cbc76b51e7aed3f52452f" "checksum plist 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c61ac2afed2856590ae79d6f358a24b85ece246d2aa134741a66d589519b7503" -"checksum plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1a6a0dc3910bc8db877ffed8e457763b317cf880df4ae19109b9f77d277cf6e0" "checksum png 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f54b9600d584d3b8a739e1662a595fab051329eff43f20e7d8cc22872962145b" "checksum precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" "checksum proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1b06e2f335f48d24442b35a19df506a835fb3547bc3c06ef27340da9acf5cae7" "checksum proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "effdb53b25cdad54f8f48843d67398f7ef2e14f12c1b4cb4effc549a6462a4d6" "checksum pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d6fdf85cda6cadfae5428a54661d431330b312bc767ddbc57adbedc24da66e32" +"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" "checksum quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9949cfe66888ffe1d53e6ec9d9f3b70714083854be20fd5e271b232a017401e8" "checksum quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e44651a0dc4cdd99f71c83b561e221f714912d11af1a4dff0631f923d53af035" "checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" +"checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8" "checksum rayon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed02d09394c94ffbdfdc755ad62a132e94c3224a8354e78a1200ced34df12edf" "checksum rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80e811e76f1dbf68abf87a759083d34600017fc4e10b6bd5ad84a700f9dba4b1" "checksum rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d24ad214285a7729b174ed6d3bcfcb80177807f959d95fafd5bfc5c4f201ac8" @@ -2040,26 +2736,35 @@ dependencies = [ "checksum regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7" "checksum regex-syntax 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05b06a75f5217880fc5e905952a42750bf44787e56a6c6d6852ed0992f5e1d54" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" +"checksum resolv-conf 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c62bd95a41841efdf7fca2ae9951e64a8d8eae7e5da196d8ce489a2241491a92" +"checksum ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f7d28b30a72c01b458428e0ae988d4149c20d902346902be881e3edc4bb325c" "checksum rust-stemmers 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fbf06149ec391025664a5634200ced1afb489f0f3f8a140d515ebc0eb04b4bc0" "checksum rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "76d7ba1feafada44f2d38eed812bd2489a03c0f5abb975799251518b68848649" "checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f" "checksum same-file 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfb6eded0b06a0b512c8ddbcf04089138c9b4362c2f696f3c3d76039d68f3637" "checksum sass-rs 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90f8cf6e645aa843ffffcbdc1e8752b1f221dfa314c81895aeb229a77aea7e05" "checksum sass-sys 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "bae88baa915f59c39820e544cfd9296d815a6b8efc3f276a78a0505866d2b4e9" +"checksum scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "332ffa32bf586782a3efaeb58f127980944bbc8c4d6913a86107ac2a5ab24b28" "checksum scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" -"checksum sequence_trie 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "32157204e5c9d3c04007bd7e56e96e987635ce0e8e23c085b1e403861b76c351" +"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)" = "e9a2d9a9ac5120e0f768801ca2b58ad6eec929dc9d1d616c162f208869c2ce95" "checksum serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)" = "0a90213fa7e0f5eac3f7afe2d5ff6b088af515052cc7303bd68c7e3b91a3fb79" "checksum serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)" = "84b8035cabe9b35878adec8ac5fe03d5f6bc97ff6edd7ccb96b44c1276ba390e" +"checksum serde_urlencoded 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e703cef904312097cfceab9ce131ff6bbe09e8c964a0703345a5f49238757bc1" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum shared_child 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bcd5e483b3475af9bc2a35311c2f3bbf0bd98fde91410ab15a0d4ba3c3127b4e" "checksum siphasher 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0df90a788073e8d0235a67e50441d47db7c8ad9debd91cbf43736a2a92d36537" +"checksum skeptic 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c4474d6da9593171bcb086890fc344a3a12783cb24e5b141f8a5d0e43561f4b6" "checksum slab 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d807fd58c4181bbabed77cb3b891ba9748241a552bcc5be698faaebefc54f46e" "checksum slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b4fcaed89ab08ef143da37bc52adbcc04d4a69014f4c1208d6b51f0c47bc23" "checksum slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fdeff4cd9ecff59ec7e3744cbca73dfe5ac35c2aedb2cfba8a1c715a18912e9d" "checksum slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "797bcb4d24e91239a8615415814f4afb2d8ca400c472de3c73f803a5a7689e11" -"checksum staticfile 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "babd3fa68bb7e3994ce181c5f21ff3ff5fffef7b18b8a10163b45e4dafc6fb86" +"checksum smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "312a7df010092e73d6bbaf141957e868d4f30efd2bfd9bb1028ad91abec58514" +"checksum socket2 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "06dc9f86ee48652b7c80f3d254e3b9accb67a928c562c64d10d7b016d3d98dab" +"checksum stable_deref_trait 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ffbc596e092fe5f598b12ef46cc03754085ac2f4d8c739ad61c4ae266cc3b3fa" +"checksum string 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "31f98b200e7caca9efca50fc0aa69cd58a5ec81d5f6e75b2f3ecaad2e998972a" "checksum string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25d70109977172b127fe834e5449e5ab1740b9ba49fa18a2020f509174f25423" "checksum string_cache_codegen 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "35293b05cf1494e8ddd042a7df6756bf18d07f42d234f32e71dce8a7aabb0191" "checksum string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc" @@ -2070,7 +2775,9 @@ dependencies = [ "checksum syn 0.13.11 (registry+https://github.com/rust-lang/crates.io-index)" = "14f9bf6292f3a61d2c716723fdb789a41bbe104168e6f496dc6497e531ea1b9b" "checksum syn 0.14.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c67da57e61ebc7b7b6fff56bb34440ca3a83db037320b0507af4c10368deda7d" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" +"checksum synstructure 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a761d12e6d8dcb4dcf952a7a89b475e3a9d69e4a69307e01a470977642914bd" "checksum syntect 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc8a6f0db88d4afc340522c20d260411e746b2225b257c6b238a75de9d7cec78" +"checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" "checksum tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "47776f63b85777d984a50ce49d6b9e58826b6a3766a449fc95bc66cd5663c15b" "checksum tendril 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9de21546595a0873061940d994bbbc5c35f024ae4fd61ec5c5b159115684f508" "checksum tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)" = "fc0624177c585227fee0c5021bd6be3a1acf66bdb6f412acb92373637aad728b" @@ -2080,13 +2787,25 @@ dependencies = [ "checksum textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0b59b6b4b44d867f1370ef1bd91bfb262bf07bf0ae65c202ea2fbc16153b693" "checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963" "checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b" +"checksum tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8ee337e5f4e501fc32966fec6fe0ca0cc1c237b0b1b14a335f8bfe3c5f06e286" +"checksum tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "881e9645b81c2ce95fcb799ded2c29ffb9f25ef5bef909089a420e5961dd8ccb" +"checksum tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "aeeffbbb94209023feaef3c196a41cbcdafa06b4a6f893f68779bb5e53796f71" +"checksum tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8cac2a7883ff3567e9d66bb09100d09b33d90311feca0206c7ca034bc0c55113" +"checksum tokio-fs 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fc42bae2f6e33865b99069d95bcddfc85c9f0849b4e7e7399eeee71956ef34d7" +"checksum tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a5c9635ee806f26d302b8baa1e145689a280d8f5aa8d0552e7344808da54cc21" +"checksum tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e00ec63bbec2c97ce1178cb0587b2c438b2f6b09d3ee54a33c45a9cf0d530810" +"checksum tokio-signal 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e8f46863230f9a05cf52d173721ec391b9c5782a2465f593029922b8782b9ffe" +"checksum tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ec9b094851aadd2caf83ba3ad8e8c4ce65a42104f7b94d9e6550023f0407853f" +"checksum tokio-threadpool 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c3873a6d8d0b636e024e77b9a82eaab6739578a06189ecd0e731c7308fbc5d" +"checksum tokio-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "028b94314065b90f026a21826cffd62a4e40a92cda3e5c069cc7b02e5945f5e9" +"checksum tokio-udp 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "43eb534af6e8f37d43ab1b612660df14755c42bd003c5f8d2475ee78cc4600c0" "checksum toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a0263c6c02c4db6c8f7681f9fd35e90de799ebd4cfdeab77a38f4ff6b3d8c0d9" -"checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" +"checksum trust-dns-proto 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cbbddb93547eeee847367d8f59b68002294a7b4df31c143fbee4109ce0c61a04" +"checksum trust-dns-resolver 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9b0a0c9d4f8dd56481209c5ae1a8965ed022461d352c81fb92466ec9d846929e" "checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" -"checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" -"checksum typemap 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "653be63c80a3296da5551e1bfd2cca35227e13cdd08c6668903ae2f4f77aa1f6" "checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" +"checksum unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284b6d3db520d67fbe88fd778c21510d1b0ba4a551e5d0fbb023d33405f6de8a" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" "checksum unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6a0180bc61fc5a987082bfa111f4cc95c4caff7f9799f3e46df09163a937aa25" "checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1" @@ -2095,19 +2814,23 @@ dependencies = [ "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unidecode 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "402bb19d8e03f1d1a7450e2bd613980869438e0666331be3e073089124aa1adc" "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -"checksum unsafe-any 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f30360d7979f5e9c6e6cea48af192ea8fab4afb3cf72597154b8f08935bc9c7f" +"checksum untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f392d7819dbe58833e26872f5f6f0d68b7bbbe90fc3667e98731c4a15ad9a7ae" "checksum url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f808aadd8cfec6ef90e4a14eb46f24511824d1ac596b9682703c87056c8678b7" "checksum utf-8 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f1262dfab4c30d5cb7c07026be00ee343a6cf5027fdc0104a9160f354e5db75c" "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" +"checksum uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e1436e58182935dcd9ce0add9ea0b558e8a87befe01c1a301e6020aeb0876363" "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" "checksum version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6b772017e347561807c1aa192438c5fd74242a670a6cffacc40f2defd1dc069d" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "63636bd0eb3d00ccb8b9036381b526efac53caf112b7783b730ab3f8e44da369" +"checksum widestring 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7157704c2e12e3d2189c507b7482c52820a16dfa4465ba91add92f266667cadb" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "773ef9dcc5f24b7d850d0ff101e542ff24c3b090a9768e03ff889fdef41f00fd" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +"checksum winreg 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a27a759395c1195c4cc5cda607ef6f8f6498f64e78f7900f5de0a127a424704a" +"checksum winutil 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7daf138b6b14196e3830a588acf1e86966c694d3e8fb026fb105b8b5dca07e6e" "checksum ws 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ccf752fee5350ca505fdb0b34d503b17d1528bd867561b7aa91d6ea750d5e972" "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" "checksum xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c1cb601d29fe2c2ac60a2b2e5e293994d87a1f6fa9687a31a15270f909be9c2" diff --git a/Cargo.toml b/Cargo.toml index bed693a3..ddde2cdd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,9 +24,8 @@ term-painter = "0.2" # Used in init to ensure the url given as base_url is a valid one url = "1.5" # Below is for the serve cmd -staticfile = "0.5" -iron = "0.6" -mount = "0.4" +actix = "0.5" +actix-web = "0.6" notify = "4" ws = "0.7" ctrlc = "3" diff --git a/src/cmd/serve.rs b/src/cmd/serve.rs index 8504ccbd..e7d4829a 100644 --- a/src/cmd/serve.rs +++ b/src/cmd/serve.rs @@ -23,15 +23,15 @@ use std::env; use std::fs::remove_dir_all; -use std::path::Path; +use std::io; +use std::path::{Path, PathBuf}; use std::sync::mpsc::channel; use std::time::{Instant, Duration}; use std::thread; use chrono::prelude::*; -use iron::{Iron, Request, IronResult, Response, status}; -use mount::Mount; -use staticfile::Static; +use actix; +use actix_web::{fs, server, App, HttpRequest, HttpResponse, Responder}; use notify::{Watcher, RecursiveMode, watcher}; use ws::{WebSocket, Sender, Message}; use ctrlc; @@ -59,8 +59,8 @@ enum ChangeKind { const LIVE_RELOAD: &'static str = include_str!("livereload.js"); -fn livereload_handler(_: &mut Request) -> IronResult { - Ok(Response::with((status::Ok, LIVE_RELOAD.to_string()))) +fn livereload_handler(_: HttpRequest) -> &'static str { + LIVE_RELOAD } fn rebuild_done_handling(broadcaster: &Sender, res: Result<()>, reload_path: &str) { @@ -102,6 +102,24 @@ fn create_new_site(interface: &str, port: &str, output_dir: &str, base_url: &str Ok((site, address)) } +/// Attempt to render `index.html` when a directory is requested. +/// +/// The default "batteries included" mechanisms for actix to handle directory +/// listings rely on redirection which behaves oddly (the location headers +/// seem to use relative paths for some reason). +/// They also mean that the address in the browser will include the +/// `index.html` on a successful redirect (rare), which is unsightly. +/// +/// Rather than deal with all of that, we can hijack a hook for presenting a +/// custom directory listing response and serve it up using their +/// `NamedFile` responder. +fn handle_directory<'a, 'b>(dir: &'a fs::Directory, req: &'b HttpRequest) -> io::Result { + let mut path = PathBuf::from(&dir.base); + path.push(&dir.path); + path.push("index.html"); + Ok(fs::NamedFile::open(path).respond_to(req).unwrap()) +} + pub fn serve(interface: &str, port: &str, output_dir: &str, base_url: &str, config_file: &str) -> Result<()> { let start = Instant::now(); let (mut site, address) = create_new_site(interface, port, output_dir, base_url, config_file)?; @@ -128,15 +146,28 @@ pub fn serve(interface: &str, port: &str, output_dir: &str, base_url: &str, conf let _ = watcher.watch("sass/", RecursiveMode::Recursive); let ws_address = format!("{}:{}", interface, site.live_reload.unwrap()); + let output_path = Path::new(output_dir).to_path_buf(); - // Start a webserver that serves the `output_dir` directory - let mut mount = Mount::new(); - mount.mount("/", Static::new(Path::new(output_dir))); - mount.mount("/livereload.js", livereload_handler); - // Starts with a _ to not trigger the unused lint - // we need to assign to a variable otherwise it will block - let _iron = Iron::new(mount).http(address.as_str()) - .chain_err(|| "Can't start the webserver")?; + // output path is going to need to be moved later on, so clone it for the + // http closure to avoid contention. + let static_root = output_path.clone(); + thread::spawn(move || { + let sys = actix::System::new("http-server"); + server::new(move || { + App::new() + .resource(r"/livereload.js", |r| r.f(livereload_handler)) + // Start a webserver that serves the `output_dir` directory + .handler(r"/", fs::StaticFiles::new(&static_root) + .show_files_listing() + .files_listing_renderer(handle_directory)) + }) + .bind(&address) + .expect("Can't start the webserver") + .shutdown_timeout(20) + .start(); + println!("Web server is available at http://{}", &address); + let _ = sys.run(); + }); // The websocket for livereload let ws_server = WebSocket::new(|output: Sender| { @@ -169,10 +200,9 @@ pub fn serve(interface: &str, port: &str, output_dir: &str, base_url: &str, conf } println!("Listening for changes in {}/{{{}}}", pwd, watchers.join(", ")); - println!("Web server is available at http://{}", address); + println!("Press Ctrl+C to stop\n"); // Delete the output folder on ctrl+C - let output_path = Path::new(output_dir).to_path_buf(); ctrlc::set_handler(move || { remove_dir_all(&output_path).expect("Failed to delete output directory"); ::std::process::exit(0); diff --git a/src/main.rs b/src/main.rs index 2c2ea23f..808d4d71 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,10 @@ +extern crate actix; +extern crate actix_web; #[macro_use] extern crate clap; extern crate chrono; -extern crate term_painter; -extern crate staticfile; -extern crate iron; -extern crate mount; extern crate notify; +extern crate term_painter; extern crate url; extern crate ws; extern crate ctrlc; From 45156c46c902576846c56cdf0b7b45573f4d1bce Mon Sep 17 00:00:00 2001 From: Owen Nelson Date: Tue, 29 May 2018 10:42:53 -0700 Subject: [PATCH 29/74] map `actix_web::error::Error` to `std::io::Error` as string. Conversion is by way of the `Display` trait impl since the actix errors all seem to be more concerned with converting to/from http responses rather than standard errors. --- src/cmd/serve.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/cmd/serve.rs b/src/cmd/serve.rs index e7d4829a..36f1eaa5 100644 --- a/src/cmd/serve.rs +++ b/src/cmd/serve.rs @@ -117,7 +117,12 @@ fn handle_directory<'a, 'b>(dir: &'a fs::Directory, req: &'b HttpRequest) -> io: let mut path = PathBuf::from(&dir.base); path.push(&dir.path); path.push("index.html"); - Ok(fs::NamedFile::open(path).respond_to(req).unwrap()) + fs::NamedFile::open(path) + .respond_to(req) + // Didn't see a clear path from + // `actix_web::error::Error` to `std::error::Error` + // so being "cheap" and just leveraging the Display impl to wrap it. + .map_err(|e| io::Error::new(io::ErrorKind::Other, format!("{}", e))) } pub fn serve(interface: &str, port: &str, output_dir: &str, base_url: &str, config_file: &str) -> Result<()> { From 0e0cd244f32bd30c6b7a377d0fb29cf8c024c7fa Mon Sep 17 00:00:00 2001 From: Owen Nelson Date: Thu, 31 May 2018 11:39:43 -0700 Subject: [PATCH 30/74] Fix error handling put in place to side-step a confusing compiler error. I filed actix/actix-web#261 as per the maintaner's request while working on #310. Having looked at the issue this morning, it appeared there was an implementation to convert `io::Result` into a `Responder`, which kicked in when I tried to access the `respond_to()` method without getting the inner type from that first result before hand. --- src/cmd/serve.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/cmd/serve.rs b/src/cmd/serve.rs index 36f1eaa5..db50a050 100644 --- a/src/cmd/serve.rs +++ b/src/cmd/serve.rs @@ -117,12 +117,7 @@ fn handle_directory<'a, 'b>(dir: &'a fs::Directory, req: &'b HttpRequest) -> io: let mut path = PathBuf::from(&dir.base); path.push(&dir.path); path.push("index.html"); - fs::NamedFile::open(path) - .respond_to(req) - // Didn't see a clear path from - // `actix_web::error::Error` to `std::error::Error` - // so being "cheap" and just leveraging the Display impl to wrap it. - .map_err(|e| io::Error::new(io::ErrorKind::Other, format!("{}", e))) + fs::NamedFile::open(path)?.respond_to(req) } pub fn serve(interface: &str, port: &str, output_dir: &str, base_url: &str, config_file: &str) -> Result<()> { From ffcc455ed589532e3d02f30719ea2f3f7a31638a Mon Sep 17 00:00:00 2001 From: Unreal Hoang Date: Sun, 3 Jun 2018 03:25:28 +0900 Subject: [PATCH 31/74] Fix panicking handling file without extension --- src/cmd/serve.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/serve.rs b/src/cmd/serve.rs index db50a050..3af83d30 100644 --- a/src/cmd/serve.rs +++ b/src/cmd/serve.rs @@ -283,7 +283,7 @@ fn is_temp_file(path: &Path) -> bool { } }, None => { - path.ends_with(".DS_STORE") + true }, } } From 42939b9a66cee5c6f18a367ce9b6301898a25a97 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Wed, 20 Jun 2018 17:43:24 +0200 Subject: [PATCH 32/74] Fix error and cargo update --- CHANGELOG.md | 1 + Cargo.lock | 128 ++++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 2 +- src/cmd/serve.rs | 3 +- 4 files changed, 131 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb50842d..4cc641b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ - Words are now counted using unicode rather than whitespaces - Aliases can now be pointing directly to specific HTML files - Add `year`, `month` and `day` variables to pages with a date +- Fix panic when live reloading a change on a file without extensions ## 0.3.4 (2018-06-22) diff --git a/Cargo.lock b/Cargo.lock index cdb8493e..f8b96138 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,6 +20,33 @@ dependencies = [ "uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "actix" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "actix_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-channel 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-signal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-resolver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "actix-web" version = "0.6.14" @@ -375,6 +402,18 @@ dependencies = [ "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-channel" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-epoch 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-deque" version = "0.2.0" @@ -436,6 +475,11 @@ dependencies = [ "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-utils" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "ctrlc" version = "3.1.1" @@ -747,7 +791,7 @@ dependencies = [ name = "gutenberg" version = "0.4.0" dependencies = [ - "actix 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", + "actix 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "actix-web 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -978,6 +1022,15 @@ name = "linked-hash-map" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "lock_api" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.3.9" @@ -1330,6 +1383,15 @@ dependencies = [ "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.2.14" @@ -2240,6 +2302,21 @@ dependencies = [ "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-signal" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "mio-uds 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio-tcp" version = "0.1.0" @@ -2314,6 +2391,29 @@ dependencies = [ "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "trust-dns-proto" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "socket2 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-udp 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "trust-dns-resolver" version = "0.8.2" @@ -2330,6 +2430,24 @@ dependencies = [ "trust-dns-proto 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "trust-dns-resolver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "ipconfig 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "resolv-conf 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-proto 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "twox-hash" version = "1.1.0" @@ -2568,6 +2686,7 @@ dependencies = [ [metadata] "checksum actix 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7f0b2daad36916ccd2b162dbc5a04a74df642a29391b1a341c8ee3e82026cb16" +"checksum actix 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b11a1e86e1efd2331b360e8301436d9ef647b3a7c1252ae5e41695f2756e87a4" "checksum actix-web 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "e35bb192338dc7726564b0bdf2d49d43cbf4c7845231a82527f5f302bdb8f477" "checksum actix_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4b1dc922654b9aca7a8a31eab875fde804fa9fbd67f220f2e457787b23590f2" "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" @@ -2602,12 +2721,14 @@ dependencies = [ "checksum color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbbb57365263e881e805dc77d94697c9118fd94d8da011240555aa7b23445bd" "checksum cookie 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "746858cae4eae40fff37e1998320068df317bc247dc91a67c6cfa053afdc2abb" "checksum crossbeam-channel 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "862becd07e73da5746de6d9b3ba055c9bb8b10afd0d2b51155a6e30d81cd20b3" +"checksum crossbeam-channel 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b45c6ba620feae538943c106977c6348c16ad3b03dd8aaecd25a4224345fa795" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" "checksum crossbeam-deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fe8153ef04a7594ded05b427ffad46ddeaf22e63fd48d42b3e1e3bb4db07cae7" "checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150" "checksum crossbeam-epoch 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2af0e75710d6181e234c8ecc79f14a97907850a541b13b0be1dd10992f2e4620" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crossbeam-utils 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d636a8b3bcc1b409d7ffd3facef8f21dcb4009626adbd0c5e6c4305c07253c7b" +"checksum crossbeam-utils 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b71f220442ed14749909b543d4dd7ec3918cb1fe289fd96e88d0abe6ca049783" "checksum ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "630391922b1b893692c6334369ff528dcc3a9d8061ccf4c803aa8f83cb13db5e" "checksum dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97590ba53bcb8ac28279161ca943a924d1fd4a8fb3fa63302591647c4fc5b850" "checksum deflate 0.7.18 (registry+https://github.com/rust-lang/crates.io-index)" = "32c8120d981901a9970a3a1c97cf8b630e0fa8c3ca31e75b6fd6fd5f9f427b31" @@ -2667,6 +2788,7 @@ dependencies = [ "checksum libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "b685088df2b950fccadf07a7187c8ef846a959c142338a48f9dc0b94517eb5f1" "checksum linked-hash-map 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7860ec297f7008ff7a1e3382d7f7e1dcd69efc94751a2284bafc3d013c2aa939" "checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e" +"checksum lock_api 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "949826a5ccf18c1b3a7c3d57692778d21768b79e46eb9dd07bfc4c2160036c54" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6fddaa003a65722a7fb9e26b0ce95921fe4ba590542ced664d8ce2fa26f9f3ac" "checksum lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4d06ff7ff06f729ce5f4e227876cb88d10bc59cd4ae1e09fbb2bde15c850dc21" @@ -2703,6 +2825,7 @@ dependencies = [ "checksum os_pipe 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934868c3f86ed7a39ef63d88edeac5bd49a0c843192651900e9ce1178cbbf157" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" +"checksum parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "901d6514273469bb17380c1ac3f51fb3ce54be1f960e51a6f04901eba313ab8d" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0fce5d8b5cc33983fc74f78ad552b5522ab41442c4ca91606e4236eb4b5ceefc" @@ -2795,13 +2918,16 @@ dependencies = [ "checksum tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a5c9635ee806f26d302b8baa1e145689a280d8f5aa8d0552e7344808da54cc21" "checksum tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e00ec63bbec2c97ce1178cb0587b2c438b2f6b09d3ee54a33c45a9cf0d530810" "checksum tokio-signal 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e8f46863230f9a05cf52d173721ec391b9c5782a2465f593029922b8782b9ffe" +"checksum tokio-signal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "342d088c63623f63eada591e065778038c63b516939530db2aa09a8df9118507" "checksum tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ec9b094851aadd2caf83ba3ad8e8c4ce65a42104f7b94d9e6550023f0407853f" "checksum tokio-threadpool 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c3873a6d8d0b636e024e77b9a82eaab6739578a06189ecd0e731c7308fbc5d" "checksum tokio-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "028b94314065b90f026a21826cffd62a4e40a92cda3e5c069cc7b02e5945f5e9" "checksum tokio-udp 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "43eb534af6e8f37d43ab1b612660df14755c42bd003c5f8d2475ee78cc4600c0" "checksum toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a0263c6c02c4db6c8f7681f9fd35e90de799ebd4cfdeab77a38f4ff6b3d8c0d9" "checksum trust-dns-proto 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cbbddb93547eeee847367d8f59b68002294a7b4df31c143fbee4109ce0c61a04" +"checksum trust-dns-proto 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "32d7c204ee231f802aa821f9dc2195aa0d0269ef7e9f8c844208565c9e3981e4" "checksum trust-dns-resolver 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9b0a0c9d4f8dd56481209c5ae1a8965ed022461d352c81fb92466ec9d846929e" +"checksum trust-dns-resolver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "28b094ad60c4f51f36a493201d04d6605183c62bd5f0c73008a732f23950c156" "checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" "checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" diff --git a/Cargo.toml b/Cargo.toml index ddde2cdd..1ea45e0d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,7 @@ term-painter = "0.2" # Used in init to ensure the url given as base_url is a valid one url = "1.5" # Below is for the serve cmd -actix = "0.5" +actix = "0.6" actix-web = "0.6" notify = "4" ws = "0.7" diff --git a/src/cmd/serve.rs b/src/cmd/serve.rs index 3af83d30..1ae7a01c 100644 --- a/src/cmd/serve.rs +++ b/src/cmd/serve.rs @@ -293,7 +293,8 @@ fn is_temp_file(path: &Path) -> bool { fn detect_change_kind(pwd: &str, path: &Path) -> (ChangeKind, String) { let path_str = format!("{}", path.display()) .replace(pwd, "") - .replace("\\", "/"); + .replace("\\", ""); + let change_kind = if path_str.starts_with("/templates") { ChangeKind::Templates } else if path_str.starts_with("/content") { From a89768dab047970c4ceb52a4e1685445cedaf440 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Sat, 23 Jun 2018 16:38:53 +0200 Subject: [PATCH 33/74] Remove page.images --- Cargo.lock | 3 +-- components/content/Cargo.toml | 1 - components/content/src/lib.rs | 1 - components/content/src/page.rs | 26 ++++++++------------------ components/imageproc/Cargo.toml | 2 +- components/imageproc/src/lib.rs | 2 +- docs/templates/shortcodes/gallery.html | 12 +++++++----- 7 files changed, 18 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f8b96138..010ee914 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -370,7 +370,6 @@ dependencies = [ "errors 0.1.0", "front_matter 0.1.0", "globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "imageproc 0.1.0", "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "rendering 0.1.0", "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", @@ -916,7 +915,7 @@ dependencies = [ "image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", "twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", diff --git a/components/content/Cargo.toml b/components/content/Cargo.toml index e9138738..ca8cffed 100644 --- a/components/content/Cargo.toml +++ b/components/content/Cargo.toml @@ -15,7 +15,6 @@ config = { path = "../config" } utils = { path = "../utils" } rendering = { path = "../rendering" } front_matter = { path = "../front_matter" } -imageproc = { path = "../imageproc" } [dev-dependencies] tempfile = "3" diff --git a/components/content/src/lib.rs b/components/content/src/lib.rs index 4cd93fac..5d111c4e 100644 --- a/components/content/src/lib.rs +++ b/components/content/src/lib.rs @@ -8,7 +8,6 @@ extern crate errors; extern crate config; extern crate front_matter; extern crate rendering; -extern crate imageproc; extern crate utils; #[cfg(test)] diff --git a/components/content/src/page.rs b/components/content/src/page.rs index 704b0682..b77a6dbe 100644 --- a/components/content/src/page.rs +++ b/components/content/src/page.rs @@ -15,7 +15,6 @@ use utils::site::get_reading_analytics; use utils::templates::render_template; use front_matter::{PageFrontMatter, InsertAnchor, split_page_content}; use rendering::{RenderContext, Header, render_content}; -use imageproc; use file_info::FileInfo; @@ -207,21 +206,13 @@ impl Page { .chain_err(|| format!("Failed to render page '{}'", self.file.path.display())) } - /// Creates two vectors of asset URLs. The first one contains all asset files, - /// the second one that which appear to be an image file. - fn serialize_assets(&self) -> (Vec, Vec) { - let mut assets = vec![]; - let mut images = vec![]; - for asset in self.assets.iter() { - if let Some(filename) = asset.file_name().and_then(|f| f.to_str()) { - let url = self.path.clone() + filename; - if imageproc::file_is_img(&asset) { - images.push(url.clone()); - } - assets.push(url); - } - } - (assets, images) + /// Creates a vectors of asset URLs. + fn serialize_assets(&self) -> Vec { + self.assets.iter() + .filter_map(|asset| asset.file_name()) + .filter_map(|filename| filename.to_str()) + .map(|filename| self.path.clone() + filename) + .collect() } } @@ -277,9 +268,8 @@ impl ser::Serialize for Page { state.serialize_field("next", &self.next)?; state.serialize_field("toc", &self.toc)?; state.serialize_field("draft", &self.is_draft())?; - let (assets, images) = self.serialize_assets(); + let assets = self.serialize_assets(); state.serialize_field("assets", &assets)?; - state.serialize_field("images", &images)?; state.end() } } diff --git a/components/imageproc/Cargo.toml b/components/imageproc/Cargo.toml index 647873fb..7a85f1c7 100644 --- a/components/imageproc/Cargo.toml +++ b/components/imageproc/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Vojtěch Král "] [dependencies] lazy_static = "1" -regex = "0.2" +regex = "1.0" tera = "0.11.0" image = "0.19.0" rayon = "0.9" diff --git a/components/imageproc/src/lib.rs b/components/imageproc/src/lib.rs index fde98af8..810ebb3b 100644 --- a/components/imageproc/src/lib.rs +++ b/components/imageproc/src/lib.rs @@ -213,7 +213,7 @@ pub struct Processor { resized_path: PathBuf, resized_url: String, /// A map of a ImageOps by their stored hash. - /// Note that this cannot be a HashSet, because hashest handles collisions and we don't want that, + /// Note that this cannot be a HashSet, because hashset handles collisions and we don't want that, /// we need to be aware of and handle collisions ourselves. img_ops: HashMap, /// Hash collisions go here: diff --git a/docs/templates/shortcodes/gallery.html b/docs/templates/shortcodes/gallery.html index fa1c84b6..d2afc716 100644 --- a/docs/templates/shortcodes/gallery.html +++ b/docs/templates/shortcodes/gallery.html @@ -1,6 +1,8 @@ -{% for img in page.images %} - - - -   +{% for asset in page.assets %} + {% if asset is ending_with(".jpg") %} + + + +   + {% endif %} {% endfor %} From 3e4aa82ecc792a2026570172e1a1b232f5f86162 Mon Sep 17 00:00:00 2001 From: Vojtech Kral Date: Sat, 23 Jun 2018 16:48:37 +0200 Subject: [PATCH 34/74] imageproc: Use DefaultHasher from stdlib instead of twox-hash --- Cargo.lock | 10 ---------- components/imageproc/Cargo.toml | 1 - components/imageproc/src/lib.rs | 5 ++--- .../_resized_images/09c08ee3f954d0c100.jpg | Bin 0 -> 9792 bytes .../_resized_images/28c11b70e6d31a8400.jpg | Bin 0 -> 4615 bytes .../_resized_images/2e13805bc51b68e800.jpg | Bin 15042 -> 0 bytes .../_resized_images/2fa5b43d38d9f5a600.jpg | Bin 12953 -> 0 bytes .../_resized_images/42758a649ef513b600.jpg | Bin 0 -> 10624 bytes .../_resized_images/4df81a7c614e5cc000.jpg | Bin 0 -> 4495 bytes .../_resized_images/5a8ef01aac8b5c8700.jpg | Bin 4854 -> 0 bytes .../_resized_images/6320cb783d4be30e00.jpg | Bin 0 -> 4495 bytes .../_resized_images/6e0991f475d665df00.jpg | Bin 0 -> 5522 bytes .../_resized_images/72d0be8c5e35e50f00.jpg | Bin 0 -> 15710 bytes .../_resized_images/78e4b442f0b0cbf700.jpg | Bin 0 -> 5654 bytes .../_resized_images/792676f9505fb47700.jpg | Bin 0 -> 12050 bytes .../_resized_images/8b0ae741aed115a800.jpg | Bin 5660 -> 0 bytes .../_resized_images/b12c7fc72d2815e700.jpg | Bin 0 -> 3470 bytes .../_resized_images/b2435b04c4bd3cb400.jpg | Bin 3900 -> 0 bytes .../_resized_images/b9a9fe3b3dee28cc00.jpg | Bin 4854 -> 0 bytes .../_resized_images/ca684a0de40c030c00.jpg | Bin 4508 -> 0 bytes .../_resized_images/e13a85d2c34cbf6900.jpg | Bin 5671 -> 0 bytes .../_resized_images/f1f9e1ab29575d0f00.jpg | Bin 18478 -> 0 bytes .../_resized_images/f969dfdd99d2fe1500.jpg | Bin 8265 -> 0 bytes 23 files changed, 2 insertions(+), 14 deletions(-) create mode 100644 docs/static/_resized_images/09c08ee3f954d0c100.jpg create mode 100644 docs/static/_resized_images/28c11b70e6d31a8400.jpg delete mode 100644 docs/static/_resized_images/2e13805bc51b68e800.jpg delete mode 100644 docs/static/_resized_images/2fa5b43d38d9f5a600.jpg create mode 100644 docs/static/_resized_images/42758a649ef513b600.jpg create mode 100644 docs/static/_resized_images/4df81a7c614e5cc000.jpg delete mode 100644 docs/static/_resized_images/5a8ef01aac8b5c8700.jpg create mode 100644 docs/static/_resized_images/6320cb783d4be30e00.jpg create mode 100644 docs/static/_resized_images/6e0991f475d665df00.jpg create mode 100644 docs/static/_resized_images/72d0be8c5e35e50f00.jpg create mode 100644 docs/static/_resized_images/78e4b442f0b0cbf700.jpg create mode 100644 docs/static/_resized_images/792676f9505fb47700.jpg delete mode 100644 docs/static/_resized_images/8b0ae741aed115a800.jpg create mode 100644 docs/static/_resized_images/b12c7fc72d2815e700.jpg delete mode 100644 docs/static/_resized_images/b2435b04c4bd3cb400.jpg delete mode 100644 docs/static/_resized_images/b9a9fe3b3dee28cc00.jpg delete mode 100644 docs/static/_resized_images/ca684a0de40c030c00.jpg delete mode 100644 docs/static/_resized_images/e13a85d2c34cbf6900.jpg delete mode 100644 docs/static/_resized_images/f1f9e1ab29575d0f00.jpg delete mode 100644 docs/static/_resized_images/f969dfdd99d2fe1500.jpg diff --git a/Cargo.lock b/Cargo.lock index 010ee914..1534c109 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -917,7 +917,6 @@ dependencies = [ "rayon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", - "twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -2447,14 +2446,6 @@ dependencies = [ "trust-dns-proto 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "twox-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "ucd-util" version = "0.1.1" @@ -2927,7 +2918,6 @@ dependencies = [ "checksum trust-dns-proto 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "32d7c204ee231f802aa821f9dc2195aa0d0269ef7e9f8c844208565c9e3981e4" "checksum trust-dns-resolver 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9b0a0c9d4f8dd56481209c5ae1a8965ed022461d352c81fb92466ec9d846929e" "checksum trust-dns-resolver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "28b094ad60c4f51f36a493201d04d6605183c62bd5f0c73008a732f23950c156" -"checksum twox-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "475352206e7a290c5fccc27624a163e8d0d115f7bb60ca18a64fc9ce056d7435" "checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" "checksum unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284b6d3db520d67fbe88fd778c21510d1b0ba4a551e5d0fbb023d33405f6de8a" diff --git a/components/imageproc/Cargo.toml b/components/imageproc/Cargo.toml index 7a85f1c7..f7b32cc8 100644 --- a/components/imageproc/Cargo.toml +++ b/components/imageproc/Cargo.toml @@ -9,7 +9,6 @@ regex = "1.0" tera = "0.11.0" image = "0.19.0" rayon = "0.9" -twox-hash = "1.1" errors = { path = "../errors" } utils = { path = "../utils" } diff --git a/components/imageproc/src/lib.rs b/components/imageproc/src/lib.rs index 810ebb3b..09941e7a 100644 --- a/components/imageproc/src/lib.rs +++ b/components/imageproc/src/lib.rs @@ -3,7 +3,6 @@ extern crate lazy_static; extern crate regex; extern crate image; extern crate rayon; -extern crate twox_hash; extern crate utils; extern crate errors; @@ -12,13 +11,13 @@ use std::path::{Path, PathBuf}; use std::hash::{Hash, Hasher}; use std::collections::HashMap; use std::collections::hash_map::Entry as HEntry; +use std::collections::hash_map::DefaultHasher; use std::fs::{self, File}; use regex::Regex; use image::{GenericImage, FilterType}; use image::jpeg::JPEGEncoder; use rayon::prelude::*; -use twox_hash::XxHash; use utils::fs as ufs; use errors::{Result, ResultExt}; @@ -133,7 +132,7 @@ pub struct ImageOp { impl ImageOp { pub fn new(source: String, op: ResizeOp, quality: u8) -> ImageOp { - let mut hasher = XxHash::with_seed(0); + let mut hasher = DefaultHasher::new(); hasher.write(source.as_ref()); op.hash(&mut hasher); hasher.write_u8(quality); diff --git a/docs/static/_resized_images/09c08ee3f954d0c100.jpg b/docs/static/_resized_images/09c08ee3f954d0c100.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d52d902b7090546c29a821a9f2274908d96e4f48 GIT binary patch literal 9792 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 LqGEEu@x*@sOeK0} literal 0 HcmV?d00001 diff --git a/docs/static/_resized_images/28c11b70e6d31a8400.jpg b/docs/static/_resized_images/28c11b70e6d31a8400.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0096f3ee5d6e4a3305ee396a3354f6d13ffdfecb GIT binary patch literal 4615 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 KmXiiH^Y$Mr4O(6R literal 0 HcmV?d00001 diff --git a/docs/static/_resized_images/2e13805bc51b68e800.jpg b/docs/static/_resized_images/2e13805bc51b68e800.jpg deleted file mode 100644 index aa7f148e23bba459db87c41f25285d1277daadfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15042 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 Y`$TPXJIAokaD2xfE;2K~KHyjX*>i2k4*&oF diff --git a/docs/static/_resized_images/2fa5b43d38d9f5a600.jpg b/docs/static/_resized_images/2fa5b43d38d9f5a600.jpg deleted file mode 100644 index fe24b2ab02320083ece573068bcf8f326999cd77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12953 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 IxA*-&02mSB82|tP literal 0 HcmV?d00001 diff --git a/docs/static/_resized_images/5a8ef01aac8b5c8700.jpg b/docs/static/_resized_images/5a8ef01aac8b5c8700.jpg deleted file mode 100644 index 4d009ddf948877312877b96b460790f306059085..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4854 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 IxA*-&02mSB82|tP literal 0 HcmV?d00001 diff --git a/docs/static/_resized_images/6e0991f475d665df00.jpg b/docs/static/_resized_images/6e0991f475d665df00.jpg new file mode 100644 index 0000000000000000000000000000000000000000..30e1fdbc40bc34b9033c5b84e2432410659aa40b GIT binary patch literal 5522 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 literal 0 HcmV?d00001 diff --git a/docs/static/_resized_images/78e4b442f0b0cbf700.jpg b/docs/static/_resized_images/78e4b442f0b0cbf700.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c7b2e772456d5247cfd90f1246b2f6256562037 GIT binary patch literal 5654 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 I%z8BWA5e%NRR910 literal 0 HcmV?d00001 diff --git a/docs/static/_resized_images/792676f9505fb47700.jpg b/docs/static/_resized_images/792676f9505fb47700.jpg new file mode 100644 index 0000000000000000000000000000000000000000..202a9c2fccdaef38fb405add4995a1ddd9e7e893 GIT binary patch literal 12050 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 literal 0 HcmV?d00001 diff --git a/docs/static/_resized_images/8b0ae741aed115a800.jpg b/docs/static/_resized_images/8b0ae741aed115a800.jpg deleted file mode 100644 index f07aed33b2f2f69d3f2ae9c80f3e12de4a52d9a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5660 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 diff --git a/docs/static/_resized_images/b12c7fc72d2815e700.jpg b/docs/static/_resized_images/b12c7fc72d2815e700.jpg new file mode 100644 index 0000000000000000000000000000000000000000..72cc2c590378d4aa180a893ebc76313a0902ee6a GIT binary patch literal 3470 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 IvTl$6*)$V*EdT%j diff --git a/docs/static/_resized_images/f969dfdd99d2fe1500.jpg b/docs/static/_resized_images/f969dfdd99d2fe1500.jpg deleted file mode 100644 index 89e7b58cc9a8ff4615ce2cbc8701516735af1b78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8265 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 Date: Sun, 24 Jun 2018 22:21:33 +0200 Subject: [PATCH 35/74] imageproc: Rename `_resized_images` as `_processed_images` --- components/imageproc/src/lib.rs | 2 +- .../documentation/content/image-resizing/index.md | 2 +- .../09c08ee3f954d0c100.jpg | Bin .../28c11b70e6d31a8400.jpg | Bin .../42758a649ef513b600.jpg | Bin .../4df81a7c614e5cc000.jpg | Bin .../6320cb783d4be30e00.jpg | Bin .../6e0991f475d665df00.jpg | Bin .../72d0be8c5e35e50f00.jpg | Bin .../78e4b442f0b0cbf700.jpg | Bin .../792676f9505fb47700.jpg | Bin .../b12c7fc72d2815e700.jpg | Bin 12 files changed, 2 insertions(+), 2 deletions(-) rename docs/static/{_resized_images => _processed_images}/09c08ee3f954d0c100.jpg (100%) rename docs/static/{_resized_images => _processed_images}/28c11b70e6d31a8400.jpg (100%) rename docs/static/{_resized_images => _processed_images}/42758a649ef513b600.jpg (100%) rename docs/static/{_resized_images => _processed_images}/4df81a7c614e5cc000.jpg (100%) rename docs/static/{_resized_images => _processed_images}/6320cb783d4be30e00.jpg (100%) rename docs/static/{_resized_images => _processed_images}/6e0991f475d665df00.jpg (100%) rename docs/static/{_resized_images => _processed_images}/72d0be8c5e35e50f00.jpg (100%) rename docs/static/{_resized_images => _processed_images}/78e4b442f0b0cbf700.jpg (100%) rename docs/static/{_resized_images => _processed_images}/792676f9505fb47700.jpg (100%) rename docs/static/{_resized_images => _processed_images}/b12c7fc72d2815e700.jpg (100%) diff --git a/components/imageproc/src/lib.rs b/components/imageproc/src/lib.rs index 09941e7a..9a08c8f1 100644 --- a/components/imageproc/src/lib.rs +++ b/components/imageproc/src/lib.rs @@ -23,7 +23,7 @@ use utils::fs as ufs; use errors::{Result, ResultExt}; -static RESIZED_SUBDIR: &'static str = "_resized_images"; +static RESIZED_SUBDIR: &'static str = "_processed_images"; lazy_static!{ pub static ref RESIZED_FILENAME: Regex = Regex::new(r#"([0-9a-f]{16})([0-9a-f]{2})[.]jpg"#).unwrap(); } diff --git a/docs/content/documentation/content/image-resizing/index.md b/docs/content/documentation/content/image-resizing/index.md index d4442161..8e0d326b 100644 --- a/docs/content/documentation/content/image-resizing/index.md +++ b/docs/content/documentation/content/image-resizing/index.md @@ -26,7 +26,7 @@ The function usage is as follows: Gutenberg performs image processing during the build process and places the resized images in a subdirectory in the static files directory: - static/_resized_images/ + static/_processed_images/ Resized images are JPEGs. Filename of each resized image is a hash of the function arguments, which means that once an image is resized in a certain way, it will be stored in the above directory and will not diff --git a/docs/static/_resized_images/09c08ee3f954d0c100.jpg b/docs/static/_processed_images/09c08ee3f954d0c100.jpg similarity index 100% rename from docs/static/_resized_images/09c08ee3f954d0c100.jpg rename to docs/static/_processed_images/09c08ee3f954d0c100.jpg diff --git a/docs/static/_resized_images/28c11b70e6d31a8400.jpg b/docs/static/_processed_images/28c11b70e6d31a8400.jpg similarity index 100% rename from docs/static/_resized_images/28c11b70e6d31a8400.jpg rename to docs/static/_processed_images/28c11b70e6d31a8400.jpg diff --git a/docs/static/_resized_images/42758a649ef513b600.jpg b/docs/static/_processed_images/42758a649ef513b600.jpg similarity index 100% rename from docs/static/_resized_images/42758a649ef513b600.jpg rename to docs/static/_processed_images/42758a649ef513b600.jpg diff --git a/docs/static/_resized_images/4df81a7c614e5cc000.jpg b/docs/static/_processed_images/4df81a7c614e5cc000.jpg similarity index 100% rename from docs/static/_resized_images/4df81a7c614e5cc000.jpg rename to docs/static/_processed_images/4df81a7c614e5cc000.jpg diff --git a/docs/static/_resized_images/6320cb783d4be30e00.jpg b/docs/static/_processed_images/6320cb783d4be30e00.jpg similarity index 100% rename from docs/static/_resized_images/6320cb783d4be30e00.jpg rename to docs/static/_processed_images/6320cb783d4be30e00.jpg diff --git a/docs/static/_resized_images/6e0991f475d665df00.jpg b/docs/static/_processed_images/6e0991f475d665df00.jpg similarity index 100% rename from docs/static/_resized_images/6e0991f475d665df00.jpg rename to docs/static/_processed_images/6e0991f475d665df00.jpg diff --git a/docs/static/_resized_images/72d0be8c5e35e50f00.jpg b/docs/static/_processed_images/72d0be8c5e35e50f00.jpg similarity index 100% rename from docs/static/_resized_images/72d0be8c5e35e50f00.jpg rename to docs/static/_processed_images/72d0be8c5e35e50f00.jpg diff --git a/docs/static/_resized_images/78e4b442f0b0cbf700.jpg b/docs/static/_processed_images/78e4b442f0b0cbf700.jpg similarity index 100% rename from docs/static/_resized_images/78e4b442f0b0cbf700.jpg rename to docs/static/_processed_images/78e4b442f0b0cbf700.jpg diff --git a/docs/static/_resized_images/792676f9505fb47700.jpg b/docs/static/_processed_images/792676f9505fb47700.jpg similarity index 100% rename from docs/static/_resized_images/792676f9505fb47700.jpg rename to docs/static/_processed_images/792676f9505fb47700.jpg diff --git a/docs/static/_resized_images/b12c7fc72d2815e700.jpg b/docs/static/_processed_images/b12c7fc72d2815e700.jpg similarity index 100% rename from docs/static/_resized_images/b12c7fc72d2815e700.jpg rename to docs/static/_processed_images/b12c7fc72d2815e700.jpg From d47ba4aff081ede0addd7eba1b9dbac91fb411ab Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Mon, 25 Jun 2018 19:13:21 +0200 Subject: [PATCH 36/74] Rebasing + tweaks --- CHANGELOG.md | 2 +- Cargo.lock | 140 +----------------- Cargo.toml | 2 +- README.md | 2 +- components/content/src/page.rs | 2 +- components/content/src/section.rs | 2 +- components/errors/src/lib.rs | 2 +- components/imageproc/Cargo.toml | 6 +- components/imageproc/src/lib.rs | 71 ++++++--- components/rendering/src/context.rs | 8 +- components/rendering/src/markdown.rs | 11 +- components/rendering/src/shortcode.rs | 10 +- components/templates/src/global_fns.rs | 73 +++++++-- .../content/image-resizing/index.md | 30 ++-- .../documentation/content/shortcodes.md | 4 + .../documentation/templates/pages-sections.md | 4 +- 16 files changed, 160 insertions(+), 209 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cc641b9..fc8e9d76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,5 @@ # Changelog - ## 0.4.0 (unreleased) - Fix `serve` not working with the config flag @@ -12,6 +11,7 @@ - Aliases can now be pointing directly to specific HTML files - Add `year`, `month` and `day` variables to pages with a date - Fix panic when live reloading a change on a file without extensions +- Add image resizing support ## 0.3.4 (2018-06-22) diff --git a/Cargo.lock b/Cargo.lock index 1534c109..91ddea8c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,33 +20,6 @@ dependencies = [ "uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "actix" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "actix_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-channel 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-signal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "trust-dns-resolver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "actix-web" version = "0.6.14" @@ -401,18 +374,6 @@ dependencies = [ "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "crossbeam-channel" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "crossbeam-epoch 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "crossbeam-deque" version = "0.2.0" @@ -474,11 +435,6 @@ dependencies = [ "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "crossbeam-utils" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "ctrlc" version = "3.1.1" @@ -790,7 +746,7 @@ dependencies = [ name = "gutenberg" version = "0.4.0" dependencies = [ - "actix 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", "actix-web 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -914,7 +870,7 @@ dependencies = [ "errors 0.1.0", "image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", @@ -1020,15 +976,6 @@ name = "linked-hash-map" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "lock_api" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "log" version = "0.3.9" @@ -1381,15 +1328,6 @@ dependencies = [ "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "parking_lot" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lock_api 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "parking_lot_core" version = "0.2.14" @@ -1568,15 +1506,6 @@ dependencies = [ "rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "rayon" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "rayon" version = "1.0.1" @@ -2300,21 +2229,6 @@ dependencies = [ "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "tokio-signal" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", - "mio-uds 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "tokio-tcp" version = "0.1.0" @@ -2389,29 +2303,6 @@ dependencies = [ "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "trust-dns-proto" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "socket2 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-udp 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "trust-dns-resolver" version = "0.8.2" @@ -2428,24 +2319,6 @@ dependencies = [ "trust-dns-proto 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "trust-dns-resolver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "ipconfig 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "resolv-conf 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "trust-dns-proto 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "ucd-util" version = "0.1.1" @@ -2676,7 +2549,6 @@ dependencies = [ [metadata] "checksum actix 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7f0b2daad36916ccd2b162dbc5a04a74df642a29391b1a341c8ee3e82026cb16" -"checksum actix 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b11a1e86e1efd2331b360e8301436d9ef647b3a7c1252ae5e41695f2756e87a4" "checksum actix-web 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "e35bb192338dc7726564b0bdf2d49d43cbf4c7845231a82527f5f302bdb8f477" "checksum actix_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4b1dc922654b9aca7a8a31eab875fde804fa9fbd67f220f2e457787b23590f2" "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" @@ -2711,14 +2583,12 @@ dependencies = [ "checksum color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbbb57365263e881e805dc77d94697c9118fd94d8da011240555aa7b23445bd" "checksum cookie 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "746858cae4eae40fff37e1998320068df317bc247dc91a67c6cfa053afdc2abb" "checksum crossbeam-channel 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "862becd07e73da5746de6d9b3ba055c9bb8b10afd0d2b51155a6e30d81cd20b3" -"checksum crossbeam-channel 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b45c6ba620feae538943c106977c6348c16ad3b03dd8aaecd25a4224345fa795" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" "checksum crossbeam-deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fe8153ef04a7594ded05b427ffad46ddeaf22e63fd48d42b3e1e3bb4db07cae7" "checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150" "checksum crossbeam-epoch 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2af0e75710d6181e234c8ecc79f14a97907850a541b13b0be1dd10992f2e4620" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crossbeam-utils 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d636a8b3bcc1b409d7ffd3facef8f21dcb4009626adbd0c5e6c4305c07253c7b" -"checksum crossbeam-utils 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b71f220442ed14749909b543d4dd7ec3918cb1fe289fd96e88d0abe6ca049783" "checksum ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "630391922b1b893692c6334369ff528dcc3a9d8061ccf4c803aa8f83cb13db5e" "checksum dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97590ba53bcb8ac28279161ca943a924d1fd4a8fb3fa63302591647c4fc5b850" "checksum deflate 0.7.18 (registry+https://github.com/rust-lang/crates.io-index)" = "32c8120d981901a9970a3a1c97cf8b630e0fa8c3ca31e75b6fd6fd5f9f427b31" @@ -2778,7 +2648,6 @@ dependencies = [ "checksum libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "b685088df2b950fccadf07a7187c8ef846a959c142338a48f9dc0b94517eb5f1" "checksum linked-hash-map 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7860ec297f7008ff7a1e3382d7f7e1dcd69efc94751a2284bafc3d013c2aa939" "checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e" -"checksum lock_api 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "949826a5ccf18c1b3a7c3d57692778d21768b79e46eb9dd07bfc4c2160036c54" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6fddaa003a65722a7fb9e26b0ce95921fe4ba590542ced664d8ce2fa26f9f3ac" "checksum lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4d06ff7ff06f729ce5f4e227876cb88d10bc59cd4ae1e09fbb2bde15c850dc21" @@ -2815,7 +2684,6 @@ dependencies = [ "checksum os_pipe 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934868c3f86ed7a39ef63d88edeac5bd49a0c843192651900e9ce1178cbbf157" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" -"checksum parking_lot 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "901d6514273469bb17380c1ac3f51fb3ce54be1f960e51a6f04901eba313ab8d" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0fce5d8b5cc33983fc74f78ad552b5522ab41442c4ca91606e4236eb4b5ceefc" @@ -2838,7 +2706,6 @@ dependencies = [ "checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" "checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8" -"checksum rayon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ed02d09394c94ffbdfdc755ad62a132e94c3224a8354e78a1200ced34df12edf" "checksum rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80e811e76f1dbf68abf87a759083d34600017fc4e10b6bd5ad84a700f9dba4b1" "checksum rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d24ad214285a7729b174ed6d3bcfcb80177807f959d95fafd5bfc5c4f201ac8" "checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" @@ -2908,16 +2775,13 @@ dependencies = [ "checksum tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a5c9635ee806f26d302b8baa1e145689a280d8f5aa8d0552e7344808da54cc21" "checksum tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e00ec63bbec2c97ce1178cb0587b2c438b2f6b09d3ee54a33c45a9cf0d530810" "checksum tokio-signal 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e8f46863230f9a05cf52d173721ec391b9c5782a2465f593029922b8782b9ffe" -"checksum tokio-signal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "342d088c63623f63eada591e065778038c63b516939530db2aa09a8df9118507" "checksum tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ec9b094851aadd2caf83ba3ad8e8c4ce65a42104f7b94d9e6550023f0407853f" "checksum tokio-threadpool 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c3873a6d8d0b636e024e77b9a82eaab6739578a06189ecd0e731c7308fbc5d" "checksum tokio-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "028b94314065b90f026a21826cffd62a4e40a92cda3e5c069cc7b02e5945f5e9" "checksum tokio-udp 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "43eb534af6e8f37d43ab1b612660df14755c42bd003c5f8d2475ee78cc4600c0" "checksum toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a0263c6c02c4db6c8f7681f9fd35e90de799ebd4cfdeab77a38f4ff6b3d8c0d9" "checksum trust-dns-proto 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cbbddb93547eeee847367d8f59b68002294a7b4df31c143fbee4109ce0c61a04" -"checksum trust-dns-proto 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "32d7c204ee231f802aa821f9dc2195aa0d0269ef7e9f8c844208565c9e3981e4" "checksum trust-dns-resolver 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9b0a0c9d4f8dd56481209c5ae1a8965ed022461d352c81fb92466ec9d846929e" -"checksum trust-dns-resolver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "28b094ad60c4f51f36a493201d04d6605183c62bd5f0c73008a732f23950c156" "checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" "checksum unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284b6d3db520d67fbe88fd778c21510d1b0ba4a551e5d0fbb023d33405f6de8a" diff --git a/Cargo.toml b/Cargo.toml index 1ea45e0d..6280d02a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,7 @@ term-painter = "0.2" # Used in init to ensure the url given as base_url is a valid one url = "1.5" # Below is for the serve cmd -actix = "0.6" +actix = "~0.5" actix-web = "0.6" notify = "4" ws = "0.7" diff --git a/README.md b/README.md index 23454eb7..8cd724da 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ in the `docs/content` folder of the repository. | Sass compilation | ✔ | ✕ | ✕ | ✔ | | Assets co-location | ✔ | ✔ | ✔ | ✔ | | i18n | ✕ | ✕ | ✔ | ✔ | -| Image processing | ✕ | ✕ | ✔ | ✔ | +| Image processing | ✔ | ✕ | ✔ | ✔ | | Sane template engine | ✔ | ✔ | ✕✕✕ | ✔ | | Themes | ✔ | ✕ | ✔ | ✔ | | Shortcodes | ✔ | ✕ | ✔ | ✔ | diff --git a/components/content/src/page.rs b/components/content/src/page.rs index b77a6dbe..07a2aad5 100644 --- a/components/content/src/page.rs +++ b/components/content/src/page.rs @@ -170,7 +170,7 @@ impl Page { anchor_insert ); - context.teracontext.add("page", self); + context.tera_context.add("page", self); let res = render_content( &self.raw_content.replacen("", "", 1), diff --git a/components/content/src/section.rs b/components/content/src/section.rs index b634dc96..bd948cd3 100644 --- a/components/content/src/section.rs +++ b/components/content/src/section.rs @@ -106,7 +106,7 @@ impl Section { self.meta.insert_anchor_links, ); - context.teracontext.add("section", self); + context.tera_context.add("section", self); let res = render_content(&self.raw_content, &context) .chain_err(|| format!("Failed to render content of {}", self.file.path.display()))?; diff --git a/components/errors/src/lib.rs b/components/errors/src/lib.rs index a21041d2..9bc146f1 100755 --- a/components/errors/src/lib.rs +++ b/components/errors/src/lib.rs @@ -1,4 +1,4 @@ -#![allow(unused_doc_comment)] +#![allow(unused_doc_comments)] #[macro_use] extern crate error_chain; diff --git a/components/imageproc/Cargo.toml b/components/imageproc/Cargo.toml index f7b32cc8..82d97400 100644 --- a/components/imageproc/Cargo.toml +++ b/components/imageproc/Cargo.toml @@ -6,9 +6,9 @@ authors = ["Vojtěch Král "] [dependencies] lazy_static = "1" regex = "1.0" -tera = "0.11.0" -image = "0.19.0" -rayon = "0.9" +tera = "0.11" +image = "0.19" +rayon = "1" errors = { path = "../errors" } utils = { path = "../utils" } diff --git a/components/imageproc/src/lib.rs b/components/imageproc/src/lib.rs index 9a08c8f1..19316849 100644 --- a/components/imageproc/src/lib.rs +++ b/components/imageproc/src/lib.rs @@ -24,6 +24,7 @@ use errors::{Result, ResultExt}; static RESIZED_SUBDIR: &'static str = "_processed_images"; + lazy_static!{ pub static ref RESIZED_FILENAME: Regex = Regex::new(r#"([0-9a-f]{16})([0-9a-f]{2})[.]jpg"#).unwrap(); } @@ -33,15 +34,20 @@ lazy_static!{ pub enum ResizeOp { /// A simple scale operation that doesn't take aspect ratio into account Scale(u32, u32), - /// Scales the image to a specified width with height computed such that aspect ratio is preserved + /// Scales the image to a specified width with height computed such + /// that aspect ratio is preserved FitWidth(u32), - /// Scales the image to a specified height with width computed such that aspect ratio is preserved + /// Scales the image to a specified height with width computed such + /// that aspect ratio is preserved FitHeight(u32), - /// Scales the image such that it fits within the specified width and height preserving aspect ratio. + /// Scales the image such that it fits within the specified width and + /// height preserving aspect ratio. /// Either dimension may end up being smaller, but never larger than specified. Fit(u32, u32), - /// Scales the image such that it fills the specified width and height. Output will always have the exact dimensions specified. - /// The part of the image that doesn't fit in the thumbnail due to differing aspect ratio will be cropped away, if any. + /// Scales the image such that it fills the specified width and height. + /// Output will always have the exact dimensions specified. + /// The part of the image that doesn't fit in the thumbnail due to differing + /// aspect ratio will be cropped away, if any. Fill(u32, u32), } @@ -51,8 +57,12 @@ impl ResizeOp { // Validate args: match op { - "fit_width" => if width.is_none() { return Err(format!("op=\"fit_width\" requires a `width` argument").into()) }, - "fit_height" => if height.is_none() { return Err(format!("op=\"fit_height\" requires a `height` argument").into()) }, + "fit_width" => if width.is_none() { + return Err("op=\"fit_width\" requires a `width` argument".to_string().into()) + }, + "fit_height" => if height.is_none() { + return Err("op=\"fit_height\" requires a `height` argument".to_string().into()) + }, "scale" | "fit" | "fill" => if width.is_none() || height.is_none() { return Err(format!("op={} requires a `width` and `height` argument", op).into()) }, @@ -127,6 +137,7 @@ pub struct ImageOp { /// If there is a hash collision with another ImageOp, this contains a sequential ID > 1 /// identifying the collision in the order as encountered (which is essentially random). /// Therefore, ImageOps with collisions (ie. collision_id > 0) are always considered out of date. + /// Note that this is very unlikely to happen in practice collision_id: u32, } @@ -141,7 +152,13 @@ impl ImageOp { ImageOp { source, op, quality, hash, collision_id: 0 } } - pub fn from_args(source: String, op: &str, width: Option, height: Option, quality: u8) -> Result { + pub fn from_args( + source: String, + op: &str, + width: Option, + height: Option, + quality: u8, + ) -> Result { let op = ResizeOp::from_args(op, width, height)?; Ok(Self::new(source, op, quality)) } @@ -170,13 +187,14 @@ impl ImageOp { let factor_h = img_h as f32 / h as f32; if (factor_w - factor_h).abs() <= RATIO_EPSILLION { - // If the horizontal and vertical factor is very similar, that means the aspect is similar enough - // that there's not much point in cropping, so just perform a simple scale in this case. + // If the horizontal and vertical factor is very similar, + // that means the aspect is similar enough that there's not much point + // in cropping, so just perform a simple scale in this case. img.resize_exact(w, h, RESIZE_FILTER) } else { - // We perform the fill such that a crop is performed first and then resize_exact can be used, - // which should be cheaper than resizing and then cropping (smaller number of pixels to resize). - + // We perform the fill such that a crop is performed first + // and then resize_exact can be used, which should be cheaper than + // resizing and then cropping (smaller number of pixels to resize). let (crop_w, crop_h) = if factor_w < factor_h { (img_w, (factor_w * h as f32).round() as u32) } else { @@ -189,7 +207,8 @@ impl ImageOp { ((img_w - crop_w) / 2, 0) }; - img.crop(offset_w, offset_h, crop_w, crop_h).resize_exact(w, h, RESIZE_FILTER) + img.crop(offset_w, offset_h, crop_w, crop_h) + .resize_exact(w, h, RESIZE_FILTER) } }, }; @@ -260,26 +279,31 @@ impl Processor { } // If we get here, that means a hash collision. - // This is detected when there is an ImageOp with the same hash in the `img_ops` map but which is not equal to this one. + // This is detected when there is an ImageOp with the same hash in the `img_ops` + // map but which is not equal to this one. // To deal with this, all collisions get a (random) sequential ID number. - // First try to look up this ImageOp in `img_ops_collisions`, maybe we've already seen the same ImageOp. + // First try to look up this ImageOp in `img_ops_collisions`, maybe we've + // already seen the same ImageOp. // At the same time, count IDs to figure out the next free one. - // Start with the ID of 2, because we'll need to use 1 for the ImageOp already present in the map: + // Start with the ID of 2, because we'll need to use 1 for the ImageOp + // already present in the map: let mut collision_id = 2; for op in self.img_ops_collisions.iter().filter(|op| op.hash == img_op.hash) { if *op == img_op { - // This is a colliding ImageOp, but we've already seen an equal one (not just by hash, but by content too), - // so just return its ID: + // This is a colliding ImageOp, but we've already seen an equal one + // (not just by hash, but by content too), so just return its ID: return collision_id; } else { collision_id += 1; } } - // If we get here, that means this is a new colliding ImageOp and `collision_id` is the next free ID + // If we get here, that means this is a new colliding ImageOp and + // `collision_id` is the next free ID if collision_id == 2 { - // This is the first collision found with this hash, update the ID of the matching ImageOp in the map. + // This is the first collision found with this hash, update the ID + // of the matching ImageOp in the map. self.img_ops.get_mut(&img_op.hash).unwrap().collision_id = 1; } img_op.collision_id = collision_id; @@ -312,7 +336,10 @@ impl Processor { let filename = entry_path.file_name().unwrap().to_string_lossy(); if let Some(capts) = RESIZED_FILENAME.captures(filename.as_ref()) { let hash = u64::from_str_radix(capts.get(1).unwrap().as_str(), 16).unwrap(); - let collision_id = u32::from_str_radix(capts.get(2).unwrap().as_str(), 16).unwrap(); + let collision_id = u32::from_str_radix( + capts.get(2).unwrap().as_str(), 16 + ).unwrap(); + if collision_id > 0 || !self.img_ops.contains_key(&hash) { fs::remove_file(&entry_path)?; } diff --git a/components/rendering/src/context.rs b/components/rendering/src/context.rs index b65997a0..91eef513 100644 --- a/components/rendering/src/context.rs +++ b/components/rendering/src/context.rs @@ -10,7 +10,7 @@ use config::Config; pub struct RenderContext<'a> { pub tera: &'a Tera, pub config: &'a Config, - pub teracontext: Context, + pub tera_context: Context, pub current_page_permalink: &'a str, pub permalinks: &'a HashMap, pub insert_anchor: InsertAnchor, @@ -24,11 +24,11 @@ impl<'a> RenderContext<'a> { permalinks: &'a HashMap, insert_anchor: InsertAnchor, ) -> RenderContext<'a> { - let mut teracontext = Context::new(); - teracontext.insert("config", config); + let mut tera_context = Context::new(); + tera_context.insert("config", config); RenderContext { tera, - teracontext, + tera_context, current_page_permalink, permalinks, insert_anchor, diff --git a/components/rendering/src/markdown.rs b/components/rendering/src/markdown.rs index 50ba80ec..c0694b85 100644 --- a/components/rendering/src/markdown.rs +++ b/components/rendering/src/markdown.rs @@ -111,7 +111,10 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<(Strin Event::Start(Tag::Image(src, title)) => { if is_colocated_asset_link(&src) { return Event::Start( - Tag::Image(Owned(format!("{}{}", context.current_page_permalink, src)), title) + Tag::Image( + Owned(format!("{}{}", context.current_page_permalink, src)), + title, + ) ); } @@ -122,7 +125,8 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<(Strin // - it could be a relative link (starting with `./`) // - it could be a link to a co-located asset // - it could be a normal link - // - any of those can be in a header or not: if it's in a header we need to append to a string + // - any of those can be in a header or not: if it's in a header + // we need to append to a string let fixed_link = if link.starts_with("./") { match resolve_internal_link(&link, context.permalinks) { Ok(url) => url, @@ -176,7 +180,8 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<(Strin Event::Html(Owned(String::new())) }, Event::End(Tag::Header(_)) => { - // End of a header, reset all the things and return the stringified version of the header + // End of a header, reset all the things and return the stringified + // version of the header in_header = false; header_created = false; let val = temp_header.to_string(context.tera, context.insert_anchor); diff --git a/components/rendering/src/shortcode.rs b/components/rendering/src/shortcode.rs index e01c860c..92e83e8f 100644 --- a/components/rendering/src/shortcode.rs +++ b/components/rendering/src/shortcode.rs @@ -85,19 +85,19 @@ fn parse_shortcode_call(pair: Pair) -> (String, Map) { fn render_shortcode(name: String, args: Map, context: &RenderContext, body: Option<&str>) -> Result { - let mut teracontext = Context::new(); + let mut tera_context = Context::new(); for (key, value) in args.iter() { - teracontext.insert(key, value); + tera_context.insert(key, value); } if let Some(ref b) = body { // Trimming right to avoid most shortcodes with bodies ending up with a HTML new line - teracontext.insert("body", b.trim_right()); + tera_context.insert("body", b.trim_right()); } - teracontext.extend(context.teracontext.clone()); + tera_context.extend(context.tera_context.clone()); let tpl_name = format!("shortcodes/{}.html", name); let res = context.tera - .render(&tpl_name, &teracontext) + .render(&tpl_name, &tera_context) .chain_err(|| format!("Failed to render {} shortcode", name))?; // We trim left every single line of a shortcode to avoid the accidental diff --git a/components/templates/src/global_fns.rs b/components/templates/src/global_fns.rs index 65aeabb4..5db2da89 100644 --- a/components/templates/src/global_fns.rs +++ b/components/templates/src/global_fns.rs @@ -42,7 +42,11 @@ pub fn make_trans(config: Config) -> GlobalFn { Box::new(move |args| -> Result { let key = required_arg!(String, args.get("key"), "`trans` requires a `key` argument."); - let lang = optional_arg!(String, args.get("lang"), "`trans`: `lang` must be a string.").unwrap_or(default_lang.clone()); + let lang = optional_arg!( + String, + args.get("lang"), + "`trans`: `lang` must be a string." + ).unwrap_or(default_lang.clone()); let translations = &translations_config[lang.as_str()]; Ok(to_value(&translations[key.as_str()]).unwrap()) }) @@ -56,7 +60,11 @@ pub fn make_get_page(all_pages: &HashMap) -> GlobalFn { } Box::new(move |args| -> Result { - let path = required_arg!(String, args.get("path"), "`get_page` requires a `path` argument with a string value"); + let path = required_arg!( + String, + args.get("path"), + "`get_page` requires a `path` argument with a string value" + ); match pages.get(&path) { Some(p) => Ok(to_value(p).unwrap()), None => Err(format!("Page `{}` not found.", path).into()) @@ -74,7 +82,11 @@ pub fn make_get_section(all_sections: &HashMap) -> GlobalFn { } Box::new(move |args| -> Result { - let path = required_arg!(String, args.get("path"), "`get_section` requires a `path` argument with a string value"); + let path = required_arg!( + String, + args.get("path"), + "`get_section` requires a `path` argument with a string value" + ); //println!("Found {:#?}", sections.get(&path).unwrap().pages[0]); match sections.get(&path) { Some(p) => Ok(to_value(p).unwrap()), @@ -97,7 +109,11 @@ pub fn make_get_url(permalinks: HashMap, config: Config) -> Glob from_value::(c.clone()).unwrap_or(true) }); - let path = required_arg!(String, args.get("path"), "`get_url` requires a `path` argument with a string value"); + let path = required_arg!( + String, + args.get("path"), + "`get_url` requires a `path` argument with a string value" + ); if path.starts_with("./") { match resolve_internal_link(&path, &permalinks) { Ok(url) => Ok(to_value(url).unwrap()), @@ -120,12 +136,22 @@ pub fn make_get_url(permalinks: HashMap, config: Config) -> Glob pub fn make_get_taxonomy_url(tags: Option, categories: Option) -> GlobalFn { Box::new(move |args| -> Result { - let kind = required_arg!(String, args.get("kind"), "`get_taxonomy_url` requires a `kind` argument with a string value"); - let name = required_arg!(String, args.get("name"), "`get_taxonomy_url` requires a `name` argument with a string value"); + let kind = required_arg!( + String, + args.get("kind"), + "`get_taxonomy_url` requires a `kind` argument with a string value" + ); + let name = required_arg!( + String, + args.get("name"), + "`get_taxonomy_url` requires a `name` argument with a string value" + ); let container = match kind.as_ref() { "tag" => &tags, "category" => &categories, - _ => return Err("`get_taxonomy_url` can only get `tag` or `category` for the `kind` argument".into()), + _ => return Err( + "`get_taxonomy_url` can only get `tag` or `category` for the `kind` argument".into() + ), }; if let Some(ref c) = *container { @@ -146,11 +172,31 @@ pub fn make_resize_image(imageproc: Arc>) -> GlobalF const DEFAULT_Q: u8 = 75; Box::new(move |args| -> Result { - let path = required_arg!(String, args.get("path"), "`resize_image` requires a `path` argument with a string value"); - let width = optional_arg!(u32, args.get("width"), "`resize_image`: `width` must be a non-negative integer"); - let height = optional_arg!(u32, args.get("height"), "`resize_image`: `height` must be a non-negative integer"); - let op = optional_arg!(String, args.get("op"), "`resize_image`: `op` must be a string").unwrap_or(DEFAULT_OP.to_owned()); - let quality = optional_arg!(u8, args.get("quality"), "`resize_image`: `quality` must be a number").unwrap_or(DEFAULT_Q); + let path = required_arg!( + String, + args.get("path"), + "`resize_image` requires a `path` argument with a string value" + ); + let width = optional_arg!( + u32, + args.get("width"), + "`resize_image`: `width` must be a non-negative integer" + ); + let height = optional_arg!( + u32, + args.get("height"), + "`resize_image`: `height` must be a non-negative integer" + ); + let op = optional_arg!( + String, + args.get("op"), + "`resize_image`: `op` must be a string" + ).unwrap_or(DEFAULT_OP.to_string()); + let quality = optional_arg!( + u8, + args.get("quality"), + "`resize_image`: `quality` must be a number" + ).unwrap_or(DEFAULT_Q); if quality == 0 || quality > 100 { return Err("`resize_image`: `quality` must be in range 1-100".to_string().into()); } @@ -160,7 +206,8 @@ pub fn make_resize_image(imageproc: Arc>) -> GlobalF return Err(format!("`resize_image`: Cannot find path: {}", path).into()); } - let imageop = imageproc::ImageOp::from_args(path.clone(), &op, width, height, quality).map_err(|e| format!("`resize_image`: {}", e))?; + let imageop = imageproc::ImageOp::from_args(path.clone(), &op, width, height, quality) + .map_err(|e| format!("`resize_image`: {}", e))?; let url = imageproc.insert(imageop); to_value(url).map_err(|err| err.into()) diff --git a/docs/content/documentation/content/image-resizing/index.md b/docs/content/documentation/content/image-resizing/index.md index 8e0d326b..129cdd19 100644 --- a/docs/content/documentation/content/image-resizing/index.md +++ b/docs/content/documentation/content/image-resizing/index.md @@ -9,13 +9,12 @@ which is available in template code as well as in shortcodes. The function usage is as follows: ```jinja2 - resize_image(path, width, height, op, quality) +resize_image(path, width, height, op, quality) ``` ### Arguments - `path`: The path to the source image relative to the `content` directory in the [directory structure](./documentation/getting-started/directory-structure.md). - - `width` and `height`: The dimensions in pixels of the resized image. Usage depends on the `op` argument. - `op`: Resize operation. This can be one of five choices: `"scale"`, `"fit_width"`, `"fit_height"`, `"fit"`, or `"fill"`. What each of these does is explained below. @@ -26,7 +25,9 @@ The function usage is as follows: Gutenberg performs image processing during the build process and places the resized images in a subdirectory in the static files directory: - static/_processed_images/ +``` +static/_processed_images/ +``` Resized images are JPEGs. Filename of each resized image is a hash of the function arguments, which means that once an image is resized in a certain way, it will be stored in the above directory and will not @@ -93,23 +94,26 @@ The examples above were generated using a shortcode file named `resize_image.htm ``` -## Creating picuture galleries +## Creating picture galleries -The `resize_image()` can be used multiple times and/or in loops (it is designed to handle this efficiently). +The `resize_image()` can be used multiple times and/or in loops as it is designed to handle this efficiently. -This can be used along with `images` [page metadata](./documentation/templates/pages-sections.md) to create picture galleries. -The `images` variable holds paths to all images in the directory of a page with resources -(see [Assets colocation](./documentation/content/overview.md#assets-colocation)). +This can be used along with `assets` [page metadata](./documentation/templates/pages-sections.md) to create picture galleries. +The `assets` variable holds paths to all assets in the directory of a page with resources +(see [Assets colocation](./documentation/content/overview.md#assets-colocation)): if you have files other than images you +will need to filter them out in the loop first like in the example below. This can be used in shortcodes. For example, we can create a very simple html-only clickable picture gallery with the following shortcode named `gallery.html`: ```jinja2 -{% for img in page.images %} - - - -   +{% for asset in page.assets %} + {% if asset is ending_with(".jpg") %} + + + +   + {% endif %} {% endfor %} ``` diff --git a/docs/content/documentation/content/shortcodes.md b/docs/content/documentation/content/shortcodes.md index 584975f7..a2d1c701 100644 --- a/docs/content/documentation/content/shortcodes.md +++ b/docs/content/documentation/content/shortcodes.md @@ -58,6 +58,10 @@ Argument values can be of 5 types: Malformed values will be silently ignored. +Both type of shortcodes will also get either a `page` or `section` variable depending on where they were used and a `config` +one. Those values will overwrite any arguments passed to a shortcode so shortcodes should not use arguments called like one +of these. + ### Shortcodes without body Simply call the shortcode as if it was a Tera function in a variable block. All the examples below are valid diff --git a/docs/content/documentation/templates/pages-sections.md b/docs/content/documentation/templates/pages-sections.md index b4caa1fa..6dcf7ac7 100644 --- a/docs/content/documentation/templates/pages-sections.md +++ b/docs/content/documentation/templates/pages-sections.md @@ -37,12 +37,12 @@ previous: Page?; next: Page?; // See the Table of contents section below for more details toc: Array
; -// Paths of colocated assets, relative to the content directory -assets: Array; // Year/month/day is only set if the page has a date and month/day are 1-indexed year: Number?; month: Number?; day: Number?; +// Paths of colocated assets, relative to the content directory +assets: Array; ``` ## Section variables From fd93b3419fde85057cd5df606aa031f35c33e2c1 Mon Sep 17 00:00:00 2001 From: Owen Nelson Date: Mon, 25 Jun 2018 21:39:25 -0700 Subject: [PATCH 37/74] pin actix-web harder --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 6280d02a..7f8e099c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,7 +25,7 @@ term-painter = "0.2" url = "1.5" # Below is for the serve cmd actix = "~0.5" -actix-web = "0.6" +actix-web = "~0.6" notify = "4" ws = "0.7" ctrlc = "3" From 17106be497bc84f56e543e5a2cb0f634cb7d792b Mon Sep 17 00:00:00 2001 From: eir Date: Thu, 26 Apr 2018 14:14:37 -0700 Subject: [PATCH 38/74] Send Appropriate Response on Error Users can now place custom error pages in static/error/.html e.g. static/error/404.html If no custom page is found, a default plaintext describing the error is served. --- src/cmd/serve.rs | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/cmd/serve.rs b/src/cmd/serve.rs index 1ae7a01c..85cbe092 100644 --- a/src/cmd/serve.rs +++ b/src/cmd/serve.rs @@ -22,7 +22,7 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. use std::env; -use std::fs::remove_dir_all; +use std::fs::{File, remove_dir_all}; use std::io; use std::path::{Path, PathBuf}; use std::sync::mpsc::channel; @@ -58,6 +58,31 @@ enum ChangeKind { // errors const LIVE_RELOAD: &'static str = include_str!("livereload.js"); +struct ErrCatcher; + +impl AfterMiddleware for ErrCatcher { + + fn catch(&self, _: &mut Request, err: IronError) -> IronResult { + + let err_status = err.response.status.unwrap_or(status::InternalServerError); + + // Search for e.g. "static/error/404.html" + let err_page = File::open( format!("static/error/{}.html", err_status.to_u16()) ); + + if err_page.is_ok() { + let mut err_res = Response::with(( err_status, err_page.unwrap() )); + err_res.headers.set(ContentType::html()); + + return Ok(err_res); + } + + // No custom error page, serve default + let mut err_res = Response::with(( err_status, format!("Error: {}.", err_status) )); + err_res.headers.set(ContentType::plaintext()); + + Ok(err_res) + } +} fn livereload_handler(_: HttpRequest) -> &'static str { LIVE_RELOAD From 7ab22528a53ee13ad0c23706b90ba6877878886f Mon Sep 17 00:00:00 2001 From: Owen Nelson Date: Sun, 24 Jun 2018 12:08:33 -0700 Subject: [PATCH 39/74] WIP Custom 404 page. This is a proposed successor to #296 (rewritten for actix-web, rather than iron). --- src/cmd/serve.rs | 49 ++++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/src/cmd/serve.rs b/src/cmd/serve.rs index 85cbe092..af22cc7c 100644 --- a/src/cmd/serve.rs +++ b/src/cmd/serve.rs @@ -22,8 +22,8 @@ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. use std::env; -use std::fs::{File, remove_dir_all}; -use std::io; +use std::fs::{remove_dir_all, File}; +use std::io::{self, Read}; use std::path::{Path, PathBuf}; use std::sync::mpsc::channel; use std::time::{Instant, Duration}; @@ -31,7 +31,8 @@ use std::thread; use chrono::prelude::*; use actix; -use actix_web::{fs, server, App, HttpRequest, HttpResponse, Responder}; +use actix_web::{self, fs, http, server, App, HttpRequest, HttpResponse, Responder}; +use actix_web::middleware::{Middleware, Started, Response}; use notify::{Watcher, RecursiveMode, watcher}; use ws::{WebSocket, Sender, Message}; use ctrlc; @@ -60,27 +61,30 @@ const LIVE_RELOAD: &'static str = include_str!("livereload.js"); struct ErrCatcher; -impl AfterMiddleware for ErrCatcher { +impl Middleware for ErrCatcher { + fn start(&self, _req: &mut HttpRequest) -> actix_web::Result { + Ok(Started::Done) + } - fn catch(&self, _: &mut Request, err: IronError) -> IronResult { - - let err_status = err.response.status.unwrap_or(status::InternalServerError); - - // Search for e.g. "static/error/404.html" - let err_page = File::open( format!("static/error/{}.html", err_status.to_u16()) ); - - if err_page.is_ok() { - let mut err_res = Response::with(( err_status, err_page.unwrap() )); - err_res.headers.set(ContentType::html()); - - return Ok(err_res); + fn response( + &self, + _req: &mut HttpRequest, + mut resp: HttpResponse, + ) -> actix_web::Result { + if http::StatusCode::NOT_FOUND == resp.status() { + let not_found_page = "static/error/404.html"; + if let Ok(mut fh) = File::open(¬_found_page) { + println!("Using {} to handle missing file.", ¬_found_page); + let mut buf: Vec = vec![]; + let _ = fh.read_to_end(&mut buf)?; + resp.replace_body(buf); + resp.headers_mut().insert( + http::header::CONTENT_TYPE, + http::header::HeaderValue::from_static("text/html"), + ); + } } - - // No custom error page, serve default - let mut err_res = Response::with(( err_status, format!("Error: {}.", err_status) )); - err_res.headers.set(ContentType::plaintext()); - - Ok(err_res) + Ok(Response::Done(resp)) } } @@ -180,6 +184,7 @@ pub fn serve(interface: &str, port: &str, output_dir: &str, base_url: &str, conf let sys = actix::System::new("http-server"); server::new(move || { App::new() + .middleware(ErrCatcher) .resource(r"/livereload.js", |r| r.f(livereload_handler)) // Start a webserver that serves the `output_dir` directory .handler(r"/", fs::StaticFiles::new(&static_root) From 8f460dc28b4de29083a318eb8946713a1151b0ef Mon Sep 17 00:00:00 2001 From: Owen Nelson Date: Mon, 25 Jun 2018 23:24:57 -0700 Subject: [PATCH 40/74] Custom 404 page now template driven. Since we are using a builtin template, we can be assured to have the target file in place. Middleware renamed since it is bound directly to the concept of handling 404s. --- components/site/src/lib.rs | 10 ++++++++ components/templates/src/builtins/404.html | 10 ++++++++ components/templates/src/lib.rs | 1 + src/cmd/serve.rs | 27 +++++++++++----------- 4 files changed, 34 insertions(+), 14 deletions(-) create mode 100644 components/templates/src/builtins/404.html diff --git a/components/site/src/lib.rs b/components/site/src/lib.rs index 53ebc9d0..b217795a 100644 --- a/components/site/src/lib.rs +++ b/components/site/src/lib.rs @@ -526,6 +526,7 @@ impl Site { if self.config.generate_rss { self.render_rss_feed()?; } + self.render_404()?; self.render_robots()?; // `render_categories` and `render_tags` will check whether the config allows // them to render or not @@ -660,6 +661,15 @@ impl Site { Ok(()) } + /// Renders 404.html + pub fn render_404(&self) -> Result<()> { + ensure_directory_exists(&self.output_path)?; + create_file( + &self.output_path.join("404.html"), + &render_template("404.html", &self.tera, &Context::new(), &self.config.theme)? + ) + } + /// Renders robots.txt pub fn render_robots(&self) -> Result<()> { ensure_directory_exists(&self.output_path)?; diff --git a/components/templates/src/builtins/404.html b/components/templates/src/builtins/404.html new file mode 100644 index 00000000..f7d50b1a --- /dev/null +++ b/components/templates/src/builtins/404.html @@ -0,0 +1,10 @@ + + + + File Not Found: 404. + + +

Oops!

+

File Not Found: 404.

+ + diff --git a/components/templates/src/lib.rs b/components/templates/src/lib.rs index 1c494038..ce0fe912 100644 --- a/components/templates/src/lib.rs +++ b/components/templates/src/lib.rs @@ -24,6 +24,7 @@ lazy_static! { pub static ref GUTENBERG_TERA: Tera = { let mut tera = Tera::default(); tera.add_raw_templates(vec![ + ("404.html", include_str!("builtins/404.html")), ("rss.xml", include_str!("builtins/rss.xml")), ("sitemap.xml", include_str!("builtins/sitemap.xml")), ("robots.txt", include_str!("builtins/robots.txt")), diff --git a/src/cmd/serve.rs b/src/cmd/serve.rs index af22cc7c..a5158e5a 100644 --- a/src/cmd/serve.rs +++ b/src/cmd/serve.rs @@ -59,9 +59,11 @@ enum ChangeKind { // errors const LIVE_RELOAD: &'static str = include_str!("livereload.js"); -struct ErrCatcher; +struct NotFoundHandler { + rendered_template: PathBuf, +} -impl Middleware for ErrCatcher { +impl Middleware for NotFoundHandler { fn start(&self, _req: &mut HttpRequest) -> actix_web::Result { Ok(Started::Done) } @@ -72,17 +74,14 @@ impl Middleware for ErrCatcher { mut resp: HttpResponse, ) -> actix_web::Result { if http::StatusCode::NOT_FOUND == resp.status() { - let not_found_page = "static/error/404.html"; - if let Ok(mut fh) = File::open(¬_found_page) { - println!("Using {} to handle missing file.", ¬_found_page); - let mut buf: Vec = vec![]; - let _ = fh.read_to_end(&mut buf)?; - resp.replace_body(buf); - resp.headers_mut().insert( - http::header::CONTENT_TYPE, - http::header::HeaderValue::from_static("text/html"), - ); - } + let mut fh = File::open(&self.rendered_template)?; + let mut buf: Vec = vec![]; + let _ = fh.read_to_end(&mut buf)?; + resp.replace_body(buf); + resp.headers_mut().insert( + http::header::CONTENT_TYPE, + http::header::HeaderValue::from_static("text/html"), + ); } Ok(Response::Done(resp)) } @@ -184,7 +183,7 @@ pub fn serve(interface: &str, port: &str, output_dir: &str, base_url: &str, conf let sys = actix::System::new("http-server"); server::new(move || { App::new() - .middleware(ErrCatcher) + .middleware(NotFoundHandler { rendered_template: static_root.join("404.html") }) .resource(r"/livereload.js", |r| r.f(livereload_handler)) // Start a webserver that serves the `output_dir` directory .handler(r"/", fs::StaticFiles::new(&static_root) From 9e9fe507696dad79436da2b0d00f9e662d9ffa95 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Sun, 1 Jul 2018 16:14:46 +0200 Subject: [PATCH 41/74] Fix rendering benchmark --- components/rendering/benches/all.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/components/rendering/benches/all.rs b/components/rendering/benches/all.rs index 70244521..e996a256 100644 --- a/components/rendering/benches/all.rs +++ b/components/rendering/benches/all.rs @@ -122,7 +122,10 @@ fn bench_render_content_no_shortcode(b: &mut test::Bencher) { fn bench_render_shortcodes_one_present(b: &mut test::Bencher) { let mut tera = Tera::default(); tera.add_raw_template("shortcodes/youtube.html", "{{id}}").unwrap(); + let config = Config::default(); + let permalinks_ctx = HashMap::new(); + let context = RenderContext::new(&tera, &config, "", &permalinks_ctx, InsertAnchor::None); - b.iter(|| render_shortcodes(CONTENT, &tera, &Config::default())); + b.iter(|| render_shortcodes(CONTENT, &context)); } From 735bb38bd7e832e3dec96b9e858ed75fa274a356 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Thu, 5 Jul 2018 17:43:30 +0200 Subject: [PATCH 42/74] Update docs for 404 and enable preserve-order of tera --- CHANGELOG.md | 2 + Cargo.lock | 255 ++++++++++---------- components/rendering/Cargo.toml | 3 +- components/site/src/lib.rs | 4 +- docs/content/documentation/templates/404.md | 8 + 5 files changed, 143 insertions(+), 129 deletions(-) create mode 100644 docs/content/documentation/templates/404.md diff --git a/CHANGELOG.md b/CHANGELOG.md index fc8e9d76..908aa8d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ - Add `year`, `month` and `day` variables to pages with a date - Fix panic when live reloading a change on a file without extensions - Add image resizing support +- Add a 404 template +- Enable preserve-order feature of Tera ## 0.3.4 (2018-06-22) diff --git a/Cargo.lock b/Cargo.lock index 91ddea8c..af26aef0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,7 +10,7 @@ dependencies = [ "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "skeptic 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", @@ -40,20 +40,20 @@ dependencies = [ "h2 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "http-range 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "mime 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "mime_guess 2.0.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "mime_guess 2.0.0-alpha.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", "serde_urlencoded 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -84,7 +84,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "aho-corasick" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -135,7 +135,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "backtrace-sys 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", @@ -145,11 +145,11 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "backtrace-sys 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -197,7 +197,7 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -264,13 +264,13 @@ dependencies = [ [[package]] name = "cargo_metadata" -version = "0.5.6" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -281,7 +281,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -296,14 +296,14 @@ dependencies = [ [[package]] name = "clap" -version = "2.31.2" +version = "2.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -329,8 +329,8 @@ dependencies = [ "errors 0.1.0", "globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "highlighting 0.1.0", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -345,7 +345,7 @@ dependencies = [ "globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "rendering 0.1.0", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -398,7 +398,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -412,7 +412,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -424,7 +424,7 @@ name = "crossbeam-utils" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -432,7 +432,7 @@ name = "crossbeam-utils" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -491,8 +491,8 @@ dependencies = [ "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "rust-stemmers 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", "strum 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "strum_macros 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -568,7 +568,7 @@ name = "error-chain" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -576,7 +576,7 @@ name = "error-chain" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -594,7 +594,7 @@ name = "failure" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -613,7 +613,7 @@ name = "filetime" version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -640,8 +640,8 @@ dependencies = [ "errors 0.1.0", "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -735,9 +735,9 @@ name = "globset" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -749,7 +749,7 @@ dependencies = [ "actix 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", "actix-web 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)", + "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "content 0.1.0", "ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "errors 0.1.0", @@ -775,7 +775,7 @@ dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "string 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -803,7 +803,7 @@ name = "html5ever" version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "markup5ever 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -828,7 +828,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "httparse" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -883,7 +883,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "inflate" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -912,7 +912,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "error-chain 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "socket2 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "socket2 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "widestring 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "winreg 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -981,15 +981,15 @@ name = "log" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "log" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1022,8 +1022,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "phf 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)", "phf_codegen 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_codegen 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1050,7 +1050,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "mime" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1058,10 +1058,10 @@ dependencies = [ [[package]] name = "mime_guess" -version = "2.0.0-alpha.4" +version = "2.0.0-alpha.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "mime 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "phf 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)", "phf_codegen 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1085,7 +1085,7 @@ dependencies = [ "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "nix 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1094,7 +1094,7 @@ dependencies = [ [[package]] name = "mio" -version = "0.6.14" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1103,9 +1103,9 @@ dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1117,7 +1117,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1126,7 +1126,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1137,17 +1137,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "net2" -version = "0.2.32" +version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1176,7 +1176,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1189,7 +1189,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1224,7 +1224,7 @@ dependencies = [ "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.14.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1313,8 +1313,8 @@ dependencies = [ "content 0.1.0", "errors 0.1.0", "front_matter 0.1.0", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -1407,7 +1407,7 @@ dependencies = [ "base64 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", "xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1418,7 +1418,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "deflate 0.7.18 (registry+https://github.com/rust-lang/crates.io-index)", - "inflate 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "inflate 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1558,7 +1558,7 @@ name = "regex" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1570,7 +1570,7 @@ name = "regex" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex-syntax 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1617,8 +1617,8 @@ dependencies = [ "pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "pest_derive 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "syntect 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "templates 0.1.0", @@ -1652,8 +1652,8 @@ name = "rust-stemmers" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1725,7 +1725,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1735,17 +1735,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.66" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde_derive" -version = "1.0.66" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.14.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1754,8 +1754,9 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "indexmap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1765,7 +1766,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1803,8 +1804,8 @@ dependencies = [ "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "sass-rs 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "search 0.1.0", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", "taxonomies 0.1.0", "tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "templates 0.1.0", @@ -1818,7 +1819,7 @@ version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytecount 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cargo_metadata 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "cargo_metadata 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1857,10 +1858,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "socket2" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1885,7 +1886,7 @@ dependencies = [ "new_debug_unreachable 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "phf_shared 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)", "precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_codegen 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1924,7 +1925,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.14.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1949,7 +1950,7 @@ dependencies = [ [[package]] name = "syn" -version = "0.14.2" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1987,8 +1988,8 @@ dependencies = [ "onig 3.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "plist 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "yaml-rust 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2002,8 +2003,8 @@ dependencies = [ "content 0.1.0", "errors 0.1.0", "front_matter 0.1.0", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", @@ -2069,7 +2070,7 @@ dependencies = [ "pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "pest_derive 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2104,7 +2105,7 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2135,7 +2136,7 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-fs 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2164,8 +2165,8 @@ dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", "scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2199,7 +2200,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2208,8 +2209,8 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2222,7 +2223,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2237,7 +2238,7 @@ dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2249,7 +2250,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2271,8 +2272,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2283,7 +2284,7 @@ name = "toml" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2296,7 +2297,7 @@ dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2312,7 +2313,7 @@ dependencies = [ "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "ipconfig 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "resolv-conf 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2428,7 +2429,7 @@ name = "uuid" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2513,9 +2514,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "httparse 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2552,13 +2553,13 @@ dependencies = [ "checksum actix-web 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "e35bb192338dc7726564b0bdf2d49d43cbf4c7845231a82527f5f302bdb8f477" "checksum actix_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4b1dc922654b9aca7a8a31eab875fde804fa9fbd67f220f2e457787b23590f2" "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" -"checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4" +"checksum aho-corasick 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f0ba20154ea1f47ce2793322f049c5646cc6d0fa9759d5f333f286e507bf8080" "checksum ammonia 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fd4c682378117e4186a492b2252b9537990e1617f44aed9788b9a1149de45477" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" "checksum atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2fc4a1aa4c24c0718a250f0681885c1af91419d242f29eb8f2ab28502d80dbd1" "checksum backtrace 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "346d7644f0b5f9bc73082d3b2236b69a05fd35cce0cfa3724e184e6a5c9e2a2f" -"checksum backtrace 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dbdd17cd962b570302f5297aea8648d5923e22e555c2ed2d8b2e34eca646bf6d" +"checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a" "checksum backtrace-sys 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "bff67d0c06556c0b8e6b5f090f0eac52d950d9dfd1d35ba04e4ca3543eaf6a7e" "checksum base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96434f987501f0ed4eb336a411e0631ecd1afa11574fe148587adc4ff96143c9" "checksum base64 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7c4a342b450b268e1be8036311e2c613d7f8a7ed31214dff1cc3b60852a3168d" @@ -2574,11 +2575,11 @@ dependencies = [ "checksum byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "74c0b906e9446b0a2e4f760cdb3fa4b2c48cdc6db8766a845c54b6ff063fd2e9" "checksum bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c129aff112dcc562970abb69e2508b40850dd24c274761bb50fb8a0067ba6c27" "checksum bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7dd32989a66957d3f0cba6588f15d4281a733f4e9ffc43fcd2385f57d3bf99ff" -"checksum cargo_metadata 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "682476b87b3e22cd3820d86b26cd8603cd84ab76dce7547b2631858347aa8967" +"checksum cargo_metadata 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1efca0b863ca03ed4c109fb1c55e0bc4bbeb221d3e103d86251046b06a526bd0" "checksum cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "49ec142f5768efb5b7622aebc3fdbdbb8950a4b9ba996393cb76ef7466e8747d" -"checksum cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "405216fd8fe65f718daa7102ea808a946b6ce40c742998fbfd3463645552de18" +"checksum cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efe5c877e17a9c717a0bf3613b2709f723202c4e4675cc8f12926ded29bcb17e" "checksum chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6962c635d530328acc53ac6a955e83093fedc91c5809dfac1fa60fa470830a37" -"checksum clap 2.31.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0f16b89cbb9ee36d87483dc939fe9f1e13c05898d56d7b230a0d4dff033a536" +"checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e" "checksum cmake 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "95470235c31c726d72bf2e1f421adc1e65b9d561bf5529612cbe1a72da1467b3" "checksum color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbbb57365263e881e805dc77d94697c9118fd94d8da011240555aa7b23445bd" "checksum cookie 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "746858cae4eae40fff37e1998320068df317bc247dc91a67c6cfa053afdc2abb" @@ -2629,12 +2630,12 @@ dependencies = [ "checksum html5ever 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b04478cf718862650a0bf66acaf8f2f8c906fbc703f35c916c1f4211b069a364" "checksum http 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "4fbced8864b04c030eebcb7d0dc3a81ba5231ac559f5116a29a8ba83ecee22cd" "checksum http-range 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f2e4003e6fd05ea9109db00415e670b11f511a42e567ff2d5d771cbdfa24e02" -"checksum httparse 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "23801d98b42eed0318e5709b0527894ba7c3793d0236814618d6a9b6224152ff" +"checksum httparse 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7b6288d7db100340ca12873fd4d08ad1b8f206a9457798dfb17c018a33fee540" "checksum humansize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6cab2627acfc432780848602f3f558f7e9dd427352224b0d9324025796d2a5e" "checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d" "checksum image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebdff791af04e30089bde8ad2a632b86af433b40c04db8d70ad4b21487db7a6a" "checksum indexmap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08173ba1e906efb6538785a8844dd496f5d34f0a2d88038e95195172fc667220" -"checksum inflate 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4ec18d981200fd14e65ee8e35fb60ed1ce55227a02407303f3a72517c6146dcc" +"checksum inflate 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6f53b811ee8e2057ccf9643ca6b4277de90efaf5e61e55fd5254576926bb4245" "checksum inotify 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887fcc180136e77a85e6a6128579a719027b1bab9b1c38ea4444244fe262c20c" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" "checksum ipconfig 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9ec4e18c0a0d4340870c14284293632d8421f419008371422dd327892b88877c" @@ -2649,7 +2650,7 @@ dependencies = [ "checksum linked-hash-map 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7860ec297f7008ff7a1e3382d7f7e1dcd69efc94751a2284bafc3d013c2aa939" "checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" -"checksum log 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6fddaa003a65722a7fb9e26b0ce95921fe4ba590542ced664d8ce2fa26f9f3ac" +"checksum log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "61bd98ae7f7b754bc53dca7d44b604f733c6bba044ea6f41bc8d89272d8161d2" "checksum lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4d06ff7ff06f729ce5f4e227876cb88d10bc59cd4ae1e09fbb2bde15c850dc21" "checksum lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084" "checksum mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" @@ -2658,15 +2659,15 @@ dependencies = [ "checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376" "checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" -"checksum mime 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0b28683d0b09bbc20be1c9b3f6f24854efb1356ffcffee08ea3f6e65596e85fa" -"checksum mime_guess 2.0.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)" = "130ea3c9c1b65dba905ab5a4d9ac59234a9585c24d135f264e187fe7336febbd" +"checksum mime 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "fe51c8699d2dc522bf8c1ebe26ea2193d151fb54bcdfd7d0318750c189994cd9" +"checksum mime_guess 2.0.0-alpha.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a78b5e2283080d5a8ba68216171b4fe34f6ccdd909bb29be16ce8a9a831341" "checksum miniz-sys 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "609ce024854aeb19a0ef7567d348aaa5a746b32fb72e336df7fcc16869d7e2b4" "checksum mio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a637d1ca14eacae06296a008fa7ad955347e34efcb5891cfd8ba05491a37907e" -"checksum mio 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "6d771e3ef92d58a8da8df7d6976bfca9371ed1de6619d9d5a5ce5b1f29b85bfe" +"checksum mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)" = "4fcfcb32d63961fb6f367bfd5d21e4600b92cd310f71f9dca25acae196eb1560" "checksum mio-uds 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "84c7b5caa3a118a6e34dbac36504503b1e8dc5835e833306b9d6af0e05929f79" "checksum miow 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3e690c5df6b2f60acd45d56378981e827ff8295562fc8d34f573deb267a59cd1" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" -"checksum net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)" = "9044faf1413a1057267be51b5afba8eb1090bd2231c693664aa1db716fe1eae0" +"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" "checksum new_debug_unreachable 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0cdc457076c78ab54d5e0d6fa7c47981757f1e34dc39ff92787f217dede586c4" "checksum nix 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fd5681d13fda646462cfbd4e5f2051279a89a544d50eb98c365b507246839f" "checksum nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d37e713a259ff641624b6cb20e3b12b2952313ba36b6823c0f16e6cfd9e5de17" @@ -2729,8 +2730,8 @@ dependencies = [ "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)" = "e9a2d9a9ac5120e0f768801ca2b58ad6eec929dc9d1d616c162f208869c2ce95" -"checksum serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)" = "0a90213fa7e0f5eac3f7afe2d5ff6b088af515052cc7303bd68c7e3b91a3fb79" +"checksum serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)" = "210e5a3b159c566d7527e9b22e44be73f2e0fcc330bb78fef4dbccb56d2e74c8" +"checksum serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)" = "dd724d68017ae3a7e63600ee4b2fdb3cad2158ffd1821d44aff4580f63e2b593" "checksum serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)" = "84b8035cabe9b35878adec8ac5fe03d5f6bc97ff6edd7ccb96b44c1276ba390e" "checksum serde_urlencoded 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e703cef904312097cfceab9ce131ff6bbe09e8c964a0703345a5f49238757bc1" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" @@ -2742,7 +2743,7 @@ dependencies = [ "checksum slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fdeff4cd9ecff59ec7e3744cbca73dfe5ac35c2aedb2cfba8a1c715a18912e9d" "checksum slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "797bcb4d24e91239a8615415814f4afb2d8ca400c472de3c73f803a5a7689e11" "checksum smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "312a7df010092e73d6bbaf141957e868d4f30efd2bfd9bb1028ad91abec58514" -"checksum socket2 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "06dc9f86ee48652b7c80f3d254e3b9accb67a928c562c64d10d7b016d3d98dab" +"checksum socket2 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "962a516af4d3a7c272cb3a1d50a8cc4e5b41802e4ad54cfb7bee8ba61d37d703" "checksum stable_deref_trait 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ffbc596e092fe5f598b12ef46cc03754085ac2f4d8c739ad61c4ae266cc3b3fa" "checksum string 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "31f98b200e7caca9efca50fc0aa69cd58a5ec81d5f6e75b2f3ecaad2e998972a" "checksum string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25d70109977172b127fe834e5449e5ab1740b9ba49fa18a2020f509174f25423" @@ -2753,7 +2754,7 @@ dependencies = [ "checksum strum_macros 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1292d85e688e4696ecb69b2db2648994fb8af266974e89be53cefdf003861a5d" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" "checksum syn 0.13.11 (registry+https://github.com/rust-lang/crates.io-index)" = "14f9bf6292f3a61d2c716723fdb789a41bbe104168e6f496dc6497e531ea1b9b" -"checksum syn 0.14.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c67da57e61ebc7b7b6fff56bb34440ca3a83db037320b0507af4c10368deda7d" +"checksum syn 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)" = "2beff8ebc3658f07512a413866875adddd20f4fd47b2a4e6c9da65cd281baaea" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" "checksum synstructure 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a761d12e6d8dcb4dcf952a7a89b475e3a9d69e4a69307e01a470977642914bd" "checksum syntect 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc8a6f0db88d4afc340522c20d260411e746b2225b257c6b238a75de9d7cec78" @@ -2764,7 +2765,7 @@ dependencies = [ "checksum term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1" "checksum term-painter 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "dcaa948f0e3e38470cd8dc8dcfe561a75c9e43f28075bb183845be2b9b3c08cf" "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" -"checksum textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0b59b6b4b44d867f1370ef1bd91bfb262bf07bf0ae65c202ea2fbc16153b693" +"checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" "checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963" "checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b" "checksum tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8ee337e5f4e501fc32966fec6fe0ca0cc1c237b0b1b14a335f8bfe3c5f06e286" diff --git a/components/rendering/Cargo.toml b/components/rendering/Cargo.toml index 029c5056..c3c2e97d 100644 --- a/components/rendering/Cargo.toml +++ b/components/rendering/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Vincent Prouillet "] [dependencies] -tera = "0.11" +tera = { version = "0.11", features = ["preserve_order"] } syntect = "2" pulldown-cmark = "0" slug = "0.1" @@ -21,3 +21,4 @@ config = { path = "../config" } [dev-dependencies] templates = { path = "../templates" } + diff --git a/components/site/src/lib.rs b/components/site/src/lib.rs index b217795a..3109f5db 100644 --- a/components/site/src/lib.rs +++ b/components/site/src/lib.rs @@ -664,9 +664,11 @@ impl Site { /// Renders 404.html pub fn render_404(&self) -> Result<()> { ensure_directory_exists(&self.output_path)?; + let mut context = Context::new(); + context.insert("config", &self.config); create_file( &self.output_path.join("404.html"), - &render_template("404.html", &self.tera, &Context::new(), &self.config.theme)? + &render_template("404.html", &self.tera, &context, &self.config.theme)? ) } diff --git a/docs/content/documentation/templates/404.md b/docs/content/documentation/templates/404.md new file mode 100644 index 00000000..8a55b800 --- /dev/null +++ b/docs/content/documentation/templates/404.md @@ -0,0 +1,8 @@ ++++ +title = "404 error page" +weight = 80 ++++ + +Gutenberg will look for a `404.html` file in the `templates` directory or +use the built-in one. The default template is very basic and gets a simple +variable in the context: the site `config`. From b03b9c1ad47535ce3c6d6d41449d4926686c104a Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Thu, 12 Jul 2018 22:49:18 +0200 Subject: [PATCH 43/74] Use no features of actix-web --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 7f8e099c..c8bd18fd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,7 +25,7 @@ term-painter = "0.2" url = "1.5" # Below is for the serve cmd actix = "~0.5" -actix-web = "~0.6" +actix-web = { version = "~0.6", features = [] } notify = "4" ws = "0.7" ctrlc = "3" From f7454708a7e3a81b215e420a80191e03360e1a76 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Thu, 12 Jul 2018 23:23:14 +0200 Subject: [PATCH 44/74] Disable actix-web features for real --- Cargo.lock | 68 ------------------------------------------------------ Cargo.toml | 2 +- 2 files changed, 1 insertion(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index af26aef0..15d46e13 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -28,13 +28,11 @@ dependencies = [ "actix 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", "base64 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "brotli2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "cookie 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "flate2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "h2 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -164,15 +162,6 @@ dependencies = [ "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "base64" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "base64" version = "0.8.0" @@ -220,24 +209,6 @@ name = "bitflags" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "brotli-sys" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "brotli2" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "brotli-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "bytecount" version = "0.3.1" @@ -358,8 +329,6 @@ name = "cookie" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -946,11 +915,6 @@ name = "language-tags" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "lazy_static" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "lazy_static" version = "1.0.1" @@ -1498,14 +1462,6 @@ dependencies = [ "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "rayon" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "rayon" version = "1.0.1" @@ -1635,18 +1591,6 @@ dependencies = [ "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "ring" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "rust-stemmers" version = "1.0.2" @@ -2387,11 +2331,6 @@ dependencies = [ "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "untrusted" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "url" version = "1.7.0" @@ -2561,7 +2500,6 @@ dependencies = [ "checksum backtrace 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "346d7644f0b5f9bc73082d3b2236b69a05fd35cce0cfa3724e184e6a5c9e2a2f" "checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a" "checksum backtrace-sys 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "bff67d0c06556c0b8e6b5f090f0eac52d950d9dfd1d35ba04e4ca3543eaf6a7e" -"checksum base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96434f987501f0ed4eb336a411e0631ecd1afa11574fe148587adc4ff96143c9" "checksum base64 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7c4a342b450b268e1be8036311e2c613d7f8a7ed31214dff1cc3b60852a3168d" "checksum base64 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "85415d2594767338a74a30c1d370b2f3262ec1b4ed2d7bba5b3faf4de40467d9" "checksum bincode 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9f2fb9e29e72fd6bc12071533d5dc7664cb01480c59406f656d7ac25c7bd8ff7" @@ -2569,8 +2507,6 @@ dependencies = [ "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" "checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" "checksum bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c54bb8f454c567f21197eefcdbf5679d0bd99f2ddbe52e84c77061952e6789" -"checksum brotli-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4445dea95f4c2b41cde57cc9fee236ae4dbae88d8fcbdb4750fc1bb5d86aaecd" -"checksum brotli2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0cb036c3eade309815c15ddbacec5b22c4d1f3983a774ab2eac2e3e9ea85568e" "checksum bytecount 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "882585cd7ec84e902472df34a5e01891202db3bf62614e1f0afe459c1afcf744" "checksum byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "74c0b906e9446b0a2e4f760cdb3fa4b2c48cdc6db8766a845c54b6ff063fd2e9" "checksum bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c129aff112dcc562970abb69e2508b40850dd24c274761bb50fb8a0067ba6c27" @@ -2643,7 +2579,6 @@ dependencies = [ "checksum jpeg-decoder 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "c8b7d43206b34b3f94ea9445174bda196e772049b9bddbc620c9d29b2d20110d" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" -"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" "checksum lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e6412c5e2ad9584b0b8e979393122026cdd6d2a80b933f890dcd694ddbe73739" "checksum lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a6f08839bc70ef4a3fe1d566d5350f519c5912ea86be0df1740a7d247c7fc0ef" "checksum libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "b685088df2b950fccadf07a7187c8ef846a959c142338a48f9dc0b94517eb5f1" @@ -2706,7 +2641,6 @@ dependencies = [ "checksum quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e44651a0dc4cdd99f71c83b561e221f714912d11af1a4dff0631f923d53af035" "checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" -"checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8" "checksum rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80e811e76f1dbf68abf87a759083d34600017fc4e10b6bd5ad84a700f9dba4b1" "checksum rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d24ad214285a7729b174ed6d3bcfcb80177807f959d95fafd5bfc5c4f201ac8" "checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" @@ -2718,7 +2652,6 @@ dependencies = [ "checksum regex-syntax 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05b06a75f5217880fc5e905952a42750bf44787e56a6c6d6852ed0992f5e1d54" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" "checksum resolv-conf 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c62bd95a41841efdf7fca2ae9951e64a8d8eae7e5da196d8ce489a2241491a92" -"checksum ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f7d28b30a72c01b458428e0ae988d4149c20d902346902be881e3edc4bb325c" "checksum rust-stemmers 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fbf06149ec391025664a5634200ced1afb489f0f3f8a140d515ebc0eb04b4bc0" "checksum rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "76d7ba1feafada44f2d38eed812bd2489a03c0f5abb975799251518b68848649" "checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f" @@ -2794,7 +2727,6 @@ dependencies = [ "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unidecode 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "402bb19d8e03f1d1a7450e2bd613980869438e0666331be3e073089124aa1adc" "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -"checksum untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f392d7819dbe58833e26872f5f6f0d68b7bbbe90fc3667e98731c4a15ad9a7ae" "checksum url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f808aadd8cfec6ef90e4a14eb46f24511824d1ac596b9682703c87056c8678b7" "checksum utf-8 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f1262dfab4c30d5cb7c07026be00ee343a6cf5027fdc0104a9160f354e5db75c" "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" diff --git a/Cargo.toml b/Cargo.toml index c8bd18fd..9adabaa4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,7 +25,7 @@ term-painter = "0.2" url = "1.5" # Below is for the serve cmd actix = "~0.5" -actix-web = { version = "~0.6", features = [] } +actix-web = { version = "~0.6", default-features = false, features = [] } notify = "4" ws = "0.7" ctrlc = "3" From 1ae0702494e45d90c55a8f3734c218551e22f34d Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Mon, 16 Jul 2018 10:54:05 +0200 Subject: [PATCH 45/74] Custom taxonomies (#330) --- CHANGELOG.md | 7 + Cargo.lock | 274 +++++++++--------- components/config/src/lib.rs | 43 ++- components/content/src/page.rs | 5 +- components/front_matter/src/page.rs | 65 ++--- components/imageproc/src/lib.rs | 9 + components/pagination/Cargo.toml | 1 + components/pagination/src/lib.rs | 144 +++++++-- components/rebuild/src/lib.rs | 69 ++--- components/site/src/lib.rs | 158 +++++----- components/site/tests/site.rs | 71 +---- components/taxonomies/src/lib.rs | 181 ++++++------ components/templates/src/builtins/rss.xml | 8 +- components/templates/src/builtins/sitemap.xml | 11 +- components/templates/src/global_fns.rs | 56 ++-- components/templates/src/lib.rs | 1 - components/utils/src/templates.rs | 4 +- docs/content/documentation/content/page.md | 9 +- .../documentation/content/tags-categories.md | 23 -- .../documentation/content/taxonomies.md | 27 ++ .../getting-started/configuration.md | 15 +- .../documentation/templates/pagination.md | 9 +- .../templates/tags-categories.md | 31 -- .../documentation/templates/taxonomies.md | 53 ++++ test_site/config.toml | 4 + test_site/templates/categories.html | 3 - test_site/templates/categories/list.html | 3 + .../{category.html => categories/single.html} | 2 +- .../{category.html => categories/single.html} | 4 +- 29 files changed, 685 insertions(+), 605 deletions(-) delete mode 100644 docs/content/documentation/content/tags-categories.md create mode 100644 docs/content/documentation/content/taxonomies.md delete mode 100644 docs/content/documentation/templates/tags-categories.md create mode 100644 docs/content/documentation/templates/taxonomies.md delete mode 100644 test_site/templates/categories.html create mode 100644 test_site/templates/categories/list.html rename test_site/templates/{category.html => categories/single.html} (54%) rename test_site/themes/sample/templates/{category.html => categories/single.html} (75%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 908aa8d1..2dd20cd0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ ## 0.4.0 (unreleased) +### Breaking + +- Taxonomies have been rewritten from scratch to allow custom ones with RSS and pagination +- `get_taxonomy_url` has been renamed to `get_taxonomy` and will now return the full taxonomy +instead of just the URL + +### Others - Fix `serve` not working with the config flag - Websocket port on `live` will not get the first available port instead of a fixed one - Rewrite markdown rendering to fix all known issues with shortcodes diff --git a/Cargo.lock b/Cargo.lock index 15d46e13..457bdb23 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-channel 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "skeptic 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -22,7 +22,7 @@ dependencies = [ [[package]] name = "actix-web" -version = "0.6.14" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "actix 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -33,25 +33,25 @@ dependencies = [ "cookie 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "h2 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "http-range 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "mime 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "mime_guess 2.0.0-alpha.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", "serde_urlencoded 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -60,8 +60,8 @@ dependencies = [ "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -72,7 +72,7 @@ dependencies = [ "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -82,7 +82,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "aho-corasick" -version = "0.6.5" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -94,11 +94,11 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "html5ever 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "maplit 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "tendril 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -158,7 +158,7 @@ name = "backtrace-sys" version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -186,7 +186,7 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -240,14 +240,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "cc" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -284,7 +284,7 @@ name = "cmake" version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -300,8 +300,8 @@ dependencies = [ "errors 0.1.0", "globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "highlighting 0.1.0", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -316,7 +316,7 @@ dependencies = [ "globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "rendering 0.1.0", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -330,7 +330,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -369,7 +369,7 @@ dependencies = [ "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -383,7 +383,7 @@ dependencies = [ "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -433,7 +433,7 @@ dependencies = [ [[package]] name = "dtoa" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -457,11 +457,11 @@ name = "elasticlunr-rs" version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "rust-stemmers 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", "strum 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "strum_macros 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -607,10 +607,10 @@ version = "0.1.0" dependencies = [ "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "errors 0.1.0", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -663,7 +663,7 @@ dependencies = [ [[package]] name = "futures" -version = "0.1.21" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -671,7 +671,7 @@ name = "futures-cpupool" version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -682,8 +682,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "getopts" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "gif" @@ -704,7 +707,7 @@ name = "globset" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -716,7 +719,7 @@ name = "gutenberg" version = "0.4.0" dependencies = [ "actix 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", - "actix-web 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-web 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "content 0.1.0", @@ -728,7 +731,7 @@ dependencies = [ "site 0.1.0", "term-painter 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", "ws 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -741,12 +744,12 @@ dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "string 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "string 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -754,7 +757,7 @@ dependencies = [ name = "highlighting" version = "0.1.0" dependencies = [ - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "syntect 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -787,7 +790,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -807,7 +810,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "idna" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -838,7 +841,7 @@ version = "0.1.0" dependencies = [ "errors 0.1.0", "image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -889,7 +892,7 @@ dependencies = [ [[package]] name = "itoa" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -917,7 +920,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "lazy_static" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -986,8 +989,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "phf 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)", "phf_codegen 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_codegen 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1022,7 +1025,7 @@ dependencies = [ [[package]] name = "mime_guess" -version = "2.0.0-alpha.5" +version = "2.0.0-alpha.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "mime 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1036,7 +1039,7 @@ name = "miniz-sys" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1152,7 +1155,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1236,7 +1239,7 @@ version = "3.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "onig_sys 68.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1277,8 +1280,9 @@ dependencies = [ "content 0.1.0", "errors 0.1.0", "front_matter 0.1.0", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", + "taxonomies 0.1.0", "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -1371,7 +1375,7 @@ dependencies = [ "base64 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1413,7 +1417,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)", + "getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1477,7 +1481,7 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1514,7 +1518,7 @@ name = "regex" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1526,7 +1530,7 @@ name = "regex" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex-syntax 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1573,8 +1577,8 @@ dependencies = [ "pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "pest_derive 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "syntect 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "templates 0.1.0", @@ -1596,8 +1600,8 @@ name = "rust-stemmers" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1660,7 +1664,7 @@ dependencies = [ "content 0.1.0", "elasticlunr-rs 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "errors 0.1.0", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1669,7 +1673,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1679,12 +1683,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde_derive" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1697,10 +1701,10 @@ name = "serde_json" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1708,10 +1712,10 @@ name = "serde_urlencoded" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1748,8 +1752,8 @@ dependencies = [ "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "sass-rs 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "search 0.1.0", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "taxonomies 0.1.0", "tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "templates 0.1.0", @@ -1818,7 +1822,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "string" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1826,11 +1830,11 @@ name = "string_cache" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "new_debug_unreachable 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "phf_shared 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)", "precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_codegen 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1928,12 +1932,12 @@ dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "onig 3.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "plist 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "yaml-rust 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1947,8 +1951,8 @@ dependencies = [ "content 0.1.0", "errors 0.1.0", "front_matter 0.1.0", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", @@ -1984,7 +1988,7 @@ dependencies = [ "content 0.1.0", "errors 0.1.0", "imageproc 0.1.0", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "taxonomies 0.1.0", "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2010,14 +2014,14 @@ dependencies = [ "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "humansize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "pest_derive 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2060,7 +2064,7 @@ name = "thread_local" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2079,14 +2083,14 @@ name = "tokio" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-fs 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-fs 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-udp 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2097,7 +2101,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2107,7 +2111,7 @@ version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2124,17 +2128,17 @@ name = "tokio-executor" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-fs" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-threadpool 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2143,7 +2147,7 @@ version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2152,7 +2156,7 @@ name = "tokio-reactor" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2165,7 +2169,7 @@ name = "tokio-signal" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2180,7 +2184,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2189,11 +2193,11 @@ dependencies = [ [[package]] name = "tokio-threadpool" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2205,7 +2209,7 @@ name = "tokio-timer" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2215,7 +2219,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2228,7 +2232,7 @@ name = "toml" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2238,14 +2242,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", - "idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", + "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2254,9 +2258,9 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "error-chain 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", - "futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "ipconfig 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "resolv-conf 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2274,7 +2278,7 @@ name = "unicase" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2282,7 +2286,7 @@ name = "unicase" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2333,11 +2337,11 @@ dependencies = [ [[package]] name = "url" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2379,7 +2383,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "version_check" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2459,7 +2463,7 @@ dependencies = [ "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2489,10 +2493,10 @@ dependencies = [ [metadata] "checksum actix 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7f0b2daad36916ccd2b162dbc5a04a74df642a29391b1a341c8ee3e82026cb16" -"checksum actix-web 0.6.14 (registry+https://github.com/rust-lang/crates.io-index)" = "e35bb192338dc7726564b0bdf2d49d43cbf4c7845231a82527f5f302bdb8f477" +"checksum actix-web 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)" = "cebfb353ebcae66f93c190b80ef12b8c82557413856e3e65dbaab662a48ec72d" "checksum actix_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4b1dc922654b9aca7a8a31eab875fde804fa9fbd67f220f2e457787b23590f2" "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" -"checksum aho-corasick 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f0ba20154ea1f47ce2793322f049c5646cc6d0fa9759d5f333f286e507bf8080" +"checksum aho-corasick 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c6d463cbe7ed28720b5b489e7c083eeb8f90d08be2a0d6bb9e1ffea9ce1afa" "checksum ammonia 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fd4c682378117e4186a492b2252b9537990e1617f44aed9788b9a1149de45477" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" @@ -2512,7 +2516,7 @@ dependencies = [ "checksum bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c129aff112dcc562970abb69e2508b40850dd24c274761bb50fb8a0067ba6c27" "checksum bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7dd32989a66957d3f0cba6588f15d4281a733f4e9ffc43fcd2385f57d3bf99ff" "checksum cargo_metadata 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1efca0b863ca03ed4c109fb1c55e0bc4bbeb221d3e103d86251046b06a526bd0" -"checksum cc 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "49ec142f5768efb5b7622aebc3fdbdbb8950a4b9ba996393cb76ef7466e8747d" +"checksum cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "2119ea4867bd2b8ed3aecab467709720b2d55b1bcfe09f772fd68066eaf15275" "checksum cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efe5c877e17a9c717a0bf3613b2709f723202c4e4675cc8f12926ded29bcb17e" "checksum chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6962c635d530328acc53ac6a955e83093fedc91c5809dfac1fa60fa470830a37" "checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e" @@ -2529,7 +2533,7 @@ dependencies = [ "checksum ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "630391922b1b893692c6334369ff528dcc3a9d8061ccf4c803aa8f83cb13db5e" "checksum dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97590ba53bcb8ac28279161ca943a924d1fd4a8fb3fa63302591647c4fc5b850" "checksum deflate 0.7.18 (registry+https://github.com/rust-lang/crates.io-index)" = "32c8120d981901a9970a3a1c97cf8b630e0fa8c3ca31e75b6fd6fd5f9f427b31" -"checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab" +"checksum dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d301140eb411af13d3115f9a562c85cc6b541ade9dfa314132244aaee7489dd" "checksum duct 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "166298c17c5b4fe5997b962c2f22e887c7c5adc44308eb9103ce5b66af45a423" "checksum either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be565ca5c557d7f59e7cfcf1844f9e3033650c929c6566f511e8005f205c1d0" "checksum elasticlunr-rs 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4837d77a1e157489a3933b743fd774ae75074e0e390b2b7f071530048a0d87ee" @@ -2554,10 +2558,10 @@ dependencies = [ "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" "checksum futf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b" -"checksum futures 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "1a70b146671de62ec8c8ed572219ca5d594d9b06c0b364d5e67b722fc559b48c" +"checksum futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "884dbe32a6ae4cd7da5c6db9b78114449df9953b8d490c9d7e1b51720b922c62" "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" -"checksum getopts 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "b900c08c1939860ce8b54dc6a89e26e00c04c380fd0e09796799bd7f12861e05" +"checksum getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "0a7292d30132fb5424b354f5dc02512a86e4c516fe544bb7a25e7f266951b797" "checksum gif 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff3414b424657317e708489d2857d9575f4403698428b040b609b9d1c1a84a2c" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "checksum globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "142754da2c9b3722affd909f9e27f2a6700a7a303f362971e0a74c652005a43d" @@ -2568,18 +2572,18 @@ dependencies = [ "checksum http-range 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f2e4003e6fd05ea9109db00415e670b11f511a42e567ff2d5d771cbdfa24e02" "checksum httparse 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7b6288d7db100340ca12873fd4d08ad1b8f206a9457798dfb17c018a33fee540" "checksum humansize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6cab2627acfc432780848602f3f558f7e9dd427352224b0d9324025796d2a5e" -"checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d" +"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebdff791af04e30089bde8ad2a632b86af433b40c04db8d70ad4b21487db7a6a" "checksum indexmap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08173ba1e906efb6538785a8844dd496f5d34f0a2d88038e95195172fc667220" "checksum inflate 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6f53b811ee8e2057ccf9643ca6b4277de90efaf5e61e55fd5254576926bb4245" "checksum inotify 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887fcc180136e77a85e6a6128579a719027b1bab9b1c38ea4444244fe262c20c" "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" "checksum ipconfig 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9ec4e18c0a0d4340870c14284293632d8421f419008371422dd327892b88877c" -"checksum itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c069bbec61e1ca5a596166e55dfe4773ff745c3d16b700013bcaff9a6df2c682" +"checksum itoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5adb58558dcd1d786b5f0bd15f3226ee23486e24b7b58304b60f64dc68e62606" "checksum jpeg-decoder 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "c8b7d43206b34b3f94ea9445174bda196e772049b9bddbc620c9d29b2d20110d" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" -"checksum lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e6412c5e2ad9584b0b8e979393122026cdd6d2a80b933f890dcd694ddbe73739" +"checksum lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fb497c35d362b6a331cfd94956a07fc2c78a4604cdbee844a81170386b996dd3" "checksum lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a6f08839bc70ef4a3fe1d566d5350f519c5912ea86be0df1740a7d247c7fc0ef" "checksum libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "b685088df2b950fccadf07a7187c8ef846a959c142338a48f9dc0b94517eb5f1" "checksum linked-hash-map 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7860ec297f7008ff7a1e3382d7f7e1dcd69efc94751a2284bafc3d013c2aa939" @@ -2595,7 +2599,7 @@ dependencies = [ "checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum mime 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "fe51c8699d2dc522bf8c1ebe26ea2193d151fb54bcdfd7d0318750c189994cd9" -"checksum mime_guess 2.0.0-alpha.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d1a78b5e2283080d5a8ba68216171b4fe34f6ccdd909bb29be16ce8a9a831341" +"checksum mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30de2e4613efcba1ec63d8133f344076952090c122992a903359be5a4f99c3ed" "checksum miniz-sys 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "609ce024854aeb19a0ef7567d348aaa5a746b32fb72e336df7fcc16869d7e2b4" "checksum mio 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a637d1ca14eacae06296a008fa7ad955347e34efcb5891cfd8ba05491a37907e" "checksum mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)" = "4fcfcb32d63961fb6f367bfd5d21e4600b92cd310f71f9dca25acae196eb1560" @@ -2663,8 +2667,8 @@ dependencies = [ "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)" = "210e5a3b159c566d7527e9b22e44be73f2e0fcc330bb78fef4dbccb56d2e74c8" -"checksum serde_derive 1.0.69 (registry+https://github.com/rust-lang/crates.io-index)" = "dd724d68017ae3a7e63600ee4b2fdb3cad2158ffd1821d44aff4580f63e2b593" +"checksum serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)" = "0c3adf19c07af6d186d91dae8927b83b0553d07ca56cbf7f2f32560455c91920" +"checksum serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)" = "3525a779832b08693031b8ecfb0de81cd71cfd3812088fafe9a7496789572124" "checksum serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)" = "84b8035cabe9b35878adec8ac5fe03d5f6bc97ff6edd7ccb96b44c1276ba390e" "checksum serde_urlencoded 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e703cef904312097cfceab9ce131ff6bbe09e8c964a0703345a5f49238757bc1" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" @@ -2678,7 +2682,7 @@ dependencies = [ "checksum smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "312a7df010092e73d6bbaf141957e868d4f30efd2bfd9bb1028ad91abec58514" "checksum socket2 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "962a516af4d3a7c272cb3a1d50a8cc4e5b41802e4ad54cfb7bee8ba61d37d703" "checksum stable_deref_trait 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ffbc596e092fe5f598b12ef46cc03754085ac2f4d8c739ad61c4ae266cc3b3fa" -"checksum string 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "31f98b200e7caca9efca50fc0aa69cd58a5ec81d5f6e75b2f3ecaad2e998972a" +"checksum string 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00caf261d6f90f588f8450b8e1230fa0d5be49ee6140fdfbcb55335aff350970" "checksum string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25d70109977172b127fe834e5449e5ab1740b9ba49fa18a2020f509174f25423" "checksum string_cache_codegen 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "35293b05cf1494e8ddd042a7df6756bf18d07f42d234f32e71dce8a7aabb0191" "checksum string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc" @@ -2705,12 +2709,12 @@ dependencies = [ "checksum tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "881e9645b81c2ce95fcb799ded2c29ffb9f25ef5bef909089a420e5961dd8ccb" "checksum tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "aeeffbbb94209023feaef3c196a41cbcdafa06b4a6f893f68779bb5e53796f71" "checksum tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8cac2a7883ff3567e9d66bb09100d09b33d90311feca0206c7ca034bc0c55113" -"checksum tokio-fs 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fc42bae2f6e33865b99069d95bcddfc85c9f0849b4e7e7399eeee71956ef34d7" +"checksum tokio-fs 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "40697ecbea5660df15b15d50a077386477d2f6a35002adf01ce76ff9dd9dce48" "checksum tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a5c9635ee806f26d302b8baa1e145689a280d8f5aa8d0552e7344808da54cc21" "checksum tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e00ec63bbec2c97ce1178cb0587b2c438b2f6b09d3ee54a33c45a9cf0d530810" "checksum tokio-signal 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e8f46863230f9a05cf52d173721ec391b9c5782a2465f593029922b8782b9ffe" "checksum tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ec9b094851aadd2caf83ba3ad8e8c4ce65a42104f7b94d9e6550023f0407853f" -"checksum tokio-threadpool 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c3873a6d8d0b636e024e77b9a82eaab6739578a06189ecd0e731c7308fbc5d" +"checksum tokio-threadpool 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "24ab84f574027b0e875378f31575cf175360891919e93a3490f07e76e00e4efb" "checksum tokio-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "028b94314065b90f026a21826cffd62a4e40a92cda3e5c069cc7b02e5945f5e9" "checksum tokio-udp 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "43eb534af6e8f37d43ab1b612660df14755c42bd003c5f8d2475ee78cc4600c0" "checksum toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a0263c6c02c4db6c8f7681f9fd35e90de799ebd4cfdeab77a38f4ff6b3d8c0d9" @@ -2727,12 +2731,12 @@ dependencies = [ "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unidecode 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "402bb19d8e03f1d1a7450e2bd613980869438e0666331be3e073089124aa1adc" "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -"checksum url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f808aadd8cfec6ef90e4a14eb46f24511824d1ac596b9682703c87056c8678b7" +"checksum url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2a321979c09843d272956e73700d12c4e7d3d92b2ee112b31548aef0d4efc5a6" "checksum utf-8 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f1262dfab4c30d5cb7c07026be00ee343a6cf5027fdc0104a9160f354e5db75c" "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" "checksum uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e1436e58182935dcd9ce0add9ea0b558e8a87befe01c1a301e6020aeb0876363" "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" -"checksum version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6b772017e347561807c1aa192438c5fd74242a670a6cffacc40f2defd1dc069d" +"checksum version_check 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7716c242968ee87e5542f8021178248f267f295a5c4803beae8b8b7fd9bc6051" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "63636bd0eb3d00ccb8b9036381b526efac53caf112b7783b730ab3f8e44da369" "checksum widestring 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7157704c2e12e3d2189c507b7482c52820a16dfa4465ba91add92f266667cadb" diff --git a/components/config/src/lib.rs b/components/config/src/lib.rs index 6c6951e2..00234e8a 100644 --- a/components/config/src/lib.rs +++ b/components/config/src/lib.rs @@ -28,6 +28,40 @@ use theme::Theme; static DEFAULT_BASE_URL: &'static str = "http://a-website.com"; +#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +#[serde(default)] +pub struct Taxonomy { + /// The name used in the URL, usually the plural + pub name: String, + /// If this is set, the list of individual taxonomy term page will be paginated + /// by this much + pub paginate: Option, + pub paginate_path: Option, + /// Whether to generate a RSS feed only for each taxonomy term, defaults to false + pub rss: bool, +} + +impl Taxonomy { + pub fn is_paginated(&self) -> bool { + if let Some(paginate_by) = self.paginate { + paginate_by > 0 + } else { + false + } + } +} + +impl Default for Taxonomy { + fn default() -> Taxonomy { + Taxonomy { + name: String::new(), + paginate: None, + paginate_path: None, + rss: false, + } + } +} + #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(default)] pub struct Config { @@ -56,10 +90,8 @@ pub struct Config { pub generate_rss: bool, /// The number of articles to include in the RSS feed. Defaults to 10_000 pub rss_limit: usize, - /// Whether to generate tags and individual tag pages if some pages have them. Defaults to true - pub generate_tags_pages: bool, - /// Whether to generate categories and individual tag categories if some pages have them. Defaults to true - pub generate_categories_pages: bool, + + pub taxonomies: Vec, /// Whether to compile the `sass` directory and output the css files into the static folder pub compile_sass: bool, @@ -191,8 +223,7 @@ impl Default for Config { default_language: "en".to_string(), generate_rss: false, rss_limit: 10_000, - generate_tags_pages: true, - generate_categories_pages: true, + taxonomies: Vec::new(), compile_sass: false, build_search_index: false, ignored_content: Vec::new(), diff --git a/components/content/src/page.rs b/components/content/src/page.rs index 07a2aad5..780faf23 100644 --- a/components/content/src/page.rs +++ b/components/content/src/page.rs @@ -238,7 +238,7 @@ impl Default for Page { impl ser::Serialize for Page { fn serialize(&self, serializer: S) -> StdResult where S: ser::Serializer { - let mut state = serializer.serialize_struct("page", 21)?; + let mut state = serializer.serialize_struct("page", 20)?; state.serialize_field("content", &self.content)?; state.serialize_field("title", &self.meta.title)?; state.serialize_field("description", &self.meta.description)?; @@ -258,8 +258,7 @@ impl ser::Serialize for Page { state.serialize_field("components", &self.components)?; state.serialize_field("permalink", &self.permalink)?; state.serialize_field("summary", &self.summary)?; - state.serialize_field("tags", &self.meta.tags)?; - state.serialize_field("category", &self.meta.category)?; + state.serialize_field("taxonomies", &self.meta.taxonomies)?; state.serialize_field("extra", &self.meta.extra)?; let (word_count, reading_time) = get_reading_analytics(&self.raw_content); state.serialize_field("word_count", &word_count)?; diff --git a/components/front_matter/src/page.rs b/components/front_matter/src/page.rs index 0b33a3a2..afbfc5b5 100644 --- a/components/front_matter/src/page.rs +++ b/components/front_matter/src/page.rs @@ -1,3 +1,4 @@ +use std::collections::HashMap; use std::result::{Result as StdResult}; use chrono::prelude::*; @@ -80,10 +81,7 @@ pub struct PageFrontMatter { /// otherwise is set after parsing front matter and sections /// Can't be an empty string if present pub path: Option, - /// Tags, not to be confused with categories - pub tags: Option>, - /// Only one category allowed. Can't be an empty string if present - pub category: Option, + pub taxonomies: HashMap>, /// Integer to use to order content. Lowest is at the bottom, highest first pub order: Option, /// Integer to use to order content. Highest is at the bottom, lowest first @@ -122,12 +120,6 @@ impl PageFrontMatter { } } - if let Some(ref category) = f.category { - if category == "" { - bail!("`category` can't be empty if present") - } - } - f.extra = match fix_toml_dates(f.extra) { Value::Object(o) => o, _ => unreachable!("Got something other than a table in page extra"), @@ -155,13 +147,6 @@ impl PageFrontMatter { pub fn weight(&self) -> usize { self.weight.unwrap() } - - pub fn has_tags(&self) -> bool { - match self.tags { - Some(ref t) => !t.is_empty(), - None => false - } - } } impl Default for PageFrontMatter { @@ -173,8 +158,7 @@ impl Default for PageFrontMatter { draft: false, slug: None, path: None, - tags: None, - category: None, + taxonomies: HashMap::new(), order: None, weight: None, aliases: Vec::new(), @@ -211,21 +195,6 @@ mod tests { assert_eq!(res.description.unwrap(), "hey there".to_string()) } - #[test] - fn can_parse_tags() { - let content = r#" - title = "Hello" - description = "hey there" - slug = "hello-world" - tags = ["rust", "html"]"#; - let res = PageFrontMatter::parse(content); - assert!(res.is_ok()); - let res = res.unwrap(); - - assert_eq!(res.title.unwrap(), "Hello".to_string()); - assert_eq!(res.slug.unwrap(), "hello-world".to_string()); - assert_eq!(res.tags.unwrap(), ["rust".to_string(), "html".to_string()]); - } #[test] fn errors_with_invalid_front_matter() { @@ -234,17 +203,6 @@ mod tests { assert!(res.is_err()); } - #[test] - fn errors_on_non_string_tag() { - let content = r#" - title = "Hello" - description = "hey there" - slug = "hello-world" - tags = ["rust", 1]"#; - let res = PageFrontMatter::parse(content); - assert!(res.is_err()); - } - #[test] fn errors_on_present_but_empty_slug() { let content = r#" @@ -344,4 +302,21 @@ mod tests { assert!(res.is_ok()); assert_eq!(res.unwrap().extra["something"]["some-date"], to_value("2002-14-01").unwrap()); } + + #[test] + fn can_parse_taxonomies() { + let content = r#" +title = "Hello World" + +[taxonomies] +tags = ["Rust", "JavaScript"] +categories = ["Dev"] +"#; + let res = PageFrontMatter::parse(content); + println!("{:?}", res); + assert!(res.is_ok()); + let res2 = res.unwrap(); + assert_eq!(res2.taxonomies["categories"], vec!["Dev"]); + assert_eq!(res2.taxonomies["tags"], vec!["Rust", "JavaScript"]); + } } diff --git a/components/imageproc/src/lib.rs b/components/imageproc/src/lib.rs index 19316849..bbf0e7ee 100644 --- a/components/imageproc/src/lib.rs +++ b/components/imageproc/src/lib.rs @@ -328,6 +328,11 @@ impl Processor { } pub fn prune(&self) -> Result<()> { + // Do not create folders if they don't exist + if !self.resized_path.exists() { + return Ok(()); + } + ufs::ensure_directory_exists(&self.resized_path)?; let entries = fs::read_dir(&self.resized_path)?; for entry in entries { @@ -350,6 +355,10 @@ impl Processor { } pub fn do_process(&mut self) -> Result<()> { + if !self.img_ops.is_empty() { + ufs::ensure_directory_exists(&self.resized_path)?; + } + self.img_ops.par_iter().map(|(hash, op)| { let target = self.resized_path.join(Self::op_filename(*hash, op.collision_id)); op.perform(&self.content_path, &target) diff --git a/components/pagination/Cargo.toml b/components/pagination/Cargo.toml index 0ee865f8..7fed69cb 100644 --- a/components/pagination/Cargo.toml +++ b/components/pagination/Cargo.toml @@ -12,6 +12,7 @@ errors = { path = "../errors" } config = { path = "../config" } content = { path = "../content" } utils = { path = "../utils" } +taxonomies = { path = "../taxonomies" } [dev-dependencies] front_matter = { path = "../front_matter" } diff --git a/components/pagination/src/lib.rs b/components/pagination/src/lib.rs index 42724c08..dc0c1404 100644 --- a/components/pagination/src/lib.rs +++ b/components/pagination/src/lib.rs @@ -6,6 +6,7 @@ extern crate errors; extern crate config; extern crate content; extern crate utils; +extern crate taxonomies; #[cfg(test)] extern crate front_matter; @@ -18,6 +19,14 @@ use errors::{Result, ResultExt}; use config::Config; use content::{Page, Section}; use utils::templates::render_template; +use taxonomies::{Taxonomy, TaxonomyItem}; + + +#[derive(Clone, Debug, PartialEq)] +enum PaginationRoot<'a> { + Section(&'a Section), + Taxonomy(&'a Taxonomy), +} /// A list of all the pages in the paginator with their index and links @@ -63,22 +72,62 @@ pub struct Paginator<'a> { pub pagers: Vec>, /// How many content pages on a paginated page at max paginate_by: usize, - /// The section struct we're building the paginator for - section: &'a Section, + /// The thing we are creating the paginator for: section or taxonomy + root: PaginationRoot<'a>, + // Those below can be obtained from the root but it would make the code more complex than needed + pub permalink: String, + path: String, + pub paginate_path: String, + is_index: bool, } impl<'a> Paginator<'a> { - /// Create a new paginator + /// Create a new paginator from a section /// It will always at least create one pager (the first) even if there are no pages to paginate - pub fn new(all_pages: &'a [Page], section: &'a Section) -> Paginator<'a> { + pub fn from_section(all_pages: &'a [Page], section: &'a Section) -> Paginator<'a> { let paginate_by = section.meta.paginate_by.unwrap(); + let mut paginator = Paginator { + all_pages, + pagers: vec![], + paginate_by, + root: PaginationRoot::Section(section), + permalink: section.permalink.clone(), + path: section.path.clone(), + paginate_path: section.meta.paginate_path.clone(), + is_index: section.is_index(), + }; + + paginator.fill_pagers(); + paginator + } + + /// Create a new paginator from a taxonomy + /// It will always at least create one pager (the first) even if there are no pages to paginate + pub fn from_taxonomy(taxonomy: &'a Taxonomy, item: &'a TaxonomyItem) -> Paginator<'a> { + let paginate_by = taxonomy.kind.paginate.unwrap(); + let mut paginator = Paginator { + all_pages: &item.pages, + pagers: vec![], + paginate_by, + root: PaginationRoot::Taxonomy(taxonomy), + permalink: item.permalink.clone(), + path: format!("{}/{}", taxonomy.kind.name, item.slug), + paginate_path: taxonomy.kind.paginate_path.clone().unwrap_or_else(|| "pages".to_string()), + is_index: false, + }; + + paginator.fill_pagers(); + paginator + } + + fn fill_pagers(&mut self) { let mut pages = vec![]; let mut current_page = vec![]; - for page in all_pages { + for page in self.all_pages { current_page.push(page); - if current_page.len() == paginate_by { + if current_page.len() == self.paginate_by { pages.push(current_page); current_page = vec![]; } @@ -91,17 +140,23 @@ impl<'a> Paginator<'a> { for (index, page) in pages.iter().enumerate() { // First page has no pagination path if index == 0 { - pagers.push(Pager::new(1, page.clone(), section.permalink.clone(), section.path.clone())); + pagers.push(Pager::new(1, page.clone(), self.permalink.clone(), self.path.clone())); continue; } - let page_path = format!("{}/{}/", section.meta.paginate_path, index + 1); - let permalink = format!("{}{}", section.permalink, page_path); - let pager_path = if section.is_index() { + let page_path = format!("{}/{}/", self.paginate_path, index + 1); + let permalink = format!("{}{}", self.permalink, page_path); + + let pager_path = if self.is_index { page_path } else { - format!("{}{}", section.path, page_path) + if self.path.ends_with("/") { + format!("{}{}", self.path, page_path) + } else { + format!("{}/{}", self.path, page_path) + } }; + pagers.push(Pager::new( index + 1, page.clone(), @@ -112,15 +167,10 @@ impl<'a> Paginator<'a> { // We always have the index one at least if pagers.is_empty() { - pagers.push(Pager::new(1, vec![], section.permalink.clone(), section.path.clone())); + pagers.push(Pager::new(1, vec![], self.permalink.clone(), self.path.clone())); } - Paginator { - all_pages, - pagers, - paginate_by, - section, - } + self.pagers = pagers; } pub fn build_paginator_context(&self, current_pager: &Pager) -> HashMap<&str, Value> { @@ -130,7 +180,7 @@ impl<'a> Paginator<'a> { // Global variables paginator.insert("paginate_by", to_value(self.paginate_by).unwrap()); - paginator.insert("first", to_value(&self.section.permalink).unwrap()); + paginator.insert("first", to_value(&self.permalink).unwrap()); let last_pager = &self.pagers[self.pagers.len() - 1]; paginator.insert("last", to_value(&last_pager.permalink).unwrap()); paginator.insert( @@ -163,13 +213,22 @@ impl<'a> Paginator<'a> { pub fn render_pager(&self, pager: &Pager, config: &Config, tera: &Tera) -> Result { let mut context = Context::new(); context.add("config", &config); - context.add("section", self.section); + let template_name = match self.root { + PaginationRoot::Section(s) => { + context.add("section", &s); + s.get_template_name() + }, + PaginationRoot::Taxonomy(t) => { + context.add("taxonomy", &t.kind); + format!("{}/single.html", t.kind.name) + }, + }; context.add("current_url", &pager.permalink); context.add("current_path", &pager.path); context.add("paginator", &self.build_paginator_context(pager)); - render_template(&self.section.get_template_name(), tera, &context, &config.theme) - .chain_err(|| format!("Failed to render pager {} of section '{}'", pager.index, self.section.file.path.display())) + render_template(&template_name, tera, &context, &config.theme) + .chain_err(|| format!("Failed to render pager {}", pager.index)) } } @@ -179,6 +238,8 @@ mod tests { use front_matter::SectionFrontMatter; use content::{Page, Section}; + use config::{Taxonomy as TaxonomyConfig}; + use taxonomies::{Taxonomy, TaxonomyItem}; use super::Paginator; @@ -205,7 +266,7 @@ mod tests { Page::default(), ]; let section = create_section(false); - let paginator = Paginator::new(pages.as_slice(), §ion); + let paginator = Paginator::from_section(pages.as_slice(), §ion); assert_eq!(paginator.pagers.len(), 2); assert_eq!(paginator.pagers[0].index, 1); @@ -227,7 +288,7 @@ mod tests { Page::default(), ]; let section = create_section(true); - let paginator = Paginator::new(pages.as_slice(), §ion); + let paginator = Paginator::from_section(pages.as_slice(), §ion); assert_eq!(paginator.pagers.len(), 2); assert_eq!(paginator.pagers[0].index, 1); @@ -249,7 +310,7 @@ mod tests { Page::default(), ]; let section = create_section(false); - let paginator = Paginator::new(pages.as_slice(), §ion); + let paginator = Paginator::from_section(pages.as_slice(), §ion); assert_eq!(paginator.pagers.len(), 2); let context = paginator.build_paginator_context(&paginator.pagers[0]); @@ -268,4 +329,37 @@ mod tests { assert_eq!(context["previous"], to_value("https://vincent.is/posts/").unwrap()); assert_eq!(context["current_index"], to_value(2).unwrap()); } + + #[test] + fn test_can_create_paginator_for_taxonomy() { + let pages = vec![ + Page::default(), + Page::default(), + Page::default(), + ]; + let taxonomy_def = TaxonomyConfig { + name: "tags".to_string(), + paginate: Some(2), + ..TaxonomyConfig::default() + }; + let taxonomy_item = TaxonomyItem { + name: "Something".to_string(), + slug: "something".to_string(), + permalink: "https://vincent.is/tags/something/".to_string(), + pages, + }; + let taxonomy = Taxonomy {kind: taxonomy_def, items: vec![taxonomy_item.clone()]}; + let paginator = Paginator::from_taxonomy(&taxonomy, &taxonomy_item); + assert_eq!(paginator.pagers.len(), 2); + + assert_eq!(paginator.pagers[0].index, 1); + assert_eq!(paginator.pagers[0].pages.len(), 2); + assert_eq!(paginator.pagers[0].permalink, "https://vincent.is/tags/something/"); + assert_eq!(paginator.pagers[0].path, "tags/something"); + + assert_eq!(paginator.pagers[1].index, 2); + assert_eq!(paginator.pagers[1].pages.len(), 1); + assert_eq!(paginator.pagers[1].permalink, "https://vincent.is/tags/something/pages/2/"); + assert_eq!(paginator.pagers[1].path, "tags/something/pages/2/"); + } } diff --git a/components/rebuild/src/lib.rs b/components/rebuild/src/lib.rs index fac94802..675388a0 100644 --- a/components/rebuild/src/lib.rs +++ b/components/rebuild/src/lib.rs @@ -26,10 +26,8 @@ pub fn find_parent_section<'a>(site: &'a Site, page: &Page) -> Option<&'a Sectio #[derive(Debug, Clone, Copy, PartialEq)] pub enum PageChangesNeeded { - /// Editing `tags` - Tags, - /// Editing `categories` - Categories, + /// Editing `taxonomies` + Taxonomies, /// Editing `date`, `order` or `weight` Sort, /// Editing anything causes a re-render of the page @@ -85,12 +83,8 @@ fn find_section_front_matter_changes(current: &SectionFrontMatter, new: &Section fn find_page_front_matter_changes(current: &PageFrontMatter, other: &PageFrontMatter) -> Vec { let mut changes_needed = vec![]; - if current.tags != other.tags { - changes_needed.push(PageChangesNeeded::Tags); - } - - if current.category != other.category { - changes_needed.push(PageChangesNeeded::Categories); + if current.taxonomies != other.taxonomies { + changes_needed.push(PageChangesNeeded::Taxonomies); } if current.date != other.date || current.order != other.order || current.weight != other.weight { @@ -117,8 +111,8 @@ fn delete_element(site: &mut Site, path: &Path, is_section: bool) -> Result<()> if let Some(p) = site.pages.remove(path) { site.permalinks.remove(&p.file.relative); - if p.meta.has_tags() || p.meta.category.is_some() { - site.populate_tags_and_categories(); + if !p.meta.taxonomies.is_empty() { + site.populate_taxonomies(); } // if there is a parent section, we will need to re-render it @@ -208,26 +202,14 @@ fn handle_page_editing(site: &mut Site, path: &Path) -> Result<()> { } // Front matter changed - let mut taxonomies_populated = false; let mut sections_populated = false; for changes in find_page_front_matter_changes(&site.pages[path].meta, &prev.meta) { // Sort always comes first if present so the rendering will be fine match changes { - PageChangesNeeded::Tags => { - if !taxonomies_populated { - site.populate_tags_and_categories(); - taxonomies_populated = true; - } + PageChangesNeeded::Taxonomies => { + site.populate_taxonomies(); site.register_tera_global_fns(); - site.render_tags()?; - }, - PageChangesNeeded::Categories => { - if !taxonomies_populated { - site.populate_tags_and_categories(); - taxonomies_populated = true; - } - site.register_tera_global_fns(); - site.render_categories()?; + site.render_taxonomies()?; }, PageChangesNeeded::Sort => { let section_path = match find_parent_section(site, &site.pages[path]) { @@ -258,7 +240,7 @@ fn handle_page_editing(site: &mut Site, path: &Path) -> Result<()> { // It's a new page! None => { site.populate_sections(); - site.populate_tags_and_categories(); + site.populate_taxonomies(); site.register_tera_global_fns(); // No need to optimise that yet, we can revisit if it becomes an issue site.build() @@ -322,10 +304,9 @@ pub fn after_template_change(site: &mut Site, path: &Path) -> Result<()> { match filename { "sitemap.xml" => site.render_sitemap(), - "rss.xml" => site.render_rss_feed(), + "rss.xml" => site.render_rss_feed(None, None), "robots.txt" => site.render_robots(), - "categories.html" | "category.html" => site.render_categories(), - "tags.html" | "tag.html" => site.render_tags(), + "single.html" | "list.html" => site.render_taxonomies(), "page.html" => { site.render_sections()?; site.render_orphan_pages() @@ -345,8 +326,7 @@ pub fn after_template_change(site: &mut Site, path: &Path) -> Result<()> { site.populate_sections(); site.render_sections()?; site.render_orphan_pages()?; - site.render_categories()?; - site.render_tags() + site.render_taxonomies() }, } } @@ -354,6 +334,8 @@ pub fn after_template_change(site: &mut Site, path: &Path) -> Result<()> { #[cfg(test)] mod tests { + use std::collections::HashMap; + use front_matter::{PageFrontMatter, SectionFrontMatter, SortBy}; use super::{ find_page_front_matter_changes, find_section_front_matter_changes, @@ -361,24 +343,21 @@ mod tests { }; #[test] - fn can_find_tag_changes_in_page_frontmatter() { - let new = PageFrontMatter { tags: Some(vec!["a tag".to_string()]), ..PageFrontMatter::default() }; + fn can_find_taxonomy_changes_in_page_frontmatter() { + let mut taxonomies = HashMap::new(); + taxonomies.insert("tags".to_string(), vec!["a tag".to_string()]); + let new = PageFrontMatter { taxonomies, ..PageFrontMatter::default() }; let changes = find_page_front_matter_changes(&PageFrontMatter::default(), &new); - assert_eq!(changes, vec![PageChangesNeeded::Tags, PageChangesNeeded::Render]); - } - - #[test] - fn can_find_category_changes_in_page_frontmatter() { - let current = PageFrontMatter { category: Some("a category".to_string()), ..PageFrontMatter::default() }; - let changes = find_page_front_matter_changes(¤t, &PageFrontMatter::default()); - assert_eq!(changes, vec![PageChangesNeeded::Categories, PageChangesNeeded::Render]); + assert_eq!(changes, vec![PageChangesNeeded::Taxonomies, PageChangesNeeded::Render]); } #[test] fn can_find_multiple_changes_in_page_frontmatter() { - let current = PageFrontMatter { category: Some("a category".to_string()), order: Some(1), ..PageFrontMatter::default() }; + let mut taxonomies = HashMap::new(); + taxonomies.insert("categories".to_string(), vec!["a category".to_string()]); + let current = PageFrontMatter { taxonomies, order: Some(1), ..PageFrontMatter::default() }; let changes = find_page_front_matter_changes(¤t, &PageFrontMatter::default()); - assert_eq!(changes, vec![PageChangesNeeded::Categories, PageChangesNeeded::Sort, PageChangesNeeded::Render]); + assert_eq!(changes, vec![PageChangesNeeded::Taxonomies, PageChangesNeeded::Sort, PageChangesNeeded::Render]); } #[test] diff --git a/components/site/src/lib.rs b/components/site/src/lib.rs index 3109f5db..f12299b6 100644 --- a/components/site/src/lib.rs +++ b/components/site/src/lib.rs @@ -39,7 +39,7 @@ use utils::net::get_available_port; use content::{Page, Section, populate_previous_and_next_pages, sort_pages}; use templates::{GUTENBERG_TERA, global_fns, render_redirect_template}; use front_matter::{SortBy, InsertAnchor}; -use taxonomies::Taxonomy; +use taxonomies::{Taxonomy, find_taxonomies}; use pagination::Paginator; use rayon::prelude::*; @@ -74,8 +74,7 @@ pub struct Site { pub output_path: PathBuf, content_path: PathBuf, pub static_path: PathBuf, - pub tags: Option, - pub categories: Option, + pub taxonomies: Vec, /// A map of all .md files (section and pages) and their permalink /// We need that if there are relative links in the content that need to be resolved pub permalinks: HashMap, @@ -128,8 +127,7 @@ impl Site { output_path: path.join("public"), content_path, static_path, - tags: None, - categories: None, + taxonomies: Vec::new(), permalinks: HashMap::new(), }; @@ -248,7 +246,7 @@ impl Site { self.register_early_global_fns(); self.render_markdown()?; self.populate_sections(); - self.populate_tags_and_categories(); + self.populate_taxonomies(); self.register_tera_global_fns(); Ok(()) @@ -302,7 +300,7 @@ impl Site { self.tera.register_global_function("get_section", global_fns::make_get_section(&self.sections)); self.tera.register_global_function( "get_taxonomy_url", - global_fns::make_get_taxonomy_url(self.tags.clone(), self.categories.clone()) + global_fns::make_get_taxonomy(self.taxonomies.clone()) ); } @@ -409,15 +407,12 @@ impl Site { } /// Find all the tags and categories if it's asked in the config - pub fn populate_tags_and_categories(&mut self) { - let generate_tags_pages = self.config.generate_tags_pages; - let generate_categories_pages = self.config.generate_categories_pages; - if !generate_tags_pages && !generate_categories_pages { + pub fn populate_taxonomies(&mut self) { + if self.config.taxonomies.is_empty() { return; } - // TODO: can we pass a reference? - let (tags, categories) = Taxonomy::find_tags_and_categories( + self.taxonomies = find_taxonomies( &self.config, self.pages .values() @@ -426,12 +421,6 @@ impl Site { .collect::>() .as_slice() ); - if generate_tags_pages { - self.tags = Some(tags); - } - if generate_categories_pages { - self.categories = Some(categories); - } } /// Inject live reload script tag if in live reload mode @@ -524,14 +513,11 @@ impl Site { self.render_orphan_pages()?; self.render_sitemap()?; if self.config.generate_rss { - self.render_rss_feed()?; + self.render_rss_feed(None, None)?; } self.render_404()?; self.render_robots()?; - // `render_categories` and `render_tags` will check whether the config allows - // them to render or not - self.render_categories()?; - self.render_tags()?; + self.render_taxonomies()?; if let Some(ref theme) = self.config.theme { let theme_path = self.base_path.join("themes").join(theme); @@ -681,19 +667,11 @@ impl Site { ) } - /// Renders all categories and the single category pages if there are some - pub fn render_categories(&self) -> Result<()> { - if let Some(ref categories) = self.categories { - self.render_taxonomy(categories)?; - } - - Ok(()) - } - - /// Renders all tags and the single tag pages if there are some - pub fn render_tags(&self) -> Result<()> { - if let Some(ref tags) = self.tags { - self.render_taxonomy(tags)?; + /// Renders all taxonomies with at least one non-draft post + pub fn render_taxonomies(&self) -> Result<()> { + // TODO: make parallel? + for taxonomy in &self.taxonomies { + self.render_taxonomy(taxonomy)?; } Ok(()) @@ -705,8 +683,8 @@ impl Site { } ensure_directory_exists(&self.output_path)?; - let output_path = self.output_path.join(&taxonomy.get_list_name()); - let list_output = taxonomy.render_list(&self.tera, &self.config)?; + let output_path = self.output_path.join(&taxonomy.kind.name); + let list_output = taxonomy.render_all_terms(&self.tera, &self.config)?; create_directory(&output_path)?; create_file(&output_path.join("index.html"), &self.inject_livereload(list_output))?; @@ -714,12 +692,25 @@ impl Site { .items .par_iter() .map(|item| { - let single_output = taxonomy.render_single_item(item, &self.tera, &self.config)?; - create_directory(&output_path.join(&item.slug))?; - create_file( - &output_path.join(&item.slug).join("index.html"), - &self.inject_livereload(single_output) - ) + if taxonomy.kind.rss { + // TODO: can we get rid of `clone()`? + self.render_rss_feed( + Some(item.pages.clone()), + Some(&PathBuf::from(format!("{}/{}", taxonomy.kind.name, item.slug))) + )?; + } + + if taxonomy.kind.is_paginated() { + self.render_paginated(&output_path, &Paginator::from_taxonomy(&taxonomy, item)) + } else { + let single_output = taxonomy.render_term(item, &self.tera, &self.config)?; + let path = output_path.join(&item.slug); + create_directory(&path)?; + create_file( + &path.join("index.html"), + &self.inject_livereload(single_output), + ) + } }) .fold(|| Ok(()), Result::and) .reduce(|| Ok(()), Result::and) @@ -752,31 +743,19 @@ impl Site { sections.sort_by(|a, b| a.permalink.cmp(&b.permalink)); context.add("sections", §ions); - let mut categories = vec![]; - if let Some(ref c) = self.categories { - let name = c.get_list_name(); - categories.push(SitemapEntry::new(self.config.make_permalink(&name), None)); - for item in &c.items { - categories.push( - SitemapEntry::new(self.config.make_permalink(&format!("{}/{}", &name, item.slug)), None), - ); + let mut taxonomies = vec![]; + for taxonomy in &self.taxonomies { + let name = &taxonomy.kind.name; + let mut terms = vec![]; + terms.push(SitemapEntry::new(self.config.make_permalink(name), None)); + for item in &taxonomy.items { + terms.push(SitemapEntry::new(self.config.make_permalink(&format!("{}/{}", &name, item.slug)), None)); } + terms.sort_by(|a, b| a.permalink.cmp(&b.permalink)); + taxonomies.push(terms); } - categories.sort_by(|a, b| a.permalink.cmp(&b.permalink)); - context.add("categories", &categories); + context.add("taxonomies", &taxonomies); - let mut tags = vec![]; - if let Some(ref t) = self.tags { - let name = t.get_list_name(); - tags.push(SitemapEntry::new(self.config.make_permalink(&name), None)); - for item in &t.items { - tags.push( - SitemapEntry::new(self.config.make_permalink(&format!("{}/{}", &name, item.slug)), None), - ); - } - } - tags.sort_by(|a, b| a.permalink.cmp(&b.permalink)); - context.add("tags", &tags); context.add("config", &self.config); let sitemap = &render_template("sitemap.xml", &self.tera, &context, &self.config.theme)?; @@ -786,14 +765,20 @@ impl Site { Ok(()) } - pub fn render_rss_feed(&self) -> Result<()> { + /// Renders a RSS feed for the given path and at the given path + /// If both arguments are `None`, it will render only the RSS feed for the whole + /// site at the root folder. + pub fn render_rss_feed(&self, all_pages: Option>, base_path: Option<&PathBuf>) -> Result<()> { ensure_directory_exists(&self.output_path)?; let mut context = Context::new(); - let pages = self.pages.values() + let pages = all_pages + // TODO: avoid that cloned(). + // It requires having `sort_pages` take references of Page + .unwrap_or_else(|| self.pages.values().cloned().collect::>()) + .into_iter() .filter(|p| p.meta.date.is_some() && !p.is_draft()) - .cloned() - .collect::>(); + .collect::>(); // Don't generate a RSS feed if none of the pages has a date if pages.is_empty() { @@ -802,20 +787,32 @@ impl Site { let (sorted_pages, _) = sort_pages(pages, SortBy::Date); context.add("last_build_date", &sorted_pages[0].meta.date.clone().map(|d| d.to_string())); - // limit to the last n elements) + // limit to the last n elements context.add("pages", &sorted_pages.iter().take(self.config.rss_limit).collect::>()); context.add("config", &self.config); - let rss_feed_url = if self.config.base_url.ends_with('/') { - format!("{}{}", self.config.base_url, "rss.xml") + let rss_feed_url = if let Some(ref base) = base_path { + self.config.make_permalink(&base.join("rss.xml").to_string_lossy()) } else { - format!("{}/{}", self.config.base_url, "rss.xml") + self.config.make_permalink("rss.xml") }; + context.add("feed_url", &rss_feed_url); let feed = &render_template("rss.xml", &self.tera, &context, &self.config.theme)?; - create_file(&self.output_path.join("rss.xml"), feed)?; + if let Some(ref base) = base_path { + let mut output_path = self.output_path.clone().to_path_buf(); + for component in base.components() { + output_path.push(component); + if !output_path.exists() { + create_directory(&output_path)?; + } + } + create_file(&output_path.join("rss.xml"), feed)?; + } else { + create_file(&self.output_path.join("rss.xml"), feed)?; + } Ok(()) } @@ -854,7 +851,7 @@ impl Site { } if section.meta.is_paginated() { - self.render_paginated(&output_path, section)?; + self.render_paginated(&output_path, &Paginator::from_section(§ion.pages, section))?; } else { let output = section.render_html(&self.tera, &self.config)?; create_file(&output_path.join("index.html"), &self.inject_livereload(output))?; @@ -894,11 +891,10 @@ impl Site { } /// Renders a list of pages when the section/index is wanting pagination. - pub fn render_paginated(&self, output_path: &Path, section: &Section) -> Result<()> { + pub fn render_paginated(&self, output_path: &Path, paginator: &Paginator) -> Result<()> { ensure_directory_exists(&self.output_path)?; - let paginator = Paginator::new(§ion.pages, section); - let folder_path = output_path.join(§ion.meta.paginate_path); + let folder_path = output_path.join(&paginator.paginate_path); create_directory(&folder_path)?; paginator @@ -913,7 +909,7 @@ impl Site { create_file(&page_path.join("index.html"), &self.inject_livereload(output))?; } else { create_file(&output_path.join("index.html"), &self.inject_livereload(output))?; - create_file(&page_path.join("index.html"), &render_redirect_template(§ion.permalink, &self.tera)?)?; + create_file(&page_path.join("index.html"), &render_redirect_template(&paginator.permalink, &self.tera)?)?; } Ok(()) }) diff --git a/components/site/tests/site.rs b/components/site/tests/site.rs index ddb01de5..3d030ee0 100644 --- a/components/site/tests/site.rs +++ b/components/site/tests/site.rs @@ -1,6 +1,7 @@ extern crate site; extern crate tempfile; +use std::collections::HashMap; use std::env; use std::path::Path; use std::fs::File; @@ -209,28 +210,27 @@ fn can_build_site_with_live_reload() { } #[test] -fn can_build_site_with_categories() { +fn can_build_site_with_taxonomies() { let mut path = env::current_dir().unwrap().parent().unwrap().parent().unwrap().to_path_buf(); path.push("test_site"); let mut site = Site::new(&path, "config.toml").unwrap(); - site.config.generate_categories_pages = true; site.load().unwrap(); for (i, page) in site.pages.values_mut().enumerate() { - page.meta.category = if i % 2 == 0 { - Some("A".to_string()) - } else { - Some("B".to_string()) + page.meta.taxonomies = { + let mut taxonomies = HashMap::new(); + taxonomies.insert("categories".to_string(), vec![if i % 2 == 0 { "A" } else { "B" }.to_string()]); + taxonomies }; } - site.populate_tags_and_categories(); + site.populate_taxonomies(); let tmp_dir = tempdir().expect("create temp dir"); let public = &tmp_dir.path().join("public"); site.set_output_path(&public); site.build().unwrap(); assert!(Path::new(&public).exists()); - assert_eq!(site.categories.unwrap().len(), 2); + assert_eq!(site.taxonomies.len(), 1); assert!(file_exists!(public, "index.html")); assert!(file_exists!(public, "sitemap.xml")); @@ -246,12 +246,13 @@ fn can_build_site_with_categories() { assert!(file_exists!(public, "posts/tutorials/index.html")); assert!(file_exists!(public, "posts/tutorials/devops/index.html")); assert!(file_exists!(public, "posts/tutorials/programming/index.html")); - // TODO: add assertion for syntax highlighting // Categories are there assert!(file_exists!(public, "categories/index.html")); assert!(file_exists!(public, "categories/a/index.html")); assert!(file_exists!(public, "categories/b/index.html")); + assert!(file_exists!(public, "categories/a/rss.xml")); + assert!(file_contains!(public, "categories/a/rss.xml", "https://replace-this-with-your-url.com/categories/a/rss.xml")); // Extending from a theme works assert!(file_contains!(public, "categories/a/index.html", "EXTENDED")); // Tags aren't @@ -262,58 +263,6 @@ fn can_build_site_with_categories() { assert!(file_contains!(public, "sitemap.xml", "https://replace-this-with-your-url.com/categories/a/")); } -#[test] -fn can_build_site_with_tags() { - let mut path = env::current_dir().unwrap().parent().unwrap().parent().unwrap().to_path_buf(); - path.push("test_site"); - let mut site = Site::new(&path, "config.toml").unwrap(); - site.config.generate_tags_pages = true; - site.load().unwrap(); - - for (i, page) in site.pages.values_mut().enumerate() { - page.meta.tags = if i % 2 == 0 { - Some(vec!["tag1".to_string(), "tag2".to_string()]) - } else { - Some(vec!["tag with space".to_string()]) - }; - } - site.populate_tags_and_categories(); - - let tmp_dir = tempdir().expect("create temp dir"); - let public = &tmp_dir.path().join("public"); - site.set_output_path(&public); - site.build().unwrap(); - - assert!(Path::new(&public).exists()); - assert_eq!(site.tags.unwrap().len(), 3); - - assert!(file_exists!(public, "index.html")); - assert!(file_exists!(public, "sitemap.xml")); - assert!(file_exists!(public, "robots.txt")); - assert!(file_exists!(public, "a-fixed-url/index.html")); - assert!(file_exists!(public, "posts/python/index.html")); - assert!(file_exists!(public, "posts/tutorials/devops/nix/index.html")); - assert!(file_exists!(public, "posts/with-assets/index.html")); - - // Sections - assert!(file_exists!(public, "posts/index.html")); - assert!(file_exists!(public, "posts/tutorials/index.html")); - assert!(file_exists!(public, "posts/tutorials/devops/index.html")); - assert!(file_exists!(public, "posts/tutorials/programming/index.html")); - // TODO: add assertion for syntax highlighting - - // Tags are there - assert!(file_exists!(public, "tags/index.html")); - assert!(file_exists!(public, "tags/tag1/index.html")); - assert!(file_exists!(public, "tags/tag2/index.html")); - assert!(file_exists!(public, "tags/tag-with-space/index.html")); - // Categories aren't - assert_eq!(file_exists!(public, "categories/index.html"), false); - // Tags are in the sitemap - assert!(file_contains!(public, "sitemap.xml", "https://replace-this-with-your-url.com/tags/")); - assert!(file_contains!(public, "sitemap.xml", "https://replace-this-with-your-url.com/tags/tag-with-space/")); -} - #[test] fn can_build_site_and_insert_anchor_links() { let mut path = env::current_dir().unwrap().parent().unwrap().parent().unwrap().to_path_buf(); diff --git a/components/taxonomies/src/lib.rs b/components/taxonomies/src/lib.rs index b18a9647..f576c843 100644 --- a/components/taxonomies/src/lib.rs +++ b/components/taxonomies/src/lib.rs @@ -14,19 +14,13 @@ use std::collections::HashMap; use slug::slugify; use tera::{Context, Tera}; -use config::Config; +use config::{Config, Taxonomy as TaxonomyConfig}; use errors::{Result, ResultExt}; use content::{Page, sort_pages}; use front_matter::SortBy; use utils::templates::render_template; -#[derive(Debug, Copy, Clone, PartialEq)] -pub enum TaxonomyKind { - Tags, - Categories, -} - /// A tag or category #[derive(Debug, Clone, Serialize, PartialEq)] pub struct TaxonomyItem { @@ -37,15 +31,14 @@ pub struct TaxonomyItem { } impl TaxonomyItem { - pub fn new(name: &str, kind: TaxonomyKind, config: &Config, pages: Vec) -> TaxonomyItem { + pub fn new(name: &str, path: &str, config: &Config, pages: Vec) -> TaxonomyItem { // Taxonomy are almost always used for blogs so we filter by dates // and it's not like we can sort things across sections by anything other // than dates let (mut pages, ignored_pages) = sort_pages(pages, SortBy::Date); let slug = slugify(name); let permalink = { - let kind_path = if kind == TaxonomyKind::Tags { "tags" } else { "categories" }; - config.make_permalink(&format!("/{}/{}", kind_path, slug)) + config.make_permalink(&format!("/{}/{}", path, slug)) }; // We still append pages without dates at the end @@ -61,49 +54,19 @@ impl TaxonomyItem { } /// All the tags or categories -#[derive(Debug, Clone, PartialEq)] +#[derive(Debug, Clone, PartialEq, Serialize)] pub struct Taxonomy { - pub kind: TaxonomyKind, + pub kind: TaxonomyConfig, // this vec is sorted by the count of item pub items: Vec, } impl Taxonomy { - pub fn find_tags_and_categories(config: &Config, all_pages: &[Page]) -> (Taxonomy, Taxonomy) { - let mut tags = HashMap::new(); - let mut categories = HashMap::new(); - - // Find all the tags/categories first - for page in all_pages { - if let Some(ref category) = page.meta.category { - categories - .entry(category.to_string()) - .or_insert_with(|| vec![]) - .push(page.clone()); - } - - if let Some(ref t) = page.meta.tags { - for tag in t { - tags - .entry(tag.to_string()) - .or_insert_with(|| vec![]) - .push(page.clone()); - } - } - } - - // Then make TaxonomyItem out of them, after sorting it - let tags_taxonomy = Taxonomy::new(TaxonomyKind::Tags, config, tags); - let categories_taxonomy = Taxonomy::new(TaxonomyKind::Categories, config, categories); - - (tags_taxonomy, categories_taxonomy) - } - - fn new(kind: TaxonomyKind, config: &Config, items: HashMap>) -> Taxonomy { + fn new(kind: TaxonomyConfig, config: &Config, items: HashMap>) -> Taxonomy { let mut sorted_items = vec![]; - for (name, pages) in &items { + for (name, pages) in items { sorted_items.push( - TaxonomyItem::new(name, kind, config, pages.clone()) + TaxonomyItem::new(&name, &kind.name, config, pages) ); } sorted_items.sort_by(|a, b| a.name.cmp(&b.name)); @@ -122,69 +85,123 @@ impl Taxonomy { self.len() == 0 } - pub fn get_single_item_name(&self) -> String { - match self.kind { - TaxonomyKind::Tags => "tag".to_string(), - TaxonomyKind::Categories => "category".to_string(), - } - } - - pub fn get_list_name(&self) -> String { - match self.kind { - TaxonomyKind::Tags => "tags".to_string(), - TaxonomyKind::Categories => "categories".to_string(), - } - } - - pub fn render_single_item(&self, item: &TaxonomyItem, tera: &Tera, config: &Config) -> Result { - let name = self.get_single_item_name(); + pub fn render_term(&self, item: &TaxonomyItem, tera: &Tera, config: &Config) -> Result { let mut context = Context::new(); context.add("config", config); - context.add(&name, item); - context.add("current_url", &config.make_permalink(&format!("{}/{}", name, item.slug))); - context.add("current_path", &format!("/{}/{}", name, item.slug)); + context.add("term", item); + context.add("taxonomy", &self.kind); + context.add("current_url", &config.make_permalink(&format!("{}/{}", self.kind.name, item.slug))); + context.add("current_path", &format!("/{}/{}", self.kind.name, item.slug)); - render_template(&format!("{}.html", name), tera, &context, &config.theme) - .chain_err(|| format!("Failed to render {} page.", name)) + render_template(&format!("{}/single.html", self.kind.name), tera, &context, &config.theme) + .chain_err(|| format!("Failed to render single term {} page.", self.kind.name)) } - pub fn render_list(&self, tera: &Tera, config: &Config) -> Result { - let name = self.get_list_name(); + pub fn render_all_terms(&self, tera: &Tera, config: &Config) -> Result { let mut context = Context::new(); context.add("config", config); - context.add(&name, &self.items); - context.add("current_url", &config.make_permalink(&name)); - context.add("current_path", &name); + context.add("terms", &self.items); + context.add("taxonomy", &self.kind); + context.add("current_url", &config.make_permalink(&self.kind.name)); + context.add("current_path", &self.kind.name); - render_template(&format!("{}.html", name), tera, &context, &config.theme) - .chain_err(|| format!("Failed to render {} page.", name)) + render_template(&format!("{}/list.html", self.kind.name), tera, &context, &config.theme) + .chain_err(|| format!("Failed to render a list of {} page.", self.kind.name)) } } +pub fn find_taxonomies(config: &Config, all_pages: &[Page]) -> Vec { + let taxonomies_def = { + let mut m = HashMap::new(); + for t in &config.taxonomies { + m.insert(t.name.clone(), t); + } + m + }; + let mut all_taxonomies = HashMap::new(); + + // Find all the taxonomies first + for page in all_pages { + for (name, val) in &page.meta.taxonomies { + if taxonomies_def.contains_key(name) { + all_taxonomies + .entry(name) + .or_insert_with(|| HashMap::new()); + + for v in val { + all_taxonomies.get_mut(name) + .unwrap() + .entry(v.to_string()) + .or_insert_with(|| vec![]) + .push(page.clone()); + } + } else { + // TODO: bail with error + } + } + } + + let mut taxonomies = vec![]; + + for (name, taxo) in all_taxonomies { + taxonomies.push(Taxonomy::new(taxonomies_def[name].clone(), config, taxo)); + } + + taxonomies +} + + #[cfg(test)] mod tests { use super::*; + use std::collections::HashMap; - use config::Config; + use config::{Config, Taxonomy}; use content::Page; #[test] fn can_make_taxonomies() { - let config = Config::default(); + let mut config = Config::default(); + config.taxonomies = vec![ + Taxonomy {name: "categories".to_string(), ..Taxonomy::default()}, + Taxonomy {name: "tags".to_string(), ..Taxonomy::default()}, + Taxonomy {name: "authors".to_string(), ..Taxonomy::default()}, + ]; let mut page1 = Page::default(); - page1.meta.tags = Some(vec!["rust".to_string(), "db".to_string()]); - page1.meta.category = Some("Programming tutorials".to_string()); + let mut taxo_page1 = HashMap::new(); + taxo_page1.insert("tags".to_string(), vec!["rust".to_string(), "db".to_string()]); + taxo_page1.insert("categories".to_string(), vec!["Programming tutorials".to_string()]); + page1.meta.taxonomies = taxo_page1; let mut page2 = Page::default(); - page2.meta.tags = Some(vec!["rust".to_string(), "js".to_string()]); - page2.meta.category = Some("Other".to_string()); + let mut taxo_page2 = HashMap::new(); + taxo_page2.insert("tags".to_string(), vec!["rust".to_string(), "js".to_string()]); + taxo_page2.insert("categories".to_string(), vec!["Other".to_string()]); + page2.meta.taxonomies = taxo_page2; let mut page3 = Page::default(); - page3.meta.tags = Some(vec!["js".to_string()]); + let mut taxo_page3 = HashMap::new(); + taxo_page3.insert("tags".to_string(), vec!["js".to_string()]); + taxo_page3.insert("authors".to_string(), vec!["Vincent Prouillet".to_string()]); + page3.meta.taxonomies = taxo_page3; let pages = vec![page1, page2, page3]; - let (tags, categories) = Taxonomy::find_tags_and_categories(&config, &pages); - + let taxonomies = find_taxonomies(&config, &pages); + let (tags, categories, authors) = { + let mut t = None; + let mut c = None; + let mut a = None; + for x in taxonomies { + match x.kind.name.as_ref() { + "tags" => t = Some(x), + "categories" => c = Some(x), + "authors" => a = Some(x), + _ => unreachable!(), + } + } + (t.unwrap(), c.unwrap(), a.unwrap()) + }; assert_eq!(tags.items.len(), 3); assert_eq!(categories.items.len(), 2); + assert_eq!(authors.items.len(), 1); assert_eq!(tags.items[0].name, "db"); assert_eq!(tags.items[0].slug, "db"); diff --git a/components/templates/src/builtins/rss.xml b/components/templates/src/builtins/rss.xml index 35b7fbcd..3baccf84 100644 --- a/components/templates/src/builtins/rss.xml +++ b/components/templates/src/builtins/rss.xml @@ -1,18 +1,18 @@ {{ config.title }} - {{ config.base_url }} + {{ config.base_url | safe }} {{ config.description }} Gutenberg {{ config.default_language }} - + {{ last_build_date | date(format="%a, %d %b %Y %H:%M:%S %z") }} {% for page in pages %} {{ page.title }} {{ page.date | date(format="%a, %d %b %Y %H:%M:%S %z") }} - {{ page.permalink }} - {{ page.permalink }} + {{ page.permalink | safe }} + {{ page.permalink | safe }} {% if page.summary %}{{ page.summary }}{% else %}{{ page.content }}{% endif %} {% endfor %} diff --git a/components/templates/src/builtins/sitemap.xml b/components/templates/src/builtins/sitemap.xml index 3ee6bbcb..6eba3d74 100644 --- a/components/templates/src/builtins/sitemap.xml +++ b/components/templates/src/builtins/sitemap.xml @@ -12,14 +12,11 @@ {{ section.permalink | safe }} {% endfor %} - {% for category in categories %} + {% for taxonomy in taxonomies %} + {% for entry in taxonomy %} - {{ category.permalink | safe }} - - {% endfor %} - {% for tag in tags %} - - {{ tag.permalink | safe }} + {{ entry.permalink | safe }} + {% endfor %} {% endfor %} diff --git a/components/templates/src/global_fns.rs b/components/templates/src/global_fns.rs index 5db2da89..e02d0e95 100644 --- a/components/templates/src/global_fns.rs +++ b/components/templates/src/global_fns.rs @@ -134,36 +134,25 @@ pub fn make_get_url(permalinks: HashMap, config: Config) -> Glob }) } -pub fn make_get_taxonomy_url(tags: Option, categories: Option) -> GlobalFn { +pub fn make_get_taxonomy(all_taxonomies: Vec) -> GlobalFn { + let mut taxonomies = HashMap::new(); + for taxonomy in all_taxonomies { + taxonomies.insert(taxonomy.kind.name.clone(), taxonomy); + } Box::new(move |args| -> Result { let kind = required_arg!( String, args.get("kind"), - "`get_taxonomy_url` requires a `kind` argument with a string value" + "`get_taxonomy` requires a `kind` argument with a string value" ); - let name = required_arg!( - String, - args.get("name"), - "`get_taxonomy_url` requires a `name` argument with a string value" - ); - let container = match kind.as_ref() { - "tag" => &tags, - "category" => &categories, - _ => return Err( - "`get_taxonomy_url` can only get `tag` or `category` for the `kind` argument".into() + let container = match taxonomies.get(&kind) { + Some(c) => c, + None => return Err( + format!("`get_taxonomy` received an unknown taxonomy as kind: {}", kind).into() ), }; - if let Some(ref c) = *container { - for item in &c.items { - if item.name == name { - return Ok(to_value(item.permalink.clone()).unwrap()); - } - } - bail!("`get_taxonomy_url`: couldn't find `{}` in `{}` taxonomy", name, kind); - } else { - bail!("`get_taxonomy_url` tried to get a taxonomy of kind `{}` but there isn't any", kind); - } + return Ok(to_value(container).unwrap()); }) } @@ -217,14 +206,14 @@ pub fn make_resize_image(imageproc: Arc>) -> GlobalF #[cfg(test)] mod tests { - use super::{make_get_url, make_get_taxonomy_url, make_trans}; + use super::{make_get_url, make_get_taxonomy, make_trans}; use std::collections::HashMap; use tera::to_value; - use config::Config; - use taxonomies::{Taxonomy, TaxonomyKind, TaxonomyItem}; + use config::{Config, Taxonomy as TaxonomyConfig}; + use taxonomies::{Taxonomy, TaxonomyItem}; #[test] @@ -268,28 +257,27 @@ mod tests { } #[test] - fn can_get_tag_url() { + fn can_get_taxonomy() { + let taxo_config = TaxonomyConfig {name: "tags".to_string(), ..TaxonomyConfig::default()}; let tag = TaxonomyItem::new( "Prog amming", - TaxonomyKind::Tags, + "tags", &Config::default(), vec![], ); let tags = Taxonomy { - kind: TaxonomyKind::Tags, + kind: taxo_config, items: vec![tag], }; - let static_fn = make_get_taxonomy_url(Some(tags), None); + let static_fn = make_get_taxonomy(vec![tags.clone()]); // can find it correctly let mut args = HashMap::new(); - args.insert("kind".to_string(), to_value("tag").unwrap()); - args.insert("name".to_string(), to_value("Prog amming").unwrap()); - assert_eq!(static_fn(args).unwrap(), "http://a-website.com/tags/prog-amming/"); + args.insert("kind".to_string(), to_value("tags").unwrap()); + assert_eq!(static_fn(args).unwrap(), to_value(&tags).unwrap()); // and errors if it can't find it let mut args = HashMap::new(); - args.insert("kind".to_string(), to_value("tag").unwrap()); - args.insert("name".to_string(), to_value("random").unwrap()); + args.insert("kind".to_string(), to_value("something-else").unwrap()); assert!(static_fn(args).is_err()); } diff --git a/components/templates/src/lib.rs b/components/templates/src/lib.rs index ce0fe912..dbf1d158 100644 --- a/components/templates/src/lib.rs +++ b/components/templates/src/lib.rs @@ -5,7 +5,6 @@ extern crate tera; extern crate base64; extern crate pulldown_cmark; -#[macro_use] extern crate errors; extern crate utils; extern crate content; diff --git a/components/utils/src/templates.rs b/components/utils/src/templates.rs index c7432abb..68a0818d 100644 --- a/components/utils/src/templates.rs +++ b/components/utils/src/templates.rs @@ -41,8 +41,8 @@ pub fn render_template(name: &str, tera: &Tera, context: &Context, theme: &Optio "page.html" => { render_default_tpl!(name, "https://www.getgutenberg.io/documentation/templates/pages-sections/#page-variables") }, - "tag.html" | "tags.html" | "category.html" | "categories.html" => { - render_default_tpl!(name, "https://www.getgutenberg.io/documentation/templates/tags-categories/") + "single.html" | "list.html" => { + render_default_tpl!(name, "https://www.getgutenberg.io/documentation/templates/taxonomies/") }, _ => bail!("Tried to render `{}` but the template wasn't found", name) } diff --git a/docs/content/documentation/content/page.md b/docs/content/documentation/content/page.md index fb3f962d..04cb6c23 100644 --- a/docs/content/documentation/content/page.md +++ b/docs/content/documentation/content/page.md @@ -38,11 +38,10 @@ slug = "" # It should not start with a `/` and the slash will be removed if it does path = "" -# An array of strings allowing you to group pages with them -tags = [] - -# An overarching category name for that page, allowing you to group pages with it -category = "" +# A dict of taxonomies: the key is the name of the taxonomy which must match +# one of the taxonomy defined in `config.toml` and the value is a list of +# strings +[taxonomies] # The order as defined in the Section page order = 0 diff --git a/docs/content/documentation/content/tags-categories.md b/docs/content/documentation/content/tags-categories.md deleted file mode 100644 index 20eae9e8..00000000 --- a/docs/content/documentation/content/tags-categories.md +++ /dev/null @@ -1,23 +0,0 @@ -+++ -title = "Tags & Categories" -weight = 90 -+++ - -Gutenberg has built-in support for basic taxonomies: tags and categories. - -Those taxonomies are automatically built across the whole site based on -the `tags` and `category` fields of the front-matter: you do not need to define -that a tag or a category exists. You have to set `generate_tags_pages` and/or -`generate_categories_pages` in your [config.toml](./documentation/getting-started/configuration.md). - -The taxonomy pages will only be created if at least one item is found and -are available at the following paths: - -```plain -$BASE_URL/tags/ -$BASE_URL/tags/$TAG_SLUG -$BASE_URL/categories/ -$BASE_URL/categories/$CATEGORY_SLUG -``` - -It is currently not possible to change those paths or to create custom taxonomies. diff --git a/docs/content/documentation/content/taxonomies.md b/docs/content/documentation/content/taxonomies.md new file mode 100644 index 00000000..77ab8026 --- /dev/null +++ b/docs/content/documentation/content/taxonomies.md @@ -0,0 +1,27 @@ ++++ +title = "Taxonomies" +weight = 90 ++++ + +Gutenberg has built-in support for taxonomies. + +The first step is to define the taxonomies in your [config.toml](./documentation/getting-started/configuration.md). + +A taxonomy has 4 variables: + +- `name`: a required string that will be used in the URLs, usually the plural version (i.e. tags, categories etc) +- `paginate`: if this is set to a number, each term page will be paginated by this much. +- `paginate_path`: if set, will be the path used by paginated page and the page number will be appended after it. +For example the default would be page/1 +- `rss`: if set to `true`, a RSS feed will be generated for each individual term. + +Once this is done, you can then set taxonomies in your content and Gutenberg will pick +them up. + +The taxonomy pages will only be created if at least one non-draft page is found and +are available at the following paths: + +```plain +$BASE_URL/$NAME/ +$BASE_URL/$NAME/$SLUG +``` diff --git a/docs/content/documentation/getting-started/configuration.md b/docs/content/documentation/getting-started/configuration.md index 0cf21b79..87cae5e2 100644 --- a/docs/content/documentation/getting-started/configuration.md +++ b/docs/content/documentation/getting-started/configuration.md @@ -40,13 +40,14 @@ generate_rss = false # The number of articles to include in the RSS feed rss_limit = 20 -# Whether to generate a tags page and individual -# tag pages for pages with tags -generate_tags_pages = false - -# Whether to generate a categories page and individual -# category pages for pages with a category -generate_categories_pages = false +# The taxonomies to be rendered for that site and their configuration +# Example: +# taxonomies = [ +# {name: "tags", rss: true}, # each tag will have its own RSS feed +# {name: "categories", paginate: 5}, # 5 terms per page +# ] +# +taxonomies = [] # Whether to compile the Sass files found in the `sass` directory compile_sass = false diff --git a/docs/content/documentation/templates/pagination.md b/docs/content/documentation/templates/pagination.md index e9561c0b..ccbf6ab9 100644 --- a/docs/content/documentation/templates/pagination.md +++ b/docs/content/documentation/templates/pagination.md @@ -3,9 +3,14 @@ title = "Pagination" weight = 30 +++ +Two things can get paginated: a section or a taxonomy term. + A paginated section gets the same `section` variable as a normal -[section page](./documentation/templates/pages-sections.md#section-variables). -In addition, a paginated section gets a `paginator` variable of the `Pager` type: +[section page](./documentation/templates/pages-sections.md#section-variables) +while a paginated taxonomy gets the a `taxonomy` variable of type `TaxonomyConfig`, equivalent +to the taxonomy definition in the `config.toml`. + +In addition, a paginated page gets a `paginator` variable of the `Pager` type: ```ts // How many items per page diff --git a/docs/content/documentation/templates/tags-categories.md b/docs/content/documentation/templates/tags-categories.md deleted file mode 100644 index db5adf33..00000000 --- a/docs/content/documentation/templates/tags-categories.md +++ /dev/null @@ -1,31 +0,0 @@ -+++ -title = "Tags & Categories" -weight = 40 -+++ - -Tags and categories actually get the same data but with different variable names. -The default templates for those pages are the following: - -- `tags.html`: list of tags, gets variable `tags` sorted alphabetically -- `tag.html`: individual tag, gets variable `tag` -- `categories.html`: list of categories, gets variable `categories` sorted alphabetically -- `category.html`: individual category, gets variable `category` - -You can override any of those templates by putting one with the same name in the `templates` directory. -`tags` and `categories` both are an array of `TaxonomyItem` sorted alphabetically, while `tag` and `category` -are a `TaxonomyItem`. - -A `TaxonomyItem` has the following fields: - -```ts -name: String; -slug: String; -permalink: String; -pages: Array; -``` - -As `pages` can span many sections, the `pages` array is sorted by date. - -Currently, there is no way to define different taxonomy templates per section, change -the path used for them or paginate them. - diff --git a/docs/content/documentation/templates/taxonomies.md b/docs/content/documentation/templates/taxonomies.md new file mode 100644 index 00000000..a9e8576e --- /dev/null +++ b/docs/content/documentation/templates/taxonomies.md @@ -0,0 +1,53 @@ ++++ +title = "Taxonomies" +weight = 40 ++++ + +The default templates for the taxonomies pages are the following: + +- `$TAXONOMY_NAME/single.html` +- `$TAXONOMY_NAME/list.html` + +You can override any of those templates by putting one with the same path in the `templates` directory. + +First, a `TaxonomyTerm` has the following fields: + +```ts +name: String; +slug: String; +permalink: String; +pages: Array; +``` + +## Non-paginated taxonomies +If a taxonomy is not paginated, the templates get the following variables: + +### Single term (`single.html`) +```ts +// The site config +config: Config; +// The data of the taxonomy, from the config +taxonomy: TaxonomyConfig; +// The current full permalink for that page +current_url: String; +// The current path for that page +current_path: String; +// The current term being rendered +term: TaxonomyTerm; +``` + +### Taxonomy list (`list.html`) +```ts +// The site config +config: Config; +// The data of the taxonomy, from the config +taxonomy: TaxonomyConfig; +// The current full permalink for that page +current_url: String; +// The current path for that page +current_path: String; +// All terms for that taxonomy +terms: Array; +``` + +## Paginated taxonomies diff --git a/test_site/config.toml b/test_site/config.toml index 4b1caeda..b667b9b8 100644 --- a/test_site/config.toml +++ b/test_site/config.toml @@ -6,5 +6,9 @@ generate_rss = true rss_limit = 2 theme = "sample" +taxonomies = [ + {name = "categories", rss = true}, +] + [extra.author] name = "Vincent Prouillet" diff --git a/test_site/templates/categories.html b/test_site/templates/categories.html deleted file mode 100644 index 59813456..00000000 --- a/test_site/templates/categories.html +++ /dev/null @@ -1,3 +0,0 @@ -{% for category in categories %} - {{ category.name }} {{ category.slug }} {{ category.pages | length }} -{% endfor %} diff --git a/test_site/templates/categories/list.html b/test_site/templates/categories/list.html new file mode 100644 index 00000000..3b8116f1 --- /dev/null +++ b/test_site/templates/categories/list.html @@ -0,0 +1,3 @@ +{% for term in terms %} + {{ term.name }} {{ term.slug }} {{ term.pages | length }} +{% endfor %} diff --git a/test_site/templates/category.html b/test_site/templates/categories/single.html similarity index 54% rename from test_site/templates/category.html rename to test_site/templates/categories/single.html index f7904310..23dd537c 100644 --- a/test_site/templates/category.html +++ b/test_site/templates/categories/single.html @@ -1,4 +1,4 @@ -{% extends "sample/templates/category.html" %} +{% extends "sample/templates/categories/single.html" %} {% block extra_category %} EXTENDED diff --git a/test_site/themes/sample/templates/category.html b/test_site/themes/sample/templates/categories/single.html similarity index 75% rename from test_site/themes/sample/templates/category.html rename to test_site/themes/sample/templates/categories/single.html index 7a016ae2..cd3df713 100644 --- a/test_site/themes/sample/templates/category.html +++ b/test_site/themes/sample/templates/categories/single.html @@ -1,7 +1,7 @@ -Category: {{ category.name }} +Category: {{ term.name }} -{% for page in category.pages %} +{% for page in term.pages %} From 7bf36642d984a152d744a6c243a23516ac7dc844 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Mon, 16 Jul 2018 11:03:45 +0200 Subject: [PATCH 46/74] Update deps --- Cargo.lock | 37 ++++++++++++++++++++++-------------- components/errors/Cargo.toml | 2 +- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 457bdb23..37e6fa6c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -319,7 +319,7 @@ dependencies = [ "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -548,13 +548,21 @@ dependencies = [ "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "error-chain" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "errors" version = "0.1.0" dependencies = [ - "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -611,7 +619,7 @@ dependencies = [ "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", - "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -844,7 +852,7 @@ dependencies = [ "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -1283,7 +1291,7 @@ dependencies = [ "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "taxonomies 0.1.0", - "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -1582,7 +1590,7 @@ dependencies = [ "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "syntect 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "templates 0.1.0", - "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -1757,7 +1765,7 @@ dependencies = [ "taxonomies 0.1.0", "tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "templates 0.1.0", - "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -1954,7 +1962,7 @@ dependencies = [ "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -1991,7 +1999,7 @@ dependencies = [ "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "taxonomies 0.1.0", - "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -2007,11 +2015,11 @@ dependencies = [ [[package]] name = "tera" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "humansize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2362,7 +2370,7 @@ version = "0.1.0" dependencies = [ "errors 0.1.0", "tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2546,6 +2554,7 @@ dependencies = [ "checksum encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" "checksum error-chain 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faa976b4fd2e4c2b2f3f486874b19e61944d3de3de8b61c9fcf835d583871bcc" "checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3" +"checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" "checksum error-chain 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6930e04918388a9a2e41d518c25cf679ccafe26733fb4127dbf21993f2575d46" "checksum failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934799b6c1de475a012a02dab0ace1ace43789ee4b99bcfbf1a2e3e8ced5de82" "checksum failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c7cdda555bb90c9bb67a3b670a0f42de8e73f5981524123ad8578aafec8ddb8b" @@ -2698,7 +2707,7 @@ dependencies = [ "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" "checksum tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "47776f63b85777d984a50ce49d6b9e58826b6a3766a449fc95bc66cd5663c15b" "checksum tendril 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9de21546595a0873061940d994bbbc5c35f024ae4fd61ec5c5b159115684f508" -"checksum tera 0.11.8 (registry+https://github.com/rust-lang/crates.io-index)" = "fc0624177c585227fee0c5021bd6be3a1acf66bdb6f412acb92373637aad728b" +"checksum tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)" = "09a18c54f3d7bdd496703db5ce232d7b7425fb69208bfbda1006127e273673c4" "checksum term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1" "checksum term-painter 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "dcaa948f0e3e38470cd8dc8dcfe561a75c9e43f28075bb183845be2b9b3c08cf" "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" diff --git a/components/errors/Cargo.toml b/components/errors/Cargo.toml index 68dd911c..977fa75f 100644 --- a/components/errors/Cargo.toml +++ b/components/errors/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" authors = ["Vincent Prouillet "] [dependencies] -error-chain = "0.11" +error-chain = "0.12" tera = "0.11" toml = "0.4" image = "0.19.0" From 2f100ecd019683e105921528b4e101e1f8601315 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Mon, 16 Jul 2018 12:01:03 +0200 Subject: [PATCH 47/74] Fix path in windows for taxo rss --- components/site/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/site/src/lib.rs b/components/site/src/lib.rs index f12299b6..bfe72653 100644 --- a/components/site/src/lib.rs +++ b/components/site/src/lib.rs @@ -792,7 +792,7 @@ impl Site { context.add("config", &self.config); let rss_feed_url = if let Some(ref base) = base_path { - self.config.make_permalink(&base.join("rss.xml").to_string_lossy()) + self.config.make_permalink(&base.join("rss.xml").to_string_lossy().replace('\\', "/")) } else { self.config.make_permalink("rss.xml") }; From 18bef00671a925233e24e5f9713021a308a98c30 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Mon, 16 Jul 2018 18:14:48 +0200 Subject: [PATCH 48/74] Rename taxonomies paginate and error on unknown ones --- components/config/src/lib.rs | 6 ++--- components/pagination/src/lib.rs | 4 +-- components/rebuild/src/lib.rs | 6 ++--- components/site/src/lib.rs | 10 ++++--- components/site/tests/site.rs | 2 +- components/taxonomies/src/lib.rs | 27 ++++++++++++++++--- .../documentation/content/taxonomies.md | 2 +- .../getting-started/configuration.md | 2 +- 8 files changed, 40 insertions(+), 19 deletions(-) diff --git a/components/config/src/lib.rs b/components/config/src/lib.rs index 00234e8a..3efa7abb 100644 --- a/components/config/src/lib.rs +++ b/components/config/src/lib.rs @@ -35,7 +35,7 @@ pub struct Taxonomy { pub name: String, /// If this is set, the list of individual taxonomy term page will be paginated /// by this much - pub paginate: Option, + pub paginate_by: Option, pub paginate_path: Option, /// Whether to generate a RSS feed only for each taxonomy term, defaults to false pub rss: bool, @@ -43,7 +43,7 @@ pub struct Taxonomy { impl Taxonomy { pub fn is_paginated(&self) -> bool { - if let Some(paginate_by) = self.paginate { + if let Some(paginate_by) = self.paginate_by { paginate_by > 0 } else { false @@ -55,7 +55,7 @@ impl Default for Taxonomy { fn default() -> Taxonomy { Taxonomy { name: String::new(), - paginate: None, + paginate_by: None, paginate_path: None, rss: false, } diff --git a/components/pagination/src/lib.rs b/components/pagination/src/lib.rs index dc0c1404..16aa1fc7 100644 --- a/components/pagination/src/lib.rs +++ b/components/pagination/src/lib.rs @@ -104,7 +104,7 @@ impl<'a> Paginator<'a> { /// Create a new paginator from a taxonomy /// It will always at least create one pager (the first) even if there are no pages to paginate pub fn from_taxonomy(taxonomy: &'a Taxonomy, item: &'a TaxonomyItem) -> Paginator<'a> { - let paginate_by = taxonomy.kind.paginate.unwrap(); + let paginate_by = taxonomy.kind.paginate_by.unwrap(); let mut paginator = Paginator { all_pages: &item.pages, pagers: vec![], @@ -339,7 +339,7 @@ mod tests { ]; let taxonomy_def = TaxonomyConfig { name: "tags".to_string(), - paginate: Some(2), + paginate_by: Some(2), ..TaxonomyConfig::default() }; let taxonomy_item = TaxonomyItem { diff --git a/components/rebuild/src/lib.rs b/components/rebuild/src/lib.rs index 675388a0..b438776c 100644 --- a/components/rebuild/src/lib.rs +++ b/components/rebuild/src/lib.rs @@ -112,7 +112,7 @@ fn delete_element(site: &mut Site, path: &Path, is_section: bool) -> Result<()> site.permalinks.remove(&p.file.relative); if !p.meta.taxonomies.is_empty() { - site.populate_taxonomies(); + site.populate_taxonomies()?; } // if there is a parent section, we will need to re-render it @@ -207,7 +207,7 @@ fn handle_page_editing(site: &mut Site, path: &Path) -> Result<()> { // Sort always comes first if present so the rendering will be fine match changes { PageChangesNeeded::Taxonomies => { - site.populate_taxonomies(); + site.populate_taxonomies()?; site.register_tera_global_fns(); site.render_taxonomies()?; }, @@ -240,7 +240,7 @@ fn handle_page_editing(site: &mut Site, path: &Path) -> Result<()> { // It's a new page! None => { site.populate_sections(); - site.populate_taxonomies(); + site.populate_taxonomies()?; site.register_tera_global_fns(); // No need to optimise that yet, we can revisit if it becomes an issue site.build() diff --git a/components/site/src/lib.rs b/components/site/src/lib.rs index bfe72653..200a20e0 100644 --- a/components/site/src/lib.rs +++ b/components/site/src/lib.rs @@ -246,7 +246,7 @@ impl Site { self.register_early_global_fns(); self.render_markdown()?; self.populate_sections(); - self.populate_taxonomies(); + self.populate_taxonomies()?; self.register_tera_global_fns(); Ok(()) @@ -407,9 +407,9 @@ impl Site { } /// Find all the tags and categories if it's asked in the config - pub fn populate_taxonomies(&mut self) { + pub fn populate_taxonomies(&mut self) -> Result<()> { if self.config.taxonomies.is_empty() { - return; + return Ok(()); } self.taxonomies = find_taxonomies( @@ -420,7 +420,9 @@ impl Site { .cloned() .collect::>() .as_slice() - ); + )?; + + Ok(()) } /// Inject live reload script tag if in live reload mode diff --git a/components/site/tests/site.rs b/components/site/tests/site.rs index 3d030ee0..3f44da6a 100644 --- a/components/site/tests/site.rs +++ b/components/site/tests/site.rs @@ -223,7 +223,7 @@ fn can_build_site_with_taxonomies() { taxonomies }; } - site.populate_taxonomies(); + site.populate_taxonomies().unwrap(); let tmp_dir = tempdir().expect("create temp dir"); let public = &tmp_dir.path().join("public"); site.set_output_path(&public); diff --git a/components/taxonomies/src/lib.rs b/components/taxonomies/src/lib.rs index f576c843..9a7d037b 100644 --- a/components/taxonomies/src/lib.rs +++ b/components/taxonomies/src/lib.rs @@ -3,6 +3,7 @@ extern crate serde_derive; extern crate tera; extern crate slug; +#[macro_use] extern crate errors; extern crate config; extern crate content; @@ -110,7 +111,7 @@ impl Taxonomy { } } -pub fn find_taxonomies(config: &Config, all_pages: &[Page]) -> Vec { +pub fn find_taxonomies(config: &Config, all_pages: &[Page]) -> Result> { let taxonomies_def = { let mut m = HashMap::new(); for t in &config.taxonomies { @@ -136,7 +137,7 @@ pub fn find_taxonomies(config: &Config, all_pages: &[Page]) -> Vec { .push(page.clone()); } } else { - // TODO: bail with error + bail!("Page `{}` has taxonomy `{}` which is not defined in config.toml", page.file.path.display(), name); } } } @@ -147,7 +148,7 @@ pub fn find_taxonomies(config: &Config, all_pages: &[Page]) -> Vec { taxonomies.push(Taxonomy::new(taxonomies_def[name].clone(), config, taxo)); } - taxonomies + Ok(taxonomies) } @@ -184,7 +185,7 @@ mod tests { page3.meta.taxonomies = taxo_page3; let pages = vec![page1, page2, page3]; - let taxonomies = find_taxonomies(&config, &pages); + let taxonomies = find_taxonomies(&config, &pages).unwrap(); let (tags, categories, authors) = { let mut t = None; let mut c = None; @@ -228,4 +229,22 @@ mod tests { assert_eq!(categories.items[1].permalink, "http://a-website.com/categories/programming-tutorials/"); assert_eq!(categories.items[1].pages.len(), 1); } + + #[test] + fn errors_on_unknown_taxonomy() { + let mut config = Config::default(); + config.taxonomies = vec![ + Taxonomy {name: "authors".to_string(), ..Taxonomy::default()}, + ]; + let mut page1 = Page::default(); + let mut taxo_page1 = HashMap::new(); + taxo_page1.insert("tags".to_string(), vec!["rust".to_string(), "db".to_string()]); + page1.meta.taxonomies = taxo_page1; + + let taxonomies = find_taxonomies(&config, &vec![page1]); + assert!(taxonomies.is_err()); + let err = taxonomies.unwrap_err(); + // no path as this is created by Default + assert_eq!(err.description(), "Page `` has taxonomy `tags` which is not defined in config.toml"); + } } diff --git a/docs/content/documentation/content/taxonomies.md b/docs/content/documentation/content/taxonomies.md index 77ab8026..d70878c5 100644 --- a/docs/content/documentation/content/taxonomies.md +++ b/docs/content/documentation/content/taxonomies.md @@ -10,7 +10,7 @@ The first step is to define the taxonomies in your [config.toml](./documentation A taxonomy has 4 variables: - `name`: a required string that will be used in the URLs, usually the plural version (i.e. tags, categories etc) -- `paginate`: if this is set to a number, each term page will be paginated by this much. +- `paginate_by`: if this is set to a number, each term page will be paginated by this much. - `paginate_path`: if set, will be the path used by paginated page and the page number will be appended after it. For example the default would be page/1 - `rss`: if set to `true`, a RSS feed will be generated for each individual term. diff --git a/docs/content/documentation/getting-started/configuration.md b/docs/content/documentation/getting-started/configuration.md index 87cae5e2..d552d876 100644 --- a/docs/content/documentation/getting-started/configuration.md +++ b/docs/content/documentation/getting-started/configuration.md @@ -44,7 +44,7 @@ rss_limit = 20 # Example: # taxonomies = [ # {name: "tags", rss: true}, # each tag will have its own RSS feed -# {name: "categories", paginate: 5}, # 5 terms per page +# {name: "categories", paginate_by: 5}, # 5 terms per page # ] # taxonomies = [] From 3e48ff24b5e5f42a78a26310d5f12f276aa74c59 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Mon, 16 Jul 2018 21:13:00 +0200 Subject: [PATCH 49/74] Add an external link checker Close #115 --- CHANGELOG.md | 3 +- Cargo.lock | 324 +++++++++++++++++- Cargo.toml | 1 + components/config/src/lib.rs | 4 + components/link_checker/Cargo.toml | 8 + components/link_checker/src/lib.rs | 88 +++++ components/rendering/Cargo.toml | 1 + components/rendering/src/lib.rs | 1 + components/rendering/src/markdown.rs | 16 +- components/rendering/tests/markdown.rs | 25 ++ .../getting-started/configuration.md | 6 + 11 files changed, 466 insertions(+), 11 deletions(-) create mode 100644 components/link_checker/Cargo.toml create mode 100644 components/link_checker/src/lib.rs diff --git a/CHANGELOG.md b/CHANGELOG.md index 2dd20cd0..0cd819ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ - Taxonomies have been rewritten from scratch to allow custom ones with RSS and pagination - `get_taxonomy_url` has been renamed to `get_taxonomy` and will now return the full taxonomy -instead of just the URL +instead of just the URL of a term ### Others - Fix `serve` not working with the config flag @@ -21,6 +21,7 @@ instead of just the URL - Add image resizing support - Add a 404 template - Enable preserve-order feature of Tera +- Add an external link checker ## 0.3.4 (2018-06-22) diff --git a/Cargo.lock b/Cargo.lock index 37e6fa6c..1c65c247 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,7 +52,7 @@ dependencies = [ "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", "serde_urlencoded 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -209,6 +209,11 @@ name = "bitflags" version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "build_const" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bytecount" version = "0.3.1" @@ -242,7 +247,7 @@ dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -333,6 +338,31 @@ dependencies = [ "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "core-foundation" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "core-foundation-sys" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crc" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-channel" version = "0.1.3" @@ -462,7 +492,7 @@ dependencies = [ "rust-stemmers 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", "strum 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "strum_macros 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -524,6 +554,14 @@ name = "encoding_index_tests" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "encoding_rs" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "error-chain" version = "0.1.12" @@ -609,6 +647,19 @@ name = "fnv" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "front_matter" version = "0.1.0" @@ -816,6 +867,46 @@ name = "humansize" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "hyper" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "relay 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "want 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "hyper-tls" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tls 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "idna" version = "0.1.5" @@ -926,6 +1017,11 @@ name = "language-tags" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "lazy_static" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "lazy_static" version = "1.0.2" @@ -941,6 +1037,24 @@ name = "libc" version = "0.2.42" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "libflate" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "link_checker" +version = "0.1.0" +dependencies = [ + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "reqwest 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "linked-hash-map" version = "0.4.2" @@ -999,7 +1113,7 @@ dependencies = [ "phf_codegen 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "string_cache_codegen 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "tendril 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1117,6 +1231,20 @@ dependencies = [ "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "native-tls" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)", + "schannel 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "net2" version = "0.2.33" @@ -1263,6 +1391,29 @@ dependencies = [ "pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "openssl" +version = "0.9.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.33 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "openssl-sys" +version = "0.9.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", + "vcpkg 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "os_pipe" version = "0.6.1" @@ -1566,6 +1717,14 @@ dependencies = [ "ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "relay" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "remove_dir_all" version = "0.5.1" @@ -1582,6 +1741,7 @@ dependencies = [ "errors 0.1.0", "front_matter 0.1.0", "highlighting 0.1.0", + "link_checker 0.1.0", "pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "pest_derive 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1594,6 +1754,30 @@ dependencies = [ "utils 0.1.0", ] +[[package]] +name = "reqwest" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding_rs 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper-tls 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libflate 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_urlencoded 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tls 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "resolv-conf" version = "0.6.1" @@ -1649,6 +1833,15 @@ dependencies = [ "pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "schannel" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "scoped-tls" version = "0.1.2" @@ -1675,6 +1868,26 @@ dependencies = [ "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "security-framework" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "security-framework-sys" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "semver" version = "0.9.0" @@ -1706,7 +1919,7 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1779,7 +1992,7 @@ dependencies = [ "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1807,6 +2020,11 @@ dependencies = [ "unidecode 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "smallvec" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "smallvec" version = "0.6.2" @@ -1946,11 +2164,16 @@ dependencies = [ "regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "yaml-rust 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "take" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "taxonomies" version = "0.1.0" @@ -2027,7 +2250,7 @@ dependencies = [ "pest_derive 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2159,6 +2382,23 @@ dependencies = [ "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-proto" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "take 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio-reactor" version = "0.1.2" @@ -2172,6 +2412,14 @@ dependencies = [ "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-service" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio-signal" version = "0.1.5" @@ -2221,6 +2469,17 @@ dependencies = [ "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tokio-tls" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "tokio-udp" version = "0.1.1" @@ -2276,6 +2535,11 @@ dependencies = [ "trust-dns-proto 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "try-lock" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "ucd-util" version = "0.1.1" @@ -2384,6 +2648,11 @@ dependencies = [ "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "vcpkg" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "vec_map" version = "0.8.1" @@ -2408,6 +2677,16 @@ dependencies = [ "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "want" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "try-lock 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "widestring" version = "0.2.2" @@ -2519,6 +2798,7 @@ dependencies = [ "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" "checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" "checksum bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c54bb8f454c567f21197eefcdbf5679d0bd99f2ddbe52e84c77061952e6789" +"checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" "checksum bytecount 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "882585cd7ec84e902472df34a5e01891202db3bf62614e1f0afe459c1afcf744" "checksum byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "74c0b906e9446b0a2e4f760cdb3fa4b2c48cdc6db8766a845c54b6ff063fd2e9" "checksum bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c129aff112dcc562970abb69e2508b40850dd24c274761bb50fb8a0067ba6c27" @@ -2531,6 +2811,9 @@ dependencies = [ "checksum cmake 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "95470235c31c726d72bf2e1f421adc1e65b9d561bf5529612cbe1a72da1467b3" "checksum color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbbb57365263e881e805dc77d94697c9118fd94d8da011240555aa7b23445bd" "checksum cookie 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "746858cae4eae40fff37e1998320068df317bc247dc91a67c6cfa053afdc2abb" +"checksum core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25bfd746d203017f7d5cbd31ee5d8e17f94b6521c7af77ece6c9e4b2d4b16c67" +"checksum core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "065a5d7ffdcbc8fa145d6f0746f3555025b9097a9e9cda59f7467abae670c78d" +"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" "checksum crossbeam-channel 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "862becd07e73da5746de6d9b3ba055c9bb8b10afd0d2b51155a6e30d81cd20b3" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" "checksum crossbeam-deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fe8153ef04a7594ded05b427ffad46ddeaf22e63fd48d42b3e1e3bb4db07cae7" @@ -2552,6 +2835,7 @@ dependencies = [ "checksum encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" "checksum encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" "checksum encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" +"checksum encoding_rs 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "98fd0f24d1fb71a4a6b9330c8ca04cbd4e7cc5d846b54ca74ff376bc7c9f798d" "checksum error-chain 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faa976b4fd2e4c2b2f3f486874b19e61944d3de3de8b61c9fcf835d583871bcc" "checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3" "checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" @@ -2561,6 +2845,8 @@ dependencies = [ "checksum filetime 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "714653f3e34871534de23771ac7b26e999651a0a228f47beb324dfdf1dd4b10f" "checksum flate2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9fac2277e84e5e858483756647a9d0aa8d9a2b7cba517fd84325a0aaa69a0909" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" +"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" "checksum fs_extra 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5f2a4a2034423744d2cc7ca2068453168dcdb82c438419e639a26bd87839c674" "checksum fsevent 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "c4bbbf71584aeed076100b5665ac14e3d85eeb31fdbb45fbd41ef9a682b5ec05" "checksum fsevent-sys 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1a772d36c338d07a032d5375a36f15f9a7043bf0cb8ce7cee658e037c6032874" @@ -2581,6 +2867,8 @@ dependencies = [ "checksum http-range 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f2e4003e6fd05ea9109db00415e670b11f511a42e567ff2d5d771cbdfa24e02" "checksum httparse 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7b6288d7db100340ca12873fd4d08ad1b8f206a9457798dfb17c018a33fee540" "checksum humansize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6cab2627acfc432780848602f3f558f7e9dd427352224b0d9324025796d2a5e" +"checksum hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)" = "34a590ca09d341e94cddf8e5af0bbccde205d5fbc2fa3c09dd67c7f85cea59d7" +"checksum hyper-tls 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a5aa51f6ae9842239b0fac14af5f22123b8432b4cc774a44ff059fcba0f675ca" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebdff791af04e30089bde8ad2a632b86af433b40c04db8d70ad4b21487db7a6a" "checksum indexmap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08173ba1e906efb6538785a8844dd496f5d34f0a2d88038e95195172fc667220" @@ -2592,9 +2880,11 @@ dependencies = [ "checksum jpeg-decoder 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "c8b7d43206b34b3f94ea9445174bda196e772049b9bddbc620c9d29b2d20110d" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" +"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" "checksum lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fb497c35d362b6a331cfd94956a07fc2c78a4604cdbee844a81170386b996dd3" "checksum lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a6f08839bc70ef4a3fe1d566d5350f519c5912ea86be0df1740a7d247c7fc0ef" "checksum libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "b685088df2b950fccadf07a7187c8ef846a959c142338a48f9dc0b94517eb5f1" +"checksum libflate 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "7d4b4c7aff5bac19b956f693d0ea0eade8066deb092186ae954fa6ba14daab98" "checksum linked-hash-map 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7860ec297f7008ff7a1e3382d7f7e1dcd69efc94751a2284bafc3d013c2aa939" "checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" @@ -2615,6 +2905,7 @@ dependencies = [ "checksum mio-uds 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "84c7b5caa3a118a6e34dbac36504503b1e8dc5835e833306b9d6af0e05929f79" "checksum miow 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3e690c5df6b2f60acd45d56378981e827ff8295562fc8d34f573deb267a59cd1" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" +"checksum native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f74dbadc8b43df7864539cedb7bc91345e532fdd913cfdc23ad94f4d2d40fbc0" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" "checksum new_debug_unreachable 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0cdc457076c78ab54d5e0d6fa7c47981757f1e34dc39ff92787f217dede586c4" "checksum nix 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fd5681d13fda646462cfbd4e5f2051279a89a544d50eb98c365b507246839f" @@ -2630,6 +2921,8 @@ dependencies = [ "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" "checksum onig 3.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f5eeb268a4620c74ea5768c6d2ccd492d60a47a8754666b91a46bfc35cd4d1ba" "checksum onig_sys 68.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c6be7c4f985508684e54f18dd37f71e66f3e1ad9318336a520d7e42f0d3ea8e" +"checksum openssl 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)" = "a3605c298474a3aa69de92d21139fb5e2a81688d308262359d85cdd0d12a7985" +"checksum openssl-sys 0.9.33 (registry+https://github.com/rust-lang/crates.io-index)" = "d8abc04833dcedef24221a91852931df2f63e3369ae003134e70aff3645775cc" "checksum os_pipe 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934868c3f86ed7a39ef63d88edeac5bd49a0c843192651900e9ce1178cbbf157" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" @@ -2663,7 +2956,9 @@ dependencies = [ "checksum regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8e931c58b93d86f080c734bfd2bce7dd0079ae2331235818133c8be7f422e20e" "checksum regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7" "checksum regex-syntax 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05b06a75f5217880fc5e905952a42750bf44787e56a6c6d6852ed0992f5e1d54" +"checksum relay 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1576e382688d7e9deecea24417e350d3062d97e32e45d70b1cde65994ff1489a" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" +"checksum reqwest 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2abe46f8e00792693a2488e296c593d1f4ea39bb1178cfce081d6793657575e4" "checksum resolv-conf 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c62bd95a41841efdf7fca2ae9951e64a8d8eae7e5da196d8ce489a2241491a92" "checksum rust-stemmers 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fbf06149ec391025664a5634200ced1afb489f0f3f8a140d515ebc0eb04b4bc0" "checksum rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "76d7ba1feafada44f2d38eed812bd2489a03c0f5abb975799251518b68848649" @@ -2671,14 +2966,17 @@ dependencies = [ "checksum same-file 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfb6eded0b06a0b512c8ddbcf04089138c9b4362c2f696f3c3d76039d68f3637" "checksum sass-rs 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90f8cf6e645aa843ffffcbdc1e8752b1f221dfa314c81895aeb229a77aea7e05" "checksum sass-sys 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "bae88baa915f59c39820e544cfd9296d815a6b8efc3f276a78a0505866d2b4e9" +"checksum schannel 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "dc1fabf2a7b6483a141426e1afd09ad543520a77ac49bd03c286e7696ccfd77f" "checksum scoped-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "332ffa32bf586782a3efaeb58f127980944bbc8c4d6913a86107ac2a5ab24b28" "checksum scoped_threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" +"checksum security-framework 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "dfa44ee9c54ce5eecc9de7d5acbad112ee58755239381f687e564004ba4a2332" +"checksum security-framework-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "5421621e836278a0b139268f36eee0dc7e389b784dc3f79d8f11aabadf41bead" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)" = "0c3adf19c07af6d186d91dae8927b83b0553d07ca56cbf7f2f32560455c91920" "checksum serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)" = "3525a779832b08693031b8ecfb0de81cd71cfd3812088fafe9a7496789572124" -"checksum serde_json 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)" = "84b8035cabe9b35878adec8ac5fe03d5f6bc97ff6edd7ccb96b44c1276ba390e" +"checksum serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c6908c7b925cd6c590358a4034de93dbddb20c45e1d021931459fd419bf0e2" "checksum serde_urlencoded 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e703cef904312097cfceab9ce131ff6bbe09e8c964a0703345a5f49238757bc1" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum shared_child 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bcd5e483b3475af9bc2a35311c2f3bbf0bd98fde91410ab15a0d4ba3c3127b4e" @@ -2688,6 +2986,7 @@ dependencies = [ "checksum slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b4fcaed89ab08ef143da37bc52adbcc04d4a69014f4c1208d6b51f0c47bc23" "checksum slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fdeff4cd9ecff59ec7e3744cbca73dfe5ac35c2aedb2cfba8a1c715a18912e9d" "checksum slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "797bcb4d24e91239a8615415814f4afb2d8ca400c472de3c73f803a5a7689e11" +"checksum smallvec 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4c8cbcd6df1e117c2210e13ab5109635ad68a929fcbb8964dc965b76cb5ee013" "checksum smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "312a7df010092e73d6bbaf141957e868d4f30efd2bfd9bb1028ad91abec58514" "checksum socket2 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "962a516af4d3a7c272cb3a1d50a8cc4e5b41802e4ad54cfb7bee8ba61d37d703" "checksum stable_deref_trait 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ffbc596e092fe5f598b12ef46cc03754085ac2f4d8c739ad61c4ae266cc3b3fa" @@ -2704,6 +3003,7 @@ dependencies = [ "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" "checksum synstructure 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a761d12e6d8dcb4dcf952a7a89b475e3a9d69e4a69307e01a470977642914bd" "checksum syntect 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc8a6f0db88d4afc340522c20d260411e746b2225b257c6b238a75de9d7cec78" +"checksum take 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b157868d8ac1f56b64604539990685fa7611d8fa9e5476cf0c02cf34d32917c5" "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" "checksum tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "47776f63b85777d984a50ce49d6b9e58826b6a3766a449fc95bc66cd5663c15b" "checksum tendril 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9de21546595a0873061940d994bbbc5c35f024ae4fd61ec5c5b159115684f508" @@ -2720,15 +3020,19 @@ dependencies = [ "checksum tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8cac2a7883ff3567e9d66bb09100d09b33d90311feca0206c7ca034bc0c55113" "checksum tokio-fs 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "40697ecbea5660df15b15d50a077386477d2f6a35002adf01ce76ff9dd9dce48" "checksum tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a5c9635ee806f26d302b8baa1e145689a280d8f5aa8d0552e7344808da54cc21" +"checksum tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fbb47ae81353c63c487030659494b295f6cb6576242f907f203473b191b0389" "checksum tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e00ec63bbec2c97ce1178cb0587b2c438b2f6b09d3ee54a33c45a9cf0d530810" +"checksum tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24da22d077e0f15f55162bdbdc661228c1581892f52074fb242678d015b45162" "checksum tokio-signal 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e8f46863230f9a05cf52d173721ec391b9c5782a2465f593029922b8782b9ffe" "checksum tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ec9b094851aadd2caf83ba3ad8e8c4ce65a42104f7b94d9e6550023f0407853f" "checksum tokio-threadpool 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "24ab84f574027b0e875378f31575cf175360891919e93a3490f07e76e00e4efb" "checksum tokio-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "028b94314065b90f026a21826cffd62a4e40a92cda3e5c069cc7b02e5945f5e9" +"checksum tokio-tls 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "772f4b04e560117fe3b0a53e490c16ddc8ba6ec437015d91fa385564996ed913" "checksum tokio-udp 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "43eb534af6e8f37d43ab1b612660df14755c42bd003c5f8d2475ee78cc4600c0" "checksum toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a0263c6c02c4db6c8f7681f9fd35e90de799ebd4cfdeab77a38f4ff6b3d8c0d9" "checksum trust-dns-proto 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cbbddb93547eeee847367d8f59b68002294a7b4df31c143fbee4109ce0c61a04" "checksum trust-dns-resolver 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9b0a0c9d4f8dd56481209c5ae1a8965ed022461d352c81fb92466ec9d846929e" +"checksum try-lock 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee2aa4715743892880f70885373966c83d73ef1b0838a664ef0c76fffd35e7c2" "checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" "checksum unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284b6d3db520d67fbe88fd778c21510d1b0ba4a551e5d0fbb023d33405f6de8a" @@ -2744,10 +3048,12 @@ dependencies = [ "checksum utf-8 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f1262dfab4c30d5cb7c07026be00ee343a6cf5027fdc0104a9160f354e5db75c" "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" "checksum uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e1436e58182935dcd9ce0add9ea0b558e8a87befe01c1a301e6020aeb0876363" +"checksum vcpkg 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cbe533e138811704c0e3cbde65a818b35d3240409b4346256c5ede403e082474" "checksum vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05c78687fb1a80548ae3250346c3db86a80a7cdd77bda190189f2d0a0987c81a" "checksum version_check 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7716c242968ee87e5542f8021178248f267f295a5c4803beae8b8b7fd9bc6051" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "63636bd0eb3d00ccb8b9036381b526efac53caf112b7783b730ab3f8e44da369" +"checksum want 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a05d9d966753fa4b5c8db73fcab5eed4549cfe0e1e4e66911e5564a0085c35d1" "checksum widestring 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7157704c2e12e3d2189c507b7482c52820a16dfa4465ba91add92f266667cadb" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "773ef9dcc5f24b7d850d0ff101e542ff24c3b090a9768e03ff889fdef41f00fd" diff --git a/Cargo.toml b/Cargo.toml index 9adabaa4..aa9c37c9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,4 +53,5 @@ members = [ "components/utils", "components/search", "components/imageproc", + "components/link_checker", ] diff --git a/components/config/src/lib.rs b/components/config/src/lib.rs index 3efa7abb..46a41090 100644 --- a/components/config/src/lib.rs +++ b/components/config/src/lib.rs @@ -104,6 +104,9 @@ pub struct Config { #[serde(skip_serializing, skip_deserializing)] // not a typo, 2 are needed pub ignored_content_globset: Option, + /// Whether to check all external links for validity + pub check_external_links: bool, + /// All user params set in [extra] in the config pub extra: HashMap, @@ -225,6 +228,7 @@ impl Default for Config { rss_limit: 10_000, taxonomies: Vec::new(), compile_sass: false, + check_external_links: false, build_search_index: false, ignored_content: Vec::new(), ignored_content_globset: None, diff --git a/components/link_checker/Cargo.toml b/components/link_checker/Cargo.toml new file mode 100644 index 00000000..92b49b02 --- /dev/null +++ b/components/link_checker/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "link_checker" +version = "0.1.0" +authors = ["Vincent Prouillet "] + +[dependencies] +reqwest = "0.8" +lazy_static = "1" diff --git a/components/link_checker/src/lib.rs b/components/link_checker/src/lib.rs new file mode 100644 index 00000000..4d2d3324 --- /dev/null +++ b/components/link_checker/src/lib.rs @@ -0,0 +1,88 @@ +extern crate reqwest; +#[macro_use] +extern crate lazy_static; + +use std::collections::HashMap; +use std::error::Error; +use std::sync::{Arc, RwLock}; +use reqwest::{StatusCode}; + + +#[derive(Clone, Debug, PartialEq)] +pub struct LinkResult { + pub code: Option, + /// Whether the HTTP request didn't make it to getting a HTTP code + pub error: Option, +} + +impl LinkResult { + pub fn is_valid(&self) -> bool { + if self.error.is_some() { + return false; + } + + if let Some(c) = self.code { + return c.is_success(); + } + + true + } + + pub fn message(&self) -> String { + if let Some(ref e) = self.error { + return e.clone(); + } + + if let Some(c) = self.code { + return format!("{}", c); + } + + "Unknown error".to_string() + } +} + +lazy_static! { + // Keep history of link checks so a rebuild doesn't have to check again + static ref LINKS: Arc>> = Arc::new(RwLock::new(HashMap::new())); +} + +pub fn check_url(url: &str) -> LinkResult { + { + let guard = LINKS.read().unwrap(); + if let Some(res) = guard.get(url) { + return res.clone(); + } + } + + // Need to actually do the link checking + let res = match reqwest::get(url) { + Ok(response) => LinkResult { code: Some(response.status()), error: None }, + Err(e) => LinkResult { code: None, error: Some(e.description().to_string()) }, + }; + + LINKS.write().unwrap().insert(url.to_string(), res.clone()); + return res; +} + +#[cfg(test)] +mod tests { + use super::{LINKS, check_url}; + + #[test] + fn can_validate_ok_links() { + let url = "https://google.com"; + let res = check_url(url); + assert!(res.is_valid()); + assert!(LINKS.read().unwrap().get(url).is_some()); + let res = check_url(url); + assert!(res.is_valid()); + } + + #[test] + fn can_fail_404_links() { + let res = check_url("https://google.comys"); + assert_eq!(res.is_valid(), false); + assert!(res.code.is_none()); + assert!(res.error.is_some()); + } +} diff --git a/components/rendering/Cargo.toml b/components/rendering/Cargo.toml index c3c2e97d..22a6e6fa 100644 --- a/components/rendering/Cargo.toml +++ b/components/rendering/Cargo.toml @@ -18,6 +18,7 @@ front_matter = { path = "../front_matter" } highlighting = { path = "../highlighting"} utils = { path = "../utils" } config = { path = "../config" } +link_checker = { path = "../link_checker" } [dev-dependencies] templates = { path = "../templates" } diff --git a/components/rendering/src/lib.rs b/components/rendering/src/lib.rs index 9c5da90b..540b021c 100644 --- a/components/rendering/src/lib.rs +++ b/components/rendering/src/lib.rs @@ -15,6 +15,7 @@ extern crate front_matter; extern crate highlighting; extern crate utils; extern crate config; +extern crate link_checker; #[cfg(test)] extern crate templates; diff --git a/components/rendering/src/markdown.rs b/components/rendering/src/markdown.rs index c0694b85..9ceda569 100644 --- a/components/rendering/src/markdown.rs +++ b/components/rendering/src/markdown.rs @@ -9,6 +9,7 @@ use syntect::html::{start_coloured_html_snippet, styles_to_coloured_html, Includ use errors::Result; use utils::site::resolve_internal_link; use highlighting::{get_highlighter, THEME_SET}; +use link_checker::check_url; use table_of_contents::{TempHeader, Header, make_table_of_contents}; use context::RenderContext; @@ -138,7 +139,20 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<(Strin } else if is_colocated_asset_link(&link) { format!("{}{}", context.current_page_permalink, link) } else { - link.to_string() + if context.config.check_external_links && !link.starts_with('#') { + println!("Checking Link {}", link); + let res = check_url(&link); + if res.is_valid() { + link.to_string() + } else { + error = Some( + format!("Link {} is not valid: {}", link, res.message()).into() + ); + String::new() + } + } else { + link.to_string() + } }; if in_header { diff --git a/components/rendering/tests/markdown.rs b/components/rendering/tests/markdown.rs index eda40362..e4d50c1a 100644 --- a/components/rendering/tests/markdown.rs +++ b/components/rendering/tests/markdown.rs @@ -537,3 +537,28 @@ Some text "

Some text

\n

Helo

\n
\n\n \"MobX\n \n
\n" ); } + +#[test] +fn can_validate_valid_external_links() { + let permalinks_ctx = HashMap::new(); + let mut config = Config::default(); + config.check_external_links = true; + let context = RenderContext::new(&GUTENBERG_TERA, &config, "https://vincent.is/about/", &permalinks_ctx, InsertAnchor::None); + let res = render_content("[a link](http://google.com)", &context).unwrap(); + assert_eq!( + res.0, + "

a link

\n" + ); +} + +#[test] +fn can_show_error_message_for_invalid_external_links() { + let permalinks_ctx = HashMap::new(); + let mut config = Config::default(); + config.check_external_links = true; + let context = RenderContext::new(&GUTENBERG_TERA, &config, "https://vincent.is/about/", &permalinks_ctx, InsertAnchor::None); + let res = render_content("[a link](http://google.comy)", &context); + assert!(res.is_err()); + let err = res.unwrap_err(); + assert!(err.description().contains("Link http://google.comy is not valid")); +} diff --git a/docs/content/documentation/getting-started/configuration.md b/docs/content/documentation/getting-started/configuration.md index d552d876..7a0ce6bb 100644 --- a/docs/content/documentation/getting-started/configuration.md +++ b/docs/content/documentation/getting-started/configuration.md @@ -56,6 +56,12 @@ compile_sass = false # content for the `default_language` build_search_index = false +# Go through every links in all content and check if the links are valid +# If a link is invalid (404, 500, etc), the build will error. +# Link checking can take a very long time if you have many links so this should +# only enabled once in a while to catch any dead links. +check_external_links = false + # A list of glob patterns specifying asset files to ignore when # processing the content directory. # Defaults to none, which means all asset files are copied over to the public folder. From d0066cb4978e4fbe60f32ece2bd2f32d940863f0 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Tue, 17 Jul 2018 12:37:11 +0200 Subject: [PATCH 50/74] Update appveyor min version --- Cargo.lock | 34 +++++++++++++++++----------------- appveyor.yml | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1c65c247..21215813 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -319,7 +319,7 @@ dependencies = [ "errors 0.1.0", "front_matter 0.1.0", "globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "rendering 0.1.0", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -941,7 +941,7 @@ dependencies = [ "errors 0.1.0", "image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", @@ -1000,7 +1000,7 @@ version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1325,7 +1325,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1564,7 +1564,7 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1602,7 +1602,7 @@ name = "quote" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1627,23 +1627,23 @@ dependencies = [ [[package]] name = "rayon" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rayon-core" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1912,7 +1912,7 @@ name = "serde_derive" version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1970,7 +1970,7 @@ dependencies = [ "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "imageproc 0.1.0", "pagination 0.1.0", - "rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "sass-rs 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "search 0.1.0", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2097,7 +2097,7 @@ name = "strum_macros" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2127,7 +2127,7 @@ name = "syn" version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2939,7 +2939,7 @@ dependencies = [ "checksum png 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f54b9600d584d3b8a739e1662a595fab051329eff43f20e7d8cc22872962145b" "checksum precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" "checksum proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1b06e2f335f48d24442b35a19df506a835fb3547bc3c06ef27340da9acf5cae7" -"checksum proc-macro2 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "effdb53b25cdad54f8f48843d67398f7ef2e14f12c1b4cb4effc549a6462a4d6" +"checksum proc-macro2 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c65b1ea15bb859d922cade2d1765b4b88beac339cbfad545ef2d2ef8c8215ee6" "checksum pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d6fdf85cda6cadfae5428a54661d431330b312bc767ddbc57adbedc24da66e32" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" @@ -2947,8 +2947,8 @@ dependencies = [ "checksum quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e44651a0dc4cdd99f71c83b561e221f714912d11af1a4dff0631f923d53af035" "checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" -"checksum rayon 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "80e811e76f1dbf68abf87a759083d34600017fc4e10b6bd5ad84a700f9dba4b1" -"checksum rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d24ad214285a7729b174ed6d3bcfcb80177807f959d95fafd5bfc5c4f201ac8" +"checksum rayon 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "df7a791f788cb4c516f0e091301a29c2b71ef680db5e644a7d68835c8ae6dbfa" +"checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" "checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" "checksum regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9329abc99e39129fcceabd24cf5d85b4671ef7c29c50e972bc5afe32438ec384" diff --git a/appveyor.yml b/appveyor.yml index f39c6a8f..1f6418e7 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -10,7 +10,7 @@ environment: matrix: - target: x86_64-pc-windows-msvc - RUST_VERSION: 1.25.0 + RUST_VERSION: 1.27.0 - target: x86_64-pc-windows-msvc RUST_VERSION: stable From f37b19db6af8316c0d13fe0eb532f18304d0936a Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Tue, 17 Jul 2018 17:58:58 +0200 Subject: [PATCH 51/74] Add archive docs Fix #307 --- .../documentation/templates/archive.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 docs/content/documentation/templates/archive.md diff --git a/docs/content/documentation/templates/archive.md b/docs/content/documentation/templates/archive.md new file mode 100644 index 00000000..cf04c061 --- /dev/null +++ b/docs/content/documentation/templates/archive.md @@ -0,0 +1,23 @@ ++++ +title = "Archive" +weight = 90 ++++ + +Gutenberg doesn't have a built-in way to display an archive page, a page showing +all post titles ordered by year. However, this can be accomplished directly in the templates: + +```jinja2 +{% for year, posts in section.pages | group_by(attribute="year") %} +

{{ year }}

+ + +{% endfor %} +``` + +This snippet assumes that posts are sorted by date and that you want to display the archive +in a descending order. If you want to show articles in a ascending order, simply add a `reverse` filter +after the `group_by`. From a958f9695506a7c775d3ba2e27e555a520578755 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Sun, 22 Jul 2018 12:14:16 +0200 Subject: [PATCH 52/74] Update actix --- Cargo.lock | 326 ++++++++++++++++++++++++++--------------------- Cargo.toml | 3 +- src/cmd/serve.rs | 25 ++-- src/main.rs | 1 - 4 files changed, 196 insertions(+), 159 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 21215813..2d72ba7b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,65 +1,76 @@ [[package]] name = "actix" -version = "0.5.8" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "actix_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-channel 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-channel 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "skeptic 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-signal 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "trust-dns-resolver 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-signal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-resolver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "actix-web" -version = "0.6.15" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "actix 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", + "actix 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "base64 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "cookie 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "h2 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "htmlescape 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "http-range 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "lazycell 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "mime 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_urlencoded 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "version_check 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -90,13 +101,13 @@ dependencies = [ [[package]] name = "ammonia" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "html5ever 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "maplit 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "matches 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "tendril 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -137,7 +148,7 @@ dependencies = [ "dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -149,7 +160,7 @@ dependencies = [ "backtrace-sys 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -214,11 +225,6 @@ name = "build_const" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "bytecount" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "byteorder" version = "1.2.3" @@ -238,18 +244,6 @@ dependencies = [ "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "cargo_metadata" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "cc" version = "1.0.18" @@ -284,6 +278,14 @@ dependencies = [ "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "cloudabi" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cmake" version = "0.1.31" @@ -323,7 +325,7 @@ dependencies = [ "rendering 0.1.0", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", @@ -365,12 +367,14 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.1.3" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "crossbeam-epoch 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-epoch 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -418,6 +422,19 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-epoch" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-utils" version = "0.2.2" @@ -434,6 +451,11 @@ dependencies = [ "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-utils" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "ctrlc" version = "3.1.1" @@ -488,7 +510,7 @@ version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "rust-stemmers 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", @@ -578,14 +600,6 @@ dependencies = [ "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "error-chain" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "error-chain" version = "0.12.0" @@ -667,7 +681,7 @@ dependencies = [ "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "errors 0.1.0", "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -777,8 +791,7 @@ dependencies = [ name = "gutenberg" version = "0.4.0" dependencies = [ - "actix 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", - "actix-web 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-web 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "content 0.1.0", @@ -842,6 +855,11 @@ dependencies = [ "syn 0.13.11 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "htmlescape" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "http" version = "0.1.7" @@ -852,11 +870,6 @@ dependencies = [ "itoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "http-range" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "httparse" version = "1.3.2" @@ -912,7 +925,7 @@ name = "idna" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "matches 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -942,7 +955,7 @@ dependencies = [ "image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -1032,6 +1045,11 @@ name = "lazycell" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "lazycell" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "libc" version = "0.2.42" @@ -1065,6 +1083,15 @@ name = "linked-hash-map" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "lock_api" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.3.9" @@ -1121,7 +1148,7 @@ dependencies = [ [[package]] name = "matches" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1325,7 +1352,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1388,7 +1415,7 @@ dependencies = [ "cmake 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)", "duct 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1410,7 +1437,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1455,6 +1482,15 @@ dependencies = [ "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.2.14" @@ -1462,7 +1498,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1523,7 +1559,7 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1564,7 +1600,7 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1602,7 +1638,7 @@ name = "quote" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1625,6 +1661,23 @@ dependencies = [ "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rand" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand_core" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "rayon" version = "1.0.2" @@ -1656,7 +1709,7 @@ dependencies = [ "fs_extra 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "highlighting 0.1.0", "site 0.1.0", - "tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.0.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1686,12 +1739,12 @@ dependencies = [ [[package]] name = "regex" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1711,7 +1764,7 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1798,7 +1851,7 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1830,7 +1883,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1861,7 +1914,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "search" version = "0.1.0" dependencies = [ - "ammonia 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ammonia 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "content 0.1.0", "elasticlunr-rs 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "errors 0.1.0", @@ -1888,20 +1941,6 @@ dependencies = [ "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "serde" version = "1.0.70" @@ -1912,7 +1951,7 @@ name = "serde_derive" version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1976,27 +2015,12 @@ dependencies = [ "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "taxonomies 0.1.0", - "tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "templates 0.1.0", "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] -[[package]] -name = "skeptic" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bytecount 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cargo_metadata 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", - "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "slab" version = "0.1.3" @@ -2027,8 +2051,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "smallvec" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "socket2" @@ -2097,7 +2124,7 @@ name = "strum_macros" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2127,7 +2154,7 @@ name = "syn" version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2200,11 +2227,11 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2248,7 +2275,7 @@ dependencies = [ "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "pest_derive 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2422,15 +2449,16 @@ dependencies = [ [[package]] name = "tokio-signal" -version = "0.1.5" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", "mio-uds 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2504,7 +2532,7 @@ dependencies = [ [[package]] name = "trust-dns-proto" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2514,16 +2542,23 @@ dependencies = [ "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "socket2 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-udp 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "trust-dns-resolver" -version = "0.8.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "ipconfig 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2531,8 +2566,9 @@ dependencies = [ "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "resolv-conf 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "trust-dns-proto 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "trust-dns-proto 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2566,7 +2602,7 @@ name = "unicode-bidi" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "matches 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2614,7 +2650,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "matches 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2633,7 +2669,7 @@ name = "utils" version = "0.1.0" dependencies = [ "errors 0.1.0", - "tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 3.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2779,12 +2815,12 @@ dependencies = [ ] [metadata] -"checksum actix 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7f0b2daad36916ccd2b162dbc5a04a74df642a29391b1a341c8ee3e82026cb16" -"checksum actix-web 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)" = "cebfb353ebcae66f93c190b80ef12b8c82557413856e3e65dbaab662a48ec72d" +"checksum actix 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "28b4c697e6e63280f874c1d3e30c476de1cc589efd91b32b748a17808cb4adc3" +"checksum actix-web 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1bf2bc88dea9c852b9e2fc1c509a422907e05e83d06bef510e8f493b3396f01a" "checksum actix_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4b1dc922654b9aca7a8a31eab875fde804fa9fbd67f220f2e457787b23590f2" "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aho-corasick 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c6d463cbe7ed28720b5b489e7c083eeb8f90d08be2a0d6bb9e1ffea9ce1afa" -"checksum ammonia 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fd4c682378117e4186a492b2252b9537990e1617f44aed9788b9a1149de45477" +"checksum ammonia 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a8b93ecb80665873703bf3b0a77f369c96b183d8e0afaf30a3ff5ff07dfc6409" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" "checksum atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2fc4a1aa4c24c0718a250f0681885c1af91419d242f29eb8f2ab28502d80dbd1" @@ -2799,28 +2835,29 @@ dependencies = [ "checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" "checksum bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c54bb8f454c567f21197eefcdbf5679d0bd99f2ddbe52e84c77061952e6789" "checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" -"checksum bytecount 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "882585cd7ec84e902472df34a5e01891202db3bf62614e1f0afe459c1afcf744" "checksum byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "74c0b906e9446b0a2e4f760cdb3fa4b2c48cdc6db8766a845c54b6ff063fd2e9" "checksum bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c129aff112dcc562970abb69e2508b40850dd24c274761bb50fb8a0067ba6c27" "checksum bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7dd32989a66957d3f0cba6588f15d4281a733f4e9ffc43fcd2385f57d3bf99ff" -"checksum cargo_metadata 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1efca0b863ca03ed4c109fb1c55e0bc4bbeb221d3e103d86251046b06a526bd0" "checksum cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "2119ea4867bd2b8ed3aecab467709720b2d55b1bcfe09f772fd68066eaf15275" "checksum cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efe5c877e17a9c717a0bf3613b2709f723202c4e4675cc8f12926ded29bcb17e" "checksum chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6962c635d530328acc53ac6a955e83093fedc91c5809dfac1fa60fa470830a37" "checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e" +"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum cmake 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "95470235c31c726d72bf2e1f421adc1e65b9d561bf5529612cbe1a72da1467b3" "checksum color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbbb57365263e881e805dc77d94697c9118fd94d8da011240555aa7b23445bd" "checksum cookie 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "746858cae4eae40fff37e1998320068df317bc247dc91a67c6cfa053afdc2abb" "checksum core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25bfd746d203017f7d5cbd31ee5d8e17f94b6521c7af77ece6c9e4b2d4b16c67" "checksum core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "065a5d7ffdcbc8fa145d6f0746f3555025b9097a9e9cda59f7467abae670c78d" "checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" -"checksum crossbeam-channel 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "862becd07e73da5746de6d9b3ba055c9bb8b10afd0d2b51155a6e30d81cd20b3" +"checksum crossbeam-channel 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "efff2d411e0ac3731b9f6de882b2790fdd2de651577500a806ce78b95b2b9f31" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" "checksum crossbeam-deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fe8153ef04a7594ded05b427ffad46ddeaf22e63fd48d42b3e1e3bb4db07cae7" "checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150" "checksum crossbeam-epoch 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2af0e75710d6181e234c8ecc79f14a97907850a541b13b0be1dd10992f2e4620" +"checksum crossbeam-epoch 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "285987a59c4d91388e749850e3cb7b3a92299668528caaacd08005b8f238c0ea" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crossbeam-utils 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d636a8b3bcc1b409d7ffd3facef8f21dcb4009626adbd0c5e6c4305c07253c7b" +"checksum crossbeam-utils 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ea52fab26a99d96cdff39d0ca75c9716125937f5dba2ab83923aaaf5928f684a" "checksum ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "630391922b1b893692c6334369ff528dcc3a9d8061ccf4c803aa8f83cb13db5e" "checksum dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97590ba53bcb8ac28279161ca943a924d1fd4a8fb3fa63302591647c4fc5b850" "checksum deflate 0.7.18 (registry+https://github.com/rust-lang/crates.io-index)" = "32c8120d981901a9970a3a1c97cf8b630e0fa8c3ca31e75b6fd6fd5f9f427b31" @@ -2837,7 +2874,6 @@ dependencies = [ "checksum encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" "checksum encoding_rs 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "98fd0f24d1fb71a4a6b9330c8ca04cbd4e7cc5d846b54ca74ff376bc7c9f798d" "checksum error-chain 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faa976b4fd2e4c2b2f3f486874b19e61944d3de3de8b61c9fcf835d583871bcc" -"checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3" "checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" "checksum error-chain 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6930e04918388a9a2e41d518c25cf679ccafe26733fb4127dbf21993f2575d46" "checksum failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934799b6c1de475a012a02dab0ace1ace43789ee4b99bcfbf1a2e3e8ced5de82" @@ -2863,8 +2899,8 @@ dependencies = [ "checksum h2 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "6229ac66d3392dd83288fe04defd4b353354b15bbe07820d53dda063a736afcc" "checksum hostname 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "21ceb46a83a85e824ef93669c8b390009623863b5c195d1ba747292c0c72f94e" "checksum html5ever 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b04478cf718862650a0bf66acaf8f2f8c906fbc703f35c916c1f4211b069a364" +"checksum htmlescape 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e9025058dae765dee5070ec375f591e2ba14638c63feff74f13805a72e523163" "checksum http 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "4fbced8864b04c030eebcb7d0dc3a81ba5231ac559f5116a29a8ba83ecee22cd" -"checksum http-range 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f2e4003e6fd05ea9109db00415e670b11f511a42e567ff2d5d771cbdfa24e02" "checksum httparse 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7b6288d7db100340ca12873fd4d08ad1b8f206a9457798dfb17c018a33fee540" "checksum humansize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6cab2627acfc432780848602f3f558f7e9dd427352224b0d9324025796d2a5e" "checksum hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)" = "34a590ca09d341e94cddf8e5af0bbccde205d5fbc2fa3c09dd67c7f85cea59d7" @@ -2883,10 +2919,12 @@ dependencies = [ "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" "checksum lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fb497c35d362b6a331cfd94956a07fc2c78a4604cdbee844a81170386b996dd3" "checksum lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a6f08839bc70ef4a3fe1d566d5350f519c5912ea86be0df1740a7d247c7fc0ef" +"checksum lazycell 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d33a48d0365c96081958cc663eef834975cb1e8d8bea3378513fc72bdbf11e50" "checksum libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)" = "b685088df2b950fccadf07a7187c8ef846a959c142338a48f9dc0b94517eb5f1" "checksum libflate 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "7d4b4c7aff5bac19b956f693d0ea0eade8066deb092186ae954fa6ba14daab98" "checksum linked-hash-map 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7860ec297f7008ff7a1e3382d7f7e1dcd69efc94751a2284bafc3d013c2aa939" "checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e" +"checksum lock_api 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "949826a5ccf18c1b3a7c3d57692778d21768b79e46eb9dd07bfc4c2160036c54" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "61bd98ae7f7b754bc53dca7d44b604f733c6bba044ea6f41bc8d89272d8161d2" "checksum lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4d06ff7ff06f729ce5f4e227876cb88d10bc59cd4ae1e09fbb2bde15c850dc21" @@ -2894,7 +2932,7 @@ dependencies = [ "checksum mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" "checksum maplit 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08cbb6b4fef96b6d77bfc40ec491b1690c779e77b05cd9f07f787ed376fd4c43" "checksum markup5ever 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfedc97d5a503e96816d10fedcd5b42f760b2e525ce2f7ec71f6a41780548475" -"checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376" +"checksum matches 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "835511bab37c34c47da5cb44844bea2cfde0236db0b506f90ea4224482c9774a" "checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum mime 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "fe51c8699d2dc522bf8c1ebe26ea2193d151fb54bcdfd7d0318750c189994cd9" @@ -2926,6 +2964,7 @@ dependencies = [ "checksum os_pipe 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934868c3f86ed7a39ef63d88edeac5bd49a0c843192651900e9ce1178cbbf157" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" +"checksum parking_lot 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "69376b761943787ebd5cc85a5bc95958651a22609c5c1c2b65de21786baec72b" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum pest 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0fce5d8b5cc33983fc74f78ad552b5522ab41442c4ca91606e4236eb4b5ceefc" @@ -2934,12 +2973,12 @@ dependencies = [ "checksum phf_codegen 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)" = "4e4048fe7dd7a06b8127ecd6d3803149126e9b33c7558879846da3a63f734f2b" "checksum phf_generator 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)" = "05a079dd052e7b674d21cb31cbb6c05efd56a2cd2827db7692e2f1a507ebd998" "checksum phf_shared 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)" = "c2261d544c2bb6aa3b10022b0be371b9c7c64f762ef28c6f5d4f1ef6d97b5930" -"checksum pkg-config 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "110d5ee3593dbb73f56294327fe5668bcc997897097cbc76b51e7aed3f52452f" +"checksum pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)" = "6a52e4dbc8354505ee07e484ab07127e06d87ca6fa7f0a516a2b294e5ad5ad16" "checksum plist 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c61ac2afed2856590ae79d6f358a24b85ece246d2aa134741a66d589519b7503" "checksum png 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f54b9600d584d3b8a739e1662a595fab051329eff43f20e7d8cc22872962145b" "checksum precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" "checksum proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1b06e2f335f48d24442b35a19df506a835fb3547bc3c06ef27340da9acf5cae7" -"checksum proc-macro2 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c65b1ea15bb859d922cade2d1765b4b88beac339cbfad545ef2d2ef8c8215ee6" +"checksum proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)" = "cccdc7557a98fe98453030f077df7f3a042052fae465bb61d2c2c41435cfd9b6" "checksum pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d6fdf85cda6cadfae5428a54661d431330b312bc767ddbc57adbedc24da66e32" "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" @@ -2947,21 +2986,23 @@ dependencies = [ "checksum quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e44651a0dc4cdd99f71c83b561e221f714912d11af1a4dff0631f923d53af035" "checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" +"checksum rand 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "12397506224b2f93e6664ffc4f664b29be8208e5157d3d90b44f09b5fae470ea" +"checksum rand_core 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edecf0f94da5551fc9b492093e30b041a891657db7940ee221f9d2f66e82eef2" "checksum rayon 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "df7a791f788cb4c516f0e091301a29c2b71ef680db5e644a7d68835c8ae6dbfa" "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" "checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" "checksum regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9329abc99e39129fcceabd24cf5d85b4671ef7c29c50e972bc5afe32438ec384" -"checksum regex 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "13c93d55961981ba9226a213b385216f83ab43bd6ac53ab16b2eeb47e337cf4e" +"checksum regex 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5bbbea44c5490a1e84357ff28b7d518b4619a159fed5d25f6c1de2d19cc42814" "checksum regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8e931c58b93d86f080c734bfd2bce7dd0079ae2331235818133c8be7f422e20e" "checksum regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7" -"checksum regex-syntax 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05b06a75f5217880fc5e905952a42750bf44787e56a6c6d6852ed0992f5e1d54" +"checksum regex-syntax 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "747ba3b235651f6e2f67dfa8bcdcd073ddb7c243cb21c442fc12395dfcac212d" "checksum relay 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1576e382688d7e9deecea24417e350d3062d97e32e45d70b1cde65994ff1489a" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" "checksum reqwest 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2abe46f8e00792693a2488e296c593d1f4ea39bb1178cfce081d6793657575e4" "checksum resolv-conf 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c62bd95a41841efdf7fca2ae9951e64a8d8eae7e5da196d8ce489a2241491a92" "checksum rust-stemmers 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fbf06149ec391025664a5634200ced1afb489f0f3f8a140d515ebc0eb04b4bc0" -"checksum rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "76d7ba1feafada44f2d38eed812bd2489a03c0f5abb975799251518b68848649" +"checksum rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "bcfe5b13211b4d78e5c2cadfebd7769197d95c639c35a50057eb4c05de811395" "checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f" "checksum same-file 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfb6eded0b06a0b512c8ddbcf04089138c9b4362c2f696f3c3d76039d68f3637" "checksum sass-rs 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90f8cf6e645aa843ffffcbdc1e8752b1f221dfa314c81895aeb229a77aea7e05" @@ -2972,8 +3013,6 @@ dependencies = [ "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum security-framework 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "dfa44ee9c54ce5eecc9de7d5acbad112ee58755239381f687e564004ba4a2332" "checksum security-framework-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "5421621e836278a0b139268f36eee0dc7e389b784dc3f79d8f11aabadf41bead" -"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)" = "0c3adf19c07af6d186d91dae8927b83b0553d07ca56cbf7f2f32560455c91920" "checksum serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)" = "3525a779832b08693031b8ecfb0de81cd71cfd3812088fafe9a7496789572124" "checksum serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c6908c7b925cd6c590358a4034de93dbddb20c45e1d021931459fd419bf0e2" @@ -2981,13 +3020,12 @@ dependencies = [ "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum shared_child 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bcd5e483b3475af9bc2a35311c2f3bbf0bd98fde91410ab15a0d4ba3c3127b4e" "checksum siphasher 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0df90a788073e8d0235a67e50441d47db7c8ad9debd91cbf43736a2a92d36537" -"checksum skeptic 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c4474d6da9593171bcb086890fc344a3a12783cb24e5b141f8a5d0e43561f4b6" "checksum slab 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d807fd58c4181bbabed77cb3b891ba9748241a552bcc5be698faaebefc54f46e" "checksum slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b4fcaed89ab08ef143da37bc52adbcc04d4a69014f4c1208d6b51f0c47bc23" "checksum slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fdeff4cd9ecff59ec7e3744cbca73dfe5ac35c2aedb2cfba8a1c715a18912e9d" "checksum slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "797bcb4d24e91239a8615415814f4afb2d8ca400c472de3c73f803a5a7689e11" "checksum smallvec 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4c8cbcd6df1e117c2210e13ab5109635ad68a929fcbb8964dc965b76cb5ee013" -"checksum smallvec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "312a7df010092e73d6bbaf141957e868d4f30efd2bfd9bb1028ad91abec58514" +"checksum smallvec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "26df3bb03ca5eac2e64192b723d51f56c1b1e0860e7c766281f4598f181acdc8" "checksum socket2 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "962a516af4d3a7c272cb3a1d50a8cc4e5b41802e4ad54cfb7bee8ba61d37d703" "checksum stable_deref_trait 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ffbc596e092fe5f598b12ef46cc03754085ac2f4d8c739ad61c4ae266cc3b3fa" "checksum string 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00caf261d6f90f588f8450b8e1230fa0d5be49ee6140fdfbcb55335aff350970" @@ -3005,7 +3043,7 @@ dependencies = [ "checksum syntect 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc8a6f0db88d4afc340522c20d260411e746b2225b257c6b238a75de9d7cec78" "checksum take 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b157868d8ac1f56b64604539990685fa7611d8fa9e5476cf0c02cf34d32917c5" "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" -"checksum tempfile 3.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "47776f63b85777d984a50ce49d6b9e58826b6a3766a449fc95bc66cd5663c15b" +"checksum tempfile 3.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c4b103c6d08d323b92ff42c8ce62abcd83ca8efa7fd5bf7927efefec75f58c76" "checksum tendril 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9de21546595a0873061940d994bbbc5c35f024ae4fd61ec5c5b159115684f508" "checksum tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)" = "09a18c54f3d7bdd496703db5ce232d7b7425fb69208bfbda1006127e273673c4" "checksum term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1" @@ -3023,15 +3061,15 @@ dependencies = [ "checksum tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fbb47ae81353c63c487030659494b295f6cb6576242f907f203473b191b0389" "checksum tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e00ec63bbec2c97ce1178cb0587b2c438b2f6b09d3ee54a33c45a9cf0d530810" "checksum tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24da22d077e0f15f55162bdbdc661228c1581892f52074fb242678d015b45162" -"checksum tokio-signal 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e8f46863230f9a05cf52d173721ec391b9c5782a2465f593029922b8782b9ffe" +"checksum tokio-signal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "342d088c63623f63eada591e065778038c63b516939530db2aa09a8df9118507" "checksum tokio-tcp 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ec9b094851aadd2caf83ba3ad8e8c4ce65a42104f7b94d9e6550023f0407853f" "checksum tokio-threadpool 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "24ab84f574027b0e875378f31575cf175360891919e93a3490f07e76e00e4efb" "checksum tokio-timer 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "028b94314065b90f026a21826cffd62a4e40a92cda3e5c069cc7b02e5945f5e9" "checksum tokio-tls 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "772f4b04e560117fe3b0a53e490c16ddc8ba6ec437015d91fa385564996ed913" "checksum tokio-udp 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "43eb534af6e8f37d43ab1b612660df14755c42bd003c5f8d2475ee78cc4600c0" "checksum toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a0263c6c02c4db6c8f7681f9fd35e90de799ebd4cfdeab77a38f4ff6b3d8c0d9" -"checksum trust-dns-proto 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cbbddb93547eeee847367d8f59b68002294a7b4df31c143fbee4109ce0c61a04" -"checksum trust-dns-resolver 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9b0a0c9d4f8dd56481209c5ae1a8965ed022461d352c81fb92466ec9d846929e" +"checksum trust-dns-proto 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "32d7c204ee231f802aa821f9dc2195aa0d0269ef7e9f8c844208565c9e3981e4" +"checksum trust-dns-resolver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "28b094ad60c4f51f36a493201d04d6605183c62bd5f0c73008a732f23950c156" "checksum try-lock 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee2aa4715743892880f70885373966c83d73ef1b0838a664ef0c76fffd35e7c2" "checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" diff --git a/Cargo.toml b/Cargo.toml index aa9c37c9..3d485e98 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,8 +24,7 @@ term-painter = "0.2" # Used in init to ensure the url given as base_url is a valid one url = "1.5" # Below is for the serve cmd -actix = "~0.5" -actix-web = { version = "~0.6", default-features = false, features = [] } +actix-web = { version = "0.7", default-features = false, features = [] } notify = "4" ws = "0.7" ctrlc = "3" diff --git a/src/cmd/serve.rs b/src/cmd/serve.rs index a5158e5a..68fd1a36 100644 --- a/src/cmd/serve.rs +++ b/src/cmd/serve.rs @@ -30,7 +30,6 @@ use std::time::{Instant, Duration}; use std::thread; use chrono::prelude::*; -use actix; use actix_web::{self, fs, http, server, App, HttpRequest, HttpResponse, Responder}; use actix_web::middleware::{Middleware, Started, Response}; use notify::{Watcher, RecursiveMode, watcher}; @@ -64,13 +63,13 @@ struct NotFoundHandler { } impl Middleware for NotFoundHandler { - fn start(&self, _req: &mut HttpRequest) -> actix_web::Result { + fn start(&self, _req: &HttpRequest) -> actix_web::Result { Ok(Started::Done) } fn response( &self, - _req: &mut HttpRequest, + _req: &HttpRequest, mut resp: HttpResponse, ) -> actix_web::Result { if http::StatusCode::NOT_FOUND == resp.status() { @@ -87,7 +86,7 @@ impl Middleware for NotFoundHandler { } } -fn livereload_handler(_: HttpRequest) -> &'static str { +fn livereload_handler(_: &HttpRequest) -> &'static str { LIVE_RELOAD } @@ -180,22 +179,24 @@ pub fn serve(interface: &str, port: &str, output_dir: &str, base_url: &str, conf // http closure to avoid contention. let static_root = output_path.clone(); thread::spawn(move || { - let sys = actix::System::new("http-server"); - server::new(move || { + let s = server::new(move || { App::new() .middleware(NotFoundHandler { rendered_template: static_root.join("404.html") }) .resource(r"/livereload.js", |r| r.f(livereload_handler)) // Start a webserver that serves the `output_dir` directory - .handler(r"/", fs::StaticFiles::new(&static_root) - .show_files_listing() - .files_listing_renderer(handle_directory)) + .handler( + r"/", + fs::StaticFiles::new(&static_root) + .unwrap() + .show_files_listing() + .files_listing_renderer(handle_directory) + ) }) .bind(&address) .expect("Can't start the webserver") - .shutdown_timeout(20) - .start(); + .shutdown_timeout(20); println!("Web server is available at http://{}", &address); - let _ = sys.run(); + s.run(); }); // The websocket for livereload diff --git a/src/main.rs b/src/main.rs index 808d4d71..30f13b1b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,3 @@ -extern crate actix; extern crate actix_web; #[macro_use] extern crate clap; From b14f5fad1f31fb357a4788522f66006350269445 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Sun, 22 Jul 2018 16:23:40 +0200 Subject: [PATCH 53/74] Update miminal version of Rust in travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 6b61378e..dece0531 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,7 +21,7 @@ matrix: rust: nightly # The earliest stable Rust version that works - env: TARGET=x86_64-unknown-linux-gnu - rust: 1.23.0 + rust: 1.27.0 before_install: set -e From 601763307dc8ca0ed1eda1ea2f6e0051173eb64a Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Mon, 23 Jul 2018 15:44:40 +0200 Subject: [PATCH 54/74] Update deps --- Cargo.lock | 58 +++++++++++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2d72ba7b..469919aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5,7 +5,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "actix_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-channel 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -35,7 +35,7 @@ dependencies = [ "base64 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "cookie 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", @@ -130,7 +130,7 @@ dependencies = [ [[package]] name = "atty" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", @@ -237,7 +237,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bytes" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -270,7 +270,7 @@ version = "2.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -814,7 +814,7 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -865,7 +865,7 @@ name = "http" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -886,7 +886,7 @@ version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1305,7 +1305,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1353,8 +1353,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1635,7 +1635,7 @@ dependencies = [ [[package]] name = "quote" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1812,7 +1812,7 @@ name = "reqwest" version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "encoding_rs 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1952,8 +1952,8 @@ version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2125,8 +2125,8 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2151,11 +2151,11 @@ dependencies = [ [[package]] name = "syn" -version = "0.14.4" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2358,7 +2358,7 @@ name = "tokio-codec" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2368,7 +2368,7 @@ name = "tokio-core" version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2404,7 +2404,7 @@ name = "tokio-io" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2467,7 +2467,7 @@ name = "tokio-tcp" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2513,7 +2513,7 @@ name = "tokio-udp" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2779,7 +2779,7 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2823,7 +2823,7 @@ dependencies = [ "checksum ammonia 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a8b93ecb80665873703bf3b0a77f369c96b183d8e0afaf30a3ff5ff07dfc6409" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" -"checksum atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2fc4a1aa4c24c0718a250f0681885c1af91419d242f29eb8f2ab28502d80dbd1" +"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" "checksum backtrace 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "346d7644f0b5f9bc73082d3b2236b69a05fd35cce0cfa3724e184e6a5c9e2a2f" "checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a" "checksum backtrace-sys 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "bff67d0c06556c0b8e6b5f090f0eac52d950d9dfd1d35ba04e4ca3543eaf6a7e" @@ -2837,7 +2837,7 @@ dependencies = [ "checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" "checksum byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "74c0b906e9446b0a2e4f760cdb3fa4b2c48cdc6db8766a845c54b6ff063fd2e9" "checksum bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c129aff112dcc562970abb69e2508b40850dd24c274761bb50fb8a0067ba6c27" -"checksum bytes 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7dd32989a66957d3f0cba6588f15d4281a733f4e9ffc43fcd2385f57d3bf99ff" +"checksum bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e178b8e0e239e844b083d5a0d4a156b2654e67f9f80144d48398fcd736a24fb8" "checksum cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "2119ea4867bd2b8ed3aecab467709720b2d55b1bcfe09f772fd68066eaf15275" "checksum cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efe5c877e17a9c717a0bf3613b2709f723202c4e4675cc8f12926ded29bcb17e" "checksum chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6962c635d530328acc53ac6a955e83093fedc91c5809dfac1fa60fa470830a37" @@ -2983,7 +2983,7 @@ dependencies = [ "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" "checksum quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9949cfe66888ffe1d53e6ec9d9f3b70714083854be20fd5e271b232a017401e8" -"checksum quote 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e44651a0dc4cdd99f71c83b561e221f714912d11af1a4dff0631f923d53af035" +"checksum quote 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b71f9f575d55555aa9c06188be9d4e2bfc83ed02537948ac0d520c24d0419f1a" "checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" "checksum rand 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "12397506224b2f93e6664ffc4f664b29be8208e5157d3d90b44f09b5fae470ea" @@ -3037,7 +3037,7 @@ dependencies = [ "checksum strum_macros 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1292d85e688e4696ecb69b2db2648994fb8af266974e89be53cefdf003861a5d" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" "checksum syn 0.13.11 (registry+https://github.com/rust-lang/crates.io-index)" = "14f9bf6292f3a61d2c716723fdb789a41bbe104168e6f496dc6497e531ea1b9b" -"checksum syn 0.14.4 (registry+https://github.com/rust-lang/crates.io-index)" = "2beff8ebc3658f07512a413866875adddd20f4fd47b2a4e6c9da65cd281baaea" +"checksum syn 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4bad7abdf6633f07c7046b90484f1d9dc055eca39f8c991177b1046ce61dba9a" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" "checksum synstructure 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a761d12e6d8dcb4dcf952a7a89b475e3a9d69e4a69307e01a470977642914bd" "checksum syntect 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc8a6f0db88d4afc340522c20d260411e746b2225b257c6b238a75de9d7cec78" From e83d76bf8ab2e958e94df510a88797297e55e967 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Fri, 27 Jul 2018 18:44:10 +0200 Subject: [PATCH 55/74] Clarify taxonomies templates doc --- docs/content/documentation/templates/taxonomies.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/content/documentation/templates/taxonomies.md b/docs/content/documentation/templates/taxonomies.md index a9e8576e..66cf3add 100644 --- a/docs/content/documentation/templates/taxonomies.md +++ b/docs/content/documentation/templates/taxonomies.md @@ -3,13 +3,11 @@ title = "Taxonomies" weight = 40 +++ -The default templates for the taxonomies pages are the following: +Gutenberg will look up the following files in the `templates` directory: - `$TAXONOMY_NAME/single.html` - `$TAXONOMY_NAME/list.html` -You can override any of those templates by putting one with the same path in the `templates` directory. - First, a `TaxonomyTerm` has the following fields: ```ts From 9972b72d91d9daa1e461c4f9eb161e06fe6c4dfe Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Fri, 27 Jul 2018 18:45:19 +0200 Subject: [PATCH 56/74] Register get_taxonomy global fn --- components/site/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/site/src/lib.rs b/components/site/src/lib.rs index 200a20e0..ce333849 100644 --- a/components/site/src/lib.rs +++ b/components/site/src/lib.rs @@ -299,7 +299,7 @@ impl Site { self.tera.register_global_function("get_page", global_fns::make_get_page(&self.pages)); self.tera.register_global_function("get_section", global_fns::make_get_section(&self.sections)); self.tera.register_global_function( - "get_taxonomy_url", + "get_taxonomy", global_fns::make_get_taxonomy(self.taxonomies.clone()) ); } From c2437cc0eb7e431493022d3b1a5c254fa998119c Mon Sep 17 00:00:00 2001 From: Daniel Sockwell Date: Fri, 27 Jul 2018 22:20:20 -0400 Subject: [PATCH 57/74] Remove `order` and add `heavier`/`later` This commit removes the option to sort by order and also removes `page.next` and `page.previous` variables. Instead, pages can be sorted by two methods `date` and `weight`. The Tera `reverse` filter will reverse either of those sorts, so the old `order` behavior can be achieved by using the `reverse` filter with `weight`. In place of the `previous`/`next` variables, this commit adds the `page.earlier`/`page.later` variables (which are set when the page is sorted by date) and the `page.heavier`/`page.lighter` variables (which are set when the page is sorted by weight). These variables have the advantage of not having confusing semantics when the `reverse` filter is used. --- components/content/src/page.rs | 30 ++- components/content/src/sorting.rs | 174 ++++++------------ components/front_matter/src/lib.rs | 2 - components/rebuild/tests/rebuild.rs | 10 +- components/site/src/lib.rs | 2 +- .../content/posts/tutorials/devops/_index.md | 2 +- .../content/posts/tutorials/devops/docker.md | 2 +- .../content/posts/tutorials/devops/nix.md | 2 +- .../posts/tutorials/programming/_index.md | 2 +- .../posts/tutorials/programming/python.md | 2 +- .../posts/tutorials/programming/rust.md | 2 +- test_site/content/rebuild/_index.md | 2 +- test_site/content/rebuild/first.md | 2 +- test_site/content/rebuild/second.md | 2 +- 14 files changed, 89 insertions(+), 147 deletions(-) diff --git a/components/content/src/page.rs b/components/content/src/page.rs index 780faf23..567c95ca 100644 --- a/components/content/src/page.rs +++ b/components/content/src/page.rs @@ -44,10 +44,14 @@ pub struct Page { /// When is found in the text, will take the content up to that part /// as summary pub summary: Option, - /// The previous page, by whatever sorting is used for the index/section - pub previous: Option>, - /// The next page, by whatever sorting is used for the index/section - pub next: Option>, + /// The earlier page, for pages sorted by date + pub earlier: Option>, + /// The later page, for pages sorted by date + pub later: Option>, + /// The lighter page, for pages sorted by weight + pub lighter: Option>, + /// The heavier page, for pages sorted by weight + pub heavier: Option>, /// Toc made from the headers of the markdown file pub toc: Vec
, } @@ -68,8 +72,10 @@ impl Page { components: vec![], permalink: "".to_string(), summary: None, - previous: None, - next: None, + earlier: None, + later: None, + lighter: None, + heavier: None, toc: vec![], } } @@ -229,8 +235,10 @@ impl Default for Page { components: vec![], permalink: "".to_string(), summary: None, - previous: None, - next: None, + earlier: None, + later: None, + lighter: None, + heavier: None, toc: vec![], } } @@ -263,8 +271,10 @@ impl ser::Serialize for Page { let (word_count, reading_time) = get_reading_analytics(&self.raw_content); state.serialize_field("word_count", &word_count)?; state.serialize_field("reading_time", &reading_time)?; - state.serialize_field("previous", &self.previous)?; - state.serialize_field("next", &self.next)?; + state.serialize_field("earlier", &self.earlier)?; + state.serialize_field("later", &self.later)?; + state.serialize_field("lighter", &self.lighter)?; + state.serialize_field("heavier", &self.heavier)?; state.serialize_field("toc", &self.toc)?; state.serialize_field("draft", &self.is_draft())?; let assets = self.serialize_assets(); diff --git a/components/content/src/sorting.rs b/components/content/src/sorting.rs index b96c6b1d..8d9bcda7 100644 --- a/components/content/src/sorting.rs +++ b/components/content/src/sorting.rs @@ -7,7 +7,7 @@ use front_matter::SortBy; /// Sort pages by the given criteria /// -/// Any pages that doesn't have a the required field when the sorting method is other than none +/// Any pages that doesn't have a required field when the sorting method is other than none /// will be ignored. pub fn sort_pages(pages: Vec, sort_by: SortBy) -> (Vec, Vec) { if sort_by == SortBy::None { @@ -19,7 +19,6 @@ pub fn sort_pages(pages: Vec, sort_by: SortBy) -> (Vec, Vec) { .partition(|page| { match sort_by { SortBy::Date => page.meta.date.is_some(), - SortBy::Order => page.meta.order.is_some(), SortBy::Weight => page.meta.weight.is_some(), _ => unreachable!() } @@ -36,16 +35,6 @@ pub fn sort_pages(pages: Vec, sort_by: SortBy) -> (Vec, Vec) { } }) }, - SortBy::Order => { - can_be_sorted.par_sort_unstable_by(|a, b| { - let ord = b.meta.order().cmp(&a.meta.order()); - if ord == Ordering::Equal { - a.permalink.cmp(&b.permalink) - } else { - ord - } - }) - }, SortBy::Weight => { can_be_sorted.par_sort_unstable_by(|a, b| { let ord = a.meta.weight().cmp(&b.meta.weight()); @@ -64,7 +53,7 @@ pub fn sort_pages(pages: Vec, sort_by: SortBy) -> (Vec, Vec) { /// Horribly inefficient way to set previous and next on each pages that skips drafts /// So many clones -pub fn populate_previous_and_next_pages(input: &[Page]) -> Vec { +pub fn populate_previous_and_next_pages(input: &[Page], sort_by: SortBy) -> Vec { let mut res = Vec::with_capacity(input.len()); // The input is already sorted @@ -91,9 +80,21 @@ pub fn populate_previous_and_next_pages(input: &[Page]) -> Vec { // Remove prev/next otherwise we serialise the whole thing... let mut next_page = input[j].clone(); - next_page.previous = None; - next_page.next = None; - new_page.next = Some(Box::new(next_page)); + + match sort_by { + SortBy::Weight => { + next_page.lighter = None; + next_page.heavier = None; + new_page.lighter = Some(Box::new(next_page)); + }, + SortBy::Date => { + next_page.earlier = None; + next_page.later = None; + new_page.later = Some(Box::new(next_page)); + }, + SortBy::None => { + } + } break; } } @@ -113,9 +114,20 @@ pub fn populate_previous_and_next_pages(input: &[Page]) -> Vec { // Remove prev/next otherwise we serialise the whole thing... let mut previous_page = input[j].clone(); - previous_page.previous = None; - previous_page.next = None; - new_page.previous = Some(Box::new(previous_page)); + match sort_by { + SortBy::Weight => { + previous_page.lighter = None; + previous_page.heavier = None; + new_page.heavier = Some(Box::new(previous_page)); + }, + SortBy::Date => { + previous_page.earlier = None; + previous_page.later = None; + new_page.earlier = Some(Box::new(previous_page)); + }, + SortBy::None => { + } + } break; } } @@ -137,22 +149,6 @@ mod tests { Page::new("content/hello.md", front_matter) } - fn create_page_with_order(order: usize, filename: &str) -> Page { - let mut front_matter = PageFrontMatter::default(); - front_matter.order = Some(order); - let mut p = Page::new("content/".to_string() + filename, front_matter); - // Faking a permalink to test sorting with equal order - p.permalink = filename.to_string(); - p - } - - fn create_draft_page_with_order(order: usize) -> Page { - let mut front_matter = PageFrontMatter::default(); - front_matter.order = Some(order); - front_matter.draft = true; - Page::new("content/hello.md", front_matter) - } - fn create_page_with_weight(weight: usize) -> Page { let mut front_matter = PageFrontMatter::default(); front_matter.weight = Some(weight); @@ -173,37 +169,6 @@ mod tests { assert_eq!(pages[2].clone().meta.date.unwrap().to_string(), "2017-01-01"); } - #[test] - fn can_sort_by_order() { - let input = vec![ - create_page_with_order(2, "hello.md"), - create_page_with_order(3, "hello2.md"), - create_page_with_order(1, "hello3.md"), - ]; - let (pages, _) = sort_pages(input, SortBy::Order); - // Should be sorted by order - assert_eq!(pages[0].clone().meta.order.unwrap(), 3); - assert_eq!(pages[1].clone().meta.order.unwrap(), 2); - assert_eq!(pages[2].clone().meta.order.unwrap(), 1); - } - - #[test] - fn can_sort_by_order_uses_permalink_to_break_ties() { - let input = vec![ - create_page_with_order(3, "b.md"), - create_page_with_order(3, "a.md"), - create_page_with_order(3, "c.md"), - ]; - let (pages, _) = sort_pages(input, SortBy::Order); - // Should be sorted by order - assert_eq!(pages[0].clone().meta.order.unwrap(), 3); - assert_eq!(pages[0].clone().permalink, "a.md"); - assert_eq!(pages[1].clone().meta.order.unwrap(), 3); - assert_eq!(pages[1].clone().permalink, "b.md"); - assert_eq!(pages[2].clone().meta.order.unwrap(), 3); - assert_eq!(pages[2].clone().permalink, "c.md"); - } - #[test] fn can_sort_by_weight() { let input = vec![ @@ -221,25 +186,25 @@ mod tests { #[test] fn can_sort_by_none() { let input = vec![ - create_page_with_order(2, "a.md"), - create_page_with_order(3, "a.md"), - create_page_with_order(1, "a.md"), + create_page_with_weight(2), + create_page_with_weight(3), + create_page_with_weight(1), ]; let (pages, _) = sort_pages(input, SortBy::None); // Should be sorted by date - assert_eq!(pages[0].clone().meta.order.unwrap(), 2); - assert_eq!(pages[1].clone().meta.order.unwrap(), 3); - assert_eq!(pages[2].clone().meta.order.unwrap(), 1); + assert_eq!(pages[0].clone().meta.weight.unwrap(), 2); + assert_eq!(pages[1].clone().meta.weight.unwrap(), 3); + assert_eq!(pages[2].clone().meta.weight.unwrap(), 1); } #[test] fn ignore_page_with_missing_field() { let input = vec![ - create_page_with_order(2, "a.md"), - create_page_with_order(3, "a.md"), + create_page_with_weight(2), + create_page_with_weight(3), create_page_with_date("2019-01-01"), ]; - let (pages, unsorted) = sort_pages(input, SortBy::Order); + let (pages, unsorted) = sort_pages(input, SortBy::Weight); assert_eq!(pages.len(), 2); assert_eq!(unsorted.len(), 1); } @@ -247,54 +212,23 @@ mod tests { #[test] fn can_populate_previous_and_next_pages() { let input = vec![ - create_page_with_order(1, "a.md"), - create_page_with_order(2, "b.md"), - create_page_with_order(3, "a.md"), + create_page_with_weight(1), + create_page_with_weight(2), + create_page_with_weight(3), ]; - let pages = populate_previous_and_next_pages(&input); + let pages = populate_previous_and_next_pages(&input, SortBy::Weight); - assert!(pages[0].clone().next.is_none()); - assert!(pages[0].clone().previous.is_some()); - assert_eq!(pages[0].clone().previous.unwrap().meta.order.unwrap(), 2); + assert!(pages[0].clone().lighter.is_none()); + assert!(pages[0].clone().heavier.is_some()); + assert_eq!(pages[0].clone().heavier.unwrap().meta.weight.unwrap(), 2); - assert!(pages[1].clone().next.is_some()); - assert!(pages[1].clone().previous.is_some()); - assert_eq!(pages[1].clone().previous.unwrap().meta.order.unwrap(), 3); - assert_eq!(pages[1].clone().next.unwrap().meta.order.unwrap(), 1); + assert!(pages[1].clone().heavier.is_some()); + assert!(pages[1].clone().lighter.is_some()); + assert_eq!(pages[1].clone().lighter.unwrap().meta.weight.unwrap(), 1); + assert_eq!(pages[1].clone().heavier.unwrap().meta.weight.unwrap(), 3); - assert!(pages[2].clone().next.is_some()); - assert!(pages[2].clone().previous.is_none()); - assert_eq!(pages[2].clone().next.unwrap().meta.order.unwrap(), 2); - } - - #[test] - fn can_populate_previous_and_next_pages_skip_drafts() { - let input = vec![ - create_draft_page_with_order(0), - create_page_with_order(1, "a.md"), - create_page_with_order(2, "b.md"), - create_page_with_order(3, "c.md"), - create_draft_page_with_order(4), - ]; - let pages = populate_previous_and_next_pages(&input); - - assert!(pages[0].clone().next.is_none()); - assert!(pages[0].clone().previous.is_none()); - - assert!(pages[1].clone().next.is_none()); - assert!(pages[1].clone().previous.is_some()); - assert_eq!(pages[1].clone().previous.unwrap().meta.order.unwrap(), 2); - - assert!(pages[2].clone().next.is_some()); - assert!(pages[2].clone().previous.is_some()); - assert_eq!(pages[2].clone().previous.unwrap().meta.order.unwrap(), 3); - assert_eq!(pages[2].clone().next.unwrap().meta.order.unwrap(), 1); - - assert!(pages[3].clone().next.is_some()); - assert!(pages[3].clone().previous.is_none()); - assert_eq!(pages[3].clone().next.unwrap().meta.order.unwrap(), 2); - - assert!(pages[4].clone().next.is_none()); - assert!(pages[4].clone().previous.is_none()); + assert!(pages[2].clone().lighter.is_some()); + assert!(pages[2].clone().heavier.is_none()); + assert_eq!(pages[2].clone().lighter.unwrap().meta.weight.unwrap(), 2); } } diff --git a/components/front_matter/src/lib.rs b/components/front_matter/src/lib.rs index 6cf79f0c..82493762 100644 --- a/components/front_matter/src/lib.rs +++ b/components/front_matter/src/lib.rs @@ -30,8 +30,6 @@ lazy_static! { pub enum SortBy { /// Most recent to oldest Date, - /// Lower order comes last - Order, /// Lower weight comes first Weight, /// No sorting diff --git a/components/rebuild/tests/rebuild.rs b/components/rebuild/tests/rebuild.rs index 12cdb415..dbc3a357 100644 --- a/components/rebuild/tests/rebuild.rs +++ b/components/rebuild/tests/rebuild.rs @@ -2,7 +2,7 @@ extern crate rebuild; extern crate site; extern crate tempfile; extern crate fs_extra; - + use std::env; use std::fs::{remove_dir_all, File}; use std::io::prelude::*; @@ -79,7 +79,7 @@ fn can_rebuild_after_simple_change_to_page_content() { let file_path = edit_file!(site_path, "content/rebuild/first.md", br#" +++ title = "first" -order = 1 +weight = 1 date = 2017-01-01 +++ @@ -97,7 +97,7 @@ fn can_rebuild_after_title_change_page_global_func_usage() { let file_path = edit_file!(site_path, "content/rebuild/first.md", br#" +++ title = "Premier" -order = 10 +weight = 10 date = 2017-01-01 +++ @@ -115,12 +115,12 @@ fn can_rebuild_after_sort_change_in_section() { let file_path = edit_file!(site_path, "content/rebuild/_index.md", br#" +++ paginate_by = 1 -sort_by = "order" +sort_by = "weight" template = "rebuild.html" +++ "#); let res = after_content_change(&mut site, &file_path); assert!(res.is_ok()); - assert!(file_contains!(site_path, "public/rebuild/index.html", "

second

first

")); + assert!(file_contains!(site_path, "public/rebuild/index.html", "

first

second

")); } diff --git a/components/site/src/lib.rs b/components/site/src/lib.rs index ce333849..85d10953 100644 --- a/components/site/src/lib.rs +++ b/components/site/src/lib.rs @@ -401,7 +401,7 @@ impl Site { } let pages = mem::replace(&mut section.pages, vec![]); let (sorted_pages, cannot_be_sorted_pages) = sort_pages(pages, section.meta.sort_by); - section.pages = populate_previous_and_next_pages(&sorted_pages); + section.pages = populate_previous_and_next_pages(&sorted_pages, section.meta.sort_by); section.ignored_pages = cannot_be_sorted_pages; } } diff --git a/test_site/content/posts/tutorials/devops/_index.md b/test_site/content/posts/tutorials/devops/_index.md index 8e996741..29223641 100644 --- a/test_site/content/posts/tutorials/devops/_index.md +++ b/test_site/content/posts/tutorials/devops/_index.md @@ -1,6 +1,6 @@ +++ title = "DevOps" -sort_by = "order" +sort_by = "weight" redirect_to = "posts/tutorials/devops/docker" weight = 10 +++ diff --git a/test_site/content/posts/tutorials/devops/docker.md b/test_site/content/posts/tutorials/devops/docker.md index ad19af5c..46aea980 100644 --- a/test_site/content/posts/tutorials/devops/docker.md +++ b/test_site/content/posts/tutorials/devops/docker.md @@ -1,6 +1,6 @@ +++ title = "Docker" -order = 1 +weight = 1 date = 2017-01-01 +++ diff --git a/test_site/content/posts/tutorials/devops/nix.md b/test_site/content/posts/tutorials/devops/nix.md index 004ad58d..bc808530 100644 --- a/test_site/content/posts/tutorials/devops/nix.md +++ b/test_site/content/posts/tutorials/devops/nix.md @@ -1,6 +1,6 @@ +++ title = "Nix" -order = 2 +weight = 2 date = 2017-01-01 +++ diff --git a/test_site/content/posts/tutorials/programming/_index.md b/test_site/content/posts/tutorials/programming/_index.md index 4a2c76fb..6515620e 100644 --- a/test_site/content/posts/tutorials/programming/_index.md +++ b/test_site/content/posts/tutorials/programming/_index.md @@ -1,5 +1,5 @@ +++ title = "Programming" -sort_by = "order" +sort_by = "weight" weight = 1 +++ diff --git a/test_site/content/posts/tutorials/programming/python.md b/test_site/content/posts/tutorials/programming/python.md index d65d52fb..891ff299 100644 --- a/test_site/content/posts/tutorials/programming/python.md +++ b/test_site/content/posts/tutorials/programming/python.md @@ -1,6 +1,6 @@ +++ title = "Python tutorial" -order = 1 +weight = 1 date = 2017-01-01 +++ diff --git a/test_site/content/posts/tutorials/programming/rust.md b/test_site/content/posts/tutorials/programming/rust.md index 3582c4bc..a409b439 100644 --- a/test_site/content/posts/tutorials/programming/rust.md +++ b/test_site/content/posts/tutorials/programming/rust.md @@ -1,6 +1,6 @@ +++ title = "Rust" -order = 2 +weight = 2 date = 2017-01-01 +++ diff --git a/test_site/content/rebuild/_index.md b/test_site/content/rebuild/_index.md index c617948a..46570a3c 100644 --- a/test_site/content/rebuild/_index.md +++ b/test_site/content/rebuild/_index.md @@ -1,5 +1,5 @@ +++ paginate_by = 1 -sort_by = "order" +sort_by = "weight" template = "rebuild.html" +++ diff --git a/test_site/content/rebuild/first.md b/test_site/content/rebuild/first.md index a3bd65e6..213fa4bb 100644 --- a/test_site/content/rebuild/first.md +++ b/test_site/content/rebuild/first.md @@ -1,6 +1,6 @@ +++ title = "first" -order = 10 +weight = 10 date = 2017-01-01 +++ diff --git a/test_site/content/rebuild/second.md b/test_site/content/rebuild/second.md index 4a849192..2ee56019 100644 --- a/test_site/content/rebuild/second.md +++ b/test_site/content/rebuild/second.md @@ -1,6 +1,6 @@ +++ title = "second" -order = 100 +weight = 100 date = 2016-01-01 +++ From bedf469d16f313f020f952d5983414f08d186fe5 Mon Sep 17 00:00:00 2001 From: Daniel Sockwell Date: Sun, 29 Jul 2018 15:54:36 -0400 Subject: [PATCH 58/74] Update docs for removal of order --- docs/content/documentation/content/page.md | 58 +++++++----- docs/content/documentation/content/section.md | 92 +++++++++++++++---- 2 files changed, 109 insertions(+), 41 deletions(-) diff --git a/docs/content/documentation/content/page.md b/docs/content/documentation/content/page.md index 04cb6c23..08105242 100644 --- a/docs/content/documentation/content/page.md +++ b/docs/content/documentation/content/page.md @@ -6,6 +6,22 @@ weight = 30 A page is any file ending with `.md` in the `content` directory, except files named `_index.md`. +If a file ending with `.md` is named `index.md`, then it will generate a page +with the name of the containing folder (for example, `/content/about/index.md` would +create a page at `[base_url]/about`). (Note the lack of an underscore; if the file +were named `_index.md`, then it would create a **section** at `[base_url]/about`, as +discussed in the prior part of this documentation. But naming the file `index.md` will +create a **page** at `[base_url]/about`). + +If the file is given any name *other* than `index.md` or `_index.md`, then it will +create a page with that name (without the `.md`). So naming a file in the root of your +content directory `about.md` would also create a page at `[base_url]/about`. + +As you can see, creating an `about.md` file is exactly equivalent to creating an +`about/index.md` file. The only difference between the two methods is that creating +the `about` folder allows you to use asset colocation, as discussed in the +[Overview](./documentation/content/overview.md) section of this documentation. + ## Front-matter The front-matter is a set of metadata embedded in a file. In Gutenberg, @@ -13,7 +29,8 @@ it is at the beginning of the file, surrounded by `+++` and uses TOML. While none of the front-matter variables are mandatory, the opening and closing `+++` are required. -Here is an example page with all the variables available: +Here is an example page with all the variables available. The values provided below are the default +values. ```md +++ @@ -22,8 +39,15 @@ description = "" # The date of the post. # 2 formats are allowed: YYYY-MM-DD (2012-10-02) and RFC3339 (2002-10-02T15:00:00Z) -# Do not wrap dates in quotes, the line below only indicates that there is no default date -date = +# Do not wrap dates in quotes, the line below only indicates that there is no default date. +# If the section variable `sort_by` is set to `date`, then any page that lacks a `date` +# will not be rendered. +date = + +# The weight as defined in the Section page +# If the section variable `sort_by` is set to `weight`, then any page that lacks a `weight` +# will not be rendered. +weight = 0 # A draft page will not be present in prev/next pagination draft = false @@ -38,28 +62,18 @@ slug = "" # It should not start with a `/` and the slash will be removed if it does path = "" -# A dict of taxonomies: the key is the name of the taxonomy which must match -# one of the taxonomy defined in `config.toml` and the value is a list of -# strings -[taxonomies] +# An array of strings allowing you to group pages with them +tags = [] -# The order as defined in the Section page -order = 0 +# An overarching category name for that page, allowing you to group pages with it +category = "" -# The weight as defined in the Section page -weight = 0 - -# Use aliases if you are moving content but want to redirect previous URLs to the -# current one. Each element in the array of aliases may take one of two forms: -# * "some/alias/path", which will generate "some/alias/path/index.html" -# * "some/alias/path.html", which will generate "some/alias/path.html" -# -# The former is useful if your previous site had the form "example.com/some/alias/path", -# the latter is useful if your previous site had the form "example.com/some/alias/path.html" +# Use aliases if you are moving content but want to redirect previous URLs to the +# current one. This takes an array of path, not URLs. aliases = [] # Whether the page should be in the search index. This is only used if -# `build_search_index` is set to true in the config and the parent section +# `build_search_index` is set to true in the config and the parent section # hasn't set `in_search_index` to false in its front-matter in_search_index = true @@ -75,7 +89,7 @@ Some content ## Summary -You can ask Gutenberg to create a summary if you only want to show the first +You can ask Gutenberg to create a summary if you only want to show the first paragraph of each page in a list for example. To do so, add <!-- more --> in your content at the point @@ -83,6 +97,6 @@ where you want the summary to end and the content up to that point will be also available separately in the [template](./documentation/templates/pages-sections.md#page-variables). -An anchor link to this position named `continue-reading` is created so you can link +An anchor link to this position named `continue-reading` is created so you can link directly to it if needed for example: `Continue Reading` diff --git a/docs/content/documentation/content/section.md b/docs/content/documentation/content/section.md index 2228544d..7baba791 100644 --- a/docs/content/documentation/content/section.md +++ b/docs/content/documentation/content/section.md @@ -3,22 +3,32 @@ title = "Section" weight = 20 +++ -A section is automatically created when a folder is found in the `content` section, unless it only -contains a `index.md` file and is actually a page with assets. +A section is created whenever a folder (or subfolder) in the `content` section contains an +`_index.md` file. If a folder does not contain an `_index.md` file, no section will be +created, but markdown files within that folder will still create pages (known as orphan pages). -You can add `_index.md` file to a folder to augment a section and give it some metadata and/or content. - -The index page is actually a section created automatically like any other: you can add metadata -and content by adding `_index.md` at the root of the `content` folder. +The index page (i.e., the page displayed when a user browses to your `base_url`) is a section, +which is created whether or not you add an `_index.md` file at the root of your `content` folder. +If you do not create an `_index.md` file in your content directory, this main content section will +not have any content or metadata. If you would like to add content or metadata, you can add an +`_index.md` file at the root of the `content` folder and edit it just as you would edit any other +`_index.md` file; your `index.html` template will then have access to that content and metadata. ## Front-matter +The `_index.md` file within a folder defines the content and metadata for that section. To set +the metadata, add front matter to the file. + The front-matter is a set of metadata embedded in a file. In Gutenberg, it is at the beginning of the file, surrounded by `+++` and uses TOML. +After the closing `+++`, you can add content that will be parsed as markdown and will be available +to your templates through the `section.content` variable. + While none of the front-matter variables are mandatory, the opening and closing `+++` are required. -Here is an example `_index.md` with all the variables available: +Here is an example `_index.md` with all the variables available. The values provided below are the +default values. ```md @@ -27,7 +37,7 @@ title = "" description = "" -# Whether to sort by "date", "order", "weight" or "none". More on that below +# Whether to sort pages by "date", "weight", or "none". More on that below sort_by = "none" # Used by the parent section to order its subsections. @@ -83,22 +93,66 @@ You can also change the pagination path (the word displayed while paginated in t by setting the `paginate_path` variable, which defaults to `page`. ## Sorting -Sections' pages can be sorted three different ways, not counting the unsorted default and -is enabled by setting the `sort_by` front-matter variable. +It is very common for Gutenberg templates to iterate over pages or sections +to display all pages/sections a given directory. Consider a very simple +example: a `blog` directory with three files: `blog/Post_1.md`, +`blog/Post_2.md`, and `blog/Post_3.md`. To iterate over these posts and +create a list of links to the posts, a simple template might look like this: -Any page that cannot be sorted, for example if missing the date variable while sorting by `date`, will be ignored and -won't be rendered. The terminal will warn you if this is happening. +```j2 +{% for post in section.pages %} +

{{ post.title }}

+{% endfor %} +``` -If several pages have the same date/weight/order, their permalink will be used to break the tie following -an alphabetical order. +This would iterate over the posts, and would do so in a specific order +based on the `sort_by` variable set in the `_index.md` page for the +containing section. The `sort_by` variable can be given three values: `date`, +`weight`, and `none`. If no `sort_by` method is set, the pages will be +sorted in the `none` order, which is not intended to be used for sorted content. + +Any page that is missing the data it needs to be sorted will be ignored and +won't be rendered. For example, if a page is missing the date variable the +containing section sets `sort_by = "date"`, then that page will be ignored. +The terminal will warn you if this is happening. + +If several pages have the same date/weight/order, their permalink will be used +to break the tie following an alphabetical order. + +## Sorting Pages +The `sort_by` front-matter variable can have the following values: ### `date` -This will sort all pages by their `date` field, from the most recent to the oldest. +This will sort all pages by their `date` field, from the most recent (at the +top of the list) to the oldest (at the bottom of the list). Each page will +get `page.earlier` and `page.later` variables that contain the pages with +earlier and later dates, respectively. ### `weight` -This will be sort all pages by their `weight` field. Heavier weights fall at the bottom: 5 would be before 10. +This will be sort all pages by their `weight` field, from lightest weight +(at the top of the list) to heaviest (at the bottom of the list). Each +page gets `page.lighter` and `page.heavier` variables that contain the +pages with lighter and heavier weights, respectively. -### `order` -This will be sort all pages by their `order` field. Order is the opposite of weight, think of it as enumerating -the content: this is my first post, my second, etc. A page with `order: 5` will appear after a page with `order: 10` in the sorted list. +When iterating through pages, you may wish to use the Tera `reverse` filter, +which reverses the order of the pages. Thus, after using the `reverse` filter, +pages sorted by weight will be sorted from lightest (at the top) to heaviest +(at the bottom); pages sorted by date will be sorted from oldest (at the top) +to newest (at the bottom). +`reverse` has no effect on `page.later`/`page.earlier`/`page.heavier`/`page.lighter`. + +## Sorting Subsections +Sorting sections is a bit less flexible: sections are always sorted by `weight`, +and do not have any variables that point to the next heavier/lighter sections. + +Based on this, by default the lightest (lowest `weight`) subsections will be at +the top of the list and the heaviest (highest `weight`) will be at the top; +the `reverse` filter reverses this order. + +**Note**: Unlike pages, permalinks will **not** be used to break ties between +equally weighted sections. Thus, if the `weight` variable for your section is not set (or if it +is set in a way that produces ties), then your sections will be sorted in +**random** order. Moreover, that order is determined at build time and will +change with each site rebuild. Thus, if there is any chance that you will +iterate over your sections, you should always assign them weight. From 554d50720cb4be8c786849636e9587a27ec67939 Mon Sep 17 00:00:00 2001 From: Daniel Sockwell Date: Sun, 29 Jul 2018 16:53:42 -0400 Subject: [PATCH 59/74] Update templates/pages-sections.md --- docs/content/documentation/templates/pages-sections.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/content/documentation/templates/pages-sections.md b/docs/content/documentation/templates/pages-sections.md index 6dcf7ac7..297c95b3 100644 --- a/docs/content/documentation/templates/pages-sections.md +++ b/docs/content/documentation/templates/pages-sections.md @@ -32,9 +32,12 @@ extra: HashMap; word_count: Number; // Based on https://help.medium.com/hc/en-us/articles/214991667-Read-time reading_time: Number; -// `previous` and `next` are only filled if the content can be sorted -previous: Page?; -next: Page?; +// `earlier` and `later` are only populated if the section variable `sort_by` is set to `date` +earlier: Page?; +later: Page?; +// `heavier` and `lighter` are only populated if the section variable `sort_by` is set to `weight` +heavier: Page?; +lighter: Page?; // See the Table of contents section below for more details toc: Array
; // Year/month/day is only set if the page has a date and month/day are 1-indexed From 97f5065259da7a9bab079801977bee5554d31e57 Mon Sep 17 00:00:00 2001 From: Daniel Sockwell Date: Sun, 29 Jul 2018 17:03:14 -0400 Subject: [PATCH 60/74] Fix formating/typos flaged in code review --- components/content/src/sorting.rs | 4 +--- components/rebuild/tests/rebuild.rs | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/components/content/src/sorting.rs b/components/content/src/sorting.rs index 8d9bcda7..592d8446 100644 --- a/components/content/src/sorting.rs +++ b/components/content/src/sorting.rs @@ -92,8 +92,7 @@ pub fn populate_previous_and_next_pages(input: &[Page], sort_by: SortBy) -> Vec< next_page.later = None; new_page.later = Some(Box::new(next_page)); }, - SortBy::None => { - } + SortBy::None => {} } break; } @@ -191,7 +190,6 @@ mod tests { create_page_with_weight(1), ]; let (pages, _) = sort_pages(input, SortBy::None); - // Should be sorted by date assert_eq!(pages[0].clone().meta.weight.unwrap(), 2); assert_eq!(pages[1].clone().meta.weight.unwrap(), 3); assert_eq!(pages[2].clone().meta.weight.unwrap(), 1); diff --git a/components/rebuild/tests/rebuild.rs b/components/rebuild/tests/rebuild.rs index dbc3a357..42bbae2e 100644 --- a/components/rebuild/tests/rebuild.rs +++ b/components/rebuild/tests/rebuild.rs @@ -2,7 +2,7 @@ extern crate rebuild; extern crate site; extern crate tempfile; extern crate fs_extra; - + use std::env; use std::fs::{remove_dir_all, File}; use std::io::prelude::*; From 77ac196f46c1637667a22f50c4e63be50b91fa1f Mon Sep 17 00:00:00 2001 From: Daniel Sockwell Date: Mon, 30 Jul 2018 22:36:03 -0400 Subject: [PATCH 61/74] Change populate_next_and_previous_page Replace `populate_next_and_previous_page` with `populate_siblings` --- components/content/benches/all.rs | 8 ++++---- components/content/src/lib.rs | 2 +- components/content/src/sorting.rs | 8 ++++---- components/site/src/lib.rs | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/components/content/benches/all.rs b/components/content/benches/all.rs index cb80fdbb..5a90943e 100644 --- a/components/content/benches/all.rs +++ b/components/content/benches/all.rs @@ -11,7 +11,7 @@ use std::collections::HashMap; use config::Config; use tera::Tera; use front_matter::{SortBy, InsertAnchor}; -use content::{Page, sort_pages, populate_previous_and_next_pages}; +use content::{Page, sort_pages, populate_siblings}; fn create_pages(number: usize, sort_by: SortBy) -> Vec { @@ -128,17 +128,17 @@ fn bench_sorting_order(b: &mut test::Bencher) { } #[bench] -fn bench_populate_previous_and_next_pages(b: &mut test::Bencher) { +fn bench_populate_siblings(b: &mut test::Bencher) { let pages = create_pages(250, SortBy::Order); let (sorted_pages, _) = sort_pages(pages, SortBy::Order); - b.iter(|| populate_previous_and_next_pages(&sorted_pages.clone())); + b.iter(|| populate_siblings(&sorted_pages.clone())); } #[bench] fn bench_page_render_html(b: &mut test::Bencher) { let pages = create_pages(10, SortBy::Order); let (mut sorted_pages, _) = sort_pages(pages, SortBy::Order); - sorted_pages = populate_previous_and_next_pages(&sorted_pages); + sorted_pages = populate_siblings(&sorted_pages); let config = Config::default(); let mut tera = Tera::default(); diff --git a/components/content/src/lib.rs b/components/content/src/lib.rs index 5d111c4e..11bfcc85 100644 --- a/components/content/src/lib.rs +++ b/components/content/src/lib.rs @@ -26,4 +26,4 @@ mod sorting; pub use file_info::FileInfo; pub use page::Page; pub use section::Section; -pub use sorting::{sort_pages, populate_previous_and_next_pages}; +pub use sorting::{sort_pages, populate_siblings}; diff --git a/components/content/src/sorting.rs b/components/content/src/sorting.rs index 592d8446..775c67b5 100644 --- a/components/content/src/sorting.rs +++ b/components/content/src/sorting.rs @@ -53,7 +53,7 @@ pub fn sort_pages(pages: Vec, sort_by: SortBy) -> (Vec, Vec) { /// Horribly inefficient way to set previous and next on each pages that skips drafts /// So many clones -pub fn populate_previous_and_next_pages(input: &[Page], sort_by: SortBy) -> Vec { +pub fn populate_siblings(input: &[Page], sort_by: SortBy) -> Vec { let mut res = Vec::with_capacity(input.len()); // The input is already sorted @@ -140,7 +140,7 @@ pub fn populate_previous_and_next_pages(input: &[Page], sort_by: SortBy) -> Vec< mod tests { use front_matter::{PageFrontMatter, SortBy}; use page::Page; - use super::{sort_pages, populate_previous_and_next_pages}; + use super::{sort_pages, populate_siblings}; fn create_page_with_date(date: &str) -> Page { let mut front_matter = PageFrontMatter::default(); @@ -208,13 +208,13 @@ mod tests { } #[test] - fn can_populate_previous_and_next_pages() { + fn can_populate_siblings() { let input = vec![ create_page_with_weight(1), create_page_with_weight(2), create_page_with_weight(3), ]; - let pages = populate_previous_and_next_pages(&input, SortBy::Weight); + let pages = populate_siblings(&input, SortBy::Weight); assert!(pages[0].clone().lighter.is_none()); assert!(pages[0].clone().heavier.is_some()); diff --git a/components/site/src/lib.rs b/components/site/src/lib.rs index 85d10953..2e9a4aa1 100644 --- a/components/site/src/lib.rs +++ b/components/site/src/lib.rs @@ -36,7 +36,7 @@ use config::{Config, get_config}; use utils::fs::{create_file, copy_directory, create_directory, ensure_directory_exists}; use utils::templates::{render_template, rewrite_theme_paths}; use utils::net::get_available_port; -use content::{Page, Section, populate_previous_and_next_pages, sort_pages}; +use content::{Page, Section, populate_siblings, sort_pages}; use templates::{GUTENBERG_TERA, global_fns, render_redirect_template}; use front_matter::{SortBy, InsertAnchor}; use taxonomies::{Taxonomy, find_taxonomies}; @@ -401,7 +401,7 @@ impl Site { } let pages = mem::replace(&mut section.pages, vec![]); let (sorted_pages, cannot_be_sorted_pages) = sort_pages(pages, section.meta.sort_by); - section.pages = populate_previous_and_next_pages(&sorted_pages, section.meta.sort_by); + section.pages = populate_siblings(&sorted_pages, section.meta.sort_by); section.ignored_pages = cannot_be_sorted_pages; } } From 60a52fd2cc37b5c015f377a3f654c6ca871db9c1 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Tue, 31 Jul 2018 15:17:31 +0200 Subject: [PATCH 62/74] Some intellij reformatting --- Cargo.lock | 188 +++++------------- components/config/src/lib.rs | 2 +- components/config/src/theme.rs | 4 +- components/content/benches/all.rs | 4 +- components/content/src/page.rs | 11 +- components/content/src/section.rs | 2 +- components/content/src/sorting.rs | 17 +- components/front_matter/src/lib.rs | 1 - components/front_matter/src/page.rs | 8 +- components/highlighting/src/lib.rs | 4 +- components/imageproc/src/lib.rs | 26 +-- components/link_checker/src/lib.rs | 4 +- components/pagination/src/lib.rs | 12 +- components/rebuild/src/lib.rs | 26 +-- components/rendering/src/context.rs | 1 - components/rendering/src/lib.rs | 2 +- components/rendering/src/markdown.rs | 22 +- components/rendering/src/shortcode.rs | 40 ++-- components/rendering/src/table_of_contents.rs | 6 +- components/site/src/lib.rs | 30 +-- components/taxonomies/src/lib.rs | 8 +- components/templates/src/filters.rs | 2 +- components/templates/src/global_fns.rs | 2 +- components/utils/src/fs.rs | 4 +- components/utils/src/site.rs | 2 +- components/utils/src/templates.rs | 6 +- 26 files changed, 174 insertions(+), 260 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 469919aa..da8c46c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,9 +1,9 @@ [[package]] name = "actix" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "actix_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "actix_derive 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-channel 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -28,15 +28,15 @@ dependencies = [ [[package]] name = "actix-web" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "actix 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "actix 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "base64 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", - "cookie 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cookie 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -44,7 +44,7 @@ dependencies = [ "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "h2 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "htmlescape 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -77,13 +77,12 @@ dependencies = [ [[package]] name = "actix_derive" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -178,7 +177,7 @@ name = "base64" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -187,7 +186,7 @@ name = "base64" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -196,7 +195,7 @@ name = "bincode" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -227,7 +226,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "byteorder" -version = "1.2.3" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -240,7 +239,7 @@ name = "bytes" version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -256,7 +255,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "chrono" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", @@ -286,14 +285,6 @@ dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "cmake" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "color_quant" version = "1.0.1" @@ -303,9 +294,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "config" version = "0.1.0" dependencies = [ - "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "errors 0.1.0", - "globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "globset 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "highlighting 0.1.0", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", @@ -316,11 +307,11 @@ dependencies = [ name = "content" version = "0.1.0" dependencies = [ - "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "config 0.1.0", "errors 0.1.0", "front_matter 0.1.0", - "globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "globset 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "rendering 0.1.0", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", @@ -333,7 +324,7 @@ dependencies = [ [[package]] name = "cookie" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", @@ -480,7 +471,7 @@ version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -488,17 +479,6 @@ name = "dtoa" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "duct" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "os_pipe 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", - "shared_child 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "either" version = "1.5.0" @@ -678,7 +658,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "front_matter" version = "0.1.0" dependencies = [ - "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "errors 0.1.0", "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -777,22 +757,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "globset" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "aho-corasick 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "gutenberg" version = "0.4.0" dependencies = [ - "actix-web 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-web 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "content 0.1.0", "ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -813,11 +793,11 @@ name = "h2" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -862,7 +842,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "http" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -935,7 +915,7 @@ name = "image" version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "gif 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "jpeg-decoder 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", "lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1012,7 +992,7 @@ name = "jpeg-decoder" version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1061,7 +1041,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1299,19 +1279,6 @@ dependencies = [ "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "nix" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "nix" version = "0.11.0" @@ -1404,16 +1371,15 @@ dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "onig_sys 68.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "onig_sys 68.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "onig_sys" -version = "68.0.1" +version = "68.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cmake 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)", - "duct 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1441,15 +1407,6 @@ dependencies = [ "vcpkg 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "os_pipe" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "nix 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "owning_ref" version = "0.3.3" @@ -1553,7 +1510,7 @@ name = "phf_shared" version = "0.7.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "siphasher 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1568,8 +1525,8 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1725,18 +1682,6 @@ dependencies = [ "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "regex" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "aho-corasick 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", - "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "regex" version = "1.0.2" @@ -1754,14 +1699,6 @@ name = "regex-syntax" version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "regex-syntax" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "regex-syntax" version = "0.6.2" @@ -1983,19 +1920,9 @@ name = "sha1" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "shared_child" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "siphasher" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2268,7 +2195,7 @@ name = "tera" version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "humansize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2535,7 +2462,7 @@ name = "trust-dns-proto" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2778,7 +2705,7 @@ name = "ws" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2815,9 +2742,9 @@ dependencies = [ ] [metadata] -"checksum actix 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "28b4c697e6e63280f874c1d3e30c476de1cc589efd91b32b748a17808cb4adc3" -"checksum actix-web 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1bf2bc88dea9c852b9e2fc1c509a422907e05e83d06bef510e8f493b3396f01a" -"checksum actix_derive 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c4b1dc922654b9aca7a8a31eab875fde804fa9fbd67f220f2e457787b23590f2" +"checksum actix 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0470f5163ac229ed0329f6abbd6f775591b06ec5ecbf2f2589c16ab8bd6f76b8" +"checksum actix-web 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2b79aac53ea4922b114768413037f2d75d4ab039646bbf700ce152bb2678b6eb" +"checksum actix_derive 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b9d1525ef45e5e021f0b93dace157dcab5d792acb4cc78f3213787d65e2bb92" "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aho-corasick 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c6d463cbe7ed28720b5b489e7c083eeb8f90d08be2a0d6bb9e1ffea9ce1afa" "checksum ammonia 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a8b93ecb80665873703bf3b0a77f369c96b183d8e0afaf30a3ff5ff07dfc6409" @@ -2835,17 +2762,16 @@ dependencies = [ "checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" "checksum bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c54bb8f454c567f21197eefcdbf5679d0bd99f2ddbe52e84c77061952e6789" "checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" -"checksum byteorder 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "74c0b906e9446b0a2e4f760cdb3fa4b2c48cdc6db8766a845c54b6ff063fd2e9" +"checksum byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8389c509ec62b9fe8eca58c502a0acaf017737355615243496cde4994f8fa4f9" "checksum bytes 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c129aff112dcc562970abb69e2508b40850dd24c274761bb50fb8a0067ba6c27" "checksum bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e178b8e0e239e844b083d5a0d4a156b2654e67f9f80144d48398fcd736a24fb8" "checksum cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "2119ea4867bd2b8ed3aecab467709720b2d55b1bcfe09f772fd68066eaf15275" "checksum cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efe5c877e17a9c717a0bf3613b2709f723202c4e4675cc8f12926ded29bcb17e" -"checksum chrono 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6962c635d530328acc53ac6a955e83093fedc91c5809dfac1fa60fa470830a37" +"checksum chrono 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e48d85528df61dc964aa43c5f6ca681a19cfa74939b2348d204bd08a981f2fb0" "checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum cmake 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "95470235c31c726d72bf2e1f421adc1e65b9d561bf5529612cbe1a72da1467b3" "checksum color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbbb57365263e881e805dc77d94697c9118fd94d8da011240555aa7b23445bd" -"checksum cookie 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "746858cae4eae40fff37e1998320068df317bc247dc91a67c6cfa053afdc2abb" +"checksum cookie 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1465f8134efa296b4c19db34d909637cb2bf0f7aaf21299e23e18fa29ac557cf" "checksum core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25bfd746d203017f7d5cbd31ee5d8e17f94b6521c7af77ece6c9e4b2d4b16c67" "checksum core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "065a5d7ffdcbc8fa145d6f0746f3555025b9097a9e9cda59f7467abae670c78d" "checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" @@ -2862,7 +2788,6 @@ dependencies = [ "checksum dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "97590ba53bcb8ac28279161ca943a924d1fd4a8fb3fa63302591647c4fc5b850" "checksum deflate 0.7.18 (registry+https://github.com/rust-lang/crates.io-index)" = "32c8120d981901a9970a3a1c97cf8b630e0fa8c3ca31e75b6fd6fd5f9f427b31" "checksum dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d301140eb411af13d3115f9a562c85cc6b541ade9dfa314132244aaee7489dd" -"checksum duct 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "166298c17c5b4fe5997b962c2f22e887c7c5adc44308eb9103ce5b66af45a423" "checksum either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be565ca5c557d7f59e7cfcf1844f9e3033650c929c6566f511e8005f205c1d0" "checksum elasticlunr-rs 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4837d77a1e157489a3933b743fd774ae75074e0e390b2b7f071530048a0d87ee" "checksum encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" @@ -2895,12 +2820,12 @@ dependencies = [ "checksum getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "0a7292d30132fb5424b354f5dc02512a86e4c516fe544bb7a25e7f266951b797" "checksum gif 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff3414b424657317e708489d2857d9575f4403698428b040b609b9d1c1a84a2c" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" -"checksum globset 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "142754da2c9b3722affd909f9e27f2a6700a7a303f362971e0a74c652005a43d" +"checksum globset 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8e49edbcc9c7fc5beb8c0a54e7319ff8bed353a2b55e85811c6281188c2a6c84" "checksum h2 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "6229ac66d3392dd83288fe04defd4b353354b15bbe07820d53dda063a736afcc" "checksum hostname 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "21ceb46a83a85e824ef93669c8b390009623863b5c195d1ba747292c0c72f94e" "checksum html5ever 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b04478cf718862650a0bf66acaf8f2f8c906fbc703f35c916c1f4211b069a364" "checksum htmlescape 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e9025058dae765dee5070ec375f591e2ba14638c63feff74f13805a72e523163" -"checksum http 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "4fbced8864b04c030eebcb7d0dc3a81ba5231ac559f5116a29a8ba83ecee22cd" +"checksum http 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0d7f7b919d476c052ff46833ac89aaf205726da8133dae61facad50ec4c9eaec" "checksum httparse 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7b6288d7db100340ca12873fd4d08ad1b8f206a9457798dfb17c018a33fee540" "checksum humansize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6cab2627acfc432780848602f3f558f7e9dd427352224b0d9324025796d2a5e" "checksum hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)" = "34a590ca09d341e94cddf8e5af0bbccde205d5fbc2fa3c09dd67c7f85cea59d7" @@ -2946,7 +2871,6 @@ dependencies = [ "checksum native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f74dbadc8b43df7864539cedb7bc91345e532fdd913cfdc23ad94f4d2d40fbc0" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" "checksum new_debug_unreachable 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0cdc457076c78ab54d5e0d6fa7c47981757f1e34dc39ff92787f217dede586c4" -"checksum nix 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b7fd5681d13fda646462cfbd4e5f2051279a89a544d50eb98c365b507246839f" "checksum nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d37e713a259ff641624b6cb20e3b12b2952313ba36b6823c0f16e6cfd9e5de17" "checksum nix 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bfb3ddedaa14746434a02041940495bf11325c22f6d36125d3bdd56090d50a79" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" @@ -2958,10 +2882,9 @@ dependencies = [ "checksum num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "630de1ef5cc79d0cdd78b7e33b81f083cbfe90de0f4b2b2f07f905867c70e9fe" "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" "checksum onig 3.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f5eeb268a4620c74ea5768c6d2ccd492d60a47a8754666b91a46bfc35cd4d1ba" -"checksum onig_sys 68.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c6be7c4f985508684e54f18dd37f71e66f3e1ad9318336a520d7e42f0d3ea8e" +"checksum onig_sys 68.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "48b1fc88a091cf46a8ec67a3cd3ffd55f75d3bed741c76f253d78746ec43602b" "checksum openssl 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)" = "a3605c298474a3aa69de92d21139fb5e2a81688d308262359d85cdd0d12a7985" "checksum openssl-sys 0.9.33 (registry+https://github.com/rust-lang/crates.io-index)" = "d8abc04833dcedef24221a91852931df2f63e3369ae003134e70aff3645775cc" -"checksum os_pipe 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934868c3f86ed7a39ef63d88edeac5bd49a0c843192651900e9ce1178cbbf157" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" "checksum parking_lot 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4d05f1349491390b1730afba60bb20d55761bef489a954546b58b4b34e1e2ac" "checksum parking_lot 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "69376b761943787ebd5cc85a5bc95958651a22609c5c1c2b65de21786baec72b" @@ -2992,10 +2915,8 @@ dependencies = [ "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" "checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" -"checksum regex 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9329abc99e39129fcceabd24cf5d85b4671ef7c29c50e972bc5afe32438ec384" "checksum regex 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5bbbea44c5490a1e84357ff28b7d518b4619a159fed5d25f6c1de2d19cc42814" "checksum regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8e931c58b93d86f080c734bfd2bce7dd0079ae2331235818133c8be7f422e20e" -"checksum regex-syntax 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7d707a4fa2637f2dca2ef9fd02225ec7661fe01a53623c1e6515b6916511f7a7" "checksum regex-syntax 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "747ba3b235651f6e2f67dfa8bcdcd073ddb7c243cb21c442fc12395dfcac212d" "checksum relay 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1576e382688d7e9deecea24417e350d3062d97e32e45d70b1cde65994ff1489a" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" @@ -3018,8 +2939,7 @@ dependencies = [ "checksum serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c6908c7b925cd6c590358a4034de93dbddb20c45e1d021931459fd419bf0e2" "checksum serde_urlencoded 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e703cef904312097cfceab9ce131ff6bbe09e8c964a0703345a5f49238757bc1" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" -"checksum shared_child 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bcd5e483b3475af9bc2a35311c2f3bbf0bd98fde91410ab15a0d4ba3c3127b4e" -"checksum siphasher 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0df90a788073e8d0235a67e50441d47db7c8ad9debd91cbf43736a2a92d36537" +"checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" "checksum slab 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d807fd58c4181bbabed77cb3b891ba9748241a552bcc5be698faaebefc54f46e" "checksum slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b4fcaed89ab08ef143da37bc52adbcc04d4a69014f4c1208d6b51f0c47bc23" "checksum slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fdeff4cd9ecff59ec7e3744cbca73dfe5ac35c2aedb2cfba8a1c715a18912e9d" diff --git a/components/config/src/lib.rs b/components/config/src/lib.rs index 46a41090..40b4ff16 100644 --- a/components/config/src/lib.rs +++ b/components/config/src/lib.rs @@ -12,7 +12,7 @@ use std::fs::File; use std::io::prelude::*; use std::path::{Path, PathBuf}; -use toml::{Value as Toml}; +use toml::Value as Toml; use chrono::Utc; use globset::{Glob, GlobSet, GlobSetBuilder}; diff --git a/components/config/src/theme.rs b/components/config/src/theme.rs index 7c054912..9d4c5ada 100644 --- a/components/config/src/theme.rs +++ b/components/config/src/theme.rs @@ -3,7 +3,7 @@ use std::fs::File; use std::io::prelude::*; use std::path::PathBuf; -use toml::{Value as Toml}; +use toml::Value as Toml; use errors::{Result, ResultExt}; @@ -37,7 +37,7 @@ impl Theme { } - Ok(Theme {extra}) + Ok(Theme { extra }) } /// Parses a theme file from the given path diff --git a/components/content/benches/all.rs b/components/content/benches/all.rs index 5a90943e..b6974d87 100644 --- a/components/content/benches/all.rs +++ b/components/content/benches/all.rs @@ -23,8 +23,8 @@ fn create_pages(number: usize, sort_by: SortBy) -> Vec { for i in 0..number { let mut page = Page::default(); match sort_by { - SortBy::Weight => { page.meta.weight = Some(i); }, - SortBy::Order => { page.meta.order = Some(i); }, + SortBy::Weight => { page.meta.weight = Some(i); } + SortBy::Order => { page.meta.order = Some(i); } _ => (), }; page.raw_content = r#" diff --git a/components/content/src/page.rs b/components/content/src/page.rs index 567c95ca..c0c6cb1c 100644 --- a/components/content/src/page.rs +++ b/components/content/src/page.rs @@ -162,7 +162,6 @@ impl Page { } Ok(page) - } /// We need access to all pages url to render links relative to content @@ -173,14 +172,14 @@ impl Page { config, &self.permalink, permalinks, - anchor_insert + anchor_insert, ); context.tera_context.add("page", self); let res = render_content( &self.raw_content.replacen("", "", 1), - &context + &context, ).chain_err(|| format!("Failed to render content of {}", self.file.path.display()))?; self.content = res.0; self.toc = res.1; @@ -437,7 +436,7 @@ Hello world let res = Page::from_file( nested_path.join("index.md").as_path(), - &Config::default() + &Config::default(), ); assert!(res.is_ok()); let page = res.unwrap(); @@ -463,7 +462,7 @@ Hello world let res = Page::from_file( nested_path.join("index.md").as_path(), - &Config::default() + &Config::default(), ); assert!(res.is_ok()); let page = res.unwrap(); @@ -494,7 +493,7 @@ Hello world let res = Page::from_file( nested_path.join("index.md").as_path(), - &config + &config, ); assert!(res.is_ok()); diff --git a/components/content/src/section.rs b/components/content/src/section.rs index bd948cd3..58567f32 100644 --- a/components/content/src/section.rs +++ b/components/content/src/section.rs @@ -91,7 +91,7 @@ impl Section { return "index.html".to_string(); } "section.html".to_string() - }, + } } } diff --git a/components/content/src/sorting.rs b/components/content/src/sorting.rs index 775c67b5..bf1f1751 100644 --- a/components/content/src/sorting.rs +++ b/components/content/src/sorting.rs @@ -11,7 +11,7 @@ use front_matter::SortBy; /// will be ignored. pub fn sort_pages(pages: Vec, sort_by: SortBy) -> (Vec, Vec) { if sort_by == SortBy::None { - return (pages, vec![]); + return (pages, vec![]); } let (mut can_be_sorted, cannot_be_sorted): (Vec<_>, Vec<_>) = pages @@ -34,7 +34,7 @@ pub fn sort_pages(pages: Vec, sort_by: SortBy) -> (Vec, Vec) { ord } }) - }, + } SortBy::Weight => { can_be_sorted.par_sort_unstable_by(|a, b| { let ord = a.meta.weight().cmp(&b.meta.weight()); @@ -44,7 +44,7 @@ pub fn sort_pages(pages: Vec, sort_by: SortBy) -> (Vec, Vec) { ord } }) - }, + } _ => unreachable!() }; @@ -86,13 +86,13 @@ pub fn populate_siblings(input: &[Page], sort_by: SortBy) -> Vec { next_page.lighter = None; next_page.heavier = None; new_page.lighter = Some(Box::new(next_page)); - }, + } SortBy::Date => { next_page.earlier = None; next_page.later = None; new_page.later = Some(Box::new(next_page)); - }, - SortBy::None => {} + } + SortBy::None => () } break; } @@ -118,14 +118,13 @@ pub fn populate_siblings(input: &[Page], sort_by: SortBy) -> Vec { previous_page.lighter = None; previous_page.heavier = None; new_page.heavier = Some(Box::new(previous_page)); - }, + } SortBy::Date => { previous_page.earlier = None; previous_page.later = None; new_page.earlier = Some(Box::new(previous_page)); - }, - SortBy::None => { } + SortBy::None => {} } break; } diff --git a/components/front_matter/src/lib.rs b/components/front_matter/src/lib.rs index 82493762..fd2739c3 100644 --- a/components/front_matter/src/lib.rs +++ b/components/front_matter/src/lib.rs @@ -149,5 +149,4 @@ date = 2002-10-12"#; let res = split_page_content(Path::new(""), content); assert!(res.is_err()); } - } diff --git a/components/front_matter/src/page.rs b/components/front_matter/src/page.rs index afbfc5b5..fd8ebc98 100644 --- a/components/front_matter/src/page.rs +++ b/components/front_matter/src/page.rs @@ -1,5 +1,5 @@ use std::collections::HashMap; -use std::result::{Result as StdResult}; +use std::result::Result as StdResult; use chrono::prelude::*; use tera::{Map, Value}; @@ -35,7 +35,7 @@ fn convert_toml_date(table: Map) -> Value { return Value::Object(new); } new.insert(k, convert_toml_date(o)); - }, + } _ => { new.insert(k, v); } } } @@ -52,8 +52,8 @@ fn fix_toml_dates(table: Map) -> Value { match value { Value::Object(mut o) => { new.insert(key, convert_toml_date(o)); - }, - _ => { new.insert(key, value); }, + } + _ => { new.insert(key, value); } } } diff --git a/components/highlighting/src/lib.rs b/components/highlighting/src/lib.rs index 10834dbe..f8142790 100644 --- a/components/highlighting/src/lib.rs +++ b/components/highlighting/src/lib.rs @@ -7,7 +7,7 @@ use syntect::parsing::SyntaxSet; use syntect::highlighting::{ThemeSet, Theme}; use syntect::easy::HighlightLines; -thread_local!{ +thread_local! { pub static SYNTAX_SET: SyntaxSet = { let mut ss: SyntaxSet = from_binary(include_bytes!("../../../sublime_syntaxes/newlines.packdump")); ss.link_syntaxes(); @@ -15,7 +15,7 @@ thread_local!{ }; } -lazy_static!{ +lazy_static! { pub static ref THEME_SET: ThemeSet = from_binary(include_bytes!("../../../sublime_themes/all.themedump")); } diff --git a/components/imageproc/src/lib.rs b/components/imageproc/src/lib.rs index bbf0e7ee..db553a6c 100644 --- a/components/imageproc/src/lib.rs +++ b/components/imageproc/src/lib.rs @@ -25,7 +25,7 @@ use errors::{Result, ResultExt}; static RESIZED_SUBDIR: &'static str = "_processed_images"; -lazy_static!{ +lazy_static! { pub static ref RESIZED_FILENAME: Regex = Regex::new(r#"([0-9a-f]{16})([0-9a-f]{2})[.]jpg"#).unwrap(); } @@ -58,13 +58,13 @@ impl ResizeOp { // Validate args: match op { "fit_width" => if width.is_none() { - return Err("op=\"fit_width\" requires a `width` argument".to_string().into()) + return Err("op=\"fit_width\" requires a `width` argument".to_string().into()); }, "fit_height" => if height.is_none() { - return Err("op=\"fit_height\" requires a `height` argument".to_string().into()) + return Err("op=\"fit_height\" requires a `height` argument".to_string().into()); }, "scale" | "fit" | "fill" => if width.is_none() || height.is_none() { - return Err(format!("op={} requires a `width` and `height` argument", op).into()) + return Err(format!("op={} requires a `width` and `height` argument", op).into()); }, _ => return Err(format!("Invalid image resize operation: {}", op).into()) }; @@ -121,7 +121,7 @@ impl From for u8 { impl Hash for ResizeOp { fn hash(&self, hasher: &mut H) { hasher.write_u8(u8::from(*self)); - if let Some(w) = self.width() { hasher.write_u32(w); } + if let Some(w) = self.width() { hasher.write_u32(w); } if let Some(h) = self.height() { hasher.write_u32(h); } } } @@ -168,7 +168,7 @@ impl ImageOp { let src_path = content_path.join(&self.source); if !ufs::file_stale(&src_path, target_path) { - return Ok(()) + return Ok(()); } let mut img = image::open(&src_path)?; @@ -210,7 +210,7 @@ impl ImageOp { img.crop(offset_w, offset_h, crop_w, crop_h) .resize_exact(w, h, RESIZE_FILTER) } - }, + } }; let mut f = File::create(target_path)?; @@ -251,9 +251,9 @@ impl Processor { fn resized_url(base_url: &str) -> String { if base_url.ends_with('/') { - format!("{}{}", base_url, RESIZED_SUBDIR) + format!("{}{}", base_url, RESIZED_SUBDIR) } else { - format!("{}/{}", base_url, RESIZED_SUBDIR) + format!("{}/{}", base_url, RESIZED_SUBDIR) } } @@ -275,7 +275,7 @@ impl Processor { HEntry::Vacant(entry) => { entry.insert(img_op); return 0; - }, + } } // If we get here, that means a hash collision. @@ -342,7 +342,7 @@ impl Processor { if let Some(capts) = RESIZED_FILENAME.captures(filename.as_ref()) { let hash = u64::from_str_radix(capts.get(1).unwrap().as_str(), 16).unwrap(); let collision_id = u32::from_str_radix( - capts.get(2).unwrap().as_str(), 16 + capts.get(2).unwrap().as_str(), 16, ).unwrap(); if collision_id > 0 || !self.img_ops.contains_key(&hash) { @@ -364,8 +364,8 @@ impl Processor { op.perform(&self.content_path, &target) .chain_err(|| format!("Failed to process image: {}", op.source)) }) - .fold(|| Ok(()), Result::and) - .reduce(|| Ok(()), Result::and) + .fold(|| Ok(()), Result::and) + .reduce(|| Ok(()), Result::and) } } diff --git a/components/link_checker/src/lib.rs b/components/link_checker/src/lib.rs index 4d2d3324..4aa2d816 100644 --- a/components/link_checker/src/lib.rs +++ b/components/link_checker/src/lib.rs @@ -5,7 +5,7 @@ extern crate lazy_static; use std::collections::HashMap; use std::error::Error; use std::sync::{Arc, RwLock}; -use reqwest::{StatusCode}; +use reqwest::StatusCode; #[derive(Clone, Debug, PartialEq)] @@ -48,7 +48,7 @@ lazy_static! { pub fn check_url(url: &str) -> LinkResult { { - let guard = LINKS.read().unwrap(); + let guard = LINKS.read().unwrap(); if let Some(res) = guard.get(url) { return res.clone(); } diff --git a/components/pagination/src/lib.rs b/components/pagination/src/lib.rs index 16aa1fc7..c93faade 100644 --- a/components/pagination/src/lib.rs +++ b/components/pagination/src/lib.rs @@ -39,7 +39,7 @@ pub struct Pager<'a> { /// Path to that page path: String, /// All pages for the pager - pages: Vec<&'a Page> + pages: Vec<&'a Page>, } impl<'a> Pager<'a> { @@ -187,7 +187,7 @@ impl<'a> Paginator<'a> { "pagers", to_value( &self.pagers.iter().map(|p| p.clone_without_pages()).collect::>() - ).unwrap() + ).unwrap(), ); // Variables for this specific page @@ -217,11 +217,11 @@ impl<'a> Paginator<'a> { PaginationRoot::Section(s) => { context.add("section", &s); s.get_template_name() - }, + } PaginationRoot::Taxonomy(t) => { context.add("taxonomy", &t.kind); format!("{}/single.html", t.kind.name) - }, + } }; context.add("current_url", &pager.permalink); context.add("current_path", &pager.path); @@ -238,7 +238,7 @@ mod tests { use front_matter::SectionFrontMatter; use content::{Page, Section}; - use config::{Taxonomy as TaxonomyConfig}; + use config::Taxonomy as TaxonomyConfig; use taxonomies::{Taxonomy, TaxonomyItem}; use super::Paginator; @@ -348,7 +348,7 @@ mod tests { permalink: "https://vincent.is/tags/something/".to_string(), pages, }; - let taxonomy = Taxonomy {kind: taxonomy_def, items: vec![taxonomy_item.clone()]}; + let taxonomy = Taxonomy { kind: taxonomy_def, items: vec![taxonomy_item.clone()] }; let paginator = Paginator::from_taxonomy(&taxonomy, &taxonomy_item); assert_eq!(paginator.pagers.len(), 2); diff --git a/components/rebuild/src/lib.rs b/components/rebuild/src/lib.rs index b438776c..a96c7fb0 100644 --- a/components/rebuild/src/lib.rs +++ b/components/rebuild/src/lib.rs @@ -16,7 +16,7 @@ use front_matter::{PageFrontMatter, SectionFrontMatter}; pub fn find_parent_section<'a>(site: &'a Site, page: &Page) -> Option<&'a Section> { for section in site.sections.values() { if section.is_child_page(&page.file.path) { - return Some(section) + return Some(section); } } @@ -149,18 +149,18 @@ fn handle_section_editing(site: &mut Site, path: &Path) -> Result<()> { SectionChangesNeeded::Sort => { site.sort_sections_pages(Some(path)); site.register_tera_global_fns(); - }, + } SectionChangesNeeded::Render => site.render_section(&site.sections[path], false)?, SectionChangesNeeded::RenderWithPages => site.render_section(&site.sections[path], true)?, // not a common enough operation to make it worth optimizing SectionChangesNeeded::Delete => { site.populate_sections(); site.build()?; - }, + } }; } return Ok(()); - }, + } // New section, only render that one None => { site.populate_sections(); @@ -198,7 +198,7 @@ fn handle_page_editing(site: &mut Site, path: &Path) -> Result<()> { // I can't think of a valid usecase where you would need the content // of a page through a global fn so it's commented out for now // site.register_tera_global_fns(); - return site.render_page(& site.pages[path]); + return site.render_page(&site.pages[path]); } // Front matter changed @@ -210,7 +210,7 @@ fn handle_page_editing(site: &mut Site, path: &Path) -> Result<()> { site.populate_taxonomies()?; site.register_tera_global_fns(); site.render_taxonomies()?; - }, + } PageChangesNeeded::Sort => { let section_path = match find_parent_section(site, &site.pages[path]) { Some(s) => s.file.path.clone(), @@ -223,7 +223,7 @@ fn handle_page_editing(site: &mut Site, path: &Path) -> Result<()> { site.sort_sections_pages(Some(§ion_path)); site.register_tera_global_fns(); site.render_index()?; - }, + } PageChangesNeeded::Render => { if !sections_populated { site.populate_sections(); @@ -232,11 +232,11 @@ fn handle_page_editing(site: &mut Site, path: &Path) -> Result<()> { site.register_tera_global_fns(); render_parent_section!(site, path); site.render_page(&site.pages[path])?; - }, + } }; } Ok(()) - }, + } // It's a new page! None => { site.populate_sections(); @@ -289,7 +289,7 @@ pub fn after_content_change(site: &mut Site, path: &Path) -> Result<()> { handle_page_editing(site, path) } } else { - if index.exists() { + if index.exists() { handle_page_editing(site, &index) } else { Ok(()) @@ -310,7 +310,7 @@ pub fn after_template_change(site: &mut Site, path: &Path) -> Result<()> { "page.html" => { site.render_sections()?; site.render_orphan_pages() - }, + } "section.html" => site.render_sections(), // Either the index or some unknown template changed // We can't really know what this change affects so rebuild all @@ -327,7 +327,7 @@ pub fn after_template_change(site: &mut Site, path: &Path) -> Result<()> { site.render_sections()?; site.render_orphan_pages()?; site.render_taxonomies() - }, + } } } @@ -339,7 +339,7 @@ mod tests { use front_matter::{PageFrontMatter, SectionFrontMatter, SortBy}; use super::{ find_page_front_matter_changes, find_section_front_matter_changes, - PageChangesNeeded, SectionChangesNeeded + PageChangesNeeded, SectionChangesNeeded, }; #[test] diff --git a/components/rendering/src/context.rs b/components/rendering/src/context.rs index 91eef513..68bc215b 100644 --- a/components/rendering/src/context.rs +++ b/components/rendering/src/context.rs @@ -35,5 +35,4 @@ impl<'a> RenderContext<'a> { config, } } - } diff --git a/components/rendering/src/lib.rs b/components/rendering/src/lib.rs index 540b021c..9e6d7257 100644 --- a/components/rendering/src/lib.rs +++ b/components/rendering/src/lib.rs @@ -32,7 +32,7 @@ pub use table_of_contents::Header; pub use shortcode::render_shortcodes; pub use context::RenderContext; -pub fn render_content(content: &str, context: &RenderContext) -> Result<(String, Vec
)> { +pub fn render_content(content: &str, context: &RenderContext) -> Result<(String, Vec
)> { // Don't do anything if there is nothing like a shortcode in the content if content.contains("{{") || content.contains("{%") { let rendered = render_shortcodes(content, context)?; diff --git a/components/rendering/src/markdown.rs b/components/rendering/src/markdown.rs index 9ceda569..3fe905de 100644 --- a/components/rendering/src/markdown.rs +++ b/components/rendering/src/markdown.rs @@ -90,7 +90,7 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<(Strin // Business as usual Event::Text(text) - }, + } Event::Start(Tag::CodeBlock(ref info)) => { if !context.config.highlight_code { return Event::Html(Owned("
".to_string()));
@@ -100,15 +100,15 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<(Strin
                     highlighter = Some(get_highlighter(&theme, info));
                     let snippet = start_coloured_html_snippet(theme);
                     Event::Html(Owned(snippet))
-                },
+                }
                 Event::End(Tag::CodeBlock(_)) => {
                     if !context.config.highlight_code {
-                        return Event::Html(Owned("
\n".to_string())) + return Event::Html(Owned("\n".to_string())); } // reset highlight and close the code block highlighter = None; Event::Html(Owned("".to_string())) - }, + } Event::Start(Tag::Image(src, title)) => { if is_colocated_asset_link(&src) { return Event::Start( @@ -120,7 +120,7 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<(Strin } Event::Start(Tag::Image(src, title)) - }, + } Event::Start(Tag::Link(link, title)) => { // A few situations here: // - it could be a relative link (starting with `./`) @@ -166,33 +166,33 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<(Strin } Event::Start(Tag::Link(Owned(fixed_link), title)) - }, + } Event::End(Tag::Link(_, _)) => { if in_header { temp_header.push(""); return Event::Html(Owned(String::new())); } event - }, + } Event::Start(Tag::Code) => { if in_header { temp_header.push(""); return Event::Html(Owned(String::new())); } event - }, + } Event::End(Tag::Code) => { if in_header { temp_header.push(""); return Event::Html(Owned(String::new())); } event - }, + } Event::Start(Tag::Header(num)) => { in_header = true; temp_header = TempHeader::new(num); Event::Html(Owned(String::new())) - }, + } Event::End(Tag::Header(_)) => { // End of a header, reset all the things and return the stringified // version of the header @@ -202,7 +202,7 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<(Strin headers.push(temp_header.clone()); temp_header = TempHeader::default(); Event::Html(Owned(val)) - }, + } _ => event, } }); diff --git a/components/rendering/src/shortcode.rs b/components/rendering/src/shortcode.rs index 92e83e8f..94ec3827 100644 --- a/components/rendering/src/shortcode.rs +++ b/components/rendering/src/shortcode.rs @@ -7,7 +7,7 @@ use ::context::RenderContext; // This include forces recompiling this source file if the grammar file changes. // Uncomment it when doing changes to the .pest file - const _GRAMMAR: &str = include_str!("content.pest"); +const _GRAMMAR: &str = include_str!("content.pest"); #[derive(Parser)] #[grammar = "content.pest"] @@ -35,10 +35,10 @@ fn parse_literal(pair: Pair) -> Value { Rule::string => val = Some(Value::String(replace_string_markers(p.as_str()))), Rule::float => { val = Some(to_value(p.as_str().parse::().unwrap()).unwrap()); - }, + } Rule::int => { val = Some(to_value(p.as_str().parse::().unwrap()).unwrap()); - }, + } _ => unreachable!("Unknown literal: {:?}", p) }; } @@ -53,14 +53,14 @@ fn parse_shortcode_call(pair: Pair) -> (String, Map) { for p in pair.into_inner() { match p.as_rule() { - Rule::ident => { name = Some(p.into_span().as_str().to_string()); }, + Rule::ident => { name = Some(p.into_span().as_str().to_string()); } Rule::kwarg => { let mut arg_name = None; let mut arg_val = None; for p2 in p.into_inner() { match p2.as_rule() { - Rule::ident => { arg_name = Some(p2.into_span().as_str().to_string()); }, - Rule::literal => { arg_val = Some(parse_literal(p2)); }, + Rule::ident => { arg_name = Some(p2.into_span().as_str().to_string()); } + Rule::literal => { arg_val = Some(parse_literal(p2)); } Rule::array => { let mut vals = vec![]; for p3 in p2.into_inner() { @@ -70,13 +70,13 @@ fn parse_shortcode_call(pair: Pair) -> (String, Map) { } } arg_val = Some(Value::Array(vals)); - }, + } _ => unreachable!("Got something unexpected in a kwarg: {:?}", p2), } } args.insert(arg_name.unwrap(), arg_val.unwrap()); - }, + } _ => unreachable!("Got something unexpected in a shortcode: {:?}", p) } } @@ -129,7 +129,7 @@ pub fn render_shortcodes(content: &str, context: &RenderContext) -> Result Result { let (name, args) = parse_shortcode_call(p); res.push_str(&render_shortcode(name, args, context, None)?); - }, + } Rule::shortcode_with_body => { let mut inner = p.into_inner(); // 3 items in inner: call, body, end @@ -147,14 +147,14 @@ pub fn render_shortcodes(content: &str, context: &RenderContext) -> Result { - res.push_str( - &p.into_span().as_str() - .replacen("{{/*", "{{", 1) - .replacen("*/}}", "}}", 1) - ); - }, + res.push_str( + &p.into_span().as_str() + .replacen("{{/*", "{{", 1) + .replacen("*/}}", "}}", 1) + ); + } Rule::ignored_shortcode_with_body => { for p2 in p.into_inner() { match p2.as_rule() { @@ -164,12 +164,12 @@ pub fn render_shortcodes(content: &str, context: &RenderContext) -> Result res.push_str(p2.into_span().as_str()), _ => unreachable!("Got something weird in an ignored shortcode: {:?}", p2), } } - }, + } _ => unreachable!("unexpected page rule: {:?}", p.as_rule()), } } @@ -244,7 +244,6 @@ mod tests { r#"{% youtube() %} Some text {% end %}"#, - r#"{% youtube(id=1, autoplay=true, url='hey') %} Some text @@ -261,7 +260,6 @@ mod tests { r#"{%/* youtube() */%} Some text {%/* end */%}"#, - r#"{%/* youtube(id=1, autoplay=true, url='hey') */%} Some text diff --git a/components/rendering/src/table_of_contents.rs b/components/rendering/src/table_of_contents.rs index 688c64d9..e6bd5dc5 100644 --- a/components/rendering/src/table_of_contents.rs +++ b/components/rendering/src/table_of_contents.rs @@ -58,9 +58,9 @@ impl TempHeader { }; match insert_anchor { - InsertAnchor::None => format!("{t}\n", lvl=self.level, t=self.title, id=self.id), - InsertAnchor::Left => format!("{a}{t}\n", lvl=self.level, a=anchor_link, t=self.title, id=self.id), - InsertAnchor::Right => format!("{t}{a}\n", lvl=self.level, a=anchor_link, t=self.title, id=self.id), + InsertAnchor::None => format!("{t}\n", lvl = self.level, t = self.title, id = self.id), + InsertAnchor::Left => format!("{a}{t}\n", lvl = self.level, a = anchor_link, t = self.title, id = self.id), + InsertAnchor::Right => format!("{t}{a}\n", lvl = self.level, a = anchor_link, t = self.title, id = self.id), } } } diff --git a/components/site/src/lib.rs b/components/site/src/lib.rs index 2e9a4aa1..81437bbb 100644 --- a/components/site/src/lib.rs +++ b/components/site/src/lib.rs @@ -287,10 +287,10 @@ impl Site { /// Adds global fns that are to be available to shortcodes while rendering markdown pub fn register_early_global_fns(&mut self) { self.tera.register_global_function( - "get_url", global_fns::make_get_url(self.permalinks.clone(), self.config.clone()) + "get_url", global_fns::make_get_url(self.permalinks.clone(), self.config.clone()), ); self.tera.register_global_function( - "resize_image", global_fns::make_resize_image(self.imageproc.clone()) + "resize_image", global_fns::make_resize_image(self.imageproc.clone()), ); } @@ -300,7 +300,7 @@ impl Site { self.tera.register_global_function("get_section", global_fns::make_get_section(&self.sections)); self.tera.register_global_function( "get_taxonomy", - global_fns::make_get_taxonomy(self.taxonomies.clone()) + global_fns::make_get_taxonomy(self.taxonomies.clone()), ); } @@ -419,7 +419,7 @@ impl Site { .filter(|p| !p.is_draft()) .cloned() .collect::>() - .as_slice() + .as_slice(), )?; Ok(()) @@ -430,7 +430,7 @@ impl Site { if let Some(port) = self.live_reload { return html.replace( "", - &format!(r#""#, port) + &format!(r#""#, port), ); } @@ -443,7 +443,7 @@ impl Site { if let Some(ref theme) = self.config.theme { copy_directory( &self.base_path.join("themes").join(theme).join("static"), - &self.output_path + &self.output_path, )?; } // We're fine with missing static folders @@ -656,7 +656,7 @@ impl Site { context.insert("config", &self.config); create_file( &self.output_path.join("404.html"), - &render_template("404.html", &self.tera, &context, &self.config.theme)? + &render_template("404.html", &self.tera, &context, &self.config.theme)?, ) } @@ -665,7 +665,7 @@ impl Site { ensure_directory_exists(&self.output_path)?; create_file( &self.output_path.join("robots.txt"), - &render_template("robots.txt", &self.tera, &Context::new(), &self.config.theme)? + &render_template("robots.txt", &self.tera, &Context::new(), &self.config.theme)?, ) } @@ -681,7 +681,7 @@ impl Site { fn render_taxonomy(&self, taxonomy: &Taxonomy) -> Result<()> { if taxonomy.items.is_empty() { - return Ok(()) + return Ok(()); } ensure_directory_exists(&self.output_path)?; @@ -698,7 +698,7 @@ impl Site { // TODO: can we get rid of `clone()`? self.render_rss_feed( Some(item.pages.clone()), - Some(&PathBuf::from(format!("{}/{}", taxonomy.kind.name, item.slug))) + Some(&PathBuf::from(format!("{}/{}", taxonomy.kind.name, item.slug))), )?; } @@ -739,9 +739,9 @@ impl Site { context.add("pages", &pages); let mut sections = self.sections - .values() - .map(|s| SitemapEntry::new(s.permalink.clone(), None)) - .collect::>(); + .values() + .map(|s| SitemapEntry::new(s.permalink.clone(), None)) + .collect::>(); sections.sort_by(|a, b| a.permalink.cmp(&b.permalink)); context.add("sections", §ions); @@ -789,7 +789,7 @@ impl Site { let (sorted_pages, _) = sort_pages(pages, SortBy::Date); context.add("last_build_date", &sorted_pages[0].meta.date.clone().map(|d| d.to_string())); - // limit to the last n elements + // limit to the last n elements context.add("pages", &sorted_pages.iter().take(self.config.rss_limit).collect::>()); context.add("config", &self.config); @@ -866,7 +866,7 @@ impl Site { pub fn render_index(&self) -> Result<()> { self.render_section( &self.sections[&self.content_path.join("_index.md")], - false + false, ) } diff --git a/components/taxonomies/src/lib.rs b/components/taxonomies/src/lib.rs index 9a7d037b..84258023 100644 --- a/components/taxonomies/src/lib.rs +++ b/components/taxonomies/src/lib.rs @@ -164,9 +164,9 @@ mod tests { fn can_make_taxonomies() { let mut config = Config::default(); config.taxonomies = vec![ - Taxonomy {name: "categories".to_string(), ..Taxonomy::default()}, - Taxonomy {name: "tags".to_string(), ..Taxonomy::default()}, - Taxonomy {name: "authors".to_string(), ..Taxonomy::default()}, + Taxonomy { name: "categories".to_string(), ..Taxonomy::default() }, + Taxonomy { name: "tags".to_string(), ..Taxonomy::default() }, + Taxonomy { name: "authors".to_string(), ..Taxonomy::default() }, ]; let mut page1 = Page::default(); let mut taxo_page1 = HashMap::new(); @@ -234,7 +234,7 @@ mod tests { fn errors_on_unknown_taxonomy() { let mut config = Config::default(); config.taxonomies = vec![ - Taxonomy {name: "authors".to_string(), ..Taxonomy::default()}, + Taxonomy { name: "authors".to_string(), ..Taxonomy::default() }, ]; let mut page1 = Page::default(); let mut taxo_page1 = HashMap::new(); diff --git a/components/templates/src/filters.rs b/components/templates/src/filters.rs index a9a356d5..f1536a84 100644 --- a/components/templates/src/filters.rs +++ b/components/templates/src/filters.rs @@ -51,7 +51,7 @@ pub fn base64_decode(value: Value, _: HashMap) -> TeraResult(p_source: PS, p_target: PT) -> bool where PS: AsRef) - } else { Ok(p.to_string()) } - }, + } None => bail!(format!("Relative link {} not found.", link)), } } diff --git a/components/utils/src/templates.rs b/components/utils/src/templates.rs index 68a0818d..3a25da0c 100644 --- a/components/utils/src/templates.rs +++ b/components/utils/src/templates.rs @@ -37,13 +37,13 @@ pub fn render_template(name: &str, tera: &Tera, context: &Context, theme: &Optio match name { "index.html" | "section.html" => { render_default_tpl!(name, "https://www.getgutenberg.io/documentation/templates/pages-sections/#section-variables") - }, + } "page.html" => { render_default_tpl!(name, "https://www.getgutenberg.io/documentation/templates/pages-sections/#page-variables") - }, + } "single.html" | "list.html" => { render_default_tpl!(name, "https://www.getgutenberg.io/documentation/templates/taxonomies/") - }, + } _ => bail!("Tried to render `{}` but the template wasn't found", name) } } From 9f9bae16d9a5764f2223c463ac8129fa2284a9cc Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Tue, 31 Jul 2018 15:31:36 +0200 Subject: [PATCH 63/74] Update changelog for sorting order --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cd819ab..ef5123ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Taxonomies have been rewritten from scratch to allow custom ones with RSS and pagination - `get_taxonomy_url` has been renamed to `get_taxonomy` and will now return the full taxonomy instead of just the URL of a term +- `order` sorting has been removed in favour of only having `weight` ### Others - Fix `serve` not working with the config flag From 37f5626cf7cf256795d864b6a6a727d9e67a89a0 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Tue, 31 Jul 2018 15:32:32 +0200 Subject: [PATCH 64/74] Update Sass ticks in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8cd724da..00e22483 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ in the `docs/content` folder of the repository. | Single binary | ✔ | ✔ | ✔ | ✕ | | Language | Rust | Rust | Go | Python | | Syntax highlighting | ✔ | ✔ | ✔ | ✔ | -| Sass compilation | ✔ | ✕ | ✕ | ✔ | +| Sass compilation | ✔ | ✔ | ✔ | ✔ | | Assets co-location | ✔ | ✔ | ✔ | ✔ | | i18n | ✕ | ✕ | ✔ | ✔ | | Image processing | ✔ | ✕ | ✔ | ✔ | From a83518a29b721c1892c0a15cdce1f22859ca0449 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Tue, 31 Jul 2018 15:39:10 +0200 Subject: [PATCH 65/74] Update warning message to use weight --- src/console.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/console.rs b/src/console.rs index 5905bbee..e28caa9d 100644 --- a/src/console.rs +++ b/src/console.rs @@ -44,7 +44,7 @@ pub fn warn_about_ignored_pages(site: &Site) { if !ignored_pages.is_empty() { warn(&format!( - "{} page(s) ignored (missing date or order in a sorted section):", + "{} page(s) ignored (missing date or weight in a sorted section):", ignored_pages.len() )); for path in ignored_pages { From efddb24b95b1022a107a9f6f6708807b373155b9 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Tue, 31 Jul 2018 16:35:16 +0200 Subject: [PATCH 66/74] We actually need get_taxonomy_url. Also update docs --- CHANGELOG.md | 3 +- README.md | 2 +- components/site/src/lib.rs | 4 ++ components/templates/src/global_fns.rs | 68 ++++++++++++++++++- docs/content/documentation/content/page.md | 25 ++++--- .../documentation/content/taxonomies.md | 11 ++- .../documentation/templates/overview.md | 25 ++++--- 7 files changed, 110 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef5123ab..822d6cef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,6 @@ ### Breaking - Taxonomies have been rewritten from scratch to allow custom ones with RSS and pagination -- `get_taxonomy_url` has been renamed to `get_taxonomy` and will now return the full taxonomy -instead of just the URL of a term - `order` sorting has been removed in favour of only having `weight` ### Others @@ -23,6 +21,7 @@ instead of just the URL of a term - Add a 404 template - Enable preserve-order feature of Tera - Add an external link checker +- Add `get_taxonomy` global function to return the full taxonomy ## 0.3.4 (2018-06-22) diff --git a/README.md b/README.md index 00e22483..9a4c6cd1 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ in the `docs/content` folder of the repository. | Automatic header anchors | ✔ | ✕ | ✔ | ✔ | | Aliases | ✔ | ✕ | ✔ | ✔ | | Pagination | ✔ | ✕ | ✔ | ✔ | -| Custom taxonomies | ✕ | ✕ | ✔ | ✕ | +| Custom taxonomies | ✔ | ✕ | ✔ | ✕ | | Search | ✔ | ✕ | ✕ | ✔ | | Data files | ✕ | ✔ | ✔ | ✕ | diff --git a/components/site/src/lib.rs b/components/site/src/lib.rs index 81437bbb..dd351ef7 100644 --- a/components/site/src/lib.rs +++ b/components/site/src/lib.rs @@ -302,6 +302,10 @@ impl Site { "get_taxonomy", global_fns::make_get_taxonomy(self.taxonomies.clone()), ); + self.tera.register_global_function( + "get_taxonomy_url", + global_fns::make_get_taxonomy_url(self.taxonomies.clone()), + ); } /// Add a page to the site diff --git a/components/templates/src/global_fns.rs b/components/templates/src/global_fns.rs index 23877af5..9ca217d8 100644 --- a/components/templates/src/global_fns.rs +++ b/components/templates/src/global_fns.rs @@ -139,6 +139,7 @@ pub fn make_get_taxonomy(all_taxonomies: Vec) -> GlobalFn { for taxonomy in all_taxonomies { taxonomies.insert(taxonomy.kind.name.clone(), taxonomy); } + Box::new(move |args| -> Result { let kind = required_arg!( String, @@ -156,6 +157,42 @@ pub fn make_get_taxonomy(all_taxonomies: Vec) -> GlobalFn { }) } +pub fn make_get_taxonomy_url(all_taxonomies: Vec) -> GlobalFn { + let mut taxonomies = HashMap::new(); + for taxonomy in all_taxonomies { + taxonomies.insert(taxonomy.kind.name.clone(), taxonomy); + } + + Box::new(move |args| -> Result { + let kind = required_arg!( + String, + args.get("kind"), + "`get_taxonomy_url` requires a `kind` argument with a string value" + ); + let name = required_arg!( + String, + args.get("name"), + "`get_taxonomy_url` requires a `name` argument with a string value" + ); + let container = match taxonomies.get(&kind) { + Some(c) => c, + None => return Err( + format!("`get_taxonomy_url` received an unknown taxonomy as kind: {}", kind).into() + ) + }; + + for item in &container.items { + if item.name == name { + return Ok(to_value(item.permalink.clone()).unwrap()); + } + } + + Err( + format!("`get_taxonomy_url`: couldn't find `{}` in `{}` taxonomy", name, kind).into() + ) + }) +} + pub fn make_resize_image(imageproc: Arc>) -> GlobalFn { static DEFAULT_OP: &'static str = "fill"; const DEFAULT_Q: u8 = 75; @@ -206,7 +243,7 @@ pub fn make_resize_image(imageproc: Arc>) -> GlobalF #[cfg(test)] mod tests { - use super::{make_get_url, make_get_taxonomy, make_trans}; + use super::{make_get_url, make_get_taxonomy, make_get_taxonomy_url, make_trans}; use std::collections::HashMap; @@ -260,7 +297,7 @@ mod tests { fn can_get_taxonomy() { let taxo_config = TaxonomyConfig { name: "tags".to_string(), ..TaxonomyConfig::default() }; let tag = TaxonomyItem::new( - "Prog amming", + "Progamming", "tags", &Config::default(), vec![], @@ -281,6 +318,33 @@ mod tests { assert!(static_fn(args).is_err()); } + #[test] + fn can_get_taxonomy_url() { + let taxo_config = TaxonomyConfig { name: "tags".to_string(), ..TaxonomyConfig::default() }; + let tag = TaxonomyItem::new( + "Programming", + "tags", + &Config::default(), + vec![], + ); + let tags = Taxonomy { + kind: taxo_config, + items: vec![tag], + }; + + let static_fn = make_get_taxonomy_url(vec![tags.clone()]); + // can find it correctly + let mut args = HashMap::new(); + args.insert("kind".to_string(), to_value("tags").unwrap()); + args.insert("name".to_string(), to_value("Programming").unwrap()); + assert_eq!(static_fn(args).unwrap(), "http://a-website.com/tags/prog-amming/"); + // and errors if it can't find it + let mut args = HashMap::new(); + args.insert("kind".to_string(), to_value("tags").unwrap()); + args.insert("name".to_string(), to_value("random").unwrap()); + assert!(static_fn(args).is_err()); + } + #[test] fn can_translate_a_string() { let trans_config = r#" diff --git a/docs/content/documentation/content/page.md b/docs/content/documentation/content/page.md index 08105242..7d61c27c 100644 --- a/docs/content/documentation/content/page.md +++ b/docs/content/documentation/content/page.md @@ -17,9 +17,9 @@ If the file is given any name *other* than `index.md` or `_index.md`, then it wi create a page with that name (without the `.md`). So naming a file in the root of your content directory `about.md` would also create a page at `[base_url]/about`. -As you can see, creating an `about.md` file is exactly equivalent to creating an +As you can see, creating an `about.md` file is exactly equivalent to creating an `about/index.md` file. The only difference between the two methods is that creating -the `about` folder allows you to use asset colocation, as discussed in the +the `about` folder allows you to use asset colocation, as discussed in the [Overview](./documentation/content/overview.md) section of this documentation. ## Front-matter @@ -42,7 +42,7 @@ description = "" # Do not wrap dates in quotes, the line below only indicates that there is no default date. # If the section variable `sort_by` is set to `date`, then any page that lacks a `date` # will not be rendered. -date = +date = # The weight as defined in the Section page # If the section variable `sort_by` is set to `weight`, then any page that lacks a `weight` @@ -62,24 +62,23 @@ slug = "" # It should not start with a `/` and the slash will be removed if it does path = "" -# An array of strings allowing you to group pages with them -tags = [] - -# An overarching category name for that page, allowing you to group pages with it -category = "" - -# Use aliases if you are moving content but want to redirect previous URLs to the +# Use aliases if you are moving content but want to redirect previous URLs to the # current one. This takes an array of path, not URLs. aliases = [] # Whether the page should be in the search index. This is only used if -# `build_search_index` is set to true in the config and the parent section +# `build_search_index` is set to true in the config and the parent section # hasn't set `in_search_index` to false in its front-matter in_search_index = true # Template to use to render this page template = "page.html" +# The taxonomies for that page. The keys need to be the same as the taxonomies +# name configured in `config.toml` and the values an array of String like +# tags = ["rust", "web"] +[taxonomies] + # Your own data [extra] +++ @@ -89,7 +88,7 @@ Some content ## Summary -You can ask Gutenberg to create a summary if you only want to show the first +You can ask Gutenberg to create a summary if you only want to show the first paragraph of each page in a list for example. To do so, add <!-- more --> in your content at the point @@ -97,6 +96,6 @@ where you want the summary to end and the content up to that point will be also available separately in the [template](./documentation/templates/pages-sections.md#page-variables). -An anchor link to this position named `continue-reading` is created so you can link +An anchor link to this position named `continue-reading` is created so you can link directly to it if needed for example: `Continue Reading` diff --git a/docs/content/documentation/content/taxonomies.md b/docs/content/documentation/content/taxonomies.md index d70878c5..7ddad6b3 100644 --- a/docs/content/documentation/content/taxonomies.md +++ b/docs/content/documentation/content/taxonomies.md @@ -16,7 +16,16 @@ For example the default would be page/1 - `rss`: if set to `true`, a RSS feed will be generated for each individual term. Once this is done, you can then set taxonomies in your content and Gutenberg will pick -them up. +them up: + +```toml ++++ +... +[taxonomies] +tags = ["rust", "web"] +categories = ["programming"] ++++ +``` The taxonomy pages will only be created if at least one non-draft page is found and are available at the following paths: diff --git a/docs/content/documentation/templates/overview.md b/docs/content/documentation/templates/overview.md index c2179df7..f12fc4c0 100644 --- a/docs/content/documentation/templates/overview.md +++ b/docs/content/documentation/templates/overview.md @@ -20,21 +20,21 @@ A few variables are available on all templates minus RSS and sitemap: - `current_url`: the full URL for that page ## Standard Templates -By default, Gutenberg will look for three templates: `index.html`, which is applied -to the site homepage; `section.html`, which is applied to all sections (any HTML -page generated by creating a directory within your `content` directory); and -`page.html`, which is applied to all pages (any HTML page generated by creating a +By default, Gutenberg will look for three templates: `index.html`, which is applied +to the site homepage; `section.html`, which is applied to all sections (any HTML +page generated by creating a directory within your `content` directory); and +`page.html`, which is applied to all pages (any HTML page generated by creating a `.md` file within your `content` directory). The homepage is always a section (regardless of whether it contains other pages). -Thus, the `index.html` and `section.html` templates both have access to the +Thus, the `index.html` and `section.html` templates both have access to the section variables. The `page.html` template has access to the page variables. The page and section variables are described in more detail in the next section of this documentation. ## Built-in Templates -Gutenberg comes with three built-in templates: `rss.xml`, `sitemap.xml`, and +Gutenberg comes with three built-in templates: `rss.xml`, `sitemap.xml`, and `robots.txt` (each described in their own section of this documentation). -Additionally, themes can add their own templates, which will be applied if not +Additionally, themes can add their own templates, which will be applied if not overridden. You can override built-in or theme templates by creating a template with same name in the correct path. For example, you can override the RSS template by creating a `templates/rss.xml` file. @@ -120,15 +120,22 @@ by passing `cachebust=true` to the `get_url` function. ### `get_taxonomy_url` -Gets the permalink for the tag or category given. +Gets the permalink for the taxonomy item found. ```jinja2 -{% set url = get_taxonomy_url(kind="category", name=page.category) %} +{% set url = get_taxonomy_url(kind="categories", name=page.taxonomies.category) %} ``` The `name` will almost come from a variable but in case you want to do it manually, the value should be the same as the one in the front-matter, not the slugified version. +### `get_taxonomy` +Gets the whole taxonomy of a specific kind. + +```jinja2 +{% set categories = get_taxonomy_url(kind="categories") %} +``` + ### `trans` Gets the translation of the given `key`, for the `default_language` or the `language given From b63e7963e51e9bf3d69fac82553456b9767957a1 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Tue, 31 Jul 2018 16:48:52 +0200 Subject: [PATCH 67/74] Expand comparison --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 9a4c6cd1..064ae82f 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ in the `docs/content` folder of the repository. | Themes | ✔ | ✕ | ✔ | ✔ | | Shortcodes | ✔ | ✕ | ✔ | ✔ | | Internal links | ✔ | ✕ | ✔ | ✔ | +| Link checker | ✔ | ✕ | ✕ | ✔ | | Table of contents | ✔ | ✕ | ✔ | ✔ | | Automatic header anchors | ✔ | ✕ | ✔ | ✔ | | Aliases | ✔ | ✕ | ✔ | ✔ | @@ -29,6 +30,8 @@ in the `docs/content` folder of the repository. | Custom taxonomies | ✔ | ✕ | ✔ | ✕ | | Search | ✔ | ✕ | ✕ | ✔ | | Data files | ✕ | ✔ | ✔ | ✕ | +| LiveReload | ✔ | ✕ | ✔ | ✔ | +| Netlify support | ✔ | ✕ | ✔ | ✔ | Supported content formats: From c03425260d4d6cb01208eb2fd3f6e31362ade845 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Tue, 31 Jul 2018 17:09:49 +0200 Subject: [PATCH 68/74] Pelican doesn't have netlify support, there is only python/pipenv --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 064ae82f..50660bdd 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ in the `docs/content` folder of the repository. | Search | ✔ | ✕ | ✕ | ✔ | | Data files | ✕ | ✔ | ✔ | ✕ | | LiveReload | ✔ | ✕ | ✔ | ✔ | -| Netlify support | ✔ | ✕ | ✔ | ✔ | +| Netlify support | ✔ | ✕ | ✔ | ✕ | Supported content formats: From 6707078479adf4d15b56b3db7a18fd4bcdb69b41 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Tue, 31 Jul 2018 17:10:46 +0200 Subject: [PATCH 69/74] Clarify pelican and netlify --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 50660bdd..f0637ed9 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,8 @@ Supported content formats: - Pelican: reStructuredText, markdown, asciidoc, org-mode, whatever-you-want Note that many features of Pelican are coming from plugins, which might be tricky -to use because of version mismatch or lacking documentation. +to use because of version mismatch or lacking documentation. Netlify supports Python +and Pipenv but you still need to install your dependencies manually. ## Contributing As the documentation site is automatically built on commits to master, all development From 8e3e3a52f1407d7990fee099cb586f705e0f984c Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Wed, 1 Aug 2018 10:33:20 +0200 Subject: [PATCH 70/74] Updated deps --- Cargo.lock | 96 +++++++++++++++--------------------------------------- 1 file changed, 27 insertions(+), 69 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index da8c46c5..0eff3ea8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -42,7 +42,7 @@ dependencies = [ "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", "htmlescape 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -317,7 +317,7 @@ dependencies = [ "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -594,7 +594,7 @@ version = "0.1.0" dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -629,7 +629,7 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", @@ -664,7 +664,7 @@ dependencies = [ "regex 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", - "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -790,7 +790,7 @@ dependencies = [ [[package]] name = "h2" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -880,7 +880,6 @@ dependencies = [ "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "want 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -888,7 +887,7 @@ dependencies = [ [[package]] name = "hyper-tls" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", @@ -936,7 +935,7 @@ dependencies = [ "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -1050,7 +1049,7 @@ name = "link_checker" version = "0.1.0" dependencies = [ "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "reqwest 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)", + "reqwest 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1426,7 +1425,7 @@ dependencies = [ "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "taxonomies 0.1.0", - "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -1598,16 +1597,6 @@ dependencies = [ "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "rand" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "rand" version = "0.4.2" @@ -1740,20 +1729,20 @@ dependencies = [ "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "syntect 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "templates 0.1.0", - "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] [[package]] name = "reqwest" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "encoding_rs 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper-tls 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper-tls 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "libflate 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1944,7 +1933,7 @@ dependencies = [ "taxonomies 0.1.0", "tempfile 3.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "templates 0.1.0", - "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -1971,11 +1960,6 @@ dependencies = [ "unidecode 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "smallvec" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "smallvec" version = "0.6.3" @@ -2110,7 +2094,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bincode 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "flate2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "flate2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "onig 3.2.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2123,11 +2107,6 @@ dependencies = [ "yaml-rust 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "take" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "taxonomies" version = "0.1.0" @@ -2139,7 +2118,7 @@ dependencies = [ "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -2176,7 +2155,7 @@ dependencies = [ "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "taxonomies 0.1.0", - "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -2187,12 +2166,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "utf-8 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "utf-8 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tera" -version = "0.11.9" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2336,23 +2315,6 @@ dependencies = [ "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "tokio-proto" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", - "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "take 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-core 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "tokio-reactor" version = "0.1.2" @@ -2583,7 +2545,7 @@ dependencies = [ [[package]] name = "utf-8" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2597,7 +2559,7 @@ version = "0.1.0" dependencies = [ "errors 0.1.0", "tempfile 3.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2804,7 +2766,7 @@ dependencies = [ "checksum failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934799b6c1de475a012a02dab0ace1ace43789ee4b99bcfbf1a2e3e8ced5de82" "checksum failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c7cdda555bb90c9bb67a3b670a0f42de8e73f5981524123ad8578aafec8ddb8b" "checksum filetime 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "714653f3e34871534de23771ac7b26e999651a0a228f47beb324dfdf1dd4b10f" -"checksum flate2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9fac2277e84e5e858483756647a9d0aa8d9a2b7cba517fd84325a0aaa69a0909" +"checksum flate2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "37847f133aae7acf82bb9577ccd8bda241df836787642654286e79679826a54b" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" "checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" @@ -2821,7 +2783,7 @@ dependencies = [ "checksum gif 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff3414b424657317e708489d2857d9575f4403698428b040b609b9d1c1a84a2c" "checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb" "checksum globset 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8e49edbcc9c7fc5beb8c0a54e7319ff8bed353a2b55e85811c6281188c2a6c84" -"checksum h2 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "6229ac66d3392dd83288fe04defd4b353354b15bbe07820d53dda063a736afcc" +"checksum h2 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "35754349586639c6ff629abd19a605e5a42599b0da4aff7be67d63e48ef1ba4e" "checksum hostname 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "21ceb46a83a85e824ef93669c8b390009623863b5c195d1ba747292c0c72f94e" "checksum html5ever 0.22.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b04478cf718862650a0bf66acaf8f2f8c906fbc703f35c916c1f4211b069a364" "checksum htmlescape 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e9025058dae765dee5070ec375f591e2ba14638c63feff74f13805a72e523163" @@ -2829,7 +2791,7 @@ dependencies = [ "checksum httparse 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7b6288d7db100340ca12873fd4d08ad1b8f206a9457798dfb17c018a33fee540" "checksum humansize 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b6cab2627acfc432780848602f3f558f7e9dd427352224b0d9324025796d2a5e" "checksum hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)" = "34a590ca09d341e94cddf8e5af0bbccde205d5fbc2fa3c09dd67c7f85cea59d7" -"checksum hyper-tls 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a5aa51f6ae9842239b0fac14af5f22123b8432b4cc774a44ff059fcba0f675ca" +"checksum hyper-tls 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ffb1bd5e518d3065840ab315dbbf44e4420e5f7d80e2cb93fa6ffffc50522378" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebdff791af04e30089bde8ad2a632b86af433b40c04db8d70ad4b21487db7a6a" "checksum indexmap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08173ba1e906efb6538785a8844dd496f5d34f0a2d88038e95195172fc667220" @@ -2907,7 +2869,6 @@ dependencies = [ "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" "checksum quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9949cfe66888ffe1d53e6ec9d9f3b70714083854be20fd5e271b232a017401e8" "checksum quote 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b71f9f575d55555aa9c06188be9d4e2bfc83ed02537948ac0d520c24d0419f1a" -"checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" "checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" "checksum rand 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "12397506224b2f93e6664ffc4f664b29be8208e5157d3d90b44f09b5fae470ea" "checksum rand_core 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edecf0f94da5551fc9b492093e30b041a891657db7940ee221f9d2f66e82eef2" @@ -2920,7 +2881,7 @@ dependencies = [ "checksum regex-syntax 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "747ba3b235651f6e2f67dfa8bcdcd073ddb7c243cb21c442fc12395dfcac212d" "checksum relay 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1576e382688d7e9deecea24417e350d3062d97e32e45d70b1cde65994ff1489a" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" -"checksum reqwest 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2abe46f8e00792693a2488e296c593d1f4ea39bb1178cfce081d6793657575e4" +"checksum reqwest 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)" = "e7e237e32c3bfa55c95e29af872c8f481471d70b8a5ec15d85f4d274ffd92dd9" "checksum resolv-conf 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c62bd95a41841efdf7fca2ae9951e64a8d8eae7e5da196d8ce489a2241491a92" "checksum rust-stemmers 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fbf06149ec391025664a5634200ced1afb489f0f3f8a140d515ebc0eb04b4bc0" "checksum rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "bcfe5b13211b4d78e5c2cadfebd7769197d95c639c35a50057eb4c05de811395" @@ -2944,7 +2905,6 @@ dependencies = [ "checksum slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b4fcaed89ab08ef143da37bc52adbcc04d4a69014f4c1208d6b51f0c47bc23" "checksum slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fdeff4cd9ecff59ec7e3744cbca73dfe5ac35c2aedb2cfba8a1c715a18912e9d" "checksum slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "797bcb4d24e91239a8615415814f4afb2d8ca400c472de3c73f803a5a7689e11" -"checksum smallvec 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4c8cbcd6df1e117c2210e13ab5109635ad68a929fcbb8964dc965b76cb5ee013" "checksum smallvec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "26df3bb03ca5eac2e64192b723d51f56c1b1e0860e7c766281f4598f181acdc8" "checksum socket2 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "962a516af4d3a7c272cb3a1d50a8cc4e5b41802e4ad54cfb7bee8ba61d37d703" "checksum stable_deref_trait 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ffbc596e092fe5f598b12ef46cc03754085ac2f4d8c739ad61c4ae266cc3b3fa" @@ -2961,11 +2921,10 @@ dependencies = [ "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" "checksum synstructure 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a761d12e6d8dcb4dcf952a7a89b475e3a9d69e4a69307e01a470977642914bd" "checksum syntect 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc8a6f0db88d4afc340522c20d260411e746b2225b257c6b238a75de9d7cec78" -"checksum take 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b157868d8ac1f56b64604539990685fa7611d8fa9e5476cf0c02cf34d32917c5" "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" "checksum tempfile 3.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c4b103c6d08d323b92ff42c8ce62abcd83ca8efa7fd5bf7927efefec75f58c76" "checksum tendril 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9de21546595a0873061940d994bbbc5c35f024ae4fd61ec5c5b159115684f508" -"checksum tera 0.11.9 (registry+https://github.com/rust-lang/crates.io-index)" = "09a18c54f3d7bdd496703db5ce232d7b7425fb69208bfbda1006127e273673c4" +"checksum tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d1db32ab74e475599904b6b30633bb3b46bb85a322ae86873d9f707a02d5fa44" "checksum term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1" "checksum term-painter 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "dcaa948f0e3e38470cd8dc8dcfe561a75c9e43f28075bb183845be2b9b3c08cf" "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" @@ -2978,7 +2937,6 @@ dependencies = [ "checksum tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8cac2a7883ff3567e9d66bb09100d09b33d90311feca0206c7ca034bc0c55113" "checksum tokio-fs 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "40697ecbea5660df15b15d50a077386477d2f6a35002adf01ce76ff9dd9dce48" "checksum tokio-io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a5c9635ee806f26d302b8baa1e145689a280d8f5aa8d0552e7344808da54cc21" -"checksum tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fbb47ae81353c63c487030659494b295f6cb6576242f907f203473b191b0389" "checksum tokio-reactor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e00ec63bbec2c97ce1178cb0587b2c438b2f6b09d3ee54a33c45a9cf0d530810" "checksum tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24da22d077e0f15f55162bdbdc661228c1581892f52074fb242678d015b45162" "checksum tokio-signal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "342d088c63623f63eada591e065778038c63b516939530db2aa09a8df9118507" @@ -3003,7 +2961,7 @@ dependencies = [ "checksum unidecode 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "402bb19d8e03f1d1a7450e2bd613980869438e0666331be3e073089124aa1adc" "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" "checksum url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2a321979c09843d272956e73700d12c4e7d3d92b2ee112b31548aef0d4efc5a6" -"checksum utf-8 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f1262dfab4c30d5cb7c07026be00ee343a6cf5027fdc0104a9160f354e5db75c" +"checksum utf-8 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bab35f71693630bb1953dce0f2bcd780e7cde025027124a202ac08a45ba25141" "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" "checksum uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e1436e58182935dcd9ce0add9ea0b558e8a87befe01c1a301e6020aeb0876363" "checksum vcpkg 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cbe533e138811704c0e3cbde65a818b35d3240409b4346256c5ede403e082474" From 648b7006678430aa6196e61fb3c92c09df18e683 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Wed, 1 Aug 2018 18:22:12 +0200 Subject: [PATCH 71/74] One more cargo update --- Cargo.lock | 98 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 76 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0eff3ea8..10a2f180 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -317,7 +317,7 @@ dependencies = [ "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -594,7 +594,7 @@ version = "0.1.0" dependencies = [ "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", - "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -604,17 +604,18 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "failure_derive" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)", + "synstructure 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -664,7 +665,7 @@ dependencies = [ "regex 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", - "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -935,7 +936,7 @@ dependencies = [ "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -1425,7 +1426,7 @@ dependencies = [ "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "taxonomies 0.1.0", - "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -1729,7 +1730,7 @@ dependencies = [ "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "syntect 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "templates 0.1.0", - "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -1933,7 +1934,7 @@ dependencies = [ "taxonomies 0.1.0", "tempfile 3.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "templates 0.1.0", - "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -2080,11 +2081,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.6.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2118,7 +2121,7 @@ dependencies = [ "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -2155,7 +2158,7 @@ dependencies = [ "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "pulldown-cmark 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "taxonomies 0.1.0", - "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", ] @@ -2171,7 +2174,7 @@ dependencies = [ [[package]] name = "tera" -version = "0.11.10" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "chrono 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2185,6 +2188,7 @@ dependencies = [ "serde 1.0.70 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)", "slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "unic-segment 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2470,6 +2474,50 @@ name = "ucd-util" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "unic-char-property" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unic-char-range 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unic-char-range" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "unic-common" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "unic-segment" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unic-ucd-segment 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unic-ucd-segment" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unic-char-property 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unic-char-range 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unic-ucd-version 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unic-ucd-version" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unic-common 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "unicase" version = "1.4.2" @@ -2559,7 +2607,7 @@ version = "0.1.0" dependencies = [ "errors 0.1.0", "tempfile 3.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tera 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2764,7 +2812,7 @@ dependencies = [ "checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" "checksum error-chain 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6930e04918388a9a2e41d518c25cf679ccafe26733fb4127dbf21993f2575d46" "checksum failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934799b6c1de475a012a02dab0ace1ace43789ee4b99bcfbf1a2e3e8ced5de82" -"checksum failure_derive 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c7cdda555bb90c9bb67a3b670a0f42de8e73f5981524123ad8578aafec8ddb8b" +"checksum failure_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "946d0e98a50d9831f5d589038d2ca7f8f455b1c21028c0db0e84116a12696426" "checksum filetime 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "714653f3e34871534de23771ac7b26e999651a0a228f47beb324dfdf1dd4b10f" "checksum flate2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "37847f133aae7acf82bb9577ccd8bda241df836787642654286e79679826a54b" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" @@ -2919,12 +2967,12 @@ dependencies = [ "checksum syn 0.13.11 (registry+https://github.com/rust-lang/crates.io-index)" = "14f9bf6292f3a61d2c716723fdb789a41bbe104168e6f496dc6497e531ea1b9b" "checksum syn 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4bad7abdf6633f07c7046b90484f1d9dc055eca39f8c991177b1046ce61dba9a" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" -"checksum synstructure 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3a761d12e6d8dcb4dcf952a7a89b475e3a9d69e4a69307e01a470977642914bd" +"checksum synstructure 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "85bb9b7550d063ea184027c9b8c20ac167cd36d3e06b3a40bceb9d746dc1a7b7" "checksum syntect 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc8a6f0db88d4afc340522c20d260411e746b2225b257c6b238a75de9d7cec78" "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" "checksum tempfile 3.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c4b103c6d08d323b92ff42c8ce62abcd83ca8efa7fd5bf7927efefec75f58c76" "checksum tendril 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9de21546595a0873061940d994bbbc5c35f024ae4fd61ec5c5b159115684f508" -"checksum tera 0.11.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d1db32ab74e475599904b6b30633bb3b46bb85a322ae86873d9f707a02d5fa44" +"checksum tera 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "7917c3acffc0ad65c40ef4c357277354051c45ed17303ceb874bc58e03c9fce1" "checksum term 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1" "checksum term-painter 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "dcaa948f0e3e38470cd8dc8dcfe561a75c9e43f28075bb183845be2b9b3c08cf" "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" @@ -2950,6 +2998,12 @@ dependencies = [ "checksum trust-dns-resolver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "28b094ad60c4f51f36a493201d04d6605183c62bd5f0c73008a732f23950c156" "checksum try-lock 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee2aa4715743892880f70885373966c83d73ef1b0838a664ef0c76fffd35e7c2" "checksum ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd2be2d6639d0f8fe6cdda291ad456e23629558d466e2789d2c3e9892bda285d" +"checksum unic-char-property 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce36d3f7ce754afdbccccf8ff0dd0134e50fb44aaae579f96218856e9e5dbd1e" +"checksum unic-char-range 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9ab85fab42ad1b26cafc03bf891f69cb4d6e15f491030e89a0122197baa8ae8" +"checksum unic-common 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff8d4a7ade929ef7d971e16ced21a8cd56a63869aa6032dfb8cb083cf7d077bf" +"checksum unic-segment 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c9ca47cbb09fb5fcd066b5867d11dc528302fa465277882797d6a836e1ee6f9e" +"checksum unic-ucd-segment 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "48f1a08ce0409a9e391b88d1930118eec48af12742fc538bcec55f775865776e" +"checksum unic-ucd-version 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1f5e6c6c53c2d0ece4a5964bc55fcff8602153063cb4fab20958ff32998ff6" "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" "checksum unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284b6d3db520d67fbe88fd778c21510d1b0ba4a551e5d0fbb023d33405f6de8a" "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" From f2d1e25c3d3fce7204fbb78be7d6a3fab52633cd Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Thu, 2 Aug 2018 17:44:08 +0200 Subject: [PATCH 72/74] cargo update --- Cargo.lock | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 10a2f180..d8cadc11 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7,7 +7,7 @@ dependencies = [ "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-channel 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)", @@ -28,7 +28,7 @@ dependencies = [ [[package]] name = "actix-web" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "actix 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -39,7 +39,7 @@ dependencies = [ "cookie 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "h2 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", @@ -82,7 +82,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -600,7 +600,7 @@ dependencies = [ [[package]] name = "failure" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -614,7 +614,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -772,7 +772,7 @@ dependencies = [ name = "gutenberg" version = "0.4.0" dependencies = [ - "actix-web 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "actix-web 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "chrono 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "content 0.1.0", @@ -1321,7 +1321,7 @@ dependencies = [ "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1412,7 +1412,7 @@ name = "owning_ref" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "stable_deref_trait 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1880,7 +1880,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1982,7 +1982,7 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2038,7 +2038,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2063,7 +2063,7 @@ dependencies = [ [[package]] name = "syn" -version = "0.14.5" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2086,7 +2086,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2753,7 +2753,7 @@ dependencies = [ [metadata] "checksum actix 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0470f5163ac229ed0329f6abbd6f775591b06ec5ecbf2f2589c16ab8bd6f76b8" -"checksum actix-web 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2b79aac53ea4922b114768413037f2d75d4ab039646bbf700ce152bb2678b6eb" +"checksum actix-web 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "79d66c9405feacf1ee8fc3cff25725270724be376e433fbd17c099c93156395f" "checksum actix_derive 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5b9d1525ef45e5e021f0b93dace157dcab5d792acb4cc78f3213787d65e2bb92" "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aho-corasick 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c6d463cbe7ed28720b5b489e7c083eeb8f90d08be2a0d6bb9e1ffea9ce1afa" @@ -2811,7 +2811,7 @@ dependencies = [ "checksum error-chain 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "faa976b4fd2e4c2b2f3f486874b19e61944d3de3de8b61c9fcf835d583871bcc" "checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" "checksum error-chain 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6930e04918388a9a2e41d518c25cf679ccafe26733fb4127dbf21993f2575d46" -"checksum failure 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "934799b6c1de475a012a02dab0ace1ace43789ee4b99bcfbf1a2e3e8ced5de82" +"checksum failure 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7efb22686e4a466b1ec1a15c2898f91fa9cb340452496dca654032de20ff95b9" "checksum failure_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "946d0e98a50d9831f5d589038d2ca7f8f455b1c21028c0db0e84116a12696426" "checksum filetime 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "714653f3e34871534de23771ac7b26e999651a0a228f47beb324dfdf1dd4b10f" "checksum flate2 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "37847f133aae7acf82bb9577ccd8bda241df836787642654286e79679826a54b" @@ -2955,7 +2955,7 @@ dependencies = [ "checksum slug 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "797bcb4d24e91239a8615415814f4afb2d8ca400c472de3c73f803a5a7689e11" "checksum smallvec 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "26df3bb03ca5eac2e64192b723d51f56c1b1e0860e7c766281f4598f181acdc8" "checksum socket2 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "962a516af4d3a7c272cb3a1d50a8cc4e5b41802e4ad54cfb7bee8ba61d37d703" -"checksum stable_deref_trait 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ffbc596e092fe5f598b12ef46cc03754085ac2f4d8c739ad61c4ae266cc3b3fa" +"checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum string 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00caf261d6f90f588f8450b8e1230fa0d5be49ee6140fdfbcb55335aff350970" "checksum string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25d70109977172b127fe834e5449e5ab1740b9ba49fa18a2020f509174f25423" "checksum string_cache_codegen 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "35293b05cf1494e8ddd042a7df6756bf18d07f42d234f32e71dce8a7aabb0191" @@ -2965,7 +2965,7 @@ dependencies = [ "checksum strum_macros 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1292d85e688e4696ecb69b2db2648994fb8af266974e89be53cefdf003861a5d" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" "checksum syn 0.13.11 (registry+https://github.com/rust-lang/crates.io-index)" = "14f9bf6292f3a61d2c716723fdb789a41bbe104168e6f496dc6497e531ea1b9b" -"checksum syn 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4bad7abdf6633f07c7046b90484f1d9dc055eca39f8c991177b1046ce61dba9a" +"checksum syn 0.14.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4e4b5274d4a0a3d2749d5c158dc64d3403e60554dc61194648787ada5212473d" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" "checksum synstructure 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "85bb9b7550d063ea184027c9b8c20ac167cd36d3e06b3a40bceb9d746dc1a7b7" "checksum syntect 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dc8a6f0db88d4afc340522c20d260411e746b2225b257c6b238a75de9d7cec78" From bd6578e71c08a813bcfcfccbee6d902f5162c852 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Fri, 3 Aug 2018 18:32:30 +0200 Subject: [PATCH 73/74] Fix failing test --- components/templates/src/global_fns.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/templates/src/global_fns.rs b/components/templates/src/global_fns.rs index 9ca217d8..52aa362f 100644 --- a/components/templates/src/global_fns.rs +++ b/components/templates/src/global_fns.rs @@ -337,7 +337,7 @@ mod tests { let mut args = HashMap::new(); args.insert("kind".to_string(), to_value("tags").unwrap()); args.insert("name".to_string(), to_value("Programming").unwrap()); - assert_eq!(static_fn(args).unwrap(), "http://a-website.com/tags/prog-amming/"); + assert_eq!(static_fn(args).unwrap(), to_value("http://a-website.com/tags/programming/").unwrap()); // and errors if it can't find it let mut args = HashMap::new(); args.insert("kind".to_string(), to_value("tags").unwrap()); From 84a3193e9764f49b17b035ba54a1f478cccb5f34 Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Fri, 3 Aug 2018 19:47:39 +0200 Subject: [PATCH 74/74] Last fixes --- CHANGELOG.md | 1 + components/rendering/src/markdown.rs | 1 - docs/config.toml | 1 + .../example-00.jpg | Bin .../example-01.jpg | Bin .../example-02.jpg | Bin .../example-03.jpg | Bin .../gutenberg.jpg | Bin .../{image-resizing => image-processing}/index.md | 12 ++++++------ .../documentation/getting-started/configuration.md | 3 ++- docs/content/documentation/templates/overview.md | 2 +- ...8c11b70e6d31a8400.jpg => 0478482c742970ac00.jpg} | Bin ...e0991f475d665df00.jpg => 2b6a3e5a28bab1f100.jpg} | Bin ...2758a649ef513b600.jpg => 3dba59a146f3bc0900.jpg} | Bin ...92676f9505fb47700.jpg => 5e399fa94c88057a00.jpg} | Bin ...df81a7c614e5cc000.jpg => 63d5c27341a9885c00.jpg} | Bin ...12c7fc72d2815e700.jpg => 63fe884d13fd318d00.jpg} | Bin ...320cb783d4be30e00.jpg => 8b446e542d0b692d00.jpg} | Bin ...9c08ee3f954d0c100.jpg => ab39b603591b3e3300.jpg} | Bin ...8e4b442f0b0cbf700.jpg => d91d0751df06edce00.jpg} | Bin ...2d0be8c5e35e50f00.jpg => e690cdfaf053bbd700.jpg} | Bin 21 files changed, 11 insertions(+), 9 deletions(-) rename docs/content/documentation/content/{image-resizing => image-processing}/example-00.jpg (100%) rename docs/content/documentation/content/{image-resizing => image-processing}/example-01.jpg (100%) rename docs/content/documentation/content/{image-resizing => image-processing}/example-02.jpg (100%) rename docs/content/documentation/content/{image-resizing => image-processing}/example-03.jpg (100%) rename docs/content/documentation/content/{image-resizing => image-processing}/gutenberg.jpg (100%) rename docs/content/documentation/content/{image-resizing => image-processing}/index.md (88%) rename docs/static/_processed_images/{28c11b70e6d31a8400.jpg => 0478482c742970ac00.jpg} (100%) rename docs/static/_processed_images/{6e0991f475d665df00.jpg => 2b6a3e5a28bab1f100.jpg} (100%) rename docs/static/_processed_images/{42758a649ef513b600.jpg => 3dba59a146f3bc0900.jpg} (100%) rename docs/static/_processed_images/{792676f9505fb47700.jpg => 5e399fa94c88057a00.jpg} (100%) rename docs/static/_processed_images/{4df81a7c614e5cc000.jpg => 63d5c27341a9885c00.jpg} (100%) rename docs/static/_processed_images/{b12c7fc72d2815e700.jpg => 63fe884d13fd318d00.jpg} (100%) rename docs/static/_processed_images/{6320cb783d4be30e00.jpg => 8b446e542d0b692d00.jpg} (100%) rename docs/static/_processed_images/{09c08ee3f954d0c100.jpg => ab39b603591b3e3300.jpg} (100%) rename docs/static/_processed_images/{78e4b442f0b0cbf700.jpg => d91d0751df06edce00.jpg} (100%) rename docs/static/_processed_images/{72d0be8c5e35e50f00.jpg => e690cdfaf053bbd700.jpg} (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 822d6cef..8f304847 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Taxonomies have been rewritten from scratch to allow custom ones with RSS and pagination - `order` sorting has been removed in favour of only having `weight` +- `page.next/page.previous` have been renamed to `page.later/page.earlier` and `page.heavier/page.lighter` depending on the sort method ### Others - Fix `serve` not working with the config flag diff --git a/components/rendering/src/markdown.rs b/components/rendering/src/markdown.rs index 3fe905de..60ea6725 100644 --- a/components/rendering/src/markdown.rs +++ b/components/rendering/src/markdown.rs @@ -140,7 +140,6 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<(Strin format!("{}{}", context.current_page_permalink, link) } else { if context.config.check_external_links && !link.starts_with('#') { - println!("Checking Link {}", link); let res = check_url(&link); if res.is_valid() { link.to_string() diff --git a/docs/config.toml b/docs/config.toml index ce69764a..6cd65561 100644 --- a/docs/config.toml +++ b/docs/config.toml @@ -7,6 +7,7 @@ highlight_code = true insert_anchor_links = true highlight_theme = "kronuz" build_search_index = true +# check_external_links = true [extra] author = "Vincent Prouillet" diff --git a/docs/content/documentation/content/image-resizing/example-00.jpg b/docs/content/documentation/content/image-processing/example-00.jpg similarity index 100% rename from docs/content/documentation/content/image-resizing/example-00.jpg rename to docs/content/documentation/content/image-processing/example-00.jpg diff --git a/docs/content/documentation/content/image-resizing/example-01.jpg b/docs/content/documentation/content/image-processing/example-01.jpg similarity index 100% rename from docs/content/documentation/content/image-resizing/example-01.jpg rename to docs/content/documentation/content/image-processing/example-01.jpg diff --git a/docs/content/documentation/content/image-resizing/example-02.jpg b/docs/content/documentation/content/image-processing/example-02.jpg similarity index 100% rename from docs/content/documentation/content/image-resizing/example-02.jpg rename to docs/content/documentation/content/image-processing/example-02.jpg diff --git a/docs/content/documentation/content/image-resizing/example-03.jpg b/docs/content/documentation/content/image-processing/example-03.jpg similarity index 100% rename from docs/content/documentation/content/image-resizing/example-03.jpg rename to docs/content/documentation/content/image-processing/example-03.jpg diff --git a/docs/content/documentation/content/image-resizing/gutenberg.jpg b/docs/content/documentation/content/image-processing/gutenberg.jpg similarity index 100% rename from docs/content/documentation/content/image-resizing/gutenberg.jpg rename to docs/content/documentation/content/image-processing/gutenberg.jpg diff --git a/docs/content/documentation/content/image-resizing/index.md b/docs/content/documentation/content/image-processing/index.md similarity index 88% rename from docs/content/documentation/content/image-resizing/index.md rename to docs/content/documentation/content/image-processing/index.md index 129cdd19..a5a37f57 100644 --- a/docs/content/documentation/content/image-resizing/index.md +++ b/docs/content/documentation/content/image-processing/index.md @@ -1,5 +1,5 @@ +++ -title = "Image Resizing" +title = "Image processing" weight = 120 +++ @@ -47,7 +47,7 @@ The source for all examples is this 300 × 380 pixels image: `resize_image(..., width=150, height=150, op="scale")` - {{ resize_image(path="documentation/content/image-resizing/gutenberg.jpg", width=150, height=150, op="scale") }} + {{ resize_image(path="documentation/content/image-processing/gutenberg.jpg", width=150, height=150, op="scale") }} ### **`"fit_width"`** Resizes the image such that the resulting width is `width` and height is whatever will preserve the aspect ratio. @@ -55,7 +55,7 @@ The source for all examples is this 300 × 380 pixels image: `resize_image(..., width=100, op="fit_width")` - {{ resize_image(path="documentation/content/image-resizing/gutenberg.jpg", width=100, height=0, op="fit_width") }} + {{ resize_image(path="documentation/content/image-processing/gutenberg.jpg", width=100, height=0, op="fit_width") }} ### **`"fit_height"`** Resizes the image such that the resulting height is `height` and width is whatever will preserve the aspect ratio. @@ -63,7 +63,7 @@ The source for all examples is this 300 × 380 pixels image: `resize_image(..., height=150, op="fit_height")` - {{ resize_image(path="documentation/content/image-resizing/gutenberg.jpg", width=0, height=150, op="fit_height") }} + {{ resize_image(path="documentation/content/image-processing/gutenberg.jpg", width=0, height=150, op="fit_height") }} ### **`"fit"`** Like `"fit_width"` and `"fit_height"` combined. @@ -72,7 +72,7 @@ The source for all examples is this 300 × 380 pixels image: `resize_image(..., width=150, height=150, op="fit")` - {{ resize_image(path="documentation/content/image-resizing/gutenberg.jpg", width=150, height=150, op="fit") }} + {{ resize_image(path="documentation/content/image-processing/gutenberg.jpg", width=150, height=150, op="fit") }} ### **`"fill"`** This is the default operation. It takes the image's center part with the same aspect ratio as the `width` & `height` given and resizes that @@ -80,7 +80,7 @@ The source for all examples is this 300 × 380 pixels image: `resize_image(..., width=150, height=150, op="fill")` - {{ resize_image(path="documentation/content/image-resizing/gutenberg.jpg", width=150, height=150, op="fill") }} + {{ resize_image(path="documentation/content/image-processing/gutenberg.jpg", width=150, height=150, op="fill") }} ## Using `resize_image` in markdown via shortcodes diff --git a/docs/content/documentation/getting-started/configuration.md b/docs/content/documentation/getting-started/configuration.md index 7a0ce6bb..f8eecb32 100644 --- a/docs/content/documentation/getting-started/configuration.md +++ b/docs/content/documentation/getting-started/configuration.md @@ -44,7 +44,8 @@ rss_limit = 20 # Example: # taxonomies = [ # {name: "tags", rss: true}, # each tag will have its own RSS feed -# {name: "categories", paginate_by: 5}, # 5 terms per page +# {name: "categories", paginate_by: 5}, # 5 items per page for a term +# {name: "authors"}, # Basic definition: no RSS or pagination # ] # taxonomies = [] diff --git a/docs/content/documentation/templates/overview.md b/docs/content/documentation/templates/overview.md index f12fc4c0..a9ab635b 100644 --- a/docs/content/documentation/templates/overview.md +++ b/docs/content/documentation/templates/overview.md @@ -146,4 +146,4 @@ Gets the translation of the given `key`, for the `default_language` or the `lang ### `resize_image` Resizes an image file. -Pease refer to [_Content / Image Resizing_](./documentation/content/image-resizing/index.md) for complete documentation. +Pease refer to [_Content / Image Processing_](./documentation/content/image-processing/index.md) for complete documentation. diff --git a/docs/static/_processed_images/28c11b70e6d31a8400.jpg b/docs/static/_processed_images/0478482c742970ac00.jpg similarity index 100% rename from docs/static/_processed_images/28c11b70e6d31a8400.jpg rename to docs/static/_processed_images/0478482c742970ac00.jpg diff --git a/docs/static/_processed_images/6e0991f475d665df00.jpg b/docs/static/_processed_images/2b6a3e5a28bab1f100.jpg similarity index 100% rename from docs/static/_processed_images/6e0991f475d665df00.jpg rename to docs/static/_processed_images/2b6a3e5a28bab1f100.jpg diff --git a/docs/static/_processed_images/42758a649ef513b600.jpg b/docs/static/_processed_images/3dba59a146f3bc0900.jpg similarity index 100% rename from docs/static/_processed_images/42758a649ef513b600.jpg rename to docs/static/_processed_images/3dba59a146f3bc0900.jpg diff --git a/docs/static/_processed_images/792676f9505fb47700.jpg b/docs/static/_processed_images/5e399fa94c88057a00.jpg similarity index 100% rename from docs/static/_processed_images/792676f9505fb47700.jpg rename to docs/static/_processed_images/5e399fa94c88057a00.jpg diff --git a/docs/static/_processed_images/4df81a7c614e5cc000.jpg b/docs/static/_processed_images/63d5c27341a9885c00.jpg similarity index 100% rename from docs/static/_processed_images/4df81a7c614e5cc000.jpg rename to docs/static/_processed_images/63d5c27341a9885c00.jpg diff --git a/docs/static/_processed_images/b12c7fc72d2815e700.jpg b/docs/static/_processed_images/63fe884d13fd318d00.jpg similarity index 100% rename from docs/static/_processed_images/b12c7fc72d2815e700.jpg rename to docs/static/_processed_images/63fe884d13fd318d00.jpg diff --git a/docs/static/_processed_images/6320cb783d4be30e00.jpg b/docs/static/_processed_images/8b446e542d0b692d00.jpg similarity index 100% rename from docs/static/_processed_images/6320cb783d4be30e00.jpg rename to docs/static/_processed_images/8b446e542d0b692d00.jpg diff --git a/docs/static/_processed_images/09c08ee3f954d0c100.jpg b/docs/static/_processed_images/ab39b603591b3e3300.jpg similarity index 100% rename from docs/static/_processed_images/09c08ee3f954d0c100.jpg rename to docs/static/_processed_images/ab39b603591b3e3300.jpg diff --git a/docs/static/_processed_images/78e4b442f0b0cbf700.jpg b/docs/static/_processed_images/d91d0751df06edce00.jpg similarity index 100% rename from docs/static/_processed_images/78e4b442f0b0cbf700.jpg rename to docs/static/_processed_images/d91d0751df06edce00.jpg diff --git a/docs/static/_processed_images/72d0be8c5e35e50f00.jpg b/docs/static/_processed_images/e690cdfaf053bbd700.jpg similarity index 100% rename from docs/static/_processed_images/72d0be8c5e35e50f00.jpg rename to docs/static/_processed_images/e690cdfaf053bbd700.jpg