nyx_server
Version:
Node内容发布
179 lines (165 loc) • 6.95 kB
JavaScript
/* 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;
}