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 ...
随机推荐
- HTTP 错误 500.19 - Internal Server Error v4.0.30319
1 打开运行,输入cmd进入到命令提示符窗口.2 进入到C:\Windows\Microsoft.NET\Framework\v4.0.30319 目录.3 输入aspnet_regiis.exe - ...
- pfSense-2.4.4安装教程
一.说明 1.1 pfSense是什么 pfSense是基于FreeBSD的.开源中最为可靠(World's Most Trusted Open Source Firewall)的.可与商业级防火墙一 ...
- vscode extensions
├─ .obsolete├─ .wlck├─ .wtid├─ abeyuhang.vscode-lesslint-0.0.1├─ abusaidm.html-snippets-0.2.1├─ adam ...
- 搜狗浏览器或者360浏览器安装chrome 浏览器插件
https://www.cnblogs.com/ingvar/p/6403777.html#undefined
- 用python做一个烟花show
烟花效果如图(截了几个时刻的静态图): 源代码如下: # -*- coding: utf-8 -*- # Nola import tkinter as tk from PIL import Image ...
- mysql varchar存储最大
utf-8的汉字 3个字节,varchar()括号中的数字是可存储的最大字符数,但是总和不超过65535个字节,这是行的size限制的,除以3差不多21800多,算上其他列等信息,如果用最大的话设置2 ...
- letCode-2
letCode第二题题目如下: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则 ...
- 测试同学必备抓包工具--charles之安装
1,下载charles,官网:https://www.charlesproxy.com/ 2,下载完成,先试着用一下,网址访问百度看看... 注意,windows proxy如果勾选,则代表可以抓取网 ...
- linux下vim的安装及其设置细节
第一步:使用apt安装vim sudo apt-get install vim 第二步:行号及其tab建设置 vim ~/.vimrc 添加如下文字 set nu //代码显示行号syntax on ...
- 剑指Offer 43. 左旋转字符串 (字符串)
题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=&quo ...