From b67ab3264ebb00e0a2eff75dc9f9865d3e2b912b Mon Sep 17 00:00:00 2001 From: akagiyuu Date: Thu, 7 May 2026 16:21:21 +0700 Subject: [PATCH 1/5] doc: add LICENSE --- LICENSE | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5820abf --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2026 akagiyuu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From f155e2c29eebf61b948b5dfad95ff89387b86c61 Mon Sep 17 00:00:00 2001 From: akagiyuu Date: Thu, 7 May 2026 16:45:34 +0700 Subject: [PATCH 2/5] fix: remove unwrap --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 76be417..0eaf570 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,7 +19,7 @@ pub async fn render(html: &str, width: u32, height: u32) -> chromiumoxide::error .await?; tokio::spawn(async move { loop { - let _ = handler.next().await.unwrap(); + let _ = handler.next().await; } }); From b89b43daf896b611d48d569e3bc9f590abc0c543 Mon Sep 17 00:00:00 2001 From: akagiyuu Date: Thu, 7 May 2026 16:45:43 +0700 Subject: [PATCH 3/5] feat: add basic example --- examples/basic.rs | 67 ++++++++++++++++++++++++++++++++++++++++++ examples/expected.png | Bin 0 -> 10395 bytes 2 files changed, 67 insertions(+) create mode 100644 examples/basic.rs create mode 100644 examples/expected.png diff --git a/examples/basic.rs b/examples/basic.rs new file mode 100644 index 0000000..65d7788 --- /dev/null +++ b/examples/basic.rs @@ -0,0 +1,67 @@ +const HTML: &str = r#" +
+
+
+ +"#; +const EXPECTED: &[u8] = include_bytes!("expected.png"); + +#[tokio::main] +pub async fn main() { + let expected = image::load_from_memory(EXPECTED).unwrap(); + let rendered = html_renderer::render(HTML, expected.width(), expected.height()) + .await + .unwrap(); + let rendered = image::load_from_memory(&rendered).unwrap(); + + let score = image_compare::rgba_hybrid_compare(&expected.into_rgba8(), &rendered.into_rgba8()) + .unwrap() + .score; + println!("Score: {score}"); +} diff --git a/examples/expected.png b/examples/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..59bb14afdc516ae54fbac23551047927aa00adc1 GIT binary patch literal 10395 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 Date: Thu, 7 May 2026 16:46:17 +0700 Subject: [PATCH 4/5] doc: add README --- README.md | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..5f4008a --- /dev/null +++ b/README.md @@ -0,0 +1,74 @@ +# HTML Renderer + +HTML renderer project written in Rust. + +## Usage +```rust +const HTML: &str = r#" +
+
+
+ +"#; +const EXPECTED: &[u8] = include_bytes!("expected.png"); + +#[tokio::main] +pub async fn main() { + let expected = image::load_from_memory(EXPECTED).unwrap(); + let rendered = html_renderer::render(HTML, expected.width(), expected.height()) + .await + .unwrap(); + let rendered = image::load_from_memory(&rendered).unwrap(); + + let score = image_compare::rgba_hybrid_compare(&expected.into_rgba8(), &rendered.into_rgba8()) + .unwrap() + .score; + println!("Score: {score}"); +} +``` From 701e293ab4f34c30bd8fbb58f9267840295b2ec3 Mon Sep 17 00:00:00 2001 From: akagiyuu Date: Thu, 7 May 2026 16:48:40 +0700 Subject: [PATCH 5/5] doc: update crate metadata --- Cargo.lock | 2 +- Cargo.toml | 9 ++++++++- README.md | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e28f29f..752e85f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -655,7 +655,7 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "html-renderer" -version = "0.1.0" +version = "1.0.0" dependencies = [ "chromiumoxide", "futures", diff --git a/Cargo.toml b/Cargo.toml index 82751b9..492c801 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,14 @@ [package] name = "html-renderer" -version = "0.1.0" +version = "1.0.0" edition = "2024" +license = "MIT" +readme = "README.md" +repository = "https://github.com/f-code-club/html-renderer" +homepage = "https://github.com/f-code-club/html-renderer" +description = """ +HTML renderer project written in Rust +""" [dependencies] chromiumoxide = "0.9.1" diff --git a/README.md b/README.md index 5f4008a..d50caf2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # HTML Renderer -HTML renderer project written in Rust. +HTML renderer project written in Rust ## Usage ```rust