@q78kg/koishi-plugin-text-censor 1.0.4-beta.8 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- package/LICENSE +21 -0
- package/lib/index.js +2 -107
- package/package.json +21 -5
- package/readme.md +1 -1
- package/lib/index.d.ts +0 -9
package/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2020-present Shigma
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
package/lib/index.js
CHANGED
@@ -1,107 +1,2 @@
|
|
1
|
-
var
|
2
|
-
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
5
|
-
var __getProtoOf = Object.getPrototypeOf;
|
6
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
7
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
8
|
-
var __export = (target, all) => {
|
9
|
-
for (var name2 in all)
|
10
|
-
__defProp(target, name2, { get: all[name2], enumerable: true });
|
11
|
-
};
|
12
|
-
var __copyProps = (to, from, except, desc) => {
|
13
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
14
|
-
for (let key of __getOwnPropNames(from))
|
15
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
16
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
17
|
-
}
|
18
|
-
return to;
|
19
|
-
};
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
21
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
22
|
-
// file that has been converted to a CommonJS file using a Babel-
|
23
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
24
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
25
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
26
|
-
mod
|
27
|
-
));
|
28
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
29
|
-
|
30
|
-
// src/index.ts
|
31
|
-
var src_exports = {};
|
32
|
-
__export(src_exports, {
|
33
|
-
Config: () => Config,
|
34
|
-
apply: () => apply,
|
35
|
-
name: () => name
|
36
|
-
});
|
37
|
-
module.exports = __toCommonJS(src_exports);
|
38
|
-
var import_koishi = require("koishi");
|
39
|
-
var import_node_fs = require("node:fs");
|
40
|
-
var import_node_path = require("node:path");
|
41
|
-
var import_mint_filter = __toESM(require("mint-filter"));
|
42
|
-
var import_censor = __toESM(require("@koishijs/censor"));
|
43
|
-
var name = "text-censor";
|
44
|
-
var Config = import_koishi.Schema.intersect([
|
45
|
-
import_koishi.Schema.object({
|
46
|
-
textDatabase: import_koishi.Schema.array(
|
47
|
-
import_koishi.Schema.tuple([
|
48
|
-
import_koishi.Schema.string().default("data/text-censor/censor.txt")
|
49
|
-
])
|
50
|
-
).description("敏感词库的文件路径。").default([["", "data/text-censor/censor.txt"]])
|
51
|
-
}),
|
52
|
-
import_koishi.Schema.object({
|
53
|
-
removeWords: import_koishi.Schema.boolean().description("是否直接删除敏感词。").default(false),
|
54
|
-
// 默认不删除敏感词
|
55
|
-
transformToUpper: import_koishi.Schema.boolean().description("是否将字符转换为大写。").default(false)
|
56
|
-
// 默认不转换字符为大写
|
57
|
-
})
|
58
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
59
|
-
]);
|
60
|
-
function apply(ctx, config) {
|
61
|
-
let words = [];
|
62
|
-
for (const [file] of config.textDatabase) {
|
63
|
-
const filePath = (0, import_node_path.resolve)(ctx.baseDir, file);
|
64
|
-
if (!(0, import_node_fs.existsSync)(filePath)) {
|
65
|
-
ctx.logger.warn(
|
66
|
-
`dictionary file not found: ${filePath}, creating a new one.`
|
67
|
-
);
|
68
|
-
(0, import_node_fs.writeFileSync)(filePath, "");
|
69
|
-
}
|
70
|
-
const source = (0, import_node_fs.readFileSync)(filePath, "utf8");
|
71
|
-
const fileWords = source.split("\n").map((word) => word.trim()).filter(
|
72
|
-
(word) => word && !word.startsWith("//") && !word.startsWith("#")
|
73
|
-
);
|
74
|
-
words = words.concat(fileWords);
|
75
|
-
}
|
76
|
-
if (words.length === 0) {
|
77
|
-
ctx.logger.warn("no sensitive words found");
|
78
|
-
return;
|
79
|
-
}
|
80
|
-
const mintOptions = {
|
81
|
-
transform: config.transformToUpper ? "capital" : "none"
|
82
|
-
// 这里我们将值设置为可能的类型
|
83
|
-
};
|
84
|
-
const filter = new import_mint_filter.default(words, mintOptions);
|
85
|
-
ctx.plugin(import_censor.default);
|
86
|
-
ctx.get("censor").intercept({
|
87
|
-
async text(attrs) {
|
88
|
-
const originalText = attrs.content;
|
89
|
-
const result = await filter.filter(originalText);
|
90
|
-
if (typeof result.text !== "string")
|
91
|
-
return [];
|
92
|
-
if (config.removeWords) {
|
93
|
-
const cleanedText = result.text.replace(/\*/g, "");
|
94
|
-
return [cleanedText.trim()];
|
95
|
-
} else {
|
96
|
-
return [result.text];
|
97
|
-
}
|
98
|
-
}
|
99
|
-
});
|
100
|
-
}
|
101
|
-
__name(apply, "apply");
|
102
|
-
// Annotate the CommonJS export names for ESM import in node:
|
103
|
-
0 && (module.exports = {
|
104
|
-
Config,
|
105
|
-
apply,
|
106
|
-
name
|
107
|
-
});
|
1
|
+
var C=Object.create;var d=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,P=Object.prototype.hasOwnProperty;var j=(t,e)=>{for(var r in e)d(t,r,{get:e[r],enumerable:!0})},g=(t,e,r,p)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of W(e))!P.call(t,a)&&a!==r&&d(t,a,{get:()=>e[a],enumerable:!(p=v(e,a))||p.enumerable});return t};var y=(t,e,r)=>(r=t!=null?C(D(t)):{},g(e||!t||!t.__esModule?d(r,"default",{value:t,enumerable:!0}):r,t)),k=t=>g(d({},"__esModule",{value:!0}),t);var M={};j(M,{Config:()=>T,apply:()=>I,name:()=>F});module.exports=k(M);var o=require("koishi"),s=require("node:fs"),u=require("node:path"),h=y(require("mint-filter")),b=y(require("@koishijs/censor")),F="text-censor",T=o.Schema.intersect([o.Schema.object({textDatabase:o.Schema.array(o.Schema.tuple([o.Schema.string().default("data/text-censor/censor.txt")])).description("\u654F\u611F\u8BCD\u5E93\u7684\u6587\u4EF6\u8DEF\u5F84\u3002").default([["data/text-censor/censor.txt"]])}),o.Schema.object({removeWords:o.Schema.boolean().description("\u662F\u5426\u76F4\u63A5\u5220\u9664\u654F\u611F\u8BCD\u3002").default(!1),caseStrategy:o.Schema.union(["none","lower","capital"]).description("\u654F\u611F\u8BCD\u5904\u7406\u65F6\u7684\u5927\u5C0F\u5199\u7B56\u7565\u3002").default("none")})]);function I(t,e){let r=[];for(let[x]of e.textDatabase){let i=(0,u.resolve)(t.baseDir,x);if(!(0,s.existsSync)(i)){t.logger.warn(`dictionary file not found: ${i}, creating a new one.`);let n=(0,u.dirname)(i);(0,s.existsSync)(n)||(0,s.mkdirSync)(n,{recursive:!0}),(0,s.writeFileSync)(i,"")}let l=(0,s.readFileSync)(i,"utf8").split(`
|
2
|
+
`).map(n=>n.trim()).filter(n=>n&&!n.startsWith("//")&&!n.startsWith("#"));r=r.concat(l)}if(r.length===0){t.logger.warn("no sensitive words found");return}let p={transform:e.caseStrategy},a=new h.default(r,p);t.plugin(b.default),t.get("censor").intercept({async text(x){let i=x.content,c=await a.filter(i);if(typeof c.text!="string")return[];if(e.removeWords){let l=i,n=0;for(let f=0;f<c.text.length;f++)if(c.text[f]==="*"){let m=0;for(;f+m<c.text.length&&c.text[f+m]==="*";)m++;let w=l.slice(0,n),S=l.slice(n+m);l=w+S,f+=m-1}else n++;return[l.trim()]}else return[c.text]}})}0&&(module.exports={Config,apply,name});
|
package/package.json
CHANGED
@@ -1,13 +1,17 @@
|
|
1
1
|
{
|
2
2
|
"name": "@q78kg/koishi-plugin-text-censor",
|
3
3
|
"description": "A text censor provider for Koishi",
|
4
|
-
"version": "1.0.
|
4
|
+
"version": "1.0.5",
|
5
5
|
"main": "lib/index.js",
|
6
|
-
"typings": "lib/index.d.ts",
|
7
6
|
"files": [
|
8
7
|
"lib"
|
9
8
|
],
|
10
9
|
"license": "MIT",
|
10
|
+
"scripts": {
|
11
|
+
"build": "node esbuild.config.mjs",
|
12
|
+
"lint": "eslint src",
|
13
|
+
"lint-fix": "eslint src --fix"
|
14
|
+
},
|
11
15
|
"repository": {
|
12
16
|
"type": "git",
|
13
17
|
"url": "git+https://github.com/Hoshino-Yumetsuki/koishi-plugin-text-censor.git"
|
@@ -33,15 +37,27 @@
|
|
33
37
|
]
|
34
38
|
},
|
35
39
|
"description": {
|
36
|
-
"
|
37
|
-
"zh": "文本敏感词过滤"
|
40
|
+
"zh": "文本敏感词过滤服务,支持多敏感词库"
|
38
41
|
}
|
39
42
|
},
|
40
43
|
"peerDependencies": {
|
41
44
|
"koishi": "^4.17.9"
|
42
45
|
},
|
43
46
|
"devDependencies": {
|
44
|
-
"
|
47
|
+
"@types/node": "^20.11.30",
|
48
|
+
"esbuild": "^0.18.20",
|
49
|
+
"esbuild-register": "^3.5.0",
|
50
|
+
"eslint": "^9.12.0",
|
51
|
+
"eslint-config-prettier": "^9.1.0",
|
52
|
+
"eslint-config-standard": "^17.1.0",
|
53
|
+
"eslint-plugin-import": "^2.30.0",
|
54
|
+
"eslint-plugin-n": "^16.6.2",
|
55
|
+
"eslint-plugin-prettier": "^5.2.1",
|
56
|
+
"eslint-plugin-promise": "^7.1.0",
|
57
|
+
"koishi": "^4.17.9",
|
58
|
+
"prettier": "^3.3.3",
|
59
|
+
"typescript": "^5.5.3",
|
60
|
+
"yml-register": "^1.2.5"
|
45
61
|
},
|
46
62
|
"dependencies": {
|
47
63
|
"@koishijs/censor": "^1.0.1",
|
package/readme.md
CHANGED
package/lib/index.d.ts
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
import { Context, Schema } from 'koishi';
|
2
|
-
export declare const name = "text-censor";
|
3
|
-
export interface Config {
|
4
|
-
textDatabase: [string][];
|
5
|
-
removeWords: boolean;
|
6
|
-
transformToUpper: boolean;
|
7
|
-
}
|
8
|
-
export declare const Config: Schema<Config>;
|
9
|
-
export declare function apply(ctx: Context, config: Config): void;
|