diff --git a/Cargo.lock b/Cargo.lock index d0d42eae..b5ce2bc3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -136,6 +136,15 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + [[package]] name = "alloca" version = "0.4.0" @@ -243,6 +252,15 @@ version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + [[package]] name = "arrayref" version = "0.3.9" @@ -540,6 +558,15 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + [[package]] name = "bit-set" version = "0.8.0" @@ -657,6 +684,16 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +[[package]] +name = "calendrical_calculations" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c5d386a9f2c8b97e1a036420bcf937db4e5c9df33eb0232025008ced6104c0" +dependencies = [ + "core_maths", + "displaydoc", +] + [[package]] name = "calloop" version = "0.13.0" @@ -792,6 +829,15 @@ dependencies = [ "windows-win", ] +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.17", +] + [[package]] name = "codespan-reporting" version = "0.11.1" @@ -916,6 +962,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crlify" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241cd99da96450367ae4045265034f61b3ad4aefd3288e1a0d191c31b30bcfbf" + [[package]] name = "crossbeam-channel" version = "0.5.15" @@ -962,6 +1014,63 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" +[[package]] +name = "databake" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a04fbfbecca8f0679c8c06fef907594adcc3e2052e11163a6d30535a1a5604d" +dependencies = [ + "databake-derive 0.1.8", + "proc-macro2", + "quote", +] + +[[package]] +name = "databake" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6ee9e2d2afb173bcdeee45934c89ec341ab26f91c9933774fc15c2b58f83ef" +dependencies = [ + "databake-derive 0.2.0", + "proc-macro2", + "quote", +] + +[[package]] +name = "databake-derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4078275de501a61ceb9e759d37bdd3d7210e654dbc167ac1a3678ef4435ed57b" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "databake-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6834770958c7b84223607e49758ec0dde273c4df915e734aad50f62968a4c134" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "dispatch" version = "0.2.0" @@ -1025,6 +1134,27 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "elsa" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9abf33c656a7256451ebb7d0082c5a471820c31269e49d807c538c252352186e" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + [[package]] name = "encode_unicode" version = "1.0.0" @@ -1064,6 +1194,17 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "erased-serde" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "259d404d09818dec19332e31d94558aeb442fea04c817006456c24b5460bbd4b" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + [[package]] name = "errno" version = "0.3.14" @@ -1163,6 +1304,17 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" +[[package]] +name = "fixed_decimal" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35943d22b2f19c0cb198ecf915910a8158e94541c89dcc63300d7799d46c2c5e" +dependencies = [ + "displaydoc", + "smallvec", + "writeable", +] + [[package]] name = "flate2" version = "1.1.2" @@ -1675,156 +1827,693 @@ dependencies = [ ] [[package]] -name = "icu_collections" +name = "icu" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "ab13fe39da5da564b88228e9f08815c9d0efbe9ec244e72b149d9994e10f1054" dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", + "icu_calendar", + "icu_casemap", + "icu_collator", + "icu_collections", + "icu_datetime", + "icu_decimal", + "icu_experimental", + "icu_list", + "icu_locale", + "icu_normalizer", + "icu_pattern", + "icu_plurals", + "icu_properties", + "icu_provider", + "icu_provider_registry", + "icu_segmenter", + "icu_time", + "memchr", ] [[package]] -name = "icu_locale_core" -version = "2.0.0" +name = "icu_calendar" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "1f6c40ba6481ed7ddd358437af0f000eb9f661345845977d9d1b38e606374e1f" dependencies = [ + "calendrical_calculations", + "databake 0.2.0", "displaydoc", - "litemap", + "icu_calendar_data", + "icu_locale", + "icu_locale_core", + "icu_provider", + "ixdtf", + "serde", "tinystr", "writeable", "zerovec", ] [[package]] -name = "icu_properties" -version = "2.0.1" +name = "icu_calendar_data" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "7219c8639ab936713a87b571eed2bc2615aa9137e8af6eb221446ee5644acc18" + +[[package]] +name = "icu_casemap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dc5e74b3c9d7b63e0d7c5fd54ee8c135705df2ea2aa558082dd555dc9747a97" dependencies = [ + "databake 0.2.0", "displaydoc", + "icu_casemap_data", "icu_collections", "icu_locale_core", - "icu_properties_data", + "icu_properties", "icu_provider", "potential_utf", - "zerotrie", + "serde", + "writeable", "zerovec", ] [[package]] -name = "icu_properties_data" -version = "2.0.1" +name = "icu_casemap_data" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "f7584067558ab4c60c95d1ac2abd1588689cb4bcd4e099507f62dae86ae8d2c0" [[package]] -name = "icu_provider" -version = "2.0.0" +name = "icu_codepointtrie_builder" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "6395ce5048ee41bb73d8bae0bb5cc89e2cf5b89a7ab31fd93108806c2b03a6e4" dependencies = [ - "displaydoc", - "icu_locale_core", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerotrie", + "icu_collections", + "wasmi", + "wat", "zerovec", ] [[package]] -name = "image" -version = "0.25.8" +name = "icu_collator" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7" +checksum = "42ad4c6a556938dfd31f75a8c54141079e8821dc697ffb799cfe0f0fa11f2edc" dependencies = [ - "bytemuck", - "byteorder-lite", - "moxcms", - "num-traits", - "png 0.18.0", - "tiff", - "zune-core", - "zune-jpeg", + "databake 0.2.0", + "displaydoc", + "icu_collator_data", + "icu_collections", + "icu_locale", + "icu_locale_core", + "icu_normalizer", + "icu_properties", + "icu_provider", + "serde", + "smallvec", + "utf16_iter", + "utf8_iter", + "zerovec", ] [[package]] -name = "imagesize" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" - -[[package]] -name = "indexmap" -version = "2.11.4" +name = "icu_collator_data" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" -dependencies = [ - "equivalent", - "hashbrown 0.16.0", - "rayon", -] +checksum = "d880b8e680799eabd90c054e1b95526cd48db16c95269f3c89fb3117e1ac92c5" [[package]] -name = "indicatif" -version = "0.17.11" +name = "icu_collections" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ - "console", - "number_prefix", - "portable-atomic", - "unicode-width 0.2.1", - "web-time", + "databake 0.2.0", + "displaydoc", + "potential_utf", + "serde", + "yoke", + "zerofrom", + "zerovec", ] [[package]] -name = "io-uring" -version = "0.7.10" +name = "icu_datetime" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +checksum = "0790c15e3d6ae3303365fa2337b4f6469de257916141110d14dcaf73f1d31ac5" dependencies = [ - "bitflags 2.9.4", - "cfg-if", - "libc", + "databake 0.2.0", + "displaydoc", + "either", + "fixed_decimal", + "icu_calendar", + "icu_datetime_data", + "icu_decimal", + "icu_locale", + "icu_locale_core", + "icu_pattern", + "icu_plurals", + "icu_provider", + "icu_time", + "litemap", + "potential_utf", + "serde", + "smallvec", + "tinystr", + "writeable", + "zerovec", ] [[package]] -name = "is_ci" -version = "1.2.0" +name = "icu_datetime_data" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" +checksum = "83791ac10bb7b774f130bb81fa89c4059de710dcef53caa0b86e645212d6d54c" [[package]] -name = "is_terminal_polyfill" -version = "1.70.1" +name = "icu_decimal" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "fec61c43fdc4e368a9f450272833123a8ef0d7083a44597660ce94d791b8a2e2" +dependencies = [ + "databake 0.2.0", + "displaydoc", + "fixed_decimal", + "icu_decimal_data", + "icu_locale", + "icu_locale_core", + "icu_provider", + "serde", + "tinystr", + "writeable", + "zerovec", +] [[package]] -name = "itoa" -version = "1.0.15" +name = "icu_decimal_data" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "b70963bc35f9bdf1bc66a5c1f458f4991c1dc71760e00fa06016b2c76b2738d5" [[package]] -name = "jni" -version = "0.21.1" +name = "icu_experimental" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +checksum = "ebe3d7e64892a434b08d5a58b53127e47a095ff780305f563c8c01798a1051b0" dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys", - "log", + "databake 0.2.0", + "displaydoc", + "either", + "fixed_decimal", + "icu_casemap", + "icu_collections", + "icu_decimal", + "icu_experimental_data", + "icu_list", + "icu_locale", + "icu_locale_core", + "icu_normalizer", + "icu_pattern", + "icu_plurals", + "icu_properties", + "icu_provider", + "litemap", + "log", + "num-bigint", + "num-rational", + "num-traits", + "potential_utf", + "serde", + "smallvec", + "tinystr", + "writeable", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_experimental_data" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b60d32ba5610adfc2083f5a759f55d9a9082ebf72750f126cb1630844eea1acf" + +[[package]] +name = "icu_list" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e26f94ec776bb8b28cedc7dcf91033b822c5cb4c1783cf7a3f796fc168aa0c8b" +dependencies = [ + "databake 0.2.0", + "displaydoc", + "icu_list_data", + "icu_locale", + "icu_provider", + "regex-automata", + "serde", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_list_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a456a2412458ca45e181d9d51c5090ef8cd90f5692e11d34bafab3b3be1c76b" + +[[package]] +name = "icu_locale" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ae5921528335e91da1b6c695dbf1ec37df5ac13faa3f91e5640be93aa2fbefd" +dependencies = [ + "databake 0.2.0", + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_locale_data", + "icu_provider", + "potential_utf", + "serde", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "databake 0.2.0", + "displaydoc", + "litemap", + "serde", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locale_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fdef0c124749d06a743c69e938350816554eb63ac979166590e2b4ee4252765" + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "databake 0.2.0", + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "serde", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_pattern" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "983825f401e6bc4a13c45d552ffd9ad6f3f6b6bc0ec03f31d6835a90a46deb1f" +dependencies = [ + "databake 0.2.0", + "displaydoc", + "either", + "serde", + "writeable", + "yoke", + "zerovec", +] + +[[package]] +name = "icu_plurals" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fd83a65f58b6f28e1f3da8c6ada6b415ee3ad5cb480b75bdb669f34d72dd179" +dependencies = [ + "databake 0.2.0", + "displaydoc", + "fixed_decimal", + "icu_locale", + "icu_plurals_data", + "icu_provider", + "serde", + "zerovec", +] + +[[package]] +name = "icu_plurals_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ec552d761eaf4a1c39ad28936e0af77a41bf01ff756ea54be4f8bfc21c265d7" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "databake 0.2.0", + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "serde", + "unicode-bidi", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "bincode", + "databake 0.2.0", + "displaydoc", + "erased-serde", + "icu_locale_core", + "log", + "postcard", + "serde", + "serde_json", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_provider_adapters" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c260e90e962088d46a1605687f78d3293cc3a34ba66b08ff7361084bc7895e" +dependencies = [ + "icu_locale", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_provider_baked" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "657a52299b8909bb89ed342626e6a4503856d6535895e2dc75401b582ed39407" +dependencies = [ + "crlify", + "databake 0.2.0", + "heck", + "icu_provider", + "icu_provider_registry", + "log", + "proc-macro2", + "writeable", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_provider_blob" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf5dd612b781cc4aa75b270f3c9f36fd42139a54b24fae7f077163ee6c322f85" +dependencies = [ + "icu_provider", + "log", + "postcard", + "serde", + "writeable", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_provider_export" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cc10372e81d12288a19da0f393c94cb8efc3bb29f3cc8c7c8feabad5219211" +dependencies = [ + "displaydoc", + "icu_locale", + "icu_provider", + "icu_provider_baked", + "icu_provider_blob", + "icu_provider_fs", + "log", + "rayon", + "writeable", +] + +[[package]] +name = "icu_provider_fs" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "148a450045a4beaca3bdfa9dff90634ace737cc30de943553ea5e5bc21bf745b" +dependencies = [ + "bincode", + "crlify", + "displaydoc", + "icu_provider", + "log", + "postcard", + "serde", + "serde-json-core", + "serde_json", +] + +[[package]] +name = "icu_provider_registry" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36752e89c83b109a23446e4045593a04ee041006a0667af234e784f77cba57c" + +[[package]] +name = "icu_provider_source" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a0467cd220b7e918b38d1d78baeea317821255776d2afbd0ab31fa80c3138d6" +dependencies = [ + "calendrical_calculations", + "displaydoc", + "either", + "elsa", + "flate2", + "icu", + "icu_codepointtrie_builder", + "icu_collections", + "icu_pattern", + "icu_provider", + "icu_provider_adapters", + "icu_provider_registry", + "itertools", + "litemap", + "log", + "ndarray", + "parse-zoneinfo", + "potential_utf", + "serde", + "serde-aux", + "serde_json", + "tar", + "tinystr", + "toml", + "twox-hash", + "ureq", + "writeable", + "zerotrie", + "zerovec", + "zip", +] + +[[package]] +name = "icu_segmenter" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e185fc13b6401c138cf40db12b863b35f5edf31b88192a545857b41aeaf7d3d3" +dependencies = [ + "core_maths", + "databake 0.2.0", + "displaydoc", + "icu_collections", + "icu_locale", + "icu_locale_core", + "icu_provider", + "icu_segmenter_data", + "potential_utf", + "serde", + "utf8_iter", + "zerovec", +] + +[[package]] +name = "icu_segmenter_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5360a2fbe97f617c4f8b944356dedb36d423f7da7f13c070995cf89e59f01220" + +[[package]] +name = "icu_time" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d01a4a2dcbc5e5180ef113920e7461d0e9caaddb3567d81c4eca262efe55c0" +dependencies = [ + "calendrical_calculations", + "databake 0.2.0", + "displaydoc", + "icu_calendar", + "icu_locale_core", + "icu_provider", + "icu_time_data", + "ixdtf", + "serde", + "tinystr", + "writeable", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_time_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8472be4410d26a03d7208cae3a76c798dd6766e8226ab977cd8b2d349a6dbf08" + +[[package]] +name = "image" +version = "0.25.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7" +dependencies = [ + "bytemuck", + "byteorder-lite", + "moxcms", + "num-traits", + "png 0.18.0", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "imagesize" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" + +[[package]] +name = "indexmap" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +dependencies = [ + "equivalent", + "hashbrown 0.16.0", + "rayon", +] + +[[package]] +name = "indicatif" +version = "0.17.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" +dependencies = [ + "console", + "number_prefix", + "portable-atomic", + "unicode-width 0.2.1", + "web-time", +] + +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "libc", +] + +[[package]] +name = "is_ci" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "ixdtf" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8289f7f711a1a51f80e2e368355d023042ca55d8d554fd5e953f01464c15842d" +dependencies = [ + "displaydoc", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", "thiserror 1.0.69", "walkdir", "windows-sys 0.45.0", @@ -1938,6 +2627,12 @@ dependencies = [ "smallvec", ] +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "libc" version = "0.2.176" @@ -2012,6 +2707,9 @@ name = "litemap" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +dependencies = [ + "serde", +] [[package]] name = "litrs" @@ -2050,6 +2748,16 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" +[[package]] +name = "matrixmultiply" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" +dependencies = [ + "autocfg", + "rawpointer", +] + [[package]] name = "maud" version = "0.27.0" @@ -2148,6 +2856,12 @@ dependencies = [ "pxfm", ] +[[package]] +name = "multi-stash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685a9ac4b61f4e728e1d2c6a7844609c16527aeb5e6c865915c08e619c16410f" + [[package]] name = "naga" version = "24.0.0" @@ -2170,6 +2884,21 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "ndarray" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "portable-atomic", + "portable-atomic-util", + "rawpointer", +] + [[package]] name = "ndk" version = "0.9.0" @@ -2222,6 +2951,45 @@ dependencies = [ "memoffset", ] +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -2672,6 +3440,15 @@ dependencies = [ "libredox", ] +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + [[package]] name = "ordered-float" version = "4.6.0" @@ -2753,16 +3530,31 @@ version = "0.6.0" dependencies = [ "accesskit", "core_maths", + "databake 0.1.8", "fontique", "harfrust", "hashbrown 0.15.5", + "icu", + "icu_codepointtrie_builder", + "icu_collections", + "icu_locale_core", + "icu_normalizer", + "icu_properties", + "icu_provider", + "icu_provider_adapters", + "icu_provider_blob", + "icu_provider_export", + "icu_provider_source", + "icu_segmenter", "linebender_resource_handle", "oxipng", "parley_dev", "peniko", "skrifa 0.37.0", - "swash", "tiny-skia", + "unicode-bidi", + "unicode_data", + "zerovec", ] [[package]] @@ -2783,6 +3575,15 @@ version = "0.0.0" name = "parley_dev" version = "0.0.0" +[[package]] +name = "parse-zoneinfo" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f2a05b18d44e2957b88f96ba460715e295bc1d7510468a2f3d3b44535d26c24" +dependencies = [ + "regex", +] + [[package]] name = "paste" version = "1.0.15" @@ -2914,12 +3715,35 @@ version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + [[package]] name = "potential_utf" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" dependencies = [ + "databake 0.2.0", + "serde", "zerovec", ] @@ -2944,7 +3768,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit", + "toml_edit 0.23.6", ] [[package]] @@ -3071,6 +3895,12 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + [[package]] name = "rayon" version = "1.11.0" @@ -3130,6 +3960,35 @@ dependencies = [ "bitflags 2.9.4", ] +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + [[package]] name = "renderdoc-sys" version = "1.1.0" @@ -3145,6 +4004,20 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + [[package]] name = "roxmltree" version = "0.20.0" @@ -3195,6 +4068,50 @@ dependencies = [ "windows-sys 0.61.1", ] +[[package]] +name = "rustls" +version = "0.23.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "751e04a496ca00bb97a5e043158d23d66b5aabf2e1d5aa2a0aaebb1aafe6f82c" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.22" @@ -3261,6 +4178,12 @@ dependencies = [ "tiny-skia", ] +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + [[package]] name = "serde" version = "1.0.228" @@ -3271,6 +4194,37 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-aux" +version = "4.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "207f67b28fe90fb596503a9bf0bf1ea5e831e21307658e177c5dfcdfc3ab8a0a" +dependencies = [ + "serde", + "serde-value", + "serde_json", +] + +[[package]] +name = "serde-json-core" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b81787e655bd59cecadc91f7b6b8651330b2be6c33246039a65e5cd6f4e0828" +dependencies = [ + "ryu", + "serde", +] + +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float 2.10.1", + "serde", +] + [[package]] name = "serde_core" version = "1.0.228" @@ -3326,6 +4280,15 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3400,6 +4363,9 @@ name = "smallvec" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +dependencies = [ + "serde", +] [[package]] name = "smithay-client-toolkit" @@ -3445,6 +4411,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "spirv" version = "0.3.0+sdk-1.3.268.0" @@ -3472,6 +4444,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +[[package]] +name = "string-interner" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a3275464d7a9f2d4cac57c89c2ef96a8524dba2864c8d6f82e3980baf136f9b" +dependencies = [ + "hashbrown 0.15.5", + "serde", +] + [[package]] name = "strsim" version = "0.11.1" @@ -3500,6 +4482,12 @@ dependencies = [ "syn", ] +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "supports-color" version = "3.0.2" @@ -3521,7 +4509,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47846491253e976bdd07d0f9cc24b7daf24720d11309302ccbbc6e6b6e53550a" dependencies = [ - "core_maths", "skrifa 0.37.0", "yazi", "zeno", @@ -3592,6 +4579,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "tar" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" +dependencies = [ + "filetime", + "libc", +] + [[package]] name = "tempfile" version = "3.23.0" @@ -3709,7 +4706,9 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ + "databake 0.2.0", "displaydoc", + "serde", "zerovec", ] @@ -3741,6 +4740,27 @@ dependencies = [ "syn", ] +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + [[package]] name = "toml_datetime" version = "0.7.2" @@ -3750,6 +4770,19 @@ dependencies = [ "serde_core", ] +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime 0.6.11", + "winnow", +] + [[package]] name = "toml_edit" version = "0.23.6" @@ -3757,7 +4790,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3effe7c0e86fdff4f69cdd2ccc1b96f933e24811c5441d44904e8683e27184b" dependencies = [ "indexmap", - "toml_datetime", + "toml_datetime 0.7.2", "toml_parser", "winnow", ] @@ -3837,6 +4870,18 @@ version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" +[[package]] +name = "twox-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + [[package]] name = "uds_windows" version = "1.1.0" @@ -3868,6 +4913,15 @@ dependencies = [ "winit", ] +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" +dependencies = [ + "smallvec", +] + [[package]] name = "unicode-ident" version = "1.0.19" @@ -3904,6 +4958,81 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "unicode_data" +version = "0.0.0" +dependencies = [ + "databake 0.2.0", + "icu_codepointtrie_builder", + "icu_collections", + "icu_locale", + "icu_normalizer", + "icu_properties", + "icu_provider", + "icu_provider_adapters", + "icu_provider_export", + "icu_provider_source", + "icu_segmenter", + "serde", + "unicode-bidi", + "yoke", + "zerofrom", +] + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "ureq" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99ba1025f18a4a3fc3e9b48c868e9beb4f24f4b4b1a325bada26bd4119f46537" +dependencies = [ + "base64", + "flate2", + "log", + "percent-encoding", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "ureq-proto", + "utf-8", + "webpki-roots", +] + +[[package]] +name = "ureq-proto" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b4531c118335662134346048ddb0e54cc86bd7e81866757873055f0e38f5d2" +dependencies = [ + "base64", + "http", + "httparse", + "log", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -4084,6 +5213,103 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.240.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06d642d8c5ecc083aafe9ceb32809276a304547a3a6eeecceb5d8152598bc71f" +dependencies = [ + "leb128fmt", + "wasmparser 0.240.0", +] + +[[package]] +name = "wasmi" +version = "0.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19af97fcb96045dd1d6b4d23e2b4abdbbe81723dbc5c9f016eb52145b320063" +dependencies = [ + "arrayvec", + "multi-stash", + "smallvec", + "spin", + "wasmi_collections", + "wasmi_core", + "wasmi_ir", + "wasmparser 0.221.3", +] + +[[package]] +name = "wasmi_collections" +version = "0.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e80d6b275b1c922021939d561574bf376613493ae2b61c6963b15db0e8813562" +dependencies = [ + "string-interner", +] + +[[package]] +name = "wasmi_core" +version = "0.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8c51482cc32d31c2c7ff211cd2bedd73c5bd057ba16a2ed0110e7a96097c33" +dependencies = [ + "downcast-rs", + "libm", +] + +[[package]] +name = "wasmi_ir" +version = "0.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e431a14c186db59212a88516788bd68ed51f87aa1e08d1df742522867b5289a" +dependencies = [ + "wasmi_core", +] + +[[package]] +name = "wasmparser" +version = "0.221.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d06bfa36ab3ac2be0dee563380147a5b81ba10dd8885d7fbbc9eb574be67d185" +dependencies = [ + "bitflags 2.9.4", + "indexmap", +] + +[[package]] +name = "wasmparser" +version = "0.240.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b722dcf61e0ea47440b53ff83ccb5df8efec57a69d150e4f24882e4eba7e24a4" +dependencies = [ + "bitflags 2.9.4", + "indexmap", + "semver", +] + +[[package]] +name = "wast" +version = "240.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0efe1c93db4ac562b9733e3dca19ed7fc878dba29aef22245acf84f13da4a19" +dependencies = [ + "bumpalo", + "leb128fmt", + "memchr", + "unicode-width 0.2.1", + "wasm-encoder", +] + +[[package]] +name = "wat" +version = "1.240.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec9b6eab7ecd4d639d78515e9ea491c9bacf494aa5eda10823bd35992cf8c1e" +dependencies = [ + "wast", +] + [[package]] name = "wayland-backend" version = "0.3.11" @@ -4213,6 +5439,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b130c0d2d49f8b6889abc456e795e82525204f27c42cf767cf0d7734e089b8" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "weezl" version = "0.1.10" @@ -4300,7 +5535,7 @@ dependencies = [ "ndk-sys 0.5.0+25.2.9519653", "objc", "once_cell", - "ordered-float", + "ordered-float 4.6.0", "parking_lot", "profiling", "range-alloc", @@ -4921,11 +6156,20 @@ version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + [[package]] name = "writeable" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +dependencies = [ + "either", +] [[package]] name = "wyz" @@ -5151,9 +6395,6 @@ name = "zeno" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" -dependencies = [ - "libm", -] [[package]] name = "zerocopy" @@ -5196,15 +6437,25 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + [[package]] name = "zerotrie" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" dependencies = [ + "databake 0.2.0", "displaydoc", + "litemap", + "serde", "yoke", "zerofrom", + "zerovec", ] [[package]] @@ -5213,6 +6464,8 @@ version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ + "databake 0.2.0", + "serde", "yoke", "zerofrom", "zerovec-derive", @@ -5229,6 +6482,23 @@ dependencies = [ "syn", ] +[[package]] +name = "zip" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabe6324e908f85a1c52063ce7aa26b68dcb7eb6dbc83a2d148403c9bc3eba50" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "displaydoc", + "flate2", + "indexmap", + "memchr", + "thiserror 2.0.17", + "zopfli", +] + [[package]] name = "zopfli" version = "0.8.2" diff --git a/Cargo.toml b/Cargo.toml index 9d3b3e03..eb8bf97e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ members = [ "parley_bench", "parley_core", "parley_dev", + "unicode_data", "examples/tiny_skia_render", "examples/swash_render", "examples/vello_editor", @@ -24,16 +25,36 @@ repository = "https://github.com/linebender/parley" [workspace.dependencies] accesskit = "0.21.0" bytemuck = { version = "1.23.2", default-features = false } +databake = { version = "0.2", features = ["derive"] } fontique = { version = "0.6.0", default-features = false, path = "fontique" } harfrust = { version = "0.3.1", default-features = false } hashbrown = "0.15.5" +icu_codepointtrie_builder = { version = "0.5.0", features = ["wasm"] } +icu_collections = { version = "2.0.0", default-features = false } +icu_locale = { version = "2.0.0", default-features = false } +icu_locale_core = { version = "2.0.0", default-features = false } +icu_normalizer = { version = "2.0.0", default-features = false } +icu_properties = { version = "2.0.0", default-features = false } +icu_provider = { version = "2.0.0", default-features = false, features = ["baked"] } +icu_provider_adapters = { version = "2.0.0", features = ["export"] } +icu_provider_blob = { version = "2.0.0", default-features = false } +icu_provider_export = { version = "2.0.0", default-features = false, features = ["baked_exporter"] } +icu_provider_source = { version = "2.0.0" } +icu_segmenter = { version = "2.0.0", default-features = false } linebender_resource_handle = { version = "0.1.1", default-features = false } parley = { version = "0.6.0", default-features = false, path = "parley" } +unicode_data = { path = "unicode_data" } parley_dev = { default-features = false, path = "parley_dev" } peniko = { version = "0.4.1", default-features = false } skrifa = { version = "0.37.0", default-features = false } +smallvec = "1.15.1" +serde = { version = "1", default-features = false, features = ["derive"] } read-fonts = { version = "0.35.0", default-features = false } swash = { version = "0.2.6", default-features = false } +unicode-bidi = "0.3.18" +yoke = { version = "0.8", features = ["derive"] } +zerofrom = "0.1" +zerovec = "0.11.4" [workspace.lints] rust.unsafe_code = "deny" diff --git a/README.md b/README.md index 9273f597..90db8515 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Parley provides an API for implementing rich text layout. ## The Parley text stack -Parley has four key dependencies: Fontique, HarfRust, Skrifa, and Swash. These crates cover different pieces of the text-rendering process. +Parley has four key dependencies: Fontique, HarfRust, Skrifa, and ICU4X. These crates cover different pieces of the text-rendering process. ### Fontique @@ -45,9 +45,10 @@ It is built on top of the [read-fonts](https://github.com/googlefonts/fontations Skrifa provides higher level metrics on top of read-fonts. Notably it converts the raw glyph representations in font files into scaled, hinted vector paths suitable for rasterisation. -### Swash +### ICU4X -Within the context of Parley, Swash implements [some miscellaneous Unicode-related features](https://github.com/dfrg/swash#text-analysis). +ICU4X enables text analysis and internationalisation. For Parley, this includes locale and language recognition, +bidirectional text evaluation, text segmentation, emoji recognition, NFC/NFD normalisation and other Unicode character information. ### Parley diff --git a/parley/Cargo.toml b/parley/Cargo.toml index e97ab39d..72b5e555 100644 --- a/parley/Cargo.toml +++ b/parley/Cargo.toml @@ -18,21 +18,44 @@ workspace = true [features] default = ["system"] -std = ["fontique/std", "harfrust/std", "peniko/std", "skrifa/std", "swash/std"] -libm = ["fontique/libm", "peniko/libm", "skrifa/libm", "swash/libm", "dep:core_maths"] +std = ["fontique/std", "harfrust/std", "peniko/std", "skrifa/std"] +libm = ["fontique/libm", "peniko/libm", "skrifa/libm", "dep:core_maths"] # Enables support for system font backends system = ["std", "fontique/system"] accesskit = ["dep:accesskit"] [dependencies] -swash = { workspace = true } skrifa = { workspace = true } linebender_resource_handle = { workspace = true } fontique = { workspace = true } core_maths = { version = "0.1.1", optional = true } +unicode_data = { workspace = true } accesskit = { workspace = true, optional = true } hashbrown = { workspace = true } harfrust = { workspace = true } +icu_collections = { workspace = true } +icu_locale_core = { workspace = true } +icu_normalizer = { workspace = true } +icu_properties = { workspace = true, features = ["unicode_bidi"] } +icu_provider = { workspace = true } +icu_provider_blob = { workspace = true } +icu_segmenter = { workspace = true, features = ["auto"] } +unicode-bidi = { workspace = true, features = ["smallvec"] } +# Used in ICU4X baked data sources +zerovec = { workspace = true } + +[build-dependencies] +icu_normalizer = { workspace = true } +icu_properties = { workspace = true } +icu_provider = { workspace = true } +icu = { version = "2" } +databake = { version = "0.1", features = ["derive"] } +icu_provider_export = { version = "2", features = ["baked_exporter", "blob_exporter"] } +icu_provider_source = { workspace = true } +icu_segmenter = { workspace = true } +unicode_data = { workspace = true, features = ["build"] } +icu_codepointtrie_builder = { version = "0.5.0", features = ["wasm"] } +icu_provider_adapters = { version = "2.0.0", features = ["export"] } [dev-dependencies] parley_dev = { workspace = true } diff --git a/parley/build.rs b/parley/build.rs new file mode 100644 index 00000000..3d6d5c50 --- /dev/null +++ b/parley/build.rs @@ -0,0 +1,13 @@ +// Copyright 2025 the Parley Authors +// SPDX-License-Identifier: Apache-2.0 OR MIT + +//! Builds ICU4X data providers for Parley (via `unicode_data`). + +fn main() { + println!("cargo:rerun-if-changed=build.rs"); + println!("cargo:rerun-if-changed=../unicode_data"); + + let out = std::path::PathBuf::from(std::env::var_os("OUT_DIR").unwrap()).join("baked_data"); + + unicode_data::build::bake(out); +} diff --git a/parley/src/analysis/cluster.rs b/parley/src/analysis/cluster.rs new file mode 100644 index 00000000..18068f9d --- /dev/null +++ b/parley/src/analysis/cluster.rs @@ -0,0 +1,421 @@ +// Copyright 2025 the Parley Authors +// SPDX-License-Identifier: Apache-2.0 OR MIT + +use crate::analysis::AnalysisDataSources; + +/// The maximum number of characters in a single cluster. +const MAX_CLUSTER_SIZE: usize = 32; + +#[derive(Debug, Default)] +pub(crate) struct CharCluster { + pub chars: Vec, + pub is_emoji: bool, + pub map_len: u8, + pub start: u32, + pub end: u32, + pub force_normalize: bool, + comp: Form, + decomp: Form, + form: FormKind, + best_ratio: f32, +} + +impl CharCluster { + pub(crate) fn range(&self) -> SourceRange { + SourceRange { + start: self.start, + end: self.end, + } + } +} + +/// Source range of a cluster in code units. +#[derive(Copy, Clone)] +pub(crate) struct SourceRange { + pub start: u32, + pub end: u32, +} + +#[derive(Copy, Clone, Debug)] +pub(crate) struct Char { + /// The character. + pub ch: char, + /// Whether the character + pub is_control_character: bool, + /// True if the character should be considered when mapping glyphs. + pub contributes_to_shaping: bool, + /// Nominal glyph identifier. + pub glyph_id: GlyphId, + /// Indexes into the list of styles for the containing text run, to find the style applicable + /// to this character. + pub style_index: u16, +} + +pub(crate) type GlyphId = u16; + +/// Whitespace content of a cluster. +#[derive(Copy, Clone, PartialOrd, Ord, PartialEq, Eq, Debug)] +#[repr(u8)] +pub(crate) enum Whitespace { + /// Not a space. + None = 0, + /// Standard space. + Space = 1, + /// Non-breaking space (U+00A0). + NoBreakSpace = 2, + /// Horizontal tab. + Tab = 3, + /// Newline (CR, LF, or CRLF). + Newline = 4, +} + +impl Whitespace { + /// Returns true for space or no break space. + pub(crate) fn is_space_or_nbsp(self) -> bool { + matches!(self, Self::Space | Self::NoBreakSpace) + } +} + +/// Iterative status of mapping a character cluster to nominal glyph identifiers. +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +pub(crate) enum Status { + /// Mapping should be skipped. + Discard, + /// The best mapping so far. + Keep, + /// Complete mapping. + Complete, +} + +impl CharCluster { + pub(crate) fn clear(&mut self) { + self.chars.clear(); + self.is_emoji = false; + self.map_len = 0; + self.start = 0; + self.end = 0; + self.force_normalize = false; + self.comp.clear(); + self.decomp.clear(); + self.form = FormKind::Original; + self.best_ratio = 0.; + } + + fn len(&self) -> usize { + self.chars.len() + } + + /// Returns the primary style index for the cluster. + pub(crate) fn style_index(&self) -> u16 { + self.chars[0].style_index + } + + fn decomposed( + &mut self, + analysis_data_sources: &AnalysisDataSources, + scratch_string: &mut String, + ) -> Option<&[Char]> { + match self.decomp.state { + FormState::Invalid => None, + FormState::None => { + self.decomp.state = FormState::Invalid; + + // Create a string from the original characters to normalize + scratch_string.clear(); + for ch in &self.chars[..self.len()] { + scratch_string.push(ch.ch); + } + + // Normalize to NFD (decomposed) form + let nfd_str = analysis_data_sources + .decomposing_normalizer() + .normalize(scratch_string); + + // Copy the characters back to our form structure + let mut i = 0; + for c in nfd_str.chars() { + if i == MAX_CLUSTER_SIZE { + return None; + } + + // Use the first character as a template for other properties + let mut copy = self.chars[0]; + copy.ch = c; + if i >= self.decomp.chars.len() { + self.decomp.chars.push(copy); + } else { + self.decomp.chars[i] = copy; + } + i += 1; + } + + if i == 0 { + return None; + } + + self.decomp.len = i as u8; + self.decomp.state = FormState::Valid; + self.decomp.setup(); + Some(self.decomp.chars()) + } + FormState::Valid => Some(self.decomp.chars()), + } + } + + fn composed( + &mut self, + analysis_data_sources: &AnalysisDataSources, + scratch_string: &mut String, + ) -> Option<&[Char]> { + match self.comp.state { + FormState::Invalid => None, + FormState::None => { + // First, we need decomposed characters + if self + .decomposed(analysis_data_sources, scratch_string) + .map(|chars| chars.len()) + .unwrap_or(0) + == 0 + { + self.comp.state = FormState::Invalid; + return None; + } + + self.comp.state = FormState::Invalid; + + // Create a string from the decomposed characters to normalize + scratch_string.clear(); + for ch in &self.decomp.chars()[..self.decomp.len as usize] { + scratch_string.push(ch.ch); + } + + // Normalize to NFC (composed) form + let nfc_str = analysis_data_sources + .composing_normalizer() + .normalize(scratch_string); + + // Copy the characters back to our form structure + let mut i = 0; + for c in nfc_str.chars() { + if i >= MAX_CLUSTER_SIZE { + self.comp.state = FormState::Invalid; + return None; + } + + // Use the first decomposed character as a template for other properties + let mut ch_copy = self.decomp.chars[0]; + ch_copy.ch = c; + if i >= self.comp.chars.len() { + self.comp.chars.push(ch_copy); + } else { + self.comp.chars[i] = ch_copy; + } + i += 1; + } + + if i == 0 { + return None; + } + + self.comp.len = i as u8; + self.comp.state = FormState::Valid; + self.comp.setup(); + Some(self.comp.chars()) + } + FormState::Valid => Some(self.comp.chars()), + } + } + + pub(crate) fn map( + &mut self, + f: impl Fn(char) -> GlyphId, + analysis_data_sources: &AnalysisDataSources, + scratch_string: &mut String, + ) -> Status { + let len = self.len(); + if len == 0 { + return Status::Complete; + } + let mut glyph_ids = [0_u16; MAX_CLUSTER_SIZE]; + let prev_ratio = self.best_ratio; + let mut ratio; + if self.force_normalize + && self + .composed(analysis_data_sources, scratch_string) + .is_some() + { + ratio = self.comp.map(&f, &mut glyph_ids, self.best_ratio); + if ratio > self.best_ratio { + self.best_ratio = ratio; + self.form = FormKind::NFC; + if ratio >= 1. { + return Status::Complete; + } + } + } + ratio = Mapper { + chars: &mut self.chars[..len], + map_len: self.map_len.max(1), + } + .map(&f, &mut glyph_ids, self.best_ratio); + if ratio > self.best_ratio { + self.best_ratio = ratio; + self.form = FormKind::Original; + if ratio >= 1. { + return Status::Complete; + } + } + if len > 1 + && self + .decomposed(analysis_data_sources, scratch_string) + .is_some() + { + ratio = self.decomp.map(&f, &mut glyph_ids, self.best_ratio); + if ratio > self.best_ratio { + self.best_ratio = ratio; + self.form = FormKind::NFD; + if ratio >= 1. { + return Status::Complete; + } + } + if !self.force_normalize + && self + .composed(analysis_data_sources, scratch_string) + .is_some() + { + ratio = self.comp.map(&f, &mut glyph_ids, self.best_ratio); + if ratio > self.best_ratio { + self.best_ratio = ratio; + self.form = FormKind::NFC; + if ratio >= 1. { + return Status::Complete; + } + } + } + } + if self.best_ratio > prev_ratio { + Status::Keep + } else { + Status::Discard + } + } +} + +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +#[allow(clippy::upper_case_acronyms)] +enum FormKind { + Original, + NFD, + NFC, +} + +impl Default for FormKind { + fn default() -> Self { + Self::Original + } +} + +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +enum FormState { + None, + Valid, + Invalid, +} + +#[derive(Clone, Debug)] +pub(crate) struct Form { + chars: Vec, + len: u8, + map_len: u8, + state: FormState, +} + +impl Default for Form { + fn default() -> Self { + Self::new() + } +} + +impl Form { + fn new() -> Self { + Self { + chars: vec![], + len: 0, + map_len: 0, + state: FormState::None, + } + } + + fn clear(&mut self) { + self.chars.clear(); + self.len = 0; + self.map_len = 0; + self.state = FormState::None; + } + + fn chars(&self) -> &[Char] { + &self.chars[..self.len as usize] + } + + fn setup(&mut self) { + self.map_len = (self + .chars() + .iter() + .filter(|c| !c.is_control_character) + .count() as u8) + .max(1); + } + + fn map( + &mut self, + f: &impl Fn(char) -> u16, + glyphs: &mut [u16; MAX_CLUSTER_SIZE], + best_ratio: f32, + ) -> f32 { + Mapper { + chars: &mut self.chars[..self.len as usize], + map_len: self.map_len, + } + .map(f, glyphs, best_ratio) + } +} + +struct Mapper<'a> { + chars: &'a mut [Char], + map_len: u8, +} + +impl<'a> Mapper<'a> { + fn map( + &mut self, + f: &impl Fn(char) -> u16, + glyphs: &mut [u16; MAX_CLUSTER_SIZE], + best_ratio: f32, + ) -> f32 { + if self.map_len == 0 { + return 1.; + } + let mut mapped = 0; + for (c, g) in self.chars.iter().zip(glyphs.iter_mut()) { + if !c.contributes_to_shaping { + *g = f(c.ch); + if self.map_len == 1 { + mapped += 1; + } + } else { + let gid = f(c.ch); + *g = gid; + if gid != 0 { + mapped += 1; + } + } + } + let ratio = mapped as f32 / self.map_len as f32; + if ratio > best_ratio { + for (ch, glyph) in self.chars.iter_mut().zip(glyphs) { + ch.glyph_id = *glyph; + } + } + ratio + } +} diff --git a/parley/src/analysis/mod.rs b/parley/src/analysis/mod.rs new file mode 100644 index 00000000..db91470d --- /dev/null +++ b/parley/src/analysis/mod.rs @@ -0,0 +1,524 @@ +// Copyright 2025 the Parley Authors +// SPDX-License-Identifier: Apache-2.0 OR MIT + +pub(crate) mod cluster; +mod provider; + +use core::marker::PhantomData; + +use crate::analysis::provider::{COMPOSITE_BLOB, PROVIDER}; +use crate::resolve::RangedStyle; +use crate::{Brush, LayoutContext}; + +use icu_normalizer::{ + ComposingNormalizer, ComposingNormalizerBorrowed, DecomposingNormalizer, + DecomposingNormalizerBorrowed, +}; +use icu_properties::props::{GeneralCategory, GraphemeClusterBreak, Script}; +use icu_properties::{PropertyNamesShort, PropertyNamesShortBorrowed}; +use icu_provider::DataMarker; +use icu_provider::buf::AsDeserializingBufferProvider; +use icu_provider::{DataRequest, DataResponse, DynamicDataProvider}; +use icu_segmenter::options::{LineBreakOptions, LineBreakWordOption, WordBreakOptions}; +use icu_segmenter::{ + GraphemeClusterSegmenter, GraphemeClusterSegmenterBorrowed, LineSegmenter, + LineSegmenterBorrowed, WordSegmenter, WordSegmenterBorrowed, +}; +use unicode_bidi::TextSource; +use unicode_data::{CompositePropsV1, CompositePropsV1Data}; + +pub(crate) struct AnalysisDataSources { + grapheme_segmenter: GraphemeClusterSegmenter, + word_segmenter: WordSegmenter, + line_segmenters: LineSegmenters, + composing_normalizer: ComposingNormalizer, + decomposing_normalizer: DecomposingNormalizer, + script_short_name: PropertyNamesShort