vuepress-plugin-md-power 1.0.0-rc.120 → 1.0.0-rc.122
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/client/components/ArtPlayer.vue +160 -0
- package/lib/client/options.d.ts +7 -1
- package/lib/client/options.js +17 -0
- package/lib/node/index.d.ts +17 -1
- package/lib/node/index.js +99 -3
- package/lib/shared/index.d.ts +17 -1
- package/package.json +28 -8
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import type ArtPlayer from 'artplayer'
|
|
3
|
+
import type { Option as ArtPlayerInitOptions } from 'artplayer/types/option.js'
|
|
4
|
+
import { isLinkHttp } from '@vuepress/helper/client'
|
|
5
|
+
import { useCssVar } from '@vueuse/core'
|
|
6
|
+
import { onMounted, onUnmounted, ref, toRefs } from 'vue'
|
|
7
|
+
import { usePageLang, withBase } from 'vuepress/client'
|
|
8
|
+
import { useSize } from '../composables/size.js'
|
|
9
|
+
import { ART_PLAYER_SUPPORTED_VIDEO_TYPES, installed } from '../options.js'
|
|
10
|
+
import Loading from './icons/Loading.vue'
|
|
11
|
+
|
|
12
|
+
type CustomType = Record<string, (this: ArtPlayer, video: HTMLVideoElement, url: string, art: ArtPlayer) => any>
|
|
13
|
+
|
|
14
|
+
const props = withDefaults(defineProps<{
|
|
15
|
+
src: string
|
|
16
|
+
type?: string
|
|
17
|
+
width?: string
|
|
18
|
+
height?: string
|
|
19
|
+
ratio?: string
|
|
20
|
+
} & Omit<ArtPlayerInitOptions, 'container' | 'url' | 'type'>>(), {
|
|
21
|
+
hotkey: true,
|
|
22
|
+
mutex: true,
|
|
23
|
+
playsInline: true,
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
const loaded = ref(false)
|
|
27
|
+
const lang = usePageLang()
|
|
28
|
+
const brandColor = useCssVar('--vp-c-brand-1')
|
|
29
|
+
const { el, width, height, resize } = useSize<HTMLDivElement>(toRefs(props))
|
|
30
|
+
|
|
31
|
+
let player: ArtPlayer | null = null
|
|
32
|
+
|
|
33
|
+
async function createPlayer() {
|
|
34
|
+
if (!el.value)
|
|
35
|
+
return
|
|
36
|
+
|
|
37
|
+
loaded.value = false
|
|
38
|
+
const { default: ArtPlayer } = await import(
|
|
39
|
+
/* webpackChunkName: "artplayer" */ 'artplayer'
|
|
40
|
+
)
|
|
41
|
+
loaded.value = true
|
|
42
|
+
const { src, type: _t, width: _w, height: _h, ratio: _r, ...opt } = props
|
|
43
|
+
const { customType = {}, ...options } = opt
|
|
44
|
+
Object.keys(options).forEach((key) => {
|
|
45
|
+
if (typeof options[key] === 'undefined') {
|
|
46
|
+
delete options[key]
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
const type = props.type ?? src.split('.').pop() ?? ''
|
|
50
|
+
const url = isLinkHttp(src) ? src : withBase(src)
|
|
51
|
+
|
|
52
|
+
if (!ART_PLAYER_SUPPORTED_VIDEO_TYPES.includes(type)) {
|
|
53
|
+
console.error(`Unsupported video type: ${type}`)
|
|
54
|
+
return
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
player = new ArtPlayer({
|
|
58
|
+
container: el.value,
|
|
59
|
+
url,
|
|
60
|
+
type,
|
|
61
|
+
...{
|
|
62
|
+
lang: lang.value.split('-')[0] === 'zh' ? 'zh-cn' : 'en',
|
|
63
|
+
volume: 0.75,
|
|
64
|
+
useSSR: false,
|
|
65
|
+
theme: brandColor.value ?? '#5086a1',
|
|
66
|
+
},
|
|
67
|
+
...options,
|
|
68
|
+
customType: {
|
|
69
|
+
...initCustomType(type),
|
|
70
|
+
...customType,
|
|
71
|
+
},
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function initCustomType(type: string): CustomType {
|
|
76
|
+
const customType: CustomType = {}
|
|
77
|
+
|
|
78
|
+
if ((type === 'mpd' || type === 'dash') && installed.dashjs) {
|
|
79
|
+
customType[type] = async function (video, url, art) {
|
|
80
|
+
const dashjs = (await import(/* webpackChunkName: "dashjs" */ 'dashjs')).default
|
|
81
|
+
if (dashjs.supportsMediaSource()) {
|
|
82
|
+
const dashPlayer = dashjs.MediaPlayer().create()
|
|
83
|
+
dashPlayer.initialize(video, url, props.autoplay, 0)
|
|
84
|
+
art.on('destroy', () => dashPlayer.destroy())
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (type === 'm3u8' || type === 'hls') {
|
|
90
|
+
customType[type] = async function (video, url, art) {
|
|
91
|
+
if (video.canPlayType('application/x-mpegURL')
|
|
92
|
+
|| video.canPlayType('application/vnd.apple.mpegURL')) {
|
|
93
|
+
video.src = url
|
|
94
|
+
return
|
|
95
|
+
}
|
|
96
|
+
if (!installed.hlsjs)
|
|
97
|
+
return
|
|
98
|
+
|
|
99
|
+
const Hls = (await import(/* webpackChunkName: "hls.js" */ 'hls.js')).default
|
|
100
|
+
if (Hls.isSupported()) {
|
|
101
|
+
const hls = new Hls()
|
|
102
|
+
hls.attachMedia(video)
|
|
103
|
+
hls.on(Hls.Events.MEDIA_ATTACHED, () => hls.loadSource(url))
|
|
104
|
+
art.on('destroy', () => hls.destroy())
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if ((type === 'ts' || type === 'flv') && installed.mpegtsjs) {
|
|
110
|
+
customType[type] = async function (video, url, art) {
|
|
111
|
+
const mpegts = (await import(/* webpackChunkName: "mpegts.js" */ 'mpegts.js/dist/mpegts.js')).default
|
|
112
|
+
if (mpegts.isSupported()) {
|
|
113
|
+
const flv = mpegts.createPlayer({ type: 'flv', url })
|
|
114
|
+
|
|
115
|
+
flv.attachMediaElement(video)
|
|
116
|
+
flv.load()
|
|
117
|
+
art.on('destroy', () => flv.destroy())
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return customType
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
onMounted(async () => {
|
|
126
|
+
await createPlayer()
|
|
127
|
+
resize()
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
onUnmounted(() => {
|
|
131
|
+
player?.destroy()
|
|
132
|
+
player = null
|
|
133
|
+
})
|
|
134
|
+
</script>
|
|
135
|
+
|
|
136
|
+
<template>
|
|
137
|
+
<div class="vp-artplayer-wrapper">
|
|
138
|
+
<div ref="el" class="vp-artplayer" :style="{ width, height }" />
|
|
139
|
+
<Loading v-if="!loaded" absolute />
|
|
140
|
+
</div>
|
|
141
|
+
</template>
|
|
142
|
+
|
|
143
|
+
<style>
|
|
144
|
+
.vp-artplayer-wrapper {
|
|
145
|
+
position: relative;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.vp-artplayer {
|
|
149
|
+
margin: 16px 0;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
@media (min-width: 768px) {
|
|
153
|
+
.vp-artplayer {
|
|
154
|
+
overflow: hidden;
|
|
155
|
+
border-radius: 8px;
|
|
156
|
+
box-shadow: var(--vp-shadow-2);
|
|
157
|
+
transition: box-shadow var(--vp-t-color);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
</style>
|
package/lib/client/options.d.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { MarkdownPowerPluginOptions } from '../shared/index.js';
|
|
2
2
|
|
|
3
3
|
declare const pluginOptions: MarkdownPowerPluginOptions;
|
|
4
|
+
declare const installed: {
|
|
5
|
+
dashjs: boolean;
|
|
6
|
+
hlsjs: boolean;
|
|
7
|
+
mpegtsjs: boolean;
|
|
8
|
+
};
|
|
9
|
+
declare const ART_PLAYER_SUPPORTED_VIDEO_TYPES: string[];
|
|
4
10
|
|
|
5
|
-
export { pluginOptions };
|
|
11
|
+
export { ART_PLAYER_SUPPORTED_VIDEO_TYPES, installed, pluginOptions };
|
package/lib/client/options.js
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
// src/client/options.ts
|
|
2
2
|
var pluginOptions = __MD_POWER_INJECT_OPTIONS__;
|
|
3
|
+
var installed = {
|
|
4
|
+
dashjs: __MD_POWER_DASHJS_INSTALLED__,
|
|
5
|
+
hlsjs: __MD_POWER_HLSJS_INSTALLED__,
|
|
6
|
+
mpegtsjs: __MD_POWER_MPEGTSJS_INSTALLED__
|
|
7
|
+
};
|
|
8
|
+
var ART_PLAYER_SUPPORTED_VIDEO_TYPES = ["mp4", "mp3", "webm", "ogg"];
|
|
9
|
+
if (installed.dashjs) {
|
|
10
|
+
ART_PLAYER_SUPPORTED_VIDEO_TYPES.push("mpd", "dash");
|
|
11
|
+
}
|
|
12
|
+
if (installed.hlsjs) {
|
|
13
|
+
ART_PLAYER_SUPPORTED_VIDEO_TYPES.push("m3u8", "hls");
|
|
14
|
+
}
|
|
15
|
+
if (installed.mpegtsjs) {
|
|
16
|
+
ART_PLAYER_SUPPORTED_VIDEO_TYPES.push("ts", "flv");
|
|
17
|
+
}
|
|
3
18
|
export {
|
|
19
|
+
ART_PLAYER_SUPPORTED_VIDEO_TYPES,
|
|
20
|
+
installed,
|
|
4
21
|
pluginOptions
|
|
5
22
|
};
|
package/lib/node/index.d.ts
CHANGED
|
@@ -200,6 +200,12 @@ interface MarkdownPowerPluginOptions {
|
|
|
200
200
|
* @default false
|
|
201
201
|
*/
|
|
202
202
|
youtube?: boolean;
|
|
203
|
+
/**
|
|
204
|
+
* 是否启用 artPlayer 视频嵌入
|
|
205
|
+
*
|
|
206
|
+
* `@[artPlayer](url)`
|
|
207
|
+
*/
|
|
208
|
+
artPlayer?: boolean;
|
|
203
209
|
/**
|
|
204
210
|
* 是否启用 codepen 嵌入
|
|
205
211
|
*
|
|
@@ -295,6 +301,16 @@ interface YoutubeTokenMeta extends SizeOptions {
|
|
|
295
301
|
start?: string | number;
|
|
296
302
|
end?: string | number;
|
|
297
303
|
}
|
|
304
|
+
interface ArtPlayerTokenMeta extends SizeOptions {
|
|
305
|
+
muted?: boolean;
|
|
306
|
+
autoplay?: boolean;
|
|
307
|
+
autoMini?: boolean;
|
|
308
|
+
loop?: boolean;
|
|
309
|
+
volume?: number;
|
|
310
|
+
poster?: string;
|
|
311
|
+
url: string;
|
|
312
|
+
type?: string;
|
|
313
|
+
}
|
|
298
314
|
|
|
299
315
|
interface ImgSize {
|
|
300
316
|
width: number;
|
|
@@ -304,4 +320,4 @@ declare function resolveImageSize(app: App, url: string, remote?: boolean): Prom
|
|
|
304
320
|
|
|
305
321
|
declare function markdownPowerPlugin(options?: MarkdownPowerPluginOptions): Plugin;
|
|
306
322
|
|
|
307
|
-
export { type BilibiliTokenMeta, type CanIUseMode, type CanIUseOptions, type CanIUseTokenMeta, type CodeSandboxTokenMeta, type CodeTabsOptions, type CodepenTokenMeta, type FileTreeIconMode, type FileTreeOptions, type IconsOptions, type JSFiddleTokenMeta, type MarkdownPowerPluginOptions, type NpmToOptions, type NpmToPackageManager, type PDFEmbedType, type PDFOptions, type PDFTokenMeta, type PlotOptions, type ReplEditorData, type ReplOptions, type ReplitTokenMeta, type SizeOptions, type ThemeOptions, type VideoOptions, type YoutubeTokenMeta, markdownPowerPlugin, resolveImageSize };
|
|
323
|
+
export { type ArtPlayerTokenMeta, type BilibiliTokenMeta, type CanIUseMode, type CanIUseOptions, type CanIUseTokenMeta, type CodeSandboxTokenMeta, type CodeTabsOptions, type CodepenTokenMeta, type FileTreeIconMode, type FileTreeOptions, type IconsOptions, type JSFiddleTokenMeta, type MarkdownPowerPluginOptions, type NpmToOptions, type NpmToPackageManager, type PDFEmbedType, type PDFOptions, type PDFTokenMeta, type PlotOptions, type ReplEditorData, type ReplOptions, type ReplitTokenMeta, type SizeOptions, type ThemeOptions, type VideoOptions, type YoutubeTokenMeta, markdownPowerPlugin, resolveImageSize };
|
package/lib/node/index.js
CHANGED
|
@@ -212,6 +212,7 @@ async function resolveImageSize(app, url, remote = false) {
|
|
|
212
212
|
|
|
213
213
|
// src/node/plugin.ts
|
|
214
214
|
import { addViteOptimizeDepsInclude } from "@vuepress/helper";
|
|
215
|
+
import { isPackageExists as isPackageExists2 } from "local-pkg";
|
|
215
216
|
|
|
216
217
|
// src/node/container/index.ts
|
|
217
218
|
import { isPlainObject as isPlainObject2 } from "@vuepress/helper";
|
|
@@ -255,6 +256,18 @@ function cardPlugin(md) {
|
|
|
255
256
|
before: () => "<VPCardGrid>",
|
|
256
257
|
after: () => "</VPCardGrid>"
|
|
257
258
|
});
|
|
259
|
+
createContainerPlugin(md, "card-masonry", {
|
|
260
|
+
before: (info) => {
|
|
261
|
+
const { attrs: attrs2 } = resolveAttrs(info);
|
|
262
|
+
let cols;
|
|
263
|
+
if (attrs2.cols) {
|
|
264
|
+
cols = attrs2.cols[0] === "{" ? attrs2.cols : Number.parseInt(`${attrs2.cols}`);
|
|
265
|
+
}
|
|
266
|
+
const gap = Number.parseInt(`${attrs2.gap}`);
|
|
267
|
+
return `<VPCardMasonry${cols ? ` :cols="${cols}"` : ""}${gap >= 0 ? ` :gap="${gap}"` : ""}>`;
|
|
268
|
+
},
|
|
269
|
+
after: () => "</VPCardMasonry>"
|
|
270
|
+
});
|
|
258
271
|
}
|
|
259
272
|
|
|
260
273
|
// src/node/container/codeTabs.ts
|
|
@@ -1995,8 +2008,8 @@ var codeSandboxPlugin = (md) => {
|
|
|
1995
2008
|
filepath: filepath2
|
|
1996
2009
|
};
|
|
1997
2010
|
},
|
|
1998
|
-
content({ title, height, width, user, id, type: type2, filepath: filepath2, console, navbar, layout }) {
|
|
1999
|
-
return `<CodeSandboxViewer title="${title}" height="${height}" width="${width}" user="${user}" id="${id}" type="${type2}" filepath="${filepath2}" :console=${
|
|
2011
|
+
content({ title, height, width, user, id, type: type2, filepath: filepath2, console: console2, navbar, layout }) {
|
|
2012
|
+
return `<CodeSandboxViewer title="${title}" height="${height}" width="${width}" user="${user}" id="${id}" type="${type2}" filepath="${filepath2}" :console=${console2} :navbar=${navbar} layout="${layout}" />`;
|
|
2000
2013
|
}
|
|
2001
2014
|
});
|
|
2002
2015
|
};
|
|
@@ -2075,6 +2088,71 @@ var pdfPlugin = (md) => {
|
|
|
2075
2088
|
});
|
|
2076
2089
|
};
|
|
2077
2090
|
|
|
2091
|
+
// src/node/embed/video/artPlayer.ts
|
|
2092
|
+
import { isPackageExists } from "local-pkg";
|
|
2093
|
+
import { colors } from "vuepress/utils";
|
|
2094
|
+
var installed = {
|
|
2095
|
+
dashjs: isPackageExists("dashjs"),
|
|
2096
|
+
hlsjs: isPackageExists("hls.js"),
|
|
2097
|
+
mpegtsjs: isPackageExists("mpegts.js")
|
|
2098
|
+
};
|
|
2099
|
+
var SUPPORTED_VIDEO_TYPES = ["mp4", "mp3", "webm", "ogg", "mpd", "dash", "m3u8", "hls", "ts", "flv"];
|
|
2100
|
+
var artPlayerPlugin = (md) => {
|
|
2101
|
+
createEmbedRuleBlock(md, {
|
|
2102
|
+
type: "artPlayer",
|
|
2103
|
+
name: "video_artPlayer",
|
|
2104
|
+
syntaxPattern: /^@\[artPlayer([^\]]*)\]\(([^)]*)\)/,
|
|
2105
|
+
meta([, info, source]) {
|
|
2106
|
+
const { attrs: attrs2 } = resolveAttrs(info);
|
|
2107
|
+
const url = source.trim();
|
|
2108
|
+
checkSupportType(attrs2.type ?? url.split(".").pop());
|
|
2109
|
+
return {
|
|
2110
|
+
autoplay: attrs2.autoplay ?? false,
|
|
2111
|
+
muted: attrs2.muted ?? attrs2.autoplay ?? false,
|
|
2112
|
+
autoMini: attrs2.autoMini ?? false,
|
|
2113
|
+
loop: attrs2.loop ?? false,
|
|
2114
|
+
volume: typeof attrs2.volume !== "undefined" ? Number(attrs2.volume) : 0.75,
|
|
2115
|
+
poster: attrs2.poster,
|
|
2116
|
+
width: attrs2.width ? parseRect(attrs2.width) : "100%",
|
|
2117
|
+
height: attrs2.height ? parseRect(attrs2.height) : "",
|
|
2118
|
+
ratio: attrs2.ratio ? parseRect(`${attrs2.ratio}`) : "",
|
|
2119
|
+
type: attrs2.type,
|
|
2120
|
+
url
|
|
2121
|
+
};
|
|
2122
|
+
},
|
|
2123
|
+
content({ autoMini, autoplay, loop, muted, poster, url, type: type2, volume, width, height, ratio }) {
|
|
2124
|
+
return `<ArtPlayer src="${url}" fullscreen flip playback-rate aspect-ratio setting pip ${loop ? " loop" : ""}${type2 ? ` type="${type2}"` : ""}${autoMini ? " auto-min" : ""}${autoplay ? " autoplay" : ""}${muted || autoplay ? " muted" : ""}${poster ? ` poster="${poster}"` : ""} :volume="${volume}" width="${width}"${height ? ` height="${height}"` : ""}${ratio ? ` ratio="${ratio}"` : ""}/>`;
|
|
2125
|
+
}
|
|
2126
|
+
});
|
|
2127
|
+
};
|
|
2128
|
+
function checkSupportType(type2) {
|
|
2129
|
+
if (!type2)
|
|
2130
|
+
return;
|
|
2131
|
+
if (SUPPORTED_VIDEO_TYPES.includes(type2)) {
|
|
2132
|
+
let name = "";
|
|
2133
|
+
switch (type2.toLowerCase()) {
|
|
2134
|
+
case "m3u8":
|
|
2135
|
+
case "hls":
|
|
2136
|
+
name = !installed.hlsjs ? "hls.js" : "";
|
|
2137
|
+
break;
|
|
2138
|
+
case "flv":
|
|
2139
|
+
case "ts": {
|
|
2140
|
+
name = !installed.mpegtsjs ? "mpegts.js" : "";
|
|
2141
|
+
break;
|
|
2142
|
+
}
|
|
2143
|
+
case "mpd":
|
|
2144
|
+
case "dash":
|
|
2145
|
+
name = !installed.dashjs ? "dashjs" : "";
|
|
2146
|
+
break;
|
|
2147
|
+
}
|
|
2148
|
+
if (name) {
|
|
2149
|
+
console.warn(`${colors.yellow("[vuepress-plugin-md-power] artPlayer: ")} ${colors.cyan(name)} is not installed, please install it via npm or yarn or pnpm`);
|
|
2150
|
+
}
|
|
2151
|
+
} else {
|
|
2152
|
+
console.warn(`${colors.yellow("[vuepress-plugin-md-power] artPlayer: ")} unsupported video type: ${colors.cyan(type2)}`);
|
|
2153
|
+
}
|
|
2154
|
+
}
|
|
2155
|
+
|
|
2078
2156
|
// src/node/embed/video/bilibili.ts
|
|
2079
2157
|
import { URLSearchParams as URLSearchParams2 } from "node:url";
|
|
2080
2158
|
|
|
@@ -2196,6 +2274,9 @@ function embedSyntaxPlugin(md, options) {
|
|
|
2196
2274
|
if (options.youtube) {
|
|
2197
2275
|
md.use(youtubePlugin);
|
|
2198
2276
|
}
|
|
2277
|
+
if (options.artPlayer) {
|
|
2278
|
+
md.use(artPlayerPlugin);
|
|
2279
|
+
}
|
|
2199
2280
|
if (options.codepen) {
|
|
2200
2281
|
md.use(codepenPlugin);
|
|
2201
2282
|
}
|
|
@@ -2419,6 +2500,10 @@ async function prepareConfigFile(app, options) {
|
|
|
2419
2500
|
imports.add(`import FileTreeItem from '${CLIENT_FOLDER}components/FileTreeItem.vue'`);
|
|
2420
2501
|
enhances.add(`app.component('FileTreeItem', FileTreeItem)`);
|
|
2421
2502
|
}
|
|
2503
|
+
if (options.artPlayer) {
|
|
2504
|
+
imports.add(`import ArtPlayer from '${CLIENT_FOLDER}components/ArtPlayer.vue'`);
|
|
2505
|
+
enhances.add(`app.component('ArtPlayer', ArtPlayer)`);
|
|
2506
|
+
}
|
|
2422
2507
|
return app.writeTemp(
|
|
2423
2508
|
"md-power/config.js",
|
|
2424
2509
|
`import { defineClientConfig } from 'vuepress/client'
|
|
@@ -2441,7 +2526,10 @@ function markdownPowerPlugin(options = {}) {
|
|
|
2441
2526
|
name: "vuepress-plugin-md-power",
|
|
2442
2527
|
clientConfigFile: (app) => prepareConfigFile(app, options),
|
|
2443
2528
|
define: {
|
|
2444
|
-
__MD_POWER_INJECT_OPTIONS__: options
|
|
2529
|
+
__MD_POWER_INJECT_OPTIONS__: options,
|
|
2530
|
+
__MD_POWER_DASHJS_INSTALLED__: isPackageExists2("dashjs"),
|
|
2531
|
+
__MD_POWER_HLSJS_INSTALLED__: isPackageExists2("hls.js"),
|
|
2532
|
+
__MD_POWER_MPEGTSJS_INSTALLED__: isPackageExists2("mpegts.js")
|
|
2445
2533
|
},
|
|
2446
2534
|
extendsBundlerOptions(bundlerOptions, app) {
|
|
2447
2535
|
if (options.repl) {
|
|
@@ -2451,6 +2539,13 @@ function markdownPowerPlugin(options = {}) {
|
|
|
2451
2539
|
["shiki/core", "shiki/wasm", "shiki/engine/oniguruma"]
|
|
2452
2540
|
);
|
|
2453
2541
|
}
|
|
2542
|
+
if (options.artPlayer) {
|
|
2543
|
+
addViteOptimizeDepsInclude(
|
|
2544
|
+
bundlerOptions,
|
|
2545
|
+
app,
|
|
2546
|
+
["artplayer", "dashjs", "hls.js", "mpegts.js"]
|
|
2547
|
+
);
|
|
2548
|
+
}
|
|
2454
2549
|
},
|
|
2455
2550
|
extendsMarkdown: async (md, app) => {
|
|
2456
2551
|
docsTitlePlugin(md);
|
|
@@ -2466,3 +2561,4 @@ export {
|
|
|
2466
2561
|
resolveImageSize
|
|
2467
2562
|
};
|
|
2468
2563
|
/* istanbul ignore if -- @preserve */
|
|
2564
|
+
/* istanbul ignore next -- @preserve */
|
package/lib/shared/index.d.ts
CHANGED
|
@@ -198,6 +198,12 @@ interface MarkdownPowerPluginOptions {
|
|
|
198
198
|
* @default false
|
|
199
199
|
*/
|
|
200
200
|
youtube?: boolean;
|
|
201
|
+
/**
|
|
202
|
+
* 是否启用 artPlayer 视频嵌入
|
|
203
|
+
*
|
|
204
|
+
* `@[artPlayer](url)`
|
|
205
|
+
*/
|
|
206
|
+
artPlayer?: boolean;
|
|
201
207
|
/**
|
|
202
208
|
* 是否启用 codepen 嵌入
|
|
203
209
|
*
|
|
@@ -293,5 +299,15 @@ interface YoutubeTokenMeta extends SizeOptions {
|
|
|
293
299
|
start?: string | number;
|
|
294
300
|
end?: string | number;
|
|
295
301
|
}
|
|
302
|
+
interface ArtPlayerTokenMeta extends SizeOptions {
|
|
303
|
+
muted?: boolean;
|
|
304
|
+
autoplay?: boolean;
|
|
305
|
+
autoMini?: boolean;
|
|
306
|
+
loop?: boolean;
|
|
307
|
+
volume?: number;
|
|
308
|
+
poster?: string;
|
|
309
|
+
url: string;
|
|
310
|
+
type?: string;
|
|
311
|
+
}
|
|
296
312
|
|
|
297
|
-
export type { BilibiliTokenMeta, CanIUseMode, CanIUseOptions, CanIUseTokenMeta, CodeSandboxTokenMeta, CodeTabsOptions, CodepenTokenMeta, FileTreeIconMode, FileTreeOptions, IconsOptions, JSFiddleTokenMeta, MarkdownPowerPluginOptions, NpmToOptions, NpmToPackageManager, PDFEmbedType, PDFOptions, PDFTokenMeta, PlotOptions, ReplEditorData, ReplOptions, ReplitTokenMeta, SizeOptions, ThemeOptions, VideoOptions, YoutubeTokenMeta };
|
|
313
|
+
export type { ArtPlayerTokenMeta, BilibiliTokenMeta, CanIUseMode, CanIUseOptions, CanIUseTokenMeta, CodeSandboxTokenMeta, CodeTabsOptions, CodepenTokenMeta, FileTreeIconMode, FileTreeOptions, IconsOptions, JSFiddleTokenMeta, MarkdownPowerPluginOptions, NpmToOptions, NpmToPackageManager, PDFEmbedType, PDFOptions, PDFTokenMeta, PlotOptions, ReplEditorData, ReplOptions, ReplitTokenMeta, SizeOptions, ThemeOptions, VideoOptions, YoutubeTokenMeta };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vuepress-plugin-md-power",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.0.0-rc.
|
|
4
|
+
"version": "1.0.0-rc.122",
|
|
5
5
|
"description": "The Plugin for VuePress 2 - markdown power",
|
|
6
6
|
"author": "pengzhanbo <volodymyr@foxmail.com>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -31,12 +31,28 @@
|
|
|
31
31
|
"lib"
|
|
32
32
|
],
|
|
33
33
|
"peerDependencies": {
|
|
34
|
+
"artplayer": "^5.2.0",
|
|
35
|
+
"dashjs": "^4.7.4",
|
|
36
|
+
"hls.js": "^1.5.18",
|
|
34
37
|
"markdown-it": "^14.0.0",
|
|
35
|
-
"
|
|
38
|
+
"mpegts.js": "^1.7.3",
|
|
39
|
+
"vuepress": "2.0.0-rc.19"
|
|
36
40
|
},
|
|
37
41
|
"peerDependenciesMeta": {
|
|
42
|
+
"artplayer": {
|
|
43
|
+
"optional": true
|
|
44
|
+
},
|
|
45
|
+
"dashjs": {
|
|
46
|
+
"optional": true
|
|
47
|
+
},
|
|
48
|
+
"hls.js": {
|
|
49
|
+
"optional": true
|
|
50
|
+
},
|
|
38
51
|
"markdown-it": {
|
|
39
52
|
"optional": true
|
|
53
|
+
},
|
|
54
|
+
"mpegts.js": {
|
|
55
|
+
"optional": true
|
|
40
56
|
}
|
|
41
57
|
},
|
|
42
58
|
"dependencies": {
|
|
@@ -47,19 +63,23 @@
|
|
|
47
63
|
"@mdit/plugin-sup": "^0.14.0",
|
|
48
64
|
"@mdit/plugin-tab": "^0.14.0",
|
|
49
65
|
"@mdit/plugin-tasklist": "^0.14.0",
|
|
50
|
-
"@vuepress/helper": "2.0.0-rc.
|
|
66
|
+
"@vuepress/helper": "2.0.0-rc.66",
|
|
51
67
|
"@vueuse/core": "^12.0.0",
|
|
52
|
-
"image-size": "^1.
|
|
68
|
+
"image-size": "^1.2.0",
|
|
53
69
|
"local-pkg": "^0.5.1",
|
|
54
70
|
"markdown-it-container": "^4.0.0",
|
|
55
71
|
"nanoid": "^5.0.9",
|
|
56
|
-
"shiki": "^1.24.
|
|
57
|
-
"tm-grammars": "^1.21.
|
|
58
|
-
"tm-themes": "^1.9.
|
|
72
|
+
"shiki": "^1.24.4",
|
|
73
|
+
"tm-grammars": "^1.21.9",
|
|
74
|
+
"tm-themes": "^1.9.5",
|
|
59
75
|
"vue": "^3.5.13"
|
|
60
76
|
},
|
|
61
77
|
"devDependencies": {
|
|
62
|
-
"@types/markdown-it": "^14.1.2"
|
|
78
|
+
"@types/markdown-it": "^14.1.2",
|
|
79
|
+
"artplayer": "^5.2.1",
|
|
80
|
+
"dashjs": "^4.7.4",
|
|
81
|
+
"hls.js": "^1.5.18",
|
|
82
|
+
"mpegts.js": "^1.7.3"
|
|
63
83
|
},
|
|
64
84
|
"publishConfig": {
|
|
65
85
|
"access": "public"
|