Tidy standalone processing

This commit is contained in:
Adam Fowler
2021-03-18 12:58:48 +00:00
parent 751126d729
commit b637c4c4a4
3 changed files with 16 additions and 29 deletions

View File

@@ -406,6 +406,10 @@ extension HBParser {
} }
mutating func setPosition(_ index: Int) throws { mutating func setPosition(_ index: Int) throws {
if index == self.range.endIndex {
_setPosition(index)
return
}
guard range.contains(index) else { throw Error.invalidPosition } guard range.contains(index) else { throw Error.invalidPosition }
guard validateUTF8Character(at: index).0 != nil else { throw Error.invalidPosition } guard validateUTF8Character(at: index).0 != nil else { throw Error.invalidPosition }
_setPosition(index) _setPosition(index)

View File

@@ -82,11 +82,8 @@ extension HBMustacheTemplate {
// section // section
parser.unsafeAdvance() parser.unsafeAdvance()
let (name, method) = try parseName(&parser, state: state) let (name, method) = try parseName(&parser, state: state)
if state.newLine, hasLineFinished(&parser) { if isStandalone(&parser, state: state) {
setNewLine = true setNewLine = true
if parser.current() == "\n" {
parser.unsafeAdvance()
}
} else if whiteSpaceBefore.count > 0 { } else if whiteSpaceBefore.count > 0 {
tokens.append(.text(whiteSpaceBefore)) tokens.append(.text(whiteSpaceBefore))
whiteSpaceBefore = "" whiteSpaceBefore = ""
@@ -98,11 +95,8 @@ extension HBMustacheTemplate {
// inverted section // inverted section
parser.unsafeAdvance() parser.unsafeAdvance()
let (name, method) = try parseName(&parser, state: state) let (name, method) = try parseName(&parser, state: state)
if state.newLine, hasLineFinished(&parser) { if isStandalone(&parser, state: state) {
setNewLine = true setNewLine = true
if parser.current() == "\n" {
parser.unsafeAdvance()
}
} else if whiteSpaceBefore.count > 0 { } else if whiteSpaceBefore.count > 0 {
tokens.append(.text(whiteSpaceBefore)) tokens.append(.text(whiteSpaceBefore))
whiteSpaceBefore = "" whiteSpaceBefore = ""
@@ -117,11 +111,8 @@ extension HBMustacheTemplate {
guard name == state.sectionName else { guard name == state.sectionName else {
throw Error.sectionCloseNameIncorrect throw Error.sectionCloseNameIncorrect
} }
if state.newLine, hasLineFinished(&parser) { if isStandalone(&parser, state: state) {
setNewLine = true setNewLine = true
if parser.current() == "\n" {
parser.unsafeAdvance()
}
} else if whiteSpaceBefore.count > 0 { } else if whiteSpaceBefore.count > 0 {
tokens.append(.text(whiteSpaceBefore)) tokens.append(.text(whiteSpaceBefore))
whiteSpaceBefore = "" whiteSpaceBefore = ""
@@ -132,12 +123,7 @@ extension HBMustacheTemplate {
// comment // comment
parser.unsafeAdvance() parser.unsafeAdvance()
_ = try parseComment(&parser, state: state) _ = try parseComment(&parser, state: state)
if state.newLine, hasLineFinished(&parser) { setNewLine = isStandalone(&parser, state: state)
setNewLine = true
if !parser.reachedEnd() {
parser.unsafeAdvance()
}
}
case "{": case "{":
// unescaped variable // unescaped variable
@@ -167,11 +153,8 @@ extension HBMustacheTemplate {
if whiteSpaceBefore.count > 0 { if whiteSpaceBefore.count > 0 {
tokens.append(.text(whiteSpaceBefore)) tokens.append(.text(whiteSpaceBefore))
} }
if state.newLine, hasLineFinished(&parser) { if isStandalone(&parser, state: state) {
setNewLine = true setNewLine = true
if parser.current() == "\n" {
parser.unsafeAdvance()
}
tokens.append(.partial(name, indentation: whiteSpaceBefore)) tokens.append(.partial(name, indentation: whiteSpaceBefore))
} else { } else {
tokens.append(.partial(name, indentation: nil)) tokens.append(.partial(name, indentation: nil))
@@ -182,12 +165,7 @@ extension HBMustacheTemplate {
// set delimiter // set delimiter
parser.unsafeAdvance() parser.unsafeAdvance()
state = try parserSetDelimiter(&parser, state: state) state = try parserSetDelimiter(&parser, state: state)
if state.newLine, hasLineFinished(&parser) { setNewLine = isStandalone(&parser, state: state)
setNewLine = true
if !parser.reachedEnd() {
parser.unsafeAdvance()
}
}
default: default:
// variable // variable
@@ -278,12 +256,17 @@ extension HBMustacheTemplate {
if parser.reachedEnd() { return true } if parser.reachedEnd() { return true }
parser2.read(while: Set(" \t\r")) parser2.read(while: Set(" \t\r"))
if parser2.current() == "\n" { if parser2.current() == "\n" {
parser2.unsafeAdvance()
try! parser.setPosition(parser2.getPosition()) try! parser.setPosition(parser2.getPosition())
return true return true
} }
return false return false
} }
static func isStandalone(_ parser: inout HBParser, state: ParserState) -> Bool {
return state.newLine && hasLineFinished(&parser)
}
private static let sectionNameCharsWithoutBrackets = Set<Unicode.Scalar>("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ._?") private static let sectionNameCharsWithoutBrackets = Set<Unicode.Scalar>("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ._?")
private static let sectionNameChars = Set<Unicode.Scalar>("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ._?()") private static let sectionNameChars = Set<Unicode.Scalar>("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ._?()")
} }

View File

@@ -8,7 +8,7 @@ extension HBMustacheTemplate {
/// - Returns: Rendered text /// - Returns: Rendered text
func render(_ stack: [Any], context: HBMustacheContext? = nil, indentation: String? = nil) -> String { func render(_ stack: [Any], context: HBMustacheContext? = nil, indentation: String? = nil) -> String {
var string = "" var string = ""
if let indentation = indentation { if let indentation = indentation, indentation != "" {
for token in tokens { for token in tokens {
if string.last == "\n" { if string.last == "\n" {
string += indentation string += indentation