An Erlang lexer and syntax highlighter in Gleam
Gleam 92.5%
Erlang 0.5%
JavaScript 0.4%
Other 6.6%
42 1 4

Clone this repository

https://tangled.org/gearsco.de/pearl
git@tangled.org:gearsco.de/pearl

For self-hosted knots, clone URLs may differ based on your setup.

README.md

Pearl#

An Erlang lexer and syntax highlighter for Gleam!

Package Version Hex Docs

Pearl is a lexer and syntax highlighter for Erlang, written in Gleam. The lexer is based on glexer and just, allowing you to convert Erlang source code into tokens. There is also an API which allows you to highlight Erlang code using ansi colours, html or a custom format. Heavily inspired by contour.

gleam add pearl@2
import pearl

pub fn main() {
  let code = "
-module(hello).
-export([hello_world/0]).

hello_world() -> io:fwrite(\"Hello, world!\\n\").
"

  let lexer = pearl.new(code)
  // Lex syntax tokens for parsing or other uses
  let #(tokens, errors) = pearl.tokenise(lexer)
  let assert [] = errors
  parse_erlang(tokens)

  // Highlight with ansi codes to print in the terminal
  let highlighted = pearl.highlight_ansi(code)
  io.println(highlighted)

  // Render to html to show in the browser
  let html = pearl.highlight_html(code)
  io.println("<pre><code>" <> html <> "</code></pre>")

  // Convert to "highlighting tokens" to highlight in some other way
  let highlight_tokens = pearl.highlight_tokens(code)
  highlight_tokens_some_other_way(highlight_tokens)
}

Further documentation can be found at https://hexdocs.pm/pearl.

Feature completeness#

As far as I can tell, pearl can lex all valid Erlang programs. However, I couldn't find a technical specification for Erlang syntax so what I've implemented is based on the Erlang documentation and other Erlang parsers. If there is something missing, please open an issue and I'll implement it as soon as possible.