1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-01-02 12:47:41 +02:00
joplin/ReactNativeClient/lib/renderers/MdToHtml/rules/link_open.js

49 lines
2.0 KiB
JavaScript
Raw Normal View History

const Entities = require('html-entities').AllHtmlEntities;
2019-07-29 15:43:53 +02:00
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;
const title = isResourceUrl ? utils.getAttr(token.attrs, 'title') : href;
2019-07-29 15:43:53 +02:00
let resourceIdAttr = '';
let icon = '';
let hrefAttr = '#';
if (isResourceUrl) {
const resourceId = resourceHrefInfo.itemId;
const result = ruleOptions.resources[resourceId];
const resourceStatus = utils.resourceStatus(result);
if (result && resourceStatus !== 'ready') {
const icon = utils.resourceStatusFile(resourceStatus);
2019-09-19 23:51:18 +02:00
return `<a class="not-loaded-resource resource-status-${resourceStatus}" data-resource-id="${resourceId}">` + `<img src="data:image/svg+xml;utf8,${htmlentities(icon)}"/>`;
} else {
2019-09-19 23:51:18 +02:00
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
2019-07-29 15:43:53 +02:00
// link. This allows the link to be exported too when exporting to PDF.
hrefAttr = href;
}
2019-09-19 23:51:18 +02:00
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
2019-09-19 23:51:18 +02:00
return `<a data-from-md ${resourceIdAttr} title='${htmlentities(title)}' href='${hrefAttr}' onclick='${js}'>${icon}`;
};
}
module.exports = function(context, ruleOptions) {
return function(md, mdOptions) {
installRule(md, mdOptions, ruleOptions);
};
2019-07-29 15:43:53 +02:00
};