High-performance browser-grade HTML5 parser

Overview

html5ever

Build Status crates.io

API Documentation

html5ever is an HTML parser developed as part of the Servo project.

It can parse and serialize HTML according to the WHATWG specs (aka "HTML5"). However, there are some differences in the actual behavior currently, most of which are documented in the bug tracker. html5ever passes all tokenizer tests from html5lib-tests, with most tree builder tests outside of the unimplemented features. The goal is to pass all html5lib tests, while also providing all hooks needed by a production web browser, e.g. document.write.

Note that the HTML syntax is very similar to XML. For correct parsing of XHTML, use an XML parser (That said, many XHTML documents in the wild are serialized in an HTML-compatible form).

html5ever is written in Rust, therefore it avoids the notorious security problems that come along with using C. Being built with Rust also makes the library come with the high-grade performance you would expect from an html parser written in C. html5ever is basically a C html parser, but without needing a garbage collector or other heavy runtime processes.

Getting started in Rust

Add html5ever as a dependency in your Cargo.toml file:

[dependencies]
html5ever = "*"

You should also take a look at examples/html2html.rs, examples/print-rcdom.rs, and the API documentation.

Getting started in other languages

Bindings for Python and other languages are much desired.

Working on html5ever

To fetch the test suite, you need to run

git submodule update --init

Run cargo doc in the repository root to build local documentation under target/doc/.

Details

html5ever uses callbacks to manipulate the DOM, therefore it does not provide any DOM tree representation.

html5ever exclusively uses UTF-8 to represent strings. In the future it will support other document encodings (and UCS-2 document.write) by converting input.

The code is cross-referenced with the WHATWG syntax spec, and eventually we will have a way to present code and spec side-by-side.

html5ever builds against the official stable releases of Rust, though some optimizations are only supported on nightly releases.

Comments
  • change type ChildrenOnly to ChildrenOnly(Option<QualName>)

    change type ChildrenOnly to ChildrenOnly(Option)

    This is necessary so that these nodes exist on the stack when we serialize the children nodes and may need the parent for context. Addresses servo/servo#14975


    Opening this PR for feedback/review

    ~~This does work and solves the above bug. I'm not sure if this is the best implementation, as there's a bit of duplicated code. I thought about adding a boolean flag to start_elem that would determine whether the writes should be performed. But then I thought maybe when not writing, it's best not to call a function returning io::Result<()>?~~

    Also not 100% sure if the xml implementation is the right thing to do

    Anyway, please let me know of any improvements/changes to make. Thanks :)


    This change is Reviewable

    opened by moonlightdrive 25
  • Add xml5 parser to html5ever

    Add xml5 parser to html5ever

    This large commit concerns #43. It adds everything that is currently defined in spec.

    Included inside:

    Missing:

    • Namespace resolution
    • Doctype handling as per Ygg01/xml5_draft#2
    • Entity replacement (this is mostly C'n'P from html5ever character tokenizer), so all html5 entities are valid (e.g. ‐ Á etc.)
    • Unification of xml5 and html5 syntax
    • C API
    opened by Ygg01 22
  • Very large performance regression from 0.22 to 0.24

    Very large performance regression from 0.22 to 0.24

    (I'm aware 0.25.1 is the latest version, if this is fixed on master let me know and I can close this. 0.25 removed RcDom so it would take some set up on my end to switch)

    Docs.rs uses html5ever to parse HTML files generated by rustdoc. We recently updated from 0.22 to 0.24 and docs.rs started using so much CPU that all requests turned into 500 errors. The 0.24 version was deployed from 20:04 to 20:20 in the following diagram:

    image

    See also https://github.com/rust-lang/docs.rs/pull/669 (and many other PRs linked from there, we had to bisect in production).

    Do you know what could have caused the slowdown? I saw that no new dependencies were introduced so it must have been something internal to html5ever. I can try to reproduce this on a single file if you're not sure, but right now it's preventing us from upgrading.

    opened by jyn514 18
  • Xhtml5ever

    Xhtml5ever

    Ok, this is a large one.

    Fixes #266, fixes #261, fixes #210.

    It moves html5ever into separate folder, renames html5ever macros markup5ever and stores common code there.

    Here is short summary of what I know is and isn't done.

    • [x] Make every crate in the repo use a single workspace
    • [x] Make sure Travis-CI is running every test
    • [x] Rename the the html5ever_atoms crate to markup5ever and update html5ever and xml5ever to use it.
    • [x] Increment version numbers
    • [x] Make it so that users of either html5ever or xml5ever don’t need to have an explicit dependency to markup5ever
    • [x] Export QualName #210
    • [x] let markup5ever generate entities.json #261
    • [x] Move TokenSink to markup5ever
    • [x] Move TreeSink to markup5ever
    • [x] Move BufferQueue to markup5ever
    • [x] Move SmallCharSet to markup5ever
    • [x] Deal with driver.rs

    This change is Reviewable

    opened by Ygg01 18
  • Lazy parsing mode

    Lazy parsing mode

    We're willing to use html5ever's tokenizer for streaming transformation of HTML (that is, replacing specific attributes on specific tags only - e.g. src in img or src in script or href in link). For that, it would be useful to have lazy mode that would not force parser to parse attributes and content that we don't care about and then force us to serialize them back properly, thus 1) preserve formatting as closely to original as possible and 2) improve performance by avoiding lots of unnecessary work.

    Would be that possible to implement? I'm pretty new to Rust, but I would be happy to take an attempt to do this myself if given some basic pointers and directions on where to look / what might need to be changed.

    Thanks.

    P.S. Theoretically, Servo could benefit from lazy parsing, too, if decoding attributes would happen only on first access as it might safely ignore many attributes for rendering and call such lazy decoder only when actually accessing them e.g. via DOM API (whether they are data-* attributes or any other that renderer doesn't care about and only JS code might do).

    opened by RReverser 18
  • Fixed too sure .unwrap in tokenizer.rs

    Fixed too sure .unwrap in tokenizer.rs

    I propose the change because I had this problem when I did cargo test:

    [....]$ RUST_BACKTRACE=1 cargo test
         Running target/debug/html5ever-ebbb862bf0664388
    
    running 20 tests
    ....................
    test result: ok. 20 passed; 0 failed; 0 ignored; 0 measured
    
         Running target/debug/serializer-bd6e4b6794d0e313
    
    running 40 tests
    ........................................
    test result: ok. 40 passed; 0 failed; 0 ignored; 0 measured
    
         Running target/debug/tokenizer-9fee19ffe67616b5
    thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error { repr: Os { code: 2, message: "No such file or directory" } }', ../src/libcore/result.rs:788
    stack backtrace:
       1:        0x10f9e54bb - std::sys::backtrace::tracing::imp::write::h46e546df6e4e4fe6
       2:        0x10f9e775a - std::panicking::default_hook::_$u7b$$u7b$closure$u7d$$u7d$::h077deeda8b799591
       3:        0x10f9e738a - std::panicking::default_hook::heb8b6fd640571a4f
       4:        0x10f9dc178 - std::panicking::rust_panic_with_hook::hd7b83626099d3416
       5:        0x10f9e7d36 - std::panicking::begin_panic::h941ea76fc945d925
       6:        0x10f9dcdb8 - std::panicking::begin_panic_fmt::h30280d4dd3f149f5
       7:        0x10f9e798f - rust_begin_unwind
       8:        0x10fa0d570 - core::panicking::panic_fmt::h2d3cc8234dde51b4
       9:        0x10f903469 - core::result::unwrap_failed::h77e8f7274d900d66
      10:        0x10f902d9a - _<core..result..Result<T, E>>::unwrap::h832a73c540c5d590
      11:        0x10f902782 - tokenizer::foreach_html5lib_test::foreach_html5lib_test::h2ce9421430543c73
      12:        0x10f901f8d - tokenizer::tests::h3cbd3447622b6aa9
      13:        0x10f905c2f - tokenizer::main::h4149a347b29284d8
      14:        0x10f9e6f4d - std::panicking::try::call::hca715a47aa047c49
      15:        0x10f9e7e0b - __rust_try
      16:        0x10f9e7da5 - __rust_maybe_catch_panic
      17:        0x10f9e6d71 - std::rt::lang_start::h162055cb2e4b9fe7
      18:        0x10f907399 - main
    error: test failed
    

    This change is Reviewable

    opened by agbaroni 15
  • Run on Rust stable

    Run on Rust stable

    When the "unstable" Cargo feature is given, html5ever’s build script will use html5ever_macros as a library to generate or update src/tree_builder/rules.expanded.rs, which is part of the source tree.

    (This feature also enables the corresponding features of tendril and string-cache.)

    html5ever_macros is not a plugin anymore, but it still uses libsyntax and still behaves a lot like a syntax extension.

    When "unstable" is not given, the build script checks that rules.expanded.rs is up to date (based on a hash of rules.rs) and fails if it’s not.

    Tests also run on stable Rust on Travis-CI, but unfortunately most of them are disabled as they dynamically generated using internals of the test crate.

    r? @Manishearth

    Fixes #53 Closes #151

    Review on Reviewable

    opened by SimonSapin 15
  • Run rustfmt on everything

    Run rustfmt on everything

    I was reading through the code and noticed that the formatting was different from what I understand to be the currently agreed upon convention. So I ran rustfmt on the entire repo. I hope that's welcome, it made reading the code more pleasant. Tests run as previously.

    opened by mandreyel 14
  • Update phf

    Update phf

    phf 0.8 depends on rand 0.7 This causes rand to be included twice as most other projects have updated to rand 0.8.

    phf 0.9 uses rand 0.8 so update to avoid the duplicate dependency.

    opened by Morganamilo 13
  • Jumping on uninitalized value

    Jumping on uninitalized value

    While running valgrind on my program, I found this

    ==28112== Conditional jump or move depends on uninitialised value(s)
    ==28112==    at 0xB28252: html5ever::tree_builder::data::doctype_error_and_quirks (data.rs:157)
    ==28112==    by 0x682617: <html5ever::tree_builder::TreeBuilder<Handle,Sink> as html5ever::tokenizer::interface::TokenSink>::process_token (mod.rs:472)
    ==28112==    by 0x6D0AA8: _ZN9html5ever9tokenizer21Tokenizer$LT$Sink$GT$13process_token17ha27fb7b70a53cc47E.llvm.10445680363282595522 (mod.rs:237)
    ==28112==    by 0x6D926A: html5ever::tokenizer::Tokenizer<Sink>::step (mod.rs:0)
    ==28112==    by 0x6D390A: _ZN9html5ever9tokenizer21Tokenizer$LT$Sink$GT$3run17h29926122ee9878e2E.llvm.10445680363282595522 (mod.rs:369)
    ==28112==    by 0x62196F: feed<html5ever::tree_builder::TreeBuilder<kuchiki::tree::NodeRef, kuchiki::parser::Sink>> (mod.rs:224)
    ==28112==    by 0x62196F: <html5ever::driver::Parser<Sink> as tendril::stream::TendrilSink<tendril::fmt::UTF8>>::process (driver.rs:109)
    ==28112==    by 0x5E9504: process<html5ever::driver::Parser<kuchiki::parser::Sink>,tendril::tendril::NonAtomic> (stream.rs:180)
    ==28112==    by 0x5E9504: one<tendril::stream::Utf8LossyDecoder<html5ever::driver::Parser<kuchiki::parser::Sink>, tendril::tendril::NonAtomic>,tendril::fmt::Bytes,tendril::tendril::NonAtomic,&[u8]> (stream.rs:48)
    ==28112==    by 0x5E9504: cratesfyi::utils::html::extract_head_and_body (html.rs:28)
    ==28112==    by 0x76F641: cratesfyi::web::rustdoc::rustdoc_html_server_handler (rustdoc.rs:312)
    ==28112==    by 0x751A1B: call<fn(&mut iron::request::Request) -> core::result::Result<iron::response::Response, iron::error::IronError>,(&mut iron::request::Request)> (function.rs:72)
    ==28112==    by 0x751A1B: <F as iron::middleware::Handler>::handle (mod.rs:312)
    ==28112==    by 0xA3ED50: <alloc::boxed::Box<dyn iron::middleware::Handler> as iron::middleware::Handler>::handle (mod.rs:318)
    ==28112==    by 0x7009C6: <cratesfyi::web::metrics::RequestRecorder as iron::middleware::Handler>::handle (metrics.rs:185)
    ==28112==    by 0xA3ED50: <alloc::boxed::Box<dyn iron::middleware::Handler> as iron::middleware::Handler>::handle (mod.rs:318)
    ==28112==  Uninitialised value was created by a stack allocation
    ==28112==    at 0xB27BC0: html5ever::tree_builder::data::doctype_error_and_quirks (data.rs:91)
    

    gdb then pointed out the source of the problem, which is this snippet

    html5ever::tree_builder::data::doctype_error_and_quirks (doctype=<optimized out>, iframe_srcdoc=false) at ~/.cargo/registry/src/github.com-1ecc6299db9ec823/html5ever-0.25.1/src/tree_builder/data.rs:157
    157             (_, Some(ref s)) if QUIRKY_SYSTEM_MATCHES.contains(s) => Quirks,
    
    opened by Kixiron 13
  • html5ever pull tokenizer?

    html5ever pull tokenizer?

    I'm working on an application where the push-tokenizer that is built into html5ever is not very ergonomic.

    Instead of making a sink and having process_token get called on it, I would rather enqueue a Tendril, and get an Iterator of Tokens that are parsed and returned on-demand.

    My question is: would this be an acceptable option for html5ever? I wouldn't mind doing the implementation.

    opened by TyOverby 13
  • Update criterion requirement from 0.3 to 0.4

    Update criterion requirement from 0.3 to 0.4

    Updates the requirements on criterion to permit the latest version.

    Changelog

    Sourced from criterion's changelog.

    [0.4.0] - 2022-09-10

    Removed

    • The Criterion::can_plot function has been removed.
    • The Criterion::bench_function_over_inputs function has been removed.
    • The Criterion::bench_functions function has been removed.
    • The Criterion::bench function has been removed.

    Changed

    • HTML report hidden behind non-default feature flag: 'html_reports'
    • Standalone support (ie without cargo-criterion) feature flag: 'cargo_bench_support'
    • MSRV bumped to 1.57
    • rayon and plotters are optional (and default) dependencies.
    • Status messages ('warming up', 'analyzing', etc) are printed to stderr, benchmark results are printed to stdout.
    • Accept subsecond durations for --warm-up-time, --measurement-time and --profile-time.
    • Replaced serde_cbor with ciborium because the former is no longer maintained.
    • Upgrade clap to v3 and regex to v1.5.

    Added

    • A --discard-baseline flag for discarding rather than saving benchmark results.
    • Formal support for benchmarking code compiled to web-assembly.
    • A --quiet flag for printing just a single line per benchmark.
    • A Throughput::BytesDecimal option for measuring throughput in bytes but printing them using decimal units like kilobytes instead of binary units like kibibytes.

    Fixed

    • When using bench_with_input, the input parameter will now be passed through black_box before passing it to the benchmark.

    [0.3.6] - 2022-07-06

    Changed

    • MSRV bumped to 1.49
    • Symbol for microseconds changed from ASCII 'us' to unicode 'µs'
    • Documentation fixes
    • Clippy fixes

    [0.3.5] - 2021-07-26

    Fixed

    • Corrected Criterion.toml in the book.
    • Corrected configuration typo in the book.

    Changed

    • Bump plotters dependency to always include a bug-fix.
    • MSRV bumped to 1.46.

    ... (truncated)

    Commits
    • 5e27b69 Merge branch 'version-0.4'
    • 4d6d69a Increment version numbers.
    • 935c632 Add Throughput::BytesDecimal. Fixes #581.
    • f82ce59 Remove critcmp code (it belongs in cargo-criterion) (#610)
    • a18d080 Merge branch 'master' into version-0.4
    • f9c6b8d Merge pull request #608 from Cryptex-github/patch-1
    • 8d0224e Fix html report path
    • 2934163 Add missing black_box for bench_with_input parameters. Fixes 566.
    • dfd7b65 Add duplicated benchmark ID to assertion message.
    • ce8259e Bump criterion-plot version number.
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Update typed-arena requirement from 1.3.0 to 2.0.1

    Update typed-arena requirement from 1.3.0 to 2.0.1

    Updates the requirements on typed-arena to permit the latest version.

    Changelog

    Sourced from typed-arena's changelog.

    2.0.1

    Released 2019/01/10.

    Fixed

    • Support #![no_std] on stable Rust.

    2.0.0

    Released 2019/12/03.

    Fixed

    • Fixed some intra-documentation URLs.

    2.0.0-rc1

    Released 2019/11/26.

    Unless any issues are discovered or raised, we will release version 2.0.0 soon.

    Added

    • Added alloc_str to Arena<u8>, to be able to allocate string slices.

    Changed

    • The minimum supported rust version is now 1.36.0.
    • alloc_uninitialized returns &mut [MaybeUninit<T>] instead of *mut [T], which is less prone to undefined behavior.

    1.7.0

    Released 2019/10/31. Spooky!

    Added

    • Added a len method to count how many items are in an arena.

    Fixed

    • Fixed some theoretical overflows.

    ... (truncated)

    Commits
    • 8d0f94f Bump to version 2.0.1
    • 4120f0a Merge pull request #46 from programmerjake/master
    • 166db86 Support #![no_std] on stable Rust.
    • ff63013 Merge pull request #43 from RalfJung/miri
    • 22422d4 ignore tests on miri instead of excluding them from compilation
    • 12507fe Bump to version 2.0.0!
    • afc7fbc Merge pull request #42 from vorner/broken-links
    • d6ba955 Fix links around alloc_unitialized
    • 990bf7a Bump to version 2.0.0 Release Candidate 1
    • c96af29 Merge pull request #40 from vorner/maybe-uninit
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Make async ergonomics nicer.

    Make async ergonomics nicer.

    Using html5ever in async code is painful, because of Cell in StrTendril. As far as I can tell, that choice is for performance reasons (the documentation claims that the use of non-thread-safe primitives is explained in README.md, but no such explanation exists anywhere I can find) but in my use case I'm quite happy to trade a bit of performance for massively enhanced ergonomics with async.

    To that end, I'd like to see something which swaps out StrTendril (aka Tendril<UTF8, NonAtomic>) for Tendril<UTF8, Atomic>. A feature to enable atomicity seems reasonable, but there might be a better option. As far as I can tell that's a completely source-compatible change, so this can probably be implemented with something like:

    #[cfg(not(feature="atomic"))]
    type H5ETendril = tendril::StrTendril;
    #[cfg(feature="atomic")]
    type H5ETendril = tendril::Tendril<tendril::UTF8, tendril::Atomic>;
    

    and then replacing references to tendril::StrTendril with crate::H5ETendril.

    Obviously the names can be bikeshedded. Those are the first ones I came up with.

    Whether this belongs in this crate or tendril is also up for debate, but in my opinion: people using tendril directly already have plenty of ways to give themselves atomicity, and changing defaults through a feature there would just lead to dependency hell.

    I can put in a PR, if it does turn out to be that simple.

    opened by b7-7b 1
  • bug: cargo doesn't know how to resolve dependencies for print-rcdom

    bug: cargo doesn't know how to resolve dependencies for print-rcdom

    See #476

    If you use "*" for the dependency version, cargo cannot resolve the versions correctly:

    [dependencies]
    html5ever = "*"
    markup5ever_rcdom = "*"
    

    Fix: use exact dependencies

    [dependencies]
    html5ever = "0.25.2"
    markup5ever_rcdom = "0.1.0"
    

    Not sure if this is a bug in how the versions have been published, or a bug in cargo itself.

    opened by coolaj86 1
  • doc: how to run example, for n00bs

    doc: how to run example, for n00bs

    Re: https://github.com/servo/html5ever/pull/475

    1. Make sure your rustc version is 1.61.0 or greater
      rustup update
      rustup override unset
      rustup default stable
      rustc --version
      
    2. Create a new project
      mkdir -p ./my-print-rcdom/
      pushd ./my-print-rcdom/
      cargo init
      
    3. Update Cargo.toml to include the dependencies (also, 2018 appears to be the required edition)
      [package]
      name = "example01"
      version = "0.1.0"
      authors = ["Joe Doe <[email protected]>"]
      edition = "2018"
      
      # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
      
      [dependencies]
      html5ever = "0.25.2"
      markup5ever_rcdom = "0.1.0"
      
    4. Replace src/main.rs with the contents of, for example, ./rcdom/examples/print-rcdom.rs
      rm ./src/main.rs
      curl -L -o ./src/main.rs https://raw.githubusercontent.com/servo/html5ever/1b34cf17c/rcdom/examples/print-rcdom.rs
      
    5. Install, build, run (with input):
      cargo build
      curl https://example.com | cargo run
      

    Troubleshooting

    Weird bug:

    warning: unused import: `html5ever::tendril::TendrilSink`
      --> src/main.rs:20:5
       |
    20 | use html5ever::tendril::TendrilSink;
       |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
       |
       = note: `#[warn(unused_imports)]` on by default
    
    Some errors have detailed explanations: E0277, E0599.
    For more information about an error, try `rustc --explain E0277`.
    

    Changing the name field in Cargo.toml (to anything at all), saving, and running cargo install again.

    A room full of rust developers, including one of the most popular teachers on udemy in the room here with us, cannot figure this out.

    opened by coolaj86 3
Owner
Servo
The Servo web browser engine
Servo
A WHATWG-compliant HTML5 tokenizer and tag soup parser

html5gum html5gum is a WHATWG-compliant HTML tokenizer. use std::fmt::Write; use html5gum::{Tokenizer, Token}; let html = "<title >hello world</tit

Markus Unterwaditzer 129 Dec 30, 2022
Unlock vGPU functionality for consumer grade GPUs

Rust-based vgpu_unlock Unlock vGPU functionality for consumer-grade NVIDIA GPUs. This tool is to be used with the kernel patches from the main vgpu_un

Matt Bilker 169 Jan 5, 2023
An HTML5 game where you are a bumblebee visiting flowers

Bumble Umble Gee Our small family team made a game to compete in the Game Off 2021. In this game you play a bumble-bee visiting flowers in a meadow. G

Alan Falloon 1 Dec 1, 2021
Zinnia is a runtime for Filecoin Station modules. It provides a sandboxed environment to execute untrusted code on consumer-grade computers.

?? Zinnia Zinnia is a runtime for Filecoin Station modules. It provides a sandboxed environment to execute untrusted code on consumer-grade computers.

Filecoin Station 5 Jan 25, 2023
rust-browser-game but native and rendered with ncurses in C without the Browser

Spin-off of rust-browser-game-but-sdl but with ncurses Nothing much to say. Just see rust-browser-game-but-sdl and rust-browser-game. Quick Start $ ma

Tsoding 8 Apr 21, 2022
The Bloat-Free Browser Game in Rust but in C and not in a Browser

rust-browser-game but native and rendered with SDL in C without the Browser The original idea of rust-browser-game is that the game.wasm module is com

Tsoding 12 Sep 26, 2022
Rslide - A web service that allows you to move through multiple html pages in the browser like a slide, even without focusing on the app console or the browser. Currently only supports Windows.

rslide rslide is a web service that allows you to move through multiple html pages in the browser like a slide, even without focusing on the app conso

Jason Dongheng Lee 3 Jan 1, 2022
A vcf parser that use memory mapping to get high performance.

biommap An efficient bioinformatics file parser based on memory mapping of file. WARNING: biommap work only on uncompressed seekable file biommap is t

Pierre Marijon 2 Dec 15, 2022
A high-performance, high-reliability observability data pipeline.

Quickstart • Docs • Guides • Integrations • Chat • Download What is Vector? Vector is a high-performance, end-to-end (agent & aggregator) observabilit

Timber 12.1k Jan 2, 2023
Yet Another Parser library for Rust. A lightweight, dependency free, parser combinator inspired set of utility methods to help with parsing strings and slices.

Yap: Yet another (rust) parsing library A lightweight, dependency free, parser combinator inspired set of utility methods to help with parsing input.

James Wilson 117 Dec 14, 2022
Website for Microformats Rust parser (using 'microformats-parser'/'mf2')

Website for Microformats Rust parser (using 'microformats-parser'/'mf2')

Microformats 5 Jul 19, 2022
A language parser tool to build recursive descent top down parser.

lang-pt A language parser tool to generate recursive descent top down parser. Overview Parsers written for the languages like Javascript are often cus

Creative Forest 7 Jan 4, 2023
Djotters is a Djot parser and translater written via parser combinators, in rust.

?? Djotters Turning your Djot (markdown) into lovely HTML! Djotters is here to let you draft up a document and watch it render in real time. If you wa

Anthony Alaribe 4 Mar 26, 2024
kytan: High Performance Peer-to-Peer VPN in Rust

kytan: High Performance Peer-to-Peer VPN kytan is a high performance peer to peer VPN written in Rust. The goal is to to minimize the hassle of config

Chang Lan 368 Dec 31, 2022
A high performance blockchain kernel for enterprise users.

English | 简体中文 What is CITA CITA is a fast and scalable blockchain kernel for enterprises. CITA supports both native contract and EVM contract, by whi

CITAHub 1.3k Dec 22, 2022
High performance and distributed KV store w/ REST API. 🦀

About Lucid KV High performance and distributed KV store w/ REST API. ?? Introduction Lucid is an high performance, secure and distributed key-value s

Lucid ᵏᵛ 306 Dec 28, 2022
A high-performance observability data pipeline.

Get Started • Docs • Guides • Integrations • Chat • Download What is Vector? Vector is a high-performance, end-to-end (agent & aggregator) observabili

Timber 12.1k Jan 7, 2023
High-performance runtime for data analytics applications

Weld Documentation Weld is a language and runtime for improving the performance of data-intensive applications. It optimizes across libraries and func

Weld 2.9k Dec 28, 2022
Rust high performance xml reader and writer

quick-xml High performance xml pull reader/writer. The reader: is almost zero-copy (use of Cow whenever possible) is easy on memory allocation (the AP

Johann Tuffe 802 Dec 31, 2022
High performance Rust ECS library

Legion aims to be a feature rich high performance Entity component system (ECS) library for Rust game projects with minimal boilerplate. Getting Start

Amethyst Engine 1.4k Jan 5, 2023