@q78kg/koishi-plugin-text-censor 1.0.5 → 1.0.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![npm](https://img.shields.io/npm/v/@q78kg/koishi-plugin-text-censor?style=flat-square)](https://www.npmjs.com/package/@q78kg/koishi-plugin-text-censor)
4
4
 
5
- 此插件基于 Aho–Corasick 算法,对输入的文本内容进行过滤,并将所有的敏感词替换为 `*`。
5
+ 此插件基于 Aho–Corasick 算法,对输入的文本内容进行过滤,并将所有的敏感词替换为 `*`。并支持基于上下文匹配的敏感词删除模式。
6
6
 
7
7
  ## 文档
8
8
 
package/lib/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ var x=Object.create;var l=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var b=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty;var v=(t,e)=>{for(var n in e)l(t,n,{get:e[n],enumerable:!0})},m=(t,e,n,c)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of S(e))!h.call(t,s)&&s!==n&&l(t,s,{get:()=>e[s],enumerable:!(c=y(e,s))||c.enumerable});return t};var w=(t,e,n)=>(n=t!=null?x(b(t)):{},m(e||!t||!t.__esModule?l(n,"default",{value:t,enumerable:!0}):n,t)),C=t=>m(l({},"__esModule",{value:!0}),t);var O={};v(O,{Config:()=>D,apply:()=>M,name:()=>W});module.exports=C(O);var o=require("koishi"),r=require("fs"),f=require("path"),d=require("@q78kg/mint-filter"),u=w(require("@koishijs/censor"),1),W="text-censor",D=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 M(t,e){let n=[];for(let[p]of e.textDatabase){let a=(0,f.resolve)(t.baseDir,p);if(!(0,r.existsSync)(a)){t.logger.warn(`dictionary file not found: ${a}, creating a new one.`);let i=(0,f.dirname)(a);(0,r.existsSync)(i)||(0,r.mkdirSync)(i,{recursive:!0}),(0,r.writeFileSync)(a,"")}let g=(0,r.readFileSync)(a,"utf8").split(`
2
+ `).map(i=>i.trim()).filter(i=>i&&!i.startsWith("//")&&!i.startsWith("#"));n=n.concat(g)}if(n.length===0){t.logger.warn("no sensitive words found");return}let c={transform:e.caseStrategy,remove:e.removeWords},s=new d.Mint(n,c);t.plugin(u.default),t.get("censor").intercept({async text(p){return[s.filter(p.content).text]}})}0&&(module.exports={Config,apply,name});
package/lib/index.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ import { Schema, Context } from 'koishi';
2
+
3
+ declare const name = "text-censor";
4
+ interface Config {
5
+ textDatabase: [string][];
6
+ removeWords: boolean;
7
+ caseStrategy: 'capital' | 'none' | 'lower';
8
+ }
9
+ declare const Config: Schema<Config>;
10
+ declare function apply(ctx: Context, config: Config): void;
11
+
12
+ export { Config, apply, name };
package/lib/index.mjs ADDED
@@ -0,0 +1,2 @@
1
+ import{Schema as e}from"koishi";import{existsSync as a,mkdirSync as p,readFileSync as m,writeFileSync as d}from"fs";import{dirname as u,resolve as g}from"path";import{Mint as x}from"@q78kg/mint-filter";import y from"@koishijs/censor";var M="text-censor",O=e.intersect([e.object({textDatabase:e.array(e.tuple([e.string().default("data/text-censor/censor.txt")])).description("\u654F\u611F\u8BCD\u5E93\u7684\u6587\u4EF6\u8DEF\u5F84\u3002").default([["data/text-censor/censor.txt"]])}),e.object({removeWords:e.boolean().description("\u662F\u5426\u76F4\u63A5\u5220\u9664\u654F\u611F\u8BCD\u3002").default(!1),caseStrategy:e.union(["none","lower","capital"]).description("\u654F\u611F\u8BCD\u5904\u7406\u65F6\u7684\u5927\u5C0F\u5199\u7B56\u7565\u3002").default("none")})]);function j(o,i){let r=[];for(let[s]of i.textDatabase){let n=g(o.baseDir,s);if(!a(n)){o.logger.warn(`dictionary file not found: ${n}, creating a new one.`);let t=u(n);a(t)||p(t,{recursive:!0}),d(n,"")}let f=m(n,"utf8").split(`
2
+ `).map(t=>t.trim()).filter(t=>t&&!t.startsWith("//")&&!t.startsWith("#"));r=r.concat(f)}if(r.length===0){o.logger.warn("no sensitive words found");return}let c={transform:i.caseStrategy,remove:i.removeWords},l=new x(r,c);o.plugin(y),o.get("censor").intercept({async text(s){return[l.filter(s.content).text]}})}export{O as Config,j as apply,M as name};
package/package.json CHANGED
@@ -1,14 +1,25 @@
1
1
  {
2
2
  "name": "@q78kg/koishi-plugin-text-censor",
3
3
  "description": "A text censor provider for Koishi",
4
- "version": "1.0.5",
5
- "main": "lib/index.js",
4
+ "version": "1.0.10",
5
+ "main": "lib/index.cjs",
6
+ "module": "lib/index.mjs",
7
+ "types": "lib/index.d.ts",
8
+ "type": "module",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./lib/index.d.ts",
12
+ "require": "./lib/index.cjs",
13
+ "import": "./lib/index.mjs"
14
+ },
15
+ "./package.json": "./package.json"
16
+ },
6
17
  "files": [
7
18
  "lib"
8
19
  ],
9
20
  "license": "MIT",
10
21
  "scripts": {
11
- "build": "node esbuild.config.mjs",
22
+ "build": "node esbuild.config.mjs && tsc --emitDeclarationOnly && rollup -c rollup.config.mjs",
12
23
  "lint": "eslint src",
13
24
  "lint-fix": "eslint src --fix"
14
25
  },
@@ -19,7 +30,7 @@
19
30
  "bugs": {
20
31
  "url": "https://github.com/Hoshino-Yumetsuki/koishi-plugin-text-censor/issues"
21
32
  },
22
- "homepage": "https://censor.koishi.chat/plugins/text.html",
33
+ "homepage": "https://github.com/Hoshino-Yumetsuki/koishi-plugin-text-censor",
23
34
  "keywords": [
24
35
  "bot",
25
36
  "chatbot",
@@ -44,6 +55,7 @@
44
55
  "koishi": "^4.17.9"
45
56
  },
46
57
  "devDependencies": {
58
+ "@rollup/plugin-multi-entry": "^6.0.1",
47
59
  "@types/node": "^20.11.30",
48
60
  "esbuild": "^0.18.20",
49
61
  "esbuild-register": "^3.5.0",
@@ -56,11 +68,14 @@
56
68
  "eslint-plugin-promise": "^7.1.0",
57
69
  "koishi": "^4.17.9",
58
70
  "prettier": "^3.3.3",
71
+ "rollup": "^4.28.1",
72
+ "rollup-plugin-delete": "^2.1.0",
73
+ "rollup-plugin-dts": "^6.1.1",
59
74
  "typescript": "^5.5.3",
60
75
  "yml-register": "^1.2.5"
61
76
  },
62
77
  "dependencies": {
63
78
  "@koishijs/censor": "^1.0.1",
64
- "mint-filter": "^3.0.1"
79
+ "@q78kg/mint-filter": "^4.0.6"
65
80
  }
66
81
  }
package/lib/index.js DELETED
@@ -1,2 +0,0 @@
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});