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