diff --git a/src/filters/string.ts b/src/filters/string.ts index bf739db8b..4231ee82d 100644 --- a/src/filters/string.ts +++ b/src/filters/string.ts @@ -82,6 +82,15 @@ export function replace_first (v: string, arg1: string, arg2: string) { return stringify(v).replace(String(arg1), arg2) } +export function replace_last (v: string, arg1: string, arg2: string) { + const str = stringify(v) + const pattern = String(arg1) + const index = str.lastIndexOf(pattern) + if (index === -1) return str + const replacement = String(arg2) + return str.substring(0, index) + replacement + str.substring(index + pattern.length) +} + export function truncate (v: string, l = 50, o = '...') { v = stringify(v) if (v.length <= l) return v diff --git a/test/integration/filters/string.ts b/test/integration/filters/string.ts index 44d4b1c2c..27495b543 100644 --- a/test/integration/filters/string.ts +++ b/test/integration/filters/string.ts @@ -202,4 +202,14 @@ describe('filters/string', function () { return test('{{ "1 2 3 4 5 6 7 8 9 a b c d e f" | truncatewords }}', '1 2 3 4 5 6 7 8 9 a b c d e f...') }) }) + describe('replace_last', function () { + it('should replace the last occurrence of substring', function () { + return test('{{ "Take my protein pills and put my helmet on" | replace_last: "my", "your" }}', + 'Take my protein pills and put your helmet on') + }) + it('should handle substring not found', function () { + return test('{{ "Take my protein pills and put my helmet on" | replace_last: "nosuchthing", "your" }}', + 'Take my protein pills and put my helmet on') + }) + }) })