Current section

Files

Jump to
escpos src escpos.erl
Raw

src/escpos.erl

-module(escpos).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/escpos.gleam").
-export([new/0, write/2, writeln/2, bold/2, underline/2, double_strike/2, reverse/2, upside_down/2, smooth/2, flip/2, font/2, reset_font/1, text_size/3, reset_text_size/1, cut/1, partial_cut/1, new_line/1, line_feed/2, reset/1, raw/2, align/2, image/2]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(
" A low-level imperative API for building ESC/POS printer commands.\n"
"\n"
" This module provides a builder-style interface where each function takes\n"
" a `CommandBuffer` and returns a modified buffer. For a declarative\n"
" alternative, see `escpos/document`.\n"
"\n"
" ## Example\n"
"\n"
" ```gleam\n"
" import escpos.{Center, Left}\n"
" import escpos/printer\n"
"\n"
" escpos.new()\n"
" |> escpos.reset()\n"
" |> escpos.align(Center)\n"
" |> escpos.bold(True)\n"
" |> escpos.writeln(\"Receipt\")\n"
" |> escpos.bold(False)\n"
" |> escpos.align(Left)\n"
" |> escpos.writeln(\"Item 1 ... $5.00\")\n"
" |> escpos.cut()\n"
" |> printer.print(my_printer)\n"
" ```\n"
).
-file("src/escpos.gleam", 40).
?DOC(" Creates a new empty command buffer.\n").
-spec new() -> escpos@printer:command_buffer().
new() ->
{command_buffer, <<>>}.
-file("src/escpos.gleam", 177).
-spec append(escpos@printer:command_buffer(), bitstring()) -> escpos@printer:command_buffer().
append(Cb, Data) ->
_pipe = gleam@bit_array:append(erlang:element(2, Cb), Data),
{command_buffer, _pipe}.
-file("src/escpos.gleam", 45).
?DOC(" Writes text to the buffer.\n").
-spec write(escpos@printer:command_buffer(), binary()) -> escpos@printer:command_buffer().
write(Cb, Text) ->
append(Cb, gleam_stdlib:identity(Text)).
-file("src/escpos.gleam", 50).
?DOC(" Writes text to the buffer followed by a newline.\n").
-spec writeln(escpos@printer:command_buffer(), binary()) -> escpos@printer:command_buffer().
writeln(Cb, Text) ->
_pipe = append(Cb, gleam_stdlib:identity(Text)),
append(_pipe, <<10>>).
-file("src/escpos.gleam", 56).
?DOC(" Enables or disables bold text.\n").
-spec bold(escpos@printer:command_buffer(), boolean()) -> escpos@printer:command_buffer().
bold(Cb, B) ->
append(Cb, escpos@protocol:bold(B)).
-file("src/escpos.gleam", 61).
?DOC(" Enables or disables underlined text.\n").
-spec underline(escpos@printer:command_buffer(), boolean()) -> escpos@printer:command_buffer().
underline(Cb, B) ->
append(Cb, escpos@protocol:underline(B)).
-file("src/escpos.gleam", 66).
?DOC(" Enables or disables double-strike text.\n").
-spec double_strike(escpos@printer:command_buffer(), boolean()) -> escpos@printer:command_buffer().
double_strike(Cb, B) ->
append(Cb, escpos@protocol:double_strike(B)).
-file("src/escpos.gleam", 71).
?DOC(" Enables or disables reverse (white on black) text.\n").
-spec reverse(escpos@printer:command_buffer(), boolean()) -> escpos@printer:command_buffer().
reverse(Cb, B) ->
append(Cb, escpos@protocol:reverse(B)).
-file("src/escpos.gleam", 76).
?DOC(" Enables or disables upside-down text.\n").
-spec upside_down(escpos@printer:command_buffer(), boolean()) -> escpos@printer:command_buffer().
upside_down(Cb, B) ->
append(Cb, escpos@protocol:upside_down(B)).
-file("src/escpos.gleam", 81).
?DOC(" Enables or disables character smoothing.\n").
-spec smooth(escpos@printer:command_buffer(), boolean()) -> escpos@printer:command_buffer().
smooth(Cb, B) ->
append(Cb, escpos@protocol:smooth(B)).
-file("src/escpos.gleam", 86).
?DOC(" Enables or disables 180-degree rotation.\n").
-spec flip(escpos@printer:command_buffer(), boolean()) -> escpos@printer:command_buffer().
flip(Cb, B) ->
append(Cb, escpos@protocol:flip(B)).
-file("src/escpos.gleam", 91).
?DOC(" Sets the printer font.\n").
-spec font(escpos@printer:command_buffer(), escpos@protocol:font()) -> escpos@printer:command_buffer().
font(Cb, Font) ->
append(Cb, escpos@protocol:font(Font)).
-file("src/escpos.gleam", 96).
?DOC(" Resets the font to the default (FontA).\n").
-spec reset_font(escpos@printer:command_buffer()) -> escpos@printer:command_buffer().
reset_font(Cb) ->
append(Cb, escpos@protocol:font(font_a)).
-file("src/escpos.gleam", 107).
?DOC(" Sets text size multiplier (1-8 for width and height).\n").
-spec text_size(escpos@printer:command_buffer(), integer(), integer()) -> escpos@printer:command_buffer().
text_size(Cb, Width, Height) ->
append(Cb, escpos@protocol:character_size(Width, Height)).
-file("src/escpos.gleam", 116).
?DOC(" Resets text size to normal (1x1).\n").
-spec reset_text_size(escpos@printer:command_buffer()) -> escpos@printer:command_buffer().
reset_text_size(Cb) ->
append(Cb, escpos@protocol:character_size(1, 1)).
-file("src/escpos.gleam", 121).
?DOC(" Performs a full paper cut.\n").
-spec cut(escpos@printer:command_buffer()) -> escpos@printer:command_buffer().
cut(Cb) ->
append(Cb, escpos@protocol:cut(full)).
-file("src/escpos.gleam", 126).
?DOC(" Performs a partial paper cut, leaving a small portion connected.\n").
-spec partial_cut(escpos@printer:command_buffer()) -> escpos@printer:command_buffer().
partial_cut(Cb) ->
append(Cb, escpos@protocol:cut(partial)).
-file("src/escpos.gleam", 131).
?DOC(" Appends a single newline.\n").
-spec new_line(escpos@printer:command_buffer()) -> escpos@printer:command_buffer().
new_line(Cb) ->
append(Cb, <<10>>).
-file("src/escpos.gleam", 136).
?DOC(" Feeds the specified number of lines.\n").
-spec line_feed(escpos@printer:command_buffer(), integer()) -> escpos@printer:command_buffer().
line_feed(Cb, Lines) ->
append(Cb, escpos@protocol:line_feed(Lines)).
-file("src/escpos.gleam", 141).
?DOC(" Resets the printer to its initial state.\n").
-spec reset(escpos@printer:command_buffer()) -> escpos@printer:command_buffer().
reset(Cb) ->
append(Cb, <<(27), "@"/utf8>>).
-file("src/escpos.gleam", 173).
?DOC(" Appends raw bytes to the buffer.\n").
-spec raw(escpos@printer:command_buffer(), bitstring()) -> escpos@printer:command_buffer().
raw(Cb, Data) ->
append(Cb, Data).
-file("src/escpos.gleam", 189).
-spec is_new_line(escpos@printer:command_buffer()) -> boolean().
is_new_line(Cb) ->
gleam@bool:guard(
erlang:element(2, Cb) =:= <<>>,
true,
fun() ->
case gleam_stdlib:bit_array_slice(
erlang:element(2, Cb),
erlang:byte_size(erlang:element(2, Cb)),
-3
) of
{ok, <<27, "d"/utf8, _>>} ->
true;
{ok, <<_, _, 10>>} ->
true;
_ ->
false
end
end
).
-file("src/escpos.gleam", 182).
-spec ensure_new_line(escpos@printer:command_buffer()) -> escpos@printer:command_buffer().
ensure_new_line(Cb) ->
case is_new_line(Cb) of
true ->
Cb;
false ->
new_line(Cb)
end.
-file("src/escpos.gleam", 101).
?DOC(" Sets text alignment (Left, Center, or Right).\n").
-spec align(escpos@printer:command_buffer(), escpos@protocol:justify()) -> escpos@printer:command_buffer().
align(Cb, Justify) ->
_pipe = ensure_new_line(Cb),
append(_pipe, escpos@protocol:justify(Justify)).
-file("src/escpos.gleam", 158).
?DOC(
" Prints a monochrome image prepared by the `image` module.\n"
"\n"
" ## Example\n"
"\n"
" ```gleam\n"
" let assert Ok(pgm) = simplifile.read_bits(from: \"./lucy.pgm\")\n"
" let assert Ok(img) = image.from_pgm(raw_pgm)\n"
" let img = image.dither_bayer4x4(img, 0)\n"
"\n"
" escpos.new()\n"
" |> escpos.image(img)\n"
" |> printer.print(printer)\n"
" ```\n"
).
-spec image(escpos@printer:command_buffer(), escpos@image:printable_image()) -> escpos@printer:command_buffer().
image(Cb, Image) ->
_pipe = ensure_new_line(Cb),
_pipe@1 = append(
_pipe,
escpos@protocol:image_to_graphics_buffer(
escpos@image:pixels(Image),
escpos@image:width(Image),
escpos@image:height(Image),
monochrome,
scale1x,
scale1x,
color1
)
),
append(_pipe@1, escpos@protocol:print_graphics_buffer()).