X Tutup
Skip to content

Commit 9f82954

Browse files
authored
Added string.trim, string.trim{Left,Right,StartEnd} (#767)
* Added string.trim, string.trimLeft, string.trimRight, string.trimStart and string.trimEnd * Updated node version * Added tests for newline characters getting trimmed * Added some final testcases for trim * Added support for BOM and non-breaking space * Changed up test cases, removed curly braces from Lua pattern
1 parent 6800dc8 commit 9f82954

File tree

6 files changed

+48
-0
lines changed

6 files changed

+48
-0
lines changed

src/LuaLib.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ export enum LuaLibFeature {
6161
StringReplace = "StringReplace",
6262
StringSplit = "StringSplit",
6363
StringStartsWith = "StringStartsWith",
64+
StringTrim = "StringTrim",
65+
StringTrimEnd = "StringTrimEnd",
66+
StringTrimStart = "StringTrimStart",
6467
Symbol = "Symbol",
6568
SymbolRegistry = "SymbolRegistry",
6669
TypeOf = "TypeOf",

src/lualib/StringTrim.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function __TS__StringTrim(this: string): string {
2+
// http://lua-users.org/wiki/StringTrim
3+
const [result] = string.gsub(this, "^[%s\xA0\uFEFF]*(.-)[%s\xA0\uFEFF]*$", "%1");
4+
return result;
5+
}

src/lualib/StringTrimEnd.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function __TS__StringTrimEnd(this: string): string {
2+
// http://lua-users.org/wiki/StringTrim
3+
const [result] = string.gsub(this, "[%s\xA0\uFEFF]*$", "");
4+
return result;
5+
}

src/lualib/StringTrimStart.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function __TS__StringTrimStart(this: string): string {
2+
// http://lua-users.org/wiki/StringTrim
3+
const [result] = string.gsub(this, "^[%s\xA0\uFEFF]*", "");
4+
return result;
5+
}

src/transformation/builtins/string.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,14 @@ export function transformStringPrototypeCall(
9494
return createStringCall("lower", node, caller);
9595
case "toUpperCase":
9696
return createStringCall("upper", node, caller);
97+
case "trim":
98+
return transformLuaLibFunction(context, LuaLibFeature.StringTrim, node, caller);
99+
case "trimEnd":
100+
case "trimRight":
101+
return transformLuaLibFunction(context, LuaLibFeature.StringTrimEnd, node, caller);
102+
case "trimStart":
103+
case "trimLeft":
104+
return transformLuaLibFunction(context, LuaLibFeature.StringTrimStart, node, caller);
97105
case "split":
98106
return transformLuaLibFunction(context, LuaLibFeature.StringSplit, node, caller, ...params);
99107
case "charAt":

test/unit/builtins/string.spec.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,3 +265,25 @@ test.each([
265265
`;
266266
expect(util.transpileAndExecute(code)).toBe(6);
267267
});
268+
269+
const trimTestCases = [
270+
"",
271+
" ",
272+
"\t",
273+
"\t \t",
274+
" foo ",
275+
"\tfoo\t",
276+
"\ffoo\f",
277+
"\vfoo\v",
278+
"\uFEFFFoo\uFEFF",
279+
"\xA0Foo\xA0",
280+
" \t foo \t ",
281+
" foo bar ",
282+
"\r\nfoo\n\r\n",
283+
"\r\nfoo\nbar\n\r\n",
284+
];
285+
describe.each(["trim", "trimEnd", "trimRight", "trimStart", "trimLeft"])("string.%s", trim => {
286+
test.each(trimTestCases)("matches JS result (%p)", testString => {
287+
util.testExpression`${util.formatCode(testString)}.${trim}()`.expectToMatchJsResult();
288+
});
289+
});

0 commit comments

Comments
 (0)
X Tutup