From 3413c9ed640bef80807ee8b9e1aa28f7010caec5 Mon Sep 17 00:00:00 2001 From: zadam Date: Wed, 10 Jul 2019 20:35:01 +0200 Subject: [PATCH 1/6] backport notePath handling fixes from master --- package-lock.json | 58 +++++++++---------- src/public/javascripts/services/tree.js | 2 + src/public/javascripts/services/tree_utils.js | 5 +- 3 files changed, 35 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1303f168b..8a407e6be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -713,7 +713,7 @@ "dependencies": { "file-type": { "version": "3.9.0", - "resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" } } @@ -1022,7 +1022,7 @@ }, "uuid": { "version": "2.0.3", - "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" } } @@ -1056,7 +1056,7 @@ "dependencies": { "semver": { "version": "4.3.6", - "resolved": "http://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" } } @@ -1076,7 +1076,7 @@ }, "bl": { "version": "1.2.2", - "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "requires": { "readable-stream": "^2.3.5", @@ -1375,12 +1375,12 @@ "dependencies": { "file-type": { "version": "3.9.0", - "resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" }, "uuid": { "version": "2.0.3", - "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" } } @@ -1625,7 +1625,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { "ansi-styles": "^2.2.1", @@ -1895,7 +1895,7 @@ }, "commander": { "version": "2.8.1", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "requires": { "graceful-readlink": ">= 1.0.0" @@ -5826,7 +5826,7 @@ }, "got": { "version": "5.7.1", - "resolved": "http://registry.npmjs.org/got/-/got-5.7.1.tgz", + "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", "requires": { "create-error-class": "^3.0.1", @@ -6613,7 +6613,7 @@ }, "into-stream": { "version": "3.1.0", - "resolved": "http://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", "requires": { "from2": "^2.1.1", @@ -8047,7 +8047,7 @@ }, "get-stream": { "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "got": { @@ -8083,7 +8083,7 @@ }, "p-cancelable": { "version": "0.4.1", - "resolved": "http://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==" }, "p-event": { @@ -8230,7 +8230,7 @@ "dependencies": { "file-type": { "version": "3.9.0", - "resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" } } @@ -8255,7 +8255,7 @@ "dependencies": { "get-stream": { "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "pify": { @@ -8312,7 +8312,7 @@ }, "get-stream": { "version": "2.3.1", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", "requires": { "object-assign": "^4.0.1", @@ -8342,7 +8342,7 @@ "dependencies": { "get-stream": { "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" } } @@ -8372,7 +8372,7 @@ }, "pify": { "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "prepend-http": { @@ -8478,7 +8478,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "requires": { "core-util-is": "~1.0.0", @@ -8904,7 +8904,7 @@ }, "onetime": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" }, "open": { @@ -9091,7 +9091,7 @@ }, "p-is-promise": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" }, "p-limit": { @@ -9594,7 +9594,7 @@ }, "get-stream": { "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" } } @@ -9878,7 +9878,7 @@ "dependencies": { "file-type": { "version": "3.9.0", - "resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" } } @@ -9903,7 +9903,7 @@ "dependencies": { "get-stream": { "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "pify": { @@ -9941,7 +9941,7 @@ }, "get-stream": { "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" } } @@ -9993,7 +9993,7 @@ }, "get-stream": { "version": "2.3.1", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", "requires": { "object-assign": "^4.0.1", @@ -10023,7 +10023,7 @@ "dependencies": { "get-stream": { "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" } } @@ -10280,7 +10280,7 @@ }, "query-string": { "version": "5.1.1", - "resolved": "http://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "requires": { "decode-uri-component": "^0.2.0", @@ -11621,7 +11621,7 @@ }, "strip-dirs": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=", "requires": { "chalk": "^1.0.0", @@ -11978,7 +11978,7 @@ }, "readable-stream": { "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { "core-util-is": "~1.0.0", diff --git a/src/public/javascripts/services/tree.js b/src/public/javascripts/services/tree.js index 6e3f6bad3..ff322f860 100644 --- a/src/public/javascripts/services/tree.js +++ b/src/public/javascripts/services/tree.js @@ -196,6 +196,8 @@ async function resolveNotePath(notePath) { async function getRunPath(notePath) { utils.assertArguments(notePath); + notePath = notePath.split("-")[0]; + const path = notePath.split("/").reverse(); if (!path.includes("root")) { diff --git a/src/public/javascripts/services/tree_utils.js b/src/public/javascripts/services/tree_utils.js index 3487d6114..739ffbade 100644 --- a/src/public/javascripts/services/tree_utils.js +++ b/src/public/javascripts/services/tree_utils.js @@ -19,7 +19,10 @@ function getNoteIdFromNotePath(notePath) { const path = notePath.split("/"); - return path[path.length - 1]; + const lastSegment = path[path.length - 1]; + + // path could have also tabId suffix + return lastSegment.split("-")[0]; } async function getNotePath(node) { From c3e11264891d51d9a3c09d8add4c3d6172613ce5 Mon Sep 17 00:00:00 2001 From: zadam Date: Wed, 10 Jul 2019 20:38:27 +0200 Subject: [PATCH 2/6] backported image fixes --- src/services/image.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/services/image.js b/src/services/image.js index 90e34139c..9712a3873 100644 --- a/src/services/image.js +++ b/src/services/image.js @@ -13,6 +13,13 @@ const imageType = require('image-type'); const sanitizeFilename = require('sanitize-filename'); async function saveImage(buffer, originalName, parentNoteId, shrinkImageSwitch) { + const origImageFormat = imageType(buffer); + + if (origImageFormat.ext === "webp") { + // JIMP does not support webp at the moment: https://github.com/oliver-moran/jimp/issues/144 + shrinkImageSwitch = false; + } + const finalImageBuffer = shrinkImageSwitch ? await shrinkImage(buffer, originalName) : buffer; const imageFormat = imageType(finalImageBuffer); @@ -48,7 +55,7 @@ async function shrinkImage(buffer, originalName) { try { finalImageBuffer = await optimize(resizedImage); } catch (e) { - log.error("Failed to optimize image '" + originalName + "\nStack: " + e.stack); + log.error("Failed to optimize image '" + originalName + "'\nStack: " + e.stack); finalImageBuffer = resizedImage; } @@ -93,7 +100,7 @@ async function optimize(buffer) { quality: 50 }), imageminPngQuant({ - quality: "0-70" + quality: [0, 0.7] }), imageminGifLossy({ lossy: 80, From 9de2927304e9c5e6e902e7fbd6bd40c149dcaff8 Mon Sep 17 00:00:00 2001 From: zadam Date: Wed, 10 Jul 2019 23:01:30 +0200 Subject: [PATCH 3/6] image import/export related fixes --- src/routes/api/sender.js | 6 ++++-- src/services/export/tar.js | 4 ++-- src/services/image.js | 3 +-- src/services/import/single.js | 4 +--- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/routes/api/sender.js b/src/routes/api/sender.js index 81a61b245..e6e7d6e0f 100644 --- a/src/routes/api/sender.js +++ b/src/routes/api/sender.js @@ -1,9 +1,9 @@ "use strict"; +const imageType = require('image-type'); const imageService = require('../../services/image'); const utils = require('../../services/utils'); const dateNoteService = require('../../services/date_notes'); -const sql = require('../../services/sql'); const noteService = require('../../services/notes'); const passwordEncryptionService = require('../../services/password_encryption'); const optionService = require('../../services/options'); @@ -36,9 +36,11 @@ async function uploadImage(req) { return [400, "Unknown image type: " + file.mimetype]; } + const originalName = "Sender image." + imageType(file.buffer).ext; + const parentNote = await dateNoteService.getDateNote(req.headers['x-local-date']); - const {noteId} = await imageService.saveImage(file.buffer, "Sender image", parentNote.noteId, true); + const {noteId} = await imageService.saveImage(file.buffer, originalName, parentNote.noteId, true); return { noteId: noteId diff --git a/src/services/export/tar.js b/src/services/export/tar.js index f4ae65bc3..6a1c3b874 100644 --- a/src/services/export/tar.js +++ b/src/services/export/tar.js @@ -32,11 +32,11 @@ async function exportToTar(exportContext, branch, format, res) { do { index = existingFileNames[lcFileName]++; - newName = lcFileName + "_" + index; + newName = index + "_" + lcFileName; } while (newName in existingFileNames); - return fileName + "_" + index; + return index + "_" + fileName; } else { existingFileNames[lcFileName] = 1; diff --git a/src/services/image.js b/src/services/image.js index 9712a3873..8523c0fde 100644 --- a/src/services/image.js +++ b/src/services/image.js @@ -26,8 +26,7 @@ async function saveImage(buffer, originalName, parentNoteId, shrinkImageSwitch) const parentNote = await repository.getNote(parentNoteId); - const fileNameWithoutExtension = originalName.replace(/\.[^/.]+$/, ""); - const fileName = sanitizeFilename(fileNameWithoutExtension + "." + imageFormat.ext); + const fileName = sanitizeFilename(originalName); const {note} = await noteService.createNote(parentNoteId, fileName, finalImageBuffer, { target: 'into', diff --git a/src/services/import/single.js b/src/services/import/single.js index 37ba50b4f..9587d82bb 100644 --- a/src/services/import/single.js +++ b/src/services/import/single.js @@ -75,8 +75,6 @@ function getMime(fileName) { const ext = path.extname(fileName).toLowerCase(); if (ext in EXTENSION_TO_MIME) { - console.log(EXTENSION_TO_MIME[ext]); - return EXTENSION_TO_MIME[ext]; } @@ -108,7 +106,7 @@ async function importSingleFile(importContext, file, parentNote) { } async function importImage(file, parentNote, importContext) { - const {note} = await imageService.saveImage(file.buffer, getFileNameWithoutExtension(file.originalname), parentNote.noteId, importContext.shrinkImages); + const {note} = await imageService.saveImage(file.buffer, file.originalname, parentNote.noteId, importContext.shrinkImages); importContext.increaseProgressCount(); From b9373806cf21eb067716a897e944e02697cbf7f1 Mon Sep 17 00:00:00 2001 From: zadam Date: Thu, 11 Jul 2019 20:40:40 +0200 Subject: [PATCH 4/6] fix doubling of extension --- package-lock.json | 6 +++--- package.json | 2 +- src/services/export/tar.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8a407e6be..9a4b1a1fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2820,9 +2820,9 @@ "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==" }, "electron": { - "version": "6.0.0-beta.11", - "resolved": "https://registry.npmjs.org/electron/-/electron-6.0.0-beta.11.tgz", - "integrity": "sha512-B6zh9c5pJ0BKKNkOEbF6vKXnBCWgtvY8LaUYDNeR9ttnPP0CCm0oovIoqP9/nN5gL8rlCoCgKWsjmiHu0jg7mA==", + "version": "6.0.0-beta.13", + "resolved": "https://registry.npmjs.org/electron/-/electron-6.0.0-beta.13.tgz", + "integrity": "sha512-q1pX18l4N6PH0iCoHXPmgqDNEX2slvMYZcxWXHlUFQodtvXq7bnsFfr6uvifMT5oSdfsCZtXXPK3/iK6PdODNQ==", "dev": true, "requires": { "@types/node": "^10.12.18", diff --git a/package.json b/package.json index 2c430cb49..de66e0084 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ }, "devDependencies": { "devtron": "1.4.0", - "electron": "6.0.0-beta.11", + "electron": "6.0.0-beta.13", "electron-builder": "20.44.2", "electron-compile": "6.4.4", "electron-installer-debian": "2.0.0", diff --git a/src/services/export/tar.js b/src/services/export/tar.js index 6a1c3b874..984aeebd7 100644 --- a/src/services/export/tar.js +++ b/src/services/export/tar.js @@ -62,7 +62,7 @@ async function exportToTar(exportContext, branch, format, res) { const existingExtension = path.extname(fileName).toLowerCase(); // if the note is already named with extension (e.g. "jquery.js"), then it's silly to append exact same extension again - if (existingExtension !== extension) { + if (existingExtension !== "." + extension) { fileName += "." + extension; } From a76dcb44ae1c1cef58b9a66041b183893745a944 Mon Sep 17 00:00:00 2001 From: zadam Date: Thu, 11 Jul 2019 20:54:57 +0200 Subject: [PATCH 5/6] improvements in the exported file extensions --- src/services/export/tar.js | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/services/export/tar.js b/src/services/export/tar.js index 984aeebd7..e2aa1dd28 100644 --- a/src/services/export/tar.js +++ b/src/services/export/tar.js @@ -46,24 +46,32 @@ async function exportToTar(exportContext, branch, format, res) { } function getDataFileName(note, baseFileName, existingFileNames) { - let extension; + const existingExtension = path.extname(baseFileName).toLowerCase(); + let newExtension; + // following two are handled specifically since we always want to have these extensions no matter the automatic detection + // and/or existing detected extensions in the note name if (note.type === 'text' && format === 'markdown') { - extension = 'md'; + newExtension = 'md'; + } + else if (note.type === 'text' && format === 'html') { + newExtension = 'html'; } else if (note.mime === 'application/x-javascript' || note.mime === 'text/javascript') { - extension = 'js'; + newExtension = 'js'; + } + else if (existingExtension.length > 0) { // if the page already has an extension, then we'll just keep it + newExtension = null; } else { - extension = mimeTypes.extension(note.mime) || "dat"; + newExtension = mimeTypes.extension(note.mime) || "dat"; } let fileName = baseFileName; - const existingExtension = path.extname(fileName).toLowerCase(); // if the note is already named with extension (e.g. "jquery.js"), then it's silly to append exact same extension again - if (existingExtension !== "." + extension) { - fileName += "." + extension; + if (newExtension && existingExtension !== "." + newExtension.toLowerCase()) { + fileName += "." + newExtension; } return getUniqueFilename(existingFileNames, fileName); From 13e9f9f9e7b303e629a601d56174460b6745daac Mon Sep 17 00:00:00 2001 From: zadam Date: Thu, 11 Jul 2019 20:55:56 +0200 Subject: [PATCH 6/6] release 0.33.7 --- package.json | 2 +- src/services/build.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index de66e0084..82b9ca1c3 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "trilium", "productName": "Trilium Notes", "description": "Trilium Notes", - "version": "0.33.6", + "version": "0.33.7", "license": "AGPL-3.0-only", "main": "electron.js", "bin": { diff --git a/src/services/build.js b/src/services/build.js index 3984307ae..4b835331b 100644 --- a/src/services/build.js +++ b/src/services/build.js @@ -1 +1 @@ -module.exports = { buildDate:"2019-07-02T22:26:05+02:00", buildRevision: "196264b8c2fc626e3114d65423c7110cff99ae85" }; +module.exports = { buildDate:"2019-07-11T20:55:56+02:00", buildRevision: "a76dcb44ae1c1cef58b9a66041b183893745a944" };