// Package textutil provide some extra text handle util package textutil import ( "fmt" "git.noahlan.cn/noahlan/ntool/narr" "git.noahlan.cn/noahlan/ntool/nmap" "git.noahlan.cn/noahlan/ntool/nstr" "strings" ) // ReplaceVars by regex replace given tpl vars. // // If format is empty, will use {const defaultVarFormat} func ReplaceVars(text string, vars map[string]any, format string) string { return NewVarReplacer(format).Replace(text, vars) } // RenderSMap by regex replace given tpl vars. // // If format is empty, will use {const defaultVarFormat} func RenderSMap(text string, vars map[string]string, format string) string { return NewVarReplacer(format).RenderSimple(text, vars) } // IsMatchAll keywords in the give text string. // // TIP: can use ^ for exclude match. func IsMatchAll(s string, keywords []string) bool { return nstr.SimpleMatch(s, keywords) } // ParseInlineINI parse config string to string-map. it's like INI format contents. // // Examples: // // eg: "name=val0;shorts=i;required=true;desc=a message" // => // {name: val0, shorts: i, required: true, desc: a message} func ParseInlineINI(tagVal string, keys ...string) (mp nmap.SMap, err error) { ss := nstr.Split(tagVal, ";") ln := len(ss) if ln == 0 { return } mp = make(nmap.SMap, ln) for _, s := range ss { if !strings.ContainsRune(s, '=') { err = fmt.Errorf("parse inline config error: must match `KEY=VAL`") return } key, val := nstr.TrimCut(s, "=") if len(keys) > 0 && !narr.StringsHas(keys, key) { err = fmt.Errorf("parse inline config error: invalid key name %q", key) return } mp[key] = val } return }