mirror of
https://github.com/leanote/desktop-app.git
synced 2025-10-14 15:11:24 +00:00
248 lines
7.3 KiB
JavaScript
Executable File
248 lines
7.3 KiB
JavaScript
Executable File
var xml2js =require('xml2js');
|
|
var fs = require('fs');
|
|
var Evt = require('evt');
|
|
var File = require('file');
|
|
var Note = require('note');
|
|
var Web = require('web');
|
|
var Tag = require('tag');
|
|
var async = require('async');
|
|
var Common = require('common');
|
|
|
|
var Import = {
|
|
|
|
/*
|
|
'<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n
|
|
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">\n
|
|
<en-note>\n
|
|
<div>简单简历模板</div>\n<div><a href="http://tympanus.net/Development/FullscreenLayoutPageTransitions/">http://tympanus.net/Development/FullscreenLayoutPageTransitions/</a></div>\n<div>优化, 上线</div>\n<div>
|
|
<en-media type="text/html" style="cursor:pointer;" height="43" hash="bc322a11075e40f3a5b2dce3f2fffcdc"/><br/></div>\n<div>做一个slide的vcard也行啊, 用slide去做</div>\n<div><br/></div>\n<div>
|
|
<en-media style="height:auto;" width="558" type="image/png" hash="7165072ac950b3f0fe919d45a49c847e"/></div>\n<div>颜色变换, 几套主题</div>\n<div>中间弄个头像</div>\n<div>开始的时候, 头像转转, 随后, 4个卡处渐隐出现</div>\n<div><br/></div>\n
|
|
</en-note>\n'
|
|
把<en-note>与</en-note>中间部分抽出
|
|
|
|
parsedRes = [{FileId: ""}]
|
|
*/
|
|
parseEvernoteContent: function(xml, parsedRes) {
|
|
var me = this;
|
|
|
|
if(!xml) {
|
|
return '';
|
|
}
|
|
// console.log(xml);
|
|
var ret = /<en\-note.*?>([\s\S]*)<\/en\-note>/.exec(xml)
|
|
var content = '';
|
|
if(ret && ret.length == 2) {
|
|
content = ret[1];
|
|
}
|
|
|
|
if(!content) {
|
|
return '';
|
|
}
|
|
var reg = new RegExp("<en\-media(.*?)\/*>", "g"); // <en-media /> <en-media></en-media>
|
|
var i = 0;
|
|
// console.log(content);
|
|
while(ret = reg.exec(content)) {
|
|
// ret[1] == type="text/html" style="cursor:pointer;" height="43" hash="bc322a11075e40f3a5b2dce3f2fffcdc"
|
|
try {
|
|
var res = parsedRes[i];
|
|
i++;
|
|
var fileId = res['FileId'];
|
|
if(!fileId) {
|
|
continue;
|
|
}
|
|
if(res.IsImage) {
|
|
var replace = '<img src="' + Evt.getImageLocalUrl(fileId) + '" ' + ret[1] + '>';
|
|
} else {
|
|
var replace = '<a href="' + Evt.getAttachLocalUrl(fileId) + '">' + res['Title'] + '</a>'
|
|
}
|
|
content = content.replace(ret[0], replace);
|
|
} catch(e) {
|
|
console.log(e);
|
|
};
|
|
};
|
|
|
|
// 如果是<en-media></en-media>, </en-media>匹配不到
|
|
content = content.replace(/<\/en-media>/g, '');
|
|
|
|
|
|
return content;
|
|
},
|
|
|
|
writeTest: function() {
|
|
var path = '/Users/life/Desktop/1428226025985_2.png.txt';
|
|
fs.readFile(path, function(err, xml) {
|
|
File.writeBase64(xml+"", true, 'png', 'a.png', function(file) {
|
|
});
|
|
});
|
|
},
|
|
|
|
parseEachNote: function(note, callback) {
|
|
var me = this;
|
|
|
|
var jsonNote = {
|
|
Title: note['title'][0],
|
|
Tags: note['tag'] || [],
|
|
Content: note['content'][0]
|
|
};
|
|
|
|
// 文件保存之
|
|
var resources = note['resource'] || [];
|
|
var parsedRes = [];
|
|
var attachs = [];
|
|
console.log("-----------")
|
|
console.log(note);
|
|
console.log(resources);
|
|
async.eachSeries(resources, function(res, cb) {
|
|
// console.log(res['data'][0]['$']);
|
|
/*
|
|
{ data: [ { _: 'base64字符中','$': { encoding: 'base64' } } ],
|
|
mime: [ 'image/png' ],
|
|
width: [ '2398' ],
|
|
height: [ '1466' ],
|
|
resource-attributes: [
|
|
{
|
|
'file-name': ['Leanote.html']
|
|
}
|
|
]
|
|
}
|
|
*/
|
|
try {
|
|
var base64Str = res['data'][0]['_'];
|
|
} catch(e) {
|
|
parsedRes.push({})
|
|
return cb();
|
|
}
|
|
try {
|
|
var filename = res['resource-attributes'][0]['file-name'][0];
|
|
} catch(e) {}
|
|
var isImage = false;
|
|
var type = '';
|
|
var mime = res['mime'][0].toLowerCase();
|
|
if(mime.indexOf('image') == 0) {
|
|
isImage = true;
|
|
}
|
|
type = mime.split('/').pop();
|
|
if(type == '') {
|
|
type = 'raw';
|
|
}
|
|
|
|
// console.log(base64Str);
|
|
// console.log(isImage + "");
|
|
// console.log(type);
|
|
// return cb();
|
|
|
|
File.writeBase64(base64Str, isImage, type, filename, function(file) {
|
|
if(file) {
|
|
parsedRes.push(file);
|
|
if(!isImage) {
|
|
attachs.push(file);
|
|
}
|
|
} else {
|
|
console.log('文件保存错误!');
|
|
}
|
|
|
|
cb();
|
|
});
|
|
}, function() {
|
|
// 把content的替换之
|
|
// console.log('ok, writeBase64 ok');
|
|
try {
|
|
console.log(parsedRes);
|
|
jsonNote.Content = me.parseEvernoteContent(jsonNote.Content, parsedRes);
|
|
jsonNote.Attachs = attachs;
|
|
} catch(e) {
|
|
console.log(e);
|
|
}
|
|
console.log(jsonNote);
|
|
return callback && callback(jsonNote);
|
|
}
|
|
);
|
|
},
|
|
|
|
// callback 是全局的
|
|
// eachFileCallback是每一个文件的
|
|
// eachNoteFileCallback是每一个笔记的
|
|
importFromEvernote: function(notebookId, filePaths, callback, eachFileCallback, eachNoteCallback) {
|
|
var me = this;
|
|
var filePaths = filePaths.split(';');
|
|
|
|
async.eachSeries(filePaths, function(path, cb) {
|
|
fs.readFile(path, function(err, xml) {
|
|
me.parseEvernote(notebookId, xml + '', function(ret) {
|
|
// 单个文件完成
|
|
eachFileCallback(ret, path)
|
|
cb();
|
|
},
|
|
// 单个笔记
|
|
function(ret) {
|
|
eachNoteCallback(ret);
|
|
});
|
|
});
|
|
}, function() {
|
|
// 全部完成
|
|
callback(true);
|
|
});
|
|
},
|
|
|
|
// 解析evernote xml
|
|
parseEvernote: function (notebookId, xml, callback, eachCallback) {
|
|
var me = this;
|
|
xml2js.parseString(xml, function (err, result) {
|
|
// console.log(result);
|
|
if(err) {
|
|
return callback(false);
|
|
}
|
|
try {
|
|
var notes = result['en-export']['note'];
|
|
} catch(e) {
|
|
return callback(false);
|
|
}
|
|
async.eachSeries(notes, function(note, cb) {
|
|
me.parseEachNote(note, function(jsonNote) {
|
|
if(jsonNote) {
|
|
try {
|
|
|
|
// 保存到数据库中
|
|
jsonNote.NoteId = Common.objectId();
|
|
jsonNote._id = jsonNote.NoteId;
|
|
jsonNote.IsNew = true;
|
|
jsonNote.NotebookId = notebookId;
|
|
jsonNote.Desc = '';
|
|
|
|
// jsonNote.Content = "";
|
|
// jsonNote.Attachs = null;
|
|
|
|
// console.log(jsonNote);
|
|
|
|
// eachCallback && eachCallback(false);
|
|
// return cb();
|
|
|
|
// 添加tags
|
|
if(jsonNote.Tags && jsonNote.Tags.length > 0) {
|
|
for(var h = 0; h < jsonNote.Tags.length; ++h) {
|
|
var tagTitle = jsonNote.Tags[h];
|
|
Tag.addOrUpdateTag(tagTitle, function(tag) {
|
|
Web.addTag(tag);
|
|
});
|
|
}
|
|
}
|
|
|
|
Note.updateNoteOrContent(jsonNote, function(insertedNote) {
|
|
eachCallback && eachCallback(insertedNote);
|
|
cb();
|
|
});
|
|
} catch(e) {
|
|
console.log(e);
|
|
}
|
|
}
|
|
cb();
|
|
});
|
|
}, function() {
|
|
callback && callback(true);
|
|
});
|
|
});
|
|
}
|
|
};
|
|
|
|
module.exports = Import;
|