Current section
Files
Jump to
Current section
Files
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, image_raster/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() ->
escpos@printer:new_buffer().
-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) ->
escpos@printer:append_to_buffer(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 = escpos@printer:append_to_buffer(Cb, gleam_stdlib:identity(Text)),
escpos@printer:append_to_buffer(_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) ->
escpos@printer:append_to_buffer(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) ->
escpos@printer:append_to_buffer(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) ->
escpos@printer:append_to_buffer(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) ->
escpos@printer:append_to_buffer(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) ->
escpos@printer:append_to_buffer(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) ->
escpos@printer:append_to_buffer(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) ->
escpos@printer:append_to_buffer(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) ->
escpos@printer:append_to_buffer(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) ->
escpos@printer:append_to_buffer(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) ->
escpos@printer:append_to_buffer(
Cb,
escpos@protocol:character_size(Width, Height)
).
-file("src/escpos.gleam", 112).
?DOC(" Resets text size to normal (1x1).\n").
-spec reset_text_size(escpos@printer:command_buffer()) -> escpos@printer:command_buffer().
reset_text_size(Cb) ->
escpos@printer:append_to_buffer(Cb, escpos@protocol:character_size(1, 1)).
-file("src/escpos.gleam", 117).
?DOC(" Performs a full paper cut.\n").
-spec cut(escpos@printer:command_buffer()) -> escpos@printer:command_buffer().
cut(Cb) ->
escpos@printer:append_to_buffer(Cb, escpos@protocol:cut(full)).
-file("src/escpos.gleam", 122).
?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) ->
escpos@printer:append_to_buffer(Cb, escpos@protocol:cut(partial)).
-file("src/escpos.gleam", 127).
?DOC(" Appends a single newline.\n").
-spec new_line(escpos@printer:command_buffer()) -> escpos@printer:command_buffer().
new_line(Cb) ->
escpos@printer:append_to_buffer(Cb, <<10>>).
-file("src/escpos.gleam", 132).
?DOC(" Feeds the specified number of lines.\n").
-spec line_feed(escpos@printer:command_buffer(), integer()) -> escpos@printer:command_buffer().
line_feed(Cb, Lines) ->
escpos@printer:append_to_buffer(Cb, escpos@protocol:line_feed(Lines)).
-file("src/escpos.gleam", 137).
?DOC(" Resets the printer to its initial state.\n").
-spec reset(escpos@printer:command_buffer()) -> escpos@printer:command_buffer().
reset(Cb) ->
escpos@printer:append_to_buffer(Cb, <<(27), "@"/utf8>>).
-file("src/escpos.gleam", 196).
?DOC(" Appends raw bytes to the buffer.\n").
-spec raw(escpos@printer:command_buffer(), bitstring()) -> escpos@printer:command_buffer().
raw(Cb, Data) ->
escpos@printer:append_to_buffer(Cb, Data).
-file("src/escpos.gleam", 207).
-spec is_new_line(escpos@printer:command_buffer()) -> boolean().
is_new_line(Cb) ->
gleam@bool:guard(
escpos@printer:buffer_to_bits(Cb) =:= <<>>,
true,
fun() ->
case gleam_stdlib:bit_array_slice(
escpos@printer:buffer_to_bits(Cb),
erlang:byte_size(escpos@printer:buffer_to_bits(Cb)),
-3
) of
{ok, <<27, "d"/utf8, _>>} ->
true;
{ok, <<_, _, 10>>} ->
true;
_ ->
false
end
end
).
-file("src/escpos.gleam", 200).
-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),
escpos@printer:append_to_buffer(_pipe, escpos@protocol:justify(Justify)).
-file("src/escpos.gleam", 154).
?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 = escpos@printer:append_to_buffer(
_pipe,
escpos@protocol:image_to_graphics_buffer(
escpos@image:pixels(Image),
escpos@image:width(Image),
escpos@image:height(Image),
monochrome,
scale1x,
scale1x,
color1
)
),
escpos@printer:append_to_buffer(
_pipe@1,
escpos@protocol:print_graphics_buffer()
).
-file("src/escpos.gleam", 183).
?DOC(
" Prints a monochrome image prepared by the `image` module. This is using an older\n"
" method to print images, useful for some printers that do not understand graphic buffer\n"
" commands.\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_raster(img)\n"
" |> printer.print(printer)\n"
" ```\n"
).
-spec image_raster(
escpos@printer:command_buffer(),
escpos@image:printable_image()
) -> escpos@printer:command_buffer().
image_raster(Cb, Image) ->
_pipe = ensure_new_line(Cb),
escpos@printer:append_to_buffer(
_pipe,
escpos@protocol:image_to_raster(
escpos@image:width(Image),
escpos@image:height(Image),
escpos@image:pixels(Image)
)
).