export to tar now preserves image and note links

This commit is contained in:
zadam 2019-08-31 11:15:32 +02:00
parent 4be7ac7ae1
commit 576a07bcb7

View File

@ -155,51 +155,51 @@ async function exportToTar(exportContext, branch, format, res) {
return meta; return meta;
} }
function findImageLinks(content, noteMeta) { function getTargetUrl(targetNoteId, sourceMeta) {
try { const targetMeta = noteIdToMeta[targetNoteId];
return content.replace(/src="[^"]*api\/images\/([a-zA-Z0-9]+)\/[^"]*"/g, (_, targetNoteId) => {
const targetNoteMeta = noteIdToMeta[targetNoteId];
if (!targetNoteMeta) { if (!targetMeta) {
return null; return null;
}
const targetPath = targetNoteMeta.notePath.slice();
const sourcePath = noteMeta.notePath.slice();
console.log("targetPath", targetPath);
console.log("sourcePath", sourcePath);
// > 1 for edge case that targetPath and sourcePath are exact same (link to itself)
while (targetPath.length > 1 && sourcePath.length > 1 && targetPath[0] === sourcePath[0]) {
targetPath.shift();
sourcePath.shift();
}
console.log("targetPath", targetPath);
console.log("sourcePath", sourcePath);
let url = "../".repeat(sourcePath.length - 1);
for (let i = 0; i < targetPath.length - 1; i++) {
const meta = noteIdToMeta[targetPath[i]];
url += meta.dirFileName + '/';
}
const meta = noteIdToMeta[targetPath[targetPath.length - 1]];
url += meta.dataFileName;
console.log("URL", url);
return url;
});
} }
catch (e) {
log.error("Could not parse links from", content); const targetPath = targetMeta.notePath.slice();
throw e; const sourcePath = sourceMeta.notePath.slice();
// > 1 for edge case that targetPath and sourcePath are exact same (link to itself)
while (targetPath.length > 1 && sourcePath.length > 1 && targetPath[0] === sourcePath[0]) {
targetPath.shift();
sourcePath.shift();
} }
let url = "../".repeat(sourcePath.length - 1);
for (let i = 0; i < targetPath.length - 1; i++) {
const meta = noteIdToMeta[targetPath[i]];
url += meta.dirFileName + '/';
}
const meta = noteIdToMeta[targetPath[targetPath.length - 1]];
url += meta.dataFileName;
return url;
}
function findLinks(content, noteMeta) {
content = content.replace(/src="[^"]*api\/images\/([a-zA-Z0-9]+)\/[^"]*"/g, (_, targetNoteId) => {
const url = getTargetUrl(targetNoteId, noteMeta);
return `src="${url}"`;
});
content = content.replace(/href="[^"]*#root[a-zA-Z0-9\/]*\/([a-zA-Z0-9]+)\/?"/g, (_, targetNoteId) => {
const url = getTargetUrl(targetNoteId, noteMeta);
return `href="${url}"`;
});
return content;
} }
async function prepareContent(note, noteMeta) { async function prepareContent(note, noteMeta) {
@ -208,18 +208,30 @@ async function exportToTar(exportContext, branch, format, res) {
if (['html', 'markdown'].includes(noteMeta.format)) { if (['html', 'markdown'].includes(noteMeta.format)) {
content = content.toString(); content = content.toString();
findImageLinks(content, noteMeta); content = findLinks(content, noteMeta);
} }
if (noteMeta.format === 'html') { if (noteMeta.format === 'html') {
if (!content.toLowerCase().includes("<html")) { if (!content.substr(0, 100).toLowerCase().includes("<html")) {
note.content = '<html><head><meta charset="utf-8"></head><body>' + content + '</body></html>'; content = `<html>
<head><meta charset="utf-8"></head>
<body>
<h1>${utils.escapeHtml(note.title)}</h1>
${content}
</body>
</html>`;
} }
return html.prettyPrint(content, {indent_size: 2}); return html.prettyPrint(content, {indent_size: 2});
} }
else if (noteMeta.format === 'markdown') { else if (noteMeta.format === 'markdown') {
return turndownService.turndown(content); let markdownContent = turndownService.turndown(content);
if (markdownContent.trim().length > 0 && !markdownContent.startsWith("# ")) {
markdownContent = '# ' + note.title + "\r\n" + markdownContent;
}
return markdownContent;
} }
else { else {
return content; return content;