From 02cd70a473514310509811fe508082c5db2aebcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eric=20Meadows-J=C3=B6nsson?= Date: Fri, 5 Jun 2026 14:01:23 +0200 Subject: [PATCH] Add makeup_eex and makeup_html for HEEx/EEx highlighting makeup_eex registers the .heex and .eex extensions, and the HEEx lexer requires an HTML lexer (makeup_html) to be registered at runtime. Add both so template files highlight instead of falling back to plain text. --- mix.exs | 2 ++ mix.lock | 2 ++ .../live/components/diff_component_test.exs | 14 ++++++++++++++ 3 files changed, 18 insertions(+) diff --git a/mix.exs b/mix.exs index 8cc696b..c800c88 100644 --- a/mix.exs +++ b/mix.exs @@ -46,9 +46,11 @@ defmodule Diff.MixProject do {:jason, "~> 1.0"}, {:logster, "~> 1.1.1"}, {:makeup, "~> 1.2"}, + {:makeup_eex, "~> 2.0"}, {:makeup_elixir, "~> 1.0"}, {:makeup_erlang, "~> 1.0"}, {:makeup_gleam, "~> 1.0"}, + {:makeup_html, "~> 0.2.0"}, {:mox, "~> 1.0", only: :test}, {:phoenix_html, "~> 4.0"}, {:phoenix_html_helpers, "~> 1.0"}, diff --git a/mix.lock b/mix.lock index fad5a88..b3b67a8 100644 --- a/mix.lock +++ b/mix.lock @@ -23,9 +23,11 @@ "lazy_html": {:hex, :lazy_html, "0.1.11", "136c8e9cd616b4f4e9c1562daa683880891120b759606dc4c3b6b18058ba5d79", [:make, :mix], [{:cc_precompiler, "~> 0.1", [hex: :cc_precompiler, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.9.0", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:fine, "~> 0.1.0", [hex: :fine, repo: "hexpm", optional: false]}], "hexpm", "3b1be592929c31eca1a21673d25696e5c14cddfe922d9d1a3e3b48be4163883b"}, "logster": {:hex, :logster, "1.1.1", "d6fddac540dd46adde0c894024500867fe63b0043713f842c62da5815e21db10", [:mix], [{:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "d18e852c430812ad1c9756998ebe46ec814c724e6eb551a512d7e3f8dee24cef"}, "makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"}, + "makeup_eex": {:hex, :makeup_eex, "2.0.2", "88983b72aadb2e8408b06f7c9413804ce7eae2ca2a5a35cb738c6a9cb393c155", [:mix], [{:makeup, "~> 1.2.1 or ~> 1.3", [hex: :makeup, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_html, "~> 0.2.0 or ~> 1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 1.2", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "30ac121dda580298ff3378324ffaec94aad5a5b67e0cc6af177c67d5f45629b9"}, "makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"}, "makeup_erlang": {:hex, :makeup_erlang, "1.1.0", "835f7e60792e08824cda445639555d7bf1bbbddb1b60b306e33cb6f6db24dc74", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "1cd6780fb1dd1a03979abaed0fe82712b0625118fd5257d3ebbf73f960c73c3c"}, "makeup_gleam": {:hex, :makeup_gleam, "1.0.0", "c4032ef68d5f3abff3d3837cdefc293be727e718507813b13b501100b151420e", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "cf4b1dea482dd319679d009cc057db0ca2f14c8e0451ee307575b54eae00afda"}, + "makeup_html": {:hex, :makeup_html, "0.2.0", "9f810da8d43d625ccd3f7ea25997e588fa541d80e0a8c6b895157ad5c7e9ca13", [:mix], [{:makeup, "~> 1.2", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "0856f7beb9a6a642ab1307e06d990fe39f0ba58690d0b8e662aa2e027ba331b2"}, "mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"}, "mint": {:hex, :mint, "1.8.0", "b964eaf4416f2dee2ba88968d52239fca5621b0402b9c95f55a08eb9d74803e9", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "f3c572c11355eccf00f22275e9b42463bc17bd28db13be1e28f8e0bb4adbc849"}, "mox": {:hex, :mox, "1.2.0", "a2cd96b4b80a3883e3100a221e8adc1b98e4c3a332a8fc434c39526babafd5b3", [:mix], [{:nimble_ownership, "~> 1.0", [hex: :nimble_ownership, repo: "hexpm", optional: false]}], "hexpm", "c7b92b3cc69ee24a7eeeaf944cd7be22013c52fcb580c1f33f50845ec821089a"}, diff --git a/test/diff_web/live/components/diff_component_test.exs b/test/diff_web/live/components/diff_component_test.exs index 7b194b8..bb09db9 100644 --- a/test/diff_web/live/components/diff_component_test.exs +++ b/test/diff_web/live/components/diff_component_test.exs @@ -132,6 +132,20 @@ defmodule DiffWeb.DiffComponentTest do refute html =~ "x = 1" end + test "highlights HEEx templates" do + diff = %GitDiff.Patch{ + from: "lib/page.html.heex", + to: "lib/page.html.heex", + chunks: [chunk([line(text: "
")])] + } + + html = render_component(diff, "diff-heex") + + # The HEEx lexer requires makeup_html to be registered; with it the + # source is tokenized into spans. + assert html =~ ~s|div| + end + test "renders non-BEAM files as plain text" do diff = %GitDiff.Patch{ from: "config/data.json",