From fbc7ec76cf1bd4f85dfd003acb5b3457b83f20b2 Mon Sep 17 00:00:00 2001 From: Javier Garea Date: Mon, 28 Sep 2026 19:22:00 +0200 Subject: [PATCH 1/2] fix: support iodata token values in Lexer.merge/1 --- lib/makeup/lexer.ex | 2 +- test/lexer_test.exs | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/makeup/lexer.ex b/lib/makeup/lexer.ex index 39a59bd..f53d7d6 100644 --- a/lib/makeup/lexer.ex +++ b/lib/makeup/lexer.ex @@ -88,7 +88,7 @@ defmodule Makeup.Lexer do """ @spec merge(list(T.token())) :: list(T.token()) def merge([{tag, meta, value1}, {tag, meta, value2} | rest]), - do: merge [{tag, meta, value1 <> value2} | rest] + do: merge [{tag, meta, [value1, value2]} | rest] def merge([token | rest]), do: [token | merge(rest)] def merge([]), diff --git a/test/lexer_test.exs b/test/lexer_test.exs index 8442c4f..bf2e3a8 100644 --- a/test/lexer_test.exs +++ b/test/lexer_test.exs @@ -20,6 +20,34 @@ defmodule MakeupTest.LexerTest do end end + describe "merge" do + test "merges adjacent tokens of the same type and attributes" do + tokens = [{:a, %{}, "ab"}, {:a, %{}, "cd"}, {:b, %{}, "ef"}] + + assert [{:a, %{}, value}, {:b, %{}, "ef"}] = Lexer.merge(tokens) + assert IO.iodata_to_binary(value) == "abcd" + end + + test "does not merge tokens with different attributes" do + tokens = [{:a, %{x: 1}, "ab"}, {:a, %{x: 2}, "cd"}] + + assert Lexer.merge(tokens) == tokens + end + + test "merges iodata token values" do + tokens = [{:a, %{}, ["a", "b"]}, {:a, %{}, "cd"}] + + assert [{:a, %{}, value}] = Lexer.merge(tokens) + assert IO.iodata_to_binary(value) == "abcd" + end + + test "merging preserves the unlexed string" do + tokens = [{:a, %{}, ["a", "b"]}, {:a, %{}, ["c", ["d"]]}, {:b, %{}, "e"}] + + assert tokens |> Lexer.merge() |> Lexer.unlex() == "abcde" + end + end + describe "split into lines" do test "after splitting, token values contain no newline characters" do check all tokens <- Gen.tokens() do From a83085b52b675272eb6307d4d68eb0304fa81e5b Mon Sep 17 00:00:00 2001 From: Javier Garea Date: Mon, 28 Sep 2026 21:55:42 +0200 Subject: [PATCH 2/2] apply pr suggestion --- lib/makeup/lexer.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/makeup/lexer.ex b/lib/makeup/lexer.ex index f53d7d6..6fee803 100644 --- a/lib/makeup/lexer.ex +++ b/lib/makeup/lexer.ex @@ -88,7 +88,7 @@ defmodule Makeup.Lexer do """ @spec merge(list(T.token())) :: list(T.token()) def merge([{tag, meta, value1}, {tag, meta, value2} | rest]), - do: merge [{tag, meta, [value1, value2]} | rest] + do: merge [{tag, meta, [value1 | value2]} | rest] def merge([token | rest]), do: [token | merge(rest)] def merge([]),