func Compile() error { var payload Mapper var ctx mustache.Context var docCont *DocContent //var tpl *mustache.Template var str string var err error //var mdParser *markdown.Parser //var buf *bytes.Buffer var layouts map[string]Mapper payload, err = BuildPlayload() if err != nil { return err } payload_ctx := mustache.MakeContextDir(payload, "partials/") db_posts_dict, _ := payload_ctx.Get("db.posts.dictionary") //log.Println(">>>>>>>>>>>>", len(db_posts_dict.Val.Interface().(map[string]Mapper))) for id, post := range db_posts_dict.Val.Interface().(map[string]Mapper) { _tmp, err := PrapreMainContent(id, post["_content"].(*DocContent).Source, payload_ctx) if err != nil { return err } post["_content"].(*DocContent).Main = _tmp //log.Fatal(_tmp) } themeName := FromCtx(payload_ctx, "site.config.theme").(string) //mdParser = markdown.NewParser(&markdown.Extensions{Smart: true}) helpers := make(map[string]mustache.SectionRenderFunc) ctxHelpers := make(map[string]func(interface{}) interface{}) dynamicCtx := make(Mapper) topCtx := mustache.MakeContexts(payload_ctx, helpers, ctxHelpers, map[string]Mapper{"dynamic": dynamicCtx}) widgets, err := LoadWidgets(topCtx) if err != nil { return err } //log.Println(">>>", payload_ctx.Dir(), "?>", topCtx.Dir()) BaiscHelpers(payload, helpers, topCtx) CtxHelpers(payload, ctxHelpers, topCtx) layouts = payload["layouts"].(map[string]Mapper) widget_assets := "" if len(widgets) > 0 { widget_assets = PrapareAssets(themeName, "widgets", topCtx) } CopyResources(themeName) // Render Pages pages := payload["db"].(map[string]interface{})["pages"].(map[string]Mapper) for id, page := range pages { docCont = page["_content"].(*DocContent) top := make(map[string]interface{}) top["current_page_id"] = id top["page"] = page top["assets"] = PrapareAssets(themeName, page.Layout(), topCtx) + widget_assets widgetCtx := PrapareWidgets(widgets, page, topCtx) ctx = mustache.MakeContexts(page, top, topCtx, widgetCtx) //log.Println(">>", ctx.Dir(), topCtx.Dir()) _tmp, err := PrapreMainContent(id, docCont.Source, ctx) if err != nil { return err } page["_content"].(*DocContent).Main = _tmp str, err = RenderInLayout(docCont.Main, page.Layout(), layouts, ctx) if err != nil { return errors.New(id + ">" + err.Error()) } WriteTo(page.Url(), str) } // Render Posts for id, post := range db_posts_dict.Val.Interface().(map[string]Mapper) { top := make(map[string]interface{}) top["current_page_id"] = id top["page"] = post top["assets"] = PrapareAssets(themeName, post.Layout(), topCtx) + widget_assets docCont = post["_content"].(*DocContent) widgetCtx := PrapareWidgets(widgets, post, topCtx) ctx = mustache.MakeContexts(post, top, topCtx, widgetCtx) str, err = RenderInLayout(docCont.Main, post.Layout(), layouts, ctx) if err != nil { return errors.New(id + ">" + err.Error()) } WriteTo(post.Url(), str) } if Plugins != nil { for _, plugin := range Plugins { plugin.Exec(topCtx) } } log.Println("Done") return nil }
// 编译整个网站 func Compile() error { var ctx mustache.Context // 渲染上下文 var docCont *DocContent // 文档内容,仅作为变量声明 var str string // 仅声明,以减少不一样的编译错误 var err error // 仅声明 var layouts map[string]Mapper payload, err := BuildPlayload("./") // payload,核心上下文的主要部分,不可变 if err != nil { log.Println("Build PayLoad FAIL!!") return err } payload_ctx := mustache.MakeContextDir(payload, ".tmp_partials/") themeName := FromCtx(payload_ctx, "site.config.theme").(string) if FromCtx(payload_ctx, "site.config.markdown.toc_title") != nil { TOC_TITLE = FromCtx(payload_ctx, "site.config.markdown.toc_title").(string) } os.Remove(".tmp_partials") copyDir("partials", ".tmp_partials") copyDir("themes/"+themeName+"/partials", ".tmp_partials") db_posts_dict, _ := payload_ctx.Get("db.posts.dictionary") //log.Println(">>>>>>>>>>>>", len(db_posts_dict.Val.Interface().(map[string]Mapper))) for id, post := range db_posts_dict.Val.Interface().(map[string]Mapper) { _tmp, err := PrapreMainContent(id, post["_content"].(*DocContent).Source, payload_ctx) if err != nil { return err } post["_content"].(*DocContent).Main = _tmp //log.Fatal(_tmp) } //mdParser = markdown.NewParser(&markdown.Extensions{Smart: true}) helpers := make(map[string]mustache.SectionRenderFunc) ctxHelpers := make(map[string]func(interface{}) interface{}) dynamicMapper := make(Mapper) topCtx := mustache.MakeContexts(payload_ctx, helpers, ctxHelpers, dynamicMapper) widgets, widget_assets, err := LoadWidgets(topCtx) if err != nil { return err } //log.Println(">>>", payload_ctx.Dir(), "?>", topCtx.Dir()) BaiscHelpers(payload, helpers, topCtx) CtxHelpers(payload, ctxHelpers, topCtx) layouts = payload["layouts"].(map[string]Mapper) if len(widgets) > 0 { widget_assets += PrapareAssets(themeName, "widgets", topCtx) } CopyResources(themeName) // Render Pages pages := payload["db"].(map[string]interface{})["pages"].(map[string]Mapper) for id, page := range pages { docCont = page["_content"].(*DocContent) //top := make(map[string]interface{}) dynamicMapper["current_page_id"] = id dynamicMapper["page"] = page dynamicMapper["assets"] = PrapareAssets(themeName, page.Layout(), topCtx) + widget_assets widgetCtx := PrapareWidgets(widgets, page, topCtx) ctx = mustache.MakeContexts(page, dynamicMapper, topCtx, widgetCtx) //log.Println(">>", ctx.Dir(), topCtx.Dir()) _tmp, err := PrapreMainContent(id, docCont.Source, ctx) if err != nil { return err } page["_content"].(*DocContent).Main = _tmp str, err = RenderInLayout(docCont.Main, page.Layout(), layouts, ctx) if err != nil { return errors.New(id + ">" + err.Error()) } WriteTo(page.Url(), str) } // Render Posts for id, post := range db_posts_dict.Val.Interface().(map[string]Mapper) { //top := make(map[string]interface{}) dynamicMapper["current_page_id"] = id dynamicMapper["page"] = post dynamicMapper["assets"] = PrapareAssets(themeName, post.Layout(), topCtx) + widget_assets docCont = post["_content"].(*DocContent) widgetCtx := PrapareWidgets(widgets, post, topCtx) ctx = mustache.MakeContexts(post, dynamicMapper, topCtx, widgetCtx) str, err = RenderInLayout(docCont.Main, post.Layout(), layouts, ctx) if err != nil { return errors.New(id + ">" + err.Error()) } WriteTo(post.Url(), str) } //我们还得把分页给解决了哦 if paginatorCnf := FromCtx(topCtx, "site.config.paginator"); paginatorCnf != nil { var pgCnf Mapper pgCnf = paginatorCnf.(map[string]interface{}) if _, ok := layouts[pgCnf.String("layout")]; ok { log.Println("Enable paginator") renderPaginator(pgCnf, layouts, topCtx, widgets) } else { log.Println("Layout Not Found", pgCnf.String("layout")) } } if Plugins != nil { for _, plugin := range Plugins { plugin.Exec(topCtx) } } log.Println("Done") return nil }
// 编译整个网站 func Compile(public string) error { var ctx mustache.Context // 渲染上下文 var docCont *DocContent // 文档内容,仅作为变量声明 var str string // 仅声明,以减少不一样的编译错误 var err error // 仅声明 var layouts map[string]Mapper payload, err := BuildPayload("./") // payload,核心上下文的主要部分,不可变 if err != nil { Log(INFO, "Build payload fail, %s!!", err) return err } payload_ctx := mustache.MakeContextDir(payload, ".tmp_partials/") themeName := FromCtx(payload_ctx, "site.config.theme").(string) if FromCtx(payload_ctx, "site.config.markdown.toc_title") != nil { TOC_TITLE = FromCtx(payload_ctx, "site.config.markdown.toc_title").(string) } os.Remove(".tmp_partials") copyDir("partials", ".tmp_partials") theme_partials := filepath.Join("themes/", themeName, "/partials") if fi, err := os.Stat(theme_partials); err == nil && fi.IsDir() { copyDir(theme_partials, ".tmp_partials") } defer os.Remove(".tmp_partials") db_posts_dict, _ := payload_ctx.Get("db.posts.dictionary") Log(DEBUG, "Total of db posts dictionary: %d", len(db_posts_dict.Val.Interface().(map[string]Mapper))) for id, post := range db_posts_dict.Val.Interface().(map[string]Mapper) { _tmp, err := PrapreMainContent(id, post["_content"].(*DocContent).Source, payload_ctx) if err != nil { return err } post["_content"].(*DocContent).Main = _tmp Log(DEBUG, "Markdown to HTML: \n%s\n", _tmp) } helpers := make(map[string]mustache.SectionRenderFunc) ctxHelpers := make(map[string]func(interface{}) interface{}) dynamicMapper := make(Mapper) topCtx := mustache.MakeContexts(payload_ctx, helpers, ctxHelpers, dynamicMapper) widgets, widget_assets, err := LoadWidgets(topCtx) if err != nil { return err } Log(DEBUG, payload_ctx.Dir(), "?>", topCtx.Dir()) BaiscHelpers(payload, helpers, topCtx) CtxHelpers(payload, ctxHelpers, topCtx) layouts = payload["layouts"].(map[string]Mapper) if len(widgets) > 0 { widget_assets += PrapareAssets(themeName, "widgets", topCtx) } CopyResources(public, themeName) // Render Pages pages := payload["db"].(map[string]interface{})["pages"].(map[string]Mapper) for id, page := range pages { docCont = page["_content"].(*DocContent) //top := make(map[string]interface{}) dynamicMapper["current_page_id"] = id dynamicMapper["page"] = page dynamicMapper["assets"] = PrapareAssets(themeName, page.Layout(), topCtx) + widget_assets widgetCtx := PrapareWidgets(widgets, page, topCtx) ctx = mustache.MakeContexts(page, dynamicMapper, topCtx, widgetCtx) //Log(DEBUG, "%s %s", ctx.Dir(), topCtx.Dir()) _tmp, err := PrapreMainContent(id, docCont.Source, ctx) if err != nil { return err } page["_content"].(*DocContent).Main = _tmp str, err = RenderInLayout(docCont.Main, page.Layout(), layouts, ctx) if err != nil { return errors.New(fmt.Sprintf("Page %d > %s", id, err.Error())) } WriteTo(public, page.Url(), str) } // Render Posts for id, post := range db_posts_dict.Val.Interface().(map[string]Mapper) { //top := make(map[string]interface{}) dynamicMapper["current_page_id"] = id dynamicMapper["page"] = post dynamicMapper["assets"] = PrapareAssets(themeName, post.Layout(), topCtx) + widget_assets docCont = post["_content"].(*DocContent) widgetCtx := PrapareWidgets(widgets, post, topCtx) ctx = mustache.MakeContexts(post, dynamicMapper, topCtx, widgetCtx) str, err = RenderInLayout(docCont.Main, post.Layout(), layouts, ctx) if err != nil { return errors.New(fmt.Sprintf("Post %d > %s", id, err.Error())) } WriteTo(public, post.Url(), str) } //我们还得把分页给解决了哦 if paginatorCnf := FromCtx(topCtx, "site.config.paginator"); paginatorCnf != nil { var pgCnf Mapper pgCnf = paginatorCnf.(map[string]interface{}) if _, ok := layouts[pgCnf.String("layout")]; ok { Log(INFO, "Enable paginator") renderPaginator(public, pgCnf, layouts, topCtx, widgets) } else { Log(INFO, "Layout Not Found", pgCnf.String("layout")) } } if Plugins != nil { for _, plugin := range Plugins { plugin.Exec(public, topCtx) } } Log(INFO, "Done") return nil }