github.com/ngocphuongnb/tetua@v0.0.7-alpha/packages/jade/jade.go (about) 1 // https://github.com/Joker/jade/blob/master/cmd/jade/jade.go 2 3 package jadecmd 4 5 import ( 6 "log" 7 "os" 8 "text/template" 9 ) 10 11 const ( 12 jade_go = `// Code generated by "jade.go"; DO NOT EDIT. 13 package {{.Pkg}} 14 15 import ( 16 "bytes" 17 "bufio" 18 "strconv" 19 20 {{- if eq .Buf "*pool.ByteBuffer"}} 21 pool "github.com/valyala/bytebufferpool" 22 {{- end }} 23 ) 24 25 var ( 26 escaped = []byte{'<', '>', '"', '\'', '&'} 27 replacing = []string{"<", ">", """, "'", "&"} 28 ) 29 30 func WriteEscString(st string, buffer {{.Buf}}) { 31 for i := 0; i < len(st); i++ { 32 if n := bytes.IndexByte(escaped, st[i]); n >= 0 { 33 buffer.WriteString(replacing[n]) 34 } else { 35 buffer.WriteByte(st[i]) 36 } 37 } 38 buffer.Flush() 39 } 40 41 type WriterAsBuffer struct { 42 *bufio.Writer 43 } 44 45 func (w *WriterAsBuffer) WriteString(s string) (n int, err error) { 46 n, err = w.Write([]byte(s)) 47 w.Flush() 48 return 49 } 50 51 func (w *WriterAsBuffer) WriteByte(b byte) (err error) { 52 _, err = w.Write([]byte{b}) 53 w.Flush() 54 return 55 } 56 57 type stringer interface { 58 String() string 59 } 60 61 func WriteAll(a interface{}, escape bool, buffer {{.Buf}}) { 62 switch v := a.(type) { 63 case string: 64 if escape { 65 WriteEscString(v, buffer) 66 } else { 67 buffer.WriteString(v) 68 } 69 case int: 70 WriteInt(int64(v), buffer) 71 case int8: 72 WriteInt(int64(v), buffer) 73 case int16: 74 WriteInt(int64(v), buffer) 75 case int32: 76 WriteInt(int64(v), buffer) 77 case int64: 78 WriteInt(v, buffer) 79 case uint: 80 WriteUint(uint64(v), buffer) 81 case uint8: 82 WriteUint(uint64(v), buffer) 83 case uint16: 84 WriteUint(uint64(v), buffer) 85 case uint32: 86 WriteUint(uint64(v), buffer) 87 case uint64: 88 WriteUint(v, buffer) 89 case float32: 90 buffer.WriteString(strconv.FormatFloat(float64(v), 'f', -1, 64)) 91 case float64: 92 buffer.WriteString(strconv.FormatFloat(v, 'f', -1, 64)) 93 case bool: 94 WriteBool(v, buffer) 95 case stringer: 96 if escape { 97 WriteEscString(v.String(), buffer) 98 } else { 99 buffer.WriteString(v.String()) 100 } 101 default: 102 buffer.WriteString("\n<<< unprinted type, fmt.Stringer implementation needed >>>\n") 103 } 104 buffer.Flush() 105 } 106 107 func ternary(condition bool, iftrue, iffalse interface{}) interface{} { 108 if condition { 109 return iftrue 110 } else { 111 return iffalse 112 } 113 } 114 115 // Used part of go source: 116 // https://github.com/golang/go/blob/master/src/strconv/itoa.go 117 func WriteUint(u uint64, buffer {{.Buf}}) { 118 var a [64 + 1]byte 119 i := len(a) 120 121 if ^uintptr(0)>>32 == 0 { 122 for u > uint64(^uintptr(0)) { 123 q := u / 1e9 124 us := uintptr(u - q*1e9) 125 for j := 9; j > 0; j-- { 126 i-- 127 qs := us / 10 128 a[i] = byte(us - qs*10 + '0') 129 us = qs 130 } 131 u = q 132 } 133 } 134 135 us := uintptr(u) 136 for us >= 10 { 137 i-- 138 q := us / 10 139 a[i] = byte(us - q*10 + '0') 140 us = q 141 } 142 143 i-- 144 a[i] = byte(us + '0') 145 buffer.Write(a[i:]) 146 } 147 func WriteInt(i int64, buffer {{.Buf}}) { 148 if i < 0 { 149 buffer.WriteByte('-') 150 i = -i 151 } 152 WriteUint(uint64(i), buffer) 153 } 154 func WriteBool(b bool, buffer {{.Buf}}) { 155 if b { 156 buffer.WriteString("true") 157 return 158 } 159 buffer.WriteString("false") 160 } 161 ` 162 ) 163 164 func makeJfile(std bool) { 165 wr, err := os.Create(outdir + "/jade.go") 166 defer wr.Close() 167 if err != nil { 168 log.Fatalln("cmd/jade: makeJfile(): ", err) 169 } 170 171 tp := template.Must(template.New("jlayout").Parse(jade_go)) 172 173 if writer { 174 err = tp.Execute(wr, struct { 175 Pkg string 176 Buf string 177 }{pkg_name, "*WriterAsBuffer"}) 178 } else if std { 179 err = tp.Execute(wr, struct { 180 Pkg string 181 Buf string 182 }{pkg_name, "*bytes.Buffer"}) 183 } else { 184 err = tp.Execute(wr, struct { 185 Pkg string 186 Buf string 187 }{pkg_name, "*pool.ByteBuffer"}) 188 } 189 if err != nil { 190 log.Fatalln("cmd/jade: makeJfile(): ", err) 191 } 192 }