import { createRequire } from "node:module"; import { tab } from "@mdit/plugin-tab"; import { addViteOptimizeDepsInclude, encodeData, ensureEndingSlash, isArray, isLinkAbsolute, isLinkExternal, isLinkHttp, isPlainObject } from "@vuepress/helper"; import { Buffer } from "node:buffer"; import http from "node:https"; import { URL, URLSearchParams } from "node:url"; import { camelCase, isBoolean, isEmptyObject, isNull, isNumber, isPlainObject as isPlainObject$1, isString, isUndefined, kebabCase, notNullish, omit, toArray, uniqueBy, withTimeout } from "@pengzhanbo/utils"; import imageSize from "image-size"; import { colors, fs, getDirname, logger, ora, path } from "vuepress/utils"; import path$1 from "node:path"; import { globSync } from "tinyglobby"; import { isLinkHttp as isLinkHttp$1, isLinkWithProtocol, removeEndingSlash, removeLeadingSlash } from "vuepress/shared"; import fs$1, { promises } from "node:fs"; import process from "node:process"; import container from "markdown-it-container"; import { isPackageExists, resolveModule } from "local-pkg"; import { LRUCache } from "lru-cache"; import { watch } from "chokidar"; import { customAlphabet } from "nanoid"; import { removeLeadingSlash as removeLeadingSlash$1 } from "@vuepress/shared"; import { path as path$2 } from "@vuepress/utils"; import { attrs } from "@mdit/plugin-attrs"; import { footnote } from "@mdit/plugin-footnote"; import { mark } from "@mdit/plugin-mark"; import { sub } from "@mdit/plugin-sub"; import { sup } from "@mdit/plugin-sup"; import { tasklist } from "@mdit/plugin-tasklist"; //#region src/node/fileIcons/definitions.ts const defaultFolder = "vscode-icons:default-folder"; const defaultFile = "vscode-icons:default-file"; const definitions = { named: { "pnpm": "vscode-icons:file-type-light-pnpm", "PNPM": "vscode-icons:file-type-light-pnpm", "npm": "logos:npm-icon", "NPM": "logos:npm-icon", "yarn": "vscode-icons:file-type-yarn", "Yarn": "vscode-icons:file-type-yarn", "bun": "vscode-icons:file-type-bun", "Bun": "vscode-icons:file-type-bun", "deno": "vscode-icons:file-type-light-deno", "Deno": "vscode-icons:file-type-light-deno", "rollup": "vscode-icons:file-type-rollup", "Rollup": "vscode-icons:file-type-rollup", "webpack": "vscode-icons:file-type-webpack", "Webpack": "vscode-icons:file-type-webpack", "vite": "vscode-icons:file-type-vite", "Vite": "vscode-icons:file-type-vite", "esbuild": "vscode-icons:file-type-esbuild", "Esbuild": "vscode-icons:file-type-esbuild", "vue": "vscode-icons:file-type-vue", "Vue": "vscode-icons:file-type-vue", "svelte": "vscode-icons:file-type-svelte", "Svelte": "vscode-icons:file-type-svelte", "sveltekit": "vscode-icons:file-type-svelte", "SvelteKit": "vscode-icons:file-type-svelte", "angular": "vscode-icons:file-type-angular", "Angular": "vscode-icons:file-type-angular", "react": "vscode-icons:file-type-reactjs", "React": "vscode-icons:file-type-reactjs", "next": "vscode-icons:file-type-light-next", "Next": "vscode-icons:file-type-light-next", "Nextjs": "vscode-icons:file-type-light-next", "NextJS": "vscode-icons:file-type-light-next", "nuxt": "vscode-icons:file-type-nuxt", "Nuxt": "vscode-icons:file-type-nuxt", "Nuxtjs": "vscode-icons:file-type-nuxt", "NuxtJS": "vscode-icons:file-type-nuxt", "solid": "logos:solidjs-icon", "Solid": "logos:solidjs-icon", "solidjs": "logos:solidjs-icon", "astro": "vscode-icons:file-type-light-astro", "Astro": "vscode-icons:file-type-light-astro", "vitest": "vscode-icons:file-type-vitest", "Vitest": "vscode-icons:file-type-vitest", "playwright": "vscode-icons:file-type-playwright", "Playwright": "vscode-icons:file-type-playwright", "jest": "vscode-icons:file-type-jest", "Jest": "vscode-icons:file-type-jest", "cypress": "vscode-icons:file-type-cypress", "Cypress": "vscode-icons:file-type-cypress", "docker": "vscode-icons:file-type-docker", "Docker": "vscode-icons:file-type-docker", "html": "vscode-icons:file-type-html", "Html": "vscode-icons:file-type-html", "HTML": "vscode-icons:file-type-html", "javascript": "vscode-icons:file-type-js-official", "Javascript": "vscode-icons:file-type-js-official", "JavaScript": "vscode-icons:file-type-js-official", "js": "vscode-icons:file-type-js-official", "JS": "vscode-icons:file-type-js-official", "typescript": "vscode-icons:file-type-typescript-official", "Typescript": "vscode-icons:file-type-typescript-official", "TypeScript": "vscode-icons:file-type-typescript-official", "ts": "vscode-icons:file-type-typescript-official", "TS": "vscode-icons:file-type-typescript-official", "css": "vscode-icons:file-type-css", "CSS": "vscode-icons:file-type-css", "less": "vscode-icons:file-type-less", "Less": "vscode-icons:file-type-less", "LESS": "vscode-icons:file-type-less", "scss": "vscode-icons:file-type-scss", "Scss": "vscode-icons:file-type-scss", "SCSS": "vscode-icons:file-type-scss", "sass": "vscode-icons:file-type-sass", "Sass": "vscode-icons:file-type-sass", "SASS": "vscode-icons:file-type-sass", "stylus": "vscode-icons:file-type-light-stylus", "Stylus": "vscode-icons:file-type-light-stylus", "postcss": "vscode-icons:file-type-postcss", "Postcss": "vscode-icons:file-type-postcss", "PostCSS": "vscode-icons:file-type-postcss", "sh": "vscode-icons:file-type-shell", "shell": "vscode-icons:file-type-shell", "Shell": "vscode-icons:file-type-shell", "bash": "vscode-icons:file-type-shell", "Bash": "vscode-icons:file-type-shell", "java": "vscode-icons:file-type-java", "Java": "vscode-icons:file-type-java", "JAVA": "vscode-icons:file-type-java", "php": "vscode-icons:file-type-php3", "PHP": "vscode-icons:file-type-php3", "c": "vscode-icons:file-type-c", "C": "vscode-icons:file-type-c", "python": "vscode-icons:file-type-python", "Python": "vscode-icons:file-type-python", "kotlin": "vscode-icons:file-type-kotlin", "Kotlin": "vscode-icons:file-type-kotlin", "go": "vscode-icons:file-type-go-gopher", "golang": "vscode-icons:file-type-go-gopher", "Go": "vscode-icons:file-type-go-gopher", "GoLang": "vscode-icons:file-type-go-gopher", "rust": "vscode-icons:file-type-rust", "Rust": "vscode-icons:file-type-rust", "zig": "vscode-icons:file-type-zig", "Zig": "vscode-icons:file-type-zig", "swift": "vscode-icons:file-type-swift", "Swift": "vscode-icons:file-type-swift", "c#": "vscode-icons:file-type-csharp", "CSharp": "vscode-icons:file-type-csharp", "c++": "vscode-icons:file-type-cpp", "C++": "vscode-icons:file-type-cpp", "ruby": "vscode-icons:file-type-ruby", "Ruby": "vscode-icons:file-type-ruby", "makefile": "vscode-icons:file-type-makefile", "Makefile": "vscode-icons:file-type-makefile", "Object-C": "vscode-icons:file-type-objectivec", "object-c": "vscode-icons:file-type-objectivec", "SQL": "vscode-icons:file-type-sql", "sql": "vscode-icons:file-type-sql", "mysql": "vscode-icons:file-type-mysql", "MySQL": "vscode-icons:file-type-mysql", "MySql": "vscode-icons:file-type-mysql", "pgsql": "vscode-icons:file-type-pgsql", "PostgreSQL": "vscode-icons:file-type-pgsql", "PGSQL": "vscode-icons:file-type-pgsql", "xml": "vscode-icons:file-type-xml", "XML": "vscode-icons:file-type-xml", "wasm": "vscode-icons:file-type-wasm", "webassembly": "vscode-icons:file-type-wasm", "WebAssembly": "vscode-icons:file-type-wasm", "WASM": "vscode-icons:file-type-wasm", "toml": "vscode-icons:file-type-light-toml", "Toml": "vscode-icons:file-type-light-toml", "TOML": "vscode-icons:file-type-light-toml", "yaml": "vscode-icons:file-type-light-yaml", "Yaml": "vscode-icons:file-type-light-yaml", "YAML": "vscode-icons:file-type-light-yaml" }, folders: { "default": "vscode-icons:default-folder", "src": "vscode-icons:folder-type-src", "srcs": "vscode-icons:folder-type-src", "source": "vscode-icons:folder-type-src", "sources": "vscode-icons:folder-type-src", "code": "vscode-icons:folder-type-src", "tauri-src": "vscode-icons:folder-type-tauri", "dist": "vscode-icons:folder-type-dist", "out": "vscode-icons:folder-type-dist", "output": "vscode-icons:folder-type-dist", "release": "vscode-icons:folder-type-dist", "bin": "vscode-icons:folder-type-dist", "distribution": "vscode-icons:folder-type-dist", "docs": "vscode-icons:folder-type-docs", "doc": "vscode-icons:folder-type-docs", "document": "vscode-icons:folder-type-docs", "documents": "vscode-icons:folder-type-docs", "documentation": "vscode-icons:folder-type-docs", "post": "vscode-icons:folder-type-docs", "posts": "vscode-icons:folder-type-docs", "article": "vscode-icons:folder-type-docs", "articles": "vscode-icons:folder-type-docs", "scripts": "vscode-icons:folder-type-script", "script": "vscode-icons:folder-type-script", "node_modules": "vscode-icons:folder-type-light-node", "cli": "vscode-icons:folder-type-cli", "template": "vscode-icons:folder-type-template", "templates": "vscode-icons:folder-type-template", "theme": "vscode-icons:folder-type-theme", "themes": "vscode-icons:folder-type-theme", "color": "vscode-icons:folder-type-theme", "colors": "vscode-icons:folder-type-theme", "design": "vscode-icons:folder-type-theme", "designs": "vscode-icons:folder-type-theme", "packages": "vscode-icons:folder-type-package", "package": "vscode-icons:folder-type-package", "pkg": "vscode-icons:folder-type-package", "pkgs": "vscode-icons:folder-type-package", "shared": "vscode-icons:folder-type-shared", "utils": "vscode-icons:folder-type-tools", "util": "vscode-icons:folder-type-tools", "utility": "vscode-icons:folder-type-tools", "utilities": "vscode-icons:folder-type-tools", "helper": "vscode-icons:folder-type-helper", "helpers": "vscode-icons:folder-type-helper", "tools": "vscode-icons:folder-type-tools", "toolkit": "vscode-icons:folder-type-tools", "toolkits": "vscode-icons:folder-type-tools", "tooling": "vscode-icons:folder-type-tools", "devtools": "vscode-icons:folder-type-tools", "component": "vscode-icons:folder-type-component", "components": "vscode-icons:folder-type-component", "Component": "vscode-icons:folder-type-component", "Components": "vscode-icons:folder-type-component", "widget": "vscode-icons:folder-type-component", "widgets": "vscode-icons:folder-type-component", "fragments": "vscode-icons:folder-type-component", "hooks": "vscode-icons:folder-type-hook", "composables": "vscode-icons:folder-type-hook", "public": "vscode-icons:folder-type-public", "www": "vscode-icons:folder-type-public", "web": "vscode-icons:folder-type-public", "wwwroot": "vscode-icons:folder-type-public", "website": "vscode-icons:folder-type-public", "site": "vscode-icons:folder-type-public", "browser": "vscode-icons:folder-type-public", "browsers": "vscode-icons:folder-type-public", "fonts": "vscode-icons:folder-type-fonts", "font": "vscode-icons:folder-type-fonts", "images": "vscode-icons:folder-type-images", "image": "vscode-icons:folder-type-images", "imgs": "vscode-icons:folder-type-images", "img": "vscode-icons:folder-type-images", "icon": "vscode-icons:folder-type-images", "icons": "vscode-icons:folder-type-images", "ico": "vscode-icons:folder-type-images", "icos": "vscode-icons:folder-type-images", "figure": "vscode-icons:folder-type-images", "figures": "vscode-icons:folder-type-images", "fig": "vscode-icons:folder-type-images", "figs": "vscode-icons:folder-type-images", "screenshot": "vscode-icons:folder-type-images", "screenshots": "vscode-icons:folder-type-images", "screengrab": "vscode-icons:folder-type-images", "screengrabs": "vscode-icons:folder-type-images", "pic": "vscode-icons:folder-type-images", "pics": "vscode-icons:folder-type-images", "picture": "vscode-icons:folder-type-images", "pictures": "vscode-icons:folder-type-images", "photo": "vscode-icons:folder-type-images", "photos": "vscode-icons:folder-type-images", "photograph": "vscode-icons:folder-type-images", "photographs": "vscode-icons:folder-type-images", "asset": "vscode-icons:folder-type-asset", "assets": "vscode-icons:folder-type-asset", "resource": "vscode-icons:folder-type-asset", "resources": "vscode-icons:folder-type-asset", "res": "vscode-icons:folder-type-asset", "static": "vscode-icons:folder-type-asset", "report": "vscode-icons:folder-type-asset", "reports": "vscode-icons:folder-type-asset", "apis": "vscode-icons:folder-type-api", "api": "vscode-icons:folder-type-api", "restapi": "vscode-icons:folder-type-api", "style": "vscode-icons:folder-type-style", "styles": "vscode-icons:folder-type-style", "stylesheet": "vscode-icons:folder-type-style", "stylesheets": "vscode-icons:folder-type-style", "css": "vscode-icons:folder-type-css", "scss": "vscode-icons:folder-type-light-sass", "sass": "vscode-icons:folder-type-light-sass", "less": "vscode-icons:folder-type-less", "plugin": "vscode-icons:folder-type-plugin", "plugins": "vscode-icons:folder-type-plugin", "typings": "vscode-icons:folder-type-typings", "types": "vscode-icons:folder-type-typings", "mock": "vscode-icons:folder-type-mock", "i18n": "vscode-icons:folder-type-locale", "locales": "vscode-icons:folder-type-locale", "locale": "vscode-icons:folder-type-locale", "lang": "vscode-icons:folder-type-locale", "langs": "vscode-icons:folder-type-locale", "language": "vscode-icons:folder-type-locale", "languages": "vscode-icons:folder-type-locale", "l10n": "vscode-icons:folder-type-locale", "localization": "vscode-icons:folder-type-locale", "translation": "vscode-icons:folder-type-locale", "translate": "vscode-icons:folder-type-locale", "translations": "vscode-icons:folder-type-locale", "tx": "vscode-icons:folder-type-locale", "config": "vscode-icons:folder-type-config", "configs": "vscode-icons:folder-type-config", ".config": "vscode-icons:folder-type-config", ".configs": "vscode-icons:folder-type-config", "cfg": "vscode-icons:folder-type-config", "cfgs": "vscode-icons:folder-type-config", "conf": "vscode-icons:folder-type-config", "confs": "vscode-icons:folder-type-config", "configuration": "vscode-icons:folder-type-config", "configurations": "vscode-icons:folder-type-config", "setting": "vscode-icons:folder-type-config", "settings": "vscode-icons:folder-type-config", "option": "vscode-icons:folder-type-config", "options": "vscode-icons:folder-type-config", "controller": "vscode-icons:folder-type-controller", "controllers": "vscode-icons:folder-type-controller", "Controller": "vscode-icons:folder-type-controller", "Controllers": "vscode-icons:folder-type-controller", "model": "vscode-icons:folder-type-model", "models": "vscode-icons:folder-type-model", "Model": "vscode-icons:folder-type-model", "Models": "vscode-icons:folder-type-model", "service": "vscode-icons:folder-type-services", "services": "vscode-icons:folder-type-services", "Service": "vscode-icons:folder-type-services", "Services": "vscode-icons:folder-type-services", "view": "vscode-icons:folder-type-view", "views": "vscode-icons:folder-type-view", "View": "vscode-icons:folder-type-view", "Views": "vscode-icons:folder-type-view", "page": "vscode-icons:folder-type-view", "pages": "vscode-icons:folder-type-view", "html": "vscode-icons:folder-type-view", "app": "vscode-icons:folder-type-app", "apps": "vscode-icons:folder-type-app", "client": "vscode-icons:folder-type-client", "clients": "vscode-icons:folder-type-client", "frontend": "vscode-icons:folder-type-client", "frontends": "vscode-icons:folder-type-client", "server": "vscode-icons:folder-type-server", "servers": "vscode-icons:folder-type-server", "backend": "vscode-icons:folder-type-server", "backends": "vscode-icons:folder-type-server", "db": "vscode-icons:folder-type-db", "database": "vscode-icons:folder-type-db", "databases": "vscode-icons:folder-type-db", "data": "vscode-icons:folder-type-db", "sql": "vscode-icons:folder-type-db", "e2e": "vscode-icons:folder-type-e2e", "cypress": "vscode-icons:folder-type-light-cypress", "test": "vscode-icons:folder-type-test", "tests": "vscode-icons:folder-type-test", "testing": "vscode-icons:folder-type-test", "snapshots": "vscode-icons:folder-type-test", "spec": "vscode-icons:folder-type-test", "specs": "vscode-icons:folder-type-test", "lib": "vscode-icons:folder-type-library", "libs": "vscode-icons:folder-type-library", "library": "vscode-icons:folder-type-library", "libraries": "vscode-icons:folder-type-library", "vendor": "vscode-icons:folder-type-library", "vendors": "vscode-icons:folder-type-library", "third-party": "vscode-icons:folder-type-library", "lib64": "vscode-icons:folder-type-library", "include": "vscode-icons:folder-type-include", "inc": "vscode-icons:folder-type-include", "includes": "vscode-icons:folder-type-include", "partial": "vscode-icons:folder-type-include", "partials": "vscode-icons:folder-type-include", "inc64": "vscode-icons:folder-type-include", "temp": "vscode-icons:folder-type-temp", "tmp": "vscode-icons:folder-type-temp", "cache": "vscode-icons:folder-type-temp", "cached": "vscode-icons:folder-type-temp", ".temp": "vscode-icons:folder-type-temp", ".cache": "vscode-icons:folder-type-temp", "log": "vscode-icons:folder-type-log", "logs": "vscode-icons:folder-type-log", "logging": "vscode-icons:folder-type-log", ".git": "vscode-icons:folder-type-git", ".github": "vscode-icons:folder-type-github", ".gitlab": "vscode-icons:folder-type-gitlab", ".vscode": "vscode-icons:folder-type-vscode", ".husky": "vscode-icons:folder-type-husky", ".idea": "vscode-icons:folder-type-idea" }, files: { "package.json": "vscode-icons:file-type-node", "pnpm-debug.log": "vscode-icons:file-type-light-pnpm", "pnpm-lock.yaml": "vscode-icons:file-type-light-pnpm", "pnpm-workspace.yaml": "vscode-icons:file-type-light-pnpm", "biome.json": "vscode-icons:file-type-biome", "bun.lockb": "vscode-icons:file-type-bun", "COMMIT_EDITMSG": "vscode-icons:file-type-git", "MERGE_MSG": "vscode-icons:file-type-git", "karma.conf.js": "vscode-icons:file-type-karma", "karma.conf.cjs": "vscode-icons:file-type-karma", "karma.conf.mjs": "vscode-icons:file-type-karma", "karma.conf.coffee": "vscode-icons:file-type-karma", "README.md": "flat-color-icons:info", "README.txt": "flat-color-icons:info", "README": "flat-color-icons:info", "CHANGELOG.md": "catppuccin:changelog", "CHANGELOG.txt": "catppuccin:changelog", "CHANGELOG": "catppuccin:changelog", "CHANGES.md": "catppuccin:changelog", "CHANGES.txt": "catppuccin:changelog", "CHANGES": "catppuccin:changelog", "VERSION.md": "catppuccin:changelog", "VERSION.txt": "catppuccin:changelog", "VERSION": "catppuccin:changelog", "mvnw": "vscode-icons:file-type-maven", "pom.xml": "vscode-icons:file-type-maven", "tsconfig.json": "vscode-icons:file-type-tsconfig", "swagger.json": "vscode-icons:file-type-swagger", "swagger.yml": "vscode-icons:file-type-swagger", "swagger.yaml": "vscode-icons:file-type-swagger", "mime.types": "vscode-icons:file-type-light-config", "Jenkinsfile": "vscode-icons:file-type-jenkins", "babel.config.js": "vscode-icons:file-type-babel2", "babel.config.json": "vscode-icons:file-type-babel2", "babel.config.cjs": "vscode-icons:file-type-babel2", "BUILD": "vscode-icons:file-type-bazel", "BUILD.bazel": "vscode-icons:file-type-bazel", "WORKSPACE": "vscode-icons:file-type-bazel", "WORKSPACE.bazel": "vscode-icons:file-type-bazel", "bower.json": "vscode-icons:file-type-bower2", "Bower.json": "vscode-icons:file-type-bower2", "eslint.config.js": "vscode-icons:file-type-eslint", "eslint.config.ts": "vscode-icons:file-type-eslint", "firebase.json": "vscode-icons:file-type-firebase", "geckodriver": "openmoji:firefox", "Gruntfile.js": "vscode-icons:file-type-grunt", "gruntfile.babel.js": "vscode-icons:file-type-grunt", "Gruntfile.babel.js": "vscode-icons:file-type-grunt", "gruntfile.js": "vscode-icons:file-type-grunt", "Gruntfile.coffee": "vscode-icons:file-type-grunt", "gruntfile.coffee": "vscode-icons:file-type-grunt", "ionic.config.json": "vscode-icons:file-type-ionic", "Ionic.config.json": "vscode-icons:file-type-ionic", "ionic.project": "vscode-icons:file-type-ionic", "Ionic.project": "vscode-icons:file-type-ionic", "platformio.ini": "vscode-icons:file-type-platformio", "rollup.config.js": "vscode-icons:file-type-rollup", "sass-lint.yml": "vscode-icons:file-type-sass", "stylelint.config.js": "vscode-icons:file-type-light-stylelint", "stylelint.config.cjs": "vscode-icons:file-type-light-stylelint", "stylelint.config.mjs": "vscode-icons:file-type-light-stylelint", "yarn.clean": "vscode-icons:file-type-yarn", "yarn.lock": "vscode-icons:file-type-yarn", "webpack.config.js": "vscode-icons:file-type-webpack", "webpack.config.cjs": "vscode-icons:file-type-webpack", "webpack.config.mjs": "vscode-icons:file-type-webpack", "webpack.config.ts": "vscode-icons:file-type-webpack", "webpack.config.build.js": "vscode-icons:file-type-webpack", "webpack.config.build.cjs": "vscode-icons:file-type-webpack", "webpack.config.build.mjs": "vscode-icons:file-type-webpack", "webpack.config.build.ts": "vscode-icons:file-type-webpack", "webpack.common.js": "vscode-icons:file-type-webpack", "webpack.common.cjs": "vscode-icons:file-type-webpack", "webpack.common.mjs": "vscode-icons:file-type-webpack", "webpack.common.ts": "vscode-icons:file-type-webpack", "webpack.dev.js": "vscode-icons:file-type-webpack", "webpack.dev.cjs": "vscode-icons:file-type-webpack", "webpack.dev.mjs": "vscode-icons:file-type-webpack", "webpack.dev.ts": "vscode-icons:file-type-webpack", "webpack.prod.js": "vscode-icons:file-type-webpack", "webpack.prod.cjs": "vscode-icons:file-type-webpack", "webpack.prod.mjs": "vscode-icons:file-type-webpack", "webpack.prod.ts": "vscode-icons:file-type-webpack", "vite.config.js": "vscode-icons:file-type-vite", "vite.config.ts": "vscode-icons:file-type-vite", "vite.config.mjs": "vscode-icons:file-type-vite", "vite.config.cjs": "vscode-icons:file-type-vite", "vitest.config.ts": "vscode-icons:file-type-vitest", "vitest.config.js": "vscode-icons:file-type-vitest", "vitest.config.mjs": "vscode-icons:file-type-vitest", "vitest.config.cjs": "vscode-icons:file-type-vitest", "turbo.json": "vscode-icons:file-type-light-turbo", "vercel.json": "vscode-icons:file-type-light-vercel", "netlify.toml": "vscode-icons:file-type-light-netlify", "Cargo.toml": "vscode-icons:file-type-cargo", "Cargo.lock": "vscode-icons:file-type-cargo", "npm-debug.log": "vscode-icons:file-type-npm" }, extensions: { ".astro": "vscode-icons:file-type-light-astro", ".mdx": "vscode-icons:file-type-light-mdx", ".cls": "vscode-icons:file-type-apex", ".apex": "vscode-icons:file-type-apex", ".asm": "vscode-icons:file-type-assembly", ".s": "vscode-icons:file-type-assembly", ".bicep": "vscode-icons:file-type-bicep", ".bzl": "vscode-icons:file-type-bazel", ".bazel": "vscode-icons:file-type-bazel", ".BUILD": "vscode-icons:file-type-bazel", ".WORKSPACE": "vscode-icons:file-type-bazel", ".bazelignore": "vscode-icons:file-type-bazel", ".bazelversion": "vscode-icons:file-type-bazel", ".c": "vscode-icons:file-type-c", ".h": "vscode-icons:file-type-c", ".m": "vscode-icons:file-type-c", ".cs": "vscode-icons:file-type-csharp", ".cshtml": "vscode-icons:file-type-html", ".aspx": "vscode-icons:file-type-aspx", ".ascx": "vscode-icons:file-type-aspx", ".asax": "vvscode-icons:file-type-aspx", ".master": "vscode-icons:file-type-html", ".cc": "vscode-icons:file-type-cpp", ".cpp": "vscode-icons:file-type-cpp", ".cxx": "vscode-icons:file-type-cpp", ".c++": "vscode-icons:file-type-cpp", ".hh": "vscode-icons:file-type-cppheader", ".hpp": "vscode-icons:file-type-cppheader", ".hxx": "vscode-icons:file-type-cppheader", ".h++": "vscode-icons:file-type-cppheader", ".mm": "vscode-icons:file-type-cpp", ".clj": "vscode-icons:file-type-clojure", ".cljs": "vscode-icons:file-type-clojure", ".cljc": "vscode-icons:file-type-clojure", ".edn": "vscode-icons:file-type-clojure", ".cfc": "vscode-icons:file-type-cfc", ".cfm": "vscode-icons:file-type-cfm", ".coffee": "vscode-icons:file-type-coffeescript", ".litcoffee": "vscode-icons:file-type-coffeescript", ".config": "vscode-icons:file-type-config", ".cfg": "vscode-icons:file-type-config", ".conf": "vscode-icons:file-type-config", ".cr": "vscode-icons:file-type-light-crystal", ".ecr": "vscode-icons:file-type-light-crystal", ".slang": "vscode-icons:file-type-slang", ".cson": "vscode-icons:file-type-json", ".css": "vscode-icons:file-type-css", ".css.map": "vscode-icons:file-type-cssmap", ".sss": "vscode-icons:file-type-sss", ".csv": "vscode-icons:file-type-excel", ".xls": "vscode-icons:file-type-excel2", ".xlsx": "vscode-icons:file-type-excel2", ".cu": "vscode-icons:file-type-cuda", ".cuh": "vscode-icons:file-type-cuda", ".hu": "vscode-icons:file-type-cuda", ".cake": "vscode-icons:file-type-cake", ".ctp": "vscode-icons:file-type-cakephp", ".d": "vscode-icons:file-type-dependencies", ".doc": "vscode-icons:file-type-word2", ".docx": "vscode-icons:file-type-word2", ".ejs": "vscode-icons:file-type-ejs", ".ex": "vscode-icons:file-type-elixir", ".exs": "vscode-icons:file-type-elixir", ".elm": "vscode-icons:file-type-elm", ".ico": "vscode-icons:file-type-favicon", ".fs": "vscode-icons:file-type-fsharp", ".fsx": "vscode-icons:file-type-fsharp", ".gitignore": "vscode-icons:file-type-git", ".gitconfig": "vscode-icons:file-type-git", ".gitkeep": "vscode-icons:file-type-git", ".gitattributes": "vscode-icons:file-type-git", ".gitmodules": "vscode-icons:file-type-git", ".go": "vscode-icons:file-type-go", ".slide": "vscode-icons:file-type-go", ".article": "vscode-icons:file-type-go", ".gd": "vscode-icons:file-type-godot", ".godot": "vscode-icons:file-type-godot", ".tres": "vscode-icons:file-type-godot", ".tscn": "vscode-icons:file-type-godot", ".gradle": "vscode-icons:file-type-light-gradle", ".groovy": "vscode-icons:file-type-groovy", ".gsp": "vscode-icons:file-type-groovy", ".gql": "vscode-icons:file-type-graphql", ".graphql": "vscode-icons:file-type-graphql", ".graphqls": "vscode-icons:file-type-graphql", ".hack": "logos:hack", ".haml": "vscode-icons:file-type-haml", ".handlebars": "vscode-icons:file-type-handlebars", ".hbs": "vscode-icons:file-type-handlebars", ".hjs": "vscode-icons:file-type-handlebars", ".hs": "vscode-icons:file-type-haskell", ".lhs": "vscode-icons:file-type-haskell", ".hx": "vscode-icons:file-type-haxe", ".hxs": "vscode-icons:file-type-haxe", ".hxp": "vscode-icons:file-type-haxe", ".hxml": "vscode-icons:file-type-haxe", ".html": "vscode-icons:file-type-html", ".jade": "file-icons:jade", ".java": "vscode-icons:file-type-java", ".class": "vscode-icons:file-type-java", ".classpath": "vscode-icons:file-type-java", ".properties": "vscode-icons:file-type-java", ".js": "vscode-icons:file-type-js", ".js.map": "vscode-icons:file-type-jsmap", ".cjs": "vscode-icons:file-type-js", ".cjs.map": "vscode-icons:file-type-jsmap", ".mjs": "vscode-icons:file-type-js", ".mjs.map": "vscode-icons:file-type-jsmap", ".spec.js": "vscode-icons:file-type-light-testjs", ".spec.cjs": "vscode-icons:file-type-light-testjs", ".spec.mjs": "vscode-icons:file-type-light-testjs", ".test.js": "vscode-icons:file-type-light-testjs", ".test.cjs": "vscode-icons:file-type-light-testjs", ".test.mjs": "vscode-icons:file-type-light-testjs", ".es": "vscode-icons:file-type-js", ".es5": "vscode-icons:file-type-js", ".es6": "vscode-icons:file-type-js", ".es7": "vscode-icons:file-type-js", ".jinja": "vscode-icons:file-type-jinja", ".jinja2": "vscode-icons:file-type-jinja", ".json": "vscode-icons:file-type-json", ".jl": "vscode-icons:file-type-julia", ".kt": "vscode-icons:file-type-kotlin", ".kts": "vscode-icons:file-type-kotlin", ".dart": "vscode-icons:file-type-dartlang", ".less": "vscode-icons:file-type-less", ".liquid": "vscode-icons:file-type-liquid", ".ls": "vscode-icons:file-type-livescript", ".lua": "vscode-icons:file-type-lua", ".markdown": "vscode-icons:file-type-markdown", ".md": "vscode-icons:file-type-markdown", ".mustache": "vscode-icons:file-type-light-mustache", ".stache": "vscode-icons:file-type-light-mustache", ".nim": "vscode-icons:file-type-light-nim", ".nims": "vscode-icons:file-type-light-nim", ".github-issues": "mdi:github", ".ipynb": "vscode-icons:file-type-jupyter", ".njk": "vscode-icons:file-type-nunjucks", ".nunjucks": "vscode-icons:file-type-nunjucks", ".nunjs": "vscode-icons:file-type-nunjucks", ".nunj": "vscode-icons:file-type-nunjucks", ".njs": "vscode-icons:file-type-nunjucks", ".nj": "vscode-icons:file-type-nunjucks", ".npm-debug.log": "vscode-icons:file-type-npm", ".npmignore": "catppuccin:npm-ignore", ".npmrc": "vscode-icons:file-type-npm", ".ml": "vscode-icons:file-type-ocaml", ".mli": "vscode-icons:file-type-ocaml", ".cmx": "vscode-icons:file-type-ocaml", ".cmxa": "vscode-icons:file-type-ocaml", ".pl": "vscode-icons:file-type-perl", ".php": "vscode-icons:file-type-php", ".php.inc": "vscode-icons:file-type-php", ".pipeline": "vscode-icons:file-type-pipeline", ".pddl": "vscode-icons:file-type-pddl", ".plan": "vscode-icons:file-type-pddl-plan", ".happenings": "vscode-icons:file-type-pddl-happenings", ".ps1": "vscode-icons:file-type-powershell", ".psd1": "vscode-icons:file-type-powershell", ".psm1": "vscode-icons:file-type-powershell", ".prisma": "vscode-icons:file-type-light-prisma", ".pug": "vscode-icons:file-type-pug", ".pp": "vscode-icons:file-type-puppet", ".epp": "vscode-icons:file-type-puppet", ".purs": "vscode-icons:file-type-light-purescript", ".py": "vscode-icons:file-type-python", ".jsx": "vscode-icons:file-type-reactjs", ".spec.jsx": "vscode-icons:file-type-reactjs", ".test.jsx": "vscode-icons:file-type-reactjs", ".cjsx": "vscode-icons:file-type-reactjs", ".tsx": "vscode-icons:file-type-reactts", ".spec.tsx": "vscode-icons:file-type-reactts", ".test.tsx": "vscode-icons:file-type-reactts", ".res": "vscode-icons:file-type-rescript", ".resi": "vscode-icons:file-type-rescript", ".R": "vscode-icons:file-type-r", ".rmd": "vscode-icons:file-type-rmd", ".rb": "vscode-icons:file-type-ruby", ".erb": "vscode-icons:file-type-html", ".erb.html": "vscode-icons:file-type-html", ".html.erb": "vscode-icons:file-type-html", ".rs": "vscode-icons:file-type-rust", ".sass": "vscode-icons:file-type-sass", ".scss": "vscode-icons:file-type-sass", ".springBeans": "seti:spring", ".slim": "vscode-icons:file-type-slim", ".smarty.tpl": "vscode-icons:file-type-smarty", ".tpl": "vscode-icons:file-type-smarty", ".sbt": "vscode-icons:file-type-sbt", ".scala": "vscode-icons:file-type-scala", ".sol": "logos:ethereum-color", ".styl": "vscode-icons:file-type-light-stylus", ".svelte": "vscode-icons:file-type-svelte", ".swift": "vscode-icons:file-type-swift", ".sql": "vscode-icons:file-type-sql", ".soql": "vscode-icons:file-type-sql", ".tf": "vscode-icons:file-type-terraform", ".tf.json": "vscode-icons:file-type-terraform", ".tfvars": "vscode-icons:file-type-terraform", ".tfvars.json": "vscode-icons:file-type-terraform", ".tex": "vscode-icons:file-type-light-tex", ".sty": "vscode-icons:file-type-light-tex", ".dtx": "vscode-icons:file-type-light-tex", ".ins": "vscode-icons:file-type-light-tex", ".txt": "vscode-icons:file-type-text", ".toml": "vscode-icons:file-type-light-toml", ".twig": "vscode-icons:file-type-twig", ".ts": "vscode-icons:file-type-typescript", ".spec.ts": "vscode-icons:file-type-testts", ".test.ts": "vscode-icons:file-type-testts", ".vala": "vscode-icons:file-type-vala", ".vapi": "vscode-icons:file-type-vala", ".component": "vscode-icons:file-type-html", ".vue": "vscode-icons:file-type-vue", ".wasm": "vscode-icons:file-type-wasm", ".wat": "vscode-icons:file-type-wasm", ".xml": "vscode-icons:file-type-xml", ".yml": "vscode-icons:file-type-light-yaml", ".yaml": "vscode-icons:file-type-light-yaml", ".pro": "vscode-icons:file-type-prolog", ".zig": "vscode-icons:file-type-zig", ".jar": "vscode-icons:file-type-jar", ".zip": "vscode-icons:file-type-zip", ".ai": "vscode-icons:file-type-ai", ".psd": "vscode-icons:file-type-photoshop", ".pdf": "vscode-icons:file-type-pdf2", ".eot": "vscode-icons:file-type-light-font", ".ttf": "vscode-icons:file-type-light-font", ".woff": "vscode-icons:file-type-light-font", ".woff2": "vscode-icons:file-type-light-font", ".otf": "vscode-icons:file-type-light-font", ".avif": "vscode-icons:file-type-avif", ".gif": "vscode-icons:file-type-image", ".jpg": "vscode-icons:file-type-image", ".jpeg": "vscode-icons:file-type-image", ".png": "vscode-icons:file-type-image", ".pxm": "vscode-icons:file-type-image", ".svg": "vscode-icons:file-type-svg", ".svgx": "vscode-icons:file-type-image", ".tiff": "vscode-icons:file-type-image", ".webp": "vscode-icons:file-type-image", ".sublime-project": "vscode-icons:file-type-sublime", ".sublime-workspace": "vscode-icons:file-type-sublime", ".code-search": "vscode-icons:file-type-search-result", ".sh": "vscode-icons:file-type-shell", ".zsh": "vscode-icons:file-type-shell", ".fish": "vscode-icons:file-type-shell", ".zshrc": "vscode-icons:file-type-shell", ".bashrc": "vscode-icons:file-type-shell", ".mov": "vscode-icons:file-type-video", ".ogv": "vscode-icons:file-type-video", ".webm": "vscode-icons:file-type-video", ".avi": "vscode-icons:file-type-video", ".mpg": "vscode-icons:file-type-video", ".mp4": "vscode-icons:file-type-video", ".mp3": "vscode-icons:file-type-audio", ".ogg": "vscode-icons:file-type-audio", ".wav": "vscode-icons:file-type-audio", ".flac": "vscode-icons:file-type-audio", ".bat": "vscode-icons:file-type-bat", ".cmd": "vscode-icons:file-type-shell", ".babelrc": "vscode-icons:file-type-light-babel", ".babelrc.js": "vscode-icons:file-type-light-babel", ".babelrc.cjs": "vscode-icons:file-type-light-babel", ".bazelrc": "vscode-icons:file-type-bazel", ".bowerrc": "vscode-icons:file-type-bower2", ".codeclimate.yml": "vscode-icons:file-type-codeclimate", ".eslintrc": "vscode-icons:file-type-eslint", ".eslintrc.js": "vscode-icons:file-type-eslint", ".eslintrc.cjs": "vscode-icons:file-type-eslint", ".eslintrc.yaml": "vscode-icons:file-type-eslint", ".eslintrc.yml": "vscode-icons:file-type-eslint", ".eslintrc.json": "vscode-icons:file-type-eslint", ".eslintignore": "vscode-icons:file-type-eslint", ".firebaserc": "vscode-icons:file-type-firebase", ".gitlab-ci.yml": "vscode-icons:file-type-gitlab", ".jshintrc": "vscode-icons:file-type-jshint", ".jscsrc": "vscode-icons:file-type-js", ".stylelintrc": "vscode-icons:file-type-light-stylelint", ".stylelintrc.json": "vscode-icons:file-type-light-stylelint", ".stylelintrc.yaml": "vscode-icons:file-type-light-stylelint", ".stylelintrc.yml": "vscode-icons:file-type-light-stylelint", ".stylelintrc.js": "vscode-icons:file-type-light-stylelint", ".stylelintignore": "vscode-icons:file-type-light-stylelint", ".direnv": "vscode-icons:file-type-dotenv", ".env": "vscode-icons:file-type-dotenv", ".static": "vscode-icons:file-type-config", ".editorconfig": "vscode-icons:file-type-editorconfig", ".slugignore": "vscode-icons:file-type-config", ".tmp": "ph:clock-bold", ".htaccess": "vscode-icons:file-type-config", ".key": "vscode-icons:file-type-key", ".cert": "vscode-icons:file-type-cert", ".cer": "vscode-icons:file-type-cert", ".crt": "vscode-icons:file-type-cert", ".pem": "vscode-icons:file-type-cert", ".DS_Store": "octicon:diff-ignored-16" }, partials: { "Gemfile": "vscode-icons:file-type-ruby", "gemfile": "vscode-icons:file-type-ruby", "dockerfile": "vscode-icons:file-type-docker", "Dockerfile": "vscode-icons:file-type-docker", "DOCKERFILE": "vscode-icons:file-type-docker", ".dockerignore": "vscode-icons:file-type-docker", "docker-healthcheck": "vscode-icons:file-type-docker", "docker-compose.yml": "vscode-icons:file-type-docker", "docker-compose.yaml": "vscode-icons:file-type-docker", "docker-compose.override.yml": "vscode-icons:file-type-docker", "docker-compose.override.yaml": "vscode-icons:file-type-docker", "GULPFILE": "vscode-icons:file-type-gulp", "Gulpfile": "vscode-icons:file-type-gulp", "gulpfile": "vscode-icons:file-type-gulp", "gulpfile.js": "vscode-icons:file-type-gulp", "LICENSE": "vscode-icons:file-type-license", "LICENCE": "vscode-icons:file-type-license", "LICENSE.txt": "vscode-icons:file-type-license", "LICENCE.txt": "vscode-icons:file-type-license", "LICENSE.md": "vscode-icons:file-type-license", "LICENCE.md": "vscode-icons:file-type-license", "COPYING": "vscode-icons:file-type-license", "COPYING.txt": "vscode-icons:file-type-license", "COPYING.md": "vscode-icons:file-type-license", "COMPILING": "vscode-icons:file-type-license", "COMPILING.txt": "vscode-icons:file-type-license", "COMPILING.md": "vscode-icons:file-type-license", "CONTRIBUTING": "vscode-icons:file-type-license", "CONTRIBUTING.txt": "vscode-icons:file-type-license", "CONTRIBUTING.md": "vscode-icons:file-type-license", "MAKEFILE": "vscode-icons:file-type-makefile", "Makefile": "vscode-icons:file-type-makefile", "makefile": "vscode-icons:file-type-makefile", "QMAKEFILE": "vscode-icons:file-type-makefile", "QMakefile": "vscode-icons:file-type-makefile", "qmakefile": "vscode-icons:file-type-makefile", "OMAKEFILE": "vscode-icons:file-type-makefile", "OMakefile": "vscode-icons:file-type-makefile", "omakefile": "vscode-icons:file-type-makefile", "CMAKELISTS.TXT": "vscode-icons:file-type-makefile", "CMAKELISTS.txt": "vscode-icons:file-type-makefile", "CMakeLists.txt": "vscode-icons:file-type-makefile", "cmakelists.txt": "vscode-icons:file-type-makefile", "Procfile": "vscode-icons:file-type-procfile", "TODO": "vscode-icons:file-type-light-todo", "TODO.txt": "vscode-icons:file-type-light-todo", "TODO.md": "vscode-icons:file-type-light-todo" } }; //#endregion //#region src/node/fileIcons/findIcon.ts function getFileIcon(fileName, type) { const name = getFileIconName(fileName, type); if (!name) return type !== "folder" ? defaultFile : defaultFolder; return name; } function getFileIconName(fileName, type = "file") { if (type === "folder") { const icon$1 = definitions.folders[fileName]; if (icon$1) return icon$1; if (fileName.includes("/")) return definitions.folders[fileName.slice(fileName.lastIndexOf("/") + 1)]; return; } let icon = definitions.named[fileName] || definitions.files[fileName]; if (icon) return icon; icon = getFileIconTypeFromExtension(fileName) || void 0; if (icon) return icon; for (const [partial, partialIcon] of Object.entries(definitions.partials)) if (fileName.includes(partial)) return partialIcon; return icon; } function getFileIconTypeFromExtension(fileName) { const firstDotIndex = fileName.indexOf("."); if (firstDotIndex === -1) return; let extension = fileName.slice(firstDotIndex); while (extension !== "") { const icon = definitions.extensions[extension]; if (icon) return icon; const nextDotIndex = extension.indexOf(".", 1); if (nextDotIndex === -1) return; extension = extension.slice(nextDotIndex); } } //#endregion //#region src/node/utils/cleanMarkdownEnv.ts const WHITE_LIST = [ "base", "filePath", "filePathRelative", "references", "abbreviations", "annotations" ]; function cleanMarkdownEnv(env, excludes = []) { const result = {}; for (const key of WHITE_LIST) { if (excludes.includes(key)) continue; result[key] = env[key]; } return result; } //#endregion //#region src/node/utils/stringifyProp.ts function stringifyProp(data) { return JSON.stringify(data).replace(/'/g, "'"); } //#endregion //#region src/node/container/codeTabs.ts function createCodeTabIconGetter(options = {}) { const noop = () => void 0; if (options.icon === false) return noop; const { named, extensions } = isPlainObject(options.icon) ? options.icon : {}; return function getIcon(filename) { if (named === false && definitions.named[filename]) return void 0; if (extensions === false && getFileIconTypeFromExtension(filename)) return; const hasNamed = named && named.length; const hasExt = extensions && extensions.length; if (hasNamed || hasExt) { if (hasNamed && named.includes(filename)) return definitions.named[filename]; if (hasExt && extensions.some((ext) => filename.endsWith(ext))) return getFileIconTypeFromExtension(filename); return; } return getFileIconName(filename); }; } const codeTabs = (md, options = {}) => { const getIcon = createCodeTabIconGetter(options); tab(md, { name: "code-tabs", openRender: ({ active, data }, tokens, index, _, env) => { const { meta } = tokens[index]; const titles = data.map(({ title }) => md.renderInline(title, cleanMarkdownEnv(env))); const tabsData = data.map((item, dataIndex) => { const { id = titles[dataIndex] } = item; return { id }; }); const titlesContent = titles.map((title, index$1) => { const icon = getIcon(title); return ``; }).join(""); return `${titlesContent}`; }, closeRender: () => ``, tabOpenRender: ({ index }, tokens, tokenIndex) => { let foundFence = false; for (let i = tokenIndex; i < tokens.length; i++) { const { type } = tokens[i]; if (type === "code-tabs_tab_close") break; if ((type === "fence" || type === "import_code") && !foundFence) { foundFence = true; continue; } tokens[i].type = "code_tab_empty"; tokens[i].hidden = true; } return `` }); }; //#endregion //#region src/node/utils/resolveAttrs.ts const RE_ATTR_VALUE = /(?:^|\s+)(?[\w-]+)(?:=(?['"])(?.+?)\k|=(?\S+))?(?:\s+|$)/; function resolveAttrs(info) { info = info.trim(); if (!info) return { rawAttrs: "", attrs: {} }; const attrs$1 = {}; const rawAttrs = info; let matched; while (matched = info.match(RE_ATTR_VALUE)) { const { attr, valueWithQuote, valueWithoutQuote } = matched.groups; const value = valueWithQuote || valueWithoutQuote || true; let v = typeof value === "string" ? value.trim() : value; if (v === "true") v = true; else if (v === "false") v = false; else if (v === "\"\"" || v === "''") v = ""; attrs$1[camelCase(attr)] = v; info = info.slice(matched[0].length); } return { attrs: attrs$1, rawAttrs }; } function resolveAttr(info, key) { const pattern = /* @__PURE__ */ new RegExp(`(?:^|\\s+)${key}(?:=(?['"])(?.+?)\\k|=(?\\S+))?(?:\\s+|$)`); const groups = info.match(pattern)?.groups; return groups?.valueWithQuote || groups?.valueWithoutQuote; } //#endregion //#region src/node/enhance/imageSize.ts const REG_IMG = /!\[.*?\]\(.*?\)/g; const REG_IMG_TAG = //g; const REG_IMG_TAG_SRC = /src(?:set)?=(['"])(.+?)\1/g; const BADGE_LIST = [ "https://img.shields.io", "https://badge.fury.io", "https://badgen.net", "https://forthebadge.com", "https://vercel.com/button" ]; const cache$1 = /* @__PURE__ */ new Map(); async function imageSizePlugin(app, md, type = false) { if (!app.env.isBuild || !type) return; if (type === "all") { const start = performance.now(); try { await scanRemoteImageSize(app); } catch {} if (app.env.isDebug) logger.info(`[vuepress-plugin-md-power] imageSizePlugin: scan all images time spent: ${performance.now() - start}ms`); } const imageRule = md.renderer.rules.image; md.renderer.rules.image = (tokens, idx, options, env, self) => { if (!env.filePathRelative || !env.filePath) return imageRule(tokens, idx, options, env, self); const token = tokens[idx]; const src = token.attrGet("src"); const width = token.attrGet("width"); const height = token.attrGet("height"); const size = resolveSize(src, width, height, env); if (size) { token.attrSet("width", `${size.width}`); token.attrSet("height", `${size.height}`); } return imageRule(tokens, idx, options, env, self); }; const rawHtmlBlockRule = md.renderer.rules.html_block; const rawHtmlInlineRule = md.renderer.rules.html_inline; md.renderer.rules.html_block = createHtmlRule(rawHtmlBlockRule); md.renderer.rules.html_inline = createHtmlRule(rawHtmlInlineRule); function createHtmlRule(rawHtmlRule) { return (tokens, idx, options, env, self) => { const token = tokens[idx]; token.content = token.content.replace(REG_IMG_TAG, (raw, info) => { const { attrs: attrs$1 } = resolveAttrs(info); const src = attrs$1.src || attrs$1.srcset; const size = resolveSize(src, attrs$1.width, attrs$1.height, env); if (!size) return raw; attrs$1.width = size.width; attrs$1.height = size.height; return ` typeof value === "boolean" ? key : `${key}="${value}"`).join(" ")}>`; }); return rawHtmlRule(tokens, idx, options, env, self); }; } function resolveSize(src, width, height, env) { if (!src || src.startsWith("data:")) return false; if (width && height) return false; const isExternal = isLinkExternal(src, env.base); const filepath$1 = isExternal ? src : resolveImageUrl(src, env, app); if (isExternal) { if (!cache$1.has(filepath$1)) return false; } else if (!cache$1.has(filepath$1)) { if (!fs.existsSync(filepath$1)) return false; try { const { width: w, height: h } = imageSize(fs.readFileSync(filepath$1)); if (!w || !h) return false; cache$1.set(filepath$1, { width: w, height: h }); } catch { return false; } } const { width: originalWidth, height: originalHeight } = cache$1.get(filepath$1); const ratio = originalWidth / originalHeight; if (width && !height) { const w = Number.parseInt(width, 10); return { width: w, height: Math.round(w / ratio) }; } else if (height && !width) { const h = Number.parseInt(height, 10); return { width: Math.round(h * ratio), height: h }; } else return { width: originalWidth, height: originalHeight }; } } function resolveImageUrl(src, env, app) { if (src[0] === "/") return app.dir.public(src.slice(1)); if (env.filePathRelative && src[0] === ".") return app.dir.source(path.join(path.dirname(env.filePathRelative), src)); if (env.filePath && (src[0] === "." || src[0] === "/")) return path.resolve(env.filePath, src); return path.resolve(src); } async function scanRemoteImageSize(app) { if (!app.env.isBuild) return; const cwd = app.dir.source(); const files = await fs.readdir(cwd, { recursive: true }); const imgList = []; for (const file of files) { const filepath$1 = path.join(cwd, file); if ((await fs.stat(filepath$1)).isFile() && !filepath$1.includes(".vuepress") && !filepath$1.includes("node_modules") && filepath$1.endsWith(".md")) { const content = await fs.readFile(filepath$1, "utf-8"); const syntaxMatched = content.match(REG_IMG) ?? []; for (const img of syntaxMatched) { const src = img.slice(img.indexOf("](") + 2, -1); addList(src.split(/\s+/)[0]); } const tagMatched = content.match(REG_IMG_TAG) ?? []; for (const img of tagMatched) { const src = img.match(REG_IMG_TAG_SRC)?.[2] ?? ""; addList(src); } } } function addList(src) { if (src && isLinkHttp(src) && !imgList.includes(src) && !BADGE_LIST.some((badge) => src.startsWith(badge))) imgList.push(src); } await Promise.all(imgList.map(async (src) => { if (!cache$1.has(src)) { const { width, height } = await fetchImageSize(src); if (width && height) cache$1.set(src, { width, height }); } })); } function fetchImageSize(src) { const link = new URL(src); const promise = new Promise((resolve) => { http.get(link, async (stream) => { const chunks = []; for await (const chunk of stream) { chunks.push(chunk); try { const { width, height } = imageSize(Buffer.concat(chunks)); if (width && height) return resolve({ width, height }); } catch {} } try { const { width, height } = imageSize(Buffer.concat(chunks)); resolve({ width, height }); } catch { resolve({ width: 0, height: 0 }); } }).on("error", () => resolve({ width: 0, height: 0 })); }); try { return withTimeout(() => promise, 3e3); } catch { return Promise.resolve({ width: 0, height: 0 }); } } async function resolveImageSize(app, url, remote = false) { if (cache$1.has(url)) return cache$1.get(url); if (isLinkHttp(url) && remote) return await fetchImageSize(url); if (url[0] === "/") { const filepath$1 = app.dir.public(url.slice(1)); if (fs.existsSync(filepath$1)) try { const { width, height } = imageSize(fs.readFileSync(filepath$1)); return { width, height }; } catch {} } return { width: 0, height: 0 }; } //#endregion //#region src/node/demo/supports/file.ts const require = createRequire(process.cwd()); function findFile(app, env, url) { if (url.startsWith("/")) return app.dir.source(url.slice(1)); if (url.startsWith("./") || url.startsWith("../")) return app.dir.source(path$1.dirname(env.filePathRelative), url); if (url.startsWith("@source/")) return app.dir.source(url.slice(8)); try { return require.resolve(url); } catch { return url; } } function readFileSync(filepath$1) { try { return fs$1.readFileSync(filepath$1, "utf-8"); } catch { return false; } } function writeFileSync(filepath$1, content) { const dirname = path$1.dirname(filepath$1); fs$1.mkdirSync(dirname, { recursive: true }); fs$1.writeFileSync(filepath$1, content, "utf-8"); } //#endregion //#region src/node/embed/createEmbedRuleBlock.ts function createEmbedRuleBlock(md, { type, name = type, syntaxPattern, beforeName = "import_code", ruleOptions = { alt: [ "paragraph", "reference", "blockquote", "list" ] }, meta, content }) { const MIN_LENGTH = type.length + 5; const START_CODES = [ 64, 91, ...type.split("").map((c) => c.charCodeAt(0)) ]; md.block.ruler.before(beforeName, name, (state, startLine, endLine, silent) => { const pos = state.bMarks[startLine] + state.tShift[startLine]; const max = state.eMarks[startLine]; if (pos + MIN_LENGTH > max) return false; for (let i = 0; i < START_CODES.length; i += 1) if (state.src.charCodeAt(pos + i) !== START_CODES[i]) return false; const content$1 = state.src.slice(pos, max); const match = content$1.match(syntaxPattern); if (!match) return false; /* istanbul ignore if -- @preserve */ if (silent) return true; const token = state.push(name, "", 0); token.meta = meta(match); token.content = content$1; token.map = [startLine, startLine + 1]; state.line = startLine + 1; return true; }, ruleOptions); md.renderer.rules[name] = (tokens, index, _, env) => { const token = tokens[index]; token.content = content(token.meta, token.content, env); return token.content; }; } //#endregion //#region src/node/utils/parseRect.ts function parseRect(str, unit = "px") { if (Number.parseFloat(str) === Number(str)) return `${str}${unit}`; return str; } //#endregion //#region src/node/utils/stringifyAttrs.ts function stringifyAttrs(attrs$1, withUndefinedOrNull = false, forceStringify = []) { const result = Object.entries(attrs$1).map(([key, value]) => { const k = kebabCase(key); if (isUndefined(value) || value === "undefined") return withUndefinedOrNull ? `:${k}="undefined"` : ""; if (isNull(value) || value === "null") return withUndefinedOrNull ? `:${k}="null"` : ""; if (value === "true") value = true; if (value === "false") value = false; if (isBoolean(value)) return value ? `${k}` : ""; if (isNumber(value)) return `:${k}="${value}"`; if (isString(value) && (value[0] === "{" || value[0] === "[")) { const v = value.replaceAll("\"", "'"); if (forceStringify.includes(key)) return `${k}="${v}"`; return `:${k}="${v}"`; } return `${key[0] === ":" ? ":" : ""}${k}="${String(value)}"`; }).filter(Boolean).join(" "); return result ? ` ${result}` : ""; } //#endregion //#region src/node/container/createContainer.ts /** * 创建 markdown-it 的自定义容器插件。 * * @param md markdown-it 实例 * @param type 容器类型(如 'tip', 'warning' 等) * @param options 可选的 before/after 渲染钩子 * @param options.before 渲染容器起始标签时的回调函数 * @param options.after 渲染容器结束标签时的回调函数 */ function createContainerPlugin(md, type, { before, after } = {}) { const render = (tokens, index, options, env) => { const token = tokens[index]; const info = token.info.trim().slice(type.length).trim() || ""; if (token.nesting === 1) return before?.(info, tokens, index, options, env) ?? `
`; else return after?.(info, tokens, index, options, env) ?? "
"; }; md.use(container, type, { render }); } /** * 创建一个自定义的容器规则,内容不会交给 markdown-it 处理。 * 需要自定义 content 的处理逻辑 * ```md * ::: type * xxxx <-- content: 这部分的内容不会交给 markdown-it 处理 * ::: * ``` * * @example * ```ts * const example = createContainerSyntaxPlugin(md, 'example', (tokens, index, options, env) => { * const { content, meta } = tokens[index] * return `
${meta.title} | ${content}
` * }) * ``` */ function createContainerSyntaxPlugin(md, type, render) { const maker = ":"; const markerMinLen = 3; /** * 自定义容器的 block 规则定义。 * @param state 当前 block 状态 * @param startLine 起始行 * @param endLine 结束行 * @param silent 是否为静默模式 * @returns 是否匹配到自定义容器 */ function defineContainer(state, startLine, endLine, silent) { const start = state.bMarks[startLine] + state.tShift[startLine]; const max = state.eMarks[startLine]; let pos = start; if (state.src[pos] !== maker) return false; pos += markerMinLen; for (pos = start + 1; pos <= max; pos++) if (state.src[pos] !== maker) break; if (pos - start < markerMinLen) return false; const markup = state.src.slice(start, pos); const info = state.src.slice(pos, max).trim(); if (!info.startsWith(type)) return false; /* istanbul ignore if -- @preserve */ if (silent) return true; let line = startLine; let content = ""; while (++line < endLine) { if (state.src.slice(state.bMarks[line], state.eMarks[line]).trim() === markup) break; content += `${state.src.slice(state.bMarks[line], state.eMarks[line])}\n`; } const token = state.push(`${type}_container`, "", 0); token.meta = resolveAttrs(info.slice(type.length)).attrs; token.content = content; token.markup = `${markup} ${type}`; token.map = [startLine, line + 1]; state.line = line + 1; return true; } const defaultRender = (tokens, index) => { const { content } = tokens[index]; return `
${content}
`; }; md.block.ruler.before("fence", `${type}_definition`, defineContainer); md.renderer.rules[`${type}_container`] = render ?? defaultRender; } //#endregion //#region src/node/container/codeTree.ts const UNSUPPORTED_FILE_TYPES = [ "jpg", "jpeg", "png", "gif", "avif", "webp", "mp3", "mp4", "ogg", "m3u8", "m3u", "flv", "webm", "wav", "flac", "aac", "pdf", "doc", "docx", "ppt", "pptx", "xls", "xlsx" ]; /** * 将文件路径数组解析为文件树节点结构 * @param files 文件路径数组 * @returns 文件树节点数组 */ function parseFileNodes(files) { const nodes = []; for (const file of files) { const parts = removeLeadingSlash(file).split("/"); let node = nodes; for (let i = 0; i < parts.length; i++) { const part = parts[i]; const isFile = i === parts.length - 1; let child = node.find((n) => n.filename === part); if (!child) { child = { level: i + 1, filename: part, filepath: isFile ? file : void 0, children: isFile ? void 0 : [] }; node.push(child); } if (!isFile && child.children) node = child.children; } } return nodes; } /** * 注册 code-tree 容器和嵌入语法的 markdown 插件 * @param md markdown-it 实例 * @param app vuepress app 实例 * @param options code-tree 配置项 */ function codeTreePlugin(md, app, options = {}) { /** * 获取文件或文件夹的图标 */ const getIcon = (filename, type, mode) => { mode ||= options.icon || "colored"; if (mode === "simple") return type === "folder" ? defaultFolder : defaultFile; return getFileIcon(filename, type); }; /** * 渲染文件树节点为组件字符串 */ function renderFileTree(nodes, mode) { return nodes.map((node) => { const props = { filename: node.filename, level: node.level, type: node.children?.length ? "folder" : "file", expanded: true, filepath: node.filepath }; return ` ${node.children?.length ? renderFileTree(node.children, mode) : ""} `; }).join("\n"); } createContainerPlugin(md, "code-tree", { before: (info, tokens, index) => { const files = []; let activeFile; for (let i = index + 1; !(tokens[i].nesting === -1 && tokens[i].type === "container_code-tree_close"); i++) { const token = tokens[i]; if (token.type === "fence" && token.tag === "code") { const fenceInfo = md.utils.unescapeAll(token.info); const title$1 = resolveAttr(fenceInfo, "title"); if (title$1) { files.push(title$1); if (fenceInfo.includes(":active")) activeFile = title$1; } } } const { attrs: attrs$1 } = resolveAttrs(info); const { title, icon, height, entry } = attrs$1; const fileTreeNodes = parseFileNodes(files); const entryFile = activeFile || entry || files[0]; const h = height || String(options.height); return ``; }, after: () => "" }); createEmbedRuleBlock(md, { type: "code-tree", syntaxPattern: /^@\[code-tree([^\]]*)\]\(([^)]*)\)/, meta: ([, info, dir]) => { const { attrs: attrs$1 } = resolveAttrs(info); const h = attrs$1.height || String(options.height); return { title: attrs$1.title, entryFile: attrs$1.entry, icon: attrs$1.icon, height: h ? parseRect(h) : void 0, dir }; }, content: ({ dir, icon,...props }, _, env) => { const codeTreeFiles = env.codeTreeFiles ??= []; const root = findFile(app, env, dir); const files = globSync("**/*", { cwd: root, onlyFiles: true, dot: true, ignore: [ "**/node_modules/**", "**/.DS_Store", "**/.gitkeep" ] }).sort((a, b) => { const al = a.split("/").length; return b.split("/").length - al; }); props.entryFile ||= files[0]; const codeContent = files.map((file) => { const ext = path$1.extname(file).slice(1); if (UNSUPPORTED_FILE_TYPES.includes(ext)) return ""; const filepath$1 = path$1.join(root, file); codeTreeFiles.push(filepath$1); const content = readFileSync(filepath$1); return `\`\`\`${ext || "txt"} title="${file}"\n${content}\n\`\`\``; }).filter(Boolean).join("\n"); const fileTreeNodes = parseFileNodes(files); return `${md.render(codeContent, cleanMarkdownEnv(env))}`; } }); } /** * 扩展页面依赖,将 codeTreeFiles 添加到页面依赖中 * @param page vuepress 页面对象 */ function extendsPageWithCodeTree(page) { const codeTreeFiles = page.markdownEnv.codeTreeFiles ?? []; if (codeTreeFiles.length) page.deps.push(...codeTreeFiles); } //#endregion //#region src/node/container/align.ts function alignPlugin(md) { for (const name of [ "left", "center", "right", "justify" ]) createContainerPlugin(md, name, { before: () => `
` }); createContainerPlugin(md, "flex", { before: (info) => { const { attrs: attrs$1 } = resolveAttrs(info); const styles = ["margin:16px 0;display:flex"]; const align = attrs$1.start ? "flex-start" : attrs$1.end ? "flex-end" : attrs$1.center ? "center" : ""; const justify = attrs$1.between ? "space-between" : attrs$1.around ? "space-around" : attrs$1.center ? "center" : ""; if (align) styles.push(`align-items:${align}`); if (justify) styles.push(`justify-content:${justify}`); if (attrs$1.column) styles.push("flex-direction:column"); if (attrs$1.wrap) styles.push("flex-wrap:wrap"); styles.push(`gap:${parseRect(attrs$1.gap || "16")}`); return `
`; } }); } //#endregion //#region src/node/container/card.ts function cardPlugin(md) { /** * ::: card title="xxx" icon="xxx" * xxx * ::: */ createContainerPlugin(md, "card", { before(info) { const { attrs: attrs$1 } = resolveAttrs(info); return ``; }, after: () => "" }); /** * :::: card-grid * ::: card * xxx * ::: * ::: card * xxx * ::: * :::: */ createContainerPlugin(md, "card-grid", { before: () => "", after: () => "" }); /** * ::: card-masonry cols="2" gap="10" * ::: card * xxx * ::: * ::: card * xxx * ::: * :::: */ createContainerPlugin(md, "card-masonry", { before: (info) => { const { attrs: attrs$1 } = resolveAttrs(info); if (attrs$1.cols) attrs$1.cols = attrs$1.cols[0] === "{" ? attrs$1.cols : Number.parseInt(`${attrs$1.cols}`); if (attrs$1.gap) attrs$1.gap = Number(attrs$1.gap); return ``; }, after: () => "" }); } //#endregion //#region src/node/container/chat.ts function chatMessagesRender(md, env, messages) { let currentDate = ""; return messages.map(({ sender, username, date, content }) => { let messageContent = ""; if (!currentDate || currentDate !== date) { currentDate = date; messageContent += `
${currentDate}
\n`; } messageContent += `
\ ${sender === "user" ? `\n

${username}

` : ""}
${md.render(content.join("\n"), cleanMarkdownEnv(env)).trim()}
`; return messageContent; }).join("\n"); } function parseChatContent(content) { const lines = content.split("\n"); const messages = []; let currentDate = ""; let message; for (const line of lines) { const lineStr = line.trim(); if (lineStr.startsWith("{:") && lineStr.endsWith("}")) { currentDate = lineStr.slice(2, -1).trim(); continue; } if (lineStr.startsWith("{") && lineStr.endsWith("}")) { const username = lineStr.slice(1, -1).trim(); message = { sender: username === "." ? "self" : "user", username, date: currentDate, content: [] }; messages.push(message); continue; } if (message?.sender) message.content.push(line); } return messages; } const chatPlugin = (md) => createContainerSyntaxPlugin(md, "chat", (tokens, idx, _, env) => `

${tokens[idx].meta?.title || "Chat"}

${chatMessagesRender(md, env, parseChatContent(tokens[idx].content))}
`); //#endregion //#region src/node/container/collapse.ts function collapsePlugin(md) { createContainerPlugin(md, "collapse", { before: (info, tokens, index) => { const { attrs: attrs$1 } = resolveAttrs(info); const idx = parseCollapse(tokens, index, attrs$1); const { accordion } = attrs$1; return ``; }, after: () => `` }); md.renderer.rules.collapse_item_open = (tokens, idx) => { const { expand, index } = tokens[idx].meta; return ``; }; md.renderer.rules.collapse_item_close = () => ""; md.renderer.rules.collapse_item_title_open = () => ""; } function parseCollapse(tokens, index, attrs$1) { const listStack = []; let idx = -1; let defaultIndex; let hashExpand = false; for (let i = index + 1; i < tokens.length; i++) { const token = tokens[i]; if (token.type === "container_collapse_close") break; if (token.type === "bullet_list_open") { listStack.push(0); if (listStack.length === 1) token.hidden = true; } else if (token.type === "bullet_list_close") { listStack.pop(); if (listStack.length === 0) token.hidden = true; } else if (token.type === "list_item_open") { if (listStack.length === 1) { token.type = "collapse_item_open"; tokens[i + 1].type = "collapse_item_title_open"; tokens[i + 3].type = "collapse_item_title_close"; idx++; const firstToken = tokens[i + 2].children[0]; let flag = ""; let expand; if (firstToken.type === "text") firstToken.content = firstToken.content.trim().replace(/^:[+\-]\s*/, (match) => { flag = match.trim(); return ""; }); if (attrs$1.accordion) { if (!hashExpand && flag === ":+") { expand = hashExpand = true; defaultIndex = idx; } } else if (flag === ":+") expand = true; else if (flag === ":-") expand = false; else expand = !!attrs$1.expand; token.meta = { index: idx, expand }; } } else if (token.type === "list_item_close") { if (listStack.length === 1) token.type = "collapse_item_close"; } } if (attrs$1.accordion && attrs$1.expand && !hashExpand) defaultIndex = 0; return defaultIndex; } //#endregion //#region src/node/container/demoWrapper.ts /** * :::demo-wrapper img no-padding title="xxx" height="100px" * ::: */ function demoWrapperPlugin(md) { createContainerPlugin(md, "demo-wrapper", { before: (info) => { const { attrs: attrs$1 } = resolveAttrs(info); const wrapperClasses = ["demo-wrapper"]; let containerStyle = ""; if (attrs$1.title) wrapperClasses.push("has-title"); if (attrs$1.img) wrapperClasses.push("only-img"); if (attrs$1.noPadding) wrapperClasses.push("no-padding"); if (attrs$1.height) { const h = Number.parseFloat(attrs$1.height) === Number(attrs$1.height) ? `${attrs$1.height}px` : attrs$1.height; containerStyle += `--demo-container-height: ${h};`; wrapperClasses.push("has-height"); } return `
${attrs$1.title ? `

${attrs$1.title}

` : ""}
\n`; }, after: () => "
" }); } //#endregion //#region src/node/container/field.ts function fieldPlugin(md) { createContainerPlugin(md, "field", { before: (info) => { const { attrs: attrs$1 } = resolveAttrs(info); const { name, type, required, optional, deprecated, default: defaultValue } = attrs$1; return ``; }, after: () => "" }); createContainerPlugin(md, "field-group", { before: () => "
" }); } //#endregion //#region src/node/container/fileTree.ts /** * 解析原始文件树内容为节点树结构 * @param content 文件树的原始文本内容 * @returns 文件树节点数组 */ function parseFileTreeRawContent(content) { const root = { info: "", level: -1, children: [] }; const stack = [root]; const lines = content.trim().split("\n"); for (const line of lines) { const match = line.match(/^(\s*)-(.*)$/); if (!match) continue; const level = Math.floor(match[1].length / 2); const info = match[2].trim(); while (stack.length > 0 && stack[stack.length - 1].level >= level) stack.pop(); const parent = stack[stack.length - 1]; const node = { info, level, children: [] }; parent.children.push(node); stack.push(node); } return root.children; } const RE_FOCUS = /^\*\*(.*)\*\*(?:$|\s+)/; /** * 解析单个节点的 info 字符串,提取文件名、注释、类型等属性 * @param info 节点描述字符串 * @returns 文件树节点属性 */ function parseFileTreeNodeInfo(info) { let filename = ""; let comment = ""; let focus = false; let expanded = true; let type = "file"; let diff; if (info.startsWith("++")) { info = info.slice(2).trim(); diff = "add"; } else if (info.startsWith("--")) { info = info.slice(2).trim(); diff = "remove"; } info = info.replace(RE_FOCUS, (_, matched) => { filename = matched; focus = true; return ""; }); if (filename === "" && !focus) { const spaceIndex = info.indexOf(" "); filename = info.slice(0, spaceIndex === -1 ? info.length : spaceIndex); info = spaceIndex === -1 ? "" : info.slice(spaceIndex); } comment = info.trim(); if (filename.endsWith("/")) { type = "folder"; expanded = false; filename = removeEndingSlash(filename); } return { filename, comment, focus, expanded, type, diff }; } /** * 文件树 markdown 插件主函数 * @param md markdown 实例 * @param options 文件树渲染选项 */ function fileTreePlugin(md, options = {}) { /** * 获取文件或文件夹的图标 */ const getIcon = (filename, type, mode) => { mode ||= options.icon || "colored"; if (mode === "simple") return type === "folder" ? defaultFolder : defaultFile; return getFileIcon(filename, type); }; /** * 递归渲染文件树节点 */ const renderFileTree = (nodes, meta) => nodes.map((node) => { const { info, level, children } = node; const { filename, comment, focus, expanded, type, diff } = parseFileTreeNodeInfo(info); const isOmit = filename === "…" || filename === "..."; if (children.length === 0 && type === "folder") children.push({ info: "…", level: level + 1, children: [] }); const nodeType = children.length > 0 ? "folder" : type; const renderedComment = comment ? `` : ""; const renderedIcon = !isOmit ? `` : ""; return ` ${renderedIcon}${renderedComment}${children.length > 0 ? renderFileTree(children, meta) : ""} `; }).join("\n"); return createContainerSyntaxPlugin(md, "file-tree", (tokens, index) => { const token = tokens[index]; const nodes = parseFileTreeRawContent(token.content); const meta = token.meta; return `
${meta.title ? `

${meta.title}

` : ""}${renderFileTree(nodes, meta)}
\n`; }); } //#endregion //#region src/node/container/langRepl.ts async function langReplPlugin(app, md, { theme, go = false, kotlin = false, rust = false, python = false }) { const container$1 = (lang) => createContainerPlugin(md, `${lang}-repl`, { before(info) { const { attrs: attrs$1 } = resolveAttrs(info); const { editable, title } = attrs$1; return ``; }, after: () => "" }); if (kotlin) container$1("kotlin"); if (go) container$1("go"); if (rust) container$1("rust"); if (python) container$1("python"); theme ??= { light: "github-light", dark: "github-dark" }; const data = { grammars: {} }; try { const themesPath = path.dirname(resolveModule("tm-themes")); const grammarsPath = path.dirname(resolveModule("tm-grammars")); const readTheme = (theme$1) => read(path.join(themesPath, "themes", `${theme$1}.json`)); const readGrammar = (grammar) => read(path.join(grammarsPath, "grammars", `${grammar}.json`)); if (typeof theme === "string") data.theme = await readTheme(theme); else data.theme = await Promise.all([readTheme(theme.light), readTheme(theme.dark)]).then(([light, dark]) => ({ light, dark })); if (kotlin) data.grammars.kotlin = await readGrammar("kotlin"); if (go) data.grammars.go = await readGrammar("go"); if (rust) data.grammars.rust = await readGrammar("rust"); if (python) data.grammars.python = await readGrammar("python"); } catch { /* istanbul ignore next -- @preserve */ logger.error("[vuepress-plugin-md-power]", `Failed to load packages: ${colors.green("tm-themes")}, ${colors.green("tm-grammars")}, Please install them manually.`); } await app.writeTemp("internal/md-power/replEditorData.js", `export default ${JSON.stringify(data, null, 2)}`); } async function read(file) { try { const content = await promises.readFile(file, "utf-8"); return JSON.parse(content); } catch {} } //#endregion //#region src/node/utils/logger.ts /** * Logger utils */ var Logger = class { constructor(name = "") { this.name = name; } init(subname, text) { return ora({ prefixText: colors.blue(`${this.name}${subname ? `:${subname}` : ""}: `), text }); } /** * Create a loading spinner with text */ load(subname, msg) { const instance = this.init(subname, msg); return { succeed: (text) => instance.succeed(text), fail: (text) => instance.succeed(text) }; } info(subname, text = "", ...args) { this.init(subname, colors.blue(text)).info(); if (args.length) console.info(...args); } /** * Log success msg */ succeed(subname, text = "", ...args) { this.init(subname, colors.green(text)).succeed(); if (args.length) console.log(...args); } /** * Log warning msg */ warn(subname, text = "", ...args) { this.init(subname, colors.yellow(text)).warn(); if (args.length) console.warn(...args); } /** * Log error msg */ error(subname, text = "", ...args) { this.init(subname, colors.red(text)).fail(); if (args.length) console.error(...args); } }; const logger$1 = new Logger("vuepress-plugin-md-power"); //#endregion //#region src/node/container/npmToPreset.ts const ALLOW_LIST = [ "npm", "pnpm", "yarn", "bun", "deno" ]; const BOOL_FLAGS = [ "--no-save", "-B", "--save-bundle", "--save-dev", "-D", "--save-prod", "-P", "--save-peer", "-O", "--save-optional", "-E", "--save-exact", "-y", "--yes", "-g", "--global" ]; const DEFAULT_TABS = [ "npm", "pnpm", "yarn" ]; const MANAGERS_CONFIG = { install: { pattern: /(?:^|\s)npm\s+(?:install|i)$/, pnpm: { cli: "pnpm install" }, yarn: { cli: "yarn" }, bun: { cli: "bun install" }, deno: { cli: "deno install" } }, add: { pattern: /(?:^|\s)npm\s+(?:install|i|add)(?:\s|$)/, pnpm: { cli: "pnpm add", flags: { "--no-save": "", "-B": "", "--save-bundle": "" } }, yarn: { cli: "yarn add", flags: { "--save-dev": "--dev", "--save-prod": "--prod", "-P": "", "--save-peer": "--peer", "--save-optional": "--optional", "--no-save": "", "--save-exact": "--exact", "-B": "", "--save-bundle": "" } }, bun: { cli: "bun add", flags: { "--save-dev": "--development", "-P": "", "--save-prod": "", "--save-peer": "", "-O": "--optional", "--save-optional": "--optional", "--no-save": "", "--save-exact": "--exact", "-B": "", "--save-bundle": "" } }, deno: { cli: "deno add", flags: { "-g": "", "--global": "", "--save-dev": "--dev", "-P": "", "--save-prod": "", "--save-peer": "", "-O": "", "--save-optional": "", "--no-save": "", "-E": "", "--save-exact": "", "-B": "", "--save-bundle": "" } } }, run: { pattern: /(?:^|\s)npm\s+(?:run|run-script|rum|urn)(?:\s|$)/, pnpm: { cli: "pnpm", flags: { "-w": "-F", "--workspace": "--filter", "--": "" } }, yarn: { cli: "yarn", flags: { "-w": "", "--workspace": "" } }, bun: { cli: "bun run", flags: { "-w": "--filter", "--workspace": "--filter" } }, deno: { cli: "deno run", flags: { "-w": "", "--workspace": "" } } }, create: { pattern: /(?:^|\s)npm\s+create\s/, pnpm: { cli: "pnpm create", flags: { "-y": "", "--yes": "" } }, yarn: { cli: "yarn create", flags: { "-y": "", "--yes": "" } }, bun: { cli: "bun create", flags: { "-y": "", "--yes": "" } }, deno: { cli: "deno run -A ", flags: { "-y": "", "--yes": "" } } }, init: { pattern: /(?:^|\s)npm\s+init/, pnpm: { cli: "pnpm init", flags: { "-y": "", "--yes": "" } }, yarn: { cli: "yarn init", flags: { "-y": "", "--yes": "" } }, bun: { cli: "bun init", flags: { "-y": "", "--yes": "" } }, deno: { cli: "deno init", flags: { "-y": "", "--yes": "" } } }, npx: { pattern: /(?:^|\s)npx\s+/, pnpm: { cli: "pnpm dlx" }, yarn: { cli: "yarn dlx" }, bun: { cli: "bunx" }, deno: { cli: "deno run -A" } }, remove: { pattern: /(?:^|\s)npm\s+(?:uninstall|r|rm|remove|unlink|un)(?:\s|$)/, pnpm: { cli: "pnpm remove", flags: { "--no-save": "", "--save": "", "-S": "" } }, yarn: { cli: "yarn remove", flags: { "--save-dev": "--dev", "--save": "", "-S": "", "-g": "", "--global": "" } }, bun: { cli: "bun remove", flags: { "--save-dev": "--development", "--save": "", "-S": "", "-g": "", "--global": "" } }, deno: { cli: "deno uninstall", flags: { "--save-dev": "--dev", "--save": "", "-S": "" } } }, ci: { pattern: /(?:^|\s)npm\s+ci$/, pnpm: { cli: "pnpm install --frozen-lockfile" }, yarn: { cli: "yarn install --immutable" }, bun: { cli: "bun install --frozen-lockfile" }, deno: { cli: "deno install --frozen" } } }; //#endregion //#region src/node/container/npmTo.ts /** * 注册 npm-to 容器插件,将 npm 代码块自动转换为多包管理器命令分组 */ function npmToPlugins(md, options = {}) { const opt = isArray(options) ? { tabs: options } : options; const defaultTabs = opt.tabs?.length ? opt.tabs : DEFAULT_TABS; createContainerPlugin(md, "npm-to", { before: (info, tokens, idx, _opt, env) => { const { attrs: attrs$1 } = resolveAttrs(info); const tabs$1 = attrs$1.tabs ? attrs$1.tabs.split(/,\s*/) : defaultTabs; const token = tokens[idx + 1]; if (token.type === "fence") { const content = token.content; token.hidden = true; token.type = "text"; token.content = ""; const lines = content.split(/(\n|\s*&&\s*)/); return md.render(resolveNpmTo(lines, token.info.trim(), idx, tabs$1), cleanMarkdownEnv(env)); } logger$1.warn("npm-to", `Invalid npm-to container in ${colors.gray(env.filePathRelative || env.filePath)}`); return ""; }, after: () => "" }); } /** * 将 npm 命令转换为各包管理器命令分组 * @param lines 命令行数组 * @param info 代码块类型 * @param idx token 索引 * @param tabs 需要支持的包管理器 */ function resolveNpmTo(lines, info, idx, tabs$1) { tabs$1 = validateTabs(tabs$1); const res = []; const map = {}; for (const tab$1 of tabs$1) { const newLines = []; for (const line of lines) { const config = findConfig(line); if (config && config[tab$1]) { const parsed = map[line] ??= parseLine(line); const { cli, flags } = config[tab$1]; let newLine = `${parsed.env ? `${parsed.env} ` : ""}${cli}`; if (parsed.args && flags) { let args = parsed.args; for (const [key, value] of Object.entries(flags)) args = args.replaceAll(key, value); newLine += ` ${args.replace(/\s+-/g, " -").trim()}`; } if (parsed.cmd) newLine += ` ${parsed.cmd}`; if (parsed.scriptArgs) newLine += ` ${parsed.scriptArgs}`; newLines.push(newLine.trim()); } else newLines.push(line); } res.push(`@tab ${tab$1}\n\`\`\`${info}\n${newLines.join("")}\n\`\`\``); } return `:::code-tabs#npm-to-${tabs$1.join("-")}\n${res.join("\n")}\n:::`; } /** * 根据命令行内容查找对应的包管理器配置 */ function findConfig(line) { for (const { pattern,...config } of Object.values(MANAGERS_CONFIG)) if (pattern.test(line)) return config; } /** * 校验 tabs 合法性,返回允许的包管理器列表 */ function validateTabs(tabs$1) { tabs$1 = tabs$1.filter((tab$1) => ALLOW_LIST.includes(tab$1)); if (tabs$1.length === 0) return DEFAULT_TABS; return tabs$1; } const LINE_REG = /(.*)(npm|npx)\s+(.*)/; /** * 解析一行 npm/npx 命令,拆分出环境变量、命令、参数等 */ function parseLine(line) { const match = line.match(LINE_REG); if (!match) return false; const [, env, cli, rest] = match; const idx = rest.trim().indexOf(" "); if (cli === "npx") { let cmd = ""; let scriptArgs = ""; if (idx !== -1) { cmd = rest.slice(0, idx); scriptArgs = rest.slice(idx + 1).trim(); } else cmd = rest; return { env, cli, cmd, scriptArgs }; } if (idx === -1) return { env, cli: `${cli} ${rest.trim()}`, cmd: "" }; return { env, cli: `${cli} ${rest.slice(0, idx)}`, ...parseArgs(rest.slice(idx + 1)) }; } /** * 解析 npm 命令参数,区分命令、参数、脚本参数 */ function parseArgs(line) { line = line?.trim(); const [npmArgs, scriptArgs] = line.split(/\s+--\s+/); let cmd = ""; let args = ""; if (npmArgs[0] !== "-") if (npmArgs[0] === "\"" || npmArgs[0] === "'") { const idx = npmArgs.slice(1).indexOf(npmArgs[0]); cmd = npmArgs.slice(0, idx + 2); args = npmArgs.slice(idx + 2); } else { const idx = npmArgs.indexOf(" -"); if (idx === -1) cmd = npmArgs; else { cmd = npmArgs.slice(0, idx); args = npmArgs.slice(idx + 1); } } else { let newLine = ""; let value = ""; let isQuote = false; let isBool = false; let isNextValue = false; let quote = ""; for (let i = 0; i < npmArgs.length; i++) { const v = npmArgs[i]; if (!isQuote && (v === "\"" || v === "'")) { quote = v; isQuote = true; value += v; } else if (isQuote && v === quote) { isQuote = false; value += v; } else if ((v === " " || v === "=" || i === npmArgs.length - 1) && !isQuote && value) { if (i === npmArgs.length - 1) value += v; const isKey = value[0] === "-"; if (isKey) { isBool = BOOL_FLAGS.includes(value); isNextValue = !isBool; } if (!isKey && !isNextValue) cmd += ` ${value}`; else { newLine += `${value}${i !== npmArgs.length - 1 ? v : ""}`; if (!isKey && isNextValue) isNextValue = false; } value = ""; } else value += v; } args = newLine; } return { cmd: cmd.trim(), args: args.trim(), scriptArgs }; } //#endregion //#region src/node/container/steps.ts /** * :::steps * 1. 步骤 1 * xxx * 2. 步骤 2 * xxx * 3. ... * ::: */ function stepsPlugin(md) { createContainerPlugin(md, "steps", { before: () => "
" }); } //#endregion //#region src/node/container/table.ts /** * 在不破坏表格语法的前提下,通过容器语法将表格包裹起来,为表格提供增强功能 * * @example * ```md * ::: table title="表格标题" max-content copy align="center" hl-rows="warning:1,2,3;error:4,5,6" hl-cols="warning:1;error:2,3" hl-cells="warning:(1,2)(2,3);" * * | xx | xx | xx | * | -- | -- | -- | * | xx | xx | xx | * ::: * ``` */ function tablePlugin(md, options = {}) { createContainerSyntaxPlugin(md, "table", (tokens, index, opt, env) => { const { hlCols = "", hlRows = "", hlCells = "",...meta } = tokens[index].meta; const props = { copy: true, maxContent: false, ...options, ...meta }; const content = tokens[index].content; if (props.copy) { props.copy = props.copy === true ? "all" : props.copy; if (props.copy === "all" || props.copy === "md") props.markdown = encodeData(content.trim()); } if (!hlCols && !hlRows && !hlCells) return `${md.render(content, env)}`; const rows = parseHl(hlRows); const cols = parseHl(hlCols); const cells = parseHlCells(hlCells); const tableTokens = md.parse(content, env); let isTable = false; let colIndex = 0; let rowIndex = 0; for (const token of tableTokens) { if (token.type === "table_open") isTable = true; if (token.type === "table_close") isTable = false; if (!isTable) continue; if (token.type === "tr_open") { rowIndex++; colIndex = 0; } if (token.type === "th_open" || token.type === "td_open") { colIndex++; const classes = cells[rowIndex]?.[colIndex] || rows[rowIndex] || cols[colIndex]; if (classes) token.attrJoin("class", classes); } } return `${md.renderer.render(tableTokens, opt, env)}`; }); } function parseHl(hl) { const res = {}; if (!hl) return res; hl.split(";").forEach((item) => { const [key, value = "1"] = item.split(":"); String(value).split(",").forEach((v) => res[v.trim()] = key.trim()); }); return res; } function parseHlCells(hl) { const res = {}; if (!hl) return res; hl.split(";").forEach((item) => { const [key, value = ""] = item.split(":"); value.trim().replace(/\s*\((\d+)\s*,\s*(\d+)\)\s*/g, (_, row, col) => { res[row] ??= {}; res[row][col] = key.trim(); return ""; }); }); return res; } //#endregion //#region src/node/container/tabs.ts const tabs = (md) => { tab(md, { name: "tabs", openRender: ({ active, data }, tokens, index, _, env) => { const { meta } = tokens[index]; const titles = data.map(({ title }) => md.renderInline(title, cleanMarkdownEnv(env))); const tabsData = data.map((item, dataIndex) => { const { id = titles[dataIndex] } = item; return { id }; }); return ` ${titles.map((title, titleIndex) => ``).join("")}`; }, closeRender: () => ``, tabOpenRender: ({ index }) => `` }); }; //#endregion //#region src/node/container/timeline.ts const RE_KEY = /(\w+)=\s*/; const RE_SEARCH_KEY = /\s+\w+=\s*|$/; const RE_CLEAN_VALUE = /(?["'])(.*?)(\k)/; function timelinePlugin(md) { createContainerPlugin(md, "timeline", { before(info, tokens, index) { parseTimeline(tokens, index); const { attrs: attrs$1 } = resolveAttrs(info); attrs$1.card ??= void 0; return ``; }, after: () => "" }); md.renderer.rules.timeline_item_open = (tokens, idx) => { const attrs$1 = tokens[idx].meta; attrs$1.card ??= void 0; const icon = attrs$1.icon; return `${icon ? `` : ""}`; }; md.renderer.rules.timeline_item_close = () => ""; md.renderer.rules.timeline_item_title_open = () => ""; } function parseTimeline(tokens, index) { const listStack = []; for (let i = index + 1; i < tokens.length; i++) { const token = tokens[i]; if (token.type === "container_timeline_close") break; if (token.type === "bullet_list_open") { listStack.push(0); if (listStack.length === 1) token.hidden = true; } else if (token.type === "bullet_list_close") { listStack.pop(); if (listStack.length === 0) token.hidden = true; } else if (token.type === "list_item_open") { if (listStack.length === 1) { token.type = "timeline_item_open"; tokens[i + 1].type = "timeline_item_title_open"; tokens[i + 3].type = "timeline_item_title_close"; const inlineToken = tokens[i + 2]; const softbreakIndex = inlineToken.children.findLastIndex((token$1) => token$1.type === "softbreak"); if (softbreakIndex !== -1) { const lastToken = inlineToken.children[inlineToken.children.length - 1]; token.meta = extractTimelineAttributes(lastToken.content.trim()); if (!isEmptyObject(token.meta)) inlineToken.children = inlineToken.children.slice(0, softbreakIndex); } else token.meta = {}; } } else if (token.type === "list_item_close") { if (listStack.length === 1) token.type = "timeline_item_close"; } } } function extractTimelineAttributes(rawText) { const attrKeys = [ "time", "type", "icon", "line", "color", "card", "placement" ]; const attrs$1 = {}; let buffer = rawText.trim(); while (buffer.length) { const keyMatch = buffer.match(RE_KEY); if (!keyMatch) break; const matchedKey = keyMatch[1].toLowerCase(); if (!attrKeys.includes(matchedKey)) break; const keyEnd = keyMatch.index + keyMatch[0].length; buffer = buffer.slice(keyEnd); let valueEnd = buffer.search(RE_SEARCH_KEY); /* istanbul ignore if -- @preserve */ if (valueEnd === -1) valueEnd = buffer.length; attrs$1[matchedKey] = buffer.slice(0, valueEnd).trim().replace(RE_CLEAN_VALUE, "$2"); buffer = buffer.slice(valueEnd); } return attrs$1; } //#endregion //#region src/node/container/index.ts async function containerPlugin(app, md, options) { alignPlugin(md); tabs(md); codeTabs(md, options.codeTabs); demoWrapperPlugin(md); stepsPlugin(md); cardPlugin(md); if (options.npmTo) npmToPlugins(md, typeof options.npmTo === "boolean" ? {} : options.npmTo); if (options.repl) await langReplPlugin(app, md, options.repl); if (options.fileTree) fileTreePlugin(md, isPlainObject(options.fileTree) ? options.fileTree : {}); if (options.codeTree) codeTreePlugin(md, app, isPlainObject(options.codeTree) ? options.codeTree : {}); if (options.timeline) timelinePlugin(md); if (options.collapse) collapsePlugin(md); if (options.chat) chatPlugin(md); if (options.field) fieldPlugin(md); if (options.table) tablePlugin(md, isPlainObject(options.table) ? options.table : {}); } //#endregion //#region src/node/demo/markdown.ts function markdownEmbed(app, md, env, { url, title, desc, codeSetting = "", expanded = false }) { const filepath$1 = findFile(app, env, url); const code = readFileSync(filepath$1); if (code === false) { logger$1.warn("demo-markdown", `Cannot read markdown file: ${colors.gray(filepath$1)}\n at: ${colors.gray(env.filePathRelative || "")}`); return ""; } const demo = { type: "markdown", path: filepath$1 }; env.demoFiles ??= []; if (!env.demoFiles.some((d) => d.path === filepath$1)) env.demoFiles.push(demo); return ` ${md.render(code, { filepath: env.filePath, filepathRelative: env.filePathRelative })} `; } const markdownContainerRender = { before(app, md, env, meta, codeMap) { const { title, desc, expanded = false } = meta; const code = codeMap.md || ""; return ` ${md.render(code, { filepath: env.filePath, filepathRelative: env.filePathRelative })} " }; //#endregion //#region src/node/utils/package.ts async function interopDefault(m) { const resolved = await m; return resolved.default || resolved; } //#endregion //#region src/node/demo/supports/compiler.ts const cache = new LRUCache({ max: 64 }); const compiler = { script: importer(async () => { const { transform } = await import("esbuild"); return transform; }), less: importer(() => import("less")), sass: importer(async () => { if (isPackageExists("sass-embedded")) return await import("sass-embedded"); return await import("sass"); }), stylus: importer(() => import("stylus")) }; async function compileScript(source, type) { const key = `${type}:::${source}`; if (cache.has(key)) return cache.get(key); const res = await (await compiler.script())(source, { target: "es2018", platform: "browser", format: "cjs", loader: type === "ts" ? "ts" : "js", sourcemap: false }); cache.set(key, res.code); return res.code; } async function compileStyle(source, type) { const key = `${type}:::${source}`; if (cache.has(key)) return cache.get(key); if (type === "css") return source; if (type === "less") { const res = await (await compiler.less()).render(source); cache.set(key, res.css); return res.css; } if (type === "scss") { const res = (await compiler.sass()).compileString(source); cache.set(key, res.css); return res.css; } if (type === "stylus") { const res = (await compiler.stylus()).render(source); cache.set(key, res); return res; } return source; } function importer(func) { let imported; return async () => { if (!imported) imported = interopDefault(await func()); return imported; }; } //#endregion //#region src/node/demo/supports/insertScript.ts const SCRIPT_RE$1 = //; function insertSetupScript({ export: name, path: path$3 }, env) { const imports = `import ${name ? `${name} from ` : ""}'${path$3}';`; const scriptSetup = env.sfcBlocks.scriptSetup ??= { type: "script", content: "