diff --git a/.gitignore b/.gitignore index 9c5a16b..13d5c59 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ /target -/screenshots -notes +/site diff --git a/Cargo.lock b/Cargo.lock index 60a13ca..b6960c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,47 +11,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "async-stream" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171374e7e3b2504e0e5236e3b59260560f9fe94bfe9ac39ba5e4e929c5590625" -dependencies = [ - "async-stream-impl", - "futures-core", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "648ed8c8d2ce5409ccd57453d9d1b214b342a0d69376a6feda1fd6cae3299308" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "async-trait" -version = "0.1.51" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44318e776df68115a881de9a8fd1b9e53368d7a4a5ce4cc48517da3393233a5e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "atom_syndication" version = "0.9.1" @@ -64,116 +23,12 @@ dependencies = [ "quick-xml", ] -[[package]] -name = "atomic" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3410529e8288c463bedb5930f82833bc0c90e5d2fe639a56582a4d09220b281" -dependencies = [ - "autocfg", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi 0.3.9", -] - [[package]] name = "autocfg" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" -[[package]] -name = "base-x" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" - -[[package]] -name = "binascii" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding", - "byte-tools", - "byteorder", - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", -] - -[[package]] -name = "bstr" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" -dependencies = [ - "memchr", -] - -[[package]] -name = "bumpalo" -version = "3.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1e260c3a9040a7c19a12468758f4c16f31a81a1fe087482be9570ec864bb6c" - -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" - -[[package]] -name = "cc" -version = "1.0.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79c2681d6594606957bbb8631c4b90a7fcaaa72cdb714743a437b156d6a7eedd" - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - [[package]] name = "cfg-if" version = "1.0.0" @@ -189,57 +44,8 @@ dependencies = [ "libc", "num-integer", "num-traits", - "time 0.1.43", - "winapi 0.3.9", -] - -[[package]] -name = "chrono-tz" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c01c1c607d25c71bbaa67c113d6c6b36c434744b4fd66691d711b5b1bc0c8b" -dependencies = [ - "chrono", - "chrono-tz-build", - "phf", -] - -[[package]] -name = "chrono-tz-build" -version = "0.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db058d493fb2f65f41861bfed7e3fe6335264a9f0f92710cab5bdf01fef09069" -dependencies = [ - "parse-zoneinfo", - "phf", - "phf_codegen", -] - -[[package]] -name = "const_fn" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f92cfa0fd5690b3cf8c1ef2cabbd9b7ef22fa53cf5e1f92b05103f6d5d1cf6e7" - -[[package]] -name = "cookie" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f1c7727e460397e56abc4bddc1d49e07a1ad78fc98eb2e1c8f032a58a2f80d" -dependencies = [ - "percent-encoding", - "time 0.2.27", - "version_check", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" -dependencies = [ - "cfg-if 1.0.0", - "lazy_static", + "time", + "winapi", ] [[package]] @@ -302,54 +108,6 @@ dependencies = [ "syn", ] -[[package]] -name = "deunicode" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "850878694b7933ca4c9569d30a34b55031b9b139ee1fc7b94a527c4ef960d690" - -[[package]] -name = "devise" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c7580b072f1c8476148f16e0a0d5dedddab787da98d86c5082c5e9ed8ab595" -dependencies = [ - "devise_codegen", - "devise_core", -] - -[[package]] -name = "devise_codegen" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "123c73e7a6e51b05c75fe1a1b2f4e241399ea5740ed810b0e3e6cacd9db5e7b2" -dependencies = [ - "devise_core", - "quote", -] - -[[package]] -name = "devise_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841ef46f4787d9097405cac4e70fb8644fc037b526e8c14054247c0263c400d0" -dependencies = [ - "bitflags", - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn", -] - -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array", -] - [[package]] name = "diligent-date-parser" version = "0.1.3" @@ -359,57 +117,13 @@ dependencies = [ "chrono", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" - -[[package]] -name = "either" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" - [[package]] name = "encoding_rs" version = "0.8.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a74ea89a0a1b98f6332de42c95baff457ada66d1cb4030f9ff151b2041a1c746" dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - -[[package]] -name = "figment" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790b4292c72618abbab50f787a477014fe15634f96291de45672ce46afe122df" -dependencies = [ - "atomic", - "pear", - "serde", - "toml", - "uncased", - "version_check", -] - -[[package]] -name = "filetime" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "redox_syscall", - "winapi 0.3.9", + "cfg-if", ] [[package]] @@ -418,456 +132,17 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "fsevent" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6" -dependencies = [ - "bitflags", - "fsevent-sys", -] - -[[package]] -name = "fsevent-sys" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0" -dependencies = [ - "libc", -] - -[[package]] -name = "fuchsia-zircon" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" -dependencies = [ - "bitflags", - "fuchsia-zircon-sys", -] - -[[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" - -[[package]] -name = "futures" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12aa0eb539080d55c3f2d45a67c3b58b6b0773c1a3ca2dfec66d58c97fd66ca" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d" - -[[package]] -name = "futures-executor" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45025be030969d763025784f7f355043dc6bc74093e4ecc5000ca4dc50d8745c" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377" - -[[package]] -name = "futures-macro" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb" -dependencies = [ - "autocfg", - "proc-macro-hack", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "futures-sink" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11" - -[[package]] -name = "futures-task" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99" - -[[package]] -name = "futures-util" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481" -dependencies = [ - "autocfg", - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "proc-macro-hack", - "proc-macro-nested", - "slab", -] - -[[package]] -name = "generator" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1d9279ca822891c1a4dae06d185612cf8fc6acfe5dff37781b41297811b12ee" -dependencies = [ - "cc", - "libc", - "log", - "rustversion", - "winapi 0.3.9", -] - -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - -[[package]] -name = "getrandom" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "wasi", -] - -[[package]] -name = "glob" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" - -[[package]] -name = "globset" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd" -dependencies = [ - "aho-corasick", - "bstr", - "fnv", - "log", - "regex", -] - -[[package]] -name = "globwalk" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" -dependencies = [ - "bitflags", - "ignore", - "walkdir", -] - -[[package]] -name = "h2" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd819562fcebdac5afc5c113c3ec36f902840b70fd4fc458799c8ce4607ae55" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "http" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1323096b05d41827dadeaee54c9981958c0f94e670bc94ed80037d1a7b8b186b" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" - -[[package]] -name = "httpdate" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440" - -[[package]] -name = "humansize" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02296996cb8796d7c6e3bc2d9211b7802812d36999a51bb754123ead7d37d026" - -[[package]] -name = "hyper" -version = "0.14.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b91bb1f221b6ea1f1e4371216b70f40748774c2fb5971b450c07773fb92d26b" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "ident_case" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "ignore" -version = "0.4.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d" -dependencies = [ - "crossbeam-utils", - "globset", - "lazy_static", - "log", - "memchr", - "regex", - "same-file", - "thread_local", - "walkdir", - "winapi-util", -] - -[[package]] -name = "indexmap" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" -dependencies = [ - "autocfg", - "hashbrown", - "serde", -] - -[[package]] -name = "inlinable_string" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3094308123a0e9fd59659ce45e22de9f53fc1d2ac6e1feb9fef988e4f76cad77" - -[[package]] -name = "inotify" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4816c66d2c8ae673df83366c18341538f234a26d65a9ecea5c348b453ac1d02f" -dependencies = [ - "bitflags", - "inotify-sys", - "libc", -] - -[[package]] -name = "inotify-sys" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" -dependencies = [ - "libc", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "iovec" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -dependencies = [ - "libc", -] - -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "libc" -version = "0.2.105" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "869d572136620d55835903746bcb5cdc54cb2851fd0aeec53220b4bb65ef3013" - -[[package]] -name = "lock_api" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "loom" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b9df80a3804094bf49bb29881d18f6f05048db72127e84e09c26fc7c2324f5" -dependencies = [ - "cfg-if 1.0.0", - "generator", - "scoped-tls", - "serde", - "serde_json", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - -[[package]] -name = "matchers" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" -dependencies = [ - "regex-automata", -] +checksum = "8521a1b57e76b1ec69af7599e75e38e7b7fad6610f037db8c79b127201b5d119" [[package]] name = "memchr" @@ -875,179 +150,6 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" -[[package]] -name = "mime" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" - -[[package]] -name = "mini-internal" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac2f0e3cdd28b81bf077f464771717698e7ae3f0321c0086dd7ad241d6085ce7" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "miniserde" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a116a35523bbd5b1712cefda270a03d1481263a114b6705cb1f02692651f76f" -dependencies = [ - "itoa", - "mini-internal", - "ryu", -] - -[[package]] -name = "mio" -version = "0.6.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" -dependencies = [ - "cfg-if 0.1.10", - "fuchsia-zircon", - "fuchsia-zircon-sys", - "iovec", - "kernel32-sys", - "libc", - "log", - "miow 0.2.2", - "net2", - "slab", - "winapi 0.2.8", -] - -[[package]] -name = "mio" -version = "0.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" -dependencies = [ - "libc", - "log", - "miow 0.3.7", - "ntapi", - "winapi 0.3.9", -] - -[[package]] -name = "mio-extras" -version = "2.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" -dependencies = [ - "lazycell", - "log", - "mio 0.6.23", - "slab", -] - -[[package]] -name = "miow" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" -dependencies = [ - "kernel32-sys", - "net2", - "winapi 0.2.8", - "ws2_32-sys", -] - -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "multer" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "408327e2999b839cd1af003fc01b2019a6c10a1361769542203f6fedc5179680" -dependencies = [ - "bytes", - "encoding_rs", - "futures-util", - "http", - "httparse", - "log", - "mime", - "spin", - "tokio", - "tokio-util", - "twoway", - "version_check", -] - -[[package]] -name = "mycelial_technology" -version = "0.2.0" -dependencies = [ - "log", - "miniserde", - "regex", - "rocket", - "rocket_dyn_templates", - "rss", - "tera", -] - -[[package]] -name = "net2" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" -dependencies = [ - "cfg-if 0.1.10", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "normpath" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "640c20e9df4a2d4a5adad5b47e17d76dac3e824346b181931c3ec9f7a85687b1" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "notify" -version = "4.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae03c8c853dba7bfd23e571ff0cff7bc9dceb40a4cd684cd1681824183f45257" -dependencies = [ - "bitflags", - "filetime", - "fsevent", - "fsevent-sys", - "inotify", - "libc", - "mio 0.6.23", - "mio-extras", - "walkdir", - "winapi 0.3.9", -] - -[[package]] -name = "ntapi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "num-integer" version = "0.1.44" @@ -1067,203 +169,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "once_cell" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" - -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" -dependencies = [ - "cfg-if 1.0.0", - "instant", - "libc", - "redox_syscall", - "smallvec", - "winapi 0.3.9", -] - -[[package]] -name = "parse-zoneinfo" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" -dependencies = [ - "regex", -] - -[[package]] -name = "pear" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e44241c5e4c868e3eaa78b7c1848cadd6344ed4f54d029832d32b415a58702" -dependencies = [ - "inlinable_string", - "pear_codegen", - "yansi", -] - -[[package]] -name = "pear_codegen" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a5ca643c2303ecb740d506539deba189e16f2754040a42901cd8105d0282d0" -dependencies = [ - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn", -] - -[[package]] -name = "percent-encoding" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" - -[[package]] -name = "pest" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" -dependencies = [ - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pest_meta" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" -dependencies = [ - "maplit", - "pest", - "sha-1", -] - -[[package]] -name = "phf" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9fc3db1018c4b59d7d582a739436478b6035138b6aecbce989fc91c3e98409f" -dependencies = [ - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" -dependencies = [ - "phf_shared", - "rand", -] - -[[package]] -name = "phf_shared" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" -dependencies = [ - "siphasher", - "uncased", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "ppv-lite86" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" - -[[package]] -name = "proc-macro-hack" -version = "0.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" - -[[package]] -name = "proc-macro-nested" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" - [[package]] name = "proc-macro2" version = "1.0.32" @@ -1273,19 +178,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "proc-macro2-diagnostics" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "version_check", - "yansi", -] - [[package]] name = "quick-xml" version = "0.20.0" @@ -1305,75 +197,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", - "rand_hc", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core", -] - -[[package]] -name = "redox_syscall" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" -dependencies = [ - "bitflags", -] - -[[package]] -name = "ref-cast" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "300f2a835d808734ee295d45007adacb9ebb29dd3ae2424acfa17930cae541da" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c38e3aecd2b21cb3959637b883bb3714bc7e43f0268b9a29d3743ee3e55cdd2" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "regex" version = "1.5.4" @@ -1385,127 +208,12 @@ dependencies = [ "regex-syntax", ] -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax", -] - [[package]] name = "regex-syntax" version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "rocket" -version = "0.5.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a71c18c42a0eb15bf3816831caf0dad11e7966f2a41aaf486a701979c4dd1f2" -dependencies = [ - "async-stream", - "async-trait", - "atomic", - "atty", - "binascii", - "bytes", - "either", - "figment", - "futures", - "indexmap", - "log", - "memchr", - "multer", - "num_cpus", - "parking_lot", - "pin-project-lite", - "rand", - "ref-cast", - "rocket_codegen", - "rocket_http", - "serde", - "state", - "tempfile", - "time 0.2.27", - "tokio", - "tokio-stream", - "tokio-util", - "ubyte", - "version_check", - "yansi", -] - -[[package]] -name = "rocket_codegen" -version = "0.5.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66f5fa462f7eb958bba8710c17c5d774bbbd59809fa76fb1957af7e545aea8bb" -dependencies = [ - "devise", - "glob", - "indexmap", - "proc-macro2", - "quote", - "rocket_http", - "syn", - "unicode-xid", -] - -[[package]] -name = "rocket_dyn_templates" -version = "0.1.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c83f1287ad8fa034410928297a91db37518d5c46d7cc7e1e1b4a77aec0cd8807" -dependencies = [ - "glob", - "normpath", - "notify", - "rocket", - "serde", - "serde_json", - "tera", -] - -[[package]] -name = "rocket_http" -version = "0.5.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23c8b7d512d2fcac2316ebe590cde67573844b99e6cc9ee0f53375fa16e25ebd" -dependencies = [ - "cookie", - "either", - "http", - "hyper", - "indexmap", - "log", - "memchr", - "mime", - "parking_lot", - "pear", - "percent-encoding", - "pin-project-lite", - "ref-cast", - "serde", - "smallvec", - "stable-pattern", - "state", - "time 0.2.27", - "tokio", - "uncased", -] - [[package]] name = "rss" version = "1.10.0" @@ -1517,249 +225,6 @@ dependencies = [ "quick-xml", ] -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] - -[[package]] -name = "rustversion" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" - -[[package]] -name = "ryu" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "scoped-tls" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - -[[package]] -name = "serde" -version = "1.0.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha-1" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" -dependencies = [ - "block-buffer", - "digest", - "fake-simd", - "opaque-debug", -] - -[[package]] -name = "sha1" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" - -[[package]] -name = "sharded-slab" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" -dependencies = [ - "libc", -] - -[[package]] -name = "siphasher" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533494a8f9b724d33625ab53c6c4800f7cc445895924a8ef649222dcb76e938b" - -[[package]] -name = "slab" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" - -[[package]] -name = "slug" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bc762e6a4b6c6fcaade73e77f9ebc6991b676f88bb2358bddb56560f073373" -dependencies = [ - "deunicode", -] - -[[package]] -name = "smallvec" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" - -[[package]] -name = "socket2" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516" -dependencies = [ - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "spin" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "511254be0c5bcf062b019a6c89c01a664aa359ded62f78aa72c6fc137c0590e5" - -[[package]] -name = "stable-pattern" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045" -dependencies = [ - "memchr", -] - -[[package]] -name = "standback" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" -dependencies = [ - "version_check", -] - -[[package]] -name = "state" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cf4f5369e6d3044b5e365c9690f451516ac8f0954084622b49ea3fde2f6de5" -dependencies = [ - "loom", -] - -[[package]] -name = "stdweb" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" -dependencies = [ - "discard", - "rustc_version", - "stdweb-derive", - "stdweb-internal-macros", - "stdweb-internal-runtime", - "wasm-bindgen", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "serde_derive", - "syn", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" -dependencies = [ - "base-x", - "proc-macro2", - "quote", - "serde", - "serde_derive", - "serde_json", - "sha1", - "syn", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" - [[package]] name = "strsim" version = "0.9.3" @@ -1777,345 +242,15 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "tempfile" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "rand", - "redox_syscall", - "remove_dir_all", - "winapi 0.3.9", -] - -[[package]] -name = "tera" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed0c0eee8fbbbaab449287574b292f21ca53224b92a07b4a23266b77376f0ce7" -dependencies = [ - "chrono", - "chrono-tz", - "globwalk", - "humansize", - "lazy_static", - "percent-encoding", - "pest", - "pest_derive", - "rand", - "regex", - "serde", - "serde_json", - "slug", - "unic-segment", -] - -[[package]] -name = "thread_local" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" -dependencies = [ - "once_cell", -] - [[package]] name = "time" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", - "winapi 0.3.9", -] - -[[package]] -name = "time" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242" -dependencies = [ - "const_fn", - "libc", - "standback", - "stdweb", - "time-macros", - "version_check", - "winapi 0.3.9", -] - -[[package]] -name = "time-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" -dependencies = [ - "proc-macro-hack", - "time-macros-impl", -] - -[[package]] -name = "time-macros-impl" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" -dependencies = [ - "proc-macro-hack", - "proc-macro2", - "quote", - "standback", - "syn", -] - -[[package]] -name = "tokio" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "588b2d10a336da58d877567cd8fb8a14b463e2104910f8132cd054b4b96e29ee" -dependencies = [ - "autocfg", - "bytes", - "libc", - "memchr", - "mio 0.7.14", - "num_cpus", - "once_cell", - "pin-project-lite", - "signal-hook-registry", - "tokio-macros", - "winapi 0.3.9", -] - -[[package]] -name = "tokio-macros" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "114383b041aa6212c579467afa0075fbbdd0718de036100bc0ba7961d8cb9095" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tokio-stream" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "log", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" -dependencies = [ - "serde", -] - -[[package]] -name = "tower-service" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" - -[[package]] -name = "tracing" -version = "0.1.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" -dependencies = [ - "cfg-if 1.0.0", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tracing-core" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "tracing-log" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3" -dependencies = [ - "lazy_static", - "log", - "tracing-core", -] - -[[package]] -name = "tracing-serde" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb65ea441fbb84f9f6748fd496cf7f63ec9af5bca94dd86456978d055e8eb28b" -dependencies = [ - "serde", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "ansi_term", - "chrono", - "lazy_static", - "matchers", - "regex", - "serde", - "serde_json", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", - "tracing-serde", -] - -[[package]] -name = "try-lock" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" - -[[package]] -name = "twoway" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c57ffb460d7c24cd6eda43694110189030a3d1dfe418416d9468fd1c1d290b47" -dependencies = [ - "memchr", - "unchecked-index", -] - -[[package]] -name = "typenum" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" - -[[package]] -name = "ubyte" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42756bb9e708855de2f8a98195643dff31a97f0485d90d8467b39dc24be9e8fe" -dependencies = [ - "serde", -] - -[[package]] -name = "ucd-trie" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" - -[[package]] -name = "uncased" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baeed7327e25054889b9bd4f975f32e5f4c5d434042d59ab6cd4142c0a76ed0" -dependencies = [ - "serde", - "version_check", -] - -[[package]] -name = "unchecked-index" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeba86d422ce181a719445e51872fa30f1f7413b62becb52e95ec91aa262d85c" - -[[package]] -name = "unic-char-property" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" -dependencies = [ - "unic-char-range", -] - -[[package]] -name = "unic-char-range" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" - -[[package]] -name = "unic-common" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" - -[[package]] -name = "unic-segment" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23" -dependencies = [ - "unic-ucd-segment", -] - -[[package]] -name = "unic-ucd-segment" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700" -dependencies = [ - "unic-char-property", - "unic-char-range", - "unic-ucd-version", -] - -[[package]] -name = "unic-ucd-version" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" -dependencies = [ - "unic-common", + "wasi", + "winapi", ] [[package]] @@ -2124,99 +259,20 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" -[[package]] -name = "version_check" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" - -[[package]] -name = "walkdir" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" -dependencies = [ - "same-file", - "winapi 0.3.9", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" -dependencies = [ - "log", - "try-lock", -] - [[package]] name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" +version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" [[package]] -name = "wasm-bindgen" -version = "0.2.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +name = "website" +version = "0.3.0" dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", + "regex", + "rss", ] -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" -dependencies = [ - "bumpalo", - "lazy_static", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.78" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" - -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" - [[package]] name = "winapi" version = "0.3.9" @@ -2227,45 +283,14 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "ws2_32-sys" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - -[[package]] -name = "yansi" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc79f4a1e39857fc00c3f662cbf2651c771f00e9c15fe2abc341806bd46bd71" diff --git a/Cargo.toml b/Cargo.toml index 9e301d8..537c3e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,14 +1,17 @@ [package] -name = "mycelial_technology" -version = "0.2.0" +name = "website" +version = "0.3.0" authors = ["glyph "] edition = "2018" +description = "glyph's personal website, html splicer and rss generator" +repository = "https://git.coopcloud.tech/glyph/website" [dependencies] -log = "0.4" regex = "1" -rocket = "0.5.0-rc.1" -rocket_dyn_templates = { version = "0.1.0-rc.1", features = ["tera"] } rss = "1" -miniserde = "0.1" -tera = "1" + +# optimize for size +[profile.release] +lto = true +opt-level = "z" +panic = "abort" diff --git a/README.md b/README.md index 088831d..a81f055 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,28 @@ # mycelial.technology -Personal website of glyph. +_glyph's website_ -Handwritten HTML and CSS organised into templates ([Tera](https://tera.netlify.app/)), served with [Rocket](https://rocket.rs/) and proxied through Nginx. +Handwritten CSS and HTML, images, an HTML splicer and an RSS generator. -Includes a custom RSS generator (`src/bin/generate_rss.rs`). +## Static Site Generator + +`src/main.rs` + +An opinionated, custom-built HTML splicer. It reads HTML templates, splices them into a base template and writes the output. + +Templates are expected at `./templates` and output is written to `./site`. The `./site` directory will be created if it doesn't exist. + +A base template is expected at `./templates/base.html`. It must contain two tags: `[[ title ]]` and `[[ content ]]`. + +The root index template is expected at `./templates/index.html`. All other templates are expected to be in sub-directories; for example: `./templates/plants/index.html` or `./templates/fungi/entomopathogens.html`. + +The splicer crawls the sub-directories of `./templates`, reads each HTML file, splices it into the `[[ content ]]` tag of the base HTML template and writes the output to the `./site` directory (preserving the sub-directory structure). The contents of the `

` element are spliced into the `[[ title ]]` tag of the base HTML template for each sub-directory template. + +## RSS Generator + +`src/bin/generate_rss.rs` + +A custom RSS generator. It crawls the template sub-directories containing articles for syndication, extracts relevant information and writes the items to `./static/feed.rss`. ## License diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..45ead30 --- /dev/null +++ b/build.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +echo "[ compiling binaries ]" +cargo build --release +echo "[ stripping binaries ]" +strip target/release/website +strip target/release/generate_rss +echo "[ compressing binaries ]" +upx target/release/website +upx target/release/generate_rss diff --git a/src/bin/generate_rss.rs b/src/bin/generate_rss.rs index f62cb74..ba8ea39 100644 --- a/src/bin/generate_rss.rs +++ b/src/bin/generate_rss.rs @@ -1,12 +1,15 @@ +//! # RSS Generator +//! +//! A custom RSS generator. It crawls the template sub-directories containing +//! articles for syndication, extracts relevant information and writes the items +//! to `./static/feed.rss`. +//! extern crate regex; extern crate rss; use regex::Regex; use rss::{ChannelBuilder, Item}; -use std::error; -use std::fs; -use std::fs::File; -use std::io::prelude::*; +use std::{error, fs, fs::File, io::prelude::*}; fn main() -> Result<(), Box> { // create rss channel for mycelial.technology @@ -19,10 +22,10 @@ fn main() -> Result<(), Box> { .build()?; // list template directories containing articles for syndication - let bacteria = "./templates/bacteria"; - let computers = "./templates/computers"; - let fungi = "./templates/fungi"; - let plants = "./templates/plants"; + let bacteria = "./site/bacteria"; + let computers = "./site/computers"; + let fungi = "./site/fungi"; + let plants = "./site/plants"; // add directories to a vector let dirs = vec![bacteria, computers, fungi, plants]; @@ -39,43 +42,45 @@ fn main() -> Result<(), Box> { let entry = entry?; let path = entry.path(); - // populate item url vector from article filenames - let re_url = Regex::new("./templates/(.*).html.tera")?; - let caps_url = re_url.captures( - path.to_str() - .expect("Failed to convert file path to string slice for regex capture"), - ); - if let Some(url) = caps_url { - let article_url = url[1].replace("_", "-"); - let full_url = format!("https://mycelial.technology/{}", article_url); - urls.push(full_url); - }; + if !path.ends_with("index.html") { + // populate item url vector from article filenames + let re_url = Regex::new("./site/(.*).html")?; + let caps_url = re_url.captures( + path.to_str() + .expect("Failed to convert file path to string slice for regex capture"), + ); + if let Some(url) = caps_url { + let article_url = url[1].replace("_", "-"); + let full_url = format!("https://mycelial.technology/{}", article_url); + urls.push(full_url); + }; - // open the file (article) and read it to a string - let mut file = File::open(path)?; - let mut contents = String::new(); - file.read_to_string(&mut contents)?; + // open the file (article) and read it to a string + let mut file = File::open(path)?; + let mut contents = String::new(); + file.read_to_string(&mut contents)?; - // populate item title vector from article heading - let re_h2 = Regex::new("

(.*)

")?; - let caps_h2 = re_h2.captures(&contents); - if let Some(title) = caps_h2 { - titles.push(title[1].to_string()); - }; + // populate item title vector from article heading + let re_h2 = Regex::new("

(.*)

")?; + let caps_h2 = re_h2.captures(&contents); + if let Some(title) = caps_h2 { + titles.push(title[1].to_string()); + }; - // populate pub_date vector from first italic element in article - let re_i = Regex::new("(.*)")?; - let caps_i = re_i.captures(&contents); - if let Some(date) = caps_i { - pub_dates.push(date[1].to_string()); - }; + // populate pub_date vector from first italic element in article + let re_i = Regex::new("(.*)")?; + let caps_i = re_i.captures(&contents); + if let Some(date) = caps_i { + pub_dates.push(date[1].to_string()); + }; - // populate article content vector from article element - let re_article = Regex::new(r"
[\s\S]*
")?; - let caps_article = re_article.captures(&contents); - if let Some(content) = caps_article { - articles.push(content[0].to_string()); - }; + // populate article content vector from article element + let re_article = Regex::new(r"
[\s\S]*
")?; + let caps_article = re_article.captures(&contents); + if let Some(content) = caps_article { + articles.push(content[0].to_string()); + }; + } } } @@ -99,7 +104,7 @@ fn main() -> Result<(), Box> { channel.set_items(items); // write the channel to file - let rss_file = File::create("static/feed.rss")?; + let rss_file = File::create("./static/feed.rss")?; channel.write_to(rss_file)?; Ok(()) diff --git a/src/main.rs b/src/main.rs index 2918ae2..9600476 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,322 +1,102 @@ -#![feature(proc_macro_hygiene, decl_macro)] +//! # mycelial.technology +//! +//! _glyph's static site generator_ +//! +//! This is an opinionated, custom-built HTML splicer. It reads HTML templates, splices +//! them into a base template and writes the output. +//! +//! Templates are expected at `./templates` and output is written to `./site`. The `./site` +//! directory will be created if it doesn't exist. +//! +//! A base template is expected at `./templates/base.html`. It must contain two tags: +//! `[[ title ]]` and `[[ content ]]`. +//! +//! The root index template is expected at `./templates/index.html`. All other templates are +//! expected to be in sub-directories; for example: `./templates/plants/index.html` or +//! `./templates/fungi/entomopathogens.html`. +//! +//! The splicer crawls the sub-directories of `./templates`, reads each HTML file, splices +//! it into the `[[ content ]]` tag of the base HTML template and writes the output to the +//! `./site` directory (preserving the sub-directory structure). The contents of the `

` +//! element are spliced into the `[[ title ]]` tag of the base HTML template for each +//! sub-directory template. +//! +use std::{error, fs, io, path::Path}; -extern crate log; -#[macro_use] -extern crate rocket; -extern crate tera; +// define the path for the template directory +const TEMPLATE_DIR: &str = "./templates"; +// define the path for the generated site output +const SITE_DIR: &str = "./site"; -use miniserde::{json, Serialize}; -use rocket::{ - fs::{relative, FileServer}, - get, routes, -}; -use rocket_dyn_templates::Template; +fn main() -> Result<(), Box> { + // read the base html template to a string + let base = format!("{}/base.html", TEMPLATE_DIR); + let base_path = Path::new(&base); + let base_html = fs::read_to_string(base_path) + .expect("couldn't read from templates/base.html; does it exist?"); -#[derive(Debug, Serialize)] -struct FlashContext { - flash_name: Option, - flash_msg: Option, -} - -#[get("/art")] -fn art() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("art", json::to_string(&context)) -} - -#[get("/background")] -fn background() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("background", json::to_string(&context)) -} - -#[get("/bacteria")] -fn bacteria() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("bacteria", json::to_string(&context)) -} - -#[get("/bacteria/sauerkraut-beginnings")] -fn bacteria_sauerkraut_beginnings() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("bacteria/sauerkraut_beginnings", json::to_string(&context)) -} - -#[get("/bacteria/sauerkraut-bottled")] -fn bacteria_sauerkraut_bottled() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("bacteria/sauerkraut_bottled", json::to_string(&context)) -} - -#[get("/computers")] -fn computers() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("computers", json::to_string(&context)) -} - -#[get("/computers/esp8266-dht11")] -fn computers_esp8266_dht11() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("computers/esp8266_dht11", json::to_string(&context)) -} - -#[get("/computers/i2c-adventures")] -fn computers_i2c_adventures() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("computers/i2c_adventures", json::to_string(&context)) -} - -#[get("/computers/rust-compilation")] -fn computers_rust_compilation() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("computers/rust_compilation", json::to_string(&context)) -} - -#[get("/fungi")] -fn fungi() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("fungi", json::to_string(&context)) -} - -#[get("/fungi/design-patterns")] -fn fungi_design_patterns() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("fungi/design_patterns", json::to_string(&context)) -} - -#[get("/fungi/glossary")] -fn fungi_glossary() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("fungi/glossary", json::to_string(&context)) -} - -#[get("/fungi/grow-forests")] -fn fungi_grow_forests() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("fungi/grow_forests", json::to_string(&context)) -} - -#[get("/fungi/grow-together")] -fn fungi_grow_together() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("fungi/grow_together", json::to_string(&context)) -} - -#[get("/fungi/lichen-space")] -fn fungi_lichen_space() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("fungi/lichen_space", json::to_string(&context)) -} - -#[get("/fungi/network-resilience")] -fn fungi_network_resilience() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("fungi/network_resilience", json::to_string(&context)) -} - -#[get("/fungi/photo-guide")] -fn fungi_photo_guide() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("fungi/photo_guide", json::to_string(&context)) -} - -#[get("/fungi/reading-list")] -fn fungi_reading_list() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("fungi/reading_list", json::to_string(&context)) -} - -#[get("/")] -fn home() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("home", json::to_string(&context)) -} - -#[get("/lists")] -fn lists() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("lists", json::to_string(&context)) -} - -#[get("/meditation")] -fn meditation() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("meditation", json::to_string(&context)) -} - -#[get("/plants")] -fn plants() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("plants", json::to_string(&context)) -} - -#[get("/plants/aloe-there")] -fn plants_aloe_there() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("plants/aloe_there", json::to_string(&context)) -} - -#[get("/plants/blueberry-dance")] -fn plants_blueberry_dance() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("plants/blueberry_dance", json::to_string(&context)) -} - -#[get("/plants/botanical-deceptions")] -fn plants_botanical_deceptions() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("plants/botanical_deceptions", json::to_string(&context)) -} - -#[get("/plants/potato-tech")] -fn plants_potato_tech() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("plants/potato_tech", json::to_string(&context)) -} - -#[get("/projects")] -fn projects() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("projects", json::to_string(&context)) -} - -#[get("/support")] -fn support() -> Template { - let context = FlashContext { - flash_name: None, - flash_msg: None, - }; - Template::render("support", json::to_string(&context)) -} - -#[catch(404)] -fn not_found() -> Template { - debug!("404 Page Not Found"); - let context = FlashContext { - flash_name: Some("error".to_string()), - flash_msg: Some("No resource found for given URL".to_string()), - }; - Template::render("not_found", json::to_string(&context)) -} - -#[launch] -fn rocket() -> _ { - rocket::build() - .mount( - "/", - routes![ - art, - background, - bacteria, - bacteria_sauerkraut_beginnings, - bacteria_sauerkraut_bottled, - computers, - computers_esp8266_dht11, - computers_i2c_adventures, - computers_rust_compilation, - fungi, - fungi_design_patterns, - fungi_glossary, - fungi_grow_forests, - fungi_grow_together, - fungi_lichen_space, - fungi_network_resilience, - fungi_photo_guide, - fungi_reading_list, - home, - lists, - meditation, - plants, - plants_aloe_there, - plants_blueberry_dance, - plants_botanical_deceptions, - plants_potato_tech, - projects, - support - ], - ) - .mount("/", FileServer::from(relative!("static"))) - .register("/", catchers![not_found]) - .attach(Template::fairing()) + // read the index html template to a string + let index = format!("{}/index.html", TEMPLATE_DIR); + let index_path = Path::new(&index); + let index_html = fs::read_to_string(index_path) + .expect("couldn't read from templates/index.html; does it exist?"); + + // create site directory if it doesn't already exist + let site_dir_path = Path::new(&SITE_DIR); + if !site_dir_path.is_dir() { + fs::create_dir(site_dir_path).expect("failed to create site output directory"); + } + + // integrate the content from the index template into the base template + let mut index_output = base_html.replace("[[ content ]]", &index_html); + // set the page title + index_output = index_output.replace("[[ title ]]", "mycelial technology"); + let index_output_path = format!("{}/index.html", SITE_DIR); + // write the generated index html to file + fs::write(index_output_path, index_output.trim()) + .expect("failed to write the root index.html file"); + + // walk the template directory and collect paths for all files and sub-directories + let template_files = fs::read_dir(TEMPLATE_DIR)? + .map(|res| res.map(|e| e.path())) + .collect::, io::Error>>()?; + + // loop through each file and sub-directory + for entry in template_files { + if entry.is_dir() { + // replicate templates sub-directory structure in site output directory + let template_sub_dir_suffix = entry.strip_prefix(TEMPLATE_DIR)?; + let site_sub_dir = Path::new(SITE_DIR).join(template_sub_dir_suffix); + // create the sub-directory if it doesn't already exist + if !site_sub_dir.is_dir() { + fs::create_dir(site_sub_dir)?; + } + // read each file from the sub-diretory + for file in fs::read_dir(entry)? { + let file = file?; + let file_path = file.path(); + let file_html = fs::read_to_string(&file_path)?; + // find the index of the h2 tag (represents the page title) + let mut title_start = file_html.find("

").expect("

tag not found"); + // increment the index to represent the start of the title text + title_start += 4; + // find the index of the h2 closing tag + let title_end = file_html.find("

").expect("

tag not found"); + // obtain the title text as a string slice + let title = &file_html[title_start..title_end]; + // integrate the content from the template into the base template + let mut file_output = base_html.replace("[[ content ]]", &file_html); + // integrate the title of the page into the file output + file_output = file_output.replace("[[ title ]]", title); + // define the path to which the output html file will be written + let file_output_path = file_path.to_string_lossy(); + // replace the template directory path with the site output path + let output_path = file_output_path.replace(TEMPLATE_DIR, SITE_DIR); + // trim whitespace from the end of the generated html and write to file + fs::write(output_path, file_output.trim())? + } + } + } + + Ok(()) } diff --git a/templates/art.html.tera b/templates/art/index.html similarity index 55% rename from templates/art.html.tera rename to templates/art/index.html index 75f6ec4..ba95b60 100644 --- a/templates/art.html.tera +++ b/templates/art/index.html @@ -1,44 +1,40 @@ -{% extends "nav" %} -{% block title %}mycelial technology | art{% endblock title %} -{% block content %}

Art

2020

- Line drawing of a Japanese archer with a longbow - Pen and ink drawing of a tiger beetle with mesas and clouds in the background - Pen and ink drawing of a man standing with his hands in his pockets. He has a katana slung across his back and there are rocks scattered around and hills in the background + Line drawing of a Japanese archer with a longbow + Pen and ink drawing of a tiger beetle with mesas and clouds in the background + Pen and ink drawing of a man standing with his hands in his pockets. He has a katana slung across his back and there are rocks scattered around and hills in the background
- Inked portrait of a beautiful young person - Black and white event poster of a spacecraft, astronaut and planet - Line drawing of a woman in a hooded parka + Inked portrait of a beautiful young person + Black and white event poster of a spacecraft, astronaut and planet + Line drawing of a woman in a hooded parka

2019

- Line drawing of a humyn skull with mushrooms growing from it and text beneath reading 'Death is not the End' - Line drawing of a monk ringing a bell - Line drawing of a man playing shakuhachi + Line drawing of a humyn skull with mushrooms growing from it and text beneath reading 'Death is not the End' + Line drawing of a monk ringing a bell + Line drawing of a man playing shakuhachi
- Line drawing of a pitcher plant - Line drawing of a birch polypore mushroom with icicles growing from a birch tree - Line drawing of a paper wasp on a small nest + Line drawing of a pitcher plant + Line drawing of a birch polypore mushroom with icicles growing from a birch tree + Line drawing of a paper wasp on a small nest
- Line drawing of a young man standing next to a tree with mushrooms growing on it - Line drawing of a physalis fruit - Line drawing of a humyn hand reaching out to touch a mycelial network + Line drawing of a young man standing next to a tree with mushrooms growing on it + Line drawing of a physalis fruit + Line drawing of a humyn hand reaching out to touch a mycelial network

2018

- Line drawing of an aloe plant - Line drawing of an American kestrel - Line drawing of a black oval surrounded by two rings of glyphs + Line drawing of an aloe plant + Line drawing of an American kestrel + Line drawing of a black oval surrounded by two rings of glyphs
- Line drawing of a mountain with a teardrop-shaped symbol above it, with mountains and clouds in the background - Line drawing of an ant with a long, antenna-like mushroom growing from its thorax - Line drawing of a meditating figure with haloes of glyphs surrounding them + Line drawing of a mountain with a teardrop-shaped symbol above it, with mountains and clouds in the background + Line drawing of an ant with a long, antenna-like mushroom growing from its thorax + Line drawing of a meditating figure with haloes of glyphs surrounding them

-{%- endblock %} diff --git a/templates/background.html.tera b/templates/background/index.html similarity index 85% rename from templates/background.html.tera rename to templates/background/index.html index 935a761..8444027 100644 --- a/templates/background.html.tera +++ b/templates/background/index.html @@ -1,13 +1,9 @@ -{% extends "nav" %} -{% block title %}mycelial technology | background{% endblock title %} -{% block content %}

Background

I was born and raised in the coastal city of Durban, South Africa, which lies between the Indian Ocean and Drakensberg Mountains. Following completion of high school I moved to Michigan, USA and completed a Bachelor of Science in anthropology (major) and biology (minor) at Grand Valley State University. I later returned to South Africa and completed a Master of Social Science in social anthropology at the University of Cape Town, with research focused on decentralised networks of medicinal plant harvesters and herbalists (Rasta bush doctors). I then went on to work as an applied anthropologist and ethnobotanist in the non-profit sector.

Following a year spent travelling in South America, I restructured my life and livelihood around my core interests: carbon-based and silicon-based technologies (biology and computers). In 2016 I co-founded Harmonic Mycology, a mycology business based in Cape Town, and served as Creative Director until leaving to pursue personal and collective projects in 2020. I have developed mycelial medicines, cultivated edible and medicinal fungi and taught workshops on mushroom cultivation, biomaterials and medicinal fungi. My mycological work is now focused on encouraging the formation of humyn-fungal networks and practicing low-tech, ecologically-integrated cultivation.

In parallel to my mycological endeavours, I work as an autodidactic software developer on private and open-source projects; most-recently, PeachCloud. I also enjoy tinkering with electronics and have a couple of solar-powered projects in the works.

I hold a deep fascination with the processes through which humyns form relationships with other living beings. When not in the lab or behind a keyboard, you can find me looking at mushrooms, riding my bicycle or reading sci-fi. I'm dreaming of a three-month adventure across Japan ⛩.

- A young man crouching beside a large orange chicken-of-the-woods mushroom growing from the trunk of an oak tree. Trees, shrubs and grasses fill the foreground and background. + A young man crouching beside a large orange chicken-of-the-woods mushroom growing from the trunk of an oak tree. Trees, shrubs and grasses fill the foreground and background.

-{%- endblock %} diff --git a/templates/bacteria.html.tera b/templates/bacteria.html.tera deleted file mode 100644 index ec5dc94..0000000 --- a/templates/bacteria.html.tera +++ /dev/null @@ -1,10 +0,0 @@ -{% extends "nav" %} -{% block title %}mycelial technology | bacteria{% endblock title %} -{% block content %} -

Bacteria

- -
-{%- endblock %} diff --git a/templates/bacteria/index.html b/templates/bacteria/index.html new file mode 100644 index 0000000..fd3468d --- /dev/null +++ b/templates/bacteria/index.html @@ -0,0 +1,6 @@ +

Bacteria

+ +
diff --git a/templates/bacteria/sauerkraut_beginnings.html.tera b/templates/bacteria/sauerkraut-beginnings.html similarity index 57% rename from templates/bacteria/sauerkraut_beginnings.html.tera rename to templates/bacteria/sauerkraut-beginnings.html index 3d9f979..596fe35 100644 --- a/templates/bacteria/sauerkraut_beginnings.html.tera +++ b/templates/bacteria/sauerkraut-beginnings.html @@ -1,11 +1,8 @@ -{% extends "nav" %} -{% block title %}mycelial technology | Sauerkraut: Beginnings{% endblock title %} -{% block content %}

Sauerkraut: Beginnings

22 October, 2019
- Colour photo in portrait orientation of a 3L jar filled with purple sauerkraut-in-the-making. The jar is on a wooden countertop and is covered by a blue and white cloth. A glass jar with water is visible inside the bigger jar. Bubbles can be seen forming on the surface of the sauerkraut mixture / solution. + Colour photo in portrait orientation of a 3L jar filled with purple sauerkraut-in-the-making. The jar is on a wooden countertop and is covered by a blue and white cloth. A glass jar with water is visible inside the bigger jar. Bubbles can be seen forming on the surface of the sauerkraut mixture / solution.
Counter-top fermentation factory.

I started my first batch of sauerkraut on Sunday - something I’ve been meaning to do for a few months.

@@ -13,4 +10,3 @@

It’s already bubbling and smelling delicious. Fermentation is like hospitality management for microbes.


-{%- endblock %} diff --git a/templates/bacteria/sauerkraut_bottled.html.tera b/templates/bacteria/sauerkraut-bottled.html similarity index 56% rename from templates/bacteria/sauerkraut_bottled.html.tera rename to templates/bacteria/sauerkraut-bottled.html index b65da28..037ba9f 100644 --- a/templates/bacteria/sauerkraut_bottled.html.tera +++ b/templates/bacteria/sauerkraut-bottled.html @@ -1,6 +1,3 @@ -{% extends "nav" %} -{% block title %}mycelial technology | Sauerkraut: Bottled{% endblock title %} -{% block content %}

Sauerkraut: Bottled

31 October, 2019 @@ -8,9 +5,8 @@

Also transferred some chaga (Inonotus obliquus), reishi (Ganoderma lucidum) and turkey tail (Trametes versicolor)-infused coconut oil to a smaller jar.

All of it will be gifted to friends in the valley; gifted by the combined efforts of the sun, soil, water, plants, bacteria and humyns.

- Colour photo showing five glass jars, one small and four large, in a row on a wooden handrail. The first jar contains a cream-coloured mixture of coconut oil, while the other jars are filled with purple sauerkraut. Trees and a mountain can be seen in the background on the right. A brick building appears along the left margin of the photo. + Colour photo showing five glass jars, one small and four large, in a row on a wooden handrail. The first jar contains a cream-coloured mixture of coconut oil, while the other jars are filled with purple sauerkraut. Trees and a mountain can be seen in the background on the right. A brick building appears along the left margin of the photo.
Vibrant delights in the valley.

-{%- endblock %} diff --git a/templates/base.html.tera b/templates/base.html similarity index 70% rename from templates/base.html.tera rename to templates/base.html index a9a8403..c139498 100644 --- a/templates/base.html.tera +++ b/templates/base.html @@ -3,8 +3,8 @@ - - {% block title %}{% endblock title %} + + [[ title ]] @@ -38,11 +38,16 @@ .card { border: 1px solid black; box-shadow: 0.25rem 0.25rem; - width: max-content; padding: 2rem; margin-bottom: 2rem; } + @media only screen and (min-width: 800px) { + .card { + width: max-content; + } + } + .card ul { list-style-type: none; margin: 0; @@ -129,10 +134,28 @@ border: solid 1px #111; padding: 2rem; } - - {% block nav %}{% endblock %} +

mycelial technology

+
+ + [[ content ]] +
+

© 2021 glyph

+

diff --git a/templates/computers.html.tera b/templates/computers.html.tera deleted file mode 100644 index 7c94ea7..0000000 --- a/templates/computers.html.tera +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "nav" %} -{% block title %}mycelial technology | computers{% endblock title %} -{% block content %} -

Computers

-

You can find some of my code on GitHub and Sourcehut.

-

Posts

- -
-{%- endblock %} diff --git a/templates/computers/esp8266_dht11.html.tera b/templates/computers/esp8266-dht11.html similarity index 78% rename from templates/computers/esp8266_dht11.html.tera rename to templates/computers/esp8266-dht11.html index 1bd7ff4..1369bd9 100644 --- a/templates/computers/esp8266_dht11.html.tera +++ b/templates/computers/esp8266-dht11.html @@ -1,11 +1,9 @@ -{% extends "nav" %} -{% block content %}

ESP8266 with DHT11 and LCD Display

5 August, 2019

I had fun putting together a simple electronics project over the weekend: NodeMCU dev board (ESP8266) with a DHT11 temperature and humidity sensor and DF Robot RGB LCD display.

- Black and white photo in portrait orientation showing electronics on a striped table-cloth. A NodeMCU dev board appears in the lower-right, DHT11 sensor in the top-left, and an LCD in the top-right. Text on the display reads: temp: 18.0 and humidity: 64. The display is propped-up by a white pyramid (mycelium) and a wooden floor is just visible in the background. + Black and white photo in portrait orientation showing electronics on a striped table-cloth. A NodeMCU dev board appears in the lower-right, DHT11 sensor in the top-left, and an LCD in the top-right. Text on the display reads: temp: 18.0 and humidity: 64. The display is propped-up by a white pyramid (mycelium) and a wooden floor is just visible in the background.
The basic setup.

The code is quite simple: connect to the local WiFi network and create a UDP server. Respond to UDP requests on port 3210 with a temperature and humidity reading from the sensor. Write the temperature and humidity to the display every two seconds.

@@ -19,4 +17,3 @@

I did not know that. Rad.


-{%- endblock %} diff --git a/templates/computers/i2c_adventures.html.tera b/templates/computers/i2c-adventures.html similarity index 92% rename from templates/computers/i2c_adventures.html.tera rename to templates/computers/i2c-adventures.html index f5176ed..d5eb0b0 100644 --- a/templates/computers/i2c_adventures.html.tera +++ b/templates/computers/i2c-adventures.html @@ -1,5 +1,3 @@ -{% extends "nav" %} -{% block content %}

Adventures with I²C

26 January, 2019 @@ -11,7 +9,7 @@
A Real Time Clock Module with battery backup using the easy to use DS1338 chip. The DS1338 is functionally the same as the popular DS1307 chip with the difference being that the DS1338 works at any voltage from 3V to 5V making it easy to use on either 3.3V and 5V systems without modification or logic level conversion. Ideal for your project including Arduino and Raspberry Pi projects.

I received my first lesson in soldering last week and attached pins to the RTC. That made it a simple process to plug the module into my breadboard and connect it to the Pi. The module works on I²C and only requires 4 connecting wires (power, ground, SDA, SCL). The I²C pins on the Pi include a fixed 1.8 kohms pull-up resistor to 3.3v, meaning that no additional resistors needed to be included in the wiring setup.

- DS1338 RTC module plugged-into a breadboard & connected to a Raspberry Pi. + DS1338 RTC module plugged-into a breadboard & connected to a Raspberry Pi.
DS1338 RTC module plugged-into a breadboard & connected to a Raspberry Pi.

Following the AdaFruit guide to Adding a Real Time Clock to Raspberry Pi (with small additions), I was able to run an I²C scan and verify that the module was wired correctly to the Pi:

@@ -21,7 +19,7 @@

The final command in the sequence prints an array to the console, with 68 denoting the presence of the RTC module. This is a sign that the device is properly wired and connected. Great! This is where things started to get tricky…

If we were running Raspbian for this project the next steps would be pretty simple. As it turns out, the process for Debian Buster ARM64 is quite a bit more complicated. A blog post I found last night neatly summarizes the pros and cons of this choice:

- List of advantages and disadvantages of running Debian Buster ARM64 on Raspberry Pi. + List of advantages and disadvantages of running Debian Buster ARM64 on Raspberry Pi.
List of advantages and disadvantages of running Debian Buster ARM64 on Raspberry Pi.

No kidding! There were, however, a few crumbs along the way to sustain me over the course of the journey. These included What is needed to get I²C working with Debian Jessie? and "I2C transfer failed" flooding the logs.

@@ -40,10 +38,9 @@ sudo modprobe rtc-ds1307

I ran sudo i2cdetect -y 1 for the 234th time and bingo! It works! Running around room celebrating.

- Screenshot of terminal showing successful configuration of I²C RTC module. + Screenshot of terminal showing successful configuration of I²C RTC module.
Screenshot of terminal showing successful configuration of I²C RTC module.

This is really exciting because it opens the door to (relatively) easy integration of other I²C devices (sensors, LCD displays etc.). Next step will be to fine-tune the process so that everything loads correctly on boot. If you stuck with me this far - thanks for reading!


-{%- endblock %} diff --git a/templates/computers/index.html b/templates/computers/index.html new file mode 100644 index 0000000..7bb8bdb --- /dev/null +++ b/templates/computers/index.html @@ -0,0 +1,11 @@ +

Computers

+

You can find some of my code on GitHub and Sourcehut.

+

Posts

+ +
diff --git a/templates/computers/rust_compilation.html.tera b/templates/computers/rust-compilation.html similarity index 94% rename from templates/computers/rust_compilation.html.tera rename to templates/computers/rust-compilation.html index 214e2ed..a0cfd7e 100644 --- a/templates/computers/rust_compilation.html.tera +++ b/templates/computers/rust-compilation.html @@ -1,5 +1,3 @@ -{% extends "nav" %} -{% block content %}

Cross-Compiling Rust for Debian Buster on Raspberry Pi 3B+

18 May, 2020 @@ -18,4 +16,3 @@ linker = "aarch64-linux-gnu-gcc"

-{%- endblock %} diff --git a/templates/fungi.html.tera b/templates/fungi.html.tera deleted file mode 100644 index 2b76ab5..0000000 --- a/templates/fungi.html.tera +++ /dev/null @@ -1,29 +0,0 @@ -{% extends "nav" %} -{% block title %}mycelial technology | fungi{% endblock title %} -{% block content %} -

Fungi

-

Articles

-
- -
-

Guides

-
- -
-

Reading List

- -
-{%- endblock %} diff --git a/templates/fungi/design_patterns.html.tera b/templates/fungi/design-patterns.html similarity index 96% rename from templates/fungi/design_patterns.html.tera rename to templates/fungi/design-patterns.html index 0bf2ead..e9bcb6a 100644 --- a/templates/fungi/design_patterns.html.tera +++ b/templates/fungi/design-patterns.html @@ -1,10 +1,7 @@ -{% extends "nav" %} -{% block title %}mycelial technology | Mycelial Design Patterns{% endblock title %} -{% block content %}

Mycelial Design Patterns

26 October, 2018 -

This is the second part of a two-part essay which first appeared on Scuttlebutt [1] as an exploration of growing the ecosystem. Part one: Growing Forests [2].

+

This is the second part of a two-part essay which first appeared on Scuttlebutt [1] as an exploration of growing the ecosystem. Part one: Growing Forests [2].

1. Think long-term. Dream the future that will support as much diversity and interdependence as possible and then anchor it through integration, practice and reflection. This is already going on in the Scuttleverse so I won’t expand further.

2. Be experimental. The saprotrophic (foraging / decomposing) fungi stream nuclei to their rapidly branching and elongating tips. These nuclei provide the compute resources to analyze external environmental conditions and respond accordingly. Fungi are capable of synthesizing some 200,000 unique compounds, many of which are acids and enzymes deployed to dissassmble metals, minerals, baceria etc. So, again, a diversity of approaches is best. Allocate some grants as small packages and let grantees scout the terrain of possibility. I think the $5k grants from Dfinity were a great practice of this kind of experimental embrace.

3. Store energy when it’s plentiful. Some species of fungi grow underground storage vessels known as sclerotia or truffles. These dense nuggets of mycelium provide sustenance in periods of prolonged adverse conditions (drought, lack of food etc.). I think efforts like the Open Collective etc. can play a role in facilitating this kind of saving. Times may come when we have no incoming funding and then the surplus of previous crops can keep us going. I think we should be wary of spending all available resources as they come in.

@@ -23,4 +20,3 @@

-{%- endblock %} diff --git a/templates/fungi/glossary.html b/templates/fungi/glossary.html new file mode 100644 index 0000000..1891af7 --- /dev/null +++ b/templates/fungi/glossary.html @@ -0,0 +1,12 @@ +
+

Mycological Glossary

+
    +
  • culture - Mycelium of a particular strain and species, often grown in a petri dish or test tube for easy storage and replication.
  • +
  • liquid culture - Mycelium grown in a nutrified solution such as 4% honey water, often in a glass jar or similar lidded vessel; simplifies cultivation in non-sterile conditions.
  • +
  • mushroom - The fruiting body of a fungal network; a specialised structure grown to replicate and distribute the genetic information of the mycelium via spores.
  • +
  • mycelium - The body of a fungus, made up of branching and interconnected threads of single cells (hyphae); often appears as a white, fluffy mass resembling tiny roots.
  • +
  • mycomaterial - A substance or object grown out of mycelium, often using hemp hurd or similar woody substance as a base material. Mycomaterials hold great potential as replacements for plastic, styrofoam, leather etc.
  • +
  • spore - A tiny reproductive bundle carrying the genetic information of the parent organism; germinates to restart the life-cycle of the fungus.
  • +
+
+
diff --git a/templates/fungi/glossary.html.tera b/templates/fungi/glossary.html.tera deleted file mode 100755 index 824ba7d..0000000 --- a/templates/fungi/glossary.html.tera +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "nav" %} -{% block title %}mycelial technology | fungal glossary{% endblock title %} -{% block content %} -

Mycological Glossary

-
    -
  • culture - Mycelium of a particular strain and species, often grown in a petri dish or test tube for easy storage and replication.
  • -
  • liquid culture - Mycelium grown in a nutrified solution such as 4% honey water, often in a glass jar or similar lidded vessel; simplifies cultivation in non-sterile conditions.
  • -
  • mushroom - The fruiting body of a fungal network; a specialised structure grown to replicate and distribute the genetic information of the mycelium via spores.
  • -
  • mycelium - The body of a fungus, made up of branching and interconnected threads of single cells (hyphae); often appears as a white, fluffy mass resembling tiny roots.
  • -
  • mycomaterial - A substance or object grown out of mycelium, often using hemp hurd or similar woody substance as a base material. Mycomaterials hold great potential as replacements for plastic, styrofoam, leather etc.
  • -
  • spore - A tiny reproductive bundle carrying the genetic information of the parent organism; germinates to restart the life-cycle of the fungus.
  • -
-
-{%- endblock %} diff --git a/templates/fungi/grow_forests.html.tera b/templates/fungi/grow-forests.html similarity index 94% rename from templates/fungi/grow_forests.html.tera rename to templates/fungi/grow-forests.html index 16996ec..48935ac 100644 --- a/templates/fungi/grow_forests.html.tera +++ b/templates/fungi/grow-forests.html @@ -1,6 +1,3 @@ -{% extends "nav" %} -{% block title %}mycelial technology | Growing Forests{% endblock title %} -{% block content %}

Growing Forests

26 October, 2018 @@ -16,7 +13,7 @@

In designing it’s local microbial community, the mycelium promotes the growth of some plants over others - shepherding the emergence of particular botanical communities. The mycelium itself, along with the mushrooms it produces, are food for insects, worms, birds and mammals. All of these creatures, plant and animal alike, can be thought of as biomass. The biomass ultimately feeds the fungus; falling branches are air-dropped takeout for the mycelial membranes below. You see this pattern in the contrast between grassland and forest eco-systems: grassland has bacterially-dominated soils while forests have fungal-dominated soil. What started off as a bit of humble bacteria farming grew into a complex and resilient system capable of supporting the mycelium and myriad other lifeforms. I think this is basically what we’re aiming for.

That’s all fascinating and stuff, but how do we apply this to @elavoie’s original question(s)?

I’ll highlight a few patterns I see in mycelial biology and ecology which I think apply. I have written about some of these elsewhere in the Scuttleverse (apologies for not including references and images and such).

-

Part 2: Mycelial Design Patterns.

+

Part 2: Mycelial Design Patterns.

Cypherlinks

  1. Cypherlink to part 1: %RRp5H5obsNYHhjSa/2FAxcTiyGGVvhPKAUYYgZTj6hI=.sha256
  2. @@ -25,4 +22,3 @@

-{%- endblock %} diff --git a/templates/fungi/grow_together.html.tera b/templates/fungi/grow-together.html similarity index 83% rename from templates/fungi/grow_together.html.tera rename to templates/fungi/grow-together.html index 067b6b2..741a88c 100644 --- a/templates/fungi/grow_together.html.tera +++ b/templates/fungi/grow-together.html @@ -1,6 +1,3 @@ -{% extends "nav" %} -{% block title %}mycelial technology | Grow Together{% endblock title %} -{% block content %}

Grow Together

29 March, 2018 @@ -9,17 +6,16 @@

It seems the onset of rains and cooler weather, along with - potentially - the death of the plant, have prompted the networks of this species to produce mushrooms. All of the ones I have found so far have been growing in association with lettuce. Let’s practice the mycorrhizal way and nurture interdependence!

So much love for the House of Wu Wei and all the myriad creatures who live here!

- +
You look interesting! I wonder what’s going on…
- +
Inter-species companionship.
- +
Makes me wonder how long these species have been dancing one another into being?

-{%- endblock %} diff --git a/templates/fungi/index.html b/templates/fungi/index.html new file mode 100644 index 0000000..358a54b --- /dev/null +++ b/templates/fungi/index.html @@ -0,0 +1,25 @@ +

Fungi

+

Articles

+
+ +
+

Guides

+
+ +
+

Reading List

+ +
diff --git a/templates/fungi/lichen_space.html.tera b/templates/fungi/lichen-space.html similarity index 96% rename from templates/fungi/lichen_space.html.tera rename to templates/fungi/lichen-space.html index 052bdd8..ec86d62 100644 --- a/templates/fungi/lichen_space.html.tera +++ b/templates/fungi/lichen-space.html @@ -1,11 +1,8 @@ -{% extends "nav" %} -{% block title %}mycelial technology | Lichens in Space{% endblock title %} -{% block content %}

Lichens in Space

28 May, 2020
- +
Xanthoria elegans lichen in cross-section, stained with FUN-1 dye.

So I think many of us have a basic understanding of what a lichen is: a symbiotic mutualism between a fungus and algae / cyanobacteria. The fungus provides a cosy home for the algae, along with water, nutrients and anchorage; while the algae photosynthesises and provides the fungus with carbohydrates. As Trevor Goward puts it: “Lichens are fungi that have discovered agriculture”. Put another way, lichen are fungi with solar panels. But I’ve only recently learned that the situation is far more complex than this simple 1:1 rendering of fungus and algae.

@@ -36,4 +33,3 @@

Viability of the lichen Xanthoria elegans and its symbionts after 18 months of space exposure and simulated Mars conditions on the ISS - Brandt et al. (2015)


-{%- endblock %} diff --git a/templates/fungi/mycomaterials_guide.html.tera b/templates/fungi/mycomaterials_guide.html similarity index 81% rename from templates/fungi/mycomaterials_guide.html.tera rename to templates/fungi/mycomaterials_guide.html index 5e71d5a..eb0eab5 100644 --- a/templates/fungi/mycomaterials_guide.html.tera +++ b/templates/fungi/mycomaterials_guide.html @@ -1,6 +1,3 @@ -{% extends "nav" %} -{% block title %}mycelial technology | Photographing Mushrooms{% endblock title %} -{% block content %}

Guide to Photographing Mushrooms for Identification

25 August, 2020 @@ -11,28 +8,28 @@

Mushrooms are often best identified by observing and listing their morphological traits. These may include the shape of the cap - both from above and in profile, the structure and colour of the hymenium, the colouration of the stem, the structure of the ring (if present) etc. Species within a genus often look identical at a glance and may require careful delineation based on a single characteristic. As such, it's very important to take clear photographs which collectively capture all of these characteristics (or the lack thereof). A minimum of three photos should do the trick:

Top-view: captures the shape, colour and texture of the mushroom as seen from above.

- Large brown and white mushroom growing from a birch log on the forest floor. A black-gloved hand with fingers spread is next to the mushroom. The forest floor is covered with wet leaves and English ivy + Large brown and white mushroom growing from a birch log on the forest floor. A black-gloved hand with fingers spread is next to the mushroom. The forest floor is covered with wet leaves and English ivy
Here we see a birch polypore mushroom (Fomitopsis betulina) from above, including a humyn hand for scale. As a bonus, we can also see the substrate from which the fungus is fruiting (a birch tree on the forest floor).

Side-view: captures the profile of the cap, the cap margin and the shape and colour of the stem (including patterns and any bruising which might be present).

- Little brown mushroom (LBM) with a green clover attached to the base, as seen from the side on a white background + Little brown mushroom (LBM) with a green clover attached to the base, as seen from the side on a white background
The profile of a single mushroom from the Panaeolus genus.

Bottom-view: captures the colour and structure of the hymenium (gills, pores or teeth), as well as the way in which the cap is attached to the stem (if present).

- Mushroom with white gills and a beige stem + Mushroom with white gills and a beige stem
The gills of a mushroom I've yet to identify, including the top part of the stem.

Your identification process will be further aided by taking the extra steps to capture two more photos:

Developmental diversity: captures several examples of the mushroom at various phases of development, including a mature mushroom and primorida. Mushrooms can change colour and shape with age, and may lose key identification features - hence the utility of being able to identify using several phases of development.

- Tetraptych showing four phases in the development of coprinoid mushrooms amongst mulch; from primordium to mature fruitbody + Tetraptych showing four phases in the development of coprinoid mushrooms amongst mulch; from primordium to mature fruitbody
Four phases in the development of a coprinoid mushroom.

Spore-print: captures the colour of the spores (an important characteristic with which to narrow your search). You will probably have to take a mushroom cap home / back to your campsite to create the sporeprint (takes 12 - 24 hours).

- Black sporeprint on white, ruled paper + Black sporeprint on white, ruled paper
Black spores from a mushroom in the Panaeolus genus.

Bear in mind that you don't need fancy equipment to photograph mushrooms for the purpose of identification. I've been using the same simple Sony digital point-and-shoot since 2011. Also, don't be afraid to get close-up to your subject (the mushroom). The details often prove to be very important!

@@ -40,16 +37,15 @@

In addition to photos of the mushroom itself, it can be incredibly helpful to collect data concerning the context in which the mushroom is growing. The key considerations in this regard are the substrate and habitat: What is the mushroom growing on? Where is it growing? And what is growing or living around it? Having photos of these contextual factors can make a big difference when identifying a mushroom or genus or species-level. A minimum of two photos will suffice:

Substrate-attachment: captures the substrate on which the mushroom is growing. Try to observe beyond the obvious: if it's growing from the ground, is it growing on mulch, dung or from beneath the soil?

- Cluster of mushrooms with beige-orange caps and brown stems, growing on a wet, decomposing log in a forest + Cluster of mushrooms with beige-orange caps and brown stems, growing on a wet, decomposing log in a forest
A cluster of mushrooms growing on a wet, decomposing log.

Habitat: captures the environmental conditions and some of the species which may be copresent with the mushroom.

- Birch forest with grass covering the forest floor + Birch forest with grass covering the forest floor
A grassland birch forest.

Conclusion

There you have it, with 5 - 7 photos you can capture a great deal of data about a given species. Whether you're asking someone for help with identification or working through the process yourself, having these morphological and ecological data to draw on will enrich your learning experience and enhance your chances of making a successful identification. You may even notice things in the photos which you missed while in the field, for example, a beetle crawling amongst the gills (what ecological relationship might it have with the fungus?). I hope you've found this guide helpful and that it facilitates many fun identification forays in your near-future!


-{%- endblock %} diff --git a/templates/fungi/network_resilience.html.tera b/templates/fungi/network-resilience.html similarity index 97% rename from templates/fungi/network_resilience.html.tera rename to templates/fungi/network-resilience.html index 6b9d318..23effa4 100644 --- a/templates/fungi/network_resilience.html.tera +++ b/templates/fungi/network-resilience.html @@ -1,6 +1,3 @@ -{% extends "nav" %} -{% block title %}mycelial technology | Network Resilience{% endblock title %} -{% block content %}

Network Resilience: Woronin Bodies and the Scuttleverse

25 March, 2018 @@ -17,4 +14,3 @@

My understanding of SSB is far from adequate to even begin exploring these ideas in code, but I look forward to the day that dream takes shape around me; self-assembling structural proteins dancing as hyphal shards of The Greater Scuttleverse merge and diverge.


-{%- endblock %} diff --git a/templates/fungi/photo_guide.html.tera b/templates/fungi/photo-guide.html similarity index 81% rename from templates/fungi/photo_guide.html.tera rename to templates/fungi/photo-guide.html index 5e71d5a..eb0eab5 100644 --- a/templates/fungi/photo_guide.html.tera +++ b/templates/fungi/photo-guide.html @@ -1,6 +1,3 @@ -{% extends "nav" %} -{% block title %}mycelial technology | Photographing Mushrooms{% endblock title %} -{% block content %}

Guide to Photographing Mushrooms for Identification

25 August, 2020 @@ -11,28 +8,28 @@

Mushrooms are often best identified by observing and listing their morphological traits. These may include the shape of the cap - both from above and in profile, the structure and colour of the hymenium, the colouration of the stem, the structure of the ring (if present) etc. Species within a genus often look identical at a glance and may require careful delineation based on a single characteristic. As such, it's very important to take clear photographs which collectively capture all of these characteristics (or the lack thereof). A minimum of three photos should do the trick:

Top-view: captures the shape, colour and texture of the mushroom as seen from above.

- Large brown and white mushroom growing from a birch log on the forest floor. A black-gloved hand with fingers spread is next to the mushroom. The forest floor is covered with wet leaves and English ivy + Large brown and white mushroom growing from a birch log on the forest floor. A black-gloved hand with fingers spread is next to the mushroom. The forest floor is covered with wet leaves and English ivy
Here we see a birch polypore mushroom (Fomitopsis betulina) from above, including a humyn hand for scale. As a bonus, we can also see the substrate from which the fungus is fruiting (a birch tree on the forest floor).

Side-view: captures the profile of the cap, the cap margin and the shape and colour of the stem (including patterns and any bruising which might be present).

- Little brown mushroom (LBM) with a green clover attached to the base, as seen from the side on a white background + Little brown mushroom (LBM) with a green clover attached to the base, as seen from the side on a white background
The profile of a single mushroom from the Panaeolus genus.

Bottom-view: captures the colour and structure of the hymenium (gills, pores or teeth), as well as the way in which the cap is attached to the stem (if present).

- Mushroom with white gills and a beige stem + Mushroom with white gills and a beige stem
The gills of a mushroom I've yet to identify, including the top part of the stem.

Your identification process will be further aided by taking the extra steps to capture two more photos:

Developmental diversity: captures several examples of the mushroom at various phases of development, including a mature mushroom and primorida. Mushrooms can change colour and shape with age, and may lose key identification features - hence the utility of being able to identify using several phases of development.

- Tetraptych showing four phases in the development of coprinoid mushrooms amongst mulch; from primordium to mature fruitbody + Tetraptych showing four phases in the development of coprinoid mushrooms amongst mulch; from primordium to mature fruitbody
Four phases in the development of a coprinoid mushroom.

Spore-print: captures the colour of the spores (an important characteristic with which to narrow your search). You will probably have to take a mushroom cap home / back to your campsite to create the sporeprint (takes 12 - 24 hours).

- Black sporeprint on white, ruled paper + Black sporeprint on white, ruled paper
Black spores from a mushroom in the Panaeolus genus.

Bear in mind that you don't need fancy equipment to photograph mushrooms for the purpose of identification. I've been using the same simple Sony digital point-and-shoot since 2011. Also, don't be afraid to get close-up to your subject (the mushroom). The details often prove to be very important!

@@ -40,16 +37,15 @@

In addition to photos of the mushroom itself, it can be incredibly helpful to collect data concerning the context in which the mushroom is growing. The key considerations in this regard are the substrate and habitat: What is the mushroom growing on? Where is it growing? And what is growing or living around it? Having photos of these contextual factors can make a big difference when identifying a mushroom or genus or species-level. A minimum of two photos will suffice:

Substrate-attachment: captures the substrate on which the mushroom is growing. Try to observe beyond the obvious: if it's growing from the ground, is it growing on mulch, dung or from beneath the soil?

- Cluster of mushrooms with beige-orange caps and brown stems, growing on a wet, decomposing log in a forest + Cluster of mushrooms with beige-orange caps and brown stems, growing on a wet, decomposing log in a forest
A cluster of mushrooms growing on a wet, decomposing log.

Habitat: captures the environmental conditions and some of the species which may be copresent with the mushroom.

- Birch forest with grass covering the forest floor + Birch forest with grass covering the forest floor
A grassland birch forest.

Conclusion

There you have it, with 5 - 7 photos you can capture a great deal of data about a given species. Whether you're asking someone for help with identification or working through the process yourself, having these morphological and ecological data to draw on will enrich your learning experience and enhance your chances of making a successful identification. You may even notice things in the photos which you missed while in the field, for example, a beetle crawling amongst the gills (what ecological relationship might it have with the fungus?). I hope you've found this guide helpful and that it facilitates many fun identification forays in your near-future!


-{%- endblock %} diff --git a/templates/fungi/reading-list.html b/templates/fungi/reading-list.html new file mode 100644 index 0000000..f94e774 --- /dev/null +++ b/templates/fungi/reading-list.html @@ -0,0 +1,22 @@ +
+

Mycology Literature Reading List

+

2021

+

I'm aiming to read 100 mycology journal articles and textbook chapters this year. Any entries marked with a * have been read and discussed as part of the Hyphal Fusion Reading Group.

+
    +
  1. Hiscox J, O'Leary J, Boddy L (2018). Fungus wars: basidiomycete battles in wood decay. Studies in Mycology 89: 117–124. *
  2. +
  3. Crowther TW, Boddy L, Maynard DS (2018). The use of artificial media in fungal ecology. Fungal Ecology 32: 87–91.
  4. +
  5. Parfitt D, Hunt J, Dockrell D, et al. (2010). Do all trees carry the seeds of their own destruction? PCR reveals numerous wood decay fungi latently present in sapwood of a wide range of angiosperm trees. Fungal Ecology, 3: 338–346.
  6. +
  7. Boddy L, Crockatt ME, Ainsworth AM (2011). Ecology of Hericium cirrhatum, H. coralloides and H. erinaceus in the UK. Fungal Ecology, 4(2): 163–173.
  8. +
  9. Heaton L, Obara B, Grau V, et al. (2012). Analysis of fungal networks. Fungal Biology Reviews, 26(1): 12-29.
  10. +
  11. Mueller U, Kardish M, Ishak H, et al. (2018). Phylogenetic patterns of ant–fungus associations indicate that farming strategies, not only a superior fungal cultivar, explain the ecological success of leafcutter ants. Molecular Ecology, 27(10): 2414-2434.
  12. +
  13. Yang D, Liang J, Wang Y, et al. (2016). Tea waste: an effective and economic substrate for oyster mushroom cultivation. Journal of the Science of Food and Agriculture, 96(2), 680-684.
  14. +
  15. Richter DL, Dixon TG, Smith JK (2016). Revival of saprotrophic and mycorrhizal basidiomycete cultures after 30 years in cold storage in sterile water. Canadian Journal of Microbiology, 62(11), 932-937.
  16. +
  17. Schwartz MW, Hoeksema JD, Gehring CA, et al. (2006). The promise and the potential consequences of the global transport of mycorrhizal fungal inoculum. Ecology Letters, 9(5), 501-515.
  18. +
  19. Kües U & Liu Y (2000). Fruiting body production in basidiomycetes. Applied Microbiology and Biotechnology, 54(2), 141-152.
  20. +
  21. Jusino MA, Lindner DL, Banik MT, et al. (2016). Experimental evidence of a symbiosis between red-cockaded woodpeckers and fungi. Proceedings of the Royal Society B: Biological Sciences, 283(1827). +
  22. Garibay-Orijel R, Ramírez-Terrazo A & Ordaz-Velázquez M. (2012). Women care about local knowledge, experiences from ethnomycology. Journal of Ethnobiology and Ethnomedicine, 8(1), 1-13.
  23. +
  24. Raudabaugh DB, Matheny PB, Hughes KW, et al. (2020). Where are they hiding? Testing the body snatchers hypothesis in pyrophilous fungi. Fungal Ecology, 43, 100870.
  25. +
  26. Ingham CJ, Kalisman O, Finkelshtein A, Ben-Jacob E (2011). Mutually facilitated dispersal between the nonmotile fungus Aspergillus fumigatus and the swarming bacterium Paenibacillus vortex. Proceedings of the National Academy of Sciences, 108(49):19731-6.
  27. +
+
+
diff --git a/templates/fungi/reading_list.html.tera b/templates/fungi/reading_list.html.tera deleted file mode 100755 index dc61d61..0000000 --- a/templates/fungi/reading_list.html.tera +++ /dev/null @@ -1,24 +0,0 @@ -{% extends "nav" %} -{% block title %}mycelial technology | reading list{% endblock title %} -{% block content %} -

Mycology Literature Reading List

-

2021

-

I'm aiming to read 100 mycology journal articles and textbook chapters this year. Any entries marked with a * have been read and discussed as part of the Hyphal Fusion Reading Group.

-
    -
  1. Hiscox J, O'Leary J, Boddy L (2018). Fungus wars: basidiomycete battles in wood decay. Studies in Mycology 89: 117–124. *
  2. -
  3. Crowther TW, Boddy L, Maynard DS (2018). The use of artificial media in fungal ecology. Fungal Ecology 32: 87–91.
  4. -
  5. Parfitt D, Hunt J, Dockrell D, et al. (2010). Do all trees carry the seeds of their own destruction? PCR reveals numerous wood decay fungi latently present in sapwood of a wide range of angiosperm trees. Fungal Ecology, 3: 338–346.
  6. -
  7. Boddy L, Crockatt ME, Ainsworth AM (2011). Ecology of Hericium cirrhatum, H. coralloides and H. erinaceus in the UK. Fungal Ecology, 4(2): 163–173.
  8. -
  9. Heaton L, Obara B, Grau V, et al. (2012). Analysis of fungal networks. Fungal Biology Reviews, 26(1): 12-29.
  10. -
  11. Mueller U, Kardish M, Ishak H, et al. (2018). Phylogenetic patterns of ant–fungus associations indicate that farming strategies, not only a superior fungal cultivar, explain the ecological success of leafcutter ants. Molecular Ecology, 27(10): 2414-2434.
  12. -
  13. Yang D, Liang J, Wang Y, et al. (2016). Tea waste: an effective and economic substrate for oyster mushroom cultivation. Journal of the Science of Food and Agriculture, 96(2), 680-684.
  14. -
  15. Richter DL, Dixon TG, Smith JK (2016). Revival of saprotrophic and mycorrhizal basidiomycete cultures after 30 years in cold storage in sterile water. Canadian Journal of Microbiology, 62(11), 932-937.
  16. -
  17. Schwartz MW, Hoeksema JD, Gehring CA, et al. (2006). The promise and the potential consequences of the global transport of mycorrhizal fungal inoculum. Ecology Letters, 9(5), 501-515.
  18. -
  19. Kües U & Liu Y (2000). Fruiting body production in basidiomycetes. Applied Microbiology and Biotechnology, 54(2), 141-152.
  20. -
  21. Jusino MA, Lindner DL, Banik MT, et al. (2016). Experimental evidence of a symbiosis between red-cockaded woodpeckers and fungi. Proceedings of the Royal Society B: Biological Sciences, 283(1827). -
  22. Garibay-Orijel R, Ramírez-Terrazo A & Ordaz-Velázquez M. (2012). Women care about local knowledge, experiences from ethnomycology. Journal of Ethnobiology and Ethnomedicine, 8(1), 1-13.
  23. -
  24. Raudabaugh DB, Matheny PB, Hughes KW, et al. (2020). Where are they hiding? Testing the body snatchers hypothesis in pyrophilous fungi. Fungal Ecology, 43, 100870.
  25. -
  26. Ingham CJ, Kalisman O, Finkelshtein A, Ben-Jacob E (2011). Mutually facilitated dispersal between the nonmotile fungus Aspergillus fumigatus and the swarming bacterium Paenibacillus vortex. Proceedings of the National Academy of Sciences, 108(49):19731-6.
  27. -
-
-{%- endblock %} diff --git a/templates/home.html.tera b/templates/index.html similarity index 82% rename from templates/home.html.tera rename to templates/index.html index 8e987ec..fc924df 100644 --- a/templates/home.html.tera +++ b/templates/index.html @@ -1,7 +1,4 @@ -{% extends "nav" %} -{% block title %}mycelial technology | glyph{% endblock title %} -{% block content %} - +

Welcome to the personal website of glyph: a mycelial technologist coding and cultivating a decentralized, multispecies future. On my site you will find art, musings and projects relating to carbon-based and silicon-based technologies.

[ sowing seeds of symbiosis | weaving webs of wu wei ]

Contact Information

@@ -11,4 +8,3 @@
  • Scuttlebutt: @HEqy940T6uB+T+d9Jaa58aNfRzLx9eRWqkZljBmnkmk=.ed25519

  • -{%- endblock %} diff --git a/templates/index.html.tera.dark b/templates/index.html.tera.dark deleted file mode 100644 index c7623e8..0000000 --- a/templates/index.html.tera.dark +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - mycelial technology | glyph - - - - - - -

    mycelial technology

    -
    - -

    Welcome to the personal website of glyph.

    -

    Contact Information

    -
    - - - diff --git a/templates/lists.html.tera b/templates/lists/index.html similarity index 96% rename from templates/lists.html.tera rename to templates/lists/index.html index 4fd057f..7c6e8c4 100644 --- a/templates/lists.html.tera +++ b/templates/lists/index.html @@ -1,6 +1,3 @@ -{% extends "nav" %} -{% block title %}mycelial technology | lists{% endblock title %} -{% block content %}

    Lists

    Books

    Currently Reading

    @@ -76,4 +73,3 @@
  • Embedded FM - Elecia White and Chris White

  • -{%- endblock %} diff --git a/templates/meditation.html.tera b/templates/meditation/index.html similarity index 71% rename from templates/meditation.html.tera rename to templates/meditation/index.html index 7731d5f..3ac7bda 100644 --- a/templates/meditation.html.tera +++ b/templates/meditation/index.html @@ -1,11 +1,7 @@ -{% extends "nav" %} -{% block title %}mycelial technology | meditation{% endblock title %} -{% block content %}

    Meditation

    - Black and white, high-contrast photo of a young man spinning fire poi. His expression is calm and void-like. + Black and white, high-contrast photo of a young man spinning fire poi. His expression is calm and void-like.

    Flow arts, and poi in particular, was the practice which first introduced me to the transformative capacity of movement and meditation. I began spinning in 2011 and practiced intensely for several years, eventually transitioning into club juggling. I still pick up my poi from time to time, but far less frequently than in years gone by. Flow arts help to pull me out of my head, down into my body, and out into community.

    My current meditation practice includes the Eight Pieces of Silk Brocade qigong routine, which I move through each morning after waking, as well as semi-regular suizen (shakuhachi) and club juggling. My mycelial cultivation efforts form an interspecies meditation of sorts; observing and interacting with the hyphal pulses as we move together through spacetime.


    -{%- endblock %} diff --git a/templates/movement.html.tera b/templates/movement.html.tera deleted file mode 100644 index 0cd147c..0000000 --- a/templates/movement.html.tera +++ /dev/null @@ -1,5 +0,0 @@ -{% extends "nav" %} -{% block content %} -

    Movement

    -
    -{%- endblock %} diff --git a/templates/nav.html.tera b/templates/nav.html.tera deleted file mode 100644 index 7231161..0000000 --- a/templates/nav.html.tera +++ /dev/null @@ -1,23 +0,0 @@ -{% extends "base" %} -{% block nav -%} -

    mycelial technology

    -
    - - {%- block content %}{%- endblock %} -
    -

    © 2021 glyph

    -

    -{%- endblock %} diff --git a/templates/plants.html.tera b/templates/plants.html.tera deleted file mode 100644 index 3292839..0000000 --- a/templates/plants.html.tera +++ /dev/null @@ -1,15 +0,0 @@ -{% extends "nav" %} -{% block title %}mycelial technology | plants{% endblock title %} -{% block content %} -

    Plants

    -

    Articles

    -
    - -
    -
    -{%- endblock %} diff --git a/templates/plants/aloe_there.html.tera b/templates/plants/aloe-there.html similarity index 81% rename from templates/plants/aloe_there.html.tera rename to templates/plants/aloe-there.html index 766a3e3..eafc2ac 100644 --- a/templates/plants/aloe_there.html.tera +++ b/templates/plants/aloe-there.html @@ -1,11 +1,8 @@ -{% extends "nav" %} -{% block title %}mycelial technology | Aloe There{% endblock title %} -{% block content %}

    Aloe There

    6 June, 2020
    - Dense cones of golden, tubular flowers dominate the frame, with green succulent leaves at the bottom, a bright blue sky above, and a thatched-roof in the background. Bees can be seen amongst the flowers. + Dense cones of golden, tubular flowers dominate the frame, with green succulent leaves at the bottom, a bright blue sky above, and a thatched-roof in the background. Bees can be seen amongst the flowers.
    Sunshine in the winter time.

    All the aloes are in full bloom right now and it makes me so happy. The bees are pretty stoked about it too, as are the sunbirds.

    @@ -15,10 +12,9 @@

    This is likely Aloe ferox, though it should be said that I’m still learning to differentiate species. It’s categorised as a solitary, non-branching tree aloe. There is another one nearby which is easily 5-6 meters tall. Some species have yellow flowers, while others are orange, red or pink. They are wonderful neighbours. I think I will devote a good portion of my life to caring for aloes and learning more about them. If my spirit has a colour, it is that of the flowers above.

    - +
    Majestic tree aloe amongst the succulents.

    An anecdote: I once drank Huachuma on a farm which had a cactus and succulent garden home to more than 1,000 species. After a good few hours drumming around a bonfire, my friends and I went to walk through the aforementioned garden. The moon was full, the night was still. Of all those species, the aloes were the only ones which appeared to me to be glowing blue-green. Not just reflecting the moonlight…glowing. I shall let the reader interpret that as they wish.


    -{%- endblock %} diff --git a/templates/plants/blueberry_dance.html.tera b/templates/plants/blueberry-dance.html similarity index 87% rename from templates/plants/blueberry_dance.html.tera rename to templates/plants/blueberry-dance.html index 6ea730e..fb676b4 100644 --- a/templates/plants/blueberry_dance.html.tera +++ b/templates/plants/blueberry-dance.html @@ -1,11 +1,8 @@ -{% extends "nav" %} -{% block title %}mycelial technology | I Have Been Invited Into a Dance by a Bush with Purple Berries{% endblock title %} -{% block content %}

    I Have Been Invited Into a Dance by a Bush with Purple Berries

    20 December, 2017
    - +
    Hand-picked blueberry snacks are where it’s at.

    Today I thought about ripeness. How do you know when it’s just right? Well, it’s different for every plant I guess. With blueberries I’m learning to evaluate ripeness based on sight (colour of berry) and touch (firmness when gently squeezed). When I first started picking them, just two weeks ago, I only used my eyes and thus tended to pick unripe, tangy berries. Now I get 'em when they’re oh-so-sweet! In the last few days I’ve also started to notice the rate at which the berries ripen and can time my future visits more precisely.

    @@ -14,4 +11,3 @@

    On a somewhat related note: I’m making friends with The Jinj, a neighbourhood cat of the orange variety.


    -{%- endblock %} diff --git a/templates/plants/botanical_deceptions.html.tera b/templates/plants/botanical-deceptions.html similarity index 81% rename from templates/plants/botanical_deceptions.html.tera rename to templates/plants/botanical-deceptions.html index 03bb0e2..ee27e6d 100644 --- a/templates/plants/botanical_deceptions.html.tera +++ b/templates/plants/botanical-deceptions.html @@ -1,11 +1,8 @@ -{% extends "nav" %} -{% block title %}mycelial technology | Botanical Deceptions{% endblock title %} -{% block content %}

    Botanical Deceptions

    15 May, 2020
    - An unusual flower which looks like an umbrella with a hollow, tapering stem. The top is white with green speckled petals and frilly egdes. A twisting, dark green vine is blurry in the background. + An unusual flower which looks like an umbrella with a hollow, tapering stem. The top is white with green speckled petals and frilly egdes. A twisting, dark green vine is blurry in the background.
    Ceropegia sandersonii flower. Photo credit: Wildfeuer. Shared under a Creative Commons Attribution 2.5 Generic (CC BY 2.5) license.

    I’ve been on a steady one-a-day listening spree of In Defense of Plants podcast episodes. Today I listened to Episode 216: Dying Bees, Wasp Venom, and other Strange Floral Scents, featuring an interview with Dr Annemarie Heiduk. If you enjoy geeking out about plants, insects, chemistry or ecology, I highly recommend taking a listen!

    @@ -15,9 +12,8 @@

    More info can be found on the Wikipedia page for Ceropegia sandersonii and in this article: To Attract Pollinators, Flower Mimics Wounded Bee.

    A friend of mine has a gorgeous vine growing as a potted plant at her house. Only while listening to this episode did I realise it’s a member of the Ceropegia! Now I’m stoked to identify it to species level and ask her ever-so-sweetly if I might take a cutting (or seeds). The one she has looks very much like this C. linearis sub. woodii:

    - A grayish-pink vine with two heart-shaped, gray-green leaves and an unusual, hollow flower with furry black structures at the tip. + A grayish-pink vine with two heart-shaped, gray-green leaves and an unusual, hollow flower with furry black structures at the tip.
    Ceropegia linearis subspecies woodii flower. Photo credit: Dr. David Midgley. Shared under a Creative Commons Attribution-ShareAlike 2.5 Generic (CC BY-SA 2.5) license.

    -{%- endblock %} diff --git a/templates/plants/index.html b/templates/plants/index.html new file mode 100644 index 0000000..4057c1f --- /dev/null +++ b/templates/plants/index.html @@ -0,0 +1,11 @@ +

    Plants

    +

    Articles

    +
    + +
    +
    diff --git a/templates/plants/potato_tech.html.tera b/templates/plants/potato-tech.html similarity index 79% rename from templates/plants/potato_tech.html.tera rename to templates/plants/potato-tech.html index 5c310ea..35c6a1d 100644 --- a/templates/plants/potato_tech.html.tera +++ b/templates/plants/potato-tech.html @@ -1,19 +1,15 @@ -{% extends "nav" %} -{% block title %}mycelial technology | Potato Tech{% endblock title %} -{% block content %}

    Potato Tech

    31 December, 2017

    I shared lunch with some permaculture friends on Christmas day and they gifted me some of their seed potatoes. Today I planted them. Having seen how the plants thrived in my friend’s garden, and having learning more about potato diversity while I was in Peru, I’m excited to experience my first attempt growing them. As I do so, I extend the line of humyns who have woven relationships with this plant over thousands and thousands of years; an honour and a privilege.

    Seeing the potatoes like this is freakin rad! I got to appreciate the potato plant as an energy capture and storage technology: harness solar energy, grow a battery, redeploy solar panels from that battery months later. Beautiful.

    - +
    Warning: battery is reaching critical levels.
    - +
    The courageous potato perseveres in search of the light.

    -{%- endblock %} diff --git a/templates/projects.html.tera b/templates/projects/index.html similarity index 90% rename from templates/projects.html.tera rename to templates/projects/index.html index 95ccf4d..a05c378 100644 --- a/templates/projects.html.tera +++ b/templates/projects/index.html @@ -1,11 +1,7 @@ -{% extends "nav" %} -{% block title %}mycelial technology | projects{% endblock title %} -{% block content %}

    Projects

    I'm a tortoise and I shuffle between projects in eccentric orbits; sometimes I complete one.

    Active

    @@ -17,7 +13,7 @@

    Complete


    -{%- endblock %} diff --git a/templates/support.html.tera b/templates/support/index.html similarity index 89% rename from templates/support.html.tera rename to templates/support/index.html index a932ecb..3dde157 100644 --- a/templates/support.html.tera +++ b/templates/support/index.html @@ -1,6 +1,3 @@ -{% extends "nav" %} -{% block title %}mycelial technology | support{% endblock title %} -{% block content %}

    Support

    If you'd like to support my creative endeavours, please consider contributing in one of the following ways:


    -{%- endblock %} diff --git a/templates/travel.html.tera b/templates/travel.html.tera deleted file mode 100644 index c6c9581..0000000 --- a/templates/travel.html.tera +++ /dev/null @@ -1,5 +0,0 @@ -{% extends "nav" %} -{% block content %} -

    Travel

    -
    -{%- endblock %}