diff --git a/src/filters/string.ts b/src/filters/string.ts index 4231ee82d..19cae3f83 100644 --- a/src/filters/string.ts +++ b/src/filters/string.ts @@ -39,6 +39,14 @@ export function remove_first (v: string, l: string) { return stringify(v).replace(String(l), '') } +export function remove_last (v: string, l: string) { + const str = stringify(v) + const pattern = String(l) + const index = str.lastIndexOf(pattern) + if (index === -1) return str + return str.substring(0, index) + str.substring(index + pattern.length + 1) +} + export function rstrip (str: string, chars?: string) { if (chars) { chars = escapeRegExp(stringify(chars)) diff --git a/test/integration/filters/string.ts b/test/integration/filters/string.ts index 27495b543..20d8e4703 100644 --- a/test/integration/filters/string.ts +++ b/test/integration/filters/string.ts @@ -202,13 +202,23 @@ 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('remove_last', function () { + it('should remove the last occurrence of substring', function () { + return test('{{ "I strained to see the train through the rain" | remove_last: "rain" }}', + 'I strained to see the train through the ') + }) + it('should handle substring not found', function () { + return test('{{ "I strained to see the train through the rain" | remove_last: "no such thing" }}', + 'I strained to see the train through the rain') + }) + }) 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" }}', + return test('{{ "Take my protein pills and put my helmet on" | replace_last: "no such thing", "your" }}', 'Take my protein pills and put my helmet on') }) })