-module(spruce@highlight). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/spruce/highlight.gleam"). -export([dark_theme/0, light_theme/0, adaptive_theme/0, language/1, highlight_with/4, highlight_named_with/4, highlight/3]). -export_type([theme/0, language/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC(" Syntax highlighting for source code using spruce styles.\n"). -opaque theme() :: {theme, spruce@style:style(), spruce@style:style(), spruce@style:style(), spruce@style:style(), spruce@style:style(), spruce@style:style(), spruce@style:style(), spruce@style:style(), spruce@style:style(), spruce@style:style(), spruce@style:style(), spruce@style:style(), spruce@style:style(), spruce@style:style(), spruce@style:style(), spruce@style:style(), spruce@style:style()}. -opaque language() :: {language, binary(), smalto@grammar:grammar()}. -file("src/spruce/highlight.gleam", 76). ?DOC(" Build a syntax highlighting theme for dark terminal backgrounds.\n"). -spec dark_theme() -> theme(). dark_theme() -> {theme, begin _pipe = spruce@style:new(), _pipe@1 = spruce@style:bold(_pipe), spruce@style:fg(_pipe@1, {hex, 16#c4b5fd}) end, begin _pipe@2 = spruce@style:new(), spruce@style:fg(_pipe@2, {hex, 16#86efac}) end, begin _pipe@3 = spruce@style:new(), spruce@style:fg(_pipe@3, {hex, 16#fbbf24}) end, begin _pipe@4 = spruce@style:new(), _pipe@5 = spruce@style:dim(_pipe@4), spruce@style:fg(_pipe@5, {hex, 16#94a3b8}) end, begin _pipe@6 = spruce@style:new(), spruce@style:fg(_pipe@6, {hex, 16#7dd3fc}) end, begin _pipe@7 = spruce@style:new(), spruce@style:fg(_pipe@7, {hex, 16#f0abfc}) end, begin _pipe@8 = spruce@style:new(), spruce@style:fg(_pipe@8, {hex, 16#cbd5e1}) end, begin _pipe@9 = spruce@style:new(), spruce@style:fg(_pipe@9, {hex, 16#67e8f9}) end, begin _pipe@10 = spruce@style:new(), spruce@style:fg(_pipe@10, {hex, 16#93c5fd}) end, begin _pipe@11 = spruce@style:new(), spruce@style:fg(_pipe@11, {hex, 16#e2e8f0}) end, begin _pipe@12 = spruce@style:new(), spruce@style:fg(_pipe@12, {hex, 16#fca5a5}) end, begin _pipe@13 = spruce@style:new(), spruce@style:fg(_pipe@13, {hex, 16#f9a8d4}) end, begin _pipe@14 = spruce@style:new(), spruce@style:fg(_pipe@14, {hex, 16#60a5fa}) end, begin _pipe@15 = spruce@style:new(), spruce@style:fg(_pipe@15, {hex, 16#fcd34d}) end, begin _pipe@16 = spruce@style:new(), spruce@style:fg(_pipe@16, {hex, 16#a7f3d0}) end, begin _pipe@17 = spruce@style:new(), spruce@style:fg(_pipe@17, {hex, 16#93c5fd}) end, begin _pipe@18 = spruce@style:new(), spruce@style:fg(_pipe@18, {hex, 16#fda4af}) end}. -file("src/spruce/highlight.gleam", 99). ?DOC(" Build a syntax highlighting theme for light terminal backgrounds.\n"). -spec light_theme() -> theme(). light_theme() -> {theme, begin _pipe = spruce@style:new(), _pipe@1 = spruce@style:bold(_pipe), spruce@style:fg(_pipe@1, {hex, 16#6d28d9}) end, begin _pipe@2 = spruce@style:new(), spruce@style:fg(_pipe@2, {hex, 16#15803d}) end, begin _pipe@3 = spruce@style:new(), spruce@style:fg(_pipe@3, {hex, 16#92400e}) end, begin _pipe@4 = spruce@style:new(), _pipe@5 = spruce@style:dim(_pipe@4), spruce@style:fg(_pipe@5, {hex, 16#64748b}) end, begin _pipe@6 = spruce@style:new(), spruce@style:fg(_pipe@6, {hex, 16#0369a1}) end, begin _pipe@7 = spruce@style:new(), spruce@style:fg(_pipe@7, {hex, 16#a21caf}) end, begin _pipe@8 = spruce@style:new(), spruce@style:fg(_pipe@8, {hex, 16#475569}) end, begin _pipe@9 = spruce@style:new(), spruce@style:fg(_pipe@9, {hex, 16#0e7490}) end, begin _pipe@10 = spruce@style:new(), spruce@style:fg(_pipe@10, {hex, 16#1d4ed8}) end, begin _pipe@11 = spruce@style:new(), spruce@style:fg(_pipe@11, {hex, 16#334155}) end, begin _pipe@12 = spruce@style:new(), spruce@style:fg(_pipe@12, {hex, 16#be123c}) end, begin _pipe@13 = spruce@style:new(), spruce@style:fg(_pipe@13, {hex, 16#be185d}) end, begin _pipe@14 = spruce@style:new(), spruce@style:fg(_pipe@14, {hex, 16#2563eb}) end, begin _pipe@15 = spruce@style:new(), spruce@style:fg(_pipe@15, {hex, 16#b45309}) end, begin _pipe@16 = spruce@style:new(), spruce@style:fg(_pipe@16, {hex, 16#047857}) end, begin _pipe@17 = spruce@style:new(), spruce@style:fg(_pipe@17, {hex, 16#1d4ed8}) end, begin _pipe@18 = spruce@style:new(), spruce@style:fg(_pipe@18, {hex, 16#be123c}) end}. -file("src/spruce/highlight.gleam", 122). ?DOC(" Build the default syntax highlighting theme with adaptive light/dark colors.\n"). -spec adaptive_theme() -> theme(). adaptive_theme() -> Adapt = fun(Light, Dark) -> spruce@style:adaptive({hex, Light}, {hex, Dark}) end, {theme, begin _pipe = spruce@style:new(), _pipe@1 = spruce@style:bold(_pipe), spruce@style:fg(_pipe@1, Adapt(16#6d28d9, 16#c4b5fd)) end, begin _pipe@2 = spruce@style:new(), spruce@style:fg(_pipe@2, Adapt(16#15803d, 16#86efac)) end, begin _pipe@3 = spruce@style:new(), spruce@style:fg(_pipe@3, Adapt(16#92400e, 16#fbbf24)) end, begin _pipe@4 = spruce@style:new(), _pipe@5 = spruce@style:dim(_pipe@4), spruce@style:fg(_pipe@5, Adapt(16#64748b, 16#94a3b8)) end, begin _pipe@6 = spruce@style:new(), spruce@style:fg(_pipe@6, Adapt(16#0369a1, 16#7dd3fc)) end, begin _pipe@7 = spruce@style:new(), spruce@style:fg(_pipe@7, Adapt(16#a21caf, 16#f0abfc)) end, begin _pipe@8 = spruce@style:new(), spruce@style:fg(_pipe@8, Adapt(16#475569, 16#cbd5e1)) end, begin _pipe@9 = spruce@style:new(), spruce@style:fg(_pipe@9, Adapt(16#0e7490, 16#67e8f9)) end, begin _pipe@10 = spruce@style:new(), spruce@style:fg(_pipe@10, Adapt(16#1d4ed8, 16#93c5fd)) end, begin _pipe@11 = spruce@style:new(), spruce@style:fg(_pipe@11, Adapt(16#334155, 16#e2e8f0)) end, begin _pipe@12 = spruce@style:new(), spruce@style:fg(_pipe@12, Adapt(16#be123c, 16#fca5a5)) end, begin _pipe@13 = spruce@style:new(), spruce@style:fg(_pipe@13, Adapt(16#be185d, 16#f9a8d4)) end, begin _pipe@14 = spruce@style:new(), spruce@style:fg(_pipe@14, Adapt(16#2563eb, 16#60a5fa)) end, begin _pipe@15 = spruce@style:new(), spruce@style:fg(_pipe@15, Adapt(16#b45309, 16#fcd34d)) end, begin _pipe@16 = spruce@style:new(), spruce@style:fg(_pipe@16, Adapt(16#047857, 16#a7f3d0)) end, begin _pipe@17 = spruce@style:new(), spruce@style:fg(_pipe@17, Adapt(16#1d4ed8, 16#93c5fd)) end, begin _pipe@18 = spruce@style:new(), spruce@style:fg(_pipe@18, Adapt(16#be123c, 16#fda4af)) end}. -file("src/spruce/highlight.gleam", 221). -spec ok(binary(), smalto@grammar:grammar()) -> {ok, language()} | {error, nil}. ok(Name, Grammar) -> {ok, {language, Name, Grammar}}. -file("src/spruce/highlight.gleam", 148). ?DOC(" Resolve a language name or alias to a smalto-backed language.\n"). -spec language(binary()) -> {ok, language()} | {error, nil}. language(Name) -> case string:lowercase(Name) of <<"bash"/utf8>> -> ok(<<"bash"/utf8>>, smalto@languages@bash:grammar()); <<"sh"/utf8>> -> ok(<<"bash"/utf8>>, smalto@languages@bash:grammar()); <<"shell"/utf8>> -> ok(<<"bash"/utf8>>, smalto@languages@bash:grammar()); <<"zsh"/utf8>> -> ok(<<"bash"/utf8>>, smalto@languages@bash:grammar()); <<"c"/utf8>> -> ok(<<"c"/utf8>>, smalto@languages@c:grammar()); <<"cpp"/utf8>> -> ok(<<"cpp"/utf8>>, smalto@languages@cpp:grammar()); <<"c++"/utf8>> -> ok(<<"cpp"/utf8>>, smalto@languages@cpp:grammar()); <<"csharp"/utf8>> -> ok(<<"csharp"/utf8>>, smalto@languages@csharp:grammar()); <<"c#"/utf8>> -> ok(<<"csharp"/utf8>>, smalto@languages@csharp:grammar()); <<"cs"/utf8>> -> ok(<<"csharp"/utf8>>, smalto@languages@csharp:grammar()); <<"css"/utf8>> -> ok(<<"css"/utf8>>, smalto@languages@css:grammar()); <<"dart"/utf8>> -> ok(<<"dart"/utf8>>, smalto@languages@dart:grammar()); <<"dockerfile"/utf8>> -> ok(<<"dockerfile"/utf8>>, smalto@languages@dockerfile:grammar()); <<"docker"/utf8>> -> ok(<<"dockerfile"/utf8>>, smalto@languages@dockerfile:grammar()); <<"elixir"/utf8>> -> ok(<<"elixir"/utf8>>, smalto@languages@elixir:grammar()); <<"erlang"/utf8>> -> ok(<<"erlang"/utf8>>, smalto@languages@erlang:grammar()); <<"fsharp"/utf8>> -> ok(<<"fsharp"/utf8>>, smalto@languages@fsharp:grammar()); <<"gleam"/utf8>> -> ok(<<"gleam"/utf8>>, smalto@languages@gleam:grammar()); <<"go"/utf8>> -> ok(<<"go"/utf8>>, smalto@languages@go:grammar()); <<"golang"/utf8>> -> ok(<<"go"/utf8>>, smalto@languages@go:grammar()); <<"haskell"/utf8>> -> ok(<<"haskell"/utf8>>, smalto@languages@haskell:grammar()); <<"html"/utf8>> -> ok(<<"html"/utf8>>, smalto@languages@html:grammar()); <<"java"/utf8>> -> ok(<<"java"/utf8>>, smalto@languages@java:grammar()); <<"javascript"/utf8>> -> ok(<<"javascript"/utf8>>, smalto@languages@javascript:grammar()); <<"js"/utf8>> -> ok(<<"javascript"/utf8>>, smalto@languages@javascript:grammar()); <<"json"/utf8>> -> ok(<<"json"/utf8>>, smalto@languages@json:grammar()); <<"kotlin"/utf8>> -> ok(<<"kotlin"/utf8>>, smalto@languages@kotlin:grammar()); <<"kt"/utf8>> -> ok(<<"kotlin"/utf8>>, smalto@languages@kotlin:grammar()); <<"lua"/utf8>> -> ok(<<"lua"/utf8>>, smalto@languages@lua:grammar()); <<"markdown"/utf8>> -> ok(<<"markdown"/utf8>>, smalto@languages@markdown:grammar()); <<"md"/utf8>> -> ok(<<"markdown"/utf8>>, smalto@languages@markdown:grammar()); <<"nginx"/utf8>> -> ok(<<"nginx"/utf8>>, smalto@languages@nginx:grammar()); <<"php"/utf8>> -> ok(<<"php"/utf8>>, smalto@languages@php:grammar()); <<"python"/utf8>> -> ok(<<"python"/utf8>>, smalto@languages@python:grammar()); <<"py"/utf8>> -> ok(<<"python"/utf8>>, smalto@languages@python:grammar()); <<"razor"/utf8>> -> ok(<<"razor"/utf8>>, smalto@languages@razor:grammar()); <<"reactjsx"/utf8>> -> ok(<<"reactjsx"/utf8>>, smalto@languages@reactjsx:grammar()); <<"jsx"/utf8>> -> ok(<<"reactjsx"/utf8>>, smalto@languages@reactjsx:grammar()); <<"reacttsx"/utf8>> -> ok(<<"reacttsx"/utf8>>, smalto@languages@reacttsx:grammar()); <<"tsx"/utf8>> -> ok(<<"reacttsx"/utf8>>, smalto@languages@reacttsx:grammar()); <<"ruby"/utf8>> -> ok(<<"ruby"/utf8>>, smalto@languages@ruby:grammar()); <<"rb"/utf8>> -> ok(<<"ruby"/utf8>>, smalto@languages@ruby:grammar()); <<"rust"/utf8>> -> ok(<<"rust"/utf8>>, smalto@languages@rust:grammar()); <<"rs"/utf8>> -> ok(<<"rust"/utf8>>, smalto@languages@rust:grammar()); <<"scala"/utf8>> -> ok(<<"scala"/utf8>>, smalto@languages@scala:grammar()); <<"sql"/utf8>> -> ok(<<"sql"/utf8>>, smalto@languages@sql:grammar()); <<"swift"/utf8>> -> ok(<<"swift"/utf8>>, smalto@languages@swift:grammar()); <<"toml"/utf8>> -> ok(<<"toml"/utf8>>, smalto@languages@toml:grammar()); <<"typescript"/utf8>> -> ok(<<"typescript"/utf8>>, smalto@languages@typescript:grammar()); <<"ts"/utf8>> -> ok(<<"typescript"/utf8>>, smalto@languages@typescript:grammar()); <<"xml"/utf8>> -> ok(<<"xml"/utf8>>, smalto@languages@xml:grammar()); <<"yaml"/utf8>> -> ok(<<"yaml"/utf8>>, smalto@languages@yaml:grammar()); <<"yml"/utf8>> -> ok(<<"yaml"/utf8>>, smalto@languages@yaml:grammar()); <<"zig"/utf8>> -> ok(<<"zig"/utf8>>, smalto@languages@zig:grammar()); _ -> {error, nil} end. -file("src/spruce/highlight.gleam", 225). -spec render_token(spruce:spruce(), smalto@token:token(), theme()) -> binary(). render_token(Sp, Token, Theme) -> case Token of {keyword, Value} -> spruce@style:render(Sp, erlang:element(2, Theme), Value); {string, Value@1} -> spruce@style:render(Sp, erlang:element(3, Theme), Value@1); {number, Value@2} -> spruce@style:render(Sp, erlang:element(4, Theme), Value@2); {comment, Value@3} -> spruce@style:render(Sp, erlang:element(5, Theme), Value@3); {function, Value@4} -> spruce@style:render(Sp, erlang:element(6, Theme), Value@4); {operator, Value@5} -> spruce@style:render(Sp, erlang:element(7, Theme), Value@5); {punctuation, Value@6} -> spruce@style:render(Sp, erlang:element(8, Theme), Value@6); {type, Value@7} -> spruce@style:render(Sp, erlang:element(9, Theme), Value@7); {module, Value@8} -> spruce@style:render(Sp, erlang:element(10, Theme), Value@8); {variable, Value@9} -> spruce@style:render(Sp, erlang:element(11, Theme), Value@9); {constant, Value@10} -> spruce@style:render(Sp, erlang:element(12, Theme), Value@10); {builtin, Value@11} -> spruce@style:render(Sp, erlang:element(13, Theme), Value@11); {tag, Value@12} -> spruce@style:render(Sp, erlang:element(14, Theme), Value@12); {attribute, Value@13} -> spruce@style:render(Sp, erlang:element(15, Theme), Value@13); {selector, Value@14} -> spruce@style:render(Sp, erlang:element(16, Theme), Value@14); {property, Value@15} -> spruce@style:render(Sp, erlang:element(17, Theme), Value@15); {regex, Value@16} -> spruce@style:render(Sp, erlang:element(18, Theme), Value@16); {whitespace, Value@17} -> Value@17; {other, Value@17} -> Value@17; {custom, _, Value@17} -> Value@17 end. -file("src/spruce/highlight.gleam", 210). ?DOC(" Highlight code with a resolved language and explicit theme.\n"). -spec highlight_with(spruce:spruce(), binary(), language(), theme()) -> binary(). highlight_with(Sp, Code, Language, Theme) -> _pipe = smalto:to_tokens(Code, erlang:element(3, Language)), _pipe@1 = gleam@list:map( _pipe, fun(_capture) -> render_token(Sp, _capture, Theme) end ), gleam@string:join(_pipe@1, <<""/utf8>>). -file("src/spruce/highlight.gleam", 197). ?DOC(" Highlight code with a string language name and explicit theme.\n"). -spec highlight_named_with(spruce:spruce(), binary(), binary(), theme()) -> binary(). highlight_named_with(Sp, Code, Name, Theme) -> case language(Name) of {ok, Language} -> highlight_with(Sp, Code, Language, Theme); {error, nil} -> Code end. -file("src/spruce/highlight.gleam", 192). ?DOC( " Highlight code with the default adaptive theme, or return code unchanged for\n" " unknown languages.\n" ). -spec highlight(spruce:spruce(), binary(), binary()) -> binary(). highlight(Sp, Code, Name) -> highlight_named_with(Sp, Code, Name, adaptive_theme()).