@bastiangx/opencode-unmoji 0.1.0
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/LICENSE +13 -0
- package/README.md +116 -0
- package/dist/core/config.d.ts +22 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +82 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/emoji-data-generated.d.ts +6 -0
- package/dist/core/emoji-data-generated.d.ts.map +1 -0
- package/dist/core/emoji-data-generated.js +28363 -0
- package/dist/core/emoji-data-generated.js.map +1 -0
- package/dist/core/emoji-data.d.ts +8 -0
- package/dist/core/emoji-data.d.ts.map +1 -0
- package/dist/core/emoji-data.js +61 -0
- package/dist/core/emoji-data.js.map +1 -0
- package/dist/core/processor.d.ts +5 -0
- package/dist/core/processor.d.ts.map +1 -0
- package/dist/core/processor.js +60 -0
- package/dist/core/processor.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.bundled.js +51559 -0
- package/dist/types/config.d.ts +36 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +24 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/errors.d.ts +59 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +6 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/utils/code-detector.d.ts +17 -0
- package/dist/utils/code-detector.d.ts.map +1 -0
- package/dist/utils/code-detector.js +252 -0
- package/dist/utils/code-detector.js.map +1 -0
- package/dist/utils/debug.d.ts +18 -0
- package/dist/utils/debug.d.ts.map +1 -0
- package/dist/utils/debug.js +10 -0
- package/dist/utils/debug.js.map +1 -0
- package/dist/utils/grapheme.d.ts +20 -0
- package/dist/utils/grapheme.d.ts.map +1 -0
- package/dist/utils/grapheme.js +64 -0
- package/dist/utils/grapheme.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export type ReplacementStyle = "github" | "slack" | "discord" | "cldr" | "iamcal" | "joypixels";
|
|
3
|
+
export type UnmojiConfig = {
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
mode: "strip" | "replace";
|
|
6
|
+
replacementStyle: ReplacementStyle;
|
|
7
|
+
replacementFormat: ":name:" | "[:name:]" | "{name}";
|
|
8
|
+
preserveCodeBlocks: boolean;
|
|
9
|
+
preserveInlineCode: boolean;
|
|
10
|
+
skipQuotes: boolean;
|
|
11
|
+
};
|
|
12
|
+
export declare const ConfigSchema: z.ZodObject<{
|
|
13
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
14
|
+
mode: z.ZodDefault<z.ZodEnum<{
|
|
15
|
+
strip: "strip";
|
|
16
|
+
replace: "replace";
|
|
17
|
+
}>>;
|
|
18
|
+
replacementStyle: z.ZodDefault<z.ZodEnum<{
|
|
19
|
+
github: "github";
|
|
20
|
+
slack: "slack";
|
|
21
|
+
discord: "discord";
|
|
22
|
+
cldr: "cldr";
|
|
23
|
+
iamcal: "iamcal";
|
|
24
|
+
joypixels: "joypixels";
|
|
25
|
+
}>>;
|
|
26
|
+
replacementFormat: z.ZodDefault<z.ZodEnum<{
|
|
27
|
+
":name:": ":name:";
|
|
28
|
+
"[:name:]": "[:name:]";
|
|
29
|
+
"{name}": "{name}";
|
|
30
|
+
}>>;
|
|
31
|
+
preserveCodeBlocks: z.ZodDefault<z.ZodBoolean>;
|
|
32
|
+
preserveInlineCode: z.ZodDefault<z.ZodBoolean>;
|
|
33
|
+
skipQuotes: z.ZodDefault<z.ZodBoolean>;
|
|
34
|
+
}, z.core.$strip>;
|
|
35
|
+
export declare const DEFAULT_CONFIG: UnmojiConfig;
|
|
36
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,gBAAgB,GACzB,QAAQ,GACR,OAAO,GACP,SAAS,GACT,MAAM,GACN,QAAQ,GACR,WAAW,CAAC;AAEf,MAAM,MAAM,YAAY,GAAG;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,iBAAiB,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;IACpD,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;iBAYvB,CAAC;AAEH,eAAO,MAAM,cAAc,EAAE,YAQ5B,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const ConfigSchema = z.object({
|
|
3
|
+
enabled: z.boolean().default(true),
|
|
4
|
+
mode: z.enum(["strip", "replace"]).default("strip"),
|
|
5
|
+
replacementStyle: z
|
|
6
|
+
.enum(["github", "slack", "discord", "cldr", "iamcal", "joypixels"])
|
|
7
|
+
.default("github"),
|
|
8
|
+
replacementFormat: z
|
|
9
|
+
.enum([":name:", "[:name:]", "{name}"])
|
|
10
|
+
.default("[:name:]"),
|
|
11
|
+
preserveCodeBlocks: z.boolean().default(true),
|
|
12
|
+
preserveInlineCode: z.boolean().default(true),
|
|
13
|
+
skipQuotes: z.boolean().default(false),
|
|
14
|
+
});
|
|
15
|
+
export const DEFAULT_CONFIG = {
|
|
16
|
+
enabled: true,
|
|
17
|
+
mode: "strip",
|
|
18
|
+
replacementStyle: "github",
|
|
19
|
+
replacementFormat: "[:name:]",
|
|
20
|
+
preserveCodeBlocks: true,
|
|
21
|
+
preserveInlineCode: true,
|
|
22
|
+
skipQuotes: false,
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoBxB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACnD,gBAAgB,EAAE,CAAC;SACjB,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;SACnE,OAAO,CAAC,QAAQ,CAAC;IACnB,iBAAiB,EAAE,CAAC;SAClB,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;SACtC,OAAO,CAAC,UAAU,CAAC;IACrB,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7C,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7C,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACtC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC3C,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,OAAO;IACb,gBAAgB,EAAE,QAAQ;IAC1B,iBAAiB,EAAE,UAAU;IAC7B,kBAAkB,EAAE,IAAI;IACxB,kBAAkB,EAAE,IAAI;IACxB,UAAU,EAAE,KAAK;CACjB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain error types for unmoji plugin
|
|
3
|
+
* Following neverthrow Result pattern - errors as discriminated unions
|
|
4
|
+
*/
|
|
5
|
+
export type ConfigError = {
|
|
6
|
+
domain: "config";
|
|
7
|
+
code: "FILE_NOT_FOUND";
|
|
8
|
+
path: string;
|
|
9
|
+
} | {
|
|
10
|
+
domain: "config";
|
|
11
|
+
code: "READ_FAILED";
|
|
12
|
+
path: string;
|
|
13
|
+
reason: string;
|
|
14
|
+
} | {
|
|
15
|
+
domain: "config";
|
|
16
|
+
code: "INVALID_JSON";
|
|
17
|
+
path: string;
|
|
18
|
+
raw: string;
|
|
19
|
+
} | {
|
|
20
|
+
domain: "config";
|
|
21
|
+
code: "INVALID_SCHEMA";
|
|
22
|
+
details: string;
|
|
23
|
+
};
|
|
24
|
+
export type EmojiDataError = {
|
|
25
|
+
domain: "emoji-data";
|
|
26
|
+
code: "FETCH_FAILED";
|
|
27
|
+
reason: string;
|
|
28
|
+
} | {
|
|
29
|
+
domain: "emoji-data";
|
|
30
|
+
code: "INVALID_DATA";
|
|
31
|
+
details: string;
|
|
32
|
+
} | {
|
|
33
|
+
domain: "emoji-data";
|
|
34
|
+
code: "EMPTY_DATASET";
|
|
35
|
+
};
|
|
36
|
+
export type ProcessingError = {
|
|
37
|
+
domain: "processing";
|
|
38
|
+
code: "EMOJI_DATA_UNAVAILABLE";
|
|
39
|
+
cause: EmojiDataError;
|
|
40
|
+
} | {
|
|
41
|
+
domain: "processing";
|
|
42
|
+
code: "REPLACEMENT_FAILED";
|
|
43
|
+
emoji: string;
|
|
44
|
+
reason: string;
|
|
45
|
+
};
|
|
46
|
+
export type PluginError = {
|
|
47
|
+
domain: "plugin";
|
|
48
|
+
code: "CONFIG_LOAD_FAILED";
|
|
49
|
+
cause: ConfigError;
|
|
50
|
+
} | {
|
|
51
|
+
domain: "plugin";
|
|
52
|
+
code: "PROCESSING_FAILED";
|
|
53
|
+
cause: ProcessingError;
|
|
54
|
+
} | {
|
|
55
|
+
domain: "plugin";
|
|
56
|
+
code: "INIT_FAILED";
|
|
57
|
+
reason: string;
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,WAAW,GACpB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACrE;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjE,MAAM,MAAM,cAAc,GACvB;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC/D;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,CAAC;AAEnD,MAAM,MAAM,eAAe,GACxB;IACA,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,wBAAwB,CAAC;IAC/B,KAAK,EAAE,cAAc,CAAC;CACrB,GACD;IACA,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,oBAAoB,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CACd,CAAC;AAEL,MAAM,MAAM,WAAW,GACpB;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,oBAAoB,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GACpE;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,mBAAmB,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,GACvE;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface TextRange {
|
|
2
|
+
start: number;
|
|
3
|
+
end: number;
|
|
4
|
+
}
|
|
5
|
+
export interface DetectCodeBlockOptions {
|
|
6
|
+
preserveCodeBlocks: boolean;
|
|
7
|
+
preserveInlineCode: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface DetectQuoteOptions {
|
|
10
|
+
preserveBlockquotes: boolean;
|
|
11
|
+
preserveInlineQuotes: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function detectCodeBlocks(text: string, options: DetectCodeBlockOptions): TextRange[];
|
|
14
|
+
export declare function isInPreservedRange(index: number, ranges: TextRange[]): boolean;
|
|
15
|
+
export declare function detectQuotes(text: string, options: DetectQuoteOptions): TextRange[];
|
|
16
|
+
export declare function mergeRanges(rangesGroups: TextRange[][]): TextRange[];
|
|
17
|
+
//# sourceMappingURL=code-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-detector.d.ts","sourceRoot":"","sources":["../../src/utils/code-detector.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACZ;AAKD,MAAM,WAAW,sBAAsB;IACtC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IAClC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oBAAoB,EAAE,OAAO,CAAC;CAC9B;AAwID,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,sBAAsB,GAC7B,SAAS,EAAE,CAwBb;AAED,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,EAAE,GACjB,OAAO,CAOT;AAED,wBAAgB,YAAY,CAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,kBAAkB,GACzB,SAAS,EAAE,CAgGb;AAED,wBAAgB,WAAW,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,GAAG,SAAS,EAAE,CAuCpE"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
const DOUBLE_QUOTE_REGEX = /"([^"\\]|\\.)*"/g;
|
|
2
|
+
const SINGLE_QUOTE_REGEX = /'([^'\\]|\\.)*'/g;
|
|
3
|
+
function detectFencedCodeBlocks(text) {
|
|
4
|
+
const ranges = [];
|
|
5
|
+
const length = text.length;
|
|
6
|
+
let pos = 0;
|
|
7
|
+
let inBlock = false;
|
|
8
|
+
let blockStart = 0;
|
|
9
|
+
let fenceLen = 0;
|
|
10
|
+
while (pos <= length) {
|
|
11
|
+
const lineBreakIndex = text.indexOf("\n", pos);
|
|
12
|
+
const lineEnd = lineBreakIndex === -1 ? length : lineBreakIndex;
|
|
13
|
+
const lineStart = pos;
|
|
14
|
+
const line = text.slice(lineStart, lineEnd);
|
|
15
|
+
let firstNonWs = 0;
|
|
16
|
+
while (firstNonWs < line.length) {
|
|
17
|
+
const ch = line.charAt(firstNonWs);
|
|
18
|
+
if (ch !== " " && ch !== "\t") {
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
firstNonWs += 1;
|
|
22
|
+
}
|
|
23
|
+
const trimmed = line.slice(firstNonWs);
|
|
24
|
+
if (!inBlock) {
|
|
25
|
+
if (trimmed.startsWith("```")) {
|
|
26
|
+
let btCount = 0;
|
|
27
|
+
while (btCount < trimmed.length && trimmed.charAt(btCount) === "`") {
|
|
28
|
+
btCount += 1;
|
|
29
|
+
}
|
|
30
|
+
if (btCount >= 3) {
|
|
31
|
+
inBlock = true;
|
|
32
|
+
fenceLen = btCount;
|
|
33
|
+
blockStart = lineStart + firstNonWs;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
if (trimmed.startsWith("`")) {
|
|
39
|
+
let btCount = 0;
|
|
40
|
+
while (btCount < trimmed.length && trimmed.charAt(btCount) === "`") {
|
|
41
|
+
btCount += 1;
|
|
42
|
+
}
|
|
43
|
+
if (btCount >= fenceLen) {
|
|
44
|
+
let onlyTicksAndWs = true;
|
|
45
|
+
for (let i = btCount; i < trimmed.length; i += 1) {
|
|
46
|
+
const ch = trimmed.charAt(i);
|
|
47
|
+
if (ch !== " " && ch !== "\t" && ch !== "`") {
|
|
48
|
+
onlyTicksAndWs = false;
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (onlyTicksAndWs) {
|
|
53
|
+
ranges.push({ start: blockStart, end: lineEnd });
|
|
54
|
+
inBlock = false;
|
|
55
|
+
fenceLen = 0;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (lineBreakIndex === -1) {
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
pos = lineEnd + 1;
|
|
64
|
+
}
|
|
65
|
+
if (inBlock) {
|
|
66
|
+
ranges.push({ start: blockStart, end: length });
|
|
67
|
+
}
|
|
68
|
+
return ranges;
|
|
69
|
+
}
|
|
70
|
+
function detectInlineCodeOutsideBlocks(text, blockRanges) {
|
|
71
|
+
const ranges = [];
|
|
72
|
+
const length = text.length;
|
|
73
|
+
let i = 0;
|
|
74
|
+
while (i < length) {
|
|
75
|
+
const ch = text.charAt(i);
|
|
76
|
+
if (ch === "`" && isInPreservedRange(i, blockRanges)) {
|
|
77
|
+
i += 1;
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (ch === "`") {
|
|
81
|
+
const start = i;
|
|
82
|
+
i += 1;
|
|
83
|
+
while (i < length) {
|
|
84
|
+
const cur = text.charAt(i);
|
|
85
|
+
if (cur === "\n") {
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
if (cur === "\\") {
|
|
89
|
+
if (i + 1 < length && text.charAt(i + 1) === "`") {
|
|
90
|
+
i += 2;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (cur === "`") {
|
|
95
|
+
const end = i + 1;
|
|
96
|
+
ranges.push({ start, end });
|
|
97
|
+
i = end;
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
i += 1;
|
|
101
|
+
}
|
|
102
|
+
if (i >= length || text.charAt(i) === "\n") {
|
|
103
|
+
i = start + 1;
|
|
104
|
+
}
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
i += 1;
|
|
108
|
+
}
|
|
109
|
+
return ranges;
|
|
110
|
+
}
|
|
111
|
+
export function detectCodeBlocks(text, options) {
|
|
112
|
+
const ranges = [];
|
|
113
|
+
let blockRanges = [];
|
|
114
|
+
if (options.preserveCodeBlocks) {
|
|
115
|
+
blockRanges = detectFencedCodeBlocks(text);
|
|
116
|
+
for (const r of blockRanges) {
|
|
117
|
+
ranges.push(r);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (options.preserveInlineCode) {
|
|
121
|
+
const inlineRanges = detectInlineCodeOutsideBlocks(text, blockRanges);
|
|
122
|
+
for (const r of inlineRanges) {
|
|
123
|
+
ranges.push(r);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (ranges.length === 0) {
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
ranges.sort((a, b) => a.start - b.start);
|
|
130
|
+
return ranges;
|
|
131
|
+
}
|
|
132
|
+
export function isInPreservedRange(index, ranges) {
|
|
133
|
+
for (const range of ranges) {
|
|
134
|
+
if (index >= range.start && index < range.end) {
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
export function detectQuotes(text, options) {
|
|
141
|
+
const ranges = [];
|
|
142
|
+
if (options.preserveBlockquotes) {
|
|
143
|
+
let currentPos = 0;
|
|
144
|
+
const length = text.length;
|
|
145
|
+
while (currentPos <= length) {
|
|
146
|
+
const lineBreakIndex = text.indexOf("\n", currentPos);
|
|
147
|
+
const lineEnd = lineBreakIndex === -1 ? length : lineBreakIndex;
|
|
148
|
+
const lineStart = currentPos;
|
|
149
|
+
const line = text.slice(lineStart, lineEnd);
|
|
150
|
+
let firstNonWs = 0;
|
|
151
|
+
while (firstNonWs < line.length) {
|
|
152
|
+
const ch = line.charAt(firstNonWs);
|
|
153
|
+
if (ch !== " " && ch !== "\t") {
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
firstNonWs += 1;
|
|
157
|
+
}
|
|
158
|
+
const trimmed = line.slice(firstNonWs);
|
|
159
|
+
if (trimmed.startsWith(">")) {
|
|
160
|
+
const start = lineStart + firstNonWs;
|
|
161
|
+
const end = lineBreakIndex === -1 ? lineEnd : lineEnd;
|
|
162
|
+
ranges.push({ start, end });
|
|
163
|
+
}
|
|
164
|
+
if (lineBreakIndex === -1) {
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
currentPos = lineEnd + 1;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (options.preserveInlineQuotes) {
|
|
171
|
+
DOUBLE_QUOTE_REGEX.lastIndex = 0;
|
|
172
|
+
let doubleMatch = DOUBLE_QUOTE_REGEX.exec(text);
|
|
173
|
+
while (doubleMatch !== null) {
|
|
174
|
+
const matchIndex = doubleMatch.index;
|
|
175
|
+
const matchLength = doubleMatch[0].length;
|
|
176
|
+
let inExisting = false;
|
|
177
|
+
for (const range of ranges) {
|
|
178
|
+
if (matchIndex >= range.start && matchIndex < range.end) {
|
|
179
|
+
inExisting = true;
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (!inExisting) {
|
|
184
|
+
ranges.push({
|
|
185
|
+
start: matchIndex,
|
|
186
|
+
end: matchIndex + matchLength,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
doubleMatch = DOUBLE_QUOTE_REGEX.exec(text);
|
|
190
|
+
}
|
|
191
|
+
SINGLE_QUOTE_REGEX.lastIndex = 0;
|
|
192
|
+
let singleMatch = SINGLE_QUOTE_REGEX.exec(text);
|
|
193
|
+
while (singleMatch !== null) {
|
|
194
|
+
const matchIndex = singleMatch.index;
|
|
195
|
+
const matchLength = singleMatch[0].length;
|
|
196
|
+
let inExisting = false;
|
|
197
|
+
for (const range of ranges) {
|
|
198
|
+
if (matchIndex >= range.start && matchIndex < range.end) {
|
|
199
|
+
inExisting = true;
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if (!inExisting) {
|
|
204
|
+
ranges.push({
|
|
205
|
+
start: matchIndex,
|
|
206
|
+
end: matchIndex + matchLength,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
singleMatch = SINGLE_QUOTE_REGEX.exec(text);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (ranges.length === 0) {
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
ranges.sort((a, b) => a.start - b.start);
|
|
216
|
+
return ranges;
|
|
217
|
+
}
|
|
218
|
+
export function mergeRanges(rangesGroups) {
|
|
219
|
+
const flat = [];
|
|
220
|
+
for (const group of rangesGroups) {
|
|
221
|
+
for (const r of group) {
|
|
222
|
+
flat.push(r);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (flat.length === 0) {
|
|
226
|
+
return [];
|
|
227
|
+
}
|
|
228
|
+
flat.sort((a, b) => a.start - b.start);
|
|
229
|
+
const merged = [];
|
|
230
|
+
let current = {
|
|
231
|
+
start: flat[0].start,
|
|
232
|
+
end: flat[0].end,
|
|
233
|
+
};
|
|
234
|
+
for (let i = 1; i < flat.length; i += 1) {
|
|
235
|
+
const r = flat[i];
|
|
236
|
+
if (r.start <= current.end) {
|
|
237
|
+
if (r.end > current.end) {
|
|
238
|
+
current = {
|
|
239
|
+
start: current.start,
|
|
240
|
+
end: r.end,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
merged.push(current);
|
|
246
|
+
current = { start: r.start, end: r.end };
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
merged.push(current);
|
|
250
|
+
return merged;
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=code-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-detector.js","sourceRoot":"","sources":["../../src/utils/code-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface PerformanceMetrics {
|
|
2
|
+
startTime: number;
|
|
3
|
+
endTime?: number;
|
|
4
|
+
duration?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface ProcessingStats {
|
|
7
|
+
originalLength: number;
|
|
8
|
+
processedLength: number;
|
|
9
|
+
emojiCount: number;
|
|
10
|
+
}
|
|
11
|
+
export interface DebugLoggerLike {
|
|
12
|
+
startMetrics: () => PerformanceMetrics;
|
|
13
|
+
endMetrics: (metrics: PerformanceMetrics) => PerformanceMetrics;
|
|
14
|
+
logProcessing: (stats: ProcessingStats, metrics: PerformanceMetrics) => void;
|
|
15
|
+
logVerbose: (message: string) => void;
|
|
16
|
+
}
|
|
17
|
+
export declare function createDebugLogger(): DebugLoggerLike;
|
|
18
|
+
//# sourceMappingURL=debug.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/utils/debug.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC/B,YAAY,EAAE,MAAM,kBAAkB,CAAC;IACvC,UAAU,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,kBAAkB,CAAC;IAChE,aAAa,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC7E,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AASD,wBAAgB,iBAAiB,IAAI,eAAe,CAEnD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/utils/debug.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,GAAoB;IACnC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACtC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpB,aAAa,EAAE,GAAG,EAAE,GAAE,CAAC;IACvB,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC;CACpB,CAAC;AAEF,MAAM,UAAU,iBAAiB;IAChC,OAAO,UAAU,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* grapheme.ts - Unicode-aware string segmentation
|
|
3
|
+
*
|
|
4
|
+
* Handles splitting strings into proper Unicode grapheme clusters instead of
|
|
5
|
+
* simple characters or codepoints. Essential for complex emoji detection.
|
|
6
|
+
*
|
|
7
|
+
* Key concepts:
|
|
8
|
+
* - Native Intl.Segmenter usage with fallback to Graphemer library
|
|
9
|
+
* - Support for Zero Width Joiners (ZWJ) and skin tone modifiers
|
|
10
|
+
* - Fast-path emoji detection using Extended_Pictographic regex
|
|
11
|
+
*
|
|
12
|
+
* Main exports:
|
|
13
|
+
* - graphemes: (text: string) => Generator<string>
|
|
14
|
+
* - mightContainEmoji: (text: string) => boolean
|
|
15
|
+
*
|
|
16
|
+
* @see src/core/processor.ts
|
|
17
|
+
*/
|
|
18
|
+
export declare function graphemes(text: string): Generator<string>;
|
|
19
|
+
export declare function mightContainEmoji(text: string): boolean;
|
|
20
|
+
//# sourceMappingURL=grapheme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grapheme.d.ts","sourceRoot":"","sources":["../../src/utils/grapheme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAuDH,wBAAiB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAgB1D;AAID,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* grapheme.ts - Unicode-aware string segmentation
|
|
3
|
+
*
|
|
4
|
+
* Handles splitting strings into proper Unicode grapheme clusters instead of
|
|
5
|
+
* simple characters or codepoints. Essential for complex emoji detection.
|
|
6
|
+
*
|
|
7
|
+
* Key concepts:
|
|
8
|
+
* - Native Intl.Segmenter usage with fallback to Graphemer library
|
|
9
|
+
* - Support for Zero Width Joiners (ZWJ) and skin tone modifiers
|
|
10
|
+
* - Fast-path emoji detection using Extended_Pictographic regex
|
|
11
|
+
*
|
|
12
|
+
* Main exports:
|
|
13
|
+
* - graphemes: (text: string) => Generator<string>
|
|
14
|
+
* - mightContainEmoji: (text: string) => boolean
|
|
15
|
+
*
|
|
16
|
+
* @see src/core/processor.ts
|
|
17
|
+
*/
|
|
18
|
+
import Graphemer from "graphemer";
|
|
19
|
+
let intlSegmenter = null;
|
|
20
|
+
let graphemer = null;
|
|
21
|
+
function hasIntlSegmenter() {
|
|
22
|
+
const globalIntl = Intl;
|
|
23
|
+
return typeof globalIntl.Segmenter === "function";
|
|
24
|
+
}
|
|
25
|
+
function getIntlSegmenter() {
|
|
26
|
+
if (intlSegmenter) {
|
|
27
|
+
return intlSegmenter;
|
|
28
|
+
}
|
|
29
|
+
const globalIntl = Intl;
|
|
30
|
+
intlSegmenter = new globalIntl.Segmenter("en", {
|
|
31
|
+
granularity: "grapheme",
|
|
32
|
+
});
|
|
33
|
+
return intlSegmenter;
|
|
34
|
+
}
|
|
35
|
+
function getGraphemer() {
|
|
36
|
+
if (!graphemer) {
|
|
37
|
+
graphemer = new Graphemer();
|
|
38
|
+
}
|
|
39
|
+
return graphemer;
|
|
40
|
+
}
|
|
41
|
+
function getSegmenter() {
|
|
42
|
+
if (hasIntlSegmenter()) {
|
|
43
|
+
return getIntlSegmenter();
|
|
44
|
+
}
|
|
45
|
+
return getGraphemer();
|
|
46
|
+
}
|
|
47
|
+
export function* graphemes(text) {
|
|
48
|
+
const segmenter = getSegmenter();
|
|
49
|
+
if ("segment" in segmenter) {
|
|
50
|
+
for (const { segment } of segmenter.segment(text)) {
|
|
51
|
+
yield segment;
|
|
52
|
+
}
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const segments = segmenter.splitGraphemes(text);
|
|
56
|
+
for (const segment of segments) {
|
|
57
|
+
yield segment;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const _EMOJI_REGEX = /\p{Extended_Pictographic}/u;
|
|
61
|
+
export function mightContainEmoji(text) {
|
|
62
|
+
return /[\p{Extended_Pictographic}\p{RI}#*0-9]/u.test(text);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=grapheme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grapheme.js","sourceRoot":"","sources":["../../src/utils/grapheme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,SAAS,MAAM,WAAW,CAAC;AAUlC,IAAI,aAAa,GAAyB,IAAI,CAAC;AAC/C,IAAI,SAAS,GAAqB,IAAI,CAAC;AAEvC,SAAS,gBAAgB;IACxB,MAAM,UAAU,GAAG,IAElB,CAAC;IAEF,OAAO,OAAO,UAAU,CAAC,SAAS,KAAK,UAAU,CAAC;AACnD,CAAC;AAED,SAAS,gBAAgB;IACxB,IAAI,aAAa,EAAE,CAAC;QACnB,OAAO,aAAa,CAAC;IACtB,CAAC;IAED,MAAM,UAAU,GAAG,IAElB,CAAC;IAEF,aAAa,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE;QAC9C,WAAW,EAAE,UAAU;KACvB,CAAC,CAAC;IAEH,OAAO,aAAa,CAAC;AACtB,CAAC;AAED,SAAS,YAAY;IACpB,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,YAAY;IACpB,IAAI,gBAAgB,EAAE,EAAE,CAAC;QACxB,OAAO,gBAAgB,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO,YAAY,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,SAAS,CAAC,CAAC,SAAS,CAAC,IAAY;IACtC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;QAC5B,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,OAAO,CAAC;QACf,CAAC;QAED,OAAO;IACR,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAEhD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,OAAO,CAAC;IACf,CAAC;AACF,CAAC;AAED,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAElD,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC7C,OAAO,yCAAyC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7D,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@bastiangx/opencode-unmoji",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "OpenCode plugin to strip or replace emojis from agent outputs",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./plugin": {
|
|
14
|
+
"default": "./dist/plugin.bundled.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build:data": "luajit scripts/generate_emoji_data.lua",
|
|
22
|
+
"build": "bun run build:data && tsc",
|
|
23
|
+
"build:plugin": "bun build src/index.ts --outfile=dist/plugin.bundled.js --target=node --format=esm --external=@opencode-ai/plugin",
|
|
24
|
+
"dev": "tsc --watch",
|
|
25
|
+
"test": "vitest run",
|
|
26
|
+
"format": "biome format --write .",
|
|
27
|
+
"lint": "biome lint .",
|
|
28
|
+
"check": "biome check .",
|
|
29
|
+
"prepublishOnly": "bun run build && bun run build:plugin && bun run test"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"opencode",
|
|
33
|
+
"plugin",
|
|
34
|
+
"emoji",
|
|
35
|
+
"text-processing"
|
|
36
|
+
],
|
|
37
|
+
"author": "bastiangx",
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@vitest/coverage-v8": "^4.0.16",
|
|
41
|
+
"emojibase": "^17.0.0",
|
|
42
|
+
"graphemer": "^1.4.0",
|
|
43
|
+
"neverthrow": "^8.2.0",
|
|
44
|
+
"zod": "^4.2.1"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@biomejs/biome": "^2.3.10",
|
|
48
|
+
"@types/bun": "^1.3.5",
|
|
49
|
+
"@types/node": "^25.0.3",
|
|
50
|
+
"@vitest/ui": "^4.0.16",
|
|
51
|
+
"emojibase-data": "^17.0.0",
|
|
52
|
+
"oxlint": "^1.35.0",
|
|
53
|
+
"typescript": "^5.9.3",
|
|
54
|
+
"vitest": "^4.0.16"
|
|
55
|
+
},
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"@opencode-ai/plugin": "^1.0.193"
|
|
58
|
+
}
|
|
59
|
+
}
|