Skip to content

Commit cb5005b

Browse files
committed
feat: support local images
close #36
1 parent d80a978 commit cb5005b

File tree

3 files changed

+40
-5
lines changed

3 files changed

+40
-5
lines changed

src/extension.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ import {
1818
import { Utils } from 'vscode-uri';
1919
import {
2020
getAssets,
21+
getLocalTransformer,
2122
mergeAssets,
2223
setExportMode,
2324
transformerExport,
24-
transformerLocal,
2525
} from './util';
26+
import localImage from './plugins/local-image';
2627

2728
const PREFIX = 'markmap-vscode';
2829
const VIEW_TYPE = `${PREFIX}.markmap`;
@@ -60,6 +61,9 @@ class MarkmapEditor implements CustomTextEditorProvider {
6061
webviewPanel.webview
6162
.asWebviewUri(this.resolveAssetPath(relPath))
6263
.toString();
64+
const transformerLocal = getLocalTransformer([
65+
localImage(relPath => webviewPanel.webview.asWebviewUri(Utils.joinPath(Utils.dirname(document.uri), relPath)).toString())
66+
]);
6367
const { allAssets } = getAssets(transformerLocal);
6468
const resolvedAssets = {
6569
...allAssets,

src/plugins/local-image.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { wrapFunction } from 'markmap-common';
2+
import { ITransformHooks } from 'markmap-lib';
3+
import { definePlugin } from 'markmap-lib/plugins';
4+
5+
const name = 'localImage';
6+
7+
export default function plugin(resolveUrl: (url: string) => string) {
8+
return definePlugin({
9+
name,
10+
transform(transformHooks: ITransformHooks) {
11+
transformHooks.parser.tap((md) => {
12+
md.renderer.renderAttrs = wrapFunction(
13+
md.renderer.renderAttrs,
14+
(renderAttrs, token) => {
15+
if (token.tag === 'img') {
16+
const src = token.attrGet('src');
17+
if (src && !src.includes('://')) {
18+
token.attrSet('src', resolveUrl(src));
19+
}
20+
}
21+
return renderAttrs(token);
22+
},
23+
);
24+
});
25+
return {};
26+
},
27+
});
28+
}

src/util.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { buildCSSItem, buildJSItem } from 'markmap-common';
2-
import { IAssets, Transformer } from 'markmap-lib';
2+
import { builtInPlugins, IAssets, ITransformPlugin, Transformer } from 'markmap-lib';
33
import { baseJsPaths } from 'markmap-render';
44

55
const TOOLBAR_VERSION = process.env.TOOLBAR_VERSION;
@@ -23,9 +23,12 @@ export function mergeAssets(...args: IAssets[]): IAssets {
2323

2424
const local = 'local';
2525

26-
export const transformerLocal = new Transformer();
27-
transformerLocal.urlBuilder.setProvider(local, localProvider);
28-
transformerLocal.urlBuilder.provider = local;
26+
export function getLocalTransformer(plugins: ITransformPlugin[] = []) {
27+
const transformerLocal = new Transformer([...builtInPlugins, ...plugins]);
28+
transformerLocal.urlBuilder.setProvider(local, localProvider);
29+
transformerLocal.urlBuilder.provider = local;
30+
return transformerLocal;
31+
}
2932

3033
export const transformerExport = new Transformer();
3134
let bestProvider = transformerExport.urlBuilder.provider;

0 commit comments

Comments
 (0)