From 9ea5bafecfba2a6cf80de9326a3291ebd53c803c Mon Sep 17 00:00:00 2001 From: Tien Do Nam Date: Fri, 16 Sep 2022 16:52:10 +0200 Subject: [PATCH] fix: interpolation bugs --- slang/lib/builder/model/node.dart | 5 +++- .../string_interpolation_extensions.dart | 5 ++-- .../string_interpolation_extensions_test.dart | 25 +++++++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/slang/lib/builder/model/node.dart b/slang/lib/builder/model/node.dart index 5b2f27da..4153071c 100644 --- a/slang/lib/builder/model/node.dart +++ b/slang/lib/builder/model/node.dart @@ -485,7 +485,10 @@ _ParamWithArg _parseParamWithArg({ required String input, required CaseStyle? paramCase, }) { - final match = RegexUtils.paramWithArg.firstMatch(input)!; + final match = RegexUtils.paramWithArg.firstMatch(input); + if (match == null) { + throw 'Rich text parameters must follow the syntax: "param(default text)"\nGot instead: "$input"\n'; + } return _ParamWithArg(match.group(1)!.toCase(paramCase), match.group(3)); } diff --git a/slang/lib/builder/utils/string_interpolation_extensions.dart b/slang/lib/builder/utils/string_interpolation_extensions.dart index f48ce9b1..fd85c2da 100644 --- a/slang/lib/builder/utils/string_interpolation_extensions.dart +++ b/slang/lib/builder/utils/string_interpolation_extensions.dart @@ -56,9 +56,10 @@ String _replaceBetween({ buffer.write(curr.substring(0, startIndex)); } - int endIndex = curr.indexOf(endCharacter); + int endIndex = + curr.indexOf(endCharacter, startIndex + startCharacterLength); if (endIndex == -1) { - buffer.write(curr); + buffer.write(curr.substring(startIndex)); break; } diff --git a/slang/test/unit/utils/string_interpolation_extensions_test.dart b/slang/test/unit/utils/string_interpolation_extensions_test.dart index cd1459b3..75889087 100644 --- a/slang/test/unit/utils/string_interpolation_extensions_test.dart +++ b/slang/test/unit/utils/string_interpolation_extensions_test.dart @@ -37,6 +37,21 @@ void main() { expect(input.braces(), 'Hello X'); }); + test('start with closing bracket', () { + final input = '} {a}'; + expect(input.braces(), '} X'); + }); + + test('ends with opening bracket', () { + final input = '{a} {'; + expect(input.braces(), 'X {'); + }); + + test('has double braces instead single braces', () { + final input = 'Hello {{a}} {{b}}'; + expect(input.braces(), 'Hello X} X}'); + }); + test('ignore \\{ only', () { final input = 'Hello \\{ World!'; expect(input.braces(), 'Hello { World!'); @@ -69,6 +84,16 @@ void main() { expect(input.doubleBraces(), 'Hello X'); }); + test('start with closing bracket', () { + final input = '}} {{a}}'; + expect(input.doubleBraces(), '}} X'); + }); + + test('ends with opening bracket', () { + final input = '{{a}} {{'; + expect(input.doubleBraces(), 'X {{'); + }); + test('ignore \\{{ only', () { final input = 'Hello \\{{ World!'; expect(input.doubleBraces(), 'Hello {{ World!');