Journey源码分析三:模板编译
2015-09-07 18:44
477 查看
在
看下
模板编译主要在
看下
上面代码的核心代码是
如果
看下
该函数主要是读取模板文件,然后调用
模板编译方面更细节的东西我就没什么兴趣了,大家有兴趣可以自己研究下,欢迎交流^_^
Journey源码分析二:整体启动流程中提到了模板编译,这里详细说下启动流程
看下
templates.Generate()源码:
func Generate() error { compiledTemplates.Lock() defer compiledTemplates.Unlock() // 首先清除模板(主题可能已经改变了) compiledTemplates.m = make(map[string]*structure.Helper) // 编译所有模板文件。 err := checkThemes() if err != nil { return err } // If the dev flag is set, watch the theme directory and the plugin directoy for changes // TODO: It seems unclean to do the watching of the plugins in the templates package. Move this somewhere else. if flags.IsInDevMode { // Get the currently used theme path activeTheme, err := database.RetrieveActiveTheme() if err != nil { return err } currentThemePath := filepath.Join(filenames.ThemesFilepath, *activeTheme) // Create watcher err = watcher.Watch([]string{currentThemePath, filenames.PluginsFilepath}, map[string]func() error{".hbs": Generate, ".lua": plugins.Load}) if err != nil { return err } } return nil }
模板编译主要在
checkThemes()函数中:
func checkThemes() error { // Get currently set theme from database // 从数据库获取当前数据库 activeTheme, err := database.RetrieveActiveTheme() if err != nil { return err } currentThemePath := filepath.Join(filenames.ThemesFilepath, *activeTheme) err = compileTheme(currentThemePath) if err == nil { return nil } // 如果当前主题编译失败,则尝试默认主题(promenade) err = compileTheme(filepath.Join(filenames.ThemesFilepath, "promenade")) if err == nil { // Update the theme name in the database err = methods.UpdateActiveTheme("promenade", 1) if err != nil { return err } return nil } // 如果默认主题也编译失败,则遍历所有可用的主题,选取第一个可用的。 allThemes := GetAllThemes() for _, theme := range allThemes { err = compileTheme(filepath.Join(filenames.ThemesFilepath, theme)) if err == nil { // Update the theme name in the database err = methods.UpdateActiveTheme(theme, 1) if err != nil { return err } return nil } } return errors.New("Couldn't find a theme to use in " + filenames.ThemesFilepath) }
看下
compileTheme(currentThemePath)源码:
func compileTheme(themePath string) error { // 检查主题目录是否存在 if _, err := os.Stat(themePath); os.IsNotExist(err) { return errors.New("Couldn't find theme files in " + themePath + ": " + err.Error()) } err := filepath.Walk(themePath, inspectTemplateFile) if err != nil { return err } // Check if index and post templates are compiled if _, ok := compiledTemplates.m["index"]; !ok { return errors.New("Couldn't compile template 'index'. Is index.hbs missing?") } if _, ok := compiledTemplates.m["post"]; !ok { return errors.New("Couldn't compile template 'post'. Is post.hbs missing?") } // Check if pagination and navigation templates have been provided by the theme. // If not, use the build in ones. if _, ok := compiledTemplates.m["pagination"]; !ok { err = compileFile(filepath.Join(filenames.HbsFilepath, "pagination.hbs")) if err != nil { log.Println("Warning: Couldn't compile pagination template.") } } if _, ok := compiledTemplates.m["navigation"]; !ok { err = compileFile(filepath.Join(filenames.HbsFilepath, "navigation.hbs")) if err != nil { log.Println("Warning: Couldn't compile navigation template.") } } return nil }
上面代码的核心代码是
err := filepath.Walk(themePath, inspectTemplateFile),该方法遍历主题目录中的文件,并调用
inspectTemplateFile()函数,看下
inspectTemplateFile()的源码:
func inspectTemplateFile(filePath string, info os.FileInfo, err error) error { if !info.IsDir() && filepath.Ext(filePath) == ".hbs" { err := compileFile(filePath) if err != nil { return err } } return nil }
如果
filePath是文件并且以
.hbs结尾则编译它。看下
compileFile(filePath)源码:
func compileFile(fileName string) error { // 编译模板文件 helper, err := createTemplateFromFile(fileName) if err != nil { return err } // 将模板放入到全局变量compiledTemplates.m中去。 compiledTemplates.m[helper.Name] = helper return nil }
看下
createTemplateFromFile(fileName)源码:
func createTemplateFromFile(filename string) (*structure.Helper, error) { data, err := ioutil.ReadFile(filename) if err != nil { return nil, err } fileNameWithoutExtension := helpers.GetFilenameWithoutExtension(filename) // 如果同名的模板已经存在compiledTemplates.m字典中则报错。 if compiledTemplates.m[fileNameWithoutExtension] != nil { return nil, errors.New("Error: Conflicting .hbs name '" + fileNameWithoutExtension + "'. A theme file of the same name already exists.") } helper := compileTemplate(data, fileNameWithoutExtension) return helper, nil }
该函数主要是读取模板文件,然后调用
compileTemplate(data, fileNameWithoutExtension)做最终编译。
模板编译方面更细节的东西我就没什么兴趣了,大家有兴趣可以自己研究下,欢迎交流^_^
相关文章推荐
- GO语言类型转换和类型断言实例分析
- Go语言实现的最简单数独解法
- Go实现比较时间大小
- 在Go程序中实现服务器重启的方法
- 编写Go程序对Nginx服务器进行性能测试的方法
- 使用go和python递归删除.ds store文件的方法
- go和python调用其它程序并得到程序输出
- 从Node.js 转到 Go平台
- go语言中的interface使用实例
- Go项目的目录结构详解
- GO 语言学习指南
- GO语言实现文件上传代码分享
- sublime安装支持go和html的插件
- Go语言实现汉诺塔算法
- 利用Go语言初步搭建一个web应用的教程
- 创建第一个Go语言程序Hello,Go!
- 在Linux系统中安装Go语言的详细教程
- 五步让你成为GO 语言高手
- Go中map数据类型3点小知识
- Go语言常见哈希函数的使用