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. MySQL 导出用户权限

    Version <= 5.6 #!/bin/bash #Function export user privileges source /etc/profile pwd=****** expgra ...

  2. JavaScript 的setTimeout 和Angular中的$timeout的區別

    JavaScript中setTimeout返回值类型和意义说明: 1.setTimeout :暂停指定的毫秒数后执行指定的代码,返回值是id标识,这个id的意义就是通过clearTimeout来清理暂 ...

  3. CentOS 使用yum命令安装出现错误提示”could not retrieve mirrorlist http://mirrorlist.centos.org

    CentOS 使用yum命令安装出现错误提示"could not retrieve mirrorlist http://mirrorlist.centos.org这个错误, 在网上找了好多, ...

  4. Python-接口自动化(二)

    python基础知识(二) (二)常用控制流 1.控制语句 分支语句:起到一个分支分流的作用,类似马路上的红绿灯 循环语句:for while 可以使代码不断重复的执行 2.判断语句:关键字是if.. ...

  5. vue.js--遇到的一些错误

    1. <sapn> - did you register the component correctly? For recursive components, make sure to p ...

  6. C/C++ 宏技巧

    1. C 也可以模板化 #define DEFINE_ARRAY_TYPE(array_type_, element_type_) \ static inline int array_type_ ## ...

  7. python 2

    1. 格式化输出 %s 可以代替str %d 可以代替int %f  可以代替浮点数( float ) 格式: Name = input('你的名字:') Age = int(input('你的年龄: ...

  8. Python全栈之路----数据类型—字典

    字典:可变,一种key-value的数据类型 info = { 'stu1101' : 'TengLan Wu' , 'stu1102' : 'LongZe Luola' , 'stu1103' : ...

  9. 作用域&&闭包

    在了解闭包之前,先了解作用域一,作用域简单来说就是变量和函数可以访问的范围,在es5中变量作用域一般分为全局作用域和局部作用域,这个主要依据是全局变量还是局部变量 情景1: <script> ...

  10. Beanshell断言

    Beanshell断言示例一:通过从数据库查询结果集,和从接口返回中解析json格式的返回内容,比较两者来验证sample请求是否成功 1>先通过JDBC PreProcessor把测试计划中所 ...