Common isomorphic functionality in one kit.

templateset.go 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. // The Isomorphic Go Project
  2. // Copyright (c) Wirecog, LLC. All rights reserved.
  3. // Use of this source code is governed by a BSD-style
  4. // license, which can be found in the LICENSE file.
  5. package isokit
  6. import (
  7. "bytes"
  8. "encoding/gob"
  9. "errors"
  10. "html/template"
  11. "io/ioutil"
  12. "log"
  13. "os"
  14. "path/filepath"
  15. "strings"
  16. )
  17. type TemplateSet struct {
  18. members map[string]*Template
  19. Funcs template.FuncMap
  20. bundle *TemplateBundle
  21. TemplateFilesPath string
  22. }
  23. func NewTemplateSet() *TemplateSet {
  24. return &TemplateSet{
  25. members: map[string]*Template{},
  26. Funcs: template.FuncMap{},
  27. }
  28. }
  29. func (t *TemplateSet) Members() map[string]*Template {
  30. return t.members
  31. }
  32. func (t *TemplateSet) Bundle() *TemplateBundle {
  33. return t.bundle
  34. }
  35. func (t *TemplateSet) AddTemplateFile(name, filename string, templateType int8) error {
  36. contents, err := ioutil.ReadFile(filename)
  37. if err != nil {
  38. return err
  39. }
  40. tpl, err := template.New(name).Funcs(t.Funcs).Parse(string(contents))
  41. template := Template{
  42. Template: tpl,
  43. templateType: templateType,
  44. }
  45. t.members[tpl.Name()] = &template
  46. return nil
  47. }
  48. func (t *TemplateSet) MakeAllAssociations() error {
  49. for _, template := range t.members {
  50. for _, member := range t.members {
  51. if member.Lookup(template.NameWithPrefix()) == nil {
  52. if _, err := member.AddParseTree(template.NameWithPrefix(), template.Tree); err != nil {
  53. println(err)
  54. return err
  55. }
  56. }
  57. }
  58. }
  59. return nil
  60. }
  61. func (t *TemplateSet) ImportTemplatesFromMap(templateMap map[string]string) error {
  62. for name, templateContents := range templateMap {
  63. var templateType int8
  64. if strings.Contains(name, PrefixNamePartial) {
  65. templateType = TemplatePartial
  66. } else if strings.Contains(name, PrefixNameLayout) {
  67. templateType = TemplateLayout
  68. } else {
  69. templateType = TemplateRegular
  70. }
  71. tpl, err := template.New(name).Funcs(t.Funcs).Parse(templateContents)
  72. if err != nil {
  73. log.Println("Encountered error when attempting to parse template: ", err)
  74. return err
  75. }
  76. tmpl := Template{
  77. Template: tpl,
  78. templateType: templateType,
  79. }
  80. t.members[name] = &tmpl
  81. }
  82. t.MakeAllAssociations()
  83. return nil
  84. }
  85. func (t *TemplateSet) Render(templateName string, params *RenderParams) {
  86. t.Members()[templateName].Render(params)
  87. }
  88. func (t *TemplateSet) PersistTemplateBundleToDisk() error {
  89. dirPath := filepath.Dir(StaticTemplateBundleFilePath)
  90. if _, err := os.Stat(dirPath); os.IsNotExist(err) {
  91. return errors.New("The specified directory for the StaticTemplateBundleFilePath, " + dirPath + ", does not exist!")
  92. } else {
  93. var templateContentItemsBuffer bytes.Buffer
  94. enc := gob.NewEncoder(&templateContentItemsBuffer)
  95. m := t.bundle.Items()
  96. err := enc.Encode(&m)
  97. if err != nil {
  98. return err
  99. }
  100. err = ioutil.WriteFile(StaticTemplateBundleFilePath, templateContentItemsBuffer.Bytes(), 0644)
  101. if err != nil {
  102. return err
  103. } else {
  104. return nil
  105. }
  106. }
  107. }
  108. func (t *TemplateSet) RestoreTemplateBundleFromDisk() error {
  109. if _, err := os.Stat(StaticTemplateBundleFilePath); os.IsNotExist(err) {
  110. return errors.New("The StaticTemplateBundleFilePath, " + StaticTemplateBundleFilePath + ", does not exist")
  111. } else {
  112. data, err := ioutil.ReadFile(StaticTemplateBundleFilePath)
  113. if err != nil {
  114. return err
  115. }
  116. var templateBundleMap map[string]string
  117. var templateBundleMapBuffer bytes.Buffer
  118. dec := gob.NewDecoder(&templateBundleMapBuffer)
  119. templateBundleMapBuffer = *bytes.NewBuffer(data)
  120. err = dec.Decode(&templateBundleMap)
  121. if err != nil {
  122. return err
  123. }
  124. t.ImportTemplatesFromMap(templateBundleMap)
  125. bundle := &TemplateBundle{items: templateBundleMap}
  126. t.bundle = bundle
  127. return nil
  128. }
  129. }
  130. func (t *TemplateSet) GatherTemplates() {
  131. if UseStaticTemplateBundleFile == true && StaticTemplateBundleFileExists() == true {
  132. return
  133. }
  134. bundle := NewTemplateBundle()
  135. templatesPath := t.TemplateFilesPath
  136. if templatesPath == "" {
  137. templatesPath = TemplateFilesPath
  138. }
  139. bundle.importTemplateFileContents(templatesPath)
  140. t.ImportTemplatesFromMap(bundle.Items())
  141. t.bundle = bundle
  142. if StaticTemplateBundleFilePath != "" {
  143. err := t.PersistTemplateBundleToDisk()
  144. if err != nil {
  145. log.Println("Failed to persist the template bundle to disk, in GatherTemplates, with error: ", err)
  146. }
  147. }
  148. }
  149. func (t *TemplateSet) GatherCogTemplates(cogTemplatePath string, prefixName string, templateFileExtension string) {
  150. if UseStaticTemplateBundleFile == true && StaticTemplateBundleFileExists() == true {
  151. return
  152. }
  153. bundle := NewTemplateBundle()
  154. templatesPath := cogTemplatePath
  155. bundle.importTemplateFileContentsForCog(templatesPath, prefixName, templateFileExtension)
  156. t.ImportTemplatesFromMap(bundle.Items())
  157. for k, v := range bundle.Items() {
  158. t.bundle.items[k] = v
  159. }
  160. if StaticTemplateBundleFilePath != "" {
  161. err := t.PersistTemplateBundleToDisk()
  162. if err != nil {
  163. log.Println("Failed to persist the template bundle to disk, in GatherCogTemplates, with error: ", err)
  164. }
  165. }
  166. }
  167. func StaticTemplateBundleFileExists() bool {
  168. if _, err := os.Stat(StaticTemplateBundleFilePath); os.IsNotExist(err) {
  169. return false
  170. } else {
  171. return true
  172. }
  173. }