From c5acb7ac33b17b25f90705b01d19daf1eacbca3d Mon Sep 17 00:00:00 2001 From: Gavin McDonald Date: Mon, 1 Sep 2025 15:18:11 -0400 Subject: [PATCH] better newline support --- lib/labelmaker_web/constants.ex | 6 +++ .../controllers/label_controller.ex | 2 + lib/labelmaker_web/live/home.html.heex | 32 +++++++------- lib/labelmaker_web/tools.ex | 43 ++++++++++++++----- 4 files changed, 57 insertions(+), 26 deletions(-) diff --git a/lib/labelmaker_web/constants.ex b/lib/labelmaker_web/constants.ex index 0a9b911..3206b35 100644 --- a/lib/labelmaker_web/constants.ex +++ b/lib/labelmaker_web/constants.ex @@ -9,6 +9,7 @@ defmodule LabelmakerWeb.Constants do link: "", outline: "none", size: "72", + rows: 2, width: "" } @@ -75,6 +76,9 @@ defmodule LabelmakerWeb.Constants do @max_label_length 1024 @max_label_error "1024-character maximum" + @rows_min 2 + @rows_max 8 + @sizes 16..128 |> Enum.to_list() |> Enum.take_every(8) @@ -101,5 +105,7 @@ defmodule LabelmakerWeb.Constants do def permitted_gravity, do: @gravity def permitted_keys, do: @permitted_keys def preview, do: @preview + def rows_min, do: @rows_min + def rows_max, do: @rows_max def sizes, do: @sizes end diff --git a/lib/labelmaker_web/controllers/label_controller.ex b/lib/labelmaker_web/controllers/label_controller.ex index 6c83ef4..e9d3fe8 100644 --- a/lib/labelmaker_web/controllers/label_controller.ex +++ b/lib/labelmaker_web/controllers/label_controller.ex @@ -87,6 +87,8 @@ defmodule LabelmakerWeb.LabelController do defp generate_image(args) do File.mkdir_p!(@label_dir) + # IO.inspect((["magick"] ++ args) |> Enum.join(" ")) + {_, 0} = System.cmd("magick", args) end end diff --git a/lib/labelmaker_web/live/home.html.heex b/lib/labelmaker_web/live/home.html.heex index 25b39df..ab3e9d0 100644 --- a/lib/labelmaker_web/live/home.html.heex +++ b/lib/labelmaker_web/live/home.html.heex @@ -5,17 +5,24 @@

<%= if @label_too_long do %> {Constants.max_label_error()} <% else %> - <%= for {str, i} <- Enum.with_index(@preview_text) do %> - {str} - {if i < length(@preview_text) - 1, do: raw("
")} - <% end %> + {raw(@preview_text)} <% end %>
@@ -51,18 +58,13 @@ >
- -

- \n or <Enter> for newlines -

+ >{@label}
diff --git a/lib/labelmaker_web/tools.ex b/lib/labelmaker_web/tools.ex index c856081..382d1fe 100644 --- a/lib/labelmaker_web/tools.ex +++ b/lib/labelmaker_web/tools.ex @@ -12,6 +12,14 @@ defmodule LabelmakerWeb.Tools do Constants.defaults() |> Map.new(fn {k, v} -> {Atom.to_string(k), v} end) |> Map.merge(parameters) + |> Enum.map(fn + {"label", label} -> + {"label", process_label(label)} + + pair -> + pair + end) + |> Map.new() parameters = Constants.defaults() @@ -29,9 +37,6 @@ defmodule LabelmakerWeb.Tools do {:height, height} -> {:height, process_height(height, parameters)} - {:label, label} -> - {:label, process_label(label)} - {:label_too_long, _} -> {:label_too_long, String.length(parameters["label"]) > Constants.max_label_length()} @@ -39,7 +44,10 @@ defmodule LabelmakerWeb.Tools do {:preview_height, calculate_preview_height(parameters)} {:preview_text, _} -> - {:preview_text, String.split(parameters["label"], "\\n")} + {:preview_text, generate_preview_text(parameters["label"])} + + {:rows, _} -> + {:rows, process_rows(parameters["label"])} {:width, width} -> {:width, process_width(width, parameters)} @@ -78,11 +86,9 @@ defmodule LabelmakerWeb.Tools do end defp process_label(label) do - if String.length(label) > Constants.max_label_length() do - String.slice(label, 0, Constants.max_label_length()) - else - label - end + label + |> String.replace("\\n", "\n") + |> String.slice(0, Constants.max_label_length()) end defp generate_link(%{height: "", label: label, width: ""} = parameters) do @@ -93,6 +99,11 @@ defmodule LabelmakerWeb.Tools do ~p"/#{label}?#{Map.take(parameters, [:align, :color, :font, :height, :outline, :width])}" end + defp generate_preview_text(label) do + label + |> String.replace("\n", "
") + end + def process_preview_background(bg) do case bg do "r" -> "bg-[linear-gradient(to_right,_black_33%,_white_67%)]" @@ -114,9 +125,19 @@ defmodule LabelmakerWeb.Tools do defp calculate_preview_height(parameters) do size = parameters["size"] |> String.to_integer() - line_breaks = Regex.scan(~r/#{Regex.escape("\\n")}/, parameters["label"]) |> length() + rows = calculate_rows(parameters["label"]) - size + size * line_breaks + size + size * rows + end + + defp calculate_rows(label) do + Regex.scan(~r/#{Regex.escape("\n")}/, label) |> length() + end + + defp process_rows(label) do + calculate_rows(label) + |> max(Constants.rows_min()) + |> min(Constants.rows_max()) end def outline(_, error: true), do: outline(Constants.danger(), false)