diff --git a/src/public/app/entities/attribute.js b/src/public/app/entities/attribute.js index 48dee04fe..de1690482 100644 --- a/src/public/app/entities/attribute.js +++ b/src/public/app/entities/attribute.js @@ -54,6 +54,12 @@ class Attribute { } const attrNote = this.getNote(); + + if (!attrNote) { + // the note (owner of the attribute) is not even loaded into the cache so it should not affect anything else + return false; + } + const owningNotes = [affectedNote, ...affectedNote.getTemplateNotes()]; for (const owningNote of owningNotes) { diff --git a/src/public/app/services/tree_cache.js b/src/public/app/services/tree_cache.js index 6637c7c73..42efd0eec 100644 --- a/src/public/app/services/tree_cache.js +++ b/src/public/app/services/tree_cache.js @@ -273,6 +273,12 @@ class TreeCache { async getBranchId(parentNoteId, childNoteId) { const child = await this.getNote(childNoteId); + if (!child) { + console.error(`Could not find branchId for parent=${parentNoteId}, child=${childNoteId} since child does not exist`); + + return null; + } + return child.parentToBranch[parentNoteId]; } diff --git a/src/services/notes.js b/src/services/notes.js index 0e547845e..d6eafe88e 100644 --- a/src/services/notes.js +++ b/src/services/notes.js @@ -277,9 +277,15 @@ async function downloadImage(noteId, imageUrl) { const downloadImagePromises = {}; function replaceUrl(content, url, imageNote) { - const quotedUrl = utils.quoteRegex(url); + if (url.length > 2000) { + // for very large inline base64 images which fail on regex max size + return content.replace(url, `api/images/${imageNote.noteId}/${imageNote.title}`); + } + else { + const quotedUrl = utils.quoteRegex(url); - return content.replace(new RegExp(`\\s+src=[\"']${quotedUrl}[\"']`, "g"), ` src="api/images/${imageNote.noteId}/${imageNote.title}"`); + return content.replace(new RegExp(`\\s+src=[\"']${quotedUrl}[\"']`, "g"), ` src="api/images/${imageNote.noteId}/${imageNote.title}"`); + } } function downloadImages(noteId, content) { @@ -291,8 +297,19 @@ function downloadImages(noteId, content) { while (match = re.exec(origContent)) { const url = match[1]; - if (!url.includes('api/images/') - // this is and exception for the web clipper's "imageId" + const inlineImageMatch = /^data:image\/[a-z]+;base64,/.exec(url); + + if (inlineImageMatch) { + const imageBase64 = url.substr(inlineImageMatch[0].length); + const imageBuffer = Buffer.from(imageBase64, 'base64'); + + const imageService = require('../services/image'); + const {note} = await imageService.saveImage(noteId, imageBuffer, "inline image", true); + + content = replaceUrl(content, url, note); + } + else if (!url.includes('api/images/') + // this is an exception for the web clipper's "imageId" && (url.length !== 20 || url.toLowerCase().startsWith('http'))) { if (url in imageUrlToNoteIdMapping) {