2023-05-10 20:24:29 +08:00
|
|
|
|
import RuleInterface from "./RuleInterface";
|
2024-11-17 19:57:08 +08:00
|
|
|
|
import * as ValUtil from "../../../util/ValUtil";
|
2023-05-10 20:24:29 +08:00
|
|
|
|
import FileObj from "../../vo/FileObj";
|
2024-11-17 19:57:08 +08:00
|
|
|
|
import {dealFileName} from './RuleInterface';
|
2023-05-10 20:24:29 +08:00
|
|
|
|
import path from 'path';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export default class ReplaceRule implements RuleInterface {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 1:替换第一个,2:替换最后一个,3:全部替换
|
|
|
|
|
*/
|
|
|
|
|
type: number;
|
|
|
|
|
/**
|
2024-11-17 19:57:08 +08:00
|
|
|
|
* 源
|
2023-05-10 20:24:29 +08:00
|
|
|
|
*/
|
|
|
|
|
source: string;
|
|
|
|
|
/**
|
2024-11-17 19:57:08 +08:00
|
|
|
|
* 目标
|
2023-05-10 20:24:29 +08:00
|
|
|
|
*/
|
|
|
|
|
target: string;
|
2024-11-17 19:57:08 +08:00
|
|
|
|
/**
|
|
|
|
|
* 是否正则模式
|
|
|
|
|
*/
|
|
|
|
|
regFlag: boolean;
|
|
|
|
|
/**
|
|
|
|
|
* 是否区分大小写
|
|
|
|
|
*/
|
|
|
|
|
regI: boolean;
|
|
|
|
|
/**
|
|
|
|
|
* 是否护理拓展名
|
|
|
|
|
*/
|
|
|
|
|
ignorePostfix: boolean;
|
2023-05-10 20:24:29 +08:00
|
|
|
|
|
|
|
|
|
constructor(data: any) {
|
|
|
|
|
this.type = data.type;
|
|
|
|
|
this.source = data.source;
|
|
|
|
|
this.target = data.target;
|
2024-11-17 19:57:08 +08:00
|
|
|
|
this.regFlag = ValUtil.nullToDefault(data.regFlag, false);
|
|
|
|
|
this.regI = ValUtil.nullToDefault(data.regI, false);
|
|
|
|
|
this.ignorePostfix = ValUtil.nullToDefault(data.ignorePostfix, false);
|
2023-05-10 20:24:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
deal(file: FileObj): void {
|
2024-11-17 19:57:08 +08:00
|
|
|
|
let targetStr = this.ignorePostfix ? file.realName : file.name;
|
|
|
|
|
let res = this.regFlag ? this.dealReg(targetStr) : this.dealNoReg(targetStr);
|
|
|
|
|
dealFileName(file, res, this.ignorePostfix);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private dealNoReg(targetStr: string): string {
|
2023-05-10 20:24:29 +08:00
|
|
|
|
let start = 0;
|
2024-11-17 19:57:08 +08:00
|
|
|
|
let arr: number[] = [];
|
|
|
|
|
for (let i = 0; i < (this.type == 1 ? 1 : 1000); i++) {
|
|
|
|
|
let one = targetStr.indexOf(this.source, start);
|
|
|
|
|
if (one == -1) {
|
2023-05-10 20:24:29 +08:00
|
|
|
|
break;
|
|
|
|
|
}
|
2024-11-17 19:57:08 +08:00
|
|
|
|
arr.push(one);
|
|
|
|
|
start = one + this.source.length;
|
|
|
|
|
}
|
|
|
|
|
if (arr.length == 0) {
|
|
|
|
|
return targetStr;
|
|
|
|
|
}
|
|
|
|
|
let res = "";
|
|
|
|
|
let needDealArr: number[] = this.type === 1 ? [arr[0]] : this.type === 2 ? [arr[arr.length - 1]] : arr;
|
|
|
|
|
let lastIndex = 0;
|
|
|
|
|
for (let i = 0; i < needDealArr.length; i++) {
|
|
|
|
|
res += targetStr.substring(lastIndex, needDealArr[i]) + this.target;
|
|
|
|
|
lastIndex = needDealArr[i] + this.source.length;
|
2023-05-10 20:24:29 +08:00
|
|
|
|
}
|
2024-11-17 19:57:08 +08:00
|
|
|
|
res += targetStr.substring(lastIndex);
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private dealReg(targetStr: string): string {
|
|
|
|
|
let templateReg = new RegExp("#\{group(\\d+\)}", "g");
|
|
|
|
|
let templateArr: string[][] = [];
|
|
|
|
|
while (true) {
|
|
|
|
|
let one = templateReg.exec(this.target);
|
|
|
|
|
if (one == null) {
|
|
|
|
|
break;
|
2023-05-10 20:24:29 +08:00
|
|
|
|
}
|
2024-11-17 19:57:08 +08:00
|
|
|
|
templateArr.push([one[0], one[1]]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let reg = new RegExp(this.source, this.regI ? "g" : "ig");
|
|
|
|
|
let arr: RegExpExecArray[] = [];
|
|
|
|
|
for (let i = 0; i < (this.type == 1 ? 1 : 1000); i++) {
|
|
|
|
|
let one = reg.exec(targetStr);
|
|
|
|
|
if (one == null) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
arr.push(one);
|
|
|
|
|
}
|
|
|
|
|
if (arr.length == 0) {
|
|
|
|
|
return targetStr;
|
|
|
|
|
}
|
|
|
|
|
let res = "";
|
|
|
|
|
let needDealReg: RegExpExecArray[] = this.type === 1 ? [arr[0]] : this.type === 2 ? [arr[arr.length - 1]] : arr;
|
|
|
|
|
let lastIndex = 0;
|
|
|
|
|
for (let i = 0; i < needDealReg.length; i++) {
|
|
|
|
|
let reg = needDealReg[i];
|
|
|
|
|
let target = this.target;
|
|
|
|
|
templateArr.forEach(item => target = target.replace(item[0], ValUtil.nullToDefault(reg[parseInt(item[1])], '')));
|
|
|
|
|
res += targetStr.substring(lastIndex, reg.index) + target;
|
|
|
|
|
lastIndex = reg.index + reg[0].length;
|
2023-05-10 20:24:29 +08:00
|
|
|
|
}
|
2024-11-17 19:57:08 +08:00
|
|
|
|
res += targetStr.substring(lastIndex);
|
|
|
|
|
return res;
|
2023-05-10 20:24:29 +08:00
|
|
|
|
}
|
|
|
|
|
}
|