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 `` + ``; } else { href = `joplin://${resourceId}`; if (resourceHrefInfo.hash) href += `#${resourceHrefInfo.hash}`; resourceIdAttr = `data-resource-id='${resourceId}'`; icon = ''; } } 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 `${icon}`; }; } module.exports = function(context, ruleOptions) { return function(md, mdOptions) { installRule(md, mdOptions, ruleOptions); }; };