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)