nyx_server
Version:
Node内容发布
89 lines (80 loc) • 3.39 kB
JavaScript
/* global global */
var _ = require("lodash");
var path = require('path');
var projects_cache_path = global.nxyConfig.projects_cache_path;
/**
* 资源转换
*/
function UriResource(){}
/**
* 转换到cdn地址
*/
UriResource.prototype.transToCdnUrl = function(){
};
/**
*
*/
UriResource.prototype.transformUrl = function(content , resourceBaseUrl){
var workDir = global.nxyConfig.workDir;
if(resourceBaseUrl.substring(0,projects_cache_path.length) == projects_cache_path){
workDir = projects_cache_path;
}
content = commonReplace(content , resourceBaseUrl , workDir);
return requireReplace(content , resourceBaseUrl , workDir);
};
//普通替换
var commonReplace = function(content , resourceBaseUrl , workDir){
var patterns = [
/<a[^\>]+href=['"]([^"']+)["']/gi,
/<link[^\>]+href=['"]([^"']+)["']/gi,
/<img[^\>]+src=['"]?([^"']+)["']?/gi,
/[\s|:]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 = path.join(resourceBaseUrl , url);
if(!/^\s*http:\/\//i.test(url) && !/^\s*https:\/\//i.test(url)
&& !/\s*<%{1,2}[=|-]((?!%>).)*%>/g.test(url)
&& !/\s*{{((?!}}).)*}}/g.test(url)
&& !/^\s*javascript/i.test(url)
&& (url.indexOf("/")!=0)){
var relativePath = path.relative(workDir,resloveUrl);
return match.replace(url, "/resources/"+relativePath).replace(/\\/g,"/");
}else{
return match;
}
});
});
return content;
};
var requireReplace = function(content , resourceBaseUrl , workDir){
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 = path.join(resourceBaseUrl , path2);
if(!/^\s*http:\/\//i.test(path2) && /^\s*https:\/\//i.test(path2)
&& !/\s*<%{1,2}[=|-]((?!%>).)*%>/g.test(path2)
&& !/\s*{{((?!}}).)*}}/g.test(path2)
&& !/^\s*javascript/i.test(path2)
&& (url.indexOf("/")!=0)){
var relativePath = "/resources/"+path.relative(workDir,resloveUrl).replace(/\\/g,"/");
content = content.replace(path1, '"'+relativePath+'"');
}
}
}
}
return content;
};
module.exports = new UriResource();