From 0090ce9b9303b2d6ab3eb425754d574359f17819 Mon Sep 17 00:00:00 2001 From: douboer Date: Mon, 22 Sep 2025 13:55:41 +0800 Subject: [PATCH] update at 2025-09-22 13:55:41 --- .editorconfig | 10 + .eslintignore | 3 + .eslintrc | 23 + .gitattributes | 1 + .gitignore | 24 + .npmrc | 1 + LICENSE | 21 + esbuild.config.mjs | 48 + images/20240630221748.jpg | Bin 0 -> 66664 bytes images/20240702203745.jpg | Bin 0 -> 246747 bytes images/20240728183041.png | Bin 0 -> 140545 bytes images/clipboard-paste.png | Bin 0 -> 409 bytes images/screenshot.png | Bin 0 -> 228815 bytes manifest.json | 10 + package-lock.json | 2278 ++++++++++ package.json | 32 + run.sh | 20 + src/article-render.ts | 630 +++ src/assets.ts | 461 ++ src/default-highlight.ts | 109 + src/default-theme.ts | 349 ++ src/doc-modal.ts | 66 + src/expert-settings.ts | 80 + src/gallery/index.ts | 47 + src/image/index.ts | 64 + src/imagelib.ts | 68 + src/inline-css.ts | 207 + src/main.ts | 153 + src/markdown/blockquote.ts | 84 + src/markdown/callouts.ts | 275 ++ src/markdown/code.ts | 287 ++ src/markdown/commnet.ts | 78 + src/markdown/embed-block-mark.ts | 62 + src/markdown/empty-line.ts | 48 + src/markdown/extension.ts | 55 + src/markdown/footnote.ts | 104 + src/markdown/heading.ts | 131 + src/markdown/icons.ts | 122 + src/markdown/link.ts | 69 + src/markdown/local-file.ts | 831 ++++ src/markdown/math.ts | 208 + src/markdown/parser.ts | 167 + src/markdown/text-highlight.ts | 66 + src/markdown/topic.ts | 61 + src/markdown/widget-box.ts | 179 + src/meta/index.ts | 76 + src/note-preview.ts | 569 +++ src/postcss/at-rule.d.ts | 140 + src/postcss/comment.d.ts | 68 + src/postcss/container.d.ts | 490 +++ src/postcss/css-syntax-error.d.ts | 248 ++ src/postcss/declaration.d.ts | 152 + src/postcss/document.d.ts | 69 + src/postcss/fromJSON.d.ts | 9 + src/postcss/input.d.ts | 194 + src/postcss/lazy-result.d.ts | 190 + src/postcss/list.d.ts | 57 + src/postcss/no-work-result.d.ts | 46 + src/postcss/node.d.ts | 536 +++ src/postcss/parse.d.ts | 9 + src/postcss/postcss.d.ts | 436 ++ src/postcss/postcss.js | 6520 +++++++++++++++++++++++++++++ src/postcss/previous-map.d.ts | 81 + src/postcss/processor.d.ts | 115 + src/postcss/result.d.ts | 206 + src/postcss/root.d.ts | 87 + src/postcss/rule.d.ts | 119 + src/postcss/stringifier.d.ts | 46 + src/postcss/stringify.d.ts | 9 + src/postcss/warning.d.ts | 147 + src/preprocess/index.ts | 36 + src/refactor-plan.md | 69 + src/render/index.ts | 50 + src/setting-tab.ts | 459 ++ src/settings.ts | 203 + src/utils.ts | 251 ++ src/wasm/wasm.ts | 58 + src/wasm/wasm_exec.js | 561 +++ src/weixin-api.ts | 228 + src/widgets-modal.ts | 77 + styles.css | 162 + tools/download.mjs | 71 + tsconfig.json | 25 + version-bump.mjs | 14 + versions.json | 3 + 85 files changed, 20418 insertions(+) create mode 100644 .editorconfig create mode 100644 .eslintignore create mode 100644 .eslintrc create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 LICENSE create mode 100644 esbuild.config.mjs create mode 100644 images/20240630221748.jpg create mode 100644 images/20240702203745.jpg create mode 100644 images/20240728183041.png create mode 100644 images/clipboard-paste.png create mode 100644 images/screenshot.png create mode 100644 manifest.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100755 run.sh create mode 100644 src/article-render.ts create mode 100644 src/assets.ts create mode 100644 src/default-highlight.ts create mode 100644 src/default-theme.ts create mode 100644 src/doc-modal.ts create mode 100644 src/expert-settings.ts create mode 100644 src/gallery/index.ts create mode 100644 src/image/index.ts create mode 100644 src/imagelib.ts create mode 100644 src/inline-css.ts create mode 100644 src/main.ts create mode 100644 src/markdown/blockquote.ts create mode 100644 src/markdown/callouts.ts create mode 100644 src/markdown/code.ts create mode 100644 src/markdown/commnet.ts create mode 100644 src/markdown/embed-block-mark.ts create mode 100644 src/markdown/empty-line.ts create mode 100644 src/markdown/extension.ts create mode 100644 src/markdown/footnote.ts create mode 100644 src/markdown/heading.ts create mode 100644 src/markdown/icons.ts create mode 100644 src/markdown/link.ts create mode 100644 src/markdown/local-file.ts create mode 100644 src/markdown/math.ts create mode 100644 src/markdown/parser.ts create mode 100644 src/markdown/text-highlight.ts create mode 100644 src/markdown/topic.ts create mode 100644 src/markdown/widget-box.ts create mode 100644 src/meta/index.ts create mode 100644 src/note-preview.ts create mode 100644 src/postcss/at-rule.d.ts create mode 100644 src/postcss/comment.d.ts create mode 100644 src/postcss/container.d.ts create mode 100644 src/postcss/css-syntax-error.d.ts create mode 100644 src/postcss/declaration.d.ts create mode 100644 src/postcss/document.d.ts create mode 100644 src/postcss/fromJSON.d.ts create mode 100644 src/postcss/input.d.ts create mode 100644 src/postcss/lazy-result.d.ts create mode 100644 src/postcss/list.d.ts create mode 100644 src/postcss/no-work-result.d.ts create mode 100644 src/postcss/node.d.ts create mode 100644 src/postcss/parse.d.ts create mode 100644 src/postcss/postcss.d.ts create mode 100644 src/postcss/postcss.js create mode 100644 src/postcss/previous-map.d.ts create mode 100644 src/postcss/processor.d.ts create mode 100644 src/postcss/result.d.ts create mode 100644 src/postcss/root.d.ts create mode 100644 src/postcss/rule.d.ts create mode 100644 src/postcss/stringifier.d.ts create mode 100644 src/postcss/stringify.d.ts create mode 100644 src/postcss/warning.d.ts create mode 100644 src/preprocess/index.ts create mode 100644 src/refactor-plan.md create mode 100644 src/render/index.ts create mode 100644 src/setting-tab.ts create mode 100644 src/settings.ts create mode 100644 src/utils.ts create mode 100644 src/wasm/wasm.ts create mode 100644 src/wasm/wasm_exec.js create mode 100644 src/weixin-api.ts create mode 100644 src/widgets-modal.ts create mode 100644 styles.css create mode 100644 tools/download.mjs create mode 100644 tsconfig.json create mode 100644 version-bump.mjs create mode 100644 versions.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..81f3ec3 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +# top-most EditorConfig file +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = tab +indent_size = 4 +tab_width = 4 diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..e019f3c --- /dev/null +++ b/.eslintignore @@ -0,0 +1,3 @@ +node_modules/ + +main.js diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..0807290 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,23 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "env": { "node": true }, + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ], + "parserOptions": { + "sourceType": "module" + }, + "rules": { + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": ["error", { "args": "none" }], + "@typescript-eslint/ban-ts-comment": "off", + "no-prototype-builtins": "off", + "@typescript-eslint/no-empty-function": "off" + } + } \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..176a458 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8a22b91 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# vscode +.vscode + +# Intellij +*.iml +.idea + +# npm +node_modules + +# Don't include the compiled main.js file in the repo. +# They should be uploaded to GitHub releases instead. +main.js + +# Exclude sourcemaps +*.map + +# obsidian +data.json + +# Exclude macOS Finder (System Explorer) View States +.DS_Store + +assets \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..b973752 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +tag-version-prefix="" \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..db4b010 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 sunbooshi + +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/esbuild.config.mjs b/esbuild.config.mjs new file mode 100644 index 0000000..be2cafe --- /dev/null +++ b/esbuild.config.mjs @@ -0,0 +1,48 @@ +import esbuild from "esbuild"; +import process from "process"; +import builtins from "builtin-modules"; + +const banner = +`/* +THIS IS A GENERATED/BUNDLED FILE BY ESBUILD +if you want to view the source, please visit the github repository of this plugin +*/ +`; + +const prod = (process.argv[2] === "production"); + +const context = await esbuild.context({ + banner: { + js: banner, + }, + entryPoints: ["src/main.ts"], + bundle: true, + external: [ + "obsidian", + "electron", + "@codemirror/autocomplete", + "@codemirror/collab", + "@codemirror/commands", + "@codemirror/language", + "@codemirror/lint", + "@codemirror/search", + "@codemirror/state", + "@codemirror/view", + "@lezer/common", + "@lezer/highlight", + "@lezer/lr", + ...builtins], + format: "cjs", + target: "es2018", + logLevel: "info", + sourcemap: prod ? false : "inline", + treeShaking: true, + outfile: "main.js", +}); + +if (prod) { + await context.rebuild(); + process.exit(0); +} else { + await context.watch(); +} \ No newline at end of file diff --git a/images/20240630221748.jpg b/images/20240630221748.jpg new file mode 100644 index 0000000000000000000000000000000000000000..061ee71b50efd3de1c84d97d0527e6df4b9b404b GIT binary patch literal 66664 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≪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 G?tcMG1OVUw literal 0 HcmV?d00001 diff --git a/images/20240702203745.jpg b/images/20240702203745.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2ed79eab395a57fcfd2ea6dcaccc65fe7b8cbcf2 GIT binary patch literal 246747 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%0A1UYl`!!2d&kA#fQk4%!>JSEYE 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%0ABk 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

dE8bjKF9Q--gDwzp4(y|GxV{++^-db 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

&winb9`9FjrAm4#{=9OI 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

nMz1OHf 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.10.0" + } + }, + "node_modules/@codemirror/state": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", + "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==", + "dev": true, + "peer": true + }, + "node_modules/@codemirror/view": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.26.0.tgz", + "integrity": "sha512-nSSmzONpqsNzshPOxiKhK203R6BvABepugAe34QfQDbNDslyjkqBuKgrK5ZBvqNXpfxz5iLrlGTmEfhbQyH46A==", + "dev": true, + "peer": true, + "dependencies": { + "@codemirror/state": "^6.4.0", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.3.tgz", + "integrity": "sha512-1Mlz934GvbgdDmt26rTLmf03cAgLg5HyOgJN+ZGCeP3Q9ynYTNMn2/LQxIl7Uy+o4K6Rfi2OuLsr12JQQR8gNg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "peer": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "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, + "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.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "peer": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "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, + "peer": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "dev": true, + "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, + "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, + "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, + "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, + "dependencies": { + "@types/tern": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "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 + }, + "node_modules/@types/node": { + "version": "16.18.89", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.89.tgz", + "integrity": "sha512-QlrE8QI5z62nfnkiUZysUsAaxWaTMoGqFVcB3PvK1WxJ0c699bacErV4Fabe9Hki6ZnaHalgzihLbTl2d34XfQ==", + "dev": true + }, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "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.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "peer": true + }, + "node_modules/@zip.js/zip.js": { + "version": "2.7.43", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.43.tgz", + "integrity": "sha512-kW7elA/Q1o5xusStfZeysCvheD1SvW3TWDfqTCmoWW4ALBSqKonZSTrQgdEGOUec2U/TLMSGq0SuSMTAxy4gFg==", + "engines": { + "bun": ">=0.7.0", + "deno": ">=1.0.0", + "node": ">=16.5.0" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "peer": true + }, + "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, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.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, + "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, + "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, + "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, + "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, + "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, + "peer": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "peer": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "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, + "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, + "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, + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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, + "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, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "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.0", + "@humanwhocodes/config-array": "^0.11.14", + "@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, + "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, + "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, + "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, + "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, + "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, + "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, + "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.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "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, + "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, + "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, + "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, + "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, + "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, + "peer": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "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.4" + }, + "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, + "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, + "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, + "peer": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "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, + "peer": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "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, + "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, + "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.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "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, + "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 + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "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, + "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, + "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, + "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, + "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, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/highlight.js": { + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz", + "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/html-to-image": { + "version": "1.11.11", + "resolved": "https://registry.npmmirror.com/html-to-image/-/html-to-image-1.11.11.tgz", + "integrity": "sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA==" + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "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, + "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==", + "dev": true, + "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==", + "dev": true, + "peer": true + }, + "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, + "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, + "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, + "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, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "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, + "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, + "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, + "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, + "peer": true + }, + "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, + "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, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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, + "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, + "peer": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/marked": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.1.tgz", + "integrity": "sha512-Y1/V2yafOcOdWQCX0XpAKXzDakPOpn6U0YLxTJs3cww6VxOzZV1BTOOYWLvH3gX38cq+iLwljHHTnMtlDfg01Q==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/marked-highlight": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/marked-highlight/-/marked-highlight-2.1.3.tgz", + "integrity": "sha512-t35JWm2u8HanOJ+gSJBAYQ0Jgr3vy+gl7ORAXN8bSEQFHl5FYXH0A7YXVMrfhmKaSuBSy6LidXECn3U9Qv/dHA==", + "peerDependencies": { + "marked": ">=4 <14" + } + }, + "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, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "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, + "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, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "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, + "peer": true + }, + "node_modules/obsidian": { + "version": "1.5.7-1", + "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-1.5.7-1.tgz", + "integrity": "sha512-T5ZRuQ1FnfXqEoakTTHVDYvzUEEoT8zSPnQCW31PVgYwG4D4tZCQfKHN2hTz1ifnCe8upvwa6mBTAP2WUA5Vng==", + "dev": true, + "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, + "peer": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "peer": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "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, + "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, + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "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, + "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, + "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, + "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, + "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, + "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, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "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, + "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" + } + ] + }, + "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, + "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, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "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==", + "dev": true, + "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" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "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, + "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, + "engines": { + "node": ">=8" + } + }, + "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, + "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, + "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, + "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, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "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, + "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 + }, + "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, + "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 + }, + "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, + "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, + "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, + "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, + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "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, + "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, + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "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, + "peer": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": 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, + "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..0cbe0e0 --- /dev/null +++ b/package.json @@ -0,0 +1,32 @@ +{ + "name": "note-to-mp", + "version": "1.3.0", + "description": "This is a plugin for Obsidian (https://obsidian.md)", + "main": "main.js", + "scripts": { + "dev": "node esbuild.config.mjs", + "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", + "download": "node tools/download.mjs", + "version": "node version-bump.mjs && git add manifest.json versions.json" + }, + "keywords": [], + "author": "", + "license": "MIT", + "devDependencies": { + "@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": { + "@zip.js/zip.js": "^2.7.43", + "highlight.js": "^11.9.0", + "html-to-image": "^1.11.11", + "marked": "^12.0.1", + "marked-highlight": "^2.1.3" + } +} diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..d678676 --- /dev/null +++ b/run.sh @@ -0,0 +1,20 @@ + +#!/bin/bash + +# 自动添加所有修改 +git add . + +# 如果没有提交信息,默认用时间戳 +msg="update at $(date '+%Y-%m-%d %H:%M:%S')" + +# 支持自定义提交信息:./run.sh "your message" +if [ $# -gt 0 ]; then + msg="$*" +fi + +# 提交 +git commit -m "$msg" + +# 推送到远程 main 分支 +git push origin main + diff --git a/src/article-render.ts b/src/article-render.ts new file mode 100644 index 0000000..b702fd2 --- /dev/null +++ b/src/article-render.ts @@ -0,0 +1,630 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { App, ItemView, Workspace, Notice, sanitizeHTMLToDom, apiVersion, TFile, MarkdownRenderer, FrontMatterCache } from 'obsidian'; +import { applyCSS } from './utils'; +import { UploadImageToWx } from './imagelib'; +import { NMPSettings } from './settings'; +import AssetsManager from './assets'; +import InlineCSS from './inline-css'; +import { wxGetToken, wxAddDraft, wxBatchGetMaterial, DraftArticle, DraftImageMediaId, DraftImages, wxAddDraftImages } from './weixin-api'; +import { MDRendererCallback } from './markdown/extension'; +import { MarkedParser } from './markdown/parser'; +import { LocalImageManager, LocalFile } from './markdown/local-file'; +import { CardDataManager } from './markdown/code'; +import { debounce } from './utils'; +import { PrepareImageLib, IsImageLibReady, WebpToJPG } from './imagelib'; +import { toPng } from 'html-to-image'; + + +const FRONT_MATTER_REGEX = /^(---)$.+?^(---)$.+?/ims; + +export class ArticleRender implements MDRendererCallback { + app: App; + itemView: ItemView; + workspace: Workspace; + styleEl: HTMLElement; + articleDiv: HTMLDivElement; + settings: NMPSettings; + assetsManager: AssetsManager; + articleHTML: string; + title: string; + _currentTheme: string; + _currentHighlight: string; + _currentAppId: string; + markedParser: MarkedParser; + cachedElements: Map = new Map(); + debouncedRenderMarkdown: (...args: any[]) => void; + + constructor(app: App, itemView: ItemView, styleEl: HTMLElement, articleDiv: HTMLDivElement) { + this.app = app; + this.itemView = itemView; + this.styleEl = styleEl; + this.articleDiv = articleDiv; + this.settings = NMPSettings.getInstance(); + this.assetsManager = AssetsManager.getInstance(); + this.articleHTML = ''; + this.title = ''; + this._currentTheme = 'default'; + this._currentHighlight = 'default'; + this.markedParser = new MarkedParser(app, this); + this.debouncedRenderMarkdown = debounce(this.renderMarkdown.bind(this), 1000); + } + + set currentTheme(value: string) { + this._currentTheme = value; + } + + get currentTheme() { + const { theme } = this.getMetadata(); + if (theme) { + return theme; + } + return this._currentTheme; + } + + set currentHighlight(value: string) { + this._currentHighlight = value; + } + + get currentHighlight() { + const { highlight } = this.getMetadata(); + if (highlight) { + return highlight; + } + return this._currentHighlight; + } + + isOldTheme() { + const theme = this.assetsManager.getTheme(this.currentTheme); + if (theme) { + return theme.css.indexOf('.note-to-mp') < 0; + } + return false; + } + + setArticle(article: string) { + this.articleDiv.empty(); + let className = 'note-to-mp'; + // 兼容旧版本样式 + if (this.isOldTheme()) { + className = this.currentTheme; + } + const html = `

${article}
`; + const doc = sanitizeHTMLToDom(html); + if (doc.firstChild) { + this.articleDiv.appendChild(doc.firstChild); + } + } + + setStyle(css: string) { + this.styleEl.empty(); + this.styleEl.appendChild(document.createTextNode(css)); + } + + reloadStyle() { + this.setStyle(this.getCSS()); + } + + getArticleSection() { + return this.articleDiv.querySelector('#article-section') as HTMLElement; + } + + getArticleContent() { + const content = this.articleDiv.innerHTML; + let html = applyCSS(content, this.getCSS()); + // 处理话题多余内容 + html = html.replace(/rel="noopener nofollow"/g, ''); + html = html.replace(/target="_blank"/g, ''); + html = html.replace(/data-leaf=""/g, 'leaf=""'); + return CardDataManager.getInstance().restoreCard(html); + } + + getArticleText() { + return this.articleDiv.innerText.trimStart(); + } + + errorContent(error: any) { + return '

渲染失败!


' + + '如需帮助请前往  
https://github.com/sunbooshi/note-to-mp/issues  反馈

' + + '如果方便,请提供引发错误的完整Markdown内容。

' + + '
Obsidian版本:' + apiVersion + + '
错误信息:
' + + `${error}`; + } + + async renderMarkdown(af: TFile | null = null) { + try { + let md = ''; + if (af && af.extension.toLocaleLowerCase() === 'md') { + md = await this.app.vault.adapter.read(af.path); + this.title = af.basename; + } + else { + md = '没有可渲染的笔记或文件不支持渲染'; + } + if (md.startsWith('---')) { + md = md.replace(FRONT_MATTER_REGEX, ''); + } + + this.articleHTML = await this.markedParser.parse(md); + this.setStyle(this.getCSS()); + this.setArticle(this.articleHTML); + await this.processCachedElements(); + } + catch (e) { + console.error(e); + this.setArticle(this.errorContent(e)); + } + } + getCSS() { + try { + const theme = this.assetsManager.getTheme(this.currentTheme); + const highlight = this.assetsManager.getHighlight(this.currentHighlight); + const customCSS = this.settings.customCSSNote.length > 0 || this.settings.useCustomCss ? this.assetsManager.customCSS : ''; + const baseCSS = this.settings.baseCSS ? `.note-to-mp {${this.settings.baseCSS}}` : ''; + return `${InlineCSS}\n\n${highlight!.css}\n\n${theme!.css}\n\n${baseCSS}\n\n${customCSS}`; + } catch (error) { + console.error(error); + new Notice(`获取样式失败${this.currentTheme}|${this.currentHighlight},请检查主题是否正确安装。`); + } + return ''; + } + + updateStyle(styleName: string) { + this.currentTheme = styleName; + this.setStyle(this.getCSS()); + } + + updateHighLight(styleName: string) { + this.currentHighlight = styleName; + this.setStyle(this.getCSS()); + } + + getFrontmatterValue(frontmatter: FrontMatterCache, key: string) { + const value = frontmatter[key]; + + if (value instanceof Array) { + return value[0]; + } + + return value; + } + + getMetadata() { + let res: DraftArticle = { + title: '', + author: undefined, + digest: undefined, + content: '', + content_source_url: undefined, + cover: undefined, + thumb_media_id: '', + need_open_comment: undefined, + only_fans_can_comment: undefined, + pic_crop_235_1: undefined, + pic_crop_1_1: undefined, + appid: undefined, + theme: undefined, + highlight: undefined, + } + const file = this.app.workspace.getActiveFile(); + if (!file) return res; + const metadata = this.app.metadataCache.getFileCache(file); + if (metadata?.frontmatter) { + const keys = this.assetsManager.expertSettings.frontmatter; + const frontmatter = metadata.frontmatter; + res.title = this.getFrontmatterValue(frontmatter, keys.title); + res.author = this.getFrontmatterValue(frontmatter, keys.author); + res.digest = this.getFrontmatterValue(frontmatter, keys.digest); + res.content_source_url = this.getFrontmatterValue(frontmatter, keys.content_source_url); + res.cover = this.getFrontmatterValue(frontmatter, keys.cover); + res.thumb_media_id = this.getFrontmatterValue(frontmatter, keys.thumb_media_id); + res.need_open_comment = frontmatter[keys.need_open_comment] ? 1 : undefined; + res.only_fans_can_comment = frontmatter[keys.only_fans_can_comment] ? 1 : undefined; + res.appid = this.getFrontmatterValue(frontmatter, keys.appid); + if (res.appid && !res.appid.startsWith('wx')) { + res.appid = this.settings.wxInfo.find(wx => wx.name === res.appid)?.appid; + } + res.theme = this.getFrontmatterValue(frontmatter, keys.theme); + res.highlight = this.getFrontmatterValue(frontmatter, keys.highlight); + if (frontmatter[keys.crop]) { + res.pic_crop_235_1 = '0_0_1_0.5'; + res.pic_crop_1_1 = '0_0.525_0.404_1'; + } + } + return res; + } + + async uploadVaultCover(name: string, token: string) { + const LocalFileRegex = /^!\[\[(.*?)\]\]/; + const matches = name.match(LocalFileRegex); + let fileName = ''; + if (matches && matches.length > 1) { + fileName = matches[1]; + } + else { + fileName = name; + } + const vault = this.app.vault; + const file = this.assetsManager.searchFile(fileName) as TFile; + if (!file) { + throw new Error('找不到封面文件: ' + fileName); + } + const fileData = await vault.readBinary(file); + + return await this.uploadCover(new Blob([fileData]), file.name, token); + } + + async uploadCover(data: Blob, filename: string, token: string) { + if (filename.toLowerCase().endsWith('.webp')) { + await PrepareImageLib(); + if (IsImageLibReady()) { + data = new Blob([WebpToJPG(await data.arrayBuffer())]); + filename = filename.toLowerCase().replace('.webp', '.jpg'); + } + } + + const res = await UploadImageToWx(data, filename, token, 'image'); + if (res.media_id) { + return res.media_id; + } + console.error('upload cover fail: ' + res.errmsg); + throw new Error('上传封面失败: ' + res.errmsg); + } + + async getDefaultCover(token: string) { + const res = await wxBatchGetMaterial(token, 'image'); + if (res.item_count > 0) { + return res.item[0].media_id; + } + return ''; + } + + async getToken(appid: string) { + const secret = this.getSecret(appid); + const res = await wxGetToken(this.settings.authKey, appid, secret); + if (res.status != 200) { + const data = res.json; + throw new Error('获取token失败: ' + data.message); + } + const token = res.json.token; + if (token === '') { + throw new Error('获取token失败: ' + res.json.message); + } + return token; + } + + async uploadImages(appid: string) { + if (!this.settings.authKey) { + throw new Error('请先设置注册码(AuthKey)'); + } + + let metadata = this.getMetadata(); + if (metadata.appid) { + appid = metadata.appid; + } + + if (!appid || appid.length == 0) { + throw new Error('请先选择公众号'); + } + + // 获取token + const token = await this.getToken(appid); + if (token === '') { + return; + } + + await this.cachedElementsToImages(); + + const lm = LocalImageManager.getInstance(); + // 上传图片 + await lm.uploadLocalImage(token, this.app.vault); + // 上传图床图片 + await lm.uploadRemoteImage(this.articleDiv, token); + // 替换图片链接 + lm.replaceImages(this.articleDiv); + + await this.copyArticle(); + } + + async copyArticle() { + const content = this.getArticleContent(); + await navigator.clipboard.write([new ClipboardItem({ + 'text/html': new Blob([content], { type: 'text/html' }) + })]) + } + + getSecret(appid: string) { + for (const wx of this.settings.wxInfo) { + if (wx.appid === appid) { + return wx.secret.replace('SECRET', ''); + } + } + return ''; + } + + async postArticle(appid:string, localCover: File | null = null) { + if (!this.settings.authKey) { + throw new Error('请先设置注册码(AuthKey)'); + } + + let metadata = this.getMetadata(); + if (metadata.appid) { + appid = metadata.appid; + } + + if (!appid || appid.length == 0) { + throw new Error('请先选择公众号'); + } + // 获取token + const token = await this.getToken(appid); + if (token === '') { + throw new Error('获取token失败,请检查网络链接!'); + } + await this.cachedElementsToImages(); + const lm = LocalImageManager.getInstance(); + // 上传图片 + await lm.uploadLocalImage(token, this.app.vault); + // 上传图床图片 + await lm.uploadRemoteImage(this.articleDiv, token); + // 替换图片链接 + lm.replaceImages(this.articleDiv); + // 上传封面 + let mediaId = metadata.thumb_media_id; + if (!mediaId) { + if (metadata.cover) { + // 上传仓库里的图片 + if (metadata.cover.startsWith('http')) { + const res = await LocalImageManager.getInstance().uploadImageFromUrl(metadata.cover, token, 'image'); + if (res.media_id) { + mediaId = res.media_id; + } + else { + throw new Error('上传封面失败:' + res.errmsg); + } + } + else { + mediaId = await this.uploadVaultCover(metadata.cover, token); + } + } + else if (localCover) { + mediaId = await this.uploadCover(localCover, localCover.name, token); + } + else { + mediaId = await this.getDefaultCover(token); + } + } + + if (mediaId === '') { + throw new Error('请先上传图片或者设置默认封面'); + } + + metadata.title = metadata.title || this.title; + metadata.content = this.getArticleContent(); + metadata.thumb_media_id = mediaId; + + // 创建草稿 + const res = await wxAddDraft(token, metadata); + + if (res.status != 200) { + console.error(res.text); + throw new Error(`创建草稿失败, https状态码: ${res.status} 可能是文章包含异常内容,请尝试手动复制到公众号编辑器!`); + } + + const draft = res.json; + if (draft.media_id) { + return draft.media_id; + } + else { + console.error(JSON.stringify(draft)); + throw new Error('发布失败!' + draft.errmsg); + } + } + + async postImages(appid: string) { + if (!this.settings.authKey) { + throw new Error('请先设置注册码(AuthKey)'); + } + + let metadata = this.getMetadata(); + if (metadata.appid) { + appid = metadata.appid; + } + + if (!appid || appid.length == 0) { + throw new Error('请先选择公众号'); + } + + // 获取token + const token = await this.getToken(appid); + if (token === '') { + throw new Error('获取token失败,请检查网络链接!'); + } + + const imageList: DraftImageMediaId[] = []; + const lm = LocalImageManager.getInstance(); + // 上传图片 + await lm.uploadLocalImage(token, this.app.vault, 'image'); + // 上传图床图片 + await lm.uploadRemoteImage(this.articleDiv, token, 'image'); + + const images = lm.getImageInfos(this.articleDiv); + for (const image of images) { + if (!image.media_id) { + console.warn('miss media id:', image.resUrl); + continue; + } + imageList.push({ + image_media_id: image.media_id, + }); + } + + if (imageList.length === 0) { + throw new Error('没有图片需要发布!'); + } + + const content = this.getArticleText(); + + const imagesData: DraftImages = { + article_type: 'newspic', + title: metadata.title || this.title, + content: content, + need_open_commnet: metadata.need_open_comment || 0, + only_fans_can_comment: metadata.only_fans_can_comment || 0, + image_info: { + image_list: imageList, + } + } + // 创建草稿 + const res = await wxAddDraftImages(token, imagesData); + + if (res.status != 200) { + console.error(res.text); + throw new Error(`创建图片/文字失败, https状态码: ${res.status} ${res.text}!`); + } + + const draft = res.json; + if (draft.media_id) { + return draft.media_id; + } + else { + console.error(JSON.stringify(draft)); + throw new Error('发布失败!' + draft.errmsg); + } + } + + async exportHTML() { + await this.cachedElementsToImages(); + const lm = LocalImageManager.getInstance(); + const content = await lm.embleImages(this.articleDiv, this.app.vault); + const globalStyle = await this.assetsManager.getStyle(); + const html = applyCSS(content, this.getCSS() + globalStyle); + const blob = new Blob([html], { type: 'text/html' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = this.title + '.html'; + a.click(); + URL.revokeObjectURL(url); + a.remove(); + } + + async processCachedElements() { + const af = this.app.workspace.getActiveFile(); + if (!af) { + console.error('当前没有打开文件,无法处理缓存元素'); + return; + } + for (const [key, value] of this.cachedElements) { + const [category, id] = key.split(':'); + if (category === 'mermaid' || category === 'excalidraw') { + const container = this.articleDiv.querySelector('#' + id) as HTMLElement; + if (container) { + await MarkdownRenderer.render(this.app, value, container, af.path, this.itemView); + } + } + } + } + + async cachedElementsToImages() { + for (const [key, cached] of this.cachedElements) { + const [category, elementId] = key.split(':'); + const container = this.articleDiv.querySelector(`#${elementId}`) as HTMLElement; + if (!container) continue; + + if (category === 'mermaid') { + await this.replaceMermaidWithImage(container, elementId); + } else if (category === 'excalidraw') { + await this.replaceExcalidrawWithImage(container, elementId); + } + } + } + + private async replaceMermaidWithImage(container: HTMLElement, id: string) { + const mermaidContainer = container.querySelector('.mermaid') as HTMLElement; + if (!mermaidContainer || !mermaidContainer.children.length) return; + + const svg = mermaidContainer.querySelector('svg'); + if (!svg) return; + + try { + const pngDataUrl = await toPng(mermaidContainer.firstElementChild as HTMLElement, { pixelRatio: 2 }); + const img = document.createElement('img'); + img.id = `img-${id}`; + img.src = pngDataUrl; + img.style.width = `${svg.clientWidth}px`; + img.style.height = 'auto'; + + container.replaceChild(img, mermaidContainer); + } catch (error) { + console.warn(`Failed to render Mermaid diagram: ${id}`, error); + } + } + + private async replaceExcalidrawWithImage(container: HTMLElement, id: string) { + const innerDiv = container.querySelector('div') as HTMLElement; + if (!innerDiv) return; + + if (NMPSettings.getInstance().excalidrawToPNG) { + const originalImg = container.querySelector('img') as HTMLImageElement; + if (!originalImg) return; + + const style = originalImg.getAttribute('style') || ''; + try { + const pngDataUrl = await toPng(originalImg, { pixelRatio: 2 }); + + const img = document.createElement('img'); + img.id = `img-${id}`; + img.src = pngDataUrl; + img.setAttribute('style', style); + + container.replaceChild(img, container.firstChild!); + } catch (error) { + console.warn(`Failed to render Excalidraw image: ${id}`, error); + } + } else { + const svg = await LocalFile.renderExcalidraw(innerDiv.innerHTML); + this.updateElementByID(id, svg); + } + } + + updateElementByID(id: string, html: string): void { + const item = this.articleDiv.querySelector('#' + id) as HTMLElement; + if (!item) return; + const doc = sanitizeHTMLToDom(html); + item.empty(); + if (doc.childElementCount > 0) { + for (const child of doc.children) { + item.appendChild(child.cloneNode(true)); // 使用 cloneNode 复制节点以避免移动它 + } + } + else { + item.innerText = '渲染失败'; + } + } + + cacheElement(category: string, id: string, data: string): void { + const key = category + ':' + id; + this.cachedElements.set(key, data); + } +} \ No newline at end of file diff --git a/src/assets.ts b/src/assets.ts new file mode 100644 index 0000000..521a8f1 --- /dev/null +++ b/src/assets.ts @@ -0,0 +1,461 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { App, PluginManifest, Notice, requestUrl, FileSystemAdapter, TAbstractFile, TFile, TFolder } from "obsidian"; +import * as zip from "@zip.js/zip.js"; +import DefaultTheme from "./default-theme"; +import DefaultHighlight from "./default-highlight"; +import { NMPSettings } from "./settings"; +import { ExpertSettings, defaultExpertSettings, expertSettingsFromString } from "./expert-settings"; + + +export interface Theme { + name: string + className: string + desc: string + author: string + css: string +} + +export interface Highlight { + name: string + url: string + css: string +} + +export default class AssetsManager { + app: App; + defaultTheme: Theme = DefaultTheme; + manifest: PluginManifest; + themes: Theme[]; + highlights: Highlight[]; + assetsPath: string; + themesPath: string; + hilightPath: string; + customCSS: string = ''; + themeCfg: string; + hilightCfg: string; + customCSSPath: string; + iconsPath: string; + wasmPath: string; + expertSettings: ExpertSettings; + isLoaded: boolean = false; + + private static instance: AssetsManager; + + // 静态方法,用于获取实例 + public static getInstance(): AssetsManager { + if (!AssetsManager.instance) { + AssetsManager.instance = new AssetsManager(); + } + return AssetsManager.instance; + } + + public static setup(app: App, manifest: PluginManifest) { + AssetsManager.getInstance()._setup(app, manifest); + } + + private _setup(app: App, manifest: PluginManifest) { + this.app = app; + this.manifest = manifest; + this.assetsPath = this.app.vault.configDir + '/plugins/' + this.manifest.id + '/assets/'; + this.themesPath = this.assetsPath + 'themes/'; + this.hilightPath = this.assetsPath + 'highlights/'; + this.themeCfg = this.assetsPath + 'themes.json'; + this.hilightCfg = this.assetsPath + 'highlights.json'; + this.customCSSPath = this.assetsPath + 'custom.css'; + this.iconsPath = this.assetsPath + 'icons/'; + this.wasmPath = this.assetsPath + 'lib.wasm'; + } + + private constructor() { + + } + + async loadAssets() { + await this.loadThemes(); + await this.loadHighlights(); + await this.loadCustomCSS(); + await this.loadExpertSettings(); + this.isLoaded = true; + } + + async loadThemes() { + try { + if (!await this.app.vault.adapter.exists(this.themeCfg)) { + new Notice('主题资源未下载,请前往设置下载!'); + this.themes = [this.defaultTheme]; + return; + } + const data = await this.app.vault.adapter.read(this.themeCfg); + if (data) { + const themes = JSON.parse(data); + await this.loadCSS(themes); + this.themes = [this.defaultTheme, ... themes]; + } + } catch (error) { + console.error(error); + new Notice('themes.json解析失败!'); + } + } + + async loadCSS(themes: Theme[]) { + try { + for (const theme of themes) { + const cssFile = this.themesPath + theme.className + '.css'; + const cssContent = await this.app.vault.adapter.read(cssFile); + if (cssContent) { + theme.css = cssContent; + } + } + } catch (error) { + console.error(error); + new Notice('读取CSS失败!'); + } + } + + async loadCustomCSS() { + try { + const customCSSNote = NMPSettings.getInstance().customCSSNote; + if (customCSSNote != '') { + const file = this.searchFile(customCSSNote); + if (file) { + const cssContent = await this.app.vault.adapter.read(file.path); + if (cssContent) { + this.customCSS = cssContent.replace(/```css/gi, '').replace(/```/g, ''); + } + } + else { + new Notice(customCSSNote + '自定义CSS文件不存在!'); + } + return; + } + + if (!await this.app.vault.adapter.exists(this.customCSSPath)) { + return; + } + + const cssContent = await this.app.vault.adapter.read(this.customCSSPath); + if (cssContent) { + this.customCSS = cssContent; + } + } catch (error) { + console.error(error); + new Notice('读取CSS失败!'); + } + } + + async loadExpertSettings() { + try { + const note = NMPSettings.getInstance().expertSettingsNote; + if (note != '') { + const file = this.searchFile(note); + if (file) { + let content = await this.app.vault.adapter.read(file.path); + if (content) { + this.expertSettings = expertSettingsFromString(content); + } + else { + this.expertSettings = defaultExpertSettings; + new Notice(note + '专家设置文件内容为空!'); + } + } + else { + this.expertSettings = defaultExpertSettings; + new Notice(note + '专家设置不存在!'); + } + } + else { + this.expertSettings = defaultExpertSettings; + } + } catch (error) { + console.error(error); + new Notice('读取专家设置失败!'); + } + } + + async loadHighlights() { + try { + const defaultHighlight = {name: '默认', url: '', css: DefaultHighlight}; + this.highlights = [defaultHighlight]; + if (!await this.app.vault.adapter.exists(this.hilightCfg)) { + new Notice('高亮资源未下载,请前往设置下载!'); + return; + } + + const data = await this.app.vault.adapter.read(this.hilightCfg); + if (data) { + const items = JSON.parse(data); + for (const item of items) { + const cssFile = this.hilightPath + item.name + '.css'; + const cssContent = await this.app.vault.adapter.read(cssFile); + this.highlights.push({name: item.name, url: item.url, css: cssContent}); + } + } + } + catch (error) { + console.error(error); + new Notice('highlights.json解析失败!'); + } + } + + async loadIcon(name: string) { + const icon = this.iconsPath + name + '.svg'; + if (!await this.app.vault.adapter.exists(icon)) { + return ''; + } + const iconContent = await this.app.vault.adapter.read(icon); + if (iconContent) { + return iconContent; + } + return ''; + } + + async loadWasm() { + if (!await this.app.vault.adapter.exists(this.wasmPath)) { + return null; + } + const wasmContent = await this.app.vault.adapter.readBinary(this.wasmPath); + if (wasmContent) { + return wasmContent; + } + return null; + } + + getTheme(themeName: string) { + if (themeName === '') { + return this.themes[0]; + } + + for (const theme of this.themes) { + if (theme.name.toLowerCase() === themeName.toLowerCase() || theme.className.toLowerCase() === themeName.toLowerCase()) { + return theme; + } + } + } + + getHighlight(highlightName: string) { + if (highlightName === '') { + return this.highlights[0]; + } + + for (const highlight of this.highlights) { + if (highlight.name.toLowerCase() === highlightName.toLowerCase()) { + return highlight; + } + } + } + + getThemeURL() { + const version = this.manifest.version; + return `https://github.com/sunbooshi/note-to-mp/releases/download/${version}/assets.zip`; + } + + async getStyle() { + const file = this.app.vault.configDir + '/plugins/' + this.manifest.id + '/styles.css'; + if (!await this.app.vault.adapter.exists(file)) { + return ''; + } + const data = await this.app.vault.adapter.read(file); + if (data) { + return data; + } + return ''; + } + + async downloadThemes() { + try { + if (await this.app.vault.adapter.exists(this.themeCfg)) { + new Notice('主题资源已存在!') + return; + } + const res = await requestUrl(this.getThemeURL()); + const data = res.arrayBuffer; + await this.unzip(new Blob([data])); + await this.loadAssets(); + new Notice('主题下载完成!'); + } catch (error) { + console.error(error); + await this.removeThemes(); + new Notice('主题下载失败, 请检查网络!'); + } + } + + async unzip(data:Blob) { + const zipFileReader = new zip.BlobReader(data); + const zipReader = new zip.ZipReader(zipFileReader); + const entries = await zipReader.getEntries(); + + if (!await this.app.vault.adapter.exists(this.assetsPath)) { + await this.app.vault.adapter.mkdir(this.assetsPath); + } + + for (const entry of entries) { + if (entry.directory) { + const dirPath = this.assetsPath + entry.filename; + await this.app.vault.adapter.mkdir(dirPath); + } + else { + const filePath = this.assetsPath + entry.filename; + const blobWriter = new zip.Uint8ArrayWriter(); + if (entry.getData) { + const data = await entry.getData(blobWriter); + await this.app.vault.adapter.writeBinary(filePath, data.buffer as ArrayBuffer); + } + } + } + + await zipReader.close(); + } + + async removeThemes() { + try { + const adapter = this.app.vault.adapter; + if (await adapter.exists(this.themeCfg)) { + await adapter.remove(this.themeCfg); + } + if (await adapter.exists(this.hilightCfg)) { + await adapter.remove(this.hilightCfg); + } + if (await adapter.exists(this.themesPath)) { + await adapter.rmdir(this.themesPath, true); + } + if (await adapter.exists(this.hilightPath)) { + await adapter.rmdir(this.hilightPath, true); + } + await this.loadAssets(); + new Notice('清空完成!'); + } catch (error) { + console.error(error); + new Notice('清空主题失败!'); + } + } + + async openAssets() { + const path = require('path'); + const adapter = this.app.vault.adapter as FileSystemAdapter; + const vaultRoot = adapter.getBasePath(); + const assets = this.assetsPath; + if (!await adapter.exists(assets)) { + await adapter.mkdir(assets); + } + const dst = path.join(vaultRoot, assets); + const { shell } = require('electron'); + shell.openPath(dst); + } + + searchFile(nameOrPath: string): TAbstractFile | null { + const resolvedPath = this.resolvePath(nameOrPath); + const vault= this.app.vault; + const attachmentFolderPath = vault.config.attachmentFolderPath || ''; + let localPath = resolvedPath; + let file = null; + + // 先按路径查找 + file = vault.getFileByPath(resolvedPath); + if (file) { + return file; + } + + // 在根目录查找 + file = vault.getFileByPath(nameOrPath); + if (file) { + return file; + } + + // 从附件文件夹查找 + if (attachmentFolderPath != '') { + localPath = attachmentFolderPath + '/' + nameOrPath; + file = vault.getFileByPath(localPath) + if (file) { + return file; + } + + localPath = attachmentFolderPath + '/' + resolvedPath; + file = vault.getFileByPath(localPath) + if (file) { + return file; + } + } + + // 最后查找所有文件,这里只需要判断文件名 + const files = vault.getAllLoadedFiles(); + for (let f of files) { + if (f instanceof TFolder) continue + file = f as TFile; + if (file.basename === nameOrPath || file.name === nameOrPath) { + return f; + } + } + + return null; + } + + getResourcePath(path: string): {resUrl:string, filePath:string}|null { + const file = this.searchFile(path) as TFile; + if (file == null) { + return null; + } + const resUrl = this.app.vault.getResourcePath(file); + return {resUrl, filePath: file.path}; + } + + resolvePath(relativePath: string): string { + const basePath = this.getActiveFileDir(); + if (!relativePath.includes('/')) { + return relativePath; + } + const stack = basePath.split("/"); + const parts = relativePath.split("/"); + + stack.pop(); // Remove the current file name (or empty string) + + for (const part of parts) { + if (part === ".") continue; + if (part === "..") stack.pop(); + else stack.push(part); + } + return stack.join("/"); + } + + getActiveFileDir() { + const af = this.app.workspace.getActiveFile(); + if (af == null) { + return ''; + } + const parts = af.path.split('/'); + parts.pop(); + if (parts.length == 0) { + return ''; + } + return parts.join('/'); + } + + async readFileBinary(path: string) { + const vault= this.app.vault; + const file = this.searchFile(path) as TFile; + if (file == null) { + return null; + } + return await vault.readBinary(file); + } +} \ No newline at end of file diff --git a/src/default-highlight.ts b/src/default-highlight.ts new file mode 100644 index 0000000..9d1719b --- /dev/null +++ b/src/default-highlight.ts @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +export default ` +pre code.hljs { + display: block; +} +/* + +XCode style (c) Angel Garcia + +*/ +.hljs { + background: #fff; + color: black +} +/* Gray DOCTYPE selectors like WebKit */ +.xml .hljs-meta { + color: #c0c0c0 +} +.hljs-comment, +.hljs-quote { + color: #007400 +} +.hljs-tag, +.hljs-attribute, +.hljs-keyword, +.hljs-selector-tag, +.hljs-literal, +.hljs-name { + color: #aa0d91 +} +.hljs-variable, +.hljs-template-variable { + color: #3F6E74 +} +.hljs-code, +.hljs-string, +.hljs-meta .hljs-string { + color: #c41a16 +} +.hljs-regexp, +.hljs-link { + color: #0E0EFF +} +.hljs-title, +.hljs-symbol, +.hljs-bullet, +.hljs-number { + color: #1c00cf +} +.hljs-section, +.hljs-meta { + color: #643820 +} +.hljs-title.class_, +.hljs-class .hljs-title, +.hljs-type, +.hljs-built_in, +.hljs-params { + color: #5c2699 +} +.hljs-attr { + color: #836C28 +} +.hljs-subst { + color: #000 +} +.hljs-formula { + background-color: #eee; + font-style: italic +} +.hljs-addition { + background-color: #baeeba +} +.hljs-deletion { + background-color: #ffc8bd +} +.hljs-selector-id, +.hljs-selector-class { + color: #9b703f +} +.hljs-doctag, +.hljs-strong { + font-weight: bold +} +.hljs-emphasis { + font-style: italic +} +`; \ No newline at end of file diff --git a/src/default-theme.ts b/src/default-theme.ts new file mode 100644 index 0000000..2bed06d --- /dev/null +++ b/src/default-theme.ts @@ -0,0 +1,349 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +const css = ` +/* =========================================================== */ +/* Obsidian的默认样式 */ +/* =========================================================== */ +.note-to-mp { + padding: 0; + user-select: text; + -webkit-user-select: text; + color: #222222; + font-size: 16px; +} + +.note-to-mp:last-child { + margin-bottom: 0; +} + +.note-to-mp .fancybox-img { + border: none; +} + +.note-to-mp .fancybox-img:hover { + opacity: none; + border: none; +} + +/* +================================= +Heading +================================== +*/ +.note-to-mp h1 { + color: #222; + font-weight: 700; + font-size: 1.802em; + line-height: 1.2; + margin-block-start: 1em; + margin-block-end: 0; +} + +.note-to-mp h2 { + color: #222; + font-weight: 600; + font-size: 1.602em; + line-height: 1.2; + margin-block-start: 1em; + margin-block-end: 0; +} + +.note-to-mp h3 { + color: #222; + font-weight: 600; + font-size: 1.424em; + line-height: 1.3; + margin-block-start: 1em; + margin-block-end: 0; +} + +.note-to-mp h4 { + color: #222; + font-weight: 600; + font-size: 1.266em; + line-height: 1.4; + margin-block-start: 1em; + margin-block-end: 0; +} + +.note-to-mp h5 { + color: #222; + margin-block-start: 1em; + margin-block-end: 0; +} + +.note-to-mp h6 { + color: #222; + margin-block-start: 1em; + margin-block-end: 0; +} + +/* +================================= +Horizontal Rules +================================== + */ +.note-to-mp hr { + border-color: #e0e0e0; + margin-top: 3em; + margin-bottom: 3em; +} + +/* +================================= +Paragraphs +================================== + */ +.note-to-mp p { + line-height: 1.6em; + margin: 1em 0; +} + +/* +================================= +Emphasis +================================== + */ +.note-to-mp strong { + color: #222222; + font-weight: 600; +} + +.note-to-mp em { + color: inherit; + font-style: italic; +} + +.note-to-mp s { + color: inherit; +} + +/* +================================= + Blockquotes +================================== + */ +.note-to-mp blockquote { + font-size: 1rem; + display: block; + margin: 2em 0; + padding: 0em 0.8em 0em 0.8em; + position: relative; + color: inherit; + border-left: 0.15rem solid #7852ee; +} + +.note-to-mp blockquote blockquote { + margin: 0 0; +} + +.note-to-mp blockquote p { + margin: 0; +} + +.note-to-mp blockquote footer strong { + margin-right: 0.5em; +} + +/* +================================= +List +================================== +*/ +.note-to-mp ul { + margin: 0; + margin-top: 1.25em; + margin-bottom: 1.25em; + line-height: 1.6em; +} + +.note-to-mp ul>li::marker { + color: #ababab; + /* font-size: 1.5em; */ +} + +.note-to-mp li>p { + margin: 0; +} + +.note-to-mp ol { + margin: 0; + padding: 0; + margin-top: 1.25em; + margin-bottom: 0em; + list-style-type: decimal; + line-height: 1.6em; +} + +.note-to-mp ol>li { + position: relative; + padding-left: 0.1em; + margin-left: 2em; +} + +/* +================================= +Link +================================== +*/ +.note-to-mp a { + color: #7852ee; + text-decoration: none; + font-weight: 500; + text-decoration: none; + border-bottom: 1px solid #7852ee; + transition: border 0.3s ease-in-out; +} + +.note-to-mp a:hover { + color: #7952eebb; + border-bottom: 1px solid #7952eebb; +} + +/* +================================= +Table +================================== +*/ +.note-to-mp table { + width: 100%; + table-layout: auto; + text-align: left; + margin-top: 2em; + margin-bottom: 2em; + font-size: 0.875em; + line-height: 1.7142857; + border-collapse: collapse; + border-color: inherit; + text-indent: 0; +} + +.note-to-mp table thead { + color: #000; + font-weight: 600; + border: #e0e0e0 1px solid; +} + +.note-to-mp table thead th { + vertical-align: bottom; + padding-right: 0.5714286em; + padding-bottom: 0.5714286em; + padding-left: 0.5714286em; + border: #e0e0e0 1px solid; +} + +.note-to-mp table thead th:first-child { + padding-left: 0.5em; +} + +.note-to-mp table thead th:last-child { + padding-right: 0.5em; +} + +.note-to-mp table tbody tr { + border-style: solid; + border: #e0e0e0 1px solid; +} + +.note-to-mp table tbody tr:last-child { + border-bottom-width: 0; +} + +.note-to-mp table tbody td { + vertical-align: top; + padding-top: 0.5714286em; + padding-right: 0.5714286em; + padding-bottom: 0.5714286em; + padding-left: 0.5714286em; + border: #e0e0e0 1px solid; +} + +.note-to-mp table tbody td:first-child { + padding-left: 0; +} + +.note-to-mp table tbody td:last-child { + padding-right: 0; +} + +/* +================================= +Images +================================== +*/ +.note-to-mp img { + margin: 2em auto; +} + +.note-to-mp .footnotes hr { + margin-top: 4em; + margin-bottom: 0.5em; +} + +/* +================================= +Code +================================== +*/ +.note-to-mp .code-section { + display: flex; + border: rgb(240, 240, 240) 1px solid; + line-height: 26px; + font-size: 14px; + margin: 1em 0; + padding: 0.875em; + box-sizing: border-box; +} + +.note-to-mp .code-section ul { + width: fit-content; + margin-block-start: 0; + margin-block-end: 0; + flex-shrink: 0; + height: 100%; + padding: 0; + line-height: 26px; + list-style-type: none; + backgroud: transparent !important; +} + +.note-to-mp .code-section ul>li { + text-align: right; +} + +.note-to-mp .code-section pre { + margin-block-start: 0; + margin-block-end: 0; + white-space: normal; + overflow: auto; + padding: 0 0 0 0.875em; +} + +.note-to-mp .code-section code { + display: flex; + text-wrap: nowrap; + font-family: Consolas,Courier,monospace; +} +` + +export default {name: '默认', className: 'obsidian-light', desc: '默认主题', author: 'SunBooshi', css:css}; \ No newline at end of file diff --git a/src/doc-modal.ts b/src/doc-modal.ts new file mode 100644 index 0000000..253ce7c --- /dev/null +++ b/src/doc-modal.ts @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { App, Modal, sanitizeHTMLToDom } from "obsidian"; + +export class DocModal extends Modal { + url: string = ''; + title: string = '提示'; + content: string = ''; + + constructor(app: App, title: string = "提示", content: string = "", url: string = "") { + super(app); + this.title = title; + this.content = content; + this.url = url; + } + + onOpen() { + let { contentEl, modalEl } = this; + modalEl.style.width = '640px'; + modalEl.style.height = '720px'; + contentEl.style.display = 'flex'; + contentEl.style.flexDirection = 'column'; + + const titleEl = contentEl.createEl('h2', { text: this.title }); + titleEl.style.marginTop = '0.5em'; + const content = contentEl.createEl('div'); + content.setAttr('style', 'margin-bottom:1em;-webkit-user-select: text; user-select: text;'); + content.appendChild(sanitizeHTMLToDom(this.content)); + + const iframe = contentEl.createEl('iframe', { + attr: { + src: this.url, + width: '100%', + allow: 'clipboard-read; clipboard-write', + }, + }); + + iframe.style.flex = '1'; + } + + onClose() { + + let { contentEl } = this; + contentEl.empty(); + } +} \ No newline at end of file diff --git a/src/expert-settings.ts b/src/expert-settings.ts new file mode 100644 index 0000000..eec4549 --- /dev/null +++ b/src/expert-settings.ts @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { parseYaml } from "obsidian"; + +export interface ExpertSettings { + render?: { + h1?: string | number | object; + h2?: string | number | object; + h3?: string | number | object; + code?: number; + callout?: object | undefined; + }, + frontmatter: { + title: string; + author: string; + digest: string; + content_source_url: string; + cover: string; + thumb_media_id: string + need_open_comment: string; + only_fans_can_comment: string; + appid: string; + theme: string; + highlight: string; + crop: string; + } +} + +export const defaultExpertSettings: ExpertSettings = { + render: undefined, + frontmatter: { + title: '标题', + author: '作者', + digest: '摘要', + content_source_url: '原文地址', + cover: '封面', + thumb_media_id: '封面素材ID', + need_open_comment: '打开评论', + only_fans_can_comment: '仅粉丝可评论', + appid: '公众号', + theme: '样式', + highlight: '代码高亮', + crop: '封面裁剪', + } +}; + +export function expertSettingsFromString(content: string): ExpertSettings { + content = content.replace(/```yaml/gi, '').replace(/```/g, ''); + let parsed = parseYaml(content) as Partial; + if (!parsed || typeof parsed !== 'object') { + parsed = {}; + } + return { + render: parsed.render, + frontmatter: { + ...defaultExpertSettings.frontmatter, + ...(parsed.frontmatter || {}) + } + }; +} diff --git a/src/gallery/index.ts b/src/gallery/index.ts new file mode 100644 index 0000000..c781eb3 --- /dev/null +++ b/src/gallery/index.ts @@ -0,0 +1,47 @@ +// [note-to-mp 重构] Gallery 模块 +import { App } from 'obsidian'; + +export interface GalleryTransformResult { + content: string; + replaced: boolean; +} + +// 单行 self-closing 形式: {{}}{{}} +const GALLERY_INLINE_RE = /{{}}\s*{{}}/g; +// 块级形式 +const GALLERY_BLOCK_RE = /{{}}([\s\S]*?){{<\/gallery>}}/g; +const FIGURE_RE = /{{]*>}}/g; + +export function transformGalleryShortcodes(raw: string): GalleryTransformResult { + let replaced = false; + // 处理块级 + raw = raw.replace(GALLERY_BLOCK_RE, (_m, inner) => { + const imgs: string[] = []; + let fm: RegExpExecArray | null; + while ((fm = FIGURE_RE.exec(inner)) !== null) { + const src = fm[1]; + const base = src.split(/[?#]/)[0].split('/').pop(); + if (base) imgs.push(`![[${base}]]`); + } + if (imgs.length === 0) return _m; // 保留原文本 + replaced = true; + return imgs.join('\n') + '\n'; + }); + + // 处理单行自闭合形式 + raw = raw.replace(GALLERY_INLINE_RE, (_m, dir, figcaption) => { + replaced = true; + const comment = figcaption ? `\n` : ''; + // 暂不实际列目录;由后续 selectGalleryImages 扩展 + return comment + ``; + }); + + return { content: raw, replaced }; +} + +// 占位:真实实现可遍历 vault 目录 +export async function selectGalleryImages(app: App, dir: string, options?: { limit?: number }): Promise { + // TODO: 遍历 app.vault.getAbstractFileByPath(dir) + // 返回文件名数组(不含路径) + return []; +} diff --git a/src/image/index.ts b/src/image/index.ts new file mode 100644 index 0000000..aedf3c9 --- /dev/null +++ b/src/image/index.ts @@ -0,0 +1,64 @@ +// [note-to-mp 重构] 图片处理模块 +// 负责统一解析 wikilink 与 markdown 图片,并提供集中管理 + +export interface LocalImage { + original: string; // 原始匹配串(包括语法标记) + basename: string; // 文件基本名(不含路径) + alt?: string; // alt 描述(若来自 markdown 语法) + sourceType: 'wikilink' | 'markdown'; + index: number; // 在原文中的出现顺序 +} + +export const LocalFileRegex = /^(?:!\[\[(.*?)\]\]|!\[[^\]]*\]\(([^\n\r\)]+)\))/; + +export class LocalImageManager { + private images: LocalImage[] = []; + private byBasename: Map = new Map(); + + add(image: LocalImage) { + this.images.push(image); + const list = this.byBasename.get(image.basename) || []; + list.push(image); + this.byBasename.set(image.basename, list); + } + + all(): LocalImage[] { return this.images.slice(); } + + first(): LocalImage | undefined { return this.images[0]; } + + findByBasename(name: string): LocalImage | undefined { + const list = this.byBasename.get(name); + return list && list[0]; + } + + clear() { this.images = []; this.byBasename.clear(); } +} + +export function parseImagesFromMarkdown(markdown: string): LocalImage[] { + // 扫描整篇,统一抽取,不做替换 + const result: LocalImage[] = []; + const wikilinkRe = /!\[\[(.+?)\]\]/g; // 非贪婪 + const mdImgRe = /!\[([^\]]*)\]\(([^\n\r\)]+)\)/g; + let index = 0; + + let m: RegExpExecArray | null; + while ((m = wikilinkRe.exec(markdown)) !== null) { + const full = m[0]; + const inner = m[1].trim(); + const basename = inner.split('/').pop() || inner; + result.push({ original: full, basename, sourceType: 'wikilink', index: index++ }); + } + while ((m = mdImgRe.exec(markdown)) !== null) { + const full = m[0]; + const alt = m[1].trim(); + const link = m[2].trim(); + const basename = link.split(/[?#]/)[0].split('/').pop() || link; + result.push({ original: full, basename, alt, sourceType: 'markdown', index: index++ }); + } + + // 按出现顺序(两个正则独立扫描会破坏顺序,重新排序 by 原始位置) + result.sort((a, b) => markdown.indexOf(a.original) - markdown.indexOf(b.original)); + // 重排 index + result.forEach((r, i) => r.index = i); + return result; +} diff --git a/src/imagelib.ts b/src/imagelib.ts new file mode 100644 index 0000000..892432a --- /dev/null +++ b/src/imagelib.ts @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { getBlobArrayBuffer } from "obsidian"; +import { wxUploadImage } from "./weixin-api"; +import { NMPSettings } from "./settings"; +import { IsWasmReady, LoadWasm } from "./wasm/wasm"; +import AssetsManager from "./assets"; + +declare function GoWebpToJPG(data: Uint8Array): Uint8Array; +declare function GoWebpToPNG(data: Uint8Array): Uint8Array; +declare function GoAddWatermark(img: Uint8Array, watermark: Uint8Array): Uint8Array; + +export function IsImageLibReady() { + return IsWasmReady(); +} + +export async function PrepareImageLib() { + await LoadWasm(); +} + +export function WebpToJPG(data: ArrayBuffer): ArrayBuffer { + return GoWebpToJPG(new Uint8Array(data)); +} + +export function WebpToPNG(data: ArrayBuffer): ArrayBuffer { + return GoWebpToPNG(new Uint8Array(data)); +} + +export function AddWatermark(img: ArrayBuffer, watermark: ArrayBuffer): ArrayBuffer { + return GoAddWatermark(new Uint8Array(img), new Uint8Array(watermark)); +} + +export async function UploadImageToWx(data: Blob, filename: string, token: string, type?: string) { + if (!IsImageLibReady()) { + await PrepareImageLib(); + } + + const watermark = NMPSettings.getInstance().watermark; + if (watermark != null && watermark != '') { + const watermarkData = await AssetsManager.getInstance().readFileBinary(watermark); + if (watermarkData == null) { + throw new Error('水印图片不存在: ' + watermark); + } + const watermarkImg = AddWatermark(await data.arrayBuffer(), watermarkData); + data = new Blob([watermarkImg], { type: data.type }); + } + return await wxUploadImage(data, filename, token, type); +} \ No newline at end of file diff --git a/src/inline-css.ts b/src/inline-css.ts new file mode 100644 index 0000000..21a7541 --- /dev/null +++ b/src/inline-css.ts @@ -0,0 +1,207 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +// 需要渲染进inline style的css样式 +export default ` +/* --------------------------------------- */ +/* callout */ +/* --------------------------------------- */ +section .note-callout { + border: none; + padding: 1em 1em 1em 1.5em; + display: flex; + flex-direction: column; + margin: 1em 0; + border-radius: 4px; +} + +section .note-callout-title-wrap { + display: flex; + flex-direction: row; + align-items: center; + font-size: 1em; + font-weight: 600; +} + +.note-callout-icon { + display: inline-block; + width: 18px; + height: 18px; +} + +.note-callout-icon svg { + width: 100%; + height: 100%; +} + +section .note-callout-title { + margin-left: 0.25em; +} + +section .note-callout-content { + color: rgb(34,34,34); +} + +/* note info todo */ +section .note-callout-note { + color: rgb(8, 109, 221); + background-color: rgba(8, 109, 221, 0.1); +} +/* abstract tip hint */ +section .note-callout-abstract { + color: rgb(0, 191, 188); + background-color: rgba(0, 191, 188, 0.1); +} +section .note-callout-success { + color: rgb(8, 185, 78); + background-color: rgba(8, 185, 78, 0.1); +} +/* question help, faq, warning, caution, attention */ +section .note-callout-question { + color: rgb(236, 117, 0); + background-color: rgba(236, 117, 0, 0.1); +} +/* failure, fail, missing, danger, error, bug */ +section .note-callout-failure { + color: rgb(233, 49, 71); + background-color: rgba(233, 49, 71, 0.1); +} +section .note-callout-example { + color: rgb(120, 82, 238); + background-color: rgba(120, 82, 238, 0.1); +} +section .note-callout-quote { + color: rgb(158, 158, 158); + background-color: rgba(158, 158, 158, 0.1); +} +/* custom icon callout */ +section .note-callout-custom { + color: rgb(8, 109, 221); + background-color: rgba(8, 109, 221, 0.1); +} + +/* --------------------------------------- */ +/* math */ +/* --------------------------------------- */ +.block-math-svg { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + align-items: center; + margin:20px 0px; + max-width: 300% !important; +} + +.block-math-section { + text-align: center; + overflow: auto; +} + +/* --------------------------------------- */ +/* 高亮 */ +/* --------------------------------------- */ +.note-highlight { + background-color: rgba(255,208,0, 0.4); +} + +/* --------------------------------------- */ +/* 列表需要强制设置样式*/ +/* --------------------------------------- */ +ul { + list-style-type: disc; +} + +.note-svg-icon { + min-width: 24px; + height: 24px; + display: inline-block; +} + +.note-svg-icon svg { + width: 100%; + height: 100%; +} + +.note-embed-excalidraw-left { + display: flex; + flex-direction: row; + width: 100%; +} + +.note-embed-excalidraw-center { + display: flex; + flex-direction: row; + justify-content: center; + width: 100%; +} + +.note-embed-excalidraw-right { + display: flex; + flex-direction: row; + justify-content: flex-end; + width: 100%; +} + +.note-embed-excalidraw { + display: inline-block; +} + +.note-embed-excalidraw p { + line-height: 0 !important; + margin: 0 !important; +} + +/* +.note-embed-excalidraw svg { + width: 100%; + height: 100%; +} +*/ + +.note-embed-svg-left { + display: flex; + flex-direction: row; + justify-content: flex-start; + width: 100%; +} + +.note-embed-svg-center { + display: flex; + flex-direction: row; + justify-content: center; + width: 100%; +} + +.note-embed-svg-right { + display: flex; + flex-direction: row; + justify-content: flex-end; + width: 100%; +} + +.note-embed-svg svg { + width: 100%; + height: 100%; +} + +`; \ No newline at end of file diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..5a38bf5 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { Plugin, WorkspaceLeaf, App, PluginManifest, Menu, Notice, TAbstractFile, TFile, TFolder } from 'obsidian'; +import { NotePreview, VIEW_TYPE_NOTE_PREVIEW } from './note-preview'; +import { NMPSettings } from './settings'; +import { NoteToMpSettingTab } from './setting-tab'; +import AssetsManager from './assets'; +import { setVersion, uevent } from './utils'; +import { WidgetsModal } from './widgets-modal'; + + +export default class NoteToMpPlugin extends Plugin { + settings: NMPSettings; + assetsManager: AssetsManager; + constructor(app: App, manifest: PluginManifest) { + super(app, manifest); + AssetsManager.setup(app, manifest); + this.assetsManager = AssetsManager.getInstance(); + } + + async loadResource() { + await this.loadSettings(); + await this.assetsManager.loadAssets(); + } + + async onload() { + console.log('Loading NoteToMP'); + setVersion(this.manifest.version); + uevent('load'); + this.app.workspace.onLayoutReady(()=>{ + this.loadResource(); + }) + + this.registerView( + VIEW_TYPE_NOTE_PREVIEW, + (leaf) => new NotePreview(leaf, this) + ); + + const ribbonIconEl = this.addRibbonIcon('clipboard-paste', '复制到公众号', (evt: MouseEvent) => { + this.activateView(); + }); + ribbonIconEl.addClass('note-to-mp-plugin-ribbon-class'); + + this.addCommand({ + id: 'note-to-mp-preview', + name: '复制到公众号', + callback: () => { + this.activateView(); + } + }); + + this.addSettingTab(new NoteToMpSettingTab(this.app, this)); + + this.addCommand({ + id: 'note-to-mp-widget', + name: '插入样式小部件', + callback: () => { + new WidgetsModal(this.app).open(); + } + }); + + this.addCommand({ + id: 'note-to-mp-pub', + name: '发布公众号文章', + callback: async () => { + await this.activateView(); + this.getNotePreview()?.postArticle(); + } + }); + + // 监听右键菜单 + this.registerEvent( + this.app.workspace.on('file-menu', (menu, file) => { + menu.addItem((item) => { + item + .setTitle('发布到公众号') + .setIcon('lucide-send') + .onClick(async () => { + if (file instanceof TFile) { + if (file.extension.toLowerCase() !== 'md') { + new Notice('只能发布 Markdown 文件'); + return; + } + await this.activateView(); + await this.getNotePreview()?.renderMarkdown(file); + await this.getNotePreview()?.postArticle(); + } else if (file instanceof TFolder) { + await this.activateView(); + await this.getNotePreview()?.batchPost(file); + } + }); + }); + }) + ); + } + + onunload() { + + } + + async loadSettings() { + NMPSettings.loadSettings(await this.loadData()); + } + + async saveSettings() { + await this.saveData(NMPSettings.allSettings()); + } + + async activateView() { + const { workspace } = this.app; + + let leaf: WorkspaceLeaf | null = null; + const leaves = workspace.getLeavesOfType(VIEW_TYPE_NOTE_PREVIEW); + + if (leaves.length > 0) { + leaf = leaves[0]; + } else { + leaf = workspace.getRightLeaf(false); + await leaf?.setViewState({ type: VIEW_TYPE_NOTE_PREVIEW, active: false }); + } + + if (leaf) workspace.revealLeaf(leaf); + } + + getNotePreview(): NotePreview | null { + const leaves = this.app.workspace.getLeavesOfType(VIEW_TYPE_NOTE_PREVIEW); + if (leaves.length > 0) { + const leaf = leaves[0]; + return leaf.view as NotePreview; + } + return null; + } +} diff --git a/src/markdown/blockquote.ts b/src/markdown/blockquote.ts new file mode 100644 index 0000000..3964857 --- /dev/null +++ b/src/markdown/blockquote.ts @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { Tokens, MarkedExtension } from "marked"; +import { Extension, MDRendererCallback } from "./extension"; +import { NMPSettings } from "src/settings"; +import { App, Vault } from "obsidian"; +import AssetsManager from "../assets"; +import { CalloutRenderer } from "./callouts"; +import { WidgetBox } from "./widget-box"; + +export class Blockquote extends Extension { + callout: CalloutRenderer; + box: WidgetBox; + + constructor(app: App, settings: NMPSettings, assetsManager: AssetsManager, callback: MDRendererCallback) { + super(app, settings, assetsManager, callback); + this.callout = new CalloutRenderer(app, settings, assetsManager, callback); + if (settings.isAuthKeyVaild()) { + this.box = new WidgetBox(app, settings, assetsManager, callback); + } + } + + async prepare() { + if (!this.marked) { + console.error("marked is not ready"); + return; + } + if (this.callout) this.callout.marked = this.marked; + if (this.box) this.box.marked = this.marked; + return; + } + + async renderer(token: Tokens.Blockquote) { + if (this.callout.matched(token.text)) { + return await this.callout.renderer(token); + } + + if (this.box && this.box.matched(token.text)) { + return await this.box.renderer(token); + } + + const body = this.marked.parser(token.tokens); + return `
${body}
`; + } + + markedExtension(): MarkedExtension { + return { + async: true, + walkTokens: async (token: Tokens.Generic) => { + if (token.type !== 'blockquote') { + return; + } + token.html = await this.renderer(token as Tokens.Blockquote); + }, + extensions: [{ + name: 'blockquote', + level: 'block', + renderer: (token: Tokens.Generic) => { + return token.html; + }, + }] + } + } +} \ No newline at end of file diff --git a/src/markdown/callouts.ts b/src/markdown/callouts.ts new file mode 100644 index 0000000..74fd994 --- /dev/null +++ b/src/markdown/callouts.ts @@ -0,0 +1,275 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { Tokens, MarkedExtension} from "marked"; +import { Extension } from "./extension"; +import AssetsManager from "src/assets"; +import { wxWidget } from "src/weixin-api"; + +const icon_note = `` +const icon_abstract = `` +const icon_info = `` +const icon_todo = `` +const icon_tip = `` +const icon_success = `` +const icon_question = `` +const icon_warning = `` +const icon_failure = `` +const icon_danger = `` +const icon_bug = `` +const icon_example = `` +const icon_quote = `` +/* +note, +abstract, summary, tldr +info +todo +tip +hint, important +success, check, done +question, help, faq +warning, caution, attention +failure, fail, missing +danger, error +bug +example +quote, cite +*/ + +type CalloutInfo = {icon: string, style: string} + +const CalloutTypes = new Map(Object.entries({ + note: { + icon: icon_note, + style: 'note-callout-note', + }, + abstract: { + icon: icon_abstract, + style: 'note-callout-abstract', + }, + summary: { + icon: icon_abstract, + style: 'note-callout-abstract', + }, + tldr: { + icon: icon_abstract, + style: 'note-callout-abstract', + }, + info: { + icon: icon_info, + style: 'note-callout-note', + }, + todo: { + icon: icon_todo, + style: 'note-callout-note', + }, + tip: { + icon: icon_tip, + style: 'note-callout-abstract', + }, + hint: { + icon: icon_tip, + style: 'note-callout-abstract', + }, + important: { + icon: icon_tip, + style: 'note-callout-abstract', + }, + success: { + icon: icon_success, + style: 'note-callout-success', + }, + check: { + icon: icon_success, + style: 'note-callout-success', + }, + done: { + icon: icon_success, + style: 'note-callout-success', + }, + question: { + icon: icon_question, + style: 'note-callout-question', + }, + help: { + icon: icon_question, + style: 'note-callout-question', + }, + faq: { + icon: icon_question, + style: 'note-callout-question', + }, + warning: { + icon: icon_warning, + style: 'note-callout-question', + }, + caution: { + icon: icon_warning, + style: 'note-callout-question', + }, + attention: { + icon: icon_warning, + style: 'note-callout-question', + }, + failure: { + icon: icon_failure, + style: 'note-callout-failure', + }, + fail: { + icon: icon_failure, + style: 'note-callout-failure', + }, + missing: { + icon: icon_failure, + style: 'note-callout-failure', + }, + danger: { + icon: icon_danger, + style: 'note-callout-failure', + }, + error: { + icon: icon_danger, + style: 'note-callout-failure', + }, + bug: { + icon: icon_bug, + style: 'note-callout-failure', + }, + example: { + icon: icon_example, + style: 'note-callout-example', + }, + quote: { + icon: icon_quote, + style: 'note-callout-quote', + }, + cite: { + icon: icon_quote, + style: 'note-callout-quote', + } +})); + +function GetCallout(type: string) { + return CalloutTypes.get(type); +}; + +function matchCallouts(text:string) { + const regex = /\[\!(.*?)\]/g; + let m; + if( m = regex.exec(text)) { + return m[1]; + } + return ""; +} + +function GetCalloutTitle(callout:string, text:string) { + let title = callout.charAt(0).toUpperCase() + callout.slice(1).toLowerCase(); + let start = text.indexOf(']') + 1; + if (text.indexOf(']-') > 0 || text.indexOf(']+') > 0) { + start = start + 1; + } + let end = text.indexOf('\n'); + if (end === -1) end = text.length; + if (start >= end) return title; + const customTitle = text.slice(start, end).trim(); + if (customTitle !== '') { + title = customTitle; + } + return title; +} + +export class CalloutRenderer extends Extension { + matched(text: string) { + return matchCallouts(text) != ''; + } + + async renderer(token: Tokens.Blockquote) { + let callout = matchCallouts(token.text); + if (callout == '') { + const body = this.marked.parser(token.tokens); + return `
${body}
`;; + } + + const title = GetCalloutTitle(callout, token.text); + const index = token.text.indexOf('\n'); + let body = ''; + if (index > 0) { + token.text = token.text.slice(index+1) + body = await this.marked.parse(token.text); + } + + const setting = AssetsManager.getInstance().expertSettings.render?.callout as { [key: string]: any }; + if (setting && callout.toLocaleLowerCase() in setting) { + const authkey = this.settings.authKey; + const widget = setting[callout.toLocaleLowerCase()]; + if (typeof widget === 'number') { + return await wxWidget(authkey, JSON.stringify({ + id: `${widget}`, + title, + content: body, + })); + } + if (typeof widget === 'object') { + const {id, style} = widget; + return await wxWidget(authkey, JSON.stringify({ + id: `${id}`, + title, + style: style || {}, + content: body, + })); + } + } + + let info = GetCallout(callout.toLowerCase()); + if (info == null) { + const svg = await this.assetsManager.loadIcon(callout); + if (svg) { + info = {icon: svg, style: 'note-callout-custom'} + } + else { + info = GetCallout('note'); + } + } + + + return `
${info?.icon}${title}
${body}
`; + } + + markedExtension(): MarkedExtension { + return { + async: true, + walkTokens: async (token: Tokens.Generic) => { + if (token.type !== 'blockquote') { + return; + } + token.html = await this.renderer(token as Tokens.Blockquote); + }, + extensions:[{ + name: 'blockquote', + level: 'block', + renderer: (token: Tokens.Generic)=> { + return token.html; + }, + }] + } + } +} \ No newline at end of file diff --git a/src/markdown/code.ts b/src/markdown/code.ts new file mode 100644 index 0000000..d03d4de --- /dev/null +++ b/src/markdown/code.ts @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { Notice } from "obsidian"; +import { MarkedExtension, Tokens } from "marked"; +import hljs from "highlight.js"; +import { MathRendererQueue } from "./math"; +import { Extension } from "./extension"; +import { UploadImageToWx } from "../imagelib"; +import AssetsManager from "src/assets"; +import { wxWidget } from "src/weixin-api"; + +export class CardDataManager { + private cardData: Map; + private static instance: CardDataManager; + + private constructor() { + this.cardData = new Map(); + } + + // 静态方法,用于获取实例 + public static getInstance(): CardDataManager { + if (!CardDataManager.instance) { + CardDataManager.instance = new CardDataManager(); + } + return CardDataManager.instance; + } + + public setCardData(id: string, cardData: string) { + this.cardData.set(id, cardData); + } + + public cleanup() { + this.cardData.clear(); + } + + public restoreCard(html: string) { + for (const [key, value] of this.cardData.entries()) { + const exp = `]*\\sdata-id="${key}"[^>]*>(.*?)<\\/section>`; + const regex = new RegExp(exp, 'gs'); + if (!regex.test(html)) { + console.warn('没有公众号信息:', key); + continue; + } + html = html.replace(regex, value); + } + return html; + } +} + +const MermaidSectionClassName = 'note-mermaid'; +const MermaidImgClassName = 'note-mermaid-img'; + +export class CodeRenderer extends Extension { + showLineNumber: boolean; + mermaidIndex: number; + + async prepare() { + this.mermaidIndex = 0; + } + + static srcToBlob(src: string) { + const base64 = src.split(',')[1]; + const byteCharacters = atob(base64); + const byteNumbers = new Array(byteCharacters.length); + for (let i = 0; i < byteCharacters.length; i++) { + byteNumbers[i] = byteCharacters.charCodeAt(i); + } + const byteArray = new Uint8Array(byteNumbers); + return new Blob([byteArray], { type: 'image/png' }); + } + + static async uploadMermaidImages(root: HTMLElement, token: string) { + const imgs = root.querySelectorAll('.' + MermaidImgClassName); + for (let img of imgs) { + const src = img.getAttribute('src'); + if (!src) continue; + if (src.startsWith('http')) continue; + const blob = CodeRenderer.srcToBlob(img.getAttribute('src')!); + const name = img.id + '.png'; + const res = await UploadImageToWx(blob, name, token); + if (res.errcode != 0) { + const msg = `上传图片失败: ${res.errcode} ${res.errmsg}`; + new Notice(msg); + console.error(msg); + continue; + } + const url = res.url; + img.setAttribute('src', url); + } + } + + replaceSpaces(text: string) { + let result = ''; + let inTag = false; + for (let char of text) { + if (char === '<') { + inTag = true; + result += char; + continue; + } else if (char === '>') { + inTag = false; + result += char; + continue; + } + if (inTag) { + result += char; + } else { + if (char === ' ') { + result += ' '; + } else if (char === '\t') { + result += '    '; + } else { + result += char; + } + } + } + return result; + } + + async codeRenderer(code: string, infostring: string | undefined) { + const lang = (infostring || '').match(/^\S*/)?.[0]; + code = code.replace(/\n$/, ''); + + try { + if (lang && hljs.getLanguage(lang)) { + code = hljs.highlight(code, { language: lang }).value; + } + else { + code = hljs.highlightAuto(code).value; + } + } catch (err) { + console.error(err); + } + + code = this.replaceSpaces(code); + const lines = code.split('\n'); + let body = ''; + let liItems = ''; + for (let line in lines) { + let text = lines[line]; + if (text.length === 0) { + text = '
' + } + body = body + '' + text + ''; + liItems = liItems + `
  • ${parseInt(line)+1}
  • `; + } + + let codeSection = '
    '; + if (this.settings.lineNumber) { + codeSection = codeSection + '
      ' + + liItems + + '
    '; + } + + let html = ''; + if (lang) { + html = codeSection + '
    '
    +			+ body
    +			+ '
    '; + } + else { + html = codeSection + '
    '
    +				+ body
    +				+ '
    '; + } + + if (!this.settings.isAuthKeyVaild()) { + return html; + } + + const settings = AssetsManager.getInstance().expertSettings; + const id = settings.render?.code; + if (id && typeof id === 'number') { + const params = JSON.stringify({ + id: `${id}`, + content: html, + }); + html = await wxWidget(this.settings.authKey, params); + } + return html; + } + + static getMathType(lang: string | null) { + if (!lang) return null; + let l = lang.toLowerCase(); + l = l.trim(); + if (l === 'am' || l === 'asciimath') return 'asciimath'; + if (l === 'latex' || l === 'tex') return 'latex'; + return null; + } + + parseCard(htmlString: string) { + const id = /data-id="([^"]+)"/; + const headimgRegex = /data-headimg="([^"]+)"/; + const nicknameRegex = /data-nickname="([^"]+)"/; + const signatureRegex = /data-signature="([^"]+)"/; + + const idMatch = htmlString.match(id); + const headimgMatch = htmlString.match(headimgRegex); + const nicknameMatch = htmlString.match(nicknameRegex); + const signatureMatch = htmlString.match(signatureRegex); + + return { + id: idMatch ? idMatch[1] : '', + headimg: headimgMatch ? headimgMatch[1] : '', + nickname: nicknameMatch ? nicknameMatch[1] : '公众号名称', + signature: signatureMatch ? signatureMatch[1] : '公众号介绍' + }; + } + + renderCard(token: Tokens.Code) { + const { id, headimg, nickname, signature } = this.parseCard(token.text); + if (id === '') { + return '公众号卡片数据错误,没有id'; + } + CardDataManager.getInstance().setCardData(id, token.text); + return `
    ${nickname}
    ${signature}
    公众号
    `; + } + + renderMermaid(token: Tokens.Code) { + try { + const meraidIndex = this.mermaidIndex; + const containerId = `mermaid-${meraidIndex}`; + this.callback.cacheElement('mermaid', containerId, token.raw); + this.mermaidIndex += 1; + return `
    `; + } catch (error) { + console.error(error.message); + return 'mermaid渲染失败'; + } + } + + markedExtension(): MarkedExtension { + return { + async: true, + walkTokens: async (token: Tokens.Generic) => { + if (token.type !== 'code') return; + if (this.settings.isAuthKeyVaild()) { + const type = CodeRenderer.getMathType(token.lang ?? ''); + if (type) { + token.html = await MathRendererQueue.getInstance().render(token, false, type); + return; + } + if (token.lang && token.lang.trim().toLocaleLowerCase() == 'mermaid') { + token.html = this.renderMermaid(token as Tokens.Code); + return; + } + } + if (token.lang && token.lang.trim().toLocaleLowerCase() == 'mpcard') { + token.html = this.renderCard(token as Tokens.Code); + return; + } + token.html = await this.codeRenderer(token.text, token.lang); + }, + extensions: [{ + name: 'code', + level: 'block', + renderer: (token: Tokens.Generic) => { + return token.html; + }, + }] + } + } +} + diff --git a/src/markdown/commnet.ts b/src/markdown/commnet.ts new file mode 100644 index 0000000..a0a6e63 --- /dev/null +++ b/src/markdown/commnet.ts @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { Tokens, MarkedExtension } from "marked"; +import { Extension } from "./extension"; + +const commentRegex = /^%%([\s\S]*?)%%/; + +export class Comment extends Extension { + markedExtension(): MarkedExtension { + return { + extensions: [{ + name: 'CommentInline', + level: 'inline', + start(src: string) { + let index; + let indexSrc = src; + + while (indexSrc) { + index = indexSrc.indexOf('%%'); + if (index === -1) return; + return index; + } + }, + tokenizer(src: string) { + const match = src.match(commentRegex); + if (match) { + return { + type: 'CommentInline', + raw: match[0], + text: match[1], + }; + } + }, + renderer(token: Tokens.Generic) { + return ''; + } + }, + { + name: 'CommentBlock', + level: 'block', + tokenizer(src: string) { + const match = src.match(commentRegex); + if (match) { + return { + type: 'CommentBlock', + raw: match[0], + text: match[1], + }; + } + }, + renderer(token: Tokens.Generic) { + return ''; + } + }, + ] + } + } +} \ No newline at end of file diff --git a/src/markdown/embed-block-mark.ts b/src/markdown/embed-block-mark.ts new file mode 100644 index 0000000..dfd8932 --- /dev/null +++ b/src/markdown/embed-block-mark.ts @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { Tokens, MarkedExtension } from "marked"; +import { Extension } from "./extension"; + +const BlockMarkRegex = /^\^[0-9A-Za-z-]+$/; + +export class EmbedBlockMark extends Extension { + allLinks:string[] = []; + async prepare() { + this.allLinks = []; + } + + markedExtension(): MarkedExtension { + return { + extensions: [{ + name: 'EmbedBlockMark', + level: 'inline', + start(src: string) { + let index = src.indexOf('^'); + if (index === -1) { + return; + } + return index; + }, + tokenizer(src: string) { + const match = src.match(BlockMarkRegex); + if (match) { + return { + type: 'EmbedBlockMark', + raw: match[0], + text: match[0] + }; + } + }, + renderer: (token: Tokens.Generic) => { + return ` { + return '


    '.repeat(token.raw.length - 1); + }, + }] + } + } +} diff --git a/src/markdown/extension.ts b/src/markdown/extension.ts new file mode 100644 index 0000000..6e46126 --- /dev/null +++ b/src/markdown/extension.ts @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { NMPSettings } from "src/settings"; +import { Marked, MarkedExtension } from "marked"; +import { App, Vault } from "obsidian"; +import AssetsManager from "../assets"; + +export interface MDRendererCallback { + settings: NMPSettings; + updateElementByID(id:string, html:string):void; // 改为异步渲染后已废弃 + cacheElement(category: string, id: string, data: string): void; +} + +export abstract class Extension { + app: App; + vault: Vault; + assetsManager: AssetsManager + settings: NMPSettings; + callback: MDRendererCallback; + marked: Marked; + + constructor(app: App, settings: NMPSettings, assetsManager: AssetsManager, callback: MDRendererCallback) { + this.app = app; + this.vault = app.vault; + this.settings = settings; + this.assetsManager = assetsManager; + this.callback = callback; + } + + async prepare() { return; } + async postprocess(html:string) { return html; } + async beforePublish() { } + async cleanup() { return; } + abstract markedExtension(): MarkedExtension +} \ No newline at end of file diff --git a/src/markdown/footnote.ts b/src/markdown/footnote.ts new file mode 100644 index 0000000..ee6d5ec --- /dev/null +++ b/src/markdown/footnote.ts @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { Tokens, MarkedExtension } from "marked"; +import { Extension } from "./extension"; + +const refRule = /^\[\^([^\]]+)\]/; // 匹配 [^label] +const defRule = /^ *\[\^([^\]]+)\]:/; // 匹配 [^label]: + +export class FootnoteRenderer extends Extension { + allDefs: any[] = []; + defCounter = 0; + async prepare() { + this.allDefs = []; + this.defCounter = 0; + } + + async postprocess(html: string) { + if (this.allDefs.length == 0) { + return html; + } + + let body = ''; + for (const def of this.allDefs) { + const {label, content} = def; + const html = await this.marked.parse(content); + const id = `fn-${label}`; + body += `
  • ${html}
  • `; + } + return html + `

      ${body}
    `; + } + + markedExtension(): MarkedExtension { + return { + extensions: [ + { + name: 'FootnoteRef', + level: 'inline', + start(src) { + const index = src.indexOf('[^'); + return index > 0 ? index : -1; + }, + tokenizer: (src) => { + const match = src.match(refRule); + if (match) { + return { + type: 'FootnoteRef', + raw: match[0], + text: match[1], + }; + } + }, + renderer: (token: Tokens.Generic) => { + this.defCounter += 1; + const id = `fnref-${this.defCounter}`; + return `${this.defCounter}`; + } + }, + { + name: 'FootnoteDef', + level: 'block', + tokenizer: (src) => { + const match = src.match(defRule); + if (match) { + const label = match[1].trim(); + const end = src.indexOf('\n'); + const raw = end === -1 ? src: src.substring(0, end + 1); + const content = raw.substring(match[0].length); + this.allDefs.push({label, content}); + + return { + type: 'FootnoteDef', + raw: raw, + text: content, + }; + } + }, + renderer: (token: Tokens.Generic) => { + return ''; + } + } + ] + } + } +} \ No newline at end of file diff --git a/src/markdown/heading.ts b/src/markdown/heading.ts new file mode 100644 index 0000000..1ea3fba --- /dev/null +++ b/src/markdown/heading.ts @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { Tokens, MarkedExtension } from "marked"; +import { Extension } from "./extension"; +import AssetsManager from "src/assets"; +import { ExpertSettings } from "src/expert-settings"; +import { wxWidget } from "src/weixin-api"; + +export class HeadingRenderer extends Extension { + index = [0, 0, 0, 0]; + expertSettings: ExpertSettings; + headingSettings: any[] + + async prepare() { + this.index = [0, 0, 0, 0]; + this.expertSettings = AssetsManager.getInstance().expertSettings; + this.headingSettings = [undefined, undefined, undefined, undefined]; + if (!this.expertSettings.render) { + return; + } + if (this.expertSettings.render.h1) { + this.headingSettings[1] = this.expertSettings.render.h1; + } + if (this.expertSettings.render.h2) { + this.headingSettings[2] = this.expertSettings.render.h2; + } + if (this.expertSettings.render.h3) { + this.headingSettings[3] = this.expertSettings.render.h3; + } + } + + async renderWithTemplate(token: Tokens.Heading, template: string) { + const content = await this.marked.parseInline(token.text); + return template.replace('{content}', content); + } + + async renderWithWidgetId(token: Tokens.Heading, widgetId: number) { + const authkey = this.settings.authKey; + const content = await this.marked.parseInline(token.text); + const params = JSON.stringify({ + id: `${widgetId}`, + title: content, + }); + return await wxWidget(authkey, params); + } + + async renderWithWidget(token: Tokens.Heading, widgetId: number, counter: boolean|undefined, len: number|undefined, style: object|undefined = undefined) { + const authkey = this.settings.authKey; + let title = token.text; + if (counter === undefined) { + counter = false; + } + if (len === undefined) { + len = 1; + } + if (style === undefined) { + style = new Map(); + } + if (counter) { + title = `${this.index[token.depth]}`; + if (title.length < len) { + title = title.padStart(len, '0'); + } + } + const content = await this.marked.parseInline(token.text); + const params = JSON.stringify({ + id: `${widgetId}`, + title, + style, + content: '

    ' + content + '

    ', + }); + return await wxWidget(authkey, params); + } + + markedExtension(): MarkedExtension { + return { + async: true, + walkTokens: async (token: Tokens.Generic) => { + if (token.type !== 'heading') { + return; + } + + const setting = this.headingSettings[token.depth]; + this.index[token.depth] += 1; + if (setting) { + if (typeof setting === 'string') { + token.html = await this.renderWithTemplate(token as Tokens.Heading, setting); + } + else if (typeof setting === 'number') { + token.html = await this.renderWithWidgetId(token as Tokens.Heading, setting); + } + else { + const { id, counter, len, style } = setting; + token.html = await this.renderWithWidget(token as Tokens.Heading, id, counter, len, style); + } + return; + } + + const body = await this.marked.parseInline(token.text); + token.html = `${body}`; + }, + extensions: [{ + name: 'heading', + level: 'block', + renderer: (token: Tokens.Generic) => { + return token.html; + }, + }] + } + } +} \ No newline at end of file diff --git a/src/markdown/icons.ts b/src/markdown/icons.ts new file mode 100644 index 0000000..7a66913 --- /dev/null +++ b/src/markdown/icons.ts @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { Tokens, MarkedExtension } from "marked"; +import { Extension } from "./extension"; + +const iconsRegex = /^\[:(.*?):\]/; + +export class SVGIcon extends Extension { + isNumeric(str: string): boolean { + return !isNaN(Number(str)) && str.trim() !== ''; + } + + getSize(size: string) { + const items = size.split('x'); + let width, height; + if (items.length == 2) { + width = items[0]; + height = items[1]; + } + else { + width = items[0]; + height = items[0]; + } + width = this.isNumeric(width) ? width+'px' : width; + height = this.isNumeric(height) ? height+'px' : height; + return {width, height}; + } + + renderStyle(items: string[]) { + let size = ''; + let color = ''; + if (items.length == 3) { + size = items[1]; + color = items[2]; + } + else if (items.length == 2) { + if (items[1].startsWith('#')) { + color = items[1]; + } + else { + size = items[1]; + } + } + let style = ''; + if (size.length > 0) { + const {width, height} = this.getSize(size); + style += `width:${width};height:${height};`; + } + if (color.length > 0) { + style += `color:${color};`; + } + return style.length > 0 ? `style="${style}"` : ''; + } + + async render(text: string) { + const items = text.split('|'); + const name = items[0]; + const svg = await this.assetsManager.loadIcon(name); + const body = svg==='' ? '未找到图标' + name : svg; + const style = this.renderStyle(items); + return `${body}` + } + + markedExtension(): MarkedExtension { + return { + async: true, + walkTokens: async (token: Tokens.Generic) => { + if (token.type !== 'SVGIcon') { + return; + } + token.html = await this.render(token.text); + }, + extensions: [{ + name: 'SVGIcon', + level: 'inline', + start(src: string) { + let index; + let indexSrc = src; + + while (indexSrc) { + index = indexSrc.indexOf('[:'); + if (index === -1) return; + return index; + } + }, + tokenizer(src: string) { + const match = src.match(iconsRegex); + if (match) { + return { + type: 'SVGIcon', + raw: match[0], + text: match[1], + }; + } + }, + renderer(token: Tokens.Generic) { + return token.html; + } + }] + } + } +} \ No newline at end of file diff --git a/src/markdown/link.ts b/src/markdown/link.ts new file mode 100644 index 0000000..47ec24f --- /dev/null +++ b/src/markdown/link.ts @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { Tokens, MarkedExtension } from "marked"; +import { Extension } from "./extension"; + +export class LinkRenderer extends Extension { + allLinks:string[] = []; + async prepare() { + this.allLinks = []; + } + + async postprocess(html: string) { + if (this.settings.linkStyle !== 'footnote' + || this.allLinks.length == 0) { + return html; + } + + const links = this.allLinks.map((href, i) => { + return `
  • ${href} ↩
  • `; + }); + return `${html}
      ${links.join('')}
    `; + } + + markedExtension(): MarkedExtension { + return { + extensions: [{ + name: 'link', + level: 'inline', + renderer: (token: Tokens.Link) => { + if (token.href.startsWith('mailto:')) { + return token.text; + } + if (token.text.indexOf(token.href) === 0 + || (token.href.indexOf('https://mp.weixin.qq.com/mp') === 0) + || (token.href.indexOf('https://mp.weixin.qq.com/s') === 0)) { + return `${token.text}`; + } + this.allLinks.push(token.href); + if (this.settings.linkStyle == 'footnote') { + return `${token.text}[${this.allLinks.length}]`; + } + else { + return `${token.text}[${token.href}]`; + } + } + }] + } + } +} \ No newline at end of file diff --git a/src/markdown/local-file.ts b/src/markdown/local-file.ts new file mode 100644 index 0000000..ff8a44b --- /dev/null +++ b/src/markdown/local-file.ts @@ -0,0 +1,831 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { Token, Tokens, MarkedExtension } from "marked"; +import { Notice, TAbstractFile, TFile, Vault, MarkdownView, requestUrl, Platform } from "obsidian"; +import { Extension } from "./extension"; +import { NMPSettings } from "../settings"; +import { IsImageLibReady, PrepareImageLib, WebpToJPG, UploadImageToWx } from "../imagelib"; + +declare module 'obsidian' { + interface Vault { + config: { + attachmentFolderPath: string; + newLinkFormat: string; + useMarkdownLinks: boolean; + }; + } +} + +const LocalFileRegex = /^!\[\[(.*?)\]\]/; + +interface ImageInfo { + resUrl: string; + filePath: string; + url: string | null; + media_id: string | null; +} + +export class LocalImageManager { + private images: Map; + private static instance: LocalImageManager; + + private constructor() { + this.images = new Map(); + } + + // 静态方法,用于获取实例 + public static getInstance(): LocalImageManager { + if (!LocalImageManager.instance) { + LocalImageManager.instance = new LocalImageManager(); + } + return LocalImageManager.instance; + } + + public setImage(path: string, info: ImageInfo): void { + if (!this.images.has(path)) { + this.images.set(path, info); + } + } + + isWebp(file: TFile | string): boolean { + if (file instanceof TFile) { + return file.extension.toLowerCase() === 'webp'; + } + const name = file.toLowerCase(); + return name.endsWith('.webp'); + } + + async uploadLocalImage(token: string, vault: Vault, type: string = '') { + const keys = this.images.keys(); + await PrepareImageLib(); + const result = []; + for (let key of keys) { + const value = this.images.get(key); + if (value == null) continue; + if (value.url != null) continue; + const file = vault.getFileByPath(value.filePath); + if (file == null) continue; + let fileData = await vault.readBinary(file); + let name = file.name; + if (this.isWebp(file)) { + if (IsImageLibReady()) { + fileData = WebpToJPG(fileData); + name = name.toLowerCase().replace('.webp', '.jpg'); + } + else { + console.error('wasm not ready for webp'); + } + } + + const res = await UploadImageToWx(new Blob([fileData]), name, token, type); + if (res.errcode != 0) { + const msg = `上传图片失败: ${res.errcode} ${res.errmsg}`; + new Notice(msg); + console.error(msg); + } + + value.url = res.url; + value.media_id = res.media_id; + result.push(res); + } + return result; + } + + checkImageExt(filename: string ): boolean { + const name = filename.toLowerCase(); + + if (name.endsWith('.jpg') + || name.endsWith('.jpeg') + || name.endsWith('.png') + || name.endsWith('.gif') + || name.endsWith('.bmp') + || name.endsWith('.tiff') + || name.endsWith('.svg') + || name.endsWith('.webp')) { + return true; + } + return false; + } + + getImageNameFromUrl(url: string, type: string): string { + try { + // 创建URL对象 + const urlObj = new URL(url); + // 获取pathname部分 + const pathname = urlObj.pathname; + // 获取最后一个/后的内容作为文件名 + let filename = pathname.split('/').pop() || ''; + filename = decodeURIComponent(filename); + if (!this.checkImageExt(filename)) { + filename = filename + this.getImageExt(type); + } + return filename; + } catch (e) { + // 如果URL解析失败,尝试简单的字符串处理 + const queryIndex = url.indexOf('?'); + if (queryIndex !== -1) { + url = url.substring(0, queryIndex); + } + return url.split('/').pop() || ''; + } + } + + getImageExtFromBlob(blob: Blob): string { + // MIME类型到文件扩展名的映射 + const mimeToExt: { [key: string]: string } = { + 'image/jpeg': '.jpg', + 'image/jpg': '.jpg', + 'image/png': '.png', + 'image/gif': '.gif', + 'image/bmp': '.bmp', + 'image/webp': '.webp', + 'image/svg+xml': '.svg', + 'image/tiff': '.tiff' + }; + + // 获取MIME类型 + const mimeType = blob.type.toLowerCase(); + + // 返回对应的扩展名,如果找不到则返回空字符串 + return mimeToExt[mimeType] || ''; + } + + base64ToBlob(src: string) { + const items = src.split(','); + if (items.length != 2) { + throw new Error('base64格式错误'); + } + const mineType = items[0].replace('data:', ''); + const base64 = items[1]; + + const byteCharacters = atob(base64); + const byteNumbers = new Array(byteCharacters.length); + for (let i = 0; i < byteCharacters.length; i++) { + byteNumbers[i] = byteCharacters.charCodeAt(i); + } + const byteArray = new Uint8Array(byteNumbers); + return {blob: new Blob([byteArray], { type: mineType }), ext: this.getImageExt(mineType)}; + } + + async uploadImageFromUrl(url: string, token: string, type: string = '') { + try { + const rep = await requestUrl(url); + await PrepareImageLib(); + let data = rep.arrayBuffer; + let blob = new Blob([data]); + + let filename = this.getImageNameFromUrl(url, rep.headers['content-type']); + if (filename == '' || filename == null) { + filename = 'remote_img' + this.getImageExtFromBlob(blob); + } + + if (this.isWebp(filename)) { + if (IsImageLibReady()) { + data = WebpToJPG(data); + blob = new Blob([data]); + filename = filename.toLowerCase().replace('.webp', '.jpg'); + } + else { + console.error('wasm not ready for webp'); + } + } + + return await UploadImageToWx(blob, filename, token, type); + } + catch (e) { + console.error(e); + throw new Error('上传图片失败:' + e.message + '|' + url); + } + } + + getImageExt(type: string): string { + const mimeToExt: { [key: string]: string } = { + 'image/jpeg': '.jpg', + 'image/jpg': '.jpg', + 'image/png': '.png', + 'image/gif': '.gif', + 'image/bmp': '.bmp', + 'image/webp': '.webp', + 'image/svg+xml': '.svg', + 'image/tiff': '.tiff' + }; + return mimeToExt[type] || '.jpg'; + } + + getMimeType(ext: string): string { + const extToMime: { [key: string]: string } = { + '.jpg': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.png': 'image/png', + '.gif': 'image/gif', + '.bmp': 'image/bmp', + '.webp': 'image/webp', + '.svg': 'image/svg+xml', + '.tiff': 'image/tiff' + }; + return extToMime[ext.toLowerCase()] || 'image/jpeg'; + } + + getImageInfos(root: HTMLElement) { + const images = root.getElementsByTagName('img'); + const result = []; + for (let i = 0; i < images.length; i++) { + const img = images[i]; + const res = this.images.get(img.src); + if (res) { + result.push(res); + } + } + return result; + } + + async uploadRemoteImage(root: HTMLElement, token: string, type: string = '') { + const images = root.getElementsByTagName('img'); + const result = []; + for (let i = 0; i < images.length; i++) { + const img = images[i]; + if (img.src.includes('mmbiz.qpic.cn')) continue; + // 移动端本地图片不通过src上传 + if (img.src.startsWith('http://localhost/') && Platform.isMobileApp) { + continue; + } + + if (img.src.startsWith('http')) { + const res = await this.uploadImageFromUrl(img.src, token, type); + if (res.errcode != 0) { + const msg = `上传图片失败: ${img.src} ${res.errcode} ${res.errmsg}`; + new Notice(msg); + console.error(msg); + } + const info = { + resUrl: img.src, + filePath: "", + url: res.url, + media_id: res.media_id, + }; + this.images.set(img.src, info); + result.push(res); + } + else if (img.src.startsWith('data:image/')) { + const {blob, ext} = this.base64ToBlob(img.src); + if (!img.id) { + img.id = `local-img-${i}`; + } + const name = img.id + ext; + const res = await UploadImageToWx(blob, name, token); + if (res.errcode != 0) { + const msg = `上传图片失败: ${res.errcode} ${res.errmsg}`; + new Notice(msg); + console.error(msg); + continue; + } + const info = { + resUrl: '#' + img.id, + filePath: "", + url: res.url, + media_id: res.media_id, + }; + this.images.set('#' + img.id, info); + result.push(res); + } + } + return result; + } + + replaceImages(root: HTMLElement) { + const images = root.getElementsByTagName('img'); + for (let i = 0; i < images.length; i++) { + const img = images[i]; + let value = this.images.get(img.src); + if (value == null) { + if (!img.id) { + console.error('miss image id, ' + img.src); + continue; + } + value = this.images.get('#' + img.id); + } + if (value == null) continue; + if (value.url == null) continue; + img.setAttribute('src', value.url); + } + } + + arrayBufferToBase64(buffer: ArrayBuffer): string { + let binary = ''; + const bytes = new Uint8Array(buffer); + const len = bytes.byteLength; + for (let i = 0; i < len; i++) { + binary += String.fromCharCode(bytes[i]); + } + return btoa(binary); + } + + async localImagesToBase64(vault: Vault) { + const keys = this.images.keys(); + const result = new Map(); + for (let key of keys) { + const value = this.images.get(key); + if (value == null) continue; + const file = vault.getFileByPath(value.filePath); + if (file == null) continue; + let fileData = await vault.readBinary(file); + const base64 = this.arrayBufferToBase64(fileData); + const mimeType = this.getMimeType(file.extension); + const data = `data:${mimeType};base64,${base64}`; + result.set(value.resUrl, data); + } + return result; + } + + async downloadRemoteImage(url: string) { + try { + const rep = await requestUrl(url); + let data = rep.arrayBuffer; + let blob = new Blob([data]); + + let ext = this.getImageExtFromBlob(blob); + if (ext == '' || ext == null) { + const filename = this.getImageNameFromUrl(url, rep.headers['content-type']); + ext = '.' + filename.split('.').pop() || 'jpg'; + } + + const base64 = this.arrayBufferToBase64(data); + const mimeType = this.getMimeType(ext); + return `data:${mimeType};base64,${base64}`; + } + catch (e) { + console.error(e); + return ''; + } + } + + async remoteImagesToBase64(root: HTMLElement) { + const images = root.getElementsByTagName('img'); + const result = new Map(); + for (let i = 0; i < images.length; i++) { + const img = images[i]; + if (!img.src.startsWith('http')) continue; + const base64 = await this.downloadRemoteImage(img.src); + if (base64 == '') continue; + result.set(img.src, base64); + } + return result; + } + + async embleImages(root: HTMLElement, vault: Vault) { + const localImages = await this.localImagesToBase64(vault); + const remoteImages = await this.remoteImagesToBase64(root); + const result = root.cloneNode(true) as HTMLElement; + const images = result.getElementsByTagName('img'); + for (let i = 0; i < images.length; i++) { + const img = images[i]; + if (img.src.startsWith('http')) { + const base64 = remoteImages.get(img.src); + if (base64 != null) { + img.setAttribute('src', base64); + } + } + else { + const base64 = localImages.get(img.src); + if (base64 != null) { + img.setAttribute('src', base64); + } + } + } + return result.innerHTML; + } + + async cleanup() { + this.images.clear(); + } +} + + +export class LocalFile extends Extension{ + index: number = 0; + public static fileCache: Map = new Map(); + + generateId() { + this.index += 1; + return `fid-${this.index}`; + } + + getImagePath(path: string) { + const res = this.assetsManager.getResourcePath(path); + if (res == null) { + console.error('找不到文件:' + path); + return ''; + } + const info = { + resUrl: res.resUrl, + filePath: res.filePath, + media_id: null, + url: null + }; + LocalImageManager.getInstance().setImage(res.resUrl, info); + return res.resUrl; + } + + isImage(file: string) { + file = file.toLowerCase(); + return file.endsWith('.png') + || file.endsWith('.jpg') + || file.endsWith('.jpeg') + || file.endsWith('.gif') + || file.endsWith('.bmp') + || file.endsWith('.webp'); + } + + parseImageLink(link: string) { + if (link.includes('|')) { + const parts = link.split('|'); + const path = parts[0]; + if (!this.isImage(path)) return null; + + let width = null; + let height = null; + if (parts.length == 2) { + const size = parts[1].toLowerCase().split('x'); + width = parseInt(size[0]); + if (size.length == 2 && size[1] != '') { + height = parseInt(size[1]); + } + } + return { path, width, height }; + } + if (this.isImage(link)) { + return { path: link, width: null, height: null }; + } + return null; + } + + getHeaderLevel(line: string) { + const match = line.trimStart().match(/^#{1,6}/); + if (match) { + return match[0].length; + } + return 0; + } + + async getFileContent(file: TAbstractFile, header: string | null, block: string | null) { + const content = await this.app.vault.adapter.read(file.path); + if (header == null && block == null) { + return content; + } + + let result = ''; + const lines = content.split('\n'); + if (header) { + let level = 0; + let append = false; + for (let line of lines) { + if (append) { + if (level == this.getHeaderLevel(line)) { + break; + } + result += line + '\n'; + continue; + } + if (!line.trim().startsWith('#')) continue; + const items = line.trim().split(' '); + if (items.length != 2) continue; + if (header.trim() != items[1].trim()) continue; + if (this.getHeaderLevel(line)) { + result += line + '\n'; + level = this.getHeaderLevel(line); + append = true; + } + } + } + + function isStructuredBlock(line: string) { + const trimmed = line.trim(); + return trimmed.startsWith('-') || trimmed.startsWith('>') || trimmed.startsWith('|') || trimmed.match(/^\d+\./); + } + + if (block) { + let stopAtEmpty = false; + let totalLen = 0; + let structured = false; + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + if (line.indexOf(block) >= 0) { + result = line.replace(block, '').trim(); + + // 标记和结构化内容位于同一行的时候只返回当前的条目 + if (isStructuredBlock(line)) { + break; + } + + // 向上查找内容 + for (let j = i - 1; j >= 0; j--) { + const l = lines[j]; + + if (l.startsWith('#')) { + break; + } + + if (l.trim() == '') { + if (stopAtEmpty) break; + if (j < i - 1 && totalLen > 0) break; + stopAtEmpty = true; + result = l + '\n' + result; + continue; + } + else { + stopAtEmpty = true; + } + + if (structured && !isStructuredBlock(l)) { + break; + } + + if (totalLen === 0 && isStructuredBlock(l)) { + structured = true; + } + + totalLen += result.length; + result = l + '\n' + result; + } + break; + } + } + } + + return result; + } + + parseFileLink(link: string) { + const info = link.split('|')[0]; + const items = info.split('#'); + let path = items[0]; + let header = null; + let block = null; + if (items.length == 2) { + if (items[1].startsWith('^')) { + block = items[1]; + } else { + header = items[1]; + } + } + return { path, head: header, block }; + } + + async renderFile(link: string, id: string) { + let { path, head: header, block} = this.parseFileLink(link); + let file = null; + if (path === '') { + file = this.app.workspace.getActiveFile(); + } + else { + if (!path.endsWith('.md')) { + path = path + '.md'; + } + file = this.assetsManager.searchFile(path); + } + + if (file == null) { + const msg = '找不到文件:' + path; + console.error(msg) + return msg; + } + + let content = await this.getFileContent(file, header, block); + if (content.startsWith('---')) { + content = content.replace(/^(---)$.+?^(---)$.+?/ims, ''); + } + const body = await this.marked.parse(content); + return body; + } + + static async readBlob(src: string) { + return await fetch(src).then(response => response.blob()) + } + + static async getExcalidrawUrl(data: string) { + const url = 'https://obplugin.sunboshi.tech/math/excalidraw'; + const req = await requestUrl({ + url, + method: 'POST', + contentType: 'application/json', + headers: { + authkey: NMPSettings.getInstance().authKey + }, + body: JSON.stringify({ data }) + }); + + if (req.status != 200) { + console.error(req.status); + return null; + } + return req.json.url; + } + + parseLinkStyle(link: string) { + let filename = ''; + let style = 'style="width:100%;height:100%"'; + let postion = 'left'; + const postions = ['left', 'center', 'right']; + if (link.includes('|')) { + const items = link.split('|'); + filename = items[0]; + let size = ''; + if (items.length == 2) { + if (postions.includes(items[1])) { + postion = items[1]; + } + else { + size = items[1]; + } + } + else if (items.length == 3) { + size = items[1]; + if (postions.includes(items[1])) { + size = items[2]; + postion = items[1]; + } + else { + size = items[1]; + postion = items[2]; + } + } + if (size != '') { + const sizes = size.split('x'); + if (sizes.length == 2) { + style = `style="width:${sizes[0]}px;height:${sizes[1]}px;"` + } + else { + style = `style="width:${sizes[0]}px;"` + } + } + } + else { + filename = link; + } + return { filename, style, postion }; + } + + parseExcalidrawLink(link: string) { + let classname = 'note-embed-excalidraw-left'; + const postions = new Map([ + ['left', 'note-embed-excalidraw-left'], + ['center', 'note-embed-excalidraw-center'], + ['right', 'note-embed-excalidraw-right'] + ]) + + let {filename, style, postion} = this.parseLinkStyle(link); + classname = postions.get(postion) || classname; + + if(filename.endsWith('excalidraw') || filename.endsWith('excalidraw.md')) { + return { filename, style, classname }; + } + + return null; + } + + static async renderExcalidraw(html: string) { + try { + const src = await this.getExcalidrawUrl(html); + let svg = ''; + if (src === '') { + svg = '渲染失败'; + console.log('Failed to get Excalidraw URL'); + } + else { + const blob = await this.readBlob(src); + if (blob.type === 'image/svg+xml') { + svg = await blob.text(); + } + else { + svg = '暂不支持' + blob.type; + } + } + return svg; + } catch (error) { + console.error(error.message); + return '渲染失败:' + error.message; + } + } + + parseSVGLink(link: string) { + let classname = 'note-embed-svg-left'; + const postions = new Map([ + ['left', 'note-embed-svg-left'], + ['center', 'note-embed-svg-center'], + ['right', 'note-embed-svg-right'] + ]) + + let {filename, style, postion} = this.parseLinkStyle(link); + classname = postions.get(postion) || classname; + + return { filename, style, classname }; + } + + async renderSVGFile(filename: string, id: string) { + const file = this.assetsManager.searchFile(filename); + + if (file == null) { + const msg = '找不到文件:' + file; + console.error(msg) + return msg; + } + + const content = await this.getFileContent(file, null, null); + LocalFile.fileCache.set(filename, content); + return content; + } + + markedExtension(): MarkedExtension { + return { + async: true, + walkTokens: async (token: Tokens.Generic) => { + if (token.type !== 'LocalImage') { + return; + } + // 渲染本地图片 + let item = this.parseImageLink(token.href); + if (item) { + const src = this.getImagePath(item.path); + const width = item.width ? `width="${item.width}"` : ''; + const height = item.height? `height="${item.height}"` : ''; + token.html = `${token.text}`; + return; + } + + const info = this.parseExcalidrawLink(token.href); + if (info) { + if (!NMPSettings.getInstance().isAuthKeyVaild()) { + token.html = "请设置注册码"; + return; + } + const id = this.generateId(); + this.callback.cacheElement('excalidraw', id, token.raw); + token.html = `` + return; + } + + if (token.href.endsWith('.svg') || token.href.includes('.svg|')) { + const info = this.parseSVGLink(token.href); + const id = this.generateId(); + let svg = '渲染中'; + if (LocalFile.fileCache.has(info.filename)) { + svg = LocalFile.fileCache.get(info.filename) || '渲染失败'; + } + else { + svg = await this.renderSVGFile(info.filename, id) || '渲染失败'; + } + token.html = `${svg}` + return; + } + + const id = this.generateId(); + const content = await this.renderFile(token.href, id); + const tag = this.callback.settings.embedStyle === 'quote' ? 'blockquote' : 'section'; + token.html = `<${tag} class="note-embed-file" id="${id}">${content}` + }, + + extensions:[{ + name: 'LocalImage', + level: 'block', + start: (src: string) => { + const index = src.indexOf('![['); + if (index === -1) return; + return index; + }, + tokenizer: (src: string) => { + const matches = src.match(LocalFileRegex); + if (matches == null) return; + const token: Token = { + type: 'LocalImage', + raw: matches[0], + href: matches[1], + text: matches[1] + }; + return token; + }, + renderer: (token: Tokens.Generic) => { + return token.html; + } + }]}; + } +} \ No newline at end of file diff --git a/src/markdown/math.ts b/src/markdown/math.ts new file mode 100644 index 0000000..a7741b3 --- /dev/null +++ b/src/markdown/math.ts @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { MarkedExtension, Token, Tokens } from "marked"; +import { requestUrl } from "obsidian"; +import { Extension } from "./extension"; +import { NMPSettings } from "src/settings"; + +const inlineRule = /^(\${1,2})(?!\$)((?:\\.|[^\\\n])*?(?:\\.|[^\\\n\$]))\1/; +const blockRule = /^(\${1,2})\n((?:\\[^]|[^\\])+?)\n\1(?:\n|$)/; + +const svgCache = new Map(); + +export function cleanMathCache() { + svgCache.clear(); +} + +export class MathRendererQueue { + private host = 'https://obplugin.sunboshi.tech'; + private static instance: MathRendererQueue; + private mathIndex: number = 0; + + // 静态方法,用于获取实例 + public static getInstance(): MathRendererQueue { + if (!MathRendererQueue.instance) { + MathRendererQueue.instance = new MathRendererQueue(); + } + return MathRendererQueue.instance; + } + + private constructor() { + } + + async getMathSVG(expression: string, inline: boolean, type: string) { + try { + let success = false; + let path = ''; + if (type === 'asciimath') { + path = '/math/am'; + } + else { + path = '/math/tex'; + } + + const url = `${this.host}${path}`; + const res = await requestUrl({ + url, + method: 'POST', + contentType: 'application/json', + headers: { + authkey: NMPSettings.getInstance().authKey + }, + body: JSON.stringify({ + expression, + inline + }) + }) + let svg = '' + if (res.status === 200) { + svg = res.text; + success = true; + } + else { + console.error('render error: ' + res.json.msg) + svg = '渲染失败: ' + res.json.msg; + } + return { svg, success }; + } + catch (err) { + console.log(err.msg); + const svg = '渲染失败: ' + err.message; + return { svg, success: false }; + } + } + + generateId() { + this.mathIndex += 1; + return `math-id-${this.mathIndex}`; + } + + async render(token: Tokens.Generic, inline: boolean, type: string) { + if (!NMPSettings.getInstance().isAuthKeyVaild()) { + return '注册码无效或已过期'; + } + + const id = this.generateId(); + let svg = '渲染中'; + const expression = token.text; + if (svgCache.has(token.text)) { + svg = svgCache.get(expression) as string; + } + else { + const res = await this.getMathSVG(expression, inline, type) + if (res.success) { + svgCache.set(expression, res.svg); + } + svg = res.svg; + } + + const className = inline ? 'inline-math-svg' : 'block-math-svg'; + const body = inline ? svg : `
    ${svg}
    `; + return `${body}`; + } +} + + +export class MathRenderer extends Extension { + async renderer(token: Tokens.Generic, inline: boolean, type: string = '') { + if (type === '') { + type = this.settings.math; + } + return await MathRendererQueue.getInstance().render(token, inline, type); + } + + markedExtension(): MarkedExtension { + return { + async: true, + walkTokens: async (token: Tokens.Generic) => { + if (token.type === 'InlineMath' || token.type === 'BlockMath') { + token.html = await this.renderer(token, token.type === 'InlineMath', token.displayMode ? 'latex' : 'asciimath'); + } + }, + extensions: [ + this.inlineMath(), + this.blockMath() + ] + } + } + + inlineMath() { + return { + name: 'InlineMath', + level: 'inline', + start(src: string) { + let index; + let indexSrc = src; + + while (indexSrc) { + index = indexSrc.indexOf('$'); + if (index === -1) { + return; + } + + const possibleKatex = indexSrc.substring(index); + + if (possibleKatex.match(inlineRule)) { + return index; + } + + indexSrc = indexSrc.substring(index + 1).replace(/^\$+/, ''); + } + }, + tokenizer(src: string, tokens: Token[]) { + const match = src.match(inlineRule); + if (match) { + return { + type: 'InlineMath', + raw: match[0], + text: match[2].trim(), + displayMode: match[1].length === 2 + }; + } + }, + renderer: (token: Tokens.Generic) => { + return token.html; + } + } + } + blockMath() { + return { + name: 'BlockMath', + level: 'block', + tokenizer(src: string) { + const match = src.match(blockRule); + if (match) { + return { + type: 'BlockMath', + raw: match[0], + text: match[2].trim(), + displayMode: match[1].length === 2 + }; + } + }, + renderer: (token: Tokens.Generic) => { + return token.html; + } + }; + } +} diff --git a/src/markdown/parser.ts b/src/markdown/parser.ts new file mode 100644 index 0000000..ac4f153 --- /dev/null +++ b/src/markdown/parser.ts @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { Marked } from "marked"; +import { NMPSettings } from "src/settings"; +import { App, Vault } from "obsidian"; +import AssetsManager from "../assets"; +import { Extension, MDRendererCallback } from "./extension"; +import { Blockquote} from "./blockquote"; +import { CodeRenderer } from "./code"; +import { EmbedBlockMark } from "./embed-block-mark"; +import { SVGIcon } from "./icons"; +import { LinkRenderer } from "./link"; +import { LocalFile, LocalImageManager } from "./local-file"; +import { MathRenderer } from "./math"; +import { TextHighlight } from "./text-highlight"; +import { Comment } from "./commnet"; +import { Topic } from "./topic"; +import { HeadingRenderer } from "./heading"; +import { FootnoteRenderer } from "./footnote"; +import { EmptyLineRenderer } from "./empty-line"; +import { cleanUrl } from "../utils"; + + +const markedOptiones = { + gfm: true, + breaks: true, +}; + +const customRenderer = { + hr(): string { + return '
    '; + }, + list(body: string, ordered: boolean, start: number | ''): string { + const type = ordered ? 'ol' : 'ul'; + const startatt = (ordered && start !== 1) ? (' start="' + start + '"') : ''; + return '<' + type + startatt + ' class="list-paddingleft-1">' + body + ''; + }, + listitem(text: string, task: boolean, checked: boolean): string { + return `
  • ${text}
  • `; + }, + image(href: string, title: string | null, text: string): string { + const cleanHref = cleanUrl(href); + if (cleanHref === null) { + return text; + } + href = cleanHref; + + if (!href.startsWith('http')) { + const res = AssetsManager.getInstance().getResourcePath(decodeURI(href)); + if (res) { + href = res.resUrl; + const info = { + resUrl: res.resUrl, + filePath: res.filePath, + media_id: null, + url: null + }; + LocalImageManager.getInstance().setImage(res.resUrl, info); + } + } + let out = ''; + if (NMPSettings.getInstance().useFigcaption) { + out = `
    ${text} 0) { + out += `>
    ${text}
    `; + } + else { + out += '>' + } + } + else { + out = `${text} await ext.prepare()); + } + + async postprocess(html: string) { + let result = html; + for (let ext of this.extensions) { + result = await ext.postprocess(result); + } + return result; + } + + async parse(content: string) { + if (!this.marked) await this.buildMarked(); + await this.prepare(); + let html = await this.marked.parse(content); + html = await this.postprocess(html); + return html; + } +} diff --git a/src/markdown/text-highlight.ts b/src/markdown/text-highlight.ts new file mode 100644 index 0000000..e6f16cb --- /dev/null +++ b/src/markdown/text-highlight.ts @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { Token, Tokens, Lexer, MarkedExtension } from "marked"; +import { Extension } from "./extension"; + +const highlightRegex = /^==(.*?)==/; + +export class TextHighlight extends Extension { + markedExtension(): MarkedExtension { + return { + extensions: [{ + name: 'InlineHighlight', + level: 'inline', + start(src: string) { + let index; + let indexSrc = src; + + while (indexSrc) { + index = indexSrc.indexOf('=='); + if (index === -1) return; + return index; + } + }, + tokenizer(src: string, tokens: Token[]) { + const match = src.match(highlightRegex); + if (match) { + return { + type: 'InlineHighlight', + raw: match[0], + text: match[1], + }; + } + }, + renderer(token: Tokens.Generic) { + const lexer = new Lexer(); + const tokens = lexer.lex(token.text); + // TODO: 优化一下 + let body = this.parser.parse(tokens) + body = body.replace('

    ', '') + body = body.replace('

    ', '') + return `${body}`; + } + }] + }; + } +} \ No newline at end of file diff --git a/src/markdown/topic.ts b/src/markdown/topic.ts new file mode 100644 index 0000000..82a7cf9 --- /dev/null +++ b/src/markdown/topic.ts @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { Tokens, MarkedExtension } from "marked"; +import { Extension } from "./extension"; + +const topicRegex = /^#([^\s#]+)/; + +export class Topic extends Extension { + markedExtension(): MarkedExtension { + return { + extensions: [{ + name: 'Topic', + level: 'inline', + start(src: string) { + let index; + let indexSrc = src; + + while (indexSrc) { + index = indexSrc.indexOf('#'); + if (index === -1) return; + return index; + } + }, + tokenizer(src: string) { + const match = src.match(topicRegex); + if (match) { + return { + type: 'Topic', + raw: match[0], + text: match[1], + }; + } + }, + renderer(token: Tokens.Generic) { + return `${'#' + token.text.trim()}`; + } + }, + ] + } + } +} \ No newline at end of file diff --git a/src/markdown/widget-box.ts b/src/markdown/widget-box.ts new file mode 100644 index 0000000..f91ee5a --- /dev/null +++ b/src/markdown/widget-box.ts @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { Tokens, MarkedExtension } from "marked"; +import { Extension } from "./extension"; +import { NMPSettings } from "src/settings"; +import { uevent } from "src/utils"; +import { wxWidget } from "src/weixin-api"; + +const widgetCache = new Map(); + +export function cleanWidgetCache() { + widgetCache.clear(); +} + +export class WidgetBox extends Extension { + mapToString(map: Map): string { + if (map.size === 0) return ""; + + return Array.from(map.entries()) + .map(([key, value]) => `${key}=${value}`) + .join("&"); // 用 "&" 连接键值对,可换成其他分隔符 + } + + calcKey(id: string, title: string, style: Map, content: string) { + const styleStr = this.mapToString(style); + const key = `${id}-${title}-${styleStr}-${content}`; + return key; + } + + cacheWidget(id: string, title: string, style: Map, content: string, result: string) { + const key = this.calcKey(id, title, style, content); + widgetCache.set(key, result); + } + + getWidget(id: string, title: string, style: Map, content: string) { + const key = this.calcKey(id, title, style, content); + if (!widgetCache.has(key)) { + return null; + } + return widgetCache.get(key); + } + + getBoxTitle(text: string) { + let start = text.indexOf(']') + 1; + let end = text.indexOf('\n'); + if (end === -1) end = text.length; + if (start >= end) return ''; + return text.slice(start, end).trim(); + } + + getBoxId(text: string) { + const regex = /\[#(.*?)\]/g; + let m; + if( m = regex.exec(text)) { + return m[1]; + } + return ""; + } + matched(text: string) { + return this.getBoxId(text) != ""; + } + + parseStyle(text: string) { + const style = text.split(':').map((s) => s.trim()); + if (style.length != 2) return null; + const key = style[0]; + const value = style[1]; + return {key, value}; + } + + parseBox(text: string) { + const lines = text.split('\n'); + let style = new Map(); + let content = []; + let isStyle = false; + for (let line of lines) { + if (line === '===') { + isStyle = !isStyle; + continue; + } + if (isStyle) { + const s = this.parseStyle(line); + if (s) style.set(s.key, s.value); + } else { + content.push(line); + } + } + const contentStr = content.join('\n'); + return { style, contentStr }; + } + + async reqContent(id: string, title: string, style: Map, content: string) { + const params = JSON.stringify({ + id, + title, + style: Object.fromEntries(style), + content + }); + return wxWidget(NMPSettings.getInstance().authKey, params) + } + + processColor(style: Map) { + const keys = style.keys(); + for (let key of keys) { + if (key.includes('color')) { + const value = style.get(key); + if (!value) continue; + if (value.startsWith('rgb') || value.startsWith('#')) { + continue; + } + style.set(key, '#' + value); + } + } + } + + async renderer(token: Tokens.Blockquote) { + let boxId = this.getBoxId(token.text); + if (boxId == '') { + const body = this.marked.parser(token.tokens); + return `
    ${body}
    `;; + } + + const title = this.getBoxTitle(token.text); + let style = new Map(); + let content = ''; + const index = token.text.indexOf('\n'); + if (index > 0) { + const pared = this.parseBox(token.text.slice(index + 1)) + style = pared.style; + content = await this.marked.parse(pared.contentStr); + } + + this.processColor(style); + + const cached = this.getWidget(boxId, title, style, content); + if (cached) { + uevent('render-widgets-cached'); + return cached; + } + else { + const reqContent = await this.reqContent(boxId, title, style, content); + this.cacheWidget(boxId, title, style, content, reqContent); + uevent('render-widgets'); + return reqContent; + } + } + + markedExtension(): MarkedExtension { + return { + extensions: [{ + name: 'blockquote', + level: 'block', + renderer: (token: Tokens.Generic) => { + return token.html; + }, + }] + } + } +} \ No newline at end of file diff --git a/src/meta/index.ts b/src/meta/index.ts new file mode 100644 index 0000000..5d12baf --- /dev/null +++ b/src/meta/index.ts @@ -0,0 +1,76 @@ +// [note-to-mp 重构] 元数据与封面模块 +import { LocalImage } from '../image'; + +export interface WeChatMetaRaw { + title?: string; + author?: string; + coverLink?: string; // frontmatter 或行内指定的图片 basename 形式 + rawImage?: string; // 原 frontmatter 中的 image 字段原始值(可包含路径) + hasFrontmatter: boolean; +} + +export interface FinalMeta { + title: string; + author?: string; + coverImage?: LocalImage; // 解析到的封面图片对象 + coverLink?: string; // 决策后的封面 basename +} + +const FRONTMATTER_RE = /^---[\s\S]*?\n---/; + +export function extractWeChatMeta(raw: string): { meta: WeChatMetaRaw; body: string } { + const fmMatch = raw.match(FRONTMATTER_RE); + if (!fmMatch) { + return { meta: { hasFrontmatter: false }, body: raw }; + } + const block = fmMatch[0]; + const lines = block.split(/\r?\n/).slice(1, -1); // 去除首尾 --- + let title: string | undefined; + let author: string | undefined; + let image: string | undefined; + + for (const line of lines) { + const m = line.match(/^([a-zA-Z0-9_-]+)\s*:\s*(.*)$/); + if (!m) continue; + const key = m[1].toLowerCase(); + let val = m[2].trim(); + // 去除包裹引号 + if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) { + val = val.slice(1, -1); + } + if (key === 'title') title = val; + else if (key === 'author') author = val; + else if (key === 'image' || key === 'cover') image = val; + } + + let coverLink: string | undefined; + if (image) { + const basename = image.split(/[?#]/)[0].split('/').pop() || image; + coverLink = basename; + } + + const body = raw.slice(block.length).replace(/^\s+/, ''); + return { meta: { title, author, coverLink, rawImage: image, hasFrontmatter: true }, body }; +} + +export function getMetadata(images: LocalImage[], rawMeta: WeChatMetaRaw): FinalMeta { + // 标题回退策略:若无 frontmatter title,尝试第一行一级标题 + let title = rawMeta.title; + if (!title) { + // 简单取第一行 markdown 一级/二级标题 + // 实际调用方可传入 body 再做改进;这里保持接口简单 + title = '未命名文章'; + } + + let coverLink = rawMeta.coverLink; + let coverImage: LocalImage | undefined; + if (coverLink) { + coverImage = images.find(img => img.basename === coverLink); + } + if (!coverImage) { + coverImage = images[0]; + coverLink = coverImage?.basename; + } + + return { title, author: rawMeta.author, coverImage, coverLink }; +} diff --git a/src/note-preview.ts b/src/note-preview.ts new file mode 100644 index 0000000..1029d68 --- /dev/null +++ b/src/note-preview.ts @@ -0,0 +1,569 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { EventRef, ItemView, Workspace, WorkspaceLeaf, Notice, Platform, TFile, TFolder, TAbstractFile, Plugin } from 'obsidian'; +import { uevent, debounce, waitForLayoutReady } from './utils'; +// [note-to-mp 重构] 引入新渲染管线 +import { RenderService, RenderedArticle } from './render'; +import { NMPSettings } from './settings'; +import AssetsManager from './assets'; +import { MarkedParser } from './markdown/parser'; +import { LocalImageManager, LocalFile } from './markdown/local-file'; +import { CardDataManager } from './markdown/code'; +import { ArticleRender } from './article-render'; + + +export const VIEW_TYPE_NOTE_PREVIEW = 'note-preview'; + +export class NotePreview extends ItemView { + workspace: Workspace; + plugin: Plugin; + mainDiv: HTMLDivElement; + toolbar: HTMLDivElement; + renderDiv: HTMLDivElement; + articleDiv: HTMLDivElement; + styleEl: HTMLElement; + coverEl: HTMLInputElement; + useDefaultCover: HTMLInputElement; + useLocalCover: HTMLInputElement; + msgView: HTMLDivElement; + wechatSelect: HTMLSelectElement; + themeSelect: HTMLSelectElement; + highlightSelect: HTMLSelectElement; + listeners?: EventRef[]; + container: Element; + settings: NMPSettings; + assetsManager: AssetsManager; + articleHTML: string; + title: string; + currentFile?: TFile; + currentTheme: string; + currentHighlight: string; + currentAppId: string; + markedParser: MarkedParser; + cachedElements: Map = new Map(); + _articleRender: ArticleRender | null = null; + isCancelUpload: boolean = false; + isBatchRuning: boolean = false; + // [note-to-mp 重构] 新渲染服务实例与最近一次渲染结果 + newRenderService: RenderService | null = null; + lastArticle?: RenderedArticle; + + + constructor(leaf: WorkspaceLeaf, plugin: Plugin) { + super(leaf); + this.workspace = this.app.workspace; + this.plugin = plugin; + this.settings = NMPSettings.getInstance(); + this.assetsManager = AssetsManager.getInstance(); + this.currentTheme = this.settings.defaultStyle; + this.currentHighlight = this.settings.defaultHighlight; + } + + getViewType() { + return VIEW_TYPE_NOTE_PREVIEW; + } + + getIcon() { + return 'clipboard-paste'; + } + + getDisplayText() { + return '笔记预览'; + } + + get render() { + if (!this._articleRender) { + this._articleRender = new ArticleRender(this.app, this, this.styleEl, this.articleDiv); + this._articleRender.currentTheme = this.currentTheme; + this._articleRender.currentHighlight = this.currentHighlight; + } + return this._articleRender; + } + + async onOpen() { + this.viewLoading(); + this.setup(); + uevent('open'); + } + + async setup() { + await waitForLayoutReady(this.app); + + if (!this.settings.isLoaded) { + const data = await this.plugin.loadData(); + NMPSettings.loadSettings(data); + } + if (!this.assetsManager.isLoaded) { + await this.assetsManager.loadAssets(); + } + + this.buildUI(); + // [note-to-mp 重构] 初始化新渲染服务 + this.newRenderService = new RenderService(this.app); + this.listeners = [ + this.workspace.on('file-open', () => { + this.update(); + }), + this.app.vault.on("modify", (file) => { + if (this.currentFile?.path == file.path) { + this.renderMarkdown(); + } + } ) + ]; + + this.renderMarkdown(); + } + + async onClose() { + this.listeners?.forEach(listener => this.workspace.offref(listener)); + LocalFile.fileCache.clear(); + uevent('close'); + } + + onAppIdChanged() { + // 清理上传过的图片 + this.cleanArticleData(); + } + + async update() { + if (this.isBatchRuning) { + return; + } + this.cleanArticleData(); + this.renderMarkdown(); + } + + cleanArticleData() { + LocalImageManager.getInstance().cleanup(); + CardDataManager.getInstance().cleanup(); + } + + buildMsgView(parent: HTMLDivElement) { + this.msgView = parent.createDiv({ cls: 'msg-view' }); + const title = this.msgView.createDiv({ cls: 'msg-title' }); + title.id = 'msg-title'; + title.innerText = '加载中...'; + const okBtn = this.msgView.createEl('button', { cls: 'msg-ok-btn' }, async (button) => { + + }); + okBtn.id = 'msg-ok-btn'; + okBtn.innerText = '确定'; + okBtn.onclick = async () => { + this.msgView.setAttr('style', 'display: none;'); + } + const cancelBtn = this.msgView.createEl('button', { cls: 'msg-ok-btn' }, async (button) => { + }); + cancelBtn.id = 'msg-cancel-btn'; + cancelBtn.innerText = '取消'; + cancelBtn.onclick = async () => { + this.isCancelUpload = true; + this.msgView.setAttr('style', 'display: none;'); + } + } + + showLoading(msg: string, cancelable: boolean = false) { + const title = this.msgView.querySelector('#msg-title') as HTMLElement; + title!.innerText = msg; + const btn = this.msgView.querySelector('#msg-ok-btn') as HTMLElement; + btn.setAttr('style', 'display: none;'); + this.msgView.setAttr('style', 'display: flex;'); + const cancelBtn = this.msgView.querySelector('#msg-cancel-btn') as HTMLElement; + cancelBtn.setAttr('style', cancelable ? 'display: block;': 'display: none;'); + this.msgView.setAttr('style', 'display: flex;'); + } + + showMsg(msg: string) { + const title = this.msgView.querySelector('#msg-title') as HTMLElement; + title!.innerText = msg; + const btn = this.msgView.querySelector('#msg-ok-btn') as HTMLElement; + btn.setAttr('style', 'display: block;'); + this.msgView.setAttr('style', 'display: flex;'); + const cancelBtn = this.msgView.querySelector('#msg-cancel-btn') as HTMLElement; + cancelBtn.setAttr('style', 'display: none;'); + this.msgView.setAttr('style', 'display: flex;'); + } + + buildToolbar(parent: HTMLDivElement) { + this.toolbar = parent.createDiv({ cls: 'preview-toolbar' }); + let lineDiv; + + // 公众号 + if (this.settings.wxInfo.length > 1 || Platform.isDesktop) { + lineDiv = this.toolbar.createDiv({ cls: 'toolbar-line' }); + lineDiv.createDiv({ cls: 'style-label' }).innerText = '公众号:'; + const wxSelect = lineDiv.createEl('select', { cls: 'style-select' }) + wxSelect.setAttr('style', 'width: 200px'); + wxSelect.onchange = async () => { + this.currentAppId = wxSelect.value; + this.onAppIdChanged(); + } + const defautlOp =wxSelect.createEl('option'); + defautlOp.value = ''; + defautlOp.text = '请在设置里配置公众号'; + for (let i = 0; i < this.settings.wxInfo.length; i++) { + const op = wxSelect.createEl('option'); + const wx = this.settings.wxInfo[i]; + op.value = wx.appid; + op.text = wx.name; + if (i== 0) { + op.selected = true + this.currentAppId = wx.appid; + } + } + this.wechatSelect = wxSelect; + + if (Platform.isDesktop) { + const openBtn = lineDiv.createEl('button', { cls: 'refresh-button' }, async (button) => { + button.setText('去公众号后台'); + }) + + openBtn.onclick = async () => { + const { shell } = require('electron'); + shell.openExternal('https://mp.weixin.qq.com') + uevent('open-mp'); + } + } + } + else if (this.settings.wxInfo.length > 0) { + this.currentAppId = this.settings.wxInfo[0].appid; + } + + // 复制,刷新,带图片复制,发草稿箱 + lineDiv = this.toolbar.createDiv({ cls: 'toolbar-line' }); + const refreshBtn = lineDiv.createEl('button', { cls: 'refresh-button' }, async (button) => { + button.setText('刷新'); + }) + + refreshBtn.onclick = async () => { + await this.assetsManager.loadCustomCSS(); + await this.assetsManager.loadExpertSettings(); + this.render.reloadStyle(); + await this.renderMarkdown(); + uevent('refresh'); + } + if (Platform.isDesktop) { + const copyBtn = lineDiv.createEl('button', { cls: 'copy-button' }, async (button) => { + button.setText('复制'); + }) + + copyBtn.onclick = async() => { + try { + await this.render.copyArticle(); + new Notice('复制成功,请到公众号编辑器粘贴。'); + uevent('copy'); + } catch (error) { + console.error(error); + new Notice('复制失败: ' + error); + } + } + } + + const uploadImgBtn = lineDiv.createEl('button', { cls: 'copy-button' }, async (button) => { + button.setText('上传图片'); + }) + + uploadImgBtn.onclick = async() => { + await this.uploadImages(); + uevent('upload'); + } + + const postBtn = lineDiv.createEl('button', { cls: 'copy-button' }, async (button) => { + button.setText('发草稿'); + }) + + postBtn.onclick = async() => { + await this.postArticle(); + uevent('pub'); + } + + const imagesBtn = lineDiv.createEl('button', { cls: 'copy-button' }, async (button) => { + button.setText('图片/文字'); + }) + + imagesBtn.onclick = async() => { + await this.postImages(); + uevent('pub-images'); + } + + if (Platform.isDesktop && this.settings.isAuthKeyVaild()) { + const htmlBtn = lineDiv.createEl('button', { cls: 'copy-button' }, async (button) => { + button.setText('导出HTML'); + }) + + htmlBtn.onclick = async() => { + await this.exportHTML(); + uevent('export-html'); + } + } + + + // 封面 + lineDiv = this.toolbar.createDiv({ cls: 'toolbar-line' }); + + const coverTitle = lineDiv.createDiv({ cls: 'style-label' }); + coverTitle.innerText = '封面:'; + + this.useDefaultCover = lineDiv.createEl('input', { cls: 'input-style' }); + this.useDefaultCover.setAttr('type', 'radio'); + this.useDefaultCover.setAttr('name', 'cover'); + this.useDefaultCover.setAttr('value', 'default'); + this.useDefaultCover.setAttr('checked', true); + this.useDefaultCover.id = 'default-cover'; + this.useDefaultCover.onchange = async () => { + if (this.useDefaultCover.checked) { + this.coverEl.setAttr('style', 'visibility:hidden;width:0px;'); + } + else { + this.coverEl.setAttr('style', 'visibility:visible;width:180px;'); + } + } + const defaultLable = lineDiv.createEl('label'); + defaultLable.innerText = '默认'; + defaultLable.setAttr('for', 'default-cover'); + + this.useLocalCover = lineDiv.createEl('input', { cls: 'input-style' }); + this.useLocalCover.setAttr('type', 'radio'); + this.useLocalCover.setAttr('name', 'cover'); + this.useLocalCover.setAttr('value', 'local'); + this.useLocalCover.id = 'local-cover'; + this.useLocalCover.setAttr('style', 'margin-left:20px;'); + this.useLocalCover.onchange = async () => { + if (this.useLocalCover.checked) { + this.coverEl.setAttr('style', 'visibility:visible;width:180px;'); + } + else { + this.coverEl.setAttr('style', 'visibility:hidden;width:0px;'); + } + } + + const localLabel = lineDiv.createEl('label'); + localLabel.setAttr('for', 'local-cover'); + localLabel.innerText = '上传'; + + this.coverEl = lineDiv.createEl('input', { cls: 'upload-input' }); + this.coverEl.setAttr('type', 'file'); + this.coverEl.setAttr('placeholder', '封面图片'); + this.coverEl.setAttr('accept', '.png, .jpg, .jpeg'); + this.coverEl.setAttr('name', 'cover'); + this.coverEl.id = 'cover-input'; + + // 样式 + if (this.settings.showStyleUI) { + lineDiv = this.toolbar.createDiv({ cls: 'toolbar-line' }); + const cssStyle = lineDiv.createDiv({ cls: 'style-label' }); + cssStyle.innerText = '样式:'; + + const selectBtn = lineDiv.createEl('select', { cls: 'style-select' }, async (sel) => { + + }) + + selectBtn.onchange = async () => { + this.currentTheme = selectBtn.value; + this.render.updateStyle(selectBtn.value); + } + + for (let s of this.assetsManager.themes) { + const op = selectBtn.createEl('option'); + op.value = s.className; + op.text = s.name; + op.selected = s.className == this.settings.defaultStyle; + } + + this.themeSelect = selectBtn; + + const highlightStyle = lineDiv.createDiv({ cls: 'style-label' }); + highlightStyle.innerText = '代码高亮:'; + + const highlightStyleBtn = lineDiv.createEl('select', { cls: 'style-select' }, async (sel) => { + + }) + + highlightStyleBtn.onchange = async () => { + this.currentHighlight = highlightStyleBtn.value; + this.render.updateHighLight(highlightStyleBtn.value); + } + + for (let s of this.assetsManager.highlights) { + const op = highlightStyleBtn.createEl('option'); + op.value = s.name; + op.text = s.name; + op.selected = s.name == this.settings.defaultHighlight; + } + + this.highlightSelect = highlightStyleBtn; + } + + this.buildMsgView(this.toolbar); + } + + async buildUI() { + this.container = this.containerEl.children[1]; + this.container.empty(); + + this.mainDiv = this.container.createDiv({ cls: 'note-preview' }); + + this.buildToolbar(this.mainDiv); + + this.renderDiv = this.mainDiv.createDiv({cls: 'render-div'}); + this.renderDiv.id = 'render-div'; + this.renderDiv.setAttribute('style', '-webkit-user-select: text; user-select: text;'); + this.styleEl = this.renderDiv.createEl('style'); + this.styleEl.setAttr('title', 'note-to-mp-style'); + this.articleDiv = this.renderDiv.createEl('div'); + } + + async viewLoading() { + const container = this.containerEl.children[1] + container.empty(); + const loading = container.createDiv({cls: 'loading-wrapper'}) + loading.createDiv({cls: 'loading-spinner'}) + } + + async renderMarkdown(af: TFile | null = null) { + if (!af) { + af = this.app.workspace.getActiveFile(); + } + if (!af || af.extension.toLocaleLowerCase() !== 'md') { + return; + } + this.currentFile = af; + // [note-to-mp 重构] 使用新渲染服务进行渲染 + if (this.newRenderService) { + try { + const article = await this.newRenderService.renderFile(af); + this.lastArticle = article; + if (this.articleDiv) { + this.articleDiv.empty(); + const wrap = this.articleDiv.createDiv(); + wrap.innerHTML = article.html; + } + // 元数据适配(当前新 meta 不含 appid/theme/highlight,保持现有选择状态) + if (this.wechatSelect) { + this.wechatSelect.value = this.currentAppId || ''; + } + if (this.themeSelect) { + this.themeSelect.value = this.currentTheme; + } + if (this.highlightSelect) { + this.highlightSelect.value = this.currentHighlight; + } + } catch (e) { + console.error('[note-to-mp 重构] 渲染失败', e); + new Notice('渲染失败: ' + e.message); + } + } else { + // 兜底:仍使用旧渲染 + await this.render.renderMarkdown(af); + } + } + + async uploadImages() { + this.showLoading('图片上传中...'); + try { + await this.render.uploadImages(this.currentAppId); + this.showMsg('图片上传成功,并且文章内容已复制,请到公众号编辑器粘贴。'); + } catch (error) { + this.showMsg('图片上传失败: ' + error.message); + } + } + + async postArticle() { + let localCover = null; + if (this.useLocalCover.checked) { + const fileInput = this.coverEl; + if (!fileInput.files || fileInput.files.length === 0) { + this.showMsg('请选择封面文件'); + return; + } + localCover = fileInput.files[0]; + if (!localCover) { + this.showMsg('请选择封面文件'); + return; + } + } + this.showLoading('发布中...'); + try { + await this.render.postArticle(this.currentAppId, localCover); + this.showMsg('发布成功'); + } + catch (error) { + this.showMsg('发布失败: ' + error.message); + } + } + + async postImages() { + this.showLoading('发布图片中...'); + try { + await this.render.postImages(this.currentAppId); + this.showMsg('图片发布成功'); + } catch (error) { + this.showMsg('图片发布失败: ' + error.message); + } + } + + async exportHTML() { + this.showLoading('导出HTML中...'); + try { + await this.render.exportHTML(); + this.showMsg('HTML导出成功'); + } catch (error) { + this.showMsg('HTML导出失败: ' + error.message); + } + } + + async batchPost(folder: TFolder) { + const files = folder.children.filter((child: TAbstractFile) => child.path.toLocaleLowerCase().endsWith('.md')); + if (!files) { + new Notice('没有可渲染的笔记或文件不支持渲染'); + return; + } + + this.isCancelUpload = false; + this.isBatchRuning = true; + + try { + for (let file of files) { + this.showLoading(`即将发布: ${file.name}`, true); + await sleep(5000); + if (this.isCancelUpload) { + break; + } + this.cleanArticleData(); + await this.renderMarkdown(file as TFile); + await this.postArticle(); + } + + if (!this.isCancelUpload) { + this.showMsg(`批量发布完成:成功发布 ${files.length} 篇笔记`); + } + } + catch (e) { + console.error(e); + new Notice('批量发布失败: ' + e.message); + } + finally { + this.isBatchRuning = false; + this.isCancelUpload = false; + } + } +} \ No newline at end of file diff --git a/src/postcss/at-rule.d.ts b/src/postcss/at-rule.d.ts new file mode 100644 index 0000000..9fc375f --- /dev/null +++ b/src/postcss/at-rule.d.ts @@ -0,0 +1,140 @@ +import Container, { + ContainerProps, + ContainerWithChildren +} from './container.js' + +declare namespace AtRule { + export interface AtRuleRaws extends Record { + /** + * The space symbols after the last child of the node to the end of the node. + */ + after?: string + + /** + * The space between the at-rule name and its parameters. + */ + afterName?: string + + /** + * The space symbols before the node. It also stores `*` + * and `_` symbols before the declaration (IE hack). + */ + before?: string + + /** + * The symbols between the last parameter and `{` for rules. + */ + between?: string + + /** + * The rule’s selector with comments. + */ + params?: { + raw: string + value: string + } + + /** + * Contains `true` if the last child has an (optional) semicolon. + */ + semicolon?: boolean + } + + export interface AtRuleProps extends ContainerProps { + /** Name of the at-rule. */ + name: string + /** Parameters following the name of the at-rule. */ + params?: number | string + /** Information used to generate byte-to-byte equal node string as it was in the origin input. */ + raws?: AtRuleRaws + } + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { AtRule_ as default } +} + +/** + * Represents an at-rule. + * + * ```js + * Once (root, { AtRule }) { + * let media = new AtRule({ name: 'media', params: 'print' }) + * media.append(…) + * root.append(media) + * } + * ``` + * + * If it’s followed in the CSS by a `{}` block, this node will have + * a nodes property representing its children. + * + * ```js + * const root = postcss.parse('@charset "UTF-8"; @media print {}') + * + * const charset = root.first + * charset.type //=> 'atrule' + * charset.nodes //=> undefined + * + * const media = root.last + * media.nodes //=> [] + * ``` + */ +declare class AtRule_ extends Container { + /** + * The at-rule’s name immediately follows the `@`. + * + * ```js + * const root = postcss.parse('@media print {}') + * const media = root.first + * media.name //=> 'media' + * ``` + */ + get name(): string + set name(value: string) + + /** + * An array containing the layer’s children. + * + * ```js + * const root = postcss.parse('@layer example { a { color: black } }') + * const layer = root.first + * layer.nodes.length //=> 1 + * layer.nodes[0].selector //=> 'a' + * ``` + * + * Can be `undefinded` if the at-rule has no body. + * + * ```js + * const root = postcss.parse('@layer a, b, c;') + * const layer = root.first + * layer.nodes //=> undefined + * ``` + */ + nodes: Container['nodes'] + /** + * The at-rule’s parameters, the values that follow the at-rule’s name + * but precede any `{}` block. + * + * ```js + * const root = postcss.parse('@media print, screen {}') + * const media = root.first + * media.params //=> 'print, screen' + * ``` + */ + get params(): string + set params(value: string) + parent: ContainerWithChildren | undefined + + raws: AtRule.AtRuleRaws + + type: 'atrule' + + constructor(defaults?: AtRule.AtRuleProps) + assign(overrides: AtRule.AtRuleProps | object): this + clone(overrides?: Partial): AtRule + cloneAfter(overrides?: Partial): AtRule + cloneBefore(overrides?: Partial): AtRule +} + +declare class AtRule extends AtRule_ {} + +export = AtRule diff --git a/src/postcss/comment.d.ts b/src/postcss/comment.d.ts new file mode 100644 index 0000000..8b0a7a2 --- /dev/null +++ b/src/postcss/comment.d.ts @@ -0,0 +1,68 @@ +import Container from './container.js' +import Node, { NodeProps } from './node.js' + +declare namespace Comment { + export interface CommentRaws extends Record { + /** + * The space symbols before the node. + */ + before?: string + + /** + * The space symbols between `/*` and the comment’s text. + */ + left?: string + + /** + * The space symbols between the comment’s text. + */ + right?: string + } + + export interface CommentProps extends NodeProps { + /** Information used to generate byte-to-byte equal node string as it was in the origin input. */ + raws?: CommentRaws + /** Content of the comment. */ + text: string + } + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { Comment_ as default } +} + +/** + * It represents a class that handles + * [CSS comments](https://developer.mozilla.org/en-US/docs/Web/CSS/Comments) + * + * ```js + * Once (root, { Comment }) { + * const note = new Comment({ text: 'Note: …' }) + * root.append(note) + * } + * ``` + * + * Remember that CSS comments inside selectors, at-rule parameters, + * or declaration values will be stored in the `raws` properties + * explained above. + */ +declare class Comment_ extends Node { + parent: Container | undefined + raws: Comment.CommentRaws + /** + * The comment's text. + */ + get text(): string + set text(value: string) + + type: 'comment' + + constructor(defaults?: Comment.CommentProps) + assign(overrides: Comment.CommentProps | object): this + clone(overrides?: Partial): Comment + cloneAfter(overrides?: Partial): Comment + cloneBefore(overrides?: Partial): Comment +} + +declare class Comment extends Comment_ {} + +export = Comment diff --git a/src/postcss/container.d.ts b/src/postcss/container.d.ts new file mode 100644 index 0000000..d16b85d --- /dev/null +++ b/src/postcss/container.d.ts @@ -0,0 +1,490 @@ +import AtRule from './at-rule.js' +import Comment from './comment.js' +import Declaration from './declaration.js' +import Node, { ChildNode, ChildProps, NodeProps } from './node.js' +import Rule from './rule.js' + +declare namespace Container { + export class ContainerWithChildren< + Child extends Node = ChildNode + > extends Container_ { + nodes: Child[] + } + + export interface ValueOptions { + /** + * String that’s used to narrow down values and speed up the regexp search. + */ + fast?: string + + /** + * An array of property names. + */ + props?: string[] + } + + export interface ContainerProps extends NodeProps { + nodes?: (ChildNode | ChildProps)[] + } + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { Container_ as default } +} + +/** + * The `Root`, `AtRule`, and `Rule` container nodes + * inherit some common methods to help work with their children. + * + * Note that all containers can store any content. If you write a rule inside + * a rule, PostCSS will parse it. + */ +declare abstract class Container_ extends Node { + /** + * An array containing the container’s children. + * + * ```js + * const root = postcss.parse('a { color: black }') + * root.nodes.length //=> 1 + * root.nodes[0].selector //=> 'a' + * root.nodes[0].nodes[0].prop //=> 'color' + * ``` + */ + nodes: Child[] | undefined + + /** + * Inserts new nodes to the end of the container. + * + * ```js + * const decl1 = new Declaration({ prop: 'color', value: 'black' }) + * const decl2 = new Declaration({ prop: 'background-color', value: 'white' }) + * rule.append(decl1, decl2) + * + * root.append({ name: 'charset', params: '"UTF-8"' }) // at-rule + * root.append({ selector: 'a' }) // rule + * rule.append({ prop: 'color', value: 'black' }) // declaration + * rule.append({ text: 'Comment' }) // comment + * + * root.append('a {}') + * root.first.append('color: black; z-index: 1') + * ``` + * + * @param nodes New nodes. + * @return This node for methods chain. + */ + append( + ...nodes: ( + | ChildProps + | ChildProps[] + | Node + | Node[] + | string + | string[] + | undefined + )[] + ): this + + assign(overrides: Container.ContainerProps | object): this + clone(overrides?: Partial): Container + cloneAfter(overrides?: Partial): Container + cloneBefore(overrides?: Partial): Container + + /** + * Iterates through the container’s immediate children, + * calling `callback` for each child. + * + * Returning `false` in the callback will break iteration. + * + * This method only iterates through the container’s immediate children. + * If you need to recursively iterate through all the container’s descendant + * nodes, use `Container#walk`. + * + * Unlike the for `{}`-cycle or `Array#forEach` this iterator is safe + * if you are mutating the array of child nodes during iteration. + * PostCSS will adjust the current index to match the mutations. + * + * ```js + * const root = postcss.parse('a { color: black; z-index: 1 }') + * const rule = root.first + * + * for (const decl of rule.nodes) { + * decl.cloneBefore({ prop: '-webkit-' + decl.prop }) + * // Cycle will be infinite, because cloneBefore moves the current node + * // to the next index + * } + * + * rule.each(decl => { + * decl.cloneBefore({ prop: '-webkit-' + decl.prop }) + * // Will be executed only for color and z-index + * }) + * ``` + * + * @param callback Iterator receives each node and index. + * @return Returns `false` if iteration was broke. + */ + each( + callback: (node: Child, index: number) => false | void + ): false | undefined + + /** + * Returns `true` if callback returns `true` + * for all of the container’s children. + * + * ```js + * const noPrefixes = rule.every(i => i.prop[0] !== '-') + * ``` + * + * @param condition Iterator returns true or false. + * @return Is every child pass condition. + */ + every( + condition: (node: Child, index: number, nodes: Child[]) => boolean + ): boolean + /** + * Returns a `child`’s index within the `Container#nodes` array. + * + * ```js + * rule.index( rule.nodes[2] ) //=> 2 + * ``` + * + * @param child Child of the current container. + * @return Child index. + */ + index(child: Child | number): number + + /** + * Insert new node after old node within the container. + * + * @param oldNode Child or child’s index. + * @param newNode New node. + * @return This node for methods chain. + */ + insertAfter( + oldNode: Child | number, + newNode: + | Child + | Child[] + | ChildProps + | ChildProps[] + | string + | string[] + | undefined + ): this + /** + * Insert new node before old node within the container. + * + * ```js + * rule.insertBefore(decl, decl.clone({ prop: '-webkit-' + decl.prop })) + * ``` + * + * @param oldNode Child or child’s index. + * @param newNode New node. + * @return This node for methods chain. + */ + insertBefore( + oldNode: Child | number, + newNode: + | Child + | Child[] + | ChildProps + | ChildProps[] + | string + | string[] + | undefined + ): this + + /** + * Traverses the container’s descendant nodes, calling callback + * for each comment node. + * + * Like `Container#each`, this method is safe + * to use if you are mutating arrays during iteration. + * + * ```js + * root.walkComments(comment => { + * comment.remove() + * }) + * ``` + * + * @param callback Iterator receives each node and index. + * @return Returns `false` if iteration was broke. + */ + + /** + * Inserts new nodes to the start of the container. + * + * ```js + * const decl1 = new Declaration({ prop: 'color', value: 'black' }) + * const decl2 = new Declaration({ prop: 'background-color', value: 'white' }) + * rule.prepend(decl1, decl2) + * + * root.append({ name: 'charset', params: '"UTF-8"' }) // at-rule + * root.append({ selector: 'a' }) // rule + * rule.append({ prop: 'color', value: 'black' }) // declaration + * rule.append({ text: 'Comment' }) // comment + * + * root.append('a {}') + * root.first.append('color: black; z-index: 1') + * ``` + * + * @param nodes New nodes. + * @return This node for methods chain. + */ + prepend( + ...nodes: ( + | ChildProps + | ChildProps[] + | Node + | Node[] + | string + | string[] + | undefined + )[] + ): this + /** + * Add child to the end of the node. + * + * ```js + * rule.push(new Declaration({ prop: 'color', value: 'black' })) + * ``` + * + * @param child New node. + * @return This node for methods chain. + */ + push(child: Child): this + + /** + * Removes all children from the container + * and cleans their parent properties. + * + * ```js + * rule.removeAll() + * rule.nodes.length //=> 0 + * ``` + * + * @return This node for methods chain. + */ + removeAll(): this + + /** + * Removes node from the container and cleans the parent properties + * from the node and its children. + * + * ```js + * rule.nodes.length //=> 5 + * rule.removeChild(decl) + * rule.nodes.length //=> 4 + * decl.parent //=> undefined + * ``` + * + * @param child Child or child’s index. + * @return This node for methods chain. + */ + removeChild(child: Child | number): this + + replaceValues( + pattern: RegExp | string, + replaced: { (substring: string, ...args: any[]): string } | string + ): this + + /** + * Passes all declaration values within the container that match pattern + * through callback, replacing those values with the returned result + * of callback. + * + * This method is useful if you are using a custom unit or function + * and need to iterate through all values. + * + * ```js + * root.replaceValues(/\d+rem/, { fast: 'rem' }, string => { + * return 15 * parseInt(string) + 'px' + * }) + * ``` + * + * @param pattern Replace pattern. + * @param {object} opts Options to speed up the search. + * @param callback String to replace pattern or callback + * that returns a new value. The callback + * will receive the same arguments + * as those passed to a function parameter + * of `String#replace`. + * @return This node for methods chain. + */ + replaceValues( + pattern: RegExp | string, + options: Container.ValueOptions, + replaced: { (substring: string, ...args: any[]): string } | string + ): this + + /** + * Returns `true` if callback returns `true` for (at least) one + * of the container’s children. + * + * ```js + * const hasPrefix = rule.some(i => i.prop[0] === '-') + * ``` + * + * @param condition Iterator returns true or false. + * @return Is some child pass condition. + */ + some( + condition: (node: Child, index: number, nodes: Child[]) => boolean + ): boolean + + /** + * Traverses the container’s descendant nodes, calling callback + * for each node. + * + * Like container.each(), this method is safe to use + * if you are mutating arrays during iteration. + * + * If you only need to iterate through the container’s immediate children, + * use `Container#each`. + * + * ```js + * root.walk(node => { + * // Traverses all descendant nodes. + * }) + * ``` + * + * @param callback Iterator receives each node and index. + * @return Returns `false` if iteration was broke. + */ + walk( + callback: (node: ChildNode, index: number) => false | void + ): false | undefined + + /** + * Traverses the container’s descendant nodes, calling callback + * for each at-rule node. + * + * If you pass a filter, iteration will only happen over at-rules + * that have matching names. + * + * Like `Container#each`, this method is safe + * to use if you are mutating arrays during iteration. + * + * ```js + * root.walkAtRules(rule => { + * if (isOld(rule.name)) rule.remove() + * }) + * + * let first = false + * root.walkAtRules('charset', rule => { + * if (!first) { + * first = true + * } else { + * rule.remove() + * } + * }) + * ``` + * + * @param name String or regular expression to filter at-rules by name. + * @param callback Iterator receives each node and index. + * @return Returns `false` if iteration was broke. + */ + walkAtRules( + nameFilter: RegExp | string, + callback: (atRule: AtRule, index: number) => false | void + ): false | undefined + + walkAtRules( + callback: (atRule: AtRule, index: number) => false | void + ): false | undefined + walkComments( + callback: (comment: Comment, indexed: number) => false | void + ): false | undefined + + walkComments( + callback: (comment: Comment, indexed: number) => false | void + ): false | undefined + + /** + * Traverses the container’s descendant nodes, calling callback + * for each declaration node. + * + * If you pass a filter, iteration will only happen over declarations + * with matching properties. + * + * ```js + * root.walkDecls(decl => { + * checkPropertySupport(decl.prop) + * }) + * + * root.walkDecls('border-radius', decl => { + * decl.remove() + * }) + * + * root.walkDecls(/^background/, decl => { + * decl.value = takeFirstColorFromGradient(decl.value) + * }) + * ``` + * + * Like `Container#each`, this method is safe + * to use if you are mutating arrays during iteration. + * + * @param prop String or regular expression to filter declarations + * by property name. + * @param callback Iterator receives each node and index. + * @return Returns `false` if iteration was broke. + */ + walkDecls( + propFilter: RegExp | string, + callback: (decl: Declaration, index: number) => false | void + ): false | undefined + + walkDecls( + callback: (decl: Declaration, index: number) => false | void + ): false | undefined + + /** + * Traverses the container’s descendant nodes, calling callback + * for each rule node. + * + * If you pass a filter, iteration will only happen over rules + * with matching selectors. + * + * Like `Container#each`, this method is safe + * to use if you are mutating arrays during iteration. + * + * ```js + * const selectors = [] + * root.walkRules(rule => { + * selectors.push(rule.selector) + * }) + * console.log(`Your CSS uses ${ selectors.length } selectors`) + * ``` + * + * @param selector String or regular expression to filter rules by selector. + * @param callback Iterator receives each node and index. + * @return Returns `false` if iteration was broke. + */ + walkRules( + selectorFilter: RegExp | string, + callback: (rule: Rule, index: number) => false | void + ): false | undefined + walkRules( + callback: (rule: Rule, index: number) => false | void + ): false | undefined + /** + * The container’s first child. + * + * ```js + * rule.first === rules.nodes[0] + * ``` + */ + get first(): Child | undefined + /** + * The container’s last child. + * + * ```js + * rule.last === rule.nodes[rule.nodes.length - 1] + * ``` + */ + get last(): Child | undefined +} + +declare class Container< + Child extends Node = ChildNode +> extends Container_ {} + +export = Container diff --git a/src/postcss/css-syntax-error.d.ts b/src/postcss/css-syntax-error.d.ts new file mode 100644 index 0000000..e540d84 --- /dev/null +++ b/src/postcss/css-syntax-error.d.ts @@ -0,0 +1,248 @@ +import { FilePosition } from './input.js' + +declare namespace CssSyntaxError { + /** + * A position that is part of a range. + */ + export interface RangePosition { + /** + * The column number in the input. + */ + column: number + + /** + * The line number in the input. + */ + line: number + } + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { CssSyntaxError_ as default } +} + +/** + * The CSS parser throws this error for broken CSS. + * + * Custom parsers can throw this error for broken custom syntax using + * the `Node#error` method. + * + * PostCSS will use the input source map to detect the original error location. + * If you wrote a Sass file, compiled it to CSS and then parsed it with PostCSS, + * PostCSS will show the original position in the Sass file. + * + * If you need the position in the PostCSS input + * (e.g., to debug the previous compiler), use `error.input.file`. + * + * ```js + * // Raising error from plugin + * throw node.error('Unknown variable', { plugin: 'postcss-vars' }) + * ``` + * + * ```js + * // Catching and checking syntax error + * try { + * postcss.parse('a{') + * } catch (error) { + * if (error.name === 'CssSyntaxError') { + * error //=> CssSyntaxError + * } + * } + * ``` + */ +declare class CssSyntaxError_ extends Error { + /** + * Source column of the error. + * + * ```js + * error.column //=> 1 + * error.input.column //=> 4 + * ``` + * + * PostCSS will use the input source map to detect the original location. + * If you need the position in the PostCSS input, use `error.input.column`. + */ + column?: number + + /** + * Source column of the error's end, exclusive. Provided if the error pertains + * to a range. + * + * ```js + * error.endColumn //=> 1 + * error.input.endColumn //=> 4 + * ``` + * + * PostCSS will use the input source map to detect the original location. + * If you need the position in the PostCSS input, use `error.input.endColumn`. + */ + endColumn?: number + + /** + * Source line of the error's end, exclusive. Provided if the error pertains + * to a range. + * + * ```js + * error.endLine //=> 3 + * error.input.endLine //=> 4 + * ``` + * + * PostCSS will use the input source map to detect the original location. + * If you need the position in the PostCSS input, use `error.input.endLine`. + */ + endLine?: number + + /** + * Absolute path to the broken file. + * + * ```js + * error.file //=> 'a.sass' + * error.input.file //=> 'a.css' + * ``` + * + * PostCSS will use the input source map to detect the original location. + * If you need the position in the PostCSS input, use `error.input.file`. + */ + file?: string + + /** + * Input object with PostCSS internal information + * about input file. If input has source map + * from previous tool, PostCSS will use origin + * (for example, Sass) source. You can use this + * object to get PostCSS input source. + * + * ```js + * error.input.file //=> 'a.css' + * error.file //=> 'a.sass' + * ``` + */ + input?: FilePosition + + /** + * Source line of the error. + * + * ```js + * error.line //=> 2 + * error.input.line //=> 4 + * ``` + * + * PostCSS will use the input source map to detect the original location. + * If you need the position in the PostCSS input, use `error.input.line`. + */ + line?: number + + /** + * Full error text in the GNU error format + * with plugin, file, line and column. + * + * ```js + * error.message //=> 'a.css:1:1: Unclosed block' + * ``` + */ + message: string + + /** + * Always equal to `'CssSyntaxError'`. You should always check error type + * by `error.name === 'CssSyntaxError'` + * instead of `error instanceof CssSyntaxError`, + * because npm could have several PostCSS versions. + * + * ```js + * if (error.name === 'CssSyntaxError') { + * error //=> CssSyntaxError + * } + * ``` + */ + name: 'CssSyntaxError' + + /** + * Plugin name, if error came from plugin. + * + * ```js + * error.plugin //=> 'postcss-vars' + * ``` + */ + plugin?: string + + /** + * Error message. + * + * ```js + * error.message //=> 'Unclosed block' + * ``` + */ + reason: string + + /** + * Source code of the broken file. + * + * ```js + * error.source //=> 'a { b {} }' + * error.input.source //=> 'a b { }' + * ``` + */ + source?: string + + stack: string + + /** + * Instantiates a CSS syntax error. Can be instantiated for a single position + * or for a range. + * @param message Error message. + * @param lineOrStartPos If for a single position, the line number, or if for + * a range, the inclusive start position of the error. + * @param columnOrEndPos If for a single position, the column number, or if for + * a range, the exclusive end position of the error. + * @param source Source code of the broken file. + * @param file Absolute path to the broken file. + * @param plugin PostCSS plugin name, if error came from plugin. + */ + constructor( + message: string, + lineOrStartPos?: CssSyntaxError.RangePosition | number, + columnOrEndPos?: CssSyntaxError.RangePosition | number, + source?: string, + file?: string, + plugin?: string + ) + + /** + * Returns a few lines of CSS source that caused the error. + * + * If the CSS has an input source map without `sourceContent`, + * this method will return an empty string. + * + * ```js + * error.showSourceCode() //=> " 4 | } + * // 5 | a { + * // > 6 | bad + * // | ^ + * // 7 | } + * // 8 | b {" + * ``` + * + * @param color Whether arrow will be colored red by terminal + * color codes. By default, PostCSS will detect + * color support by `process.stdout.isTTY` + * and `process.env.NODE_DISABLE_COLORS`. + * @return Few lines of CSS source that caused the error. + */ + showSourceCode(color?: boolean): string + + /** + * Returns error position, message and source code of the broken part. + * + * ```js + * error.toString() //=> "CssSyntaxError: app.css:1:1: Unclosed block + * // > 1 | a { + * // | ^" + * ``` + * + * @return Error position, message and source code. + */ + toString(): string +} + +declare class CssSyntaxError extends CssSyntaxError_ {} + +export = CssSyntaxError diff --git a/src/postcss/declaration.d.ts b/src/postcss/declaration.d.ts new file mode 100644 index 0000000..1c6821f --- /dev/null +++ b/src/postcss/declaration.d.ts @@ -0,0 +1,152 @@ +import { ContainerWithChildren } from './container.js' +import Node from './node.js' + +declare namespace Declaration { + export interface DeclarationRaws extends Record { + /** + * The space symbols before the node. It also stores `*` + * and `_` symbols before the declaration (IE hack). + */ + before?: string + + /** + * The symbols between the property and value for declarations. + */ + between?: string + + /** + * The content of the important statement, if it is not just `!important`. + */ + important?: string + + /** + * Declaration value with comments. + */ + value?: { + raw: string + value: string + } + } + + export interface DeclarationProps { + /** Whether the declaration has an `!important` annotation. */ + important?: boolean + /** Name of the declaration. */ + prop: string + /** Information used to generate byte-to-byte equal node string as it was in the origin input. */ + raws?: DeclarationRaws + /** Value of the declaration. */ + value: string + } + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { Declaration_ as default } +} + +/** + * It represents a class that handles + * [CSS declarations](https://developer.mozilla.org/en-US/docs/Web/CSS/Syntax#css_declarations) + * + * ```js + * Once (root, { Declaration }) { + * const color = new Declaration({ prop: 'color', value: 'black' }) + * root.append(color) + * } + * ``` + * + * ```js + * const root = postcss.parse('a { color: black }') + * const decl = root.first?.first + * + * decl.type //=> 'decl' + * decl.toString() //=> ' color: black' + * ``` + */ +declare class Declaration_ extends Node { + /** + * It represents a specificity of the declaration. + * + * If true, the CSS declaration will have an + * [important](https://developer.mozilla.org/en-US/docs/Web/CSS/important) + * specifier. + * + * ```js + * const root = postcss.parse('a { color: black !important; color: red }') + * + * root.first.first.important //=> true + * root.first.last.important //=> undefined + * ``` + */ + get important(): boolean + set important(value: boolean) + + parent: ContainerWithChildren | undefined + + /** + * The property name for a CSS declaration. + * + * ```js + * const root = postcss.parse('a { color: black }') + * const decl = root.first.first + * + * decl.prop //=> 'color' + * ``` + */ + get prop(): string + set prop(value: string) + + raws: Declaration.DeclarationRaws + + type: 'decl' + + /** + * The property value for a CSS declaration. + * + * Any CSS comments inside the value string will be filtered out. + * CSS comments present in the source value will be available in + * the `raws` property. + * + * Assigning new `value` would ignore the comments in `raws` + * property while compiling node to string. + * + * ```js + * const root = postcss.parse('a { color: black }') + * const decl = root.first.first + * + * decl.value //=> 'black' + * ``` + */ + get value(): string + set value(value: string) + + /** + * It represents a getter that returns `true` if a declaration starts with + * `--` or `$`, which are used to declare variables in CSS and SASS/SCSS. + * + * ```js + * const root = postcss.parse(':root { --one: 1 }') + * const one = root.first.first + * + * one.variable //=> true + * ``` + * + * ```js + * const root = postcss.parse('$one: 1') + * const one = root.first + * + * one.variable //=> true + * ``` + */ + get variable(): boolean + set varaible(value: string) + + constructor(defaults?: Declaration.DeclarationProps) + assign(overrides: Declaration.DeclarationProps | object): this + clone(overrides?: Partial): Declaration + cloneAfter(overrides?: Partial): Declaration + cloneBefore(overrides?: Partial): Declaration +} + +declare class Declaration extends Declaration_ {} + +export = Declaration diff --git a/src/postcss/document.d.ts b/src/postcss/document.d.ts new file mode 100644 index 0000000..a368f16 --- /dev/null +++ b/src/postcss/document.d.ts @@ -0,0 +1,69 @@ +import Container, { ContainerProps } from './container.js' +import { ProcessOptions } from './postcss.js' +import Result from './result.js' +import Root from './root.js' + +declare namespace Document { + export interface DocumentProps extends ContainerProps { + nodes?: Root[] + + /** + * Information to generate byte-to-byte equal node string as it was + * in the origin input. + * + * Every parser saves its own properties. + */ + raws?: Record + } + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { Document_ as default } +} + +/** + * Represents a file and contains all its parsed nodes. + * + * **Experimental:** some aspects of this node could change within minor + * or patch version releases. + * + * ```js + * const document = htmlParser( + * '' + * ) + * document.type //=> 'document' + * document.nodes.length //=> 2 + * ``` + */ +declare class Document_ extends Container { + nodes: Root[] + parent: undefined + type: 'document' + + constructor(defaults?: Document.DocumentProps) + + assign(overrides: Document.DocumentProps | object): this + clone(overrides?: Partial): Document + cloneAfter(overrides?: Partial): Document + cloneBefore(overrides?: Partial): Document + + /** + * Returns a `Result` instance representing the document’s CSS roots. + * + * ```js + * const root1 = postcss.parse(css1, { from: 'a.css' }) + * const root2 = postcss.parse(css2, { from: 'b.css' }) + * const document = postcss.document() + * document.append(root1) + * document.append(root2) + * const result = document.toResult({ to: 'all.css', map: true }) + * ``` + * + * @param opts Options. + * @return Result with current document’s CSS. + */ + toResult(options?: ProcessOptions): Result +} + +declare class Document extends Document_ {} + +export = Document diff --git a/src/postcss/fromJSON.d.ts b/src/postcss/fromJSON.d.ts new file mode 100644 index 0000000..e1deedb --- /dev/null +++ b/src/postcss/fromJSON.d.ts @@ -0,0 +1,9 @@ +import { JSONHydrator } from './postcss.js' + +interface FromJSON extends JSONHydrator { + default: FromJSON +} + +declare const fromJSON: FromJSON + +export = fromJSON diff --git a/src/postcss/input.d.ts b/src/postcss/input.d.ts new file mode 100644 index 0000000..c718bd1 --- /dev/null +++ b/src/postcss/input.d.ts @@ -0,0 +1,194 @@ +import { CssSyntaxError, ProcessOptions } from './postcss.js' +import PreviousMap from './previous-map.js' + +declare namespace Input { + export interface FilePosition { + /** + * Column of inclusive start position in source file. + */ + column: number + + /** + * Column of exclusive end position in source file. + */ + endColumn?: number + + /** + * Line of exclusive end position in source file. + */ + endLine?: number + + /** + * Absolute path to the source file. + */ + file?: string + + /** + * Line of inclusive start position in source file. + */ + line: number + + /** + * Source code. + */ + source?: string + + /** + * URL for the source file. + */ + url: string + } + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { Input_ as default } +} + +/** + * Represents the source CSS. + * + * ```js + * const root = postcss.parse(css, { from: file }) + * const input = root.source.input + * ``` + */ +declare class Input_ { + /** + * Input CSS source. + * + * ```js + * const input = postcss.parse('a{}', { from: file }).input + * input.css //=> "a{}" + * ``` + */ + css: string + + /** + * The absolute path to the CSS source file defined + * with the `from` option. + * + * ```js + * const root = postcss.parse(css, { from: 'a.css' }) + * root.source.input.file //=> '/home/ai/a.css' + * ``` + */ + file?: string + + /** + * The flag to indicate whether or not the source code has Unicode BOM. + */ + hasBOM: boolean + + /** + * The unique ID of the CSS source. It will be created if `from` option + * is not provided (because PostCSS does not know the file path). + * + * ```js + * const root = postcss.parse(css) + * root.source.input.file //=> undefined + * root.source.input.id //=> "" + * ``` + */ + id?: string + + /** + * The input source map passed from a compilation step before PostCSS + * (for example, from Sass compiler). + * + * ```js + * root.source.input.map.consumer().sources //=> ['a.sass'] + * ``` + */ + map: PreviousMap + + /** + * @param css Input CSS source. + * @param opts Process options. + */ + constructor(css: string, opts?: ProcessOptions) + + error( + message: string, + start: + | { + column: number + line: number + } + | { + offset: number + }, + end: + | { + column: number + line: number + } + | { + offset: number + }, + opts?: { plugin?: CssSyntaxError['plugin'] } + ): CssSyntaxError + + /** + * Returns `CssSyntaxError` with information about the error and its position. + */ + error( + message: string, + line: number, + column: number, + opts?: { plugin?: CssSyntaxError['plugin'] } + ): CssSyntaxError + + error( + message: string, + offset: number, + opts?: { plugin?: CssSyntaxError['plugin'] } + ): CssSyntaxError + + /** + * Converts source offset to line and column. + * + * @param offset Source offset. + */ + fromOffset(offset: number): { col: number; line: number } | null + /** + * Reads the input source map and returns a symbol position + * in the input source (e.g., in a Sass file that was compiled + * to CSS before being passed to PostCSS). Optionally takes an + * end position, exclusive. + * + * ```js + * root.source.input.origin(1, 1) //=> { file: 'a.css', line: 3, column: 1 } + * root.source.input.origin(1, 1, 1, 4) + * //=> { file: 'a.css', line: 3, column: 1, endLine: 3, endColumn: 4 } + * ``` + * + * @param line Line for inclusive start position in input CSS. + * @param column Column for inclusive start position in input CSS. + * @param endLine Line for exclusive end position in input CSS. + * @param endColumn Column for exclusive end position in input CSS. + * + * @return Position in input source. + */ + origin( + line: number, + column: number, + endLine?: number, + endColumn?: number + ): false | Input.FilePosition + /** + * The CSS source identifier. Contains `Input#file` if the user + * set the `from` option, or `Input#id` if they did not. + * + * ```js + * const root = postcss.parse(css, { from: 'a.css' }) + * root.source.input.from //=> "/home/ai/a.css" + * + * const root = postcss.parse(css) + * root.source.input.from //=> "" + * ``` + */ + get from(): string +} + +declare class Input extends Input_ {} + +export = Input diff --git a/src/postcss/lazy-result.d.ts b/src/postcss/lazy-result.d.ts new file mode 100644 index 0000000..dd291aa --- /dev/null +++ b/src/postcss/lazy-result.d.ts @@ -0,0 +1,190 @@ +import Document from './document.js' +import { SourceMap } from './postcss.js' +import Processor from './processor.js' +import Result, { Message, ResultOptions } from './result.js' +import Root from './root.js' +import Warning from './warning.js' + +declare namespace LazyResult { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { LazyResult_ as default } +} + +/** + * A Promise proxy for the result of PostCSS transformations. + * + * A `LazyResult` instance is returned by `Processor#process`. + * + * ```js + * const lazy = postcss([autoprefixer]).process(css) + * ``` + */ +declare class LazyResult_ + implements PromiseLike> +{ + /** + * Processes input CSS through synchronous and asynchronous plugins + * and calls onRejected for each error thrown in any plugin. + * + * It implements standard Promise API. + * + * ```js + * postcss([autoprefixer]).process(css).then(result => { + * console.log(result.css) + * }).catch(error => { + * console.error(error) + * }) + * ``` + */ + catch: Promise>['catch'] + + /** + * Processes input CSS through synchronous and asynchronous plugins + * and calls onFinally on any error or when all plugins will finish work. + * + * It implements standard Promise API. + * + * ```js + * postcss([autoprefixer]).process(css).finally(() => { + * console.log('processing ended') + * }) + * ``` + */ + finally: Promise>['finally'] + + /** + * Processes input CSS through synchronous and asynchronous plugins + * and calls `onFulfilled` with a Result instance. If a plugin throws + * an error, the `onRejected` callback will be executed. + * + * It implements standard Promise API. + * + * ```js + * postcss([autoprefixer]).process(css, { from: cssPath }).then(result => { + * console.log(result.css) + * }) + * ``` + */ + then: Promise>['then'] + + /** + * @param processor Processor used for this transformation. + * @param css CSS to parse and transform. + * @param opts Options from the `Processor#process` or `Root#toResult`. + */ + constructor(processor: Processor, css: string, opts: ResultOptions) + + /** + * Run plugin in async way and return `Result`. + * + * @return Result with output content. + */ + async(): Promise> + + /** + * Run plugin in sync way and return `Result`. + * + * @return Result with output content. + */ + sync(): Result + + /** + * Alias for the `LazyResult#css` property. + * + * ```js + * lazy + '' === lazy.css + * ``` + * + * @return Output CSS. + */ + toString(): string + + /** + * Processes input CSS through synchronous plugins + * and calls `Result#warnings`. + * + * @return Warnings from plugins. + */ + warnings(): Warning[] + + /** + * An alias for the `css` property. Use it with syntaxes + * that generate non-CSS output. + * + * This property will only work with synchronous plugins. + * If the processor contains any asynchronous plugins + * it will throw an error. + * + * PostCSS runners should always use `LazyResult#then`. + */ + get content(): string + + /** + * Processes input CSS through synchronous plugins, converts `Root` + * to a CSS string and returns `Result#css`. + * + * This property will only work with synchronous plugins. + * If the processor contains any asynchronous plugins + * it will throw an error. + * + * PostCSS runners should always use `LazyResult#then`. + */ + get css(): string + + /** + * Processes input CSS through synchronous plugins + * and returns `Result#map`. + * + * This property will only work with synchronous plugins. + * If the processor contains any asynchronous plugins + * it will throw an error. + * + * PostCSS runners should always use `LazyResult#then`. + */ + get map(): SourceMap + + /** + * Processes input CSS through synchronous plugins + * and returns `Result#messages`. + * + * This property will only work with synchronous plugins. If the processor + * contains any asynchronous plugins it will throw an error. + * + * PostCSS runners should always use `LazyResult#then`. + */ + get messages(): Message[] + + /** + * Options from the `Processor#process` call. + */ + get opts(): ResultOptions + + /** + * Returns a `Processor` instance, which will be used + * for CSS transformations. + */ + get processor(): Processor + + /** + * Processes input CSS through synchronous plugins + * and returns `Result#root`. + * + * This property will only work with synchronous plugins. If the processor + * contains any asynchronous plugins it will throw an error. + * + * PostCSS runners should always use `LazyResult#then`. + */ + get root(): RootNode + + /** + * Returns the default string description of an object. + * Required to implement the Promise interface. + */ + get [Symbol.toStringTag](): string +} + +declare class LazyResult< + RootNode = Document | Root +> extends LazyResult_ {} + +export = LazyResult diff --git a/src/postcss/list.d.ts b/src/postcss/list.d.ts new file mode 100644 index 0000000..1a74d74 --- /dev/null +++ b/src/postcss/list.d.ts @@ -0,0 +1,57 @@ +declare namespace list { + type List = { + /** + * Safely splits comma-separated values (such as those for `transition-*` + * and `background` properties). + * + * ```js + * Once (root, { list }) { + * list.comma('black, linear-gradient(white, black)') + * //=> ['black', 'linear-gradient(white, black)'] + * } + * ``` + * + * @param str Comma-separated values. + * @return Split values. + */ + comma(str: string): string[] + + default: List + + /** + * Safely splits space-separated values (such as those for `background`, + * `border-radius`, and other shorthand properties). + * + * ```js + * Once (root, { list }) { + * list.space('1px calc(10% + 1px)') //=> ['1px', 'calc(10% + 1px)'] + * } + * ``` + * + * @param str Space-separated values. + * @return Split values. + */ + space(str: string): string[] + + /** + * Safely splits values. + * + * ```js + * Once (root, { list }) { + * list.split('1px calc(10% + 1px)', [' ', '\n', '\t']) //=> ['1px', 'calc(10% + 1px)'] + * } + * ``` + * + * @param string separated values. + * @param separators array of separators. + * @param last boolean indicator. + * @return Split values. + */ + split(string: string, separators: string[], last: boolean): string[] + } +} + +// eslint-disable-next-line @typescript-eslint/no-redeclare +declare const list: list.List + +export = list diff --git a/src/postcss/no-work-result.d.ts b/src/postcss/no-work-result.d.ts new file mode 100644 index 0000000..8039076 --- /dev/null +++ b/src/postcss/no-work-result.d.ts @@ -0,0 +1,46 @@ +import LazyResult from './lazy-result.js' +import { SourceMap } from './postcss.js' +import Processor from './processor.js' +import Result, { Message, ResultOptions } from './result.js' +import Root from './root.js' +import Warning from './warning.js' + +declare namespace NoWorkResult { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { NoWorkResult_ as default } +} + +/** + * A Promise proxy for the result of PostCSS transformations. + * This lazy result instance doesn't parse css unless `NoWorkResult#root` or `Result#root` + * are accessed. See the example below for details. + * A `NoWork` instance is returned by `Processor#process` ONLY when no plugins defined. + * + * ```js + * const noWorkResult = postcss().process(css) // No plugins are defined. + * // CSS is not parsed + * let root = noWorkResult.root // now css is parsed because we accessed the root + * ``` + */ +declare class NoWorkResult_ implements LazyResult { + catch: Promise>['catch'] + finally: Promise>['finally'] + then: Promise>['then'] + constructor(processor: Processor, css: string, opts: ResultOptions) + async(): Promise> + sync(): Result + toString(): string + warnings(): Warning[] + get content(): string + get css(): string + get map(): SourceMap + get messages(): Message[] + get opts(): ResultOptions + get processor(): Processor + get root(): Root + get [Symbol.toStringTag](): string +} + +declare class NoWorkResult extends NoWorkResult_ {} + +export = NoWorkResult diff --git a/src/postcss/node.d.ts b/src/postcss/node.d.ts new file mode 100644 index 0000000..5971656 --- /dev/null +++ b/src/postcss/node.d.ts @@ -0,0 +1,536 @@ +import AtRule = require('./at-rule.js') + +import { AtRuleProps } from './at-rule.js' +import Comment, { CommentProps } from './comment.js' +import Container from './container.js' +import CssSyntaxError from './css-syntax-error.js' +import Declaration, { DeclarationProps } from './declaration.js' +import Document from './document.js' +import Input from './input.js' +import { Stringifier, Syntax } from './postcss.js' +import Result from './result.js' +import Root from './root.js' +import Rule, { RuleProps } from './rule.js' +import Warning, { WarningOptions } from './warning.js' + +declare namespace Node { + export type ChildNode = AtRule.default | Comment | Declaration | Rule + + export type AnyNode = + | AtRule.default + | Comment + | Declaration + | Document + | Root + | Rule + + export type ChildProps = + | AtRuleProps + | CommentProps + | DeclarationProps + | RuleProps + + export interface Position { + /** + * Source line in file. In contrast to `offset` it starts from 1. + */ + column: number + + /** + * Source column in file. + */ + line: number + + /** + * Source offset in file. It starts from 0. + */ + offset: number + } + + export interface Range { + /** + * End position, exclusive. + */ + end: Position + + /** + * Start position, inclusive. + */ + start: Position + } + + /** + * Source represents an interface for the {@link Node.source} property. + */ + export interface Source { + /** + * The inclusive ending position for the source + * code of a node. + */ + end?: Position + + /** + * The source file from where a node has originated. + */ + input: Input + + /** + * The inclusive starting position for the source + * code of a node. + */ + start?: Position + } + + /** + * Interface represents an interface for an object received + * as parameter by Node class constructor. + */ + export interface NodeProps { + source?: Source + } + + export interface NodeErrorOptions { + /** + * An ending index inside a node's string that should be highlighted as + * source of error. + */ + endIndex?: number + /** + * An index inside a node's string that should be highlighted as source + * of error. + */ + index?: number + /** + * Plugin name that created this error. PostCSS will set it automatically. + */ + plugin?: string + /** + * A word inside a node's string, that should be highlighted as source + * of error. + */ + word?: string + } + + // eslint-disable-next-line @typescript-eslint/no-shadow + class Node extends Node_ {} + export { Node as default } +} + +/** + * It represents an abstract class that handles common + * methods for other CSS abstract syntax tree nodes. + * + * Any node that represents CSS selector or value should + * not extend the `Node` class. + */ +declare abstract class Node_ { + /** + * It represents parent of the current node. + * + * ```js + * root.nodes[0].parent === root //=> true + * ``` + */ + parent: Container | Document | undefined + + /** + * It represents unnecessary whitespace and characters present + * in the css source code. + * + * Information to generate byte-to-byte equal node string as it was + * in the origin input. + * + * The properties of the raws object are decided by parser, + * the default parser uses the following properties: + * + * * `before`: the space symbols before the node. It also stores `*` + * and `_` symbols before the declaration (IE hack). + * * `after`: the space symbols after the last child of the node + * to the end of the node. + * * `between`: the symbols between the property and value + * for declarations, selector and `{` for rules, or last parameter + * and `{` for at-rules. + * * `semicolon`: contains true if the last child has + * an (optional) semicolon. + * * `afterName`: the space between the at-rule name and its parameters. + * * `left`: the space symbols between `/*` and the comment’s text. + * * `right`: the space symbols between the comment’s text + * and */. + * - `important`: the content of the important statement, + * if it is not just `!important`. + * + * PostCSS filters out the comments inside selectors, declaration values + * and at-rule parameters but it stores the origin content in raws. + * + * ```js + * const root = postcss.parse('a {\n color:black\n}') + * root.first.first.raws //=> { before: '\n ', between: ':' } + * ``` + */ + raws: any + + /** + * It represents information related to origin of a node and is required + * for generating source maps. + * + * The nodes that are created manually using the public APIs + * provided by PostCSS will have `source` undefined and + * will be absent in the source map. + * + * For this reason, the plugin developer should consider + * duplicating nodes as the duplicate node will have the + * same source as the original node by default or assign + * source to a node created manually. + * + * ```js + * decl.source.input.from //=> '/home/ai/source.css' + * decl.source.start //=> { line: 10, column: 2 } + * decl.source.end //=> { line: 10, column: 12 } + * ``` + * + * ```js + * // Incorrect method, source not specified! + * const prefixed = postcss.decl({ + * prop: '-moz-' + decl.prop, + * value: decl.value + * }) + * + * // Correct method, source is inherited when duplicating. + * const prefixed = decl.clone({ + * prop: '-moz-' + decl.prop + * }) + * ``` + * + * ```js + * if (atrule.name === 'add-link') { + * const rule = postcss.rule({ + * selector: 'a', + * source: atrule.source + * }) + * + * atrule.parent.insertBefore(atrule, rule) + * } + * ``` + */ + source?: Node.Source + + /** + * It represents type of a node in + * an abstract syntax tree. + * + * A type of node helps in identification of a node + * and perform operation based on it's type. + * + * ```js + * const declaration = new Declaration({ + * prop: 'color', + * value: 'black' + * }) + * + * declaration.type //=> 'decl' + * ``` + */ + type: string + + constructor(defaults?: object) + + /** + * Insert new node after current node to current node’s parent. + * + * Just alias for `node.parent.insertAfter(node, add)`. + * + * ```js + * decl.after('color: black') + * ``` + * + * @param newNode New node. + * @return This node for methods chain. + */ + after(newNode: Node | Node.ChildProps | Node[] | string | undefined): this + + /** + * It assigns properties to an existing node instance. + * + * ```js + * decl.assign({ prop: 'word-wrap', value: 'break-word' }) + * ``` + * + * @param overrides New properties to override the node. + * + * @return `this` for method chaining. + */ + assign(overrides: object): this + + /** + * Insert new node before current node to current node’s parent. + * + * Just alias for `node.parent.insertBefore(node, add)`. + * + * ```js + * decl.before('content: ""') + * ``` + * + * @param newNode New node. + * @return This node for methods chain. + */ + before(newNode: Node | Node.ChildProps | Node[] | string | undefined): this + + /** + * Clear the code style properties for the node and its children. + * + * ```js + * node.raws.before //=> ' ' + * node.cleanRaws() + * node.raws.before //=> undefined + * ``` + * + * @param keepBetween Keep the `raws.between` symbols. + */ + cleanRaws(keepBetween?: boolean): void + + /** + * It creates clone of an existing node, which includes all the properties + * and their values, that includes `raws` but not `type`. + * + * ```js + * decl.raws.before //=> "\n " + * const cloned = decl.clone({ prop: '-moz-' + decl.prop }) + * cloned.raws.before //=> "\n " + * cloned.toString() //=> -moz-transform: scale(0) + * ``` + * + * @param overrides New properties to override in the clone. + * + * @return Duplicate of the node instance. + */ + clone(overrides?: object): Node + + /** + * Shortcut to clone the node and insert the resulting cloned node + * after the current node. + * + * @param overrides New properties to override in the clone. + * @return New node. + */ + cloneAfter(overrides?: object): Node + + /** + * Shortcut to clone the node and insert the resulting cloned node + * before the current node. + * + * ```js + * decl.cloneBefore({ prop: '-moz-' + decl.prop }) + * ``` + * + * @param overrides Mew properties to override in the clone. + * + * @return New node + */ + cloneBefore(overrides?: object): Node + + /** + * It creates an instance of the class `CssSyntaxError` and parameters passed + * to this method are assigned to the error instance. + * + * The error instance will have description for the + * error, original position of the node in the + * source, showing line and column number. + * + * If any previous map is present, it would be used + * to get original position of the source. + * + * The Previous Map here is referred to the source map + * generated by previous compilation, example: Less, + * Stylus and Sass. + * + * This method returns the error instance instead of + * throwing it. + * + * ```js + * if (!variables[name]) { + * throw decl.error(`Unknown variable ${name}`, { word: name }) + * // CssSyntaxError: postcss-vars:a.sass:4:3: Unknown variable $black + * // color: $black + * // a + * // ^ + * // background: white + * } + * ``` + * + * @param message Description for the error instance. + * @param options Options for the error instance. + * + * @return Error instance is returned. + */ + error(message: string, options?: Node.NodeErrorOptions): CssSyntaxError + + /** + * Returns the next child of the node’s parent. + * Returns `undefined` if the current node is the last child. + * + * ```js + * if (comment.text === 'delete next') { + * const next = comment.next() + * if (next) { + * next.remove() + * } + * } + * ``` + * + * @return Next node. + */ + next(): Node.ChildNode | undefined + + /** + * Get the position for a word or an index inside the node. + * + * @param opts Options. + * @return Position. + */ + positionBy(opts?: Pick): Node.Position + + /** + * Convert string index to line/column. + * + * @param index The symbol number in the node’s string. + * @return Symbol position in file. + */ + positionInside(index: number): Node.Position + + /** + * Returns the previous child of the node’s parent. + * Returns `undefined` if the current node is the first child. + * + * ```js + * const annotation = decl.prev() + * if (annotation.type === 'comment') { + * readAnnotation(annotation.text) + * } + * ``` + * + * @return Previous node. + */ + prev(): Node.ChildNode | undefined + + /** + * Get the range for a word or start and end index inside the node. + * The start index is inclusive; the end index is exclusive. + * + * @param opts Options. + * @return Range. + */ + rangeBy( + opts?: Pick + ): Node.Range + + /** + * Returns a `raws` value. If the node is missing + * the code style property (because the node was manually built or cloned), + * PostCSS will try to autodetect the code style property by looking + * at other nodes in the tree. + * + * ```js + * const root = postcss.parse('a { background: white }') + * root.nodes[0].append({ prop: 'color', value: 'black' }) + * root.nodes[0].nodes[1].raws.before //=> undefined + * root.nodes[0].nodes[1].raw('before') //=> ' ' + * ``` + * + * @param prop Name of code style property. + * @param defaultType Name of default value, it can be missed + * if the value is the same as prop. + * @return {string} Code style value. + */ + raw(prop: string, defaultType?: string): string + + /** + * It removes the node from its parent and deletes its parent property. + * + * ```js + * if (decl.prop.match(/^-webkit-/)) { + * decl.remove() + * } + * ``` + * + * @return `this` for method chaining. + */ + remove(): this + + /** + * Inserts node(s) before the current node and removes the current node. + * + * ```js + * AtRule: { + * mixin: atrule => { + * atrule.replaceWith(mixinRules[atrule.params]) + * } + * } + * ``` + * + * @param nodes Mode(s) to replace current one. + * @return Current node to methods chain. + */ + replaceWith( + ...nodes: ( + | Node.ChildNode + | Node.ChildNode[] + | Node.ChildProps + | Node.ChildProps[] + )[] + ): this + + /** + * Finds the Root instance of the node’s tree. + * + * ```js + * root.nodes[0].nodes[0].root() === root + * ``` + * + * @return Root parent. + */ + root(): Root + + /** + * Fix circular links on `JSON.stringify()`. + * + * @return Cleaned object. + */ + toJSON(): object + + /** + * It compiles the node to browser readable cascading style sheets string + * depending on it's type. + * + * ```js + * new Rule({ selector: 'a' }).toString() //=> "a {}" + * ``` + * + * @param stringifier A syntax to use in string generation. + * @return CSS string of this node. + */ + toString(stringifier?: Stringifier | Syntax): string + + /** + * It is a wrapper for {@link Result#warn}, providing convenient + * way of generating warnings. + * + * ```js + * Declaration: { + * bad: (decl, { result }) => { + * decl.warn(result, 'Deprecated property: bad') + * } + * } + * ``` + * + * @param result The `Result` instance that will receive the warning. + * @param message Description for the warning. + * @param options Options for the warning. + * + * @return `Warning` instance is returned + */ + warn(result: Result, message: string, options?: WarningOptions): Warning +} + +declare class Node extends Node_ {} + +export = Node diff --git a/src/postcss/parse.d.ts b/src/postcss/parse.d.ts new file mode 100644 index 0000000..4c943a4 --- /dev/null +++ b/src/postcss/parse.d.ts @@ -0,0 +1,9 @@ +import { Parser } from './postcss.js' + +interface Parse extends Parser { + default: Parse +} + +declare const parse: Parse + +export = parse diff --git a/src/postcss/postcss.d.ts b/src/postcss/postcss.d.ts new file mode 100644 index 0000000..72da1c3 --- /dev/null +++ b/src/postcss/postcss.d.ts @@ -0,0 +1,436 @@ +import AtRule, { AtRuleProps } from './at-rule.js' +import Comment, { CommentProps } from './comment.js' +import Container, { ContainerProps } from './container.js' +import CssSyntaxError from './css-syntax-error.js' +import Declaration, { DeclarationProps } from './declaration.js' +import Document, { DocumentProps } from './document.js' +import Input, { FilePosition } from './input.js' +import LazyResult from './lazy-result.js' +import list from './list.js' +import Node, { + AnyNode, + ChildNode, + ChildProps, + NodeErrorOptions, + NodeProps, + Position, + Source +} from './node.js' +import Processor from './processor.js' +import Result, { Message } from './result.js' +import Root, { RootProps } from './root.js' +import Rule, { RuleProps } from './rule.js' +import Warning, { WarningOptions } from './warning.js' + +type DocumentProcessor = ( + document: Document, + helper: postcss.Helpers +) => Promise | void +type RootProcessor = (root: Root, helper: postcss.Helpers) => Promise | void +type DeclarationProcessor = ( + decl: Declaration, + helper: postcss.Helpers +) => Promise | void +type RuleProcessor = (rule: Rule, helper: postcss.Helpers) => Promise | void +type AtRuleProcessor = (atRule: AtRule, helper: postcss.Helpers) => Promise | void +type CommentProcessor = ( + comment: Comment, + helper: postcss.Helpers +) => Promise | void + +interface Processors { + /** + * Will be called on all`AtRule` nodes. + * + * Will be called again on node or children changes. + */ + AtRule?: { [name: string]: AtRuleProcessor } | AtRuleProcessor + + /** + * Will be called on all `AtRule` nodes, when all children will be processed. + * + * Will be called again on node or children changes. + */ + AtRuleExit?: { [name: string]: AtRuleProcessor } | AtRuleProcessor + + /** + * Will be called on all `Comment` nodes. + * + * Will be called again on node or children changes. + */ + Comment?: CommentProcessor + + /** + * Will be called on all `Comment` nodes after listeners + * for `Comment` event. + * + * Will be called again on node or children changes. + */ + CommentExit?: CommentProcessor + + /** + * Will be called on all `Declaration` nodes after listeners + * for `Declaration` event. + * + * Will be called again on node or children changes. + */ + Declaration?: { [prop: string]: DeclarationProcessor } | DeclarationProcessor + + /** + * Will be called on all `Declaration` nodes. + * + * Will be called again on node or children changes. + */ + DeclarationExit?: + | { [prop: string]: DeclarationProcessor } + | DeclarationProcessor + + /** + * Will be called on `Document` node. + * + * Will be called again on children changes. + */ + Document?: DocumentProcessor + + /** + * Will be called on `Document` node, when all children will be processed. + * + * Will be called again on children changes. + */ + DocumentExit?: DocumentProcessor + + /** + * Will be called on `Root` node once. + */ + Once?: RootProcessor + + /** + * Will be called on `Root` node once, when all children will be processed. + */ + OnceExit?: RootProcessor + + /** + * Will be called on `Root` node. + * + * Will be called again on children changes. + */ + Root?: RootProcessor + + /** + * Will be called on `Root` node, when all children will be processed. + * + * Will be called again on children changes. + */ + RootExit?: RootProcessor + + /** + * Will be called on all `Rule` nodes. + * + * Will be called again on node or children changes. + */ + Rule?: RuleProcessor + + /** + * Will be called on all `Rule` nodes, when all children will be processed. + * + * Will be called again on node or children changes. + */ + RuleExit?: RuleProcessor +} + +declare namespace postcss { + export { + AnyNode, + AtRule, + AtRuleProps, + ChildNode, + ChildProps, + Comment, + CommentProps, + Container, + ContainerProps, + CssSyntaxError, + Declaration, + DeclarationProps, + Document, + DocumentProps, + FilePosition, + Input, + LazyResult, + list, + Message, + Node, + NodeErrorOptions, + NodeProps, + Position, + Processor, + Result, + Root, + RootProps, + Rule, + RuleProps, + Source, + Warning, + WarningOptions + } + + + export type Helpers = { postcss: Postcss; result: Result } & Postcss + + export interface Plugin extends Processors { + postcssPlugin: string + prepare?: (result: Result) => Processors + } + + export interface PluginCreator { + (opts?: PluginOptions): Plugin | Processor + postcss: true + } + + export interface Transformer extends TransformCallback { + postcssPlugin: string + postcssVersion: string + } + + export interface TransformCallback { + (root: Root, result: Result): Promise | void + } + + export interface OldPlugin extends Transformer { + (opts?: T): Transformer + postcss: Transformer + } + + export type AcceptedPlugin = + | { + postcss: Processor | TransformCallback + } + | OldPlugin + | Plugin + | PluginCreator + | Processor + | TransformCallback + + export interface Parser { + ( + css: { toString(): string } | string, + opts?: Pick + ): RootNode + } + + export interface Builder { + (part: string, node?: AnyNode, type?: 'end' | 'start'): void + } + + export interface Stringifier { + (node: AnyNode, builder: Builder): void + } + + export interface JSONHydrator { + (data: object): Node + (data: object[]): Node[] + } + + export interface Syntax { + /** + * Function to generate AST by string. + */ + parse?: Parser + + /** + * Class to generate string by AST. + */ + stringify?: Stringifier + } + + export interface SourceMapOptions { + /** + * Use absolute path in generated source map. + */ + absolute?: boolean + + /** + * Indicates that PostCSS should add annotation comments to the CSS. + * By default, PostCSS will always add a comment with a path + * to the source map. PostCSS will not add annotations to CSS files + * that do not contain any comments. + * + * By default, PostCSS presumes that you want to save the source map as + * `opts.to + '.map'` and will use this path in the annotation comment. + * A different path can be set by providing a string value for annotation. + * + * If you have set `inline: true`, annotation cannot be disabled. + */ + annotation?: ((file: string, root: Root) => string) | boolean | string + + /** + * Override `from` in map’s sources. + */ + from?: string + + /** + * Indicates that the source map should be embedded in the output CSS + * as a Base64-encoded comment. By default, it is `true`. + * But if all previous maps are external, not inline, PostCSS will not embed + * the map even if you do not set this option. + * + * If you have an inline source map, the result.map property will be empty, + * as the source map will be contained within the text of `result.css`. + */ + inline?: boolean + + /** + * Source map content from a previous processing step (e.g., Sass). + * + * PostCSS will try to read the previous source map + * automatically (based on comments within the source CSS), but you can use + * this option to identify it manually. + * + * If desired, you can omit the previous map with prev: `false`. + */ + prev?: ((file: string) => string) | boolean | object | string + + /** + * Indicates that PostCSS should set the origin content (e.g., Sass source) + * of the source map. By default, it is true. But if all previous maps do not + * contain sources content, PostCSS will also leave it out even if you + * do not set this option. + */ + sourcesContent?: boolean + } + + export interface ProcessOptions { + /** + * The path of the CSS source file. You should always set `from`, + * because it is used in source map generation and syntax error messages. + */ + from?: string | undefined + + /** + * Source map options + */ + map?: boolean | SourceMapOptions + + /** + * Function to generate AST by string. + */ + parser?: Parser | Syntax + + /** + * Class to generate string by AST. + */ + stringifier?: Stringifier | Syntax + + /** + * Object with parse and stringify. + */ + syntax?: Syntax + + /** + * The path where you'll put the output CSS file. You should always set `to` + * to generate correct source maps. + */ + to?: string + } + + export type Postcss = typeof postcss + + /** + * Default function to convert a node tree into a CSS string. + */ + export let stringify: Stringifier + + /** + * Parses source css and returns a new `Root` or `Document` node, + * which contains the source CSS nodes. + * + * ```js + * // Simple CSS concatenation with source map support + * const root1 = postcss.parse(css1, { from: file1 }) + * const root2 = postcss.parse(css2, { from: file2 }) + * root1.append(root2).toResult().css + * ``` + */ + export let parse: Parser + + /** + * Rehydrate a JSON AST (from `Node#toJSON`) back into the AST classes. + * + * ```js + * const json = root.toJSON() + * // save to file, send by network, etc + * const root2 = postcss.fromJSON(json) + * ``` + */ + export let fromJSON: JSONHydrator + + /** + * Creates a new `Comment` node. + * + * @param defaults Properties for the new node. + * @return New comment node + */ + export function comment(defaults?: CommentProps): Comment + + /** + * Creates a new `AtRule` node. + * + * @param defaults Properties for the new node. + * @return New at-rule node. + */ + export function atRule(defaults?: AtRuleProps): AtRule + + /** + * Creates a new `Declaration` node. + * + * @param defaults Properties for the new node. + * @return New declaration node. + */ + export function decl(defaults?: DeclarationProps): Declaration + + /** + * Creates a new `Rule` node. + * + * @param default Properties for the new node. + * @return New rule node. + */ + export function rule(defaults?: RuleProps): Rule + + /** + * Creates a new `Root` node. + * + * @param defaults Properties for the new node. + * @return New root node. + */ + export function root(defaults?: RootProps): Root + + /** + * Creates a new `Document` node. + * + * @param defaults Properties for the new node. + * @return New document node. + */ + export function document(defaults?: DocumentProps): Document + + export { postcss as default } +} + +/** + * Create a new `Processor` instance that will apply `plugins` + * as CSS processors. + * + * ```js + * let postcss = require('postcss') + * + * postcss(plugins).process(css, { from, to }).then(result => { + * console.log(result.css) + * }) + * ``` + * + * @param plugins PostCSS plugins. + * @return Processor to process multiple CSS. + */ +declare function postcss(plugins?: postcss.AcceptedPlugin[]): Processor +declare function postcss(...plugins: postcss.AcceptedPlugin[]): Processor + +export = postcss diff --git a/src/postcss/postcss.js b/src/postcss/postcss.js new file mode 100644 index 0000000..8733a9a --- /dev/null +++ b/src/postcss/postcss.js @@ -0,0 +1,6520 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.postcss = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // Trim off extra bytes after placeholder bytes are found + // See: https://github.com/beatgammit/base64-js/issues/42 + var validLen = b64.indexOf('=') + if (validLen === -1) validLen = len + + var placeHoldersLen = validLen === len + ? 0 + : 4 - (validLen % 4) + + return [validLen, placeHoldersLen] +} + +// base64 is 4/3 + up to two characters of the original data +function byteLength (b64) { + var lens = getLens(b64) + var validLen = lens[0] + var placeHoldersLen = lens[1] + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen +} + +function _byteLength (b64, validLen, placeHoldersLen) { + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen +} + +function toByteArray (b64) { + var tmp + var lens = getLens(b64) + var validLen = lens[0] + var placeHoldersLen = lens[1] + + var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)) + + var curByte = 0 + + // if there are placeholders, only get up to the last complete 4 chars + var len = placeHoldersLen > 0 + ? validLen - 4 + : validLen + + var i + for (i = 0; i < len; i += 4) { + tmp = + (revLookup[b64.charCodeAt(i)] << 18) | + (revLookup[b64.charCodeAt(i + 1)] << 12) | + (revLookup[b64.charCodeAt(i + 2)] << 6) | + revLookup[b64.charCodeAt(i + 3)] + arr[curByte++] = (tmp >> 16) & 0xFF + arr[curByte++] = (tmp >> 8) & 0xFF + arr[curByte++] = tmp & 0xFF + } + + if (placeHoldersLen === 2) { + tmp = + (revLookup[b64.charCodeAt(i)] << 2) | + (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[curByte++] = tmp & 0xFF + } + + if (placeHoldersLen === 1) { + tmp = + (revLookup[b64.charCodeAt(i)] << 10) | + (revLookup[b64.charCodeAt(i + 1)] << 4) | + (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[curByte++] = (tmp >> 8) & 0xFF + arr[curByte++] = tmp & 0xFF + } + + return arr +} + +function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + + lookup[num >> 12 & 0x3F] + + lookup[num >> 6 & 0x3F] + + lookup[num & 0x3F] +} + +function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = + ((uint8[i] << 16) & 0xFF0000) + + ((uint8[i + 1] << 8) & 0xFF00) + + (uint8[i + 2] & 0xFF) + output.push(tripletToBase64(tmp)) + } + return output.join('') +} + +function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + parts.push( + lookup[tmp >> 2] + + lookup[(tmp << 4) & 0x3F] + + '==' + ) + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + uint8[len - 1] + parts.push( + lookup[tmp >> 10] + + lookup[(tmp >> 4) & 0x3F] + + lookup[(tmp << 2) & 0x3F] + + '=' + ) + } + + return parts.join('') +} + +},{}],2:[function(require,module,exports){ + +},{}],3:[function(require,module,exports){ +(function (Buffer){(function (){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +/* eslint-disable no-proto */ + +'use strict' + +var base64 = require('base64-js') +var ieee754 = require('ieee754') + +exports.Buffer = Buffer +exports.SlowBuffer = SlowBuffer +exports.INSPECT_MAX_BYTES = 50 + +var K_MAX_LENGTH = 0x7fffffff +exports.kMaxLength = K_MAX_LENGTH + +/** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Print warning and recommend using `buffer` v4.x which has an Object + * implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * We report that the browser does not support typed arrays if the are not subclassable + * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array` + * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support + * for __proto__ and has a buggy typed array implementation. + */ +Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport() + +if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' && + typeof console.error === 'function') { + console.error( + 'This browser lacks typed array (Uint8Array) support which is required by ' + + '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.' + ) +} + +function typedArraySupport () { + // Can typed array instances can be augmented? + try { + var arr = new Uint8Array(1) + arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } } + return arr.foo() === 42 + } catch (e) { + return false + } +} + +Object.defineProperty(Buffer.prototype, 'parent', { + enumerable: true, + get: function () { + if (!Buffer.isBuffer(this)) return undefined + return this.buffer + } +}) + +Object.defineProperty(Buffer.prototype, 'offset', { + enumerable: true, + get: function () { + if (!Buffer.isBuffer(this)) return undefined + return this.byteOffset + } +}) + +function createBuffer (length) { + if (length > K_MAX_LENGTH) { + throw new RangeError('The value "' + length + '" is invalid for option "size"') + } + // Return an augmented `Uint8Array` instance + var buf = new Uint8Array(length) + buf.__proto__ = Buffer.prototype + return buf +} + +/** + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. + * + * The `Uint8Array` prototype remains unmodified. + */ + +function Buffer (arg, encodingOrOffset, length) { + // Common case. + if (typeof arg === 'number') { + if (typeof encodingOrOffset === 'string') { + throw new TypeError( + 'The "string" argument must be of type string. Received type number' + ) + } + return allocUnsafe(arg) + } + return from(arg, encodingOrOffset, length) +} + +// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 +if (typeof Symbol !== 'undefined' && Symbol.species != null && + Buffer[Symbol.species] === Buffer) { + Object.defineProperty(Buffer, Symbol.species, { + value: null, + configurable: true, + enumerable: false, + writable: false + }) +} + +Buffer.poolSize = 8192 // not used by this implementation + +function from (value, encodingOrOffset, length) { + if (typeof value === 'string') { + return fromString(value, encodingOrOffset) + } + + if (ArrayBuffer.isView(value)) { + return fromArrayLike(value) + } + + if (value == null) { + throw TypeError( + 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + + 'or Array-like Object. Received type ' + (typeof value) + ) + } + + if (isInstance(value, ArrayBuffer) || + (value && isInstance(value.buffer, ArrayBuffer))) { + return fromArrayBuffer(value, encodingOrOffset, length) + } + + if (typeof value === 'number') { + throw new TypeError( + 'The "value" argument must not be of type number. Received type number' + ) + } + + var valueOf = value.valueOf && value.valueOf() + if (valueOf != null && valueOf !== value) { + return Buffer.from(valueOf, encodingOrOffset, length) + } + + var b = fromObject(value) + if (b) return b + + if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null && + typeof value[Symbol.toPrimitive] === 'function') { + return Buffer.from( + value[Symbol.toPrimitive]('string'), encodingOrOffset, length + ) + } + + throw new TypeError( + 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + + 'or Array-like Object. Received type ' + (typeof value) + ) +} + +/** + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ +Buffer.from = function (value, encodingOrOffset, length) { + return from(value, encodingOrOffset, length) +} + +// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug: +// https://github.com/feross/buffer/pull/148 +Buffer.prototype.__proto__ = Uint8Array.prototype +Buffer.__proto__ = Uint8Array + +function assertSize (size) { + if (typeof size !== 'number') { + throw new TypeError('"size" argument must be of type number') + } else if (size < 0) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } +} + +function alloc (size, fill, encoding) { + assertSize(size) + if (size <= 0) { + return createBuffer(size) + } + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === 'string' + ? createBuffer(size).fill(fill, encoding) + : createBuffer(size).fill(fill) + } + return createBuffer(size) +} + +/** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ +Buffer.alloc = function (size, fill, encoding) { + return alloc(size, fill, encoding) +} + +function allocUnsafe (size) { + assertSize(size) + return createBuffer(size < 0 ? 0 : checked(size) | 0) +} + +/** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ +Buffer.allocUnsafe = function (size) { + return allocUnsafe(size) +} +/** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. + */ +Buffer.allocUnsafeSlow = function (size) { + return allocUnsafe(size) +} + +function fromString (string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8' + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + + var length = byteLength(string, encoding) | 0 + var buf = createBuffer(length) + + var actual = buf.write(string, encoding) + + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + buf = buf.slice(0, actual) + } + + return buf +} + +function fromArrayLike (array) { + var length = array.length < 0 ? 0 : checked(array.length) | 0 + var buf = createBuffer(length) + for (var i = 0; i < length; i += 1) { + buf[i] = array[i] & 255 + } + return buf +} + +function fromArrayBuffer (array, byteOffset, length) { + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('"offset" is outside of buffer bounds') + } + + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('"length" is outside of buffer bounds') + } + + var buf + if (byteOffset === undefined && length === undefined) { + buf = new Uint8Array(array) + } else if (length === undefined) { + buf = new Uint8Array(array, byteOffset) + } else { + buf = new Uint8Array(array, byteOffset, length) + } + + // Return an augmented `Uint8Array` instance + buf.__proto__ = Buffer.prototype + return buf +} + +function fromObject (obj) { + if (Buffer.isBuffer(obj)) { + var len = checked(obj.length) | 0 + var buf = createBuffer(len) + + if (buf.length === 0) { + return buf + } + + obj.copy(buf, 0, 0, len) + return buf + } + + if (obj.length !== undefined) { + if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { + return createBuffer(0) + } + return fromArrayLike(obj) + } + + if (obj.type === 'Buffer' && Array.isArray(obj.data)) { + return fromArrayLike(obj.data) + } +} + +function checked (length) { + // Note: cannot use `length < K_MAX_LENGTH` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= K_MAX_LENGTH) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes') + } + return length | 0 +} + +function SlowBuffer (length) { + if (+length != length) { // eslint-disable-line eqeqeq + length = 0 + } + return Buffer.alloc(+length) +} + +Buffer.isBuffer = function isBuffer (b) { + return b != null && b._isBuffer === true && + b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false +} + +Buffer.compare = function compare (a, b) { + if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength) + if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength) + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError( + 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' + ) + } + + if (a === b) return 0 + + var x = a.length + var y = b.length + + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i] + y = b[i] + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'latin1': + case 'binary': + case 'base64': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } +} + +Buffer.concat = function concat (list, length) { + if (!Array.isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + + if (list.length === 0) { + return Buffer.alloc(0) + } + + var i + if (length === undefined) { + length = 0 + for (i = 0; i < list.length; ++i) { + length += list[i].length + } + } + + var buffer = Buffer.allocUnsafe(length) + var pos = 0 + for (i = 0; i < list.length; ++i) { + var buf = list[i] + if (isInstance(buf, Uint8Array)) { + buf = Buffer.from(buf) + } + if (!Buffer.isBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + buf.copy(buffer, pos) + pos += buf.length + } + return buffer +} + +function byteLength (string, encoding) { + if (Buffer.isBuffer(string)) { + return string.length + } + if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { + return string.byteLength + } + if (typeof string !== 'string') { + throw new TypeError( + 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + + 'Received type ' + typeof string + ) + } + + var len = string.length + var mustMatch = (arguments.length > 2 && arguments[2] === true) + if (!mustMatch && len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false + for (;;) { + switch (encoding) { + case 'ascii': + case 'latin1': + case 'binary': + return len + case 'utf8': + case 'utf-8': + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) { + return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8 + } + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} +Buffer.byteLength = byteLength + +function slowToString (encoding, start, end) { + var loweredCase = false + + // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. + + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + if (start === undefined || start < 0) { + start = 0 + } + // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + if (start > this.length) { + return '' + } + + if (end === undefined || end > this.length) { + end = this.length + } + + if (end <= 0) { + return '' + } + + // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + end >>>= 0 + start >>>= 0 + + if (end <= start) { + return '' + } + + if (!encoding) encoding = 'utf8' + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) + + case 'ascii': + return asciiSlice(this, start, end) + + case 'latin1': + case 'binary': + return latin1Slice(this, start, end) + + case 'base64': + return base64Slice(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase() + loweredCase = true + } + } +} + +// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package) +// to detect a Buffer instance. It's not possible to use `instanceof Buffer` +// reliably in a browserify context because there could be multiple different +// copies of the 'buffer' package in use. This method works even for Buffer +// instances that were created from another copy of the `buffer` package. +// See: https://github.com/feross/buffer/issues/154 +Buffer.prototype._isBuffer = true + +function swap (b, n, m) { + var i = b[n] + b[n] = b[m] + b[m] = i +} + +Buffer.prototype.swap16 = function swap16 () { + var len = this.length + if (len % 2 !== 0) { + throw new RangeError('Buffer size must be a multiple of 16-bits') + } + for (var i = 0; i < len; i += 2) { + swap(this, i, i + 1) + } + return this +} + +Buffer.prototype.swap32 = function swap32 () { + var len = this.length + if (len % 4 !== 0) { + throw new RangeError('Buffer size must be a multiple of 32-bits') + } + for (var i = 0; i < len; i += 4) { + swap(this, i, i + 3) + swap(this, i + 1, i + 2) + } + return this +} + +Buffer.prototype.swap64 = function swap64 () { + var len = this.length + if (len % 8 !== 0) { + throw new RangeError('Buffer size must be a multiple of 64-bits') + } + for (var i = 0; i < len; i += 8) { + swap(this, i, i + 7) + swap(this, i + 1, i + 6) + swap(this, i + 2, i + 5) + swap(this, i + 3, i + 4) + } + return this +} + +Buffer.prototype.toString = function toString () { + var length = this.length + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) +} + +Buffer.prototype.toLocaleString = Buffer.prototype.toString + +Buffer.prototype.equals = function equals (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 +} + +Buffer.prototype.inspect = function inspect () { + var str = '' + var max = exports.INSPECT_MAX_BYTES + str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim() + if (this.length > max) str += ' ... ' + return '' +} + +Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { + if (isInstance(target, Uint8Array)) { + target = Buffer.from(target, target.offset, target.byteLength) + } + if (!Buffer.isBuffer(target)) { + throw new TypeError( + 'The "target" argument must be one of type Buffer or Uint8Array. ' + + 'Received type ' + (typeof target) + ) + } + + if (start === undefined) { + start = 0 + } + if (end === undefined) { + end = target ? target.length : 0 + } + if (thisStart === undefined) { + thisStart = 0 + } + if (thisEnd === undefined) { + thisEnd = this.length + } + + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError('out of range index') + } + + if (thisStart >= thisEnd && start >= end) { + return 0 + } + if (thisStart >= thisEnd) { + return -1 + } + if (start >= end) { + return 1 + } + + start >>>= 0 + end >>>= 0 + thisStart >>>= 0 + thisEnd >>>= 0 + + if (this === target) return 0 + + var x = thisEnd - thisStart + var y = end - start + var len = Math.min(x, y) + + var thisCopy = this.slice(thisStart, thisEnd) + var targetCopy = target.slice(start, end) + + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i] + y = targetCopy[i] + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, +// OR the last index of `val` in `buffer` at offset <= `byteOffset`. +// +// Arguments: +// - buffer - a Buffer to search +// - val - a string, Buffer, or number +// - byteOffset - an index into `buffer`; will be clamped to an int32 +// - encoding - an optional encoding, relevant is val is a string +// - dir - true for indexOf, false for lastIndexOf +function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1 + + // Normalize byteOffset + if (typeof byteOffset === 'string') { + encoding = byteOffset + byteOffset = 0 + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000 + } + byteOffset = +byteOffset // Coerce to Number. + if (numberIsNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : (buffer.length - 1) + } + + // Normalize byteOffset: negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = buffer.length + byteOffset + if (byteOffset >= buffer.length) { + if (dir) return -1 + else byteOffset = buffer.length - 1 + } else if (byteOffset < 0) { + if (dir) byteOffset = 0 + else return -1 + } + + // Normalize val + if (typeof val === 'string') { + val = Buffer.from(val, encoding) + } + + // Finally, search either indexOf (if dir is true) or lastIndexOf + if (Buffer.isBuffer(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1 + } + return arrayIndexOf(buffer, val, byteOffset, encoding, dir) + } else if (typeof val === 'number') { + val = val & 0xFF // Search for a byte value [0-255] + if (typeof Uint8Array.prototype.indexOf === 'function') { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) + } + } + return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) + } + + throw new TypeError('val must be string, number or Buffer') +} + +function arrayIndexOf (arr, val, byteOffset, encoding, dir) { + var indexSize = 1 + var arrLength = arr.length + var valLength = val.length + + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase() + if (encoding === 'ucs2' || encoding === 'ucs-2' || + encoding === 'utf16le' || encoding === 'utf-16le') { + if (arr.length < 2 || val.length < 2) { + return -1 + } + indexSize = 2 + arrLength /= 2 + valLength /= 2 + byteOffset /= 2 + } + } + + function read (buf, i) { + if (indexSize === 1) { + return buf[i] + } else { + return buf.readUInt16BE(i * indexSize) + } + } + + var i + if (dir) { + var foundIndex = -1 + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize + } else { + if (foundIndex !== -1) i -= i - foundIndex + foundIndex = -1 + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength + for (i = byteOffset; i >= 0; i--) { + var found = true + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false + break + } + } + if (found) return i + } + } + + return -1 +} + +Buffer.prototype.includes = function includes (val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1 +} + +Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true) +} + +Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false) +} + +function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0 + var remaining = buf.length - offset + if (!length) { + length = remaining + } else { + length = Number(length) + if (length > remaining) { + length = remaining + } + } + + var strLen = string.length + + if (length > strLen / 2) { + length = strLen / 2 + } + for (var i = 0; i < length; ++i) { + var parsed = parseInt(string.substr(i * 2, 2), 16) + if (numberIsNaN(parsed)) return i + buf[offset + i] = parsed + } + return i +} + +function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) +} + +function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) +} + +function latin1Write (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) +} + +function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) +} + +function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) +} + +Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8' + length = this.length + offset = 0 + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset + length = this.length + offset = 0 + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset >>> 0 + if (isFinite(length)) { + length = length >>> 0 + if (encoding === undefined) encoding = 'utf8' + } else { + encoding = length + length = undefined + } + } else { + throw new Error( + 'Buffer.write(string, encoding, offset[, length]) is no longer supported' + ) + } + + var remaining = this.length - offset + if (length === undefined || length > remaining) length = remaining + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('Attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8' + + var loweredCase = false + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'latin1': + case 'binary': + return latin1Write(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } +} + +function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf) + } else { + return base64.fromByteArray(buf.slice(start, end)) + } +} + +function utf8Slice (buf, start, end) { + end = Math.min(buf.length, end) + var res = [] + + var i = start + while (i < end) { + var firstByte = buf[i] + var codePoint = null + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1 + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte + } + break + case 2: + secondByte = buf[i + 1] + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint + } + } + break + case 3: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint + } + } + break + case 4: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + fourthByte = buf[i + 3] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD + bytesPerSequence = 1 + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000 + res.push(codePoint >>> 10 & 0x3FF | 0xD800) + codePoint = 0xDC00 | codePoint & 0x3FF + } + + res.push(codePoint) + i += bytesPerSequence + } + + return decodeCodePointsArray(res) +} + +// Based on http://stackoverflow.com/a/22747272/680742, the browser with +// the lowest limit is Chrome, with 0x10000 args. +// We go 1 magnitude less, for safety +var MAX_ARGUMENTS_LENGTH = 0x1000 + +function decodeCodePointsArray (codePoints) { + var len = codePoints.length + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = '' + var i = 0 + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ) + } + return res +} + +function asciiSlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 0x7F) + } + return ret +} + +function latin1Slice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]) + } + return ret +} + +function hexSlice (buf, start, end) { + var len = buf.length + + if (!start || start < 0) start = 0 + if (!end || end < 0 || end > len) end = len + + var out = '' + for (var i = start; i < end; ++i) { + out += toHex(buf[i]) + } + return out +} + +function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end) + var res = '' + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256)) + } + return res +} + +Buffer.prototype.slice = function slice (start, end) { + var len = this.length + start = ~~start + end = end === undefined ? len : ~~end + + if (start < 0) { + start += len + if (start < 0) start = 0 + } else if (start > len) { + start = len + } + + if (end < 0) { + end += len + if (end < 0) end = 0 + } else if (end > len) { + end = len + } + + if (end < start) end = start + + var newBuf = this.subarray(start, end) + // Return an augmented `Uint8Array` instance + newBuf.__proto__ = Buffer.prototype + return newBuf +} + +/* + * Need to make sure that buffer isn't trying to write out of bounds. + */ +function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') +} + +Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + + return val +} + +Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + checkOffset(offset, byteLength, this.length) + } + + var val = this[offset + --byteLength] + var mul = 1 + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul + } + + return val +} + +Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 1, this.length) + return this[offset] +} + +Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + return this[offset] | (this[offset + 1] << 8) +} + +Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + return (this[offset] << 8) | this[offset + 1] +} + +Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) +} + +Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) +} + +Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var i = byteLength + var mul = 1 + var val = this[offset + --i] + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 1, this.length) + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) +} + +Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset] | (this[offset + 1] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset + 1] | (this[offset] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) +} + +Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) +} + +Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, true, 23, 4) +} + +Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, false, 23, 4) +} + +Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, true, 52, 8) +} + +Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, false, 52, 8) +} + +function checkInt (buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') + if (offset + ext > buf.length) throw new RangeError('Index out of range') +} + +Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } + + var mul = 1 + var i = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } + + var i = byteLength - 1 + var mul = 1 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + return offset + 2 +} + +Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + return offset + 2 +} + +Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + this[offset + 3] = (value >>> 24) + this[offset + 2] = (value >>> 16) + this[offset + 1] = (value >>> 8) + this[offset] = (value & 0xff) + return offset + 4 +} + +Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + return offset + 4 +} + +Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + var limit = Math.pow(2, (8 * byteLength) - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = 0 + var mul = 1 + var sub = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1 + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + var limit = Math.pow(2, (8 * byteLength) - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = byteLength - 1 + var mul = 1 + var sub = 0 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1 + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) + if (value < 0) value = 0xff + value + 1 + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + return offset + 2 +} + +Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + return offset + 2 +} + +Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + this[offset + 2] = (value >>> 16) + this[offset + 3] = (value >>> 24) + return offset + 4 +} + +Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (value < 0) value = 0xffffffff + value + 1 + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + return offset + 4 +} + +function checkIEEE754 (buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) throw new RangeError('Index out of range') + if (offset < 0) throw new RangeError('Index out of range') +} + +function writeFloat (buf, value, offset, littleEndian, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) + } + ieee754.write(buf, value, offset, littleEndian, 23, 4) + return offset + 4 +} + +Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) +} + +function writeDouble (buf, value, offset, littleEndian, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) + } + ieee754.write(buf, value, offset, littleEndian, 52, 8) + return offset + 8 +} + +Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) +} + +// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) +Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer') + if (!start) start = 0 + if (!end && end !== 0) end = this.length + if (targetStart >= target.length) targetStart = target.length + if (!targetStart) targetStart = 0 + if (end > 0 && end < start) end = start + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('Index out of range') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start + } + + var len = end - start + + if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') { + // Use built-in when available, missing from IE11 + this.copyWithin(targetStart, start, end) + } else if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (var i = len - 1; i >= 0; --i) { + target[i + targetStart] = this[i + start] + } + } else { + Uint8Array.prototype.set.call( + target, + this.subarray(start, end), + targetStart + ) + } + + return len +} + +// Usage: +// buffer.fill(number[, offset[, end]]) +// buffer.fill(buffer[, offset[, end]]) +// buffer.fill(string[, offset[, end]][, encoding]) +Buffer.prototype.fill = function fill (val, start, end, encoding) { + // Handle string cases: + if (typeof val === 'string') { + if (typeof start === 'string') { + encoding = start + start = 0 + end = this.length + } else if (typeof end === 'string') { + encoding = end + end = this.length + } + if (encoding !== undefined && typeof encoding !== 'string') { + throw new TypeError('encoding must be a string') + } + if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + if (val.length === 1) { + var code = val.charCodeAt(0) + if ((encoding === 'utf8' && code < 128) || + encoding === 'latin1') { + // Fast path: If `val` fits into a single byte, use that numeric value. + val = code + } + } + } else if (typeof val === 'number') { + val = val & 255 + } + + // Invalid ranges are not set to a default, so can range check early. + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError('Out of range index') + } + + if (end <= start) { + return this + } + + start = start >>> 0 + end = end === undefined ? this.length : end >>> 0 + + if (!val) val = 0 + + var i + if (typeof val === 'number') { + for (i = start; i < end; ++i) { + this[i] = val + } + } else { + var bytes = Buffer.isBuffer(val) + ? val + : Buffer.from(val, encoding) + var len = bytes.length + if (len === 0) { + throw new TypeError('The value "' + val + + '" is invalid for argument "value"') + } + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len] + } + } + + return this +} + +// HELPER FUNCTIONS +// ================ + +var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g + +function base64clean (str) { + // Node takes equal signs as end of the Base64 encoding + str = str.split('=')[0] + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = str.trim().replace(INVALID_BASE64_RE, '') + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '=' + } + return str +} + +function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) +} + +function utf8ToBytes (string, units) { + units = units || Infinity + var codePoint + var length = string.length + var leadSurrogate = null + var bytes = [] + + for (var i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i) + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } + + // valid lead + leadSurrogate = codePoint + + continue + } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = codePoint + continue + } + + // valid surrogate pair + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + } + + leadSurrogate = null + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint) + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else { + throw new Error('Invalid code point') + } + } + + return bytes +} + +function asciiToBytes (str) { + var byteArray = [] + for (var i = 0; i < str.length; ++i) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF) + } + return byteArray +} + +function utf16leToBytes (str, units) { + var c, hi, lo + var byteArray = [] + for (var i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i) + hi = c >> 8 + lo = c % 256 + byteArray.push(lo) + byteArray.push(hi) + } + + return byteArray +} + +function base64ToBytes (str) { + return base64.toByteArray(base64clean(str)) +} + +function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; ++i) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i] + } + return i +} + +// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass +// the `instanceof` check but they should be treated as of that type. +// See: https://github.com/feross/buffer/issues/166 +function isInstance (obj, type) { + return obj instanceof type || + (obj != null && obj.constructor != null && obj.constructor.name != null && + obj.constructor.name === type.name) +} +function numberIsNaN (obj) { + // For IE11 support + return obj !== obj // eslint-disable-line no-self-compare +} + +}).call(this)}).call(this,require("buffer").Buffer) +},{"base64-js":1,"buffer":3,"ieee754":4}],4:[function(require,module,exports){ +/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh */ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = (nBytes * 8) - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = (nBytes * 8) - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = ((value * c) - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + +},{}],5:[function(require,module,exports){ +let urlAlphabet = + 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict' +let customAlphabet = (alphabet, defaultSize = 21) => { + return (size = defaultSize) => { + let id = '' + let i = size + while (i--) { + id += alphabet[(Math.random() * alphabet.length) | 0] + } + return id + } +} +let nanoid = (size = 21) => { + let id = '' + let i = size + while (i--) { + id += urlAlphabet[(Math.random() * 64) | 0] + } + return id +} +module.exports = { nanoid, customAlphabet } + +},{}],6:[function(require,module,exports){ +var x=String; +var create=function() {return {isColorSupported:false,reset:x,bold:x,dim:x,italic:x,underline:x,inverse:x,hidden:x,strikethrough:x,black:x,red:x,green:x,yellow:x,blue:x,magenta:x,cyan:x,white:x,gray:x,bgBlack:x,bgRed:x,bgGreen:x,bgYellow:x,bgBlue:x,bgMagenta:x,bgCyan:x,bgWhite:x}}; +module.exports=create(); +module.exports.createColors = create; + +},{}],7:[function(require,module,exports){ +'use strict' + +let Container = require('./container') + +class AtRule extends Container { + constructor(defaults) { + super(defaults) + this.type = 'atrule' + } + + append(...children) { + if (!this.proxyOf.nodes) this.nodes = [] + return super.append(...children) + } + + prepend(...children) { + if (!this.proxyOf.nodes) this.nodes = [] + return super.prepend(...children) + } +} + +module.exports = AtRule +AtRule.default = AtRule + +Container.registerAtRule(AtRule) + +},{"./container":9}],8:[function(require,module,exports){ +'use strict' + +let Node = require('./node') + +class Comment extends Node { + constructor(defaults) { + super(defaults) + this.type = 'comment' + } +} + +module.exports = Comment +Comment.default = Comment + +},{"./node":19}],9:[function(require,module,exports){ +'use strict' + +let { isClean, my } = require('./symbols') +let Declaration = require('./declaration') +let Comment = require('./comment') +let Node = require('./node') + +let parse, Rule, AtRule, Root + +function cleanSource(nodes) { + return nodes.map(i => { + if (i.nodes) i.nodes = cleanSource(i.nodes) + delete i.source + return i + }) +} + +function markTreeDirty(node) { + node[isClean] = false + if (node.proxyOf.nodes) { + for (let i of node.proxyOf.nodes) { + markTreeDirty(i) + } + } +} + +class Container extends Node { + append(...children) { + for (let child of children) { + let nodes = this.normalize(child, this.last) + for (let node of nodes) this.proxyOf.nodes.push(node) + } + + this.markDirty() + + return this + } + + cleanRaws(keepBetween) { + super.cleanRaws(keepBetween) + if (this.nodes) { + for (let node of this.nodes) node.cleanRaws(keepBetween) + } + } + + each(callback) { + if (!this.proxyOf.nodes) return undefined + let iterator = this.getIterator() + + let index, result + while (this.indexes[iterator] < this.proxyOf.nodes.length) { + index = this.indexes[iterator] + result = callback(this.proxyOf.nodes[index], index) + if (result === false) break + + this.indexes[iterator] += 1 + } + + delete this.indexes[iterator] + return result + } + + every(condition) { + return this.nodes.every(condition) + } + + getIterator() { + if (!this.lastEach) this.lastEach = 0 + if (!this.indexes) this.indexes = {} + + this.lastEach += 1 + let iterator = this.lastEach + this.indexes[iterator] = 0 + + return iterator + } + + getProxyProcessor() { + return { + get(node, prop) { + if (prop === 'proxyOf') { + return node + } else if (!node[prop]) { + return node[prop] + } else if ( + prop === 'each' || + (typeof prop === 'string' && prop.startsWith('walk')) + ) { + return (...args) => { + return node[prop]( + ...args.map(i => { + if (typeof i === 'function') { + return (child, index) => i(child.toProxy(), index) + } else { + return i + } + }) + ) + } + } else if (prop === 'every' || prop === 'some') { + return cb => { + return node[prop]((child, ...other) => + cb(child.toProxy(), ...other) + ) + } + } else if (prop === 'root') { + return () => node.root().toProxy() + } else if (prop === 'nodes') { + return node.nodes.map(i => i.toProxy()) + } else if (prop === 'first' || prop === 'last') { + return node[prop].toProxy() + } else { + return node[prop] + } + }, + + set(node, prop, value) { + if (node[prop] === value) return true + node[prop] = value + if (prop === 'name' || prop === 'params' || prop === 'selector') { + node.markDirty() + } + return true + } + } + } + + index(child) { + if (typeof child === 'number') return child + if (child.proxyOf) child = child.proxyOf + return this.proxyOf.nodes.indexOf(child) + } + + insertAfter(exist, add) { + let existIndex = this.index(exist) + let nodes = this.normalize(add, this.proxyOf.nodes[existIndex]).reverse() + existIndex = this.index(exist) + for (let node of nodes) this.proxyOf.nodes.splice(existIndex + 1, 0, node) + + let index + for (let id in this.indexes) { + index = this.indexes[id] + if (existIndex < index) { + this.indexes[id] = index + nodes.length + } + } + + this.markDirty() + + return this + } + + insertBefore(exist, add) { + let existIndex = this.index(exist) + let type = existIndex === 0 ? 'prepend' : false + let nodes = this.normalize( + add, + this.proxyOf.nodes[existIndex], + type + ).reverse() + existIndex = this.index(exist) + for (let node of nodes) this.proxyOf.nodes.splice(existIndex, 0, node) + + let index + for (let id in this.indexes) { + index = this.indexes[id] + if (existIndex <= index) { + this.indexes[id] = index + nodes.length + } + } + + this.markDirty() + + return this + } + + normalize(nodes, sample) { + if (typeof nodes === 'string') { + nodes = cleanSource(parse(nodes).nodes) + } else if (typeof nodes === 'undefined') { + nodes = [] + } else if (Array.isArray(nodes)) { + nodes = nodes.slice(0) + for (let i of nodes) { + if (i.parent) i.parent.removeChild(i, 'ignore') + } + } else if (nodes.type === 'root' && this.type !== 'document') { + nodes = nodes.nodes.slice(0) + for (let i of nodes) { + if (i.parent) i.parent.removeChild(i, 'ignore') + } + } else if (nodes.type) { + nodes = [nodes] + } else if (nodes.prop) { + if (typeof nodes.value === 'undefined') { + throw new Error('Value field is missed in node creation') + } else if (typeof nodes.value !== 'string') { + nodes.value = String(nodes.value) + } + nodes = [new Declaration(nodes)] + } else if (nodes.selector) { + nodes = [new Rule(nodes)] + } else if (nodes.name) { + nodes = [new AtRule(nodes)] + } else if (nodes.text) { + nodes = [new Comment(nodes)] + } else { + throw new Error('Unknown node type in node creation') + } + + let processed = nodes.map(i => { + /* c8 ignore next */ + if (!i[my]) Container.rebuild(i) + i = i.proxyOf + if (i.parent) i.parent.removeChild(i) + if (i[isClean]) markTreeDirty(i) + if (typeof i.raws.before === 'undefined') { + if (sample && typeof sample.raws.before !== 'undefined') { + i.raws.before = sample.raws.before.replace(/\S/g, '') + } + } + i.parent = this.proxyOf + return i + }) + + return processed + } + + prepend(...children) { + children = children.reverse() + for (let child of children) { + let nodes = this.normalize(child, this.first, 'prepend').reverse() + for (let node of nodes) this.proxyOf.nodes.unshift(node) + for (let id in this.indexes) { + this.indexes[id] = this.indexes[id] + nodes.length + } + } + + this.markDirty() + + return this + } + + push(child) { + child.parent = this + this.proxyOf.nodes.push(child) + return this + } + + removeAll() { + for (let node of this.proxyOf.nodes) node.parent = undefined + this.proxyOf.nodes = [] + + this.markDirty() + + return this + } + + removeChild(child) { + child = this.index(child) + this.proxyOf.nodes[child].parent = undefined + this.proxyOf.nodes.splice(child, 1) + + let index + for (let id in this.indexes) { + index = this.indexes[id] + if (index >= child) { + this.indexes[id] = index - 1 + } + } + + this.markDirty() + + return this + } + + replaceValues(pattern, opts, callback) { + if (!callback) { + callback = opts + opts = {} + } + + this.walkDecls(decl => { + if (opts.props && !opts.props.includes(decl.prop)) return + if (opts.fast && !decl.value.includes(opts.fast)) return + + decl.value = decl.value.replace(pattern, callback) + }) + + this.markDirty() + + return this + } + + some(condition) { + return this.nodes.some(condition) + } + + walk(callback) { + return this.each((child, i) => { + let result + try { + result = callback(child, i) + } catch (e) { + throw child.addToError(e) + } + if (result !== false && child.walk) { + result = child.walk(callback) + } + + return result + }) + } + + walkAtRules(name, callback) { + if (!callback) { + callback = name + return this.walk((child, i) => { + if (child.type === 'atrule') { + return callback(child, i) + } + }) + } + if (name instanceof RegExp) { + return this.walk((child, i) => { + if (child.type === 'atrule' && name.test(child.name)) { + return callback(child, i) + } + }) + } + return this.walk((child, i) => { + if (child.type === 'atrule' && child.name === name) { + return callback(child, i) + } + }) + } + + walkComments(callback) { + return this.walk((child, i) => { + if (child.type === 'comment') { + return callback(child, i) + } + }) + } + + walkDecls(prop, callback) { + if (!callback) { + callback = prop + return this.walk((child, i) => { + if (child.type === 'decl') { + return callback(child, i) + } + }) + } + if (prop instanceof RegExp) { + return this.walk((child, i) => { + if (child.type === 'decl' && prop.test(child.prop)) { + return callback(child, i) + } + }) + } + return this.walk((child, i) => { + if (child.type === 'decl' && child.prop === prop) { + return callback(child, i) + } + }) + } + + walkRules(selector, callback) { + if (!callback) { + callback = selector + + return this.walk((child, i) => { + if (child.type === 'rule') { + return callback(child, i) + } + }) + } + if (selector instanceof RegExp) { + return this.walk((child, i) => { + if (child.type === 'rule' && selector.test(child.selector)) { + return callback(child, i) + } + }) + } + return this.walk((child, i) => { + if (child.type === 'rule' && child.selector === selector) { + return callback(child, i) + } + }) + } + + get first() { + if (!this.proxyOf.nodes) return undefined + return this.proxyOf.nodes[0] + } + + get last() { + if (!this.proxyOf.nodes) return undefined + return this.proxyOf.nodes[this.proxyOf.nodes.length - 1] + } +} + +Container.registerParse = dependant => { + parse = dependant +} + +Container.registerRule = dependant => { + Rule = dependant +} + +Container.registerAtRule = dependant => { + AtRule = dependant +} + +Container.registerRoot = dependant => { + Root = dependant +} + +module.exports = Container +Container.default = Container + +/* c8 ignore start */ +Container.rebuild = node => { + if (node.type === 'atrule') { + Object.setPrototypeOf(node, AtRule.prototype) + } else if (node.type === 'rule') { + Object.setPrototypeOf(node, Rule.prototype) + } else if (node.type === 'decl') { + Object.setPrototypeOf(node, Declaration.prototype) + } else if (node.type === 'comment') { + Object.setPrototypeOf(node, Comment.prototype) + } else if (node.type === 'root') { + Object.setPrototypeOf(node, Root.prototype) + } + + node[my] = true + + if (node.nodes) { + node.nodes.forEach(child => { + Container.rebuild(child) + }) + } +} +/* c8 ignore stop */ + +},{"./comment":8,"./declaration":11,"./node":19,"./symbols":29}],10:[function(require,module,exports){ +'use strict' + +let pico = require('picocolors') + +let terminalHighlight = require('./terminal-highlight') + +class CssSyntaxError extends Error { + constructor(message, line, column, source, file, plugin) { + super(message) + this.name = 'CssSyntaxError' + this.reason = message + + if (file) { + this.file = file + } + if (source) { + this.source = source + } + if (plugin) { + this.plugin = plugin + } + if (typeof line !== 'undefined' && typeof column !== 'undefined') { + if (typeof line === 'number') { + this.line = line + this.column = column + } else { + this.line = line.line + this.column = line.column + this.endLine = column.line + this.endColumn = column.column + } + } + + this.setMessage() + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, CssSyntaxError) + } + } + + setMessage() { + this.message = this.plugin ? this.plugin + ': ' : '' + this.message += this.file ? this.file : '' + if (typeof this.line !== 'undefined') { + this.message += ':' + this.line + ':' + this.column + } + this.message += ': ' + this.reason + } + + showSourceCode(color) { + if (!this.source) return '' + + let css = this.source + if (color == null) color = pico.isColorSupported + if (terminalHighlight) { + if (color) css = terminalHighlight(css) + } + + let lines = css.split(/\r?\n/) + let start = Math.max(this.line - 3, 0) + let end = Math.min(this.line + 2, lines.length) + + let maxWidth = String(end).length + + let mark, aside + if (color) { + let { bold, gray, red } = pico.createColors(true) + mark = text => bold(red(text)) + aside = text => gray(text) + } else { + mark = aside = str => str + } + + return lines + .slice(start, end) + .map((line, index) => { + let number = start + 1 + index + let gutter = ' ' + (' ' + number).slice(-maxWidth) + ' | ' + if (number === this.line) { + let spacing = + aside(gutter.replace(/\d/g, ' ')) + + line.slice(0, this.column - 1).replace(/[^\t]/g, ' ') + return mark('>') + aside(gutter) + line + '\n ' + spacing + mark('^') + } + return ' ' + aside(gutter) + line + }) + .join('\n') + } + + toString() { + let code = this.showSourceCode() + if (code) { + code = '\n\n' + code + '\n' + } + return this.name + ': ' + this.message + code + } +} + +module.exports = CssSyntaxError +CssSyntaxError.default = CssSyntaxError + +},{"./terminal-highlight":2,"picocolors":6}],11:[function(require,module,exports){ +'use strict' + +let Node = require('./node') + +class Declaration extends Node { + constructor(defaults) { + if ( + defaults && + typeof defaults.value !== 'undefined' && + typeof defaults.value !== 'string' + ) { + defaults = { ...defaults, value: String(defaults.value) } + } + super(defaults) + this.type = 'decl' + } + + get variable() { + return this.prop.startsWith('--') || this.prop[0] === '$' + } +} + +module.exports = Declaration +Declaration.default = Declaration + +},{"./node":19}],12:[function(require,module,exports){ +'use strict' + +let Container = require('./container') + +let LazyResult, Processor + +class Document extends Container { + constructor(defaults) { + // type needs to be passed to super, otherwise child roots won't be normalized correctly + super({ type: 'document', ...defaults }) + + if (!this.nodes) { + this.nodes = [] + } + } + + toResult(opts = {}) { + let lazy = new LazyResult(new Processor(), this, opts) + + return lazy.stringify() + } +} + +Document.registerLazyResult = dependant => { + LazyResult = dependant +} + +Document.registerProcessor = dependant => { + Processor = dependant +} + +module.exports = Document +Document.default = Document + +},{"./container":9}],13:[function(require,module,exports){ +'use strict' + +let Declaration = require('./declaration') +let PreviousMap = require('./previous-map') +let Comment = require('./comment') +let AtRule = require('./at-rule') +let Input = require('./input') +let Root = require('./root') +let Rule = require('./rule') + +function fromJSON(json, inputs) { + if (Array.isArray(json)) return json.map(n => fromJSON(n)) + + let { inputs: ownInputs, ...defaults } = json + if (ownInputs) { + inputs = [] + for (let input of ownInputs) { + let inputHydrated = { ...input, __proto__: Input.prototype } + if (inputHydrated.map) { + inputHydrated.map = { + ...inputHydrated.map, + __proto__: PreviousMap.prototype + } + } + inputs.push(inputHydrated) + } + } + if (defaults.nodes) { + defaults.nodes = json.nodes.map(n => fromJSON(n, inputs)) + } + if (defaults.source) { + let { inputId, ...source } = defaults.source + defaults.source = source + if (inputId != null) { + defaults.source.input = inputs[inputId] + } + } + if (defaults.type === 'root') { + return new Root(defaults) + } else if (defaults.type === 'decl') { + return new Declaration(defaults) + } else if (defaults.type === 'rule') { + return new Rule(defaults) + } else if (defaults.type === 'comment') { + return new Comment(defaults) + } else if (defaults.type === 'atrule') { + return new AtRule(defaults) + } else { + throw new Error('Unknown node type: ' + json.type) + } +} + +module.exports = fromJSON +fromJSON.default = fromJSON + +},{"./at-rule":7,"./comment":8,"./declaration":11,"./input":14,"./previous-map":22,"./root":25,"./rule":26}],14:[function(require,module,exports){ +'use strict' + +let { SourceMapConsumer, SourceMapGenerator } = require('source-map-js') +let { fileURLToPath, pathToFileURL } = require('url') +let { isAbsolute, resolve } = require('path') +let { nanoid } = require('nanoid/non-secure') + +let terminalHighlight = require('./terminal-highlight') +let CssSyntaxError = require('./css-syntax-error') +let PreviousMap = require('./previous-map') + +let fromOffsetCache = Symbol('fromOffsetCache') + +let sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator) +let pathAvailable = Boolean(resolve && isAbsolute) + +class Input { + constructor(css, opts = {}) { + if ( + css === null || + typeof css === 'undefined' || + (typeof css === 'object' && !css.toString) + ) { + throw new Error(`PostCSS received ${css} instead of CSS string`) + } + + this.css = css.toString() + + if (this.css[0] === '\uFEFF' || this.css[0] === '\uFFFE') { + this.hasBOM = true + this.css = this.css.slice(1) + } else { + this.hasBOM = false + } + + if (opts.from) { + if ( + !pathAvailable || + /^\w+:\/\//.test(opts.from) || + isAbsolute(opts.from) + ) { + this.file = opts.from + } else { + this.file = resolve(opts.from) + } + } + + if (pathAvailable && sourceMapAvailable) { + let map = new PreviousMap(this.css, opts) + if (map.text) { + this.map = map + let file = map.consumer().file + if (!this.file && file) this.file = this.mapResolve(file) + } + } + + if (!this.file) { + this.id = '' + } + if (this.map) this.map.file = this.from + } + + error(message, line, column, opts = {}) { + let result, endLine, endColumn + + if (line && typeof line === 'object') { + let start = line + let end = column + if (typeof start.offset === 'number') { + let pos = this.fromOffset(start.offset) + line = pos.line + column = pos.col + } else { + line = start.line + column = start.column + } + if (typeof end.offset === 'number') { + let pos = this.fromOffset(end.offset) + endLine = pos.line + endColumn = pos.col + } else { + endLine = end.line + endColumn = end.column + } + } else if (!column) { + let pos = this.fromOffset(line) + line = pos.line + column = pos.col + } + + let origin = this.origin(line, column, endLine, endColumn) + if (origin) { + result = new CssSyntaxError( + message, + origin.endLine === undefined + ? origin.line + : { column: origin.column, line: origin.line }, + origin.endLine === undefined + ? origin.column + : { column: origin.endColumn, line: origin.endLine }, + origin.source, + origin.file, + opts.plugin + ) + } else { + result = new CssSyntaxError( + message, + endLine === undefined ? line : { column, line }, + endLine === undefined ? column : { column: endColumn, line: endLine }, + this.css, + this.file, + opts.plugin + ) + } + + result.input = { column, endColumn, endLine, line, source: this.css } + if (this.file) { + if (pathToFileURL) { + result.input.url = pathToFileURL(this.file).toString() + } + result.input.file = this.file + } + + return result + } + + fromOffset(offset) { + let lastLine, lineToIndex + if (!this[fromOffsetCache]) { + let lines = this.css.split('\n') + lineToIndex = new Array(lines.length) + let prevIndex = 0 + + for (let i = 0, l = lines.length; i < l; i++) { + lineToIndex[i] = prevIndex + prevIndex += lines[i].length + 1 + } + + this[fromOffsetCache] = lineToIndex + } else { + lineToIndex = this[fromOffsetCache] + } + lastLine = lineToIndex[lineToIndex.length - 1] + + let min = 0 + if (offset >= lastLine) { + min = lineToIndex.length - 1 + } else { + let max = lineToIndex.length - 2 + let mid + while (min < max) { + mid = min + ((max - min) >> 1) + if (offset < lineToIndex[mid]) { + max = mid - 1 + } else if (offset >= lineToIndex[mid + 1]) { + min = mid + 1 + } else { + min = mid + break + } + } + } + return { + col: offset - lineToIndex[min] + 1, + line: min + 1 + } + } + + mapResolve(file) { + if (/^\w+:\/\//.test(file)) { + return file + } + return resolve(this.map.consumer().sourceRoot || this.map.root || '.', file) + } + + origin(line, column, endLine, endColumn) { + if (!this.map) return false + let consumer = this.map.consumer() + + let from = consumer.originalPositionFor({ column, line }) + if (!from.source) return false + + let to + if (typeof endLine === 'number') { + to = consumer.originalPositionFor({ column: endColumn, line: endLine }) + } + + let fromUrl + + if (isAbsolute(from.source)) { + fromUrl = pathToFileURL(from.source) + } else { + fromUrl = new URL( + from.source, + this.map.consumer().sourceRoot || pathToFileURL(this.map.mapFile) + ) + } + + let result = { + column: from.column, + endColumn: to && to.column, + endLine: to && to.line, + line: from.line, + url: fromUrl.toString() + } + + if (fromUrl.protocol === 'file:') { + if (fileURLToPath) { + result.file = fileURLToPath(fromUrl) + } else { + /* c8 ignore next 2 */ + throw new Error(`file: protocol is not available in this PostCSS build`) + } + } + + let source = consumer.sourceContentFor(from.source) + if (source) result.source = source + + return result + } + + toJSON() { + let json = {} + for (let name of ['hasBOM', 'css', 'file', 'id']) { + if (this[name] != null) { + json[name] = this[name] + } + } + if (this.map) { + json.map = { ...this.map } + if (json.map.consumerCache) { + json.map.consumerCache = undefined + } + } + return json + } + + get from() { + return this.file || this.id + } +} + +module.exports = Input +Input.default = Input + +if (terminalHighlight && terminalHighlight.registerInput) { + terminalHighlight.registerInput(Input) +} + +},{"./css-syntax-error":10,"./previous-map":22,"./terminal-highlight":2,"nanoid/non-secure":5,"path":2,"source-map-js":2,"url":2}],15:[function(require,module,exports){ +(function (process){(function (){ +'use strict' + +let { isClean, my } = require('./symbols') +let MapGenerator = require('./map-generator') +let stringify = require('./stringify') +let Container = require('./container') +let Document = require('./document') +let warnOnce = require('./warn-once') +let Result = require('./result') +let parse = require('./parse') +let Root = require('./root') + +const TYPE_TO_CLASS_NAME = { + atrule: 'AtRule', + comment: 'Comment', + decl: 'Declaration', + document: 'Document', + root: 'Root', + rule: 'Rule' +} + +const PLUGIN_PROPS = { + AtRule: true, + AtRuleExit: true, + Comment: true, + CommentExit: true, + Declaration: true, + DeclarationExit: true, + Document: true, + DocumentExit: true, + Once: true, + OnceExit: true, + postcssPlugin: true, + prepare: true, + Root: true, + RootExit: true, + Rule: true, + RuleExit: true +} + +const NOT_VISITORS = { + Once: true, + postcssPlugin: true, + prepare: true +} + +const CHILDREN = 0 + +function isPromise(obj) { + return typeof obj === 'object' && typeof obj.then === 'function' +} + +function getEvents(node) { + let key = false + let type = TYPE_TO_CLASS_NAME[node.type] + if (node.type === 'decl') { + key = node.prop.toLowerCase() + } else if (node.type === 'atrule') { + key = node.name.toLowerCase() + } + + if (key && node.append) { + return [ + type, + type + '-' + key, + CHILDREN, + type + 'Exit', + type + 'Exit-' + key + ] + } else if (key) { + return [type, type + '-' + key, type + 'Exit', type + 'Exit-' + key] + } else if (node.append) { + return [type, CHILDREN, type + 'Exit'] + } else { + return [type, type + 'Exit'] + } +} + +function toStack(node) { + let events + if (node.type === 'document') { + events = ['Document', CHILDREN, 'DocumentExit'] + } else if (node.type === 'root') { + events = ['Root', CHILDREN, 'RootExit'] + } else { + events = getEvents(node) + } + + return { + eventIndex: 0, + events, + iterator: 0, + node, + visitorIndex: 0, + visitors: [] + } +} + +function cleanMarks(node) { + node[isClean] = false + if (node.nodes) node.nodes.forEach(i => cleanMarks(i)) + return node +} + +let postcss = {} + +class LazyResult { + constructor(processor, css, opts) { + this.stringified = false + this.processed = false + + let root + if ( + typeof css === 'object' && + css !== null && + (css.type === 'root' || css.type === 'document') + ) { + root = cleanMarks(css) + } else if (css instanceof LazyResult || css instanceof Result) { + root = cleanMarks(css.root) + if (css.map) { + if (typeof opts.map === 'undefined') opts.map = {} + if (!opts.map.inline) opts.map.inline = false + opts.map.prev = css.map + } + } else { + let parser = parse + if (opts.syntax) parser = opts.syntax.parse + if (opts.parser) parser = opts.parser + if (parser.parse) parser = parser.parse + + try { + root = parser(css, opts) + } catch (error) { + this.processed = true + this.error = error + } + + if (root && !root[my]) { + /* c8 ignore next 2 */ + Container.rebuild(root) + } + } + + this.result = new Result(processor, root, opts) + this.helpers = { ...postcss, postcss, result: this.result } + this.plugins = this.processor.plugins.map(plugin => { + if (typeof plugin === 'object' && plugin.prepare) { + return { ...plugin, ...plugin.prepare(this.result) } + } else { + return plugin + } + }) + } + + async() { + if (this.error) return Promise.reject(this.error) + if (this.processed) return Promise.resolve(this.result) + if (!this.processing) { + this.processing = this.runAsync() + } + return this.processing + } + + catch(onRejected) { + return this.async().catch(onRejected) + } + + finally(onFinally) { + return this.async().then(onFinally, onFinally) + } + + getAsyncError() { + throw new Error('Use process(css).then(cb) to work with async plugins') + } + + handleError(error, node) { + let plugin = this.result.lastPlugin + try { + if (node) node.addToError(error) + this.error = error + if (error.name === 'CssSyntaxError' && !error.plugin) { + error.plugin = plugin.postcssPlugin + error.setMessage() + } else if (plugin.postcssVersion) { + if (process.env.NODE_ENV !== 'production') { + let pluginName = plugin.postcssPlugin + let pluginVer = plugin.postcssVersion + let runtimeVer = this.result.processor.version + let a = pluginVer.split('.') + let b = runtimeVer.split('.') + + if (a[0] !== b[0] || parseInt(a[1]) > parseInt(b[1])) { + // eslint-disable-next-line no-console + console.error( + 'Unknown error from PostCSS plugin. Your current PostCSS ' + + 'version is ' + + runtimeVer + + ', but ' + + pluginName + + ' uses ' + + pluginVer + + '. Perhaps this is the source of the error below.' + ) + } + } + } + } catch (err) { + /* c8 ignore next 3 */ + // eslint-disable-next-line no-console + if (console && console.error) console.error(err) + } + return error + } + + prepareVisitors() { + this.listeners = {} + let add = (plugin, type, cb) => { + if (!this.listeners[type]) this.listeners[type] = [] + this.listeners[type].push([plugin, cb]) + } + for (let plugin of this.plugins) { + if (typeof plugin === 'object') { + for (let event in plugin) { + if (!PLUGIN_PROPS[event] && /^[A-Z]/.test(event)) { + throw new Error( + `Unknown event ${event} in ${plugin.postcssPlugin}. ` + + `Try to update PostCSS (${this.processor.version} now).` + ) + } + if (!NOT_VISITORS[event]) { + if (typeof plugin[event] === 'object') { + for (let filter in plugin[event]) { + if (filter === '*') { + add(plugin, event, plugin[event][filter]) + } else { + add( + plugin, + event + '-' + filter.toLowerCase(), + plugin[event][filter] + ) + } + } + } else if (typeof plugin[event] === 'function') { + add(plugin, event, plugin[event]) + } + } + } + } + } + this.hasListener = Object.keys(this.listeners).length > 0 + } + + async runAsync() { + this.plugin = 0 + for (let i = 0; i < this.plugins.length; i++) { + let plugin = this.plugins[i] + let promise = this.runOnRoot(plugin) + if (isPromise(promise)) { + try { + await promise + } catch (error) { + throw this.handleError(error) + } + } + } + + this.prepareVisitors() + if (this.hasListener) { + let root = this.result.root + while (!root[isClean]) { + root[isClean] = true + let stack = [toStack(root)] + while (stack.length > 0) { + let promise = this.visitTick(stack) + if (isPromise(promise)) { + try { + await promise + } catch (e) { + let node = stack[stack.length - 1].node + throw this.handleError(e, node) + } + } + } + } + + if (this.listeners.OnceExit) { + for (let [plugin, visitor] of this.listeners.OnceExit) { + this.result.lastPlugin = plugin + try { + if (root.type === 'document') { + let roots = root.nodes.map(subRoot => + visitor(subRoot, this.helpers) + ) + + await Promise.all(roots) + } else { + await visitor(root, this.helpers) + } + } catch (e) { + throw this.handleError(e) + } + } + } + } + + this.processed = true + return this.stringify() + } + + runOnRoot(plugin) { + this.result.lastPlugin = plugin + try { + if (typeof plugin === 'object' && plugin.Once) { + if (this.result.root.type === 'document') { + let roots = this.result.root.nodes.map(root => + plugin.Once(root, this.helpers) + ) + + if (isPromise(roots[0])) { + return Promise.all(roots) + } + + return roots + } + + return plugin.Once(this.result.root, this.helpers) + } else if (typeof plugin === 'function') { + return plugin(this.result.root, this.result) + } + } catch (error) { + throw this.handleError(error) + } + } + + stringify() { + if (this.error) throw this.error + if (this.stringified) return this.result + this.stringified = true + + this.sync() + + let opts = this.result.opts + let str = stringify + if (opts.syntax) str = opts.syntax.stringify + if (opts.stringifier) str = opts.stringifier + if (str.stringify) str = str.stringify + + let map = new MapGenerator(str, this.result.root, this.result.opts) + let data = map.generate() + this.result.css = data[0] + this.result.map = data[1] + + return this.result + } + + sync() { + if (this.error) throw this.error + if (this.processed) return this.result + this.processed = true + + if (this.processing) { + throw this.getAsyncError() + } + + for (let plugin of this.plugins) { + let promise = this.runOnRoot(plugin) + if (isPromise(promise)) { + throw this.getAsyncError() + } + } + + this.prepareVisitors() + if (this.hasListener) { + let root = this.result.root + while (!root[isClean]) { + root[isClean] = true + this.walkSync(root) + } + if (this.listeners.OnceExit) { + if (root.type === 'document') { + for (let subRoot of root.nodes) { + this.visitSync(this.listeners.OnceExit, subRoot) + } + } else { + this.visitSync(this.listeners.OnceExit, root) + } + } + } + + return this.result + } + + then(onFulfilled, onRejected) { + if (process.env.NODE_ENV !== 'production') { + if (!('from' in this.opts)) { + warnOnce( + 'Without `from` option PostCSS could generate wrong source map ' + + 'and will not find Browserslist config. Set it to CSS file path ' + + 'or to `undefined` to prevent this warning.' + ) + } + } + return this.async().then(onFulfilled, onRejected) + } + + toString() { + return this.css + } + + visitSync(visitors, node) { + for (let [plugin, visitor] of visitors) { + this.result.lastPlugin = plugin + let promise + try { + promise = visitor(node, this.helpers) + } catch (e) { + throw this.handleError(e, node.proxyOf) + } + if (node.type !== 'root' && node.type !== 'document' && !node.parent) { + return true + } + if (isPromise(promise)) { + throw this.getAsyncError() + } + } + } + + visitTick(stack) { + let visit = stack[stack.length - 1] + let { node, visitors } = visit + + if (node.type !== 'root' && node.type !== 'document' && !node.parent) { + stack.pop() + return + } + + if (visitors.length > 0 && visit.visitorIndex < visitors.length) { + let [plugin, visitor] = visitors[visit.visitorIndex] + visit.visitorIndex += 1 + if (visit.visitorIndex === visitors.length) { + visit.visitors = [] + visit.visitorIndex = 0 + } + this.result.lastPlugin = plugin + try { + return visitor(node.toProxy(), this.helpers) + } catch (e) { + throw this.handleError(e, node) + } + } + + if (visit.iterator !== 0) { + let iterator = visit.iterator + let child + while ((child = node.nodes[node.indexes[iterator]])) { + node.indexes[iterator] += 1 + if (!child[isClean]) { + child[isClean] = true + stack.push(toStack(child)) + return + } + } + visit.iterator = 0 + delete node.indexes[iterator] + } + + let events = visit.events + while (visit.eventIndex < events.length) { + let event = events[visit.eventIndex] + visit.eventIndex += 1 + if (event === CHILDREN) { + if (node.nodes && node.nodes.length) { + node[isClean] = true + visit.iterator = node.getIterator() + } + return + } else if (this.listeners[event]) { + visit.visitors = this.listeners[event] + return + } + } + stack.pop() + } + + walkSync(node) { + node[isClean] = true + let events = getEvents(node) + for (let event of events) { + if (event === CHILDREN) { + if (node.nodes) { + node.each(child => { + if (!child[isClean]) this.walkSync(child) + }) + } + } else { + let visitors = this.listeners[event] + if (visitors) { + if (this.visitSync(visitors, node.toProxy())) return + } + } + } + } + + warnings() { + return this.sync().warnings() + } + + get content() { + return this.stringify().content + } + + get css() { + return this.stringify().css + } + + get map() { + return this.stringify().map + } + + get messages() { + return this.sync().messages + } + + get opts() { + return this.result.opts + } + + get processor() { + return this.result.processor + } + + get root() { + return this.sync().root + } + + get [Symbol.toStringTag]() { + return 'LazyResult' + } +} + +LazyResult.registerPostcss = dependant => { + postcss = dependant +} + +module.exports = LazyResult +LazyResult.default = LazyResult + +Root.registerLazyResult(LazyResult) +Document.registerLazyResult(LazyResult) + +}).call(this)}).call(this,require('_process')) +},{"./container":9,"./document":12,"./map-generator":17,"./parse":20,"./result":24,"./root":25,"./stringify":28,"./symbols":29,"./warn-once":31,"_process":33}],16:[function(require,module,exports){ +'use strict' + +let list = { + comma(string) { + return list.split(string, [','], true) + }, + + space(string) { + let spaces = [' ', '\n', '\t'] + return list.split(string, spaces) + }, + + split(string, separators, last) { + let array = [] + let current = '' + let split = false + + let func = 0 + let inQuote = false + let prevQuote = '' + let escape = false + + for (let letter of string) { + if (escape) { + escape = false + } else if (letter === '\\') { + escape = true + } else if (inQuote) { + if (letter === prevQuote) { + inQuote = false + } + } else if (letter === '"' || letter === "'") { + inQuote = true + prevQuote = letter + } else if (letter === '(') { + func += 1 + } else if (letter === ')') { + if (func > 0) func -= 1 + } else if (func === 0) { + if (separators.includes(letter)) split = true + } + + if (split) { + if (current !== '') array.push(current.trim()) + current = '' + split = false + } else { + current += letter + } + } + + if (last || current !== '') array.push(current.trim()) + return array + } +} + +module.exports = list +list.default = list + +},{}],17:[function(require,module,exports){ +(function (Buffer){(function (){ +'use strict' + +let { SourceMapConsumer, SourceMapGenerator } = require('source-map-js') +let { dirname, relative, resolve, sep } = require('path') +let { pathToFileURL } = require('url') + +let Input = require('./input') + +let sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator) +let pathAvailable = Boolean(dirname && resolve && relative && sep) + +class MapGenerator { + constructor(stringify, root, opts, cssString) { + this.stringify = stringify + this.mapOpts = opts.map || {} + this.root = root + this.opts = opts + this.css = cssString + this.originalCSS = cssString + this.usesFileUrls = !this.mapOpts.from && this.mapOpts.absolute + + this.memoizedFileURLs = new Map() + this.memoizedPaths = new Map() + this.memoizedURLs = new Map() + } + + addAnnotation() { + let content + + if (this.isInline()) { + content = + 'data:application/json;base64,' + this.toBase64(this.map.toString()) + } else if (typeof this.mapOpts.annotation === 'string') { + content = this.mapOpts.annotation + } else if (typeof this.mapOpts.annotation === 'function') { + content = this.mapOpts.annotation(this.opts.to, this.root) + } else { + content = this.outputFile() + '.map' + } + let eol = '\n' + if (this.css.includes('\r\n')) eol = '\r\n' + + this.css += eol + '/*# sourceMappingURL=' + content + ' */' + } + + applyPrevMaps() { + for (let prev of this.previous()) { + let from = this.toUrl(this.path(prev.file)) + let root = prev.root || dirname(prev.file) + let map + + if (this.mapOpts.sourcesContent === false) { + map = new SourceMapConsumer(prev.text) + if (map.sourcesContent) { + map.sourcesContent = null + } + } else { + map = prev.consumer() + } + + this.map.applySourceMap(map, from, this.toUrl(this.path(root))) + } + } + + clearAnnotation() { + if (this.mapOpts.annotation === false) return + + if (this.root) { + let node + for (let i = this.root.nodes.length - 1; i >= 0; i--) { + node = this.root.nodes[i] + if (node.type !== 'comment') continue + if (node.text.indexOf('# sourceMappingURL=') === 0) { + this.root.removeChild(i) + } + } + } else if (this.css) { + this.css = this.css.replace(/\n*?\/\*#[\S\s]*?\*\/$/gm, '') + } + } + + generate() { + this.clearAnnotation() + if (pathAvailable && sourceMapAvailable && this.isMap()) { + return this.generateMap() + } else { + let result = '' + this.stringify(this.root, i => { + result += i + }) + return [result] + } + } + + generateMap() { + if (this.root) { + this.generateString() + } else if (this.previous().length === 1) { + let prev = this.previous()[0].consumer() + prev.file = this.outputFile() + this.map = SourceMapGenerator.fromSourceMap(prev, { + ignoreInvalidMapping: true + }) + } else { + this.map = new SourceMapGenerator({ + file: this.outputFile(), + ignoreInvalidMapping: true + }) + this.map.addMapping({ + generated: { column: 0, line: 1 }, + original: { column: 0, line: 1 }, + source: this.opts.from + ? this.toUrl(this.path(this.opts.from)) + : '' + }) + } + + if (this.isSourcesContent()) this.setSourcesContent() + if (this.root && this.previous().length > 0) this.applyPrevMaps() + if (this.isAnnotation()) this.addAnnotation() + + if (this.isInline()) { + return [this.css] + } else { + return [this.css, this.map] + } + } + + generateString() { + this.css = '' + this.map = new SourceMapGenerator({ + file: this.outputFile(), + ignoreInvalidMapping: true + }) + + let line = 1 + let column = 1 + + let noSource = '' + let mapping = { + generated: { column: 0, line: 0 }, + original: { column: 0, line: 0 }, + source: '' + } + + let lines, last + this.stringify(this.root, (str, node, type) => { + this.css += str + + if (node && type !== 'end') { + mapping.generated.line = line + mapping.generated.column = column - 1 + if (node.source && node.source.start) { + mapping.source = this.sourcePath(node) + mapping.original.line = node.source.start.line + mapping.original.column = node.source.start.column - 1 + this.map.addMapping(mapping) + } else { + mapping.source = noSource + mapping.original.line = 1 + mapping.original.column = 0 + this.map.addMapping(mapping) + } + } + + lines = str.match(/\n/g) + if (lines) { + line += lines.length + last = str.lastIndexOf('\n') + column = str.length - last + } else { + column += str.length + } + + if (node && type !== 'start') { + let p = node.parent || { raws: {} } + let childless = + node.type === 'decl' || (node.type === 'atrule' && !node.nodes) + if (!childless || node !== p.last || p.raws.semicolon) { + if (node.source && node.source.end) { + mapping.source = this.sourcePath(node) + mapping.original.line = node.source.end.line + mapping.original.column = node.source.end.column - 1 + mapping.generated.line = line + mapping.generated.column = column - 2 + this.map.addMapping(mapping) + } else { + mapping.source = noSource + mapping.original.line = 1 + mapping.original.column = 0 + mapping.generated.line = line + mapping.generated.column = column - 1 + this.map.addMapping(mapping) + } + } + } + }) + } + + isAnnotation() { + if (this.isInline()) { + return true + } + if (typeof this.mapOpts.annotation !== 'undefined') { + return this.mapOpts.annotation + } + if (this.previous().length) { + return this.previous().some(i => i.annotation) + } + return true + } + + isInline() { + if (typeof this.mapOpts.inline !== 'undefined') { + return this.mapOpts.inline + } + + let annotation = this.mapOpts.annotation + if (typeof annotation !== 'undefined' && annotation !== true) { + return false + } + + if (this.previous().length) { + return this.previous().some(i => i.inline) + } + return true + } + + isMap() { + if (typeof this.opts.map !== 'undefined') { + return !!this.opts.map + } + return this.previous().length > 0 + } + + isSourcesContent() { + if (typeof this.mapOpts.sourcesContent !== 'undefined') { + return this.mapOpts.sourcesContent + } + if (this.previous().length) { + return this.previous().some(i => i.withContent()) + } + return true + } + + outputFile() { + if (this.opts.to) { + return this.path(this.opts.to) + } else if (this.opts.from) { + return this.path(this.opts.from) + } else { + return 'to.css' + } + } + + path(file) { + if (this.mapOpts.absolute) return file + if (file.charCodeAt(0) === 60 /* `<` */) return file + if (/^\w+:\/\//.test(file)) return file + let cached = this.memoizedPaths.get(file) + if (cached) return cached + + let from = this.opts.to ? dirname(this.opts.to) : '.' + + if (typeof this.mapOpts.annotation === 'string') { + from = dirname(resolve(from, this.mapOpts.annotation)) + } + + let path = relative(from, file) + this.memoizedPaths.set(file, path) + + return path + } + + previous() { + if (!this.previousMaps) { + this.previousMaps = [] + if (this.root) { + this.root.walk(node => { + if (node.source && node.source.input.map) { + let map = node.source.input.map + if (!this.previousMaps.includes(map)) { + this.previousMaps.push(map) + } + } + }) + } else { + let input = new Input(this.originalCSS, this.opts) + if (input.map) this.previousMaps.push(input.map) + } + } + + return this.previousMaps + } + + setSourcesContent() { + let already = {} + if (this.root) { + this.root.walk(node => { + if (node.source) { + let from = node.source.input.from + if (from && !already[from]) { + already[from] = true + let fromUrl = this.usesFileUrls + ? this.toFileUrl(from) + : this.toUrl(this.path(from)) + this.map.setSourceContent(fromUrl, node.source.input.css) + } + } + }) + } else if (this.css) { + let from = this.opts.from + ? this.toUrl(this.path(this.opts.from)) + : '' + this.map.setSourceContent(from, this.css) + } + } + + sourcePath(node) { + if (this.mapOpts.from) { + return this.toUrl(this.mapOpts.from) + } else if (this.usesFileUrls) { + return this.toFileUrl(node.source.input.from) + } else { + return this.toUrl(this.path(node.source.input.from)) + } + } + + toBase64(str) { + if (Buffer) { + return Buffer.from(str).toString('base64') + } else { + return window.btoa(unescape(encodeURIComponent(str))) + } + } + + toFileUrl(path) { + let cached = this.memoizedFileURLs.get(path) + if (cached) return cached + + if (pathToFileURL) { + let fileURL = pathToFileURL(path).toString() + this.memoizedFileURLs.set(path, fileURL) + + return fileURL + } else { + throw new Error( + '`map.absolute` option is not available in this PostCSS build' + ) + } + } + + toUrl(path) { + let cached = this.memoizedURLs.get(path) + if (cached) return cached + + if (sep === '\\') { + path = path.replace(/\\/g, '/') + } + + let url = encodeURI(path).replace(/[#?]/g, encodeURIComponent) + this.memoizedURLs.set(path, url) + + return url + } +} + +module.exports = MapGenerator + +}).call(this)}).call(this,require("buffer").Buffer) +},{"./input":14,"buffer":3,"path":2,"source-map-js":2,"url":2}],18:[function(require,module,exports){ +(function (process){(function (){ +'use strict' + +let MapGenerator = require('./map-generator') +let stringify = require('./stringify') +let warnOnce = require('./warn-once') +let parse = require('./parse') +const Result = require('./result') + +class NoWorkResult { + constructor(processor, css, opts) { + css = css.toString() + this.stringified = false + + this._processor = processor + this._css = css + this._opts = opts + this._map = undefined + let root + + let str = stringify + this.result = new Result(this._processor, root, this._opts) + this.result.css = css + + let self = this + Object.defineProperty(this.result, 'root', { + get() { + return self.root + } + }) + + let map = new MapGenerator(str, root, this._opts, css) + if (map.isMap()) { + let [generatedCSS, generatedMap] = map.generate() + if (generatedCSS) { + this.result.css = generatedCSS + } + if (generatedMap) { + this.result.map = generatedMap + } + } else { + map.clearAnnotation() + this.result.css = map.css + } + } + + async() { + if (this.error) return Promise.reject(this.error) + return Promise.resolve(this.result) + } + + catch(onRejected) { + return this.async().catch(onRejected) + } + + finally(onFinally) { + return this.async().then(onFinally, onFinally) + } + + sync() { + if (this.error) throw this.error + return this.result + } + + then(onFulfilled, onRejected) { + if (process.env.NODE_ENV !== 'production') { + if (!('from' in this._opts)) { + warnOnce( + 'Without `from` option PostCSS could generate wrong source map ' + + 'and will not find Browserslist config. Set it to CSS file path ' + + 'or to `undefined` to prevent this warning.' + ) + } + } + + return this.async().then(onFulfilled, onRejected) + } + + toString() { + return this._css + } + + warnings() { + return [] + } + + get content() { + return this.result.css + } + + get css() { + return this.result.css + } + + get map() { + return this.result.map + } + + get messages() { + return [] + } + + get opts() { + return this.result.opts + } + + get processor() { + return this.result.processor + } + + get root() { + if (this._root) { + return this._root + } + + let root + let parser = parse + + try { + root = parser(this._css, this._opts) + } catch (error) { + this.error = error + } + + if (this.error) { + throw this.error + } else { + this._root = root + return root + } + } + + get [Symbol.toStringTag]() { + return 'NoWorkResult' + } +} + +module.exports = NoWorkResult +NoWorkResult.default = NoWorkResult + +}).call(this)}).call(this,require('_process')) +},{"./map-generator":17,"./parse":20,"./result":24,"./stringify":28,"./warn-once":31,"_process":33}],19:[function(require,module,exports){ +'use strict' + +let { isClean, my } = require('./symbols') +let CssSyntaxError = require('./css-syntax-error') +let Stringifier = require('./stringifier') +let stringify = require('./stringify') + +function cloneNode(obj, parent) { + let cloned = new obj.constructor() + + for (let i in obj) { + if (!Object.prototype.hasOwnProperty.call(obj, i)) { + /* c8 ignore next 2 */ + continue + } + if (i === 'proxyCache') continue + let value = obj[i] + let type = typeof value + + if (i === 'parent' && type === 'object') { + if (parent) cloned[i] = parent + } else if (i === 'source') { + cloned[i] = value + } else if (Array.isArray(value)) { + cloned[i] = value.map(j => cloneNode(j, cloned)) + } else { + if (type === 'object' && value !== null) value = cloneNode(value) + cloned[i] = value + } + } + + return cloned +} + +class Node { + constructor(defaults = {}) { + this.raws = {} + this[isClean] = false + this[my] = true + + for (let name in defaults) { + if (name === 'nodes') { + this.nodes = [] + for (let node of defaults[name]) { + if (typeof node.clone === 'function') { + this.append(node.clone()) + } else { + this.append(node) + } + } + } else { + this[name] = defaults[name] + } + } + } + + addToError(error) { + error.postcssNode = this + if (error.stack && this.source && /\n\s{4}at /.test(error.stack)) { + let s = this.source + error.stack = error.stack.replace( + /\n\s{4}at /, + `$&${s.input.from}:${s.start.line}:${s.start.column}$&` + ) + } + return error + } + + after(add) { + this.parent.insertAfter(this, add) + return this + } + + assign(overrides = {}) { + for (let name in overrides) { + this[name] = overrides[name] + } + return this + } + + before(add) { + this.parent.insertBefore(this, add) + return this + } + + cleanRaws(keepBetween) { + delete this.raws.before + delete this.raws.after + if (!keepBetween) delete this.raws.between + } + + clone(overrides = {}) { + let cloned = cloneNode(this) + for (let name in overrides) { + cloned[name] = overrides[name] + } + return cloned + } + + cloneAfter(overrides = {}) { + let cloned = this.clone(overrides) + this.parent.insertAfter(this, cloned) + return cloned + } + + cloneBefore(overrides = {}) { + let cloned = this.clone(overrides) + this.parent.insertBefore(this, cloned) + return cloned + } + + error(message, opts = {}) { + if (this.source) { + let { end, start } = this.rangeBy(opts) + return this.source.input.error( + message, + { column: start.column, line: start.line }, + { column: end.column, line: end.line }, + opts + ) + } + return new CssSyntaxError(message) + } + + getProxyProcessor() { + return { + get(node, prop) { + if (prop === 'proxyOf') { + return node + } else if (prop === 'root') { + return () => node.root().toProxy() + } else { + return node[prop] + } + }, + + set(node, prop, value) { + if (node[prop] === value) return true + node[prop] = value + if ( + prop === 'prop' || + prop === 'value' || + prop === 'name' || + prop === 'params' || + prop === 'important' || + /* c8 ignore next */ + prop === 'text' + ) { + node.markDirty() + } + return true + } + } + } + + markDirty() { + if (this[isClean]) { + this[isClean] = false + let next = this + while ((next = next.parent)) { + next[isClean] = false + } + } + } + + next() { + if (!this.parent) return undefined + let index = this.parent.index(this) + return this.parent.nodes[index + 1] + } + + positionBy(opts, stringRepresentation) { + let pos = this.source.start + if (opts.index) { + pos = this.positionInside(opts.index, stringRepresentation) + } else if (opts.word) { + stringRepresentation = this.toString() + let index = stringRepresentation.indexOf(opts.word) + if (index !== -1) pos = this.positionInside(index, stringRepresentation) + } + return pos + } + + positionInside(index, stringRepresentation) { + let string = stringRepresentation || this.toString() + let column = this.source.start.column + let line = this.source.start.line + + for (let i = 0; i < index; i++) { + if (string[i] === '\n') { + column = 1 + line += 1 + } else { + column += 1 + } + } + + return { column, line } + } + + prev() { + if (!this.parent) return undefined + let index = this.parent.index(this) + return this.parent.nodes[index - 1] + } + + rangeBy(opts) { + let start = { + column: this.source.start.column, + line: this.source.start.line + } + let end = this.source.end + ? { + column: this.source.end.column + 1, + line: this.source.end.line + } + : { + column: start.column + 1, + line: start.line + } + + if (opts.word) { + let stringRepresentation = this.toString() + let index = stringRepresentation.indexOf(opts.word) + if (index !== -1) { + start = this.positionInside(index, stringRepresentation) + end = this.positionInside(index + opts.word.length, stringRepresentation) + } + } else { + if (opts.start) { + start = { + column: opts.start.column, + line: opts.start.line + } + } else if (opts.index) { + start = this.positionInside(opts.index) + } + + if (opts.end) { + end = { + column: opts.end.column, + line: opts.end.line + } + } else if (typeof opts.endIndex === 'number') { + end = this.positionInside(opts.endIndex) + } else if (opts.index) { + end = this.positionInside(opts.index + 1) + } + } + + if ( + end.line < start.line || + (end.line === start.line && end.column <= start.column) + ) { + end = { column: start.column + 1, line: start.line } + } + + return { end, start } + } + + raw(prop, defaultType) { + let str = new Stringifier() + return str.raw(this, prop, defaultType) + } + + remove() { + if (this.parent) { + this.parent.removeChild(this) + } + this.parent = undefined + return this + } + + replaceWith(...nodes) { + if (this.parent) { + let bookmark = this + let foundSelf = false + for (let node of nodes) { + if (node === this) { + foundSelf = true + } else if (foundSelf) { + this.parent.insertAfter(bookmark, node) + bookmark = node + } else { + this.parent.insertBefore(bookmark, node) + } + } + + if (!foundSelf) { + this.remove() + } + } + + return this + } + + root() { + let result = this + while (result.parent && result.parent.type !== 'document') { + result = result.parent + } + return result + } + + toJSON(_, inputs) { + let fixed = {} + let emitInputs = inputs == null + inputs = inputs || new Map() + let inputsNextIndex = 0 + + for (let name in this) { + if (!Object.prototype.hasOwnProperty.call(this, name)) { + /* c8 ignore next 2 */ + continue + } + if (name === 'parent' || name === 'proxyCache') continue + let value = this[name] + + if (Array.isArray(value)) { + fixed[name] = value.map(i => { + if (typeof i === 'object' && i.toJSON) { + return i.toJSON(null, inputs) + } else { + return i + } + }) + } else if (typeof value === 'object' && value.toJSON) { + fixed[name] = value.toJSON(null, inputs) + } else if (name === 'source') { + let inputId = inputs.get(value.input) + if (inputId == null) { + inputId = inputsNextIndex + inputs.set(value.input, inputsNextIndex) + inputsNextIndex++ + } + fixed[name] = { + end: value.end, + inputId, + start: value.start + } + } else { + fixed[name] = value + } + } + + if (emitInputs) { + fixed.inputs = [...inputs.keys()].map(input => input.toJSON()) + } + + return fixed + } + + toProxy() { + if (!this.proxyCache) { + this.proxyCache = new Proxy(this, this.getProxyProcessor()) + } + return this.proxyCache + } + + toString(stringifier = stringify) { + if (stringifier.stringify) stringifier = stringifier.stringify + let result = '' + stringifier(this, i => { + result += i + }) + return result + } + + warn(result, text, opts) { + let data = { node: this } + for (let i in opts) data[i] = opts[i] + return result.warn(text, data) + } + + get proxyOf() { + return this + } +} + +module.exports = Node +Node.default = Node + +},{"./css-syntax-error":10,"./stringifier":27,"./stringify":28,"./symbols":29}],20:[function(require,module,exports){ +(function (process){(function (){ +'use strict' + +let Container = require('./container') +let Parser = require('./parser') +let Input = require('./input') + +function parse(css, opts) { + let input = new Input(css, opts) + let parser = new Parser(input) + try { + parser.parse() + } catch (e) { + if (process.env.NODE_ENV !== 'production') { + if (e.name === 'CssSyntaxError' && opts && opts.from) { + if (/\.scss$/i.test(opts.from)) { + e.message += + '\nYou tried to parse SCSS with ' + + 'the standard CSS parser; ' + + 'try again with the postcss-scss parser' + } else if (/\.sass/i.test(opts.from)) { + e.message += + '\nYou tried to parse Sass with ' + + 'the standard CSS parser; ' + + 'try again with the postcss-sass parser' + } else if (/\.less$/i.test(opts.from)) { + e.message += + '\nYou tried to parse Less with ' + + 'the standard CSS parser; ' + + 'try again with the postcss-less parser' + } + } + } + throw e + } + + return parser.root +} + +module.exports = parse +parse.default = parse + +Container.registerParse(parse) + +}).call(this)}).call(this,require('_process')) +},{"./container":9,"./input":14,"./parser":21,"_process":33}],21:[function(require,module,exports){ +'use strict' + +let Declaration = require('./declaration') +let tokenizer = require('./tokenize') +let Comment = require('./comment') +let AtRule = require('./at-rule') +let Root = require('./root') +let Rule = require('./rule') + +const SAFE_COMMENT_NEIGHBOR = { + empty: true, + space: true +} + +function findLastWithPosition(tokens) { + for (let i = tokens.length - 1; i >= 0; i--) { + let token = tokens[i] + let pos = token[3] || token[2] + if (pos) return pos + } +} + +class Parser { + constructor(input) { + this.input = input + + this.root = new Root() + this.current = this.root + this.spaces = '' + this.semicolon = false + + this.createTokenizer() + this.root.source = { input, start: { column: 1, line: 1, offset: 0 } } + } + + atrule(token) { + let node = new AtRule() + node.name = token[1].slice(1) + if (node.name === '') { + this.unnamedAtrule(node, token) + } + this.init(node, token[2]) + + let type + let prev + let shift + let last = false + let open = false + let params = [] + let brackets = [] + + while (!this.tokenizer.endOfFile()) { + token = this.tokenizer.nextToken() + type = token[0] + + if (type === '(' || type === '[') { + brackets.push(type === '(' ? ')' : ']') + } else if (type === '{' && brackets.length > 0) { + brackets.push('}') + } else if (type === brackets[brackets.length - 1]) { + brackets.pop() + } + + if (brackets.length === 0) { + if (type === ';') { + node.source.end = this.getPosition(token[2]) + node.source.end.offset++ + this.semicolon = true + break + } else if (type === '{') { + open = true + break + } else if (type === '}') { + if (params.length > 0) { + shift = params.length - 1 + prev = params[shift] + while (prev && prev[0] === 'space') { + prev = params[--shift] + } + if (prev) { + node.source.end = this.getPosition(prev[3] || prev[2]) + node.source.end.offset++ + } + } + this.end(token) + break + } else { + params.push(token) + } + } else { + params.push(token) + } + + if (this.tokenizer.endOfFile()) { + last = true + break + } + } + + node.raws.between = this.spacesAndCommentsFromEnd(params) + if (params.length) { + node.raws.afterName = this.spacesAndCommentsFromStart(params) + this.raw(node, 'params', params) + if (last) { + token = params[params.length - 1] + node.source.end = this.getPosition(token[3] || token[2]) + node.source.end.offset++ + this.spaces = node.raws.between + node.raws.between = '' + } + } else { + node.raws.afterName = '' + node.params = '' + } + + if (open) { + node.nodes = [] + this.current = node + } + } + + checkMissedSemicolon(tokens) { + let colon = this.colon(tokens) + if (colon === false) return + + let founded = 0 + let token + for (let j = colon - 1; j >= 0; j--) { + token = tokens[j] + if (token[0] !== 'space') { + founded += 1 + if (founded === 2) break + } + } + // If the token is a word, e.g. `!important`, `red` or any other valid property's value. + // Then we need to return the colon after that word token. [3] is the "end" colon of that word. + // And because we need it after that one we do +1 to get the next one. + throw this.input.error( + 'Missed semicolon', + token[0] === 'word' ? token[3] + 1 : token[2] + ) + } + + colon(tokens) { + let brackets = 0 + let token, type, prev + for (let [i, element] of tokens.entries()) { + token = element + type = token[0] + + if (type === '(') { + brackets += 1 + } + if (type === ')') { + brackets -= 1 + } + if (brackets === 0 && type === ':') { + if (!prev) { + this.doubleColon(token) + } else if (prev[0] === 'word' && prev[1] === 'progid') { + continue + } else { + return i + } + } + + prev = token + } + return false + } + + comment(token) { + let node = new Comment() + this.init(node, token[2]) + node.source.end = this.getPosition(token[3] || token[2]) + node.source.end.offset++ + + let text = token[1].slice(2, -2) + if (/^\s*$/.test(text)) { + node.text = '' + node.raws.left = text + node.raws.right = '' + } else { + let match = text.match(/^(\s*)([^]*\S)(\s*)$/) + node.text = match[2] + node.raws.left = match[1] + node.raws.right = match[3] + } + } + + createTokenizer() { + this.tokenizer = tokenizer(this.input) + } + + decl(tokens, customProperty) { + let node = new Declaration() + this.init(node, tokens[0][2]) + + let last = tokens[tokens.length - 1] + if (last[0] === ';') { + this.semicolon = true + tokens.pop() + } + + node.source.end = this.getPosition( + last[3] || last[2] || findLastWithPosition(tokens) + ) + node.source.end.offset++ + + while (tokens[0][0] !== 'word') { + if (tokens.length === 1) this.unknownWord(tokens) + node.raws.before += tokens.shift()[1] + } + node.source.start = this.getPosition(tokens[0][2]) + + node.prop = '' + while (tokens.length) { + let type = tokens[0][0] + if (type === ':' || type === 'space' || type === 'comment') { + break + } + node.prop += tokens.shift()[1] + } + + node.raws.between = '' + + let token + while (tokens.length) { + token = tokens.shift() + + if (token[0] === ':') { + node.raws.between += token[1] + break + } else { + if (token[0] === 'word' && /\w/.test(token[1])) { + this.unknownWord([token]) + } + node.raws.between += token[1] + } + } + + if (node.prop[0] === '_' || node.prop[0] === '*') { + node.raws.before += node.prop[0] + node.prop = node.prop.slice(1) + } + + let firstSpaces = [] + let next + while (tokens.length) { + next = tokens[0][0] + if (next !== 'space' && next !== 'comment') break + firstSpaces.push(tokens.shift()) + } + + this.precheckMissedSemicolon(tokens) + + for (let i = tokens.length - 1; i >= 0; i--) { + token = tokens[i] + if (token[1].toLowerCase() === '!important') { + node.important = true + let string = this.stringFrom(tokens, i) + string = this.spacesFromEnd(tokens) + string + if (string !== ' !important') node.raws.important = string + break + } else if (token[1].toLowerCase() === 'important') { + let cache = tokens.slice(0) + let str = '' + for (let j = i; j > 0; j--) { + let type = cache[j][0] + if (str.trim().indexOf('!') === 0 && type !== 'space') { + break + } + str = cache.pop()[1] + str + } + if (str.trim().indexOf('!') === 0) { + node.important = true + node.raws.important = str + tokens = cache + } + } + + if (token[0] !== 'space' && token[0] !== 'comment') { + break + } + } + + let hasWord = tokens.some(i => i[0] !== 'space' && i[0] !== 'comment') + + if (hasWord) { + node.raws.between += firstSpaces.map(i => i[1]).join('') + firstSpaces = [] + } + this.raw(node, 'value', firstSpaces.concat(tokens), customProperty) + + if (node.value.includes(':') && !customProperty) { + this.checkMissedSemicolon(tokens) + } + } + + doubleColon(token) { + throw this.input.error( + 'Double colon', + { offset: token[2] }, + { offset: token[2] + token[1].length } + ) + } + + emptyRule(token) { + let node = new Rule() + this.init(node, token[2]) + node.selector = '' + node.raws.between = '' + this.current = node + } + + end(token) { + if (this.current.nodes && this.current.nodes.length) { + this.current.raws.semicolon = this.semicolon + } + this.semicolon = false + + this.current.raws.after = (this.current.raws.after || '') + this.spaces + this.spaces = '' + + if (this.current.parent) { + this.current.source.end = this.getPosition(token[2]) + this.current.source.end.offset++ + this.current = this.current.parent + } else { + this.unexpectedClose(token) + } + } + + endFile() { + if (this.current.parent) this.unclosedBlock() + if (this.current.nodes && this.current.nodes.length) { + this.current.raws.semicolon = this.semicolon + } + this.current.raws.after = (this.current.raws.after || '') + this.spaces + this.root.source.end = this.getPosition(this.tokenizer.position()) + } + + freeSemicolon(token) { + this.spaces += token[1] + if (this.current.nodes) { + let prev = this.current.nodes[this.current.nodes.length - 1] + if (prev && prev.type === 'rule' && !prev.raws.ownSemicolon) { + prev.raws.ownSemicolon = this.spaces + this.spaces = '' + } + } + } + + // Helpers + + getPosition(offset) { + let pos = this.input.fromOffset(offset) + return { + column: pos.col, + line: pos.line, + offset + } + } + + init(node, offset) { + this.current.push(node) + node.source = { + input: this.input, + start: this.getPosition(offset) + } + node.raws.before = this.spaces + this.spaces = '' + if (node.type !== 'comment') this.semicolon = false + } + + other(start) { + let end = false + let type = null + let colon = false + let bracket = null + let brackets = [] + let customProperty = start[1].startsWith('--') + + let tokens = [] + let token = start + while (token) { + type = token[0] + tokens.push(token) + + if (type === '(' || type === '[') { + if (!bracket) bracket = token + brackets.push(type === '(' ? ')' : ']') + } else if (customProperty && colon && type === '{') { + if (!bracket) bracket = token + brackets.push('}') + } else if (brackets.length === 0) { + if (type === ';') { + if (colon) { + this.decl(tokens, customProperty) + return + } else { + break + } + } else if (type === '{') { + this.rule(tokens) + return + } else if (type === '}') { + this.tokenizer.back(tokens.pop()) + end = true + break + } else if (type === ':') { + colon = true + } + } else if (type === brackets[brackets.length - 1]) { + brackets.pop() + if (brackets.length === 0) bracket = null + } + + token = this.tokenizer.nextToken() + } + + if (this.tokenizer.endOfFile()) end = true + if (brackets.length > 0) this.unclosedBracket(bracket) + + if (end && colon) { + if (!customProperty) { + while (tokens.length) { + token = tokens[tokens.length - 1][0] + if (token !== 'space' && token !== 'comment') break + this.tokenizer.back(tokens.pop()) + } + } + this.decl(tokens, customProperty) + } else { + this.unknownWord(tokens) + } + } + + parse() { + let token + while (!this.tokenizer.endOfFile()) { + token = this.tokenizer.nextToken() + + switch (token[0]) { + case 'space': + this.spaces += token[1] + break + + case ';': + this.freeSemicolon(token) + break + + case '}': + this.end(token) + break + + case 'comment': + this.comment(token) + break + + case 'at-word': + this.atrule(token) + break + + case '{': + this.emptyRule(token) + break + + default: + this.other(token) + break + } + } + this.endFile() + } + + precheckMissedSemicolon(/* tokens */) { + // Hook for Safe Parser + } + + raw(node, prop, tokens, customProperty) { + let token, type + let length = tokens.length + let value = '' + let clean = true + let next, prev + + for (let i = 0; i < length; i += 1) { + token = tokens[i] + type = token[0] + if (type === 'space' && i === length - 1 && !customProperty) { + clean = false + } else if (type === 'comment') { + prev = tokens[i - 1] ? tokens[i - 1][0] : 'empty' + next = tokens[i + 1] ? tokens[i + 1][0] : 'empty' + if (!SAFE_COMMENT_NEIGHBOR[prev] && !SAFE_COMMENT_NEIGHBOR[next]) { + if (value.slice(-1) === ',') { + clean = false + } else { + value += token[1] + } + } else { + clean = false + } + } else { + value += token[1] + } + } + if (!clean) { + let raw = tokens.reduce((all, i) => all + i[1], '') + node.raws[prop] = { raw, value } + } + node[prop] = value + } + + rule(tokens) { + tokens.pop() + + let node = new Rule() + this.init(node, tokens[0][2]) + + node.raws.between = this.spacesAndCommentsFromEnd(tokens) + this.raw(node, 'selector', tokens) + this.current = node + } + + spacesAndCommentsFromEnd(tokens) { + let lastTokenType + let spaces = '' + while (tokens.length) { + lastTokenType = tokens[tokens.length - 1][0] + if (lastTokenType !== 'space' && lastTokenType !== 'comment') break + spaces = tokens.pop()[1] + spaces + } + return spaces + } + + // Errors + + spacesAndCommentsFromStart(tokens) { + let next + let spaces = '' + while (tokens.length) { + next = tokens[0][0] + if (next !== 'space' && next !== 'comment') break + spaces += tokens.shift()[1] + } + return spaces + } + + spacesFromEnd(tokens) { + let lastTokenType + let spaces = '' + while (tokens.length) { + lastTokenType = tokens[tokens.length - 1][0] + if (lastTokenType !== 'space') break + spaces = tokens.pop()[1] + spaces + } + return spaces + } + + stringFrom(tokens, from) { + let result = '' + for (let i = from; i < tokens.length; i++) { + result += tokens[i][1] + } + tokens.splice(from, tokens.length - from) + return result + } + + unclosedBlock() { + let pos = this.current.source.start + throw this.input.error('Unclosed block', pos.line, pos.column) + } + + unclosedBracket(bracket) { + throw this.input.error( + 'Unclosed bracket', + { offset: bracket[2] }, + { offset: bracket[2] + 1 } + ) + } + + unexpectedClose(token) { + throw this.input.error( + 'Unexpected }', + { offset: token[2] }, + { offset: token[2] + 1 } + ) + } + + unknownWord(tokens) { + throw this.input.error( + 'Unknown word', + { offset: tokens[0][2] }, + { offset: tokens[0][2] + tokens[0][1].length } + ) + } + + unnamedAtrule(node, token) { + throw this.input.error( + 'At-rule without name', + { offset: token[2] }, + { offset: token[2] + token[1].length } + ) + } +} + +module.exports = Parser + +},{"./at-rule":7,"./comment":8,"./declaration":11,"./root":25,"./rule":26,"./tokenize":30}],22:[function(require,module,exports){ +(function (Buffer){(function (){ +'use strict' + +let { SourceMapConsumer, SourceMapGenerator } = require('source-map-js') +let { existsSync, readFileSync } = require('fs') +let { dirname, join } = require('path') + +function fromBase64(str) { + if (Buffer) { + return Buffer.from(str, 'base64').toString() + } else { + /* c8 ignore next 2 */ + return window.atob(str) + } +} + +class PreviousMap { + constructor(css, opts) { + if (opts.map === false) return + this.loadAnnotation(css) + this.inline = this.startWith(this.annotation, 'data:') + + let prev = opts.map ? opts.map.prev : undefined + let text = this.loadMap(opts.from, prev) + if (!this.mapFile && opts.from) { + this.mapFile = opts.from + } + if (this.mapFile) this.root = dirname(this.mapFile) + if (text) this.text = text + } + + consumer() { + if (!this.consumerCache) { + this.consumerCache = new SourceMapConsumer(this.text) + } + return this.consumerCache + } + + decodeInline(text) { + let baseCharsetUri = /^data:application\/json;charset=utf-?8;base64,/ + let baseUri = /^data:application\/json;base64,/ + let charsetUri = /^data:application\/json;charset=utf-?8,/ + let uri = /^data:application\/json,/ + + if (charsetUri.test(text) || uri.test(text)) { + return decodeURIComponent(text.substr(RegExp.lastMatch.length)) + } + + if (baseCharsetUri.test(text) || baseUri.test(text)) { + return fromBase64(text.substr(RegExp.lastMatch.length)) + } + + let encoding = text.match(/data:application\/json;([^,]+),/)[1] + throw new Error('Unsupported source map encoding ' + encoding) + } + + getAnnotationURL(sourceMapString) { + return sourceMapString.replace(/^\/\*\s*# sourceMappingURL=/, '').trim() + } + + isMap(map) { + if (typeof map !== 'object') return false + return ( + typeof map.mappings === 'string' || + typeof map._mappings === 'string' || + Array.isArray(map.sections) + ) + } + + loadAnnotation(css) { + let comments = css.match(/\/\*\s*# sourceMappingURL=/gm) + if (!comments) return + + // sourceMappingURLs from comments, strings, etc. + let start = css.lastIndexOf(comments.pop()) + let end = css.indexOf('*/', start) + + if (start > -1 && end > -1) { + // Locate the last sourceMappingURL to avoid pickin + this.annotation = this.getAnnotationURL(css.substring(start, end)) + } + } + + loadFile(path) { + this.root = dirname(path) + if (existsSync(path)) { + this.mapFile = path + return readFileSync(path, 'utf-8').toString().trim() + } + } + + loadMap(file, prev) { + if (prev === false) return false + + if (prev) { + if (typeof prev === 'string') { + return prev + } else if (typeof prev === 'function') { + let prevPath = prev(file) + if (prevPath) { + let map = this.loadFile(prevPath) + if (!map) { + throw new Error( + 'Unable to load previous source map: ' + prevPath.toString() + ) + } + return map + } + } else if (prev instanceof SourceMapConsumer) { + return SourceMapGenerator.fromSourceMap(prev).toString() + } else if (prev instanceof SourceMapGenerator) { + return prev.toString() + } else if (this.isMap(prev)) { + return JSON.stringify(prev) + } else { + throw new Error( + 'Unsupported previous source map format: ' + prev.toString() + ) + } + } else if (this.inline) { + return this.decodeInline(this.annotation) + } else if (this.annotation) { + let map = this.annotation + if (file) map = join(dirname(file), map) + return this.loadFile(map) + } + } + + startWith(string, start) { + if (!string) return false + return string.substr(0, start.length) === start + } + + withContent() { + return !!( + this.consumer().sourcesContent && + this.consumer().sourcesContent.length > 0 + ) + } +} + +module.exports = PreviousMap +PreviousMap.default = PreviousMap + +}).call(this)}).call(this,require("buffer").Buffer) +},{"buffer":3,"fs":2,"path":2,"source-map-js":2}],23:[function(require,module,exports){ +(function (process){(function (){ +'use strict' + +let NoWorkResult = require('./no-work-result') +let LazyResult = require('./lazy-result') +let Document = require('./document') +let Root = require('./root') + +class Processor { + constructor(plugins = []) { + this.version = '8.4.40' + this.plugins = this.normalize(plugins) + } + + normalize(plugins) { + let normalized = [] + for (let i of plugins) { + if (i.postcss === true) { + i = i() + } else if (i.postcss) { + i = i.postcss + } + + if (typeof i === 'object' && Array.isArray(i.plugins)) { + normalized = normalized.concat(i.plugins) + } else if (typeof i === 'object' && i.postcssPlugin) { + normalized.push(i) + } else if (typeof i === 'function') { + normalized.push(i) + } else if (typeof i === 'object' && (i.parse || i.stringify)) { + if (process.env.NODE_ENV !== 'production') { + throw new Error( + 'PostCSS syntaxes cannot be used as plugins. Instead, please use ' + + 'one of the syntax/parser/stringifier options as outlined ' + + 'in your PostCSS runner documentation.' + ) + } + } else { + throw new Error(i + ' is not a PostCSS plugin') + } + } + return normalized + } + + process(css, opts = {}) { + if ( + !this.plugins.length && + !opts.parser && + !opts.stringifier && + !opts.syntax + ) { + return new NoWorkResult(this, css, opts) + } else { + return new LazyResult(this, css, opts) + } + } + + use(plugin) { + this.plugins = this.plugins.concat(this.normalize([plugin])) + return this + } +} + +module.exports = Processor +Processor.default = Processor + +Root.registerProcessor(Processor) +Document.registerProcessor(Processor) + +}).call(this)}).call(this,require('_process')) +},{"./document":12,"./lazy-result":15,"./no-work-result":18,"./root":25,"_process":33}],24:[function(require,module,exports){ +'use strict' + +let Warning = require('./warning') + +class Result { + constructor(processor, root, opts) { + this.processor = processor + this.messages = [] + this.root = root + this.opts = opts + this.css = undefined + this.map = undefined + } + + toString() { + return this.css + } + + warn(text, opts = {}) { + if (!opts.plugin) { + if (this.lastPlugin && this.lastPlugin.postcssPlugin) { + opts.plugin = this.lastPlugin.postcssPlugin + } + } + + let warning = new Warning(text, opts) + this.messages.push(warning) + + return warning + } + + warnings() { + return this.messages.filter(i => i.type === 'warning') + } + + get content() { + return this.css + } +} + +module.exports = Result +Result.default = Result + +},{"./warning":32}],25:[function(require,module,exports){ +'use strict' + +let Container = require('./container') + +let LazyResult, Processor + +class Root extends Container { + constructor(defaults) { + super(defaults) + this.type = 'root' + if (!this.nodes) this.nodes = [] + } + + normalize(child, sample, type) { + let nodes = super.normalize(child) + + if (sample) { + if (type === 'prepend') { + if (this.nodes.length > 1) { + sample.raws.before = this.nodes[1].raws.before + } else { + delete sample.raws.before + } + } else if (this.first !== sample) { + for (let node of nodes) { + node.raws.before = sample.raws.before + } + } + } + + return nodes + } + + removeChild(child, ignore) { + let index = this.index(child) + + if (!ignore && index === 0 && this.nodes.length > 1) { + this.nodes[1].raws.before = this.nodes[index].raws.before + } + + return super.removeChild(child) + } + + toResult(opts = {}) { + let lazy = new LazyResult(new Processor(), this, opts) + return lazy.stringify() + } +} + +Root.registerLazyResult = dependant => { + LazyResult = dependant +} + +Root.registerProcessor = dependant => { + Processor = dependant +} + +module.exports = Root +Root.default = Root + +Container.registerRoot(Root) + +},{"./container":9}],26:[function(require,module,exports){ +'use strict' + +let Container = require('./container') +let list = require('./list') + +class Rule extends Container { + constructor(defaults) { + super(defaults) + this.type = 'rule' + if (!this.nodes) this.nodes = [] + } + + get selectors() { + return list.comma(this.selector) + } + + set selectors(values) { + let match = this.selector ? this.selector.match(/,\s*/) : null + let sep = match ? match[0] : ',' + this.raw('between', 'beforeOpen') + this.selector = values.join(sep) + } +} + +module.exports = Rule +Rule.default = Rule + +Container.registerRule(Rule) + +},{"./container":9,"./list":16}],27:[function(require,module,exports){ +'use strict' + +const DEFAULT_RAW = { + after: '\n', + beforeClose: '\n', + beforeComment: '\n', + beforeDecl: '\n', + beforeOpen: ' ', + beforeRule: '\n', + colon: ': ', + commentLeft: ' ', + commentRight: ' ', + emptyBody: '', + indent: ' ', + semicolon: false +} + +function capitalize(str) { + return str[0].toUpperCase() + str.slice(1) +} + +class Stringifier { + constructor(builder) { + this.builder = builder + } + + atrule(node, semicolon) { + let name = '@' + node.name + let params = node.params ? this.rawValue(node, 'params') : '' + + if (typeof node.raws.afterName !== 'undefined') { + name += node.raws.afterName + } else if (params) { + name += ' ' + } + + if (node.nodes) { + this.block(node, name + params) + } else { + let end = (node.raws.between || '') + (semicolon ? ';' : '') + this.builder(name + params + end, node) + } + } + + beforeAfter(node, detect) { + let value + if (node.type === 'decl') { + value = this.raw(node, null, 'beforeDecl') + } else if (node.type === 'comment') { + value = this.raw(node, null, 'beforeComment') + } else if (detect === 'before') { + value = this.raw(node, null, 'beforeRule') + } else { + value = this.raw(node, null, 'beforeClose') + } + + let buf = node.parent + let depth = 0 + while (buf && buf.type !== 'root') { + depth += 1 + buf = buf.parent + } + + if (value.includes('\n')) { + let indent = this.raw(node, null, 'indent') + if (indent.length) { + for (let step = 0; step < depth; step++) value += indent + } + } + + return value + } + + block(node, start) { + let between = this.raw(node, 'between', 'beforeOpen') + this.builder(start + between + '{', node, 'start') + + let after + if (node.nodes && node.nodes.length) { + this.body(node) + after = this.raw(node, 'after') + } else { + after = this.raw(node, 'after', 'emptyBody') + } + + if (after) this.builder(after) + this.builder('}', node, 'end') + } + + body(node) { + let last = node.nodes.length - 1 + while (last > 0) { + if (node.nodes[last].type !== 'comment') break + last -= 1 + } + + let semicolon = this.raw(node, 'semicolon') + for (let i = 0; i < node.nodes.length; i++) { + let child = node.nodes[i] + let before = this.raw(child, 'before') + if (before) this.builder(before) + this.stringify(child, last !== i || semicolon) + } + } + + comment(node) { + let left = this.raw(node, 'left', 'commentLeft') + let right = this.raw(node, 'right', 'commentRight') + this.builder('/*' + left + node.text + right + '*/', node) + } + + decl(node, semicolon) { + let between = this.raw(node, 'between', 'colon') + let string = node.prop + between + this.rawValue(node, 'value') + + if (node.important) { + string += node.raws.important || ' !important' + } + + if (semicolon) string += ';' + this.builder(string, node) + } + + document(node) { + this.body(node) + } + + raw(node, own, detect) { + let value + if (!detect) detect = own + + // Already had + if (own) { + value = node.raws[own] + if (typeof value !== 'undefined') return value + } + + let parent = node.parent + + if (detect === 'before') { + // Hack for first rule in CSS + if (!parent || (parent.type === 'root' && parent.first === node)) { + return '' + } + + // `root` nodes in `document` should use only their own raws + if (parent && parent.type === 'document') { + return '' + } + } + + // Floating child without parent + if (!parent) return DEFAULT_RAW[detect] + + // Detect style by other nodes + let root = node.root() + if (!root.rawCache) root.rawCache = {} + if (typeof root.rawCache[detect] !== 'undefined') { + return root.rawCache[detect] + } + + if (detect === 'before' || detect === 'after') { + return this.beforeAfter(node, detect) + } else { + let method = 'raw' + capitalize(detect) + if (this[method]) { + value = this[method](root, node) + } else { + root.walk(i => { + value = i.raws[own] + if (typeof value !== 'undefined') return false + }) + } + } + + if (typeof value === 'undefined') value = DEFAULT_RAW[detect] + + root.rawCache[detect] = value + return value + } + + rawBeforeClose(root) { + let value + root.walk(i => { + if (i.nodes && i.nodes.length > 0) { + if (typeof i.raws.after !== 'undefined') { + value = i.raws.after + if (value.includes('\n')) { + value = value.replace(/[^\n]+$/, '') + } + return false + } + } + }) + if (value) value = value.replace(/\S/g, '') + return value + } + + rawBeforeComment(root, node) { + let value + root.walkComments(i => { + if (typeof i.raws.before !== 'undefined') { + value = i.raws.before + if (value.includes('\n')) { + value = value.replace(/[^\n]+$/, '') + } + return false + } + }) + if (typeof value === 'undefined') { + value = this.raw(node, null, 'beforeDecl') + } else if (value) { + value = value.replace(/\S/g, '') + } + return value + } + + rawBeforeDecl(root, node) { + let value + root.walkDecls(i => { + if (typeof i.raws.before !== 'undefined') { + value = i.raws.before + if (value.includes('\n')) { + value = value.replace(/[^\n]+$/, '') + } + return false + } + }) + if (typeof value === 'undefined') { + value = this.raw(node, null, 'beforeRule') + } else if (value) { + value = value.replace(/\S/g, '') + } + return value + } + + rawBeforeOpen(root) { + let value + root.walk(i => { + if (i.type !== 'decl') { + value = i.raws.between + if (typeof value !== 'undefined') return false + } + }) + return value + } + + rawBeforeRule(root) { + let value + root.walk(i => { + if (i.nodes && (i.parent !== root || root.first !== i)) { + if (typeof i.raws.before !== 'undefined') { + value = i.raws.before + if (value.includes('\n')) { + value = value.replace(/[^\n]+$/, '') + } + return false + } + } + }) + if (value) value = value.replace(/\S/g, '') + return value + } + + rawColon(root) { + let value + root.walkDecls(i => { + if (typeof i.raws.between !== 'undefined') { + value = i.raws.between.replace(/[^\s:]/g, '') + return false + } + }) + return value + } + + rawEmptyBody(root) { + let value + root.walk(i => { + if (i.nodes && i.nodes.length === 0) { + value = i.raws.after + if (typeof value !== 'undefined') return false + } + }) + return value + } + + rawIndent(root) { + if (root.raws.indent) return root.raws.indent + let value + root.walk(i => { + let p = i.parent + if (p && p !== root && p.parent && p.parent === root) { + if (typeof i.raws.before !== 'undefined') { + let parts = i.raws.before.split('\n') + value = parts[parts.length - 1] + value = value.replace(/\S/g, '') + return false + } + } + }) + return value + } + + rawSemicolon(root) { + let value + root.walk(i => { + if (i.nodes && i.nodes.length && i.last.type === 'decl') { + value = i.raws.semicolon + if (typeof value !== 'undefined') return false + } + }) + return value + } + + rawValue(node, prop) { + let value = node[prop] + let raw = node.raws[prop] + if (raw && raw.value === value) { + return raw.raw + } + + return value + } + + root(node) { + this.body(node) + if (node.raws.after) this.builder(node.raws.after) + } + + rule(node) { + this.block(node, this.rawValue(node, 'selector')) + if (node.raws.ownSemicolon) { + this.builder(node.raws.ownSemicolon, node, 'end') + } + } + + stringify(node, semicolon) { + /* c8 ignore start */ + if (!this[node.type]) { + throw new Error( + 'Unknown AST node type ' + + node.type + + '. ' + + 'Maybe you need to change PostCSS stringifier.' + ) + } + /* c8 ignore stop */ + this[node.type](node, semicolon) + } +} + +module.exports = Stringifier +Stringifier.default = Stringifier + +},{}],28:[function(require,module,exports){ +'use strict' + +let Stringifier = require('./stringifier') + +function stringify(node, builder) { + let str = new Stringifier(builder) + str.stringify(node) +} + +module.exports = stringify +stringify.default = stringify + +},{"./stringifier":27}],29:[function(require,module,exports){ +'use strict' + +module.exports.isClean = Symbol('isClean') + +module.exports.my = Symbol('my') + +},{}],30:[function(require,module,exports){ +'use strict' + +const SINGLE_QUOTE = "'".charCodeAt(0) +const DOUBLE_QUOTE = '"'.charCodeAt(0) +const BACKSLASH = '\\'.charCodeAt(0) +const SLASH = '/'.charCodeAt(0) +const NEWLINE = '\n'.charCodeAt(0) +const SPACE = ' '.charCodeAt(0) +const FEED = '\f'.charCodeAt(0) +const TAB = '\t'.charCodeAt(0) +const CR = '\r'.charCodeAt(0) +const OPEN_SQUARE = '['.charCodeAt(0) +const CLOSE_SQUARE = ']'.charCodeAt(0) +const OPEN_PARENTHESES = '('.charCodeAt(0) +const CLOSE_PARENTHESES = ')'.charCodeAt(0) +const OPEN_CURLY = '{'.charCodeAt(0) +const CLOSE_CURLY = '}'.charCodeAt(0) +const SEMICOLON = ';'.charCodeAt(0) +const ASTERISK = '*'.charCodeAt(0) +const COLON = ':'.charCodeAt(0) +const AT = '@'.charCodeAt(0) + +const RE_AT_END = /[\t\n\f\r "#'()/;[\\\]{}]/g +const RE_WORD_END = /[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g +const RE_BAD_BRACKET = /.[\r\n"'(/\\]/ +const RE_HEX_ESCAPE = /[\da-f]/i + +module.exports = function tokenizer(input, options = {}) { + let css = input.css.valueOf() + let ignore = options.ignoreErrors + + let code, next, quote, content, escape + let escaped, escapePos, prev, n, currentToken + + let length = css.length + let pos = 0 + let buffer = [] + let returned = [] + + function position() { + return pos + } + + function unclosed(what) { + throw input.error('Unclosed ' + what, pos) + } + + function endOfFile() { + return returned.length === 0 && pos >= length + } + + function nextToken(opts) { + if (returned.length) return returned.pop() + if (pos >= length) return + + let ignoreUnclosed = opts ? opts.ignoreUnclosed : false + + code = css.charCodeAt(pos) + + switch (code) { + case NEWLINE: + case SPACE: + case TAB: + case CR: + case FEED: { + next = pos + do { + next += 1 + code = css.charCodeAt(next) + } while ( + code === SPACE || + code === NEWLINE || + code === TAB || + code === CR || + code === FEED + ) + + currentToken = ['space', css.slice(pos, next)] + pos = next - 1 + break + } + + case OPEN_SQUARE: + case CLOSE_SQUARE: + case OPEN_CURLY: + case CLOSE_CURLY: + case COLON: + case SEMICOLON: + case CLOSE_PARENTHESES: { + let controlChar = String.fromCharCode(code) + currentToken = [controlChar, controlChar, pos] + break + } + + case OPEN_PARENTHESES: { + prev = buffer.length ? buffer.pop()[1] : '' + n = css.charCodeAt(pos + 1) + if ( + prev === 'url' && + n !== SINGLE_QUOTE && + n !== DOUBLE_QUOTE && + n !== SPACE && + n !== NEWLINE && + n !== TAB && + n !== FEED && + n !== CR + ) { + next = pos + do { + escaped = false + next = css.indexOf(')', next + 1) + if (next === -1) { + if (ignore || ignoreUnclosed) { + next = pos + break + } else { + unclosed('bracket') + } + } + escapePos = next + while (css.charCodeAt(escapePos - 1) === BACKSLASH) { + escapePos -= 1 + escaped = !escaped + } + } while (escaped) + + currentToken = ['brackets', css.slice(pos, next + 1), pos, next] + + pos = next + } else { + next = css.indexOf(')', pos + 1) + content = css.slice(pos, next + 1) + + if (next === -1 || RE_BAD_BRACKET.test(content)) { + currentToken = ['(', '(', pos] + } else { + currentToken = ['brackets', content, pos, next] + pos = next + } + } + + break + } + + case SINGLE_QUOTE: + case DOUBLE_QUOTE: { + quote = code === SINGLE_QUOTE ? "'" : '"' + next = pos + do { + escaped = false + next = css.indexOf(quote, next + 1) + if (next === -1) { + if (ignore || ignoreUnclosed) { + next = pos + 1 + break + } else { + unclosed('string') + } + } + escapePos = next + while (css.charCodeAt(escapePos - 1) === BACKSLASH) { + escapePos -= 1 + escaped = !escaped + } + } while (escaped) + + currentToken = ['string', css.slice(pos, next + 1), pos, next] + pos = next + break + } + + case AT: { + RE_AT_END.lastIndex = pos + 1 + RE_AT_END.test(css) + if (RE_AT_END.lastIndex === 0) { + next = css.length - 1 + } else { + next = RE_AT_END.lastIndex - 2 + } + + currentToken = ['at-word', css.slice(pos, next + 1), pos, next] + + pos = next + break + } + + case BACKSLASH: { + next = pos + escape = true + while (css.charCodeAt(next + 1) === BACKSLASH) { + next += 1 + escape = !escape + } + code = css.charCodeAt(next + 1) + if ( + escape && + code !== SLASH && + code !== SPACE && + code !== NEWLINE && + code !== TAB && + code !== CR && + code !== FEED + ) { + next += 1 + if (RE_HEX_ESCAPE.test(css.charAt(next))) { + while (RE_HEX_ESCAPE.test(css.charAt(next + 1))) { + next += 1 + } + if (css.charCodeAt(next + 1) === SPACE) { + next += 1 + } + } + } + + currentToken = ['word', css.slice(pos, next + 1), pos, next] + + pos = next + break + } + + default: { + if (code === SLASH && css.charCodeAt(pos + 1) === ASTERISK) { + next = css.indexOf('*/', pos + 2) + 1 + if (next === 0) { + if (ignore || ignoreUnclosed) { + next = css.length + } else { + unclosed('comment') + } + } + + currentToken = ['comment', css.slice(pos, next + 1), pos, next] + pos = next + } else { + RE_WORD_END.lastIndex = pos + 1 + RE_WORD_END.test(css) + if (RE_WORD_END.lastIndex === 0) { + next = css.length - 1 + } else { + next = RE_WORD_END.lastIndex - 2 + } + + currentToken = ['word', css.slice(pos, next + 1), pos, next] + buffer.push(currentToken) + pos = next + } + + break + } + } + + pos++ + return currentToken + } + + function back(token) { + returned.push(token) + } + + return { + back, + endOfFile, + nextToken, + position + } +} + +},{}],31:[function(require,module,exports){ +/* eslint-disable no-console */ +'use strict' + +let printed = {} + +module.exports = function warnOnce(message) { + if (printed[message]) return + printed[message] = true + + if (typeof console !== 'undefined' && console.warn) { + console.warn(message) + } +} + +},{}],32:[function(require,module,exports){ +'use strict' + +class Warning { + constructor(text, opts = {}) { + this.type = 'warning' + this.text = text + + if (opts.node && opts.node.source) { + let range = opts.node.rangeBy(opts) + this.line = range.start.line + this.column = range.start.column + this.endLine = range.end.line + this.endColumn = range.end.column + } + + for (let opt in opts) this[opt] = opts[opt] + } + + toString() { + if (this.node) { + return this.node.error(this.text, { + index: this.index, + plugin: this.plugin, + word: this.word + }).message + } + + if (this.plugin) { + return this.plugin + ': ' + this.text + } + + return this.text + } +} + +module.exports = Warning +Warning.default = Warning + +},{}],33:[function(require,module,exports){ +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],"postcss":[function(require,module,exports){ +(function (process){(function (){ +'use strict' + +let CssSyntaxError = require('./css-syntax-error') +let Declaration = require('./declaration') +let LazyResult = require('./lazy-result') +let Container = require('./container') +let Processor = require('./processor') +let stringify = require('./stringify') +let fromJSON = require('./fromJSON') +let Document = require('./document') +let Warning = require('./warning') +let Comment = require('./comment') +let AtRule = require('./at-rule') +let Result = require('./result.js') +let Input = require('./input') +let parse = require('./parse') +let list = require('./list') +let Rule = require('./rule') +let Root = require('./root') +let Node = require('./node') + +function postcss(...plugins) { + if (plugins.length === 1 && Array.isArray(plugins[0])) { + plugins = plugins[0] + } + return new Processor(plugins) +} + +postcss.plugin = function plugin(name, initializer) { + let warningPrinted = false + function creator(...args) { + // eslint-disable-next-line no-console + if (console && console.warn && !warningPrinted) { + warningPrinted = true + // eslint-disable-next-line no-console + console.warn( + name + + ': postcss.plugin was deprecated. Migration guide:\n' + + 'https://evilmartians.com/chronicles/postcss-8-plugin-migration' + ) + if (process.env.LANG && process.env.LANG.startsWith('cn')) { + /* c8 ignore next 7 */ + // eslint-disable-next-line no-console + console.warn( + name + + ': 里面 postcss.plugin 被弃用. 迁移指南:\n' + + 'https://www.w3ctech.com/topic/2226' + ) + } + } + let transformer = initializer(...args) + transformer.postcssPlugin = name + transformer.postcssVersion = new Processor().version + return transformer + } + + let cache + Object.defineProperty(creator, 'postcss', { + get() { + if (!cache) cache = creator() + return cache + } + }) + + creator.process = function (css, processOpts, pluginOpts) { + return postcss([creator(pluginOpts)]).process(css, processOpts) + } + + return creator +} + +postcss.stringify = stringify +postcss.parse = parse +postcss.fromJSON = fromJSON +postcss.list = list + +postcss.comment = defaults => new Comment(defaults) +postcss.atRule = defaults => new AtRule(defaults) +postcss.decl = defaults => new Declaration(defaults) +postcss.rule = defaults => new Rule(defaults) +postcss.root = defaults => new Root(defaults) +postcss.document = defaults => new Document(defaults) + +postcss.CssSyntaxError = CssSyntaxError +postcss.Declaration = Declaration +postcss.Container = Container +postcss.Processor = Processor +postcss.Document = Document +postcss.Comment = Comment +postcss.Warning = Warning +postcss.AtRule = AtRule +postcss.Result = Result +postcss.Input = Input +postcss.Rule = Rule +postcss.Root = Root +postcss.Node = Node + +LazyResult.registerPostcss(postcss) + +module.exports = postcss +postcss.default = postcss + +}).call(this)}).call(this,require('_process')) +},{"./at-rule":7,"./comment":8,"./container":9,"./css-syntax-error":10,"./declaration":11,"./document":12,"./fromJSON":13,"./input":14,"./lazy-result":15,"./list":16,"./node":19,"./parse":20,"./processor":23,"./result.js":24,"./root":25,"./rule":26,"./stringify":28,"./warning":32,"_process":33}]},{},[])("postcss") +}); diff --git a/src/postcss/previous-map.d.ts b/src/postcss/previous-map.d.ts new file mode 100644 index 0000000..23edeb5 --- /dev/null +++ b/src/postcss/previous-map.d.ts @@ -0,0 +1,81 @@ +import { SourceMapConsumer } from 'source-map-js' + +import { ProcessOptions } from './postcss.js' + +declare namespace PreviousMap { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { PreviousMap_ as default } +} + +/** + * Source map information from input CSS. + * For example, source map after Sass compiler. + * + * This class will automatically find source map in input CSS or in file system + * near input file (according `from` option). + * + * ```js + * const root = parse(css, { from: 'a.sass.css' }) + * root.input.map //=> PreviousMap + * ``` + */ +declare class PreviousMap_ { + /** + * `sourceMappingURL` content. + */ + annotation?: string + + /** + * The CSS source identifier. Contains `Input#file` if the user + * set the `from` option, or `Input#id` if they did not. + */ + file?: string + + /** + * Was source map inlined by data-uri to input CSS. + */ + inline: boolean + + /** + * Path to source map file. + */ + mapFile?: string + + /** + * The directory with source map file, if source map is in separated file. + */ + root?: string + + /** + * Source map file content. + */ + text?: string + + /** + * @param css Input CSS source. + * @param opts Process options. + */ + constructor(css: string, opts?: ProcessOptions) + + /** + * Create a instance of `SourceMapGenerator` class + * from the `source-map` library to work with source map information. + * + * It is lazy method, so it will create object only on first call + * and then it will use cache. + * + * @return Object with source map information. + */ + consumer(): SourceMapConsumer + + /** + * Does source map contains `sourcesContent` with input source text. + * + * @return Is `sourcesContent` present. + */ + withContent(): boolean +} + +declare class PreviousMap extends PreviousMap_ {} + +export = PreviousMap diff --git a/src/postcss/processor.d.ts b/src/postcss/processor.d.ts new file mode 100644 index 0000000..50c9a07 --- /dev/null +++ b/src/postcss/processor.d.ts @@ -0,0 +1,115 @@ +import Document from './document.js' +import LazyResult from './lazy-result.js' +import NoWorkResult from './no-work-result.js' +import { + AcceptedPlugin, + Plugin, + ProcessOptions, + TransformCallback, + Transformer +} from './postcss.js' +import Result from './result.js' +import Root from './root.js' + +declare namespace Processor { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { Processor_ as default } +} + +/** + * Contains plugins to process CSS. Create one `Processor` instance, + * initialize its plugins, and then use that instance on numerous CSS files. + * + * ```js + * const processor = postcss([autoprefixer, postcssNested]) + * processor.process(css1).then(result => console.log(result.css)) + * processor.process(css2).then(result => console.log(result.css)) + * ``` + */ +declare class Processor_ { + /** + * Plugins added to this processor. + * + * ```js + * const processor = postcss([autoprefixer, postcssNested]) + * processor.plugins.length //=> 2 + * ``` + */ + plugins: (Plugin | TransformCallback | Transformer)[] + + /** + * Current PostCSS version. + * + * ```js + * if (result.processor.version.split('.')[0] !== '6') { + * throw new Error('This plugin works only with PostCSS 6') + * } + * ``` + */ + version: string + + /** + * @param plugins PostCSS plugins + */ + constructor(plugins?: AcceptedPlugin[]) + + /** + * Parses source CSS and returns a `LazyResult` Promise proxy. + * Because some plugins can be asynchronous it doesn’t make + * any transformations. Transformations will be applied + * in the `LazyResult` methods. + * + * ```js + * processor.process(css, { from: 'a.css', to: 'a.out.css' }) + * .then(result => { + * console.log(result.css) + * }) + * ``` + * + * @param css String with input CSS or any object with a `toString()` method, + * like a Buffer. Optionally, send a `Result` instance + * and the processor will take the `Root` from it. + * @param opts Options. + * @return Promise proxy. + */ + process( + css: { toString(): string } | LazyResult | Result | Root | string + ): LazyResult | NoWorkResult + process( + css: { toString(): string } | LazyResult | Result | Root | string, + options: ProcessOptions + ): LazyResult + + /** + * Adds a plugin to be used as a CSS processor. + * + * PostCSS plugin can be in 4 formats: + * * A plugin in `Plugin` format. + * * A plugin creator function with `pluginCreator.postcss = true`. + * PostCSS will call this function without argument to get plugin. + * * A function. PostCSS will pass the function a {@link Root} + * as the first argument and current `Result` instance + * as the second. + * * Another `Processor` instance. PostCSS will copy plugins + * from that instance into this one. + * + * Plugins can also be added by passing them as arguments when creating + * a `postcss` instance (see [`postcss(plugins)`]). + * + * Asynchronous plugins should return a `Promise` instance. + * + * ```js + * const processor = postcss() + * .use(autoprefixer) + * .use(postcssNested) + * ``` + * + * @param plugin PostCSS plugin or `Processor` with plugins. + * @return Current processor to make methods chain. + */ + use(plugin: AcceptedPlugin): this +} + +declare class Processor extends Processor_ {} + +export = Processor diff --git a/src/postcss/result.d.ts b/src/postcss/result.d.ts new file mode 100644 index 0000000..c3dcbda --- /dev/null +++ b/src/postcss/result.d.ts @@ -0,0 +1,206 @@ +import { + Document, + Node, + Plugin, + ProcessOptions, + Root, + SourceMap, + TransformCallback, + Warning, + WarningOptions +} from './postcss.js' +import Processor from './processor.js' + +declare namespace Result { + export interface Message { + [others: string]: any + + /** + * Source PostCSS plugin name. + */ + plugin?: string + + /** + * Message type. + */ + type: string + } + + export interface ResultOptions extends ProcessOptions { + /** + * The CSS node that was the source of the warning. + */ + node?: Node + + /** + * Name of plugin that created this warning. `Result#warn` will fill it + * automatically with `Plugin#postcssPlugin` value. + */ + plugin?: string + } + + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { Result_ as default } +} + +/** + * Provides the result of the PostCSS transformations. + * + * A Result instance is returned by `LazyResult#then` + * or `Root#toResult` methods. + * + * ```js + * postcss([autoprefixer]).process(css).then(result => { + * console.log(result.css) + * }) + * ``` + * + * ```js + * const result2 = postcss.parse(css).toResult() + * ``` + */ +declare class Result_ { + /** + * A CSS string representing of `Result#root`. + * + * ```js + * postcss.parse('a{}').toResult().css //=> "a{}" + * ``` + */ + css: string + + /** + * Last runned PostCSS plugin. + */ + lastPlugin: Plugin | TransformCallback + + /** + * An instance of `SourceMapGenerator` class from the `source-map` library, + * representing changes to the `Result#root` instance. + * + * ```js + * result.map.toJSON() //=> { version: 3, file: 'a.css', … } + * ``` + * + * ```js + * if (result.map) { + * fs.writeFileSync(result.opts.to + '.map', result.map.toString()) + * } + * ``` + */ + map: SourceMap + + /** + * Contains messages from plugins (e.g., warnings or custom messages). + * Each message should have type and plugin properties. + * + * ```js + * AtRule: { + * import: (atRule, { result }) { + * const importedFile = parseImport(atRule) + * result.messages.push({ + * type: 'dependency', + * plugin: 'postcss-import', + * file: importedFile, + * parent: result.opts.from + * }) + * } + * } + * ``` + */ + messages: Result.Message[] + + /** + * Options from the `Processor#process` or `Root#toResult` call + * that produced this Result instance.] + * + * ```js + * root.toResult(opts).opts === opts + * ``` + */ + opts: Result.ResultOptions + + /** + * The Processor instance used for this transformation. + * + * ```js + * for (const plugin of result.processor.plugins) { + * if (plugin.postcssPlugin === 'postcss-bad') { + * throw 'postcss-good is incompatible with postcss-bad' + * } + * }) + * ``` + */ + processor: Processor + + /** + * Root node after all transformations. + * + * ```js + * root.toResult().root === root + * ``` + */ + root: RootNode + + /** + * @param processor Processor used for this transformation. + * @param root Root node after all transformations. + * @param opts Options from the `Processor#process` or `Root#toResult`. + */ + constructor(processor: Processor, root: RootNode, opts: Result.ResultOptions) + + /** + * Returns for `Result#css` content. + * + * ```js + * result + '' === result.css + * ``` + * + * @return String representing of `Result#root`. + */ + toString(): string + + /** + * Creates an instance of `Warning` and adds it to `Result#messages`. + * + * ```js + * if (decl.important) { + * result.warn('Avoid !important', { node: decl, word: '!important' }) + * } + * ``` + * + * @param text Warning message. + * @param opts Warning options. + * @return Created warning. + */ + warn(message: string, options?: WarningOptions): Warning + + /** + * Returns warnings from plugins. Filters `Warning` instances + * from `Result#messages`. + * + * ```js + * result.warnings().forEach(warn => { + * console.warn(warn.toString()) + * }) + * ``` + * + * @return Warnings from plugins. + */ + warnings(): Warning[] + + /** + * An alias for the `Result#css` property. + * Use it with syntaxes that generate non-CSS output. + * + * ```js + * result.css === result.content + * ``` + */ + get content(): string +} + +declare class Result extends Result_ {} + +export = Result diff --git a/src/postcss/root.d.ts b/src/postcss/root.d.ts new file mode 100644 index 0000000..9046aac --- /dev/null +++ b/src/postcss/root.d.ts @@ -0,0 +1,87 @@ +import Container, { ContainerProps } from './container.js' +import Document from './document.js' +import { ProcessOptions } from './postcss.js' +import Result from './result.js' + +declare namespace Root { + export interface RootRaws extends Record { + /** + * The space symbols after the last child to the end of file. + */ + after?: string + + /** + * Non-CSS code after `Root`, when `Root` is inside `Document`. + * + * **Experimental:** some aspects of this node could change within minor + * or patch version releases. + */ + codeAfter?: string + + /** + * Non-CSS code before `Root`, when `Root` is inside `Document`. + * + * **Experimental:** some aspects of this node could change within minor + * or patch version releases. + */ + codeBefore?: string + + /** + * Is the last child has an (optional) semicolon. + */ + semicolon?: boolean + } + + export interface RootProps extends ContainerProps { + /** + * Information used to generate byte-to-byte equal node string + * as it was in the origin input. + * */ + raws?: RootRaws + } + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { Root_ as default } +} + +/** + * Represents a CSS file and contains all its parsed nodes. + * + * ```js + * const root = postcss.parse('a{color:black} b{z-index:2}') + * root.type //=> 'root' + * root.nodes.length //=> 2 + * ``` + */ +declare class Root_ extends Container { + nodes: NonNullable + parent: Document | undefined + raws: Root.RootRaws + type: 'root' + + constructor(defaults?: Root.RootProps) + + assign(overrides: object | Root.RootProps): this + clone(overrides?: Partial): Root + cloneAfter(overrides?: Partial): Root + cloneBefore(overrides?: Partial): Root + + /** + * Returns a `Result` instance representing the root’s CSS. + * + * ```js + * const root1 = postcss.parse(css1, { from: 'a.css' }) + * const root2 = postcss.parse(css2, { from: 'b.css' }) + * root1.append(root2) + * const result = root1.toResult({ to: 'all.css', map: true }) + * ``` + * + * @param opts Options. + * @return Result with current root’s CSS. + */ + toResult(options?: ProcessOptions): Result +} + +declare class Root extends Root_ {} + +export = Root diff --git a/src/postcss/rule.d.ts b/src/postcss/rule.d.ts new file mode 100644 index 0000000..568dcc1 --- /dev/null +++ b/src/postcss/rule.d.ts @@ -0,0 +1,119 @@ +import Container, { + ContainerProps, + ContainerWithChildren +} from './container.js' + +declare namespace Rule { + export interface RuleRaws extends Record { + /** + * The space symbols after the last child of the node to the end of the node. + */ + after?: string + + /** + * The space symbols before the node. It also stores `*` + * and `_` symbols before the declaration (IE hack). + */ + before?: string + + /** + * The symbols between the selector and `{` for rules. + */ + between?: string + + /** + * Contains `true` if there is semicolon after rule. + */ + ownSemicolon?: string + + /** + * The rule’s selector with comments. + */ + selector?: { + raw: string + value: string + } + + /** + * Contains `true` if the last child has an (optional) semicolon. + */ + semicolon?: boolean + } + + export interface RuleProps extends ContainerProps { + /** Information used to generate byte-to-byte equal node string as it was in the origin input. */ + raws?: RuleRaws + /** Selector or selectors of the rule. */ + selector?: string + /** Selectors of the rule represented as an array of strings. */ + selectors?: string[] + } + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { Rule_ as default } +} + +/** + * Represents a CSS rule: a selector followed by a declaration block. + * + * ```js + * Once (root, { Rule }) { + * let a = new Rule({ selector: 'a' }) + * a.append(…) + * root.append(a) + * } + * ``` + * + * ```js + * const root = postcss.parse('a{}') + * const rule = root.first + * rule.type //=> 'rule' + * rule.toString() //=> 'a{}' + * ``` + */ +declare class Rule_ extends Container { + nodes: NonNullable + parent: ContainerWithChildren | undefined + raws: Rule.RuleRaws + /** + * The rule’s full selector represented as a string. + * + * ```js + * const root = postcss.parse('a, b { }') + * const rule = root.first + * rule.selector //=> 'a, b' + * ``` + */ + get selector(): string + set selector(value: string); + + /** + * An array containing the rule’s individual selectors. + * Groups of selectors are split at commas. + * + * ```js + * const root = postcss.parse('a, b { }') + * const rule = root.first + * + * rule.selector //=> 'a, b' + * rule.selectors //=> ['a', 'b'] + * + * rule.selectors = ['a', 'strong'] + * rule.selector //=> 'a, strong' + * ``` + */ + get selectors(): string[] + set selectors(values: string[]); + + type: 'rule' + + constructor(defaults?: Rule.RuleProps) + assign(overrides: object | Rule.RuleProps): this + clone(overrides?: Partial): Rule + cloneAfter(overrides?: Partial): Rule + cloneBefore(overrides?: Partial): Rule +} + +declare class Rule extends Rule_ {} + +export = Rule diff --git a/src/postcss/stringifier.d.ts b/src/postcss/stringifier.d.ts new file mode 100644 index 0000000..f707a6a --- /dev/null +++ b/src/postcss/stringifier.d.ts @@ -0,0 +1,46 @@ +import { + AnyNode, + AtRule, + Builder, + Comment, + Container, + Declaration, + Document, + Root, + Rule +} from './postcss.js' + +declare namespace Stringifier { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { Stringifier_ as default } +} + +declare class Stringifier_ { + builder: Builder + constructor(builder: Builder) + atrule(node: AtRule, semicolon?: boolean): void + beforeAfter(node: AnyNode, detect: 'after' | 'before'): string + block(node: AnyNode, start: string): void + body(node: Container): void + comment(node: Comment): void + decl(node: Declaration, semicolon?: boolean): void + document(node: Document): void + raw(node: AnyNode, own: null | string, detect?: string): string + rawBeforeClose(root: Root): string | undefined + rawBeforeComment(root: Root, node: Comment): string | undefined + rawBeforeDecl(root: Root, node: Declaration): string | undefined + rawBeforeOpen(root: Root): string | undefined + rawBeforeRule(root: Root): string | undefined + rawColon(root: Root): string | undefined + rawEmptyBody(root: Root): string | undefined + rawIndent(root: Root): string | undefined + rawSemicolon(root: Root): boolean | undefined + rawValue(node: AnyNode, prop: string): string + root(node: Root): void + rule(node: Rule): void + stringify(node: AnyNode, semicolon?: boolean): void +} + +declare class Stringifier extends Stringifier_ {} + +export = Stringifier diff --git a/src/postcss/stringify.d.ts b/src/postcss/stringify.d.ts new file mode 100644 index 0000000..06ad0b4 --- /dev/null +++ b/src/postcss/stringify.d.ts @@ -0,0 +1,9 @@ +import { Stringifier } from './postcss.js' + +interface Stringify extends Stringifier { + default: Stringify +} + +declare const stringify: Stringify + +export = stringify diff --git a/src/postcss/warning.d.ts b/src/postcss/warning.d.ts new file mode 100644 index 0000000..b25bba8 --- /dev/null +++ b/src/postcss/warning.d.ts @@ -0,0 +1,147 @@ +import { RangePosition } from './css-syntax-error.js' +import Node from './node.js' + +declare namespace Warning { + export interface WarningOptions { + /** + * End position, exclusive, in CSS node string that caused the warning. + */ + end?: RangePosition + + /** + * End index, exclusive, in CSS node string that caused the warning. + */ + endIndex?: number + + /** + * Start index, inclusive, in CSS node string that caused the warning. + */ + index?: number + + /** + * CSS node that caused the warning. + */ + node?: Node + + /** + * Name of the plugin that created this warning. `Result#warn` fills + * this property automatically. + */ + plugin?: string + + /** + * Start position, inclusive, in CSS node string that caused the warning. + */ + start?: RangePosition + + /** + * Word in CSS source that caused the warning. + */ + word?: string + } + + // eslint-disable-next-line @typescript-eslint/no-use-before-define + export { Warning_ as default } +} + +/** + * Represents a plugin’s warning. It can be created using `Node#warn`. + * + * ```js + * if (decl.important) { + * decl.warn(result, 'Avoid !important', { word: '!important' }) + * } + * ``` + */ +declare class Warning_ { + /** + * Column for inclusive start position in the input file with this warning’s source. + * + * ```js + * warning.column //=> 6 + * ``` + */ + column: number + + /** + * Column for exclusive end position in the input file with this warning’s source. + * + * ```js + * warning.endColumn //=> 4 + * ``` + */ + endColumn?: number + + /** + * Line for exclusive end position in the input file with this warning’s source. + * + * ```js + * warning.endLine //=> 6 + * ``` + */ + endLine?: number + + /** + * Line for inclusive start position in the input file with this warning’s source. + * + * ```js + * warning.line //=> 5 + * ``` + */ + line: number + + /** + * Contains the CSS node that caused the warning. + * + * ```js + * warning.node.toString() //=> 'color: white !important' + * ``` + */ + node: Node + + /** + * The name of the plugin that created this warning. + * When you call `Node#warn` it will fill this property automatically. + * + * ```js + * warning.plugin //=> 'postcss-important' + * ``` + */ + plugin: string + + /** + * The warning message. + * + * ```js + * warning.text //=> 'Try to avoid !important' + * ``` + */ + text: string + + /** + * Type to filter warnings from `Result#messages`. + * Always equal to `"warning"`. + */ + type: 'warning' + + /** + * @param text Warning message. + * @param opts Warning options. + */ + constructor(text: string, opts?: Warning.WarningOptions) + + /** + * Returns a warning position and message. + * + * ```js + * warning.toString() //=> 'postcss-lint:a.css:10:14: Avoid !important' + * ``` + * + * @return Warning position and message. + */ + toString(): string +} + +declare class Warning extends Warning_ {} + +export = Warning diff --git a/src/preprocess/index.ts b/src/preprocess/index.ts new file mode 100644 index 0000000..28163de --- /dev/null +++ b/src/preprocess/index.ts @@ -0,0 +1,36 @@ +// [note-to-mp 重构] 内容预处理模块 + +// 行级颜色块语法:||r text / ||g text / ||b text / ||y text / || text +const LINE_COLOR_RE = /^\|\|(r|g|b|y)?\s+(.*)$/; +const FIG_RE = /\[fig([^\n]*?)\/_?]/g; // 简单题注 + +function wrapColorLine(code: string | undefined, text: string): string { + const colorMap: Record = { + r: '#ffe5e5', + g: '#e5ffe9', + b: '#e5f1ff', + y: '#fff7d6', + '': '#f2f2f2' + }; + const c = (code && colorMap[code]) || colorMap['']; + return `

    ${text}

    `; +} + +export function preprocessContent(markdown: string): string { + const lines = markdown.split(/\r?\n/); + const out: string[] = []; + for (const line of lines) { + const m = line.match(LINE_COLOR_RE); + if (m) { + out.push(wrapColorLine(m[1], m[2])); + } else { + out.push(line); + } + } + let joined = out.join('\n'); + joined = joined.replace(FIG_RE, (_m, g1) => { + const text = g1.trim(); + return `${text}`; + }); + return joined; +} diff --git a/src/refactor-plan.md b/src/refactor-plan.md new file mode 100644 index 0000000..ab6f617 --- /dev/null +++ b/src/refactor-plan.md @@ -0,0 +1,69 @@ +# note-to-mp 重构规划 (模块与接口草案) + +> 标记格式: // [note-to-mp 重构] + +## 目标概要 +- 模块化:图片处理、元数据、Gallery、内容预处理、渲染管线分离。 +- 清晰接口:对外暴露统一渲染与数据提取 API。 +- 可测试:核心逻辑函数纯函数化,最小化对 Obsidian 运行时依赖。 + +## 模块划分 +1. 图片处理模块 (image/) + - 统一识别 wikilink 与 markdown 图片语法 + - LocalImage 结构: { original: string; basename: string; alt?: string; sourceType: 'wikilink'|'markdown'; index: number; } + - LocalImageManager: 收集、查询、封面候选、上传占位接口 + - 正则常量: LocalFileRegex + +2. 元数据与封面 (meta/) + - extractWeChatMeta(raw: string): WeChatMetaRaw + - getWeChatArticleMeta(): 返回最近一次渲染缓存的 meta + - getMetadata(images: LocalImage[], metaRaw: WeChatMetaRaw): FinalMeta + - 回退策略: frontmatter cover > metaRaw.coverLink > images[0] + +3. Gallery 支持 (gallery/) + - transformGalleryShortcodes(content: string): { content: string; extracted?: GalleryInfo } + - selectGalleryImages(dir: string, options): Promise + - 语法: 单行 self-closing 与 块级形式 + +4. 内容预处理 (preprocess/) + - preprocessContent(markdown: string): string + - 行级语法: ||r / ||g / ||b / ||y / || (默认灰) + - figure 语法: [fig text/] + +5. 渲染管线 (render/) + - renderMarkdown(file: TFile): Promise + - 内部阶段: + Raw -> extractWeChatMeta -> strip frontmatter -> transformGalleryShortcodes -> preprocessContent -> markdown parse (自定义 tokenizer) -> HTML + 样式注入 -> metadata 汇总 + +6. 上传/微信接口 (weixin/) + - 包装现有 weixin-api.ts 函数 + 错误封装 + +## 数据结构 +```ts +interface LocalImage { original: string; basename: string; alt?: string; sourceType: 'wikilink'|'markdown'; index: number; } +interface WeChatMetaRaw { title?: string; author?: string; coverLink?: string; rawImage?: string; hasFrontmatter: boolean; } +interface FinalMeta { title: string; author?: string; coverImage?: LocalImage; coverLink?: string; } +interface RenderedArticle { html: string; css?: string; meta: FinalMeta; images: LocalImage[]; raw: string; } +``` + +## 关键正则 +- frontmatter: ^---[\s\S]*?\n--- +- wikilink image: !\[\[(.+?)\]\] +- markdown image: !\[[^\]]*\]\(([^\n\r\)]+)\) +- gallery block: /{{}}([\s\S]*?){{<\/gallery>}}/g +- gallery figure: /{{]*>}}/g + +## 风险点 +- 正则误判 frontmatter +- 图片在预处理阶段被破坏索引 +- 多次渲染缓存污染 + +## 缓解 +- 提取后不修改原文本副本 +- 维护渲染上下文对象 (RenderContext) + +## 后续实现顺序 +图片处理 -> 元数据 -> Gallery -> 预处理 -> 渲染组装 -> 接口对接现有 NotePreview + +--- +(实现过程中该文档可增补) diff --git a/src/render/index.ts b/src/render/index.ts new file mode 100644 index 0000000..62f60a9 --- /dev/null +++ b/src/render/index.ts @@ -0,0 +1,50 @@ +// [note-to-mp 重构] 渲染管线模块 +import { App, TFile, MarkdownRenderer } from 'obsidian'; +import { parseImagesFromMarkdown, LocalImage, LocalImageManager } from '../image'; +import { extractWeChatMeta, getMetadata, FinalMeta } from '../meta'; +import { transformGalleryShortcodes } from '../gallery'; +import { preprocessContent } from '../preprocess'; + +export interface RenderedArticle { + html: string; + meta: FinalMeta; + images: LocalImage[]; + raw: string; +} + +export class RenderService { + private app: App; + private imageManager = new LocalImageManager(); + + constructor(app: App) { + this.app = app; + } + + async renderFile(file: TFile): Promise { + const raw = await this.app.vault.read(file); + return this.renderRaw(raw, file.path); + } + + async renderRaw(raw: string, path?: string): Promise { + this.imageManager.clear(); + // 1. frontmatter + 基础元数据 + const { meta: rawMeta, body } = extractWeChatMeta(raw); + // 2. gallery 转换 + const galleryRes = transformGalleryShortcodes(body); + // 3. 预处理行级语法 + const preprocessed = preprocessContent(galleryRes.content); + // 4. 图片解析 + const images = parseImagesFromMarkdown(preprocessed); + images.forEach(i => this.imageManager.add(i)); + // 5. 获取最终 meta(封面回退) + const finalMeta = getMetadata(images, rawMeta); + // 6. markdown -> HTML (使用 Obsidian 内部渲染管线) + const el = document.createElement('div'); + // NOTE: 这里简化,实际应考虑自定义 tokenizer;后续可补充 + await MarkdownRenderer.renderMarkdown(preprocessed, el, path || '', this.app as any); + // 7. 注入简单样式 (可外置) + const style = ``; + + return { html: style + el.innerHTML, meta: finalMeta, images, raw }; + } +} diff --git a/src/setting-tab.ts b/src/setting-tab.ts new file mode 100644 index 0000000..4a3ff01 --- /dev/null +++ b/src/setting-tab.ts @@ -0,0 +1,459 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { App, TextAreaComponent, PluginSettingTab, Setting, Notice, sanitizeHTMLToDom } from 'obsidian'; +import NoteToMpPlugin from './main'; +import { wxGetToken,wxEncrypt } from './weixin-api'; +import { cleanMathCache } from './markdown/math'; +import { NMPSettings } from './settings'; +import { DocModal } from './doc-modal'; + +export class NoteToMpSettingTab extends PluginSettingTab { + plugin: NoteToMpPlugin; + wxInfo: string; + wxTextArea: TextAreaComponent|null; + settings: NMPSettings; + + constructor(app: App, plugin: NoteToMpPlugin) { + super(app, plugin); + this.plugin = plugin; + this.settings = NMPSettings.getInstance(); + this.wxInfo = this.parseWXInfo(); + } + + displayWXInfo(txt:string) { + this.wxTextArea?.setValue(txt); + } + + parseWXInfo() { + const wxInfo = this.settings.wxInfo; + if (wxInfo.length == 0) { + return ''; + } + + let res = ''; + for (let wx of wxInfo) { + res += `${wx.name}|${wx.appid}|********\n`; + } + return res; + } + + async testWXInfo() { + const authKey = this.settings.authKey; + if (authKey.length == 0) { + new Notice('请先设置authKey'); + return; + } + const wxInfo = this.settings.wxInfo; + if (wxInfo.length == 0) { + new Notice('请先设置公众号信息'); + return; + } + try { + const docUrl = 'https://mp.weixin.qq.com/s/rk5CTPGr5ftly8PtYgSjCQ'; + for (let wx of wxInfo) { + const res = await wxGetToken(authKey, wx.appid, wx.secret.replace('SECRET', '')); + if (res.status != 200) { + const data = res.json; + const { code, message } = data; + let content = message; + if (code === 50002) { + content = '用户受限,可能是您的公众号被冻结或注销,请联系微信客服处理'; + } + else if (code === 40125) { + content = 'AppSecret错误,请检查或者重置,详细操作步骤请参考下方文档'; + } + else if (code === 40164) { + content = 'IP地址不在白名单中,请将如下地址添加到白名单:
    59.110.112.211
    154.8.198.218
    详细步骤请参考下方文档'; + } + const modal = new DocModal(this.app, `${wx.name} 测试失败`, content, docUrl); + modal.open(); + break + } + + const data = res.json; + if (data.token.length == 0) { + new Notice(`${wx.name}|${wx.appid} 测试失败`); + break + } + new Notice(`${wx.name} 测试通过`); + } + } catch (error) { + new Notice(`测试失败:${error}`); + } + } + + async encrypt() { + if (this.wxInfo.length == 0) { + new Notice('请输入内容'); + return false; + } + + if (this.settings.wxInfo.length > 0) { + new Notice('已经保存过了,请先清除!'); + return false; + } + + const wechat = []; + const lines = this.wxInfo.split('\n'); + for (let line of lines) { + line = line.trim(); + if (line.length == 0) { + continue; + } + const items = line.split('|'); + if (items.length != 3) { + new Notice('格式错误,请检查'); + return false; + } + const name = items[0]; + const appid = items[1].trim(); + const secret = items[2].trim(); + wechat.push({name, appid, secret}); + } + + if (wechat.length == 0) { + return false; + } + + try { + const res = await wxEncrypt(this.settings.authKey, wechat); + if (res.status != 200) { + const data = res.json; + new Notice(`${data.message}`); + return false; + } + + const data = res.json; + for (let wx of wechat) { + wx.secret = data[wx.appid]; + } + + this.settings.wxInfo = wechat; + await this.plugin.saveSettings(); + this.wxInfo = this.parseWXInfo(); + this.displayWXInfo(this.wxInfo); + new Notice('保存成功'); + return true; + + } catch (error) { + new Notice(`保存失败:${error}`); + console.error(error); + } + + return false; + } + + async clear() { + this.settings.wxInfo = []; + await this.plugin.saveSettings(); + this.wxInfo = ''; + this.displayWXInfo('') + } + + display() { + const {containerEl} = this; + + containerEl.empty(); + + this.wxInfo = this.parseWXInfo(); + + const helpEl = containerEl.createEl('div'); + helpEl.style.cssText = 'display: flex;flex-direction: row;align-items: center;'; + helpEl.createEl('h2', {text: '帮助文档'}).style.cssText = 'margin-right: 10px;'; + helpEl.createEl('a', {text: 'https://sunboshi.tech/doc', attr: {href: 'https://sunboshi.tech/doc'}}); + + containerEl.createEl('h2', {text: '插件设置'}); + + new Setting(containerEl) + .setName('默认样式') + .addDropdown(dropdown => { + const styles = this.plugin.assetsManager.themes; + for (let s of styles) { + dropdown.addOption(s.className, s.name); + } + dropdown.setValue(this.settings.defaultStyle); + dropdown.onChange(async (value) => { + this.settings.defaultStyle = value; + await this.plugin.saveSettings(); + }); + }); + + new Setting(containerEl) + .setName('代码高亮') + .addDropdown(dropdown => { + const styles = this.plugin.assetsManager.highlights; + for (let s of styles) { + dropdown.addOption(s.name, s.name); + } + dropdown.setValue(this.settings.defaultHighlight); + dropdown.onChange(async (value) => { + this.settings.defaultHighlight = value; + await this.plugin.saveSettings(); + }); + }); + + new Setting(containerEl) + .setName('在工具栏展示样式选择') + .setDesc('建议在移动端关闭,可以增大文章预览区域') + .addToggle(toggle => { + toggle.setValue(this.settings.showStyleUI); + toggle.onChange(async (value) => { + this.settings.showStyleUI = value; + await this.plugin.saveSettings(); + }); + }); + + new Setting(containerEl) + .setName('链接展示样式') + .addDropdown(dropdown => { + dropdown.addOption('inline', '内嵌'); + dropdown.addOption('footnote', '脚注'); + dropdown.setValue(this.settings.linkStyle); + dropdown.onChange(async (value) => { + this.settings.linkStyle = value; + await this.plugin.saveSettings(); + }); + }); + + new Setting(containerEl) + .setName('文件嵌入展示样式') + .addDropdown(dropdown => { + dropdown.addOption('quote', '引用'); + dropdown.addOption('content', '正文'); + dropdown.setValue(this.settings.embedStyle); + dropdown.onChange(async (value) => { + this.settings.embedStyle = value; + await this.plugin.saveSettings(); + }); + }); + + new Setting(containerEl) + .setName('数学公式语法') + .addDropdown(dropdown => { + dropdown.addOption('latex', 'latex'); + dropdown.addOption('asciimath', 'asciimath'); + dropdown.setValue(this.settings.math); + dropdown.onChange(async (value) => { + this.settings.math = value; + cleanMathCache(); + await this.plugin.saveSettings(); + }); + }); + + new Setting(containerEl) + .setName('显示代码行号') + .addToggle(toggle => { + toggle.setValue(this.settings.lineNumber); + toggle.onChange(async (value) => { + this.settings.lineNumber = value; + await this.plugin.saveSettings(); + }); + }) + + new Setting(containerEl) + .setName('启用空行渲染') + .addToggle(toggle => { + toggle.setValue(this.settings.enableEmptyLine); + toggle.onChange(async (value) => { + this.settings.enableEmptyLine = value; + await this.plugin.saveSettings(); + }); + }) + + new Setting(containerEl) + .setName('渲染图片标题') + .addToggle(toggle => { + toggle.setValue(this.settings.useFigcaption); + toggle.onChange(async (value) => { + this.settings.useFigcaption = value; + await this.plugin.saveSettings(); + }); + }) + + new Setting(containerEl) + .setName('Excalidraw 渲染为 PNG 图片') + .addToggle(toggle => { + toggle.setValue(this.settings.excalidrawToPNG); + toggle.onChange(async (value) => { + this.settings.excalidrawToPNG = value; + await this.plugin.saveSettings(); + }); + }) + + new Setting(containerEl) + .setName('水印图片') + .addText(text => { + text.setPlaceholder('请输入图片名称') + .setValue(this.settings.watermark) + .onChange(async (value) => { + this.settings.watermark = value.trim(); + await this.plugin.saveSettings(); + }) + .inputEl.setAttr('style', 'width: 320px;') + }) + + new Setting(containerEl) + .setName('获取更多主题') + .addButton(button => { + button.setButtonText('下载'); + button.onClick(async () => { + button.setButtonText('下载中...'); + await this.plugin.assetsManager.downloadThemes(); + button.setButtonText('下载完成'); + }); + }) + .addButton(button => { + button.setIcon('folder-open'); + button.onClick(async () => { + await this.plugin.assetsManager.openAssets(); + }); + }); + + new Setting(containerEl) + .setName('清空主题') + .addButton(button => { + button.setButtonText('清空'); + button.onClick(async () => { + await this.plugin.assetsManager.removeThemes(); + this.settings.resetStyelAndHighlight(); + await this.plugin.saveSettings(); + }); + }) + new Setting(containerEl) + .setName('全局CSS属性') + .setDesc('只能填写CSS属性,不能写选择器') + .addTextArea(text => { + this.wxTextArea = text; + text.setPlaceholder('请输入CSS属性,如:background: #fff;padding: 10px;') + .setValue(this.settings.baseCSS) + .onChange(async (value) => { + this.settings.baseCSS = value; + await this.plugin.saveSettings(); + }) + .inputEl.setAttr('style', 'width: 520px; height: 60px;'); + }) + const customCSSDoc = '使用指南:https://sunboshi.tech/customcss'; + new Setting(containerEl) + .setName('自定义CSS笔记') + .setDesc(sanitizeHTMLToDom(customCSSDoc)) + .addText(text => { + text.setPlaceholder('请输入自定义CSS笔记标题') + .setValue(this.settings.customCSSNote) + .onChange(async (value) => { + this.settings.customCSSNote = value.trim(); + await this.plugin.saveSettings(); + await this.plugin.assetsManager.loadCustomCSS(); + }) + .inputEl.setAttr('style', 'width: 320px;') + }); + + const expertDoc = '使用指南:https://sunboshi.tech/expert'; + new Setting(containerEl) + .setName('专家设置笔记') + .setDesc(sanitizeHTMLToDom(expertDoc)) + .addText(text => { + text.setPlaceholder('请输入专家设置笔记标题') + .setValue(this.settings.expertSettingsNote) + .onChange(async (value) => { + this.settings.expertSettingsNote = value.trim(); + await this.plugin.saveSettings(); + await this.plugin.assetsManager.loadExpertSettings(); + }) + .inputEl.setAttr('style', 'width: 320px;') + }); + + let descHtml = '详情说明:https://sunboshi.tech/subscribe'; + if (this.settings.isVip) { + descHtml = '👑永久会员
    ' + descHtml; + } + else if (this.settings.expireat) { + const timestr = this.settings.expireat.toLocaleString(); + descHtml = `有效期至:${timestr}
    ${descHtml}` + } + new Setting(containerEl) + .setName('注册码(AuthKey)') + .setDesc(sanitizeHTMLToDom(descHtml)) + .addText(text => { + text.setPlaceholder('请输入注册码') + .setValue(this.settings.authKey) + .onChange(async (value) => { + this.settings.authKey = value.trim(); + this.settings.getExpiredDate(); + await this.plugin.saveSettings(); + }) + .inputEl.setAttr('style', 'width: 320px;') + }).descEl.setAttr('style', '-webkit-user-select: text; user-select: text;') + + + let isClear = this.settings.wxInfo.length > 0; + let isRealClear = false; + const buttonText = isClear ? '清空公众号信息' : '保存公众号信息'; + new Setting(containerEl) + .setName('公众号信息') + .addTextArea(text => { + this.wxTextArea = text; + text.setPlaceholder('请输入公众号信息\n格式:公众号名称|公众号AppID|公众号AppSecret\n多个公众号请换行输入\n输入完成后点击加密按钮') + .setValue(this.wxInfo) + .onChange(value => { + this.wxInfo = value; + }) + .inputEl.setAttr('style', 'width: 520px; height: 120px;'); + }) + + new Setting(containerEl).addButton(button => { + button.setButtonText(buttonText); + button.onClick(async () => { + if (isClear) { + isRealClear = true; + isClear = false; + button.setButtonText('确认清空?'); + } + else if (isRealClear) { + isRealClear = false; + isClear = false; + this.clear(); + button.setButtonText('保存公众号信息'); + } + else { + button.setButtonText('保存中...'); + if (await this.encrypt()) { + isClear = true; + isRealClear = false; + button.setButtonText('清空公众号信息'); + } + else { + button.setButtonText('保存公众号信息'); + } + } + }); + }) + .addButton(button => { + button.setButtonText('测试公众号'); + button.onClick(async () => { + button.setButtonText('测试中...'); + await this.testWXInfo(); + button.setButtonText('测试公众号'); + }) + }) + } +} diff --git a/src/settings.ts b/src/settings.ts new file mode 100644 index 0000000..b8f2c23 --- /dev/null +++ b/src/settings.ts @@ -0,0 +1,203 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { wxKeyInfo } from './weixin-api'; + +export class NMPSettings { + defaultStyle: string; + defaultHighlight: string; + showStyleUI: boolean; + linkStyle: string; + embedStyle: string; + lineNumber: boolean; + authKey: string; + useCustomCss: boolean; + customCSSNote: string; + expertSettingsNote: string; + wxInfo: {name:string, appid:string, secret:string}[]; + math: string; + expireat: Date | null = null; + isVip: boolean = false; + baseCSS: string; + watermark: string; + useFigcaption: boolean; + excalidrawToPNG: boolean; + isLoaded: boolean = false; + enableEmptyLine: boolean = false; + + private static instance: NMPSettings; + + // 静态方法,用于获取实例 + public static getInstance(): NMPSettings { + if (!NMPSettings.instance) { + NMPSettings.instance = new NMPSettings(); + } + return NMPSettings.instance; + } + + private constructor() { + this.defaultStyle = 'obsidian-light'; + this.defaultHighlight = '默认'; + this.showStyleUI = true; + this.linkStyle = 'inline'; + this.embedStyle = 'content'; + this.lineNumber = true; + this.useCustomCss = false; + this.authKey = ''; + this.wxInfo = []; + this.math = 'latex'; + this.baseCSS = ''; + this.watermark = ''; + this.useFigcaption = false; + this.customCSSNote = ''; + this.excalidrawToPNG = false; + this.expertSettingsNote = ''; + this.enableEmptyLine = false; + } + + resetStyelAndHighlight() { + this.defaultStyle = 'obsidian-light'; + this.defaultHighlight = '默认'; + } + + public static loadSettings(data: any) { + if (!data) { + return + } + const { + defaultStyle, + linkStyle, + embedStyle, + showStyleUI, + lineNumber, + defaultHighlight, + authKey, + wxInfo, + math, + useCustomCss, + baseCSS, + watermark, + useFigcaption, + customCSSNote, + excalidrawToPNG, + expertSettingsNote, + ignoreEmptyLine, + } = data; + + const settings = NMPSettings.getInstance(); + if (defaultStyle) { + settings.defaultStyle = defaultStyle; + } + if (defaultHighlight) { + settings.defaultHighlight = defaultHighlight; + } + if (showStyleUI !== undefined) { + settings.showStyleUI = showStyleUI; + } + if (linkStyle) { + settings.linkStyle = linkStyle; + } + if (embedStyle) { + settings.embedStyle = embedStyle; + } + if (lineNumber !== undefined) { + settings.lineNumber = lineNumber; + } + if (authKey) { + settings.authKey = authKey; + } + if (wxInfo) { + settings.wxInfo = wxInfo; + } + if (math) { + settings.math = math; + } + if (useCustomCss !== undefined) { + settings.useCustomCss = useCustomCss; + } + if (baseCSS) { + settings.baseCSS = baseCSS; + } + if (watermark) { + settings.watermark = watermark; + } + if (useFigcaption !== undefined) { + settings.useFigcaption = useFigcaption; + } + if (customCSSNote) { + settings.customCSSNote = customCSSNote; + } + if (excalidrawToPNG !== undefined) { + settings.excalidrawToPNG = excalidrawToPNG; + } + if (expertSettingsNote) { + settings.expertSettingsNote = expertSettingsNote; + } + if (ignoreEmptyLine !== undefined) { + settings.enableEmptyLine = ignoreEmptyLine; + } + settings.getExpiredDate(); + settings.isLoaded = true; + } + + public static allSettings() { + const settings = NMPSettings.getInstance(); + return { + 'defaultStyle': settings.defaultStyle, + 'defaultHighlight': settings.defaultHighlight, + 'showStyleUI': settings.showStyleUI, + 'linkStyle': settings.linkStyle, + 'embedStyle': settings.embedStyle, + 'lineNumber': settings.lineNumber, + 'authKey': settings.authKey, + 'wxInfo': settings.wxInfo, + 'math': settings.math, + 'useCustomCss': settings.useCustomCss, + 'baseCSS': settings.baseCSS, + 'watermark': settings.watermark, + 'useFigcaption': settings.useFigcaption, + 'customCSSNote': settings.customCSSNote, + 'excalidrawToPNG': settings.excalidrawToPNG, + 'expertSettingsNote': settings.expertSettingsNote, + 'ignoreEmptyLine': settings.enableEmptyLine, + } + } + + getExpiredDate() { + if (this.authKey.length == 0) return; + wxKeyInfo(this.authKey).then((res) => { + if (res.status == 200) { + if (res.json.vip) { + this.isVip = true; + } + this.expireat = new Date(res.json.expireat); + } + }) + } + + isAuthKeyVaild() { + if (this.authKey.length == 0) return false; + if (this.isVip) return true; + if (this.expireat == null) return false; + return this.expireat > new Date(); + } +} \ No newline at end of file diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..9937c4f --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,251 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { App, sanitizeHTMLToDom, requestUrl, Platform } from "obsidian"; +import * as postcss from "./postcss/postcss"; + +let PluginVersion = "0.0.0"; +let PlugPlatform = "obsidian"; + +export function setVersion(version: string) { + PluginVersion = version; + if (Platform.isWin) { + PlugPlatform = "win"; + } + else if (Platform.isMacOS) { + PlugPlatform = "mac"; + } + else if (Platform.isLinux) { + PlugPlatform = "linux"; + } + else if (Platform.isIosApp) { + PlugPlatform = "ios"; + } + else if (Platform.isAndroidApp) { + PlugPlatform = "android"; + } +} + +function getStyleSheet() { + for (var i = 0; i < document.styleSheets.length; i++) { + var sheet = document.styleSheets[i]; + if (sheet.title == 'note-to-mp-style') { + return sheet; + } + } +} + +function applyStyles(element: HTMLElement, styles: CSSStyleDeclaration, computedStyle: CSSStyleDeclaration) { + for (let i = 0; i < styles.length; i++) { + const propertyName = styles[i]; + let propertyValue = computedStyle.getPropertyValue(propertyName); + if (propertyName == 'width' && styles.getPropertyValue(propertyName) == 'fit-content') { + propertyValue = 'fit-content'; + } + if (propertyName.indexOf('margin') >= 0 && styles.getPropertyValue(propertyName).indexOf('auto') >= 0) { + propertyValue = styles.getPropertyValue(propertyName); + } + element.style.setProperty(propertyName, propertyValue); + } +} + +function parseAndApplyStyles(element: HTMLElement, sheet:CSSStyleSheet) { + try { + const computedStyle = getComputedStyle(element); + for (let i = 0; i < sheet.cssRules.length; i++) { + const rule = sheet.cssRules[i]; + if (rule instanceof CSSStyleRule && element.matches(rule.selectorText)) { + applyStyles(element, rule.style, computedStyle); + } + } + } catch (e) { + console.warn("Unable to access stylesheet: " + sheet.href, e); + } +} + +function traverse(root: HTMLElement, sheet:CSSStyleSheet) { + let element = root.firstElementChild; + while (element) { + if (element.tagName === 'svg') { + // pass + } + else { + traverse(element as HTMLElement, sheet); + } + element = element.nextElementSibling; + } + parseAndApplyStyles(root, sheet); +} + +export async function CSSProcess(content: HTMLElement) { + // 获取样式表 + const style = getStyleSheet(); + if (style) { + traverse(content, style); + } +} + +export function parseCSS(css: string) { + return postcss.parse(css); +} + +export function ruleToStyle(rule: postcss.Rule) { + let style = ''; + rule.walkDecls(decl => { + style += decl.prop + ':' + decl.value + ';'; + }) + + return style; +} + +function processPseudoSelector(selector: string) { + if (selector.includes('::before') || selector.includes('::after')) { + selector = selector.replace(/::before/g, '').replace(/::after/g, ''); + } + return selector; +} + +function getPseudoType(selector: string) { + if (selector.includes('::before')) { + return 'before'; + } + else if (selector.includes('::after')) { + return 'after'; + } + return undefined; +} + +function applyStyle(root: HTMLElement, cssRoot: postcss.Root) { + if (root.tagName.toLowerCase() === 'a' && root.classList.contains('wx_topic_link')) { + return; + } + + const cssText = root.style.cssText; + cssRoot.walkRules(rule => { + const selector = processPseudoSelector(rule.selector); + try { + if (root.matches(selector)) { + let item = root; + + const pseudoType = getPseudoType(rule.selector); + if (pseudoType) { + let content = ''; + rule.walkDecls('content', decl => { + content = decl.value || ''; + }) + item = createSpan(); + item.textContent = content.replace(/(^")|("$)/g, ''); + + if (pseudoType === 'before') { + root.prepend(item); + } + else if (pseudoType === 'after') { + root.appendChild(item); + } + } + + rule.walkDecls(decl => { + // 如果已经设置了,则不覆盖 + const setted = cssText.includes(decl.prop); + if (!setted || decl.important) { + item.style.setProperty(decl.prop, decl.value); + } + }) + } + } + catch (err) { + if (err.message && err.message.includes('is not a valid selector')) { + return; + } + else { + throw err; + } + } + }); + + if (root.tagName === 'svg') { + return; + } + + let element = root.firstElementChild; + while (element) { + applyStyle(element as HTMLElement, cssRoot); + element = element.nextElementSibling; + } +} + +export function applyCSS(html: string, css: string) { + const doc = sanitizeHTMLToDom(html); + const root = doc.firstChild as HTMLElement; + const cssRoot = postcss.parse(css); + applyStyle(root, cssRoot); + return root.outerHTML; +} + +export function uevent(name: string) { + const url = `https://u.sunboshi.tech/event?name=${name}&platform=${PlugPlatform}&v=${PluginVersion}`; + requestUrl(url).then().catch(error => { + console.error("Failed to send event: " + url, error); + }); +} + +/** + * 创建一个防抖函数 + * @param func 要执行的函数 + * @param wait 等待时间(毫秒) + * @returns 防抖处理后的函数 + */ +export function debounce any>(func: T, wait: number): (...args: Parameters) => void { + let timeout: NodeJS.Timeout | null = null; + + return function(this: any, ...args: Parameters) { + const context = this; + + const later = () => { + timeout = null; + func.apply(context, args); + }; + + if (timeout !== null) { + clearTimeout(timeout); + } + timeout = setTimeout(later, wait); + }; +} + +export function cleanUrl(href: string) { + try { + href = encodeURI(href).replace(/%25/g, '%'); + } catch (e) { + return null; + } + return href; +} + +export async function waitForLayoutReady(app: App): Promise { + if (app.workspace.layoutReady) { + return; + } + return new Promise((resolve) => { + app.workspace.onLayoutReady(() => resolve()); + }); +} diff --git a/src/wasm/wasm.ts b/src/wasm/wasm.ts new file mode 100644 index 0000000..5e18ef4 --- /dev/null +++ b/src/wasm/wasm.ts @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import AssetsManager from "../assets"; +require('./wasm_exec.js'); + +declare class Go { + argv: string[]; + env: { [envKey: string]: string }; + exit: (code: number) => void; + importObject: WebAssembly.Imports; + exited: boolean; + mem: DataView; + run(instance: WebAssembly.Instance): Promise; +} + +let WasmLoaded = false; + +export function IsWasmReady() { + return WasmLoaded; +} + +export async function LoadWasm() { + if (WasmLoaded) { + return; + } + const assets = AssetsManager.getInstance(); + const wasmContent = await assets.loadWasm(); + + if (!wasmContent) { + console.error('WASM content not found'); + // throw new Error('WASM content not found'); + return; + } + const go = new Go(); + const ret = await WebAssembly.instantiate(wasmContent, go.importObject); + go.run(ret.instance); + WasmLoaded = true; +} diff --git a/src/wasm/wasm_exec.js b/src/wasm/wasm_exec.js new file mode 100644 index 0000000..bc6f210 --- /dev/null +++ b/src/wasm/wasm_exec.js @@ -0,0 +1,561 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +"use strict"; + +(() => { + const enosys = () => { + const err = new Error("not implemented"); + err.code = "ENOSYS"; + return err; + }; + + if (!globalThis.fs) { + let outputBuf = ""; + globalThis.fs = { + constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unused + writeSync(fd, buf) { + outputBuf += decoder.decode(buf); + const nl = outputBuf.lastIndexOf("\n"); + if (nl != -1) { + console.log(outputBuf.substring(0, nl)); + outputBuf = outputBuf.substring(nl + 1); + } + return buf.length; + }, + write(fd, buf, offset, length, position, callback) { + if (offset !== 0 || length !== buf.length || position !== null) { + callback(enosys()); + return; + } + const n = this.writeSync(fd, buf); + callback(null, n); + }, + chmod(path, mode, callback) { callback(enosys()); }, + chown(path, uid, gid, callback) { callback(enosys()); }, + close(fd, callback) { callback(enosys()); }, + fchmod(fd, mode, callback) { callback(enosys()); }, + fchown(fd, uid, gid, callback) { callback(enosys()); }, + fstat(fd, callback) { callback(enosys()); }, + fsync(fd, callback) { callback(null); }, + ftruncate(fd, length, callback) { callback(enosys()); }, + lchown(path, uid, gid, callback) { callback(enosys()); }, + link(path, link, callback) { callback(enosys()); }, + lstat(path, callback) { callback(enosys()); }, + mkdir(path, perm, callback) { callback(enosys()); }, + open(path, flags, mode, callback) { callback(enosys()); }, + read(fd, buffer, offset, length, position, callback) { callback(enosys()); }, + readdir(path, callback) { callback(enosys()); }, + readlink(path, callback) { callback(enosys()); }, + rename(from, to, callback) { callback(enosys()); }, + rmdir(path, callback) { callback(enosys()); }, + stat(path, callback) { callback(enosys()); }, + symlink(path, link, callback) { callback(enosys()); }, + truncate(path, length, callback) { callback(enosys()); }, + unlink(path, callback) { callback(enosys()); }, + utimes(path, atime, mtime, callback) { callback(enosys()); }, + }; + } + + if (!globalThis.process) { + globalThis.process = { + getuid() { return -1; }, + getgid() { return -1; }, + geteuid() { return -1; }, + getegid() { return -1; }, + getgroups() { throw enosys(); }, + pid: -1, + ppid: -1, + umask() { throw enosys(); }, + cwd() { throw enosys(); }, + chdir() { throw enosys(); }, + } + } + + if (!globalThis.crypto) { + throw new Error("globalThis.crypto is not available, polyfill required (crypto.getRandomValues only)"); + } + + if (!globalThis.performance) { + throw new Error("globalThis.performance is not available, polyfill required (performance.now only)"); + } + + if (!globalThis.TextEncoder) { + throw new Error("globalThis.TextEncoder is not available, polyfill required"); + } + + if (!globalThis.TextDecoder) { + throw new Error("globalThis.TextDecoder is not available, polyfill required"); + } + + const encoder = new TextEncoder("utf-8"); + const decoder = new TextDecoder("utf-8"); + + globalThis.Go = class { + constructor() { + this.argv = ["js"]; + this.env = {}; + this.exit = (code) => { + if (code !== 0) { + console.warn("exit code:", code); + } + }; + this._exitPromise = new Promise((resolve) => { + this._resolveExitPromise = resolve; + }); + this._pendingEvent = null; + this._scheduledTimeouts = new Map(); + this._nextCallbackTimeoutID = 1; + + const setInt64 = (addr, v) => { + this.mem.setUint32(addr + 0, v, true); + this.mem.setUint32(addr + 4, Math.floor(v / 4294967296), true); + } + + const setInt32 = (addr, v) => { + this.mem.setUint32(addr + 0, v, true); + } + + const getInt64 = (addr) => { + const low = this.mem.getUint32(addr + 0, true); + const high = this.mem.getInt32(addr + 4, true); + return low + high * 4294967296; + } + + const loadValue = (addr) => { + const f = this.mem.getFloat64(addr, true); + if (f === 0) { + return undefined; + } + if (!isNaN(f)) { + return f; + } + + const id = this.mem.getUint32(addr, true); + return this._values[id]; + } + + const storeValue = (addr, v) => { + const nanHead = 0x7FF80000; + + if (typeof v === "number" && v !== 0) { + if (isNaN(v)) { + this.mem.setUint32(addr + 4, nanHead, true); + this.mem.setUint32(addr, 0, true); + return; + } + this.mem.setFloat64(addr, v, true); + return; + } + + if (v === undefined) { + this.mem.setFloat64(addr, 0, true); + return; + } + + let id = this._ids.get(v); + if (id === undefined) { + id = this._idPool.pop(); + if (id === undefined) { + id = this._values.length; + } + this._values[id] = v; + this._goRefCounts[id] = 0; + this._ids.set(v, id); + } + this._goRefCounts[id]++; + let typeFlag = 0; + switch (typeof v) { + case "object": + if (v !== null) { + typeFlag = 1; + } + break; + case "string": + typeFlag = 2; + break; + case "symbol": + typeFlag = 3; + break; + case "function": + typeFlag = 4; + break; + } + this.mem.setUint32(addr + 4, nanHead | typeFlag, true); + this.mem.setUint32(addr, id, true); + } + + const loadSlice = (addr) => { + const array = getInt64(addr + 0); + const len = getInt64(addr + 8); + return new Uint8Array(this._inst.exports.mem.buffer, array, len); + } + + const loadSliceOfValues = (addr) => { + const array = getInt64(addr + 0); + const len = getInt64(addr + 8); + const a = new Array(len); + for (let i = 0; i < len; i++) { + a[i] = loadValue(array + i * 8); + } + return a; + } + + const loadString = (addr) => { + const saddr = getInt64(addr + 0); + const len = getInt64(addr + 8); + return decoder.decode(new DataView(this._inst.exports.mem.buffer, saddr, len)); + } + + const timeOrigin = Date.now() - performance.now(); + this.importObject = { + _gotest: { + add: (a, b) => a + b, + }, + gojs: { + // Go's SP does not change as long as no Go code is running. Some operations (e.g. calls, getters and setters) + // may synchronously trigger a Go event handler. This makes Go code get executed in the middle of the imported + // function. A goroutine can switch to a new stack if the current stack is too small (see morestack function). + // This changes the SP, thus we have to update the SP used by the imported function. + + // func wasmExit(code int32) + "runtime.wasmExit": (sp) => { + sp >>>= 0; + const code = this.mem.getInt32(sp + 8, true); + this.exited = true; + delete this._inst; + delete this._values; + delete this._goRefCounts; + delete this._ids; + delete this._idPool; + this.exit(code); + }, + + // func wasmWrite(fd uintptr, p unsafe.Pointer, n int32) + "runtime.wasmWrite": (sp) => { + sp >>>= 0; + const fd = getInt64(sp + 8); + const p = getInt64(sp + 16); + const n = this.mem.getInt32(sp + 24, true); + fs.writeSync(fd, new Uint8Array(this._inst.exports.mem.buffer, p, n)); + }, + + // func resetMemoryDataView() + "runtime.resetMemoryDataView": (sp) => { + sp >>>= 0; + this.mem = new DataView(this._inst.exports.mem.buffer); + }, + + // func nanotime1() int64 + "runtime.nanotime1": (sp) => { + sp >>>= 0; + setInt64(sp + 8, (timeOrigin + performance.now()) * 1000000); + }, + + // func walltime() (sec int64, nsec int32) + "runtime.walltime": (sp) => { + sp >>>= 0; + const msec = (new Date).getTime(); + setInt64(sp + 8, msec / 1000); + this.mem.setInt32(sp + 16, (msec % 1000) * 1000000, true); + }, + + // func scheduleTimeoutEvent(delay int64) int32 + "runtime.scheduleTimeoutEvent": (sp) => { + sp >>>= 0; + const id = this._nextCallbackTimeoutID; + this._nextCallbackTimeoutID++; + this._scheduledTimeouts.set(id, setTimeout( + () => { + this._resume(); + while (this._scheduledTimeouts.has(id)) { + // for some reason Go failed to register the timeout event, log and try again + // (temporary workaround for https://github.com/golang/go/issues/28975) + console.warn("scheduleTimeoutEvent: missed timeout event"); + this._resume(); + } + }, + getInt64(sp + 8), + )); + this.mem.setInt32(sp + 16, id, true); + }, + + // func clearTimeoutEvent(id int32) + "runtime.clearTimeoutEvent": (sp) => { + sp >>>= 0; + const id = this.mem.getInt32(sp + 8, true); + clearTimeout(this._scheduledTimeouts.get(id)); + this._scheduledTimeouts.delete(id); + }, + + // func getRandomData(r []byte) + "runtime.getRandomData": (sp) => { + sp >>>= 0; + crypto.getRandomValues(loadSlice(sp + 8)); + }, + + // func finalizeRef(v ref) + "syscall/js.finalizeRef": (sp) => { + sp >>>= 0; + const id = this.mem.getUint32(sp + 8, true); + this._goRefCounts[id]--; + if (this._goRefCounts[id] === 0) { + const v = this._values[id]; + this._values[id] = null; + this._ids.delete(v); + this._idPool.push(id); + } + }, + + // func stringVal(value string) ref + "syscall/js.stringVal": (sp) => { + sp >>>= 0; + storeValue(sp + 24, loadString(sp + 8)); + }, + + // func valueGet(v ref, p string) ref + "syscall/js.valueGet": (sp) => { + sp >>>= 0; + const result = Reflect.get(loadValue(sp + 8), loadString(sp + 16)); + sp = this._inst.exports.getsp() >>> 0; // see comment above + storeValue(sp + 32, result); + }, + + // func valueSet(v ref, p string, x ref) + "syscall/js.valueSet": (sp) => { + sp >>>= 0; + Reflect.set(loadValue(sp + 8), loadString(sp + 16), loadValue(sp + 32)); + }, + + // func valueDelete(v ref, p string) + "syscall/js.valueDelete": (sp) => { + sp >>>= 0; + Reflect.deleteProperty(loadValue(sp + 8), loadString(sp + 16)); + }, + + // func valueIndex(v ref, i int) ref + "syscall/js.valueIndex": (sp) => { + sp >>>= 0; + storeValue(sp + 24, Reflect.get(loadValue(sp + 8), getInt64(sp + 16))); + }, + + // valueSetIndex(v ref, i int, x ref) + "syscall/js.valueSetIndex": (sp) => { + sp >>>= 0; + Reflect.set(loadValue(sp + 8), getInt64(sp + 16), loadValue(sp + 24)); + }, + + // func valueCall(v ref, m string, args []ref) (ref, bool) + "syscall/js.valueCall": (sp) => { + sp >>>= 0; + try { + const v = loadValue(sp + 8); + const m = Reflect.get(v, loadString(sp + 16)); + const args = loadSliceOfValues(sp + 32); + const result = Reflect.apply(m, v, args); + sp = this._inst.exports.getsp() >>> 0; // see comment above + storeValue(sp + 56, result); + this.mem.setUint8(sp + 64, 1); + } catch (err) { + sp = this._inst.exports.getsp() >>> 0; // see comment above + storeValue(sp + 56, err); + this.mem.setUint8(sp + 64, 0); + } + }, + + // func valueInvoke(v ref, args []ref) (ref, bool) + "syscall/js.valueInvoke": (sp) => { + sp >>>= 0; + try { + const v = loadValue(sp + 8); + const args = loadSliceOfValues(sp + 16); + const result = Reflect.apply(v, undefined, args); + sp = this._inst.exports.getsp() >>> 0; // see comment above + storeValue(sp + 40, result); + this.mem.setUint8(sp + 48, 1); + } catch (err) { + sp = this._inst.exports.getsp() >>> 0; // see comment above + storeValue(sp + 40, err); + this.mem.setUint8(sp + 48, 0); + } + }, + + // func valueNew(v ref, args []ref) (ref, bool) + "syscall/js.valueNew": (sp) => { + sp >>>= 0; + try { + const v = loadValue(sp + 8); + const args = loadSliceOfValues(sp + 16); + const result = Reflect.construct(v, args); + sp = this._inst.exports.getsp() >>> 0; // see comment above + storeValue(sp + 40, result); + this.mem.setUint8(sp + 48, 1); + } catch (err) { + sp = this._inst.exports.getsp() >>> 0; // see comment above + storeValue(sp + 40, err); + this.mem.setUint8(sp + 48, 0); + } + }, + + // func valueLength(v ref) int + "syscall/js.valueLength": (sp) => { + sp >>>= 0; + setInt64(sp + 16, parseInt(loadValue(sp + 8).length)); + }, + + // valuePrepareString(v ref) (ref, int) + "syscall/js.valuePrepareString": (sp) => { + sp >>>= 0; + const str = encoder.encode(String(loadValue(sp + 8))); + storeValue(sp + 16, str); + setInt64(sp + 24, str.length); + }, + + // valueLoadString(v ref, b []byte) + "syscall/js.valueLoadString": (sp) => { + sp >>>= 0; + const str = loadValue(sp + 8); + loadSlice(sp + 16).set(str); + }, + + // func valueInstanceOf(v ref, t ref) bool + "syscall/js.valueInstanceOf": (sp) => { + sp >>>= 0; + this.mem.setUint8(sp + 24, (loadValue(sp + 8) instanceof loadValue(sp + 16)) ? 1 : 0); + }, + + // func copyBytesToGo(dst []byte, src ref) (int, bool) + "syscall/js.copyBytesToGo": (sp) => { + sp >>>= 0; + const dst = loadSlice(sp + 8); + const src = loadValue(sp + 32); + if (!(src instanceof Uint8Array || src instanceof Uint8ClampedArray)) { + this.mem.setUint8(sp + 48, 0); + return; + } + const toCopy = src.subarray(0, dst.length); + dst.set(toCopy); + setInt64(sp + 40, toCopy.length); + this.mem.setUint8(sp + 48, 1); + }, + + // func copyBytesToJS(dst ref, src []byte) (int, bool) + "syscall/js.copyBytesToJS": (sp) => { + sp >>>= 0; + const dst = loadValue(sp + 8); + const src = loadSlice(sp + 16); + if (!(dst instanceof Uint8Array || dst instanceof Uint8ClampedArray)) { + this.mem.setUint8(sp + 48, 0); + return; + } + const toCopy = src.subarray(0, dst.length); + dst.set(toCopy); + setInt64(sp + 40, toCopy.length); + this.mem.setUint8(sp + 48, 1); + }, + + "debug": (value) => { + console.log(value); + }, + } + }; + } + + async run(instance) { + if (!(instance instanceof WebAssembly.Instance)) { + throw new Error("Go.run: WebAssembly.Instance expected"); + } + this._inst = instance; + this.mem = new DataView(this._inst.exports.mem.buffer); + this._values = [ // JS values that Go currently has references to, indexed by reference id + NaN, + 0, + null, + true, + false, + globalThis, + this, + ]; + this._goRefCounts = new Array(this._values.length).fill(Infinity); // number of references that Go has to a JS value, indexed by reference id + this._ids = new Map([ // mapping from JS values to reference ids + [0, 1], + [null, 2], + [true, 3], + [false, 4], + [globalThis, 5], + [this, 6], + ]); + this._idPool = []; // unused ids that have been garbage collected + this.exited = false; // whether the Go program has exited + + // Pass command line arguments and environment variables to WebAssembly by writing them to the linear memory. + let offset = 4096; + + const strPtr = (str) => { + const ptr = offset; + const bytes = encoder.encode(str + "\0"); + new Uint8Array(this.mem.buffer, offset, bytes.length).set(bytes); + offset += bytes.length; + if (offset % 8 !== 0) { + offset += 8 - (offset % 8); + } + return ptr; + }; + + const argc = this.argv.length; + + const argvPtrs = []; + this.argv.forEach((arg) => { + argvPtrs.push(strPtr(arg)); + }); + argvPtrs.push(0); + + const keys = Object.keys(this.env).sort(); + keys.forEach((key) => { + argvPtrs.push(strPtr(`${key}=${this.env[key]}`)); + }); + argvPtrs.push(0); + + const argv = offset; + argvPtrs.forEach((ptr) => { + this.mem.setUint32(offset, ptr, true); + this.mem.setUint32(offset + 4, 0, true); + offset += 8; + }); + + // The linker guarantees global data starts from at least wasmMinDataAddr. + // Keep in sync with cmd/link/internal/ld/data.go:wasmMinDataAddr. + const wasmMinDataAddr = 4096 + 8192; + if (offset >= wasmMinDataAddr) { + throw new Error("total length of command line and environment variables exceeds limit"); + } + + this._inst.exports.run(argc, argv); + if (this.exited) { + this._resolveExitPromise(); + } + await this._exitPromise; + } + + _resume() { + if (this.exited) { + throw new Error("Go program has already exited"); + } + this._inst.exports.resume(); + if (this.exited) { + this._resolveExitPromise(); + } + } + + _makeFuncWrapper(id) { + const go = this; + return function () { + const event = { id: id, this: this, args: arguments }; + go._pendingEvent = event; + go._resume(); + return event.result; + }; + } + } +})(); diff --git a/src/weixin-api.ts b/src/weixin-api.ts new file mode 100644 index 0000000..bef95eb --- /dev/null +++ b/src/weixin-api.ts @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { requestUrl, RequestUrlParam, getBlobArrayBuffer } from "obsidian"; + +const PluginHost = 'https://obplugin.sunboshi.tech'; + +// 获取token +export async function wxGetToken(authkey:string, appid:string, secret:string) { + const url = PluginHost + '/v1/wx/token'; + const body = { + authkey, + appid, + secret + } + const res = await requestUrl({ + url, + method: 'POST', + throw: false, + contentType: 'application/json', + body: JSON.stringify(body) + }); + return res; +} + +export async function wxEncrypt(authkey:string, wechat:any[]) { + const url = PluginHost + '/v1/wx/encrypt'; + const body = JSON.stringify({ + authkey, + wechat + }); + const res = await requestUrl({ + url: url, + method: 'POST', + throw: false, + contentType: 'application/json', + body: body + }); + return res +} + +export async function wxKeyInfo(authkey:string) { + const url = PluginHost + '/v1/wx/info/' + authkey; + const res = await requestUrl({ + url: url, + method: 'GET', + throw: false, + contentType: 'application/json', + }); + return res +} + +export async function wxWidget(authkey: string, params: string) { + const host = 'https://obplugin.sunboshi.tech'; + const path = '/math/widget'; + const url = `${host}${path}`; + try { + const res = await requestUrl({ + url, + throw: false, + method: 'POST', + contentType: 'application/json', + headers: { + authkey + }, + body: params + }) + if (res.status === 200) { + return res.json.content; + } + return res.json.msg; + } catch (error) { + console.log(error); + return error.message; + } +} + +// 上传图片 +export async function wxUploadImage(data: Blob, filename: string, token: string, type?: string) { + let url = ''; + if (type == null || type === '') { + url = 'https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=' + token; + } else { + url = `https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=${token}&type=${type}` + } + + const N = 16 // The length of our random boundry string + const randomBoundryString = "djmangoBoundry" + Array(N+1).join((Math.random().toString(36)+'00000000000000000').slice(2, 18)).slice(0, N) + + // Construct the form data payload as a string + const pre_string = `------${randomBoundryString}\r\nContent-Disposition: form-data; name="media"; filename="${filename}"\r\nContent-Type: "application/octet-stream"\r\n\r\n`; + const post_string = `\r\n------${randomBoundryString}--` + + // Convert the form data payload to a blob by concatenating the pre_string, the file data, and the post_string, and then return the blob as an array buffer + const pre_string_encoded = new TextEncoder().encode(pre_string); + // const data = file; + const post_string_encoded = new TextEncoder().encode(post_string); + const concatenated = await new Blob([pre_string_encoded, await getBlobArrayBuffer(data), post_string_encoded]).arrayBuffer() + + // Now that we have the form data payload as an array buffer, we can pass it to requestURL + // We also need to set the content type to multipart/form-data and pass in the boundry string + const options: RequestUrlParam = { + method: 'POST', + url: url, + contentType: `multipart/form-data; boundary=----${randomBoundryString}`, + body: concatenated + }; + + const res = await requestUrl(options); + const resData = await res.json; + return { + url: resData.url || '', + media_id: resData.media_id || '', + errcode: resData.errcode || 0, + errmsg: resData.errmsg || '', + } +} + +// 新建草稿 +export interface DraftArticle { + title: string; + author?: string; + digest?: string; + cover?: string; + content: string; + content_source_url?: string; + thumb_media_id: string; + need_open_comment?: number; + only_fans_can_comment?: number; + pic_crop_235_1?: string; + pic_crop_1_1?: string; + appid?: string; + theme?: string; + highlight?: string; +} + +export async function wxAddDraft(token: string, data: DraftArticle) { + const url = 'https://api.weixin.qq.com/cgi-bin/draft/add?access_token=' + token; + const body = {articles:[{ + title: data.title, + content: data.content, + digest: data.digest, + thumb_media_id: data.thumb_media_id, + ... data.pic_crop_235_1 && {pic_crop_235_1: data.pic_crop_235_1}, + ... data.pic_crop_1_1 && {pic_crop_1_1: data.pic_crop_1_1}, + ... data.content_source_url && {content_source_url: data.content_source_url}, + ... data.need_open_comment !== undefined && {need_open_comment: data.need_open_comment}, + ... data.only_fans_can_comment !== undefined && {only_fans_can_comment: data.only_fans_can_comment}, + ... data.author && {author: data.author}, + }]}; + + const res = await requestUrl({ + method: 'POST', + url: url, + throw: false, + body: JSON.stringify(body) + }); + + return res; +} + +export interface DraftImageMediaId { + image_media_id: string; +} + +export interface DraftImageInfo { + image_list: DraftImageMediaId[]; +} + +export interface DraftImages { + article_type: string; + title: string; + content: string; + need_open_commnet: number; + only_fans_can_comment: number; + image_info: DraftImageInfo; +} + +export async function wxAddDraftImages(token: string, data: DraftImages) { + const url = 'https://api.weixin.qq.com/cgi-bin/draft/add?access_token=' + token; + const body = {articles:[data]}; + + const res = await requestUrl({ + method: 'POST', + url: url, + throw: false, + body: JSON.stringify(body) + }); + + return res; +} + +export async function wxBatchGetMaterial(token: string, type: string, offset: number = 0, count: number = 10) { + const url = 'https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=' + token; + const body = { + type, + offset, + count + }; + + const res = await requestUrl({ + method: 'POST', + url: url, + throw: false, + body: JSON.stringify(body) + }); + + return await res.json; +} \ No newline at end of file diff --git a/src/widgets-modal.ts b/src/widgets-modal.ts new file mode 100644 index 0000000..f94b09a --- /dev/null +++ b/src/widgets-modal.ts @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import { App, Modal, MarkdownView } from "obsidian"; +import { uevent } from "./utils"; + +export class WidgetsModal extends Modal { + listener: any = null; + url: string = 'https://widgets.sunboshi.tech'; + constructor(app: App) { + super(app); + } + + insertMarkdown(markdown: string) { + const editor = this.app.workspace.getActiveViewOfType(MarkdownView)?.editor; + if (!editor) return; + editor.replaceSelection(markdown); + editor.exec("goRight"); + uevent('insert-widgets'); + } + + onOpen() { + let { contentEl, modalEl } = this; + modalEl.style.width = '640px'; + modalEl.style.height = '500px'; + const iframe = contentEl.createEl('iframe', { + attr: { + src: this.url, + width: '100%', + height: '100%', + allow: 'clipboard-read; clipboard-write', + }, + }); + + iframe.style.border = 'none'; + + this.listener = this.handleMessage.bind(this); + window.addEventListener('message', this.listener); + uevent('open-widgets'); + } + + handleMessage(event: MessageEvent) { + if (event.origin === this.url) { + const { type, data } = event.data; + if (type === 'cmd') { + this.insertMarkdown(data); + } + } + } + + onClose() { + if (this.listener) { + window.removeEventListener('message', this.listener); + } + let { contentEl } = this; + contentEl.empty(); + } +} \ No newline at end of file diff --git a/styles.css b/styles.css new file mode 100644 index 0000000..a68f221 --- /dev/null +++ b/styles.css @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +/* =========================================================== */ +/* UI 样式 */ +/* =========================================================== */ +.note-preview { + min-height: 100%; + width: 100%; + height: 100%; + background-color: #fff; + display: flex; + flex-direction: column; +} + +.render-div { + flex: 1; + overflow-y: auto; + padding: 10px; +} + +.preview-toolbar { + position: relative; + min-height: 100px; + border-bottom: #e4e4e4 1px solid; + background-color: var(--background-primary); +} + +.toolbar-line { + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; + margin: 10px 10px; +} + +.copy-button { + margin-right: 10px; +} + +.refresh-button { + margin-right: 10px; +} + +.upload-input { + margin-left: 10px; + visibility: hidden; + width: 0px; +} + +.style-label { + margin-right: 10px; +} + +.style-select { + margin-right: 10px; + width: 120px; +} + +.msg-view { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: var(--background-primary); + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + font-size: 18px; + z-index: 9999; + display: none; +} + +.msg-title { + margin-bottom: 20px; + max-width: 90%; +} + +.note-mpcard-wrapper { + margin: 20px 20px; + background-color: rgb(250, 250, 250); + padding: 10px 20px; + border-radius: 10px; +} +.note-mpcard-content { + display: flex; +} +.note-mpcard-headimg { + border: none !important; + border-radius: 27px !important; + box-shadow: none !important; + width: 54px !important; + height: 54px !important; + margin: 0 !important; +} +.note-mpcard-info { + margin-left: 10px; +} +.note-mpcard-nickname { + font-size: 17px; + font-weight: 500; + color: rgba(0, 0, 0, 0.9); +} + +.note-mpcard-signature { + font-size: 14px; + color: rgba(0, 0, 0, 0.55); +} +.note-mpcard-foot { + margin-top: 20px; + padding-top: 10px; + border-top: 1px solid #ececec; + font-size: 14px; + color: rgba(0, 0, 0, 0.3); +} + +.loading-wrapper { + display: flex; + width: 100%; + height: 100%; + align-items: center; + justify-content: center; +} + +.loading-spinner { + width: 50px; /* 可调整大小 */ + height: 50px; + border: 4px solid #fcd6ff; /* 底色,浅灰 */ + border-top: 4px solid #bb0cdf; /* 主色,蓝色顶部产生旋转感 */ + border-radius: 50%; /* 圆形 */ + animation: spin 1s linear infinite; /* 旋转动画 */ +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} \ No newline at end of file diff --git a/tools/download.mjs b/tools/download.mjs new file mode 100644 index 0000000..bd5e57f --- /dev/null +++ b/tools/download.mjs @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2024-2025 Sun Booshi + * + * 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. + */ + +import https from 'node:https'; +import { exec } from 'node:child_process'; + +// 仓库信息 +const owner = 'sunbooshi'; +const repo = 'mweb-themes'; +const assetName = 'assets.zip'; // 要下载的文件名 + +// GitHub API 获取最新 Release 信息 +const apiUrl = `https://api.github.com/repos/${owner}/${repo}/releases/latest`; + +https.get(apiUrl, { headers: { 'User-Agent': 'Node.js' } }, (apiRes) => { + let data = ''; + + // 接收 API 响应数据 + apiRes.on('data', (chunk) => { + data += chunk; + }); + + apiRes.on('end', () => { + try { + const releaseInfo = JSON.parse(data); + + // 查找 assets.zip 文件 + const asset = releaseInfo.assets.find((a) => a.name === assetName); + + if (!asset) { + console.error(`未找到 ${assetName} 文件`); + return; + } + + const downloadUrl = asset.browser_download_url; + console.log(`找到 ${assetName},下载链接: ${downloadUrl}`); + + // 使用系统 wget 命令下载 + exec(`wget "${downloadUrl}" -O "${assetName}"`, (error, stdout, stderr) => { + if (error) { + console.error(`下载失败: ${error}`); + return; + } + console.log(`${assetName} 下载完成!`); + }); + } catch (err) { + console.error('解析 API 响应失败:', err); + } + }); +}).on('error', (err) => { + console.error('请求 GitHub API 失败:', err); +}); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..bbad05a --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "inlineSourceMap": true, + "inlineSources": true, + "module": "ESNext", + "target": "ES2018", + "allowJs": true, + "noImplicitAny": true, + "moduleResolution": "node", + "importHelpers": true, + "isolatedModules": true, + "strictNullChecks": true, + "lib": [ + "DOM", + "DOM.Iterable", + "ES5", + "ES6", + "ES7" + ] + }, + "include": [ + "**/*.ts" + ] +} diff --git a/version-bump.mjs b/version-bump.mjs new file mode 100644 index 0000000..d409fa0 --- /dev/null +++ b/version-bump.mjs @@ -0,0 +1,14 @@ +import { readFileSync, writeFileSync } from "fs"; + +const targetVersion = process.env.npm_package_version; + +// read minAppVersion from manifest.json and bump version to target version +let manifest = JSON.parse(readFileSync("manifest.json", "utf8")); +const { minAppVersion } = manifest; +manifest.version = targetVersion; +writeFileSync("manifest.json", JSON.stringify(manifest, null, "\t")); + +// update versions.json with target version and minAppVersion from manifest.json +let versions = JSON.parse(readFileSync("versions.json", "utf8")); +versions[targetVersion] = minAppVersion; +writeFileSync("versions.json", JSON.stringify(versions, null, "\t")); diff --git a/versions.json b/versions.json new file mode 100644 index 0000000..24211c8 --- /dev/null +++ b/versions.json @@ -0,0 +1,3 @@ +{ + "1.3.0": "1.4.5" +}

    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%0Dia8v+Ntz{qQw;iO) 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 literal 0 HcmV?d00001 diff --git a/images/20240728183041.png b/images/20240728183041.png new file mode 100644 index 0000000000000000000000000000000000000000..913acc448a62e25e7253501c97a208fe011083b8 GIT binary patch literal 140545 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½mk%t?QJBAK$C**CY$O))CuGI* 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 DJnObp literal 0 HcmV?d00001 diff --git a/images/screenshot.png b/images/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..62d35820840567f5ff212e923df69f6e659c5922 GIT binary patch literal 228815 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