github.com/sdqri/sequined@v0.0.0-20240421190656-fc6bf956f4d8/internal/dashboard/snippetrenderer/snippet_renderer.go (about)

     1  package snippetrenderer
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"regexp"
     7  
     8  	_ "embed"
     9  
    10  	render "github.com/go-echarts/go-echarts/v2/render"
    11  )
    12  
    13  var pat = regexp.MustCompile(`(__f__")|("__f__)|(__f__)`)
    14  
    15  //go:embed base.html.tmpl
    16  var BaseTmpl string
    17  
    18  type SnippetRenderer struct {
    19  	c      interface{}
    20  	before []func()
    21  }
    22  
    23  func NewSnippetRenderer(c interface{}, before ...func()) render.Renderer {
    24  	return &SnippetRenderer{c: c, before: before}
    25  }
    26  
    27  func (r *SnippetRenderer) Render(w io.Writer) error {
    28  
    29  	content := r.RenderContent()
    30  	_, err := w.Write(content)
    31  	return err
    32  }
    33  
    34  func (r *SnippetRenderer) RenderContent() []byte {
    35  	for _, fn := range r.before {
    36  		fn()
    37  	}
    38  
    39  	contents := []string{BaseTmpl}
    40  	tpl := render.MustTemplate(render.ModChart, contents)
    41  
    42  	var buf bytes.Buffer
    43  	if err := tpl.ExecuteTemplate(&buf, render.ModChart, r.c); err != nil {
    44  		panic(err)
    45  	}
    46  
    47  	return pat.ReplaceAll(buf.Bytes(), []byte(""))
    48  }