UNPKG

didi-command-preview

Version:
380 lines (347 loc) 12 kB
/* * fis * http://fis.baidu.com/ */ 'use strict'; // 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(); // }); // }) }