575 lines
16 KiB
TypeScript
575 lines
16 KiB
TypeScript
import Token from "markdown-it/lib/token.mjs";
|
||
import { App } from "vuepress";
|
||
import { Markdown, MarkdownEnv } from "vuepress/markdown";
|
||
import { BuiltinTheme, ThemeRegistration } from "shiki";
|
||
import "markdown-it";
|
||
import { Plugin } from "vuepress/core";
|
||
|
||
//#region src/shared/caniuse.d.ts
|
||
type CanIUseMode = 'embed' | 'image';
|
||
interface CanIUseTokenMeta {
|
||
feature: string;
|
||
mode: CanIUseMode;
|
||
versions: string;
|
||
}
|
||
interface CanIUseOptions {
|
||
/**
|
||
* 嵌入模式
|
||
*
|
||
* embed 通过iframe嵌入,提供可交互视图
|
||
*
|
||
* image 通过图片嵌入,静态
|
||
*
|
||
* @default 'embed'
|
||
*/
|
||
mode?: CanIUseMode;
|
||
}
|
||
//#endregion
|
||
//#region src/shared/size.d.ts
|
||
interface SizeOptions {
|
||
width?: string;
|
||
height?: string;
|
||
ratio?: number | string;
|
||
}
|
||
//#endregion
|
||
//#region src/shared/codepen.d.ts
|
||
interface CodepenTokenMeta extends SizeOptions {
|
||
title?: string;
|
||
user?: string;
|
||
slash?: string;
|
||
tab?: string;
|
||
theme?: string;
|
||
preview?: boolean;
|
||
editable?: boolean;
|
||
}
|
||
//#endregion
|
||
//#region src/shared/codeSandbox.d.ts
|
||
interface CodeSandboxTokenMeta extends SizeOptions {
|
||
user?: string;
|
||
id?: string;
|
||
layout?: string;
|
||
type?: 'button' | 'embed';
|
||
title?: string;
|
||
filepath?: string;
|
||
navbar?: boolean;
|
||
console?: boolean;
|
||
}
|
||
//#endregion
|
||
//#region src/shared/codeTabs.d.ts
|
||
interface CodeTabsOptions {
|
||
icon?: boolean | {
|
||
named?: false | string[];
|
||
extensions?: false | string[];
|
||
};
|
||
}
|
||
//#endregion
|
||
//#region src/shared/demo.d.ts
|
||
interface DemoFile {
|
||
type: 'vue' | 'normal' | 'css' | 'markdown';
|
||
export?: string;
|
||
path: string;
|
||
gitignore?: boolean;
|
||
}
|
||
interface MarkdownDemoEnv extends MarkdownEnv {
|
||
demoFiles?: DemoFile[];
|
||
}
|
||
interface DemoMeta {
|
||
type: 'vue' | 'normal' | 'markdown';
|
||
url: string;
|
||
title?: string;
|
||
desc?: string;
|
||
codeSetting?: string;
|
||
expanded?: boolean;
|
||
}
|
||
interface DemoContainerRender {
|
||
before: (app: App, md: Markdown, env: MarkdownDemoEnv, meta: DemoMeta, codeMap: Record<string, string>) => string;
|
||
after: () => string;
|
||
token?: (token: Token, tokens: Token[], index: number) => void;
|
||
}
|
||
//#endregion
|
||
//#region src/shared/fileTree.d.ts
|
||
type FileTreeIconMode = 'simple' | 'colored';
|
||
interface FileTreeOptions {
|
||
icon?: FileTreeIconMode;
|
||
}
|
||
//#endregion
|
||
//#region src/shared/icon.d.ts
|
||
type IconOptions = IconifyProvider | IconFontProvider | FontAwesomeProvider;
|
||
interface IconProviderBase {
|
||
/**
|
||
* The provider of the icon
|
||
*
|
||
* 图标提供商
|
||
* @default 'iconify'
|
||
*/
|
||
provider?: 'iconify' | 'iconfont' | 'fontawesome';
|
||
/**
|
||
* The size of the icon
|
||
* @default '1em'
|
||
*/
|
||
size?: string | number;
|
||
/**
|
||
* The color of the icon
|
||
* @default 'currentColor'
|
||
*/
|
||
color?: string;
|
||
}
|
||
interface IconFontProvider extends IconProviderBase {
|
||
provider?: 'iconfont';
|
||
/**
|
||
* The prefix of the iconfont
|
||
* @default 'iconfont icon-'
|
||
*/
|
||
prefix?: string;
|
||
/**
|
||
* The assets of the iconfont
|
||
*/
|
||
assets?: IconAssetLink | IconAssetLink[];
|
||
}
|
||
interface FontAwesomeProvider extends IconProviderBase {
|
||
provider?: 'fontawesome';
|
||
/**
|
||
* The prefix of the fontawesome icon
|
||
* @default 'fas'
|
||
*/
|
||
prefix?: LiteralUnion<FontAwesomePrefix>;
|
||
/**
|
||
* The assets of the fontawesome
|
||
* @default 'fontawesome'
|
||
*/
|
||
assets?: FontAwesomeAssetBuiltIn | IconAssetLink | (IconAssetLink | FontAwesomeAssetBuiltIn)[];
|
||
}
|
||
interface IconifyProvider extends IconProviderBase {
|
||
provider?: 'iconify';
|
||
/**
|
||
* The prefix of the icon
|
||
* @default ''
|
||
*/
|
||
prefix?: LiteralUnion<IconifyPrefix>;
|
||
}
|
||
type FontAwesomeAssetBuiltIn = 'fontawesome' | 'fontawesome-with-brands';
|
||
type IconAssetLink = `//${string}` | `//${string}` | `https://${string}` | `http://${string}`;
|
||
type FontAwesomePrefix = 'fas' | 's' | 'far' | 'r' | 'fal' | 'l' | 'fat' | 't' | 'fads' | 'ds' | 'fass' | 'ss' | 'fasr' | 'sr' | 'fasl' | 'sl' | 'fast' | 'st' | 'fasds' | 'sds' | 'fab' | 'b';
|
||
type IconifyPrefix = 'material-symbols' | 'material-symbols-light' | 'ic' | 'mdi' | 'mdi-light' | 'line-md' | 'solar' | 'tabler' | 'hugeicons' | 'mingcute' | 'ri' | 'mynaui' | 'iconamoon' | 'iconoir' | 'lucide' | 'lucide-lab' | 'uil' | 'tdesign' | 'si' | 'bx' | 'bxs' | 'majesticons' | 'gg' | 'flowbite' | 'basil' | 'pixelarticons' | 'pixel' | 'akar-icons' | 'ci' | 'proicons' | 'typcn' | 'meteor-icons' | 'prime' | 'circum' | 'fe' | 'eos-icons' | 'bitcoin-icons' | 'humbleicons' | 'uim' | 'uit' | 'uis' | 'gridicons' | 'mi' | 'cuida' | 'weui' | 'duo-icons' | 'svg-spinners' | 'lets-icons' | 'mage' | 'stash' | 'lineicons' | 'icon-park-outline' | 'icon-park-solid' | 'icon-park-twotone' | 'jam' | 'guidance' | 'carbon' | 'ion' | 'famicons' | 'ant-design' | 'lsicon' | 'gravity-ui' | 'cil' | 'ep' | 'charm' | 'quill' | 'bytesize' | 'bi' | 'rivet-icons' | 'nimbus' | 'formkit' | 'fluent' | 'ph' | 'teenyicons' | 'clarity' | 'ix' | 'octicon' | 'memory' | 'system-uicons' | 'radix-icons' | 'zondicons' | 'uiw' | 'maki' | 'codex' | 'ei' | 'heroicons' | 'pepicons-pop' | 'pepicons-print' | 'pepicons-pencil' | 'f7' | 'pajamas' | 'garden' | 'streamline' | 'fa6-solid' | 'fa6-regular' | 'picon' | 'ooui' | 'oui' | 'nrk' | 'qlementine-icons' | 'fluent-color' | 'icon-park' | 'marketeq' | 'vscode-icons' | 'codicon' | 'material-icon-theme' | 'file-icons' | 'devicon' | 'devicon-plain' | 'catppuccin' | 'skill-icons' | 'unjs' | 'simple-icons' | 'logos' | 'cib' | 'fa6-brands' | 'bxl' | 'nonicons' | 'arcticons' | 'cbi' | 'brandico' | 'entypo-social' | 'token' | 'token-branded' | 'cryptocurrency' | 'cryptocurrency-color' | 'openmoji' | 'twemoji' | 'noto' | 'fluent-emoji' | 'fluent-emoji-flat' | 'fluent-emoji-high-contrast' | 'noto-v1' | 'emojione' | 'emojione-monotone' | 'emojione-v1' | 'fxemoji' | 'streamline-emojis' | 'circle-flags' | 'flag' | 'flagpack' | 'cif' | 'gis' | 'map' | 'geo' | 'game-icons' | 'fad' | 'academicons' | 'wi' | 'meteocons' | 'healthicons' | 'medical-icon' | 'covid' | 'la' | 'eva' | 'dashicons' | 'flat-color-icons' | 'entypo' | 'foundation' | 'raphael' | 'icons8' | 'iwwa' | 'gala' | 'heroicons-outline' | 'heroicons-solid' | 'fa-solid' | 'fa-regular' | 'fa-brands' | 'fa' | 'fluent-mdl2' | 'fontisto' | 'icomoon-free' | 'subway' | 'oi' | 'wpf' | 'simple-line-icons' | 'et' | 'el' | 'vaadin' | 'grommet-icons' | 'whh' | 'si-glyph' | 'zmdi' | 'ls' | 'bpmn' | 'flat-ui' | 'vs' | 'topcoat' | 'il' | 'websymbol' | 'fontelico' | 'ps' | 'feather' | 'mono-icons' | 'pepicons';
|
||
type LiteralUnion<Union extends Base, Base = string> = Union | (Base & {
|
||
zz_IGNORE_ME?: never;
|
||
});
|
||
//#endregion
|
||
//#region src/shared/jsfiddle.d.ts
|
||
interface JSFiddleTokenMeta extends SizeOptions {
|
||
source: string;
|
||
title?: string;
|
||
theme?: string;
|
||
tab?: string;
|
||
}
|
||
//#endregion
|
||
//#region src/shared/npmTo.d.ts
|
||
type NpmToPackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun' | 'deno';
|
||
type NpmToOptions = NpmToPackageManager[] | {
|
||
tabs?: NpmToPackageManager[];
|
||
};
|
||
//#endregion
|
||
//#region src/shared/pdf.d.ts
|
||
type PDFEmbedType = 'iframe' | 'embed' | 'pdfjs';
|
||
interface PDFTokenMeta extends SizeOptions {
|
||
page?: number;
|
||
noToolbar?: boolean;
|
||
zoom?: number;
|
||
src?: string;
|
||
title?: string;
|
||
}
|
||
interface PDFOptions {
|
||
/**
|
||
* pdfjs url
|
||
*/
|
||
pdfjsUrl?: string;
|
||
}
|
||
//#endregion
|
||
//#region src/shared/plot.d.ts
|
||
/**
|
||
* 是否启用 `!! !!` markdown (该标记为非标准标记,脱离插件将不生效)
|
||
*/
|
||
interface PlotOptions {
|
||
/**
|
||
* 触发方式
|
||
*
|
||
* @default 'hover'
|
||
*/
|
||
trigger?: 'hover' | 'click';
|
||
/**
|
||
* 遮罩层效果
|
||
*
|
||
* @default 'mask'
|
||
*/
|
||
effect?: 'mask' | 'blur';
|
||
}
|
||
//#endregion
|
||
//#region src/shared/codeTree.d.ts
|
||
interface CodeTreeOptions {
|
||
icon?: FileTreeIconMode;
|
||
height?: string | number;
|
||
}
|
||
//#endregion
|
||
//#region src/shared/mark.d.ts
|
||
type MarkOptions = 'lazy' | 'eager';
|
||
//#endregion
|
||
//#region src/shared/repl.d.ts
|
||
type ThemeOptions = BuiltinTheme | {
|
||
light: BuiltinTheme;
|
||
dark: BuiltinTheme;
|
||
};
|
||
interface ReplOptions {
|
||
theme?: ThemeOptions;
|
||
go?: boolean;
|
||
kotlin?: boolean;
|
||
rust?: boolean;
|
||
python?: boolean;
|
||
}
|
||
interface ReplEditorData {
|
||
grammars: {
|
||
go?: any;
|
||
kotlin?: any;
|
||
rust?: any;
|
||
python?: any;
|
||
};
|
||
theme: ThemeRegistration | {
|
||
light: ThemeRegistration;
|
||
dark: ThemeRegistration;
|
||
};
|
||
}
|
||
//#endregion
|
||
//#region src/shared/table.d.ts
|
||
interface TableContainerOptions {
|
||
/**
|
||
* 表格对齐方式
|
||
* - 'left': 左对齐
|
||
* - 'center': 居中对齐
|
||
* - 'right': 右对齐
|
||
*
|
||
* @default 'left'
|
||
*/
|
||
align?: 'left' | 'center' | 'right';
|
||
/**
|
||
* 表格复制
|
||
* - true: 等同于 `all`,支持复制为 html 和 markdown 格式
|
||
* - 'all': 支持复制为 html 和 markdown 格式
|
||
* - 'html': 只支持复制为 html 格式
|
||
* - 'md': 只支持复制为 markdown 格式
|
||
* - `false`: 禁用复制
|
||
*
|
||
* @default true
|
||
*/
|
||
copy?: boolean | 'all' | 'html' | 'md';
|
||
/**
|
||
* 表格宽度是否为最大内容宽度
|
||
*
|
||
* 最大内容宽度时,行内元素不再自动换行,超出容器宽度时表格显示滚动条
|
||
*
|
||
* @default false
|
||
*/
|
||
maxContent?: boolean;
|
||
}
|
||
//#endregion
|
||
//#region src/shared/plugin.d.ts
|
||
interface MarkdownPowerPluginOptions {
|
||
/**
|
||
* 是否启用注释
|
||
* @default false
|
||
*/
|
||
annotation?: boolean;
|
||
/**
|
||
* 是否启用 abbr 语法
|
||
* @default false
|
||
*/
|
||
abbr?: boolean;
|
||
/**
|
||
* 马克笔动画模式
|
||
* @default 'eager'
|
||
*/
|
||
mark?: MarkOptions;
|
||
/**
|
||
* 配置代码块分组
|
||
*/
|
||
codeTabs?: CodeTabsOptions;
|
||
/**
|
||
* 是否启用 npm-to 容器
|
||
*/
|
||
npmTo?: boolean | NpmToOptions;
|
||
/**
|
||
* 是否启用 PDF 嵌入语法
|
||
*
|
||
* `@[pdf](pdf_url)`
|
||
*
|
||
* @default false
|
||
*/
|
||
pdf?: boolean | PDFOptions;
|
||
/**
|
||
* 是否启用 图标支持
|
||
* - iconify - `::collect:icon_name::` => `<VPIcon name="collect:icon_name" />`
|
||
* - iconfont - `::name::` => `<i class="iconfont icon-name"></i>`
|
||
* - fontawesome - `::fas:name::` => `<i class="fa-solid fa-name"></i>`
|
||
*
|
||
* @default false
|
||
*/
|
||
icon?: IconOptions;
|
||
/**
|
||
* 是否启用 iconify 图标嵌入语法
|
||
*
|
||
* `::collect:icon_name::`
|
||
*
|
||
* @default false
|
||
* @deprecated use `icon` instead 该配置已弃用,请使用 `icon` 代替
|
||
*/
|
||
icons?: boolean | IconOptions;
|
||
/**
|
||
* 是否启用 隐秘文本 语法
|
||
*
|
||
* `!!plot_content!!`
|
||
*
|
||
* @default false
|
||
*/
|
||
plot?: boolean | PlotOptions;
|
||
/**
|
||
* 是否启用 timeline 语法
|
||
*
|
||
* ```md
|
||
* ::: timeline
|
||
* - title
|
||
* time="Q1" icon="ri:clockwise-line" line="dashed" type="warning" color="red"
|
||
*
|
||
* xxx
|
||
* :::
|
||
* ```
|
||
*
|
||
* @default false
|
||
*/
|
||
timeline?: boolean;
|
||
/**
|
||
* 是否启用 collapse 折叠面板 语法
|
||
*
|
||
* ```md
|
||
* ::: collapse accordion
|
||
* - + title
|
||
*
|
||
* content
|
||
*
|
||
* - - title
|
||
*
|
||
* content
|
||
* :::
|
||
* ```
|
||
*
|
||
* @default false
|
||
*/
|
||
collapse?: boolean;
|
||
/**
|
||
* 是否启用 chat 容器 语法
|
||
*
|
||
* ```md
|
||
* ::: chat
|
||
* {:date}
|
||
*
|
||
* {user}
|
||
* message
|
||
*
|
||
* {.}
|
||
* message
|
||
* :::
|
||
* ```
|
||
* @default false
|
||
*/
|
||
chat?: boolean;
|
||
/**
|
||
* 是否启用 field / field-group 容器
|
||
*
|
||
* @default false
|
||
*/
|
||
field?: boolean;
|
||
/**
|
||
* 是否启用 acfun 视频嵌入
|
||
*
|
||
* `@[acfun](acid)`
|
||
*
|
||
* @default false
|
||
*/
|
||
acfun?: boolean;
|
||
/**
|
||
* 是否启用 bilibili 视频嵌入
|
||
*
|
||
* `@[bilibili](bid)`
|
||
*
|
||
* @default false
|
||
*/
|
||
bilibili?: boolean;
|
||
/**
|
||
* 是否启用 youtube 视频嵌入
|
||
*
|
||
* `@[youtube](video_id)`
|
||
*
|
||
* @default false
|
||
*/
|
||
youtube?: boolean;
|
||
/**
|
||
* 是否启用 artPlayer 视频嵌入
|
||
*
|
||
* `@[artPlayer](url)`
|
||
*/
|
||
artPlayer?: boolean;
|
||
/**
|
||
* 是否启用 audioReader 音频嵌入
|
||
*
|
||
* `@[audioReader](url)`
|
||
*/
|
||
audioReader?: boolean;
|
||
/**
|
||
* 是否启用 codepen 嵌入
|
||
*
|
||
* `@[codepen](pen_id)`
|
||
*
|
||
* @default false
|
||
*/
|
||
codepen?: boolean;
|
||
/**
|
||
* @deprecated
|
||
*/
|
||
replit?: boolean;
|
||
/**
|
||
* 是否启用 codeSandbox 嵌入
|
||
*
|
||
* `@[codesandbox](codesandbox_id)`
|
||
*
|
||
* @default false
|
||
*/
|
||
codeSandbox?: boolean;
|
||
/**
|
||
* 是否启用 jsfiddle 嵌入
|
||
*
|
||
* `@[jsfiddle](jsfiddle_id)`
|
||
*
|
||
* @default false
|
||
*/
|
||
jsfiddle?: boolean;
|
||
/**
|
||
* 是否启用 REPL 容器语法
|
||
*
|
||
* @default false
|
||
*/
|
||
repl?: false | ReplOptions;
|
||
/**
|
||
* 是否启用 文件树 容器语法
|
||
*
|
||
* @default false
|
||
*/
|
||
fileTree?: boolean | FileTreeOptions;
|
||
/**
|
||
* 是否启用 代码树 容器语法 和 嵌入语法
|
||
*
|
||
* ```md
|
||
* ::: code-tree
|
||
* :::
|
||
* ```
|
||
*
|
||
* `@[code-tree](file_path)`
|
||
*
|
||
*
|
||
* @default false
|
||
*/
|
||
codeTree?: boolean | CodeTreeOptions;
|
||
/**
|
||
* 是否启用 demo 语法
|
||
*/
|
||
demo?: boolean;
|
||
/**
|
||
* 是否启用 caniuse 嵌入语法
|
||
*
|
||
* `@[caniuse](feature_name)`
|
||
*
|
||
* @default false
|
||
*/
|
||
caniuse?: boolean | CanIUseOptions;
|
||
/**
|
||
* 是否启用 table 容器语法,为表格提供增强功能
|
||
*
|
||
* - `copy`: 是否启用复制功能,支持复制为 html 格式 和 markdown 格式
|
||
*
|
||
* @default false
|
||
*/
|
||
table?: boolean | TableContainerOptions;
|
||
/**
|
||
* 是否启用 自动填充 图片宽高属性
|
||
*
|
||
* __请注意,无论是否启用,该功能仅在构建生产包时生效__
|
||
*
|
||
* - 如果为 `true` ,等同于 `'local'`
|
||
* - 如果为 `local`,则仅对本地图片 添加 width 和 height
|
||
* - 如果为 `all`,则对所有图片(即包括 本地 和 远程) 添加 width 和 height
|
||
*
|
||
* 图片在加载过程中如果比较慢,从加载到完成的过程会导致页面布局不稳定,导致内容闪烁等。
|
||
* 此功能通过给图片添加 `width` 和 `height` 属性来解决该问题。
|
||
*
|
||
* 请谨慎使用 `all` 选项,该选项会在构建阶段发起网络请求,尝试加载远程图片以获取图片尺寸信息,
|
||
* 这可能会导致 构建时间变得更长(幸运的是获取尺寸信息只需要加载图片 几 KB 的数据包,因此耗时不会过长)
|
||
*
|
||
* @default false
|
||
*/
|
||
imageSize?: boolean | 'local' | 'all';
|
||
}
|
||
//#endregion
|
||
//#region src/shared/replit.d.ts
|
||
interface ReplitTokenMeta extends SizeOptions {
|
||
title?: string;
|
||
source?: string;
|
||
theme?: string;
|
||
}
|
||
//#endregion
|
||
//#region src/shared/video.d.ts
|
||
interface VideoOptions {
|
||
bilibili?: boolean;
|
||
youtube?: boolean;
|
||
}
|
||
interface AcFunTokenMeta extends SizeOptions {
|
||
title?: string;
|
||
id: string;
|
||
}
|
||
interface BilibiliTokenMeta extends SizeOptions {
|
||
title?: string;
|
||
bvid?: string;
|
||
aid?: string;
|
||
cid?: string;
|
||
autoplay?: boolean;
|
||
time?: string | number;
|
||
page?: number;
|
||
}
|
||
interface YoutubeTokenMeta extends SizeOptions {
|
||
title?: string;
|
||
id: string;
|
||
autoplay?: boolean;
|
||
loop?: boolean;
|
||
start?: string | number;
|
||
end?: string | number;
|
||
}
|
||
interface ArtPlayerTokenMeta extends SizeOptions {
|
||
muted?: boolean;
|
||
autoplay?: boolean;
|
||
autoMini?: boolean;
|
||
loop?: boolean;
|
||
volume?: number;
|
||
poster?: string;
|
||
url: string;
|
||
type?: string;
|
||
}
|
||
//#endregion
|
||
//#region src/node/container/codeTabs.d.ts
|
||
declare function createCodeTabIconGetter(options?: CodeTabsOptions): (filename: string) => string | void;
|
||
//#endregion
|
||
//#region src/node/enhance/imageSize.d.ts
|
||
interface ImgSize {
|
||
width: number;
|
||
height: number;
|
||
}
|
||
declare function resolveImageSize(app: App, url: string, remote?: boolean): Promise<ImgSize>;
|
||
//#endregion
|
||
//#region src/node/plugin.d.ts
|
||
declare function markdownPowerPlugin(options?: MarkdownPowerPluginOptions): Plugin;
|
||
//#endregion
|
||
export { AcFunTokenMeta, ArtPlayerTokenMeta, BilibiliTokenMeta, CanIUseMode, CanIUseOptions, CanIUseTokenMeta, CodeSandboxTokenMeta, CodeTabsOptions, CodepenTokenMeta, DemoContainerRender, DemoFile, DemoMeta, FileTreeIconMode, FileTreeOptions, FontAwesomeAssetBuiltIn, FontAwesomePrefix, FontAwesomeProvider, IconAssetLink, IconFontProvider, IconOptions, IconProviderBase, IconifyPrefix, IconifyProvider, JSFiddleTokenMeta, LiteralUnion, MarkdownDemoEnv, MarkdownPowerPluginOptions, NpmToOptions, NpmToPackageManager, PDFEmbedType, PDFOptions, PDFTokenMeta, PlotOptions, ReplEditorData, ReplOptions, ReplitTokenMeta, SizeOptions, ThemeOptions, VideoOptions, YoutubeTokenMeta, createCodeTabIconGetter, markdownPowerPlugin, resolveImageSize }; |