-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) ) ).