mirror of
https://github.com/BoostIo/Boostnote
synced 2025-12-11 00:36:26 +00:00
- export untitled notes as 'Untitled' based on the language
- export notes with duplicate title as '<title> (<index>)'
This commit is contained in:
@@ -1,8 +1,7 @@
|
|||||||
import { findStorage } from 'browser/lib/findStorage'
|
import { findStorage } from 'browser/lib/findStorage'
|
||||||
import resolveStorageData from './resolveStorageData'
|
import resolveStorageData from './resolveStorageData'
|
||||||
import resolveStorageNotes from './resolveStorageNotes'
|
import resolveStorageNotes from './resolveStorageNotes'
|
||||||
import filenamify from 'filenamify'
|
import getFilename from './getFilename'
|
||||||
import path from 'path'
|
|
||||||
import exportNote from './exportNote'
|
import exportNote from './exportNote'
|
||||||
import getContentFormatter from './getContentFormatter'
|
import getContentFormatter from './getContentFormatter'
|
||||||
|
|
||||||
@@ -32,6 +31,8 @@ function exportFolder(storageKey, folderKey, fileType, exportDir, config) {
|
|||||||
return Promise.reject(e)
|
return Promise.reject(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const deduplicator = {}
|
||||||
|
|
||||||
return resolveStorageData(targetStorage)
|
return resolveStorageData(targetStorage)
|
||||||
.then(storage => {
|
.then(storage => {
|
||||||
return resolveStorageNotes(storage).then(notes => ({
|
return resolveStorageNotes(storage).then(notes => ({
|
||||||
@@ -49,9 +50,11 @@ function exportFolder(storageKey, folderKey, fileType, exportDir, config) {
|
|||||||
|
|
||||||
return Promise.all(
|
return Promise.all(
|
||||||
notes.map(note => {
|
notes.map(note => {
|
||||||
const targetPath = path.join(
|
const targetPath = getFilename(
|
||||||
|
note,
|
||||||
|
fileType,
|
||||||
exportDir,
|
exportDir,
|
||||||
`${filenamify(note.title, { replacement: '_' })}.${fileType}`
|
deduplicator
|
||||||
)
|
)
|
||||||
|
|
||||||
return exportNote(storage.key, note, targetPath, contentFormatter)
|
return exportNote(storage.key, note, targetPath, contentFormatter)
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import fs from 'fs'
|
|||||||
import exportNote from './exportNote'
|
import exportNote from './exportNote'
|
||||||
import formatMarkdown from './formatMarkdown'
|
import formatMarkdown from './formatMarkdown'
|
||||||
import formatHTML from './formatHTML'
|
import formatHTML from './formatHTML'
|
||||||
|
import getFilename from './getFilename'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {String} storageKey
|
* @param {String} storageKey
|
||||||
@@ -83,11 +84,15 @@ function exportStorage(storageKey, fileType, exportDir, config) {
|
|||||||
} catch (e) {}
|
} catch (e) {}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const deduplicator = {}
|
||||||
|
|
||||||
return Promise.all(
|
return Promise.all(
|
||||||
notes.map(note => {
|
notes.map(note => {
|
||||||
const targetPath = path.join(
|
const targetPath = getFilename(
|
||||||
folderNamesMapping[note.folder],
|
note,
|
||||||
`${filenamify(note.title, { replacement: '_' })}.${fileType}`
|
fileType,
|
||||||
|
exportDir,
|
||||||
|
deduplicator
|
||||||
)
|
)
|
||||||
|
|
||||||
return exportNote(storage.key, note, targetPath, contentFormatter)
|
return exportNote(storage.key, note, targetPath, contentFormatter)
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import exportNoteAs from './exportNoteAs'
|
import exportNoteAs from './exportNoteAs'
|
||||||
import filenamify from 'filenamify'
|
import getFilename from './getFilename'
|
||||||
import path from 'path'
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Object} data
|
* @param {Object} data
|
||||||
@@ -15,12 +14,11 @@ function exportTag(data, tag, fileType, exportDir, config) {
|
|||||||
.map(note => note)
|
.map(note => note)
|
||||||
.filter(note => note.tags.indexOf(tag) !== -1)
|
.filter(note => note.tags.indexOf(tag) !== -1)
|
||||||
|
|
||||||
|
const deduplicator = {}
|
||||||
|
|
||||||
return Promise.all(
|
return Promise.all(
|
||||||
notes.map(note => {
|
notes.map(note => {
|
||||||
const filename = path.join(
|
const filename = getFilename(note, fileType, exportDir, deduplicator)
|
||||||
exportDir,
|
|
||||||
`${filenamify(note.title, { replacement: '_' })}.${fileType}`
|
|
||||||
)
|
|
||||||
|
|
||||||
return exportNoteAs(note, filename, fileType, config)
|
return exportNoteAs(note, filename, fileType, config)
|
||||||
})
|
})
|
||||||
|
|||||||
37
browser/main/lib/dataApi/getFilename.js
Normal file
37
browser/main/lib/dataApi/getFilename.js
Normal file
@@ -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
|
||||||
@@ -22,6 +22,7 @@ const dataApi = {
|
|||||||
updateSnippet: require('./updateSnippet'),
|
updateSnippet: require('./updateSnippet'),
|
||||||
fetchSnippet: require('./fetchSnippet'),
|
fetchSnippet: require('./fetchSnippet'),
|
||||||
exportTag: require('./exportTag'),
|
exportTag: require('./exportTag'),
|
||||||
|
getFilename: require('./getFilename'),
|
||||||
|
|
||||||
_migrateFromV6Storage: require('./migrateFromV6Storage'),
|
_migrateFromV6Storage: require('./migrateFromV6Storage'),
|
||||||
_resolveStorageData: require('./resolveStorageData'),
|
_resolveStorageData: require('./resolveStorageData'),
|
||||||
|
|||||||
@@ -202,7 +202,6 @@
|
|||||||
"Create new folder": "Ordner erstellen",
|
"Create new folder": "Ordner erstellen",
|
||||||
"Folder name": "Ordnername",
|
"Folder name": "Ordnername",
|
||||||
"Create": "Erstellen",
|
"Create": "Erstellen",
|
||||||
"Untitled": "Neuer Ordner",
|
|
||||||
"Unlink Storage": "Speicherverknüpfung aufheben",
|
"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.",
|
"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",
|
"Empty note": "Leere Notiz",
|
||||||
|
|||||||
Reference in New Issue
Block a user