添加图片从 Atom 窗体外拖拽图片文件到文库中 (#17)

This commit is contained in:
TevinLi 2016-12-20 18:26:10 +08:00
parent 581ae5d82f
commit 43f99462d1
3 changed files with 97 additions and 16 deletions

67
lib/fileDrop.js Normal file
View File

@ -0,0 +1,67 @@
/**
* @desc amWiki 工作端·文件拖拽模块
* @author Tevin
*/
var fs = require("fs");
var directories = require('./directories');
var pasterImg = require('./pasterImg');
module.exports = {
//拖拽图片
_dropImg: function (files, paths, editor) {
pasterImg.createDirectory(paths.creatDirPath, function () {
for (var i = 0, file; file = files[i]; i++) {
fs.createReadStream(file.path).pipe(fs.createWriteStream(paths.writePath + file.name));
editor.insertText("![](assets/" + paths.insertPath + file.name + ")", editor);
}
});
},
//监听拖拽
listenDrop: function () {
var that = this;
atom.document.getElementsByClassName('item-views')[0].addEventListener('drop', function (e) {
//文件验证,包含非图片文件跳过不工作
var files = e.dataTransfer.files;
var allImg = true;
for (var i = 0, file; file = files[i]; i++) {
if (file.type.indexOf('image/') != 0) {
allImg = false;
}
}
if (!allImg) {
return;
}
//编辑器状态验证非markdown不工作
var editor = atom.workspace.getActiveTextEditor();
var grammar;
if (!editor) {
return;
}
grammar = editor.getGrammar();
if (!grammar) {
return;
}
if (grammar.scopeName !== 'source.gfm' && grammar.scopeName !== 'text.md') {
return;
}
var editorPath = editor.getPath();
if (editorPath.substr(-3) !== '.md') {
return;
}
var paths = pasterImg.getPaths(editorPath);
if (!paths) {
return;
}
//验证路径非amWiki不工作
if (!directories.isAmWiki(editorPath)) {
return;
}
//条件匹配,阻止默认动作
e.stopPropagation();
//拖拽图片
that._dropImg(files, paths, editor);
});
}
};

View File

@ -22,6 +22,8 @@ var pasterImg = require('./pasterImg');
var webServer = require('./webServer');
//项目导出模块
var exportGithub = require('./export.github');
//文件拖拽模块
var fileDrop = require('./fileDrop');
module.exports = {
//订阅
@ -77,6 +79,7 @@ module.exports = {
automatic.onLibrariesChange = function () {
webServer.updateMap(that._state.libraryList);
};
fileDrop.listenDrop();
//window.amWikiState = state;
},
//当atom即将关闭终止所有监听

View File

@ -33,13 +33,30 @@ module.exports = {
if (img.isEmpty()) {
return;
}
var paths = this.getPaths(editor.getPath());
if (!paths) {
return;
}
//文件保存
var md5 = crypto.createHash('md5');
var imgbuffer = img.toPng();
md5.update(imgbuffer);
var filename = "" + (paths.mdFile.getBaseName().replace(/\.\w+$/, '').replace(/\s+/g, '').split(/-|_/)[0]) +
"-" + (md5.digest('hex').slice(0, 8)) + ".png";
this.createDirectory(paths.creatDirPath, function () {
fs.writeFile(paths.writePath + filename, imgbuffer, 'binary', function () {
editor.insertText("![](assets/" + paths.insertPath + filename + ")", editor);
});
});
},
getPaths: function (editorPath) {
//路径计算
var assetsDirPath, //项目assets文件夹地址
creatDirPath, //本次创建图片地址
insertPath, //插入文档的图片引用路径
writePath; //图片输出路径
var mdFile = new File(editor.getPath());
var mdFile = new File(editorPath);
var parentDir;
//library直接子级
if (mdFile.getParent().getBaseName() === 'library') {
assetsDirPath = mdFile.getParent().getParent().getPath() + "/assets";
@ -65,20 +82,15 @@ module.exports = {
}
//其他目录
else {
return;
return null;
}
return {
mdFile: mdFile,
assetsDirPath: assetsDirPath,
creatDirPath: creatDirPath,
insertPath: insertPath,
writePath: writePath
}
//文件保存
var md5 = crypto.createHash('md5');
var imgbuffer = img.toPng();
md5.update(imgbuffer);
var filename = "" + (mdFile.getBaseName().replace(/\.\w+$/, '').replace(/\s+/g, '').split(/-|_/)[0]) +
"-" + (md5.digest('hex').slice(0, 8)) + ".png";
this.createDirectory(creatDirPath, function () {
fs.writeFile(writePath + filename, imgbuffer, 'binary', function () {
editor.insertText("![](assets/" + insertPath + filename + ")", editor);
});
});
},
createDirectory: function (dirPath, callback) {
var that = this;
@ -88,7 +100,6 @@ module.exports = {
if (!existed) {
assetsDir.create().then(function (created) {
if (created) {
//console.log('Success Create dir');
callback();
}
});