docs: function combine(file, data, prefile) {
  	prefile && (file = util.resolveHCPath(prefile, file));
  	if (!fs.existsSync(prj_path+file) || !fs.statSync(prj_path+file).isFile()) {
  		err_log.push('MOKJS-402: '+(prefile ? prefile+' 引用的文件 ' : '文件 ')+
  			file+' 不存在！');
  		return;
  	}
  	if (combining[file]) {return} //处理循环依赖
  	combining[file] = true;
  	file_tree.push(util.repeat('|   ', tree_deep)+'|...'+file);
  	tree_deep++;
  
  	data || (data = {});
  	if (glb_data) {
  		for (var k in glb_data) {
  			data.hasOwnProperty(k) || (data[k] = glb_data[k]);
  		}
  	}
  	var mokdata = {};
  	var lines = fs.readFileSync(prj_path+file, charset).replace(reg_echo,
  		function (m) {
  			//写入data
  			m = m.slice(2, -2).trim();
  			if (/^[\$\w]*$/.test(m)) {
  				return data[m] || (data.hasOwnProperty(m) ? String(data[m]) : '');
  			}
  			m = execJS(m, data);
  			return m || (m===0 ? '0' : '');
  		}).replace(reg_mokdata, function (m, name, value) {
  			//提取mokdata
  			if (name.indexOf('.')<1) {return ''}
  			name = name.trim().split('.');
  			(mokdata[name[0]] || (mokdata[name[0]] = {}))[name[1]] = value;
  			return '';
  		}).replace(/\r/g, '').split('\n');
  	data = null;
  	var i = 0, len = lines.length,
  		line, inc_file;
  	for (; i < len; i++) {
  		line = lines[i];
  		inc_file = line.match(reg_mark);
  		if (inc_file) {
  			inc_file = inc_file[1].trim();
  			if (inc_file) {
  				data = line.indexOf('data=')>0 &&
  					line.slice(line.indexOf('{'), line.lastIndexOf('}') + 1);
  				if (data) {
  					data = parseJson(data);
  				} else {
  					data = line.match(/data=['"](.*?)['"]/);
  					data && (data = mokdata[data[1].trim()]);
  				}
  				combine(inc_file, data, file);
  			}
  		} else {
  			contents.push(line);
  		}
  	}
  
  	mokdata = null;
  	tree_deep--;
  	combining[file] = false;
  }