"use strict"; const utils = require('../utils'); const becca = require("../../becca/becca"); function exportToOpml(taskContext, branch, version, res) { if (!['1.0', '2.0'].includes(version)) { throw new Error(`Unrecognized OPML version ${version}`); } const opmlVersion = parseInt(version); const note = branch.getNote(); function exportNoteInner(branchId) { const branch = becca.getBranch(branchId); const note = branch.getNote(); if (note.hasOwnedLabel('excludeFromExport')) { return; } const title = `${branch.prefix ? (`${branch.prefix} - `) : ''}${note.title}`; if (opmlVersion === 1) { const preparedTitle = escapeXmlAttribute(title); const preparedContent = note.hasStringContent() ? prepareText(note.getContent()) : ''; res.write(`\n`); } else if (opmlVersion === 2) { const preparedTitle = escapeXmlAttribute(title); const preparedContent = note.hasStringContent() ? escapeXmlAttribute(note.getContent()) : ''; res.write(`\n`); } else { throw new Error(`Unrecognized OPML version ${opmlVersion}`); } taskContext.increaseProgressCount(); for (const child of note.getChildBranches()) { exportNoteInner(child.branchId); } res.write(''); } const filename = `${branch.prefix ? (`${branch.prefix} - `) : ''}${note.title}.opml`; res.setHeader('Content-Disposition', utils.getContentDisposition(filename)); res.setHeader('Content-Type', 'text/x-opml'); res.write(` Trilium export `); exportNoteInner(branch.branchId); res.write(` `); res.end(); taskContext.taskSucceeded(); } function prepareText(text) { const newLines = text.replace(/(]*>|)/g, '\n') .replace(/ /g, ' '); // nbsp isn't in XML standard (only HTML) const stripped = utils.stripTags(newLines); const escaped = escapeXmlAttribute(stripped); return escaped.replace(/\n/g, ' '); } function escapeXmlAttribute(text) { return text.replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } module.exports = { exportToOpml };