上次菜鸟打印组件升级,遇到之前模板不兼容的情况,需要做修改
本来想的是用户点击获取模板的时候,先去oss上面把文件处理完替换掉,但是写着写着发现,模板的oss域名和这个项目的oss的域名不是同一个……后端说她搞太麻烦了
可是,有上万份模板啊!!!
没办法,只能自己写个脚本去替换了
utf-8
之前打印组件的时候,模板文件前面多了个'\uFFEF'
从oss上读取文件的时候,发现第一位是这个
这三个字节和'\uFFEF'有啥关系呢?
把它转成二进制
| 239 | 187 | 191 |
|---|---|---|
| 11101111 | 10111011 | 10111111 |
由于是3个字节的,需要遵循下面格式提取
3 字节 1110xxxx 10xxxxxx 10xxxxxx
提取出来的数字是1111 1110 1111 1111
转换成16进制就是FEFF
思路
用nodejs账密的方式创建oss的实例client,然后拿到oss上面的文件列表list,list循环文件内容,然后用正则替换格式,最后再上传覆盖。
关键的地方在正则替换,之前忘记从哪里看了replace的高阶用法,这次就用上了
function transformTemplate(data) {
let needPost = false;
const handleResult = data.replace(/style=".*?"/gm, (all) => { // 不合法的空格在style="padding: 1px;"里面
return all.replace(/(.+?:)( )(.+?;)/gm, (childAll, key, space, value) => { // 这步把空格给去掉了,key="padding:",space=" ", value="1px;"
winlogger.info("含有空格的style:" + all);
needPost = true;
return key + value;
});
});
return {
needPost,
handleResult,
};
}
完整代码
const winlogger = require("./logger");
const oss = require("ali-oss");
const ali_oss = {
bucket: "***",
endPoint: "***",
};
const client = new oss({
region: "***",
accessKeyId: "***",
accessKeySecret: "***",
bucket: "yourbucketname",
});
client.useBucket(ali_oss.bucket);
async function list(dir) {
let continuationToken = null;
// 每页列举20个文件。
const maxKeys = 20;
do {
const result = await client.listV2({
"continuation-token": continuationToken,
"max-keys": maxKeys,
prefix: dir,
});
continuationToken = result.nextContinuationToken;
result.objects
.filter((item) => item.name.includes(".xml"))
.forEach((file) => {
winlogger.info("start handle:" + file.name);
getBuffer(file.name);
});
} while (continuationToken);
}
function transformTemplate(data) {
let needPost = false;
const handleResult = data.replace(/style=".*?"/gm, (all) => {
return all.replace(/(.+?:)( )(.+?;)/gm, (childAll, key, space, value) => {
winlogger.info("含有空格的style:" + all);
needPost = true;
return key + value;
});
});
return {
needPost,
handleResult,
};
}
async function getBuffer(name) {
try {
const result = await client.get(name);
winlogger.info("get content:" + name);
let data = result.content.toString();
const firstStr = data[0];
let needPostByFEFF = false;
if (firstStr === "\uFEFF") { // 去掉FEFF
winlogger.info("delete FEFF:" + name);
data = data.slice(1);
needPostByFEFF = true;
}
const { needPost, handleResult } = transformTemplate(data);
if (needPost || needPostByFEFF) {
winlogger.info("replace:" + name);
client.put(name, new Buffer(handleResult));
}
} catch (e) {
console.log(e);
winlogger.info(e);
}
}
list("windows/template-editor/template/debug/"); // 模板文件夹