diff --git a/Cargo.lock b/Cargo.lock index d562890..8808249 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -28,9 +28,9 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" @@ -133,9 +133,9 @@ checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytemuck" -version = "1.15.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" dependencies = [ "bytemuck_derive", ] @@ -270,11 +270,11 @@ dependencies = [ [[package]] name = "comemo" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "649d7b2d867b569729c03c0f6968db10bc95921182a1f2b2012b1b549492f39d" +checksum = "3c963350b2b08aa4b725d7802593245380ab53dacfedcaa971385fc33306c0d4" dependencies = [ - "comemo-macros 0.5.0", + "comemo-macros 0.5.1", "parking_lot", "rustc-hash", "siphasher", @@ -294,9 +294,9 @@ dependencies = [ [[package]] name = "comemo-macros" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51c87fc7e85487493ddedae1a3a34b897c77ad8825375b79265a8a162c28d535" +checksum = "a3c400139ba1389ef9e20ad2d87cda68b437a66483aa0da616bdf2cea7413853" dependencies = [ "proc-macro2", "quote", @@ -305,9 +305,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.9.4" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ "core-foundation-sys", "libc", @@ -315,9 +315,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "core_maths" @@ -422,7 +422,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -438,9 +438,9 @@ dependencies = [ [[package]] name = "ecow" -version = "0.2.1" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dba31a30727c42ff5e60468d695c7f21e43a6db2808b7195adcab908fbd9f794" +checksum = "78e4f79b296fbaab6ce2e22d52cb4c7f010fe0ebe7a32e34fa25885fd797bd02" dependencies = [ "serde", ] @@ -495,19 +495,19 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.8" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "euclid" -version = "0.22.11" +version = "0.22.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" +checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" dependencies = [ "num-traits", ] @@ -603,6 +603,15 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "font-types" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b38ad915f6dadd993ced50848a8291a543bd41ca62bc10740d5e64e2ab4cfd7" +dependencies = [ + "bytemuck", +] + [[package]] name = "fontconfig-parser" version = "0.5.6" @@ -661,11 +670,22 @@ dependencies = [ "wasi", ] +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi", +] + [[package]] name = "gif" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" dependencies = [ "color_quant", "weezl", @@ -673,9 +693,9 @@ dependencies = [ [[package]] name = "gif" -version = "0.14.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f954a9e9159ec994f73a30a12b96a702dde78f5547bcb561174597924f7d4162" +checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" dependencies = [ "color_quant", "weezl", @@ -699,9 +719,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "hayagriva" @@ -761,9 +781,9 @@ dependencies = [ "phf", "rustc-hash", "siphasher", - "skrifa", + "skrifa 0.37.0", "smallvec", - "yoke 0.8.1", + "yoke 0.8.3", ] [[package]] @@ -985,13 +1005,13 @@ dependencies = [ "bytemuck", "byteorder-lite", "color_quant", - "gif 0.14.0", + "gif 0.14.2", "image-webp", "moxcms", "num-traits", - "png 0.18.0", + "png 0.18.1", "zune-core 0.5.0", - "zune-jpeg 0.5.5", + "zune-jpeg 0.5.8", ] [[package]] @@ -1018,13 +1038,14 @@ checksum = "09e54e57b4c48b40f7aec75635392b12b3421fa26fe8b4332e63138ed278459c" [[package]] name = "indexmap" -version = "2.2.5" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", "hashbrown", "serde", + "serde_core", ] [[package]] @@ -1050,19 +1071,20 @@ dependencies = [ [[package]] name = "krilla" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "199be5f63da6e19b71051fd5276258a8e55449ac48e2e7492c68238f38ca9f3b" +checksum = "a0ddfec86fec13d068075e14f22a7e217c281f3ed69ddcb427bf3f5d504fd674" dependencies = [ "base64 0.22.1", "bumpalo", - "comemo 0.5.0", + "comemo 0.5.1", "flate2", "float-cmp 0.10.0", - "gif 0.13.1", + "gif 0.13.3", "hayro-write", "image-webp", "imagesize 0.14.0", + "indexmap", "once_cell", "pdf-writer", "png 0.17.16", @@ -1070,20 +1092,20 @@ dependencies = [ "rustc-hash", "rustybuzz", "siphasher", - "skrifa", + "skrifa 0.37.0", "smallvec", "subsetter", "tiny-skia-path", "xmp-writer", - "yoke 0.8.1", - "zune-jpeg 0.4.21", + "yoke 0.8.3", + "zune-jpeg 0.5.8", ] [[package]] name = "krilla-svg" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d3eec075c9507dfdbfb4b9bc3b2aeac074ed422b61bcfd93517616d6b3d19c3" +checksum = "f485e1a850201a01dcd8d73e7cf09f2cd4c4cc85c2cd296359094d49336d8ef7" dependencies = [ "flate2", "fontdb", @@ -1117,10 +1139,16 @@ dependencies = [ ] [[package]] -name = "lazy_static" -version = "1.4.0" +name = "kurbo" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "4b60dfc32f652b926df6192e55525b16d186c69d47876c3ead4da5cc9f8450e2" +dependencies = [ + "arrayvec", + "euclid", + "polycool", + "smallvec", +] [[package]] name = "libc" @@ -1136,11 +1164,10 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.10" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" dependencies = [ - "bitflags 2.10.0", "libc", ] @@ -1174,6 +1201,12 @@ version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + [[package]] name = "lipsum" version = "0.9.1" @@ -1205,15 +1238,15 @@ dependencies = [ [[package]] name = "log" -version = "0.4.28" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "memchr" -version = "2.7.1" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "memmap2" @@ -1292,11 +1325,10 @@ checksum = "16cf681a23b4d0a43fc35024c176437f9dcd818db34e0f42ab456a0ee5ad497b" [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -1351,15 +1383,14 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.75" +version = "0.10.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" dependencies = [ "bitflags 2.10.0", "cfg-if", "foreign-types", "libc", - "once_cell", "openssl-macros", "openssl-sys", ] @@ -1377,15 +1408,15 @@ dependencies = [ [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-sys" -version = "0.9.111" +version = "0.9.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" dependencies = [ "cc", "libc", @@ -1465,9 +1496,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "phf" @@ -1518,6 +1549,15 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" +[[package]] +name = "pixglyph" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47945e80a49d08350e4a007ac4294c6498d23956c18ea5e6ff480dc93d31643c" +dependencies = [ + "ttf-parser", +] + [[package]] name = "pkg-config" version = "0.3.30" @@ -1553,9 +1593,9 @@ dependencies = [ [[package]] name = "png" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ "bitflags 2.10.0", "crc32fast", @@ -1564,6 +1604,15 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "polycool" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50596ddc09eb5ad5f75cacd40209568e66df71baf86e1499a0e99c4cff12a5a6" +dependencies = [ + "arrayvec", +] + [[package]] name = "portable-atomic" version = "1.6.0" @@ -1659,13 +1708,19 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.35" +version = "1.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "rand" version = "0.8.5" @@ -1718,7 +1773,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6717cf23b488adf64b9d711329542ba34de147df262370221940dfabc2c91358" dependencies = [ "bytemuck", - "font-types", + "font-types 0.10.1", +] + +[[package]] +name = "read-fonts" +version = "0.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4ed38b89c2c77ff968c524145ad65fb010f38af5c7a224b53b81d47ac2daa81" +dependencies = [ + "bytemuck", + "font-types 0.11.3", ] [[package]] @@ -1736,7 +1801,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ - "getrandom", + "getrandom 0.2.12", "libredox", "thiserror", ] @@ -1776,7 +1841,7 @@ version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" dependencies = [ - "gif 0.13.1", + "gif 0.13.3", "image-webp", "log", "pico-args", @@ -1804,7 +1869,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.12", "libc", "untrusted", "windows-sys 0.52.0", @@ -1853,10 +1918,23 @@ dependencies = [ "bitflags 2.10.0", "errno", "libc", - "linux-raw-sys", + "linux-raw-sys 0.4.13", "windows-sys 0.52.0", ] +[[package]] +name = "rustix" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +dependencies = [ + "bitflags 2.10.0", + "errno", + "libc", + "linux-raw-sys 0.11.0", + "windows-sys 0.59.0", +] + [[package]] name = "rustls" version = "0.22.4" @@ -1938,11 +2016,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -1953,11 +2031,11 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.9.2" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "d17b898a6d6948c3a8ee4372c17cb384f90d2e6e912ef00895b14fd7ab54ec38" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.10.0", "core-foundation", "core-foundation-sys", "libc", @@ -1966,9 +2044,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", @@ -2071,7 +2149,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c31071dedf532758ecf3fed987cdb4bd9509f900e026ab684b4ecb81ea49841" dependencies = [ "bytemuck", - "read-fonts", + "read-fonts 0.35.0", +] + +[[package]] +name = "skrifa" +version = "0.42.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c34617370ae968efb7161bb2beb517d9084659aae19e24b89e3db25b46e4564" +dependencies = [ + "bytemuck", + "read-fonts 0.39.2", ] [[package]] @@ -2152,13 +2240,13 @@ dependencies = [ [[package]] name = "subsetter" -version = "0.2.3" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6895a12ac5599bb6057362f00e8a3cf1daab4df33f553a55690a44e4fed8d0" +checksum = "38803281d1c23166c5ebcb455439a5d2afe711cc909cf88af72448c297756ad6" dependencies = [ - "kurbo 0.12.0", + "kurbo 0.13.1", "rustc-hash", - "skrifa", + "skrifa 0.42.1", "write-fonts", ] @@ -2234,14 +2322,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.10.1" +version = "3.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" dependencies = [ - "cfg-if", "fastrand", - "rustix", - "windows-sys 0.52.0", + "getrandom 0.4.3", + "once_cell", + "rustix 1.1.3", + "windows-sys 0.59.0", ] [[package]] @@ -2255,24 +2344,24 @@ dependencies = [ [[package]] name = "thin-vec" -version = "0.2.14" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d" +checksum = "b0f7e269b48f0a7dd0146680fa24b50cc67fc0373f086a5b2f99bd084639b482" [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", @@ -2349,13 +2438,13 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "serde_core", - "zerovec 0.11.5", + "zerovec 0.11.6", ] [[package]] @@ -2439,7 +2528,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d9198018d9acb075f27abe70036e6e24302156c37f0142ea18b5e813ecb8172" dependencies = [ - "comemo 0.5.0", + "comemo 0.5.1", "ecow", "rustc-hash", "typst-eval", @@ -2463,17 +2552,20 @@ dependencies = [ "time", "ttf-parser", "typst", + "typst-html", "typst-kit", "typst-pdf", + "typst-render", + "typst-svg", "ureq", "zune-inflate", ] [[package]] name = "typst-assets" -version = "0.14.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712f5e2c4134bcf22f292086aa515caff00a21d54c8b30c77c4fc1227442a89a" +checksum = "5613cb719a6222fe9b74027c3625d107767ec187bff26b8fc931cf58942c834f" [[package]] name = "typst-eval" @@ -2481,7 +2573,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bb8965a12371f0ff325dedac06d14fa9dd0d4fa0588034bc99802da7af9362f" dependencies = [ - "comemo 0.5.0", + "comemo 0.5.1", "ecow", "indexmap", "rustc-hash", @@ -2502,7 +2594,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67d6858f22690a9d105ff2ea1ea38dbf345e1610e30f947d7c3f79da27e1dd0b" dependencies = [ "bumpalo", - "comemo 0.5.0", + "comemo 0.5.1", "ecow", "palette", "rustc-hash", @@ -2518,9 +2610,9 @@ dependencies = [ [[package]] name = "typst-kit" -version = "0.14.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3375f6680386b90a965f0c496c947fd755484b33eba4332e88192470c72eec" +checksum = "31476ec753e080ffdd543a0e74b6d319355449ff3eca3f216634f31cfd09a92a" dependencies = [ "dirs", "ecow", @@ -2551,7 +2643,7 @@ dependencies = [ "az", "bumpalo", "codex", - "comemo 0.5.0", + "comemo 0.5.1", "ecow", "either", "hypher", @@ -2580,9 +2672,9 @@ dependencies = [ [[package]] name = "typst-library" -version = "0.14.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be5a858259c340407d93a5af74cad534d92548cfb702f7c8b0ef891e1d9d0d84" +checksum = "e276a5de53020c43efe2111ec236252e54ea4480b5ac18063e663dfbe03d9d1b" dependencies = [ "az", "bitflags 2.10.0", @@ -2590,7 +2682,7 @@ dependencies = [ "chinese-number", "ciborium", "codex", - "comemo 0.5.0", + "comemo 0.5.1", "csv", "ecow", "flate2", @@ -2655,9 +2747,9 @@ dependencies = [ [[package]] name = "typst-macros" -version = "0.14.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "207b71ed20ec736c13be07a44443417406c12f0868a6e4c40d67c32c03a599ec" +checksum = "141cbd1027129fbf6bda1013f52a264df7befc7388cc8f47767d65e803fd3a59" dependencies = [ "heck", "proc-macro2", @@ -2667,13 +2759,13 @@ dependencies = [ [[package]] name = "typst-pdf" -version = "0.14.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99160d071220909c1993d7530abe94c0bceffd6e10be7bb629eae2f73d596f26" +checksum = "37c8a4630754767cd10d48e8b8186e7dc784631a30a3a93521edf7d77aebd0c0" dependencies = [ "az", "bytemuck", - "comemo 0.5.0", + "comemo 0.5.1", "ecow", "image", "indexmap", @@ -2699,7 +2791,7 @@ checksum = "a2725822b4c5a1a9d7aa46708f7a996a4cb1b15470f077c7ba3e788fb95e495d" dependencies = [ "arrayvec", "bumpalo", - "comemo 0.5.0", + "comemo 0.5.1", "ecow", "regex", "typst-library", @@ -2709,6 +2801,26 @@ dependencies = [ "typst-utils", ] +[[package]] +name = "typst-render" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1baabef8c01dd7150380592811bf37af9b2498be86043834ddd629d1bcb48ccb" +dependencies = [ + "bytemuck", + "comemo 0.5.1", + "hayro", + "image", + "pixglyph", + "resvg", + "tiny-skia", + "ttf-parser", + "typst-assets", + "typst-library", + "typst-macros", + "typst-timing", +] + [[package]] name = "typst-svg" version = "0.14.0" @@ -2716,7 +2828,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b53718b9b8f4b4e2454600084eca155530ce9d30cb62fed0799671b8044e40fc" dependencies = [ "base64 0.22.1", - "comemo 0.5.0", + "comemo 0.5.1", "ecow", "flate2", "hayro", @@ -2735,9 +2847,9 @@ dependencies = [ [[package]] name = "typst-syntax" -version = "0.14.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fbfb35d79f3601057518ab5f2e3f6040b51dc098310245eee35d43b2d17fabc" +checksum = "a95d9192060e23b1e491b0b94dff676acddc92a4d672aeb8ca3890a5a734e879" dependencies = [ "ecow", "rustc-hash", @@ -2754,9 +2866,9 @@ dependencies = [ [[package]] name = "typst-timing" -version = "0.14.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f1db8164cb04d48fce0190d4a0f2fd14f3d967a456facb5dd590ba2d4158c08" +checksum = "7be94f8faf19841b49574ef5c7fd7a12e2deb7c3d8deba5a596f35d2222024cd" dependencies = [ "parking_lot", "serde", @@ -2765,9 +2877,9 @@ dependencies = [ [[package]] name = "typst-utils" -version = "0.14.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c268017d7102a752be28ea74792eedc40a35fa13a61e34b97a67de559dc4eb88" +checksum = "a3966c92e8fa48c7ce898130d07000d985f18206d92b250f0f939287fbccdee3" dependencies = [ "once_cell", "portable-atomic", @@ -2795,7 +2907,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dce1bf08044d4b7a94028c93786f8566047edc11110595914de93362559bc658" dependencies = [ "serde", - "tinystr 0.8.2", + "tinystr 0.8.3", ] [[package]] @@ -2805,7 +2917,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5957eb82e346d7add14182a3315a7e298f04e1ba4baac36f7f0dbfedba5fc25" dependencies = [ "proc-macro-hack", - "tinystr 0.8.2", + "tinystr 0.8.3", "unic-langid-impl", "unic-langid-macros-impl", ] @@ -3004,9 +3116,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasmi" -version = "0.51.1" +version = "0.51.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4f6b71d5cb04a4615b9a8a2e522ba284c491ad847afd9e905d89be15e3efc0" +checksum = "bb321403ce594274827657a908e13d1d9918aa02257b8bf8391949d9764023ff" dependencies = [ "spin", "wasmi_collections", @@ -3017,24 +3129,24 @@ dependencies = [ [[package]] name = "wasmi_collections" -version = "0.51.1" +version = "0.51.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a4a11fa090c4d742e5a77dbbc8efbbe1aa151db7335ca6850232e6cafbb1023" +checksum = "e9b8e98e45a2a534489f8225e765cbf1cb9a3078072605e58158910cf4749172" [[package]] name = "wasmi_core" -version = "0.51.1" +version = "0.51.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3e422fc1f4df78c9ded6ed48c4ca6d1f55f4609f04c99962fc07532e4db61d" +checksum = "c25f375c0cdf14810eab07f532f61f14d4966f09c747a55067fdf3196e8512e6" dependencies = [ "libm", ] [[package]] name = "wasmi_ir" -version = "0.51.1" +version = "0.51.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13fe9f9f1747ec81644e764c4dc798f063f5d54a495f0a3b4a375bce9af65399" +checksum = "624e2a68a4293ecb8f564260b68394b29cf3b3edba6bce35532889a2cb33c3d9" dependencies = [ "wasmi_core", ] @@ -3268,15 +3380,15 @@ dependencies = [ [[package]] name = "write-fonts" -version = "0.43.0" +version = "0.48.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "886614b5ce857341226aa091f3c285e450683894acaaa7887f366c361efef79d" +checksum = "cb731d4c4d93eacc69a1ad2f270f905788a98e4a3438267bcafbe08d3431c8d8" dependencies = [ - "font-types", + "font-types 0.11.3", "indexmap", - "kurbo 0.12.0", + "kurbo 0.13.1", "log", - "read-fonts", + "read-fonts 0.39.2", ] [[package]] @@ -3292,8 +3404,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", - "linux-raw-sys", - "rustix", + "linux-raw-sys 0.4.13", + "rustix 0.38.31", ] [[package]] @@ -3310,9 +3422,9 @@ checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" [[package]] name = "xmp-writer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce9e2f4a404d9ebffc0a9832cf4f50907220ba3d7fffa9099261a5cab52f2dd7" +checksum = "9440ea3e5aeabb0ac63af70daf835274065238cdd0cec83418f417eae38bacee" [[package]] name = "yaml-rust" @@ -3337,12 +3449,12 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", - "yoke-derive 0.8.1", + "yoke-derive 0.8.2", "zerofrom", ] @@ -3360,9 +3472,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -3372,18 +3484,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.3" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "655b0814c5c0b19ade497851070c640773304939a6c0fd5f5fb43da0696d05b7" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.3" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6a647510471d372f2e6c2e6b7219e44d8c574d24fdc11c610a61455782f18c3" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -3423,9 +3535,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "serde", "zerofrom", @@ -3480,9 +3592,9 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.5.5" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6fb7703e32e9a07fb3f757360338b3a567a5054f21b5f52a666752e333d58e" +checksum = "e35aee689668bf9bd6f6f3a6c60bb29ba1244b3b43adfd50edd554a371da37d5" dependencies = [ "zune-core 0.5.0", ] diff --git a/src/lib.rs b/src/lib.rs index 6613536..febbb74 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,8 @@ use mlua::prelude::*; +use std::fs; +use std::path::Path; use typst::foundations::{Array, Dict, Str, Value as TypstValue}; -use typst_as_library; +use typst_as_library::OutputFormat; // ------------------------------------- // TRAIT: FromLuaTypst @@ -118,30 +120,98 @@ impl FromLuaTypst for LuaTable { // Compile function exposed to Lua // ------------------------------------- -fn compile( - lua: &Lua, - (input, data): (LuaString, LuaValue), -) -> LuaResult<(Option, Option)> { - let input_text = input.to_str()?.to_string(); - - let typst_value_opt = match data { - LuaValue::Table(_) => { - // Only now do we attempt conversion - match data.to_typst(lua) { - Ok(val) => Some(val), - Err(e) => { - let err_msg = lua.create_string(&format!( - "typst-lua: error converting lua table to typst value: {e}" - ))?; - return Ok((None, Some(err_msg))); - } +fn compile(lua: &Lua, args: LuaTable) -> LuaResult<(Option, Option)> { + let file: String = match args.get::("file")? { + LuaValue::Nil => "".to_string(), + LuaValue::String(s) => s.to_str()?.to_string(), + other => { + let err = lua.create_string(&format!( + "typst-lua: 'file' must be a string, got {other:?}" + ))?; + return Ok((None, Some(err))); + } + }; + let root: String = match args.get::("file")? { + LuaValue::Nil => Path::new(&file) + .parent() + .unwrap_or(Path::new(".")) + .to_string_lossy() + .into_owned(), + LuaValue::String(s) => s.to_str()?.to_string(), + other => { + let err = lua.create_string(&format!( + "typst-lua: 'root' must be a string, got {other:?}" + ))?; + return Ok((None, Some(err))); + } + }; + let source: String = match args.get::("source")? { + LuaValue::Nil => fs::read_to_string(&file).map_err(|err| { + mlua::Error::external(format!("failed to read source file `{file}`: {err}")) + })?, + LuaValue::String(s) => s.to_str()?.to_string(), + other => { + let err = lua.create_string(&format!( + "typst-lua: 'source' must be a string, got {other:?}" + ))?; + return Ok((None, Some(err))); + } + }; + let format_str: String = match args.get::("format")? { + LuaValue::Nil => "pdf".to_string(), + LuaValue::String(s) => s.to_str()?.to_lowercase(), + other => { + let err = lua.create_string(&format!( + "typst-lua: 'format' must be a string or nil, got {other:?}" + ))?; + return Ok((None, Some(err))); + } + }; + let ppi: f32 = match args.get::("ppi")? { + LuaValue::Nil => 144.0, + LuaValue::Number(n) => n as f32, + LuaValue::Integer(n) => n as f32, + other => { + let err = lua.create_string(&format!( + "typst-lua: 'ppi' must be a number or nil, got {other:?}" + ))?; + return Ok((None, Some(err))); + } + }; + let data = match args.get::("input")? { + LuaValue::Nil => None, + LuaValue::Table(input) => match input.to_typst(lua) { + Ok(val) => Some(val), + Err(e) => { + let err_msg = lua.create_string(&format!( + "typst-lua: error converting 'input' to typst value: {e}" + ))?; + return Ok((None, Some(err_msg))); } + }, + other => { + let err = lua.create_string(&format!( + "typst-lua: 'input' must be a table or nil, got {other:?}" + ))?; + return Ok((None, Some(err))); + } + }; + + let output_format = match format_str.as_str() { + "pdf" => OutputFormat::Pdf, + "html" => OutputFormat::Html, + "svg" => OutputFormat::Svg, + "png" => OutputFormat::Png { ppi }, + other => { + let err = lua.create_string(&format!( + "typst-lua: unsupported format '{other}'; expected 'pdf', 'html', 'svg', or 'png'" + ))?; + return Ok((None, Some(err))); } - _ => None, }; // Call typst compiler - let pdf_bytes = match typst_as_library::compile(&input_text, &typst_value_opt) { + let pdf_bytes = match typst_as_library::compile(&file, &root, &source, &data, output_format) { Ok(bytes) => bytes, Err(e) => { let err_msg = lua.create_string(&format!("typst: {e}"))?; diff --git a/typst-as-library/Cargo.toml b/typst-as-library/Cargo.toml index 4497172..72d3b4a 100644 --- a/typst-as-library/Cargo.toml +++ b/typst-as-library/Cargo.toml @@ -22,7 +22,10 @@ ureq = "2.9" time = "0.3" ttf-parser = "0.25" typst-kit = { version = "0.14", features = ["embed-fonts"] } +typst-html = "0.14" typst-pdf = "0.14" +typst-svg = "0.14" +typst-render = "0.14" codespan-reporting = "0.11" [lib] diff --git a/typst-as-library/src/lib.rs b/typst-as-library/src/lib.rs index 9ab4f42..4ca09dd 100644 --- a/typst-as-library/src/lib.rs +++ b/typst-as-library/src/lib.rs @@ -3,15 +3,14 @@ // Original work Copyright 2026 tfachmann (Timo Bachmann) // Licensed under the Apache License, Version 2.0 use std::collections::HashMap; -use std::fs; use std::path::{Path, PathBuf}; use std::sync::{Arc, Mutex}; use typst::diag::Tracepoint; use codespan_reporting::diagnostic::{Diagnostic, Label}; use codespan_reporting::files::{Error as CodespanError, Files}; +use codespan_reporting::term; use codespan_reporting::term::termcolor::Buffer; -use codespan_reporting::term::{self}; use typst::diag::{ eco_format, FileError, FileResult, PackageError, PackageResult, Severity, SourceDiagnostic, Warned, @@ -28,6 +27,13 @@ use typst::WorldExt; use typst_kit::fonts::{FontSearcher, FontSlot}; use typst_pdf::PdfOptions; +pub enum OutputFormat { + Pdf, + Html, + Svg, + Png { ppi: f32 }, +} + type CodespanResult = Result; /// Main interface that determines the environment for Typst. @@ -65,7 +71,8 @@ impl TypstWrapperWorld { let root = PathBuf::from(root); let fonts = FontSearcher::new().include_system_fonts(true).search(); let lib = { - let builder = Library::builder(); + let builder = Library::builder() + .with_features(typst::Features::from_iter([typst::Feature::Html])); let builder = if let Some(d) = data { let dict: Dict = d.clone().cast::().unwrap(); builder.with_inputs(dict) @@ -265,24 +272,72 @@ fn retry(mut f: impl FnMut() -> Result) -> Result { } } -pub fn compile(input: &str, data: &Option) -> Result, String> { - let input_path = Path::new(input); - let root = input_path.parent().unwrap_or(Path::new(".")); - let content = fs::read_to_string(input) - .map_err(|err| format!("failed to read source file `{input}`: {err}"))?; - let spath = root.to_string_lossy().into_owned(); +pub fn compile( + file: &str, + root: &str, + source: &str, + data: &Option, + output_format: OutputFormat, +) -> Result, String> { + let input_path = Path::new(file); let source_filename = input_path .file_name() .and_then(|n| n.to_str()) - .ok_or_else(|| format!("invalid input path: {input}"))?; - - let world = TypstWrapperWorld::new(spath, content, source_filename.to_string(), data.clone()); - let Warned { output, warnings } = typst::compile(&world); - - match output { - Ok(document) => typst_pdf::pdf(&document, &PdfOptions::default()) - .map_err(|errors| render_diagnostics(&world, &errors, &warnings)), - Err(errors) => Err(render_diagnostics(&world, &errors, &warnings)), + .ok_or_else(|| format!("invalid input path: {file}"))?; + + let world = TypstWrapperWorld::new( + root.to_string(), + source.to_string(), + source_filename.to_string(), + data.clone(), + ); + match output_format { + OutputFormat::Pdf => { + let Warned { output, warnings } = + typst::compile::(&world); + match output { + Ok(document) => typst_pdf::pdf(&document, &PdfOptions::default()) + .map_err(|errors| render_diagnostics(&world, &errors, &warnings)), + Err(errors) => Err(render_diagnostics(&world, &errors, &warnings)), + } + } + OutputFormat::Html => { + let Warned { output, warnings } = typst::compile::(&world); + match output { + Ok(document) => typst_html::html(&document) + .map(|s| s.into_bytes()) + .map_err(|errors| render_diagnostics(&world, &errors, &warnings)), + Err(errors) => Err(render_diagnostics(&world, &errors, &warnings)), + } + } + OutputFormat::Svg => { + let Warned { output, warnings } = + typst::compile::(&world); + match output { + Ok(document) => { + if document.pages.is_empty() { + return Err("document has no pages".to_string()); + } + Ok(typst_svg::svg(&document.pages[0]).into_bytes()) + } + Err(errors) => Err(render_diagnostics(&world, &errors, &warnings)), + } + } + OutputFormat::Png { ppi } => { + let Warned { output, warnings } = + typst::compile::(&world); + match output { + Ok(document) => { + if document.pages.is_empty() { + return Err("document has no pages".to_string()); + } + let pixel_per_pt = ppi / 72.0; + let pixmap = typst_render::render(&document.pages[0], pixel_per_pt); + pixmap.encode_png().map_err(|e| e.to_string()) + } + Err(errors) => Err(render_diagnostics(&world, &errors, &warnings)), + } + } } }