pagr

A 'static site generator', built using dati.
Log | Files | Refs | Atom

pagr.go (2988B)


      1 package main
      2 
      3 import (
      4 	"flag"
      5 	"log"
      6 	"notabug.org/gearsix/suti"
      7 	"os"
      8 	"os/exec"
      9 	"path/filepath"
     10 	"strings"
     11 )
     12 
     13 const Name = "pagr"
     14 const Version = "0.0.0"
     15 
     16 var gitBin string
     17 var config Config
     18 var flagConfig string
     19 var flagVerbose bool
     20 
     21 var ilog = log.New(os.Stdout, "", 0)
     22 var elog = log.New(os.Stderr, "", 0)
     23 
     24 func vlog(fmt string, args ...interface{}) {
     25 	if flagVerbose {
     26 		ilog.Printf(fmt, args...)
     27 	}
     28 }
     29 
     30 func check(err error) {
     31 	if err != nil {
     32 		if flagVerbose {
     33 			elog.Panic(err.Error())
     34 		} else {
     35 			elog.Fatalf("ERROR! %s\n", err)
     36 		}
     37 	}
     38 }
     39 
     40 func ignoreFile(filepath string) bool {
     41 	return strings.Contains(filepath, ".ignore")
     42 }
     43 
     44 func init() {
     45 	flag.BoolVar(&flagVerbose, "v", false, "print verbose ilog.")
     46 	flag.StringVar(&flagConfig, "cfg", "", "path to pagr project configuration file")
     47 	gitBin, _ = exec.LookPath("git")
     48 }
     49 
     50 func main() {
     51 	flag.Parse()
     52 	vlog("verbose on")
     53 	config = loadConfigFile()
     54 	vlog("loaded config: %s\n", config)
     55 
     56 	var err error
     57 	var content []Page
     58 	content, err = LoadContentDir(config.Contents)
     59 	check(err)
     60 	ilog.Printf("loaded %d content pages", len(content))
     61 
     62 	var templates []suti.Template
     63 	templates, err = LoadTemplateDir(config.Templates)
     64 	check(err)
     65 	ilog.Printf("loaded %d template files", len(templates))
     66 
     67 	ilog.Println("copying assets...")
     68 	assetc := copyAssets()
     69 
     70 	ilog.Println("building project...")
     71 	pagec := 0
     72 	for _, p := range content {
     73 		vlog("+ %s", p.Path)
     74 
     75 		_, err = p.Build(config.Output, findPageTemplate(p, templates))
     76 		if err != nil {
     77 			ilog.Printf("skipping %s: %s\n", p.Path, err)
     78 			continue
     79 		}
     80 
     81 		for _, asset := range p.Assets.All {
     82 			src := filepath.Join(config.Contents, asset)
     83 			dst := filepath.Join(config.Output, asset)
     84 			check(CopyFile(src, dst))
     85 			vlog("\t-> %s\n", asset)
     86 		}
     87 
     88 		pagec++
     89 		assetc += len(p.Assets.All)
     90 	}
     91 
     92 	ilog.Printf("generated %d html files, copied %d asset files\n", pagec, assetc)
     93 	ilog.Println("pagr success")
     94 	return
     95 }
     96 
     97 func loadConfigFile() Config {
     98 	if len(flagConfig) > 0 {
     99 		vlog("loading '%s'", flagConfig)
    100 		c, err := NewConfigFromFile(flagConfig)
    101 		check(err)
    102 		return c
    103 	} else {
    104 		ilog.Println("no cfg passed, using defaults")
    105 		return NewConfig()
    106 	}
    107 }
    108 
    109 func findPageTemplate(p Page, t []suti.Template) (tmpl suti.Template) {
    110 	ptmpl := p.TemplateName(config.DefaultTemplate)
    111 	for i, template := range t {
    112 		if template.Name == ptmpl {
    113 			return t[i]
    114 		}
    115 	}
    116 	return
    117 }
    118 
    119 func copyAssets() (count int) {
    120 	for _, asset := range config.Assets {
    121 		asset = filepath.Clean(asset)
    122 		if _, err := os.Stat(asset); err != nil {
    123 			continue
    124 		}
    125 		filepath.Walk(asset,
    126 			func(path string, info os.FileInfo, err error) error {
    127 				if err == nil && !info.IsDir() && !ignoreFile(path) {
    128 					dst := strings.TrimPrefix(filepath.Clean(path), asset)
    129 					err = CopyFile(path, filepath.Join(config.Output, dst))
    130 					vlog("\t-> %s\n", dst)
    131 					count++
    132 				}
    133 
    134 				if err != nil {
    135 					ilog.Printf("copy failed for %s: %s\n", path, err)
    136 					err = nil
    137 				}
    138 
    139 				return err
    140 			})
    141 	}
    142 	return
    143 }