getzola / zola

A fast static site generator in a single binary with everything built-in. https://www.getzola.org
https://www.getzola.org
MIT License
13.99k stars 963 forks source link

HTML minification fails with CJK text #1304

Closed lae closed 3 years ago

lae commented 3 years ago

Bug Report

Zola sometimes fails to build or serve content with minify_html = true when source files contain CJK characters, depending on the number of characters around them.

Environment

Zola version: 0.13.0

Expected Behavior

Zola should compile and minify all files without issue.

Current Behavior

Site fails to build sometimes, and in other situations fail to be served, if there are CJK characters. It's interesting that zola serve and zola build behave differently (I haven't run into a situation where both failed to work on the same content), but I guess this probably has to do with the injected reload script/different base_url.

Building site...
-> Creating 0 pages (0 orphan), 0 sections, and processing 0 images
Failed to build the site
Error: Failed to convert bytes to string : invalid utf-8 sequence of 1 bytes from index 18

(the third line doesn't show up when running zola serve)

Steps to reproduce

As it's not a consistent issue, I've prepared a small example site: minify-cjk-bug.zip

Zola successfully builds this example site if I ensure three bytes (ASCII characters, newlines), or multiples of three bytes (including 0 bytes), are before the CJK character.

I haven't been able to create a minimal site to reproduce the failure during zola serve, but my website currently fails to build on serve.

Lonami commented 3 years ago

Having the same issue, disabling minification does make it work. The reproduction below is extremely finicky, adding or removing characters in multiple places (say, base.html, or a/index.md) causes it to start working.

bugrepro.zip

Windows 10 (maybe line endings matter), zola 0.13.0.

Keats commented 3 years ago

Can you try to reproduce it in https://github.com/wilsonzlin/minify-html to see if it's a bug in the minifier?

Lonami commented 3 years ago

Generate the HTML with minify off in Zola and then run the generated HTML through it?

Keats commented 3 years ago

Yep!

Lonami commented 3 years ago

zola build works fine with either minify on or off, but zola serve fails with minify on. zola serve is not populating public/ so I can't get the files from there... I tried to minify the built files, but none failed.

Keats commented 3 years ago

If you have Rust installed, you can just println! in https://github.com/getzola/zola/blob/next/components/utils/src/minify.rs#L7

Lonami commented 3 years ago

I actually cloned the repository and ran cargo install to get zola in the first time as it isn't in crates.io :P

Let me try that.

Lonami commented 3 years ago
println!("{}", html) ``` bugrepro>zola serve Building site... -> Creating 1 pages (0 orphan), 1 sections, and processing 0 images aaaaaa's aaaa

last updated 2020-02-02

a aaaa aaaaaaa aa aaaaaaaa aaaaaaaaa a aaaa aaa aaaaaaaaa a aaaa, aaaaaaa aaaa aaaaaa aaaaaaaaa a aaaa aaa aaaa aa aaaa aaaaaa, aaa a aaaaa aa aaaaa aa aaaaaaaaaaa aa aaa aaa aaaa.

aaa aaaaaaaaaa aa aaaaa aa aaa aaaaaaaaaaaa aaaaaaa aa aaaaaaaa aa aaaaa aaaaa aaaaa aa aaaaa aaaaa:

aa aaaaaaa: aaaaaaaaaóa aa aa aaaaaaaaa aa aa aaaaaaaaía a aóaa aaaaaaaa a aaaaaaa aa aa aaaaa, aaa aaaaaaaaíaaaaaa, aa aaaaaa aaa aaaaa aa aa aaaaaaa aaa, aa aóaaa aa aaaaaaaa, a aóaa aa aaaaaaa.

-- aaaaaaa

aaaaaaaaa a aaaaaaaaaa

aaaaaaa: a.

aaa aaaa a aaaa aaaaaaaaa aa aa.aa. aaaaa: aaaaaaaaa aa aaaa.

aaa aaaa aaaaa a aaaaa aaaa aaaa, aaaaaaa aaa aaaaa aaaaaaaa aaa (aaaaaaaa aaaa):

aa éa aaaaaaaaaaa aa aaé aaaaaaaa aaaaaaa, aaa aaaaaaaaíaaaaaa, a aóaa aa aaaaaaa, aaaaa aaaaa.

-- aaaaaaaaa

aaaa aaa aaaa aa aaaaa aaaaaaaaa!

aaa aaaa aaaa aaaaaa aaa aa aaaaa, aaa aaaaaaaaaaaa, aaaaaa aa aaa aaa aaaaaaa, aaaaaaaa aaa aaaaaaaaaaaa.

a aaaa aaaaaa aaa aaaa aaaa a aaaaaaa a aaaaa aa aaaaa aaa aaa aaaaaaaaaaaa, aaaa aa aaaa aaaaaaa a aaa aa aaa aaaaaaaaa.

aaaaaaaaaaa aaaaaaaaaa

aaaaaaa: a.

aaa aaaa a aaaa aaaaaaaa aa aaaaa.

aaaa aaaa aaaa a aaaa aaa aaaaaaaaaa aaa aaaaaaa’a aaaaa, aaaaaa aa aaa aaa aaaaaaa, aaaaaaaa, aaa aaaaaaa aa aaaaaaaaa aaaaaaaaaaaa aaaaaaa.

aaaa aaa’a aaaa aa aaa aaaa aa aaaaaaaaa aaaaaaaa, aaaa aa aaaaa, aaa aaaaaaaaa aaa aaaa aa aaaa aaa aaaaaaaa aa a aaaaaaa.

Error: Failed to convert bytes to string : invalid utf-8 sequence of 1 bytes from index 2150 ```
Lonami commented 3 years ago

Just in case copy paste goes wrong here goes the same dump but as a file instead:

diff --git a/components/utils/src/minify.rs b/components/utils/src/minify.rs
index 0073585..52f8e34 100644
--- a/components/utils/src/minify.rs
+++ b/components/utils/src/minify.rs
@@ -1,10 +1,16 @@
 use errors::{bail, Result};
 use minify_html::{with_friendly_error, Cfg};

+use std::fs::File;
+use std::io::prelude::*;
+
 pub fn html(html: String) -> Result<String> {
     let cfg = &Cfg { minify_js: false, minify_css: false };
     let mut input_bytes = html.as_bytes().to_vec();

+    let mut file = File::create("input_bytes.html")?;
+    file.write_all(&input_bytes)?;
+
     match with_friendly_error(&mut input_bytes, cfg) {
         Ok(len) => match std::str::from_utf8(&input_bytes) {
             Ok(result) => Ok(result[..len].to_string()),

input_bytes.zip

The output is the same:

Building site...
-> Creating 1 pages (0 orphan), 1 sections, and processing 0 images
Error: Failed to convert bytes to string : invalid utf-8 sequence of 1 bytes from index 2150
Lonami commented 3 years ago

Running the minify binary as downloaded from the README works fine, so the bug might be in Zola. That is, this works fine:

bugrepro>C:\Users\L\Downloads\0.4.3-windows-x86_64.exe -s C:\Users\L\Desktop\bugrepro\input_bytes.html
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta name=description content="aaaaaaaa aaaaaa'a aaaaaaa"><meta name=viewport content="width=device-width, initial-scale=1.0, user-scalable=yes"><title>aaaaaa's aaaa</title><link rel=stylesheet href=/style.css><body><nav class=sections><ul><li><a href=/ class=selected>aaaaaaa'a aaaa</a><li><a href=/aaaa></a><li><a href=/aaaa></a></ul></nav><main><h1 class=title></h1><div class=time><p><p>last updated 2020-02-02</div><p>a aaaa aaaaaaa aa aaaaaaaa aaaaaaaaa a aaaa aaa aaaaaaaaa a aaaa, aaaaaaa aaaa aaaaaa aaaaaaaaa a aaaa aaa aaaa aa aaaa aaaaaa, aaa a aaaaa aa aaaaa aa aaaaaaaaaaa aa aaa aaa aaaa.<p>aaa aaaaaaaaaa aa aaaaa aa aaa aaaaaaaaaaaa aaaaaaa aa aaaaaaaa aa aaaaa aaaaa aaaaa aa aaaaa aaaaa:<blockquote><p><strong>aa aaaaaaa:</strong> aaaaaaaaaóa aa aa aaaaaaaaa aa aa aaaaaaaaía a aóaa aaaaaaaa a aaaaaaa aa aa aaaaa, aaa aaaaaaaaíaaaaaa, aa aaaaaa aaa aaaaa aa aa aaaaaaa aaa, aa aóaaa aa aaaaaaaa, a aóaa aa aaaaaaa.</blockquote><p>-- aaaaaaa<h2 id=aaaaaaaaa-a-aaaaaaaaaa>aaaaaaaaa a aaaaaaaaaa</h2><p><strong>aaaaaaa: a.</strong><p>aaa aaaa a aaaa aaaaaaaaa aa aa.aa. aaaaa: aaaaaaaaa aa aaaa.<p>aaa aaaa aaaaa a aaaaa aaaa aaaa, aaaaaaa aaa aaaaa aaaaaaaa aaa (aaaaaaaa aaaa):<blockquote><p>aa éa aaaaaaaaaaa aa aaé aaaaaaaa <strong>aaaaaaa</strong>, aaa aaaaaaaaíaaaaaa, a aóaa aa aaaaaaa, aaaaa aaaaa.</blockquote><p>-- aaaaaaaaa<p>aaaa aaa aaaa aa aaaaa aaaaaaaaa!<p>aaa aaaa aaaa aaaaaa aaa aa aaaaa, aaa aaaaaaaaaaaa, aaaaaa aa aaa aaa aaaaaaa, aaaaaaaa aaa aaaaaaaaaaaa.<p>a aaaa aaaaaa aaa aaaa aaaa a aaaaaaa a aaaaa aa aaaaa aaa aaa aaaaaaaaaaaa, aaaa aa aaaa aaaaaaa a aaa aa aaa aaaaaaaaa.<h2 id=aaaaaaaaaaa-aaaaaaaaaa>aaaaaaaaaaa aaaaaaaaaa</h2><p><strong>aaaaaaa: a.</strong><p>aaa aaaa a aaaa aaaaaaaa aa aaaaa.<p>aaaa aaaa aaaa a aaaa aaa aaaaaaaaaa aaa aaaaaaa’a aaaaa, aaaaaa aa aaa aaa aaaaaaa, aaaaaaaa, aaa aaaaaaa aa aaaaaaaaa aaaaaaaaaaaa aaaaaaa.<p>aaaa aaa’a aaaa aa aaa aaaa aa aaaaaaaaa aaaaaaaa, aaaa aa aaaaa, aaa aaaaaaaaa aaa aaaa aa aaaa aaa aaaaaaaa aa a aaaaaaa.</main><script src=/livereload.js?port=1024&mindelay=10></script>
Lonami commented 3 years ago

I have a feeling len is wrong:

https://github.com/getzola/zola/blob/a65a2d52c70def075d8b4ed4c57dfd81b1f96ba3/components/utils/src/minify.rs#L9

If I make a standalone Rust project, it works fine when trying to parse the entire thing:

const BYTES: &[u8] = include_bytes!("../input_bytes.html");

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test() {
        std::str::from_utf8(BYTES).unwrap();
    }
}

Edit wait I was on c531f8cbfcd15cd99fd920d83788fdc0dc646739 let me pull again.

Lonami commented 3 years ago

Release build, Zola revision 49b6087d2154ee1eeabb5d1bfc1704895533df17, cargo 1.46.0 (149022b1d 2020-07-17), rustc 1.46.0 (04488afe3 2020-08-24), Windows 10 x64.

Patch ```diff diff --git a/components/utils/src/minify.rs b/components/utils/src/minify.rs index 0073585..16a6e94 100644 --- a/components/utils/src/minify.rs +++ b/components/utils/src/minify.rs @@ -1,15 +1,25 @@ use errors::{bail, Result}; use minify_html::{with_friendly_error, Cfg}; +use std::fs::File; +use std::io::prelude::*; + pub fn html(html: String) -> Result { let cfg = &Cfg { minify_js: false, minify_css: false }; let mut input_bytes = html.as_bytes().to_vec(); + let mut file = File::create("input_bytes.html")?; + file.write_all(&input_bytes)?; + match with_friendly_error(&mut input_bytes, cfg) { - Ok(len) => match std::str::from_utf8(&input_bytes) { - Ok(result) => Ok(result[..len].to_string()), - Err(err) => bail!("Failed to convert bytes to string : {}", err), - }, + Ok(len) => { + let mut file = File::create("with_friendly_error.html")?; + file.write_all(&input_bytes)?; + match std::str::from_utf8(&input_bytes) { + Ok(result) => Ok(result[..len].to_string()), + Err(err) => bail!("Failed to convert bytes to string : {}", err), + } + } Err(minify_error) => { bail!( "Failed to truncate html at character {}: {} \n {}", ```
cargo tree ``` zola v0.13.0 (C:\Users\L\Documents\Projects\zola) ├── atty v0.2.14 │ └── winapi v0.3.9 ├── chrono v0.4.19 │ ├── libc v0.2.82 │ ├── num-integer v0.1.44 │ │ └── num-traits v0.2.14 │ │ [build-dependencies] │ │ └── autocfg v1.0.1 │ │ [build-dependencies] │ │ └── autocfg v1.0.1 │ ├── num-traits v0.2.14 (*) │ ├── serde v1.0.118 │ ├── time v0.1.43 │ │ ├── libc v0.2.82 │ │ └── winapi v0.3.9 │ └── winapi v0.3.9 ├── clap v2.33.3 │ ├── atty v0.2.14 (*) │ ├── bitflags v1.2.1 │ ├── strsim v0.8.0 │ ├── textwrap v0.11.0 │ │ └── unicode-width v0.1.8 │ ├── unicode-width v0.1.8 │ └── vec_map v0.8.2 ├── ctrlc v3.1.7 │ └── winapi v0.3.9 ├── errors v0.1.0 (C:\Users\L\Documents\Projects\zola\components\errors) │ ├── image v0.23.12 │ │ ├── bytemuck v1.4.1 │ │ ├── byteorder v1.4.2 │ │ ├── color_quant v1.1.0 │ │ ├── gif v0.11.1 │ │ │ ├── color_quant v1.1.0 │ │ │ └── weezl v0.1.3 │ │ ├── jpeg-decoder v0.1.20 │ │ │ ├── byteorder v1.4.2 │ │ │ └── rayon v1.5.0 │ │ │ ├── crossbeam-deque v0.8.0 │ │ │ │ ├── cfg-if v1.0.0 │ │ │ │ ├── crossbeam-epoch v0.9.1 │ │ │ │ │ ├── cfg-if v1.0.0 │ │ │ │ │ ├── const_fn v0.4.5 │ │ │ │ │ ├── crossbeam-utils v0.8.1 │ │ │ │ │ │ ├── cfg-if v1.0.0 │ │ │ │ │ │ └── lazy_static v1.4.0 │ │ │ │ │ │ [build-dependencies] │ │ │ │ │ │ └── autocfg v1.0.1 │ │ │ │ │ ├── lazy_static v1.4.0 │ │ │ │ │ ├── memoffset v0.6.1 │ │ │ │ │ │ [build-dependencies] │ │ │ │ │ │ └── autocfg v1.0.1 │ │ │ │ │ └── scopeguard v1.1.0 │ │ │ │ └── crossbeam-utils v0.8.1 (*) │ │ │ ├── either v1.6.1 │ │ │ └── rayon-core v1.9.0 │ │ │ ├── crossbeam-channel v0.5.0 │ │ │ │ ├── cfg-if v1.0.0 │ │ │ │ └── crossbeam-utils v0.8.1 (*) │ │ │ ├── crossbeam-deque v0.8.0 (*) │ │ │ ├── crossbeam-utils v0.8.1 (*) │ │ │ ├── lazy_static v1.4.0 │ │ │ └── num_cpus v1.13.0 │ │ │ └── libc v0.2.82 │ │ │ [build-dependencies] │ │ │ └── autocfg v1.0.1 │ │ ├── num-iter v0.1.42 │ │ │ ├── num-integer v0.1.44 (*) │ │ │ └── num-traits v0.2.14 (*) │ │ │ [build-dependencies] │ │ │ └── autocfg v1.0.1 │ │ ├── num-rational v0.3.2 │ │ │ ├── num-integer v0.1.44 (*) │ │ │ └── num-traits v0.2.14 (*) │ │ │ [build-dependencies] │ │ │ └── autocfg v1.0.1 │ │ ├── num-traits v0.2.14 (*) │ │ ├── png v0.16.8 │ │ │ ├── bitflags v1.2.1 │ │ │ ├── crc32fast v1.2.1 │ │ │ │ └── cfg-if v1.0.0 │ │ │ ├── deflate v0.8.6 │ │ │ │ ├── adler32 v1.2.0 │ │ │ │ └── byteorder v1.4.2 │ │ │ └── miniz_oxide v0.3.7 │ │ │ └── adler32 v1.2.0 │ │ ├── scoped_threadpool v0.1.9 │ │ └── tiff v0.6.1 │ │ ├── jpeg-decoder v0.1.20 (*) │ │ ├── miniz_oxide v0.4.3 │ │ │ └── adler v0.2.3 │ │ │ [build-dependencies] │ │ │ └── autocfg v1.0.1 │ │ └── weezl v0.1.3 │ ├── syntect v4.5.0 │ │ ├── bincode v1.3.1 │ │ │ ├── byteorder v1.4.2 │ │ │ └── serde v1.0.118 │ │ ├── bitflags v1.2.1 │ │ ├── flate2 v1.0.19 │ │ │ ├── cfg-if v1.0.0 │ │ │ ├── crc32fast v1.2.1 (*) │ │ │ ├── libc v0.2.82 │ │ │ └── miniz_oxide v0.4.3 (*) │ │ ├── fnv v1.0.7 │ │ ├── lazy_static v1.4.0 │ │ ├── lazycell v1.3.0 │ │ ├── onig v6.1.1 │ │ │ ├── bitflags v1.2.1 │ │ │ ├── lazy_static v1.4.0 │ │ │ ├── libc v0.2.82 │ │ │ └── onig_sys v69.6.0 │ │ │ [build-dependencies] │ │ │ ├── cc v1.0.66 │ │ │ └── pkg-config v0.3.19 │ │ ├── plist v1.0.1 │ │ │ ├── base64 v0.13.0 │ │ │ ├── chrono v0.4.19 (*) │ │ │ ├── indexmap v1.5.2 │ │ │ │ └── hashbrown v0.8.2 │ │ │ │ [build-dependencies] │ │ │ │ └── autocfg v1.0.1 │ │ │ │ [build-dependencies] │ │ │ │ └── autocfg v1.0.1 │ │ │ ├── line-wrap v0.1.1 │ │ │ │ └── safemem v0.3.3 │ │ │ ├── serde v1.0.118 │ │ │ └── xml-rs v0.8.3 │ │ ├── regex-syntax v0.6.22 │ │ ├── serde v1.0.118 │ │ ├── serde_derive v1.0.118 │ │ │ ├── proc-macro2 v1.0.24 │ │ │ │ └── unicode-xid v0.2.1 │ │ │ ├── quote v1.0.8 │ │ │ │ └── proc-macro2 v1.0.24 (*) │ │ │ └── syn v1.0.58 │ │ │ ├── proc-macro2 v1.0.24 (*) │ │ │ ├── quote v1.0.8 (*) │ │ │ └── unicode-xid v0.2.1 │ │ ├── serde_json v1.0.61 │ │ │ ├── indexmap v1.5.2 (*) │ │ │ ├── itoa v0.4.7 │ │ │ ├── ryu v1.0.5 │ │ │ └── serde v1.0.118 │ │ ├── walkdir v2.3.1 │ │ │ ├── same-file v1.0.6 │ │ │ │ └── winapi-util v0.1.5 │ │ │ │ └── winapi v0.3.9 │ │ │ ├── winapi v0.3.9 │ │ │ └── winapi-util v0.1.5 (*) │ │ └── yaml-rust v0.4.5 │ │ └── linked-hash-map v0.5.4 │ ├── tera v1.6.1 │ │ ├── chrono v0.4.19 (*) │ │ ├── chrono-tz v0.5.3 │ │ │ └── chrono v0.4.19 (*) │ │ │ [build-dependencies] │ │ │ └── parse-zoneinfo v0.3.0 │ │ │ └── regex v1.4.3 │ │ │ ├── aho-corasick v0.7.15 │ │ │ │ └── memchr v2.3.4 │ │ │ ├── memchr v2.3.4 │ │ │ ├── regex-syntax v0.6.22 │ │ │ └── thread_local v1.1.0 │ │ │ └── lazy_static v1.4.0 │ │ ├── globwalk v0.8.1 │ │ │ ├── bitflags v1.2.1 │ │ │ ├── ignore v0.4.17 │ │ │ │ ├── crossbeam-utils v0.8.1 (*) │ │ │ │ ├── globset v0.4.6 │ │ │ │ │ ├── aho-corasick v0.7.15 (*) │ │ │ │ │ ├── bstr v0.2.14 │ │ │ │ │ │ ├── lazy_static v1.4.0 │ │ │ │ │ │ ├── memchr v2.3.4 │ │ │ │ │ │ ├── regex-automata v0.1.9 │ │ │ │ │ │ │ └── byteorder v1.4.2 │ │ │ │ │ │ └── serde v1.0.118 │ │ │ │ │ ├── fnv v1.0.7 │ │ │ │ │ ├── log v0.4.11 │ │ │ │ │ │ └── cfg-if v0.1.10 │ │ │ │ │ └── regex v1.4.3 (*) │ │ │ │ ├── lazy_static v1.4.0 │ │ │ │ ├── log v0.4.11 (*) │ │ │ │ ├── memchr v2.3.4 │ │ │ │ ├── regex v1.4.3 (*) │ │ │ │ ├── same-file v1.0.6 (*) │ │ │ │ ├── thread_local v1.1.0 (*) │ │ │ │ ├── walkdir v2.3.1 (*) │ │ │ │ └── winapi-util v0.1.5 (*) │ │ │ └── walkdir v2.3.1 (*) │ │ ├── humansize v1.1.0 │ │ ├── lazy_static v1.4.0 │ │ ├── percent-encoding v2.1.0 │ │ ├── pest v2.1.3 │ │ │ └── ucd-trie v0.1.3 │ │ ├── pest_derive v2.1.0 │ │ │ ├── pest v2.1.3 (*) │ │ │ └── pest_generator v2.1.3 │ │ │ ├── pest v2.1.3 (*) │ │ │ ├── pest_meta v2.1.3 │ │ │ │ ├── maplit v1.0.2 │ │ │ │ └── pest v2.1.3 (*) │ │ │ │ [build-dependencies] │ │ │ │ └── sha-1 v0.8.2 │ │ │ │ ├── block-buffer v0.7.3 │ │ │ │ │ ├── block-padding v0.1.5 │ │ │ │ │ │ └── byte-tools v0.3.1 │ │ │ │ │ ├── byte-tools v0.3.1 │ │ │ │ │ ├── byteorder v1.4.2 │ │ │ │ │ └── generic-array v0.12.3 │ │ │ │ │ └── typenum v1.12.0 │ │ │ │ ├── digest v0.8.1 │ │ │ │ │ └── generic-array v0.12.3 (*) │ │ │ │ ├── fake-simd v0.1.2 │ │ │ │ └── opaque-debug v0.2.3 │ │ │ ├── proc-macro2 v1.0.24 (*) │ │ │ ├── quote v1.0.8 (*) │ │ │ └── syn v1.0.58 (*) │ │ ├── rand v0.8.1 │ │ │ ├── rand_chacha v0.3.0 │ │ │ │ ├── ppv-lite86 v0.2.10 │ │ │ │ └── rand_core v0.6.1 │ │ │ │ └── getrandom v0.2.1 │ │ │ │ └── cfg-if v1.0.0 │ │ │ └── rand_core v0.6.1 (*) │ │ ├── regex v1.4.3 (*) │ │ ├── serde v1.0.118 │ │ ├── serde_json v1.0.61 (*) │ │ ├── slug v0.1.4 │ │ │ └── deunicode v0.4.3 │ │ └── unic-segment v0.9.0 │ │ └── unic-ucd-segment v0.9.0 │ │ ├── unic-char-property v0.9.0 │ │ │ └── unic-char-range v0.9.0 │ │ ├── unic-char-range v0.9.0 │ │ └── unic-ucd-version v0.9.0 │ │ └── unic-common v0.9.0 │ └── toml v0.5.8 │ └── serde v1.0.118 ├── front_matter v0.1.0 (C:\Users\L\Documents\Projects\zola\components\front_matter) │ ├── chrono v0.4.19 (*) │ ├── errors v0.1.0 (C:\Users\L\Documents\Projects\zola\components\errors) (*) │ ├── lazy_static v1.4.0 │ ├── regex v1.4.3 (*) │ ├── serde v1.0.118 │ ├── serde_derive v1.0.118 (*) │ ├── serde_yaml v0.8.15 │ │ ├── dtoa v0.4.7 │ │ ├── linked-hash-map v0.5.4 │ │ ├── serde v1.0.118 │ │ └── yaml-rust v0.4.5 (*) │ ├── tera v1.6.1 (*) │ ├── toml v0.5.8 (*) │ └── utils v0.1.0 (C:\Users\L\Documents\Projects\zola\components\utils) │ ├── errors v0.1.0 (C:\Users\L\Documents\Projects\zola\components\errors) (*) │ ├── filetime v0.2.13 │ │ ├── cfg-if v1.0.0 │ │ └── winapi v0.3.9 │ ├── minify-html v0.4.1 │ │ ├── aho-corasick v0.7.15 (*) │ │ ├── lazy_static v1.4.0 │ │ └── memchr v2.3.4 │ ├── percent-encoding v2.1.0 │ ├── serde v1.0.118 │ ├── serde_derive v1.0.118 (*) │ ├── slug v0.1.4 (*) │ ├── tera v1.6.1 (*) │ ├── toml v0.5.8 (*) │ ├── unicode-segmentation v1.7.1 │ └── walkdir v2.3.1 (*) ├── globset v0.4.6 (*) ├── hyper v0.14.2 │ ├── bytes v1.0.0 │ ├── futures-channel v0.3.9 │ │ └── futures-core v0.3.9 │ ├── futures-core v0.3.9 │ ├── futures-util v0.3.9 │ │ ├── futures-core v0.3.9 │ │ ├── futures-io v0.3.9 │ │ ├── futures-macro v0.3.9 │ │ │ ├── proc-macro-hack v0.5.19 │ │ │ ├── proc-macro2 v1.0.24 (*) │ │ │ ├── quote v1.0.8 (*) │ │ │ └── syn v1.0.58 (*) │ │ ├── futures-task v0.3.9 │ │ │ └── once_cell v1.5.2 │ │ ├── memchr v2.3.4 │ │ ├── pin-project-lite v0.2.2 │ │ ├── pin-utils v0.1.0 │ │ ├── proc-macro-hack v0.5.19 │ │ ├── proc-macro-nested v0.1.6 │ │ └── slab v0.4.2 │ ├── h2 v0.3.0 │ │ ├── bytes v1.0.0 │ │ ├── fnv v1.0.7 │ │ ├── futures-core v0.3.9 │ │ ├── futures-sink v0.3.9 │ │ ├── futures-util v0.3.9 (*) │ │ ├── http v0.2.3 │ │ │ ├── bytes v1.0.0 │ │ │ ├── fnv v1.0.7 │ │ │ └── itoa v0.4.7 │ │ ├── indexmap v1.5.2 (*) │ │ ├── slab v0.4.2 │ │ ├── tokio v1.0.1 │ │ │ ├── bytes v1.0.0 │ │ │ ├── memchr v2.3.4 │ │ │ ├── mio v0.7.7 │ │ │ │ ├── log v0.4.11 (*) │ │ │ │ ├── miow v0.3.6 │ │ │ │ │ ├── socket2 v0.3.19 │ │ │ │ │ │ └── winapi v0.3.9 │ │ │ │ │ └── winapi v0.3.9 │ │ │ │ ├── ntapi v0.3.6 │ │ │ │ │ └── winapi v0.3.9 │ │ │ │ └── winapi v0.3.9 │ │ │ ├── num_cpus v1.13.0 (*) │ │ │ └── pin-project-lite v0.2.2 │ │ │ [build-dependencies] │ │ │ └── autocfg v1.0.1 │ │ ├── tokio-util v0.6.0 │ │ │ ├── bytes v1.0.0 │ │ │ ├── futures-core v0.3.9 │ │ │ ├── futures-sink v0.3.9 │ │ │ ├── log v0.4.11 (*) │ │ │ ├── pin-project-lite v0.2.2 │ │ │ ├── tokio v1.0.1 (*) │ │ │ └── tokio-stream v0.1.1 │ │ │ ├── futures-core v0.3.9 │ │ │ ├── pin-project-lite v0.2.2 │ │ │ └── tokio v1.0.1 (*) │ │ ├── tracing v0.1.22 │ │ │ ├── cfg-if v1.0.0 │ │ │ ├── pin-project-lite v0.2.2 │ │ │ └── tracing-core v0.1.17 │ │ │ └── lazy_static v1.4.0 │ │ └── tracing-futures v0.2.4 │ │ ├── pin-project v0.4.27 │ │ │ └── pin-project-internal v0.4.27 │ │ │ ├── proc-macro2 v1.0.24 (*) │ │ │ ├── quote v1.0.8 (*) │ │ │ └── syn v1.0.58 (*) │ │ └── tracing v0.1.22 (*) │ ├── http v0.2.3 (*) │ ├── http-body v0.4.0 │ │ ├── bytes v1.0.0 │ │ └── http v0.2.3 (*) │ ├── httparse v1.3.4 │ ├── httpdate v0.3.2 │ ├── itoa v0.4.7 │ ├── pin-project v1.0.3 │ │ └── pin-project-internal v1.0.3 │ │ ├── proc-macro2 v1.0.24 (*) │ │ ├── quote v1.0.8 (*) │ │ └── syn v1.0.58 (*) │ ├── socket2 v0.3.19 (*) │ ├── tokio v1.0.1 (*) │ ├── tower-service v0.3.0 │ ├── tracing v0.1.22 (*) │ └── want v0.3.0 │ ├── log v0.4.11 (*) │ └── try-lock v0.2.3 ├── lazy_static v1.4.0 ├── notify v4.0.15 │ ├── bitflags v1.2.1 │ ├── filetime v0.2.13 (*) │ ├── libc v0.2.82 │ ├── walkdir v2.3.1 (*) │ └── winapi v0.3.9 ├── open v1.4.0 │ └── winapi v0.3.9 ├── percent-encoding v2.1.0 ├── relative-path v1.3.2 ├── serde_json v1.0.61 (*) ├── site v0.1.0 (C:\Users\L\Documents\Projects\zola\components\site) │ ├── config v0.1.0 (C:\Users\L\Documents\Projects\zola\components\config) │ │ ├── chrono v0.4.19 (*) │ │ ├── errors v0.1.0 (C:\Users\L\Documents\Projects\zola\components\errors) (*) │ │ ├── globset v0.4.6 (*) │ │ ├── lazy_static v1.4.0 │ │ ├── serde v1.0.118 │ │ ├── serde_derive v1.0.118 (*) │ │ ├── syntect v4.5.0 (*) │ │ ├── toml v0.5.8 (*) │ │ └── utils v0.1.0 (C:\Users\L\Documents\Projects\zola\components\utils) (*) │ ├── errors v0.1.0 (C:\Users\L\Documents\Projects\zola\components\errors) (*) │ ├── front_matter v0.1.0 (C:\Users\L\Documents\Projects\zola\components\front_matter) (*) │ ├── glob v0.3.0 │ ├── imageproc v0.1.0 (C:\Users\L\Documents\Projects\zola\components\imageproc) │ │ ├── errors v0.1.0 (C:\Users\L\Documents\Projects\zola\components\errors) (*) │ │ ├── image v0.23.12 (*) │ │ ├── lazy_static v1.4.0 │ │ ├── rayon v1.5.0 (*) │ │ ├── regex v1.4.3 (*) │ │ ├── tera v1.6.1 (*) │ │ └── utils v0.1.0 (C:\Users\L\Documents\Projects\zola\components\utils) (*) │ ├── lazy_static v1.4.0 │ ├── library v0.1.0 (C:\Users\L\Documents\Projects\zola\components\library) │ │ ├── chrono v0.4.19 (*) │ │ ├── config v0.1.0 (C:\Users\L\Documents\Projects\zola\components\config) (*) │ │ ├── errors v0.1.0 (C:\Users\L\Documents\Projects\zola\components\errors) (*) │ │ ├── front_matter v0.1.0 (C:\Users\L\Documents\Projects\zola\components\front_matter) (*) │ │ ├── lazy_static v1.4.0 │ │ ├── rayon v1.5.0 (*) │ │ ├── regex v1.4.3 (*) │ │ ├── rendering v0.1.0 (C:\Users\L\Documents\Projects\zola\components\rendering) │ │ │ ├── config v0.1.0 (C:\Users\L\Documents\Projects\zola\components\config) (*) │ │ │ ├── errors v0.1.0 (C:\Users\L\Documents\Projects\zola\components\errors) (*) │ │ │ ├── front_matter v0.1.0 (C:\Users\L\Documents\Projects\zola\components\front_matter) (*) │ │ │ ├── gh-emoji v1.0.3 │ │ │ │ ├── phf v0.8.0 │ │ │ │ │ └── phf_shared v0.8.0 │ │ │ │ │ └── siphasher v0.3.3 │ │ │ │ └── regex v1.4.3 (*) │ │ │ ├── lazy_static v1.4.0 │ │ │ ├── link_checker v0.1.0 (C:\Users\L\Documents\Projects\zola\components\link_checker) │ │ │ │ ├── config v0.1.0 (C:\Users\L\Documents\Projects\zola\components\config) (*) │ │ │ │ ├── errors v0.1.0 (C:\Users\L\Documents\Projects\zola\components\errors) (*) │ │ │ │ ├── lazy_static v1.4.0 │ │ │ │ └── reqwest v0.11.0 │ │ │ │ ├── base64 v0.13.0 │ │ │ │ ├── bytes v1.0.0 │ │ │ │ ├── encoding_rs v0.8.26 │ │ │ │ │ └── cfg-if v1.0.0 │ │ │ │ ├── futures-core v0.3.9 │ │ │ │ ├── futures-util v0.3.9 (*) │ │ │ │ ├── http v0.2.3 (*) │ │ │ │ ├── http-body v0.4.0 (*) │ │ │ │ ├── hyper v0.14.2 (*) │ │ │ │ ├── hyper-rustls v0.22.1 │ │ │ │ │ ├── futures-util v0.3.9 (*) │ │ │ │ │ ├── hyper v0.14.2 (*) │ │ │ │ │ ├── log v0.4.11 (*) │ │ │ │ │ ├── rustls v0.19.0 │ │ │ │ │ │ ├── base64 v0.13.0 │ │ │ │ │ │ ├── log v0.4.11 (*) │ │ │ │ │ │ ├── ring v0.16.19 │ │ │ │ │ │ │ ├── spin v0.5.2 │ │ │ │ │ │ │ ├── untrusted v0.7.1 │ │ │ │ │ │ │ └── winapi v0.3.9 │ │ │ │ │ │ │ [build-dependencies] │ │ │ │ │ │ │ └── cc v1.0.66 │ │ │ │ │ │ ├── sct v0.6.0 │ │ │ │ │ │ │ ├── ring v0.16.19 (*) │ │ │ │ │ │ │ └── untrusted v0.7.1 │ │ │ │ │ │ └── webpki v0.21.4 │ │ │ │ │ │ ├── ring v0.16.19 (*) │ │ │ │ │ │ └── untrusted v0.7.1 │ │ │ │ │ ├── tokio v1.0.1 (*) │ │ │ │ │ ├── tokio-rustls v0.22.0 │ │ │ │ │ │ ├── rustls v0.19.0 (*) │ │ │ │ │ │ ├── tokio v1.0.1 (*) │ │ │ │ │ │ └── webpki v0.21.4 (*) │ │ │ │ │ └── webpki v0.21.4 (*) │ │ │ │ ├── ipnet v2.3.0 │ │ │ │ ├── lazy_static v1.4.0 │ │ │ │ ├── log v0.4.11 (*) │ │ │ │ ├── mime v0.3.16 │ │ │ │ ├── percent-encoding v2.1.0 │ │ │ │ ├── pin-project-lite v0.2.2 │ │ │ │ ├── rustls v0.19.0 (*) │ │ │ │ ├── serde v1.0.118 │ │ │ │ ├── serde_urlencoded v0.7.0 │ │ │ │ │ ├── form_urlencoded v1.0.0 │ │ │ │ │ │ ├── matches v0.1.8 │ │ │ │ │ │ └── percent-encoding v2.1.0 │ │ │ │ │ ├── itoa v0.4.7 │ │ │ │ │ ├── ryu v1.0.5 │ │ │ │ │ └── serde v1.0.118 │ │ │ │ ├── tokio v1.0.1 (*) │ │ │ │ ├── tokio-rustls v0.22.0 (*) │ │ │ │ ├── url v2.2.0 │ │ │ │ │ ├── form_urlencoded v1.0.0 (*) │ │ │ │ │ ├── idna v0.2.0 │ │ │ │ │ │ ├── matches v0.1.8 │ │ │ │ │ │ ├── unicode-bidi v0.3.4 │ │ │ │ │ │ │ └── matches v0.1.8 │ │ │ │ │ │ └── unicode-normalization v0.1.16 │ │ │ │ │ │ └── tinyvec v1.1.0 │ │ │ │ │ │ └── tinyvec_macros v0.1.0 │ │ │ │ │ ├── matches v0.1.8 │ │ │ │ │ └── percent-encoding v2.1.0 │ │ │ │ ├── webpki-roots v0.21.0 │ │ │ │ │ └── webpki v0.21.4 (*) │ │ │ │ └── winreg v0.7.0 │ │ │ │ └── winapi v0.3.9 │ │ │ ├── pest v2.1.3 (*) │ │ │ ├── pest_derive v2.1.0 (*) │ │ │ ├── pulldown-cmark v0.8.0 │ │ │ │ ├── bitflags v1.2.1 │ │ │ │ ├── memchr v2.3.4 │ │ │ │ └── unicase v2.6.0 │ │ │ │ [build-dependencies] │ │ │ │ └── version_check v0.9.2 │ │ │ ├── regex v1.4.3 (*) │ │ │ ├── serde v1.0.118 │ │ │ ├── serde_derive v1.0.118 (*) │ │ │ ├── syntect v4.5.0 (*) │ │ │ ├── tera v1.6.1 (*) │ │ │ └── utils v0.1.0 (C:\Users\L\Documents\Projects\zola\components\utils) (*) │ │ ├── serde v1.0.118 │ │ ├── serde_derive v1.0.118 (*) │ │ ├── slotmap v0.4.0 │ │ ├── tera v1.6.1 (*) │ │ └── utils v0.1.0 (C:\Users\L\Documents\Projects\zola\components\utils) (*) │ ├── link_checker v0.1.0 (C:\Users\L\Documents\Projects\zola\components\link_checker) (*) │ ├── rayon v1.5.0 (*) │ ├── relative-path v1.3.2 │ ├── sass-rs v0.2.2 │ │ ├── libc v0.2.82 │ │ └── sass-sys v0.4.21 │ │ └── libc v0.2.82 │ │ [build-dependencies] │ │ ├── cc v1.0.66 │ │ ├── num_cpus v1.13.0 (*) │ │ └── pkg-config v0.3.19 │ ├── search v0.1.0 (C:\Users\L\Documents\Projects\zola\components\search) │ │ ├── ammonia v3.1.0 │ │ │ ├── html5ever v0.25.1 │ │ │ │ ├── log v0.4.11 (*) │ │ │ │ ├── mac v0.1.1 │ │ │ │ └── markup5ever v0.10.0 │ │ │ │ ├── log v0.4.11 (*) │ │ │ │ ├── phf v0.8.0 (*) │ │ │ │ ├── string_cache v0.8.1 │ │ │ │ │ ├── lazy_static v1.4.0 │ │ │ │ │ ├── new_debug_unreachable v1.0.4 │ │ │ │ │ ├── phf_shared v0.8.0 (*) │ │ │ │ │ ├── precomputed-hash v0.1.1 │ │ │ │ │ └── serde v1.0.118 │ │ │ │ └── tendril v0.4.2 │ │ │ │ ├── futf v0.1.4 │ │ │ │ │ ├── mac v0.1.1 │ │ │ │ │ └── new_debug_unreachable v1.0.4 │ │ │ │ ├── mac v0.1.1 │ │ │ │ └── utf-8 v0.7.5 │ │ │ │ [build-dependencies] │ │ │ │ ├── phf_codegen v0.8.0 │ │ │ │ │ ├── phf_generator v0.8.0 │ │ │ │ │ │ ├── phf_shared v0.8.0 (*) │ │ │ │ │ │ └── rand v0.7.3 │ │ │ │ │ │ ├── getrandom v0.1.16 │ │ │ │ │ │ │ └── cfg-if v1.0.0 │ │ │ │ │ │ ├── rand_chacha v0.2.2 │ │ │ │ │ │ │ ├── ppv-lite86 v0.2.10 │ │ │ │ │ │ │ └── rand_core v0.5.1 │ │ │ │ │ │ │ └── getrandom v0.1.16 (*) │ │ │ │ │ │ ├── rand_core v0.5.1 (*) │ │ │ │ │ │ └── rand_pcg v0.2.1 │ │ │ │ │ │ └── rand_core v0.5.1 (*) │ │ │ │ │ └── phf_shared v0.8.0 (*) │ │ │ │ ├── serde v1.0.118 │ │ │ │ ├── serde_derive v1.0.118 (*) │ │ │ │ ├── serde_json v1.0.61 (*) │ │ │ │ └── string_cache_codegen v0.5.1 │ │ │ │ ├── phf_generator v0.8.0 (*) │ │ │ │ ├── phf_shared v0.8.0 (*) │ │ │ │ ├── proc-macro2 v1.0.24 (*) │ │ │ │ └── quote v1.0.8 (*) │ │ │ │ [build-dependencies] │ │ │ │ ├── proc-macro2 v1.0.24 (*) │ │ │ │ ├── quote v1.0.8 (*) │ │ │ │ └── syn v1.0.58 (*) │ │ │ ├── lazy_static v1.4.0 │ │ │ ├── maplit v1.0.2 │ │ │ ├── markup5ever_rcdom v0.1.0 │ │ │ │ ├── html5ever v0.25.1 (*) │ │ │ │ ├── markup5ever v0.10.0 (*) │ │ │ │ ├── tendril v0.4.2 (*) │ │ │ │ └── xml5ever v0.16.1 │ │ │ │ ├── log v0.4.11 (*) │ │ │ │ ├── mac v0.1.1 │ │ │ │ ├── markup5ever v0.10.0 (*) │ │ │ │ └── time v0.1.43 (*) │ │ │ ├── matches v0.1.8 │ │ │ ├── tendril v0.4.2 (*) │ │ │ └── url v2.2.0 (*) │ │ ├── config v0.1.0 (C:\Users\L\Documents\Projects\zola\components\config) (*) │ │ ├── elasticlunr-rs v2.3.9 │ │ │ ├── lazy_static v1.4.0 │ │ │ ├── regex v1.4.3 (*) │ │ │ ├── rust-stemmers v1.2.0 │ │ │ │ ├── serde v1.0.118 │ │ │ │ └── serde_derive v1.0.118 (*) │ │ │ ├── serde v1.0.118 │ │ │ ├── serde_derive v1.0.118 (*) │ │ │ ├── serde_json v1.0.61 (*) │ │ │ ├── strum v0.18.0 │ │ │ └── strum_macros v0.18.0 │ │ │ ├── heck v0.3.2 │ │ │ │ └── unicode-segmentation v1.7.1 │ │ │ ├── proc-macro2 v1.0.24 (*) │ │ │ ├── quote v1.0.8 (*) │ │ │ └── syn v1.0.58 (*) │ │ ├── errors v0.1.0 (C:\Users\L\Documents\Projects\zola\components\errors) (*) │ │ ├── lazy_static v1.4.0 │ │ └── library v0.1.0 (C:\Users\L\Documents\Projects\zola\components\library) (*) │ ├── serde v1.0.118 │ ├── serde_derive v1.0.118 (*) │ ├── slotmap v0.4.0 │ ├── templates v0.1.0 (C:\Users\L\Documents\Projects\zola\components\templates) │ │ ├── base64 v0.13.0 │ │ ├── config v0.1.0 (C:\Users\L\Documents\Projects\zola\components\config) (*) │ │ ├── csv v1.1.5 │ │ │ ├── bstr v0.2.14 (*) │ │ │ ├── csv-core v0.1.10 │ │ │ │ └── memchr v2.3.4 │ │ │ ├── itoa v0.4.7 │ │ │ ├── ryu v1.0.5 │ │ │ └── serde v1.0.118 │ │ ├── errors v0.1.0 (C:\Users\L\Documents\Projects\zola\components\errors) (*) │ │ ├── image v0.23.12 (*) │ │ ├── imageproc v0.1.0 (C:\Users\L\Documents\Projects\zola\components\imageproc) (*) │ │ ├── lazy_static v1.4.0 │ │ ├── library v0.1.0 (C:\Users\L\Documents\Projects\zola\components\library) (*) │ │ ├── nom-bibtex v0.3.0 │ │ │ ├── nom v5.1.2 │ │ │ │ ├── lexical-core v0.7.4 │ │ │ │ │ ├── arrayvec v0.5.2 │ │ │ │ │ ├── bitflags v1.2.1 │ │ │ │ │ ├── cfg-if v0.1.10 │ │ │ │ │ ├── ryu v1.0.5 │ │ │ │ │ └── static_assertions v1.1.0 │ │ │ │ └── memchr v2.3.4 │ │ │ │ [build-dependencies] │ │ │ │ └── version_check v0.9.2 │ │ │ ├── nom-tracable v0.5.2 │ │ │ │ ├── nom v5.1.2 (*) │ │ │ │ ├── nom-tracable-macros v0.5.2 │ │ │ │ │ ├── quote v1.0.8 (*) │ │ │ │ │ └── syn v1.0.58 (*) │ │ │ │ ├── nom_locate v1.0.0 │ │ │ │ │ ├── bytecount v0.3.2 │ │ │ │ │ ├── memchr v2.3.4 │ │ │ │ │ └── nom v5.1.2 (*) │ │ │ │ └── nom_locate v2.1.0 │ │ │ │ ├── bytecount v0.6.2 │ │ │ │ ├── memchr v2.3.4 │ │ │ │ └── nom v5.1.2 (*) │ │ │ ├── nom_locate v2.1.0 (*) │ │ │ └── quick-error v1.2.3 │ │ ├── rendering v0.1.0 (C:\Users\L\Documents\Projects\zola\components\rendering) (*) │ │ ├── reqwest v0.11.0 (*) │ │ ├── serde_json v1.0.61 (*) │ │ ├── sha2 v0.9.2 │ │ │ ├── block-buffer v0.9.0 │ │ │ │ └── generic-array v0.14.4 │ │ │ │ └── typenum v1.12.0 │ │ │ │ [build-dependencies] │ │ │ │ └── version_check v0.9.2 │ │ │ ├── cfg-if v1.0.0 │ │ │ ├── cpuid-bool v0.1.2 │ │ │ ├── digest v0.9.0 │ │ │ │ └── generic-array v0.14.4 (*) │ │ │ └── opaque-debug v0.3.0 │ │ ├── svg_metadata v0.4.2 │ │ │ ├── doc-comment v0.3.3 │ │ │ ├── lazy_static v1.4.0 │ │ │ ├── regex v1.4.3 (*) │ │ │ └── roxmltree v0.13.1 │ │ │ └── xmlparser v0.13.3 │ │ ├── tera v1.6.1 (*) │ │ ├── toml v0.5.8 (*) │ │ ├── url v2.2.0 (*) │ │ └── utils v0.1.0 (C:\Users\L\Documents\Projects\zola\components\utils) (*) │ ├── tera v1.6.1 (*) │ ├── utils v0.1.0 (C:\Users\L\Documents\Projects\zola\components\utils) (*) │ └── walkdir v2.3.1 (*) ├── termcolor v1.1.2 │ └── winapi-util v0.1.5 (*) ├── tokio v1.0.1 (*) ├── url v2.2.0 (*) ├── utils v0.1.0 (C:\Users\L\Documents\Projects\zola\components\utils) (*) └── ws v0.9.1 ├── byteorder v1.4.2 ├── bytes v0.4.12 │ ├── byteorder v1.4.2 │ └── iovec v0.1.4 ├── httparse v1.3.4 ├── log v0.4.11 (*) ├── mio v0.6.23 │ ├── cfg-if v0.1.10 │ ├── iovec v0.1.4 │ ├── kernel32-sys v0.2.2 │ │ └── winapi v0.2.8 │ │ [build-dependencies] │ │ └── winapi-build v0.1.1 │ ├── log v0.4.11 (*) │ ├── miow v0.2.2 │ │ ├── kernel32-sys v0.2.2 (*) │ │ ├── net2 v0.2.37 │ │ │ ├── cfg-if v0.1.10 │ │ │ └── winapi v0.3.9 │ │ ├── winapi v0.2.8 │ │ └── ws2_32-sys v0.2.1 │ │ └── winapi v0.2.8 │ │ [build-dependencies] │ │ └── winapi-build v0.1.1 │ ├── net2 v0.2.37 (*) │ ├── slab v0.4.2 │ └── winapi v0.2.8 ├── mio-extras v2.0.6 │ ├── lazycell v1.3.0 │ ├── log v0.4.11 (*) │ ├── mio v0.6.23 (*) │ └── slab v0.4.2 ├── rand v0.7.3 (*) ├── sha-1 v0.8.2 (*) ├── slab v0.4.2 └── url v2.2.0 (*) [build-dependencies] └── clap v2.33.3 (*) ```

File download: tinybugrepro.zip

>>> a = open('input_bytes.html', 'rb').read()
>>> b = open('with_friendly_error.html', 'rb').read()
>>> import hashlib
>>> hashlib.sha256(a).hexdigest()
'795b9be2b2e3077f3ec33e453f11135c6fd1a796b003f004aa9efef883732b31'
>>> hashlib.sha256(b).hexdigest()
'f89843344cd103c5d28f1c8456ac377e47073cccfe69f2d38530f30f73623eb5'

The following minimal code fails:

const BYTES: &[u8] = include_bytes!("../with_friendly_error.html");

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test() {
        std::str::from_utf8(BYTES).unwrap();
    }
}

The culprit seems to be with_friendly_error.

Keats commented 3 years ago

Use the next branch for testing, it already has some fixes in it I believe.

Lonami commented 3 years ago

Welp, checking out next and running cargo update; cargo build --release and testing that build seems to work. I'm not gonna recover these weekend hours, but I guess it can be considered fixed, so yay?

Keats commented 3 years ago

Sorry about that :(

michaellenaghan commented 3 years ago

Not sure if it's clear from the discussion, but this problem isn't actually related to CJK text. For example, right now I'm getting the same error just by adding a character like "." or "/" to an HTML element.

Keats commented 3 years ago

Yeah, it was just slicing on the wrong thing in the current release...

lae commented 3 years ago

It's not, but it becomes strongly apparent with CJK websites. There wasn't really any discussion to clarify it was a multibyte character issue because I submitted a PR shortly afterwards.

oltdaniel commented 3 years ago

I could reproduce the error Error: Failed to convert bytes to string : invalid utf-8 sequence of 1 bytes from index ... just by using a simple &copy;. Should this still happen in zola v0.13?

Keats commented 3 years ago

Yep, it should be fixed in the next release (0.14) but it is an issue on 0.13

t3link commented 3 years ago

It seems that I have the same problem 😂

In my case, when minify_html enabled , zola serve always runs fine, while zola build gets an error Failed to convert bytes to string : invalid utf-8 sequence of 1 bytes from index. And both works well after disable minify_html.

Reproduce: enable minify && disable minify

using zola 0.13.0 downloaded from the release url.


Updated: I've tested the next branch with commit https://github.com/getzola/zola/commit/534174ae78e36def4ac3cd98c2c2f0b683870a15. zola build works fine with minify_html enabled. hh, Also I find the front matter regex required an additional \n in 0.14.0 https://github.com/getzola/zola/blob/534174ae78e36def4ac3cd98c2c2f0b683870a15/components/front_matter/src/lib.rs#L18.