Repository navigation
Expand file tree
/
Copy pathmbstring.ts
More file actions
59 lines (53 loc) · 2.73 KB
/
Copy pathmbstring.ts
File metadata and controls
59 lines (53 loc) · 2.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import { PHPExtension } from "../PHPExtension.js";
import { PHPEngine } from "../PHPEngine.js";
import { PHPContext } from "../PHPContext.js";
import { PHPReference } from "../runtime/PHPVariable.js";
export class MbstringExtension extends PHPExtension {
public readonly name = "mbstring";
private async unwrap(val: any): Promise<any> {
return val instanceof PHPReference ? await val.get() : val;
}
public onInit(engine: PHPEngine): void {
const unwrap = this.unwrap;
this.functions = {
mb_strlen: async (ctx: PHPContext, strArg?: any) => String(await unwrap(strArg) ?? "").length,
mb_substr: async (ctx: PHPContext, strArg?: any, startArg?: any, lengthArg?: any) => {
const s = String(await unwrap(strArg) ?? "");
const start = Number(await unwrap(startArg)) || 0;
const lengthVal = await unwrap(lengthArg);
const length = lengthVal !== undefined && lengthVal !== null ? Number(lengthVal) : undefined;
return length !== undefined ? s.substring(start, start + length) : s.substring(start);
},
mb_strtolower: async (ctx: PHPContext, strArg?: any) => String(await unwrap(strArg) ?? "").toLowerCase(),
mb_strtoupper: async (ctx: PHPContext, strArg?: any) => String(await unwrap(strArg) ?? "").toUpperCase(),
mb_check_encoding: async (ctx: PHPContext, valueArg?: any, encodingArg?: any) => {
const val = await unwrap(valueArg);
if (val === null || val === undefined) return true;
const str = await ctx.str(val);
const rawEncoding = await unwrap(encodingArg);
const encoding = rawEncoding !== undefined && rawEncoding !== null ? (await ctx.str(rawEncoding)).toUpperCase() : "UTF-8";
if (encoding === "ASCII" || encoding === "US-ASCII") {
return !/[^\x00-\x7F]/.test(str);
}
if (encoding === "UTF-8" || encoding === "UTF8") {
try {
Buffer.from(str, "utf8");
return !/[\uFFFD]/.test(str);
} catch {
return false;
}
}
return true;
},
mb_detect_encoding: async (ctx: PHPContext, strArg?: any, encodingListArg?: any, strictArg?: any) => "UTF-8",
mb_convert_encoding: async (ctx: PHPContext, strArg?: any, toEncodingArg?: any, fromEncodingArg?: any) => {
const str = await unwrap(strArg);
if (Array.isArray(str)) return str.map((s) => String(s ?? ""));
return String(str ?? "");
},
mb_internal_encoding: async (ctx: PHPContext, encodingArg?: any) => await unwrap(encodingArg) ? true : "UTF-8",
mb_regex_encoding: async (ctx: PHPContext, encodingArg?: any) => await unwrap(encodingArg) ? true : "UTF-8",
mb_list_encodings: async () => ["UTF-8", "ASCII", "ISO-8859-1"],
};
}
}