From 94d7578ae4d1e4f9b17eadcc50515a85fc91a03a Mon Sep 17 00:00:00 2001 From: Mister-Hope Date: Fri, 25 Oct 2024 02:36:11 +0800 Subject: [PATCH] feat: add plugin-markdown-include --- .../plugin-markdown-include/package.json | 55 +++++++++++++++++++ .../plugin-markdown-include/rollup.config.ts | 5 ++ .../plugin-markdown-include/src/node/index.ts | 2 + .../src/node/markdownIncludePlugin.ts | 40 ++++++++++++++ .../src/node/options.ts | 6 ++ .../tsconfig.build.json | 9 +++ pnpm-lock.yaml | 30 ++++++++++ tsconfig.build.json | 3 + 8 files changed, 150 insertions(+) create mode 100644 plugins/markdown/plugin-markdown-include/package.json create mode 100644 plugins/markdown/plugin-markdown-include/rollup.config.ts create mode 100644 plugins/markdown/plugin-markdown-include/src/node/index.ts create mode 100644 plugins/markdown/plugin-markdown-include/src/node/markdownIncludePlugin.ts create mode 100644 plugins/markdown/plugin-markdown-include/src/node/options.ts create mode 100644 plugins/markdown/plugin-markdown-include/tsconfig.build.json diff --git a/plugins/markdown/plugin-markdown-include/package.json b/plugins/markdown/plugin-markdown-include/package.json new file mode 100644 index 0000000000..f0246a537b --- /dev/null +++ b/plugins/markdown/plugin-markdown-include/package.json @@ -0,0 +1,55 @@ +{ + "name": "@vuepress/plugin-markdown-include", + "version": "2.0.0-rc.56", + "description": "VuePress plugin - markdown include", + "keywords": [ + "vuepress-plugin", + "vuepress", + "plugin", + "markdown", + "include" + ], + "homepage": "https://ecosystem.vuejs.press/plugins/markdown/markdown-include.html", + "bugs": { + "url": "https://github.com/vuepress/ecosystem/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/vuepress/ecosystem.git", + "directory": "plugins/markdown/plugin-markdown-include" + }, + "license": "MIT", + "author": { + "name": "Mr.Hope", + "email": "mister-hope@outlook.com", + "url": "https://mister-hope.com" + }, + "type": "module", + "exports": { + ".": "./lib/node/index.js", + "./figure.css": "./lib/client/styles/figure.css", + "./mark.css": "./lib/client/styles/mark.css", + "./package.json": "./package.json" + }, + "main": "./lib/node/index.js", + "types": "./lib/node/index.d.ts", + "files": [ + "lib" + ], + "scripts": { + "build": "tsc -b tsconfig.build.json", + "bundle": "rollup -c rollup.config.ts --configPlugin esbuild", + "clean": "rimraf --glob ./lib ./*.tsbuildinfo" + }, + "dependencies": { + "@mdit/plugin-include": "^0.13.1", + "@types/markdown-it": "^14.1.2", + "@vuepress/helper": "workspace:*" + }, + "peerDependencies": { + "vuepress": "2.0.0-rc.18" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/plugins/markdown/plugin-markdown-include/rollup.config.ts b/plugins/markdown/plugin-markdown-include/rollup.config.ts new file mode 100644 index 0000000000..c5946cd8be --- /dev/null +++ b/plugins/markdown/plugin-markdown-include/rollup.config.ts @@ -0,0 +1,5 @@ +import { rollupBundle } from '../../../scripts/rollup.js' + +export default rollupBundle('node/index', { + external: ['@mdit/plugin-include'], +}) diff --git a/plugins/markdown/plugin-markdown-include/src/node/index.ts b/plugins/markdown/plugin-markdown-include/src/node/index.ts new file mode 100644 index 0000000000..fe4d721970 --- /dev/null +++ b/plugins/markdown/plugin-markdown-include/src/node/index.ts @@ -0,0 +1,2 @@ +export * from './markdownIncludePlugin.js' +export type * from './options.js' diff --git a/plugins/markdown/plugin-markdown-include/src/node/markdownIncludePlugin.ts b/plugins/markdown/plugin-markdown-include/src/node/markdownIncludePlugin.ts new file mode 100644 index 0000000000..88ce73d2ec --- /dev/null +++ b/plugins/markdown/plugin-markdown-include/src/node/markdownIncludePlugin.ts @@ -0,0 +1,40 @@ +import type { IncludeEnv } from '@mdit/plugin-include' +import { include } from '@mdit/plugin-include' +import type { Plugin } from 'vuepress/core' +import type { MarkdownEnv } from 'vuepress/markdown' +import { path } from 'vuepress/utils' +import type { MarkdownIncludePluginOptions } from './options.js' + +export const markdownIncludePlugin = + (options: MarkdownIncludePluginOptions): Plugin => + (app) => { + const source = app.dir.source() + + return { + name: '@vuepress/plugin-markdown-include', + + extendsMarkdown: (md) => { + md.use(include, { + currentPath: (env: MarkdownEnv) => env.filePath, + ...options, + }) + }, + extendsPage: (page): void => { + const { markdownEnv, frontmatter, filePathRelative } = page + const { includedFiles = [] } = markdownEnv as IncludeEnv + + // mark included files as page deps + page.deps.push(...includedFiles) + + // add included files as git deps + ;((frontmatter.gitInclude as string[] | undefined) ??= []).push( + ...includedFiles.map((file) => + path.relative( + path.resolve(source, filePathRelative, '..'), + path.resolve(source, filePathRelative, file), + ), + ), + ) + }, + } + } diff --git a/plugins/markdown/plugin-markdown-include/src/node/options.ts b/plugins/markdown/plugin-markdown-include/src/node/options.ts new file mode 100644 index 0000000000..90ff319002 --- /dev/null +++ b/plugins/markdown/plugin-markdown-include/src/node/options.ts @@ -0,0 +1,6 @@ +import type { MarkdownItIncludeOptions } from '@mdit/plugin-include' + +export type MarkdownIncludePluginOptions = Omit< + MarkdownItIncludeOptions, + 'currentPath' +> diff --git a/plugins/markdown/plugin-markdown-include/tsconfig.build.json b/plugins/markdown/plugin-markdown-include/tsconfig.build.json new file mode 100644 index 0000000000..85b37d29a2 --- /dev/null +++ b/plugins/markdown/plugin-markdown-include/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "../../../tsconfig.build.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./lib" + }, + "include": ["./src"], + "references": [{ "path": "../../../tools/helper/tsconfig.build.json" }] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aeca364f1e..a95487c126 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -717,6 +717,21 @@ importers: specifier: 2.0.0-rc.18 version: 2.0.0-rc.18(@vuepress/bundler-vite@2.0.0-rc.18(@types/node@22.7.9)(jiti@1.21.6)(lightningcss@1.27.0)(sass-embedded@1.80.4)(sass@1.80.4)(terser@5.36.0)(tsx@4.19.1)(typescript@5.6.3)(yaml@2.4.5))(@vuepress/bundler-webpack@2.0.0-rc.18(esbuild@0.23.1)(typescript@5.6.3))(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3)) + plugins/markdown/plugin-markdown-include: + dependencies: + '@mdit/plugin-include': + specifier: ^0.13.1 + version: 0.13.1(markdown-it@14.1.0) + '@types/markdown-it': + specifier: ^14.1.2 + version: 14.1.2 + '@vuepress/helper': + specifier: workspace:* + version: link:../../../tools/helper + vuepress: + specifier: 2.0.0-rc.18 + version: 2.0.0-rc.18(@vuepress/bundler-vite@2.0.0-rc.18(@types/node@22.7.9)(jiti@1.21.6)(lightningcss@1.27.0)(sass-embedded@1.80.4)(sass@1.80.4)(terser@5.36.0)(tsx@4.19.1)(typescript@5.6.3)(yaml@2.4.5))(@vuepress/bundler-webpack@2.0.0-rc.18(esbuild@0.23.1)(typescript@5.6.3))(typescript@5.6.3)(vue@3.5.12(typescript@5.6.3)) + plugins/markdown/plugin-markdown-math: dependencies: '@mdit/plugin-katex-slim': @@ -2499,6 +2514,14 @@ packages: markdown-it: optional: true + '@mdit/plugin-include@0.13.1': + resolution: {integrity: sha512-rWGJ3/L2Ocv+8KDNoXPb6H1f+aLqx0FzJKcNqJl+0HOAEScuyKS1GC4OxeWefVMQ87QoG/mYqoCbpDsJeiDbLQ==} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + '@mdit/plugin-katex-slim@0.13.1': resolution: {integrity: sha512-OO4n51aLo0Igv0aICXOaTO5+ZW/jW8Lnl8u1kxs2zkFVNUqpqNHAo8l4QxtscQk5L4XhXGgaTj2ZgAv7rtH96Q==} engines: {node: '>= 18'} @@ -9911,6 +9934,13 @@ snapshots: optionalDependencies: markdown-it: 14.1.0 + '@mdit/plugin-include@0.13.1(markdown-it@14.1.0)': + dependencies: + '@types/markdown-it': 14.1.2 + upath: 2.0.1 + optionalDependencies: + markdown-it: 14.1.0 + '@mdit/plugin-katex-slim@0.13.1(katex@0.16.11)(markdown-it@14.1.0)': dependencies: '@mdit/plugin-tex': 0.13.1(markdown-it@14.1.0) diff --git a/tsconfig.build.json b/tsconfig.build.json index 32e9c295ed..c4a7ad3486 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -51,6 +51,9 @@ "path": "./plugins/markdown/plugin-markdown-hint/tsconfig.build.json" }, { "path": "./plugins/markdown/plugin-markdown-image/tsconfig.build.json" }, + { + "path": "./plugins/markdown/plugin-markdown-include/tsconfig.build.json" + }, { "path": "./plugins/markdown/plugin-markdown-math/tsconfig.build.json" }, { "path": "./plugins/markdown/plugin-markdown-stylize/tsconfig.build.json"