UNPKG

nyx_server

Version:

Node内容发布

179 lines (165 loc) 6.95 kB
/* global process */ var path = require('path'); var fs = require("fs"); var help = require("../../optimist/help"); var log4js = require("log4js"); var log = log4js.getLogger("nyx build"); var glob = require("glob"); var pubishUtil = require("../../core/utils/PublishUtil"); var config = require("../../config/default-config"); var Promise = require("bluebird"); var jwt = require('jsonwebtoken'); var cert = "1OTzi54b7C549J4roOPsKuNUzNW93dMI1Vt2m5MYRYsEQuwIKXRYyMNy1ArKOAYoKqbZkc0jENKjJ4ZSCYom2bmeS2qYWQ7A2KeAp3DoOfNeKfxcaKbaoq2bmZUsMVD3jwXPWwjEFjuZr4aorbKhg4nK5XMquGUH5ij98cUSFHVD9xrf9WEykssdJlL7wK5sZXxJjC3D6r8iDIiUz2j1qW5qigxPT7tFVfPdZZF20V95Gdd7g9m0ZastvwBe8jXW"; /** * 替换资源为cdn路径 */ module.exports.replacecdn = function(cdnpath , baseDir /*, callback*/){ return new Promise(function(resolve , reject){ glob("**/*.{ejs,html,css}", {'cwd':baseDir}, function (err, files) { if(err){ reject(err); }else{ resolve(files); } }); }).map(function(filename){ var fullpath = path.join(baseDir , filename); return new Promise(function(resolve , reject){ fs.readFile(fullpath , "utf-8" , function(err , content){ if(err){ reject(err); } content = commonReplace(content , cdnpath , baseDir , filename); content = requireReplace(content , cdnpath , baseDir , filename); fs.writeFile(fullpath , content , function(err){ if(err){ reject(err); }else{ resolve(fullpath); } }); }); }); }).catch(function(err){ throw err; }); }; /** * 上传cdn资源 */ module.exports.uploadcdn = function(cdnpath , baseDir/* , callback*/){ return new Promise(function(resolve , reject){ glob("**/*.!(ejs)", {'cwd':baseDir}, function (err, files) { if(err){ reject(err); }else{ resolve(files); } }); }).map(function(filename){ return new Promise(function(resolve , reject){ var fullpath = path.join(baseDir , filename); fs.readFile(fullpath , function(err , data){ if(err){ log.error("upload file `"+fullpath+"` error . "+err); reject({"type":"readFileErr" , "message":"readFile "+fullpath+" error" , "filename":fullpath}); }else{ var uploadPath = fullpath.replace(baseDir ,''); uploadPath = uploadPath.replace(/\\/g , "/"); var time = (new Date()).getTime(); var token = jwt.sign({ 'fe.cid': config.IFENG_IMG , 'fe.filepath': cdnpath+uploadPath , 'time':time}, cert , { algorithm: 'HS256' }); var p = pubishUtil.sendFile(data , path.basename(fullpath) , [ {fname:'fe.cid' , fvalue : config.IFENG_IMG } ,{fname: 'fe.filepath' , fvalue :cdnpath+uploadPath} ,{fname :'fe.syncflag' ,fvalue: '1'} , {fname :'username' ,fvalue: 'yhstyg'} , {fname :'token' ,fvalue: token} ]).then(function(){ return {'filename':fullpath , 'cdnpath':cdnpath+uploadPath}; }).catch(function(err){ throw err; }); resolve(p); } }); }); }).catch(function(err){ throw err; }); }; //普通替换 function commonReplace(content , fullcdnpath , rootpath , filepath){ var patterns = [ /<link[^\>]+href=['"]([^"']+)["']/gi, /<img[^\>]+src=['"]?([^"']+)["']?/gi, /url\s*\(\s*([^\(\)]+)\s*\)/gi, /<script[^\>]+src=['"]([^"']+)["']/gi, /\(\s*src=['"]([^"']+)["']/gi ]; patterns.forEach(function(regex){ content = content.replace(regex , function(match , url , offset, string){ var resloveUrl = reslovePath(url , rootpath , filepath); var sp = ''; if(!/^\/\W/.test(url)){ sp += '/'; }; if(!/^http:\/\//i.test(url) && !/s*<%/i.test(url)){ return match.replace(url, fullcdnpath +sp+ resloveUrl); }else{ return match; } }); }); return content; } function requireReplace(content , fullcdnpath , rootpath , filepath){ var contentBlocks = content.match(/requirejs.config(?:\r|\n|\s|\(\s*{)*paths(?:\r|\n|\s)*:(?:\r|\n|\s)*{([^}]*)}/gi); //得到paths的内容 if(!contentBlocks){ return content; } for(var i=0 ; i<contentBlocks.length ; i++){ var block = contentBlocks[i]; var arr = block.match(/["']+[^"']*["']+[\s]*:[\s]*["']+([^"']*)["']+/gi); if(typeof arr !== 'undefined'){ for(var j=0 ; j<arr.length ; j++){ var c = arr[j] var m = /["']+[^"']*["']+[\s]*:[\s]*(["']+([^"']*)["'])+/gi.exec(c); var path1 = m[1]; //带引号的地址 var path2 = m[2]; //地址 var resloveUrl = reslovePath(path2 , rootpath , filepath); var sp = ''; if(!/^http:\/\//i.test(path2) && !/s*<%/i.test(path2)){ if(!/^\/\W/.test(path2)){ sp += '/'; }; content = content.replace(path1, '"'+fullcdnpath +sp+ resloveUrl+'"'); } } } } return content; } /** *路径解析 * @param url 需要替换的url * @param rootpath 根目录 * @param filepath 文件完整路径名(包含文件名) */ function reslovePath(url , rootpath , filepath){ filepath = filepath.substring(0 , filepath.lastIndexOf('/')); //得到文件路径 while(true){ var lastindex = url.lastIndexOf('../'); if(lastindex == -1){ break; } url = url.replace('../' , ''); filepath = filepath.substring(0 , filepath.lastIndexOf('/')); } url = url.replace('./' , '/'); filepath = filepath.replace(rootpath , ''); var ret = filepath+'/'+url; if(ret.substring(0,1)=='/'){ return ret.substring(1); } return ret; }