diff options
Diffstat (limited to 'replacer.go')
-rw-r--r-- | replacer.go | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/replacer.go b/replacer.go index aad13e2a2..88234046f 100644 --- a/replacer.go +++ b/replacer.go @@ -125,6 +125,14 @@ func (r *Replacer) replace(input, empty string, // iterate the input to find each placeholder var lastWriteCursor int for i := 0; i < len(input); i++ { + + // check for escaped braces + if i > 0 && input[i-1] == phEscape && (input[i] == phClose || input[i] == phOpen) { + sb.WriteString(input[lastWriteCursor : i-1]) + lastWriteCursor = i + continue + } + if input[i] != phOpen { continue } @@ -135,6 +143,11 @@ func (r *Replacer) replace(input, empty string, continue } + // if necessary look for the first closing brace that is not escaped + for end > 0 && end < len(input)-1 && input[end-1] == phEscape { + end = strings.Index(input[end+1:], string(phClose)) + end + 1 + } + // write the substring from the last cursor to this point sb.WriteString(input[lastWriteCursor:i]) @@ -237,4 +250,4 @@ var nowFunc = time.Now // ReplacerCtxKey is the context key for a replacer. const ReplacerCtxKey CtxKey = "replacer" -const phOpen, phClose = '{', '}' +const phOpen, phClose, phEscape = '{', '}', '\\' |