better newline support
This commit is contained in:
@@ -9,6 +9,7 @@ defmodule LabelmakerWeb.Constants do
|
|||||||
link: "",
|
link: "",
|
||||||
outline: "none",
|
outline: "none",
|
||||||
size: "72",
|
size: "72",
|
||||||
|
rows: 2,
|
||||||
width: ""
|
width: ""
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,6 +76,9 @@ defmodule LabelmakerWeb.Constants do
|
|||||||
@max_label_length 1024
|
@max_label_length 1024
|
||||||
@max_label_error "1024-character maximum"
|
@max_label_error "1024-character maximum"
|
||||||
|
|
||||||
|
@rows_min 2
|
||||||
|
@rows_max 8
|
||||||
|
|
||||||
@sizes 16..128
|
@sizes 16..128
|
||||||
|> Enum.to_list()
|
|> Enum.to_list()
|
||||||
|> Enum.take_every(8)
|
|> Enum.take_every(8)
|
||||||
@@ -101,5 +105,7 @@ defmodule LabelmakerWeb.Constants do
|
|||||||
def permitted_gravity, do: @gravity
|
def permitted_gravity, do: @gravity
|
||||||
def permitted_keys, do: @permitted_keys
|
def permitted_keys, do: @permitted_keys
|
||||||
def preview, do: @preview
|
def preview, do: @preview
|
||||||
|
def rows_min, do: @rows_min
|
||||||
|
def rows_max, do: @rows_max
|
||||||
def sizes, do: @sizes
|
def sizes, do: @sizes
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -87,6 +87,8 @@ defmodule LabelmakerWeb.LabelController do
|
|||||||
defp generate_image(args) do
|
defp generate_image(args) do
|
||||||
File.mkdir_p!(@label_dir)
|
File.mkdir_p!(@label_dir)
|
||||||
|
|
||||||
|
# IO.inspect((["magick"] ++ args) |> Enum.join(" "))
|
||||||
|
|
||||||
{_, 0} = System.cmd("magick", args)
|
{_, 0} = System.cmd("magick", args)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -5,17 +5,24 @@
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
class={
|
class={"
|
||||||
"flex justify-center items-center p-4 overflow-hidden whitespace-nowrap border rounded transition duration-300 #{@preview_background} #{if @label_too_long, do: "border-danger", else: "border-primary"} #{if @label_too_long, do: "outline-danger", else: @outline != "none" && "outline-#{@outline}"}"}
|
flex justify-center items-center p-4 overflow-hidden whitespace-nowrap border rounded transition-all duration-300
|
||||||
style={"height: calc(2rem + #{@preview_height}px); color: #{if @label_too_long, do: "white", else: @color}; #{Tools.outline(@outline, @label_too_long)} font-family: #{@font}; font-size: #{@size}px; line-height: #{@size}px; background-color: #{if @preview_background == "", do: @color, else: ""}"}
|
#{@preview_background}
|
||||||
|
#{if @label_too_long, do: "border-danger", else: "border-primary"}
|
||||||
|
#{if @label_too_long, do: "outline-danger", else: @outline != "none" && "outline-#{@outline}"}
|
||||||
|
"}
|
||||||
|
style={"
|
||||||
|
aspect-ratio: 4 / 3;
|
||||||
|
color: #{if @label_too_long, do: "white", else: @color};
|
||||||
|
#{Tools.outline(@outline, @label_too_long)}
|
||||||
|
font-family: #{@font}; font-size: #{@size}px; line-height: #{@size}px;
|
||||||
|
background-color: #{if @preview_background == "", do: @color, else: ""}
|
||||||
|
"}
|
||||||
>
|
>
|
||||||
<%= if @label_too_long do %>
|
<%= if @label_too_long do %>
|
||||||
{Constants.max_label_error()}
|
{Constants.max_label_error()}
|
||||||
<% else %>
|
<% else %>
|
||||||
<%= for {str, i} <- Enum.with_index(@preview_text) do %>
|
{raw(@preview_text)}
|
||||||
{str}
|
|
||||||
{if i < length(@preview_text) - 1, do: raw("<br />")}
|
|
||||||
<% end %>
|
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex flex-row justify-end" style="margin: 5px 0 -15px;">
|
<div class="flex flex-row justify-end" style="margin: 5px 0 -15px;">
|
||||||
@@ -51,18 +58,13 @@
|
|||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
<label for="label" class="block text-sm font-medium">Label</label>
|
<label for="label" class="block text-sm font-medium">Label</label>
|
||||||
<input
|
<textarea
|
||||||
phx-hook="EnterToNewline"
|
|
||||||
type="text"
|
|
||||||
id="label"
|
id="label"
|
||||||
name="label"
|
name="label"
|
||||||
value={@label}
|
rows={@rows + 1}
|
||||||
placeholder="Enter text"
|
placeholder="Enter text"
|
||||||
class={"mt-1 block w-full rounded border border-gray-300 px-3 py-2 text-fg-light dark:text-fg-dark dark:border-gray-600 focus:ring-primary dark:placeholder-gray-400/50 transition duration-300 #{if @label_too_long, do: "bg-danger", else: "bg-secondary-light dark:bg-secondary-dark"}"}
|
class={"mt-1 block w-full rounded border border-gray-300 px-3 py-2 text-fg-light dark:text-fg-dark dark:border-gray-600 focus:ring-primary dark:placeholder-gray-400/50 transition duration-300 #{if @label_too_long, do: "bg-danger", else: "bg-secondary-light dark:bg-secondary-dark"}"}
|
||||||
/>
|
>{@label}</textarea>
|
||||||
<p class="text-xs text-gray-600 dark:text-gray-400 m-0 ml-1">
|
|
||||||
<code>\n</code> or <Enter> for newlines
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
||||||
|
|||||||
@@ -12,6 +12,14 @@ defmodule LabelmakerWeb.Tools do
|
|||||||
Constants.defaults()
|
Constants.defaults()
|
||||||
|> Map.new(fn {k, v} -> {Atom.to_string(k), v} end)
|
|> Map.new(fn {k, v} -> {Atom.to_string(k), v} end)
|
||||||
|> Map.merge(parameters)
|
|> Map.merge(parameters)
|
||||||
|
|> Enum.map(fn
|
||||||
|
{"label", label} ->
|
||||||
|
{"label", process_label(label)}
|
||||||
|
|
||||||
|
pair ->
|
||||||
|
pair
|
||||||
|
end)
|
||||||
|
|> Map.new()
|
||||||
|
|
||||||
parameters =
|
parameters =
|
||||||
Constants.defaults()
|
Constants.defaults()
|
||||||
@@ -29,9 +37,6 @@ defmodule LabelmakerWeb.Tools do
|
|||||||
{:height, height} ->
|
{:height, height} ->
|
||||||
{:height, process_height(height, parameters)}
|
{:height, process_height(height, parameters)}
|
||||||
|
|
||||||
{:label, label} ->
|
|
||||||
{:label, process_label(label)}
|
|
||||||
|
|
||||||
{:label_too_long, _} ->
|
{:label_too_long, _} ->
|
||||||
{:label_too_long, String.length(parameters["label"]) > Constants.max_label_length()}
|
{: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_height, calculate_preview_height(parameters)}
|
||||||
|
|
||||||
{:preview_text, _} ->
|
{: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, width} ->
|
||||||
{:width, process_width(width, parameters)}
|
{:width, process_width(width, parameters)}
|
||||||
@@ -78,11 +86,9 @@ defmodule LabelmakerWeb.Tools do
|
|||||||
end
|
end
|
||||||
|
|
||||||
defp process_label(label) do
|
defp process_label(label) do
|
||||||
if String.length(label) > Constants.max_label_length() do
|
|
||||||
String.slice(label, 0, Constants.max_label_length())
|
|
||||||
else
|
|
||||||
label
|
label
|
||||||
end
|
|> String.replace("\\n", "\n")
|
||||||
|
|> String.slice(0, Constants.max_label_length())
|
||||||
end
|
end
|
||||||
|
|
||||||
defp generate_link(%{height: "", label: label, width: ""} = parameters) do
|
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])}"
|
~p"/#{label}?#{Map.take(parameters, [:align, :color, :font, :height, :outline, :width])}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp generate_preview_text(label) do
|
||||||
|
label
|
||||||
|
|> String.replace("\n", "<br />")
|
||||||
|
end
|
||||||
|
|
||||||
def process_preview_background(bg) do
|
def process_preview_background(bg) do
|
||||||
case bg do
|
case bg do
|
||||||
"r" -> "bg-[linear-gradient(to_right,_black_33%,_white_67%)]"
|
"r" -> "bg-[linear-gradient(to_right,_black_33%,_white_67%)]"
|
||||||
@@ -114,9 +125,19 @@ defmodule LabelmakerWeb.Tools do
|
|||||||
|
|
||||||
defp calculate_preview_height(parameters) do
|
defp calculate_preview_height(parameters) do
|
||||||
size = parameters["size"] |> String.to_integer()
|
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
|
end
|
||||||
|
|
||||||
def outline(_, error: true), do: outline(Constants.danger(), false)
|
def outline(_, error: true), do: outline(Constants.danger(), false)
|
||||||
|
|||||||
Reference in New Issue
Block a user