package util import ( "fmt" "regexp" ) func init() { var err error AllTagReg, err = regexp.Compile("^{{2} *((for|FOR) *\\w+ +(in|IN) +(\\.\\w+)+})|((if|IF) +(\\.\\w+)+)|(else)|(ELSE)|((elseif)|(ELSEIF) +(\\.\\w+)+)|(end)|(END)|((\\.\\w+)+) *}{2}$") if err != nil { panic(err) } ForReg, err = regexp.Compile("^{{2} *(for|FOR) *\\w+ +(in|IN) +(\\.\\w+)+ *}{2}$") if err != nil { panic(err) } IfReg, err = regexp.Compile("^{{2} *(if|IF) +(\\.\\w+)+ *}{2}$") if err != nil { panic(err) } IfElseReg, err = regexp.Compile("^{{2} *(elseif)|(ELSEIF) +(\\.\\w+)+ *}{2}$") if err != nil { panic(err) } ElseReg, err = regexp.Compile("^{{2} *(else|ELSE) *}{2}$") if err != nil { panic(err) } EndReg, err = regexp.Compile("^{{2} *(end|END) *}{2}$") if err != nil { panic(err) } ItemReg, err = regexp.Compile("^{{2} *(\\.\\w+)+ *}{2}$") if err != nil { panic(err) } } var AllTagReg *regexp.Regexp var ForReg *regexp.Regexp var IfReg *regexp.Regexp var IfElseReg *regexp.Regexp var ElseReg *regexp.Regexp var EndReg *regexp.Regexp var ItemReg *regexp.Regexp // CheckTag 校验字符串是否符合标签 func CheckTag(str, tag string) bool { var res = false switch tag { case "FOR": res = ForReg.MatchString(str) break case "IF": res = IfReg.MatchString(str) break case "IFELSE": res = IfElseReg.MatchString(str) break case "ELSE": res = ElseReg.MatchString(str) break case "END": res = EndReg.MatchString(str) break case "ITEM": res = ItemReg.MatchString(str) break } return res } type Template struct { Tag []Tag //标签 TagType string //标签类型 for if Content string //模板内容 SubTemplate []Template //模板 } func (t Template) String() string { return fmt.Sprintf("Tag:%s,TagType:%s,Content:%s,SubTemplate:%s", t.Tag, t.TagType, t.Content, t.SubTemplate) } type Tag struct { Template *Template Tag string StartIndex int EndIndex int TagType string } func (t Tag) String() string { return fmt.Sprintf("Tag:%s,StartIndex:%d,EndIndex:%d,TagType:%s\n", t.Tag, t.StartIndex, t.EndIndex, t.TagType) }