Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 51 additions & 5 deletions render/render.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
package render

import (
_ "embed"
"embed"
"encoding/json"
"io/fs"
"os"
"path/filepath"
"slices"
"text/template"

k8s "github.com/aquasecurity/trivy/pkg/k8s/report"
"github.com/aquasecurity/trivy/pkg/types"
"golang.org/x/xerrors"
)

//go:embed template/html.tpl
var htmlTmpl []byte
//go:embed templates/*
var templates embed.FS

var extensions = []string{".tpl", ".js", ".css"}

func Render(fileName string, inputData []byte) error {
var kubernetes k8s.Report
Expand All @@ -31,7 +36,23 @@ func Render(fileName string, inputData []byte) error {
results = append(results, resource.Results...)
}

tmpl, err := template.New("temp").Parse(string(htmlTmpl))
templateFS, err := fs.Sub(templates, "templates")
if err != nil {
return xerrors.Errorf("error loading templates: %w", err)
}

files, err := collectFiles(templateFS)
if err != nil {
return xerrors.Errorf("error collecting files: %w", err)
}

tmpl, err := template.New("temp").Funcs(template.FuncMap{
"toJSON": func(v interface{}) (string, error) {
bytes, err := json.Marshal(v)
return string(bytes), err
},
}).ParseFS(templateFS, files...)

if err != nil {
return xerrors.Errorf("error parsing template: %v\n", err)
}
Expand All @@ -42,9 +63,34 @@ func Render(fileName string, inputData []byte) error {
}
defer output.Close()

if err = tmpl.Execute(output, results); err != nil {
if err = tmpl.ExecuteTemplate(output, "html.tpl", results); err != nil {
return xerrors.Errorf("error executing template: %v\n", err)
}

return nil
}

func collectFiles(templateFS fs.FS) ([]string, error) {
var files []string
err := fs.WalkDir(templateFS, ".", func(path string, d fs.DirEntry, err error) error {
if err != nil {
return xerrors.Errorf("error listing files in %s: %w", path, err)
}

if d.IsDir() {
return nil
}

if slices.Contains(extensions, filepath.Ext(path)) {
files = append(files, path)
}

return nil
})

if err != nil {
return nil, xerrors.Errorf("error listing files: %w", err)
}

return files, nil
}
5 changes: 5 additions & 0 deletions render/render_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ func TestRender(t *testing.T) {
jsonPath: "testdata/input/happy.json",
goldenPath: "testdata/golden/happy.html",
},
{
name: "graph",
jsonPath: "testdata/input/graph.json",
goldenPath: "testdata/golden/graph.html",
},
{
name: "happy k8s",
jsonPath: "testdata/input/happy-k8s.json",
Expand Down
Loading
Loading