github.com/louisevanderlith/droxolite@v1.20.2/mix/pagefactory.go (about) 1 package mix 2 3 import ( 4 "fmt" 5 "github.com/louisevanderlith/droxolite/menu" 6 "html/template" 7 "net/http" 8 "os" 9 "path" 10 "strings" 11 ) 12 13 type MixerFactory interface { 14 AddMenu(menu *menu.Menu) 15 Create(r *http.Request, title, path string, data Bag) Mixer 16 AddModifier(mod ModFunc) 17 } 18 19 func NewPageFactory(files *template.Template, mods ...ModFunc) MixerFactory { 20 return &pgeFactory{ 21 files: files, 22 modifiers: mods, 23 } 24 } 25 26 func fetchName(tmplPath string) string { 27 lastSlash := strings.LastIndex(tmplPath, "/") 28 return strings.ToLower(tmplPath[(lastSlash + 1):]) 29 } 30 31 type pgeFactory struct { 32 files *template.Template 33 modifiers []ModFunc 34 menu *menu.Menu 35 } 36 37 func (f *pgeFactory) AddModifier(mod ModFunc) { 38 f.modifiers = append(f.modifiers, mod) 39 } 40 41 func (f *pgeFactory) Create(r *http.Request, title, templatePath string, bag Bag) Mixer { 42 if bag == nil { 43 bag = NewBag() 44 } 45 46 baseName := strings.ToLower(strings.Replace(title, " ", "", -1)) 47 scriptName := fmt.Sprintf("%s.entry.dart.js", baseName) 48 _, err := os.Stat(path.Join("dist/js", scriptName)) 49 50 bag.SetValue("HasScript", err == nil) 51 bag.SetValue("ScriptName", scriptName) 52 53 if f.menu != nil { 54 bag.SetValue("Menu", f.menu) 55 } 56 57 for _, mod := range f.modifiers { 58 mod(bag, r) 59 } 60 61 cpy, err := f.files.Clone() 62 63 if err != nil { 64 panic(err) 65 } 66 67 tmpl, err := cpy.ParseFiles(templatePath) 68 69 if err != nil { 70 panic(err) 71 } 72 73 return &pge{ 74 template: tmpl, 75 title: title, 76 name: fetchName(templatePath), 77 model: bag.Values(), 78 } 79 } 80 81 func (f *pgeFactory) AddMenu(m *menu.Menu) { 82 f.menu = m 83 }