package tpp import ( "bytes" "context" ) type Preprocessor struct { tengo *Tengo tags [2][]byte preTag byte } // Get the new preprocessor with default options. func New(tengo *Tengo ) *Preprocessor { pp := &Preprocessor{} pp.tengo = tengo pp.tags = [2][]byte{ []byte("{{"), []byte("}}"), } pp.preTag = '#' return pp } func (pp *Preprocessor) Process( ctx context.Context, recompile bool, filePath string, data []byte, ) ([]byte, error) { //var b bytes.Buffer preCode := []byte(nil) texts := [][]byte{} codes := [][]byte{} pref := append(pp.tags[0], pp.preTag) if bytes.HasPrefix(data, pref) { idxEnd := bytes.Index(data, pp.tags[1]) if idxEnd < 0 { return nil, UnexpectedError{ What: "pre-code start tag", } } preCode = data[len(pref):idxEnd] //texts = append(texts, []byte{}) data = data[idxEnd+len(pp.tags[1]):] } for { idxStart := bytes.Index(data, pp.tags[0]) idxEnd := bytes.Index(data, pp.tags[1]) //fmt.Printf("cock %d %d %d\n", last, idxStart, idxEnd) if idxStart < 0 { if idxEnd >= 0 { return nil, UnexpectedError{ What: "end tag", } } texts = append(texts, data) break } else if idxEnd < 0 { return nil, UnexpectedError{ What: "start tag", } } text := data[:idxStart] texts = append(texts, text) code := data[idxStart+len(pp.tags[0]):idxEnd] codes = append(codes, code) data = data[idxEnd + len(pp.tags[1]):] } ret, err := pp.tengo.Eval( ctx, recompile, filePath, texts, preCode, codes, ) if err != nil { return nil, err } return ret, nil }