mirror of
https://github.com/wavetermdev/htmltoken.git
synced 2026-04-22 15:26:29 -07:00
98 lines
1.6 KiB
Go
98 lines
1.6 KiB
Go
// Copyright 2024 Command Line Inc. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package htmltoken
|
|
|
|
import "fmt"
|
|
|
|
func (z *Tokenizer) parseBraceAttr() {
|
|
braceCount := 1
|
|
inString := false
|
|
prevStrBackslash := false
|
|
|
|
z.pendingAttr[1].start = z.raw.end
|
|
for {
|
|
ch := z.readByte()
|
|
if z.err != nil {
|
|
z.pendingAttr[1].end = z.raw.end
|
|
return
|
|
}
|
|
if inString {
|
|
if prevStrBackslash {
|
|
prevStrBackslash = false
|
|
continue
|
|
}
|
|
if ch == '\\' {
|
|
prevStrBackslash = true
|
|
continue
|
|
}
|
|
if ch == '"' {
|
|
inString = false
|
|
continue
|
|
}
|
|
continue
|
|
}
|
|
if ch == '{' {
|
|
braceCount++
|
|
continue
|
|
}
|
|
if ch == '"' {
|
|
inString = true
|
|
continue
|
|
}
|
|
if ch == '}' {
|
|
braceCount--
|
|
if braceCount == 0 {
|
|
z.pendingAttr[1].end = z.raw.end - 1
|
|
return
|
|
}
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
|
|
func (z *Tokenizer) parseBraceAttrEx(input string) (string, error) {
|
|
var result []rune
|
|
braceCount := 0
|
|
inString := false
|
|
|
|
for i := 0; i < len(input); i++ {
|
|
ch := rune(input[i])
|
|
|
|
if inString {
|
|
// Handle string escape sequences
|
|
if ch == '\\' && i+1 < len(input) {
|
|
result = append(result, ch, rune(input[i+1]))
|
|
i++
|
|
continue
|
|
}
|
|
if ch == '"' {
|
|
inString = false
|
|
}
|
|
result = append(result, ch)
|
|
continue
|
|
}
|
|
|
|
switch ch {
|
|
case '{':
|
|
braceCount++
|
|
case '}':
|
|
braceCount--
|
|
if braceCount == 0 {
|
|
return string(result), nil
|
|
}
|
|
case '"':
|
|
inString = true
|
|
}
|
|
|
|
result = append(result, ch)
|
|
}
|
|
|
|
if braceCount != 0 {
|
|
return "", fmt.Errorf("unbalanced braces")
|
|
}
|
|
|
|
return string(result), nil
|
|
}
|