├── .github └── workflows │ └── ci.yml ├── .gitignore ├── CONTRIBUTING.MD ├── Cargo.lock ├── Cargo.toml ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md ├── apps └── readme │ ├── Cargo.toml │ ├── assets │ ├── blitz-markdown-overrides.css │ └── github-markdown.css │ └── src │ ├── main.rs │ ├── markdown.rs │ └── readme_application.rs ├── examples ├── assets │ ├── border.html │ ├── bottom_only.html │ ├── docsrs_header.html │ ├── github_profile_reduced.html │ ├── github_profile_reduced2.html │ ├── github_profile_reduced3.html │ ├── google.html │ ├── google_reduced.html │ ├── gosub.html │ ├── gosub_reduced.html │ ├── input.html │ ├── noscript.html │ ├── object_fit.html │ ├── pseudo.html │ ├── servo-color-negative-no-container.png │ ├── servo.css │ ├── servo.html │ ├── servo_header_reduced.html │ ├── servo_reduced.html │ ├── square.png │ ├── svg.html │ ├── tall.png │ ├── todomvc.css │ └── wide.png ├── box_shadow.rs ├── counter │ ├── Cargo.toml │ └── src │ │ └── main.rs ├── flex.rs ├── form.rs ├── gradient.rs ├── html.rs ├── inline.rs ├── outline.rs ├── output │ └── .gitkeep ├── restyle.rs ├── screenshot.rs ├── todomvc.rs └── url.rs ├── justfile ├── packages ├── anyrender │ ├── Cargo.toml │ └── src │ │ ├── lib.rs │ │ └── wasm_send_sync.rs ├── anyrender_svg │ ├── Cargo.toml │ └── src │ │ ├── error.rs │ │ ├── lib.rs │ │ ├── render.rs │ │ └── util.rs ├── anyrender_vello │ ├── Cargo.toml │ └── src │ │ ├── image_renderer.rs │ │ ├── lib.rs │ │ ├── scene.rs │ │ └── window_renderer.rs ├── anyrender_vello_cpu │ ├── Cargo.toml │ └── src │ │ ├── image_renderer.rs │ │ ├── lib.rs │ │ ├── scene.rs │ │ └── window_renderer.rs ├── blitz-dom │ ├── Cargo.toml │ ├── assets │ │ ├── default.css │ │ └── moz-bullet-font.otf │ └── src │ │ ├── accessibility.rs │ │ ├── debug.rs │ │ ├── document.rs │ │ ├── events │ │ ├── driver.rs │ │ ├── ime.rs │ │ ├── keyboard.rs │ │ ├── mod.rs │ │ └── mouse.rs │ │ ├── form.rs │ │ ├── layout │ │ ├── construct.rs │ │ ├── inline.rs │ │ ├── mod.rs │ │ ├── replaced.rs │ │ └── table.rs │ │ ├── lib.rs │ │ ├── mutator.rs │ │ ├── net.rs │ │ ├── node.rs │ │ ├── query_selector.rs │ │ ├── stylo.rs │ │ ├── stylo_to_cursor_icon.rs │ │ ├── stylo_to_parley.rs │ │ ├── traversal.rs │ │ └── util.rs ├── blitz-html │ ├── Cargo.toml │ └── src │ │ ├── html_document.rs │ │ ├── html_sink.rs │ │ └── lib.rs ├── blitz-net │ ├── Cargo.toml │ └── src │ │ └── lib.rs ├── blitz-paint │ ├── Cargo.toml │ └── src │ │ ├── color.rs │ │ ├── debug_overlay.rs │ │ ├── gradient.rs │ │ ├── layers.rs │ │ ├── lib.rs │ │ ├── multicolor_rounded_rect.rs │ │ ├── non_uniform_rounded_rect.rs │ │ ├── render.rs │ │ ├── render │ │ ├── background.rs │ │ ├── box_shadow.rs │ │ └── form_controls.rs │ │ ├── sizing.rs │ │ └── text.rs ├── blitz-shell │ ├── Cargo.toml │ └── src │ │ ├── accessibility.rs │ │ ├── application.rs │ │ ├── convert_events.rs │ │ ├── event.rs │ │ ├── lib.rs │ │ ├── menu.rs │ │ └── window.rs ├── blitz-traits │ ├── Cargo.toml │ └── src │ │ ├── devtools.rs │ │ ├── events.rs │ │ ├── lib.rs │ │ ├── navigation.rs │ │ ├── net.rs │ │ ├── shell.rs │ │ └── viewport.rs ├── blitz │ ├── Cargo.toml │ └── src │ │ └── lib.rs ├── mini-dxn │ ├── Cargo.toml │ └── src │ │ ├── dioxus_document.rs │ │ ├── events.rs │ │ ├── lib.rs │ │ └── mutation_writer.rs └── stylo_taffy │ ├── Cargo.toml │ └── src │ ├── convert.rs │ ├── lib.rs │ └── wrapper.rs ├── tests ├── renders_boxes.rs └── stylo_usage.rs └── wpt └── runner ├── Cargo.toml └── src ├── main.rs ├── net_provider.rs ├── panic_backtrace.rs ├── report.rs └── test_runners ├── attr_test.rs ├── mod.rs └── ref_test.rs /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | pull_request: 5 | push: 6 | branches: 7 | - main 8 | 9 | concurrency: 10 | group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} 11 | cancel-in-progress: true 12 | 13 | env: 14 | RUSTDOCFLAGS: "-D warnings" 15 | CARGO_REGISTRIES_CRATES_IO_PROTOCOL: "sparse" 16 | 17 | jobs: 18 | 19 | # MSRV check. 20 | # Blitz only guarantees "latest stable". However we have this check here to ensure that we advertise 21 | # our MSRV. We also make an effort not to increase MSRV in patch versions of Blitz. 22 | # 23 | # We only run `cargo build` (not `cargo test`) so as to avoid requiring dev-dependencies to build with the MSRV 24 | # version. Building is likely sufficient as runtime errors varying between rust versions is very unlikely. 25 | build-msrv: 26 | name: "MSRV Build [Rust 1.85]" 27 | runs-on: ubuntu-latest 28 | steps: 29 | - uses: actions/checkout@v4 30 | - uses: dtolnay/rust-toolchain@master 31 | with: 32 | toolchain: 1.85 33 | - run: perl -pi.bak -e 's/opt-level = 2/opt-level = 0/g' Cargo.toml 34 | - run: sudo apt update; sudo apt install libgtk-3-dev libxdo-dev 35 | - run: cargo build --workspace 36 | 37 | build-features-default: 38 | name: "Build [default features]" 39 | runs-on: ubuntu-latest 40 | steps: 41 | - uses: actions/checkout@v4 42 | - uses: dtolnay/rust-toolchain@stable 43 | - run: perl -pi.bak -e 's/opt-level = 2/opt-level = 0/g' Cargo.toml 44 | - run: sudo apt update; sudo apt install libgtk-3-dev libxdo-dev 45 | - run: cargo build --workspace 46 | 47 | test-features-default: 48 | name: "Test [default features]" 49 | runs-on: ubuntu-latest 50 | steps: 51 | - uses: actions/checkout@v4 52 | - uses: dtolnay/rust-toolchain@stable 53 | - run: perl -pi.bak -e 's/opt-level = 2/opt-level = 0/g' Cargo.toml 54 | - run: sudo apt update; sudo apt install libgtk-3-dev libxdo-dev 55 | - run: cargo test --workspace 56 | 57 | fmt: 58 | name: Rustfmt 59 | runs-on: ubuntu-latest 60 | steps: 61 | - uses: actions/checkout@v4 62 | - uses: dtolnay/rust-toolchain@master 63 | with: 64 | toolchain: stable 65 | components: rustfmt 66 | - run: cargo fmt --all --check 67 | 68 | clippy: 69 | name: Clippy 70 | runs-on: ubuntu-latest 71 | steps: 72 | - uses: actions/checkout@v4 73 | - uses: dtolnay/rust-toolchain@master 74 | with: 75 | toolchain: stable 76 | components: clippy 77 | - run: perl -pi.bak -e 's/opt-level = 2/opt-level = 0/g' Cargo.toml 78 | - run: sudo apt update; sudo apt install libgtk-3-dev libxdo-dev 79 | - run: cargo clippy --workspace -- -D warnings 80 | 81 | doc: 82 | name: Documentation 83 | runs-on: ubuntu-latest 84 | steps: 85 | - uses: actions/checkout@v4 86 | - uses: dtolnay/rust-toolchain@stable 87 | - run: cargo doc 88 | 89 | # just cargo check for now 90 | matrix_test: 91 | runs-on: ${{ matrix.platform.os }} 92 | if: github.event.pull_request.draft == false 93 | env: 94 | RUST_CARGO_COMMAND: ${{ matrix.platform.cross == true && 'cross' || 'cargo' }} 95 | strategy: 96 | matrix: 97 | platform: 98 | - { 99 | name: windows, 100 | target: x86_64-pc-windows-msvc, 101 | os: windows-latest, 102 | cross: false, 103 | command: "test", 104 | args: "--all --tests", 105 | setup: perl -pi.bak -e 's/opt-level = 2/opt-level = 0/g' Cargo.toml 106 | } 107 | - { 108 | name: macos, 109 | target: aarch64-apple-darwin, 110 | os: macos-latest, 111 | cross: false, 112 | command: "test", 113 | args: "--all --tests", 114 | setup: perl -pi.bak -e 's/opt-level = 2/opt-level = 0/g' Cargo.toml 115 | } 116 | - { 117 | name: linux, 118 | target: x86_64-unknown-linux-gnu, 119 | os: ubuntu-latest, 120 | cross: false, 121 | command: "test", 122 | args: "--all --tests", 123 | setup: "sudo apt update; sudo apt install --no-install-recommends \ 124 | libasound2-dev \ 125 | libatk1.0-dev \ 126 | libgtk-3-dev \ 127 | libudev-dev \ 128 | libpango1.0-dev \ 129 | libxdo-dev; 130 | perl -pi.bak -e 's/opt-level = 2/opt-level = 0/g' Cargo.toml" 131 | } 132 | 133 | name: Test (${{ matrix.platform.name }}) 134 | 135 | steps: 136 | - uses: actions/checkout@v4 137 | - name: install stable 138 | uses: dtolnay/rust-toolchain@master 139 | with: 140 | toolchain: stable 141 | targets: ${{ matrix.platform.target }} 142 | components: rustfmt 143 | 144 | - name: Install cross 145 | if: ${{ matrix.platform.cross == true }} 146 | uses: taiki-e/install-action@cross 147 | 148 | - name: Free Disk Space (Ubuntu) 149 | if: ${{ matrix.platform.os == 'ubuntu-latest' }} 150 | uses: jlumbroso/free-disk-space@v1.3.1 151 | with: # speed things up a bit 152 | large-packages: false 153 | docker-images: false 154 | swap-storage: false 155 | 156 | - uses: Swatinem/rust-cache@v2 157 | with: 158 | key: "${{ matrix.platform.target }}" 159 | cache-all-crates: "true" 160 | save-if: ${{ github.ref == 'refs/heads/main' }} 161 | 162 | - name: Setup 163 | run: ${{ matrix.platform.setup }} 164 | shell: bash 165 | 166 | - name: test 167 | run: | 168 | ${{ env.RUST_CARGO_COMMAND }} ${{ matrix.platform.command }} ${{ matrix.platform.args }} --target ${{ matrix.platform.target }} 169 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | .DS_Store 3 | /scratch 4 | /.vscode 5 | /examples/output/**/*.png 6 | /examples/output/**/*.jpg 7 | /examples/output/**/*.jpeg 8 | /out 9 | /wpt/output 10 | /apps/wpt/output 11 | /sites -------------------------------------------------------------------------------- /CONTRIBUTING.MD: -------------------------------------------------------------------------------- 1 | # Contributing to Blitz 2 | 3 | Welcome to the Dioxus community! 4 | Blitz is a "native" HTML/CSS renderer built to support the "Dioxus Native" project. It is effectively a lightweight webview except that the JavaScript engine is replaced with a native Rust API which allows Rust reactivity / state management libraries like Dioxus to interface with it directly. 5 | 6 | Talk to us in: the #native channel in the [Dioxus Discord](https://discord.gg/BWTrn6d3) 7 | 8 | ## Development 9 | 10 | ### Windows 11 | Building Blitz requires Python, which can be installed from the Windows app store. 12 | 13 | ### Linux 14 | Requirements: 15 | * asound2 16 | * atk1.0 17 | * gtk-3 18 | * udev 19 | * pango1.0 20 | * xdo 21 | 22 | For example on Ubuntu you can install these by running: 23 | ```sh 24 | sudo apt-get update 25 | sudo apt-get install \ 26 | libasound2-dev \ 27 | libatk1.0-dev \ 28 | libgtk-3-dev \ 29 | libudev-dev \ 30 | libpango1.0-dev \ 31 | libxdo-dev 32 | ``` 33 | 34 | ### VSCode 35 | You can add the following JSON to your `.vscode/settings.json` to automically build Blitz on all supported targets. 36 | ```json 37 | { 38 | "rust-analyzer.check.features": "all", 39 | "rust-analyzer.cargo.features": "all", 40 | "rust-analyzer.check.allTargets": true, 41 | "rust-analyzer.cargo.allTargets": true 42 | } 43 | ``` 44 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | members = [ 3 | "packages/anyrender", 4 | "packages/anyrender_vello", 5 | "packages/anyrender_vello_cpu", 6 | "packages/anyrender_svg", 7 | "packages/blitz-traits", 8 | "packages/blitz-dom", 9 | "packages/blitz-html", 10 | "packages/blitz-net", 11 | "packages/blitz-paint", 12 | "packages/blitz-shell", 13 | "packages/blitz", 14 | "packages/mini-dxn", 15 | "packages/stylo_taffy", 16 | "apps/readme", 17 | "wpt/runner", 18 | "examples/counter", 19 | ] 20 | exclude = ["sites"] 21 | resolver = "2" 22 | 23 | [workspace.package] 24 | license = "MIT OR Apache-2.0" 25 | 26 | [workspace.dependencies] 27 | # Servo dependencies 28 | style = { version = "0.3", package = "stylo" } 29 | style_traits = { version = "0.3", package = "stylo_traits" } 30 | style_config = { version = "0.3", package = "stylo_config" } 31 | style_dom = { version = "0.3", package = "stylo_dom" } 32 | selectors = { version = "0.28", package = "selectors" } 33 | 34 | markup5ever = "0.16.1" # needs to match stylo web_atoms version 35 | html5ever = "0.31" # needs to match stylo web_atoms version 36 | xml5ever = "0.22" # needs to match stylo web_atoms version 37 | euclid = "0.22" 38 | string_cache = "0.8.7" 39 | atomic_refcell = "0.1.13" 40 | app_units = "0.7.5" 41 | smallvec = "1" 42 | 43 | # DioxusLabs dependencies 44 | dioxus = { version = "=0.7.0-alpha.1" } 45 | dioxus-core = { version = "=0.7.0-alpha.1" } 46 | dioxus-html = { version = "=0.7.0-alpha.1" } 47 | dioxus-cli-config = { version = "=0.7.0-alpha.1" } 48 | dioxus-devtools = { version = "=0.7.0-alpha.1" } 49 | taffy = { version = "0.8", default-features = false, features = ["std", "flexbox", "grid", "block_layout", "content_size", "calc"] } 50 | 51 | # Linebender + WGPU + SVG 52 | color = "0.3" 53 | peniko = "0.4" 54 | kurbo = "0.11" 55 | parley = { version = "0.5", default-features = false, features = ["std"] } 56 | wgpu = "24" 57 | softbuffer = "0.4" 58 | vello = { version = "0.5", features = [ "wgpu" ] } 59 | vello_cpu = { version = "0.0.1" } 60 | usvg = "0.44.0" 61 | 62 | # Windowing & Input 63 | raw-window-handle = "0.6.0" 64 | winit = { version = "0.30.2", features = ["rwh_06"] } 65 | accesskit_winit = "0.23" 66 | accesskit = "0.17" 67 | muda = { version = "0.11.5", default-features = false } 68 | arboard = { version = "3.4.1", default-features = false } 69 | keyboard-types = "0.7" 70 | cursor-icon = "1" 71 | 72 | # IO & Networking 73 | url = "2.5.0" 74 | http = "1.1.0" 75 | data-url = "0.3.1" 76 | tokio = "1.42" 77 | reqwest = "0.12" 78 | 79 | # Media & Decoding 80 | image = { version = "0.25", default-features = false } 81 | woff = { version = "0.6", default-features = false } 82 | woff2 = "0.3" 83 | html-escape = "0.2.13" 84 | percent-encoding = "2.3.1" 85 | 86 | # Other dependencies 87 | rustc-hash = "1.1.0" 88 | bytes = "1.7.1" 89 | slab = "0.4.9" 90 | tracing = "0.1.40" 91 | futures-util = "0.3.30" 92 | futures-intrusive = "0.5.0" 93 | pollster = "0.4" 94 | smol_str = "0.2" 95 | bitflags = "2.8.0" 96 | 97 | [profile.production] 98 | inherits = "release" 99 | opt-level = 3 100 | debug = false 101 | lto = true 102 | codegen-units = 1 103 | strip = true 104 | incremental = false 105 | 106 | [profile.p2] 107 | inherits = "production" 108 | opt-level = 2 109 | 110 | [profile.small] 111 | inherits = "production" 112 | opt-level = "z" 113 | panic = "abort" 114 | 115 | # This is a "virtual package" 116 | # It is not meant to be published, but is used so "cargo run --example XYZ" works properly 117 | [package] 118 | name = "blitz-examples" 119 | version = "0.0.1" 120 | authors = ["Jonathan Kelley"] 121 | edition = "2024" 122 | description = "Top level crate for Blitz" 123 | license = "MIT OR Apache-2.0" 124 | keywords = ["dom", "ui", "gui", "react", "wasm"] 125 | rust-version = "1.85.1" 126 | publish = false 127 | 128 | [dev-dependencies] 129 | blitz-dom = { path = "./packages/blitz-dom" } 130 | blitz-html = { path = "./packages/blitz-html" } 131 | blitz-traits = { path = "./packages/blitz-traits" } 132 | blitz-paint = { path = "./packages/blitz-paint" } 133 | anyrender = { path = "./packages/anyrender" } 134 | anyrender_vello = { path = "./packages/anyrender_vello" } 135 | anyrender_vello_cpu = { path = "./packages/anyrender_vello_cpu" } 136 | blitz-shell = { path = "./packages/blitz-shell" } 137 | blitz-net = { path = "./packages/blitz-net" } 138 | blitz = { path = "./packages/blitz", features = ["net"] } 139 | mini-dxn = { path = "./packages/mini-dxn", features = ["tracing", "autofocus"] } 140 | dioxus = { workspace = true } 141 | euclid = { workspace = true } 142 | reqwest = { workspace = true } 143 | tokio = { workspace = true, features = ["macros"] } 144 | image = { workspace = true } 145 | png = "0.17" 146 | env_logger = "0.11" 147 | tracing-subscriber = "0.3" 148 | 149 | # [patch.crates-io] 150 | # [patch."https://github.com/dioxuslabs/taffy"] 151 | # taffy = { path = "../taffy" } 152 | 153 | # [patch."https://github.com/nicoburns/parley"] 154 | # parley = { path = "../parley/parley" } 155 | # fontique = { path = "../parley/fontique" } 156 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | Permission is hereby granted, free of charge, to any 2 | person obtaining a copy of this software and associated 3 | documentation files (the "Software"), to deal in the 4 | Software without restriction, including without 5 | limitation the rights to use, copy, modify, merge, 6 | publish, distribute, sublicense, and/or sell copies of 7 | the Software, and to permit persons to whom the Software 8 | is furnished to do so, subject to the following 9 | conditions: 10 | 11 | The above copyright notice and this permission notice 12 | shall be included in all copies or substantial portions 13 | of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 16 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 17 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 18 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 19 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 22 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23 | DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /apps/readme/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "readme" 3 | version = "0.1.0" 4 | edition = "2024" 5 | license.workspace = true 6 | 7 | [features] 8 | default = ["gpu"] 9 | gpu = ["dep:anyrender_vello"] 10 | cpu = ["dep:anyrender_vello_cpu"] 11 | avif = ["dep:image", "image?/avif-native"] 12 | 13 | [dependencies] 14 | blitz-traits = { path = "../../packages/blitz-traits" } 15 | blitz-dom = { path = "../../packages/blitz-dom" } 16 | blitz-html = { path = "../../packages/blitz-html" } 17 | blitz-paint = { path = "../../packages/blitz-paint" } 18 | blitz-net = { path = "../../packages/blitz-net", features = ["cookies"] } 19 | blitz-shell = { path = "../../packages/blitz-shell", features = ["tracing"] } 20 | anyrender_vello = { path = "../../packages/anyrender_vello", optional = true } 21 | anyrender_vello_cpu = { path = "../../packages/anyrender_vello_cpu", optional = true } 22 | tokio = { workspace = true, features = ["rt", "rt-multi-thread"] } 23 | reqwest = { workspace = true } 24 | url = { workspace = true } 25 | winit = { workspace = true } 26 | comrak = { version = "0.39", default-features = false } 27 | image = { workspace = true, default-features = false, optional = true } 28 | notify = "8.0.0" -------------------------------------------------------------------------------- /apps/readme/assets/blitz-markdown-overrides.css: -------------------------------------------------------------------------------- 1 | .markdown-body { 2 | max-width: 892px; 3 | padding: 16px 32px; 4 | margin: 0 auto; 5 | } 6 | 7 | .markdown-body table { 8 | display: table; 9 | } 10 | 11 | @media (prefers-color-scheme: dark) { 12 | html, body { 13 | background-color: #0d1117; 14 | } 15 | 16 | [href$="#gh-light-mode-only"] { 17 | display: none !important; 18 | } 19 | [src$="#gh-light-mode-only"] { 20 | display: none !important; 21 | } 22 | } 23 | 24 | @media (prefers-color-scheme: light) { 25 | [href$="#gh-dark-mode-only"] { 26 | display: none !important; 27 | } 28 | [src$="#gh-dark-mode-only"] { 29 | display: none !important; 30 | } 31 | } -------------------------------------------------------------------------------- /apps/readme/src/markdown.rs: -------------------------------------------------------------------------------- 1 | //! Render the readme.md using the gpu renderer 2 | 3 | use comrak::{ExtensionOptions, Options, Plugins, RenderOptions, markdown_to_html_with_plugins}; 4 | 5 | pub(crate) const GITHUB_MD_STYLES: &str = include_str!("../assets/github-markdown.css"); 6 | pub(crate) const BLITZ_MD_STYLES: &str = include_str!("../assets/blitz-markdown-overrides.css"); 7 | 8 | pub(crate) fn markdown_to_html(contents: String) -> String { 9 | let plugins = Plugins::default(); 10 | // let syntax_highligher = CustomSyntectAdapter(SyntectAdapter::new(Some("InspiredGitHub"))); 11 | // plugins.render.codefence_syntax_highlighter = Some(&syntax_highligher as _); 12 | 13 | let body_html = markdown_to_html_with_plugins( 14 | &contents, 15 | &Options { 16 | extension: ExtensionOptions { 17 | strikethrough: true, 18 | tagfilter: false, 19 | table: true, 20 | autolink: true, 21 | tasklist: true, 22 | superscript: false, 23 | header_ids: None, 24 | footnotes: false, 25 | description_lists: false, 26 | front_matter_delimiter: None, 27 | multiline_block_quotes: false, 28 | alerts: true, 29 | ..ExtensionOptions::default() 30 | }, 31 | render: RenderOptions { 32 | unsafe_: true, 33 | tasklist_classes: true, 34 | ..RenderOptions::default() 35 | }, 36 | ..Options::default() 37 | }, 38 | &plugins, 39 | ); 40 | 41 | // Strip trailing newlines in code blocks 42 | let body_html = body_html.replace("\n 47 | 48 |
49 |The gateway to optimized searching and browsing
100 | 101 |103 | Join us on the journey to a new web browser 104 |105 | 106 |