summaryrefslogtreecommitdiff
path: root/replacer.go
diff options
context:
space:
mode:
Diffstat (limited to 'replacer.go')
-rw-r--r--replacer.go15
1 files changed, 14 insertions, 1 deletions
diff --git a/replacer.go b/replacer.go
index aad13e2..8823404 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 = '{', '}', '\\'