Rebasing + tweaks
This commit is contained in:
parent
17de3c9a97
commit
d47ba4aff0
|
@ -1,6 +1,5 @@
|
||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
|
||||||
## 0.4.0 (unreleased)
|
## 0.4.0 (unreleased)
|
||||||
|
|
||||||
- Fix `serve` not working with the config flag
|
- Fix `serve` not working with the config flag
|
||||||
|
@ -12,6 +11,7 @@
|
||||||
- Aliases can now be pointing directly to specific HTML files
|
- Aliases can now be pointing directly to specific HTML files
|
||||||
- Add `year`, `month` and `day` variables to pages with a date
|
- Add `year`, `month` and `day` variables to pages with a date
|
||||||
- Fix panic when live reloading a change on a file without extensions
|
- Fix panic when live reloading a change on a file without extensions
|
||||||
|
- Add image resizing support
|
||||||
|
|
||||||
## 0.3.4 (2018-06-22)
|
## 0.3.4 (2018-06-22)
|
||||||
|
|
||||||
|
|
140
Cargo.lock
generated
140
Cargo.lock
generated
|
@ -20,33 +20,6 @@ dependencies = [
|
||||||
"uuid 0.6.5 (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"
|
|
||||||
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]]
|
[[package]]
|
||||||
name = "actix-web"
|
name = "actix-web"
|
||||||
version = "0.6.14"
|
version = "0.6.14"
|
||||||
|
@ -401,18 +374,6 @@ dependencies = [
|
||||||
"parking_lot 0.5.5 (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-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]]
|
[[package]]
|
||||||
name = "crossbeam-deque"
|
name = "crossbeam-deque"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
|
@ -474,11 +435,6 @@ dependencies = [
|
||||||
"cfg-if 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"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]]
|
[[package]]
|
||||||
name = "ctrlc"
|
name = "ctrlc"
|
||||||
version = "3.1.1"
|
version = "3.1.1"
|
||||||
|
@ -790,7 +746,7 @@ dependencies = [
|
||||||
name = "gutenberg"
|
name = "gutenberg"
|
||||||
version = "0.4.0"
|
version = "0.4.0"
|
||||||
dependencies = [
|
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)",
|
"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)",
|
"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.31.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -914,7 +870,7 @@ dependencies = [
|
||||||
"errors 0.1.0",
|
"errors 0.1.0",
|
||||||
"image 0.19.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)",
|
"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)",
|
"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.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"utils 0.1.0",
|
"utils 0.1.0",
|
||||||
|
@ -1020,15 +976,6 @@ name = "linked-hash-map"
|
||||||
version = "0.5.1"
|
version = "0.5.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
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]]
|
[[package]]
|
||||||
name = "log"
|
name = "log"
|
||||||
version = "0.3.9"
|
version = "0.3.9"
|
||||||
|
@ -1381,15 +1328,6 @@ dependencies = [
|
||||||
"parking_lot_core 0.2.14 (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"
|
|
||||||
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]]
|
[[package]]
|
||||||
name = "parking_lot_core"
|
name = "parking_lot_core"
|
||||||
version = "0.2.14"
|
version = "0.2.14"
|
||||||
|
@ -1568,15 +1506,6 @@ dependencies = [
|
||||||
"rayon-core 1.4.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 = "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]]
|
[[package]]
|
||||||
name = "rayon"
|
name = "rayon"
|
||||||
version = "1.0.1"
|
version = "1.0.1"
|
||||||
|
@ -2300,21 +2229,6 @@ dependencies = [
|
||||||
"winapi 0.3.5 (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-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]]
|
[[package]]
|
||||||
name = "tokio-tcp"
|
name = "tokio-tcp"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
@ -2389,29 +2303,6 @@ dependencies = [
|
||||||
"url 1.7.0 (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-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]]
|
[[package]]
|
||||||
name = "trust-dns-resolver"
|
name = "trust-dns-resolver"
|
||||||
version = "0.8.2"
|
version = "0.8.2"
|
||||||
|
@ -2428,24 +2319,6 @@ dependencies = [
|
||||||
"trust-dns-proto 0.3.3 (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 = "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]]
|
[[package]]
|
||||||
name = "ucd-util"
|
name = "ucd-util"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
|
@ -2676,7 +2549,6 @@ dependencies = [
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
"checksum actix 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7f0b2daad36916ccd2b162dbc5a04a74df642a29391b1a341c8ee3e82026cb16"
|
"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-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 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 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 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.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.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.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-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.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.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.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.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 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 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 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 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.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 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.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.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 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 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 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.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 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 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 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.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.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.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 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-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"
|
"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-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-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.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-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.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-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 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 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.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.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 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 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 unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284b6d3db520d67fbe88fd778c21510d1b0ba4a551e5d0fbb023d33405f6de8a"
|
||||||
|
|
|
@ -24,7 +24,7 @@ term-painter = "0.2"
|
||||||
# Used in init to ensure the url given as base_url is a valid one
|
# Used in init to ensure the url given as base_url is a valid one
|
||||||
url = "1.5"
|
url = "1.5"
|
||||||
# Below is for the serve cmd
|
# Below is for the serve cmd
|
||||||
actix = "0.6"
|
actix = "~0.5"
|
||||||
actix-web = "0.6"
|
actix-web = "0.6"
|
||||||
notify = "4"
|
notify = "4"
|
||||||
ws = "0.7"
|
ws = "0.7"
|
||||||
|
|
|
@ -17,7 +17,7 @@ in the `docs/content` folder of the repository.
|
||||||
| Sass compilation | ✔ | ✕ | ✕ | ✔ |
|
| Sass compilation | ✔ | ✕ | ✕ | ✔ |
|
||||||
| Assets co-location | ✔ | ✔ | ✔ | ✔ |
|
| Assets co-location | ✔ | ✔ | ✔ | ✔ |
|
||||||
| i18n | ✕ | ✕ | ✔ | ✔ |
|
| i18n | ✕ | ✕ | ✔ | ✔ |
|
||||||
| Image processing | ✕ | ✕ | ✔ | ✔ |
|
| Image processing | ✔ | ✕ | ✔ | ✔ |
|
||||||
| Sane template engine | ✔ | ✔ | ✕✕✕ | ✔ |
|
| Sane template engine | ✔ | ✔ | ✕✕✕ | ✔ |
|
||||||
| Themes | ✔ | ✕ | ✔ | ✔ |
|
| Themes | ✔ | ✕ | ✔ | ✔ |
|
||||||
| Shortcodes | ✔ | ✕ | ✔ | ✔ |
|
| Shortcodes | ✔ | ✕ | ✔ | ✔ |
|
||||||
|
|
|
@ -170,7 +170,7 @@ impl Page {
|
||||||
anchor_insert
|
anchor_insert
|
||||||
);
|
);
|
||||||
|
|
||||||
context.teracontext.add("page", self);
|
context.tera_context.add("page", self);
|
||||||
|
|
||||||
let res = render_content(
|
let res = render_content(
|
||||||
&self.raw_content.replacen("<!-- more -->", "<a name=\"continue-reading\"></a>", 1),
|
&self.raw_content.replacen("<!-- more -->", "<a name=\"continue-reading\"></a>", 1),
|
||||||
|
|
|
@ -106,7 +106,7 @@ impl Section {
|
||||||
self.meta.insert_anchor_links,
|
self.meta.insert_anchor_links,
|
||||||
);
|
);
|
||||||
|
|
||||||
context.teracontext.add("section", self);
|
context.tera_context.add("section", self);
|
||||||
|
|
||||||
let res = render_content(&self.raw_content, &context)
|
let res = render_content(&self.raw_content, &context)
|
||||||
.chain_err(|| format!("Failed to render content of {}", self.file.path.display()))?;
|
.chain_err(|| format!("Failed to render content of {}", self.file.path.display()))?;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#![allow(unused_doc_comment)]
|
#![allow(unused_doc_comments)]
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate error_chain;
|
extern crate error_chain;
|
||||||
|
|
|
@ -6,9 +6,9 @@ authors = ["Vojtěch Král <vojtech@kral.hk>"]
|
||||||
[dependencies]
|
[dependencies]
|
||||||
lazy_static = "1"
|
lazy_static = "1"
|
||||||
regex = "1.0"
|
regex = "1.0"
|
||||||
tera = "0.11.0"
|
tera = "0.11"
|
||||||
image = "0.19.0"
|
image = "0.19"
|
||||||
rayon = "0.9"
|
rayon = "1"
|
||||||
|
|
||||||
errors = { path = "../errors" }
|
errors = { path = "../errors" }
|
||||||
utils = { path = "../utils" }
|
utils = { path = "../utils" }
|
||||||
|
|
|
@ -24,6 +24,7 @@ use errors::{Result, ResultExt};
|
||||||
|
|
||||||
|
|
||||||
static RESIZED_SUBDIR: &'static str = "_processed_images";
|
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();
|
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 {
|
pub enum ResizeOp {
|
||||||
/// A simple scale operation that doesn't take aspect ratio into account
|
/// A simple scale operation that doesn't take aspect ratio into account
|
||||||
Scale(u32, u32),
|
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),
|
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),
|
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.
|
/// Either dimension may end up being smaller, but never larger than specified.
|
||||||
Fit(u32, u32),
|
Fit(u32, u32),
|
||||||
/// Scales the image such that it fills the specified width and height. Output will always have the exact dimensions specified.
|
/// Scales the image such that it fills the specified width and height.
|
||||||
/// The part of the image that doesn't fit in the thumbnail due to differing aspect ratio will be cropped away, if any.
|
/// 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),
|
Fill(u32, u32),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,8 +57,12 @@ impl ResizeOp {
|
||||||
|
|
||||||
// Validate args:
|
// Validate args:
|
||||||
match op {
|
match op {
|
||||||
"fit_width" => if width.is_none() { return Err(format!("op=\"fit_width\" requires a `width` argument").into()) },
|
"fit_width" => if width.is_none() {
|
||||||
"fit_height" => if height.is_none() { return Err(format!("op=\"fit_height\" requires a `height` argument").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())
|
||||||
|
},
|
||||||
"scale" | "fit" | "fill" => if width.is_none() || height.is_none() {
|
"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())
|
||||||
},
|
},
|
||||||
|
@ -127,6 +137,7 @@ pub struct ImageOp {
|
||||||
/// If there is a hash collision with another ImageOp, this contains a sequential ID > 1
|
/// 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).
|
/// 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.
|
/// 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,
|
collision_id: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,7 +152,13 @@ impl ImageOp {
|
||||||
ImageOp { source, op, quality, hash, collision_id: 0 }
|
ImageOp { source, op, quality, hash, collision_id: 0 }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn from_args(source: String, op: &str, width: Option<u32>, height: Option<u32>, quality: u8) -> Result<ImageOp> {
|
pub fn from_args(
|
||||||
|
source: String,
|
||||||
|
op: &str,
|
||||||
|
width: Option<u32>,
|
||||||
|
height: Option<u32>,
|
||||||
|
quality: u8,
|
||||||
|
) -> Result<ImageOp> {
|
||||||
let op = ResizeOp::from_args(op, width, height)?;
|
let op = ResizeOp::from_args(op, width, height)?;
|
||||||
Ok(Self::new(source, op, quality))
|
Ok(Self::new(source, op, quality))
|
||||||
}
|
}
|
||||||
|
@ -170,13 +187,14 @@ impl ImageOp {
|
||||||
let factor_h = img_h as f32 / h as f32;
|
let factor_h = img_h as f32 / h as f32;
|
||||||
|
|
||||||
if (factor_w - factor_h).abs() <= RATIO_EPSILLION {
|
if (factor_w - factor_h).abs() <= RATIO_EPSILLION {
|
||||||
// If the horizontal and vertical factor is very similar, that means the aspect is similar enough
|
// If the horizontal and vertical factor is very similar,
|
||||||
// that there's not much point in cropping, so just perform a simple scale in this case.
|
// 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)
|
img.resize_exact(w, h, RESIZE_FILTER)
|
||||||
} else {
|
} else {
|
||||||
// We perform the fill such that a crop is performed first and then resize_exact can be used,
|
// We perform the fill such that a crop is performed first
|
||||||
// which should be cheaper than resizing and then cropping (smaller number of pixels to resize).
|
// 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 {
|
let (crop_w, crop_h) = if factor_w < factor_h {
|
||||||
(img_w, (factor_w * h as f32).round() as u32)
|
(img_w, (factor_w * h as f32).round() as u32)
|
||||||
} else {
|
} else {
|
||||||
|
@ -189,7 +207,8 @@ impl ImageOp {
|
||||||
((img_w - crop_w) / 2, 0)
|
((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.
|
// 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.
|
// 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.
|
// 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;
|
let mut collision_id = 2;
|
||||||
for op in self.img_ops_collisions.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 {
|
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),
|
// This is a colliding ImageOp, but we've already seen an equal one
|
||||||
// so just return its ID:
|
// (not just by hash, but by content too), so just return its ID:
|
||||||
return collision_id;
|
return collision_id;
|
||||||
} else {
|
} else {
|
||||||
collision_id += 1;
|
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 {
|
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;
|
self.img_ops.get_mut(&img_op.hash).unwrap().collision_id = 1;
|
||||||
}
|
}
|
||||||
img_op.collision_id = collision_id;
|
img_op.collision_id = collision_id;
|
||||||
|
@ -312,7 +336,10 @@ impl Processor {
|
||||||
let filename = entry_path.file_name().unwrap().to_string_lossy();
|
let filename = entry_path.file_name().unwrap().to_string_lossy();
|
||||||
if let Some(capts) = RESIZED_FILENAME.captures(filename.as_ref()) {
|
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 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) {
|
if collision_id > 0 || !self.img_ops.contains_key(&hash) {
|
||||||
fs::remove_file(&entry_path)?;
|
fs::remove_file(&entry_path)?;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ use config::Config;
|
||||||
pub struct RenderContext<'a> {
|
pub struct RenderContext<'a> {
|
||||||
pub tera: &'a Tera,
|
pub tera: &'a Tera,
|
||||||
pub config: &'a Config,
|
pub config: &'a Config,
|
||||||
pub teracontext: Context,
|
pub tera_context: Context,
|
||||||
pub current_page_permalink: &'a str,
|
pub current_page_permalink: &'a str,
|
||||||
pub permalinks: &'a HashMap<String, String>,
|
pub permalinks: &'a HashMap<String, String>,
|
||||||
pub insert_anchor: InsertAnchor,
|
pub insert_anchor: InsertAnchor,
|
||||||
|
@ -24,11 +24,11 @@ impl<'a> RenderContext<'a> {
|
||||||
permalinks: &'a HashMap<String, String>,
|
permalinks: &'a HashMap<String, String>,
|
||||||
insert_anchor: InsertAnchor,
|
insert_anchor: InsertAnchor,
|
||||||
) -> RenderContext<'a> {
|
) -> RenderContext<'a> {
|
||||||
let mut teracontext = Context::new();
|
let mut tera_context = Context::new();
|
||||||
teracontext.insert("config", config);
|
tera_context.insert("config", config);
|
||||||
RenderContext {
|
RenderContext {
|
||||||
tera,
|
tera,
|
||||||
teracontext,
|
tera_context,
|
||||||
current_page_permalink,
|
current_page_permalink,
|
||||||
permalinks,
|
permalinks,
|
||||||
insert_anchor,
|
insert_anchor,
|
||||||
|
|
|
@ -111,7 +111,10 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<(Strin
|
||||||
Event::Start(Tag::Image(src, title)) => {
|
Event::Start(Tag::Image(src, title)) => {
|
||||||
if is_colocated_asset_link(&src) {
|
if is_colocated_asset_link(&src) {
|
||||||
return Event::Start(
|
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 relative link (starting with `./`)
|
||||||
// - it could be a link to a co-located asset
|
// - it could be a link to a co-located asset
|
||||||
// - it could be a normal link
|
// - 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("./") {
|
let fixed_link = if link.starts_with("./") {
|
||||||
match resolve_internal_link(&link, context.permalinks) {
|
match resolve_internal_link(&link, context.permalinks) {
|
||||||
Ok(url) => url,
|
Ok(url) => url,
|
||||||
|
@ -176,7 +180,8 @@ pub fn markdown_to_html(content: &str, context: &RenderContext) -> Result<(Strin
|
||||||
Event::Html(Owned(String::new()))
|
Event::Html(Owned(String::new()))
|
||||||
},
|
},
|
||||||
Event::End(Tag::Header(_)) => {
|
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;
|
in_header = false;
|
||||||
header_created = false;
|
header_created = false;
|
||||||
let val = temp_header.to_string(context.tera, context.insert_anchor);
|
let val = temp_header.to_string(context.tera, context.insert_anchor);
|
||||||
|
|
|
@ -85,19 +85,19 @@ fn parse_shortcode_call(pair: Pair<Rule>) -> (String, Map<String, Value>) {
|
||||||
|
|
||||||
|
|
||||||
fn render_shortcode(name: String, args: Map<String, Value>, context: &RenderContext, body: Option<&str>) -> Result<String> {
|
fn render_shortcode(name: String, args: Map<String, Value>, context: &RenderContext, body: Option<&str>) -> Result<String> {
|
||||||
let mut teracontext = Context::new();
|
let mut tera_context = Context::new();
|
||||||
for (key, value) in args.iter() {
|
for (key, value) in args.iter() {
|
||||||
teracontext.insert(key, value);
|
tera_context.insert(key, value);
|
||||||
}
|
}
|
||||||
if let Some(ref b) = body {
|
if let Some(ref b) = body {
|
||||||
// Trimming right to avoid most shortcodes with bodies ending up with a HTML new line
|
// 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 tpl_name = format!("shortcodes/{}.html", name);
|
||||||
|
|
||||||
let res = context.tera
|
let res = context.tera
|
||||||
.render(&tpl_name, &teracontext)
|
.render(&tpl_name, &tera_context)
|
||||||
.chain_err(|| format!("Failed to render {} shortcode", name))?;
|
.chain_err(|| format!("Failed to render {} shortcode", name))?;
|
||||||
|
|
||||||
// We trim left every single line of a shortcode to avoid the accidental
|
// We trim left every single line of a shortcode to avoid the accidental
|
||||||
|
|
|
@ -42,7 +42,11 @@ pub fn make_trans(config: Config) -> GlobalFn {
|
||||||
|
|
||||||
Box::new(move |args| -> Result<Value> {
|
Box::new(move |args| -> Result<Value> {
|
||||||
let key = required_arg!(String, args.get("key"), "`trans` requires a `key` argument.");
|
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()];
|
let translations = &translations_config[lang.as_str()];
|
||||||
Ok(to_value(&translations[key.as_str()]).unwrap())
|
Ok(to_value(&translations[key.as_str()]).unwrap())
|
||||||
})
|
})
|
||||||
|
@ -56,7 +60,11 @@ pub fn make_get_page(all_pages: &HashMap<PathBuf, Page>) -> GlobalFn {
|
||||||
}
|
}
|
||||||
|
|
||||||
Box::new(move |args| -> Result<Value> {
|
Box::new(move |args| -> Result<Value> {
|
||||||
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) {
|
match pages.get(&path) {
|
||||||
Some(p) => Ok(to_value(p).unwrap()),
|
Some(p) => Ok(to_value(p).unwrap()),
|
||||||
None => Err(format!("Page `{}` not found.", path).into())
|
None => Err(format!("Page `{}` not found.", path).into())
|
||||||
|
@ -74,7 +82,11 @@ pub fn make_get_section(all_sections: &HashMap<PathBuf, Section>) -> GlobalFn {
|
||||||
}
|
}
|
||||||
|
|
||||||
Box::new(move |args| -> Result<Value> {
|
Box::new(move |args| -> Result<Value> {
|
||||||
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]);
|
//println!("Found {:#?}", sections.get(&path).unwrap().pages[0]);
|
||||||
match sections.get(&path) {
|
match sections.get(&path) {
|
||||||
Some(p) => Ok(to_value(p).unwrap()),
|
Some(p) => Ok(to_value(p).unwrap()),
|
||||||
|
@ -97,7 +109,11 @@ pub fn make_get_url(permalinks: HashMap<String, String>, config: Config) -> Glob
|
||||||
from_value::<bool>(c.clone()).unwrap_or(true)
|
from_value::<bool>(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("./") {
|
if path.starts_with("./") {
|
||||||
match resolve_internal_link(&path, &permalinks) {
|
match resolve_internal_link(&path, &permalinks) {
|
||||||
Ok(url) => Ok(to_value(url).unwrap()),
|
Ok(url) => Ok(to_value(url).unwrap()),
|
||||||
|
@ -120,12 +136,22 @@ pub fn make_get_url(permalinks: HashMap<String, String>, config: Config) -> Glob
|
||||||
|
|
||||||
pub fn make_get_taxonomy_url(tags: Option<Taxonomy>, categories: Option<Taxonomy>) -> GlobalFn {
|
pub fn make_get_taxonomy_url(tags: Option<Taxonomy>, categories: Option<Taxonomy>) -> GlobalFn {
|
||||||
Box::new(move |args| -> Result<Value> {
|
Box::new(move |args| -> Result<Value> {
|
||||||
let kind = required_arg!(String, args.get("kind"), "`get_taxonomy_url` requires a `kind` argument with a string value");
|
let kind = required_arg!(
|
||||||
let name = required_arg!(String, args.get("name"), "`get_taxonomy_url` requires a `name` argument with a string value");
|
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() {
|
let container = match kind.as_ref() {
|
||||||
"tag" => &tags,
|
"tag" => &tags,
|
||||||
"category" => &categories,
|
"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 {
|
if let Some(ref c) = *container {
|
||||||
|
@ -146,11 +172,31 @@ pub fn make_resize_image(imageproc: Arc<Mutex<imageproc::Processor>>) -> GlobalF
|
||||||
const DEFAULT_Q: u8 = 75;
|
const DEFAULT_Q: u8 = 75;
|
||||||
|
|
||||||
Box::new(move |args| -> Result<Value> {
|
Box::new(move |args| -> Result<Value> {
|
||||||
let path = required_arg!(String, args.get("path"), "`resize_image` requires a `path` argument with a string value");
|
let path = required_arg!(
|
||||||
let width = optional_arg!(u32, args.get("width"), "`resize_image`: `width` must be a non-negative integer");
|
String,
|
||||||
let height = optional_arg!(u32, args.get("height"), "`resize_image`: `height` must be a non-negative integer");
|
args.get("path"),
|
||||||
let op = optional_arg!(String, args.get("op"), "`resize_image`: `op` must be a string").unwrap_or(DEFAULT_OP.to_owned());
|
"`resize_image` requires a `path` argument with a string value"
|
||||||
let quality = optional_arg!(u8, args.get("quality"), "`resize_image`: `quality` must be a number").unwrap_or(DEFAULT_Q);
|
);
|
||||||
|
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 {
|
if quality == 0 || quality > 100 {
|
||||||
return Err("`resize_image`: `quality` must be in range 1-100".to_string().into());
|
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<Mutex<imageproc::Processor>>) -> GlobalF
|
||||||
return Err(format!("`resize_image`: Cannot find path: {}", path).into());
|
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);
|
let url = imageproc.insert(imageop);
|
||||||
|
|
||||||
to_value(url).map_err(|err| err.into())
|
to_value(url).map_err(|err| err.into())
|
||||||
|
|
|
@ -15,7 +15,6 @@ The function usage is as follows:
|
||||||
### Arguments
|
### Arguments
|
||||||
|
|
||||||
- `path`: The path to the source image relative to the `content` directory in the [directory structure](./documentation/getting-started/directory-structure.md).
|
- `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.
|
- `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"`.
|
- `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.
|
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:
|
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,
|
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
|
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
|
||||||
<img src="{{ resize_image(path=path, width=width, height=height, op=op) }}" />
|
<img src="{{ resize_image(path=path, width=width, height=height, op=op) }}" />
|
||||||
```
|
```
|
||||||
|
|
||||||
## 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.
|
This can be used along with `assets` [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
|
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)).
|
(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
|
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`:
|
picture gallery with the following shortcode named `gallery.html`:
|
||||||
|
|
||||||
```jinja2
|
```jinja2
|
||||||
{% for img in page.images %}
|
{% for asset in page.assets %}
|
||||||
<a href="{{ config.base_url }}/{{ img }}">
|
{% if asset is ending_with(".jpg") %}
|
||||||
<img src="{{ resize_image(path=img, width=240, height=180) }}" />
|
<a href="{{ get_url(path=asset) }}">
|
||||||
|
<img src="{{ resize_image(path=asset, width=240, height=180, op="fill") }}" />
|
||||||
</a>
|
</a>
|
||||||
 
|
 
|
||||||
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,10 @@ Argument values can be of 5 types:
|
||||||
|
|
||||||
Malformed values will be silently ignored.
|
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
|
### Shortcodes without body
|
||||||
|
|
||||||
Simply 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
|
||||||
|
|
|
@ -37,12 +37,12 @@ previous: Page?;
|
||||||
next: Page?;
|
next: Page?;
|
||||||
// See the Table of contents section below for more details
|
// See the Table of contents section below for more details
|
||||||
toc: Array<Header>;
|
toc: Array<Header>;
|
||||||
// Paths of colocated assets, relative to the content directory
|
|
||||||
assets: Array<String>;
|
|
||||||
// Year/month/day is only set if the page has a date and month/day are 1-indexed
|
// Year/month/day is only set if the page has a date and month/day are 1-indexed
|
||||||
year: Number?;
|
year: Number?;
|
||||||
month: Number?;
|
month: Number?;
|
||||||
day: Number?;
|
day: Number?;
|
||||||
|
// Paths of colocated assets, relative to the content directory
|
||||||
|
assets: Array<String>;
|
||||||
```
|
```
|
||||||
|
|
||||||
## Section variables
|
## Section variables
|
||||||
|
|
Loading…
Reference in a new issue