xw-devtool-cli 1.0.14 → 1.0.16

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 生成、汉字转拼音、颜色转换、变量格式转换、哈希计算、二维码生成、特殊符号大全、Markdown 语法工具、VS Code 代码段生成等。所有结果均自动复制到剪贴板,极大提升开发效率。
6
6
 
7
7
  ## ✨ 功能特性
8
8
 
@@ -30,6 +30,8 @@
30
30
  - **特殊符号大全**:包含常用符号、箭头、数学符号、货币、希腊字母等 170+ 个符号,支持一键复制。
31
31
  - **Emoji 输入**:支持分类查看和选择常用 Emoji,一键复制到剪贴板。
32
32
  - **HTML 实体工具**:支持 HTML 实体编码与解码 (如 `&` <-> `&amp;`)。
33
+ - **Markdown 语法工具**:提供常用 Markdown 语法模板 (Headers, Lists, Tables, Code 等),一键复制。
34
+ - **VS Code 代码段生成器**:将代码转换为 VS Code Snippet JSON,自动生成语法速查表注释。
33
35
  - **占位图生成**:自定义尺寸、背景色、文字颜色和格式生成占位图。
34
36
  - **便捷操作**:
35
37
  - 支持文件选择对话框 (Windows)。
@@ -82,6 +84,8 @@ g. Hash Calculator (MD5/SHA/SM3)
82
84
  h. Mock Text
83
85
  i. Special Characters (Symbols)
84
86
  j. Emoji Picker
87
+ k. Markdown Snippets
88
+ l. VS Code Snippet Generator
85
89
  0. Exit
86
90
  =================================
87
91
  ```
@@ -231,6 +235,28 @@ j. Emoji Picker
231
235
  - 分类展示常用 Emoji (表情、手势、动物、食物等)。
232
236
  - 输入编号选择并复制 Emoji 到剪贴板。
233
237
 
238
+ ### 20. Markdown 语法工具 (Markdown Snippets)
239
+ - 选择 `k` 进入。
240
+ - 提供常用的 Markdown 语法模板,分类包括:
241
+ - **Headers**: 标题 (H1-H6)。
242
+ - **Emphasis**: 加粗、斜体、删除线。
243
+ - **Lists**: 无序列表、有序列表、任务列表。
244
+ - **Links & Images**: 链接、图片插入。
245
+ - **Code**: 行内代码、代码块。
246
+ - **Tables**: 表格模板。
247
+ - **Others**: 引用、分割线、折叠详情等。
248
+ - 选择对应语法后,模板将自动复制到剪贴板。
249
+
250
+ ### 21. VS Code 代码段生成器 (VS Code Snippet Generator)
251
+ - 选择 `l` 进入。
252
+ - **Generate Snippet**: 将任意代码转换为 VS Code 的 `.code-snippets` JSON 格式。
253
+ - 支持从 **剪贴板**、**文件** 或 **手动输入** 获取代码。
254
+ - 自动转义双引号和换行符,生成 `body` 数组。
255
+ - 输入 Snippet Name, Prefix (Trigger), Description。
256
+ - 结果自动复制到剪贴板,可直接粘贴到 VS Code 的 Snippet 配置文件中。
257
+ - **注意**:为防止长文本刷屏,结果**仅自动复制到剪贴板**,不会在终端打印。
258
+ - **提示**:生成的代码段会自动包含语法速查表 (Syntax Cheatsheet) 作为注释,方便参考。
259
+
234
260
  ## 📄 License
235
261
 
236
262
  ISC
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xw-devtool-cli",
3
- "version": "1.0.14",
3
+ "version": "1.0.16",
4
4
  "type": "module",
5
5
  "description": "基于node的开发者助手cli",
6
6
  "main": "index.js",
@@ -20,17 +20,35 @@
20
20
  "keywords": [
21
21
  "cli",
22
22
  "devtools",
23
+ "developer-tools",
24
+ "toolbox",
25
+ "utility",
23
26
  "base64",
24
- "url",
27
+ "url-encode",
28
+ "unicode",
29
+ "html-entities",
25
30
  "uuid",
26
31
  "pinyin",
27
32
  "mock",
33
+ "mock-data",
28
34
  "timestamp",
29
35
  "time",
36
+ "date-calculation",
30
37
  "image",
38
+ "image-conversion",
31
39
  "webp",
32
40
  "jpg",
33
- "png"
41
+ "png",
42
+ "placeholder-image",
43
+ "qrcode",
44
+ "json-format",
45
+ "variable-case",
46
+ "hash",
47
+ "encryption",
48
+ "md5",
49
+ "color-converter",
50
+ "emoji",
51
+ "markdown"
34
52
  ],
35
53
  "author": "npmxw",
36
54
  "license": "ISC",
@@ -0,0 +1,75 @@
1
+ import { selectFromMenu } from '../utils/menu.js';
2
+ import { copy } from '../utils/clipboard.js';
3
+ import inquirer from 'inquirer';
4
+
5
+ const MARKDOWN_SNIPPETS = {
6
+ 'headers': [
7
+ { name: 'H1 Header (#)', value: '# Header 1' },
8
+ { name: 'H2 Header (##)', value: '## Header 2' },
9
+ { name: 'H3 Header (###)', value: '### Header 3' },
10
+ { name: 'H4 Header (####)', value: '#### Header 4' },
11
+ ],
12
+ 'emphasis': [
13
+ { name: 'Bold (**text**)', value: '**Bold Text**' },
14
+ { name: 'Italic (*text*)', value: '*Italic Text*' },
15
+ { name: 'Bold Italic (***text***)', value: '***Bold Italic Text***' },
16
+ { name: 'Strikethrough (~~text~~)', value: '~~Strikethrough Text~~' },
17
+ ],
18
+ 'lists': [
19
+ { name: 'Unordered List (-)', value: '- Item 1\n- Item 2\n- Item 3' },
20
+ { name: 'Ordered List (1.)', value: '1. Item 1\n2. Item 2\n3. Item 3' },
21
+ { name: 'Task List (- [ ])', value: '- [ ] To Do\n- [x] Done' },
22
+ ],
23
+ 'links_images': [
24
+ { name: 'Link [text](url)', value: '[Link Text](https://example.com)' },
25
+ { name: 'Image ![alt](url)', value: '![Alt Text](https://example.com/image.jpg)' },
26
+ { name: 'Link with Title', value: '[Link Text](https://example.com "Title")' },
27
+ ],
28
+ 'code': [
29
+ { name: 'Inline Code (`text`)', value: '`code`' },
30
+ { name: 'Code Block (```)', value: '```javascript\nconsole.log("Hello World");\n```' },
31
+ ],
32
+ 'tables': [
33
+ { name: 'Table (3x3)', value: '| Header 1 | Header 2 | Header 3 |\n| :--- | :---: | ---: |\n| Left | Center | Right |\n| Item 1 | Item 2 | Item 3 |' },
34
+ ],
35
+ 'others': [
36
+ { name: 'Blockquote (>)', value: '> This is a quote.' },
37
+ { name: 'Horizontal Rule (---)', value: '---' },
38
+ { name: 'Details/Summary (<details>)', value: '<details>\n<summary>Click to expand</summary>\n\nHidden content here.\n</details>' },
39
+ ]
40
+ };
41
+
42
+ export async function markdownHandler() {
43
+ while (true) {
44
+ const category = await selectFromMenu('Markdown Snippets', [
45
+ { name: 'Headers (H1-H6)', value: 'headers' },
46
+ { name: 'Emphasis (Bold, Italic...)', value: 'emphasis' },
47
+ { name: 'Lists (Bullet, Numbered, Task)', value: 'lists' },
48
+ { name: 'Links & Images', value: 'links_images' },
49
+ { name: 'Code (Inline, Block)', value: 'code' },
50
+ { name: 'Tables', value: 'tables' },
51
+ { name: 'Others (Quote, HR, Details)', value: 'others' },
52
+ { name: 'Back to Main Menu', value: 'back' }
53
+ ]);
54
+
55
+ if (category === 'back') {
56
+ break;
57
+ }
58
+
59
+ const snippets = MARKDOWN_SNIPPETS[category];
60
+ const snippetValue = await selectFromMenu('Select Snippet', [
61
+ ...snippets,
62
+ { name: 'Back', value: 'back' }
63
+ ]);
64
+
65
+ if (snippetValue === 'back') {
66
+ continue;
67
+ }
68
+
69
+ await copy(snippetValue);
70
+
71
+ // Optional: ask if user wants to continue or exit
72
+ // For now, loop back to category selection is consistent with other tools or just exit?
73
+ // Let's loop back to categories to allow picking another one.
74
+ }
75
+ }
@@ -0,0 +1,95 @@
1
+ import inquirer from 'inquirer';
2
+ import { copy } from '../utils/clipboard.js';
3
+ import { selectFromMenu } from '../utils/menu.js';
4
+ import fs from 'fs';
5
+
6
+ export async function vscodeSnippetHandler() {
7
+ await generateSnippet();
8
+ }
9
+
10
+ async function generateSnippet() {
11
+ const inputSource = await selectFromMenu('VS Code Snippet Generator - Select Code Source', [
12
+ { name: 'Clipboard (Paste automatically)', value: 'clipboard' },
13
+ { name: 'Manual Input', value: 'manual' },
14
+ { name: 'File', value: 'file' }
15
+ ]);
16
+
17
+ let code = '';
18
+ if (inputSource === 'clipboard') {
19
+ const clipboardy = (await import('clipboardy')).default;
20
+ code = await clipboardy.read();
21
+ } else if (inputSource === 'file') {
22
+ const { filePath } = await inquirer.prompt([
23
+ {
24
+ type: 'input',
25
+ name: 'filePath',
26
+ message: 'Enter file path:'
27
+ }
28
+ ]);
29
+ try {
30
+ code = fs.readFileSync(filePath.replace(/"/g, ''), 'utf-8');
31
+ } catch (e) {
32
+ console.error('Error reading file:', e.message);
33
+ return;
34
+ }
35
+ } else {
36
+ const { manualInput } = await inquirer.prompt([
37
+ {
38
+ type: 'editor',
39
+ name: 'manualInput',
40
+ message: 'Enter/Paste your code (Close editor to finish):'
41
+ }
42
+ ]);
43
+ code = manualInput;
44
+ }
45
+
46
+ if (!code) {
47
+ console.log('No code provided.');
48
+ return;
49
+ }
50
+
51
+ const answers = await inquirer.prompt([
52
+ {
53
+ type: 'input',
54
+ name: 'name',
55
+ message: 'Snippet Name (e.g. "React Component"):',
56
+ validate: input => input ? true : 'Name is required'
57
+ },
58
+ {
59
+ type: 'input',
60
+ name: 'prefix',
61
+ message: 'Snippet Prefix (Trigger) (e.g. "rfc"):',
62
+ validate: input => input ? true : 'Prefix is required'
63
+ },
64
+ {
65
+ type: 'input',
66
+ name: 'description',
67
+ message: 'Description (optional):'
68
+ }
69
+ ]);
70
+
71
+ // Convert code to array of lines
72
+ const lines = code.split(/\r?\n/);
73
+
74
+ // We construct the object
75
+ const snippetObj = {
76
+ [answers.name]: {
77
+ prefix: answers.prefix,
78
+ body: lines,
79
+ description: answers.description || answers.name
80
+ }
81
+ };
82
+
83
+ const jsonOutput = JSON.stringify(snippetObj, null, 4);
84
+
85
+ // Add syntax cheatsheet as comments
86
+ const finalOutput = `// VS Code Snippet Syntax Help:
87
+ // 1. Tabstops: $1, $2... $0 (final cursor position)
88
+ // 2. Placeholders: \${1:default value}
89
+ // 3. Choices: \${1|one,two,three|}
90
+ // 4. Variables: $TM_FILENAME, $CURRENT_YEAR, $CLIPBOARD...
91
+
92
+ ${jsonOutput}`;
93
+
94
+ await copy(finalOutput);
95
+ }
package/src/index.js CHANGED
@@ -19,6 +19,8 @@ import { specialCharsHandler } from './commands/specialChars.js';
19
19
  import { emojiHandler } from './commands/emoji.js';
20
20
  import { htmlEntitiesHandler } from './commands/htmlEntities.js';
21
21
  import { placeholderImgHandler } from './commands/placeholderImg.js';
22
+ import { markdownHandler } from './commands/markdown.js';
23
+ import { vscodeSnippetHandler } from './commands/vscodeSnippet.js';
22
24
 
23
25
  process.on('SIGINT', () => {
24
26
  console.log('\nBye!');
@@ -61,7 +63,9 @@ const features = [
61
63
  // Content/Mocking
62
64
  { name: 'Mock Text', value: 'mock' },
63
65
  { name: 'Special Characters (Symbols)', value: 'specialChars' },
64
- { name: 'Emoji Picker', value: 'emoji' }
66
+ { name: 'Emoji Picker', value: 'emoji' },
67
+ { name: 'Markdown Snippets', value: 'markdown' },
68
+ { name: 'VS Code Snippet Generator', value: 'vscodeSnippet' }
65
69
  ];
66
70
 
67
71
  async function main() {
@@ -197,6 +201,12 @@ async function handleAction(action) {
197
201
  case 'placeholderImg':
198
202
  await placeholderImgHandler();
199
203
  break;
204
+ case 'markdown':
205
+ await markdownHandler();
206
+ break;
207
+ case 'vscodeSnippet':
208
+ await vscodeSnippetHandler();
209
+ break;
200
210
  default:
201
211
  console.log('Feature not implemented yet.');
202
212
  }