Skip to content

Commit

Permalink
Merge branch 'master' into ignore-link-title-cfg
Browse files Browse the repository at this point in the history
  • Loading branch information
grantlemons committed Jan 13, 2025
2 parents 01d0dc6 + b5c2dc6 commit 809cacd
Show file tree
Hide file tree
Showing 181 changed files with 10,940 additions and 2,631 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/precommit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
- uses: extractions/setup-just@v2
- uses: actions/setup-node@v4
with:
node-version: 20
node-version: 23
- name: Install `wasm-pack`
run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
- name: Precommit
Expand Down
44 changes: 1 addition & 43 deletions ARCHITECTURE.md
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).
40 changes: 1 addition & 39 deletions CONTRIBUTING.md
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).
Loading

0 comments on commit 809cacd

Please sign in to comment.