Skip to content

Commit 5637f24

Browse files
committed
uri tweaks in md strings
1 parent eaee631 commit 5637f24

2 files changed

Lines changed: 61 additions & 3 deletions

File tree

src/vs/base/browser/htmlContentRenderer.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import { IMouseEvent } from 'vs/base/browser/mouseEvent';
1212
import { IDisposable } from 'vs/base/common/lifecycle';
1313
import { onUnexpectedError } from 'vs/base/common/errors';
1414
import { URI } from 'vs/base/common/uri';
15+
import { parse } from 'vs/base/common/marshalling';
16+
import { cloneAndChange } from 'vs/base/common/objects';
1517

1618
export interface IContentActionHandler {
1719
callback: (content: string, event?: IMouseEvent) => void;
@@ -53,10 +55,37 @@ export function renderFormattedText(formattedText: string, options: RenderOption
5355
export function renderMarkdown(markdown: IMarkdownString, options: RenderOptions = {}): HTMLElement {
5456
const element = createElement(options);
5557

58+
const _uriMassage = function (part: string): string {
59+
let data: any;
60+
try {
61+
data = parse(decodeURIComponent(part));
62+
} catch (e) {
63+
// ignore
64+
}
65+
if (!data) {
66+
return part;
67+
}
68+
data = cloneAndChange(data, value => {
69+
if (markdown.uris[value]) {
70+
return URI.revive(markdown.uris[value]);
71+
} else {
72+
return undefined;
73+
}
74+
});
75+
return encodeURIComponent(JSON.stringify(data));
76+
};
77+
5678
const _href = function (href: string): string {
5779
const data = markdown.uris && markdown.uris[href];
80+
if (!data) {
81+
return href;
82+
}
83+
let uri = URI.revive(data);
84+
if (uri.query) {
85+
uri = uri.with({ query: _uriMassage(uri.query) });
86+
}
5887
if (data) {
59-
href = URI.revive(data).toString(true);
88+
href = uri.toString(true);
6089
}
6190
return href;
6291
};

src/vs/workbench/api/node/extHostTypeConverters.ts

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { EditorViewColumn } from 'vs/workbench/api/shared/editor';
1111
import { IDecorationOptions, IThemeDecorationRenderOptions, IDecorationRenderOptions, IContentDecorationRenderOptions } from 'vs/editor/common/editorCommon';
1212
import { EndOfLineSequence, TrackedRangeStickiness } from 'vs/editor/common/model';
1313
import * as vscode from 'vscode';
14-
import { URI } from 'vs/base/common/uri';
14+
import { URI, UriComponents } from 'vs/base/common/uri';
1515
import { ProgressLocation as MainProgressLocation } from 'vs/platform/progress/common/progress';
1616
import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles';
1717
import { IPosition } from 'vs/editor/common/core/position';
@@ -25,6 +25,8 @@ import { ACTIVE_GROUP, SIDE_GROUP } from 'vs/workbench/services/editor/common/ed
2525
import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/extHostDocumentsAndEditors';
2626
import { isString, isNumber } from 'vs/base/common/types';
2727
import * as marked from 'vs/base/common/marked/marked';
28+
import { parse } from 'vs/base/common/marshalling';
29+
import { cloneAndChange } from 'vs/base/common/objects';
2830

2931
export interface PositionLike {
3032
line: number;
@@ -227,7 +229,9 @@ export namespace MarkdownString {
227229
let renderer = new marked.Renderer();
228230
renderer.image = renderer.link = (href: string): string => {
229231
try {
230-
res.uris[href] = URI.parse(href, true);
232+
let uri = URI.parse(href, true);
233+
uri = uri.with({ query: _uriMassage(uri.query, res.uris) });
234+
res.uris[href] = uri;
231235
} catch (e) {
232236
// ignore
233237
}
@@ -238,6 +242,31 @@ export namespace MarkdownString {
238242
return res;
239243
}
240244

245+
function _uriMassage(part: string, bucket: { [n: string]: UriComponents }): string {
246+
if (!part) {
247+
return part;
248+
}
249+
let data: any;
250+
try {
251+
data = parse(decodeURIComponent(part));
252+
} catch (e) {
253+
// ignore
254+
}
255+
if (!data) {
256+
return part;
257+
}
258+
data = cloneAndChange(data, value => {
259+
if (value instanceof URI) {
260+
let key = `__uri_${Math.random().toString(16).slice(2, 8)}`;
261+
bucket[key] = value;
262+
return key;
263+
} else {
264+
return undefined;
265+
}
266+
});
267+
return encodeURIComponent(JSON.stringify(data));
268+
}
269+
241270
export function to(value: htmlContent.IMarkdownString): vscode.MarkdownString {
242271
const ret = new htmlContent.MarkdownString(value.value);
243272
ret.isTrusted = value.isTrusted;

0 commit comments

Comments
 (0)