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{"&lt;", "&gt;", "&#34;", "&#39;", "&amp;"}
    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  }