UNPKG

v-kitty

Version:

hello kitty

192 lines (180 loc) 5.77 kB
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;