diff --git a/browser/main/lib/dataApi/exportFolder.js b/browser/main/lib/dataApi/exportFolder.js index 51df1dc4..6ac56abf 100644 --- a/browser/main/lib/dataApi/exportFolder.js +++ b/browser/main/lib/dataApi/exportFolder.js @@ -1,8 +1,7 @@ import { findStorage } from 'browser/lib/findStorage' import resolveStorageData from './resolveStorageData' import resolveStorageNotes from './resolveStorageNotes' -import filenamify from 'filenamify' -import path from 'path' +import getFilename from './getFilename' import exportNote from './exportNote' import getContentFormatter from './getContentFormatter' @@ -32,6 +31,8 @@ function exportFolder(storageKey, folderKey, fileType, exportDir, config) { return Promise.reject(e) } + const deduplicator = {} + return resolveStorageData(targetStorage) .then(storage => { return resolveStorageNotes(storage).then(notes => ({ @@ -49,9 +50,11 @@ function exportFolder(storageKey, folderKey, fileType, exportDir, config) { return Promise.all( notes.map(note => { - const targetPath = path.join( + const targetPath = getFilename( + note, + fileType, exportDir, - `${filenamify(note.title, { replacement: '_' })}.${fileType}` + deduplicator ) return exportNote(storage.key, note, targetPath, contentFormatter) diff --git a/browser/main/lib/dataApi/exportStorage.js b/browser/main/lib/dataApi/exportStorage.js index 0cbbcc5b..14f581dd 100644 --- a/browser/main/lib/dataApi/exportStorage.js +++ b/browser/main/lib/dataApi/exportStorage.js @@ -7,6 +7,7 @@ import fs from 'fs' import exportNote from './exportNote' import formatMarkdown from './formatMarkdown' import formatHTML from './formatHTML' +import getFilename from './getFilename' /** * @param {String} storageKey @@ -83,11 +84,15 @@ function exportStorage(storageKey, fileType, exportDir, config) { } catch (e) {} }) + const deduplicator = {} + return Promise.all( notes.map(note => { - const targetPath = path.join( - folderNamesMapping[note.folder], - `${filenamify(note.title, { replacement: '_' })}.${fileType}` + const targetPath = getFilename( + note, + fileType, + exportDir, + deduplicator ) return exportNote(storage.key, note, targetPath, contentFormatter) diff --git a/browser/main/lib/dataApi/exportTag.js b/browser/main/lib/dataApi/exportTag.js index a4a0cd2a..0bef11b9 100644 --- a/browser/main/lib/dataApi/exportTag.js +++ b/browser/main/lib/dataApi/exportTag.js @@ -1,6 +1,5 @@ import exportNoteAs from './exportNoteAs' -import filenamify from 'filenamify' -import path from 'path' +import getFilename from './getFilename' /** * @param {Object} data @@ -15,12 +14,11 @@ function exportTag(data, tag, fileType, exportDir, config) { .map(note => note) .filter(note => note.tags.indexOf(tag) !== -1) + const deduplicator = {} + return Promise.all( notes.map(note => { - const filename = path.join( - exportDir, - `${filenamify(note.title, { replacement: '_' })}.${fileType}` - ) + const filename = getFilename(note, fileType, exportDir, deduplicator) return exportNoteAs(note, filename, fileType, config) }) diff --git a/browser/main/lib/dataApi/getFilename.js b/browser/main/lib/dataApi/getFilename.js new file mode 100644 index 00000000..59947954 --- /dev/null +++ b/browser/main/lib/dataApi/getFilename.js @@ -0,0 +1,37 @@ +import filenamify from 'filenamify' +import i18n from 'browser/lib/i18n' +import path from 'path' + +/** + * @param {Object} note + * @param {String} fileType + * @param {String} directory + * @param {Object} deduplicator + * + * @return {String} + */ + +function getFilename(note, fileType, directory, deduplicator) { + const basename = note.title + ? filenamify(note.title, { replacement: '_' }) + : i18n.__('Untitled') + + if (deduplicator) { + if (deduplicator[basename]) { + const filename = path.join( + directory, + `${basename} (${deduplicator[basename]}).${fileType}` + ) + + ++deduplicator[basename] + + return filename + } else { + deduplicator[basename] = 1 + } + } + + return path.join(directory, `${basename}.${fileType}`) +} + +module.exports = getFilename diff --git a/browser/main/lib/dataApi/index.js b/browser/main/lib/dataApi/index.js index de7e42a9..5bc85126 100644 --- a/browser/main/lib/dataApi/index.js +++ b/browser/main/lib/dataApi/index.js @@ -22,6 +22,7 @@ const dataApi = { updateSnippet: require('./updateSnippet'), fetchSnippet: require('./fetchSnippet'), exportTag: require('./exportTag'), + getFilename: require('./getFilename'), _migrateFromV6Storage: require('./migrateFromV6Storage'), _resolveStorageData: require('./resolveStorageData'), diff --git a/locales/de.json b/locales/de.json index 22f15957..1d857c90 100644 --- a/locales/de.json +++ b/locales/de.json @@ -202,7 +202,6 @@ "Create new folder": "Ordner erstellen", "Folder name": "Ordnername", "Create": "Erstellen", - "Untitled": "Neuer Ordner", "Unlink Storage": "Speicherverknüpfung aufheben", "Unlinking removes this linked storage from Boostnote. No data is removed, please manually delete the folder from your hard drive if needed.": "Die Verknüpfung des Speichers mit Boostnote wird entfernt. Es werden keine Daten gelöscht. Um die Daten dauerhaft zu löschen musst du den Ordner auf der Festplatte manuell entfernen.", "Empty note": "Leere Notiz",