2020-12-24 12:56:28 +05:30
|
|
|
package replacer
|
|
|
|
|
|
|
|
|
|
import (
|
2021-03-05 19:25:09 +05:30
|
|
|
"strings"
|
|
|
|
|
|
2022-01-09 12:52:04 +01:00
|
|
|
"github.com/projectdiscovery/nuclei/v2/pkg/protocols/common/marker"
|
2021-03-05 19:25:09 +05:30
|
|
|
"github.com/projectdiscovery/nuclei/v2/pkg/types"
|
2020-12-24 12:56:28 +05:30
|
|
|
)
|
|
|
|
|
|
2021-02-04 04:48:45 +05:30
|
|
|
// Replace replaces placeholders in template with values on the fly.
|
|
|
|
|
func Replace(template string, values map[string]interface{}) string {
|
2021-03-05 19:25:09 +05:30
|
|
|
var replacerItems []string
|
|
|
|
|
|
|
|
|
|
builder := &strings.Builder{}
|
|
|
|
|
for key, val := range values {
|
2022-01-09 12:52:04 +01:00
|
|
|
builder.WriteString(marker.ParenthesisOpen)
|
2021-03-05 19:25:09 +05:30
|
|
|
builder.WriteString(key)
|
2022-01-09 12:52:04 +01:00
|
|
|
builder.WriteString(marker.ParenthesisClose)
|
2021-03-05 19:25:09 +05:30
|
|
|
replacerItems = append(replacerItems, builder.String())
|
|
|
|
|
builder.Reset()
|
|
|
|
|
replacerItems = append(replacerItems, types.ToString(val))
|
|
|
|
|
|
2022-01-09 12:52:04 +01:00
|
|
|
builder.WriteString(marker.General)
|
2021-03-05 19:25:09 +05:30
|
|
|
builder.WriteString(key)
|
2022-01-09 12:52:04 +01:00
|
|
|
builder.WriteString(marker.General)
|
2021-03-05 19:25:09 +05:30
|
|
|
replacerItems = append(replacerItems, builder.String())
|
|
|
|
|
builder.Reset()
|
|
|
|
|
replacerItems = append(replacerItems, types.ToString(val))
|
|
|
|
|
}
|
|
|
|
|
replacer := strings.NewReplacer(replacerItems...)
|
|
|
|
|
final := replacer.Replace(template)
|
2021-02-04 04:48:45 +05:30
|
|
|
return final
|
2020-12-24 12:56:28 +05:30
|
|
|
}
|
2022-02-01 14:12:16 +01:00
|
|
|
|
|
|
|
|
// Replace replaces one placeholder in template with one value on the fly.
|
|
|
|
|
func ReplaceOne(template string, key string, value interface{}) string {
|
|
|
|
|
data := replaceOneWithMarkers(template, key, value, marker.ParenthesisOpen, marker.ParenthesisClose)
|
|
|
|
|
return replaceOneWithMarkers(data, key, value, marker.General, marker.General)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// replaceOneWithMarkers is a helper function that perform one time replacement
|
|
|
|
|
func replaceOneWithMarkers(template, key string, value interface{}, openMarker, closeMarker string) string {
|
|
|
|
|
return strings.Replace(template, openMarker+key+closeMarker, types.ToString(value), 1)
|
|
|
|
|
}
|