mirror of
https://github.com/laurent22/joplin.git
synced 2024-12-21 09:38:01 +02:00
f2c82b05d9
* Improved resource hover title * Add mimetype to resource links * Escape mime type for resource links
55 lines
2.2 KiB
JavaScript
55 lines
2.2 KiB
JavaScript
const Entities = require('html-entities').AllHtmlEntities;
|
|
const htmlentities = new Entities().encode;
|
|
const utils = require('../../utils');
|
|
const urlUtils = require('lib/urlUtils.js');
|
|
|
|
function installRule(markdownIt, mdOptions, ruleOptions) {
|
|
markdownIt.renderer.rules.link_open = function(tokens, idx) {
|
|
const token = tokens[idx];
|
|
let href = utils.getAttr(token.attrs, 'href');
|
|
const resourceHrefInfo = urlUtils.parseResourceUrl(href);
|
|
const isResourceUrl = !!resourceHrefInfo;
|
|
let title = utils.getAttr(token.attrs, 'title', isResourceUrl ? '' : href);
|
|
|
|
let resourceIdAttr = '';
|
|
let icon = '';
|
|
let hrefAttr = '#';
|
|
let mime = '';
|
|
if (isResourceUrl) {
|
|
const resourceId = resourceHrefInfo.itemId;
|
|
|
|
const result = ruleOptions.resources[resourceId];
|
|
const resourceStatus = utils.resourceStatus(result);
|
|
|
|
if (result && result.item) {
|
|
title = utils.getAttr(token.attrs, 'title', result.item.title);
|
|
mime = result.item.mime;
|
|
}
|
|
|
|
if (result && resourceStatus !== 'ready') {
|
|
const icon = utils.resourceStatusFile(resourceStatus);
|
|
return `<a class="not-loaded-resource resource-status-${resourceStatus}" data-resource-id="${resourceId}">` + `<img src="data:image/svg+xml;utf8,${htmlentities(icon)}"/>`;
|
|
} else {
|
|
href = `joplin://${resourceId}`;
|
|
if (resourceHrefInfo.hash) href += `#${resourceHrefInfo.hash}`;
|
|
resourceIdAttr = `data-resource-id='${resourceId}'`;
|
|
icon = '<span class="resource-icon"></span>';
|
|
}
|
|
} else {
|
|
// If the link is a plain URL (as opposed to a resource link), set the href to the actual
|
|
// link. This allows the link to be exported too when exporting to PDF.
|
|
hrefAttr = href;
|
|
}
|
|
|
|
let js = `${ruleOptions.postMessageSyntax}(${JSON.stringify(href)}); return false;`;
|
|
if (hrefAttr.indexOf('#') === 0 && href.indexOf('#') === 0) js = ''; // If it's an internal anchor, don't add any JS since the webview is going to handle navigating to the right place
|
|
return `<a data-from-md ${resourceIdAttr} title='${htmlentities(title)}' href='${hrefAttr}' onclick='${js}' type='${htmlentities(mime)}'>${icon}`;
|
|
};
|
|
}
|
|
|
|
module.exports = function(context, ruleOptions) {
|
|
return function(md, mdOptions) {
|
|
installRule(md, mdOptions, ruleOptions);
|
|
};
|
|
};
|