From 1a897cd1bd090be6df8198989dc7192f32030d2e Mon Sep 17 00:00:00 2001 From: Las Zenow Date: Sat, 30 Aug 2014 03:56:36 -0500 Subject: [PATCH] Add json fmt support --- template.go | 136 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 129 insertions(+), 7 deletions(-) diff --git a/template.go b/template.go index b9ec819..bf572d3 100644 --- a/template.go +++ b/template.go @@ -1,9 +1,16 @@ package main -import log "github.com/cihub/seelog" -import txt_tmpl "text/template" +import ( + txt_tmpl "text/template" -import "html/template" + "git.gitorious.org/trantor/trantor.git/database" + log "github.com/cihub/seelog" + + "encoding/json" + "errors" + "html/template" + "net/http" +) type Status struct { BaseURL string @@ -32,7 +39,8 @@ func GetStatus(h handler) Status { return s } -var tmpl_html = template.Must(template.ParseFiles(TEMPLATE_PATH+"header.html", +var tmpl_html = template.Must(template.ParseFiles( + TEMPLATE_PATH+"header.html", TEMPLATE_PATH+"footer.html", TEMPLATE_PATH+"404.html", TEMPLATE_PATH+"index.html", @@ -52,16 +60,20 @@ var tmpl_html = template.Must(template.ParseFiles(TEMPLATE_PATH+"header.html", TEMPLATE_PATH+"help.html", )) -var tmpl_rss = txt_tmpl.Must(txt_tmpl.ParseFiles(TEMPLATE_PATH+"search.rss", +var tmpl_rss = txt_tmpl.Must(txt_tmpl.ParseFiles( + TEMPLATE_PATH+"search.rss", TEMPLATE_PATH+"news.rss", )) func loadTemplate(h handler, tmpl string, data interface{}) { var err error fmt := h.r.FormValue("fmt") - if fmt == "rss" { + switch fmt { + case "rss": err = tmpl_rss.ExecuteTemplate(h.w, tmpl+".rss", data) - } else { + case "json": + err = loadJson(h.w, tmpl, data) + default: err = tmpl_html.ExecuteTemplate(h.w, tmpl+".html", data) } if err != nil { @@ -69,3 +81,113 @@ func loadTemplate(h handler, tmpl string, data interface{}) { log.Warn("An error ocurred loading the template ", tmpl, ".", fmt, ": ", err) } } + +func loadJson(w http.ResponseWriter, tmpl string, data interface{}) error { + var res []byte + var err error + switch tmpl { + case "index": + res, err = indexJson(data) + case "book": + res, err = bookJson(data) + case "news": + res, err = newsJson(data) + case "search": + res, err = searchJson(data) + } + if err != nil { + return err + } + _, err = w.Write(res) + return err +} + +func indexJson(data interface{}) ([]byte, error) { + index, ok := data.(indexData) + if !ok { + return nil, errors.New("Data is not valid") + } + + books := make([]map[string]interface{}, len(index.Books)) + for i, book := range index.Books { + books[i] = bookJsonRaw(book) + } + news := newsJsonRaw(index.News) + + return json.Marshal(map[string]interface{}{ + "title": "Imperial Library of Trantor", + "url": index.S.BaseURL, + "count": index.Count, + "news": news, + "tags": index.Tags, + "last added": books, + }) +} + +func bookJson(data interface{}) ([]byte, error) { + book, ok := data.(bookData) + if !ok { + return nil, errors.New("Data is not valid") + } + + return json.Marshal(bookJsonRaw(book.Book)) +} + +func newsJson(data interface{}) ([]byte, error) { + news, ok := data.(newsData) + if !ok { + return nil, errors.New("Data is not valid") + } + + return json.Marshal(newsJsonRaw(news.News)) +} + +func newsJsonRaw(news []newsEntry) []map[string]string { + list := make([]map[string]string, len(news)) + for i, n := range news { + list[i] = map[string]string{ + "date": n.Date, + "text": n.Text, + } + } + return list +} + +func searchJson(data interface{}) ([]byte, error) { + search, ok := data.(searchData) + if !ok { + return nil, errors.New("Data is not valid") + } + + books := make([]map[string]interface{}, len(search.Books)) + for i, book := range search.Books { + books[i] = bookJsonRaw(book) + } + return json.Marshal(books) +} + +func bookJsonRaw(book database.Book) map[string]interface{} { + cover := "" + coverSmall := "" + if book.Cover { + cover = "/cover/" + book.Id + "/big/" + book.Title + ".jpg" + coverSmall = "/cover/" + book.Id + "/small/" + book.Title + ".jpg" + } + return map[string]interface{}{ + "id": book.Id, + "title": book.Title, + "author": book.Author, + "contributor": book.Contributor, + "publisher": book.Publisher, + "description": book.Description, + "subject": book.Subject, + "date": book.Date, + "lang": book.Lang, + "isbn": book.Isbn, + "size": book.FileSize, + "cover": cover, + "cover_small": coverSmall, + "download": "/download/" + book.Id + "/" + book.Title + ".epub", + "read": "/read/" + book.Id, + } +}