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 }