github.com/vlifesystems/rulehunter@v0.0.0-20180501090014-673078aa4a83/html/category.go (about) 1 // Copyright (C) 2016-2017 vLife Systems Ltd <http://vlifesystems.com> 2 // Licensed under an MIT licence. Please see LICENSE.md for details. 3 4 package html 5 6 import ( 7 "fmt" 8 "html/template" 9 "io/ioutil" 10 "path/filepath" 11 12 "github.com/vlifesystems/rulehunter/config" 13 "github.com/vlifesystems/rulehunter/progress" 14 "github.com/vlifesystems/rulehunter/report" 15 ) 16 17 func generateCategoryPages( 18 cfg *config.Config, 19 pm *progress.Monitor, 20 ) error { 21 reportFiles, err := ioutil.ReadDir(filepath.Join(cfg.BuildDir, "reports")) 22 if err != nil { 23 return err 24 } 25 26 categorysLen := make(map[string]int) 27 for _, file := range reportFiles { 28 if !file.IsDir() { 29 report, err := report.LoadJSON(cfg, file.Name(), maxReportLoadAttempts) 30 if err != nil { 31 return err 32 } 33 escapedCategory := escapeString(report.Category) 34 if _, ok := categorysLen[escapedCategory]; !ok || 35 len(report.Category) < categorysLen[escapedCategory] { 36 if err := generateCategoryPage(cfg, report.Category); err != nil { 37 return err 38 } 39 // Use the shortest category out of those that resolve to the 40 // same escaped category 41 categorysLen[escapedCategory] = len(report.Category) 42 } 43 } 44 } 45 46 if err := generateCategoryPage(cfg, ""); err != nil { 47 return err 48 } 49 categorysLen[""] = 0 50 return nil 51 } 52 53 func generateCategoryPage(cfg *config.Config, categoryName string) error { 54 type TplData struct { 55 Category string 56 Reports []*TplReport 57 Html map[string]template.HTML 58 } 59 60 reportFiles, err := ioutil.ReadDir(filepath.Join(cfg.BuildDir, "reports")) 61 if err != nil { 62 return err 63 } 64 65 numReportFiles := countFiles(reportFiles) 66 tplReports := make([]*TplReport, numReportFiles) 67 68 i := 0 69 for _, file := range reportFiles { 70 if !file.IsDir() { 71 report, err := report.LoadJSON(cfg, file.Name(), maxReportLoadAttempts) 72 if err != nil { 73 return err 74 } 75 if escapeString(categoryName) == escapeString(report.Category) { 76 tplReports[i] = newTplReport( 77 report.Mode, 78 report.Title, 79 makeTagLinks(report.Tags), 80 report.Category, 81 makeCategoryLink(report.Category), 82 genReportURLDir(report.Mode, report.Category, report.Title), 83 report.Stamp, 84 ) 85 i++ 86 } 87 } 88 } 89 tplReports = tplReports[:i] 90 sortTplReportsByDate(tplReports) 91 tplData := TplData{ 92 Category: categoryName, 93 Reports: tplReports, 94 Html: makeHtml(cfg, "category"), 95 } 96 outputFilename := filepath.Join( 97 "reports", 98 "category", 99 escapeString(categoryName), 100 "index.html", 101 ) 102 if len(escapeString(categoryName)) == 0 { 103 outputFilename = filepath.Join("reports", "nocategory", "index.html") 104 } 105 return writeTemplate(cfg, outputFilename, categoryTpl, tplData) 106 } 107 108 func makeCategoryLink(category string) string { 109 return fmt.Sprintf("reports/category/%s/", escapeString(category)) 110 }