Elixir
When you want explicit error handling
Use highlight/2 when invalid user input, formatter options, or language detection should stay in the normal control flow.
case Lumis.highlight(source, formatter: {:html_inline, language: "elixir"}) do
{:ok, html} -> html
{:error, reason} -> handle_error(reason)
end
highlight/2 returns {:ok, output} or {:error, reason}.
When you want the highlighted output directly
Use highlight!/2 when failures should raise immediately, such as in scripts, trusted internal code, or examples.
html = Lumis.highlight!(source, formatter: {:html_inline, language: "elixir"})
highlight!/2 returns the highlighted output or raises.
Language selection
Elixir accepts several forms:
Lumis.highlight!(code, formatter: {:html_inline, language: "elixir"})
Lumis.highlight!(code, formatter: {:html_inline, language: ".ex"})
Lumis.highlight!(code, formatter: {:html_inline, language: "lib/my_app.ex"})
Lumis.highlight!(code)
Omitting language from the formatter enables auto-detection.
Parser loading
Lumis loads missing root and injected languages automatically. Parser WASM is pinned to an exact package version, size, and SHA-256 digest, then cached in the platform user cache directory.
:ok = Lumis.preload_languages(["elixir", "html", "javascript", "css"])
Preload expected languages during application startup when request latency
matters. Set LUMIS_WASM_CACHE_DIR to override the cache location and
LUMIS_WASM_OFFLINE=1 to reject uncached parsers.
A custom :wasm_resolver application setting can return {:ok, bytes},
{:file, path}, or a URL:
config :lumis, :wasm_resolver, fn parser ->
{:file, Path.join("/app/wasm", "#{parser.wasm_name}.wasm")}
end
Discover supported languages and themes
Lumis.available_languages()
Lumis.available_themes()
Lumis.Theme.get("github_light")
See Lumis and Lumis.Theme on HexDocs.
Phoenix and LiveView
Highlighted HTML must be rendered as raw HTML in templates.
code = Lumis.highlight!(source, formatter: {:html_inline, language: "elixir"})
{Phoenix.HTML.raw(@code)}
For linked CSS output, also mount a theme stylesheet through Plug.Static as shown in CSS Theme Files.
Light/dark mode
See Light/Dark Mode for three approaches to theme switching (CSS light-dark(), media queries, and manual toggle).
Custom themes
{:ok, theme} = Lumis.Theme.from_file("/path/to/theme.json")
{:ok, theme} = Lumis.Theme.from_json(theme_json)
Then pass the resulting theme struct into the formatter options.
Validation
# validate options before passing to highlight
Lumis.validate_options!(formatter: {:html_inline, language: "elixir", theme: "dracula"})
# inspect defaults
Lumis.default_options()
Use validate_options!/1 when your app exposes formatter options to users (e.g., config files, admin panels). It raises on invalid values.