fmy

这是一个符合要求的用户脚本示例,包含所有必要的声明

// ==UserScript==
// @name         fmy 
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  这是一个符合要求的用户脚本示例,包含所有必要的声明
// @author       fmy
// @match        *://*/*
// @grant        none
// ==/UserScript==

const fs = require('fs');
const path = require('path');
const Terser = require('terser');

const DIR = path.join(__dirname, "bookmark");
const MIN_DIR = path.join(DIR, "min");
const OUTPUT_FILE = path.join(DIR, "README.md");
const BEGIN=`# 书签脚本集

**这个目录下记录了一些书签脚本,无需油猴插件就可以执行的\`js\`代码。**

- \`min.js\`:表示已压缩可在浏览器执行的\`js\`代码
- 脚本命名:以网站域名命名
- 没有 \`min\`:源代码

## 书签脚本如何使用?

去[这里](https://dtking.cn/blog/BookmarkScript/)学习一哈,或者自行AI,或网上搜索。


## 网站列表

`

// 确保 min 目录存在
if (!fs.existsSync(MIN_DIR)) {
	fs.mkdirSync(MIN_DIR, { recursive: true });
}

// 压缩单个文件并生成 Markdown 模板
const compressCode = async (src, dst) => {
	const origin = fs.readFileSync(src, 'utf8');
	const lines = origin.split(/\r?\n/);
	const info = lines.slice(0, 5);
	const name = (info[0]?.split(" ")[2] || 'Unnamed').trim();

	const { code } = await Terser.minify(origin, {
		compress: false,
		mangle: false,
		output: {
			comments: false,
		}
	});

	fs.writeFileSync(dst, code, "utf-8");

	return `### ${name}

\`\`\`js
${info.join('\n')}
\`\`\`

#### 书签代码

\`\`\`js
${code}
\`\`\``;
};

// 主程序
(async () => {
	try {
		const files = fs.readdirSync(DIR).filter(file => file.endsWith('.js'));
		const tasks = files.map(async file => {
			const { name, ext } = path.parse(file);
			const src = path.join(DIR, file);
			const dst = path.join(MIN_DIR, `${name}.min${ext}`);
			return await compressCode(src, dst);
		});

		const parts = await Promise.all(tasks);
		fs.writeFileSync(OUTPUT_FILE, BEGIN+parts.join('\n\n'), 'utf-8');
		console.log('✅ README.md 已生成');
	} catch (err) {
		console.error('❌ 处理过程中出错:', err);
	}
})();