package mApp import ( "html/template" "io" "net/http" "os" "strconv" "strings" "MollyBlog/internal/model" "MollyBlog/utils" "github.com/gin-gonic/gin" ) func (ma *MApp) IndexHandler(ctx *gin.Context) { // generate recent posts var recentPosts []model.MPost for i := 0; i < utils.Min(len(ma.Posts), ma.Config.MSite.Post.RecentPost.Number); i++ { tmpPost := *ma.Posts[i] tmpPost.Date = strings.Split(tmpPost.Date, " ")[0] recentPosts = append(recentPosts, tmpPost) } resData := gin.H{ "site_info": gin.H{ "logo": ma.Config.MSite.Info.Logo, "title": ma.Config.MSite.Info.Title, "author": ma.Config.MSite.Info.Author, "language": ma.Config.MSite.Info.Language, "copyright": template.HTML(ma.Config.MSite.Info.Copyright), }, "menu": ma.Config.MSite.Menu, "recent_post": gin.H{ "title": ma.Config.MSite.Post.RecentPost.Title, "posts": recentPosts, }, } ctx.HTML(http.StatusOK, "index.html", resData) } func (ma *MApp) PostHandler(ctx *gin.Context) { postHash := ctx.Param("hash") var success bool var html string var realPost model.MPost for _, post := range ma.Posts { if post.HtmlHash == postHash { file, err := os.OpenFile(post.HtmlPath, os.O_RDONLY, 0644) if err != nil { success = false break } defer file.Close() data, err := io.ReadAll(file) if err != nil { success = false break } html = string(data) realPost = *post success = true break } } var resPost gin.H if success { resPost = gin.H{ "title": realPost.Title, "cover": realPost.Cover, "date": realPost.Date, "tags": realPost.TagHashes, "categories": realPost.CategoryHashes, "content": template.HTML(html), } } resData := gin.H{ "site_info": gin.H{ "logo": ma.Config.MSite.Info.Logo, "title": ma.Config.MSite.Info.Title, "author": ma.Config.MSite.Info.Author, "language": ma.Config.MSite.Info.Language, "copyright": template.HTML(ma.Config.MSite.Info.Copyright), }, "menu": ma.Config.MSite.Menu, "post": resPost, "status": gin.H{ "toc_title": ma.Config.MSite.Post.TocTitle, "success": success, }, } ctx.HTML(http.StatusOK, "post.html", resData) } func (ma *MApp) ArchiveHandler(ctx *gin.Context) { page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1")) size := ma.Config.MSite.Post.Archive.Number var prePage, curPage, nxtPage, allPage int allPage = (len(ma.Posts) + size - 1) / size if allPage > 0 { if page <= 0 { curPage = 1 } else if page > allPage { curPage = allPage } else { curPage = page } } else { curPage = 0 } prePage = curPage - 1 nxtPage = curPage + 1 if prePage <= 0 { prePage = curPage } if nxtPage > allPage { nxtPage = allPage } // generate recent posts start := (curPage - 1) * size offset := curPage * size var historyPosts []model.MPost if start >= 0 { for i := start; i < utils.Min(len(ma.Posts), offset); i++ { tmpPost := *ma.Posts[i] tmpPost.Date = strings.Split(tmpPost.Date, " ")[0] historyPosts = append(historyPosts, tmpPost) } } resData := gin.H{ "site_info": gin.H{ "logo": ma.Config.MSite.Info.Logo, "title": ma.Config.MSite.Info.Title, "author": ma.Config.MSite.Info.Author, "language": ma.Config.MSite.Info.Language, "copyright": template.HTML(ma.Config.MSite.Info.Copyright), }, "menu": ma.Config.MSite.Menu, "page_info": gin.H{ "pre_page": prePage, "cur_page": curPage, "nxt_page": nxtPage, "all_page": allPage, }, "history_post": gin.H{ "title": ma.Config.MSite.Post.Archive.Title, "posts": historyPosts, }, } ctx.HTML(http.StatusOK, "archive.html", resData) } func (ma *MApp) UpdateBlogHandler(ctx *gin.Context) { var err error err = ma.loadMarkdownFiles() if err != nil { _ = ctx.Error(err) return } err = ma.parseMarkdowns() if err != nil { _ = ctx.Error(err) return } ctx.JSON(http.StatusOK, gin.H{"msg": "ok"}) }