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  }