PluginProbe
WCPOS – Point of Sale (POS) plugin for WooCommerce / 1.10.21
WCPOS – Point of Sale (POS) plugin for WooCommerce v1.10.21
1.10.25 1.10.24 1.10.23 1.10.22 1.10.21 1.10.20 1.10.19 1.10.18 1.10.17 1.10.16 1.10.15 1.10.13 1.10.14 1.10.12 1.10.11 1.10.10 1.10.9 1.10.8 untagged-3d9b7ccddc54df87c672 1.10.7 1.10.6 1.10.5 1.10.3 1.10.4 1.10.2 All 169 releases
← All changes | includes/Templates/Thermal/Thermal_Text_Layout.php +100 -9 1.10.12 → 1.10.21 View file →
@@ -15,15 +15,10 @@
15 15 * FULLWIDTH YEN as one cell while the others measured two, and two copies of the
16 16 * no-mbstring fallback called mb_convert_encoding() — itself an mbstring
17 17 * function — so a host without the extension took a fatal.
18 18 *
19 - * Deliberately stateless and static rather than a trait. Four private copies that
20 - * *looked* locally defined are how the drift happened in the first place;
21 - * `display_width()` called on `$this` is indistinguishable from a method the
22 - * emitter owns, whereas `Thermal_Text_Layout::display_width()` names its source
23 - * at every call.
24 - * Being static also keeps `columns` an argument instead of an implicit property
25 - * contract, and lets the layout be exercised on its own.
19 + * A per-lane instance owns the paper columns and nested applied magnification.
20 + * The existing static primitives remain available to raster and other emitters.
26 21 *
27 22 * Text emission itself stays with each emitter: only the measuring moved.
28 23 *
29 24 * @author Paul Kilmurray <[email protected]>
@@ -39,11 +34,107 @@
39 34 */
40 35 final class Thermal_Text_Layout {
41 36
42 37 /**
43 - * Not instantiable: every member is a pure static function.
38 + * Paper width in character columns.
39 + *
40 + * @var int
44 41 */
45 - private function __construct() {}
42 + private $columns;
43 +
44 + /**
45 + * Command-specific magnification ceiling (8 for ESC/POS, 6 for StarPRNT).
46 + *
47 + * @var int
48 + */
49 + private $max_magnification;
50 +
51 + /**
52 + * Applied sizes; the base entry is normal size.
53 + *
54 + * @var array
55 + */
56 + private $sizes = array(
57 + array(
58 + 'width' => 1,
59 + 'height' => 1,
60 + ),
61 + );
62 +
63 + /**
64 + * Construct per-lane metrics.
65 + *
66 + * @param int $columns Paper width in character columns.
67 + * @param int $max_magnification Largest multiplier the lane can encode.
68 + */
69 + public function __construct( int $columns, int $max_magnification ) {
70 + $this->columns = $columns;
71 + $this->max_magnification = $max_magnification;
72 + }
73 +
74 + /**
75 + * Return the paper width in character columns.
76 + *
77 + * @return int
78 + */
79 + public function columns(): int {
80 + return $this->columns;
81 + }
82 +
83 + /**
84 + * Enter a size wrapper, replacing (not multiplying) the parent scale.
85 + *
86 + * @param int $width Requested width multiplier.
87 + * @param int $height Requested height multiplier.
88 + * @return void
89 + */
90 + public function enter_size( int $width, int $height ): void {
91 + $this->sizes[] = array(
92 + 'width' => max( 1, min( $this->max_magnification, $width ) ),
93 + 'height' => max( 1, min( $this->max_magnification, $height ) ),
94 + );
95 + }
96 +
97 + /**
98 + * Leave a size wrapper and restore its parent.
99 + *
100 + * @return void
101 + */
102 + public function leave_size(): void {
103 + if ( count( $this->sizes ) > 1 ) {
104 + array_pop( $this->sizes );
105 + }
106 + }
107 +
108 + /**
109 + * Return the magnification actually encoded by the lane.
110 + *
111 + * @return array{width: int, height: int}
112 + */
113 + public function applied_scale(): array {
114 + return $this->sizes[ count( $this->sizes ) - 1 ];
115 + }
116 +
117 + /**
118 + * Count leading spaces using printed columns and the applied width scale.
119 + *
120 + * @param string $align Alignment mode (left|center|right).
121 + * @param string $text Normalized plain text.
122 + * @return int Number of literal spaces, each occupying the applied width.
123 + */
124 + public function measure_padding( string $align, string $text ): int {
125 + return self::alignment_padding( $align, self::display_width( $text ), $this->columns, $this->applied_scale()['width'] );
126 + }
127 +
128 + /**
129 + * Resolve row widths using the existing unscaled paper-column contract.
130 + *
131 + * @param array $cols Column AST nodes.
132 + * @return array
133 + */
134 + public function measure_row_widths( array $cols ): array {
135 + return self::resolve_row_widths( $cols, $this->columns );
136 + }
46 137
47 138 /**
48 139 * Normalize text by replacing non-ASCII typographic characters.
49 140 *