🖨️ esc/pos implementation in gleam

feat: handle upside down as updside down

okkdev 265fa379 dc1231a4

Changed files
+124 -59
src
test
+31 -1
src/escpos/document.gleam
··· 66 66 } 67 67 68 68 pub fn build(document: List(Command)) -> CommandBuffer { 69 - build_ast(document) 69 + upside_down_pass(document) 70 + |> build_ast 70 71 |> compile_ast 71 72 |> CommandBuffer 72 73 } ··· 121 122 122 123 pub fn font(f: protocol.Font) -> Modifier { 123 124 Font(f) 125 + } 126 + 127 + @internal 128 + pub fn upside_down_pass(commands: List(Command)) -> List(Command) { 129 + do_upside_down_pass(commands, []) 130 + |> list.reverse 131 + } 132 + 133 + fn do_upside_down_pass( 134 + commands: List(Command), 135 + acc: List(Command), 136 + ) -> List(Command) { 137 + case commands { 138 + [] -> acc 139 + [cmd, ..rest] -> { 140 + case cmd { 141 + Styled(mods, cmds) -> { 142 + let styled_acc = 143 + case set.contains(mods, UpsideDown) { 144 + True -> do_upside_down_pass(list.reverse(cmds), []) 145 + False -> do_upside_down_pass(cmds, []) 146 + } 147 + |> list.reverse 148 + do_upside_down_pass(rest, [Styled(mods, styled_acc), ..acc]) 149 + } 150 + _ -> do_upside_down_pass(rest, [cmd, ..acc]) 151 + } 152 + } 153 + } 124 154 } 125 155 126 156 fn build_ast(commands: List(Command)) -> List(AST) {
+93 -58
test/escpos_test.gleam
··· 1 1 import escpos 2 + import escpos/document 2 3 import escpos/printer 3 4 import escpos/protocol 4 5 import gleeunit ··· 11 12 printer.connect("localhost", 9100) 12 13 } 13 14 14 - fn test_print( 15 - printer: printer.Printer, 16 - name: String, 17 - commands: fn(escpos.CommandBuffer) -> escpos.CommandBuffer, 18 - ) { 19 - escpos.new() 20 - |> escpos.writeln("----- " <> name) 21 - |> commands 22 - |> escpos.new_line 23 - |> printer.print(printer) 15 + pub fn upside_down_test() { 16 + let input = [ 17 + document.write("Hello, World!"), 18 + document.styled([document.upside_down()], [ 19 + document.write("Hello"), 20 + document.write("Australia!"), 21 + document.styled([document.bold()], [ 22 + document.write("Hello"), 23 + document.write("Joe!"), 24 + document.styled([document.upside_down()], [ 25 + document.write("Hello"), 26 + document.write("New Zealand!"), 27 + ]), 28 + ]), 29 + ]), 30 + ] 31 + let result = [ 32 + document.write("Hello, World!"), 33 + document.styled([document.upside_down()], [ 34 + document.styled([document.bold()], [ 35 + document.write("Hello"), 36 + document.write("Joe!"), 37 + document.styled([document.upside_down()], [ 38 + document.write("New Zealand!"), 39 + document.write("Hello"), 40 + ]), 41 + ]), 42 + document.write("Australia!"), 43 + document.write("Hello"), 44 + ]), 45 + ] 46 + assert document.upside_down_pass(input) == result 24 47 } 25 48 26 - pub fn print_test() { 27 - let assert Ok(printer) = setup_printer() 28 - 29 - let assert Ok(Nil) = 30 - test_print(printer, "writeln", escpos.write(_, "Hello, World!")) 31 - 32 - let assert Ok(Nil) = 33 - test_print(printer, "font B", fn(b) { 34 - escpos.set_font(b, protocol.FontB) 35 - |> escpos.write("Hello, World!") 36 - |> escpos.reset_font 37 - }) 38 - 39 - let assert Ok(Nil) = 40 - test_print(printer, "font C", fn(b) { 41 - escpos.set_font(b, protocol.FontC) 42 - |> escpos.write("Hello, World!") 43 - |> escpos.reset_font 44 - }) 45 - 46 - let assert Ok(Nil) = 47 - test_print(printer, "high text size", fn(b) { 48 - escpos.set_text_size(b, 1, 8) 49 - |> escpos.write("Hello, World!") 50 - |> escpos.reset_text_size 51 - }) 52 - 53 - let assert Ok(Nil) = 54 - test_print(printer, "wide text size", fn(b) { 55 - escpos.set_text_size(b, 8, 1) 56 - |> escpos.write("Hello, World!") 57 - |> escpos.reset_text_size 58 - }) 59 - 60 - let assert Ok(Nil) = 61 - test_print(printer, "large text size", fn(b) { 62 - escpos.set_text_size(b, 3, 3) 63 - |> escpos.write("Hello, World!") 64 - |> escpos.reset_text_size 65 - }) 66 - 67 - let assert Ok(Nil) = 68 - test_print(printer, "line feed 5", escpos.line_feed(_, 1)) 69 - 70 - let assert Ok(Nil) = test_print(printer, "partial cut", escpos.partial_cut) 71 - 72 - printer.disconnect(printer) 73 - } 49 + // fn test_print( 50 + // printer: printer.Printer, 51 + // name: String, 52 + // commands: fn(printer.CommandBuffer) -> escpos.CommandBuffer, 53 + // ) { 54 + // escpos.new() 55 + // |> escpos.writeln("----- " <> name) 56 + // |> commands 57 + // |> escpos.new_line 58 + // |> printer.print(printer) 59 + // } 60 + // 61 + // pub fn print_test() { 62 + // let assert Ok(printer) = setup_printer() 63 + // 64 + // let assert Ok(Nil) = 65 + // test_print(printer, "writeln", escpos.write(_, "Hello, World!")) 66 + // 67 + // let assert Ok(Nil) = 68 + // test_print(printer, "font B", fn(b) { 69 + // escpos.set_font(b, protocol.FontB) 70 + // |> escpos.write("Hello, World!") 71 + // |> escpos.reset_font 72 + // }) 73 + // 74 + // let assert Ok(Nil) = 75 + // test_print(printer, "font C", fn(b) { 76 + // escpos.set_font(b, protocol.FontC) 77 + // |> escpos.write("Hello, World!") 78 + // |> escpos.reset_font 79 + // }) 80 + // 81 + // let assert Ok(Nil) = 82 + // test_print(printer, "high text size", fn(b) { 83 + // escpos.set_text_size(b, 1, 8) 84 + // |> escpos.write("Hello, World!") 85 + // |> escpos.reset_text_size 86 + // }) 87 + // 88 + // let assert Ok(Nil) = 89 + // test_print(printer, "wide text size", fn(b) { 90 + // escpos.set_text_size(b, 8, 1) 91 + // |> escpos.write("Hello, World!") 92 + // |> escpos.reset_text_size 93 + // }) 94 + // 95 + // let assert Ok(Nil) = 96 + // test_print(printer, "large text size", fn(b) { 97 + // escpos.set_text_size(b, 3, 3) 98 + // |> escpos.write("Hello, World!") 99 + // |> escpos.reset_text_size 100 + // }) 101 + // 102 + // let assert Ok(Nil) = 103 + // test_print(printer, "line feed 5", escpos.line_feed(_, 1)) 104 + // 105 + // let assert Ok(Nil) = test_print(printer, "partial cut", escpos.partial_cut) 106 + // 107 + // printer.disconnect(printer) 108 + // } 74 109 75 110 pub fn protocol_character_size_test() { 76 111 assert protocol.character_size(2, 2) == <<29, "!", 0:1, 1:3, 0:1, 1:3>>