github.com/servernoj/jade@v0.0.0-20231225191405-efec98d19db1/example/jade.go (about) 1 // Code generated by "jade.go"; DO NOT EDIT. 2 package main 3 4 import ( 5 "bytes" 6 "io" 7 "strconv" 8 ) 9 10 var ( 11 escaped = []byte{'<', '>', '"', '\'', '&'} 12 replacing = []string{"<", ">", """, "'", "&"} 13 ) 14 15 func WriteEscString(st string, buffer *WriterAsBuffer) { 16 for i := 0; i < len(st); i++ { 17 if n := bytes.IndexByte(escaped, st[i]); n >= 0 { 18 buffer.WriteString(replacing[n]) 19 } else { 20 buffer.WriteByte(st[i]) 21 } 22 } 23 } 24 25 type WriterAsBuffer struct { 26 io.Writer 27 } 28 29 func (w *WriterAsBuffer) WriteString(s string) (n int, err error) { 30 n, err = w.Write([]byte(s)) 31 return 32 } 33 34 func (w *WriterAsBuffer) WriteByte(b byte) (err error) { 35 _, err = w.Write([]byte{b}) 36 return 37 } 38 39 type stringer interface { 40 String() string 41 } 42 43 func WriteAll(a interface{}, escape bool, buffer *WriterAsBuffer) { 44 switch v := a.(type) { 45 case string: 46 if escape { 47 WriteEscString(v, buffer) 48 } else { 49 buffer.WriteString(v) 50 } 51 case int: 52 WriteInt(int64(v), buffer) 53 case int8: 54 WriteInt(int64(v), buffer) 55 case int16: 56 WriteInt(int64(v), buffer) 57 case int32: 58 WriteInt(int64(v), buffer) 59 case int64: 60 WriteInt(v, buffer) 61 case uint: 62 WriteUint(uint64(v), buffer) 63 case uint8: 64 WriteUint(uint64(v), buffer) 65 case uint16: 66 WriteUint(uint64(v), buffer) 67 case uint32: 68 WriteUint(uint64(v), buffer) 69 case uint64: 70 WriteUint(v, buffer) 71 case float32: 72 buffer.WriteString(strconv.FormatFloat(float64(v), 'f', -1, 64)) 73 case float64: 74 buffer.WriteString(strconv.FormatFloat(v, 'f', -1, 64)) 75 case bool: 76 WriteBool(v, buffer) 77 case stringer: 78 if escape { 79 WriteEscString(v.String(), buffer) 80 } else { 81 buffer.WriteString(v.String()) 82 } 83 default: 84 buffer.WriteString("\n<<< unprinted type, fmt.Stringer implementation needed >>>\n") 85 } 86 } 87 88 func ternary(condition bool, iftrue, iffalse interface{}) interface{} { 89 if condition { 90 return iftrue 91 } else { 92 return iffalse 93 } 94 } 95 96 // Used part of go source: 97 // https://github.com/golang/go/blob/master/src/strconv/itoa.go 98 func WriteUint(u uint64, buffer *WriterAsBuffer) { 99 var a [64 + 1]byte 100 i := len(a) 101 102 if ^uintptr(0)>>32 == 0 { 103 for u > uint64(^uintptr(0)) { 104 q := u / 1e9 105 us := uintptr(u - q*1e9) 106 for j := 9; j > 0; j-- { 107 i-- 108 qs := us / 10 109 a[i] = byte(us - qs*10 + '0') 110 us = qs 111 } 112 u = q 113 } 114 } 115 116 us := uintptr(u) 117 for us >= 10 { 118 i-- 119 q := us / 10 120 a[i] = byte(us - q*10 + '0') 121 us = q 122 } 123 124 i-- 125 a[i] = byte(us + '0') 126 buffer.Write(a[i:]) 127 } 128 func WriteInt(i int64, buffer *WriterAsBuffer) { 129 if i < 0 { 130 buffer.WriteByte('-') 131 i = -i 132 } 133 WriteUint(uint64(i), buffer) 134 } 135 func WriteBool(b bool, buffer *WriterAsBuffer) { 136 if b { 137 buffer.WriteString("true") 138 return 139 } 140 buffer.WriteString("false") 141 }