Powered by AppSignal & Oban Pro

Lumis custom theme

examples/custom_theme.livemd

Lumis custom theme

Mix.install([
  {:mdex, "~> 0.12"},
  {:lumis, "~> 0.1"},
  {:kino, "~> 0.16"}
],
  config: [mdex_native: [syntax_highlighter: :lumis]]
)

Intro

Lumis themes are Elixir structs, so you can edit one before passing it to MDEx. This example changes the style used for function calls.

Customization

Below we’ll customize the github_light theme but you can work with any %Lumis.Theme{} or build one from scratch.

theme = Lumis.Theme.get("github_light")

function_call_style =
  %Lumis.Theme.Style{
    fg: "#d1242f",
    bg: "#e4b7be",
    bold: true
  }

new_theme = put_in(
  theme,
  [Access.key!(:highlights), Access.key!("function.call")],
  function_call_style
)
%Lumis.Theme{
  name: "github_light",
  appearance: :light,
  revision: "c106c9472154d6b2c74b74565616b877ae8ed31d",
  highlights: %{
    "function.macro" => %Lumis.Theme.Style{
      fg: "#6639ba",
      bg: nil,
      bold: false,
      italic: false,
      text_decoration: %Lumis.Theme.TextDecoration{underline: nil, strikethrough: false}
    },
    "variable.builtin" => %Lumis.Theme.Style{
      fg: "#0550ae",
      bg: nil,
      bold: false,
      italic: false,
      text_decoration: %Lumis.Theme.TextDecoration{underline: nil, strikethrough: false}
    },
    "markup.list.checked" => %Lumis.Theme.Style{
      fg: "#116329",
      bg: nil,
      bold: false,
      italic: false,
      text_decoration: %Lumis.Theme.TextDecoration{underline: nil, strikethrough: false}
    },
    "character" => %Lumis.Theme.Style{
      fg: "#0a3069",
      bg: nil,
      bold: false,
      italic: false,
      text_decoration: %Lumis.Theme.TextDecoration{underline: nil, strikethrough: false}
    },
    "string.special.symbol" => %Lumis.Theme.Style{
      fg: "#0550ae",
      bg: nil,
      bold: false,
      italic: false,
      text_decoration: %Lumis.Theme.TextDecoration{underline: nil, strikethrough: false}
    },
    "markup.strong" => %Lumis.Theme.Style{
      fg: "#1f2328",
      bg: nil,
      bold: true,
      italic: false,
      text_decoration: %Lumis.Theme.TextDecoration{underline: nil, strikethrough: false}
    },
    "markup.list.unchecked" => %Lumis.Theme.Style{
      fg: "#57606a",
      bg: nil,
      bold: false,
      italic: false,
      text_decoration: %Lumis.Theme.TextDecoration{underline: nil, strikethrough: false}
    },
    "variable.parameter.builtin" => %Lumis.Theme.Style{
      fg: "#0550ae",
      bg: nil,
      bold: false,
      italic: false,
      text_decoration: %Lumis.Theme.TextDecoration{underline: nil, strikethrough: false}
    },
    "character.special" => %Lumis.Theme.Style{
      fg: "#1f2328",
      bg: nil,
      bold: false,
      italic: false,
      text_decoration: %Lumis.Theme.TextDecoration{underline: nil, strikethrough: false}
    },
    "boolean" => %Lumis.Theme.Style{
      fg: "#0550ae",
      bg: nil,
      bold: false,
      italic: false,
      text_decoration: %Lumis.Theme.TextDecoration{underline: nil, strikethrough: false}
    },
    "string.escape" => %Lumis.Theme.Style{
      fg: "#0a3069",
      bg: nil,
      bold: true,
      italic: false,
      text_decoration: %Lumis.Theme.TextDecoration{underline: nil, strikethrough: false}
    },
    "keyword.exception" => %Lumis.Theme.Style{
      fg: "#0550ae",
      bg: nil,
      bold: false,
      italic: false,
      text_decoration: %Lumis.Theme.TextDecoration{underline: nil, strikethrough: false}
    },
    ...
  }
}
options = [
  syntax_highlight: [engine: :lumis, opts: [formatter: {:html_inline, theme: new_theme}]]
]

"""
# Elixir
```elixir
# elixir example

def fib(n), do: fib(n, 1, 1)

def fib(0, _a, _b), do: []

def fib(n, a, b) when n > 0 do
  [a | fib(n - 1, b, a + b)]
end
```

# Ruby
```ruby
# ruby example

def fibonacci(n)
  return n if (0..1).include?(n)
  (fibonacci(n - 1) + fibonacci(n - 2))
end
```

# Rust
```rust
// rust example

fn fibonacci(n: u32) -> u32 {
  match n {
    0 => 1,
    1 => 1,
    _ => fibonacci(n - 1) + fibonacci(n - 2),
  }
}
```
"""
|> MDEx.to_html!(options)
|> Kino.HTML.new()