72 lines
1.6 KiB
JavaScript
72 lines
1.6 KiB
JavaScript
/*!
|
|
* Copyright (c) 2024 PLANKA Software GmbH
|
|
* Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md
|
|
*/
|
|
|
|
import history from '../../history';
|
|
import Config from '../../constants/Config';
|
|
|
|
const SAME_SITE_CLASS = 'same-site';
|
|
|
|
document.addEventListener('click', (event) => {
|
|
const element = event.target.closest(`a.${SAME_SITE_CLASS}`);
|
|
|
|
if (element) {
|
|
event.preventDefault();
|
|
history.push(element.href);
|
|
}
|
|
});
|
|
|
|
function process(token, nextToken) {
|
|
const href = token.attrGet('href');
|
|
|
|
if (!href) {
|
|
return;
|
|
}
|
|
|
|
let url;
|
|
try {
|
|
url = new URL(href, window.location);
|
|
} catch {
|
|
return;
|
|
}
|
|
|
|
const isSameSite =
|
|
url.origin === window.location.origin && url.pathname.startsWith(Config.BASE_PATH);
|
|
|
|
const trimOrigin = isSameSite && nextToken.type === 'text' && nextToken.content === href;
|
|
|
|
if (isSameSite) {
|
|
token.attrSet('class', SAME_SITE_CLASS);
|
|
} else {
|
|
token.attrSet('target', '_blank');
|
|
token.attrSet('rel', 'noreferrer');
|
|
}
|
|
|
|
if (trimOrigin) {
|
|
nextToken.content = url.pathname; // eslint-disable-line no-param-reassign
|
|
}
|
|
}
|
|
|
|
export default (md) => {
|
|
const plugin = ({ tokens }) => {
|
|
tokens.forEach((token) => {
|
|
if (!token.children) {
|
|
return;
|
|
}
|
|
|
|
token.children.forEach((currentToken, index) => {
|
|
if (currentToken.type === 'link_open') {
|
|
process(currentToken, token.children[index + 1]);
|
|
}
|
|
});
|
|
});
|
|
};
|
|
|
|
try {
|
|
md.core.ruler.before('includes', 'link', plugin);
|
|
} catch (error) {
|
|
md.core.ruler.push('link', plugin);
|
|
}
|
|
};
|