@q78kg/koishi-plugin-text-censor 1.0.14 → 1.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.cjs +2 -0
- package/lib/index.d.ts +11 -0
- package/lib/index.mjs +2 -0
- package/package.json +16 -4
- package/lib/index.js +0 -2
package/lib/index.cjs
ADDED
@@ -0,0 +1,2 @@
|
|
1
|
+
var S=Object.create;var x=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var M=(e,t)=>{for(var a in t)x(e,a,{get:t[a],enumerable:!0})},y=(e,t,a,g)=>{if(t&&typeof t=="object"||typeof t=="function")for(let d of P(t))!F.call(e,d)&&d!==a&&x(e,d,{get:()=>t[d],enumerable:!(g=W(t,d))||g.enumerable});return e};var T=(e,t,a)=>(a=e!=null?S(D(e)):{},y(t||!e||!e.__esModule?x(a,"default",{value:e,enumerable:!0}):a,e)),j=e=>y(x({},"__esModule",{value:!0}),e);var E={};M(E,{Config:()=>I,apply:()=>$,name:()=>k});module.exports=j(E);var c=require("koishi"),f=require("node:fs"),u=require("node:path"),b=require("@q78kg/mint-filter"),w=T(require("@koishijs/censor")),k="text-censor",I=c.Schema.intersect([c.Schema.object({textDatabase:c.Schema.array(c.Schema.tuple([c.Schema.string().default("data/text-censor/censor.txt")])).description("\u654F\u611F\u8BCD\u5E93\u7684\u6587\u4EF6\u8DEF\u5F84").default([["data/text-censor/censor.txt"]]),regexPatterns:c.Schema.array(c.Schema.string()).description("\u6B63\u5219\u8868\u8FBE\u5F0F\u5339\u914D\u6A21\u5F0F\u5217\u8868").default([])}),c.Schema.object({removeWords:c.Schema.boolean().description("\u662F\u5426\u76F4\u63A5\u5220\u9664\u654F\u611F\u8BCD").default(!1),caseStrategy:c.Schema.union(["none","lower","capital"]).description("\u654F\u611F\u8BCD\u5904\u7406\u65F6\u7684\u5927\u5C0F\u5199\u7B56\u7565").default("none")})]);function $(e,t){let a=[];for(let[h]of t.textDatabase){let n=(0,u.resolve)(e.baseDir,h);if(!(0,f.existsSync)(n)){e.logger.warn(`dictionary file not found: ${n}, creating a new one.`);let s=(0,u.dirname)(n);(0,f.existsSync)(s)||(0,f.mkdirSync)(s,{recursive:!0}),(0,f.writeFileSync)(n,"")}let i=(0,f.readFileSync)(n,"utf8").split(`
|
2
|
+
`).map(s=>s.trim()).filter(s=>s&&!s.startsWith("//")&&!s.startsWith("#"));a=a.concat(i)}if(a.length===0){e.logger.warn("no sensitive words found");return}let g={transform:t.caseStrategy,customCharacter:"*"},d=(0,b.createMintFilter)(a,g);e.plugin(w.default),e.get("censor").intercept({async text(h){let n=h.content,p=[];for(let r of t.regexPatterns)try{let l=new RegExp(r,"gs"),o;for(;(o=l.exec(n))!==null;)p.push({start:o.index,end:o.index+o[0].length})}catch{e.logger.warn(`Invalid regex pattern: ${r}`)}p.sort((r,l)=>r.start-l.start);let i=[];for(let r of p)i.length===0||i[i.length-1].end<r.start?i.push(r):i[i.length-1].end=Math.max(i[i.length-1].end,r.end);for(let r=i.length-1;r>=0;r--){let{start:l,end:o}=i[r],m=n.slice(l,o);t.removeWords?n=n.slice(0,l)+n.slice(o):n=n.slice(0,l)+"*".repeat(m.length)+n.slice(o)}let s=await d.filter(n,{replace:!t.removeWords});if(!s||typeof s.text!="string")return[];if(t.removeWords){let r=n,l=0;for(let o=0;o<s.text.length;o++)if(s.text[o]==="*"){let m=0;for(;o+m<s.text.length&&s.text[o+m]==="*";)m++;let v=r.slice(0,l),C=r.slice(l+m);r=v+C,o+=m-1}else l++;return[r.trim()]}else return[s.text]}})}0&&(module.exports={Config,apply,name});
|
package/lib/index.d.ts
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
import { Context, Schema } from 'koishi';
|
2
|
+
export declare const name = "text-censor";
|
3
|
+
export interface Config {
|
4
|
+
textDatabase: [string][];
|
5
|
+
removeWords: boolean;
|
6
|
+
caseStrategy: 'capital' | 'none' | 'lower';
|
7
|
+
regexPatterns: string[];
|
8
|
+
}
|
9
|
+
export declare const Config: Schema<Config>;
|
10
|
+
export declare function apply(ctx: Context, config: Config): void;
|
11
|
+
|
package/lib/index.mjs
ADDED
@@ -0,0 +1,2 @@
|
|
1
|
+
import{Schema as a}from"koishi";import{existsSync as g,mkdirSync as y,readFileSync as b,writeFileSync as w}from"node:fs";import{dirname as v,resolve as C}from"node:path";import{createMintFilter as S}from"@q78kg/mint-filter";import W from"@koishijs/censor";var k="text-censor",I=a.intersect([a.object({textDatabase:a.array(a.tuple([a.string().default("data/text-censor/censor.txt")])).description("\u654F\u611F\u8BCD\u5E93\u7684\u6587\u4EF6\u8DEF\u5F84").default([["data/text-censor/censor.txt"]]),regexPatterns:a.array(a.string()).description("\u6B63\u5219\u8868\u8FBE\u5F0F\u5339\u914D\u6A21\u5F0F\u5217\u8868").default([])}),a.object({removeWords:a.boolean().description("\u662F\u5426\u76F4\u63A5\u5220\u9664\u654F\u611F\u8BCD").default(!1),caseStrategy:a.union(["none","lower","capital"]).description("\u654F\u611F\u8BCD\u5904\u7406\u65F6\u7684\u5927\u5C0F\u5199\u7B56\u7565").default("none")})]);function $(l,c){let f=[];for(let[m]of c.textDatabase){let t=C(l.baseDir,m);if(!g(t)){l.logger.warn(`dictionary file not found: ${t}, creating a new one.`);let r=v(t);g(r)||y(r,{recursive:!0}),w(t,"")}let s=b(t,"utf8").split(`
|
2
|
+
`).map(r=>r.trim()).filter(r=>r&&!r.startsWith("//")&&!r.startsWith("#"));f=f.concat(s)}if(f.length===0){l.logger.warn("no sensitive words found");return}let p={transform:c.caseStrategy,customCharacter:"*"},x=S(f,p);l.plugin(W),l.get("censor").intercept({async text(m){let t=m.content,d=[];for(let e of c.regexPatterns)try{let o=new RegExp(e,"gs"),n;for(;(n=o.exec(t))!==null;)d.push({start:n.index,end:n.index+n[0].length})}catch{l.logger.warn(`Invalid regex pattern: ${e}`)}d.sort((e,o)=>e.start-o.start);let s=[];for(let e of d)s.length===0||s[s.length-1].end<e.start?s.push(e):s[s.length-1].end=Math.max(s[s.length-1].end,e.end);for(let e=s.length-1;e>=0;e--){let{start:o,end:n}=s[e],i=t.slice(o,n);c.removeWords?t=t.slice(0,o)+t.slice(n):t=t.slice(0,o)+"*".repeat(i.length)+t.slice(n)}let r=await x.filter(t,{replace:!c.removeWords});if(!r||typeof r.text!="string")return[];if(c.removeWords){let e=t,o=0;for(let n=0;n<r.text.length;n++)if(r.text[n]==="*"){let i=0;for(;n+i<r.text.length&&r.text[n+i]==="*";)i++;let u=e.slice(0,o),h=e.slice(o+i);e=u+h,n+=i-1}else o++;return[e.trim()]}else return[r.text]}})}export{I as Config,$ as apply,k 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
|
-
"main": "lib/index.
|
4
|
+
"version": "1.0.16",
|
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": "
|
22
|
+
"build": "kumoya build",
|
12
23
|
"lint": "eslint src",
|
13
24
|
"lint-fix": "eslint src --fix"
|
14
25
|
},
|
@@ -55,12 +66,13 @@
|
|
55
66
|
"eslint-plugin-prettier": "^5.2.1",
|
56
67
|
"eslint-plugin-promise": "^7.1.0",
|
57
68
|
"koishi": "^4.17.9",
|
69
|
+
"kumoya": "^1.2.0",
|
58
70
|
"prettier": "^3.3.3",
|
59
71
|
"typescript": "^5.5.3",
|
60
72
|
"yml-register": "^1.2.5"
|
61
73
|
},
|
62
74
|
"dependencies": {
|
63
75
|
"@koishijs/censor": "^1.0.1",
|
64
|
-
"mint-filter": "^
|
76
|
+
"@q78kg/mint-filter": "^1.0.1"
|
65
77
|
}
|
66
78
|
}
|
package/lib/index.js
DELETED
@@ -1,2 +0,0 @@
|
|
1
|
-
var v=Object.create;var d=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var W=Object.getPrototypeOf,D=Object.prototype.hasOwnProperty;var j=(e,t)=>{for(var n in t)d(e,n,{get:t[n],enumerable:!0})},u=(e,t,n,g)=>{if(t&&typeof t=="object"||typeof t=="function")for(let c of P(t))!D.call(e,c)&&c!==n&&d(e,c,{get:()=>t[c],enumerable:!(g=C(t,c))||g.enumerable});return e};var y=(e,t,n)=>(n=e!=null?v(W(e)):{},u(t||!e||!e.__esModule?d(n,"default",{value:e,enumerable:!0}):n,e)),k=e=>u(d({},"__esModule",{value:!0}),e);var $={};j($,{Config:()=>I,apply:()=>T,name:()=>F});module.exports=k($);var s=require("koishi"),i=require("node:fs"),x=require("node:path"),h=y(require("mint-filter")),w=y(require("@koishijs/censor")),F="text-censor",I=s.Schema.intersect([s.Schema.object({textDatabase:s.Schema.array(s.Schema.tuple([s.Schema.string().default("data/text-censor/censor.txt")])).description("\u654F\u611F\u8BCD\u5E93\u7684\u6587\u4EF6\u8DEF\u5F84").default([["data/text-censor/censor.txt"]]),regexPatterns:s.Schema.array(s.Schema.string()).description("\u6B63\u5219\u8868\u8FBE\u5F0F\u5339\u914D\u6A21\u5F0F\u5217\u8868").default([])}),s.Schema.object({removeWords:s.Schema.boolean().description("\u662F\u5426\u76F4\u63A5\u5220\u9664\u654F\u611F\u8BCD").default(!1),caseStrategy:s.Schema.union(["none","lower","capital"]).description("\u654F\u611F\u8BCD\u5904\u7406\u65F6\u7684\u5927\u5C0F\u5199\u7B56\u7565").default("none")})]);function T(e,t){let n=[];for(let[m]of t.textDatabase){let o=(0,x.resolve)(e.baseDir,m);if(!(0,i.existsSync)(o)){e.logger.warn(`dictionary file not found: ${o}, creating a new one.`);let r=(0,x.dirname)(o);(0,i.existsSync)(r)||(0,i.mkdirSync)(r,{recursive:!0}),(0,i.writeFileSync)(o,"")}let a=(0,i.readFileSync)(o,"utf8").split(`
|
2
|
-
`).map(r=>r.trim()).filter(r=>r&&!r.startsWith("//")&&!r.startsWith("#"));n=n.concat(a)}if(n.length===0){e.logger.warn("no sensitive words found");return}let g={transform:t.caseStrategy},c=new h.default(n,g);e.plugin(w.default),e.get("censor").intercept({async text(m){let o=m.content;for(let a of t.regexPatterns)try{let r=new RegExp(a,"gs");t.removeWords?o=o.replace(r,""):o=o.replace(r,l=>"*".repeat(l.length))}catch{e.logger.warn(`Invalid regex pattern: ${a}`)}let f=await c.filter(o);if(typeof f.text!="string")return[];if(t.removeWords){let a=o,r=0;for(let l=0;l<f.text.length;l++)if(f.text[l]==="*"){let p=0;for(;l+p<f.text.length&&f.text[l+p]==="*";)p++;let b=a.slice(0,r),S=a.slice(r+p);a=b+S,l+=p-1}else r++;return[a.trim()]}else return[f.text]}})}0&&(module.exports={Config,apply,name});
|