From 0ff503816285147f3654b3e217332f02ed95ff59 Mon Sep 17 00:00:00 2001 From: Adam Fowler Date: Thu, 18 Mar 2021 15:33:47 +0000 Subject: [PATCH] End sections includes method --- Sources/HummingbirdMustache/Template+Parser.swift | 12 +++++++----- Tests/HummingbirdMustacheTests/MethodTests.swift | 14 +++++++------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/Sources/HummingbirdMustache/Template+Parser.swift b/Sources/HummingbirdMustache/Template+Parser.swift index e7373ed..e13d8b2 100644 --- a/Sources/HummingbirdMustache/Template+Parser.swift +++ b/Sources/HummingbirdMustache/Template+Parser.swift @@ -9,6 +9,7 @@ extension HBMustacheTemplate { struct ParserState { var sectionName: String? + var sectionMethod: String? var newLine: Bool var startDelimiter: String var endDelimiter: String @@ -20,9 +21,10 @@ extension HBMustacheTemplate { endDelimiter = "}}" } - func withSectionName(_ name: String) -> ParserState { + func withSectionName(_ name: String, method: String? = nil) -> ParserState { var newValue = self newValue.sectionName = name + newValue.sectionMethod = method return newValue } @@ -88,7 +90,7 @@ extension HBMustacheTemplate { tokens.append(.text(whiteSpaceBefore)) whiteSpaceBefore = "" } - let sectionTokens = try parse(&parser, state: state.withSectionName(name)) + let sectionTokens = try parse(&parser, state: state.withSectionName(name, method: method)) tokens.append(.section(name: name, method: method, template: HBMustacheTemplate(sectionTokens))) case "^": @@ -101,14 +103,14 @@ extension HBMustacheTemplate { tokens.append(.text(whiteSpaceBefore)) whiteSpaceBefore = "" } - let sectionTokens = try parse(&parser, state: state.withSectionName(name)) + let sectionTokens = try parse(&parser, state: state.withSectionName(name, method: method)) tokens.append(.invertedSection(name: name, method: method, template: HBMustacheTemplate(sectionTokens))) case "/": // end of section parser.unsafeAdvance() - let (name, _) = try parseName(&parser, state: state) - guard name == state.sectionName else { + let (name, method) = try parseName(&parser, state: state) + guard name == state.sectionName, method == state.sectionMethod else { throw Error.sectionCloseNameIncorrect } if isStandalone(&parser, state: state) { diff --git a/Tests/HummingbirdMustacheTests/MethodTests.swift b/Tests/HummingbirdMustacheTests/MethodTests.swift index 5fd7fb6..880c3fb 100644 --- a/Tests/HummingbirdMustacheTests/MethodTests.swift +++ b/Tests/HummingbirdMustacheTests/MethodTests.swift @@ -37,7 +37,7 @@ final class MethodTests: XCTestCase { func testFirstLast() throws { let template = try HBMustacheTemplate(string: """ {{#repo}} - {{#first()}}first: {{/}}{{#last()}}last: {{/}}{{ name }} + {{#first()}}first: {{/first()}}{{#last()}}last: {{/last()}}{{ name }} {{/repo}} """) @@ -53,7 +53,7 @@ final class MethodTests: XCTestCase { func testIndex() throws { let template = try HBMustacheTemplate(string: """ {{#repo}} - {{#index()}}{{plusone(.)}}{{/}}) {{ name }} + {{#index()}}{{plusone(.)}}{{/index()}}) {{ name }} {{/repo}} """) @@ -69,7 +69,7 @@ final class MethodTests: XCTestCase { func testEvenOdd() throws { let template = try HBMustacheTemplate(string: """ {{#repo}} - {{index()}}) {{#even()}}even {{/}}{{#odd()}}odd {{/}}{{ name }} + {{index()}}) {{#even()}}even {{/even()}}{{#odd()}}odd {{/odd()}}{{ name }} {{/repo}} """) @@ -86,7 +86,7 @@ final class MethodTests: XCTestCase { let template = try HBMustacheTemplate(string: """ {{#reversed(repo)}} {{ name }} - {{/repo}} + {{/reversed(repo)}} """) let object: [String: Any] = ["repo": [["name": "resque"], ["name": "hub"], ["name": "rip"]]] @@ -117,7 +117,7 @@ final class MethodTests: XCTestCase { let template = try HBMustacheTemplate(string: """ {{#sorted(repo)}} {{ index() }}) {{ . }} - {{/repo}} + {{/sorted(repo)}} """) let object: [String: Any] = ["repo": ["resque", "hub", "rip"]] XCTAssertEqual(template.render(object), """ @@ -130,7 +130,7 @@ final class MethodTests: XCTestCase { func testDictionaryEnumerated() throws { let template = try HBMustacheTemplate(string: """ - {{#enumerated(.)}}{{ key }} = {{ value }}{{/.}} + {{#enumerated(.)}}{{ key }} = {{ value }}{{/enumerated(.)}} """) let object: [String: Any] = ["one": 1, "two": 2] let result = template.render(object) @@ -139,7 +139,7 @@ final class MethodTests: XCTestCase { func testDictionarySortedByKey() throws { let template = try HBMustacheTemplate(string: """ - {{#sorted(.)}}{{ key }} = {{ value }}{{/.}} + {{#sorted(.)}}{{ key }} = {{ value }}{{/sorted(.)}} """) let object: [String: Any] = ["one": 1, "two": 2, "three": 3] let result = template.render(object)