defmodule RustledSyntect do
alias RustledSyntect.Nif
@doc ~S'''
Syntax highlight an enumerable/stream of lines, producing an iolist.
iex> Enum.join(RustledSyntect.hilite_stream(["(0..69).each do |x|", " puts x", "end"], lang: "Ruby"), "") <> "\n"
"""
(0..69).each do |x|
puts x
end
"""
iex> Enum.into(RustledSyntect.hilite_stream(["(0..69).each do |x|", " puts x", "end"], lang: "Ruby"), [])
[
"(0..69).each do |x|",
"\n",
" puts x",
"\n",
"end",
[""]
]
'''
@spec hilite_stream(Enumerable.t(), [{:lang, String.Chars.t()}]) :: Enumerable.t()
def hilite_stream(stream, lang: lang) do
hl = Nif.new_highlighter(lang)
stream
|> Stream.map(fn line -> Nif.highlight_line(hl, line) end)
|> Stream.intersperse("\n")
|> Stream.concat(
Stream.unfold(true, fn
true -> {Nif.finalize(hl), false}
false -> nil
end)
)
end
def supported_langs, do: Nif.langs()
end