nodejs 函数 :html2js
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的更多相关文章
- Nodejs的运行原理-架构篇
前言 本来是想只做一个Nodejs运行原理-科普篇,但是收到了不少私信,要我多分享一些更进阶,更详细的内容,所以我会在接下来的两个月里继续更新Nodejs运行原理. PS:此系列只做Nodejs的运行 ...
- nodejs 2017
1. nodejs函数 path() nodejs全局变量 __dirname a.js // 运行 node a.js var path = require('path'); console.l ...
- nodejs(二) --- 重要知识点回顾
1. 运行一个nodejs文件, 如一个js文件中只含有console.log("hello world");的文件,我们再git里运行node,即 node hello.js 即 ...
- 前端知识体系-NodeJS相关】NodeJS基础知识全面总结
NodeJS基础知识 1. Node的全局对象和全局变量 1.1 全局对象:所有模块都可以调用的 global:表示Node所在的全局环境,类似于浏览器的window对象. process:该对象表示 ...
- nodejs 代码设计模式1:同步函数变异步
同步函数变异步 1 问题: 1.1 碰到需要调用你刚正在创建的对像. function createServer(data, cb) { data.num = 1; cb(); return data ...
- Nodejs的运行原理-函数回调篇
前言 当客户端向http server 发起TCP链接时,server端会发起一系列的callback调用,这是一个逆向调用的过程:开始于libuv,终止于js代码里的callback(promise ...
- nodejs中处理回调函数的异常
如果是使用nodejs+express3这个经典的组合,那么有一种很方面的处理回调函数异常的方法: 1. 安装模块:express-domain-middleware 2. 加入如下的代码: app. ...
- nodejs + 小程序云函数 生成小程序码
前言:这个东西坑死我了 业务需求要生成小程序码 然后我找了两天的资料 运行 生成一堆的乱码 死活就是不能生成 最后看了一遍博客 套用了一下 自己又简单的改了一下 nodejs 我是刚刚接触 有很多 ...
- NodeJS 模块&函数
NodeJS 模块&函数 nodejs的多文件操作通过模块系统实现,模块和文件一一对应.文件本身可以是javascript代码.JSON或编译过的C/C++扩展 基本用法 nodeJS通过ex ...
随机推荐
- Netflix:我们为什么要将 GraphQL 引入前端架构? (转)
在刚开始时,Monet 的 React UI 层需要访问由 Tomcat 服务器提供的传统 REST API.随着时间的推移,随着应用程序的发展,我们的用例变得越来越复杂,即使是一个简单页面也需要从各 ...
- NAT资料
第1章 NAT 1.1 NAT概述 1990年代中期,NAT是作为一种解决IPv4地址短缺以避免保留IP地址困难的方案而流行起来的.网络地址转换在很多国家都有很广泛的使用.所以NAT就成了家庭和小型办 ...
- Linux防火墙iptables的基础
一.网络访问控制 1.Linux一般都是作为服务器系统使用,对外提供一些基于网络的服务 2.通常我们都需要对服务器进行一些网络访问控制,类似防火墙的功能 3.常见的访问控制包括:哪些IP可以访问服务器 ...
- 解决RAID重启后自动更名为md127
创建完raid后查看/etc/有没有生成mdadm.conf文件 如果没有执行命令:mdadm --detail --scan >> /etc/mdadm.conf 编辑配置文件/etc/ ...
- Beta 冲刺 (3/7)
Beta 冲刺 (3/7) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务 文字/口头描述 参与开发关键词提醒部分 展示GitHu ...
- python基础提高演练(名片管理系统的开发)
综合应用 —— 名片管理系统 目标 综合应用已经学习过的知识点: 变量 流程控制 函数 模块 开发 名片管理系统 系统需求 1. 程序启动,显示名片管理系统欢迎界面,并显示功能菜单 ********* ...
- python2入门(2)
四.python条件语句 if语句基本语法if 判断条件: 执行语句块else if: 执行语句块else: 执行语句 五.循环语句 1 - while循环基本语法while 判断条件: 执行语句块w ...
- C# 图片处理方法 整理汇总
/// <summary> /// 图片转为base64编码字符 /// </summary> /// <param name="path">图 ...
- spark on yarn运行产生jar包冲突问题
1.1 问题描述 Spark Streaming程序解析protobuf序列化的数据时,--jars 来添加依赖的protobuf-java-3.0.0.jar包,使用local模式程序正常,使用ya ...
- 公共表达式消除(UVa 12219)
紫书354页的题,将表达式树进行公共表达式消除,化为等价的图.因为需要判断某一个是否出现过,所以需要快速比较,采用哈希表的形式,将a~b与1~27一一对应,不采用0,因为0与0000是相同的,对于每一 ...