Packages
mob_dev
0.3.23
0.6.23
0.6.22
0.6.21
0.6.20
0.6.19
0.6.18
0.6.17
0.6.16
0.6.15
0.6.14
0.6.13
0.6.12
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.17
0.5.16
0.5.15
0.5.14
0.5.13
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.0
0.3.37
0.3.35
0.3.34
0.3.33
0.3.28
0.3.26
0.3.23
0.3.21
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.18
0.2.17
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.0
Development tooling for the Mob mobile framework
Current section
Files
Jump to
Current section
Files
lib/mob_dev/qr.ex
defmodule MobDev.QR do
@moduledoc """
Renders QR codes in the terminal using Unicode half-block characters.
Uses eqrcode for matrix generation.
"""
@doc "Prints a QR code for the given content to stdout."
@spec print(String.t()) :: :ok
def print(content) do
IO.puts(render(content))
end
@doc "Returns the QR code as a string of Unicode blocks."
@spec render(String.t()) :: String.t()
def render(content) do
matrix =
content
|> EQRCode.encode()
|> Map.get(:matrix)
|> Tuple.to_list()
|> Enum.map(&Tuple.to_list/1)
# Add a quiet zone (4 cells of whitespace border required by spec)
rows = with_quiet_zone(matrix)
# Process pairs of rows using half-block characters:
# ▀ = top filled, bottom empty
# ▄ = top empty, bottom filled
# █ = both filled
# ' ' = both empty
rows
|> Enum.chunk_every(2, 2, [List.duplicate(0, length(List.first(rows)))])
|> Enum.map_join("\n", fn [top_row, bot_row] ->
Enum.zip(top_row, bot_row)
|> Enum.map_join("", fn
{1, 1} -> "█"
{1, 0} -> "▀"
{0, 1} -> "▄"
{0, 0} -> " "
end)
end)
end
defp with_quiet_zone(matrix) do
width = length(List.first(matrix))
empty_row = List.duplicate(0, width + 8)
side_pad = List.duplicate(0, 4)
padded_rows = Enum.map(matrix, fn row -> side_pad ++ row ++ side_pad end)
List.duplicate(empty_row, 4) ++ padded_rows ++ List.duplicate(empty_row, 4)
end
end