amWiki/lib/main.js

291 lines
12 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 工作端 - Atom - 入口模块
* @author Tevin Li
* @see {@link https://github.com/TevinLi/amWiki}
* @license MIT - Released under the MIT license.
*/
//Atom 层运行环境接口
const {CompositeDisposable} = require('atom');
const fs = require('fs');
//Electron 层 shell 接口
//系统对话框
const {dialog: eDialog} = require('electron').remote;
//co模块异步函数编程
const co = require('../modules/co');
//wiki创建器
const creator = require('../build/creator');
//文库管理
const mngWiki = require('../build/manageWiki');
//文件夹管理
const mngFolder = require('../build/manageFolder');
//手动刷新导航文件
const makeNav = require('../build/makeNavigation');
//手动刷新页面挂载数据
const makeMut = require('../build/makeMounts');
//本地服务器模块
const localServer = require('../build/localServer');
//项目导出模块
const exportGithub = require('../build/exportGithub');
//自动化工具
const autoNav = require('./autoNavigation');
//页内目录创建器
const pageCatalogue = require('./pageCatalogue');
//截图粘帖模块
const richPaste = require('./richPaste');
//文件拖拽模块
const dropFile = require('./dropFile');
const main = (function () {
return {
/**
* 订阅
* @private
*/
_subscriptions: null,
/**
* 缓存atom存储的配置
* @private
*/
_config: null,
/**
* 文库记录
* @private
*/
_wikis: null,
/**
* 当atom启动时
* @param {Object} state
* @public
*/
activate: function (state) {
this._config = state.config;
//文库记录
this._wikis = state.wikis || {};
mngWiki.linkWikis(this._wikis);
//检查文库记录有效性
for (let wId in this._wikis) {
if (this._wikis.hasOwnProperty(wId)) {
mngWiki.checkWikiValid(wId);
}
}
//转换旧版数据
if (state.libraryList) {
for (let i = 0, item, itemPath, itemRoot; itemPath = state.libraryList[i]; i++) {
itemRoot = itemPath.split('library')[0];
item = {
id: mngWiki.createWikiId(itemRoot),
root: itemRoot,
path: itemPath
};
if (typeof state.libraryMD5[itemPath] !== 'undefined') {
item.treeMD5 = state.libraryMD5[itemPath];
}
this._wikis[item.id] = item;
}
}
//amWiki命令
this._subscriptions = new CompositeDisposable();
this._subscriptions.add(atom.commands.add('atom-workspace', {
//命令基于当前config.json创建wiki
'amWiki:create': () => {
const editor = atom.workspace.getActiveTextEditor();
if (!editor) {
return;
}
const editPath = editor.getPath();
if (editPath.indexOf('config.json') < 0) {
alert('创建失败,当前不是"config.json"文件!');
return;
}
const packagePath = atom.configDirPath.replace(/\\/g, '/') + '/packages/amWiki/';
const packageConf = JSON.parse(fs.readFileSync(packagePath + 'package.json', 'utf-8'));
creator.create(editPath, packagePath + 'files/', packageConf).then((root) => {
if (!root) {
return;
}
const wId = mngWiki.createWikiId(root);
//添加文库
if (typeof this._wikis[wId] === 'undefined') {
mngWiki.addWiki(root, wId);
}
//文库已存在时,修改弃用标记为启用
else {
mngWiki.updateWikiConfig();
this._wikis[wId].deprecated = false;
}
//更新导航
makeNav.refresh(root + 'library/');
//更新挂载数据
makeMut.make(root, true);
});
},
//命令在当前文档上抓取h2、h3为页内目录
'amWiki:catalogue': () => {
const [isOnEdit, editor, editPath] = this._getEditorPath();
if (isOnEdit) {
mngWiki.checkAddWiki(editPath);
pageCatalogue.make(editor);
} else {
alert('只有当你打开 library 文件夹下的 .md 文档时,才能提取页内目录!');
}
},
//命令:手动更新当前文库导航
'amWiki:makeNav': () => {
const [isOnEdit, editor, editPath] = this._getEditorPath();
if (typeof editPath !== 'undefined') {
//当 isOnEdit 为 false 时editPath 仍然不一定为根目录
const root = mngFolder.isAmWiki(editPath);
if (root) {
mngWiki.checkAddWiki(root);
makeNav.refresh(root + 'library/');
return;
}
}
alert('只有当你打开一个 amWiki 文库时,才能手动更新导航文件!');
},
//命令:手动刷新页面挂载数据
'amWiki:makeMut': () => {
const [isOnEdit, editor, editPath] = this._getEditorPath();
if (typeof editPath !== 'undefined') {
//当 isOnEdit 为 false 时editPath 仍然不一定为根目录
const root = mngFolder.isAmWiki(editPath);
if (root) {
mngWiki.checkAddWiki(root);
makeMut.make(root);
return;
}
}
alert('只有当你打开一个 amWiki 文库时,才能更新页面挂载数据!');
},
//命令:粘帖截图
'amWiki:paste': (e) => {
const [isOnEdit, editor, editPath] = this._getEditorPath();
if (isOnEdit) {
mngWiki.checkAddWiki(editPath);
richPaste.paste(editor, editPath);
} else {
if (mngFolder.isAmWiki(editPath)) {
alert('只有当你打开 library 文件夹下的 .md 文档时,才能快捷粘贴图片!');
}
}
},
//命令启动node静态服务器
'amWiki:runServer': () => {
localServer.run(this._wikis);
},
//命令:浏览打开当前页面
'amWiki:browser': () => {
const [isOnEdit, editor, editPath] = this._getEditorPath();
if (isOnEdit) {
mngWiki.checkAddWiki(editPath);
localServer.browser(editPath, this._wikis);
} else {
alert('您需要先打开一篇文档才能浏览!');
}
},
//命令:导出项目为 github wiki
'amWiki:export.gitHub': () => {
const [isOnEdit, editor, editPath] = this._getEditorPath();
if (typeof editPath !== 'undefined') {
const root = mngFolder.isAmWiki(editPath);
if (root) {
mngWiki.checkAddWiki(root);
//选取导出地址
eDialog.showOpenDialog({properties: ['openDirectory']}, (data) => {
if (data && data.length) {
//开始导出
exportGithub.export(root, data[0].replace(/\\/g, '/'));
}
});
return;
}
}
alert('导出失败!\n只能对一个 amWiki 项目进行导出!');
},
//命令显示about
'amWiki:about': () => {
this._showAbout();
}
}));
//自动化模块启动
autoNav.start(this._wikis);
dropFile.listenDrop(this._getEditorPath);
//绑定到全局 window
window.amWikiState = {
config: this._config,
wikis: this._wikis,
clearWikis: () => this._wikis = {}
};
//为配合命令行板块,使用基于 promise 的 confirm2 与 prompt2 替代同步执行的 confirm 与 prompt
window.confirm2 = (msg) => {
return new Promise((resolve, reject) => {
resolve(confirm(msg));
});
};
//window.prompt2 = (msg) => {};
},
/**
* 当atom即将关闭终止所有监听
* @public
*/
deactivate: function () {
localServer.destroy();
autoNav.destroy();
this._subscriptions.dispose();
window.amWikiState = null;
},
/**
* 当atom窗口被挂起保存文库列表
* @returns {{config: Object, wikis: [Object]}}
* @public
*/
serialize: function () {
return {
config: this._config,
wikis: this._wikis
};
},
/**
* 显示 amWiki 相关信息
* @private
*/
_showAbout: function () {
atom.packages.activatePackage('amWiki').then((pkg) => {
const content = 'amWiki v' + pkg.metadata.version + '\n' +
'https://github.com/TevinLi/amWiki\n' +
'MIT Copyright(c) 2016-2099 Tevin Li, amwiki.org.\n';
alert(content);
//TODO: 升级关于弹窗
//var c = atom.workspace.addModalPanel({item: document.createElement('div'), className: 'amWiki-about'})
});
},
/**
* 获取当前文档路径,先检查当前是否处于文档编辑状态才返回
* @returns {[Boolean|Object|String]}
* @private
*/
_getEditorPath: function () {
const editor = atom.workspace.getActiveTextEditor();
if (!editor) {
return [false];
}
const grammar = editor.getGrammar();
if (!grammar) {
return [false, editor];
}
const ePath = editor.getPath().replace(/\\/g, '/');
if (ePath.substr(-3) !== '.md') {
return [false, editor, ePath];
}
if (ePath.indexOf('library') < 0) {
return [false, editor, ePath];
}
return [true, editor, ePath];
}
};
})();
module.exports = main;