diff --git a/lib/automatic.js b/lib/automatic.js index 1edb020..e67ba43 100644 --- a/lib/automatic.js +++ b/lib/automatic.js @@ -16,13 +16,15 @@ module.exports = { subscriptions: null, //目录树的引用 treeView: null, + //当文库数量变化时 + onLibrariesChange: null, //监听发起 start: function (state) { if (state.libraryList.length == 0) { return; } var that = this; - //循环检查library + //检查library是否仍然存在,删除不存在的库 state.libraryList = directories.eachLibrary(state.libraryList); var libraryMD5 = {}; for (var i = 0; i < state.libraryList.length; i++) { @@ -32,7 +34,7 @@ module.exports = { //监听用户操作 this.subscriptions = new CompositeDisposable(); this.subscriptions.add(atom.commands.onDidDispatch(function (e) { - console.log('commands:', e.type); + //console.log('commands:', e.type); //重命名、新增文件夹或文件、创建副本事件 if (/core\:confirm/.test(e.type) && e.target.className == 'editor mini is-focused') { that.toCheckLib(state); @@ -45,12 +47,36 @@ module.exports = { else if (e.type == 'tree-view:remove-project-folder') { } })); - //当编辑器打开一个文件时 - this.subscriptions.add(atom.workspace.onDidOpen(function (e) { + //当编辑器打开一个文件时的回调 + this.subscriptions.add(atom.workspace.onDidOpen(function () { })); - //当项目(路径)数量变化(即添加或删除项目)时 - this.subscriptions.add(atom.project.onDidChangePaths(function (e) { - console.log(e); + //当项目(路径)数量变化时的回调(即添加或删除项目) + this.subscriptions.add(atom.project.onDidChangePaths(function (list) { + //文库列表比对,移除失效,添加新增 + var list2 = []; + for (var i = 0; i < list.length; i++) { + list[i] = list[i].replace(/\\/g, '/') + '/library/'; + for (var j = 0; j < state.libraryList.length; j++) { + if (list[i] == state.libraryList[j]) { + list2.push(state.libraryList[j]); + list[i] = null; + } + } + } + for (var k = 0; k < list.length; k++) { + if (list[k] && directories.isAmWiki(list[k])) { + list2.push(list[k]); + } + } + state.libraryList = list2; + //MD5同步变化 + var libraryMD5 = {}; + for (var ii = 0; ii < state.libraryList.length; ii++) { + libraryMD5[state.libraryList[ii]] = state.libraryMD5[state.libraryList[ii]]; + } + state.libraryMD5 = libraryMD5; + //回调通知 main.js 文库数已变化 + that.onLibrariesChange && that.onLibrariesChange(); })); //从树形模块监听拖拽操作 atom.packages.activatePackage('tree-view').then(function (pkg) { @@ -155,6 +181,6 @@ module.exports = { }, //释放监听 destroy: function () { - this.subscriptions.dispose(); + this.subscriptions && this.subscriptions.dispose(); } }; \ No newline at end of file diff --git a/lib/directories.js b/lib/directories.js index 11dd6c1..11b125e 100644 --- a/lib/directories.js +++ b/lib/directories.js @@ -53,7 +53,7 @@ module.exports = { files.push(path4); } } - } catch(err) { + } catch (err) { callback(err); return; } @@ -78,6 +78,7 @@ module.exports = { eachLibrary: function (list, stepCallback) { var list2 = []; var path = ''; + var atomProjects = atom.project.getPaths(); for (var i = 0; i < list.length; i++) { //路径缺乏library字段弃用 if (list[i].indexOf('library') < 0) { @@ -89,13 +90,25 @@ module.exports = { continue; } //路径重复弃用 - var hsPath = false; + var pathRepeat = false; for (var j = 0; j < list2.length; j++) { if (list2[j] == list[i]) { - hsPath = true; + pathRepeat = true; + break; } } - if (hsPath) { + if (pathRepeat) { + continue; + } + //如果atom已经移除此项目,弃用 + var pathUseful = false; + for (var k = 0; k < atomProjects.length; k++) { + if (atomProjects[k].replace(/\\/g, '/') + '/library/' == path) { + pathUseful = true; + break; + } + } + if (!pathUseful) { continue; } //有用路径 @@ -103,5 +116,16 @@ module.exports = { stepCallback && stepCallback(list[i]); } return list2; + }, + //判断一个文件夹是否为文库项目 + isAmWiki: function (path) { + path = path.indexOf('library') < 0 ? path : path.split('library')[0]; + var states = [ + fs.existsSync(path + '/library/'), + fs.existsSync(path + '/amWiki/'), + fs.existsSync(path + '/config.json'), + fs.existsSync(path + '/index.html') + ]; + return states[0] && states[1] && states[2] && states[3]; } }; \ No newline at end of file diff --git a/lib/main.js b/lib/main.js index b43a0e0..e27c08c 100644 --- a/lib/main.js +++ b/lib/main.js @@ -30,38 +30,43 @@ module.exports = { activate: function (state) { var that = this; this.state = state; - this.state.libraryList = this.state.libraryList || []; //文库列表记录 - this.state.libraryMD5 = this.state.libraryMD5 || {}; //文库文件MD5 + //文库列表记录 + this.state.libraryList = this.state.libraryList || []; + //文库列表地址MD5,检查文库变化时创建 + this.state.libraryMD5 = this.state.libraryMD5 || {}; //amWiki命令 this.subscriptions = new CompositeDisposable(); this.subscriptions.add(atom.commands.add('atom-workspace', { //命令,基于当前config.json创建wiki - 'amWiki:create': function (e) { + 'amWiki:create': function () { creator.create(that.state); }, //命令,在当前文档上抓取h2、h3为页内目录 - 'amWiki:catalogue': function (e) { + 'amWiki:catalogue': function () { catalogue.make(); }, //命令,手动更新当前文库导航 - 'amWiki:makeNav': function (e) { + 'amWiki:makeNav': function () { makeNav.update(that.state); }, //命令,粘帖截图 - 'amWiki:paste': function (e) { + 'amWiki:paste': function () { pasterImg.paster(); }, //命令,启动node静态服务器 - 'amWiki:runServer': function (e) { + 'amWiki:runServer': function () { webServer.run(that.state.libraryList); }, //命令,浏览打开当前页面 - 'amWiki:browser': function (e) { + 'amWiki:browser': function () { webServer.browser(that.state.libraryList); } })); //自动化模块启动 automatic.start(this.state); + automatic.onLibrariesChange = function () { + webServer.updateMap(that.state.libraryList); + }; }, //当atom即将关闭,终止所有监听 deactivate: function () { diff --git a/lib/makeNav.js b/lib/makeNav.js index bdde2f9..d2131ff 100644 --- a/lib/makeNav.js +++ b/lib/makeNav.js @@ -14,18 +14,12 @@ module.exports = { return; } var grammar = editor.getGrammar(); - if (!grammar) { - return; - } - if (grammar.scopeName !== 'source.gfm') { - return; - } - if (editor.getPath().indexOf('library') < 0) { - alert('只有当你打开一个位于library文件夹下的文件时,才能更新导航文件!'); + if (!grammar || grammar.scopeName !== 'source.gfm' || editor.getPath().indexOf('library') < 0) { + alert('只有当你打开library文件夹下的文档时,才能手动更新导航文件!'); return; } this.refresh(editor.getPath(), function (libPath) { - //如果当前文库没有监听,恢复监听 + //如果当前文库没有记录,添加记录 var hs, i; i = 0; hs = false; diff --git a/lib/webServer.js b/lib/webServer.js index 88b48c9..d2643e0 100644 --- a/lib/webServer.js +++ b/lib/webServer.js @@ -122,13 +122,18 @@ module.exports = { }).listen(5171); console.info('Server running at http://' + getLocalIP() + ':5171/'); }, - //启动服务器 - run: function (list) { + //更新映射列表 + updateMap: function(list) { + this.mappingList = {}; for (var i = 0; i < list.length; i++) { var path = list[i].replace('library/', ''); //缩短数字并设置为地址映射名 this.mappingList['wiki' + this.createMappingId(path)] = path; } + }, + //启动服务器 + run: function (list) { + this.updateMap(list); if (!this.server) { this.createServer(); }