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  }