xw-devtool-cli 1.0.5 → 1.0.7

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.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  一个基于 Node.js 的开发者命令行工具箱,旨在提供开箱即用的常用开发工具,帮助开发者快速处理日常任务。
4
4
 
5
- 主要功能包括:Base64 编解码、图片格式转换、图片与 Base64 互转、Mock 数据生成、时间戳/日期格式化、URL 编解码、UUID 生成、汉字转拼音等。所有结果均自动复制到剪贴板,极大提升开发效率。
5
+ 主要功能包括:Base64 编解码、图片格式转换、图片与 Base64 互转、Mock 数据生成、时间戳/日期格式化、URL 编解码、UUID 生成、汉字转拼音、颜色转换、变量格式转换、哈希计算、二维码生成、特殊符号大全等。所有结果均自动复制到剪贴板,极大提升开发效率。
6
6
 
7
7
  ## ✨ 功能特性
8
8
 
@@ -16,13 +16,20 @@
16
16
  - **时间工具**:
17
17
  - **时间格式化**:时间戳/日期字符串 -> `YYYY-MM-DD HH:mm:ss`。
18
18
  - **获取时间戳**:快速获取当前毫秒级时间戳。
19
- - **其他工具**:
19
+ - **开发辅助工具**:
20
20
  - **URL 编解码**:Encode/Decode URL。
21
21
  - **UUID**:生成 UUID v4。
22
22
  - **中文转拼音**:将汉字转换为不带声调的拼音。
23
+ - **颜色转换**:Hex <-> RGB 互转。
24
+ - **变量格式转换**:支持 CamelCase, PascalCase, SnakeCase, KebabCase, ConstantCase 互转。
25
+ - **哈希计算**:支持 MD5, SHA1, SHA256, SHA512, SM3 算法。
26
+ - **二维码生成**:终端直接显示二维码,支持保存为 PNG 图片(带时间戳文件名)。
27
+ - **特殊符号大全**:包含常用符号、箭头、数学符号、货币、希腊字母等 170+ 个符号,支持一键复制。
28
+ - **Emoji 输入**:支持分类查看和选择常用 Emoji,一键复制到剪贴板。
23
29
  - **便捷操作**:
24
30
  - 支持文件选择对话框 (Windows)。
25
31
  - 结果自动复制到剪贴板。
32
+ - 支持从剪贴板自动读取输入(部分工具支持直接回车读取)。
26
33
  - 支持将大文本结果保存为文件。
27
34
 
28
35
  ## 📦 安装
@@ -31,7 +38,7 @@
31
38
  ```bash
32
39
  npm install -g xw-devtool-cli
33
40
  ```
34
- 安装后即可在终端直接使用 `xw-devtool` 命令。
41
+ 安装后即可在终端直接使用 `xw-devtool` 或 `xw-dev` 命令。
35
42
 
36
43
  ### 免安装运行 (npx)
37
44
  ```bash
@@ -45,20 +52,28 @@ npx xw-devtool-cli@latest
45
52
  xw-devtool
46
53
  ```
47
54
 
48
- 启动后将显示交互式菜单,通过键盘方向键或输入数字选择功能:
55
+ 启动后将显示交互式菜单,通过键盘输入对应的数字或字母选择功能:
49
56
 
50
57
  ```text
51
- ? Select a tool: (Use arrow keys)
52
- > 1. URL Encode/Decode
53
- 2. String Encode/Decode (Base64)
54
- 3. Image <-> Base64
55
- 4. Image Format Convert
56
- 5. Time Format
57
- 6. Get Current Timestamp
58
- 7. Mock Text
59
- 8. Get UUID
60
- 9. Chinese to Pinyin
61
- 0. Exit
58
+ =================================
59
+ xw-devtool-cli Menu
60
+ =================================
61
+ 1. URL Encode/Decode
62
+ 2. String Encode/Decode (Base64)
63
+ 3. Image <-> Base64
64
+ 4. Image Format Convert
65
+ 5. Time Format / Timestamp
66
+ 6. Mock Text
67
+ 7. Get UUID
68
+ 8. Chinese to Pinyin
69
+ 9. Color Converter (Hex <-> RGB)
70
+ a. Variable Format Converter
71
+ b. Hash Calculator (MD5/SHA/SM3)
72
+ c. QR Code Generator
73
+ d. Special Characters (Symbols)
74
+ e. Emoji Picker
75
+ 0. Exit
76
+ =================================
62
77
  ```
63
78
 
64
79
  ## 📖 详细使用指南
@@ -92,31 +107,57 @@ xw-devtool
92
107
  - 设置压缩参数(如 JPG 质量 1-100,PNG 压缩等级 0-9)。
93
108
  - 生成的新图片将保存在源文件同级目录。
94
109
 
95
- ### 5. Mock 数据生成
110
+ ### 5. 时间格式化 (Time Format)
111
+ - 选择 `5` 进入。
112
+ - 支持时间戳转日期字符串,或日期字符串转时间戳。
113
+ - 直接回车可获取当前时间戳。
114
+
115
+ ### 6. Mock 数据生成
116
+ - 选择 `6` 进入。
117
+ - 提供多种数据类型:英文段落、中文字符、身份证号、邮箱、手机号等。
118
+ - 支持指定生成数量。
119
+
120
+ ### 7. UUID 生成
96
121
  - 选择 `7` 进入。
97
- - 提供多种数据类型:
98
- - **英文段落**: 生成 Lorem Ipsum 文本。
99
- - **中文字符**: 生成随机常用汉字。
100
- - **身份证号**: 生成符合规则的虚拟身份证号 (包含校验位)。
101
- - **邮箱**: 生成随机电子邮箱地址。
102
- - **URL**: 生成随机网址。
103
- - **订单号**: 生成基于时间戳的模拟订单号。
104
- - **手机号**: 生成常见号段的手机号。
105
- - **座机号**: 生成带区号的座机号码。
106
- - 支持指定生成数量(批量生成)。
107
-
108
- ### 6. 时间工具
109
- - **时间格式化 (5)**: 输入时间戳(秒/毫秒)或日期字符串,输出标准化格式。留空直接回车则使用当前时间。
110
- - **当前时间戳 (6)**: 快速获取当前毫秒时间戳。
111
-
112
- ### 7. 其他
113
- - **UUID (8)**: 生成一个 UUID v4。
114
- - **中文转拼音 (9)**: 输入中文文本,输出拼音字符串(空格分隔)。
115
-
116
- ## 💻 系统要求
117
- - Node.js >= 18.0.0
118
- - Windows 用户可享受原生文件选择/保存对话框体验。
119
- - macOS/Linux 用户支持完整功能,但文件路径需手动输入。
122
+ - 自动生成一个 UUID v4 并复制到剪贴板。
123
+
124
+ ### 8. 中文转拼音
125
+ - 选择 `8` 进入。
126
+ - 输入中文字符串(支持直接回车读取剪贴板)。
127
+ - 输出对应的拼音(无声调)。
128
+
129
+ ### 9. 颜色转换 (Hex <-> RGB)
130
+ - 选择 `9` 进入。
131
+ - 输入 Hex 颜色值 (如 #333) 或 RGB 值 (如 rgb(51,51,51))。
132
+ - 自动转换并显示对应格式。
133
+
134
+ ### 10. 变量格式转换
135
+ - 选择 `a` 进入。
136
+ - 输入变量名(支持直接回车读取剪贴板)。
137
+ - 自动展示 CamelCase, PascalCase, SnakeCase, KebabCase, ConstantCase 五种格式。
138
+ - 选择一种格式自动复制。
139
+
140
+ ### 11. 哈希计算 (Encryption)
141
+ - 选择 `b` 进入。
142
+ - 输入文本(支持直接回车读取剪贴板)。
143
+ - 同时计算并显示 MD5, SHA1, SHA256, SHA512, SM3 哈希值。
144
+
145
+ ### 12. 二维码生成
146
+ - 选择 `c` 进入。
147
+ - 输入文本或 URL(支持直接回车读取剪贴板)。
148
+ - 终端直接显示二维码预览。
149
+ - 可选保存为 PNG 图片,默认文件名包含时间戳。
150
+
151
+ ### 13. 特殊符号大全
152
+ - 选择 `d` 进入。
153
+ - 网格化展示常用特殊符号。
154
+ - 输入符号对应的编号即可一键复制。
155
+
156
+ ### 14. Emoji 输入
157
+ - 选择 `e` 进入。
158
+ - 分类展示常用 Emoji (表情、手势、动物、食物等)。
159
+ - 输入编号选择并复制 Emoji 到剪贴板。
120
160
 
121
161
  ## 📄 License
162
+
122
163
  ISC
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xw-devtool-cli",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "type": "module",
5
5
  "description": "基于node的开发者助手cli",
6
6
  "main": "index.js",
@@ -0,0 +1,114 @@
1
+ import inquirer from 'inquirer';
2
+ import { copy } from '../utils/clipboard.js';
3
+
4
+ const categories = {
5
+ 'Smileys & Emotion': [
6
+ '😀', '😃', '😄', '😁', '😆', '😅', '😂', '🤣', '😊', '😇', '🙂', '🙃', '😉', '😌', '😍', '🥰', '😘', '😗', '😙', '😚', '😋', '😛', '😝', '😜', '🤪', '🤨', '🧐', '🤓', '😎', '🤩', '🥳', '😏', '😒', '😞', '😔', '😟', '😕', '🙁', '☹️', '😣', '😖', '😫', '😩', '🥺', '😢', '😭', '😤', '😠', '😡', '🤬', '🤯', '😳', '🥵', '🥶', '😱', '😨', '😰', '😥', '😓', '🤗', '🤔', '🤭', '🤫', '🤥', '😶', '😐', '😑', '😬', '🙄', '😯', '😦', '😧', '😮', '😲', '🥱', '😴', '🤤', '😪', '😵', '🤐', '🥴', '🤢', '🤮', '🤧', '😷', '🤒', '🤕', '🤑', '🤠', '😈', '👿', '👹', '👺', '🤡', '💩', '👻', '💀', '☠️', '👽', '👾', '🤖', '🎃', '😺', '😸', '😹', '😻', '😼', '😽', '🙀', '😿', '😾'
7
+ ],
8
+ 'Hand Signs': [
9
+ '👋', '🤚', '🖐', '✋', '🖖', '👌', '🤏', '✌️', '🤞', '🤟', '🤘', '🤙', '👈', '👉', '👆', '🖕', '👇', '☝️', '👍', '👎', '✊', '👊', '🤛', '🤜', '👏', '🙌', '👐', '🤲', '🤝', '🙏', '💅', '🤳', '💪'
10
+ ],
11
+ 'People & Body': [
12
+ '👶', '👧', '🧒', '👦', '👩', '🧑', '👨', '👵', '🧓', '👴', '👲', '👳‍♀️', '👳‍♂️', '🧕', '👮‍♀️', '👮‍♂️', '👷‍♀️', '👷‍♂️', '💂‍♀️', '💂‍♂️', '🕵️‍♀️', '🕵️‍♂️', '👩‍⚕️', '👨‍⚕️', '👩‍🌾', '👨‍🌾', '👩‍🍳', '👨‍🍳', '👩‍🎓', '👨‍🎓', '👩‍🎤', '👨‍🎤', '👩‍🏫', '👨‍🏫', '👩‍🏭', '👨‍🏭', '👩‍💻', '👨‍💻', '👩‍💼', '👨‍💼', '👩‍🔧', '👨‍🔧', '👩‍🔬', '👨‍🔬', '👩‍🎨', '👨‍🎨', '👩‍🚒', '👨‍🚒', '👩‍✈️', '👨‍✈️', '👩‍🚀', '👨‍🚀', '👩‍⚖️', '👨‍⚖️', '👰', '🤵', '👸', '🤴', '🦸‍♀️', '🦸‍♂️', '🦹‍♀️', '🦹‍♂️', '🤶', '🎅', '🧙‍♀️', '🧙‍♂️', '🧝‍♀️', '🧝‍♂️', '🧛‍♀️', '🧛‍♂️', '🧟‍♀️', '🧟‍♂️', '🧞‍♀️', '🧞‍♂️', '🧜‍♀️', '🧜‍♂️', '🧚‍♀️', '🧚‍♂️', '👼', '🤰', '🤱', '🙇‍♀️', '🙇‍♂️', '💁‍♀️', '💁‍♂️', '🙅‍♀️', '🙅‍♂️', '🙆‍♀️', '🙆‍♂️', '🙋‍♀️', '🙋‍♂️', '🤦‍♀️', '🤦‍♂️', '🤷‍♀️', '🤷‍♂️', '🙎‍♀️', '🙎‍♂️', '🙍‍♀️', '🙍‍♂️', '💇‍♀️', '💇‍♂️', '💆‍♀️', '💆‍♂️', '🧖‍♀️', '🧖‍♂️', '💃', '🕺', '👯‍♀️', '👯‍♂️', '🕴', '🚶‍♀️', '🚶‍♂️', '🏃‍♀️', '🏃‍♂️'
13
+ ],
14
+ 'Animals & Nature': [
15
+ '🐶', '🐱', '🐭', '🐹', '🐰', '🦊', '🐻', '🐼', '🐨', '🐯', '🦁', '🐮', '🐷', '🐽', '🐸', '🐵', '🙈', '🙉', '🙊', '🐒', '🐔', '🐧', '🐦', '🐤', '🐣', '🐥', '🦆', '🦅', '🦉', '🦇', '🐺', '🐗', '🐴', '🦄', '🐝', '🐛', '🦋', '🐌', '🐞', '🐜', '🦟', '🦗', '🕷', '🕸', '🦂', '🐢', '🐍', '🦎', '🦖', '🦕', '🐙', '🦑', '🦐', '🦞', '🦀', '🐡', '🐠', '🐟', '🐬', '🐳', '🐋', '🦈', '🐊', '🐅', '🐆', '🦓', '🦍', '🦧', '🐘', '🦛', '🦏', '🐪', '🐫', '🦒', '🦘', '🐃', '🐂', '🐄', '🐎', '🐖', '🐏', '🐑', '🦙', '🐐', '🦌', '🐕', '🐩', '🦮', '🐕‍🦺', '🐈', '🐓', '🦃', '🦚', '🦜', '🦢', '🦩', '🕊', '🐇', '🦝', '🦨', '🦡', '🦦', '🦥', '🐁', '🐀', '🐿', '🦔', '🐾', '🐉', '🐲', '🌵', '🎄', '🌲', '🌳', '🌴', '🌱', '🌿', '☘️', '🍀', '🎍', '🎋', '🍃', '🍂', '🍁', '🍄', '🐚', '🌾', '💐', '🌷', '🌹', '🥀', '🌺', '🌸', '🌼', '🌻', '🌞', '🌝', '🌛', '🌜', '🌚', '🌕', '🌖', '🌗', '🌘', '🌑', '🌒', '🌓', '🌔', '🌙', '🌎', '🌍', '🌏', '🪐', '💫', '⭐️', '🌟', '✨', '⚡️', '☄️', '💥', '🔥', '🌪', '🌈', '☀️', '🌤', '⛅️', '🌥', '☁️', '🌦', '🌧', '⛈', '🌩', '🌨', '❄️', '☃️', '⛄️', '🌬', '💨', '💧', '💦', '☔️', '☂️', '🌊', '🌫'
16
+ ],
17
+ 'Food & Drink': [
18
+ '🍏', '🍎', '🍐', '🍊', '🍋', '🍌', '🍉', '🍇', '🍓', '🍈', '🍒', '🍑', '🥭', '🍍', '🥥', '🥝', '🍅', '🍆', '🥑', '🥦', '🥬', '🥒', '🌶', '🌽', '🥕', '🧄', '🧅', '🥔', '🍠', '🥐', '🥯', '🍞', '🥖', '🥨', '🧀', '🥚', '🍳', '🧈', '🥞', '🧇', '🥓', '🥩', '🍗', '🍖', '🦴', '🌭', '🍔', '🍟', '🍕', '🥪', '🥙', '🧆', '🌮', '🌯', '🥗', '🥘', '🥫', '🍝', '🍜', '🍲', '🍛', '🍣', '🍱', '🥟', '🦪', '🍤', '🍙', '🍚', '🍘', '🍥', '🥠', '🍢', '🍡', '🍧', '🍨', '🍦', '🥧', '🧁', '🍰', '🎂', '🍮', '🍭', '🍬', '🍫', '🍿', '🍩', '🍪', '🌰', '🥜', '🍯', '🥛', '🍼', '☕️', '🍵', '🧃', '🥤', '🍶', '🍺', '🍻', '🥂', '🍷', '🥃', '🍸', '🍹', '🧉', '🍾', '🧊', '🥄', '🍴', '🍽', '🥣', '🥡', '🥢', '🧂'
19
+ ],
20
+ 'Activities': [
21
+ '⚽️', '🏀', '🏈', '⚾️', '🥎', '🎾', '🏐', '🏉', '🥏', '🎱', '🪀', '🏓', '🏸', '🏒', '🏑', '🥍', '🏏', '🥅', '⛳️', '🪁', '🏹', '🎣', '🤿', '🥊', '🥋', '🎽', '🛹', '🛷', '⛸', '🥌', '🎿', '⛷', '🏂', '🪂', '🏋️‍♀️', '🏋️‍♂️', '🤼‍♀️', '🤼‍♂️', '🤸‍♀️', '🤸‍♂️', '⛹️‍♀️', '⛹️‍♂️', '🤾‍♀️', '🤾‍♂️', '🧗‍♀️', '🧗‍♂️', '🏌️‍♀️', '🏌️‍♂️', '🧘‍♀️', '🧘‍♂️', '🧖‍♀️', '🧖‍♂️', '🏄‍♀️', '🏄‍♂️', '🏊‍♀️', '🏊‍♂️', '🤽‍♀️', '🤽‍♂️', '🚣‍♀️', '🚣‍♂️', '🏇', '🚴‍♀️', '🚴‍♂️', '🚵‍♀️', '🚵‍♂️', '🎽', '🎖', '🥇', '🥈', '🥉', '🏆', '🏵', '🎗', '🎫', '🎟', '🎪', '🤹', '🎭', '🩰', '🎨', '🎬', '🎤', '🎧', '🎼', '🎹', '🥁', '🎷', '🎺', '🎸', '🪕', '🎻', '🎲', '♟', '🎯', '🎳', '🎮', '🎰', '🧩'
22
+ ],
23
+ 'Travel & Places': [
24
+ '🚗', '🚕', '🚙', '🚌', '🚎', '🏎', '🚓', '🚑', '🚒', '🚐', '🚚', '🚛', '🚜', '🦯', '🦽', '🦼', '🛴', '🚲', '🛵', '🏍', '🛺', '🚨', '🚔', '🚍', '🚘', '🚖', '🚡', '🚠', '🚟', '🚃', '🚋', '🚞', '🚝', '🚄', '🚅', '🚈', '🚂', '🚆', '🚇', '🚊', '🚉', '✈️', '🛫', '🛬', '🛩', '💺', '🛰', '🚀', '🛸', '🚁', '🛶', '⛵️', '🚤', '🛥', '🛳', '⛴', '🚢', '⚓️', '⛽️', '🚧', '🚦', '🚥', '🚏', '🗺', '🗿', '🗽', '🗼', '🏰', '🏯', '🏟', '🎡', '🎢', '🎠', '⛲️', '⛱', '🏖', '🏝', '🏜', '🌋', '⛰', '🏔', '🗻', '🏕', '⛺️', '🏠', '🏡', '🏘', '🏚', '🏗', '🏭', '🏢', '🏬', '🏣', '🏤', '🏥', '🏦', '🏨', '🏪', '🏫', '🏩', '💒', '🏛', '⛪️', '🕌', '🕍', '🛕', '🕋', '⛩', '🛤', '🛣', '🗾', '🎑', '🏞', '🌅', '🌄', '🌠', '🎇', '🎆', '🌇', '🌆', '🏙', '🌃', '🌌', '🌉', '🌁'
25
+ ],
26
+ 'Objects': [
27
+ '⌚️', '📱', '📲', '💻', '⌨️', '🖥', '🖨', '🖱', '🖲', '🕹', '🗜', '💽', '💾', '💿', '📀', '📼', '📷', '📸', '📹', '🎥', '📽', '🎞', '📞', '☎️', '📟', '📠', '📺', '📻', '🎙', '🎚', '🎛', '🧭', '⏱', '⏲', '⏰', '🕰', '⌛️', '⏳', '📡', '🔋', '🔌', '💡', '🔦', '🕯', '🪔', '🧯', '🛢', '💸', '💵', '💴', '💶', '💷', '💰', '💳', '💎', '⚖️', '🧰', '🔧', '🔨', '⚒', '🛠', '⛏', '🪓', '🔩', '⚙️', '🧱', '⛓', '🧲', '🔫', '💣', '🧨', '🗡', '⚔️', '🛡', '🚬', '⚰️', '⚱️', '🏺', '🔮', '📿', '🧿', '💈', '⚗️', '🔭', '🔬', '🕳', '🩹', '🩺', '💊', '💉', '🩸', '🧬', '🦠', '🧫', '🧪', '🌡', '🧹', '🧺', '🧻', '🚽', '🚰', '🚿', '🛁', '🛀', '🧼', '🪒', '🧽', '🧴', '🛎', '🔑', '🗝', '🚪', '🪑', '🛋', '🛏', '🛌', '🧸', '🖼', '🛍', '🛒', '🎁', '🎈', '🎏', '🎀', '🎊', '🎉', '🎎', '🏮', '🎐', '🧧', '✉️', '📩', '📨', '📧', '💌', '📥', '📤', '📦', '🏷', '📪', '📫', '📬', '📭', '📮', '📯', '📜', '📃', '📄', '📑', '🧾', '📊', '📈', '📉', '🗒', '🗓', '📆', '📅', '🗑', '📇', '🗃', '🗳', '🗄', '📋', '📁', '📂', '🗂', '🗞', '📰', '📓', '📔', '📒', '📕', '📗', '📘', '📙', '📚', '📖', '🔖', '🧷', '🔗', '📎', '🖇', '📐', '📏', '🧮', '📌', '📍', '✂️', '🖊', '🖋', '✒️', '🖌', '🖍', '📝', '✏️', '🔍', '🔎', '🔏', '🔐', '🔒', '🔓'
28
+ ],
29
+ 'Symbols': [
30
+ '❤️', '🧡', '💛', '💚', '💙', '💜', '🖤', '🤍', '🤎', '💔', '❣️', '💕', '💞', '💓', '💗', '💖', '💘', '💝', '💟', '☮️', '✝️', '☪️', '🕉', '☸️', '✡️', '🔯', '🕎', '☯️', '☦️', '🛐', '⛎', '♈️', '♉️', '♊️', '♋️', '♌️', '♍️', '♎️', '♏️', '♐️', '♑️', '♒️', '♓️', '🆔', '⚛️', '🉑', '☢️', '☣️', '📴', '📳', '🈶', '🈚️', '🈸', '🈺', '🈷️', '✴️', '🆚', '💮', '🉐', '㊙️', '㊗️', '🈴', '🈵', '🈹', '🈲', '🅰️', '🅱️', '🆎', '🆑', '🅾️', '🆘', '❌', '⭕️', '🛑', '⛔️', '📛', '🚫', '💯', '💢', '♨️', '🚷', '🚯', '🚳', '🚱', '🔞', '📵', '🚭', '❗️', '❕', '❓', '❔', '‼️', '⁉️', '🔅', '🔆', '〽️', '⚠️', '🚸', '🔱', '⚜️', '🔰', '♻️', '✅', '🈯️', '💹', '❇️', '✳️', '❎', '🌐', '💠', 'Ⓜ️', '🌀', '💤', '🏧', '🚾', '♿️', '🅿️', '🈳', '🈂️', '🛂', '🛃', '🛄', '🛅', '🚹', '🚺', '🚼', '🚻', '🚮', '🎦', '📶', '🈁', '🔣', 'ℹ️', '🔤', '🔡', '🔠', '🆖', '🆗', '🆙', '🆒', '🆕', '🆓', '0️⃣', '1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣', '🔟', '🔢', '#️⃣', '*️⃣', '⏏️', '▶️', '⏸', '⏯', '⏹', '⏺', '⏭', '⏮', '⏩', '⏪', '⏫', '⏬', '◀️', '🔼', '🔽', '➡️', '⬅️', '⬆️', '⬇️', '↗️', '↘️', '↙️', '↖️', '↕️', '↔️', '↪️', '↩️', '⤴️', '⤵️', '🔀', '🔁', '🔂', '🔄', '🔃', '🎵', '🎶', '➕', '➖', '➗', '✖️', '♾', '💲', '💱', '™️', '©️', '®️', '👁‍🗨', '🔚', '🔙', '🔛', '🔝', '🔜', '〰️', '➰', '➿', '✔️', '☑️', '🔘', '🔴', '🟠', '🟡', '🟢', '🔵', '🟣', '⚫️', '⚪️', '🟤', '🔺', '🔻', '🔸', '🔹', '🔶', '🔷', '🔳', '🔲', '▪️', '▫️', '◾️', '◽️', '◼️', '◻️', '🟥', '🟧', '🟨', '🟩', '🟦', '🟪', '⬛️', '⬜️', '🟫', '🔈', '🔇', '🔉', '🔊', '🔔', '🔕', '📣', '📢', '💬', '💭', '🗯', '♠️', '♣️', '♥️', '♦️', '🃏', '🎴', '🀄️', '🕐', '🕑', '🕒', '🕓', '🕔', '🕕', '🕖', '🕗', '🕘', '🕙', '🕚', '🕛', '🕜', '🕝', '🕞', '🕟', '🕠', '🕡', '🕢', '🕣', '🕤', '🕥', '🕦', '🕧'
31
+ ]
32
+ };
33
+
34
+ export async function emojiHandler() {
35
+ const allEmojis = [];
36
+ let globalIndex = 1;
37
+ const colCount = 6; // Number of columns in the grid
38
+
39
+ // Prepare the list of emojis
40
+ Object.entries(categories).forEach(([category, symbols]) => {
41
+ symbols.forEach(char => {
42
+ allEmojis.push({
43
+ index: globalIndex++,
44
+ char: char,
45
+ category: category
46
+ });
47
+ });
48
+ });
49
+
50
+ while (true) {
51
+ console.log('\n=== Emoji Picker ===\n');
52
+
53
+ // Display emojis in a grid grouped by category
54
+ let currentCategory = '';
55
+ let rowBuffer = [];
56
+
57
+ allEmojis.forEach((item, i) => {
58
+ // Check if category changed
59
+ if (item.category !== currentCategory) {
60
+ // Print remaining buffer from previous category
61
+ if (rowBuffer.length > 0) {
62
+ console.log(rowBuffer.join(''));
63
+ rowBuffer = [];
64
+ }
65
+ currentCategory = item.category;
66
+ console.log(`\n--- ${currentCategory} ---`);
67
+ }
68
+
69
+ // Add item to buffer
70
+ const label = `${item.index}. ${item.char}`;
71
+ // Emoji widths can be tricky in terminals, but we'll use a fixed padding
72
+ // padEnd(10) is usually enough, but some complex emojis might be wide.
73
+ rowBuffer.push(label.padEnd(12));
74
+
75
+ // If buffer full, print row
76
+ if (rowBuffer.length >= colCount) {
77
+ console.log(rowBuffer.join(''));
78
+ rowBuffer = [];
79
+ }
80
+ });
81
+
82
+ // Print remaining items
83
+ if (rowBuffer.length > 0) {
84
+ console.log(rowBuffer.join(''));
85
+ }
86
+
87
+ console.log('\n0. Back to Main Menu');
88
+ console.log('==========================\n');
89
+
90
+ const { input } = await inquirer.prompt([
91
+ {
92
+ type: 'input',
93
+ name: 'input',
94
+ message: 'Enter the number of the emoji to copy:',
95
+ validate: (val) => {
96
+ if (val === '0') return true;
97
+ const num = parseInt(val);
98
+ if (isNaN(num) || num < 1 || num > allEmojis.length) {
99
+ return 'Please enter a valid number.';
100
+ }
101
+ return true;
102
+ }
103
+ }
104
+ ]);
105
+
106
+ if (input === '0') {
107
+ break;
108
+ }
109
+
110
+ const selected = allEmojis[parseInt(input) - 1];
111
+ await copy(selected.char);
112
+ console.log(`\nCopied '${selected.char}' to clipboard!`);
113
+ }
114
+ }
@@ -0,0 +1,136 @@
1
+ import inquirer from 'inquirer';
2
+ import { copy } from '../utils/clipboard.js';
3
+
4
+ const categories = {
5
+ 'Stars': ['★', '☆', '✡', '✦', '✧', '✩', '✪', '✫', '✬', '✭', '✮', '✯', '✰'],
6
+ 'Checks & Crosses': ['☑', '✓', '✔', '√', '☐', '☒', '☓', '✘', 'ㄨ', '✕', '✖', '✗'],
7
+ 'Hearts': ['❤', '♡', '♥', '❥', '♠', '♣', '♤', 'ღ', '❣'],
8
+ 'Squares & Rectangles': ['❏', '❐', '❑', '❒', '▏', '▐', '░', '▒', '▓', '▔', '▕', '■', '□', '▢', '▣', '▤', '▥', '▦', '▧', '▨', '▩', '▪', '▫', '▬', '▭', '▮', '▯', 'ˍ', '∎', '⊞', '⊟', '⊠', '⊡', '⋄', '▱', '◆', '◇', '◈', '◧', '◨', '◩', '◪', '◫', '◙', '◘', '▀', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '▉', '▊', '▋', '█', '▌', '▍', '▎', '▰'],
9
+ 'Circles': ['⊙', '●', '○', '◎', '◕', '¤', '☪', '❂', '✪', '☻', '☼', 'Θ', '⊖', '⊘', '⊕', '⊚', '⊛', '⊜', '⊝', '◉', '◌', '◍', '◐', '◑', '◒', '◓', '◔', '⊗', '◖', '◗', '◯'],
10
+ 'Triangles': ['◤', '◥', '◄', '►', '▶', '◀', '◣', '◢', '▲', '▼', '▸', '◂', '▴', '▾', '△', '▽', '▷', '◁', '⊿', '▻', '◅', '▵', '▿', '▹', '◃', '∆', '◬', '◭', '◮', '∇', '☢'],
11
+ 'Arrows': ['←', '↑', '→', '↓', '↔', '↕', '↖', '↗', '↘', '↙', '⇐', '⇑', '⇒', '⇓', '⇔', '⇕'],
12
+ 'Math': ['+', '-', '×', '÷', '=', '≠', '≈', '±', '∞', '√', '∑', '∏', '∫', '∂', '∇', '∀', '∃', '∅', '∈', '∉', '⊂', '⊃', '∪', '∩', '⊥', '∠', '°', '%', '‰'],
13
+ 'Numbers (Enclosed)': [
14
+ '①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '⑩', '⑪', '⑫', '⑬', '⑭', '⑮', '⑯', '⑰', '⑱', '⑲', '⑳',
15
+ '⑴', '⑵', '⑶', '⑷', '⑸', '⑹', '⑺', '⑻', '⑼', '⑽', '⑾', '⑿', '⒀', '⒁', '⒂', '⒃', '⒄', '⒅', '⒆', '⒇',
16
+ '⒈', '⒉', '⒊', '⒋', '⒌', '⒍', '⒎', '⒏', '⒐', '⒑', '⒒', '⒓', '⒔', '⒕', '⒖', '⒗', '⒘', '⒙', '⒚', '⒛',
17
+ '㊀', '㊁', '㊂', '㊃', '㊄', '㊅', '㊆', '㊇', '㊈', '㊉',
18
+ '㈠', '㈡', '㈢', '㈣', '㈤', '㈥', '㈦', '㈧', '㈨', '㈩',
19
+ '№', '½', '⅓', '⅔', '¼', '¾', '⅛', '⅜', '⅝', '⅞'
20
+ ],
21
+ 'Greek Numbers': ['Ⅰ', 'Ⅱ', 'Ⅲ', 'Ⅳ', 'Ⅴ', 'Ⅵ', 'Ⅶ', 'Ⅷ', 'Ⅸ', 'Ⅹ', 'Ⅺ', 'Ⅻ', 'ⅰ', 'ⅱ', 'ⅲ', 'ⅳ', 'ⅴ', 'ⅵ', 'ⅶ', 'ⅷ', 'ⅸ', 'ⅹ', 'ⅺ', 'ⅻ'],
22
+ 'Date & Time': [
23
+ '㋀', '㋁', '㋂', '㋃', '㋄', '㋅', '㋆', '㋇', '㋈', '㋉', '㋊', '㋋',
24
+ '㏠', '㏡', '㏢', '㏣', '㏤', '㏥', '㏦', '㏧', '㏨', '㏩', '㏪', '㏫', '㏬', '㏭', '㏮', '㏯', '㏰', '㏱', '㏲', '㏳', '㏴', '㏵', '㏶', '㏷', '㏸', '㏹', '㏺', '㏻', '㏼', '㏽', '㏾',
25
+ '㍘', '㍙', '㍚', '㍛', '㍜', '㍝', '㍞', '㍟', '㍠', '㍡', '㍢', '㍣', '㍤', '㍥', '㍦', '㍧', '㍨', '㍩', '㍪', '㍫', '㍬', '㍭', '㍮', '㍯', '㍰'
26
+ ],
27
+ 'Special Chinese': [
28
+ '㊐', '㊊', '㊎', '㊍', '㊌', '㊋', '㊏', '㊑', '㊒', '㊓', '㊔', '㊕', '㊖', '㊗', '㊘', '㊜', '㊝', '㊞', '㊟', '㊠', '㊡', '㊢', '㊩', '㊪', '㊫', '㊬', '㊭', '㊮', '㊯', '㊰', '㊙', '㊚', '㊛', '㊣', '㊤', '㊥', '㊦', '㊧', '㊨',
29
+ '囍', '㈱', '㍿', '卐', '卍', 'ォ', 'ミ', '灬', '彡', 'ツ'
30
+ ],
31
+ 'Music': ['♩', '♪', '♫', '♬', '¶', '♭', '♯', '♮', '∮', '‖', '§', 'Ψ'],
32
+ 'Letters (Enclosed)': [
33
+ '⒜', '⒝', '⒞', '⒟', '⒠', '⒡', '⒢', '⒣', '⒤', '⒥', '⒦', '⒧', '⒨', '⒩', '⒪', '⒫', '⒬', '⒭', '⒮', '⒯', '⒰', '⒱', '⒲', '⒳', '⒴', '⒵',
34
+ 'ⓐ', 'ⓑ', 'ⓒ', 'ⓓ', 'ⓔ', 'ⓕ', 'ⓖ', 'ⓗ', 'ⓘ', 'ⓙ', 'ⓚ', 'ⓛ', 'ⓜ', 'ⓝ', 'ⓞ', 'ⓟ', 'ⓠ', 'ⓡ', 'ⓢ', 'ⓣ', 'ⓤ', 'ⓥ', 'ⓦ', 'ⓧ', 'ⓨ', 'ⓩ',
35
+ 'Ⓐ', 'Ⓑ', 'Ⓒ', 'Ⓓ', 'Ⓔ', 'Ⓕ', 'Ⓖ', 'Ⓗ', 'Ⓘ', 'Ⓙ', 'Ⓚ', 'Ⓛ', 'Ⓜ', 'Ⓝ', 'Ⓞ', 'Ⓟ', 'Ⓠ', 'Ⓡ', 'Ⓢ', 'Ⓣ', 'Ⓤ', 'Ⓥ', 'Ⓦ', 'Ⓧ', 'Ⓨ', 'Ⓩ'
36
+ ],
37
+ 'Chinese Numbers': ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', '佰', '仟', '万', '亿'],
38
+ 'Weather': ['☀', '☼', '♨', '☁', '☂', '☾', '☽', '❄', '❅', '❆', '☃'],
39
+ 'Units & Gender': ['©', '®', '℃', '℉', '♂', '♀', '㎡', '℗', 'Ω', '㏎', '㎎', '㎏', '㎜', '㎝', '㎞', '㎡', '㏄', '㏎', '㏑', '㏒', '㏕', '℡', '%', '‰', '°', '′', '″', '¢', '℅'],
40
+ 'Currency': ['¥', 'HK$', 'HKD', '$', '円', '€', '£', '₴', '₰', '¢', '₤', '₳', '₲', '₪', '₵', '₣', '₱', '฿', '¤', '₡', '₮', '₭', '₩', 'ރ', '₢', '₥', '₫', '₦', 'zł', '﷼', '₠', '₧', '₯', '₨', 'Kč', 'र', '₹', 'ƒ', '₸', '¢'],
41
+ 'Box Drawing': [
42
+ '┏', '┳', '┓', '┌', '┬', '┐', '╔', '╦', '╗', '╓', '╥', '╖', '╒', '╤', '╕', '╭', '╮', '╱', '╲', '─', '│', '┱', '┲', '╃', '╄',
43
+ '┣', '╋', '┫', '├', '┼', '┤', '╠', '╬', '╣', '╟', '╫', '╢', '╞', '╪', '╡', '╰', '╯', '╲', '╱', '━', '┇', '┅', '┋',
44
+ '┗', '┻', '┛', '└', '┴', '┘', '╚', '╩', '╝', '╙', '╨', '╜', '╘', '╧', '╛', '═', '║', '︴', '﹏', '﹋', '﹌'
45
+ ],
46
+ 'Asterisks': ['✱', '✲', '✳', '❃', '✾', '✽', '✼', '✻', '✺', '✹', '✸', '✷', '✶', '✵', '✴', '❄', '❅', '❆', '❇', '❈', '❉', '❊', '❋'],
47
+ 'Bagua': ['乾', '☰', '兑', '☱', '离', '☲', '震', '☳', '巽', '☴', '坎', '☵', '艮', '☶', '坤', '☷', '☯'],
48
+ 'Punctuation': ['。', ',', '、', ':', '∶', ';', '‘', '’', '“', '”', '〝', '〞', 'ˆ', 'ˇ', '﹕', '︰', '﹔', '﹖', '﹑', '·', '¨', '.', '¸', ';', '´', '?', '!', '~', '—', '|', '‖', '"', '〃', '`', '@', '﹫', '¡', '¿', '﹏', '﹋', '︴', '々', '﹟', '#', '﹩', '$', '﹠', '&', '﹪', '%', '﹡', '﹢', '×', '﹦', '‐', ' ̄', '¯', '―', '﹨', '˜', '﹍', '﹎', '_', '-', '~', '(', ')', '〈', '〉', '‹', '›', '﹛', '﹜', '『', '』', '〖', '〗', '[', ']', '《', '》', '〔', '〕', '{', '}', '「', '」', '【', '】', '︵', '︷', '︿', '︹', '︽', '_', '︶', '︸', '﹀', '︺', '︾', 'ˉ', '﹂', '﹄', '︼', '﹁', '﹃', '︻'],
49
+ 'Greek Letters': ['α', 'β', 'γ', 'δ', 'ε', 'ζ', 'η', 'θ', 'ι', 'κ', 'λ', 'μ', 'ν', 'ξ', 'ο', 'π', 'ρ', 'σ', 'τ', 'υ', 'φ', 'χ', 'ψ', 'ω', 'Δ', 'Σ', 'Ω', 'Φ', 'Ψ', 'Γ', 'Λ', 'Π', 'Θ', 'Ξ'],
50
+ 'Pinyin': ['ā', 'á', 'ǎ', 'à', 'ō', 'ó', 'ǒ', 'ò', 'ē', 'é', 'ě', 'è', 'ī', 'í', 'ǐ', 'ì', 'ū', 'ú', 'ǔ', 'ù', 'ǖ', 'ǘ', 'ǚ', 'ǜ', 'ü', 'ê', 'ɑ', 'ń', 'ň', 'ǹ', 'ɡ', 'ㄅ', 'ㄆ', 'ㄇ', 'ㄈ', 'ㄉ', 'ㄊ', 'ㄋ', 'ㄌ', 'ㄍ', 'ㄎ', 'ㄏ', 'ㄐ', 'ㄑ', 'ㄒ', 'ㄓ', 'ㄔ', 'ㄕ', 'ㄖ', 'ㄗ', 'ㄘ', 'ㄙ', 'ㄚ', 'ㄛ', 'ㄜ', 'ㄝ', 'ㄞ', 'ㄟ', 'ㄠ', 'ㄡ', 'ㄢ', 'ㄣ', 'ㄤ', 'ㄥ', 'ㄦ', 'ㄧ', 'ㄨ', 'ㄩ'],
51
+ 'Japanese': ['ぁ', 'あ', 'ぃ', 'い', 'ぅ', 'う', 'ぇ', 'え', 'ぉ', 'お', 'か', 'が', 'き', 'ぎ', 'く', 'ぐ', 'け', 'げ', 'こ', 'ご', 'さ', 'ざ', 'し', 'じ', 'す', 'ず', 'せ', 'ぜ', 'そ', 'ぞ', 'た', 'だ', 'ち', 'ぢ', 'っ', 'つ', 'づ', 'て', 'で', 'と', 'ど', 'な', 'に', 'ぬ', 'ね', 'の', 'は', 'ば', 'ぱ', 'ひ', 'び', 'ぴ', 'ふ', 'ぶ', 'ぷ', 'へ', 'べ', 'ぺ', 'ほ', 'ぼ', 'ぽ', 'ま', 'み', 'む', 'め', 'も', 'ゃ', 'や', 'ゅ', 'ゆ', 'ょ', 'よ', 'ら', 'り', 'る', 'れ', 'ろ', 'ゎ', 'わ', 'ゐ', 'ゑ', 'を', 'ん', 'ゔ', 'ゕ', 'ゖ', '゚', '゛', '゜', 'ゝ', 'ゞ', 'ゟ', '゠', 'ァ', 'ア', 'ィ', 'イ', 'ゥ', 'ウ', 'ェ', 'エ', 'ォ', 'オ', 'カ', 'ガ', 'キ', 'ギ', 'ク', 'グ', 'ケ', 'ゲ', 'コ', 'ゴ', 'サ', 'ザ', 'シ', 'ジ', 'ス', 'ズ', 'セ', 'ゼ', 'ソ', 'ゾ', 'タ', 'ダ', 'チ', 'ヂ', 'ッ', 'ツ', 'ヅ', 'テ', 'デ', 'ト', 'ド', 'ナ', 'ニ', 'ヌ', 'ネ', 'ノ', 'ハ', 'バ', 'パ', 'ヒ', 'ビ', 'ピ', 'フ', 'ブ', 'プ', 'ヘ', 'ベ', 'ペ', 'ホ', 'ボ', 'ポ', 'マ', 'ミ', 'ム', 'メ', 'モ', 'ャ', 'ヤ', 'ュ', 'ユ', 'ョ', 'ヨ', 'ラ', 'リ', 'ル', 'レ', 'ロ', 'ヮ', 'ワ', 'ヰ', 'ヱ', 'ヲ', 'ン', 'ヴ', 'ヵ', 'ヶ', 'ヷ', 'ヸ', 'ヹ', 'ヺ', '・', 'ー', 'ヽ', 'ヾ', 'ヿ', '㍿'],
52
+ 'Korean': ['ㄱ', 'ㄲ', 'ㄳ', 'ㄴ', 'ㄵ', 'ㄶ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㄺ', 'lm', 'lb', 'ls', 'lt', 'lp', 'lh', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅄ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ', 'ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ', 'ㅛ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ', 'ㅥ', 'ㅦ', 'ㅧ', 'ㅨ', 'ㅩ', 'ㅪ', 'ㅫ', 'ㅬ', 'ㅭ', 'ㅮ', 'ㅯ', 'ㅰ', 'ㅱ', 'ㅲ', 'ㅳ', 'ㅴ', 'ㅵ', 'ㅶ', 'ㅷ', 'ㅸ', 'ㅹ', 'ㅺ', 'ㅻ', 'ㅼ', 'ㅽ', 'ㅾ', 'ㅿ']
53
+ };
54
+
55
+ export async function specialCharsHandler() {
56
+ const allSymbols = [];
57
+ let globalIndex = 1;
58
+ const colCount = 6; // Number of columns in the grid
59
+
60
+ // Prepare the list of symbols
61
+ Object.entries(categories).forEach(([category, symbols]) => {
62
+ symbols.forEach(char => {
63
+ allSymbols.push({
64
+ index: globalIndex++,
65
+ char: char,
66
+ category: category
67
+ });
68
+ });
69
+ });
70
+
71
+ while (true) {
72
+ console.log('\n=== Special Characters ===\n');
73
+
74
+ // Display symbols in a grid grouped by category
75
+ let currentCategory = '';
76
+ let rowBuffer = [];
77
+
78
+ allSymbols.forEach((item, i) => {
79
+ // Check if category changed
80
+ if (item.category !== currentCategory) {
81
+ // Print remaining buffer from previous category
82
+ if (rowBuffer.length > 0) {
83
+ console.log(rowBuffer.join(''));
84
+ rowBuffer = [];
85
+ }
86
+ currentCategory = item.category;
87
+ console.log(`\n--- ${currentCategory} ---`);
88
+ }
89
+
90
+ // Add item to buffer
91
+ // Format: "123. X " padded
92
+ // Adjust padding based on symbol width?
93
+ // Simple padding might not align perfectly for wide chars, but it's acceptable for CLI.
94
+ const label = `${item.index}. ${item.char}`;
95
+ rowBuffer.push(label.padEnd(12)); // Increased padding for wider chars
96
+
97
+ // If buffer full, print row
98
+ if (rowBuffer.length >= colCount) {
99
+ console.log(rowBuffer.join(''));
100
+ rowBuffer = [];
101
+ }
102
+ });
103
+
104
+ // Print remaining items
105
+ if (rowBuffer.length > 0) {
106
+ console.log(rowBuffer.join(''));
107
+ }
108
+
109
+ console.log('\n0. Back to Main Menu');
110
+ console.log('==========================\n');
111
+
112
+ const { input } = await inquirer.prompt([
113
+ {
114
+ type: 'input',
115
+ name: 'input',
116
+ message: 'Enter the number of the symbol to copy:',
117
+ validate: (val) => {
118
+ if (val === '0') return true;
119
+ const num = parseInt(val);
120
+ if (isNaN(num) || num < 1 || num > allSymbols.length) {
121
+ return 'Please enter a valid number.';
122
+ }
123
+ return true;
124
+ }
125
+ }
126
+ ]);
127
+
128
+ if (input === '0') {
129
+ break;
130
+ }
131
+
132
+ const selected = allSymbols[parseInt(input) - 1];
133
+ await copy(selected.char);
134
+ console.log(`\nCopied '${selected.char}' to clipboard!`);
135
+ }
136
+ }
package/src/index.js CHANGED
@@ -12,6 +12,8 @@ import { colorHandler } from './commands/color.js';
12
12
  import { variableFormatHandler } from './commands/variableFormat.js';
13
13
  import { hashingHandler } from './commands/hashing.js';
14
14
  import { qrcodeHandler } from './commands/qrcode.js';
15
+ import { specialCharsHandler } from './commands/specialChars.js';
16
+ import { emojiHandler } from './commands/emoji.js';
15
17
 
16
18
  process.on('SIGINT', () => {
17
19
  console.log('\nBye!');
@@ -40,7 +42,9 @@ const features = [
40
42
  { name: 'Color Converter (Hex <-> RGB)', value: 'color' },
41
43
  { name: 'Variable Format Converter', value: 'variableFormat' },
42
44
  { name: 'Hash Calculator (MD5/SHA/SM3)', value: 'hashing' },
43
- { name: 'QR Code Generator', value: 'qrcode' }
45
+ { name: 'QR Code Generator', value: 'qrcode' },
46
+ { name: 'Special Characters (Symbols)', value: 'specialChars' },
47
+ { name: 'Emoji Picker', value: 'emoji' }
44
48
  ];
45
49
 
46
50
  async function main() {
@@ -155,6 +159,12 @@ async function handleAction(action) {
155
159
  case 'qrcode':
156
160
  await qrcodeHandler();
157
161
  break;
162
+ case 'specialChars':
163
+ await specialCharsHandler();
164
+ break;
165
+ case 'emoji':
166
+ await emojiHandler();
167
+ break;
158
168
  default:
159
169
  console.log('Feature not implemented yet.');
160
170
  }