didi-command-preview
Version:
fis preview command.
380 lines (347 loc) • 12 kB
JavaScript
/*
* fis
* http://fis.baidu.com/
*/
;
// var choose = require("chosen").choose;
// console.log("What is your favorite language?");
// choose(
// ["English", "Klingon", "Malbolge"],
// function(answer, index) {
// console.log("I like " + answer + ", too!");
// },
// {} // options
// );
// var server = require('./lib/server.js');
var _util = require('./lib/util.js'),
_choose = require('chosen').choose,
_os = require('os'),
_Q = require('q'),
_fs = require('fs'),
_http = require('http'),
_path = require('path'),
_spawn = require('child_process').spawn,
_ = require('underscore'),
_open = require("open"),
_copy = require("copy"),
_del = require("delete"),
_imgRenderPath = _path.join(__dirname, 'lib/imgRender.js');
var serverRoot = getServerRoot(),
previewFolderName = 'preview',
imgFolderName = 'img',
previewPath = _path.join(serverRoot, previewFolderName),
previewImgPath = _path.join(serverRoot, previewFolderName, imgFolderName),
port = getServerInfo().port,
_phantomjsPath = _path.join(__dirname, 'lib/phantomjs'),
urlPrefix;
exports.name = 'preview';
exports.usage = '<command> [options]';
exports.desc = 'about pages preview';
exports.register = function(commander) {
commander
// .option('-i, --previewimg', 'monitor the changes of project')
.action(function() {
var options = arguments[arguments.length - 1];
var args = Array.prototype.slice.call(arguments);
var cmd = args.shift();
switch (cmd) {
case 'create':
// createPreview(options.previewimg);
createPreview();
break;
case 'open':
getUrlPrefix(port).then(function(urlPrefix) {
console.log(urlPrefix);
_open(urlPrefix+"/"+previewFolderName+"/");
})
break;
default :
commander.help();
}
});
commander
.command('open')
.description('open pages preview in browser');
commander
.command('create')
.description('create pages preview and save to server root');
};
//didi preview create
function createPreview(flagPreviewimg) {
//删除preview文件夹
_del.sync(previewPath, {
force: true
});
//获取urlPrefix
getUrlPrefix(port)
//获取所有url
.then(function(prefix) {
// console.log('get pages from server root');
urlPrefix = prefix;
return _Q.all([
_Q.Promise(function(resolve, reject, notify) {
getPageNames(serverRoot + '/page' , 'html').then(function(pageNames) {
var phpPages = [];
pageNames.forEach(function(n, i) {
phpPages.push({
pageUrl: urlPrefix + '/' + n + '/' ,
pageUrlRelative: '/' + n + '/' ,
pageName: n
});
})
resolve(phpPages);
})
}),
_Q.Promise(function(resolve, reject, notify) {
getPageNames(serverRoot + '/template' , 'tpl').then(function(pageNames) {
var smartyPages = [];
pageNames.forEach(function(n, i) {
smartyPages.push({
pageUrl: urlPrefix + '/smarty/' + n + '/' ,
pageUrlRelative: '/smarty/' + n + '/' ,
pageName: n
});
})
resolve(smartyPages);
})
}),
// 确认phantomjs是否已下载到 /lib/phantomjs
downloadPhantomjs()
]);
})
//生成所有图片
.then(function(arrPage) {
var urls = arrPage[0].concat(arrPage[1]);
if(urls.length == 0){
// throw '请先release';
return _Q.reject('请先release');
}
console.log('create preview of ' + urls.length + ' pages');
var arrPromise = [];
urls.forEach(function(pageInfo) {
arrPromise.push(getPreviewImg(
flagPreviewimg,
pageInfo.pageUrl,
pageInfo.pageName,
pageInfo.pageUrlRelative
));
})
return _Q.all(arrPromise);
})
//获取生成的数据结构arrUrl, 生成html
.then(function(pages) {
console.log('create preview guide page');
//index.php
var template = _fs.readFileSync(
_path.join(__dirname, 'template/index.tpl'),
{ encoding:'utf8' }
);
var html = _.template(template)({
pages: pages,
resourcePath: '/' + previewFolderName
});
// console.log(1);
var fileName = _path.join(previewPath, 'index.php');
_fs.writeFileSync(fileName, html);
//复制其他文件
_copy(_path.join(__dirname, 'template/**.@(js|css)'), previewPath);
console.log('create preview success');
//open preivew
_open(urlPrefix+"/"+previewFolderName+"/");
return;
}).catch(function (err) {
console.log("出错了。", err);
})
}
//promise: 选择一个当前可用ip
function getUrlPrefix(port) {
return _Q.when("http://127.0.0.1:"+port);
var addressArray = [];
var network = _os.networkInterfaces();
for(var key in network) {
if(network[key].length>=2){
addressArray.push(network[key][1].address);
}
}
console.log(addressArray);//return;
console.log('Please select an IP. It will be used to form the address of the pages.');
return _Q.Promise(function(resolve, reject, notify) {
_choose(
addressArray,
function(ip, index) {
if(ip == null) {
reject();
} else {
var urlPrefix = 'http://' + ip + ':' + port;
resolve(urlPrefix);
}
},{}
);
});
}
function getPageNames(root, ext) {
return _Q.Promise(function(resolve, reject, notify) {
if(_fs.existsSync(root)){
_fs.readdir( root, function(err, files) {
if(err == null) {
var reg = new RegExp( "\." + ext + "$" );
for (var i = 0; i < files.length; i++) {
if(!reg.test(files[i])){
files.splice(i, 1);
i--;
} else {
files[i] = files[i].replace(reg, '');
}
};
resolve(files);
} else {
resolve([]);
}
})
} else {
resolve([]);
}
})
}
function getPreviewImg(flagPreviewimg, pageUrl, pageName, pageUrlRelative) {
var deferred = _Q.defer();
// var phantomPath = _path.join(__dirname, 'lib/phantomjs');
console.log('open page and create preview image:' + pageUrl);
var processPantom = _spawn(_phantomjsPath, [
_imgRenderPath,
previewImgPath,
pageUrl
]);
processPantom.stdout.on('data', function(data) {
data = data.toString().replace(/\r|\n/g, '')
console.log(data);
if(/^RenderSucc:/.test(data)){
data = data.replace(/^RenderSucc:/, '');
data = JSON.parse(data);
deferred.resolve({
// pageUr: pageUrl,
pageUrl: pageUrlRelative,
pageTitle: data.pageTitle || pageName,
pageName: pageName,
imgUrl: '/' + previewFolderName + '/' + imgFolderName + '/' + data.imgFileName
});
} else {
console.log(pageUrl + '\nconsole:' + data);
}
})
return deferred.promise;
}
// function getPreviewImg(flagPreviewimg, pageUrl, pageName, pageUrlRelative) {
// var deferred = _Q.defer();
// console.log('open page and create preview image:' + pageUrl);
// var phantomPath = _path.join(__dirname, 'node_modules/phantomjs/bin/phantomjs');
// var processPantom = _spawn(phantomPath, [
// _imgRenderPath,
// previewImgPath,
// pageUrl
// ]);
// processPantom.stdout.on('data', function(data) {
// data = data.toString().replace(/\r|\n/g, '')
// console.log(data);
// if(/^RenderSucc:/.test(data)){
// data = data.replace(/^RenderSucc:/, '');
// data = JSON.parse(data);
// deferred.resolve({
// // pageUr: pageUrl,
// pageUrl: pageUrlRelative,
// pageTitle: data.pageTitle || pageName,
// pageName: pageName,
// imgUrl: '/' + previewFolderName + '/' + imgFolderName + '/' + data.imgFileName
// });
// } else {
// console.log(pageUrl + '\nconsole:' + data);
// }
// })
// return deferred.promise;
// }
function getRoot(root){
if(fis.util.exists(root)){
if(!fis.util.isDir(root)){
fis.log.error('invalid document root');
}
} else {
fis.util.mkdir(root);
}
return fis.util.realpath(root);
}
//support glob: a**,b**,/usr**,/*/*
function glob(str, prefix) {
var globArr = str.split(',');
var group = [];
var s_reg;
globArr.forEach(function(g) {
if (g.length > 0) {
s_reg = fis.util.glob(g).toString();
//replace
// '/^' => ''
// '$/i' => ''
s_reg = s_reg.substr(2, s_reg.length - 5);
group.push(s_reg);
}
});
prefix = prefix || '';
if (prefix) {
s_reg = fis.util.glob(prefix).toString();
// '/^' => '', '%/i' => ''
prefix = s_reg.substr(2, s_reg.length - 5);
}
return new RegExp('^'+ prefix + '(' + group.join('|') + ')$', 'i');
}
function getServerInfo() {
var conf = _util.getRCFile();
if (fis.util.isFile(conf)) {
return require(conf);
}
return {};
}
function deleteServerInfo() {
var conf = _util.getRCFile();
if (fis.util.isFile(conf)) {
fis.util.del(conf);
}
}
function getServerRoot() {
var serverInfo = getServerInfo();
var key = 'FIS_SERVER_DOCUMENT_ROOT';
if(process.env && process.env[key]){
var path = process.env[key];
if(fis.util.exists(path) && !fis.util.isDir(path)){
fis.log.error('invalid environment variable [' + key + '] of document root [' + path + ']');
}
return path;
} else if (serverInfo['root']) {
return serverInfo['root'];
} else {
return fis.project.getTempPath('www');
}
}
function downloadPhantomjs() {
if(fis.util.exists(_phantomjsPath)){
return _Q.when('');
} else {
console.log('downloading phantomjs...');
return _Q.promise(function(resolve) {
var Download = require('download');
new Download({mode: '755', extract: true})
.get('http://fe.in.didialift.com:8088/fe/gaozhenze/others/phantomjs.gzip')
.dest(_path.join(__dirname, "lib"))
.run(function() {
resolve();
});
});
}
// _Q.promise(function(resolve) {
// var writestream = _fs.createWriteStream(_phantomjsPath);
// _http.get('http://fe.in.didialift.com:8088/fe/gaozhenze/others/phantomjs.gzip', function (res) {
// res.pipe(writestream);
// });
// writestream.on('finish', function () {
// resolve();
// });
// })
}