var fs = require("fs");
var path = require("path"); function propStringToMap(ss1) {
var propsMap = {};
var propsLength = 0;
var firstProp = null;
var xa = ss1.split(/["'][\s]+/);
for (var j = 0; j < xa.length; j++) {
var xaj = xa[j];
var xajPair = xaj.split('=');
if (xajPair.length === 2) {
var key = (xajPair[0] || "").trim();
var value = xajPair[1] || "";
if (key) {
var value1 = value.replace(/['"]/gm, '');
value1 = value1.trim();
propsMap[key] = value1;
propsLength++;
if (!firstProp) {
firstProp = key;
}
}
}
} return {
propsMap: propsMap,
propsLength: propsLength,
firstProp: firstProp
};
} function parseString2Html(html) { var templateArray = html.split('<string2-template'); var resultObject = {};
for (var i = 0; i < templateArray.length; i++) {
var str = (templateArray[i] || "").trim();
if (str.length > 0) {
var index = str.indexOf('>');
var ss1 = str.substring(0, index);
var ss2 = str.substring(index + 1, str.length);
ss1 = ss1.replace(/\\/mg, '');
ss1 = ss1.trim(); var templateContent = ss2.replace(/<\/string2-template>$/i, '');
templateContent = templateContent.trim();
templateContent = templateContent.replace(/\s+/gm, ' '); var propsResult = propStringToMap(ss1); var propsMap = propsResult.propsMap;
var propsLength = propsResult.propsLength;
var firstProp = propsResult.firstProp; var templateKey = propsMap['id'] || propsMap[firstProp]; if (propsLength === 1) {
resultObject[templateKey] = templateContent;
} else if (propsLength > 1) {
resultObject[templateKey] = {
content: templateContent,
propsMap: propsMap,
propsLength: propsLength,
firstProp: firstProp
};
}
}
} return resultObject; } function extendObject(a, b) {
for (var key in b) {
if (b.hasOwnProperty(key)) {
a[key] = b[key];
}
}
return a;
} function htmlArray2js(dirPath, htmlPathArray) {
var p = Promise.resolve(); for (var i = 0; i < htmlPathArray.length; i++) {
var htmlPath = (htmlPathArray[i] || '').trim();
if (htmlPath) {
p = p.then((function (dirPath, htmlPath) {
return function (result) {
result = result || {};
return new Promise(function (resolve, reject) {
var filePath = path.resolve(dirPath, htmlPath);
console.log(dirPath, filePath.toString()); if (filePath.indexOf(dirPath) !== 0) {
var errorMsg = {};
errorMsg["read_file_error_" + htmlPath] = "illegal access";
result = extendObject(result, errorMsg);
resolve(result);
return;
} fs.readFile(filePath, "utf-8", function (err, html) {
if (err) {
var errorMsg = {};
errorMsg["read_file_error_" + htmlPath] = "read file error";
result = extendObject(result, errorMsg);
resolve(result);
} else {
var htmlObject = parseString2Html(html);
result = extendObject(result, htmlObject);
resolve(result);
}
});
});
}
})(dirPath, htmlPath));
}
}
return p;
} function getHtml2JsContent(dirPath, htmls) {
var htmlPathArray = htmls.split(',');
var jsPromise = htmlArray2js(dirPath, htmlPathArray);
return jsPromise.then(function (js) {
var jsStr = JSON.stringify(js);
return jsStr;
});
} var JS_STR_CACHE = {}; /**
* app.get('/html2js', html2jsCombo(path.join(__dirname, '../static'),{
cache:false
})); <script src="/html2js?output=html2js&htmls=bixun/html/test.shtml"></script> * @param dirPath
* @param config
* @returns {Function}
*/
module.exports = function html2jsCombo(dirPath, config) {
return function (req, res) {
var req_query = req.query;
var htmls = req_query.html;
var output = req_query.output; var promise = null;
if (config.cache && JS_STR_CACHE[htmls]) {
promise = Promise.resolve(JS_STR_CACHE[htmls]);
} else {
promise = getHtml2JsContent(dirPath, htmls);
if (config.cache) {
promise = promise.then(function (jsStr) {
JS_STR_CACHE[htmls] = jsStr;
return jsStr;
});
}
} promise.then(function (jsStr) {
if (output) {
jsStr = "var " + output + " = " + jsStr;
res.writeHead(200, {
'Content-Type': 'application/javascript; charset=utf-8',
"Cache-Control": "public, max-age=31536000"
});
} else {
res.writeHead(200, {
'Content-Type': 'application/json'
});
}
res.write(jsStr);
res.end();
});
}
};

  

nodejs 函数 :html2js的更多相关文章

  1. Nodejs的运行原理-架构篇

    前言 本来是想只做一个Nodejs运行原理-科普篇,但是收到了不少私信,要我多分享一些更进阶,更详细的内容,所以我会在接下来的两个月里继续更新Nodejs运行原理. PS:此系列只做Nodejs的运行 ...

  2. nodejs 2017

    1.  nodejs函数 path()  nodejs全局变量 __dirname a.js // 运行 node a.js var path = require('path'); console.l ...

  3. nodejs(二) --- 重要知识点回顾

    1. 运行一个nodejs文件, 如一个js文件中只含有console.log("hello world");的文件,我们再git里运行node,即 node hello.js 即 ...

  4. 前端知识体系-NodeJS相关】NodeJS基础知识全面总结

    NodeJS基础知识 1. Node的全局对象和全局变量 1.1 全局对象:所有模块都可以调用的 global:表示Node所在的全局环境,类似于浏览器的window对象. process:该对象表示 ...

  5. nodejs 代码设计模式1:同步函数变异步

    同步函数变异步 1 问题: 1.1 碰到需要调用你刚正在创建的对像. function createServer(data, cb) { data.num = 1; cb(); return data ...

  6. Nodejs的运行原理-函数回调篇

    前言 当客户端向http server 发起TCP链接时,server端会发起一系列的callback调用,这是一个逆向调用的过程:开始于libuv,终止于js代码里的callback(promise ...

  7. nodejs中处理回调函数的异常

    如果是使用nodejs+express3这个经典的组合,那么有一种很方面的处理回调函数异常的方法: 1. 安装模块:express-domain-middleware 2. 加入如下的代码: app. ...

  8. nodejs + 小程序云函数 生成小程序码

    前言:这个东西坑死我了 业务需求要生成小程序码 然后我找了两天的资料 运行 生成一堆的乱码 死活就是不能生成 最后看了一遍博客 套用了一下 自己又简单的改了一下  nodejs 我是刚刚接触  有很多 ...

  9. NodeJS 模块&函数

    NodeJS 模块&函数 nodejs的多文件操作通过模块系统实现,模块和文件一一对应.文件本身可以是javascript代码.JSON或编译过的C/C++扩展 基本用法 nodeJS通过ex ...

随机推荐

  1. 为iframe添加onclick事件

    如果页面上有iframe时,鼠标点击在iframe内时,包含iframe的document是不响应任何事件的, 例如: $("#iframe1").click(function() ...

  2. Android studio 中,遇到报错:ERROR: x86_64 emulation currently requires hardware acceleration! CPU acceleration status:HAXM must be updated(version 1.1.1<6.0.1)的解决方法

    在 Android SDK 的安装目录下找到intelhaxm-android.exe安装即可.忘记目录位置直接在“计算机”中搜索,如果没有,返回Android studio 的“设置”,找到 这个图 ...

  3. Python3+qrcode+zxing生成和识别二维码教程

    一.安装依赖库 pip install qrcode pillow image zxing pillow是python3中PIL的代替库,image是生成图版需要用到的库 安装image时报错“Cou ...

  4. 【转载】如何将本地文件上传到github托管

    转自:http://www.cnblogs.com/babywin/p/6073124.html 清楚明白.  

  5. javascript接口注释法

    //注释法//简单,功能弱 利用 大型的项目靠得是规范和标准 有充分时间 缺点:人为的遵守/** interface personDao{* function add(obj);* function ...

  6. day35-python 操作memcache二

    Memcache常用命令 存储命令: set/add/replace/append/prepend/cas 获取命令: get/gets 其他命令: delete/stats.. add方法 添加一条 ...

  7. 并发,同步锁,Runnable,Callable,Future

    1.并发: 在我们的操作系统中,同一个时间点,有N个线程都想访问同一个程序!但是cpu只能运行一个! 这种情况就是! 多个线程在 同一个时间点 访问同一个资源,会引发线程不安全的问题! 怎么解决这种不 ...

  8. OSI七层模型与TCP/IP五层模型(转)

    reference:https://www.cnblogs.com/qishui/p/5428938.html         博主是搞是个FPGA的,一直没有真正的研究过以太网相关的技术,现在终于能 ...

  9. 2017年4月7日16:18:17 java8 常用记录

    List<String> customerUids = customerTagModel.stream().map(CustomerTagModel::getCustomerUid)   ...

  10. jQuery-2.DOM---节点的删除

    DOM节点删除之empty()的基本用法 要移除页面上节点是开发者常见的操作,jQuery提供了几种不同的方法用来处理这个问题,这里我们开仔细了解下empty方法 empty 顾名思义,清空方法,但是 ...