diff --git a/Cargo.lock b/Cargo.lock index c7c37d40..e58ce862 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,12 +8,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78d1833b3838dbe990df0f1f87baf640cf6146e898166afe401839d1b001e570" dependencies = [ - "bitflags", + "bitflags 1.3.2", "bytes 0.5.6", "futures-core", "futures-sink", "log", - "pin-project 0.4.29", + "pin-project 0.4.30", "tokio", "tokio-util", ] @@ -59,7 +59,7 @@ checksum = "c51e8a9146c12fce92a6e4c24b8c4d9b05268130bfd8d61bc587e822c32ce689" dependencies = [ "actix-service", "actix-web", - "bitflags", + "bitflags 1.3.2", "bytes 0.5.6", "derive_more", "futures-core", @@ -83,8 +83,8 @@ dependencies = [ "actix-service", "actix-threadpool", "actix-utils", - "base64 0.13.0", - "bitflags", + "base64 0.13.1", + "bitflags 1.3.2", "brotli", "bytes 0.5.6", "cookie", @@ -107,7 +107,7 @@ dependencies = [ "log", "mime", "percent-encoding", - "pin-project 1.0.10", + "pin-project 1.0.12", "rand 0.7.3", "regex", "serde", @@ -125,7 +125,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ca8ce00b267af8ccebbd647de0d61e0674b6e61185cc7a592ff88772bed655" dependencies = [ "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -201,7 +201,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0052435d581b5be835d11f4eb3bce417c8af18d87ddf8ace99f8e67e595882bb" dependencies = [ "futures-util", - "pin-project 0.4.29", + "pin-project 0.4.30", ] [[package]] @@ -269,14 +269,14 @@ dependencies = [ "actix-codec", "actix-rt", "actix-service", - "bitflags", + "bitflags 1.3.2", "bytes 0.5.6", "either", "futures-channel", "futures-sink", "futures-util", "log", - "pin-project 0.4.29", + "pin-project 0.4.30", "slab", ] @@ -308,7 +308,7 @@ dependencies = [ "fxhash", "log", "mime", - "pin-project 1.0.10", + "pin-project 1.0.12", "regex", "serde", "serde_json", @@ -327,7 +327,7 @@ checksum = "ad26f77093333e0e7c6ffe54ebe3582d908a104e448723eec6d43d08b07143fb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -396,35 +396,44 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.7", + "getrandom 0.2.9", "once_cell", "version_check 0.9.4", ] [[package]] name = "aho-corasick" -version = "0.7.18" +version = "0.7.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" dependencies = [ "memchr", ] [[package]] name = "alloc-no-stdlib" -version = "2.0.3" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35ef4730490ad1c4eae5c4325b2a95f521d023e5c885853ff7aca0a6a1631db3" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" [[package]] name = "alloc-stdlib" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697ed7edc0f1711de49ce108c541623a0af97c6c60b2f6e2b65229847ac843c2" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "ansi_term" version = "0.12.1" @@ -442,13 +451,13 @@ checksum = "71938f30533e4d95a6d17aa530939da3842c2ab6f4f84b9dae68447e4129f74a" [[package]] name = "async-trait" -version = "0.1.56" +version = "0.1.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716" +checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] @@ -457,7 +466,7 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", + "hermit-abi 0.1.19", "libc", "winapi 0.3.9", ] @@ -487,7 +496,7 @@ dependencies = [ "actix-http", "actix-rt", "actix-service", - "base64 0.13.0", + "base64 0.13.1", "bytes 0.5.6", "cfg-if 1.0.0", "derive_more", @@ -509,9 +518,9 @@ checksum = "ad9e605929a6964efbec5ac0884bd0fe93f12a3b1eb271f52c251316640c68d9" [[package]] name = "base-x" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc19a4937b4fbd3fe3379793130e42060d10627a360f2127802b10b87e7baf74" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" [[package]] name = "base64" @@ -534,9 +543,9 @@ dependencies = [ [[package]] name = "base64" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "bitflags" @@ -544,6 +553,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c70beb79cbb5ce9c4f8e20849978f34225931f665bb49efa6982875a4d5facb3" + [[package]] name = "block-buffer" version = "0.9.0" @@ -566,9 +581,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.3.2" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" +checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -591,9 +606,9 @@ checksum = "40e38929add23cdf8a366df9b0e088953150724bcbe5fc330b0d8eb3b328eec8" [[package]] name = "bumpalo" -version = "3.10.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "byteorder" @@ -609,24 +624,24 @@ checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" [[package]] name = "bytes" -version = "1.1.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "bytestring" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b6a75fd3048808ef06af5cd79712be8111960adaf89d90250974b38fc3928a" +checksum = "238e4886760d98c4f899360c834fa93e62cf7f721ac3c2da375cbdf4b8679aae" dependencies = [ - "bytes 1.1.0", + "bytes 1.4.0", ] [[package]] name = "cc" -version = "1.0.73" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" [[package]] name = "cfg-if" @@ -642,14 +657,16 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" dependencies = [ - "libc", + "iana-time-zone", + "js-sys", "num-integer", "num-traits", - "time 0.1.44", + "time 0.1.45", + "wasm-bindgen", "winapi 0.3.9", ] @@ -670,7 +687,7 @@ checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ "ansi_term", "atty", - "bitflags", + "bitflags 1.3.2", "strsim", "textwrap", "unicode-width", @@ -683,7 +700,17 @@ version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" dependencies = [ - "bitflags", + "bitflags 1.3.2", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", ] [[package]] @@ -723,7 +750,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03a5d7b21829bc7b4bf4754a978a241ae54ea55a40f92bb20216e54096f4b951" dependencies = [ "aes-gcm", - "base64 0.13.0", + "base64 0.13.1", "hkdf", "hmac", "percent-encoding", @@ -751,15 +778,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cpufeatures" -version = "0.2.2" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" dependencies = [ "libc", ] @@ -810,6 +837,50 @@ dependencies = [ "cipher", ] +[[package]] +name = "cxx" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f61f1b6389c3fe1c316bf8a4dccc90a38208354b330925bce1f74a6c4756eb93" +dependencies = [ + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12cee708e8962df2aeb38f594aae5d827c022b6460ac71a7a3e2c3c2aae5a07b" +dependencies = [ + "cc", + "codespan-reporting", + "once_cell", + "proc-macro2", + "quote", + "scratch", + "syn 2.0.15", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7944172ae7e4068c533afbb984114a56c46e9ccddda550499caa222902c7f7bb" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2345488264226bf682893e25de0769f3360aac9957980ec49361b083ddaa5bc5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + [[package]] name = "derive_more" version = "0.99.17" @@ -820,7 +891,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.0", - "syn", + "syn 1.0.109", ] [[package]] @@ -840,9 +911,9 @@ checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" [[package]] name = "either" -version = "1.6.1" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "email" @@ -855,7 +926,7 @@ dependencies = [ "encoding", "lazy_static", "rand 0.4.6", - "time 0.1.44", + "time 0.1.45", "version_check 0.1.5", ] @@ -925,9 +996,9 @@ checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" [[package]] name = "encoding_rs" -version = "0.8.31" +version = "0.8.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" dependencies = [ "cfg-if 1.0.0", ] @@ -941,7 +1012,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -957,6 +1028,27 @@ dependencies = [ "termcolor", ] +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -980,18 +1072,18 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.7.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" dependencies = [ "instant", ] [[package]] name = "flate2" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" +checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" dependencies = [ "crc32fast", "miniz_oxide", @@ -1020,11 +1112,10 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" dependencies = [ - "matches", "percent-encoding", ] @@ -1040,7 +1131,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" dependencies = [ - "bitflags", + "bitflags 1.3.2", "fuchsia-zircon-sys", ] @@ -1058,9 +1149,9 @@ checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" [[package]] name = "futures" -version = "0.3.21" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e" +checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" dependencies = [ "futures-channel", "futures-core", @@ -1072,9 +1163,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.21" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" dependencies = [ "futures-core", "futures-sink", @@ -1082,44 +1173,44 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.21" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" [[package]] name = "futures-io" -version = "0.3.21" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" +checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" [[package]] name = "futures-macro" -version = "0.3.21" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] name = "futures-sink" -version = "0.3.21" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" [[package]] name = "futures-task" -version = "0.3.21" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" [[package]] name = "futures-util" -version = "0.3.21" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" dependencies = [ "futures-channel", "futures-core", @@ -1144,9 +1235,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.5" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check 0.9.4", @@ -1165,9 +1256,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" dependencies = [ "cfg-if 1.0.0", "libc", @@ -1206,33 +1297,27 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] -[[package]] -name = "hashbrown" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3" - [[package]] name = "hashlink" -version = "0.7.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" +checksum = "69fe1fcf8b4278d860ad0548329f892a3631fb63f82574df68275f34cdbe0ffa" dependencies = [ - "hashbrown 0.11.2", + "hashbrown", ] [[package]] name = "heck" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" @@ -1243,6 +1328,21 @@ dependencies = [ "libc", ] +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + [[package]] name = "hex" version = "0.3.2" @@ -1298,20 +1398,20 @@ dependencies = [ [[package]] name = "http" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ - "bytes 1.1.0", + "bytes 1.4.0", "fnv", - "itoa 1.0.2", + "itoa 1.0.6", ] [[package]] name = "httparse" -version = "1.7.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "humantime" @@ -1322,6 +1422,30 @@ dependencies = [ "quick-error", ] +[[package]] +name = "iana-time-zone" +version = "0.1.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +dependencies = [ + "cxx", + "cxx-build", +] + [[package]] name = "idna" version = "0.2.3" @@ -1333,14 +1457,24 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indexmap" -version = "1.9.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c6392766afd7964e2531940894cffe4bd8d7d17dbc3c1c4857040fd4b33bdb3" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg 1.1.0", - "hashbrown 0.12.1", + "hashbrown", ] [[package]] @@ -1352,6 +1486,17 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "io-lifetimes" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "iovec" version = "0.1.4" @@ -1381,9 +1526,18 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.2" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "js-sys" +version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +dependencies = [ + "wasm-bindgen", +] [[package]] name = "json" @@ -1441,37 +1595,52 @@ dependencies = [ "email", "lettre", "mime", - "time 0.1.44", + "time 0.1.45", "uuid 0.7.4", ] [[package]] name = "libc" -version = "0.2.126" +version = "0.2.141" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" [[package]] name = "libsqlite3-sys" -version = "0.24.2" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "898745e570c7d0453cc1fbc4a701eb6c662ed54e8fec8b7d14be137ebeeb9d14" +checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326" dependencies = [ "pkg-config", "vcpkg", ] +[[package]] +name = "link-cplusplus" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" +dependencies = [ + "cc", +] + [[package]] name = "linked-hash-map" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" [[package]] name = "lock_api" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ "autocfg 1.1.0", "scopeguard", @@ -1503,9 +1672,9 @@ checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] name = "matches" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "memchr" @@ -1515,9 +1684,9 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime_guess" @@ -1531,9 +1700,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.5.3" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" dependencies = [ "adler", ] @@ -1582,9 +1751,9 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" dependencies = [ "lazy_static", "libc", @@ -1600,9 +1769,9 @@ dependencies = [ [[package]] name = "net2" -version = "0.2.37" +version = "0.2.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" +checksum = "74d0df99cfcd2530b2e694f6e17e7f37b8e26bb23983ac530c0c97408837c631" dependencies = [ "cfg-if 0.1.10", "libc", @@ -1640,19 +1809,19 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.13.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi", + "hermit-abi 0.2.6", "libc", ] [[package]] name = "once_cell" -version = "1.12.0" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "opaque-debug" @@ -1662,11 +1831,11 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.40" +version = "0.10.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e" +checksum = "7e30d8bc91859781f0a943411186324d580f2bbeb71b452fe91ae344806af3f1" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if 1.0.0", "foreign-types", "libc", @@ -1677,13 +1846,13 @@ dependencies = [ [[package]] name = "openssl-macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] @@ -1694,11 +1863,10 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.74" +version = "0.9.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835363342df5fba8354c5b453325b110ffd54044e588c539cf2f20a8014e4cb1" +checksum = "0d3d193fb1488ad46ffe3aaabc912cc931d02ee8518fe2959aea8ef52718b0c0" dependencies = [ - "autocfg 1.1.0", "cc", "libc", "pkg-config", @@ -1713,7 +1881,7 @@ dependencies = [ "actix-session", "actix-web", "barrel", - "base64 0.13.0", + "base64 0.13.1", "chrono", "clap", "crypto-hash", @@ -1730,7 +1898,7 @@ dependencies = [ "serde_derive", "serde_json", "simple-error", - "time 0.1.44", + "time 0.1.45", "timer", "toml", "uuid 0.8.2", @@ -1749,62 +1917,62 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" dependencies = [ "cfg-if 1.0.0", "instant", "libc", - "redox_syscall", + "redox_syscall 0.2.16", "smallvec", "winapi 0.3.9", ] [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "pin-project" -version = "0.4.29" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9615c18d31137579e9ff063499264ddc1278e7b1982757ebc111028c4d1dc909" +checksum = "3ef0f924a5ee7ea9cbcea77529dba45f8a9ba9f622419fe3386ca581a3ae9d5a" dependencies = [ - "pin-project-internal 0.4.29", + "pin-project-internal 0.4.30", ] [[package]] name = "pin-project" -version = "1.0.10" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" +checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" dependencies = [ - "pin-project-internal 1.0.10", + "pin-project-internal 1.0.12", ] [[package]] name = "pin-project-internal" -version = "0.4.29" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "044964427019eed9d49d9d5bbce6047ef18f37100ea400912a9fa4a3523ab12a" +checksum = "851c8d0ce9bebe43790dedfc86614c23494ac9f423dd618d3a61fc693eafe61e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "pin-project-internal" -version = "1.0.10" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" +checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1827,9 +1995,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.25" +version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" [[package]] name = "polyval" @@ -1844,21 +2012,21 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro-hack" -version = "0.5.19" +version = "0.5.20+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.40" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" dependencies = [ "unicode-ident", ] @@ -1871,9 +2039,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.20" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" dependencies = [ "proc-macro2", ] @@ -1944,7 +2112,7 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha 0.3.1", - "rand_core 0.6.3", + "rand_core 0.6.4", ] [[package]] @@ -1974,7 +2142,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core 0.6.3", + "rand_core 0.6.4", ] [[package]] @@ -2003,11 +2171,11 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.7", + "getrandom 0.2.9", ] [[package]] @@ -2092,18 +2260,27 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.13" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] name = "regex" -version = "1.5.6" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" +checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" dependencies = [ "aho-corasick", "memchr", @@ -2112,18 +2289,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" - -[[package]] -name = "remove_dir_all" -version = "0.5.3" +version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi 0.3.9", -] +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "resolv-conf" @@ -2137,16 +2305,15 @@ dependencies = [ [[package]] name = "rusqlite" -version = "0.27.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85127183a999f7db96d1a976a309eebbfb6ea3b0b400ddd8340190129de6eb7a" +checksum = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2" dependencies = [ - "bitflags", + "bitflags 2.1.0", "fallible-iterator", "fallible-streaming-iterator", "hashlink", "libsqlite3-sys", - "memchr", "smallvec", ] @@ -2165,14 +2332,28 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.10", + "semver 1.0.17", +] + +[[package]] +name = "rustix" +version = "0.37.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85597d61f83914ddeba6a47b3b8ffe7365107221c2e557ed94426489fefb5f77" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", ] [[package]] name = "ryu" -version = "1.0.10" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" [[package]] name = "safemem" @@ -2182,12 +2363,11 @@ checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" [[package]] name = "schannel" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" dependencies = [ - "lazy_static", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -2196,13 +2376,19 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "scratch" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1" + [[package]] name = "security-framework" -version = "2.6.1" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" +checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -2211,9 +2397,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.6.1" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" dependencies = [ "core-foundation-sys", "libc", @@ -2230,9 +2416,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.10" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41d061efea015927ac527063765e73601444cdc344ba855bc7bd44578b25e1c" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" [[package]] name = "semver-parser" @@ -2242,31 +2428,31 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.137" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.137" +version = "1.0.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] name = "serde_json" -version = "1.0.81" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ - "itoa 1.0.2", + "itoa 1.0.6", "ryu", "serde", ] @@ -2278,7 +2464,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.2", + "itoa 1.0.6", "ryu", "serde", ] @@ -2326,9 +2512,9 @@ dependencies = [ [[package]] name = "sha256" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e334db67871c14c18fc066ad14af13f9fdf5f9a91c61af432d1e3a39c8c6a141" +checksum = "328169f167261957e83d82be47f9e36629e257c62308129033d7f7e7c173d180" dependencies = [ "hex 0.4.3", "sha2", @@ -2336,9 +2522,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ "libc", ] @@ -2351,15 +2537,18 @@ checksum = "cc47a29ce97772ca5c927f75bac34866b16d64e07f330c3248e2d7226623901b" [[package]] name = "slab" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg 1.1.0", +] [[package]] name = "smallvec" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "socket2" @@ -2405,7 +2594,7 @@ dependencies = [ "quote", "serde", "serde_derive", - "syn", + "syn 1.0.109", ] [[package]] @@ -2421,7 +2610,7 @@ dependencies = [ "serde_derive", "serde_json", "sha1", - "syn", + "syn 1.0.109", ] [[package]] @@ -2444,9 +2633,20 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.98" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" dependencies = [ "proc-macro2", "quote", @@ -2455,23 +2655,22 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.3.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" dependencies = [ "cfg-if 1.0.0", "fastrand", - "libc", - "redox_syscall", - "remove_dir_all", - "winapi 0.3.9", + "redox_syscall 0.3.5", + "rustix", + "windows-sys 0.45.0", ] [[package]] name = "termcolor" -version = "1.1.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" dependencies = [ "winapi-util", ] @@ -2487,22 +2686,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.31" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.31" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] @@ -2516,9 +2715,9 @@ dependencies = [ [[package]] name = "time" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" dependencies = [ "libc", "wasi 0.10.0+wasi-snapshot-preview1", @@ -2560,7 +2759,7 @@ dependencies = [ "proc-macro2", "quote", "standback", - "syn", + "syn 1.0.109", ] [[package]] @@ -2583,9 +2782,9 @@ dependencies = [ [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" @@ -2623,18 +2822,18 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] [[package]] name = "tracing" -version = "0.1.35" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if 1.0.0", "log", @@ -2644,9 +2843,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.27" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7709595b8878a4965ce5e87ebf880a7d39c9afc6837721b21a5a816a8117d921" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" dependencies = [ "once_cell", ] @@ -2657,7 +2856,7 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" dependencies = [ - "pin-project 1.0.10", + "pin-project 1.0.12", "tracing", ] @@ -2670,8 +2869,8 @@ dependencies = [ "async-trait", "cfg-if 1.0.0", "enum-as-inner", - "futures 0.3.21", - "idna", + "futures 0.3.28", + "idna 0.2.3", "lazy_static", "log", "rand 0.7.3", @@ -2688,7 +2887,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "710f593b371175db53a26d0b38ed2978fafb9e9e8d3868b1acd753ea18df0ceb" dependencies = [ "cfg-if 0.1.10", - "futures 0.3.21", + "futures 0.3.28", "ipconfig", "lazy_static", "log", @@ -2712,9 +2911,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "unchecked-index" @@ -2733,30 +2932,30 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.8" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.1" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" [[package]] name = "unicode-normalization" -version = "0.1.19" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] [[package]] name = "unicode-width" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "universal-hash" @@ -2770,13 +2969,12 @@ dependencies = [ [[package]] name = "url" -version = "2.2.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" dependencies = [ "form_urlencoded", - "idna", - "matches", + "idna 0.3.0", "percent-encoding", ] @@ -2795,7 +2993,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.7", + "getrandom 0.2.9", "serde", ] @@ -2818,7 +3016,7 @@ dependencies = [ "nom", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2875,9 +3073,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.81" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -2885,24 +3083,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.81" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.81" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2910,22 +3108,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.81" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.81" +version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "widestring" @@ -2976,48 +3174,161 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.0", +] + [[package]] name = "windows-sys" -version = "0.36.1" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" dependencies = [ - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" -version = "0.36.1" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.36.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" -version = "0.36.1" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" -version = "0.36.1" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" -version = "0.36.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winreg" @@ -3057,7 +3368,7 @@ dependencies = [ "actix-session", "actix-web", "barrel", - "base64 0.13.0", + "base64 0.13.1", "chrono", "clap", "crypto-hash", @@ -3077,7 +3388,7 @@ dependencies = [ "serde_json", "sha256", "simple-error", - "time 0.1.44", + "time 0.1.45", "timer", "toml", "uuid 0.8.2", diff --git a/elm/elm-srcs.nix b/elm/elm-srcs.nix index c3ca7dbb..d38aeff0 100644 --- a/elm/elm-srcs.nix +++ b/elm/elm-srcs.nix @@ -1,8 +1,28 @@ { - "mdgriffith/elm-ui" = { - sha256 = "0ffcqv4a4ad400hwp824m3qq4jy82cqp5ghmhp1m0q7n004z6kgv"; - version = "1.1.8"; + "PanagiotisGeorgiadis/elm-datetime" = { + sha256 = "10fd2pad1kv8gm8zj2ixspyyxjqlzx50s3di17vl51gp41j05qbw"; + version = "1.3.0"; + }; + + "TSFoster/elm-uuid" = { + sha256 = "1a4a7hlp7mynbng9sykicm48zjwkw9w8bsik0zskgwa06qsmjq85"; + version = "4.1.0"; + }; + + "annaghi/dnd-list" = { + sha256 = "0pmnyiz1b0si8yip6wmixlybgxa8gnh3zwdpbxgq2zqwp7jx52xs"; + version = "6.0.1"; + }; + + "bburdette/cellme" = { + sha256 = "1sdcacja10f0y64jw4pr007hjf6ivhi8syi0mdvlw2vx61fdzvy7"; + version = "1.0.0"; + }; + + "bburdette/httpjsontask" = { + sha256 = "0lxc99j1c8zzw07c331r2yxriig84hwhnni6lhwqf6sxjlcjy3g4"; + version = "1.0.0"; }; "bburdette/schelme" = { @@ -10,14 +30,14 @@ version = "3.0.0"; }; - "elm/html" = { - sha256 = "1n3gpzmpqqdsldys4ipgyl1zacn0kbpc3g4v3hdpiyfjlgh8bf3k"; - version = "1.0.0"; + "bburdette/toop" = { + sha256 = "10i3j97pzc903n0rwkxna6g1pf3lg4zipgrg6r2glygzazaigbs7"; + version = "1.2.0"; }; - "elm/regex" = { - sha256 = "0lijsp50w7n1n57mjg6clpn9phly8vvs07h0qh2rqcs0f1jqvsa2"; - version = "1.0.0"; + "bburdette/typed-collections" = { + sha256 = "1j8hkw35dkc9kcdyxz2vqdv500b9pfar55bq20ybznkbm02c6k8w"; + version = "1.0.2"; }; "bburdette/windowkeys" = { @@ -25,44 +45,39 @@ version = "1.0.1"; }; + "dillonkearns/elm-markdown" = { + sha256 = "05chrkn14b3yyv3sq3466ys4bhwdxva853fzbyc1dyjpk3vslqsc"; + version = "7.0.0"; + }; + + "elm-community/maybe-extra" = { + sha256 = "185jy9jxx3bqf0xl3rmdxfqqmxzcr084llf32glr6hgl5agshywk"; + version = "5.3.0"; + }; + "elm/browser" = { sha256 = "0nagb9ajacxbbg985r4k9h0jadqpp0gp84nm94kcgbr5sf8i9x13"; version = "1.0.2"; }; - "bburdette/cellme" = { - sha256 = "1sdcacja10f0y64jw4pr007hjf6ivhi8syi0mdvlw2vx61fdzvy7"; - version = "1.0.0"; - }; - "elm/core" = { sha256 = "19w0iisdd66ywjayyga4kv2p1v9rxzqjaxhckp8ni6n8i0fb2dvf"; version = "1.0.5"; }; - "elm/url" = { - sha256 = "0av8x5syid40sgpl5vd7pry2rq0q4pga28b4yykn9gd9v12rs3l4"; - version = "1.0.0"; - }; - "elm/file" = { sha256 = "1rljcb41dl97myidyjih2yliyzddkr2m7n74x7gg46rcw4jl0ny8"; version = "1.0.5"; }; - "prikhi/http-tasks" = { - sha256 = "0b84zhq9cxpk2fp8n8drsh47gwqn9hdzjkcgqmh4fi98yi5aard5"; + "elm/html" = { + sha256 = "1n3gpzmpqqdsldys4ipgyl1zacn0kbpc3g4v3hdpiyfjlgh8bf3k"; version = "1.0.0"; }; - "bburdette/toop" = { - sha256 = "10i3j97pzc903n0rwkxna6g1pf3lg4zipgrg6r2glygzazaigbs7"; - version = "1.2.0"; - }; - - "elm-community/maybe-extra" = { - sha256 = "185jy9jxx3bqf0xl3rmdxfqqmxzcr084llf32glr6hgl5agshywk"; - version = "5.3.0"; + "elm/http" = { + sha256 = "008bs76mnp48b4dw8qwjj4fyvzbxvlrl4xpa2qh1gg2kfwyw56v1"; + version = "2.0.0"; }; "elm/json" = { @@ -75,34 +90,14 @@ version = "1.1.0"; }; - "dillonkearns/elm-markdown" = { - sha256 = "05chrkn14b3yyv3sq3466ys4bhwdxva853fzbyc1dyjpk3vslqsc"; - version = "7.0.0"; - }; - - "TSFoster/elm-uuid" = { - sha256 = "1a4a7hlp7mynbng9sykicm48zjwkw9w8bsik0zskgwa06qsmjq85"; - version = "4.1.0"; - }; - - "PanagiotisGeorgiadis/elm-datetime" = { - sha256 = "10fd2pad1kv8gm8zj2ixspyyxjqlzx50s3di17vl51gp41j05qbw"; - version = "1.3.0"; - }; - - "bburdette/typed-collections" = { - sha256 = "1j8hkw35dkc9kcdyxz2vqdv500b9pfar55bq20ybznkbm02c6k8w"; - version = "1.0.2"; - }; - "elm/random" = { sha256 = "138n2455wdjwa657w6sjq18wx2r0k60ibpc4frhbqr50sncxrfdl"; version = "1.0.0"; }; - "elm/http" = { - sha256 = "008bs76mnp48b4dw8qwjj4fyvzbxvlrl4xpa2qh1gg2kfwyw56v1"; - version = "2.0.0"; + "elm/regex" = { + sha256 = "0lijsp50w7n1n57mjg6clpn9phly8vvs07h0qh2rqcs0f1jqvsa2"; + version = "1.0.0"; }; "elm/time" = { @@ -110,19 +105,19 @@ version = "1.0.0"; }; - "TSFoster/elm-md5" = { - sha256 = "0qis57dmlaw97ixgpk30h569280bwrsr889hzy6pz9hzz184fym6"; - version = "2.0.0"; + "elm/url" = { + sha256 = "0av8x5syid40sgpl5vd7pry2rq0q4pga28b4yykn9gd9v12rs3l4"; + version = "1.0.0"; }; - "elm/virtual-dom" = { - sha256 = "0q1v5gi4g336bzz1lgwpn5b1639lrn63d8y6k6pimcyismp2i1yg"; - version = "1.0.2"; + "mdgriffith/elm-ui" = { + sha256 = "0ffcqv4a4ad400hwp824m3qq4jy82cqp5ghmhp1m0q7n004z6kgv"; + version = "1.1.8"; }; - "elm/bytes" = { - sha256 = "02ywbf52akvxclpxwj9n04jydajcbsbcbsnjs53yjc5lwck3abwj"; - version = "1.0.8"; + "prikhi/http-tasks" = { + sha256 = "0b84zhq9cxpk2fp8n8drsh47gwqn9hdzjkcgqmh4fi98yi5aard5"; + version = "1.0.0"; }; "TSFoster/elm-bytes-extra" = { @@ -130,14 +125,9 @@ version = "1.3.0"; }; - "zwilias/elm-utf-tools" = { - sha256 = "04wi45va7w2lyixvqhph2ainvjxba5vq8vy2qsk25qjaziz5hbja"; - version = "2.0.1"; - }; - - "rtfeldman/elm-hex" = { - sha256 = "1y0aa16asvwdqmgbskh5iba6psp43lkcjjw9mgzj3gsrg33lp00d"; - version = "1.0.0"; + "TSFoster/elm-md5" = { + sha256 = "0qis57dmlaw97ixgpk30h569280bwrsr889hzy6pz9hzz184fym6"; + version = "2.0.0"; }; "TSFoster/elm-sha1" = { @@ -150,6 +140,26 @@ version = "1.1.0"; }; + "elm/bytes" = { + sha256 = "02ywbf52akvxclpxwj9n04jydajcbsbcbsnjs53yjc5lwck3abwj"; + version = "1.0.8"; + }; + + "elm/virtual-dom" = { + sha256 = "0q1v5gi4g336bzz1lgwpn5b1639lrn63d8y6k6pimcyismp2i1yg"; + version = "1.0.2"; + }; + + "rtfeldman/elm-hex" = { + sha256 = "1y0aa16asvwdqmgbskh5iba6psp43lkcjjw9mgzj3gsrg33lp00d"; + version = "1.0.0"; + }; + + "zwilias/elm-utf-tools" = { + sha256 = "04wi45va7w2lyixvqhph2ainvjxba5vq8vy2qsk25qjaziz5hbja"; + version = "2.0.1"; + }; + "elm-explorations/test" = { sha256 = "1fsd7bajm7qa93r5pn3mdafqh3blpzya601jbs9l238p0hmvh576"; version = "1.2.2"; diff --git a/elm/elm.json b/elm/elm.json index d4801d64..4b736baf 100644 --- a/elm/elm.json +++ b/elm/elm.json @@ -10,7 +10,9 @@ "direct": { "PanagiotisGeorgiadis/elm-datetime": "1.3.0", "TSFoster/elm-uuid": "4.1.0", + "annaghi/dnd-list": "6.0.1", "bburdette/cellme": "1.0.0", + "bburdette/httpjsontask": "1.0.0", "bburdette/schelme": "3.0.0", "bburdette/toop": "1.2.0", "bburdette/typed-collections": "1.0.2", diff --git a/elm/registry.dat b/elm/registry.dat index 6084c30e..42a81cbb 100644 Binary files a/elm/registry.dat and b/elm/registry.dat differ diff --git a/elm/src/Data.elm b/elm/src/Data.elm index 7d469603..f4f2538f 100644 --- a/elm/src/Data.elm +++ b/elm/src/Data.elm @@ -265,10 +265,30 @@ type alias GetZkNoteComments = type alias GetZkNoteEdit = { zknote : Int + , what : String + } + + +type alias GetZneIfChanged = + { zknote : Int + , changeddate : Int + , what : String + } + + +type alias ZkNoteEditWhat = + { what : String + , zne : ZkNoteEdit } type alias ZkNoteEdit = + { zknote : ZkNote + , links : List EditLink + } + + +type alias PubZkNote = { zknote : ZkNote , links : List EditLink , panelNote : Maybe ZkNote @@ -316,6 +336,16 @@ encodeGetZkNoteEdit : GetZkNoteEdit -> JE.Value encodeGetZkNoteEdit gzl = JE.object [ ( "zknote", JE.int gzl.zknote ) + , ( "what", JE.string gzl.what ) + ] + + +encodeGetZneIfChanged : GetZneIfChanged -> JE.Value +encodeGetZneIfChanged x = + JE.object + [ ( "zknote", JE.int x.zknote ) + , ( "changeddate", JE.int x.changeddate ) + , ( "what", JE.string x.what ) ] @@ -532,10 +562,16 @@ decodeZkNoteArchives = decodeZkNoteEdit : JD.Decoder ZkNoteEdit decodeZkNoteEdit = - JD.map3 ZkNoteEdit + JD.map2 ZkNoteEdit (JD.field "zknote" decodeZkNote) (JD.field "links" (JD.list decodeEditLink)) - (JD.succeed Nothing) + + +decodeZkNoteEditWhat : JD.Decoder ZkNoteEditWhat +decodeZkNoteEditWhat = + JD.map2 ZkNoteEditWhat + (JD.field "what" JD.string) + (JD.field "zne" decodeZkNoteEdit) decodeLoginData : JD.Decoder LoginData diff --git a/elm/src/EditZkNote.elm b/elm/src/EditZkNote.elm index b6777c9a..ec50e694 100644 --- a/elm/src/EditZkNote.elm +++ b/elm/src/EditZkNote.elm @@ -14,6 +14,7 @@ module EditZkNote exposing , dirty , disabledLinkButtonStyle , fullSave + , ghostView , initFull , initNew , isPublic @@ -35,6 +36,7 @@ module EditZkNote exposing , setHomeNote , showSr , showZkl + , subscriptions , sznFromModel , tabsOnLoad , toPubId @@ -62,8 +64,8 @@ import Element.Events as EE import Element.Font as EF import Element.Input as EI import Element.Region as ER -import Html exposing (Attribute, Html) -import Html.Attributes +import Html exposing (Html) +import Html.Attributes as HA import Json.Decode as JD import Markdown.Block as Block exposing (Block, Inline, ListItem(..), Task(..), inlineFoldl) import Markdown.Html @@ -71,6 +73,9 @@ import Markdown.Parser import Markdown.Renderer import Maybe.Extra as ME import MdCommon as MC +import MdList as ML +import MdText as MT +import NoteCache as NC exposing (NoteCache) import Orgauth.Data exposing (UserId) import RequestsDialog exposing (TRequests) import Schelme.Show exposing (showTerm) @@ -84,6 +89,7 @@ import Url as U import Url.Builder as UB import Url.Parser as UP exposing (()) import Util +import ViewLinearMd as VLM import WindowKeys as WK import ZkCommon as ZC @@ -133,11 +139,15 @@ type Msg | RequestsPress | FlipLink EditLink | ShowArchivesPress + | VLMMsg VLM.Msg + | MLMsg ML.Msg | Noop type NavChoice = NcEdit + | NcList + | NcMdList | NcView | NcSearch | NcRecent @@ -150,6 +160,8 @@ type SearchOrRecent type EditOrView = EditView + | ListView + | MdListView | ViewView @@ -198,6 +210,8 @@ type alias Model = , dialog : Maybe D.Model , panelNote : Maybe Data.ZkNote , mbReplaceString : Maybe String + , mlModel : VLM.Model + , mdlModel : ML.Model } @@ -223,7 +237,7 @@ type Command | Settings | Admin | Requests - | GetZkNote Int + | GetZkNoteWhat Int String | SetHomeNote Int | AddToRecent Data.ZkListNote | ShowMessage String @@ -232,6 +246,18 @@ type Command | Cmd (Cmd Msg) +subscriptions : Model -> Sub Msg +subscriptions model = + Sub.map VLMMsg <| VLM.subscriptions model.mlModel + + +ghostView : Model -> Maybe (E.Element Msg) +ghostView model = + VLM.ghostView model.mlModel + |> Maybe.map + (E.map VLMMsg) + + onZkNote : Data.ZkNote -> Model -> ( Model, Command ) onZkNote zkn model = ( { model | panelNote = Just zkn } @@ -576,14 +602,14 @@ pageLink model = ) -view : Time.Zone -> Util.Size -> List Data.ZkListNote -> TRequests -> Model -> Element Msg -view zone size recentZkns trqs model = +view : Time.Zone -> Util.Size -> List Data.ZkListNote -> TRequests -> NoteCache -> Model -> Element Msg +view zone size recentZkns trqs noteCache model = case model.dialog of Just dialog -> D.view size dialog |> E.map DialogMsg Nothing -> - zknview zone size recentZkns trqs model + zknview zone size recentZkns trqs noteCache model commonButtonStyle : Bool -> List (E.Attribute msg) @@ -839,9 +865,9 @@ addComment ncs = ] -renderMd : CellDict -> String -> Int -> Element Msg -renderMd cd md mdw = - case MC.markdownView (MC.mkRenderer MC.EditView RestoreSearch mdw cd True OnSchelmeCodeChanged) md of +renderMd : CellDict -> NoteCache -> String -> Int -> Element Msg +renderMd cd noteCache md mdw = + case MC.markdownView (MC.mkRenderer MC.EditView RestoreSearch mdw cd True OnSchelmeCodeChanged noteCache) md of Ok rendered -> E.column [ E.spacing 30 @@ -859,8 +885,8 @@ renderMd cd md mdw = E.text errors -zknview : Time.Zone -> Util.Size -> List Data.ZkListNote -> TRequests -> Model -> Element Msg -zknview zone size recentZkns trqs model = +zknview : Time.Zone -> Util.Size -> List Data.ZkListNote -> TRequests -> NoteCache -> Model -> Element Msg +zknview zone size recentZkns trqs noteCache model = let wclass = if size.width < 800 then @@ -915,7 +941,7 @@ zknview zone size recentZkns trqs model = , columns = [ { header = E.none , width = E.fill - , view = \zkn -> renderMd model.cells zkn.content mdw + , view = \zkn -> renderMd model.cells noteCache zkn.content mdw } , { header = E.none , width = E.shrink @@ -1029,6 +1055,45 @@ zknview zone size recentZkns trqs model = else [ EF.color TC.darkGrey ] + blocksToStringView = + E.column + [ E.width E.fill + , E.centerX + , E.alignTop + , E.spacing 8 + , E.paddingXY 5 0 + ] + <| + [ E.column + [ E.centerX + , E.paddingXY 0 10 + , E.spacing 8 + ] + [ E.row [ E.width E.fill, E.spacing 8 ] + [ E.paragraph [ EF.bold ] [ E.text model.title ] + ] + , case MT.renderMdText model.md of + Err e -> + E.text e + + Ok s -> + E.html <| + Html.div + [ HA.style "white-space" "pre-wrap" + , HA.style "word-break" "break-word" + ] + [ Html.text <| + s + ] + ] + ] + + listview = + E.map VLMMsg <| VLM.view model.mlModel + + mdlistview = + E.map MLMsg <| ML.view model.mdlModel + editview linkbkc = let titleed = @@ -1040,11 +1105,11 @@ zknview zone size recentZkns trqs model = else [] ) - ++ [ E.htmlAttribute (Html.Attributes.id "title") + ++ [ E.htmlAttribute (HA.id "title") ] else - [ EF.color TC.darkGrey, E.htmlAttribute (Html.Attributes.id "title") ] + [ EF.color TC.darkGrey, E.htmlAttribute (HA.id "title") ] ) { onChange = if editable then @@ -1211,7 +1276,7 @@ zknview zone size recentZkns trqs model = else EF.color TC.darkGrey - , E.htmlAttribute (Html.Attributes.id "mdtext") + , E.htmlAttribute (HA.id "mdtext") , E.alignTop ] ++ (if isdirty then @@ -1283,7 +1348,7 @@ zknview zone size recentZkns trqs model = EI.button (E.alignRight :: Common.buttonStyle) { label = E.text ">", onPress = Just <| AddToSearchAsTag model.title } ] - , renderMd model.cells model.md mdw + , renderMd model.cells noteCache model.md mdw ] ] ++ (if wclass == Wide then @@ -1480,6 +1545,10 @@ zknview zone size recentZkns trqs model = ] [ headingPanel "edit" [ E.width E.fill ] (editview TC.white) , headingPanel "view" [ E.width E.fill ] (mdview TC.white) + , headingPanel "list" [ E.width E.fill ] listview + , headingPanel "mdlist" [ E.width E.fill ] mdlistview + + -- , headingPanel "list" [ E.width E.fill ] blocksToStringView , searchOrRecentPanel ] @@ -1504,6 +1573,12 @@ zknview zone size recentZkns trqs model = EditView -> NcEdit + ListView -> + NcList + + MdListView -> + NcMdList + ViewView -> NcView ) @@ -1516,11 +1591,18 @@ zknview zone size recentZkns trqs model = else "markdown" ) + , ( NcList, "list" ) ] , case model.editOrView of EditView -> editview TC.white + ListView -> + listview + + MdListView -> + mdlistview + ViewView -> mdview TC.white ] @@ -1540,6 +1622,7 @@ zknview zone size recentZkns trqs model = else "markdown" ) + , ( NcList, "list" ) , ( NcSearch, "search" ) , ( NcRecent, "recent" ) ] @@ -1547,6 +1630,12 @@ zknview zone size recentZkns trqs model = NcEdit -> editview TC.lightGray + NcList -> + listview + + NcMdList -> + mdlistview + NcView -> mdview TC.lightGray @@ -1593,6 +1682,12 @@ tabsOnLoad model = EditView -> NcEdit + ListView -> + NcList + + MdListView -> + NcMdList + ViewView -> NcView } @@ -1623,6 +1718,10 @@ initFull ld zkl zknote dtlinks spm = } ) dtlinks + + blocks = + Markdown.Parser.parse zknote.content + |> Result.withDefault [] in ( { id = Just zknote.id , ld = ld @@ -1661,6 +1760,8 @@ initFull ld zkl zknote dtlinks spm = , dialog = Nothing , panelNote = Nothing , mbReplaceString = Nothing + , mlModel = VLM.init blocks + , mdlModel = ML.init blocks } , { zknote = zknote.id, offset = 0, limit = Nothing } ) @@ -1713,6 +1814,8 @@ initNew ld zkl spm links = , dialog = Nothing , panelNote = Nothing , mbReplaceString = Nothing + , mlModel = VLM.init [] + , mdlModel = ML.init [] } |> (\m1 -> -- for new EMPTY notes, the 'revert' should be the same as the model, so that you aren't @@ -1833,20 +1936,17 @@ onTASelection model recentZkns tas = let addLink title id = let - desc = + linktext = if tas.text == "" then - title + "" else - tas.text - - linktext = - "[" - ++ desc - ++ "](" - ++ "/note/" - ++ String.fromInt id - ++ ")" + "[" + ++ tas.text + ++ "](" + ++ "/note/" + ++ String.fromInt id + ++ ")" in TAUpdated { model @@ -2154,7 +2254,7 @@ update msg model = else ( model - , GetZkNote panel.noteid + , GetZkNoteWhat panel.noteid "panel" ) Nothing -> @@ -2364,6 +2464,7 @@ update msg model = size [] (TRequests 0 Dict.empty) + (NC.empty 0) model ) ) @@ -2548,6 +2649,9 @@ update msg model = NcEdit -> EditView + NcList -> + ListView + NcView -> ViewView @@ -2667,5 +2771,24 @@ update msg model = RequestsPress -> ( model, Requests ) + VLMMsg vmsg -> + let + ( mlModel, cmd ) = + VLM.update model.mlModel vmsg + in + ( { model | mlModel = mlModel } + , Cmd (Cmd.map VLMMsg cmd) + ) + + MLMsg vmsg -> + -- let + -- ( mdlModel, cmd ) = + -- ML.update model.mdlModel vmsg + -- in + -- ( { model | mdlModel = mdlModel } + -- , Cmd (Cmd.map MLMsg cmd) + -- ) + ( model, None ) + Noop -> ( model, None ) diff --git a/elm/src/LinearMd.elm b/elm/src/LinearMd.elm new file mode 100644 index 00000000..09f832f5 --- /dev/null +++ b/elm/src/LinearMd.elm @@ -0,0 +1,527 @@ +module LinearMd exposing (..) + +import Element as E exposing (Element) +import Element.Background as EBk +import Element.Border as EBd +import Element.Events as EE +import Element.Font as EF +import Element.Input as EI +import Element.Region as ER +import Markdown.Block as MB +import TangoColors as TC + + +type MdElement + = -- Container Blocks + HtmlBlock (MB.Html MB.Block) + | UnorderedListStart MB.ListSpacing -- (List (ListItem Block)) + | UnorderedListItem MB.Task (List MB.Block) + | UnorderedListEnd + | OrderedListStart MB.ListSpacing Int -- (List (List Block)) + | OrderedListItem (List MB.Block) + | OrderedListEnd + | BlockQuoteStart -- list blocks + | BlockQuoteEnd + -- Leaf Blocks With Inlines + | HeadingStart MB.HeadingLevel + | HeadingEnd + | ParagraphStart + | ParagraphEnd + | Table (List { label : List MB.Inline, alignment : Maybe MB.Alignment }) (List (List (List MB.Inline))) + -- Leaf Blocks Without Inlines + | CodeBlock { body : String, language : Maybe String } + | ThematicBreak + -- Inlines + | HtmlInline (MB.Html MB.Block) + | Link String (Maybe String) (List MB.Inline) + | Image String (Maybe String) (List MB.Inline) + | EmphasisBegin + | EmphasisEnd + | StrongBegin + | StrongEnd + | StrikethroughBegin + | StrikethroughEnd + | CodeSpan String + | Text String + | HardLineBreak + + +toBlocks : List MdElement -> Result String (List MB.Block) +toBlocks elements = + let + st = + List.foldl mdfProc { blocks = [], result = Ok toMB } elements + in + case st.result of + Err e -> + Err e + + Ok _ -> + Ok (List.reverse st.blocks) + + +type alias State = + { blocks : List MB.Block + , result : Result String Mdfn + } + + +mdfProc : MdElement -> State -> State +mdfProc elt state = + -- let + -- _ = + -- Debug.log "mdfProc elt, blocks" ( elt, state.blocks ) + -- in + case state.result of + Err _ -> + state + + Ok mdfn -> + case mdfn elt of + Err e -> + { state | result = Err e } + + Ok (Mdeb block) -> + { state | blocks = block :: state.blocks, result = Ok toMB } + + Ok (Mdei inline) -> + { state | result = Err "unexpected inline" } + + Ok (Mdf fn) -> + { state | result = Ok fn } + + +type alias Mdfn = + MdElement -> Result String Mdf + + +type Mdf + = Mdf Mdfn + | Mdeb MB.Block + | Mdei MB.Inline + + +unorderedListItem : MB.ListSpacing -> List (MB.ListItem MB.Block) -> MdElement -> Result String Mdf +unorderedListItem listSpacing items mde = + case mde of + UnorderedListItem task blocks -> + Ok (Mdf (unorderedListItem listSpacing (MB.ListItem task blocks :: items))) + + UnorderedListEnd -> + Ok (Mdeb (MB.UnorderedList listSpacing (List.reverse items))) + + _ -> + Err "unexpected item" + + +orderedListItem : MB.ListSpacing -> Int -> List (List MB.Block) -> MdElement -> Result String Mdf +orderedListItem listSpacing offset items mde = + case mde of + OrderedListItem blocks -> + Ok (Mdf (orderedListItem listSpacing offset (blocks :: items))) + + OrderedListEnd -> + Ok (Mdeb (MB.OrderedList listSpacing offset items)) + + _ -> + Err "unexpected item" + + +accumInlines : MdElement -> (List MB.Inline -> MB.Inline) -> List MB.Inline -> Mdfn -> MdElement -> Result String Mdf +accumInlines endelt endcontainer accum mdfn elt = + if elt == endelt then + Ok (Mdei (endcontainer (List.reverse accum))) + + else + case mdfn elt of + Err e -> + Err e + + Ok (Mdeb blocks) -> + Err "accumInlines - expected inlines not blocks" + + Ok (Mdei inline) -> + Ok (Mdf <| accumInlines endelt endcontainer (inline :: accum) mdfn) + + Ok (Mdf fn) -> + Ok (Mdf <| accumInlines endelt endcontainer accum fn) + + +accumInlinesToBlock : MdElement -> (List MB.Inline -> MB.Block) -> List MB.Inline -> Mdfn -> MdElement -> Result String Mdf +accumInlinesToBlock endelt endcontainer accum mdfn elt = + if elt == endelt then + -- Ok (Mdeb (Debug.log "return" (endcontainer (List.reverse accum)))) + Ok (Mdeb (endcontainer (List.reverse accum))) + + else + -- let + -- _ = + -- Debug.log "mdfn elt, endelt" ( elt, endelt ) + -- in + case mdfn elt of + Err e -> + Err e + + Ok (Mdeb block) -> + -- let + -- _ = + -- Debug.log "blocjk" block + -- in + Err "accumInlinesToBlock - expected inlines not blocks" + + Ok (Mdei inline) -> + Ok (Mdf <| accumInlinesToBlock endelt endcontainer (inline :: accum) mdfn) + + Ok (Mdf fn) -> + Ok (Mdf <| accumInlinesToBlock endelt endcontainer accum fn) + + +accumBlocks : MdElement -> (List MB.Block -> MB.Block) -> List MB.Block -> Mdfn -> MdElement -> Result String Mdf +accumBlocks endelt endcontainer accum mdfn elt = + if elt == endelt then + Ok (Mdeb (endcontainer (List.reverse accum))) + + else + case mdfn elt of + Err e -> + Err e + + Ok (Mdeb block) -> + Ok (Mdf <| accumBlocks endelt endcontainer (block :: accum) mdfn) + + Ok (Mdei _) -> + Err "expected blocks not inlines" + + Ok (Mdf fn) -> + Ok (Mdf <| accumBlocks endelt endcontainer accum fn) + + +toMB : MdElement -> Result String Mdf +toMB mde = + case mde of + HtmlBlock hblock -> + Ok (Mdeb <| MB.HtmlBlock hblock) + + UnorderedListStart listSpacing -> + -- (List (ListItem Block)) + Ok (Mdf (unorderedListItem listSpacing [])) + + UnorderedListItem _ _ -> + Err "unexpected UnorderedListItem" + + UnorderedListEnd -> + Err "unexpected UnorderedListEnd" + + OrderedListStart listSpacing offset -> + -- (List (List Block)) + Ok (Mdf <| orderedListItem listSpacing offset []) + + OrderedListItem _ -> + Err "unexpected OrderedListItem" + + OrderedListEnd -> + Err "unexpected OrderedListEnd" + + BlockQuoteStart -> + -- list blocks + Ok (Mdf (accumBlocks BlockQuoteEnd MB.BlockQuote [] toMB)) + + BlockQuoteEnd -> + Err "unexpected BlockQuoteEnd" + + -- Leaf Blocks With Inlines + HeadingStart headingLevel -> + Ok (Mdf (accumInlinesToBlock HeadingEnd (MB.Heading headingLevel) [] toMB)) + + HeadingEnd -> + Err "unexpected HeadingEnd" + + ParagraphStart -> + Ok (Mdf (accumInlinesToBlock ParagraphEnd MB.Paragraph [] toMB)) + + ParagraphEnd -> + Err "unexpected ParagraphEnd" + + Table heading data -> + Ok (Mdeb (MB.Table heading data)) + + -- Leaf Blocks Without Inlines + CodeBlock code -> + Ok (Mdeb (MB.CodeBlock code)) + + ThematicBreak -> + Ok (Mdeb MB.ThematicBreak) + + -- Inlines + HtmlInline hblock -> + Err "unexpectd HtmlInline" + + Link url maybeTitle inlines -> + Ok (Mdei (MB.Link url maybeTitle inlines)) + + Image url maybeTitle inlines -> + Ok (Mdei (MB.Image url maybeTitle inlines)) + + EmphasisBegin -> + Ok (Mdf (accumInlines EmphasisEnd MB.Emphasis [] toMB)) + + EmphasisEnd -> + Err "unexpected EmphasisEnd" + + StrongBegin -> + Ok (Mdf (accumInlines StrongEnd MB.Emphasis [] toMB)) + + StrongEnd -> + Err "unexpected StrongEnd" + + StrikethroughBegin -> + Ok (Mdf (accumInlines StrikethroughEnd MB.Emphasis [] toMB)) + + StrikethroughEnd -> + Err "unexpected StrikethroughEnd" + + CodeSpan string -> + Ok (Mdei (MB.CodeSpan string)) + + Text string -> + Ok (Mdei (MB.Text string)) + + HardLineBreak -> + Ok (Mdei MB.HardLineBreak) + + +viewMdElement : MdElement -> Element msg +viewMdElement b = + E.el [ EF.color TC.white ] <| + case b of + HtmlBlock hblock -> + viewhtml hblock + + UnorderedListStart listSpacing -> + E.text <| "UnorderedListStart" + + UnorderedListItem task blocks -> + E.text "UnorderedListItem" + + UnorderedListEnd -> + E.text "UnorderedListEnd" + + OrderedListStart listSpacing offset -> + E.text "OrderedListStart" + + OrderedListItem blocks -> + E.text "OrderedListItem" + + OrderedListEnd -> + E.text "OrderedListEnd" + + BlockQuoteStart -> + E.text "BlockQuoteStart" + + BlockQuoteEnd -> + E.text "BlockQuoteEnd" + + HeadingStart headingLevel -> + E.text "HeadingStart" + + HeadingEnd -> + E.text "HeadingEnd" + + ParagraphStart -> + E.text "ParagraphStart" + + ParagraphEnd -> + E.text "ParagraphEnd" + + Table headings items -> + E.text "Table" + + -- Leaf Blocks Without Inlines -> E.text "--" + CodeBlock code -> + E.text "CodeBlock" + + ThematicBreak -> + E.text "ThematicBreak" + + -- Inlines + HtmlInline hblock -> + viewhtml hblock + + Link url maybeTitle inlines -> + E.column [] + [ E.text "Link" + , E.text <| "url " ++ url + , E.text <| "title " ++ Maybe.withDefault "" maybeTitle + ] + + Image url maybeTitle inlines -> + E.text "Image" + + EmphasisBegin -> + E.text "EmphasisBegin" + + EmphasisEnd -> + E.text "EmphasisEnd" + + StrongBegin -> + E.text "StrongBegin" + + StrongEnd -> + E.text "StrongEnd" + + StrikethroughBegin -> + E.text "StrikethroughBegin" + + StrikethroughEnd -> + E.text "StrikethroughEnd" + + CodeSpan string -> + E.text "CodeSpan" + + Text string -> + E.column [] + [ E.text <| "Text" + , E.text string + ] + + HardLineBreak -> + E.text "HardLineBreak" + + +lpad : E.Attribute msg +lpad = + E.paddingEach + { top = 0, right = 0, bottom = 0, left = 10 } + + +viewhtml : MB.Html MB.Block -> Element msg +viewhtml htmlb = + E.column [] + [ E.text "HtmlBlock" + , case htmlb of + MB.HtmlElement string listHtmlAttribute listChildren -> + E.el + [ lpad ] + <| + E.text <| + "HtmlElement " + ++ string + + MB.HtmlComment string -> + E.el + [ lpad ] + <| + E.text <| + "HtmlComment " + ++ string + + MB.ProcessingInstruction string -> + E.el + [ lpad ] + <| + E.text <| + "ProcessingInstruction " + ++ string + + MB.HtmlDeclaration string1 string2 -> + E.el + [ lpad ] + <| + E.text <| + "HtmlDeclaration " + ++ string1 + ++ " " + ++ string2 + + MB.Cdata string -> + E.el + [ lpad ] + <| + E.text <| + "Cdata " + ++ string + ] + + +mbToMe : MB.Block -> List MdElement +mbToMe block = + case block of + MB.HtmlBlock hblock -> + [ HtmlBlock hblock ] + + MB.UnorderedList listSpacing listitems -> + UnorderedListStart listSpacing + :: List.map (\(MB.ListItem task blocks) -> UnorderedListItem task blocks) listitems + ++ [ UnorderedListEnd ] + + MB.OrderedList listSpacing offset items -> + OrderedListStart listSpacing offset + :: List.map OrderedListItem items + ++ [ OrderedListEnd ] + + MB.BlockQuote blocks -> + BlockQuoteStart + :: (List.map mbToMe blocks + |> List.concat + ) + ++ [ BlockQuoteEnd ] + + MB.Heading headingLevel inlines -> + HeadingStart headingLevel + :: (List.map miToMe inlines + |> List.concat + ) + ++ [ HeadingEnd ] + + MB.Paragraph inlines -> + ParagraphStart + :: (List.map miToMe inlines + |> List.concat + ) + ++ [ ParagraphEnd ] + + MB.Table headings items -> + [ Table headings items ] + + MB.CodeBlock code -> + [ CodeBlock code ] + + MB.ThematicBreak -> + [ ThematicBreak ] + + +miToMe : MB.Inline -> List MdElement +miToMe inline = + case inline of + MB.HtmlInline hblock -> + [ HtmlInline hblock ] + + MB.Link url maybeTitle inlines -> + [ Link url maybeTitle inlines ] + + MB.Image url maybeTitle inlines -> + [ Image url maybeTitle inlines ] + + MB.Emphasis inlines -> + EmphasisBegin + :: (List.map miToMe inlines |> List.concat) + ++ [ EmphasisEnd ] + + MB.Strong inlines -> + StrongBegin + :: (List.map miToMe inlines |> List.concat) + ++ [ StrongEnd ] + + MB.Strikethrough inlines -> + StrikethroughBegin + :: (List.map miToMe inlines |> List.concat) + ++ [ StrikethroughEnd ] + + MB.CodeSpan string -> + [ CodeSpan string ] + + MB.Text string -> + [ Text string ] + + MB.HardLineBreak -> + [ HardLineBreak ] diff --git a/elm/src/Main.elm b/elm/src/Main.elm index 88d385c9..b89da26b 100644 --- a/elm/src/Main.elm +++ b/elm/src/Main.elm @@ -17,6 +17,7 @@ import File.Select as FS import GenDialog as GD import Html exposing (Html) import Http +import HttpJsonTask as HE import Import import InviteUser import Json.Decode as JD @@ -24,6 +25,7 @@ import Json.Encode as JE import LocalStorage as LS import MdCommon as MC import MessageNLink +import NoteCache as NC exposing (NoteCache) import Orgauth.AdminInterface as AI import Orgauth.ChangeEmail as CE import Orgauth.ChangePassword as CP @@ -42,6 +44,7 @@ import Route exposing (Route(..), parseUrl, routeTitle, routeUrl) import Search as S import SearchStackPanel as SP import SelectString as SS +import Set import ShowMessage import TagAThing import TagFiles @@ -71,9 +74,9 @@ type Msg | ShowMessageMsg ShowMessage.Msg | UserReplyData (Result Http.Error UI.ServerResponse) | AdminReplyData (Result Http.Error AI.ServerResponse) - | ZkReplyData (Result Http.Error ZI.ServerResponse) - | ZkReplyDataSeq (Result Http.Error ZI.ServerResponse -> Maybe (Cmd Msg)) (Result Http.Error ZI.ServerResponse) - | TAReplyData Data.TASelection (Result Http.Error ZI.ServerResponse) + | ZkReplyData (Result Http.Error ( Time.Posix, ZI.ServerResponse )) + | ZkReplyDataSeq (Result Http.Error ( Time.Posix, ZI.ServerResponse ) -> Maybe (Cmd Msg)) (Result Http.Error ( Time.Posix, ZI.ServerResponse )) + | TAReplyData Data.TASelection (Result Http.Error ( Time.Posix, ZI.ServerResponse )) | PublicReplyData (Result Http.Error PI.ServerResponse) | ErrorIndexNote (Result Http.Error PI.ServerResponse) | LoadUrl String @@ -92,7 +95,8 @@ type Msg | WkMsg (Result JD.Error WindowKeys.Key) | ReceiveLocalVal { for : String, name : String, value : Maybe String } | OnFileSelected F.File (List F.File) - | FileUploaded String (Result Http.Error ZI.ServerResponse) + | FileUploadedButGetTime String (Result Http.Error ZI.ServerResponse) + | FileUploaded String (Result Http.Error ( Time.Posix, ZI.ServerResponse )) | RequestProgress String Http.Progress | RequestsDialogMsg (GD.Msg RequestsDialog.Msg) | TagFilesMsg (TagAThing.Msg TagFiles.Msg) @@ -147,6 +151,11 @@ type alias SavedRoute = } +maxCacheNotes : Int +maxCacheNotes = + 100 + + type alias Model = { state : State , size : Util.Size @@ -163,6 +172,7 @@ type alias Model = , stylePalette : StylePalette , adminSettings : OD.AdminSettings , trackedRequests : TRequests + , noteCache : NoteCache } @@ -236,7 +246,7 @@ routeStateInternal model route = PI.getPublicZkNote model.location (PI.encodeSendMsg (PI.GetZkNote id)) PublicReplyData _ -> - sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id }) + sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id, what = "" }) ) Nothing -> @@ -268,12 +278,12 @@ routeStateInternal model route = case model.state of EditZkNote st login -> ( EditZkNote st login - , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id }) + , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id, what = "" }) ) EditZkNoteListing st login -> ( EditZkNoteListing st login - , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id }) + , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id, what = "" }) ) EView st login -> @@ -287,7 +297,7 @@ routeStateInternal model route = ( ShowMessage { message = "loading note..." } login (Just model.state) - , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id }) + , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id, what = "" }) ) Nothing -> @@ -429,7 +439,7 @@ routeStateInternal model route = [ sendZIMsg model.location (ZI.SearchZkNotes <| prevSearchQuery login) - , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id }) + , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id, what = "" }) ] ) @@ -586,44 +596,32 @@ showMessage msg = ZkReplyData urd -> "ZkReplyData: " - ++ (Result.map ZI.showServerResponse urd - |> Result.mapError Util.httpErrorString - |> (\r -> - case r of - Ok m -> - "message: " ++ m + ++ (case urd of + Ok ( _, m ) -> + "message: " ++ ZI.showServerResponse m - Err e -> - "error: " ++ e - ) + Err e -> + "error: " ++ Util.httpErrorString e ) ZkReplyDataSeq _ urd -> "ZkReplyDataSeq : " - ++ (Result.map ZI.showServerResponse urd - |> Result.mapError Util.httpErrorString - |> (\r -> - case r of - Ok m -> - "message: " ++ m + ++ (case urd of + Ok ( _, m ) -> + "message: " ++ ZI.showServerResponse m - Err e -> - "error: " ++ e - ) + Err e -> + "error: " ++ Util.httpErrorString e ) TAReplyData _ urd -> "TAReplyData: " - ++ (Result.map ZI.showServerResponse urd - |> Result.mapError Util.httpErrorString - |> (\r -> - case r of - Ok m -> - "message: " ++ m + ++ (case urd of + Ok ( _, m ) -> + "message: " ++ ZI.showServerResponse m - Err e -> - "error: " ++ e - ) + Err e -> + "error: " ++ Util.httpErrorString e ) PublicReplyData _ -> @@ -683,6 +681,9 @@ showMessage msg = OnFileSelected _ _ -> "OnFileSelected" + FileUploadedButGetTime _ _ -> + "FileUploadedButGetTime" + FileUploaded _ _ -> "FileUploaded" @@ -799,7 +800,7 @@ viewState size state model = E.map InvitedMsg <| Invited.view model.stylePalette size em EditZkNote em _ -> - E.map EditZkNoteMsg <| EditZkNote.view model.timezone size model.recentNotes model.trackedRequests em + E.map EditZkNoteMsg <| EditZkNote.view model.timezone size model.recentNotes model.trackedRequests model.noteCache em EditZkNoteListing em ld -> E.map EditZkNoteListingMsg <| EditZkNoteListing.view ld size em @@ -820,10 +821,10 @@ viewState size state model = E.map ImportMsg <| Import.view size em View em -> - E.map ViewMsg <| View.view model.timezone size.width em False + E.map ViewMsg <| View.view model.timezone size.width model.noteCache em False EView em _ -> - E.map ViewMsg <| View.view model.timezone size.width em True + E.map ViewMsg <| View.view model.timezone size.width model.noteCache em True UserSettings em _ _ -> E.map UserSettingsMsg <| UserSettings.view em @@ -1074,13 +1075,15 @@ sendZIMsg location msg = sendZIMsgExp location msg ZkReplyData -sendZIMsgExp : String -> ZI.SendMsg -> (Result Http.Error ZI.ServerResponse -> Msg) -> Cmd Msg +sendZIMsgExp : String -> ZI.SendMsg -> (Result Http.Error ( Time.Posix, ZI.ServerResponse ) -> Msg) -> Cmd Msg sendZIMsgExp location msg tomsg = - Http.post + HE.postJsonTask { url = location ++ "/private" , body = Http.jsonBody (ZI.encodeSendMsg msg) - , expect = Http.expectJson tomsg ZI.serverResponseDecoder + , decoder = ZI.serverResponseDecoder } + |> Task.andThen (\x -> Task.map (\posix -> ( posix, x )) Time.now) + |> Task.attempt tomsg {-| send search AND save search in db as a zknote @@ -1215,11 +1218,33 @@ view model = { dm | model = model.trackedRequests } _ -> - E.layout [ EF.size model.fontsize, E.width E.fill ] <| viewState model.size model.state model + E.layout + ((case ghostState model.state of + Just elt -> + [ E.inFront elt ] + + Nothing -> + [] + ) + ++ [ EF.size model.fontsize, E.width E.fill ] + ) + <| + viewState model.size model.state model ] } +ghostState : State -> Maybe (E.Element Msg) +ghostState state = + case state of + EditZkNote m l -> + Maybe.map (E.map EditZkNoteMsg) <| + EditZkNote.ghostView m + + _ -> + Nothing + + piupdate : Msg -> PiModel -> ( PiModel, Cmd Msg ) piupdate msg initmodel = case initmodel of @@ -1420,6 +1445,78 @@ displayMessageNLinkDialog model message url text = } +onZkNoteEditWhat : Model -> Time.Posix -> Data.ZkNoteEditWhat -> ( Model, Cmd Msg ) +onZkNoteEditWhat model pt znew = + let + state = + model.state + in + if znew.what == "cache" then + ( { model + | noteCache = + NC.addNote pt znew.zne model.noteCache + |> NC.purgeNotes + } + , Cmd.none + ) + + else + case stateLogin state of + Just login -> + let + ( spmod, sres ) = + stateSearch state + |> Maybe.withDefault ( SP.initModel, { notes = [], offset = 0, what = "" } ) + + ( nst, c ) = + EditZkNote.initFull login + sres + znew.zne.zknote + znew.zne.links + spmod + + ngets = + makeNoteCacheGets nst.md model + + s = + case state of + EditZkNote eznst _ -> + EditZkNote.copyTabs eznst nst + |> EditZkNote.tabsOnLoad + + _ -> + nst + in + ( { model + | state = + EditZkNote + s + login + , recentNotes = + let + zknote = + znew.zne.zknote + in + addRecentZkListNote model.recentNotes + { id = zknote.id + , user = zknote.user + , title = zknote.title + , isFile = zknote.isFile + , createdate = zknote.createdate + , changeddate = zknote.changeddate + , sysids = zknote.sysids + } + , noteCache = NC.setKeeps (MC.noteIds nst.md) model.noteCache + } + , Cmd.batch ((sendZIMsg model.location <| ZI.GetZkNoteComments c) :: ngets) + ) + + _ -> + ( unexpectedMessage model "ZkNoteEditWhat" + , Cmd.none + ) + + actualupdate : Msg -> Model -> ( Model, Cmd Msg ) actualupdate msg model = case ( msg, model.state ) of @@ -1539,12 +1636,16 @@ actualupdate msg model = EditZkNote.TAUpdated nemod s -> ( { model | state = EditZkNote nemod login } - , case s of - Just sel -> - setTASelection (Data.encodeSetSelection sel) - - Nothing -> - Cmd.none + , Cmd.batch + ((case s of + Just sel -> + setTASelection (Data.encodeSetSelection sel) + + Nothing -> + Cmd.none + ) + :: makeNewNoteCacheGets nemod.md model + ) ) EditZkNote.TANoop -> @@ -1720,7 +1821,7 @@ actualupdate msg model = (EditZkNoteListing.onWkKeyPress key es) ( WkMsg (Err e), _ ) -> - ( displayMessageDialog model <| "error decoding windowskey message: " ++ JD.errorToString e + ( displayMessageDialog model <| "error decoding windowkeys message: " ++ JD.errorToString e , Cmd.none ) @@ -1804,7 +1905,7 @@ actualupdate msg model = Err e -> ( displayMessageDialog model <| Util.httpErrorString e, Cmd.none ) - Ok uiresponse -> + Ok ( _, uiresponse ) -> case uiresponse of ZI.ServerError e -> ( displayMessageDialog model <| e, Cmd.none ) @@ -2095,7 +2196,7 @@ actualupdate msg model = Err e -> ( displayMessageDialog model <| Util.httpErrorString e, Cmd.none ) - Ok ziresponse -> + Ok ( pt, ziresponse ) -> case ziresponse of ZI.ServerError e -> ( displayMessageDialog model <| e, Cmd.none ) @@ -2218,53 +2319,8 @@ actualupdate msg model = , Cmd.none ) - ZI.ZkNoteEdit zne -> - case stateLogin state of - Just login -> - let - ( spmod, sres ) = - stateSearch state - |> Maybe.withDefault ( SP.initModel, { notes = [], offset = 0, what = "" } ) - - ( nst, c ) = - EditZkNote.initFull login - sres - zne.zknote - zne.links - spmod - - s = - case state of - EditZkNote eznst _ -> - EditZkNote.copyTabs eznst nst - |> EditZkNote.tabsOnLoad - - _ -> - nst - in - ( { model - | state = - EditZkNote - s - login - , recentNotes = - addRecentZkListNote model.recentNotes - { id = zne.zknote.id - , user = zne.zknote.user - , title = zne.zknote.title - , isFile = zne.zknote.isFile - , createdate = zne.zknote.createdate - , changeddate = zne.zknote.changeddate - , sysids = zne.zknote.sysids - } - } - , sendZIMsg model.location <| ZI.GetZkNoteComments c - ) - - _ -> - ( unexpectedMessage model (ZI.showServerResponse ziresponse) - , Cmd.none - ) + ZI.ZkNoteEditWhat znew -> + onZkNoteEditWhat model pt znew ZI.ZkNoteComments zc -> case state of @@ -2368,6 +2424,10 @@ actualupdate msg model = , Cmd.none ) + ZI.Noop -> + -- just ignore these. + ( model, Cmd.none ) + ( ViewMsg em, View es ) -> let ( emod, ecmd ) = @@ -2411,7 +2471,7 @@ actualupdate msg model = case es.id of Just id -> ( { model | state = state } - , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id }) + , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id, what = "" }) ) Nothing -> @@ -2591,21 +2651,25 @@ actualupdate msg model = ) model.state } - , Cmd.batch - [ Http.request - { method = "POST" - , headers = [] - , url = model.location ++ "/upload" - , body = - file - :: files - |> List.map (\f -> Http.filePart (F.name f) f) - |> Http.multipartBody - , expect = Http.expectJson (FileUploaded nrid) ZI.serverResponseDecoder - , timeout = Nothing - , tracker = Just nrid - } - ] + , Http.request + { method = "POST" + , headers = [] + , url = model.location ++ "/upload" + , body = + file + :: files + |> List.map (\f -> Http.filePart (F.name f) f) + |> Http.multipartBody + , expect = Http.expectJson (FileUploadedButGetTime nrid) ZI.serverResponseDecoder + , timeout = Nothing + , tracker = Just nrid + } + ) + + ( FileUploadedButGetTime what zrd, state ) -> + ( { model | state = state } + , Time.now + |> Task.perform (\pt -> FileUploaded what (Result.map (\zi -> ( pt, zi )) zrd)) ) ( FileUploaded what zrd, state ) -> @@ -2613,58 +2677,13 @@ actualupdate msg model = Err e -> ( displayMessageDialog model <| Util.httpErrorString e, Cmd.none ) - Ok ziresponse -> + Ok ( pt, ziresponse ) -> case ziresponse of ZI.ServerError e -> ( displayMessageDialog model <| e, Cmd.none ) - ZI.ZkNoteEdit zne -> - case stateLogin state of - Just login -> - let - ( spmod, sres ) = - stateSearch state - |> Maybe.withDefault ( SP.initModel, { notes = [], offset = 0, what = "" } ) - - ( nst, c ) = - EditZkNote.initFull login - sres - zne.zknote - zne.links - spmod - - s = - case state of - EditZkNote eznst _ -> - EditZkNote.copyTabs eznst nst - |> EditZkNote.tabsOnLoad - - _ -> - nst - in - ( { model - | state = - EditZkNote - s - login - , recentNotes = - addRecentZkListNote model.recentNotes - { id = zne.zknote.id - , user = zne.zknote.user - , title = zne.zknote.title - , isFile = zne.zknote.isFile - , createdate = zne.zknote.createdate - , changeddate = zne.zknote.changeddate - , sysids = zne.zknote.sysids - } - } - , sendZIMsg model.location <| ZI.GetZkNoteComments c - ) - - _ -> - ( unexpectedMessage model (ZI.showServerResponse ziresponse) - , Cmd.none - ) + ZI.ZkNoteEditWhat znew -> + onZkNoteEditWhat model pt znew ZI.FilesUploaded files -> ( { model @@ -2764,6 +2783,47 @@ actualupdate msg model = ) +makeNoteCacheGets : String -> Model -> List (Cmd Msg) +makeNoteCacheGets md model = + MC.noteIds md + |> Set.toList + |> List.map + (\id -> + case NC.getNote id model.noteCache of + Just zkn -> + sendZIMsg + model.location + (ZI.GetZneIfChanged { zknote = id, what = "cache", changeddate = zkn.zknote.changeddate }) + + Nothing -> + sendZIMsg + model.location + (ZI.GetZkNoteEdit { zknote = id, what = "cache" }) + ) + + + +-- only retreive not-found notes. + + +makeNewNoteCacheGets : String -> Model -> List (Cmd Msg) +makeNewNoteCacheGets md model = + MC.noteIds md + |> Set.toList + |> List.filterMap + (\id -> + case NC.getNote id model.noteCache of + Just zkn -> + Nothing + + Nothing -> + Just <| + sendZIMsg + model.location + (ZI.GetZkNoteEdit { zknote = id, what = "cache" }) + ) + + handleEditZkNoteCmd : Model -> Data.LoginData -> ( EditZkNote.Model, EditZkNote.Command ) -> ( Model, Cmd Msg ) handleEditZkNoteCmd model login ( emod, ecmd ) = let @@ -2786,211 +2846,227 @@ handleEditZkNoteCmd model login ( emod, ecmd ) = Nothing -> ( nm, Cmd.none ) - in - case ecmd of - EditZkNote.SaveExit snpl -> - let - gotres = + + ngets = + makeNewNoteCacheGets emod.md model + + ( rm, rcmd ) = + case ecmd of + EditZkNote.SaveExit snpl -> let - nm = - { model - | state = - EditZkNoteListing - { notes = emod.zknSearchResult - , spmodel = emod.spmodel - , dialog = Nothing - } - login - } - in - case SP.getSearch emod.spmodel of - Just s -> - sendSearch nm s + gotres = + let + nm = + { model + | state = + EditZkNoteListing + { notes = emod.zknSearchResult + , spmodel = emod.spmodel + , dialog = Nothing + } + login + } + in + case SP.getSearch emod.spmodel of + Just s -> + sendSearch nm s - Nothing -> - ( nm, Cmd.none ) + Nothing -> + ( nm, Cmd.none ) - onmsg : Model -> Msg -> ( Model, Cmd Msg ) - onmsg _ ms = - case ms of - ZkReplyData (Ok (ZI.SavedZkNotePlusLinks _)) -> - gotres + onmsg : Model -> Msg -> ( Model, Cmd Msg ) + onmsg _ ms = + case ms of + ZkReplyData (Ok ( _, ZI.SavedZkNotePlusLinks _ )) -> + gotres - ZkReplyData (Ok (ZI.ServerError e)) -> - ( displayMessageDialog model e - , Cmd.none - ) + ZkReplyData (Ok ( _, ZI.ServerError e )) -> + ( displayMessageDialog model e + , Cmd.none + ) - _ -> - ( unexpectedMsg model ms - , Cmd.none - ) - in - ( { model - | state = - Wait - (ShowMessage - { message = "loading articles" - } - login - (Just model.state) - ) - onmsg - } - , sendZIMsg model.location - (ZI.SaveZkNotePlusLinks snpl) - ) + _ -> + ( unexpectedMsg model ms + , Cmd.none + ) + in + ( { model + | state = + Wait + (ShowMessage + { message = "loading articles" + } + login + (Just model.state) + ) + onmsg + } + , sendZIMsg model.location + (ZI.SaveZkNotePlusLinks snpl) + ) - EditZkNote.Save snpl -> - ( { model | state = EditZkNote emod login } - , sendZIMsg model.location - (ZI.SaveZkNotePlusLinks snpl) - ) + EditZkNote.Save snpl -> + ( { model + | state = EditZkNote emod login - EditZkNote.None -> - ( { model | state = EditZkNote emod login }, Cmd.none ) + -- reset keeps on save, to get rid of unused notes. + , noteCache = NC.setKeeps (MC.noteIds emod.md) model.noteCache + } + , sendZIMsg model.location + (ZI.SaveZkNotePlusLinks snpl) + ) - EditZkNote.Revert -> - backtolisting + EditZkNote.None -> + ( { model | state = EditZkNote emod login }, Cmd.none ) - EditZkNote.Delete id -> - -- issue delete and go back to listing. - let - ( m, c ) = + EditZkNote.Revert -> backtolisting - in - ( { m - | state = - Wait m.state - (\mod _ -> - -- stop waiting, issue listing query when a message - -- is received. (presumably delete reply) - ( { mod | state = m.state }, c ) - ) - } - , sendZIMsg model.location - (ZI.DeleteZkNote id) - ) - EditZkNote.Switch id -> - let - ( st, cmd ) = - ( ShowMessage { message = "loading note..." } - login - (Just model.state) - , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id }) + EditZkNote.Delete id -> + -- issue delete and go back to listing. + let + ( m, c ) = + backtolisting + in + ( { m + | state = + Wait m.state + (\mod _ -> + -- stop waiting, issue listing query when a message + -- is received. (presumably delete reply) + ( { mod | state = m.state }, c ) + ) + } + , sendZIMsg model.location + (ZI.DeleteZkNote id) ) - in - ( { model | state = st }, cmd ) - EditZkNote.SaveSwitch s id -> - let - ( st, cmd ) = - ( ShowMessage { message = "loading note..." } - login - (Just model.state) - , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id }) + EditZkNote.Switch id -> + let + ( st, cmd ) = + ( ShowMessage { message = "loading note..." } + login + (Just model.state) + , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id, what = "" }) + ) + in + ( { model | state = st }, cmd ) + + EditZkNote.SaveSwitch s id -> + let + ( st, cmd ) = + ( ShowMessage { message = "loading note..." } + login + (Just model.state) + , sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id, what = "" }) + ) + in + ( { model | state = st } + , Cmd.batch + [ cmd + , sendZIMsg model.location + (ZI.SaveZkNotePlusLinks s) + ] ) - in - ( { model | state = st } - , Cmd.batch - [ cmd - , sendZIMsg model.location - (ZI.SaveZkNotePlusLinks s) - ] - ) - EditZkNote.View v -> - ( { model - | state = - EView - (View.initSzn - v.note - v.createdate - v.changeddate - v.links - v.panelnote - ) - (EditZkNote emod login) - } - , Cmd.none - ) + EditZkNote.View v -> + ( { model + | state = + EView + (View.initSzn + v.note + v.createdate + v.changeddate + v.links + v.panelnote + ) + (EditZkNote emod login) + } + , Cmd.none + ) - EditZkNote.GetTASelection id what -> - ( { model | state = EditZkNote emod login } - , getTASelection (JE.object [ ( "id", JE.string id ), ( "what", JE.string what ) ]) - ) + EditZkNote.GetTASelection id what -> + ( { model | state = EditZkNote emod login } + , getTASelection (JE.object [ ( "id", JE.string id ), ( "what", JE.string what ) ]) + ) - EditZkNote.Search s -> - sendSearch { model | state = EditZkNote emod login } s + EditZkNote.Search s -> + sendSearch { model | state = EditZkNote emod login } s - EditZkNote.SearchHistory -> - ( shDialog model - , Cmd.none - ) + EditZkNote.SearchHistory -> + ( shDialog model + , Cmd.none + ) - EditZkNote.BigSearch -> - backtolisting + EditZkNote.BigSearch -> + backtolisting - EditZkNote.Settings -> - ( { model | state = UserSettings (UserSettings.init login model.fontsize) login (EditZkNote emod login) } - , Cmd.none - ) + EditZkNote.Settings -> + ( { model | state = UserSettings (UserSettings.init login model.fontsize) login (EditZkNote emod login) } + , Cmd.none + ) - EditZkNote.Admin -> - ( model - , sendAIMsg model.location AI.GetUsers - ) + EditZkNote.Admin -> + ( model + , sendAIMsg model.location AI.GetUsers + ) - EditZkNote.GetZkNote id -> - ( { model | state = EditZkNote emod login } - , sendZIMsg model.location (ZI.GetZkNote id) - ) + EditZkNote.GetZkNoteWhat id what -> + ( { model | state = EditZkNote emod login } + , case what of + "panel" -> + sendZIMsg model.location (ZI.GetZkNote id) - EditZkNote.SetHomeNote id -> - ( { model | state = EditZkNote emod login } - , sendZIMsg model.location (ZI.SetHomeNote id) - ) + _ -> + sendZIMsg model.location (ZI.GetZkNoteEdit { zknote = id, what = what }) + ) - EditZkNote.AddToRecent zkln -> - ( { model - | state = EditZkNote emod login - , recentNotes = addRecentZkListNote model.recentNotes zkln - } - , Cmd.none - ) + EditZkNote.SetHomeNote id -> + ( { model | state = EditZkNote emod login } + , sendZIMsg model.location (ZI.SetHomeNote id) + ) + + EditZkNote.AddToRecent zkln -> + ( { model + | state = EditZkNote emod login + , recentNotes = addRecentZkListNote model.recentNotes zkln + } + , Cmd.none + ) - EditZkNote.ShowMessage e -> - ( displayMessageDialog model e, Cmd.none ) + EditZkNote.ShowMessage e -> + ( displayMessageDialog model e, Cmd.none ) - EditZkNote.ShowArchives id -> - ( model - , sendZIMsg model.location (ZI.GetZkNoteArchives { zknote = id, offset = 0, limit = Just S.defaultSearchLimit }) - ) + EditZkNote.ShowArchives id -> + ( model + , sendZIMsg model.location (ZI.GetZkNoteArchives { zknote = id, offset = 0, limit = Just S.defaultSearchLimit }) + ) - EditZkNote.FileUpload -> - ( model - , FS.files [] OnFileSelected - ) + EditZkNote.FileUpload -> + ( model + , FS.files [] OnFileSelected + ) - EditZkNote.Requests -> - ( { model - | state = - RequestsDialog - (RequestsDialog.init - model.trackedRequests - Common.buttonStyle - (E.map (\_ -> ()) (viewState model.size model.state model)) - ) - model.state - } - , Cmd.none - ) + EditZkNote.Requests -> + ( { model + | state = + RequestsDialog + (RequestsDialog.init + model.trackedRequests + Common.buttonStyle + (E.map (\_ -> ()) (viewState model.size model.state model)) + ) + model.state + } + , Cmd.none + ) - EditZkNote.Cmd cmd -> - ( { model | state = EditZkNote emod login } - , Cmd.map EditZkNoteMsg cmd - ) + EditZkNote.Cmd cmd -> + ( { model | state = EditZkNote emod login } + , Cmd.map EditZkNoteMsg cmd + ) + in + ( rm, Cmd.batch (rcmd :: ngets) ) handleEditZkNoteListing : Model -> Data.LoginData -> ( EditZkNoteListing.Model, EditZkNoteListing.Command ) -> ( Model, Cmd Msg ) @@ -3314,6 +3390,7 @@ init flags url key zone fontsize = , stylePalette = { defaultSpacing = 10 } , adminSettings = adminSettings , trackedRequests = { requestCount = 0, requests = Dict.empty } + , noteCache = NC.empty maxCacheNotes } geterrornote = @@ -3355,11 +3432,11 @@ main = , view = piview , update = piupdate , subscriptions = - \model -> + \pimodel -> let tracks : List (Sub Msg) tracks = - case model of + case pimodel of Ready rmd -> rmd.trackedRequests.requests |> Dict.keys @@ -3367,6 +3444,19 @@ main = PreInit _ -> [] + + esub = + case pimodel of + Ready model -> + case model.state of + EditZkNote state _ -> + [ Sub.map EditZkNoteMsg <| EditZkNote.subscriptions state ] + + _ -> + [] + + _ -> + [] in Sub.batch <| [ receiveTASelection TASelection @@ -3375,6 +3465,7 @@ main = , LS.localVal ReceiveLocalVal ] ++ tracks + ++ esub , onUrlRequest = urlRequest , onUrlChange = UrlChanged } diff --git a/elm/src/MdCommon.elm b/elm/src/MdCommon.elm index dac485a0..06bffcd5 100644 --- a/elm/src/MdCommon.elm +++ b/elm/src/MdCommon.elm @@ -1,8 +1,9 @@ -module MdCommon exposing (Panel, ViewMode(..), blockCells, blockPanels, cellView, codeBlock, codeSpan, defCell, heading, imageView, linkDict, markdownView, mdCells, mdPanel, mdPanels, mkRenderer, panelView, rawTextToId, searchView, showRunState) +module MdCommon exposing (Panel, ViewMode(..), blockCells, blockPanels, cellView, codeBlock, codeSpan, defCell, heading, imageView, linkDict, markdownView, mdCells, mdPanel, mdPanels, mkRenderer, noteIds, panelView, rawTextToId, searchView, showRunState) import Cellme.Cellme exposing (Cell, CellContainer(..), CellState, RunState(..), evalCellsFully, evalCellsOnce) import Cellme.DictCellme exposing (CellDict(..), DictCell, dictCcr, getCd, mkCc) import Common exposing (buttonStyle) +import Data import Dict exposing (Dict) import Element as E exposing (Element) import Element.Background as EBk @@ -12,13 +13,15 @@ import Element.Input as EI import Element.Region as ER import Html exposing (Attribute, Html) import Html.Attributes as HA -import Markdown.Block as Block exposing (Block, Inline, ListItem(..), Task(..), inlineFoldl) +import Markdown.Block as Block exposing (Block, Inline, ListItem(..), Task(..), foldl, inlineFoldl) import Markdown.Html import Markdown.Parser import Markdown.Renderer import Maybe.Extra as ME +import NoteCache as NC exposing (NoteCache) import Regex import Schelme.Show exposing (showTerm) +import Set exposing (Set(..)) import TangoColors as TC @@ -131,8 +134,28 @@ type ViewMode | EditView -mkRenderer : ViewMode -> (String -> a) -> Int -> CellDict -> Bool -> (String -> String -> a) -> Markdown.Renderer.Renderer (Element a) -mkRenderer viewMode restoreSearchMsg maxw cellDict showPanelElt onchanged = +link : Maybe String -> String -> List (Element a) -> Element a +link title destination body = + (if String.contains ":" destination then + E.newTabLink + + else + E.link + ) + [ E.htmlAttribute (HA.style "display" "inline-flex") ] + { url = destination + , label = + E.paragraph + [ EF.color (E.rgb255 0 0 255) + , E.htmlAttribute (HA.style "overflow-wrap" "break-word") + , E.htmlAttribute (HA.style "word-break" "break-word") + ] + body + } + + +mkRenderer : ViewMode -> (String -> a) -> Int -> CellDict -> Bool -> (String -> String -> a) -> NoteCache -> Markdown.Renderer.Renderer (Element a) +mkRenderer viewMode restoreSearchMsg maxw cellDict showPanelElt onchanged noteCache = { heading = heading , paragraph = E.paragraph @@ -144,36 +167,12 @@ mkRenderer viewMode restoreSearchMsg maxw cellDict showPanelElt onchanged = , strikethrough = \content -> E.paragraph [ EF.strike ] content , codeSpan = codeSpan , link = - \{ title, destination } body -> - (if String.contains ":" destination then - E.newTabLink - - else - E.link - ) - [ E.htmlAttribute (HA.style "display" "inline-flex") ] - { url = destination - , label = - E.paragraph - [ EF.color (E.rgb255 0 0 255) - , E.htmlAttribute (HA.style "overflow-wrap" "break-word") - , E.htmlAttribute (HA.style "word-break" "break-word") - ] - body - } + \{ title, destination } body -> link title destination body , hardLineBreak = Html.br [] [] |> E.html , image = \image -> E.image [ E.width E.fill ] { src = image.src, description = image.alt } - - {- case image.title of - Just title -> - E.image [ E.width E.fill ] { src = image.src, description = image.alt } - - Nothing -> - E.image [ E.width E.fill ] { src = image.src, description = image.alt } - -} , blockQuote = \children -> E.column @@ -260,6 +259,8 @@ mkRenderer viewMode restoreSearchMsg maxw cellDict showPanelElt onchanged = |> Markdown.Html.withOptionalAttribute "text" |> Markdown.Html.withOptionalAttribute "width" |> Markdown.Html.withOptionalAttribute "height" + , Markdown.Html.tag "note" (noteView noteCache) + |> Markdown.Html.withAttribute "id" ] , table = E.column [ E.width <| E.fill ] , tableHeader = E.column [ E.width <| E.fill, EF.bold, EF.underline, E.spacing 8 ] @@ -315,6 +316,104 @@ imageView text url mbwidth renderedChildren = { src = url, description = text } +htmlAudioView : String -> String -> Element a +htmlAudioView url text = + E.html (Html.audio [ HA.controls True, HA.src url ] [ Html.text text ]) + + +audioView : Data.ZkNote -> Element a +audioView zkn = + E.column [ EBd.width 1, E.spacing 5, E.padding 5 ] + [ link (Just zkn.title) ("/note/" ++ String.fromInt zkn.id) [ E.text zkn.title ] + , E.row [ E.spacing 20 ] + [ htmlAudioView ("/file/" ++ String.fromInt zkn.id) zkn.title + + -- TODO pass in url instead of hardcoded + , link + (Just "ts↗") + ("https://29a.ch/timestretch/#a=https://www.zknotes.com/file/" ++ String.fromInt zkn.id) + [ E.text "ts↗" ] + ] + ] + + +noteFile : String -> Data.ZkNote -> Element a +noteFile filename zknote = + let + suffix = + String.split "." filename + |> List.drop 1 + |> List.reverse + |> List.head + + fileurl = + "/file/" ++ String.fromInt zknote.id + in + case suffix of + Nothing -> + E.text filename + + Just s -> + case String.toLower s of + "mp3" -> + audioView zknote + + "m4a" -> + audioView zknote + + "opus" -> + audioView zknote + + "mp4" -> + videoView 200 fileurl (Just zknote.title) Nothing Nothing [] + + "webm" -> + videoView 200 fileurl (Just zknote.title) Nothing Nothing [] + + "mkv" -> + videoView 200 fileurl (Just zknote.title) Nothing Nothing [] + + "jpg" -> + imageView zknote.title fileurl Nothing [] + + "gif" -> + imageView zknote.title fileurl Nothing [] + + "png" -> + imageView zknote.title fileurl Nothing [] + + _ -> + E.text filename + + +noteView : NoteCache -> String -> List (Element a) -> Element a +noteView noteCache id _ = + case + String.toInt id + |> Maybe.andThen (\iid -> NC.getNote iid noteCache) + of + Just zne -> + if zne.zknote.isFile then + noteFile zne.zknote.title zne.zknote + + else + E.link + [ E.htmlAttribute (HA.style "display" "inline-flex") ] + { url = "/note/" ++ id + , label = + E.paragraph + [ EF.color (E.rgb255 0 0 255) + , E.htmlAttribute (HA.style "overflow-wrap" "break-word") + , E.htmlAttribute (HA.style "word-break" "break-word") + ] + [ E.text zne.zknote.title ] + } + + -- , E.column [] (List.map (.othername >> Maybe.withDefault "" >> E.text) zne.links) + Nothing -> + E.text <| "note " ++ id + + videoView : Int -> String -> Maybe String -> Maybe String -> Maybe String -> List (Element a) -> Element a videoView maxw url mbtext mbwidth mbheight renderedChildren = let @@ -500,3 +599,79 @@ linkDict markdown = [] blocks |> Dict.fromList + + +noteIds : String -> Set Int +noteIds markdown = + -- build a dict of description->url + let + parsedmd = + markdown + |> Markdown.Parser.parse + |> Result.mapError (\error -> error |> List.map Markdown.Parser.deadEndToString |> String.join "\n") + in + case parsedmd of + Err _ -> + Set.empty + + Ok blocks -> + foldl + (\block ids -> + case block of + Block.HtmlBlock (Block.HtmlElement tag attr childs) -> + case + ( tag + , List.foldl + (\i mbv -> + if i.name == "id" then + String.toInt i.value + + else + Nothing + ) + Nothing + attr + ) + of + ( "note", Just id ) -> + Set.insert id ids + + _ -> + ids + + _ -> + ids + ) + Set.empty + blocks + |> (\bids -> + inlineFoldl + (\inline ids -> + case inline of + Block.HtmlInline (Block.HtmlElement tag attr childs) -> + case + ( tag + , List.foldl + (\i mbv -> + if i.name == "id" then + String.toInt i.value + + else + Nothing + ) + Nothing + attr + ) + of + ( "note", Just id ) -> + Set.insert id ids + + _ -> + ids + + _ -> + ids + ) + bids + blocks + ) diff --git a/elm/src/MdList.elm b/elm/src/MdList.elm new file mode 100644 index 00000000..5cd11fce --- /dev/null +++ b/elm/src/MdList.elm @@ -0,0 +1,401 @@ +module MdList exposing (..) + +import Array exposing (Array) +import Common exposing (buttonStyle) +import DnDList +import Element as E exposing (Element) +import Element.Background as EBk +import Element.Border as EBd +import Element.Events as EE +import Element.Font as EF +import Element.Input as EI +import Element.Region as ER +import Html.Attributes as HA +import Markdown.Block as Block exposing (Block(..), Html(..), Inline(..), ListItem(..), Task(..), inlineFoldl) +import Markdown.Html +import TangoColors as TC + + +type alias Model = + { blocks : Array EditBlock + , focusBlock : Maybe Int + , nextBlockId : Int + , cleanBlocks : Array EditBlock + , blockDnd : DnDList.Model + } + + +type alias EditBlock = + { editid : Int + , block : Block + } + + +type Msg + = AddBlockPress + | BlockDndMsg DnDList.Msg + | BlockClicked Int + | DeleteBlock Int + + +init : List Block -> Model +init blocks = + let + ba = + blocks + |> List.indexedMap (\i b -> { editid = i, block = b }) + |> Array.fromList + in + { blocks = ba + , focusBlock = Nothing + , nextBlockId = Array.length ba + , cleanBlocks = ba + , blockDnd = blockDndSystem.model + } + + +blockDndConfig : DnDList.Config EditBlock +blockDndConfig = + { beforeUpdate = \_ _ list -> list + , movement = DnDList.Free + , listen = DnDList.OnDrag + , operation = DnDList.Swap + } + + +blockDndSystem : DnDList.System EditBlock Msg +blockDndSystem = + DnDList.create blockDndConfig BlockDndMsg + + +subscriptions : Model -> Sub Msg +subscriptions model = + blockDndSystem.subscriptions model.blockDnd + + + +-- ++ (Array.indexedMap +-- (\i -> viewBlockDnd model.blockDnd i model.focusBlock) +-- model.blocks +-- |> Array.toList +-- ) + + +view : Model -> Element Msg +view model = + -- let + -- maxwidth = + -- 700 + -- maxheight = + -- nd.size.height - 75 + -- in + E.column + [ E.alignTop + , E.spacing 8 + , E.padding 8 + + -- , E.width (E.maximum maxwidth E.fill) + -- , E.height (E.maximum maxheight E.fill) + , E.centerX + + -- , E.scrollbarY + , E.htmlAttribute (HA.id "steplist") + ] + <| + (Array.indexedMap + (\i -> viewBlockDnd model.blockDnd i model.focusBlock) + model.blocks + |> Array.toList + ) + + +viewBlockDnd : DnDList.Model -> Int -> Maybe Int -> EditBlock -> Element Msg +viewBlockDnd ddlmodel i focusid s = + let + ddw = + case + blockDndSystem.info ddlmodel + |> Maybe.map .dragIndex + of + Just ix -> + if ix == i then + Ghost + + else + Drop + + Nothing -> + Drag + in + viewBlock ddw i focusid s + + +type DragDropWhat + = Drag + | Drop + | Ghost + + +viewBlock : DragDropWhat -> Int -> Maybe Int -> EditBlock -> Element Msg +viewBlock ddw i focusid s = + let + itemId : String + itemId = + "id-" ++ String.fromInt i + + focus = + focusid == Just s.editid + in + E.row + ([ E.width E.fill + , E.spacing 8 + , E.htmlAttribute (HA.id itemId) + , E.padding 10 + , EBd.rounded 5 + , EE.onMouseDown (BlockClicked s.editid) + ] + ++ (case ddw of + Drag -> + [ EBk.color <| + if focus then + TC.darkBlue + + else + TC.blue + ] + + Drop -> + EBk.color TC.yellow + :: List.map E.htmlAttribute (blockDndSystem.dropEvents i itemId) + + Ghost -> + [ E.alpha 0.5, EBk.color TC.green ] + ) + ) + [ E.column + ([ E.width <| E.px 30 + , EBk.color TC.brown + , E.height E.fill + ] + ++ List.map E.htmlAttribute (blockDndSystem.dragEvents i itemId) + ) + [] + , E.column + [ E.width E.fill + , E.spacing 8 + ] + [ viewIBlock s.editid s.block + + -- , if focus then + -- blockMenu + -- else + -- E.none + ] + , EI.button (E.alignTop :: E.alignRight :: buttonStyle) + { onPress = Just (DeleteBlock s.editid) + , label = E.text "x" + } + ] + + +makeScrollId : Int -> String +makeScrollId i = + "id-" ++ String.fromInt i + + +viewIBlock : Int -> Block -> Element Msg +viewIBlock editid b = + E.row + [ E.width E.fill + , EBd.width 1 + , EBd.rounded 5 + , E.padding 8 + , E.spacing 8 + , E.htmlAttribute (HA.id (makeScrollId editid)) + ] + <| + [ viewMdBlock b + ] + + +ghostView : Model -> E.Element Msg +ghostView model = + let + dnd = + model.blockDnd + + maybeDragItem : Maybe EditBlock + maybeDragItem = + blockDndSystem.info dnd + |> Maybe.andThen (\{ dragIndex } -> Array.get dragIndex model.blocks) + in + case maybeDragItem of + Just item -> + E.el + (List.map E.htmlAttribute (blockDndSystem.ghostStyles dnd)) + (viewBlock Ghost 0 (Just item.editid) item) + + Nothing -> + E.none + + +viewMdBlock : Block -> Element Msg +viewMdBlock b = + case b of + HtmlBlock htmlb -> + viewhtml htmlb + + UnorderedList listSpacing blockListItems -> + E.text "UnorderedList" + + OrderedList listSpacing offset listListBlocks -> + E.text "OrderedList" + + BlockQuote blocks -> + E.text "BlockQuote" + + Heading headingLevel inlines -> + E.column [] + [ E.text "Heading" + , E.column [] (List.map viewinline inlines) + ] + + Paragraph inlines -> + E.column [] + [ E.text "Paragraph" + , E.column [] (List.map viewinline inlines) + ] + + Table headings inlines -> + E.column [] + [ E.text "Table" + + -- , E.column [] (List.map viewinline inlines) + ] + + CodeBlock bodyLanguage -> + E.text "CodeBlock" + + ThematicBreak -> + E.text "ThematicBreak" + + +mdblockview : Result error (List Block) -> List (Element Msg) +mdblockview parsedMd = + case parsedMd of + Err e -> + [] + + Ok bs -> + bs + |> List.map + viewMdBlock + + +lpad : E.Attribute Msg +lpad = + E.paddingEach + { top = 0, right = 0, bottom = 0, left = 10 } + + +viewhtml : Html Block -> Element Msg +viewhtml htmlb = + E.column [] + [ E.text "HtmlBlock" + , case htmlb of + HtmlElement string listHtmlAttribute listChildren -> + E.el + [ lpad ] + <| + E.text <| + "HtmlElement " + ++ string + + HtmlComment string -> + E.el + [ lpad ] + <| + E.text <| + "HtmlComment " + ++ string + + ProcessingInstruction string -> + E.el + [ lpad ] + <| + E.text <| + "ProcessingInstruction " + ++ string + + HtmlDeclaration string1 string2 -> + E.el + [ lpad ] + <| + E.text <| + "HtmlDeclaration " + ++ string1 + ++ " " + ++ string2 + + Cdata string -> + E.el + [ lpad ] + <| + E.text <| + "Cdata " + ++ string + ] + + +viewinline : Inline -> Element Msg +viewinline inline = + case inline of + HtmlInline html -> + E.row [ lpad ] + [ E.text <| "HtmlInline " + , viewhtml html + ] + + Link string maybeString inlines -> + E.row [ lpad ] + (E.text + "Link " + :: List.map viewinline inlines + ) + + Image string maybeString inlines -> + E.row [ lpad ] + (E.text + "Image " + :: List.map viewinline inlines + ) + + Emphasis inlines -> + E.row [ lpad ] + (E.text + "Emphasis " + :: List.map viewinline inlines + ) + + Strong inlines -> + E.row [ lpad ] + (E.text + "Strong " + :: List.map viewinline inlines + ) + + Strikethrough inlines -> + E.row [ lpad ] + (E.text + "Strikethrough " + :: List.map viewinline inlines + ) + + CodeSpan string -> + E.text <| "CodeSpan " ++ string + + Text string -> + E.text <| "Text " ++ string + + HardLineBreak -> + E.text <| "HardLineBreak " diff --git a/elm/src/MdText.elm b/elm/src/MdText.elm new file mode 100644 index 00000000..6ca6ddc3 --- /dev/null +++ b/elm/src/MdText.elm @@ -0,0 +1,178 @@ +module MdText exposing (renderMdText, stringRenderer) + +import Markdown.Block as Block exposing (Block, Inline, ListItem, Task) +import Markdown.Html +import Markdown.Parser +import Markdown.Renderer exposing (Renderer) + + +renderMdText : String -> Result String String +renderMdText md = + md + |> Markdown.Parser.parse + |> Result.mapError (\error -> error |> List.map Markdown.Parser.deadEndToString |> String.join "\n") + |> Result.andThen (Markdown.Renderer.render stringRenderer) + |> Result.map String.concat + + +stringRenderer : Renderer String +stringRenderer = + { heading = + \{ level, rawText, children } -> + (case level of + Block.H1 -> + "# " ++ String.concat children + + Block.H2 -> + "## " ++ String.concat children + + Block.H3 -> + "### " ++ String.concat children + + Block.H4 -> + "#### " ++ String.concat children + + Block.H5 -> + "##### " ++ String.concat children + + Block.H6 -> + "###### " + ++ String.concat children + ) + ++ "\n\n" + , paragraph = + \strs -> + String.concat strs + ++ "\n\n" + , hardLineBreak = " \n" + , blockQuote = + \strs -> + strs + |> List.map (\s -> " " ++ s ++ "\n") + |> String.concat + , strong = + \s -> + String.concat + ("**" :: s ++ [ "**" ]) + , emphasis = + \s -> + String.concat + ("*" :: s ++ [ "*" ]) + , strikethrough = + \s -> + String.concat + ("~~" :: s ++ [ "~~" ]) + , codeSpan = + \s -> + "`" ++ s ++ "`" + , link = + \link content -> + String.concat + [ "[" + , String.concat content + , "](" + , link.destination + , ")" + ] + , image = + \imageInfo -> + String.concat + [ "![" + , imageInfo.alt + , "](" + , imageInfo.src + , ")" + ] + , text = identity + , unorderedList = + \items -> + items + |> List.map + (\listitem -> + case listitem of + Block.ListItem Block.NoTask childs -> + "- " ++ String.concat childs ++ "\n" + + Block.ListItem Block.IncompleteTask childs -> + "- [ ]" ++ String.concat childs ++ "\n" + + Block.ListItem Block.CompletedTask childs -> + "- [x]" ++ String.concat childs ++ "\n" + ) + |> String.concat + , orderedList = + \startingIndex items -> + items + |> List.indexedMap (\i item -> String.fromInt (i + startingIndex) ++ ") " ++ String.concat item ++ "\n") + |> String.concat + , html = Markdown.Html.oneOf [] + , codeBlock = + \{ body, language } -> + String.concat + [ "```" + , language |> Maybe.withDefault "" + , "\n" + , body + , "```\n\n" + ] + , thematicBreak = "--------------------\n" + + -- table support is WIP + , table = String.concat >> (++) "\n" + , tableHeader = + -- we get the whole header as one string here, contained in a single element list. + List.map + twoheads + >> String.concat + , tableBody = List.foldr (\s l -> s :: "\n" :: l) [] >> String.concat + , tableRow = List.intersperse " | " >> String.concat + , tableHeaderCell = + \maybeAlignment strs -> + let + _ = + Debug.log "thc" ( maybeAlignment, strs ) + in + String.concat strs + ++ " | " + ++ (case maybeAlignment of + Just Block.AlignLeft -> + ":-" + + Just Block.AlignRight -> + "-:" + + Just Block.AlignCenter -> + ":-:" + + Nothing -> + "--" + ) + , tableCell = + \maybeAlignment strs -> + String.concat strs + } + + +twoheads : String -> String +twoheads headstr = + headstr + |> String.split " | " + |> toheads ( [], [] ) + |> (\( heads, aligns ) -> + String.concat (List.intersperse " | " heads) + ++ "\n" + ++ String.concat (List.intersperse "|" aligns) + ++ "\n" + ) + + + + +toheads : ( List String, List String ) -> List String -> ( List String, List String ) +toheads ( llst, rlst ) strs = + case strs of + l :: r :: cdr -> + toheads ( l :: llst, r :: rlst ) cdr + + _ -> + ( List.reverse llst, List.reverse rlst ) diff --git a/elm/src/NoteCache.elm b/elm/src/NoteCache.elm new file mode 100644 index 00000000..ff811f53 --- /dev/null +++ b/elm/src/NoteCache.elm @@ -0,0 +1,129 @@ +module NoteCache exposing (NoteCache, addNote, empty, getNote, purgeNotes, setKeeps) + +import Data exposing (ZkNoteEdit) +import Dict exposing (Dict) +import Set exposing (Set) +import Time +import Util + + +type alias ZneEntry = + { receivetime : Int, zne : ZkNoteEdit } + + +type alias NoteCache = + { byId : Dict Int ZneEntry + , byReceipt : Dict Int (Set Int) + , keep : Set Int + , max : Int + } + + +setKeeps : Set Int -> NoteCache -> NoteCache +setKeeps keep nc = + { nc | keep = keep } + + +addNote : Time.Posix -> ZkNoteEdit -> NoteCache -> NoteCache +addNote pt zne nc = + let + ms = + Time.posixToMillis pt + + id = + zne.zknote.id + in + { byId = + Dict.insert id + { receivetime = ms, zne = zne } + nc.byId + , byReceipt = + case Dict.get ms nc.byReceipt of + Just set -> + Dict.insert ms (Set.insert id set) nc.byReceipt + + Nothing -> + Dict.insert ms (Set.insert id Set.empty) nc.byReceipt + + -- add new notes to keeps! assuming they belong in the current note. + , keep = Set.insert id nc.keep + , max = nc.max + } + + +getNote : Int -> NoteCache -> Maybe ZkNoteEdit +getNote id nc = + Dict.get id nc.byId + |> Maybe.map .zne + + +removeNote : Int -> NoteCache -> NoteCache +removeNote id nc = + case Dict.get id nc.byId of + Just ze -> + { byId = Dict.remove id nc.byId + , byReceipt = + case Dict.get ze.receivetime nc.byReceipt of + Just set -> + let + ns = + Set.remove id set + in + if Set.isEmpty ns then + Dict.remove ze.receivetime nc.byReceipt + + else + Dict.insert ze.receivetime ns nc.byReceipt + + Nothing -> + nc.byReceipt + , keep = Set.remove id nc.keep + , max = nc.max + } + + Nothing -> + nc + + +purgeNotes : NoteCache -> NoteCache +purgeNotes nc = + let + ncount = + Dict.size nc.byId + + toremove = + ncount - nc.max + in + if toremove <= 0 then + nc + + else + let + br = + nc.byReceipt |> Dict.toList |> List.map (Tuple.second >> Set.toList) |> List.concat + + ( rcount, nnnc ) = + Util.foldUntil + (\id ( rmv, nnc ) -> + if rmv <= 0 then + Util.Stop ( rmv, nnc ) + + else if Set.member id nc.keep then + Util.Go ( rmv, nnc ) + + else + Util.Go ( rmv - 1, removeNote id nnc ) + ) + ( toremove, nc ) + br + in + nnnc + + +empty : Int -> NoteCache +empty max = + { byId = Dict.empty + , byReceipt = Dict.empty + , keep = Set.empty + , max = max + } diff --git a/elm/src/PublicInterface.elm b/elm/src/PublicInterface.elm index 03d5edb7..2832de68 100644 --- a/elm/src/PublicInterface.elm +++ b/elm/src/PublicInterface.elm @@ -17,7 +17,7 @@ type SendMsg type ServerResponse = ServerError String - | ZkNote Data.ZkNoteEdit + | ZkNote Data.PubZkNote encodeSendMsg : SendMsg -> JE.Value @@ -42,7 +42,18 @@ serverResponseDecoder = (\what -> case what of "zknote" -> - JD.map ZkNote (JD.at [ "content" ] <| Data.decodeZkNoteEdit) + JD.map ZkNote + (JD.at [ "content" ] <| + JD.map + (\zne -> + -- PubZkNote + { zknote = zne.zknote + , links = zne.links + , panelNote = Nothing + } + ) + Data.decodeZkNoteEdit + ) "server error" -> JD.map ServerError (JD.at [ "content" ] JD.string) diff --git a/elm/src/View.elm b/elm/src/View.elm index 3b131eb3..0156eec2 100644 --- a/elm/src/View.elm +++ b/elm/src/View.elm @@ -18,6 +18,7 @@ import Markdown.Html import Markdown.Parser import Markdown.Renderer import MdCommon as MC +import NoteCache as NC exposing (NoteCache) import Schelme.Show exposing (showTerm) import TangoColors as TC import Time @@ -84,8 +85,8 @@ showZkl id zkl = ] -view : Time.Zone -> Int -> Model -> Bool -> Element Msg -view zone maxw model loggedin = +view : Time.Zone -> Int -> NoteCache -> Model -> Bool -> Element Msg +view zone maxw noteCache model loggedin = let mw = min maxw 1000 - 160 @@ -121,7 +122,7 @@ view zone maxw model loggedin = ] (case MC.markdownView - (MC.mkRenderer MC.PublicView (\_ -> Noop) mw model.cells False OnSchelmeCodeChanged) + (MC.mkRenderer MC.PublicView (\_ -> Noop) mw model.cells False OnSchelmeCodeChanged noteCache) panel.content of Ok rendered -> @@ -146,7 +147,7 @@ view zone maxw model loggedin = else E.none , E.row [ E.width E.fill ] - [ case MC.markdownView (MC.mkRenderer MC.PublicView (\_ -> Noop) mw model.cells False OnSchelmeCodeChanged) model.md of + [ case MC.markdownView (MC.mkRenderer MC.PublicView (\_ -> Noop) mw model.cells False OnSchelmeCodeChanged noteCache) model.md of Ok rendered -> E.column [ E.spacing 30 @@ -193,7 +194,7 @@ view zone maxw model loggedin = ] -initFull : Data.ZkNoteEdit -> Model +initFull : Data.PubZkNote -> Model initFull zknaa = let zknote = diff --git a/elm/src/ViewLinearMd.elm b/elm/src/ViewLinearMd.elm new file mode 100644 index 00000000..ef81f556 --- /dev/null +++ b/elm/src/ViewLinearMd.elm @@ -0,0 +1,307 @@ +module ViewLinearMd exposing (..) + +import Array exposing (Array) +import Common exposing (buttonStyle) +import DnDList +import Element as E exposing (Element) +import Element.Background as EBk +import Element.Border as EBd +import Element.Events as EE +import Element.Font as EF +import Element.Input as EI +import Element.Region as ER +import Html.Attributes as HA +import LinearMd exposing (MdElement(..), lpad, mbToMe, miToMe, toBlocks, viewMdElement, viewhtml) +import Markdown.Block as MB +import Markdown.Html +import Markdown.Renderer as MR +import MdText as MT +import TangoColors as TC + + +type alias Model = + { blocks : Array EditMdElement + , focusMdElement : Maybe Int + , nextMdElementId : Int + , cleanMdElements : Array EditMdElement + , blockDnd : DnDList.Model + , built : Maybe String + } + + +type alias EditMdElement = + { editid : Int + , block : MdElement + } + + +type Msg + = AddMdElementPress + | MdElementDndMsg DnDList.Msg + | MdElementClicked Int + | DeleteMdElement Int + | BuildPress + + +type DragDropWhat + = Drag + | Drop + | Ghost + + +init : List MB.Block -> Model +init blocks = + let + ba = + Debug.log "blocks" + (blocks + |> List.map mbToMe + |> List.concat + |> List.indexedMap (\i b -> { editid = i, block = b }) + |> Array.fromList) + in + { blocks = ba + , focusMdElement = Nothing + , nextMdElementId = Array.length ba + , cleanMdElements = ba + , blockDnd = blockDndSystem.model + , built = Nothing + } + + +blockDndConfig : DnDList.Config EditMdElement +blockDndConfig = + { beforeUpdate = \_ _ list -> list + , movement = DnDList.Free + , listen = DnDList.OnDrag + , operation = DnDList.Swap + } + + +blockDndSystem : DnDList.System EditMdElement Msg +blockDndSystem = + DnDList.create blockDndConfig MdElementDndMsg + + +subscriptions : Model -> Sub Msg +subscriptions model = + blockDndSystem.subscriptions model.blockDnd + + + +-- ++ (Array.indexedMap +-- (\i -> viewMdElementDnd model.blockDnd i model.focusMdElement) +-- model.blocks +-- |> Array.toList +-- ) + + +view : Model -> Element Msg +view model = + -- let + -- maxwidth = + -- 700 + -- maxheight = + -- nd.size.height - 75 + -- in + E.column + [ E.alignTop + , E.spacing 8 + , E.padding 8 + + -- , E.width (E.maximum maxwidth E.fill) + -- , E.height (E.maximum maxheight E.fill) + , E.centerX + + -- , E.scrollbarY + , E.htmlAttribute (HA.id "steplist") + ] + <| + EI.button Common.buttonStyle { onPress = Just BuildPress, label = E.text "build" } + :: E.text (Maybe.withDefault "" model.built) + :: (Array.indexedMap + (\i -> viewMdElementDnd model.blockDnd i model.focusMdElement) + model.blocks + |> Array.toList + ) + + +viewMdElementDnd : DnDList.Model -> Int -> Maybe Int -> EditMdElement -> Element Msg +viewMdElementDnd ddlmodel i focusid s = + let + ddw = + case + blockDndSystem.info ddlmodel + |> Maybe.map .dragIndex + of + Just ix -> + if ix == i then + Ghost + + else + Drop + + Nothing -> + Drag + in + viewMdElement ddw i focusid s + + +viewMdElement : DragDropWhat -> Int -> Maybe Int -> EditMdElement -> Element Msg +viewMdElement ddw i focusid s = + let + itemId : String + itemId = + "id-" ++ String.fromInt i + + focus = + focusid == Just s.editid + in + E.row + ([ E.width E.fill + , E.spacing 8 + , E.htmlAttribute (HA.id itemId) + , E.padding 10 + , EBd.rounded 5 + , EE.onMouseDown (MdElementClicked s.editid) + ] + ++ (case ddw of + Drag -> + [ EBk.color <| + if focus then + TC.darkBlue + + else + TC.blue + ] + + Drop -> + EBk.color TC.yellow + :: List.map E.htmlAttribute (blockDndSystem.dropEvents i itemId) + + Ghost -> + Debug.log "ghost mode" + [ E.alpha 0.5, EBk.color TC.red ] + ) + ) + [ E.column + ([ E.width <| E.px 30 + , EBk.color TC.brown + , E.height E.fill + ] + ++ List.map E.htmlAttribute (blockDndSystem.dragEvents i itemId) + ) + [] + , E.column + [ E.width E.fill + , E.spacing 8 + ] + [ viewIMdElement s.editid s.block + + -- , if focus then + -- blockMenu + -- else + -- E.none + ] + , EI.button (E.alignTop :: E.alignRight :: buttonStyle) + { onPress = Just (DeleteMdElement s.editid) + , label = E.text "x" + } + ] + + +makeScrollId : Int -> String +makeScrollId i = + "id-" ++ String.fromInt i + + +viewIMdElement : Int -> MdElement -> Element Msg +viewIMdElement editid b = + E.row + [ E.width E.fill + , EBd.width 1 + , EBd.rounded 5 + , E.padding 8 + , E.spacing 8 + , E.htmlAttribute (HA.id (makeScrollId editid)) + ] + <| + [ LinearMd.viewMdElement b + ] + + +ghostView : Model -> Maybe (E.Element Msg) +ghostView model = + let + dnd = + model.blockDnd + + maybeDragItem : Maybe EditMdElement + maybeDragItem = + blockDndSystem.info dnd + |> Maybe.andThen (\{ dragIndex } -> Array.get dragIndex model.blocks) + in + maybeDragItem + |> Maybe.map + (\item -> + E.el + (List.map E.htmlAttribute (blockDndSystem.ghostStyles dnd)) + (viewMdElement Ghost 0 (Just item.editid) item) + ) + + + +-- type Command +-- = None +-- | BlockDndCmd (Cmd Msg) + + +update : Model -> Msg -> ( Model, Cmd Msg ) +update model msg = + case msg of + BuildPress -> + let + st = + model.blocks + |> Array.toList + |> List.map .block + |> LinearMd.toBlocks + |> Result.andThen + (\blocks -> + MR.render MT.stringRenderer blocks + |> Result.map String.concat + ) + in + ( { model + | built = + Just <| + case st of + Ok s -> + s + + Err s -> + s + } + , Cmd.none + ) + + AddMdElementPress -> + ( model, Cmd.none ) + + MdElementDndMsg dndmsg -> + let + ( blockDnD, blocks ) = + blockDndSystem.update dndmsg model.blockDnd (Array.toList model.blocks) + in + ( { model + | blockDnd = blockDnD + , blocks = Array.fromList blocks + } + , blockDndSystem.commands blockDnD + ) + + MdElementClicked int -> + ( model, Cmd.none ) + + DeleteMdElement int -> + ( model, Cmd.none ) diff --git a/elm/src/ZkInterface.elm b/elm/src/ZkInterface.elm index b0cd3689..7cd25c02 100644 --- a/elm/src/ZkInterface.elm +++ b/elm/src/ZkInterface.elm @@ -10,6 +10,7 @@ import Util type SendMsg = GetZkNote Int | GetZkNoteEdit Data.GetZkNoteEdit + | GetZneIfChanged Data.GetZneIfChanged | GetZkNoteComments Data.GetZkNoteComments | GetZkNoteArchives Data.GetZkNoteArchives | GetArchiveZkNote Data.GetArchiveZkNote @@ -31,7 +32,7 @@ type ServerResponse | SavedZkNote Data.SavedZkNote | DeletedZkNote Int | ZkNote Data.ZkNote - | ZkNoteEdit Data.ZkNoteEdit + | ZkNoteEditWhat Data.ZkNoteEditWhat | ZkNoteComments (List Data.ZkNote) | ServerError String | SavedZkLinks @@ -40,6 +41,7 @@ type ServerResponse | PowerDeleteComplete Int | HomeNoteSet Int | FilesUploaded (List Data.ZkListNote) + | Noop showServerResponse : ServerResponse -> String @@ -63,7 +65,7 @@ showServerResponse sr = ZkNote _ -> "ZkNote" - ZkNoteEdit _ -> + ZkNoteEditWhat _ -> "ZkNoteEdit" ZkNoteComments _ -> @@ -93,6 +95,9 @@ showServerResponse sr = FilesUploaded _ -> "FilesUploaded" + Noop -> + "Noop" + encodeSendMsg : SendMsg -> JE.Value encodeSendMsg sm = @@ -109,6 +114,12 @@ encodeSendMsg sm = , ( "data", Data.encodeGetZkNoteEdit zkne ) ] + GetZneIfChanged x -> + JE.object + [ ( "what", JE.string "getzneifchanged" ) + , ( "data", Data.encodeGetZneIfChanged x ) + ] + GetZkNoteComments msg -> JE.object [ ( "what", JE.string "getzknotecomments" ) @@ -133,10 +144,10 @@ encodeSendMsg sm = , ( "data", JE.int id ) ] - SaveZkNote sbe -> + SaveZkNote x -> JE.object [ ( "what", JE.string "savezknote" ) - , ( "data", Data.encodeSaveZkNote sbe ) + , ( "data", Data.encodeSaveZkNote x ) ] SaveZkNotePlusLinks s -> @@ -215,7 +226,7 @@ serverResponseDecoder = JD.map ZkNote (JD.at [ "content" ] <| Data.decodeZkNote) "zknoteedit" -> - JD.map ZkNoteEdit (JD.at [ "content" ] <| Data.decodeZkNoteEdit) + JD.map ZkNoteEditWhat (JD.at [ "content" ] <| Data.decodeZkNoteEditWhat) "zknotecomments" -> JD.map ZkNoteComments (JD.at [ "content" ] <| JD.list Data.decodeZkNote) @@ -238,6 +249,9 @@ serverResponseDecoder = "savedfiles" -> JD.map FilesUploaded (JD.field "content" <| JD.list Data.decodeZkListNote) + "noop" -> + JD.succeed Noop + wat -> JD.succeed (ServerError ("invalid 'what' from server: " ++ wat)) diff --git a/flake.lock b/flake.lock index 6490952b..cef5532e 100644 --- a/flake.lock +++ b/flake.lock @@ -1,12 +1,15 @@ { "nodes": { "flake-utils": { + "inputs": { + "systems": "systems" + }, "locked": { - "lastModified": 1667395993, - "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "lastModified": 1681202837, + "narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=", "owner": "numtide", "repo": "flake-utils", - "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "rev": "cfacdce06f30d2b68473a46042957675eebb3401", "type": "github" }, "original": { @@ -20,11 +23,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1671096816, - "narHash": "sha256-ezQCsNgmpUHdZANDCILm3RvtO1xH8uujk/+EqNvzIOg=", + "lastModified": 1679567394, + "narHash": "sha256-ZvLuzPeARDLiQUt6zSZFGOs+HZmE+3g4QURc8mkBsfM=", "owner": "nmattia", "repo": "naersk", - "rev": "d998160d6a076cfe8f9741e56aeec7e267e3e114", + "rev": "88cd22380154a2c36799fe8098888f0f59861a15", "type": "github" }, "original": { @@ -67,6 +70,21 @@ "naersk": "naersk", "nixpkgs": "nixpkgs_2" } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } } }, "root": "root", diff --git a/orgauth b/orgauth index 43a3587b..f7e619a0 160000 --- a/orgauth +++ b/orgauth @@ -1 +1 @@ -Subproject commit 43a3587bf9780b984974dde9cbaf31d3827d0bde +Subproject commit f7e619a07fbf2c529aa681e0f12fbdc350e9a2ba diff --git a/server/Cargo.toml b/server/Cargo.toml index b221316d..6054b1ea 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -9,7 +9,7 @@ zkprotocol = { path = "../zkprotocol" } orgauth = { path = "../orgauth/rustlib/" } base64 = "0.13.0" env_logger = "0.5.13" -rusqlite = "0.27.0" +rusqlite = "0.29.0" log = "0.4.0" actix-web = "3.3.2" # actix-rt = "0.2.5" @@ -24,7 +24,7 @@ serde = "1.0.124" serde_derive = "1.0.124" serde_json = "1.0.64" uuid = { version = "0.8", features = ["serde", "v4"] } -crypto-hash = "0.3.1" +crypto-hash = "0.3.4" time = "0.1" rand = "0.5.0" toml = "0.5.9" diff --git a/server/src/interfaces.rs b/server/src/interfaces.rs index d669236a..1f327664 100644 --- a/server/src/interfaces.rs +++ b/server/src/interfaces.rs @@ -10,8 +10,9 @@ use orgauth::endpoints::Callbacks; use std::error::Error; use std::time::Duration; use zkprotocol::content::{ - GetArchiveZkNote, GetZkNoteArchives, GetZkNoteComments, GetZkNoteEdit, ImportZkNote, SaveZkNote, - SaveZkNotePlusLinks, ZkLinks, ZkNoteArchives, ZkNoteEdit, + GetArchiveZkNote, GetZkNoteArchives, GetZkNoteComments, GetZkNoteEdit, GetZneIfChanged, + ImportZkNote, SaveZkNote, SaveZkNotePlusLinks, ZkLinks, ZkNoteArchives, ZkNoteEdit, + ZkNoteEditWhat, }; use zkprotocol::messages::{PublicMessage, ServerResponse, UserMessage}; use zkprotocol::search::{TagSearch, ZkListNoteSearchResult, ZkNoteSearch}; @@ -102,11 +103,41 @@ pub fn zk_interface_loggedin( "user#getzknoteedit: {} - {}", gzne.zknote, note.zknote.title ); + + let znew = ZkNoteEditWhat { + what: gzne.what, + zne: note, + }; + Ok(ServerResponse { what: "zknoteedit".to_string(), - content: serde_json::to_value(note)?, + content: serde_json::to_value(znew)?, }) } + "getzneifchanged" => { + let msgdata = Option::ok_or(msg.data.as_ref(), "malformed json data")?; + let gzic: GetZneIfChanged = serde_json::from_value(msgdata.clone())?; + info!( + "user#getzneifchanged: {} - {}", + gzic.zknote, gzic.changeddate + ); + let conn = sqldata::connection_open(config.orgauth_config.db.as_path())?; + let ozkne = sqldata::read_zneifchanged(&conn, uid, &gzic)?; + + match ozkne { + Some(zkne) => Ok(ServerResponse { + what: "zknoteedit".to_string(), + content: serde_json::to_value(ZkNoteEditWhat { + what: gzic.what, + zne: zkne, + })?, + }), + None => Ok(ServerResponse { + what: "noop".to_string(), + content: serde_json::Value::Null, + }), + } + } "getzknotecomments" => { let msgdata = Option::ok_or(msg.data.as_ref(), "malformed json data")?; let gzne: GetZkNoteComments = serde_json::from_value(msgdata.clone())?; diff --git a/server/src/migrations.rs b/server/src/migrations.rs index f92121fa..c323f023 100644 --- a/server/src/migrations.rs +++ b/server/src/migrations.rs @@ -1819,8 +1819,8 @@ pub fn udpate24(dbfile: &Path) -> Result<(), orgauth::error::Error> { conn.execute_batch(m1.make::().as_str())?; conn.execute( - "insert into filetemp (hash, createdate) - select hash, createdate from file", + "insert into filetemp (id, hash, createdate) + select id, hash, createdate from file", params![], )?; @@ -1843,17 +1843,18 @@ pub fn udpate24(dbfile: &Path) -> Result<(), orgauth::error::Error> { conn.execute_batch(m2.make::().as_str())?; - let mut pstmt = conn.prepare("select hash, createdate from filetemp")?; - let r: Vec<(String, i64)> = pstmt + let mut pstmt = conn.prepare("select id, hash, createdate from filetemp")?; + let r: Vec<(i64, String, i64)> = pstmt .query_map(params![], |row| { - let s: String = row.get(0)?; - let i: i64 = row.get(1)?; - Ok((s, i)) + let id: i64 = row.get(0)?; + let s: String = row.get(1)?; + let i: i64 = row.get(2)?; + Ok((id, s, i)) })? .filter_map(|x| x.ok()) .collect(); - for (hash, createdate) in r { + for (id, hash, createdate) in r { // get file size. println!("attempting file {}", hash); @@ -1866,9 +1867,9 @@ pub fn udpate24(dbfile: &Path) -> Result<(), orgauth::error::Error> { println!("file size {} - {}", hash, size); conn.execute( - "insert into file (hash, createdate, size) - values (?1, ?2, ?3)", - params![hash, createdate, size], + "insert into file (id, hash, createdate, size) + values (?1, ?2, ?3, ?4)", + params![id, hash, createdate, size], )?; println!("insert complete"); } diff --git a/server/src/sqldata.rs b/server/src/sqldata.rs index c68f4a5c..47784c25 100644 --- a/server/src/sqldata.rs +++ b/server/src/sqldata.rs @@ -11,8 +11,8 @@ use std::path::{Path, PathBuf}; use std::time::Duration; use zkprotocol::content::{ Direction, EditLink, ExtraLoginData, GetArchiveZkNote, GetZkLinks, GetZkNoteArchives, - GetZkNoteComments, GetZkNoteEdit, ImportZkNote, SaveZkLink, SaveZkNote, SavedZkNote, ZkLink, - ZkListNote, ZkNote, ZkNoteEdit, + GetZkNoteComments, GetZkNoteEdit, GetZneIfChanged, ImportZkNote, SaveZkLink, SaveZkNote, + SavedZkNote, ZkLink, ZkListNote, ZkNote, ZkNoteEdit, }; #[derive(Clone, Deserialize, Serialize, Debug)] @@ -1404,6 +1404,33 @@ pub fn read_zknoteedit( }) } +pub fn read_zneifchanged( + conn: &Connection, + uid: i64, + gzic: &GetZneIfChanged, +) -> Result, orgauth::error::Error> { + let changeddate: i64 = conn.query_row( + "select changeddate from zknote N + where N.id = ?1", + params![gzic.zknote], + |row| Ok(row.get(0)?), + )?; + + if changeddate > gzic.changeddate { + return read_zknoteedit( + conn, + uid, + &GetZkNoteEdit { + zknote: gzic.zknote, + what: gzic.what.clone(), + }, + ) + .map(Some); + } else { + Ok(None) + } +} + pub fn save_importzknotes( conn: &Connection, uid: i64, diff --git a/server/static/windowkey.js b/server/static/windowkey.js index f9f60087..d16e228b 100644 --- a/server/static/windowkey.js +++ b/server/static/windowkey.js @@ -35,16 +35,19 @@ function keycheck(e) { if (pd) { e.preventDefault(); } - // console.log("key found: ", e.key, " preventdefault: ", pd); + // if pd undefined, null, etc, then don't report key press. + if (pd == true || pd == false) { + // console.log("key found: ", e.key, " preventdefault: ", pd); + app.ports.receiveKeyMsg.send({ key : e.key + , ctrl : e.ctrlKey + , alt : e.altKey + , shift : e.shiftKey + , preventDefault : pd}); + } + - app.ports.receiveKeyMsg.send({ key : e.key - , ctrl : e.ctrlKey - , alt : e.altKey - , shift : e.shiftKey - , preventDefault : pd}); } catch (error) { // console.log("key not found: ", e.key); } } - diff --git a/zkprotocol/src/content.rs b/zkprotocol/src/content.rs index c666f9c1..cdac6563 100644 --- a/zkprotocol/src/content.rs +++ b/zkprotocol/src/content.rs @@ -123,6 +123,14 @@ pub struct GetZkLinks { #[derive(Deserialize, Serialize, Debug)] pub struct GetZkNoteEdit { pub zknote: i64, + pub what: String, +} + +#[derive(Deserialize, Debug, Clone)] +pub struct GetZneIfChanged { + pub zknote: i64, + pub changeddate: i64, + pub what: String, } #[derive(Deserialize, Serialize, Debug)] @@ -156,3 +164,9 @@ pub struct ZkNoteEdit { pub zknote: ZkNote, pub links: Vec, } + +#[derive(Serialize, Debug)] +pub struct ZkNoteEditWhat { + pub what: String, + pub zne: ZkNoteEdit, +}