-
Notifications
You must be signed in to change notification settings - Fork 75
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge remote-tracking branch 'upstream/master' into typst-support
- Loading branch information
Showing
70 changed files
with
6,222 additions
and
1,507 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,45 +1,3 @@ | ||
# Harper's Architecture | ||
|
||
This document seeks to solve one simple problem: | ||
|
||
> "Roughly, it takes 2x more time to write a patch if you are unfamiliar with the project, but it takes 10x more time to figure out **where** you should change the code." - [Alex Kladov](https://matklad.github.io/2021/02/06/ARCHITECTURE.md.html) | ||
This document is meant to serve as a kind of table of contents for the Harper project. | ||
Hopefully, we can reduce that 10x down to something a little more reasonable. | ||
|
||
## What does Harper do? | ||
|
||
Harper tries to do one thing well: find grammatical and spelling errors in English text. | ||
If possible, provide suggestions to correct those errors. | ||
An error and it's possible corrections together form what we call a lint. | ||
|
||
In this vein, Harper serves the role of a [Linter](<https://en.wikipedia.org/wiki/Lint_(software)>) for English. | ||
|
||
## `harper-core` | ||
|
||
`harper-core` is where all the magic happens. | ||
It contains the code need to tokenize, parse, analyze and lint English text. | ||
|
||
At a high level, there are just a couple types you need to worry about. | ||
|
||
- [Document](https://docs.rs/harper-core/latest/harper_core/struct.Document.html): A representation of an English document. Implements [`TokenStringExt`](https://docs.rs/harper-core/latest/harper_core/trait.TokenStringExt.html) to make it easier to query. | ||
- [Parser](https://docs.rs/harper-core/latest/harper_core/parsers/trait.Parser.html): A trait that describes an object that consumes text and emits tokens. The name is somewhat of a misnomer since it is supposed to only lex English (and emit [Tokens](https://docs.rs/harper-core/latest/harper_core/struct.Token.html)), not parse it. It is called a parser since most types that implement this trait parse _other_ languages (JavaScript) to extract the English text. | ||
- The [Markdown parser](https://docs.rs/harper-core/latest/harper_core/parsers/struct.Markdown.html) is a great example. | ||
- [Linter](https://docs.rs/harper-core/latest/harper_core/linting/trait.Linter.html): A trait that, provided a document, will produce zero or more [Lints](https://docs.rs/harper-core/latest/harper_core/linting/struct.Lint.html#). This is usually done using direct queries on the document or by implementing a [`PatternLinter`](https://docs.rs/harper-core/latest/harper_core/linting/trait.PatternLinter.html). | ||
|
||
If you want to add a linter to Harper, create a new file under the `linters` module in `harper-core` and create a public struct that implements the `Linter` trait. | ||
There are a couple places in other parts of the codebase you'll need to update before it will show up in editors and have persistent settings, but that's a problem for after you've opened your pull request. | ||
|
||
## `harper-ls` | ||
|
||
`harper-ls` is a language server that wraps around `harper-core`. | ||
In essence, it enables text editors and IDEs to access the capabilities of Harper over a network or via standard input/output. | ||
|
||
If you aren't familiar with what a language server does, I would suggest reading [this](https://tamerlan.dev/an-introduction-to-the-language-server-protocol/) or the [official language server protocol documentation](https://microsoft.github.io/language-server-protocol/). | ||
|
||
When Harper is used through Neovim, Visual Studio Code, Helix or Emacs, `harper-ls` is the interface. | ||
|
||
## `harper-wasm` | ||
|
||
`harper-wasm` is a small library that wraps `harper-core` and compiles to WebAssembly with [`wasm-bindgen`](https://github.com/rustwasm/wasm-bindgen). | ||
This allows web applications (like the [Harper](https://writewithharper.com) and the [Obsidian Plugin](https://github.com/automattic/harper-obsidian-plugin) to run Harper without downloading any additional executables. It all runs inside the JavaScript engine. | ||
This document has been moved to the [online documentation](https://writewithharper.com/docs/contributors/architecture). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,41 +1,3 @@ | ||
# Contributing | ||
|
||
Harper is completely open to outside contributors of any kind. | ||
|
||
If you have a feature request or bug to report, please [create an issue](https://github.com/automattic/harper/issues). | ||
|
||
## Setup Your Environment | ||
|
||
To use the tooling required to build and debug Harper, you'll need to the following programs available in your `PATH`. | ||
|
||
- [`just`](https://github.com/casey/just) | ||
- `bash` | ||
- [`cargo`](https://www.rust-lang.org/) (we develop against the latest version of Rust) | ||
- `yarn` | ||
- `node` | ||
- `grep` | ||
- [`wasm-pack`](https://rustwasm.github.io/wasm-pack/installer/) | ||
|
||
To list out the various tools for development, run: | ||
|
||
```bash | ||
just --list | ||
``` | ||
|
||
I would highly recommend that you run `just setup` to populate your build caches and install the necessary build-tools. | ||
|
||
## Committing | ||
|
||
Harper follows [conventional commit practices](https://www.conventionalcommits.org/en/v1.0.0/). | ||
Before creating a pull request, please make sure all your commits follow the linked conventions. | ||
|
||
Additionally, to minimize the labor required to review your commit, we run a relatively strict suite of formatting and linting programs. | ||
We highly recommend that you run both `just format` and `just precommit` before submitting a pull request. | ||
If those scripts don't work in your environment, we run `just precommit` through GitHub actions inside of pull requests, so you may make modifications and push until the checks pass. | ||
|
||
If this sounds intimidating, don't worry. | ||
We are entirely willing to work with you to make sure your code can make it into Harper, just know it might take a little longer. | ||
|
||
## How does it work? | ||
|
||
Please take a read of the [architecture document](./ARCHITECTURE.md). | ||
This page has been moved to [the main documentation](https://writewithharper.com/docs/contributors/introduction). |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.