diff --git a/src/services/import/zip.js b/src/services/import/zip.js index da272c6b3..05e75b46c 100644 --- a/src/services/import/zip.js +++ b/src/services/import/zip.js @@ -23,16 +23,19 @@ const BAttachment = require("../../becca/entities/battachment"); * @returns {Promise<*>} */ async function importZip(taskContext, fileBuffer, importRootNote) { - // maps from original noteId (in ZIP file) to newly generated noteId + /** @type {Object.} maps from original noteId (in ZIP file) to newly generated noteId */ const noteIdMap = {}; const attributes = []; // path => noteId, used only when meta file is not available + /** @type {Object.} path => noteId */ const createdPaths = { '/': importRootNote.noteId, '\\': importRootNote.noteId }; const mdReader = new commonmark.Parser(); const mdWriter = new commonmark.HtmlRenderer(); let metaFile = null; + /** @type {BNote} */ let firstNote = null; - const createdNoteIds = {}; + /** @type {Set.} */ + const createdNoteIds = new Set(); function getNewNoteId(origNoteId) { // in case the original noteId is empty. This probably shouldn't happen, but still good to have this precaution @@ -52,6 +55,7 @@ async function importZip(taskContext, fileBuffer, importRootNote) { return noteIdMap[origNoteId]; } + /** @returns {{noteMeta: NoteMeta, parentNoteMeta: NoteMeta, attachmentMeta: AttachmentMeta}} */ function getMeta(filePath) { if (!metaFile) { return {}; @@ -99,6 +103,11 @@ async function importZip(taskContext, fileBuffer, importRootNote) { }; } + /** + * @param {string} filePath + * @param {NoteMeta} parentNoteMeta + * @return {string} + */ function getParentNoteId(filePath, parentNoteMeta) { let parentNoteId; @@ -123,6 +132,11 @@ async function importZip(taskContext, fileBuffer, importRootNote) { return parentNoteId; } + /** + * @param {NoteMeta} noteMeta + * @param {string} filePath + * @return {string} + */ function getNoteId(noteMeta, filePath) { if (noteMeta) { return getNewNoteId(noteMeta.noteId); @@ -148,6 +162,10 @@ async function importZip(taskContext, fileBuffer, importRootNote) { return { mime, type }; } + /** + * @param {BNote} note + * @param {NoteMeta} noteMeta + */ function saveAttributes(note, noteMeta) { if (!noteMeta) { return; @@ -218,7 +236,7 @@ async function importZip(taskContext, fileBuffer, importRootNote) { isProtected: importRootNote.isProtected && protectedSessionService.isProtectedSessionAvailable(), })); - createdNoteIds[note.noteId] = true; + createdNoteIds.add(note.noteId); saveAttributes(note, noteMeta); @@ -254,6 +272,13 @@ async function importZip(taskContext, fileBuffer, importRootNote) { return targetNoteId; } + /** + * @param {string} content + * @param {string} noteTitle + * @param {string} filePath + * @param {NoteMeta} noteMeta + * @return {string} + */ function processTextNoteContent(content, noteTitle, filePath, noteMeta) { function isUrlAbsolute(url) { return /^(?:[a-z]+:)?\/\//i.test(url); @@ -344,6 +369,15 @@ async function importZip(taskContext, fileBuffer, importRootNote) { return content; } + /** + * @param {NoteMeta} noteMeta + * @param {string} type + * @param {string} mime + * @param {string|Buffer} content + * @param {string} noteTitle + * @param {string} filePath + * @return {string} + */ function processNoteContent(noteMeta, type, mime, content, noteTitle, filePath) { if (noteMeta?.format === 'markdown' || (!noteMeta && taskContext.data.textImportedAsText && ['text/markdown', 'text/x-markdown'].includes(mime))) { @@ -397,7 +431,7 @@ async function importZip(taskContext, fileBuffer, importRootNote) { const parentNoteId = getParentNoteId(filePath, parentNoteMeta); if (!parentNoteId) { - throw new Error(`Cannot find parentNoteId for ${filePath}`); + throw new Error(`Cannot find parentNoteId for '${filePath}'`); } if (noteMeta?.isClone) { @@ -468,7 +502,7 @@ async function importZip(taskContext, fileBuffer, importRootNote) { isProtected: isProtected, })); - createdNoteIds[note.noteId] = true; + createdNoteIds.add(note.noteId); saveAttributes(note, noteMeta); @@ -521,12 +555,12 @@ async function importZip(taskContext, fileBuffer, importRootNote) { zipfile.readEntry(); }); - for (const noteId in createdNoteIds) { // now the noteIds are unique + for (const noteId of createdNoteIds) { const note = becca.getNote(noteId); await noteService.asyncPostProcessContent(note, note.getContent()); if (!metaFile) { - // if there's no meta file then the notes are created based on the order in that zip file but that + // if there's no meta file, then the notes are created based on the order in that zip file but that // is usually quite random, so we sort the notes in the way they would appear in the file manager treeService.sortNotes(noteId, 'title', false, true); } diff --git a/src/services/meta/note_meta.js b/src/services/meta/note_meta.js index 917216704..7ddc99504 100644 --- a/src/services/meta/note_meta.js +++ b/src/services/meta/note_meta.js @@ -23,6 +23,8 @@ class NoteMeta { dataFileName; /** @type {string} */ dirFileName; + /** @type {boolean} - this file should not be imported (e.g., HTML navigation) */ + noImport = false; /** @type {AttributeMeta[]} */ attributes; /** @type {AttachmentMeta[]} */