From eeff220b7c3075ef687ce8af98fc871a1bf78250 Mon Sep 17 00:00:00 2001 From: Yeban8090 Date: Thu, 13 Mar 2025 11:12:58 +0800 Subject: [PATCH] Initial commit: Note to RED plugin for Obsidian --- .gitignore | 20 + LICENSE | 21 + README.md | 58 + assets/donate.png | Bin 0 -> 138192 bytes assets/qrcode.png | Bin 0 -> 47060 bytes build.sh | 36 + data.json | 13 + esbuild.config.mjs | 38 + manifest.json | 12 + package-lock.json | 2567 ++++++++++++++++++++++++++++++++++++ package.json | 35 + src/backgroundManager.ts | 43 + src/backgrounds/index.ts | 39 + src/converter.ts | 244 ++++ src/donateManager.ts | 129 ++ src/downloadManager.ts | 89 ++ src/main.ts | 77 ++ src/previewManager.ts | 156 +++ src/settings.ts | 57 + src/templateManager.ts | 319 +++++ src/templates/cyber.json | 69 + src/templates/default.json | 69 + src/templates/elegant.json | 69 + src/templates/forest.json | 69 + src/templates/index.ts | 24 + src/templates/metal.json | 69 + src/templates/minimal.json | 69 + src/templates/ocean.json | 69 + src/templates/sakura.json | 69 + src/templates/starry.json | 69 + src/templates/warm.json | 69 + src/view.ts | 680 ++++++++++ styles.css | 736 +++++++++++ tsconfig.json | 25 + 34 files changed, 6108 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/donate.png create mode 100644 assets/qrcode.png create mode 100755 build.sh create mode 100644 data.json create mode 100644 esbuild.config.mjs create mode 100644 manifest.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/backgroundManager.ts create mode 100644 src/backgrounds/index.ts create mode 100644 src/converter.ts create mode 100644 src/donateManager.ts create mode 100644 src/downloadManager.ts create mode 100644 src/main.ts create mode 100644 src/previewManager.ts create mode 100644 src/settings.ts create mode 100644 src/templateManager.ts create mode 100644 src/templates/cyber.json create mode 100644 src/templates/default.json create mode 100644 src/templates/elegant.json create mode 100644 src/templates/forest.json create mode 100644 src/templates/index.ts create mode 100644 src/templates/metal.json create mode 100644 src/templates/minimal.json create mode 100644 src/templates/ocean.json create mode 100644 src/templates/sakura.json create mode 100644 src/templates/starry.json create mode 100644 src/templates/warm.json create mode 100644 src/view.ts create mode 100644 styles.css create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e3f30a3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# Node +node_modules/ +npm-debug.log +*.log + +# Build +main.js +*.js.map + +# macOS +.DS_Store + +# IDE +.idea/ +.vscode/ +*.swp +*.swo + +# Obsidian +.obsidian/ \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..33d0fe6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 夜半Yeban + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..f769f93 --- /dev/null +++ b/README.md @@ -0,0 +1,58 @@ +# Note to RED + +一键将 Obsidian 笔记转换为小红书图片格式的插件。 + +## 功能特点 + +- 📝 使用二级标题分割内容,每个标题自动生成一张配图 +- 🎨 提供多种精美模板,支持自定义字体和字号 +- 👤 可自定义用户头像、昵称和页脚文案 +- 🔄 实时预览编辑效果 +- 📥 支持单页导出和批量导出 +- 🔒 锁定功能避免预览刷新打断书写 + +## 使用方法 + +1. 核心用法:用二级标题(##)分割内容,每个标题生成一张小红书配图 +2. 首图制作:单独调整首节字号至20-24px,使用【下载当前页】导出 +3. 长文优化:内容较多的章节可调小字号至14-16px后单独导出 +4. 批量操作:保持统一字号时,用【导出全部页】批量生成 +5. 模板切换:顶部选择器可切换不同视觉风格 +6. 实时编辑:解锁状态(🔓)下编辑文档即时预览效果 + +## 安装方法 + +### 从 Obsidian 社区插件安装(推荐) + +1. 打开 Obsidian 设置 +2. 转到第三方插件设置 +3. 关闭安全模式 +4. 点击浏览社区插件 +5. 搜索 "Note to RED" +6. 点击安装并启用插件 + +### 手动安装 + +1. 下载最新版本的 release 文件 +2. 解压后将文件夹复制到 Obsidian 插件目录:`{vault}/.obsidian/plugins/` +3. 重启 Obsidian +4. 在设置中启用插件 + +## 使用技巧 + +- 使用二级标题来分割不同的图片内容 +- 调整字号大小以适应不同长度的内容 +- 可以自定义头像和用户信息 +- 支持实时预览和编辑 +- 提供多种模板以适应不同场景 + +## 问题反馈 + +如果您在使用过程中遇到任何问题,或有任何功能建议,欢迎: + +1. 提交 [Issue](https://github.com/YeBan/note-to-red/issues) +2. 发送邮件至:[yuliu8090@gmail.com] + +## 许可证 + +MIT License。查看 [LICENSE](LICENSE) 获取更多信息。 \ No newline at end of file diff --git a/assets/donate.png b/assets/donate.png new file mode 100644 index 0000000000000000000000000000000000000000..b8b1ca3fd7efa03a4ae08d6b40a4792ae9dbd174 GIT binary patch literal 138192 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

=%;ca$HCNCZ)~@0aE7^c}%yZRG)xk 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 XY;HP!>{-v@-wLv-&kCOY{r3L>U*$b9 literal 0 HcmV?d00001 diff --git a/assets/qrcode.png b/assets/qrcode.png new file mode 100644 index 0000000000000000000000000000000000000000..15c449e80e8dfa35c752a7382bd679794efa9962 GIT binary patch literal 47060 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" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.3.tgz", + "integrity": "sha512-XvJsYo3dO3Pi4kpalkyMvfQsjxPWHYjoX4MDiB/FUM4YMfWcXa5l4VCwFWVYI1+92yxqjuqrhNg0CZg3gSouyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.3.tgz", + "integrity": "sha512-nuV2CmLS07Gqh5/GrZLuqkU9Bm6H6vcCspM+zjp9TdQlxJtIe+qqEXQChmfc7nWdyr/yz3h45Utk1tUn8Cz5+A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.3.tgz", + "integrity": "sha512-01Hxaaat6m0Xp9AXGM8mjFtqqwDjzlMP0eQq9zll9U85ttVALGCGDuEvra5Feu/NbP5AEP1MaopPwzsTcUq1cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.3.tgz", + "integrity": "sha512-Eo2gq0Q/er2muf8Z83X21UFoB7EU6/m3GNKvrhACJkjVThd0uA+8RfKpfNhuMCl1bKRfBzKOk6xaYKQZ4lZqvA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.3.tgz", + "integrity": "sha512-CN62ESxaquP61n1ZjQP/jZte8CE09M6kNn3baos2SeUfdVBkWN5n6vGp2iKyb/bm/x4JQzEvJgRHLGd5F5b81w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.3.tgz", + "integrity": "sha512-feq+K8TxIznZE+zhdVurF3WNJ/Sa35dQNYbaqM/wsCbWdzXr5lyq+AaTUSER2cUR+SXPnd/EY75EPRjf4s1SLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.3.tgz", + "integrity": "sha512-CLP3EgyNuPcg2cshbwkqYy5bbAgK+VhyfMU7oIYyn+x4Y67xb5C5ylxsNUjRmr8BX+MW3YhVNm6Lq6FKtRTWHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.3.tgz", + "integrity": "sha512-JHeZXD4auLYBnrKn6JYJ0o5nWJI9PhChA/Nt0G4MvLaMrvXuWnY93R3a7PiXeJQphpL1nYsaMcoV2QtuvRnF/g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.3.tgz", + "integrity": "sha512-FyXlD2ZjZqTFh0sOQxFDiWG1uQUEOLbEh9gKN/7pFxck5Vw0qjWSDqbn6C10GAa1rXJpwsntHcmLqydY9ST9ZA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.3.tgz", + "integrity": "sha512-OrDGMvDBI2g7s04J8dh8/I7eSO+/E7nMDT2Z5IruBfUO/RiigF1OF6xoH33Dn4W/OwAWSUf1s2nXamb28ZklTA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.3.tgz", + "integrity": "sha512-DcnUpXnVCJvmv0TzuLwKBC2nsQHle8EIiAJiJ+PipEVC16wHXaPEKP0EqN8WnBe0TPvMITOUlP2aiL5YMld+CQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.3.tgz", + "integrity": "sha512-BDYf/l1WVhWE+FHAW3FzZPtVlk9QsrwsxGzABmN4g8bTjmhazsId3h127pliDRRu5674k1Y2RWejbpN46N9ZhQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.3.tgz", + "integrity": "sha512-WViAxWYMRIi+prTJTyV1wnqd2mS2cPqJlN85oscVhXdb/ZTFJdrpaqm/uDsZPGKHtbg5TuRX/ymKdOSk41YZow==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.3.tgz", + "integrity": "sha512-Iw8lkNHUC4oGP1O/KhumcVy77u2s6+KUjieUqzEU3XuWJqZ+AY7uVMrrCbAiwWTkpQHkr00BuXH5RpC6Sb/7Ug==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.3.tgz", + "integrity": "sha512-0AGkWQMzeoeAtXQRNB3s4J1/T2XbigM2/Mn2yU1tQSmQRmHIZdkGbVq2A3aDdNslPyhb9/lH0S5GMTZ4xsjBqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.3.tgz", + "integrity": "sha512-4+rR/WHOxIVh53UIQIICryjdoKdHsFZFD4zLSonJ9RRw7bhKzVyXbnRPsWSfwybYqw9sB7ots/SYyufL1mBpEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.3.tgz", + "integrity": "sha512-cVpWnkx9IYg99EjGxa5Gc0XmqumtAwK3aoz7O4Dii2vko+qXbkHoujWA68cqXjhh6TsLaQelfDO4MVnyr+ODeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.3.tgz", + "integrity": "sha512-RxmhKLbTCDAY2xOfrww6ieIZkZF+KBqG7S2Ako2SljKXRFi+0863PspK74QQ7JpmWwncChY25JTJSbVBYGQk2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.3.tgz", + "integrity": "sha512-0r36VeEJ4efwmofxVJRXDjVRP2jTmv877zc+i+Pc7MNsIr38NfsjkQj23AfF7l0WbB+RQ7VUb+LDiqC/KY/M/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.3.tgz", + "integrity": "sha512-wgO6rc7uGStH22nur4aLFcq7Wh86bE9cOFmfTr/yxN3BXvDEdCSXyKkO+U5JIt53eTOgC47v9k/C1bITWL/Teg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.3.tgz", + "integrity": "sha512-FdVl64OIuiKjgXBjwZaJLKp0eaEckifbhn10dXWhysMJkWblg3OEEGKSIyhiD5RSgAya8WzP3DNkngtIg3Nt7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/codemirror": { + "version": "5.60.8", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.8.tgz", + "integrity": "sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/tern": "*" + } + }, + "node_modules/@types/dom-to-image": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/@types/dom-to-image/-/dom-to-image-2.6.7.tgz", + "integrity": "sha512-me5VbCv+fcXozblWwG13krNBvuEOm6kA5xoa4RrjDJCNFOZSWR3/QLtOXimBHk1Fisq69Gx3JtOoXtg1N1tijg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jszip": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@types/jszip/-/jszip-3.4.0.tgz", + "integrity": "sha512-GFHqtQQP3R4NNuvZH3hNCYD0NbyBZ42bkN7kO3NDrU/SnvIZWMS8Bp38XCsRKBT5BXvgm0y1zqpZWp/ZkRzBzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "jszip": "*" + } + }, + "node_modules/@types/node": { + "version": "16.18.126", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", + "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tern": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", + "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.29.0.tgz", + "integrity": "sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "5.29.0", + "@typescript-eslint/type-utils": "5.29.0", + "@typescript-eslint/utils": "5.29.0", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz", + "integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.29.0", + "@typescript-eslint/types": "5.29.0", + "@typescript-eslint/typescript-estree": "5.29.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz", + "integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.29.0", + "@typescript-eslint/visitor-keys": "5.29.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.29.0.tgz", + "integrity": "sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "5.29.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz", + "integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz", + "integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.29.0", + "@typescript-eslint/visitor-keys": "5.29.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.29.0.tgz", + "integrity": "sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.29.0", + "@typescript-eslint/types": "5.29.0", + "@typescript-eslint/typescript-estree": "5.29.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz", + "integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.29.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0", + "peer": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-line-break": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + "license": "MIT", + "dependencies": { + "utrie": "^1.0.2" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-to-image": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/dom-to-image/-/dom-to-image-2.6.0.tgz", + "integrity": "sha512-Dt0QdaHmLpjURjU7Tnu3AgYSF2LuOmksSGsUcE6ItvJoCWTBEmiMXcqBdNSAm9+QbbwD7JMoVsuuKX6ZVQv1qA==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.3.tgz", + "integrity": "sha512-9n3AsBRe6sIyOc6kmoXg2ypCLgf3eZSraWFRpnkto+svt8cZNuKTkb1bhQcitBcvIqjNiK7K0J3KPmwGSfkA8g==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.3", + "@esbuild/android-arm64": "0.17.3", + "@esbuild/android-x64": "0.17.3", + "@esbuild/darwin-arm64": "0.17.3", + "@esbuild/darwin-x64": "0.17.3", + "@esbuild/freebsd-arm64": "0.17.3", + "@esbuild/freebsd-x64": "0.17.3", + "@esbuild/linux-arm": "0.17.3", + "@esbuild/linux-arm64": "0.17.3", + "@esbuild/linux-ia32": "0.17.3", + "@esbuild/linux-loong64": "0.17.3", + "@esbuild/linux-mips64el": "0.17.3", + "@esbuild/linux-ppc64": "0.17.3", + "@esbuild/linux-riscv64": "0.17.3", + "@esbuild/linux-s390x": "0.17.3", + "@esbuild/linux-x64": "0.17.3", + "@esbuild/netbsd-x64": "0.17.3", + "@esbuild/openbsd-x64": "0.17.3", + "@esbuild/sunos-x64": "0.17.3", + "@esbuild/win32-arm64": "0.17.3", + "@esbuild/win32-ia32": "0.17.3", + "@esbuild/win32-x64": "0.17.3" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html2canvas": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", + "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", + "license": "MIT", + "dependencies": { + "css-line-break": "^2.1.0", + "text-segmentation": "^1.0.3" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/obsidian": { + "version": "1.8.7", + "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.8.7.tgz", + "integrity": "sha512-h4bWwNFAGRXlMlMAzdEiIM2ppTGlrh7uGOJS6w4gClrsjc+ei/3YAtU2VdFUlCiPuTHpY4aBpFJJW75S1Tl/JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/codemirror": "5.60.8", + "moment": "2.29.4" + }, + "peerDependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-mod": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", + "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-segmentation": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", + "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", + "license": "MIT", + "dependencies": { + "utrie": "^1.0.2" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utrie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", + "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", + "license": "MIT", + "dependencies": { + "base64-arraybuffer": "^1.0.2" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f355868 --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "name": "note-to-red", + "version": "1.0.0", + "description": "一键将 Obsidian 笔记转换为小红书图片格式", + "main": "main.js", + "scripts": { + "dev": "node esbuild.config.mjs", + "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", + "version": "node version-bump.mjs && git add manifest.json versions.json" + }, + "keywords": [ + "obsidian", + "plugin", + "xiaohongshu" + ], + "author": "", + "license": "MIT", + "devDependencies": { + "@types/dom-to-image": "^2.6.7", + "@types/jszip": "^3.4.0", + "@types/node": "^16.11.6", + "@typescript-eslint/eslint-plugin": "5.29.0", + "@typescript-eslint/parser": "5.29.0", + "builtin-modules": "3.3.0", + "esbuild": "0.17.3", + "obsidian": "latest", + "tslib": "2.4.0", + "typescript": "4.7.4" + }, + "dependencies": { + "dom-to-image": "^2.6.0", + "html2canvas": "^1.4.1", + "jszip": "^3.10.1" + } +} diff --git a/src/backgroundManager.ts b/src/backgroundManager.ts new file mode 100644 index 0000000..2f03a73 --- /dev/null +++ b/src/backgroundManager.ts @@ -0,0 +1,43 @@ +import { backgrounds } from './backgrounds'; + +export interface Background { + id: string; + name: string; + style: string; +} + +export class BackgroundManager { + private backgrounds: Background[]; + private currentBackground: Background | null = null; + + constructor() { + this.backgrounds = backgrounds.backgrounds; + } + + public getAllBackgrounds(): Background[] { + return this.backgrounds; + } + + public setBackground(id: string | null) { + if (!id) { + this.currentBackground = null; + return; + } + const background = this.backgrounds.find(bg => bg.id === id); + if (background) { + this.currentBackground = background; + } + } + + public applyBackground(element: HTMLElement) { + // 修改选择器为目标预览容器 + const previewContainer = element.querySelector('.red-image-preview'); + if (!previewContainer) return; + + if (!this.currentBackground) { + previewContainer.setAttribute('style', ''); // 清除样式 + return; + } + previewContainer.setAttribute('style', this.currentBackground.style); + } +} \ No newline at end of file diff --git a/src/backgrounds/index.ts b/src/backgrounds/index.ts new file mode 100644 index 0000000..77387d6 --- /dev/null +++ b/src/backgrounds/index.ts @@ -0,0 +1,39 @@ +export const backgrounds = { + backgrounds: [ + { + id: "grid", + name: "网格", + style: "box-sizing: border-box; background-color: white; background-image: linear-gradient(90deg, rgba(50, 0, 0, 0.03) 2%, rgba(0, 0, 0, 0) 2%), linear-gradient(360deg, rgba(50, 0, 0, 0.03) 2%, rgba(0, 0, 0, 0) 2%); background-size: 20px 20px; background-position: center center;" + }, + { + id: "crosshatch", + name: "交叉", + style: "box-sizing: border-box; background-color: white; background-image: repeating-linear-gradient(45deg, rgba(50, 0, 0, 0.02) 0, rgba(50, 0, 0, 0.02) 1px, transparent 1px, transparent 50%), repeating-linear-gradient(-45deg, rgba(50, 0, 0, 0.02) 0, rgba(50, 0, 0, 0.02) 1px, transparent 1px, transparent 50%); background-size: 20px 20px;" + }, + { + id: "dots", + name: "圆点", + style: "box-sizing: border-box; background-color: white; background-image: radial-gradient(rgba(50, 0, 0, 0.03) 1px, transparent 1px); background-size: 20px 20px; background-position: center center;" + }, + { + id: "dash", + name: "虚线", + style: "box-sizing: border-box; background-color: white; background-image: linear-gradient(90deg, rgba(50, 0, 0, 0.03) 50%, transparent 50%); background-size: 8px 1px; background-position: center center;" + }, + { + id: "wave", + name: "波浪", + style: "box-sizing: border-box; background-color: white; background-image: linear-gradient(45deg, rgba(50, 0, 0, 0.04) 12%, transparent 12%, transparent 88%, rgba(50, 0, 0, 0.04) 88%), linear-gradient(135deg, rgba(50, 0, 0, 0.04) 12%, transparent 12%, transparent 88%, rgba(50, 0, 0, 0.04) 88%), linear-gradient(45deg, rgba(50, 0, 0, 0.04) 12%, transparent 12%, transparent 88%, rgba(50, 0, 0, 0.04) 88%), linear-gradient(135deg, rgba(50, 0, 0, 0.04) 12%, transparent 12%, transparent 88%, rgba(50, 0, 0, 0.04) 88%); background-size: 30px 30px; background-position: 0 0, 0 0, 15px 15px, 15px 15px;" + }, + { + id: "checkerboard", + name: "棋盘", + style: "box-sizing: border-box; background-color: white; background-image: linear-gradient(45deg, rgba(50, 0, 0, 0.04) 25%, transparent 25%), linear-gradient(-45deg, rgba(50, 0, 0, 0.04) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, rgba(50, 0, 0, 0.04) 75%), linear-gradient(-45deg, transparent 75%, rgba(50, 0, 0, 0.04) 75%); background-size: 20px 20px; background-position: 0 0, 0 10px, 10px -10px, -10px 0px;" + }, + { + id: "dark", + name: "暗黑", + style: "box-sizing: border-box; background-color: #1a1a1a; background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.03) 25%, transparent 25%), linear-gradient(-45deg, rgba(255, 255, 255, 0.03) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, rgba(255, 255, 255, 0.03) 75%), linear-gradient(-45deg, transparent 75%, rgba(255, 255, 255, 0.03) 75%); background-size: 20px 20px; background-position: 0 0, 0 10px, 10px -10px, -10px 0px;" + } + ] +}; \ No newline at end of file diff --git a/src/converter.ts b/src/converter.ts new file mode 100644 index 0000000..9375938 --- /dev/null +++ b/src/converter.ts @@ -0,0 +1,244 @@ +import { App } from 'obsidian'; + +export class RedConverter { + private static app: App; + + static initialize(app: App) { + this.app = app; + } + + static hasValidContent(element: HTMLElement): boolean { + const headers = element.querySelectorAll('h2'); + return headers.length > 0; + } + + static formatContent(element: HTMLElement): void { + const headers = Array.from(element.querySelectorAll('h2')); + + if (headers.length === 0) { + element.empty(); + const tip = element.createEl('div', { + cls: 'red-empty-message', + text: `⚠️ 温馨提示 + 请使用二级标题(##)来分割内容 + 每个二级标题将生成一张独立的图片 + 现在编辑文档,实时预览效果` + }); + // 触发自定义事件 + element.dispatchEvent(new CustomEvent('content-validation-change', { + detail: { isValid: false }, + bubbles: true + })); + return; + } + + // 触发自定义事件表示内容有效 + element.dispatchEvent(new CustomEvent('content-validation-change', { + detail: { isValid: true }, + bubbles: true + })); + + // 创建预览容器 + const previewContainer = document.createElement('div'); + previewContainer.className = 'red-preview-container'; + + // 创建图片预览区域 + const imagePreview = document.createElement('div'); + imagePreview.className = 'red-image-preview'; + + // 创建三个主要区域 + const headerArea = document.createElement('div'); + headerArea.className = 'red-preview-header'; + + const contentArea = document.createElement('div'); + contentArea.className = 'red-preview-content'; + + const footerArea = document.createElement('div'); + footerArea.className = 'red-preview-footer'; + + // 创建内容容器 + const contentContainer = document.createElement('div'); + contentContainer.className = 'red-content-container'; + + // 处理每个二级标题及其内容 + headers.forEach((header, index) => { + const section = this.createContentSection(header, index); + if (section) { + contentContainer.appendChild(section); + } + }); + + // 组装结构 + contentArea.appendChild(contentContainer); + imagePreview.appendChild(headerArea); + imagePreview.appendChild(contentArea); + imagePreview.appendChild(footerArea); + previewContainer.appendChild(imagePreview); + + // 处理完成后再清空原容器并添加新内容 + element.empty(); + element.appendChild(previewContainer); + } + + private static createContentSection(header: Element, index: number): HTMLElement | null { + // 获取当前标题到下一个标题之间的所有内容 + let content = []; + let current = header.nextElementSibling; + + while (current && current.tagName !== 'H2') { + content.push(current.cloneNode(true)); + current = current.nextElementSibling; + } + + // 创建内容区域 + const section = document.createElement('section'); + section.className = 'red-content-section'; + section.setAttribute('data-index', index.toString()); + + // 添加标题 + section.appendChild(header.cloneNode(true)); + + // 添加内容 + content.forEach(el => section.appendChild(el)); + + // 处理样式和格式 + this.processElements(section); + + return section; + } + + private static processElements(container: HTMLElement | null): void { + if (!container) return; + + // 处理强调文本 + container.querySelectorAll('strong, em').forEach(el => { + (el as HTMLElement).style.display = 'inline'; + }); + + // 处理链接 + container.querySelectorAll('a').forEach(el => { + (el as HTMLElement).style.color = '#576b95'; + (el as HTMLElement).style.textDecoration = 'none'; + }); + + // 处理表格 + container.querySelectorAll('table').forEach(el => { + if (el === container.closest('table')) return; + (el as HTMLTableElement).style.borderCollapse = 'collapse'; + (el as HTMLTableElement).style.margin = '1em 0'; + (el as HTMLTableElement).style.width = '100%'; + }); + + // 处理表格单元格 + container.querySelectorAll('th, td').forEach(el => { + if (el === container.closest('td')) return; + (el as HTMLTableCellElement).style.border = '1px solid #dfdfdf'; + (el as HTMLTableCellElement).style.padding = '8px'; + }); + + // 处理分割线 + container.querySelectorAll('hr').forEach(el => { + (el as HTMLElement).style.border = 'none'; + (el as HTMLElement).style.borderTop = '1px solid #dfdfdf'; + (el as HTMLElement).style.margin = '20px 0'; + }); + + // 处理删除线 + container.querySelectorAll('del').forEach(el => { + (el as HTMLElement).style.textDecoration = 'line-through'; + }); + + // 处理任务列表 + container.querySelectorAll('.task-list-item').forEach(el => { + (el as HTMLElement).style.listStyle = 'none'; + const checkbox = el.querySelector('input[type="checkbox"]'); + if (checkbox) { + (checkbox as HTMLElement).style.marginRight = '6px'; + } + }); + + // 处理脚注 + container.querySelectorAll('.footnote-ref, .footnote-backref').forEach(el => { + (el as HTMLElement).style.color = '#576b95'; + (el as HTMLElement).style.textDecoration = 'none'; + }); + + // 处理代码块 + container.querySelectorAll('pre code').forEach(el => { + const pre = el.parentElement; + if (pre) { + // 添加 macOS 风格的窗口按钮 + const dots = document.createElement('div'); + dots.style.cssText = ` + margin: 8px 0 12px 0; + display: flex; + gap: 6px; + `; + + const colors = ['#ff5f56', '#ffbd2e', '#27c93f']; + colors.forEach(color => { + const dot = document.createElement('span'); + dot.style.cssText = ` + width: 12px; + height: 12px; + border-radius: 50%; + background-color: ${color}; + `; + dots.appendChild(dot); + }); + + // 将红绿灯插入到代码块的最前面 + pre.insertBefore(dots, pre.firstChild); + pre.style.paddingTop = '32px'; + + // 移除原有的复制按钮 + const copyButton = pre.querySelector('.copy-code-button'); + if (copyButton) { + copyButton.remove(); + } + } + }); + + // 处理图片 + container.querySelectorAll('span.internal-embed[alt][src]').forEach(async el => { + const originalSpan = el as HTMLElement; + const src = originalSpan.getAttribute('src'); + const alt = originalSpan.getAttribute('alt'); + + if (!src) return; + + try { + // 获取文件的元数据 + const linktext = src.split('|')[0]; // 处理可能带有别名的链接 + const file = this.app.metadataCache.getFirstLinkpathDest(linktext, ''); + if (file) { + const absolutePath = this.app.vault.adapter.getResourcePath(file.path); + const newImg = document.createElement('img'); + newImg.src = absolutePath; + if (alt) newImg.alt = alt; + + // 应用样式 + newImg.style.maxWidth = '100%'; + newImg.style.height = 'auto'; + newImg.style.display = 'block'; + newImg.style.margin = '1em auto'; + + // 直接替换 span 元素,保留段落中的其他内容 + originalSpan.parentNode?.replaceChild(newImg, originalSpan); + } + } catch (error) { + console.error('图片处理失败:', error); + } + }); + + // 处理引用块 + container.querySelectorAll('blockquote').forEach(el => { + // 清理引用块内部段落的样式 + el.querySelectorAll('p').forEach(p => { + p.style.margin = '0'; + p.style.padding = '0'; + p.style.lineHeight = 'inherit'; + }); + }); + } +} diff --git a/src/donateManager.ts b/src/donateManager.ts new file mode 100644 index 0000000..1ec97a4 --- /dev/null +++ b/src/donateManager.ts @@ -0,0 +1,129 @@ + +import { App, Plugin } from 'obsidian'; + +export class DonateManager { + private static overlay: HTMLElement; + private static modal: HTMLElement; + private static app: App; + private static plugin: Plugin; + + public static initialize(app: App, plugin: Plugin) { + this.app = app; + this.plugin = plugin; + } + + public static showDonateModal(container: HTMLElement) { + this.overlay = container.createEl('div', { + cls: 'mp-donate-overlay' + }); + + this.modal = this.overlay.createEl('div', { + cls: 'mp-about-modal' + }); + + // 添加关闭按钮 + const closeButton = this.modal.createEl('button', { + cls: 'mp-donate-close', + text: '×' + }); + + // 添加作者信息区域 + const authorSection = this.modal.createEl('div', { + cls: 'mp-about-section mp-about-intro-section' + }); + + authorSection.createEl('h4', { + text: '关于作者', + cls: 'mp-about-title' + }); + + const introEl = authorSection.createEl('p', { + cls: 'mp-about-intro' + }); + introEl.innerHTML = '你好,我是【夜半】,一名全职写作与独立开发者。'; + + const roleList = authorSection.createEl('div', { + cls: 'mp-about-roles' + }); + + const roleEl = roleList.createEl('p', { + cls: 'mp-about-role' + }); + roleEl.innerHTML = `这款插件是我为了在 Obsidian 写作后,
+ 无需繁琐排版一键即可发布到小红书而开发的工具,
+ 希望能让你的排版更轻松, + 让你的创作更高效。`; + + // 添加插件介绍 + const descEl = authorSection.createEl('p', { + cls: 'mp-about-desc' + }); + descEl.innerHTML = `如果这款插件对你有帮助,
或者你愿意支持我的独立开发与写作,欢迎请我喝咖啡☕️。
+ 你的支持对我来说意义重大,它能让我更专注地开发、写作。`; + + // 添加打赏区域 + const donateSection = this.modal.createEl('div', { + cls: 'mp-about-section mp-about-donate-section' + }); + + donateSection.createEl('h4', { + text: '请我喝咖啡', + cls: 'mp-about-subtitle' + }); + + const donateQR = donateSection.createEl('div', { + cls: 'mp-about-qr' + }); + donateQR.createEl('img', { + attr: { + src: this.app.vault.adapter.getResourcePath(`${this.plugin.manifest.dir}/assets/donate.png`), + alt: '打赏二维码' + } + }); + + // 添加公众号区域 + const mpSection = this.modal.createEl('div', { + cls: 'mp-about-section mp-about-mp-section' + }); + + const mpDescEl = mpSection.createEl('p', { + cls: 'mp-about-desc' + }); + mpDescEl.innerHTML = `如果你想了解更多关于创作、效率工具的小技巧,
+ 或者关注我未来的写作动态,欢迎关注我的微信公众号。`; + + mpSection.createEl('h4', { + text: '微信公众号', + cls: 'mp-about-subtitle' + }); + + const mpQR = mpSection.createEl('div', { + cls: 'mp-about-qr' + }); + mpQR.createEl('img', { + attr: { + src: this.app.vault.adapter.getResourcePath(`${this.plugin.manifest.dir}/assets/qrcode.png`), + alt: '公众号二维码' + } + }); + + const footerEl = mpSection.createEl('p', { + cls: 'mp-about-footer' + }); + footerEl.innerHTML = '期待与你一起,在创作的世界里找到属于自己的意义。'; + + // 添加关闭事件 + closeButton.addEventListener('click', () => this.closeDonateModal()); + this.overlay.addEventListener('click', (e) => { + if (e.target === this.overlay) { + this.closeDonateModal(); + } + }); + } + + private static closeDonateModal() { + if (this.overlay) { + this.overlay.remove(); + } + } +} \ No newline at end of file diff --git a/src/downloadManager.ts b/src/downloadManager.ts new file mode 100644 index 0000000..991e549 --- /dev/null +++ b/src/downloadManager.ts @@ -0,0 +1,89 @@ +import domtoimage from 'dom-to-image'; // 替换为 dom-to-image +import JSZip from 'jszip'; + +export class DownloadManager { + // 添加共用的导出配置方法 + private static getExportConfig(imageElement: HTMLElement) { + return { + quality: 1, + width: imageElement.offsetWidth * 4, + height: imageElement.offsetHeight * 4, + style: { + transform: 'scale(4)', + 'transform-origin': 'top left', + } + }; + } + + static async downloadAllImages(element: HTMLElement): Promise { + try { + const zip = new JSZip(); + const previewContainer = element.querySelector('.red-preview-container'); + if (!previewContainer) { + throw new Error('找不到预览容器'); + } + + const sections = previewContainer.querySelectorAll('.red-content-section'); + const totalSections = sections.length; + const originalDisplayStates = Array.from(sections).map( + s => (s as HTMLElement).style.display + ); + + for (let i = 0; i < totalSections; i++) { + sections.forEach(s => (s as HTMLElement).style.display = 'none'); + (sections[i] as HTMLElement).style.display = 'block'; + + const imageElement = element.querySelector('.red-image-preview') as HTMLElement; + const blob = await domtoimage.toBlob(imageElement, this.getExportConfig(imageElement)); + zip.file(`小红书笔记_第${i + 1}页.png`, blob); + } + + // 恢复所有 sections 的原始显示状态 + sections.forEach((s, index) => { + (s as HTMLElement).style.display = originalDisplayStates[index]; + }); + + // 生成 zip 文件并下载 + const content = await zip.generateAsync({ type: "blob" }); + const url = URL.createObjectURL(content); + const link = document.createElement('a'); + link.href = url; + link.download = `小红书笔记_${new Date().getTime()}.zip`; + + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); + + } catch (error) { + console.error('导出图片失败:', error); + throw error; + } + } + + static async downloadSingleImage(element: HTMLElement): Promise { + try { + const imageElement = element.querySelector('.red-image-preview') as HTMLElement; + if (!imageElement) { + throw new Error('找不到预览区域'); + } + + const blob = await domtoimage.toBlob(imageElement, this.getExportConfig(imageElement)); + + // 创建下载链接并触发下载 + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = `小红书笔记_${new Date().getTime()}.png`; + + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); + + } catch (error) { + console.error('导出图片失败:', error); + throw error; + } + } +} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..1b71938 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,77 @@ +import { Plugin, Notice } from 'obsidian'; +import { RedView, VIEW_TYPE_RED } from './view'; // 暂时改回原来的导入 +import { TemplateManager } from './templateManager'; +import { SettingsManager } from './settings'; +import { RedConverter } from './converter'; // 暂时使用原来的转换器 +import { DonateManager } from './donateManager'; + +export default class RedPlugin extends Plugin { + private settingsManager: SettingsManager; + + async onload() { + // 初始化设置管理器 + this.settingsManager = new SettingsManager(this); + await this.settingsManager.loadSettings(); + + // 初始化模板管理器 + const templateManager = new TemplateManager(this.app); + + // 初始化转换器 + RedConverter.initialize(this.app); + + DonateManager.initialize(this.app, this); + + // 注册视图 + this.registerView( + VIEW_TYPE_RED, + (leaf) => new RedView(leaf, templateManager, this.settingsManager) + ); + + // 添加首次加载自动打开视图的逻辑 + this.app.workspace.onLayoutReady(() => { + if (this.app.workspace.getLeavesOfType(VIEW_TYPE_RED).length === 0) { + const leaf = this.app.workspace.getRightLeaf(false); + if (leaf) { + leaf.setViewState({ + type: VIEW_TYPE_RED, + active: false // 设置为 false 表示不聚焦 + }); + } + } + }); + + // 添加命令到命令面板 + this.addCommand({ + id: 'open-mp-preview', + name: '打开小红书图片预览', + callback: async () => { + await this.activateView(); + } + }); + } + + async onunload() { + // 清理视图 + this.app.workspace.detachLeavesOfType(VIEW_TYPE_RED); // 使用原来的视图类型 + } + + async activateView() { + // 如果视图已经存在,激活它 + const leaves = this.app.workspace.getLeavesOfType(VIEW_TYPE_RED); // 使用原来的视图类型 + if (leaves.length > 0) { + this.app.workspace.revealLeaf(leaves[0]); + return; + } + + // 创建新视图 + const rightLeaf = this.app.workspace.getRightLeaf(false); + if (rightLeaf) { + await rightLeaf.setViewState({ + type: VIEW_TYPE_RED, + active: true, + }); + } else { + new Notice('无法创建视图面板'); + } + } +} \ No newline at end of file diff --git a/src/previewManager.ts b/src/previewManager.ts new file mode 100644 index 0000000..1879495 --- /dev/null +++ b/src/previewManager.ts @@ -0,0 +1,156 @@ +import type { SettingsManager } from './settings'; + +export class PreviewManager { + constructor(private settingsManager: SettingsManager) {} + + // 创建页头内容 + createHeaderContent(headerArea: HTMLElement, handleAvatarClick: () => void, + handleUserNameEdit: (el: HTMLElement) => void, + handleUserIdEdit: (el: HTMLElement) => void) { + headerArea.empty(); + const settings = this.settingsManager.getSettings(); + const userInfo = headerArea.createEl('div', { cls: 'red-user-info' }); + + // 左侧用户信息区 + const userLeft = userInfo.createEl('div', { cls: 'red-user-left' }); + + // 用户头像 + const avatar = userLeft.createEl('div', { + cls: 'red-user-avatar', + attr: { 'title': '点击上传头像' } + }); + + if (settings.userAvatar) { + avatar.createEl('img', { + attr: { + src: settings.userAvatar, + alt: '用户头像' + } + }); + } else { + const placeholder = avatar.createEl('div', { + cls: 'red-avatar-placeholder' + }); + placeholder.createEl('span', { + cls: 'red-avatar-upload-icon', + text: '📷' + }); + } + + avatar.addEventListener('click', handleAvatarClick); + + // 用户信息区 + const userMeta = userLeft.createEl('div', { cls: 'red-user-meta' }); + + const userNameContainer = userMeta.createEl('div', { + cls: 'red-user-name-container' + }); + + const userName = userNameContainer.createEl('div', { + cls: 'red-user-name', + text: settings.userName, + attr: { 'title': '点击编辑用户名' } + }); + + userNameContainer.createEl('div', { + cls: 'red-verified-icon', + text: '✓' + }); + + const userId = userMeta.createEl('div', { + cls: 'red-user-id', + text: settings.userId, + attr: { 'title': '点击编辑用户ID' } + }); + + userName.addEventListener('click', () => handleUserNameEdit(userName)); + userId.addEventListener('click', () => handleUserIdEdit(userId)); + + if (settings.showTime) { + const userRight = userInfo.createEl('div', { cls: 'red-user-right' }); + userRight.createEl('div', { + cls: 'red-post-time', + text: new Date().toLocaleDateString(settings.timeFormat) + }); + } + } + + // 创建页脚内容 + createFooterContent(footerArea: HTMLElement, handleFooterTextEdit: (el: HTMLElement, position: 'left' | 'right') => void) { + footerArea.empty(); + const settings = this.settingsManager.getSettings(); + + // 直接使用 footerArea,移除多余的容器创建 + // 创建左侧文本 + const leftText = footerArea.createEl('div', { + cls: 'red-footer-text', + text: settings.footerLeftText, + attr: { 'title': '点击编辑文本' } + }); + + // 创建分隔符 + footerArea.createEl('div', { + cls: 'red-footer-separator', + text: '|' + }); + + // 创建右侧文本 + const rightText = footerArea.createEl('div', { + cls: 'red-footer-text', + text: settings.footerRightText, + attr: { 'title': '点击编辑文本' } + }); + + // 添加点击编辑事件 + leftText.addEventListener('click', () => handleFooterTextEdit(leftText, 'left')); + rightText.addEventListener('click', () => handleFooterTextEdit(rightText, 'right')); + } + + // 创建导航按钮 + createNavigationButtons(container: HTMLElement, totalImages: number, onNavigate: (direction: 'prev' | 'next') => void) { + const previewContainer = container.querySelector('.red-preview-container'); + if (!previewContainer) return; + + const navContainer = previewContainer.createEl('div', { + cls: 'red-nav-container' + }); + + const prevButton = navContainer.createEl('button', { + cls: 'red-nav-button', + text: '←' + }); + + const indicator = navContainer.createEl('span', { + cls: 'red-page-indicator', + text: `1/${totalImages}` + }); + + const nextButton = navContainer.createEl('button', { + cls: 'red-nav-button', + text: '→' + }); + + // 添加导航事件 + prevButton.addEventListener('click', () => onNavigate('prev')); + nextButton.addEventListener('click', () => onNavigate('next')); + + return { prev: prevButton, next: nextButton, indicator }; + } + + // 显示指定索引的图片 + showImage(index: number, sections: NodeListOf, navigationButtons?: { + prev: HTMLButtonElement; + next: HTMLButtonElement; + indicator: HTMLElement; + }) { + sections.forEach((section, i) => { + (section as HTMLElement).style.display = i === index ? 'block' : 'none'; + }); + + if (navigationButtons) { + navigationButtons.prev.style.visibility = index === 0 ? 'hidden' : 'visible'; + navigationButtons.next.style.visibility = index === sections.length - 1 ? 'hidden' : 'visible'; + navigationButtons.indicator.textContent = `${index + 1}/${sections.length}`; + } + } +} \ No newline at end of file diff --git a/src/settings.ts b/src/settings.ts new file mode 100644 index 0000000..b3881bc --- /dev/null +++ b/src/settings.ts @@ -0,0 +1,57 @@ +interface RedSettings { + templateId: string; + fontFamily: string; + fontSize: number; + backgroundId: string; + // 添加用户信息设置 + userAvatar: string; + userName: string; + userId: string; + showTime: boolean; + timeFormat: string; + footerLeftText: string; + footerRightText: string; +} + +const DEFAULT_SETTINGS: RedSettings = { + templateId: 'default', + fontFamily: 'Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC"', + fontSize: 16, + backgroundId: '', + // 修改默认用户信息 + userAvatar: '', // 默认为空,提示用户上传 + userName: '夜半', + userId: '@Yeban', + showTime: true, + timeFormat: 'zh-CN', + footerLeftText: '夜半过后,光明便启程', + footerRightText: '欢迎关注公众号:夜半' + +} + +export class SettingsManager { + private plugin: any; + private settings: RedSettings; + + constructor(plugin: any) { + this.plugin = plugin; + this.settings = DEFAULT_SETTINGS; + } + + async loadSettings() { + this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.plugin.loadData()); + } + + async saveSettings() { + await this.plugin.saveData(this.settings); + } + + getSettings(): RedSettings { + return this.settings; + } + + async updateSettings(settings: Partial) { + this.settings = { ...this.settings, ...settings }; + await this.saveSettings(); + } +} diff --git a/src/templateManager.ts b/src/templateManager.ts new file mode 100644 index 0000000..3ed55d4 --- /dev/null +++ b/src/templateManager.ts @@ -0,0 +1,319 @@ +import { App } from 'obsidian'; +import { templates } from './templates'; + +interface Template { + id: string; + name: string; + styles: { + // 容器基础样式 + imagePreview: string; + // 页眉样式组 + header: { + avatar: { + container: string; + placeholder: string; + image: string; + }; + nameContainer: string; + userName: string; + userId: string; + postTime: string; + verifiedIcon: string; + }; + // 页脚样式组 + footer: { + container: string; + text: string; + separator: string; + }; + title: { + h1: { + base: string; + content: string; + after: string; + }; + h2: { + base: string; + content: string; + after: string; + }; + h3: { + base: string; + content: string; + after: string; + }; + base: { + base: string; + content: string; + after: string; + }; + }; + paragraph: string; + list: { + container: string; + item: string; + taskList: string; + }; + quote: string; + code: { + block: string; + inline: string; + }; + image: string; + link: string; + emphasis: { + strong: string; + em: string; + del: string; + }; + table: { + container: string; + header: string; + cell: string; + }; + hr: string; + footnote: { + ref: string; + backref: string; + }; + }; +} + +export class TemplateManager { + private templates: Map = new Map(); + private currentTemplate: Template; + private currentFont: string = '-apple-system'; + private currentFontSize: number = 16; + private app: App; + + constructor(app: App) { + this.app = app; + this.loadTemplates(); // 加载模板 + } + + public async loadTemplates() { + try { + // 直接从内置模板加载 + Object.values(templates).forEach(template => { + this.templates.set(template.id, template); + if (template.id === 'default') { + this.currentTemplate = template; + } + }); + } catch (error) { + console.error('加载模板失败:', error); + throw new Error('无法加载模板文件'); + } + } + + public getTemplate(id: string): Template | undefined { + return this.templates.get(id); + } + + public getCurrentTemplate(): Template { + return this.currentTemplate; + } + + public setCurrentTemplate(id: string): boolean { + const template = this.templates.get(id); + if (template) { + this.currentTemplate = template; + return true; + } + return false; + } + + public getAllTemplates(): Template[] { + return Array.from(this.templates.values()); + } + + public setFont(fontFamily: string) { + this.currentFont = fontFamily; + } + + public setFontSize(size: number) { + this.currentFontSize = size; + } + + // 修改 applyTemplate 方法 + public applyTemplate(element: HTMLElement): void { + const styles = this.currentTemplate.styles; + + // 修改应用基础样式的方式 + const imagePreview = element.querySelector('.red-image-preview'); + if (imagePreview) { + imagePreview.setAttribute('style', styles.imagePreview); + } + + // 应用页眉样式 + const header = element.querySelector('.red-preview-header'); + if (header) { + // 用户头像 + header.querySelectorAll('.red-user-avatar').forEach(el => { + el.setAttribute('style', styles.header.avatar.container); + }); + header.querySelectorAll('.red-avatar-placeholder').forEach(el => { + el.setAttribute('style', styles.header.avatar.placeholder); + }); + header.querySelectorAll('.red-user-avatar img').forEach(el => { + el.setAttribute('style', styles.header.avatar.image); + }); + + // 用户名容器 + header.querySelectorAll('.red-user-name-container').forEach(el => { + el.setAttribute('style', styles.header.nameContainer); + }); + + // 用户名 + header.querySelectorAll('.red-user-name').forEach(el => { + el.setAttribute('style', styles.header.userName); + }); + + // 用户ID + header.querySelectorAll('.red-user-id').forEach(el => { + el.setAttribute('style', styles.header.userId); + }); + + // 发布时间 + header.querySelectorAll('.red-post-time').forEach(el => { + el.setAttribute('style', styles.header.postTime); + }); + + // 认证图标 + header.querySelectorAll('.red-verified-icon').forEach(el => { + el.setAttribute('style', styles.header.verifiedIcon); + }); + } + + // 应用页脚样式 + const footer = element.querySelector('.red-preview-footer'); + if (footer) { + // 页脚容器 + footer.setAttribute('style', styles.footer.container); + + // 页脚文本 + footer.querySelectorAll('.red-footer-text').forEach(el => { + el.setAttribute('style', styles.footer.text); + }); + + // 分隔符 + footer.querySelectorAll('.red-footer-separator').forEach(el => { + el.setAttribute('style', styles.footer.separator); + }); + } + + // 应用标题样式 + ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].forEach(tag => { + element.querySelectorAll(tag).forEach(el => { + // 检查是否已经处理过 + if (!el.querySelector('.content')) { + const content = document.createElement('span'); + content.className = 'content'; + content.innerHTML = el.innerHTML; + el.innerHTML = ''; + el.appendChild(content); + + const after = document.createElement('span'); + after.className = 'after'; + el.appendChild(after); + } + + // 根据标签选择对应的样式 + const styleKey = (tag === 'h4' || tag === 'h5' || tag === 'h6' ? 'base' : tag) as keyof typeof styles.title; + const titleStyle = styles.title[styleKey]; + + // 应用样式 + el.setAttribute('style', `${titleStyle.base}; font-family: ${this.currentFont};`); + el.querySelector('.content')?.setAttribute('style', titleStyle.content); + el.querySelector('.after')?.setAttribute('style', titleStyle.after); + }); + }); + + // 应用段落样式 + element.querySelectorAll('p').forEach(el => { + if (!el.parentElement?.closest('p') && !el.parentElement?.closest('blockquote')) { + el.setAttribute('style', `${styles.paragraph}; font-family: ${this.currentFont}; font-size: ${this.currentFontSize}px;`); + } + }); + + // 应用列表样式 + element.querySelectorAll('ul, ol').forEach(el => { + el.setAttribute('style', styles.list.container); + }); + element.querySelectorAll('li').forEach(el => { + el.setAttribute('style', `${styles.list.item}; font-family: ${this.currentFont}; font-size: ${this.currentFontSize}px;`); + }); + element.querySelectorAll('.task-list-item').forEach(el => { + el.setAttribute('style', `${styles.list.taskList}; font-family: ${this.currentFont}; font-size: ${this.currentFontSize}px;`); + }); + + // 应用引用样式 + element.querySelectorAll('blockquote').forEach(el => { + el.setAttribute('style', `${styles.quote}; font-family: ${this.currentFont}; font-size: ${this.currentFontSize}px;`); + }); + + // 应用代码样式 + element.querySelectorAll('pre').forEach(el => { + el.setAttribute('style', `${styles.code.block}; font-size: ${this.currentFontSize}px;`); + }); + element.querySelectorAll('code:not(pre code)').forEach(el => { + el.setAttribute('style', `${styles.code.inline}; font-size: ${this.currentFontSize}px;`); + }); + + // 应用链接样式 + element.querySelectorAll('a').forEach(el => { + el.setAttribute('style', styles.link); + }); + + // 应用强调样式 + element.querySelectorAll('strong').forEach(el => { + el.setAttribute('style', styles.emphasis.strong); + }); + element.querySelectorAll('em').forEach(el => { + el.setAttribute('style', styles.emphasis.em); + }); + element.querySelectorAll('del').forEach(el => { + el.setAttribute('style', styles.emphasis.del); + }); + + // 应用表格样式(内容表格,非包裹表格) + element.querySelectorAll('table').forEach(el => { + el.setAttribute('style', styles.table.container); + }); + element.querySelectorAll('th').forEach(el => { + el.setAttribute('style', `${styles.table.header}; font-family: ${this.currentFont}; font-size: ${this.currentFontSize}px;`); + }); + element.querySelectorAll('td').forEach(el => { + el.setAttribute('style', `${styles.table.cell}; font-family: ${this.currentFont}; font-size: ${this.currentFontSize}px;`); + }); + + // 应用分割线样式 + element.querySelectorAll('hr').forEach(el => { + el.setAttribute('style', styles.hr); + }); + + // 应用脚注样式 + element.querySelectorAll('.footnote-ref').forEach(el => { + el.setAttribute('style', styles.footnote.ref); + }); + element.querySelectorAll('.footnote-backref').forEach(el => { + el.setAttribute('style', styles.footnote.backref); + }); + + // 应用图片样式 + element.querySelectorAll('img').forEach(el => { + const img = el as HTMLImageElement; + el.setAttribute('style', `${styles.image}; font-family: ${this.currentFont};`); + + const parent = img.parentElement; + if (parent && parent.tagName.toLowerCase() === 'p') { + if (parent.childNodes.length === 1) { + parent.style.textAlign = 'center'; + parent.style.margin = '1em 0'; + } + } + }); + } +} + +export const templateManager = (app: App) => new TemplateManager(app); diff --git a/src/templates/cyber.json b/src/templates/cyber.json new file mode 100644 index 0000000..62bbd28 --- /dev/null +++ b/src/templates/cyber.json @@ -0,0 +1,69 @@ +{ + "id": "cyber", + "name": "赛博朋克", + "styles": { + "imagePreview": "background: #0a0a16; padding: 32px 28px;", + "header": { + "avatar": { + "container": "width: 40px; height: 40px; border-radius: 2px; overflow: hidden; border: 1px solid #00ffaa80; box-shadow: 0 0 12px #00ffaa40;", + "placeholder": "background: #1a1a2e; transition: all 0.3s ease;", + "image": "object-fit: cover; transition: transform 0.3s ease; filter: saturate(1.4);" + }, + "nameContainer": "display: flex; align-items: center; gap: 10px;", + "userName": "font-size: 16px; font-weight: 700; color: #00ffaa; text-shadow: 0 0 12px #00ffaa80;", + "userId": "font-size: 14px; color: #4dffbe; font-family: 'JetBrains Mono', monospace;", + "postTime": "font-size: 13px; color: #2f8f98; font-family: 'JetBrains Mono', monospace;", + "verifiedIcon": "width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; color: #000000; background-color: #00ffaa; border-radius: 2px; font-size: 10px; flex-shrink: 0; border: 1px solid #00ffaa80; box-shadow: 0 0 12px #00ffaa40;" + }, + "footer": { + "container": "position: absolute; bottom: 0; left: 0; right: 0; display: flex; align-items: center; justify-content: center; gap: 14px; padding: 16px; color: #4dffbe; font-size: 13px; border-top: 1px solid #00ffaa80; background: #0a0a16; font-family: 'JetBrains Mono', monospace;", + "text": "color: inherit; transition: color 0.2s ease; white-space: nowrap;", + "separator": "color: #2f8f98;" + }, + "title": { + "h2": { + "base": "margin: 0; font-size: 1.5em; letter-spacing: 0.02em; line-height: 1.5;", + "content": "font-weight: 700; color: #00ffaa; text-shadow: 0 0 16px #00ffaa80;", + "after": "content: ' //'; color: #2f8f98;" + }, + "h3": { + "base": "margin: 26px 0 0; font-size: 1.25em; line-height: 1.5;", + "content": "font-weight: 700; color: #00ffaa;", + "after": "content: ' //';" + }, + "base": { + "base": "margin: 22px 0 0; font-size: 1.1em; line-height: 1.5;", + "content": "font-weight: 700; color: #00ffaa;", + "after": "" + } + }, + "paragraph": "line-height: 1.75; margin-bottom: 1.1em; font-size: 15px; color: #e0e0e0;", + "emphasis": { + "strong": "font-weight: 700; color: #00ffaa; text-shadow: 0 0 12px #00ffaa80;", + "em": "font-style: normal; color: #4dffbe; background: rgba(77,255,190,0.15); padding: 0 4px;", + "del": "text-decoration: line-through; color: #2f8f98; opacity: 0.9;" + }, + "list": { + "container": "padding-left: 26px; margin-bottom: 1.1em; color: #7feceb;", + "item": "margin-bottom: 0.7em; font-size: 15px; color: #7feceb; line-height: 1.75;", + "taskList": "list-style: none; margin-left: -22px; font-size: 15px; color: #7feceb; line-height: 1.75;" + }, + "code": { + "block": "background: #1a1a2e; padding: 1.2em; border-radius: 4px; font-size: 14px; font-family: 'JetBrains Mono', monospace; line-height: 1.6; white-space: pre-wrap; word-wrap: break-word; color: #00ffaa; margin: 1.3em 0; border: 1px solid #00ffaa80; box-shadow: 0 0 24px #00ffaa20;", + "inline": "background: #1a1a2e; padding: 4px 10px; border-radius: 4px; color: #00ffaa; font-size: 14px; font-family: 'JetBrains Mono', monospace; border: 1px solid #00ffaa80;" + }, + "quote": "border-left: 3px solid #00ffaa; padding: 0 0 0 20px; margin: 1.5em 0; color: #4dffbe; font-style: normal; font-size: 15px; line-height: 1.75; text-shadow: 0 0 12px #00ffaa40;", + "image": "max-width: 100%; height: auto; margin: 1.5em auto; border: 2px solid #00ffaa80; box-shadow: 0 0 32px #00ffaa30; filter: saturate(1.2);", + "link": "color: #00ffaa; text-decoration: none; border-bottom: 2px solid #00ffaa80; transition: all 0.2s ease; text-shadow: 0 0 12px #00ffaa40;", + "table": { + "container": "width: 100%; margin: 1.5em 0; border-collapse: collapse; border: 2px solid #00ffaa80; box-shadow: 0 0 24px #00ffaa20;", + "header": "background: #1a1a2e; font-weight: 700; color: #00ffaa; padding: 14px; border: 2px solid #00ffaa80; text-shadow: 0 0 12px #00ffaa40;", + "cell": "padding: 14px; color: #7feceb; border: 2px solid #00ffaa80; font-family: 'JetBrains Mono', monospace;" + }, + "hr": "border: none; border-top: 2px solid #00ffaa80; margin: 32px 0; box-shadow: 0 0 24px #00ffaa30;", + "footnote": { + "ref": "color: #4dffbe; text-decoration: none; font-size: 0.9em; font-family: 'JetBrains Mono', monospace;", + "backref": "color: #4dffbe; text-decoration: none; font-size: 0.9em; font-family: 'JetBrains Mono', monospace;" + } + } +} \ No newline at end of file diff --git a/src/templates/default.json b/src/templates/default.json new file mode 100644 index 0000000..543095e --- /dev/null +++ b/src/templates/default.json @@ -0,0 +1,69 @@ +{ + "id": "default", + "name": "默认主题", + "styles": { + "imagePreview": "background: #1c1c1e; padding: 28px 24px;", + "header": { + "avatar": { + "container": "width: 40px; height: 40px; border-radius: 12px; overflow: hidden;", + "placeholder": "background: #2c2c2e; transition: all 0.3s ease;", + "image": "object-fit: cover; transition: transform 0.3s ease;" + }, + "nameContainer": "display: flex; align-items: center; gap: 8px;", + "userName": "font-size: 16px; font-weight: 600; color: #ffffff;", + "userId": "font-size: 14px; color: #98989d;", + "postTime": "font-size: 13px; color: #636366;", + "verifiedIcon": "width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; color: #ffffff; background-color: #0A84FF; border-radius: 50%; font-size: 10px; flex-shrink: 0;" + }, + "footer": { + "container": "position: absolute; bottom: 0; left: 0; right: 0; display: flex; align-items: center; justify-content: center; gap: 14px; padding: 16px; color: #98989d; font-size: 13px; border-top: 1px solid #2c2c2e; background: #1c1c1e;", + "text": "color: inherit; transition: color 0.2s ease; white-space: nowrap;", + "separator": "color: #636366;" + }, + "title": { + "h2": { + "base": "margin: 0; font-size: 1.5em; letter-spacing: -0.01em; line-height: 1.5;", + "content": "font-weight: 600; color: #f2f2f7;", + "after": "" + }, + "h3": { + "base": "margin: 26px 0 0; font-size: 1.25em; line-height: 1.5;", + "content": "font-weight: 600; color: #f2f2f7;", + "after": "" + }, + "base": { + "base": "margin: 22px 0 0; font-size: 1.1em; line-height: 1.5;", + "content": "font-weight: 600; color: #f2f2f7;", + "after": "" + } + }, + "paragraph": "line-height: 1.8; margin-bottom: 1.1em; font-size: 15px; color: #f2f2f7;", + "emphasis": { + "strong": "font-weight: 700; color: #0A84FF;", + "em": "font-style: normal; color: #98989d; background: rgba(152,152,157,0.1); padding: 0 4px;", + "del": "text-decoration: line-through; color: #636366;" + }, + "list": { + "container": "padding-left: 26px; margin-bottom: 1.1em; color: #d1d1d6;", + "item": "margin-bottom: 0.7em; font-size: 15px; color: #d1d1d6; line-height: 1.75;", + "taskList": "list-style: none; margin-left: -22px; font-size: 15px; color: #d1d1d6; line-height: 1.75;" + }, + "code": { + "block": "background: #2c2c2e; padding: 1em 1.2em; border-radius: 12px; font-size: 14px; font-family: SF Mono, Menlo, monospace; line-height: 1.6; white-space: pre-wrap; word-wrap: break-word; color: #ffffff; margin: 1.3em 0;", + "inline": "background: #2c2c2e; padding: 3px 8px; border-radius: 6px; color: #ffffff; font-size: 14px; font-family: SF Mono, Menlo, monospace;" + }, + "quote": "border-left: 3px solid #0A84FF; padding: 0 0 0 18px; margin: 1.2em 0; color: #f2f2f7; font-style: normal; font-size: 15px; line-height: 1.75;", + "image": "max-width: 100%; height: auto; margin: 1.3em auto; border-radius: 12px;", + "link": "color: #0A84FF; text-decoration: underline; text-underline-offset: 2px; transition: opacity 0.2s ease;", + "table": { + "container": "width: 100%; margin: 1.3em 0; border-collapse: separate; border-spacing: 0; border-radius: 12px; overflow: hidden; border: 1px solid #2c2c2e;", + "header": "background: #2c2c2e; font-weight: 600; color: #f2f2f7; padding: 12px;", + "cell": "padding: 12px; color: #d1d1d6; border-top: 1px solid #2c2c2e;" + }, + "hr": "border: none; border-top: 1px solid #2c2c2e; margin: 26px 0;", + "footnote": { + "ref": "color: #98989d; text-decoration: none; font-size: 0.9em;", + "backref": "color: #98989d; text-decoration: none; font-size: 0.9em;" + } + } +} \ No newline at end of file diff --git a/src/templates/elegant.json b/src/templates/elegant.json new file mode 100644 index 0000000..78b647a --- /dev/null +++ b/src/templates/elegant.json @@ -0,0 +1,69 @@ +{ + "id": "elegant", + "name": "优雅暗色", + "styles": { + "imagePreview": "background: #1a1721; padding: 32px 28px;", + "header": { + "avatar": { + "container": "width: 40px; height: 40px; border-radius: 14px; overflow: hidden; box-shadow: 0 2px 8px rgba(180,144,255,0.15);", + "placeholder": "background: #2a2433; transition: all 0.3s ease;", + "image": "object-fit: cover; transition: transform 0.3s ease;" + }, + "nameContainer": "display: flex; align-items: center; gap: 8px;", + "userName": "font-size: 16px; font-weight: 600; color: #e2d9f3; letter-spacing: 0.02em;", + "userId": "font-size: 14px; color: #a393c9;", + "postTime": "font-size: 13px; color: #6d617f;", + "verifiedIcon": "width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; color: #1a1721; background-color: #b490ff; border-radius: 6px; font-size: 10px; flex-shrink: 0; box-shadow: 0 2px 8px rgba(180,144,255,0.2);" + }, + "footer": { + "container": "position: absolute; bottom: 0; left: 0; right: 0; display: flex; align-items: center; justify-content: center; gap: 14px; padding: 16px; color: #a393c9; font-size: 13px; border-top: 1px solid #2a2433; background: rgba(26,23,33,0.95); backdrop-filter: blur(12px);", + "text": "color: inherit; transition: color 0.2s ease; white-space: nowrap;", + "separator": "color: #6d617f;" + }, + "title": { + "h2": { + "base": "margin: 0; font-size: 1.5em; letter-spacing: -0.01em; line-height: 1.5;", + "content": "font-weight: 600; color: #e2d9f3; text-shadow: 0 2px 4px rgba(0,0,0,0.1);", + "after": "" + }, + "h3": { + "base": "margin: 28px 0 0; font-size: 1.25em; line-height: 1.5;", + "content": "font-weight: 600; color: #e2d9f3;", + "after": "" + }, + "base": { + "base": "margin: 24px 0 0; font-size: 1.1em; line-height: 1.5;", + "content": "font-weight: 600; color: #e2d9f3;", + "after": "" + } + }, + "paragraph": "line-height: 1.75; margin-bottom: 1.1em; font-size: 15px; color: #c4b8dd;", + "emphasis": { + "strong": "font-weight: 600; color: #b490ff; text-shadow: 0 1px 2px rgba(180,144,255,0.2);", + "em": "font-style: normal; color: #a393c9; background: rgba(163,147,201,0.1); padding: 0 4px; border-radius: 2px;", + "del": "text-decoration: line-through; color: #6d617f; opacity: 0.8;" + }, + "list": { + "container": "padding-left: 26px; margin-bottom: 1.2em; color: #c4b8dd;", + "item": "margin-bottom: 0.7em; font-size: 15px; color: #c4b8dd; line-height: 1.75;", + "taskList": "list-style: none; margin-left: -22px; font-size: 15px; color: #c4b8dd; line-height: 1.75;" + }, + "code": { + "block": "background: #2a2433; padding: 1.2em; border-radius: 14px; font-size: 14px; font-family: 'SF Mono', Menlo, monospace; line-height: 1.6; white-space: pre-wrap; word-wrap: break-word; color: #c4b8dd; margin: 1.3em 0; box-shadow: inset 0 4px 12px rgba(0,0,0,0.1); border: 1px solid #3a3443;", + "inline": "background: #2a2433; padding: 4px 10px; border-radius: 6px; color: #c4b8dd; font-size: 14px; font-family: 'SF Mono', Menlo, monospace; border: 1px solid #3a3443;" + }, + "quote": "border-left: 3px solid #b490ff; padding: 0 0 0 18px; margin: 1.5em 0; color: #a393c9; font-style: normal; font-size: 15px; line-height: 1.75; background: rgba(180,144,255,0.05); border-radius: 0 4px 4px 0;", + "image": "max-width: 100%; height: auto; margin: 1.5em auto; border-radius: 14px; box-shadow: 0 8px 24px rgba(0,0,0,0.2);", + "link": "color: #b490ff; text-decoration: none; transition: all 0.2s ease; border-bottom: 1px solid rgba(180,144,255,0.3);", + "table": { + "container": "width: 100%; margin: 1.5em 0; border-collapse: separate; border-spacing: 0; border-radius: 14px; overflow: hidden; border: 1px solid #3a3443; box-shadow: 0 4px 12px rgba(0,0,0,0.1);", + "header": "background: #2a2433; font-weight: 600; color: #e2d9f3; padding: 14px;", + "cell": "padding: 14px; color: #c4b8dd; border-top: 1px solid #3a3443;" + }, + "hr": "border: none; border-top: 1px solid #3a3443; margin: 32px 0;", + "footnote": { + "ref": "color: #a393c9; text-decoration: none; font-size: 0.9em;", + "backref": "color: #a393c9; text-decoration: none; font-size: 0.9em;" + } + } +} \ No newline at end of file diff --git a/src/templates/forest.json b/src/templates/forest.json new file mode 100644 index 0000000..ff9ddd1 --- /dev/null +++ b/src/templates/forest.json @@ -0,0 +1,69 @@ +{ + "id": "forest", + "name": "森林清晨", + "styles": { + "imagePreview": "background: #1a2420; padding: 32px 28px; border: 1px solid #2ecc7180;", + "header": { + "avatar": { + "container": "width: 40px; height: 40px; border-radius: 14px; overflow: hidden; box-shadow: 0 4px 16px rgba(46,204,113,0.15); border: 1px solid #2ecc7180;", + "placeholder": "background: #243830; transition: all 0.3s ease;", + "image": "object-fit: cover; transition: transform 0.3s ease; filter: brightness(1.05);" + }, + "nameContainer": "display: flex; align-items: center; gap: 10px;", + "userName": "font-size: 16px; font-weight: 600; color: #2ecc71; text-shadow: 0 2px 4px rgba(46,204,113,0.1);", + "userId": "font-size: 14px; color: #27ae60; font-family: 'SF Pro Text';", + "postTime": "font-size: 13px; color: #16a085; letter-spacing: 0.02em;", + "verifiedIcon": "width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; color: #1a2420; background-color: #2ecc71; border-radius: 6px; font-size: 10px; flex-shrink: 0; box-shadow: 0 2px 8px rgba(46,204,113,0.3); border: 1px solid #2ecc7180;" + }, + "footer": { + "container": "position: absolute; bottom: 0; left: 0; right: 0; display: flex; align-items: center; justify-content: center; gap: 14px; padding: 16px; color: #27ae60; font-size: 13px; border-top: 1px solid #2ecc7140; background: rgba(26,36,32,0.95); backdrop-filter: blur(12px);", + "text": "color: inherit; transition: color 0.2s ease; white-space: nowrap;", + "separator": "color: #16a085;" + }, + "title": { + "h2": { + "base": "margin: 0; font-size: 1.5em; letter-spacing: -0.01em; line-height: 1.5;", + "content": "font-weight: 600; color: #2ecc71; text-shadow: 0 2px 4px rgba(46,204,113,0.1);", + "after": "" + }, + "h3": { + "base": "margin: 28px 0 0; font-size: 1.25em; line-height: 1.5;", + "content": "font-weight: 600; color: #2ecc71;", + "after": "" + }, + "base": { + "base": "margin: 24px 0 0; font-size: 1.1em; line-height: 1.5;", + "content": "font-weight: 600; color: #2ecc71;", + "after": "" + } + }, + "paragraph": "line-height: 1.8; margin-bottom: 1.1em; font-size: 15px; color: #e8f5e9;", + "emphasis": { + "strong": "font-weight: 700; color: #2ecc71; text-shadow: 0 2px 4px rgba(46,204,113,0.2);", + "em": "font-style: normal; color: #27ae60; background: rgba(39,174,96,0.1); padding: 0 4px; border-radius: 2px;", + "del": "text-decoration: line-through; color: #16a085; opacity: 0.8;" + }, + "list": { + "container": "padding-left: 26px; margin-bottom: 1.2em; color: #a8e6cf;", + "item": "margin-bottom: 0.7em; font-size: 15px; color: #a8e6cf; line-height: 1.75;", + "taskList": "list-style: none; margin-left: -22px; font-size: 15px; color: #a8e6cf; line-height: 1.75;" + }, + "code": { + "block": "background: #243830; padding: 1.2em; border-radius: 14px; font-size: 14px; font-family: 'SF Mono', Menlo, monospace; line-height: 1.6; white-space: pre-wrap; word-wrap: break-word; color: #a8e6cf; margin: 1.5em 0; box-shadow: inset 0 4px 12px rgba(0,0,0,0.1); border: 1px solid #2ecc7180;", + "inline": "background: #243830; padding: 4px 10px; border-radius: 6px; color: #a8e6cf; font-size: 14px; font-family: 'SF Mono', Menlo, monospace; border: 1px solid #2ecc7180;" + }, + "quote": "border-left: 3px solid #2ecc71; padding: 0 0 0 20px; margin: 1.5em 0; color: #27ae60; font-style: normal; font-size: 15px; line-height: 1.75; background: rgba(46,204,113,0.05);", + "image": "max-width: 100%; height: auto; margin: 1.5em auto; border-radius: 14px; box-shadow: 0 8px 24px rgba(46,204,113,0.1); border: 1px solid #2ecc7180;", + "link": "color: #2ecc71; text-decoration: none; border-bottom: 1px solid #2ecc7180; transition: all 0.2s ease; text-shadow: 0 2px 4px rgba(46,204,113,0.1);", + "table": { + "container": "width: 100%; margin: 1.5em 0; border-collapse: separate; border-spacing: 0; border-radius: 14px; overflow: hidden; border: 1px solid #2ecc7180; box-shadow: 0 4px 12px rgba(46,204,113,0.1);", + "header": "background: #243830; font-weight: 600; color: #2ecc71; padding: 14px; border-bottom: 1px solid #2ecc7180;", + "cell": "padding: 14px; color: #a8e6cf; border-top: 1px solid #2ecc7180;" + }, + "hr": "border: none; border-top: 1px solid #2ecc7180; margin: 32px 0; box-shadow: 0 2px 8px rgba(46,204,113,0.1);", + "footnote": { + "ref": "color: #27ae60; text-decoration: none; font-size: 0.9em;", + "backref": "color: #27ae60; text-decoration: none; font-size: 0.9em;" + } + } +} \ No newline at end of file diff --git a/src/templates/index.ts b/src/templates/index.ts new file mode 100644 index 0000000..547dd5a --- /dev/null +++ b/src/templates/index.ts @@ -0,0 +1,24 @@ +// 使用 require 导入 JSON 文件以避免 TypeScript 的 JSON 模块解析问题 +const defaultTemplate = require('./default.json'); +const minimalTemplate = require('./minimal.json'); +const elegantTemplate = require('./elegant.json'); +const cyberTemplate = require('./cyber.json'); +const warmTemplate = require('./warm.json'); +const forestTemplate = require('./forest.json'); +const oceanTemplate = require('./ocean.json'); +const sakuraTemplate = require('./sakura.json'); +const starryTemplate = require('./starry.json'); +const metalTemplate = require('./metal.json'); + +export const templates = { + default: defaultTemplate, + minimal: minimalTemplate, + elegant: elegantTemplate, + cyber: cyberTemplate, + warm: warmTemplate, + forest: forestTemplate, + ocean: oceanTemplate, + sakura: sakuraTemplate, + starry: starryTemplate, + metal: metalTemplate +}; \ No newline at end of file diff --git a/src/templates/metal.json b/src/templates/metal.json new file mode 100644 index 0000000..be5d739 --- /dev/null +++ b/src/templates/metal.json @@ -0,0 +1,69 @@ +{ + "id": "metal", + "name": "金属科技", + "styles": { + "imagePreview": "background: #1e2228; padding: 32px 28px; border: 1px solid #4d4d4d80;", + "header": { + "avatar": { + "container": "width: 40px; height: 40px; border-radius: 4px; overflow: hidden; box-shadow: 0 4px 16px rgba(192,192,192,0.3); border: 1px solid #4d4d4d80;", + "placeholder": "background: #282c34; transition: all 0.3s ease;", + "image": "object-fit: cover; transition: transform 0.3s ease; filter: contrast(1.1) saturate(1.2);" + }, + "nameContainer": "display: flex; align-items: center; gap: 10px;", + "userName": "font-size: 16px; font-weight: 700; color: #f0f0f0; text-shadow: 0 2px 4px rgba(0,0,0,0.3);", + "userId": "font-size: 14px; color: #a0a0a0; font-family: 'SF Pro Display';", + "postTime": "font-size: 13px; color: #808080; letter-spacing: 0.03em;", + "verifiedIcon": "width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; color: #1e2228; background: linear-gradient(135deg, #d0d0d0, #ffffff); border-radius: 4px; font-size: 10px; flex-shrink: 0; box-shadow: 0 2px 8px rgba(0,0,0,0.3); border: 1px solid #4d4d4d80;" + }, + "footer": { + "container": "position: absolute; bottom: 0; left: 0; right: 0; display: flex; align-items: center; justify-content: center; gap: 14px; padding: 16px; color: #a0a0a0; font-size: 13px; border-top: 1px solid #4d4d4d80; background: rgba(30,34,40,0.95); backdrop-filter: blur(12px);", + "text": "color: inherit; transition: color 0.2s ease; white-space: nowrap;", + "separator": "color: #808080;" + }, + "title": { + "h2": { + "base": "margin: 0; font-size: 1.5em; letter-spacing: -0.01em; line-height: 1.5;", + "content": "font-weight: 700; color: #f0f0f0; text-shadow: 0 2px 4px rgba(0,0,0,0.3);", + "after": "" + }, + "h3": { + "base": "margin: 28px 0 0; font-size: 1.25em; line-height: 1.5;", + "content": "font-weight: 700; color: #f0f0f0;", + "after": "" + }, + "base": { + "base": "margin: 24px 0 0; font-size: 1.1em; line-height: 1.5;", + "content": "font-weight: 700; color: #f0f0f0;", + "after": "" + } + }, + "paragraph": "line-height: 1.8; margin-bottom: 1.1em; font-size: 15px; color: #e0e0e0;", + "emphasis": { + "strong": "font-weight: 700; color: #4d8ee7; text-shadow: 0 2px 4px rgba(77,142,231,0.2);", + "em": "font-style: normal; color: #a0a0a0; background: rgba(160,160,160,0.1); padding: 0 4px; border-left: 2px solid #4d4d4d80;", + "del": "text-decoration: line-through; color: #808080; opacity: 0.8;" + }, + "list": { + "container": "padding-left: 26px; margin-bottom: 1.2em; color: #c0c0c0;", + "item": "margin-bottom: 0.7em; font-size: 15px; color: #c0c0c0; line-height: 1.75;", + "taskList": "list-style: none; margin-left: -22px; font-size: 15px; color: #c0c0c0; line-height: 1.75;" + }, + "code": { + "block": "background: #282c34; padding: 1.2em; border-radius: 4px; font-size: 14px; font-family: 'JetBrains Mono', monospace; line-height: 1.6; white-space: pre-wrap; word-wrap: break-word; color: #e0e0e0; margin: 1.5em 0; border: 1px solid #4d4d4d80; box-shadow: inset 0 4px 12px rgba(0,0,0,0.2);", + "inline": "background: #282c34; padding: 4px 10px; border-radius: 2px; color: #e0e0e0; font-size: 14px; font-family: 'JetBrains Mono', monospace; border: 1px solid #4d4d4d80;" + }, + "quote": "border-left: 3px solid #4d8ee7; padding: 0 0 0 20px; margin: 1.5em 0; color: #a0a0a0; font-style: normal; font-size: 15px; line-height: 1.75; background: linear-gradient(to right, rgba(77,142,231,0.1), transparent);", + "image": "max-width: 100%; height: auto; margin: 1.5em auto; border-radius: 4px; box-shadow: 0 8px 24px rgba(0,0,0,0.3); border: 1px solid #4d4d4d80;", + "link": "color: #4d8ee7; text-decoration: none; border-bottom: 1px solid #4d8ee780; transition: all 0.2s ease; text-shadow: 0 2px 4px rgba(77,142,231,0.1);", + "table": { + "container": "width: 100%; margin: 1.5em 0; border-collapse: separate; border-spacing: 0; border-radius: 4px; overflow: hidden; border: 1px solid #4d4d4d80; box-shadow: 0 4px 12px rgba(0,0,0,0.2);", + "header": "background: linear-gradient(135deg, #282c34, #1e2228); font-weight: 700; color: #4d8ee7; padding: 14px; border-bottom: 2px solid #4d4d4d80;", + "cell": "padding: 14px; color: #c0c0c0; border-top: 1px solid #4d4d4d80;" + }, + "hr": "border: none; border-top: 2px solid #4d4d4d80; margin: 32px 0; box-shadow: 0 2px 8px rgba(0,0,0,0.3);", + "footnote": { + "ref": "color: #a0a0a0; text-decoration: none; font-size: 0.9em;", + "backref": "color: #a0a0a0; text-decoration: none; font-size: 0.9em;" + } + } +} \ No newline at end of file diff --git a/src/templates/minimal.json b/src/templates/minimal.json new file mode 100644 index 0000000..d977ae5 --- /dev/null +++ b/src/templates/minimal.json @@ -0,0 +1,69 @@ +{ + "id": "minimal", + "name": "极简主题", + "styles": { + "imagePreview": "background: #ffffff; padding: 36px 32px; border: 1px solid #eeeeee;", + "header": { + "avatar": { + "container": "width: 40px; height: 40px; border-radius: 8px; overflow: hidden; box-shadow: 0 2px 8px rgba(0,0,0,0.05);", + "placeholder": "background: #f5f5f5; transition: all 0.2s ease;", + "image": "object-fit: cover; transition: transform 0.3s ease;" + }, + "nameContainer": "display: flex; align-items: center; gap: 8px;", + "userName": "font-size: 16px; font-weight: 600; color: #333333; letter-spacing: 0.02em;", + "userId": "font-size: 14px; color: #666666;", + "postTime": "font-size: 13px; color: #999999;", + "verifiedIcon": "width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; color: #ffffff; background-color: #6c9eb8; border-radius: 4px; font-size: 10px; flex-shrink: 0; box-shadow: 0 2px 4px rgba(108,158,184,0.1);" + }, + "footer": { + "container": "position: absolute; bottom: 0; left: 0; right: 0; display: flex; align-items: center; justify-content: center; gap: 16px; padding: 16px; color: #999999; font-size: 13px; border-top: 1px solid #eeeeee; background: rgba(250,250,250,0.95); backdrop-filter: blur(8px);", + "text": "color: inherit; transition: opacity 0.2s ease; white-space: nowrap;", + "separator": "color: #dddddd;" + }, + "title": { + "h2": { + "base": "margin: 0; font-size: 1.5em; line-height: 1.5;", + "content": "font-weight: 600; color: #333333;", + "after": "" + }, + "h3": { + "base": "margin: 32px 0 0; font-size: 1.25em; line-height: 1.5;", + "content": "font-weight: 600; color: #333333;", + "after": "" + }, + "base": { + "base": "margin: 28px 0 0; font-size: 1.1em; line-height: 1.5;", + "content": "font-weight: 600; color: #333333;", + "after": "" + } + }, + "paragraph": "line-height: 1.8; margin-bottom: 1.2em; font-size: 15px; color: #444444;", + "emphasis": { + "strong": "font-weight: 700; color: #4a4a4a; background: rgba(74,74,74,0.05); padding: 0 2px;", + "em": "font-style: normal; color: #6c9eb8; background: rgba(108,158,184,0.05); padding: 0 2px;", + "del": "text-decoration: line-through; color: #999999; opacity: 0.8;" + }, + "list": { + "container": "padding-left: 28px; margin-bottom: 1.2em; color: #666666;", + "item": "margin-bottom: 0.8em; font-size: 15px; color: #666666; line-height: 1.8;", + "taskList": "list-style: none; margin-left: -20px; font-size: 15px; color: #666666; line-height: 1.8;" + }, + "code": { + "block": "background: #f5f5f5; padding: 1.2em; border-radius: 8px; font-size: 14px; font-family: 'SF Mono', Menlo, monospace; line-height: 1.6; white-space: pre-wrap; word-wrap: break-word; color: #555555; margin: 1.5em 0; border: 1px solid #eeeeee;", + "inline": "background: #f5f5f5; padding: 4px 8px; border-radius: 4px; color: #555555; font-size: 14px; font-family: 'SF Mono', Menlo, monospace; border: 1px solid #eeeeee;" + }, + "quote": "border-left: 3px solid #eeeeee; padding: 0 0 0 20px; margin: 1.5em 0; color: #666666; font-style: normal; font-size: 15px; line-height: 1.8;", + "image": "max-width: 100%; height: auto; margin: 1.5em auto; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.05);", + "link": "color: #6c9eb8; text-decoration: none; border-bottom: 1px solid rgba(108,158,184,0.3); transition: all 0.2s ease;", + "table": { + "container": "width: 100%; margin: 1.5em 0; border-collapse: collapse;", + "header": "background: #f5f5f5; font-weight: 600; color: #333333; border-bottom: 2px solid #eeeeee; padding: 14px;", + "cell": "padding: 14px; color: #666666; border-bottom: 1px solid #eeeeee;" + }, + "hr": "border: none; border-top: 1px solid #eeeeee; margin: 32px 0;", + "footnote": { + "ref": "color: #999999; text-decoration: none; font-size: 0.9em;", + "backref": "color: #999999; text-decoration: none; font-size: 0.9em;" + } + } +} \ No newline at end of file diff --git a/src/templates/ocean.json b/src/templates/ocean.json new file mode 100644 index 0000000..017c633 --- /dev/null +++ b/src/templates/ocean.json @@ -0,0 +1,69 @@ +{ + "id": "ocean", + "name": "深海之境", + "styles": { + "imagePreview": "background: #0a192f; padding: 32px 28px; border: 1px solid #112a4580;", + "header": { + "avatar": { + "container": "width: 40px; height: 40px; border-radius: 14px; overflow: hidden; box-shadow: 0 4px 16px rgba(64,169,255,0.25); border: 1px solid #1d3552;", + "placeholder": "background: linear-gradient(135deg, #112a45, #1d3552); transition: all 0.3s ease;", + "image": "object-fit: cover; transition: transform 0.3s ease; filter: brightness(1.1) contrast(1.05);" + }, + "nameContainer": "display: flex; align-items: center; gap: 10px;", + "userName": "font-size: 16px; font-weight: 700; color: #40a9ff; text-shadow: 0 2px 8px rgba(64,169,255,0.2);", + "userId": "font-size: 14px; color: #69c0ff; font-family: 'SF Pro Text';", + "postTime": "font-size: 13px; color: #91d5ff; letter-spacing: 0.03em;", + "verifiedIcon": "width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; color: #0a192f; background: linear-gradient(135deg, #40a9ff, #69c0ff); border-radius: 6px; font-size: 10px; flex-shrink: 0; box-shadow: 0 2px 12px rgba(64,169,255,0.3); border: 1px solid #69c0ff80;" + }, + "footer": { + "container": "position: absolute; bottom: 0; left: 0; right: 0; display: flex; align-items: center; justify-content: center; gap: 14px; padding: 16px; color: #69c0ff; font-size: 13px; border-top: 1px solid #1d3552; background: rgba(10,25,47,0.95); backdrop-filter: blur(12px);", + "text": "color: inherit; transition: color 0.2s ease; white-space: nowrap;", + "separator": "color: #91d5ff;" + }, + "title": { + "h2": { + "base": "margin: 0; font-size: 1.5em; letter-spacing: -0.01em; line-height: 1.5;", + "content": "font-weight: 700; color: #40a9ff; text-shadow: 0 2px 8px rgba(64,169,255,0.15);", + "after": "" + }, + "h3": { + "base": "margin: 28px 0 0; font-size: 1.25em; line-height: 1.5;", + "content": "font-weight: 700; color: #40a9ff;", + "after": "" + }, + "base": { + "base": "margin: 24px 0 0; font-size: 1.1em; line-height: 1.5;", + "content": "font-weight: 700; color: #40a9ff;", + "after": "" + } + }, + "paragraph": "line-height: 1.8; margin-bottom: 1.2em; font-size: 15px; color: #e6f7ff;", + "emphasis": { + "strong": "font-weight: 700; color: #40a9ff; text-shadow: 0 2px 8px rgba(64,169,255,0.2);", + "em": "font-style: normal; color: #69c0ff; background: rgba(105,192,255,0.1); padding: 0 4px; border-left: 2px solid #69c0ff80;", + "del": "text-decoration: line-through; color: #91d5ff; opacity: 0.8;" + }, + "list": { + "container": "padding-left: 28px; margin-bottom: 1.2em; color: #bae7ff;", + "item": "margin-bottom: 0.8em; font-size: 15px; color: #bae7ff; line-height: 1.8;", + "taskList": "list-style: none; margin-left: -24px; font-size: 15px; color: #bae7ff; line-height: 1.8;" + }, + "code": { + "block": "background: #112a45; padding: 1.2em; border-radius: 14px; font-size: 14px; font-family: 'SF Mono', Menlo, monospace; line-height: 1.6; white-space: pre-wrap; word-wrap: break-word; color: #bae7ff; margin: 1.5em 0; box-shadow: inset 0 4px 12px rgba(0,0,0,0.15), 0 2px 8px rgba(64,169,255,0.1); border: 1px solid #1d3552;", + "inline": "background: #112a45; padding: 4px 10px; border-radius: 6px; color: #bae7ff; font-size: 14px; font-family: 'SF Mono', Menlo, monospace; border: 1px solid #1d3552;" + }, + "quote": "border-left: 3px solid #40a9ff; padding: 0 0 0 20px; margin: 1.5em 0; color: #69c0ff; font-style: normal; font-size: 15px; line-height: 1.8; background: linear-gradient(to right, rgba(64,169,255,0.05), transparent);", + "image": "max-width: 100%; height: auto; margin: 1.5em auto; border-radius: 14px; box-shadow: 0 8px 24px rgba(64,169,255,0.25); border: 1px solid #69c0ff80;", + "link": "color: #40a9ff; text-decoration: none; border-bottom: 1px solid rgba(64,169,255,0.3); transition: all 0.2s ease; text-shadow: 0 2px 4px rgba(64,169,255,0.1);", + "table": { + "container": "width: 100%; margin: 1.5em 0; border-collapse: separate; border-spacing: 0; border-radius: 14px; overflow: hidden; border: 1px solid #1d3552; box-shadow: 0 4px 12px rgba(64,169,255,0.15);", + "header": "background: linear-gradient(135deg, #112a45, #0a192f); font-weight: 700; color: #40a9ff; padding: 14px; border-bottom: 2px solid #1d3552;", + "cell": "padding: 14px; color: #bae7ff; border-top: 1px solid #1d3552;" + }, + "hr": "border: none; border-top: 2px solid #1d3552; margin: 32px 0; box-shadow: 0 2px 8px rgba(64,169,255,0.15);", + "footnote": { + "ref": "color: #69c0ff; text-decoration: none; font-size: 0.9em;", + "backref": "color: #69c0ff; text-decoration: none; font-size: 0.9em;" + } + } +} \ No newline at end of file diff --git a/src/templates/sakura.json b/src/templates/sakura.json new file mode 100644 index 0000000..f066cc0 --- /dev/null +++ b/src/templates/sakura.json @@ -0,0 +1,69 @@ +{ + "id": "sakura", + "name": "樱花飞舞", + "styles": { + "imagePreview": "background: #1f1a1d; padding: 32px 28px; border: 1px solid #ffb6c180;", + "header": { + "avatar": { + "container": "width: 40px; height: 40px; border-radius: 14px; overflow: hidden; box-shadow: 0 4px 16px rgba(255,182,193,0.25); border: 1px solid #ffb6c180;", + "placeholder": "background: linear-gradient(135deg, #2d2428, #3a2d33); transition: all 0.3s ease;", + "image": "object-fit: cover; transition: transform 0.3s ease; filter: brightness(1.05) contrast(1.02);" + }, + "nameContainer": "display: flex; align-items: center; gap: 10px;", + "userName": "font-size: 16px; font-weight: 700; color: #ffb6c1; text-shadow: 0 2px 8px rgba(255,182,193,0.2);", + "userId": "font-size: 14px; color: #ff8da1; font-family: 'SF Pro Text';", + "postTime": "font-size: 13px; color: #ff6b88; letter-spacing: 0.03em;", + "verifiedIcon": "width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; color: #1f1a1d; background: linear-gradient(135deg, #ffb6c1, #ff8da1); border-radius: 50%; font-size: 10px; flex-shrink: 0; box-shadow: 0 2px 12px rgba(255,182,193,0.3); border: 1px solid #ffb6c180;" + }, + "footer": { + "container": "position: absolute; bottom: 0; left: 0; right: 0; display: flex; align-items: center; justify-content: center; gap: 14px; padding: 16px; color: #ff8da1; font-size: 13px; border-top: 1px solid #ffb6c140; background: rgba(31,26,29,0.95); backdrop-filter: blur(12px);", + "text": "color: inherit; transition: color 0.2s ease; white-space: nowrap;", + "separator": "color: #ff6b88;" + }, + "title": { + "h2": { + "base": "margin: 0; font-size: 1.5em; letter-spacing: -0.01em; line-height: 1.5;", + "content": "font-weight: 700; color: #ffb6c1; text-shadow: 0 2px 8px rgba(255,182,193,0.15);", + "after": "" + }, + "h3": { + "base": "margin: 28px 0 0; font-size: 1.25em; line-height: 1.5;", + "content": "font-weight: 700; color: #ffb6c1;", + "after": "" + }, + "base": { + "base": "margin: 24px 0 0; font-size: 1.1em; line-height: 1.5;", + "content": "font-weight: 700; color: #ffb6c1;", + "after": "" + } + }, + "paragraph": "line-height: 1.8; margin-bottom: 1.2em; font-size: 15px; color: #fff5f7;", + "emphasis": { + "strong": "font-weight: 700; color: #ff69b4; text-shadow: 0 2px 8px rgba(255,105,180,0.2);", + "em": "font-style: normal; color: #ff8da1; background: rgba(255,141,161,0.1); padding: 0 4px; border-left: 2px solid #ff8da180;", + "del": "text-decoration: line-through; color: #ff6b88; opacity: 0.8;" + }, + "list": { + "container": "padding-left: 28px; margin-bottom: 1.2em; color: #ffd1d9;", + "item": "margin-bottom: 0.8em; font-size: 15px; color: #ffd1d9; line-height: 1.8;", + "taskList": "list-style: none; margin-left: -24px; font-size: 15px; color: #ffd1d9; line-height: 1.8;" + }, + "code": { + "block": "background: #2d2428; padding: 1.2em; border-radius: 14px; font-size: 14px; font-family: 'SF Mono', Menlo, monospace; line-height: 1.6; white-space: pre-wrap; word-wrap: break-word; color: #ffd1d9; margin: 1.5em 0; box-shadow: inset 0 4px 12px rgba(0,0,0,0.15), 0 2px 8px rgba(255,182,193,0.1); border: 1px solid #ffb6c180;", + "inline": "background: #2d2428; padding: 4px 10px; border-radius: 6px; color: #ffd1d9; font-size: 14px; font-family: 'SF Mono', Menlo, monospace; border: 1px solid #ffb6c180;" + }, + "quote": "border-left: 3px solid #ff8da1; padding: 0 0 0 20px; margin: 1.5em 0; color: #ff8da1; font-style: normal; font-size: 15px; line-height: 1.8; background: linear-gradient(to right, rgba(255,141,161,0.05), transparent);", + "image": "max-width: 100%; height: auto; margin: 1.5em auto; border-radius: 14px; box-shadow: 0 8px 24px rgba(255,182,193,0.25); border: 1px solid #ffb6c180;", + "link": "color: #ffb6c1; text-decoration: none; border-bottom: 1px solid rgba(255,182,193,0.3); transition: all 0.2s ease; text-shadow: 0 2px 4px rgba(255,182,193,0.1);", + "table": { + "container": "width: 100%; margin: 1.5em 0; border-collapse: separate; border-spacing: 0; border-radius: 14px; overflow: hidden; border: 1px solid #ffb6c180; box-shadow: 0 4px 12px rgba(255,182,193,0.15);", + "header": "background: linear-gradient(135deg, #2d2428, #1f1a1d); font-weight: 700; color: #ffb6c1; padding: 14px; border-bottom: 2px solid #ffb6c180;", + "cell": "padding: 14px; color: #ffd1d9; border-top: 1px solid #ffb6c180;" + }, + "hr": "border: none; border-top: 2px solid #ffb6c180; margin: 32px 0; box-shadow: 0 2px 8px rgba(255,182,193,0.15);", + "footnote": { + "ref": "color: #ff8da1; text-decoration: none; font-size: 0.9em;", + "backref": "color: #ff8da1; text-decoration: none; font-size: 0.9em;" + } + } +} \ No newline at end of file diff --git a/src/templates/starry.json b/src/templates/starry.json new file mode 100644 index 0000000..030f8db --- /dev/null +++ b/src/templates/starry.json @@ -0,0 +1,69 @@ +{ + "id": "starry", + "name": "星空梦境", + "styles": { + "imagePreview": "background: #0d0f1a; padding: 32px 28px; border: 1px solid #9370db80;", + "header": { + "avatar": { + "container": "width: 40px; height: 40px; border-radius: 14px; overflow: hidden; box-shadow: 0 4px 24px rgba(147,112,219,0.3); border: 1px solid #9370db80;", + "placeholder": "background: linear-gradient(135deg, #252640, #1a1b2e); transition: all 0.3s ease;", + "image": "object-fit: cover; transition: transform 0.3s ease; filter: brightness(1.1) contrast(1.05);" + }, + "nameContainer": "display: flex; align-items: center; gap: 10px;", + "userName": "font-size: 16px; font-weight: 700; color: #9370db; text-shadow: 0 2px 8px rgba(147,112,219,0.2);", + "userId": "font-size: 14px; color: #b19cd9; font-family: 'SF Pro Text';", + "postTime": "font-size: 13px; color: #8a7bb5; letter-spacing: 0.03em;", + "verifiedIcon": "width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; color: #0d0f1a; background: linear-gradient(135deg, #9370db, #b19cd9); border-radius: 50%; font-size: 10px; flex-shrink: 0; box-shadow: 0 2px 12px rgba(147,112,219,0.3); border: 1px solid #9370db80;" + }, + "footer": { + "container": "position: absolute; bottom: 0; left: 0; right: 0; display: flex; align-items: center; justify-content: center; gap: 14px; padding: 16px; color: #b19cd9; font-size: 13px; border-top: 1px solid #252640; background: rgba(13,15,26,0.95); backdrop-filter: blur(12px);", + "text": "color: inherit; transition: color 0.2s ease; white-space: nowrap;", + "separator": "color: #8a7bb5;" + }, + "title": { + "h2": { + "base": "margin: 0; font-size: 1.5em; letter-spacing: -0.01em; line-height: 1.5;", + "content": "font-weight: 700; color: #9370db; text-shadow: 0 2px 8px rgba(147,112,219,0.15);", + "after": "" + }, + "h3": { + "base": "margin: 28px 0 0; font-size: 1.25em; line-height: 1.5;", + "content": "font-weight: 700; color: #9370db;", + "after": "" + }, + "base": { + "base": "margin: 24px 0 0; font-size: 1.1em; line-height: 1.5;", + "content": "font-weight: 700; color: #9370db;", + "after": "" + } + }, + "paragraph": "line-height: 1.8; margin-bottom: 1.2em; font-size: 15px; color: #f0e6ff;", + "emphasis": { + "strong": "font-weight: 700; color: #9b59b6; text-shadow: 0 2px 8px rgba(155,89,182,0.2);", + "em": "font-style: normal; color: #b19cd9; background: rgba(177,156,217,0.1); padding: 0 4px; border-left: 2px solid #b19cd980;", + "del": "text-decoration: line-through; color: #8a7bb5; opacity: 0.8;" + }, + "list": { + "container": "padding-left: 28px; margin-bottom: 1.2em; color: #d8cef6;", + "item": "margin-bottom: 0.8em; font-size: 15px; color: #d8cef6; line-height: 1.8;", + "taskList": "list-style: none; margin-left: -24px; font-size: 15px; color: #d8cef6; line-height: 1.8;" + }, + "code": { + "block": "background: #252640; padding: 1.2em; border-radius: 14px; font-size: 14px; font-family: 'SF Mono', Menlo, monospace; line-height: 1.6; white-space: pre-wrap; word-wrap: break-word; color: #d8cef6; margin: 1.5em 0; box-shadow: inset 0 4px 12px rgba(0,0,0,0.15), 0 2px 8px rgba(147,112,219,0.1); border: 1px solid #9370db80;", + "inline": "background: #252640; padding: 4px 10px; border-radius: 6px; color: #d8cef6; font-size: 14px; font-family: 'SF Mono', Menlo, monospace; border: 1px solid #9370db80;" + }, + "quote": "border-left: 3px solid #b19cd9; padding: 0 0 0 20px; margin: 1.5em 0; color: #b19cd9; font-style: normal; font-size: 15px; line-height: 1.8; background: linear-gradient(to right, rgba(177,156,217,0.05), transparent);", + "image": "max-width: 100%; height: auto; margin: 1.5em auto; border-radius: 14px; box-shadow: 0 8px 24px rgba(147,112,219,0.25); border: 1px solid #9370db80;", + "link": "color: #9370db; text-decoration: none; background-image: linear-gradient(to right, #9370db80, #b19cd980); background-size: 0% 1px; background-repeat: no-repeat; background-position: 0 100%; transition: all 0.3s ease; text-shadow: 0 2px 4px rgba(147,112,219,0.1);", + "table": { + "container": "width: 100%; margin: 1.5em 0; border-collapse: separate; border-spacing: 0; border-radius: 14px; overflow: hidden; border: 1px solid #9370db80; box-shadow: 0 4px 12px rgba(147,112,219,0.15);", + "header": "background: linear-gradient(135deg, #252640, #0d0f1a); font-weight: 700; color: #9370db; padding: 14px; border-bottom: 2px solid #9370db80;", + "cell": "padding: 14px; color: #d8cef6; border-top: 1px solid #9370db80;" + }, + "hr": "border: none; border-top: 2px solid #9370db80; margin: 32px 0; box-shadow: 0 2px 8px rgba(147,112,219,0.15);", + "footnote": { + "ref": "color: #b19cd9; text-decoration: none; font-size: 0.9em;", + "backref": "color: #b19cd9; text-decoration: none; font-size: 0.9em;" + } + } +} \ No newline at end of file diff --git a/src/templates/warm.json b/src/templates/warm.json new file mode 100644 index 0000000..2a7c29a --- /dev/null +++ b/src/templates/warm.json @@ -0,0 +1,69 @@ +{ + "id": "warm", + "name": "暖阳文艺", + "styles": { + "imagePreview": "background: #fffaf5; padding: 32px 28px; border: 1px solid #b8733380;", + "header": { + "avatar": { + "container": "width: 42px; height: 42px; border-radius: 14px; overflow: hidden; box-shadow: 0 4px 16px rgba(184,115,51,0.1); border: 1px solid #b8733380;", + "placeholder": "background: linear-gradient(135deg, #fff0e6, #ffe4c4); transition: all 0.3s ease;", + "image": "object-fit: cover; transition: transform 0.3s ease; filter: brightness(1.05) contrast(1.02);" + }, + "nameContainer": "display: flex; align-items: center; gap: 8px;", + "userName": "font-size: 17px; font-weight: 600; color: #8b4513; font-family: 'Noto Serif SC', serif; text-shadow: 0 2px 4px rgba(139,69,19,0.1);", + "userId": "font-size: 14px; color: #b87333; font-family: 'Noto Serif SC', serif;", + "postTime": "font-size: 13px; color: #d2691e; font-style: italic;", + "verifiedIcon": "width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; color: #fffaf5; background: linear-gradient(135deg, #d2691e, #b87333); border-radius: 50%; font-size: 10px; flex-shrink: 0; box-shadow: 0 2px 8px rgba(210,105,30,0.2); border: 1px solid #b8733380;" + }, + "footer": { + "container": "position: absolute; bottom: 0; left: 0; right: 0; display: flex; align-items: center; justify-content: center; gap: 14px; padding: 16px; color: #b87333; font-size: 13px; border-top: 1px solid #b8733380; background: rgba(255,250,245,0.95); backdrop-filter: blur(8px); font-family: 'Noto Serif SC', serif;", + "text": "color: inherit; transition: color 0.2s ease; font-style: italic; white-space: nowrap;", + "separator": "color: #deb887;" + }, + "title": { + "h2": { + "base": "margin: 0; font-size: 1.6em; letter-spacing: 0.01em; line-height: 1.5;", + "content": "font-weight: 600; color: #8b4513; font-family: 'Noto Serif SC', serif;", + "after": "" + }, + "h3": { + "base": "margin: 28px 0 0; font-size: 1.3em; line-height: 1.5;", + "content": "font-weight: 600; color: #8b4513; font-family: 'Noto Serif SC', serif;", + "after": "" + }, + "base": { + "base": "margin: 24px 0 0; font-size: 1.15em; line-height: 1.5;", + "content": "font-weight: 600; color: #8b4513; font-family: 'Noto Serif SC', serif;", + "after": "" + } + }, + "paragraph": "line-height: 1.75; margin-bottom: 1.1em; font-size: 15px; color: #5a4a42;", + "emphasis": { + "strong": "font-weight: 600; color: #d2691e; text-shadow: 0 2px 4px rgba(210,105,30,0.1);", + "em": "font-style: normal; color: #b87333; background: rgba(184,115,51,0.1); padding: 0 4px; border-left: 2px solid #b8733380;", + "del": "text-decoration: line-through; color: #8b4513; opacity: 0.8;" + }, + "list": { + "container": "padding-left: 26px; margin-bottom: 1.2em; color: #6b4423;", + "item": "margin-bottom: 0.8em; font-size: 15px; color: #6b4423; line-height: 1.85; font-family: 'Noto Serif SC', serif;", + "taskList": "list-style: none; margin-left: -22px; font-size: 15px; color: #6b4423; line-height: 1.85; font-family: 'Noto Serif SC', serif;" + }, + "code": { + "block": "background: #fff6e9; padding: 1.2em; border-radius: 8px; font-size: 14px; font-family: 'Fira Code', monospace; line-height: 1.6; white-space: pre-wrap; word-wrap: break-word; color: #8b4513; margin: 1.3em 0; border: 1px solid #b8733380; box-shadow: inset 0 4px 12px rgba(184,115,51,0.05), 0 2px 8px rgba(184,115,51,0.05);", + "inline": "background: #fff6e9; padding: 4px 10px; border-radius: 4px; color: #8b4513; font-size: 14px; font-family: 'Fira Code', monospace; border: 1px solid #b8733380;" + }, + "quote": "border-left: 3px solid #deb887; padding: 0 0 0 20px; margin: 1.3em 0; color: #b87333; font-style: italic; font-size: 15px; line-height: 1.85; font-family: 'Noto Serif SC', serif; background: linear-gradient(to right, rgba(222,184,135,0.1), transparent);", + "image": "max-width: 100%; height: auto; margin: 1.5em auto; border-radius: 12px; box-shadow: 0 4px 16px rgba(184,115,51,0.1); border: 1px solid #b8733380;", + "link": "color: #d2691e; text-decoration: none; background-image: linear-gradient(to right, #d2691e80, #b8733380); background-size: 0% 1px; background-repeat: no-repeat; background-position: 0 100%; transition: all 0.3s ease; font-family: 'Noto Serif SC', serif;", + "table": { + "container": "width: 100%; margin: 1.4em 0; border-collapse: separate; border-spacing: 0; border: 1px solid #b8733380; border-radius: 12px; overflow: hidden; box-shadow: 0 2px 12px rgba(184,115,51,0.05);", + "header": "background: linear-gradient(135deg, #fff6e9, #fffaf5); font-weight: 600; color: #8b4513; padding: 14px; font-family: 'Noto Serif SC', serif; border-bottom: 2px solid #b8733380;", + "cell": "padding: 14px; color: #6b4423; border-top: 1px solid #b8733380; font-family: 'Noto Serif SC', serif;" + }, + "hr": "border: none; border-top: 2px solid #b8733380; margin: 28px 0; box-shadow: 0 2px 8px rgba(184,115,51,0.05);", + "footnote": { + "ref": "color: #b87333; text-decoration: none; font-size: 0.9em; font-style: italic;", + "backref": "color: #b87333; text-decoration: none; font-size: 0.9em; font-style: italic;" + } + } +} \ No newline at end of file diff --git a/src/view.ts b/src/view.ts new file mode 100644 index 0000000..e9f2f6d --- /dev/null +++ b/src/view.ts @@ -0,0 +1,680 @@ +import { ItemView, WorkspaceLeaf, MarkdownRenderer, TFile } from 'obsidian'; +import { RedConverter } from './converter'; +import { DownloadManager } from './downloadManager'; +import type { TemplateManager } from './templateManager'; +import { DonateManager } from './donateManager'; +import type { SettingsManager } from './settings'; +import { PreviewManager } from './previewManager'; +export const VIEW_TYPE_RED = 'note-to-red'; + +export class RedView extends ItemView { + private previewEl: HTMLElement; + private currentFile: TFile | null = null; + private updateTimer: NodeJS.Timeout | null = null; + private isPreviewLocked: boolean = false; + private lockButton: HTMLButtonElement; + private copyButton: HTMLButtonElement; + private templateManager: TemplateManager; + private settingsManager: SettingsManager; + private customTemplateSelect: HTMLElement; + private customFontSelect: HTMLElement; + private fontSizeSelect: HTMLInputElement; + private customBackgroundSelect: HTMLElement; + private currentImageIndex: number = 0; + private navigationButtons: { + prev: HTMLButtonElement; + next: HTMLButtonElement; + indicator: HTMLElement; + } | undefined; + private previewManager: PreviewManager; + + constructor( + leaf: WorkspaceLeaf, + templateManager: TemplateManager, + settingsManager: SettingsManager + ) { + super(leaf); + this.templateManager = templateManager; + this.settingsManager = settingsManager; + this.previewManager = new PreviewManager(settingsManager); + } + + getViewType() { + return VIEW_TYPE_RED; + } + + getDisplayText() { + return '小红书预览'; + } + + getIcon() { + return 'image'; + } + + async onOpen() { + const container = this.containerEl.children[1]; + container.empty(); + + const toolbar = container.createEl('div', { cls: 'red-toolbar' }); + + // 锁定按钮 + this.lockButton = toolbar.createEl('button', { + cls: 'red-lock-button', + attr: { 'aria-label': '关闭实时预览状态' } + }); + this.lockButton.innerHTML = '🔓'; + this.lockButton.addEventListener('click', () => this.togglePreviewLock()); + + // 创建中间控件容器 + const controlsGroup = toolbar.createEl('div', { cls: 'red-controls-group' }); + + // 创建自定义下拉选择器 + this.customTemplateSelect = this.createCustomSelect( + controlsGroup, + 'red-template-select', + await this.getTemplateOptions() + ); + this.customTemplateSelect.id = 'template-select'; + + // 添加模板选择器的 change 事件监听 + this.customTemplateSelect.querySelector('.red-select')?.addEventListener('change', async (e: any) => { + const value = e.detail.value; + this.templateManager.setCurrentTemplate(value); + await this.settingsManager.updateSettings({ + templateId: value + }); + this.templateManager.applyTemplate(this.previewEl); + }); + + this.customFontSelect = this.createCustomSelect( + controlsGroup, + 'red-font-select', + this.getFontOptions() + ); + + // 添加字体选择器的 change 事件监听 + this.customFontSelect.querySelector('.red-select')?.addEventListener('change', async (e: any) => { + const value = e.detail.value; + this.templateManager.setFont(value); + await this.settingsManager.updateSettings({ + fontFamily: value + }); + this.templateManager.applyTemplate(this.previewEl); + }); + this.customFontSelect.id = 'font-select'; + + // 字号调整 + const fontSizeGroup = controlsGroup.createEl('div', { cls: 'red-font-size-group' }); + const decreaseButton = fontSizeGroup.createEl('button', { + cls: 'red-font-size-btn', + text: '-' + }); + this.fontSizeSelect = fontSizeGroup.createEl('input', { + cls: 'red-font-size-input', + type: 'text', + value: '16', + attr: { + style: 'border: none; outline: none; background: transparent;' + } + }); + const increaseButton = fontSizeGroup.createEl('button', { + cls: 'red-font-size-btn', + text: '+' + }); + + // 从设置中恢复上次的选择 + const settings = this.settingsManager.getSettings(); + + // 恢复设置 + if (settings.templateId) { + const templateSelect = this.customTemplateSelect.querySelector('.red-select-text'); + const templateDropdown = this.customTemplateSelect.querySelector('.red-select-dropdown'); + if (templateSelect && templateDropdown) { + const option = await this.getTemplateOptions(); + const selected = option.find(o => o.value === settings.templateId); + if (selected) { + // 更新选中文本和值 + templateSelect.textContent = selected.label; + this.customTemplateSelect.querySelector('.red-select')?.setAttribute('data-value', selected.value); + // 更新下拉列表中的选中状态 + templateDropdown.querySelectorAll('.red-select-item').forEach(el => { + if (el.getAttribute('data-value') === selected.value) { + el.classList.add('red-selected'); + } else { + el.classList.remove('red-selected'); + } + }); + } + } + this.templateManager.setCurrentTemplate(settings.templateId); + } + + if (settings.fontFamily) { + const fontSelect = this.customFontSelect.querySelector('.red-select-text'); + const fontDropdown = this.customFontSelect.querySelector('.red-select-dropdown'); + if (fontSelect && fontDropdown) { + const option = this.getFontOptions(); + const selected = option.find(o => o.value === settings.fontFamily); + if (selected) { + // 更新选中文本和值 + fontSelect.textContent = selected.label; + this.customFontSelect.querySelector('.red-select')?.setAttribute('data-value', selected.value); + // 更新下拉列表中的选中状态 + fontDropdown.querySelectorAll('.red-select-item').forEach(el => { + if (el.getAttribute('data-value') === selected.value) { + el.classList.add('red-selected'); + } else { + el.classList.remove('red-selected'); + } + }); + } + } + this.templateManager.setFont(settings.fontFamily); + } + + if (settings.fontSize) { + this.fontSizeSelect.value = settings.fontSize.toString(); + this.templateManager.setFontSize(settings.fontSize); + } + + // 更新字号调整事件 + const updateFontSize = async () => { + const size = parseInt(this.fontSizeSelect.value); + this.templateManager.setFontSize(size); + await this.settingsManager.updateSettings({ + fontSize: size + }); + this.templateManager.applyTemplate(this.previewEl); + }; + + // 字号调整按钮事件 + decreaseButton.addEventListener('click', () => { + const currentSize = parseInt(this.fontSizeSelect.value); + if (currentSize > 12) { + this.fontSizeSelect.value = (currentSize - 1).toString(); + updateFontSize(); + } + }); + + increaseButton.addEventListener('click', () => { + const currentSize = parseInt(this.fontSizeSelect.value); + if (currentSize < 30) { + this.fontSizeSelect.value = (currentSize + 1).toString(); + updateFontSize(); + } + }); + + this.fontSizeSelect.addEventListener('change', updateFontSize); + + // 预览区域 + this.previewEl = container.createEl('div', { cls: 'red-preview-wrapper' }); + + // 底部工具栏 + const bottomBar = container.createEl('div', { cls: 'red-bottom-bar' }); + + // 添加使用说明按钮 + const helpButton = bottomBar.createEl('button', { + cls: 'red-help-button', + attr: { 'aria-label': '使用指南' } + }); + helpButton.innerHTML = '❓'; + + // 更新帮助文本 + const tooltip = bottomBar.createEl('div', { + cls: 'red-help-tooltip', + text: `使用指南: + 1. 核心用法:用二级标题(##)分割内容,每个标题生成一张小红书配图 + 2. 首图制作:单独调整首节字号至20-24px,使用【下载当前页】导出 + 3. 长文优化:内容较多的章节可调小字号至14-16px后单独导出 + 4. 批量操作:保持统一字号时,用【导出全部页】批量生成 + 5. 模板切换:顶部选择器可切换不同视觉风格 + 6. 实时编辑:解锁状态(🔓)下编辑文档即时预览效果 + 7. 支持创作:点击❤️关于作者可进行打赏支持` + }); + + // 创建中间控件容器 + const bottomControlsGroup = bottomBar.createEl('div', { cls: 'red-bottom-controls-group' }); + + // 请作者喝咖啡按钮 + const likeButton = bottomControlsGroup.createEl('button', { + cls: 'red-like-button' + }); + likeButton.innerHTML = '❤️关于作者'; + likeButton.addEventListener('click', () => { + DonateManager.showDonateModal(this.containerEl); + }); + + // 单张下载按钮 + const singleDownloadButton = bottomControlsGroup.createEl('button', { + text: '下载当前页', + cls: 'red-export-button' + }); + + singleDownloadButton.addEventListener('click', async () => { + if (this.previewEl) { + singleDownloadButton.disabled = true; + singleDownloadButton.setText('导出中...'); + + try { + await DownloadManager.downloadSingleImage(this.previewEl); + singleDownloadButton.setText('导出成功'); + + setTimeout(() => { + singleDownloadButton.disabled = false; + singleDownloadButton.setText('下载当前页'); + }, 2000); + } catch (error) { + singleDownloadButton.setText('导出失败'); + setTimeout(() => { + singleDownloadButton.disabled = false; + singleDownloadButton.setText('下载当前页'); + }, 2000); + } + } + }); + + // 更新按钮文本和类名 + this.copyButton = bottomControlsGroup.createEl('button', { + text: '导出全部页', + cls: 'red-export-button' + }); + + // 添加导出按钮点击事件 + this.copyButton.addEventListener('click', async () => { + if (this.previewEl) { + this.copyButton.disabled = true; + this.copyButton.setText('导出中...'); + + try { + await DownloadManager.downloadAllImages(this.previewEl); + this.copyButton.setText('导出成功'); + + setTimeout(() => { + this.copyButton.disabled = false; + this.copyButton.setText('导出全部页'); + }, 2000); + } catch (error) { + this.copyButton.setText('导出失败'); + setTimeout(() => { + this.copyButton.disabled = false; + this.copyButton.setText('导出全部页'); + }, 2000); + } + } + }); + + const newButton = bottomControlsGroup.createEl('button', { + text: '敬请期待', + cls: 'red-feature-button' + }); + + // 监听文档变化 + this.registerEvent( + this.app.workspace.on('file-open', this.onFileOpen.bind(this)) + ); + + // 监听文档内容变化 + this.registerEvent( + this.app.vault.on('modify', this.onFileModify.bind(this)) + ); + + // 检查当前打开的文件 + const currentFile = this.app.workspace.getActiveFile(); + await this.onFileOpen(currentFile); + } + + private updateControlsState(enabled: boolean) { + this.lockButton.disabled = !enabled; + + // 更新自定义选择器的禁用状态 + const templateSelect = this.customTemplateSelect.querySelector('.red-select'); + const fontSelect = this.customFontSelect.querySelector('.red-select'); + if (templateSelect) { + templateSelect.classList.toggle('disabled', !enabled); + templateSelect.setAttribute('style', `pointer-events: ${enabled ? 'auto' : 'none'}`); + } + if (fontSelect) { + fontSelect.classList.toggle('disabled', !enabled); + fontSelect.setAttribute('style', `pointer-events: ${enabled ? 'auto' : 'none'}`); + } + + // 字号相关控件 + this.fontSizeSelect.disabled = !enabled; + const fontSizeButtons = this.containerEl.querySelectorAll('.red-font-size-btn'); + fontSizeButtons.forEach(button => { + (button as HTMLButtonElement).disabled = !enabled; + }); + + // 导出按钮 + this.copyButton.disabled = !enabled; + const singleDownloadButton = this.containerEl.querySelector('.red-export-button'); + if (singleDownloadButton) { + (singleDownloadButton as HTMLButtonElement).disabled = !enabled; + } + } + + async onFileOpen(file: TFile | null) { + this.currentFile = file; + this.currentImageIndex = 0; // 重置图片索引 + + if (!file || file.extension !== 'md') { + this.previewEl.empty(); + this.previewEl.createEl('div', { + text: '只能预览 Markdown 文本文档', + cls: 'red-empty-state' + }); + this.updateControlsState(false); + return; + } + + this.updateControlsState(true); + this.isPreviewLocked = false; + this.lockButton.innerHTML = '🔓'; + await this.updatePreview(); + } + private async togglePreviewLock() { + this.isPreviewLocked = !this.isPreviewLocked; + const lockIcon = this.isPreviewLocked ? '🔒' : '🔓'; + const lockStatus = this.isPreviewLocked ? '开启实时预览状态' : '关闭实时预览状态'; + this.lockButton.innerHTML = lockIcon; + this.lockButton.setAttribute('aria-label', lockStatus); + + if (!this.isPreviewLocked) { + await this.updatePreview(); + } + } + + async onFileModify(file: TFile) { + if (file === this.currentFile && !this.isPreviewLocked) { + if (this.updateTimer) { + clearTimeout(this.updateTimer); + } + + this.updateTimer = setTimeout(() => { + this.updatePreview(); + }, 500); + } + } + + async updatePreview() { + if (!this.currentFile) return; + this.previewEl.empty(); + const content = await this.app.vault.read(this.currentFile); + + // 渲染 Markdown 内容 + await MarkdownRenderer.renderMarkdown( + content, + this.previewEl, + this.currentFile.path, + this + ); + + // 转换内容并检查有效性 + RedConverter.formatContent(this.previewEl); + const hasValidContent = RedConverter.hasValidContent(this.previewEl); + + // 更新所有控件状态 + this.updateControlsState(hasValidContent); + if (!hasValidContent) { + this.copyButton.setAttribute('title', '请先添加二级标题内容'); + } else { + this.copyButton.removeAttribute('title'); + } + + // 添加用户信息到页头 + const header = this.previewEl.querySelector('.red-preview-header'); + if (header) { + this.previewManager.createHeaderContent( + header as HTMLElement, + () => this.handleAvatarClick(), + (el) => this.handleUserNameEdit(el), + (el) => this.handleUserIdEdit(el) + ); + } + + // 添加页脚内容 + const footer = this.previewEl.querySelector('.red-preview-footer'); + if (footer) { + this.previewManager.createFooterContent( + footer as HTMLElement, + (el, position) => this.handleFooterTextEdit(el, position) + ); + } + + // 应用模板和背景 + this.templateManager.applyTemplate(this.previewEl); + + // 获取所有内容区块 + const sections = this.previewEl.querySelectorAll('.red-content-section'); + if (sections.length === 0) return; + + // 创建导航按钮 + const navButtons = this.previewManager.createNavigationButtons( + this.previewEl, + sections.length, + (direction) => this.navigateImages(direction) + ); + this.navigationButtons = navButtons; + + // 显示当前图片 + this.previewManager.showImage(this.currentImageIndex, sections, this.navigationButtons); + } + + // 处理头像点击 + private async handleAvatarClick() { + // 创建文件选择器 + const input = document.createElement('input'); + input.type = 'file'; + input.accept = 'image/*'; + + input.addEventListener('change', async () => { + const file = input.files?.[0]; + if (file) { + try { + // 转换为 base64 + const reader = new FileReader(); + reader.onload = async (e) => { + const base64 = e.target?.result as string; + // 更新设置 + await this.settingsManager.updateSettings({ + userAvatar: base64 + }); + // 刷新预览 + await this.updatePreview(); + }; + reader.readAsDataURL(file); + } catch (error) { + console.error('头像更新失败:', error); + } + } + }); + + input.click(); + } + + // 处理用户名编辑 + private async handleUserNameEdit(element: HTMLElement) { + const input = document.createElement('input'); + input.value = element.textContent || ''; + input.className = 'red-user-edit-input'; + input.placeholder = '请输入用户名'; + element.replaceWith(input); + input.focus(); + + const handleBlur = async () => { + const newName = input.value.trim(); + await this.settingsManager.updateSettings({ + userName: newName || '夜半' // 设置默认值 + }); + await this.updatePreview(); + input.remove(); + }; + + input.addEventListener('blur', handleBlur); + input.addEventListener('keypress', async (e) => { + if (e.key === 'Enter') { + await handleBlur(); + } + }); + } + + // 处理用户ID编辑 + private async handleUserIdEdit(element: HTMLElement) { + const input = document.createElement('input'); + input.value = element.textContent || ''; + input.className = 'red-user-edit-input'; + input.placeholder = '请输入用户ID'; + element.replaceWith(input); + input.focus(); + + const handleBlur = async () => { + let newId = input.value.trim(); + if (!newId) { + newId = '@Yeban'; // 设置默认值 + } else if (!newId.startsWith('@')) { + newId = '@' + newId; + } + await this.settingsManager.updateSettings({ + userId: newId + }); + await this.updatePreview(); + input.remove(); + }; + + input.addEventListener('blur', handleBlur); + input.addEventListener('keypress', async (e) => { + if (e.key === 'Enter') { + await handleBlur(); + } + }); + } + + // ... existing code ... + + private async handleFooterTextEdit(element: HTMLElement, position: 'left' | 'right') { + const input = document.createElement('input'); + input.value = element.textContent || ''; + input.className = 'red-user-edit-input'; + input.placeholder = '请输入页脚文本'; + element.replaceWith(input); + input.focus(); + + const handleBlur = async () => { + const newText = input.value.trim(); + await this.settingsManager.updateSettings({ + [`footer${position === 'left' ? 'Left' : 'Right'}Text`]: newText || + (position === 'left' ? '夜半过后,光明便启程' : '欢迎关注公众号:夜半') + }); + await this.updatePreview(); + input.remove(); + }; + + input.addEventListener('blur', handleBlur); + input.addEventListener('keypress', async (e) => { + if (e.key === 'Enter') { + await handleBlur(); + } + }); + } + + // 修改 navigateImages 方法 + private navigateImages(direction: 'prev' | 'next') { + const sections = this.previewEl.querySelectorAll('.red-content-section'); + if (direction === 'prev' && this.currentImageIndex > 0) { + this.currentImageIndex--; + } else if (direction === 'next' && this.currentImageIndex < sections.length - 1) { + this.currentImageIndex++; + } + this.previewManager.showImage(this.currentImageIndex, sections, this.navigationButtons); + } + + // 添加自定义下拉选择器创建方法 + private createCustomSelect( + parent: HTMLElement, + className: string, + options: { value: string; label: string }[] + ) { + const container = parent.createEl('div', { cls: `red-select-container ${className}` }); + const select = container.createEl('div', { cls: 'red-select' }); + const selectedText = select.createEl('span', { cls: 'red-select-text' }); + const arrow = select.createEl('span', { cls: 'red-select-arrow', text: '▾' }); + + const dropdown = container.createEl('div', { cls: 'red-select-dropdown' }); + + options.forEach(option => { + const item = dropdown.createEl('div', { + cls: 'red-select-item', + text: option.label + }); + + item.dataset.value = option.value; + item.addEventListener('click', () => { + dropdown.querySelectorAll('.red-select-item').forEach(el => + el.classList.remove('red-selected')); + item.classList.add('red-selected'); + selectedText.textContent = option.label; + select.dataset.value = option.value; + dropdown.classList.remove('red-show'); + select.dispatchEvent(new CustomEvent('change', { + detail: { value: option.value } + })); + }); + }); + + // 设置默认值和选中状态 + if (options.length > 0) { + selectedText.textContent = options[0].label; + select.dataset.value = options[0].value; + dropdown.querySelector('.red-select-item')?.classList.add('red-selected'); + } + + // 点击显示/隐藏下拉列表 + select.addEventListener('click', (e) => { + e.stopPropagation(); + dropdown.classList.toggle('red-show'); + }); + + // 点击其他地方关闭下拉列表 + document.addEventListener('click', () => { + dropdown.classList.remove('red-show'); + }); + + return container; + } + + // 获取模板选项 + private async getTemplateOptions() { + await this.templateManager.loadTemplates(); + const templates = this.templateManager.getAllTemplates(); + + return templates.length > 0 + ? templates.map(t => ({ value: t.id, label: t.name })) + : [{ value: 'default', label: '默认模板' }]; + } + + // 获取字体选项 + private getFontOptions() { + return [ + { + value: 'Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif', + label: '默认字体' + }, + { + value: 'SimSun, "宋体", serif', + label: '宋体' + }, + { + value: 'SimHei, "黑体", sans-serif', + label: '黑体' + }, + { + value: 'KaiTi, "楷体", serif', + label: '楷体' + }, + { + value: '"Microsoft YaHei", "微软雅黑", sans-serif', + label: '雅黑' + } + ]; + } +} diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..3fca19f --- /dev/null +++ b/styles.css @@ -0,0 +1,736 @@ +/* 状态栏样式覆盖 */ +.workspace-leaf-content .view-content { + padding: 10px 10px 13px 10px; +} + +/* 工具栏基础样式 */ +.red-toolbar, .red-bottom-bar { + padding: 20px 32px; + position: sticky; + border-radius: 6px; + z-index: 100; + display: flex; + align-items: center; + min-width: 680px; +} + +.red-toolbar { + top: 0; + background: rgba(82, 144, 220, 0.03); + border-bottom: 1px solid rgba(82, 144, 220, 0.1); +} + +.red-bottom-bar { + bottom: 0; + background: rgba(82, 144, 220, 0.02); + border-top: 1px solid rgba(82, 144, 220, 0.1); +} + +/* 控件组布局 */ +.red-controls-group, .red-bottom-controls-group { + display: flex; + gap: 12px; + align-items: center; + margin: 0 auto; + width: fit-content; + min-width: fit-content; + margin-left: 40px; +} + +/* 锁定按钮 */ +.red-lock-button { + width: 32px; + height: 32px; + border: 1px solid #e8e8e8; + border-radius: 8px; + background: white; + color: #666; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s ease; + font-size: 16px; + box-shadow: 0 1px 3px rgba(82, 144, 220, 0.1); +} + +.red-lock-button:hover { + background: #f5f8fc; + border-color: #5C5F77; + color: #5C5F77; + box-shadow: 0 2px 6px rgba(82, 144, 220, 0.15); +} + +/* 下拉选择器 */ +.red-select-container { + position: relative; + width: 160px; +} + +.red-select { + height: 32px; + padding: 0 12px; + border: 1px solid #5C5F77; + border-radius: 8px; + background: white; + display: flex; + align-items: center; + justify-content: space-between; + cursor: pointer; + user-select: none; + transition: all 0.2s ease; + color: #5C5F77; + box-shadow: 0 1px 3px rgba(82, 144, 220, 0.1); +} + +.red-select:hover { + background: #f5f8fc; + box-shadow: 0 2px 6px rgba(82, 144, 220, 0.15); +} + +.red-select.disabled { + opacity: 0.5; + background: #f5f5f5 !important; + color: #999 !important; + border-color: #e8e8e8 !important; + cursor: not-allowed; + box-shadow: none; +} + +.red-select-arrow { + color: #5C5F77; + font-size: 12px; + transition: transform 0.2s ease; +} + +.red-select-dropdown { + position: absolute; + top: calc(100% + 4px); + left: 0; + width: 100%; + background: white; + border: 1px solid #e8e8e8; + border-radius: 8px; + box-shadow: 0 4px 12px rgba(82, 144, 220, 0.15); + display: none; + z-index: 1000; + overflow: hidden; +} + +.red-select-dropdown.red-show { + display: block; +} + +.red-select-item { + padding: 8px 12px; + cursor: pointer; + transition: all 0.2s ease; + color: #333; +} + +.red-select-item:hover { + background: #f5f8fc; +} + +.red-select-item.red-selected { + background-color: #f5f8fc; + color: #5C5F77; +} + +/* 字号调整组件 */ +.red-font-size-group { + width: 120px; + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: space-between; + height: 32px; + background: white; + border: 1px solid #5C5F77; + border-radius: 8px; + padding: 0; + overflow: hidden; + box-shadow: 0 1px 3px rgba(82, 144, 220, 0.1); +} + +.red-font-size-btn { + width: 55px; + height: 32px; + border: none; + background: white; + color: #5C5F77; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s ease; + font-size: 16px; +} + +.red-font-size-btn:hover { + background: rgba(82, 144, 220, 0.05); +} + +.red-font-size-input { + width: 40px; + text-align: center; + font-size: 16px; + padding: 0; + margin: 0; + border: none; + background: transparent; + color: #5C5F77; + outline: none; +} + +/* 预览区域 */ +.red-preview-wrapper { + padding: 10px 20px 20px 20px; + margin: 10px; + height: calc(100% - 180px); + overflow-y: auto; + background: white; + flex: 1; + border-radius: 12px; + box-shadow: 0 2px 12px rgba(0, 0, 0, 0.04); + border: 1px solid rgba(82, 144, 220, 0.1); +} + +.red-empty-state { + display: flex; + justify-content: center; + align-items: center; + height: 100%; + color: #999; + font-size: 16px; +} + +/* 帮助按钮 */ +.red-help-button { + width: 32px; + height: 32px; + border: 1px solid #e8e8e8; + border-radius: 8px; + background: white; + color: #666; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s ease; + font-size: 16px; + box-shadow: 0 1px 3px rgba(82, 144, 220, 0.1); +} + +.red-help-button:hover { + background: #f5f8fc; + border-color: #5C5F77; + color: #5C5F77; + box-shadow: 0 2px 6px rgba(82, 144, 220, 0.15); +} + +/* 提示框位置调整 */ +.red-help-tooltip { + position: absolute; + left: 32px; + bottom: 48px; + width: 450px; + padding: 12px 16px; + background: white; + border: 2px solid rgba(82, 144, 220, 0.1); + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08); + font-size: 13px; + line-height: 1.6; + color: #5290DC; + display: none; + white-space: pre-line; + z-index: 1000; +} + +.red-help-button:hover + .red-help-tooltip { + display: block; +} + +/* 底部按钮 */ +.red-bottom-controls-group button { + padding: 8px 24px; + width: 120px; + height: 36px; + border-radius: 8px; + border: 1px solid #5C5F77; + background: white; + color: #5C5F77; + cursor: pointer; + transition: all 0.2s ease; + font-size: 14px; + display: flex; + align-items: center; + justify-content: center; + gap: 6px; + box-shadow: 0 1px 3px rgba(82, 144, 220, 0.1); +} + +.red-bottom-controls-group button:hover { + background: rgba(82, 144, 220, 0.05); + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(82, 144, 220, 0.2); +} + +.red-export-button:not(:disabled) { + background: #5290DC !important; + color: white !important; + border: none !important; + box-shadow: 0 2px 6px rgba(82, 144, 220, 0.2) !important; +} + +.red-export-button:not(:disabled):hover { + background: #4a83c8 !important; + box-shadow: 0 4px 12px rgba(82, 144, 220, 0.3) !important; +} + +.red-feature-button { + opacity: 0.5; + border-color: #5C5F77 !important; + background: white !important; + color: #5C5F77 !important; + cursor: not-allowed !important; +} + +.red-bottom-controls-group button:disabled { + opacity: 0.5; + background: white !important; + color: #5C5F77 !important; + cursor: not-allowed !important; + transform: none; + border-color: #5C5F77 !important; + box-shadow: none; +} + +/* 关于作者的框 */ +.red-about-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.6); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; +} + +/* 弹框主体 */ +.red-about-modal { + background: white; + border-radius: 12px; + padding: 20px 20px; + width: 520px; + max-height: 90vh; + position: relative; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.08); + display: flex; + flex-direction: column; + gap: 10px; + overflow-y: auto; +} + +/* 自定义滚动条样式 */ +.red-about-modal::-webkit-scrollbar { + width: 8px; +} + +.red-about-modal::-webkit-scrollbar-track { + background: #f5f5f5; + border-radius: 4px; +} + +.red-about-modal::-webkit-scrollbar-thumb { + background: #ddd; + border-radius: 4px; +} + +.red-about-modal::-webkit-scrollbar-thumb:hover { + background: #ccc; +} + +/* 关闭按钮 */ +.red-about-close { + position: absolute; + top: 7px; + right: 7px; + width: 28px; + height: 28px; + background: transparent; + border: none; + border-radius: 6px; + font-size: 17px; + color: #bfbfbf; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s ease; +} + +/* macOS 系统下的样式 */ +@media screen and (-webkit-min-device-pixel-ratio: 0) and (min-color-index:0) { + .red-about-close { + right: auto; + left: 7px; + } +} + +.red-about-close:hover { + background: #f5f5f5; + color: #595959; +} + +/* 内容区块 */ +.red-about-section { + padding: 10px; + margin: 8px 20px 0 20px; + border-radius: 8px; +} + +.red-about-intro-section { + background: #fafafa; + border: 1px solid #f0f0f0; +} + +.red-about-donate-section { + background: #fff9f5; + border: 1px solid #ffe4d9; +} + +.red-about-mp-section { + background: #f5fff7; + border: 1px solid #e6f7e9; +} + +/* 文字样式 */ +.red-about-title { + font-size: 20px; + font-weight: 600; + color: #2c3e50; + margin: 0 0 1px; + text-align: center; + letter-spacing: 0.5px; +} + +.red-about-name { + color: #5290DC; + font-weight: 600; + font-size: 16px; + padding: 0 2px; +} + +.red-about-identity { + color: #34495e; + font-weight: 500; + background: rgba(8, 98, 209, 0.08); + padding: 0 4px; + border-radius: 3px; +} + +.red-about-highlight { + color: #e67e22; + font-weight: 500; +} + +.red-about-value { + color: #16a085; + font-weight: 500; +} + +.red-about-subtitle { + font-size: 18px; + color: #d35400; + margin: 8px 0 12px; + letter-spacing: 0.3px; + font-weight: 600; +} + +.red-about-intro { + font-size: 15px; + color: #2c3e50; + margin: 8px 0; + line-height: 1.8; + letter-spacing: 0.2px; +} + +.red-about-role, +.red-about-desc { + font-size: 14.5px; + color: #34495e; + margin: 6px 0; + line-height: 1.8; + letter-spacing: 0.2px; +} + +.red-about-emphasis { + font-weight: 500; + color: #c0392b; +} + +.red-about-footer { + font-size: 15px; + color: #2c3e50; + text-align: center; + margin: 1px 0 0; + padding: 1px 1px; + background: #f8f9fa; + border-radius: 8px; + font-weight: 500; + letter-spacing: 0.3px; + line-height: 1.6; +} + +.red-about-footer strong { + color: #8e44ad; + font-weight: 600; +} + +/* 二维码容器 */ +.red-about-qr { + width: 100%; + height: 150px; + margin: 5px 0; + padding: 5px; + background: white; + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); +} + +.red-about-qr img { + width: 100%; + height: 100%; + object-fit: contain; +} + +/* 小红书预览容器 */ +.red-preview-container { + position: relative; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: flex-start; + background: #f5f5f5; + border-radius: 12px; + padding: 20px; + overflow: auto; +} + +/* 图片预览区域 */ +.red-image-preview { + width: 100%; + max-width: 450px; + aspect-ratio: 3/4; + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + padding: 20px; + position: relative; + display: flex; + flex-direction: column; + overflow: hidden; +} + +/* 内容区域容器 */ +.red-content-wrapper { + flex: 1; + overflow: hidden; +} + +/* 导航按钮 */ +.red-nav-button { + width: 40px; + height: 40px; + border: none; + border-radius: 50%; + background: rgba(255, 255, 255, 0.9); + color: #333; + font-size: 20px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.2s ease; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); +} + +.red-nav-button:hover { + background: white; + transform: scale(1.1); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} + +/* 页码指示器 */ +.red-page-indicator { + padding: 6px 12px; + background: rgba(255, 255, 255, 0.9); + border-radius: 16px; + font-size: 14px; + color: #333; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); +} + +/* 导航容器 */ +.red-nav-container { + position: absolute; + bottom: 20px; + left: 0; + right: 0; + display: flex; + justify-content: center; + align-items: center; + gap: 20px; + z-index: 10; +} + +/* 内容区块样式 */ +.red-content-section { + display: none; + margin: 0 13px; +} + +.red-content-section[data-index="0"] { + display: block; +} + +/* 空状态提示 */ +.red-empty-message { + text-align: center; + padding: 40px 20px; + color: #ff4757; + font-size: 15px; + background: rgba(255, 71, 87, 0.03); + border: 1px dashed rgba(255, 71, 87, 0.2); + border-radius: 12px; + margin: 40px auto; + max-width: 320px; + line-height: 1.8; + white-space: pre-line; + box-shadow: 0 2px 8px rgba(255, 71, 87, 0.05); + animation: fadeIn 0.3s ease; +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* 用户信息区域样式 */ +.red-user-info { + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px 12px 3px 12px; + line-height: normal; +} + +.red-user-left { + display: flex; + align-items: center; + gap: 12px; +} + +.red-user-avatar { + width: 42px; + height: 42px; + border-radius: 50%; + overflow: hidden; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; +} + +.red-user-avatar img { + width: 100%; + height: 100%; + object-fit: cover; + border-radius: 50%; +} + +.red-avatar-placeholder { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + background-color: #f7f7f7; + border-radius: 50%; + transition: all 0.3s ease; +} + +.red-avatar-upload-icon { + font-size: 20px; + opacity: 0.6; +} + +.red-avatar-placeholder:hover { + background-color: #efefef; +} + +.red-avatar-placeholder:hover .red-avatar-upload-icon { + opacity: 0.8; +} + +.red-user-meta { + display: flex; + flex-direction: column; + gap: 1px; +} + +.red-user-name-container { + display: flex; + align-items: center; + gap: 4px; +} + +.red-user-name { + font-size: 16px; + font-weight: 600; + color: #333; + cursor: pointer; +} + +.red-user-id { + font-size: 14px; + color: #999; + cursor: pointer; +} + +.red-user-right { + color: #999; + font-size: 14px; +} + +/* 编辑输入框样式 */ +.red-user-edit-input { + border: none; + border-bottom: 1px solid #ccc; + outline: none; + padding: 2px 4px; + font-size: inherit; + font-family: inherit; + background: transparent; +} + +/* 悬停效果 */ +.red-user-avatar:hover, +.red-user-name:hover, +.red-user-id:hover { + opacity: 0.8; +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..065072e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "inlineSourceMap": true, + "inlineSources": true, + "module": "ESNext", + "target": "ES6", + "allowJs": true, + "noImplicitAny": true, + "moduleResolution": "node", + "importHelpers": true, + "isolatedModules": true, + "strictNullChecks": true, + "lib": [ + "DOM", + "ES5", + "ES6", + "ES7" + ], + "allowSyntheticDefaultImports": true, + }, + "include": [ + "src/**/*.ts" + , "templates/index.ts" ] +} \ No newline at end of file