From eafea9f72886d3bbbd88f45966a656e613d36da8 Mon Sep 17 00:00:00 2001 From: Roman Priesol Date: Sun, 13 Sep 2026 12:16:09 +0200 Subject: [PATCH] Add visual separators: inverted banner sections on receipts, dividers in navbar ReceiptBuilder#invert (GS B) + #section_separator give the test page (and future receipts) a full-width white-on-black banner between sections -- the closest a direct-thermal printer gets to a second color. Navbar gets a vr divider between Home | Brother/Shipping labels/Receipts | Labels to group the three logical clusters. --- app.rb | 23 +++++++++-------------- lib/receipt_builder.rb | 13 +++++++++++++ views/_navbar.erb | 2 ++ 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/app.rb b/app.rb index 5f0de52..e9ab491 100644 --- a/app.rb +++ b/app.rb @@ -132,31 +132,26 @@ helpers do def print_epson_test_page receipt = ReceiptBuilder.new receipt.align(:center).bold.size(:big).text("TM-T20II TEST\n").size(:normal).bold(false) - receipt.align(:left).text(('-' * 48) + "\n") + receipt.align(:left).section_separator('TEXT STYLES') receipt.text("Normal text\n") receipt.bold.text("Bold text\n").bold(false) receipt.underline.text("Underlined text\n").underline(false) receipt.size(:wide).text("Double width\n").size(:normal) receipt.size(:high).text("Double height\n").size(:normal) receipt.size(:big).text("Double both\n").size(:normal) - receipt.text(('-' * 48) + "\n") - receipt.align(:center) - receipt.text("EAN-13 barcode:\n") - receipt.ean13('2012345678902') - receipt.feed(1) + receipt.section_separator('BARCODE') + receipt.align(:center).ean13('2012345678902') - receipt.text("QR code:\n") - receipt.qr('https://git.priesol.net/randy/home-gitops') - receipt.feed(1) + receipt.section_separator('QR CODE') + receipt.align(:center).qr('https://git.priesol.net/randy/home-gitops') - receipt.text("Raster image:\n") - receipt.image(64, 64, checkerboard_bitmap) - receipt.feed(1) + receipt.section_separator('IMAGE') + receipt.align(:center).image(64, 64, checkerboard_bitmap) - receipt.align(:left).text(('-' * 48) + "\n") - receipt.text("Printed: #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}\n") + receipt.section_separator + receipt.align(:left).text("Printed: #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}\n") receipt.feed(3).cut receipt.print!(PRINTER_DEVICE_EPSON) end diff --git a/lib/receipt_builder.rb b/lib/receipt_builder.rb index 9e14db8..f7cc890 100644 --- a/lib/receipt_builder.rb +++ b/lib/receipt_builder.rb @@ -65,6 +65,19 @@ class ReceiptBuilder self end + # White-on-black reverse video (GS B n) -- the closest this direct-thermal + # printer gets to a second "color" for a separator/banner. + def invert(enable = true) + @buffer << (enable ? "\x1D\x42\x01" : "\x1D\x42\x00") + self + end + + # A full-width inverted banner line, e.g. section_separator("SECTION"). + def section_separator(label = '', width: 48) + padded = label.empty? ? (' ' * width) : " #{label} ".center(width) + feed(1).invert.text(padded[0, width]).invert(false).feed(1) + end + def size(mode) @buffer << case mode when :big then TXT_BIG diff --git a/views/_navbar.erb b/views/_navbar.erb index fcd90e7..cdedab2 100644 --- a/views/_navbar.erb +++ b/views/_navbar.erb @@ -9,6 +9,7 @@ + @@ -18,6 +19,7 @@ +