Syntax highlighter powered by Tree-sitter and Neovim themes.
- π³ 60+ languages with tree-sitter parsing
- π¨ 100+ Neovim themes
- π HTML output with inline or linked styles
- π₯οΈ Terminal output with ANSI colors
- π Language auto-detection
- π― Customizable formatting options
def deps do
[
{:autumn, "~> 0.3"}
]
end
iex> Autumn.highlight!("Atom.to_string(:elixir)", language: "elixir")
~s|<pre class="athl" style="color: #abb2bf; background-color: #282c34;"><code class="language-elixir" translate="no" tabindex="0"><span class="line" data-line="1"><span style="color: #e5c07b;">Atom</span><span style="color: #56b6c2;">.</span><span style="color: #61afef;">to_string</span><span style="color: #c678dd;">(</span><span style="color: #e06c75;">:elixir</span><span style="color: #c678dd;">)</span>
</span></code></pre>|
See the HTML Linked and Terminal formatters below for more options.
iex> Autumn.highlight!("#!/usr/bin/env bash\nID=1")
~s|<pre class="athl" style="color: #abb2bf; background-color: #282c34;"><code class="language-bash" translate="no" tabindex="0"><span class="line" data-line="1"><span style="color: #c678dd;">#!/usr/bin/env bash</span>
</span><span class="line" data-line="2"><span style="color: #d19a66;">ID</span><span style="color: #56b6c2;">=</span><span style="color: #d19a66;">1</span>
</span></code></pre>|
Themes can be specified either by name or by using a theme struct:
# Using theme name
iex> Autumn.highlight!("setTimeout(fun, 5000);", language: "js", theme: "github_light")
~s|<pre class="athl" style="color: #1f2328; background-color: #ffffff;"><code class="language-javascript" translate="no" tabindex="0"><span class="line" data-line="1"><span style="color: #6639ba;">setTimeout</span><span style="color: #1f2328;">(</span><span style="color: #1f2328;">fun</span><span style="color: #1f2328;">,</span> <span style="color: #0550ae;">5000</span><span style="color: #1f2328;">)</span><span style="color: #1f2328;">;</span>
</span></code></pre>|
# Using theme struct
iex> theme = Autumn.Theme.get("github_light")
iex> Autumn.highlight!("setTimeout(fun, 5000);", language: "js", theme: theme)
It's also capable of handling incomplete or malformed code, useful for streaming like in a ChatGPT interface:
iex> Autumn.highlight!("const header = document.getEl", language: "js")
~s|<pre class="athl" style="color: #abb2bf; background-color: #282c34;"><code class="language-javascript" translate="no" tabindex="0"><span class="line" data-line="1"><span style="color: #c678dd;">const</span> <span style="color: #abb2bf;">header</span> <span style="color: #abb2bf;">=</span> <span style="color: #e86671;">document</span><span style="color: #848b98;">.</span><span style="color: #56b6c2;">getEl</span>
</span></code></pre>|
Autumn supports three output formatters:
Both HTML formatters wrap each line in a <span class="line">
element with a data-line
attribute containing the line number, making it easy to add line numbers or implement line-based features in your application.
Generates HTML with inline styles for each token:
iex> Autumn.highlight!("Atom.to_string(:elixir)", language: "elixir", formatter: :html_inline)
# or with options
iex> Autumn.highlight!("Atom.to_string(:elixir)", language: "elixir", formatter: {:html_inline, pre_class: "my-code", italic: true, include_highlights: true})
Options:
:pre_class
- CSS class for the<pre>
tag:italic
- enable italic styles:include_highlights
- include highlight scope names indata-highlight
attributes
Generates HTML with CSS classes for styling:
iex> Autumn.highlight!("Atom.to_string(:elixir)", language: "elixir", formatter: :html_linked)
# or with options
iex> Autumn.highlight!("Atom.to_string(:elixir)", language: "elixir", formatter: {:html_linked, pre_class: "my-code"})
Options:
:pre_class
- CSS class for the<pre>
tag
To use linked styles, you need to include one of the available CSS themes in your app.
For Phoenix apps, add this to your endpoint.ex
:
plug Plug.Static,
at: "/themes",
from: {:autumn, "priv/static/css/"},
only: ["dracula.css"] # choose any theme you want
Then add the stylesheet to your template:
<link phx-track-static rel="stylesheet" href={~p"/themes/dracula.css"} />
Generates ANSI escape codes for terminal output:
iex> Autumn.highlight!("Atom.to_string(:elixir)", language: "elixir", formatter: :terminal)
# or with options
iex> Autumn.highlight!("Atom.to_string(:elixir)", language: "elixir", formatter: {:terminal, italic: true})
Options:
:italic
- enable italic styles (if supported by your terminal)
Use Autumn.available_themes/0
to list all available themes and Autumn.Theme.get/1
to get a specific theme. Themes are sourced from popular Neovim colorschemes.
Visit https://autumnus.dev to check out some examples.
At DockYard we are ready to help you build your next Elixir project. We have a unique expertise in Elixir and Phoenix development that is unmatched and we love to write about Elixir.
Have a project in mind? Get in touch!
- Logo created by by pongsakornRed - Flaticon
- Logo font designed by Astigmatic
- Makeup for setting up the baseline and for the inspiration
- Inkjet for the Rust implementation up to v0.2 and for the inspiration