v-kitty
Version:
hello kitty
192 lines (180 loc) • 5.77 kB
JavaScript
var fs = require('fs');
var path = require('path');
var EventEmitter = require('events').EventEmitter;
/**
* 解析文件
* @param actionFile {file:"xxx",content:"xxxx",type:'js',destFile:''}
*/
function parseFile(actionFile){
this.actionFile = actionFile;
this.init();
}
parseFile.prototype.init=function(){
var actionFile = this.actionFile;
this.parseInfo();
//如果是图片
if(/\.(jpeg|jpg|gif|png|webp)/i.test(actionFile.ext)){
var stat = fs.statSync(actionFile.file);
actionFile.content=actionFile.file+' '+ stat.mtime+' '+stat.ctime+' '+ stat.size;
}else{
actionFile.content = parseFile.beforeCompile(actionFile.content || fs.readFileSync(actionFile.file).toString(),actionFile);
}
this.parseContent();
actionFile.isActive = true;
actionFile.isNew = true;
actionFile.compile = '';
actionFile.emitter = new EventEmitter();
actionFile.bindings={changeSubs:{}};
this._bind(actionFile);
bufferFiles[actionFile.file] = actionFile;
};
parseFile.prototype._bind = function(bufferFile){
var self = this;
bufferFile.emitter.on('change',function(content){
bufferFile.bindings.change(content);
});
//bufferFile content change
bufferFile.emitter.on('update',function(content){
self.actionFile.content = content;
self.actionFile.isActive = true;
self.parseContent();
bufferFile.bindings.update();
});
//bufferFile delete
bufferFile.emitter.on('del',function(content){
bufferFile.bindings.del(content);
})
};
/**
* 解析文件详情
*/
parseFile.prototype.parseInfo = function(){
var actionFile = this.actionFile;
actionFile.ext = path.parse(actionFile.file).ext.replace(/\?.*$/);
actionFile.name=path.basename(actionFile.file);
};
/**
* 解析文件内容
*/
parseFile.prototype.parseContent = function(){
var actionFile = this.actionFile;
var self = this;
var depends = [];
var content = actionFile.content;
//_include开头\引入的名称必须有后缀(防止_include被另用)\_include后面的口号
var reg = new RegExp('('+config.tag+'\\([^\\)\\n]+\\))');
var parts = content.split(reg);
parts.forEach(function(part){
if(part.indexOf(config.tag)>-1){
depends.push(self._paseInclude(part.trim()));
}else{
var jsParts = part.split(/(require\([^\)]+?\))/);
jsParts.forEach(function(jsPart){
if(/require\([^\)\n]+\)/.test(jsPart)){
depends.push(self._parseRequire(jsPart.trim(),actionFile));
}else{
depends.push({
content:jsPart
})
}
})
}
});
this.actionFile.depends = depends;
};
parseFile.prototype._checkLoaderType = function(loaders){
if(loaders.indexOf('_require')>-1 || loaders.indexOf('jstag')>-1 || loaders.indexOf('babel')>-1){
return 'js';
}else{
return 'txt';
}
};
/**
* 解析include部分
* @private
*/
parseFile.prototype._paseInclude=function(includePart){
var actionFile = this.actionFile;
var result = {loaders:[]};
var index = includePart.indexOf(',');
var part1 = includePart.slice(0,index);
var m = part1.match(/\([\'\"]([^\(\'\"\)]+)/);
var includefile='';
if (m && m[1]) {
var mm =m[1].match(/._ac=[a-zA-Z0-9_]+/);
if(mm && mm[0]){
includefile = m[1].replace(/\?.*/,'');
result.param = m[1].replace(mm[0],'').replace(includefile,'');
result.loaders = result.loaders.concat(mm[0].replace(/._ac=/,'').split('_'));
}else{
includefile = m[1].replace(/\?.*/,'');
result.param = m[1].replace(includefile,'');
}
}
result.param = result.param.replace(/^\&/,'?');
if (includefile) {
if (/^\//.test(includefile)) {
includefile = config.baseDir + includefile;
} else {
includefile = path.resolve(path.dirname(actionFile.file), includefile);
}
}
result.file = includefile;
var parseOption = function (str) {
var data = '';
var m1 = str.match(/^[^\{]+(\{.+\}+)/);
if (m1 && m1[1]) {
try {
data = JSON.parse(m1[1]);
} catch (e) {
throw e;
}
}
return data;
};
result.options = parseOption(includePart);
var loaderType = this._checkLoaderType(result.loaders);
if(!bufferFiles[includefile]){
try{
new parseFile({file:includefile,type:loaderType});
}catch (e){
console.log('Error source(06): '+actionFile.file);
throw e;
}
}
return result;
};
/**
* 解析require部分
* @private
*/
parseFile.prototype._parseRequire=function(requirePart,actionFile){
var result = {};
result.options = '';
result.loaders=['_require'];
var m = requirePart.match(/\([\'\"]([^\(\'\"\)]+)/);
var requireFile = '';
if (m && m[1]) {
requireFile = m[1];
}
//result.name = requireFile;
if (requireFile) {
if (/^\//.test(requireFile)) {
requireFile = config.baseDir + requireFile;
} else {
requireFile = path.resolve(path.dirname(actionFile.file), requireFile);
}
}
result.file = requireFile;
var loaderType = this._checkLoaderType(result.loaders);
if(!bufferFiles[result.file]){
try{
new parseFile({file:result.file,type:loaderType});
}catch (e){
console.log('Error source(07): '+actionFile.file);
throw e;
}
}
return result;
};
module.exports=parseFile;