RunTest.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package service
  2. import (
  3. "bufio"
  4. "fmt"
  5. "os"
  6. "regexp"
  7. "strings"
  8. )
  9. // RunTest 运行测试,检测模板
  10. // 标签对{{~}}开头 ,{{end}}结尾
  11. // - {{for .item in .list}} {{end}}
  12. // - {{if .bool}}~{{end}}
  13. // - {{if .bool}}~{{else}}~{{end}}
  14. // - {{if .bool}}~{{elseif}}~{{else}}~{{end}}
  15. //
  16. // 单标签
  17. // - {{.item}}
  18. // 解析模板
  19. func RunTest() {
  20. tmpl := ReadFileToString()
  21. //compileRegex := regexp.MustCompile("{{2} *(for *\\w+ +in +\\.\\w+)|(if +\\.\\w+)|(else)|(else +if +\\.\\w+) *}{2}") // 正则表达式的分组,以括号()表示,每一对括号就是我们匹配到的一个文本,可以把他们提取出来。
  22. //matchArr := compileRegex.FindStringSubmatch(tmpl) // FindStringSubmatch 方法是提取出匹配的字符串,然后通过[]string返回。我们可以看到,第1个匹配到的是这个字符串本身,从第2个开始,才是我们想要的字符串。
  23. //if len(matchArr) > 0 {
  24. // fmt.Println("提取字符串内容:", matchArr[len(matchArr)-1]) // 输出:蜜桃乌龙茶
  25. //}
  26. var err error
  27. AllTagReg, err = regexp.Compile("^{{2} *(for *\\w+ +in +\\.\\w+)|(if +\\.\\w+)|(else)|(else +if +\\.\\w+) *}{2}$")
  28. if err != nil {
  29. panic(err)
  30. }
  31. ForReg, err = regexp.Compile("^{{2} *for *\\w+ +in +\\.\\w+ *}{2}$")
  32. if err != nil {
  33. panic(err)
  34. }
  35. IfReg, err = regexp.Compile("^{{2} *if +\\.\\w+ *}{2}$")
  36. if err != nil {
  37. panic(err)
  38. }
  39. IfElseReg, err = regexp.Compile("^{{2} *else +if +\\.\\w+ *}{2}$")
  40. if err != nil {
  41. panic(err)
  42. }
  43. ElseReg, err = regexp.Compile("^{{2} *else *}{2}$")
  44. if err != nil {
  45. panic(err)
  46. }
  47. End, err = regexp.Compile("^{{2} *end *}{2}$")
  48. if err != nil {
  49. panic(err)
  50. }
  51. Item, err = regexp.Compile("^{{2} *\\.\\w+ *}{2}$")
  52. template, index, err := AnalysisTemplate(tmpl, 0)
  53. if err != nil {
  54. fmt.Println(err)
  55. }
  56. fmt.Println(template, index)
  57. }
  58. var AllTagReg *regexp.Regexp
  59. var ForReg *regexp.Regexp
  60. var IfReg *regexp.Regexp
  61. var IfElseReg *regexp.Regexp
  62. var ElseReg *regexp.Regexp
  63. var End *regexp.Regexp
  64. var Item *regexp.Regexp
  65. type Template struct {
  66. Tag string //标签
  67. TagType string //标签类型 for if
  68. Content string //
  69. SubTemplate []Template
  70. }
  71. func (t Template) String() string {
  72. return fmt.Sprintf("Tag:%s,TagType:%s,Content:%s,SubTemplate:%s", t.Tag, t.TagType, t.Content, t.SubTemplate)
  73. }
  74. // AnalysisTemplate
  75. func AnalysisTemplate(tmpl string, startIndex int) (Template, int, error) {
  76. template := Template{}
  77. index := IndexOf(tmpl, "{{", startIndex)
  78. if index == -1 {
  79. //完美
  80. return template, -1, nil
  81. }
  82. endIndex := IndexOf(tmpl, "}}", index+1)
  83. if endIndex == -1 {
  84. return template, -1, nil
  85. }
  86. str := tmpl[index : endIndex+2]
  87. //正则判断
  88. if AllTagReg.MatchString(str) {
  89. compileRegex := regexp.MustCompile("\\{\\{ *(for|if|elseif|else|end) +.* *}}")
  90. matchArr := compileRegex.FindStringSubmatch(str)
  91. template.TagType = matchArr[1]
  92. //匹配到
  93. template.Tag = str
  94. template.Content = tmpl[index+2 : endIndex]
  95. return template, endIndex + 2, nil
  96. }
  97. return Template{}, index, nil
  98. }
  99. func IndexOf(s, subString string, startIndex int) int {
  100. str := s[startIndex:]
  101. index := strings.Index(str, subString)
  102. if index == -1 {
  103. return -1
  104. }
  105. return index + startIndex
  106. }
  107. func ReadFileToString() string {
  108. file, err := os.OpenFile("./service/struct.go.template", os.O_CREATE|os.O_RDWR, 0666)
  109. if err != nil {
  110. panic(err)
  111. }
  112. defer file.Close()
  113. reader := bufio.NewReader(file)
  114. var bytes = make([]byte, 1024)
  115. for {
  116. n, err := reader.Read(bytes)
  117. if err != nil {
  118. panic(err)
  119. }
  120. bytes = append(bytes, bytes[:n]...)
  121. if n < 1024 {
  122. break
  123. }
  124. }
  125. return string(bytes)
  126. }