yarle-evernote-to-md
Version:
Yet Another Rope Ladder from Evernote
158 lines • 8.39 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getShortLinkIfPossible = exports.wikiStyleLinksRule = exports.removeDoubleBackSlashes = exports.removeBrackets = void 0;
const marked_1 = __importDefault(require("marked"));
const _ = __importStar(require("lodash"));
const filename_utils_1 = require("../filename-utils");
const output_format_1 = require("../../output-format");
const yarle_1 = require("../../yarle");
const turndown_service_1 = require("../turndown-service");
const runtime_properties_1 = require("../../runtime-properties");
const filter_by_nodename_1 = require("./filter-by-nodename");
const get_attribute_proxy_1 = require("./get-attribute-proxy");
const is_toc_1 = require("./../../utils/is-toc");
const is_hepta_or_obsidian_output_1 = require("./../../utils/is-hepta-or-obsidian-output");
const sanitize_filename_1 = __importDefault(require("sanitize-filename"));
const removeBrackets = (str) => {
return str.replace(/\[|\]/g, '');
};
exports.removeBrackets = removeBrackets;
const removeDoubleBackSlashes = (str) => {
return str.replace(/\\/g, '');
};
exports.removeDoubleBackSlashes = removeDoubleBackSlashes;
const isEvernoteLink = (value) => {
let url;
try {
url = new URL(value);
}
catch (e) {
return false;
}
// NOTE: URL automatically converts to lowercase
if (url.protocol === 'evernote:') {
// Internal link format: evernote:///view/92167309/s714/00ba720b-e3f1-49fd-9b43-5d915a3bca8a/00ba720b-e3f1-49fd-9b43-5d915a3bca8a/
const pathSpl = url.pathname.split('/').filter(Boolean); // Split and removes empty strings
if (pathSpl[0] !== 'view' || pathSpl.length < 4)
return false;
return true;
}
else if ((url.protocol === 'http:' || url.protocol === 'https:') && url.host === 'www.evernote.com') {
// External link format: https://www.evernote.com/shard/s714/nl/92167309/00ba720b-e3f1-49fd-9b43-5d915a3bca8a/
const pathSpl = url.pathname.split('/').filter(Boolean); // Removes empty strings
if (pathSpl[0] !== 'shard' || pathSpl.length < 5)
return false;
return true;
}
return false;
};
const getEvernoteUniqueId = (value) => {
if (yarle_1.yarleOptions.keepEvernoteLinkIfNoNoteFound)
return value;
const urlSpl = value.split('/').reverse();
return ((urlSpl[0] !== '')
? [urlSpl[0], urlSpl[1]]
: [urlSpl[1], urlSpl[2]]).join('/');
};
exports.wikiStyleLinksRule = {
filter: (0, filter_by_nodename_1.filterByNodeName)('A'),
replacement: (content, node) => {
var _a;
const nodeProxy = (0, get_attribute_proxy_1.getAttributeProxy)(node);
let internalTurndownedContent = (0, turndown_service_1.getTurndownService)(yarle_1.yarleOptions).turndown((0, exports.removeBrackets)(node.innerHTML));
internalTurndownedContent = (0, exports.removeDoubleBackSlashes)(internalTurndownedContent);
if (!nodeProxy.href) {
return (node.innerHTML === '' || !node.innerHTML)
? ''
: internalTurndownedContent;
}
const lexer = new marked_1.default.Lexer({});
const tokens = lexer.lex(internalTurndownedContent);
const extension = yarle_1.yarleOptions.addExtensionToInternalLinks ? '.md' : '';
let token = {
mdKeyword: '',
text: internalTurndownedContent,
};
if (tokens.length > 0 && tokens[0]['type'] === 'heading') {
token = tokens[0];
token['mdKeyword'] = `${'#'.repeat(tokens[0]['depth'])} `;
}
const value = nodeProxy.href ? nodeProxy.href.value : internalTurndownedContent;
const type = nodeProxy.type ? nodeProxy.type.value : undefined;
const realValue = yarle_1.yarleOptions.urlEncodeFileNamesAndLinks ? encodeURI(value) : value;
const isYarleResource = Boolean(node.getAttribute('yarle-file-resource'));
if (type === 'file' || isYarleResource) {
return (0, is_hepta_or_obsidian_output_1.isHeptaOrObsidianOutput)()
? `![[${realValue}]]`
: (0, exports.getShortLinkIfPossible)(token, value);
}
const isValueEvernoteLink = isEvernoteLink(value);
if (value.match(/^(https?:|tel:|www\.|file:|busycalevent:|ftp:|mailto:)/) && !isValueEvernoteLink) {
return (0, exports.getShortLinkIfPossible)(token, value);
}
const displayName = (0, sanitize_filename_1.default)(token['text'], { replacement: yarle_1.yarleOptions.replacementChar || '_' }).replace(/[\[\]\#\^]/g, '');
const mdKeyword = token['mdKeyword'];
// handle ObsidianMD internal link display name
const omitObsidianLinksDisplayName = (0, is_hepta_or_obsidian_output_1.isHeptaOrObsidianOutput)()
&& ((_a = yarle_1.yarleOptions.obsidianSettings) === null || _a === void 0 ? void 0 : _a.omitLinkDisplayName);
const renderedObsidianDisplayName = omitObsidianLinksDisplayName ? '' : `|${displayName}`;
if (isValueEvernoteLink) {
const fileName = (0, filename_utils_1.normalizeFilenameString)(token['text']);
const noteIdNameMap = runtime_properties_1.RuntimePropertiesSingleton.getInstance();
const uniqueEnd = (0, filename_utils_1.getUniqueId)();
const id = getEvernoteUniqueId(value);
if ((0, is_toc_1.isTOC)(noteIdNameMap.getCurrentNoteName())) {
noteIdNameMap.addItemToTOCMap({ id, url: value, title: fileName, uniqueEnd });
}
else {
noteIdNameMap.addItemToMap({ id, url: value, title: fileName, uniqueEnd });
}
const linkedNoteId = id; // todo add evernotelink value
if ((0, is_hepta_or_obsidian_output_1.isHeptaOrObsidianOutput)() && !yarle_1.yarleOptions.keepEvernoteLinkIfNoNoteFound) {
return `${mdKeyword}[[${linkedNoteId}${extension}${renderedObsidianDisplayName}]]`;
}
if (yarle_1.yarleOptions.keepEvernoteLinkIfNoNoteFound) {
return `<YARLE_EVERNOTE_LINK>${mdKeyword}[[${linkedNoteId}${extension}${renderedObsidianDisplayName}]]<-->[${displayName}](${linkedNoteId}${extension})</YARLE_EVERNOTE_LINK>`;
}
return `${mdKeyword}[${displayName}](${linkedNoteId}${extension})`;
}
return ((0, is_hepta_or_obsidian_output_1.isHeptaOrObsidianOutput)())
? `${mdKeyword}[[${realValue}${renderedObsidianDisplayName}]]`
: (yarle_1.yarleOptions.outputFormat === output_format_1.OutputFormat.StandardMD || yarle_1.yarleOptions.outputFormat === output_format_1.OutputFormat.LogSeqMD)
? `${mdKeyword}[${displayName}](${realValue})`
: `${mdKeyword}[[${realValue}]]`;
},
};
const getShortLinkIfPossible = (token, value) => {
return (!token['text'] || _.unescape(token['text']) === _.unescape(value))
? yarle_1.yarleOptions.generateNakedUrls ? value : `<${value}>`
: `${token['mdKeyword']}[${token['text']}](${value})`;
};
exports.getShortLinkIfPossible = getShortLinkIfPossible;
//# sourceMappingURL=internal-links-rule.js.map