Skip to content

Commit

Permalink
Use <...> style markdown links when needed (#183876)
Browse files Browse the repository at this point in the history
Fixes #183849
  • Loading branch information
mjbvz committed May 30, 2023
1 parent f4175f4 commit fa8eefd
Showing 1 changed file with 47 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -118,12 +118,12 @@ export function createUriListSnippet(

if (insertAsVideo) {
insertedAudioVideoCount++;
snippet.appendText(`<video src="${mdPath}" controls title="`);
snippet.appendText(`<video src="${escapeHtmlAttribute(mdPath)}" controls title="`);
snippet.appendPlaceholder('Title');
snippet.appendText('"></video>');
} else if (insertAsAudio) {
insertedAudioVideoCount++;
snippet.appendText(`<audio src="${mdPath}" controls title="`);
snippet.appendText(`<audio src="${escapeHtmlAttribute(mdPath)}" controls title="`);
snippet.appendPlaceholder('Title');
snippet.appendText('"></audio>');
} else {
Expand All @@ -139,7 +139,7 @@ export function createUriListSnippet(
const placeholderIndex = typeof options?.placeholderStartIndex !== 'undefined' ? options?.placeholderStartIndex + i : undefined;
snippet.appendPlaceholder(placeholderText, placeholderIndex);

snippet.appendText(`](${mdPath})`);
snippet.appendText(`](${escapeMarkdownLinkPath(mdPath)})`);
}

if (i < uris.length - 1 && uris.length > 1) {
Expand Down Expand Up @@ -246,11 +246,53 @@ function getMdPath(dir: vscode.Uri | undefined, file: vscode.Uri) {
// so that drive-letters are resolved cast insensitively. However we then want to
// convert back to a posix path to insert in to the document.
const relativePath = path.relative(dir.fsPath, file.fsPath);
return encodeURI(path.posix.normalize(relativePath.split(path.sep).join(path.posix.sep)));
return path.posix.normalize(relativePath.split(path.sep).join(path.posix.sep));
}

return encodeURI(path.posix.relative(dir.path, file.path));
return path.posix.relative(dir.path, file.path);
}

return file.toString(false);
}

function escapeHtmlAttribute(attr: string): string {
return encodeURI(attr).replaceAll('"', '&quot;');
}

function escapeMarkdownLinkPath(mdPath: string): string {
if (needsBracketLink(mdPath)) {
return '<' + mdPath.replace('<', '\\<').replace('>', '\\>') + '>';
}

return encodeURI(mdPath);
}

function needsBracketLink(mdPath: string) {
// Links with whitespace or control characters must be enclosed in brackets
if (mdPath.startsWith('<') || /\s|[\u007F\u0000-\u001f]/.test(mdPath)) {
return true;
}

// Check if the link has mis-matched parens
if (!/[\(\)]/.test(mdPath)) {
return false;
}

let previousChar = '';
let nestingCount = 0;
for (const char of mdPath) {
if (char === '(' && previousChar !== '\\') {
nestingCount++;
} else if (char === ')' && previousChar !== '\\') {
nestingCount--;
}

if (nestingCount < 0) {
return true;
}
previousChar = char;
}

return nestingCount > 0;
}

0 comments on commit fa8eefd

Please sign in to comment.