emoji-banner-generator 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +160 -0
  3. package/dist/animation.d.ts +14 -0
  4. package/dist/animation.d.ts.map +1 -0
  5. package/dist/animation.js +194 -0
  6. package/dist/animation.js.map +1 -0
  7. package/dist/bitmap.d.ts +25 -0
  8. package/dist/bitmap.d.ts.map +1 -0
  9. package/dist/bitmap.js +141 -0
  10. package/dist/bitmap.js.map +1 -0
  11. package/dist/cli.d.ts +19 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +174 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/clipboard.d.ts +17 -0
  16. package/dist/clipboard.d.ts.map +1 -0
  17. package/dist/clipboard.js +47 -0
  18. package/dist/clipboard.js.map +1 -0
  19. package/dist/emoji.d.ts +25 -0
  20. package/dist/emoji.d.ts.map +1 -0
  21. package/dist/emoji.js +180 -0
  22. package/dist/emoji.js.map +1 -0
  23. package/dist/fonts.d.ts +26 -0
  24. package/dist/fonts.d.ts.map +1 -0
  25. package/dist/fonts.js +551 -0
  26. package/dist/fonts.js.map +1 -0
  27. package/dist/index.d.ts +7 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +108 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/output.d.ts +26 -0
  32. package/dist/output.d.ts.map +1 -0
  33. package/dist/output.js +113 -0
  34. package/dist/output.js.map +1 -0
  35. package/dist/renderer.d.ts +18 -0
  36. package/dist/renderer.d.ts.map +1 -0
  37. package/dist/renderer.js +247 -0
  38. package/dist/renderer.js.map +1 -0
  39. package/dist/slack.d.ts +35 -0
  40. package/dist/slack.d.ts.map +1 -0
  41. package/dist/slack.js +129 -0
  42. package/dist/slack.js.map +1 -0
  43. package/dist/themes.d.ts +31 -0
  44. package/dist/themes.d.ts.map +1 -0
  45. package/dist/themes.js +84 -0
  46. package/dist/themes.js.map +1 -0
  47. package/dist/types.d.ts +113 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +5 -0
  50. package/dist/types.js.map +1 -0
  51. package/package.json +57 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 levyxx
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,160 @@
1
+ # 🎨 Emoji Banner Generator
2
+
3
+ テキストを絵文字バナーアートに変換するCLIツールです。
4
+
5
+ ## ✨ 特徴
6
+
7
+ - 🔥 テキストを絵文字でビットマップ表示
8
+ - 📋 ワンクリックでクリップボードにコピー
9
+ - 💬 Slack Block Kit JSON形式での出力
10
+ - 🎨 GitHubコントリビューショングラフ風テーマ
11
+ - 🌈 複数絵文字でのグラデーション表示
12
+
13
+ ## 📦 インストール
14
+
15
+ ### npxで直接実行(推奨)
16
+
17
+ ```bash
18
+ npx emjtxt "Hello" -e 🔥
19
+ ```
20
+
21
+ ### グローバルインストール
22
+
23
+ ```bash
24
+ npm install -g emjtxt
25
+ emjtxt "Hello" -e 🔥
26
+ ```
27
+
28
+ ## 🚀 使い方
29
+
30
+ ### 基本的な使い方
31
+
32
+ ```bash
33
+ # 直接絵文字を指定
34
+ npx emjtxt "Hello" -e 🔥
35
+
36
+ # 絵文字エイリアスを使用(コロンあり/なし両対応)
37
+ npx emjtxt "World" -e fire
38
+ npx emjtxt "World" -e :fire:
39
+ ```
40
+
41
+ ### 背景絵文字を指定
42
+
43
+ ```bash
44
+ # 背景を黒い四角で埋める
45
+ npx emjtxt "Hello" -e 🔥 -b ⬛
46
+
47
+ # 背景も絵文字エイリアスで指定可能
48
+ npx emjtxt "Hello" -e fire -b black_square
49
+ ```
50
+
51
+ ### クリップボードにコピー
52
+
53
+ ```bash
54
+ # 生成結果をクリップボードにコピー
55
+ npx emjtxt "Copy Me" -e 🎉 --copy
56
+ ```
57
+
58
+ ### 複数の絵文字を使用
59
+
60
+ ```bash
61
+ # カンマ区切りで複数指定
62
+ npx emjtxt "Rainbow" -e "🔴,🟠,🟡,🟢,🔵,🟣"
63
+
64
+ # エイリアスでも可能
65
+ npx emjtxt "Colors" -e "fire,star,gem,heart"
66
+ ```
67
+
68
+ ### 絵文字モード
69
+
70
+ 複数の絵文字を指定した場合の表示モードを選択できます:
71
+
72
+ ```bash
73
+ # ランダム(デフォルト)
74
+ npx emjtxt "Random" -e "🔥,⭐,💎" -m random
75
+
76
+ # 行ごとに絵文字を変更
77
+ npx emjtxt "Rows" -e "🔴,🟠,🟡,🟢" -m row
78
+
79
+ # 列ごとに絵文字を変更
80
+ npx emjtxt "Cols" -e "🔴,🟠,🟡,🟢" -m column
81
+
82
+ # 行方向にグラデーション
83
+ npx emjtxt "Gradient" -e "🔴,🟠,🟡,🟢,🔵" -m row-gradient
84
+
85
+ # 列方向にグラデーション
86
+ npx emjtxt "Gradient" -e "🔴,🟠,🟡,🟢,🔵" -m column-gradient
87
+ ```
88
+
89
+ ### GitHubテーマ
90
+
91
+ ```bash
92
+ # GitHubのコントリビューショングラフ風に表示
93
+ npx emjtxt "GitHub" --theme github
94
+ ```
95
+
96
+ ### ファイルからテキストを読み込み
97
+
98
+ ```bash
99
+ # ファイルの内容をバナーに変換
100
+ npx emjtxt --file ./message.txt -e 📝
101
+ ```
102
+
103
+ ### Slack形式で出力
104
+
105
+ ```bash
106
+ # Slack Block Kit JSON形式で出力
107
+ npx emjtxt "Slack" -e 🎉 --format slack
108
+ ```
109
+
110
+ ## ⚙️ オプション一覧
111
+
112
+ | オプション | 短縮形 | 説明 | デフォルト |
113
+ | -------------- | ------ | ---------------------------------------------------- | ---------- |
114
+ | `--emoji` | `-e` | 使用する絵文字(カンマ区切りで複数可) | 🔥 |
115
+ | `--background` | `-b` | 背景の絵文字 | 空白 |
116
+ | `--file` | `-f` | テキストを読み込むファイルパス | - |
117
+ | `--copy` | `-c` | クリップボードにコピー | false |
118
+ | `--format` | - | 出力形式(text, slack) | text |
119
+ | `--theme` | - | テーマ(default, github) | default |
120
+ | `--mode` | `-m` | 絵文字選択モード | random |
121
+ | `--border` | - | 外枠を付ける(絵文字省略時は背景と同じ絵文字を使用) | - |
122
+ | `--font` | - | 使用するピクセルフォント名 | block |
123
+ | `--help` | `-h` | ヘルプを表示 | - |
124
+ | `--version` | `-V` | バージョンを表示 | - |
125
+
126
+ ## 🎨 絵文字選択モード
127
+
128
+ | モード | 説明 |
129
+ | ----------------- | -------------------------------- |
130
+ | `random` | 各ドットにランダムな絵文字を配置 |
131
+ | `row` | 行ごとに異なる絵文字を使用 |
132
+ | `column` | 列ごとに異なる絵文字を使用 |
133
+ | `row-gradient` | 行方向にグラデーション |
134
+ | `column-gradient` | 列方向にグラデーション |
135
+
136
+ ## 🔧 開発
137
+
138
+ ### 開発環境のセットアップ
139
+
140
+ ```bash
141
+ git clone https://github.com/yourusername/emoji-banner-generator.git
142
+ cd emoji-banner-generator
143
+ npm install
144
+ ```
145
+
146
+ ### 開発モードで実行
147
+
148
+ ```bash
149
+ npm run dev -- "Hello" -e 🔥
150
+ ```
151
+
152
+ ### ビルド
153
+
154
+ ```bash
155
+ npm run build
156
+ ```
157
+
158
+ ## 📄 ライセンス
159
+
160
+ MIT
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Animation module
3
+ * Handles marquee-style scrolling animation in terminal
4
+ */
5
+ import type { AnimationConfig } from './types.js';
6
+ /**
7
+ * Run marquee animation for multi-line banner
8
+ */
9
+ export declare function runAnimation(bannerText: string, config?: Partial<AnimationConfig>): Promise<void>;
10
+ /**
11
+ * Run a single scroll cycle (for testing)
12
+ */
13
+ export declare function runSingleCycle(bannerText: string, config?: Partial<AnimationConfig>): Promise<void>;
14
+ //# sourceMappingURL=animation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation.d.ts","sourceRoot":"","sources":["../src/animation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAmFlD;;GAEG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,GACpC,OAAO,CAAC,IAAI,CAAC,CAkFf;AASD;;GAEG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,GACpC,OAAO,CAAC,IAAI,CAAC,CA+Cf"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Animation module
3
+ * Handles marquee-style scrolling animation in terminal
4
+ */
5
+ // ANSI escape codes for terminal control
6
+ const ANSI = {
7
+ CLEAR_LINE: '\x1b[2K',
8
+ CURSOR_TO_START: '\x1b[0G',
9
+ HIDE_CURSOR: '\x1b[?25l',
10
+ SHOW_CURSOR: '\x1b[?25h',
11
+ MOVE_UP: (n) => `\x1b[${n}A`,
12
+ CLEAR_SCREEN: '\x1b[2J',
13
+ CURSOR_HOME: '\x1b[H',
14
+ };
15
+ /**
16
+ * Default animation configuration
17
+ */
18
+ const DEFAULT_CONFIG = {
19
+ speed: 100, // milliseconds per frame
20
+ terminalWidth: process.stdout.columns || 80,
21
+ };
22
+ /**
23
+ * Get visible width of a string (accounting for emoji width)
24
+ */
25
+ function getVisibleWidth(str) {
26
+ // Emojis typically take 2 character widths
27
+ // This is a simplified calculation
28
+ let width = 0;
29
+ for (const char of str) {
30
+ const code = char.codePointAt(0) || 0;
31
+ // Check if it's likely an emoji (simplified check)
32
+ if (code > 0x1F300) {
33
+ width += 2;
34
+ }
35
+ else {
36
+ width += 1;
37
+ }
38
+ }
39
+ return width;
40
+ }
41
+ /**
42
+ * Pad string to specified visible width
43
+ */
44
+ function padToWidth(str, targetWidth, padChar = ' ') {
45
+ const currentWidth = getVisibleWidth(str);
46
+ if (currentWidth >= targetWidth) {
47
+ return str;
48
+ }
49
+ const padCount = targetWidth - currentWidth;
50
+ return str + padChar.repeat(padCount);
51
+ }
52
+ /**
53
+ * Extract a visible substring with emoji support
54
+ */
55
+ function visibleSubstring(str, start, length) {
56
+ const chars = [...str]; // Properly split including emojis
57
+ let currentPos = 0;
58
+ let result = '';
59
+ let resultWidth = 0;
60
+ for (const char of chars) {
61
+ const charWidth = getVisibleWidth(char);
62
+ // Skip characters before start
63
+ if (currentPos + charWidth <= start) {
64
+ currentPos += charWidth;
65
+ continue;
66
+ }
67
+ // Check if we've collected enough
68
+ if (resultWidth >= length) {
69
+ break;
70
+ }
71
+ result += char;
72
+ resultWidth += charWidth;
73
+ currentPos += charWidth;
74
+ }
75
+ return result;
76
+ }
77
+ /**
78
+ * Run marquee animation for multi-line banner
79
+ */
80
+ export async function runAnimation(bannerText, config = {}) {
81
+ const { speed, terminalWidth } = { ...DEFAULT_CONFIG, ...config };
82
+ const lines = bannerText.split('\n');
83
+ const bannerHeight = lines.length;
84
+ // Get the maximum width of the banner
85
+ const maxBannerWidth = Math.max(...lines.map(getVisibleWidth));
86
+ // Pad all lines to the same width
87
+ const paddedLines = lines.map((line) => padToWidth(line, maxBannerWidth));
88
+ // Total scroll distance (screen width + banner width)
89
+ const totalFrames = terminalWidth + maxBannerWidth;
90
+ // Hide cursor and setup
91
+ process.stdout.write(ANSI.HIDE_CURSOR);
92
+ // Handle cleanup on exit
93
+ const cleanup = () => {
94
+ process.stdout.write(ANSI.SHOW_CURSOR);
95
+ process.stdout.write('\n');
96
+ };
97
+ process.on('SIGINT', () => {
98
+ cleanup();
99
+ process.exit(0);
100
+ });
101
+ process.on('SIGTERM', () => {
102
+ cleanup();
103
+ process.exit(0);
104
+ });
105
+ try {
106
+ let frame = 0;
107
+ // Animation loop
108
+ while (true) {
109
+ // Calculate scroll offset (starts from right, moves left)
110
+ const offset = terminalWidth - frame;
111
+ // Clear and redraw each line
112
+ for (let i = 0; i < bannerHeight; i++) {
113
+ const line = paddedLines[i];
114
+ let displayLine = '';
115
+ if (offset >= 0) {
116
+ // Banner is still entering from the right
117
+ displayLine = ' '.repeat(offset) + visibleSubstring(line, 0, terminalWidth - offset);
118
+ }
119
+ else {
120
+ // Banner is scrolling through
121
+ const startPos = -offset;
122
+ displayLine = visibleSubstring(line, startPos, terminalWidth);
123
+ }
124
+ // Pad to terminal width to clear any leftover characters
125
+ displayLine = padToWidth(displayLine, terminalWidth);
126
+ process.stdout.write(ANSI.CLEAR_LINE + displayLine);
127
+ if (i < bannerHeight - 1) {
128
+ process.stdout.write('\n');
129
+ }
130
+ }
131
+ // Move cursor back to start of banner
132
+ if (bannerHeight > 1) {
133
+ process.stdout.write(ANSI.MOVE_UP(bannerHeight - 1));
134
+ }
135
+ process.stdout.write(ANSI.CURSOR_TO_START);
136
+ // Wait for next frame
137
+ await sleep(speed);
138
+ // Advance frame
139
+ frame = (frame + 1) % totalFrames;
140
+ }
141
+ }
142
+ finally {
143
+ cleanup();
144
+ }
145
+ }
146
+ /**
147
+ * Sleep utility
148
+ */
149
+ function sleep(ms) {
150
+ return new Promise((resolve) => setTimeout(resolve, ms));
151
+ }
152
+ /**
153
+ * Run a single scroll cycle (for testing)
154
+ */
155
+ export async function runSingleCycle(bannerText, config = {}) {
156
+ const { speed, terminalWidth } = { ...DEFAULT_CONFIG, ...config };
157
+ const lines = bannerText.split('\n');
158
+ const maxBannerWidth = Math.max(...lines.map(getVisibleWidth));
159
+ const paddedLines = lines.map((line) => padToWidth(line, maxBannerWidth));
160
+ const totalFrames = terminalWidth + maxBannerWidth;
161
+ const bannerHeight = lines.length;
162
+ process.stdout.write(ANSI.HIDE_CURSOR);
163
+ try {
164
+ for (let frame = 0; frame < totalFrames; frame++) {
165
+ const offset = terminalWidth - frame;
166
+ for (let i = 0; i < bannerHeight; i++) {
167
+ const line = paddedLines[i];
168
+ let displayLine = '';
169
+ if (offset >= 0) {
170
+ displayLine = ' '.repeat(offset) + visibleSubstring(line, 0, terminalWidth - offset);
171
+ }
172
+ else {
173
+ const startPos = -offset;
174
+ displayLine = visibleSubstring(line, startPos, terminalWidth);
175
+ }
176
+ displayLine = padToWidth(displayLine, terminalWidth);
177
+ process.stdout.write(ANSI.CLEAR_LINE + displayLine);
178
+ if (i < bannerHeight - 1) {
179
+ process.stdout.write('\n');
180
+ }
181
+ }
182
+ if (bannerHeight > 1) {
183
+ process.stdout.write(ANSI.MOVE_UP(bannerHeight - 1));
184
+ }
185
+ process.stdout.write(ANSI.CURSOR_TO_START);
186
+ await sleep(speed);
187
+ }
188
+ }
189
+ finally {
190
+ process.stdout.write(ANSI.SHOW_CURSOR);
191
+ process.stdout.write('\n'.repeat(bannerHeight));
192
+ }
193
+ }
194
+ //# sourceMappingURL=animation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation.js","sourceRoot":"","sources":["../src/animation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Bitmap conversion module
3
+ * Converts text to bitmap representation using pixel fonts
4
+ */
5
+ import type { Bitmap } from './types.js';
6
+ /**
7
+ * Convert text to bitmap using built-in pixel font
8
+ */
9
+ export declare function textToBitmap(text: string, fontName?: string): Promise<Bitmap>;
10
+ /**
11
+ * Get available pixel fonts
12
+ */
13
+ export declare function getAvailableFonts(): Promise<string[]>;
14
+ /**
15
+ * Get bitmap dimensions
16
+ */
17
+ export declare function getBitmapDimensions(bitmap: Bitmap): {
18
+ width: number;
19
+ height: number;
20
+ };
21
+ /**
22
+ * Validate bitmap integrity
23
+ */
24
+ export declare function validateBitmap(bitmap: Bitmap): boolean;
25
+ //# sourceMappingURL=bitmap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmap.d.ts","sourceRoot":"","sources":["../src/bitmap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAkHzC;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAA0B,GACnC,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAErD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAQA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAQtD"}
package/dist/bitmap.js ADDED
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Bitmap conversion module
3
+ * Converts text to bitmap representation using pixel fonts
4
+ */
5
+ import { DEFAULT_FONT_NAME, getAvailableFonts as listPixelFonts, getFont, } from './fonts.js';
6
+ const MAX_TEXT_LENGTH = 100;
7
+ /**
8
+ * Clean up bitmap by removing empty rows at start and end
9
+ */
10
+ function trimBitmap(bitmap) {
11
+ if (bitmap.length === 0)
12
+ return bitmap;
13
+ // Find first non-empty row
14
+ let startRow = 0;
15
+ while (startRow < bitmap.length && bitmap[startRow].every((cell) => !cell)) {
16
+ startRow++;
17
+ }
18
+ // Find last non-empty row
19
+ let endRow = bitmap.length - 1;
20
+ while (endRow >= 0 && bitmap[endRow].every((cell) => !cell)) {
21
+ endRow--;
22
+ }
23
+ if (startRow > endRow) {
24
+ return [[]]; // All empty
25
+ }
26
+ return bitmap.slice(startRow, endRow + 1);
27
+ }
28
+ /**
29
+ * Get the pixel pattern for a character, with fallbacks.
30
+ */
31
+ function getCharacterPattern(char, font) {
32
+ if (font.map[char]) {
33
+ return font.map[char];
34
+ }
35
+ const upper = char.toUpperCase();
36
+ if (font.map[upper]) {
37
+ return font.map[upper];
38
+ }
39
+ return font.map['?'] || font.map[' '] || [];
40
+ }
41
+ /**
42
+ * Render a single line of text to bitmap rows.
43
+ */
44
+ function renderLineToBitmap(line, font) {
45
+ const rows = Array.from({ length: font.height }, () => []);
46
+ const characters = Array.from(line);
47
+ if (characters.length === 0) {
48
+ return rows;
49
+ }
50
+ characters.forEach((char, charIndex) => {
51
+ const pattern = getCharacterPattern(char, font);
52
+ const width = pattern.reduce((max, row) => Math.max(max, row.length), 0);
53
+ for (let rowIndex = 0; rowIndex < font.height; rowIndex++) {
54
+ const rowPattern = pattern[rowIndex] || '';
55
+ for (let colIndex = 0; colIndex < width; colIndex++) {
56
+ rows[rowIndex].push(rowPattern[colIndex] === '#');
57
+ }
58
+ if (charIndex < characters.length - 1) {
59
+ for (let space = 0; space < font.letterSpacing; space++) {
60
+ rows[rowIndex].push(false);
61
+ }
62
+ }
63
+ }
64
+ });
65
+ return rows;
66
+ }
67
+ /**
68
+ * Merge multiple line bitmaps into a single bitmap with line spacing.
69
+ */
70
+ function mergeLines(lineBitmaps, lineSpacing) {
71
+ if (lineBitmaps.length === 0)
72
+ return [[]];
73
+ const width = Math.max(...lineBitmaps.map((line) => line[0]?.length ?? 0));
74
+ const merged = [];
75
+ lineBitmaps.forEach((lineBitmap, index) => {
76
+ for (let row = 0; row < lineBitmap.length; row++) {
77
+ const rowData = lineBitmap[row] || [];
78
+ const paddedRow = rowData.slice();
79
+ while (paddedRow.length < width) {
80
+ paddedRow.push(false);
81
+ }
82
+ merged.push(paddedRow);
83
+ }
84
+ if (index < lineBitmaps.length - 1 && lineSpacing > 0) {
85
+ for (let i = 0; i < lineSpacing; i++) {
86
+ merged.push(new Array(width).fill(false));
87
+ }
88
+ }
89
+ });
90
+ return trimBitmap(merged);
91
+ }
92
+ /**
93
+ * Convert text to bitmap using built-in pixel font
94
+ */
95
+ export async function textToBitmap(text, fontName = DEFAULT_FONT_NAME) {
96
+ // Validate input
97
+ if (!text || typeof text !== 'string') {
98
+ throw new Error('Text input is required');
99
+ }
100
+ // Sanitize input - remove control characters
101
+ const sanitizedText = text.replace(/[\x00-\x1F\x7F]/g, '');
102
+ if (sanitizedText.length === 0) {
103
+ throw new Error('Text input is empty after sanitization');
104
+ }
105
+ // Limit text length for security
106
+ const truncatedText = sanitizedText.slice(0, MAX_TEXT_LENGTH);
107
+ const font = getFont(fontName);
108
+ const lines = truncatedText.split('\n');
109
+ const lineBitmaps = lines.map((line) => renderLineToBitmap(line, font));
110
+ return mergeLines(lineBitmaps, font.lineSpacing);
111
+ }
112
+ /**
113
+ * Get available pixel fonts
114
+ */
115
+ export function getAvailableFonts() {
116
+ return Promise.resolve(listPixelFonts());
117
+ }
118
+ /**
119
+ * Get bitmap dimensions
120
+ */
121
+ export function getBitmapDimensions(bitmap) {
122
+ if (bitmap.length === 0) {
123
+ return { width: 0, height: 0 };
124
+ }
125
+ return {
126
+ width: bitmap[0].length,
127
+ height: bitmap.length,
128
+ };
129
+ }
130
+ /**
131
+ * Validate bitmap integrity
132
+ */
133
+ export function validateBitmap(bitmap) {
134
+ if (!Array.isArray(bitmap))
135
+ return false;
136
+ if (bitmap.length === 0)
137
+ return true;
138
+ const width = bitmap[0].length;
139
+ return bitmap.every((row) => Array.isArray(row) && row.length === width);
140
+ }
141
+ //# sourceMappingURL=bitmap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitmap.js","sourceRoot":"","sources":["../src/bitmap.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * CLI module
3
+ * Handles command line argument parsing
4
+ */
5
+ import { Command } from 'commander';
6
+ import type { CLIOptions } from './types.js';
7
+ /**
8
+ * Create and configure the CLI program
9
+ */
10
+ export declare function createCLI(): Command;
11
+ /**
12
+ * Parse and validate CLI options
13
+ */
14
+ export declare function parseCLIOptions(program: Command): Promise<CLIOptions>;
15
+ /**
16
+ * Validate that required options are provided
17
+ */
18
+ export declare function validateOptions(options: CLIOptions): void;
19
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAE,UAAU,EAAkC,MAAM,YAAY,CAAC;AAwB7E;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CA4DnC;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAgD3E;AAgDD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAkBzD"}