1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-11-24 08:12:24 +02:00

Done MD importer

This commit is contained in:
Laurent Cozic 2018-02-26 18:43:50 +00:00
parent 8f2e5faff3
commit 3cee671f25
3 changed files with 75 additions and 11 deletions

View File

@ -19,14 +19,18 @@ class Command extends BaseCommand {
options() {
return [
//['--format <format>', 'jex, markdown'],
['--format <format>', 'auto, jex, md'],
['--notebook <notebook>', 'Notebook to import the notes to.'],
];
}
async action(args) {
const folder = await app().loadItem(BaseModel.TYPE_FOLDER, args.options.notebook);
const importOptions = {};
importOptions.path = args.path;
importOptions.format = args.options.format ? args.options.format : 'jex';
importOptions.destinationFolderId = folder ? folder.id : null;
const service = new InteropService();
const result = await service.import(importOptions);

View File

@ -104,7 +104,13 @@ class FsDriverNode extends FsDriverBase {
if (!options) options = {};
if (!('recursive' in options)) options.recursive = false;
let items = await fs.readdir(path);
let items = [];
try {
items = await fs.readdir(path);
} catch (error) {
throw this.fsErrorToJsError_(error);
}
let output = [];
for (let i = 0; i < items.length; i++) {
const item = items[i];

View File

@ -5,7 +5,7 @@ const Folder = require('lib/models/Folder.js');
const NoteTag = require('lib/models/NoteTag.js');
const Note = require('lib/models/Note.js');
const Tag = require('lib/models/Tag.js');
const { basename } = require('lib/path-utils.js');
const { basename, filename } = require('lib/path-utils.js');
const fs = require('fs-extra');
const md5 = require('md5');
const { sprintf } = require('sprintf-js');
@ -81,18 +81,19 @@ class JexExporter {
class RawImporter {
async init(sourceDir) {
async init(sourceDir, options) {
this.sourceDir_ = sourceDir;
this.options_ = options;
}
async exec(result, options) {
async exec(result) {
const noteIdMap = {};
const folderIdMap = {};
const resourceIdMap = {};
const tagIdMap = {};
const createdResources = {};
const noteTagsToCreate = [];
const destinationFolderId = options.destinationFolderId;
const destinationFolderId = this.options_.destinationFolderId;
const replaceResourceNoteIds = (noteBody) => {
let output = noteBody;
@ -202,9 +203,10 @@ class JexImporter {
async init(sourcePath, options) {
this.sourcePath_ = sourcePath;
this.options_ = options;
}
async exec(result, options) {
async exec(result) {
const tempDir = await temporaryDirectory(true);
await require('tar').extract({
@ -215,8 +217,8 @@ class JexImporter {
});
const importer = newImporter('raw');
await importer.init(tempDir);
result = await importer.exec(result, options);
await importer.init(tempDir, this.options_);
result = await importer.exec(result);
await fs.remove(tempDir);
@ -225,6 +227,54 @@ class JexImporter {
}
class MdImporter {
async init(sourcePath, options) {
this.sourcePath_ = sourcePath;
this.options_ = options;
}
async exec(result) {
if (!this.options_.destinationFolder) throw new Error('Destination folder must be specified');
const parentFolderId = this.options_.destinationFolder.id;
const filePaths = [];
if (await shim.fsDriver().isDirectory(this.sourcePath_)) {
const stats = await shim.fsDriver().readDirStats(this.sourcePath_);
for (let i = 0; i < stats.length; i++) {
const stat = stats[i];
if (fileExtension(stat.path).toLowerCase() === 'md') {
filePaths.push(this.sourcePath_ + '/' + stat.path);
}
}
} else {
filePaths.push(this.sourcePath_);
}
for (let i = 0; i < filePaths.length; i++) {
const path = filePaths[i];
const stat = await shim.fsDriver().stat(path);
if (!stat) throw new Error('Cannot read ' + path);
const title = filename(path);
const body = await shim.fsDriver().readFile(path);
const note = {
parent_id: parentFolderId,
title: title,
body: body,
updated_time: stat.mtime.getTime(),
created_time: stat.birthtime.getTime(),
user_updated_time: stat.mtime.getTime(),
user_created_time: stat.birthtime.getTime(),
};
await Note.save(note, { autoTimestamp: false });
}
return result;
}
}
function newExporter(format) {
if (format === 'raw') {
return new RawExporter();
@ -240,6 +290,8 @@ function newImporter(format) {
return new RawImporter();
} else if (format === 'jex') {
return new JexImporter();
} else if (format === 'md') {
return new MdImporter();
} else {
throw new Error('Unknown format: ' + format);
}
@ -251,6 +303,7 @@ class InteropService {
options = Object.assign({}, {
format: 'auto',
destinationFolderId: null,
destinationFolder: null,
}, options);
if (options.format === 'auto') {
@ -265,13 +318,14 @@ class InteropService {
if (options.destinationFolderId) {
const folder = await Folder.load(options.destinationFolderId);
if (!folder) throw new Error('Notebook not found: ' + options.destinationFolderId);
options.destinationFolder = folder;
}
let result = { warnings: [] }
const importer = newImporter(options.format);
await importer.init(options.path);
result = await importer.exec(result, options);
await importer.init(options.path, options);
result = await importer.exec(result);
return result;
}