github.com/servernoj/jade@v0.0.0-20231225191405-efec98d19db1/cmd/jade/config.go (about) 1 package main 2 3 import ( 4 "bytes" 5 "io" 6 "log" 7 "strings" 8 "text/template" 9 10 "github.com/Joker/jade" 11 ) 12 13 const ( 14 file_bgn = `// Code generated by "jade.go"; DO NOT EDIT. 15 16 package {{.Package}} 17 18 import ( 19 {{- range .Import}} 20 {{.}} 21 {{- end}} 22 ) 23 24 {{- range .Def}} 25 {{.}} 26 {{- end}} 27 28 {{.Func}} { 29 {{.Before}} 30 ` 31 file_end = ` 32 {{.After}} 33 } 34 ` 35 ) 36 37 var golang = jade.ReplaseTokens{ 38 GolangMode: true, 39 TagBgn: "\nbuffer.WriteString(`<%s%s>`)", 40 TagEnd: "\nbuffer.WriteString(`</%s>`)", 41 TagVoid: "\nbuffer.WriteString(`<%s%s/>`)", 42 TagArgEsc: " buffer.WriteString(` %s=\"`)\n var esc%d = %s\n buffer.WriteString(`\"`);", 43 TagArgUne: " buffer.WriteString(` %s=\"`)\n var unesc%d = %s\n buffer.WriteString(`\"`);", 44 TagArgStr: " buffer.WriteString(` %s=\"%s\"`);", 45 TagArgAdd: `%s + " " + %s`, 46 TagArgBgn: "`);", 47 TagArgEnd: "buffer.WriteString(`", 48 49 CondIf: "\nif %s {", 50 CondUnless: "\nif !%s {", 51 CondCase: "\nswitch %s {", 52 CondWhile: "\nfor %s {", 53 CondFor: "\nfor %s, %s := range %s {", 54 CondEnd: "\n}", 55 CondForIf: "\nif len(%s) > 0 { for %s, %s := range %s {", 56 57 CodeForElse: "\n}\n} else {", 58 CodeLongcode: "\n%s", 59 CodeBuffered: "\n var esc%d = %s", 60 CodeUnescaped: "\n var unesc%d = %s", 61 CodeElse: "\n} else {", 62 CodeElseIf: "\n} else if %s {", 63 CodeCaseWhen: "\ncase %s:", 64 CodeCaseDef: "\ndefault:", 65 CodeMixBlock: "\nbuffer.Write(block)", 66 67 TextStr: "\nbuffer.WriteString(`%s`)", 68 TextComment: "\nbuffer.WriteString(`<!-- %s -->`)", 69 70 MixinBgn: "\n{ %s", 71 MixinEnd: "}\n", 72 MixinVarBgn: "\nvar (", 73 MixinVar: "\n%s = %s", 74 MixinVarRest: "\n%s = %#v", 75 MixinVarEnd: "\n)\n", 76 MixinVarBlockBgn: "var block []byte\n{\nbuffer := new(bytes.Buffer)", 77 MixinVarBlock: "var block []byte", 78 MixinVarBlockEnd: "\nblock = buffer.Bytes()\n}\n", 79 } 80 81 type layout struct { 82 Package string 83 Import []string 84 Def []string 85 Bbuf string 86 Func string 87 Before string 88 After string 89 } 90 91 func (data *layout) writeBefore(wr io.Writer) { 92 t := template.Must(template.New("file_bgn").Parse(file_bgn)) 93 err := t.Execute(wr, data) 94 if err != nil { 95 log.Fatalln("executing template: ", err) 96 } 97 } 98 func (data *layout) writeAfter(wr *bytes.Buffer) { 99 t := template.Must(template.New("file_end").Parse(file_end)) 100 err := t.Execute(wr, struct{ After string }{data.After}) 101 if err != nil { 102 log.Fatalln("executing template: ", err) 103 } 104 } 105 106 func newLayout(constName string) layout { 107 var tpl layout 108 tpl.Package = pkg_name 109 110 tpl.Import = []string{ 111 `"bytes"`, 112 `"io"`, 113 `"fmt"`, 114 `"html"`, 115 `"strconv"`, 116 `"github.com/Joker/hpp"`, 117 `pool "github.com/valyala/bytebufferpool"`, 118 } 119 120 if !inline { 121 tpl.Def = []string{"const ()"} 122 } 123 124 if writer { 125 tpl.Bbuf = "wr io.Writer" 126 tpl.Before = "buffer := &WriterAsBuffer{wr}" 127 } else if stdbuf { 128 tpl.Bbuf = "buffer *bytes.Buffer" 129 } else { 130 tpl.Bbuf = "buffer *pool.ByteBuffer" 131 } 132 133 if format { 134 tpl.Before = ` 135 r, w := io.Pipe() 136 go func() { 137 buffer := &WriterAsBuffer{w}` 138 139 if writer { 140 tpl.After = ` 141 w.Close() 142 }() 143 hpp.Format(r,wr)` 144 } else { 145 tpl.After = ` 146 w.Close() 147 }() 148 hpp.Format(r,buffer)` 149 } 150 } 151 152 // 153 154 goFilter := jade.UseGoFilter() 155 156 if goFilter.Name != "" { 157 tpl.Func = "func " + goFilter.Name 158 goFilter.Name = "" 159 } else { 160 tpl.Func = `func Jade_` + constName 161 } 162 163 if goFilter.Args != "" { 164 args := strings.Split(goFilter.Args, ",") 165 buffer := true 166 for k, v := range args { 167 args[k] = strings.Trim(v, " \t\n") 168 if strings.HasPrefix(args[k], "buffer ") { 169 args[k] = tpl.Bbuf 170 buffer = false 171 } 172 } 173 if buffer { 174 args = append(args, tpl.Bbuf) 175 } 176 tpl.Func += "(" + strings.Join(args, ",") + ")" 177 goFilter.Args = "" 178 } else { 179 tpl.Func += `(` + tpl.Bbuf + `) ` 180 } 181 182 if goFilter.Import != "" { 183 imp := strings.Split(goFilter.Import, "\n") 184 for k, v := range imp { 185 str := strings.Trim(v, " \t") 186 if v[len(v)-1:] != `"` { // lastChar != `"` 187 imp[k] = `"` + str + `"` 188 } else { 189 imp[k] = str 190 } 191 } 192 tpl.Import = append(tpl.Import, imp...) 193 goFilter.Import = "" 194 } 195 return tpl 196 }