Common isomorphic functionality in one kit.

templateset.go 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  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 {
  132. err := t.RestoreTemplateBundleFromDisk()
  133. if err != nil {
  134. log.Println("Detected initial run. Will generate a template bundle file.")
  135. } else {
  136. return
  137. }
  138. }
  139. bundle := NewTemplateBundle()
  140. templatesPath := t.TemplateFilesPath
  141. if templatesPath == "" {
  142. templatesPath = TemplateFilesPath
  143. }
  144. bundle.importTemplateFileContents(templatesPath)
  145. t.ImportTemplatesFromMap(bundle.Items())
  146. t.bundle = bundle
  147. if StaticTemplateBundleFilePath != "" {
  148. err := t.PersistTemplateBundleToDisk()
  149. if err != nil {
  150. log.Println("Failed to persist the template bundle to disk, in GatherTemplates, with error: ", err)
  151. }
  152. }
  153. }
  154. func (t *TemplateSet) GatherCogTemplates(cogTemplatePath string, prefixName string, templateFileExtension string) {
  155. if UseStaticTemplateBundleFile == true {
  156. if _, err := os.Stat(StaticTemplateBundleFilePath); os.IsNotExist(err) {
  157. log.Println("Detected initial run. Will generate a template bundle file.")
  158. } else {
  159. return
  160. }
  161. }
  162. bundle := NewTemplateBundle()
  163. templatesPath := cogTemplatePath
  164. bundle.importTemplateFileContentsForCog(templatesPath, prefixName, templateFileExtension)
  165. t.ImportTemplatesFromMap(bundle.Items())
  166. for k, v := range bundle.Items() {
  167. t.bundle.items[k] = v
  168. }
  169. if StaticTemplateBundleFilePath != "" {
  170. err := t.PersistTemplateBundleToDisk()
  171. if err != nil {
  172. log.Println("Failed to persist the template bundle to disk, in GatherCogTemplates, with error: ", err)
  173. }
  174. }
  175. }