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