mbrubeck/robinson

A toy web rendering engine

Rust

1,653

204 commits

updated Jul 16, 2024

See the code

README

Robinson

A toy web rendering engine written in the Rust language, by Matt Brubeck ([email protected]).

I'm writing this code purely for educational purposes. My goal is to create an incomplete but extremely simple engine as a way to learn more about basic implementation techniques, without worrying about complications like:

  • Real-world usability
  • Standards compliance
  • Performance and efficiency
  • Interoperability

These are all important goals, but there are other projects working on them. By ignoring them completely, this project can focus on being as simple and easy-to-understand as possible.

Why create a simple—but useless—toy rendering engine? Mostly because I personally want to learn how to do it. If I succeed, I also hope that other people can learn from my code by reading or modifying it, or learn from my experience as they set out to build their own toy browser engines.

For more details see Let's build a browser engine!, a series of how-to articles based on this project.

Status

Currently implemented:

  • Parse a small subset of HTML and build a DOM tree.
  • Parse a small subset of CSS.
  • Perform selector matching to apply styles to elements.
  • Basic block layout.

Coming soon, I hope:

  • Inline layout.
  • Paint text and boxes.
  • Load resources from network or filesystem.

Instructions

  1. Install Rust 1.0 beta or newer.

  2. Clone the robinson source code from https://github.com/mbrubeck/robinson

  3. Run cargo build to build robinson, and cargo run to run it.

To build and run with optimizations enabled, use cargo build --release and cargo run --release.

By default, robinson will load test.html and test.css from the examples directory. You can use the --html and --css arguments to the robinson executable to change the input files:

./target/debug/robinson --html examples/test.html --css examples/test.css

The rendered page will be saved to a file named output.png. To change the output filename, use the -o option. To switch to PDF output, use add --format pdf.

mbrubeck/robinson

A toy web rendering engine

Rust

1,653

204 commits

updated Jul 16, 2024

See the code

README

Robinson

A toy web rendering engine written in the Rust language, by Matt Brubeck ([email protected]).

I'm writing this code purely for educational purposes. My goal is to create an incomplete but extremely simple engine as a way to learn more about basic implementation techniques, without worrying about complications like:

  • Real-world usability
  • Standards compliance
  • Performance and efficiency
  • Interoperability

These are all important goals, but there are other projects working on them. By ignoring them completely, this project can focus on being as simple and easy-to-understand as possible.

Why create a simple—but useless—toy rendering engine? Mostly because I personally want to learn how to do it. If I succeed, I also hope that other people can learn from my code by reading or modifying it, or learn from my experience as they set out to build their own toy browser engines.

For more details see Let's build a browser engine!, a series of how-to articles based on this project.

Status

Currently implemented:

  • Parse a small subset of HTML and build a DOM tree.
  • Parse a small subset of CSS.
  • Perform selector matching to apply styles to elements.
  • Basic block layout.

Coming soon, I hope:

  • Inline layout.
  • Paint text and boxes.
  • Load resources from network or filesystem.

Instructions

  1. Install Rust 1.0 beta or newer.

  2. Clone the robinson source code from https://github.com/mbrubeck/robinson

  3. Run cargo build to build robinson, and cargo run to run it.

To build and run with optimizations enabled, use cargo build --release and cargo run --release.

By default, robinson will load test.html and test.css from the examples directory. You can use the --html and --css arguments to the robinson executable to change the input files:

./target/debug/robinson --html examples/test.html --css examples/test.css

The rendered page will be saved to a file named output.png. To change the output filename, use the -o option. To switch to PDF output, use add --format pdf.

Significant stargazers

(top 24 of 44)

Emilio Cobos Álvarez

737 followers · starred Mar 2016

Yoann Padioleau

502 followers · starred Aug 2014

Xuan Huang (黄玄)

7,886 followers · starred Nov 2019

Nathan Froyd

142 followers · starred Jul 2014