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  }