fixed templating
This commit is contained in:
parent
e077d0484b
commit
c5e839e13e
16
Makefile
Normal file
16
Makefile
Normal file
@ -0,0 +1,16 @@
|
||||
compile: generate clean build
|
||||
|
||||
generate:
|
||||
@printf "Generating code\n"
|
||||
@go generate ./...
|
||||
|
||||
VERSION = $(shell git describe --always --abbrev=40 --dirty)
|
||||
|
||||
build:
|
||||
@printf "Compiling\n"
|
||||
@mkdir bin/ &> /dev/null || exit 0
|
||||
@go build
|
||||
@printf "\n"
|
||||
|
||||
clean:
|
||||
@rm -fr ./bin
|
3
internal/static/static.go
Normal file
3
internal/static/static.go
Normal file
@ -0,0 +1,3 @@
|
||||
package static
|
||||
|
||||
//go:generate go-bindata -pkg $GOPACKAGE --prefix "../../static/" ../../static/...
|
3
internal/templates/templates.go
Normal file
3
internal/templates/templates.go
Normal file
@ -0,0 +1,3 @@
|
||||
package templates
|
||||
|
||||
//go:generate go-bindata -pkg $GOPACKAGE --prefix "../../templates/" ../../templates/...
|
114
main.go
114
main.go
@ -1,39 +1,16 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"git.fuyu.moe/Fuyu/router"
|
||||
"io/ioutil"
|
||||
"mime"
|
||||
"net/http"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
//fmt.Println("Hello world")
|
||||
r := router.New()
|
||||
r.GET(`/static/*asset`, getStatic)
|
||||
r.GET(`/`, home)
|
||||
r.GET(`/compare/:user`, compare)
|
||||
err := r.Start(`:8070`)
|
||||
check(err)
|
||||
}
|
||||
// nolint: errcheck
|
||||
|
||||
type jikanAPIUserList struct {
|
||||
RequestHash string `json:"request_hash"`
|
||||
RequestCached bool `json:"request_cached"`
|
||||
RequestCacheExpiry int `json:"request_cache_expiry"`
|
||||
Completed int `json:"completed"`
|
||||
Watching int `json:"watching"`
|
||||
Dropped int `json:"dropped"`
|
||||
PlanToWatch int `json:"plan_to_watch"`
|
||||
OnHold int `json:"on_hold"`
|
||||
Anime []jikanAPIAnime `json:"anime"`
|
||||
}
|
||||
|
||||
@ -74,6 +51,16 @@ type meikanAPIIDs struct {
|
||||
AnidbID int `json:"anidb"`
|
||||
}
|
||||
|
||||
func main() {
|
||||
r := router.New()
|
||||
r.Renderer = NewRenderer()
|
||||
r.GET(`/static/*asset`, getStatic)
|
||||
r.GET(`/`, home)
|
||||
r.GET(`/compare/:user`, compare)
|
||||
err := r.Start(`:8070`)
|
||||
check(err)
|
||||
}
|
||||
|
||||
func check(e error) {
|
||||
if e != nil {
|
||||
panic(e)
|
||||
@ -81,31 +68,19 @@ func check(e error) {
|
||||
}
|
||||
|
||||
func home(c *router.Context) error {
|
||||
return c.String(200, "Test")
|
||||
return c.Render(200, `index`, ``)
|
||||
}
|
||||
|
||||
func compare(c *router.Context) error {
|
||||
start := time.Now()
|
||||
user := c.Param(`user`)
|
||||
//https://api.jikan.moe/v3/user/nekomata1037/animelist/all
|
||||
//https://api.meikan.moe/v1/ids/anime
|
||||
jikanList := jikanAPIGetUserAnimelist(user)
|
||||
var anime []meikanListItem
|
||||
//fmt.Println(result)
|
||||
fmt.Println("Getting IDs")
|
||||
IDs := meikanAPIGetIDs()
|
||||
confMap := map[int]int{}
|
||||
for _, v := range IDs {
|
||||
confMap[v.MyanimelistID] = v.MeikanID
|
||||
}
|
||||
fmt.Printf("35248 is %d \n", confMap[35248])
|
||||
for i := 0; i < len(jikanList.Anime); i++ {
|
||||
//fmt.Println(result.Anime[i].Title)
|
||||
for d := 0; d < len(IDs); d++ {
|
||||
if jikanList.Anime[i].MyanimelistID == IDs[d].MyanimelistID {
|
||||
jikanList.Anime[i].MeikanID = IDs[d].MeikanID
|
||||
}
|
||||
}
|
||||
jikanList.Anime[i].MeikanID = IDs[jikanList.Anime[i].MyanimelistID]
|
||||
temp := meikanListItem{Anime: meikanAnime{ID: jikanList.Anime[i].MeikanID,
|
||||
Title: jikanList.Anime[i].Title,
|
||||
Type: jikanList.Anime[i].Type,
|
||||
@ -114,19 +89,14 @@ func compare(c *router.Context) error {
|
||||
Rating: jikanList.Anime[i].Score}
|
||||
switch jikanList.Anime[i].WatchingStatus {
|
||||
case 1:
|
||||
jikanList.Completed++
|
||||
temp.State = "Watching"
|
||||
case 2:
|
||||
jikanList.Completed++
|
||||
temp.State = "Finished"
|
||||
case 3:
|
||||
jikanList.OnHold++
|
||||
temp.State = "On Hold"
|
||||
case 4:
|
||||
jikanList.Dropped++
|
||||
temp.State = "Dropped"
|
||||
case 6:
|
||||
jikanList.PlanToWatch++
|
||||
temp.State = "Plan to watch"
|
||||
}
|
||||
switch jikanList.Anime[i].AiringStatus {
|
||||
@ -135,69 +105,33 @@ func compare(c *router.Context) error {
|
||||
}
|
||||
anime = append(anime, temp)
|
||||
}
|
||||
//fmt.Println(anime)
|
||||
//resJSON, err := json.MarshalIndent(result, "", "\t")
|
||||
//check(err)
|
||||
//jsonfile := []byte(resJSON)
|
||||
elapsed := time.Since(start)
|
||||
fmt.Printf("Generating json took %s\n", elapsed)
|
||||
|
||||
return c.JSON(200, anime)
|
||||
}
|
||||
|
||||
func jikanAPIGetUserAnimelist(user string) jikanAPIUserList {
|
||||
var result jikanAPIUserList
|
||||
start := time.Now()
|
||||
var userList jikanAPIUserList
|
||||
for i := 1; ; i++ {
|
||||
resp, err := http.Get("https://api.jikan.moe/v3/user/" + user + "/animelist/all/" + strconv.Itoa(i))
|
||||
check(err)
|
||||
defer resp.Body.Close()
|
||||
var tempResult jikanAPIUserList
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
check(err)
|
||||
if i == 1 {
|
||||
_ = json.NewDecoder(bytes.NewReader(body)).Decode(&result)
|
||||
elapsed := time.Since(start)
|
||||
fmt.Printf("Searching page 1 took %s\n", elapsed)
|
||||
continue
|
||||
} else {
|
||||
_ = json.NewDecoder(bytes.NewReader(body)).Decode(&tempResult)
|
||||
result.Anime = append(result.Anime, tempResult.Anime...)
|
||||
elapsed := time.Since(start)
|
||||
fmt.Printf("Searching page %d took %s\n", i, elapsed)
|
||||
}
|
||||
_ = json.NewDecoder(resp.Body).Decode(&tempResult)
|
||||
userList.Anime = append(userList.Anime, tempResult.Anime...)
|
||||
if len(tempResult.Anime) == 0 {
|
||||
break
|
||||
}
|
||||
elapsed := time.Since(start)
|
||||
fmt.Printf("Searching the userlist took %s\n", elapsed)
|
||||
}
|
||||
return result
|
||||
return userList
|
||||
}
|
||||
|
||||
func meikanAPIGetIDs() []meikanAPIIDs {
|
||||
start := time.Now()
|
||||
func meikanAPIGetIDs() map[int]int {
|
||||
resp, err := http.Get("https://api.meikan.moe/v1/ids/anime")
|
||||
check(err)
|
||||
defer resp.Body.Close()
|
||||
var result []meikanAPIIDs
|
||||
body, err := ioutil.ReadAll(resp.Body)
|
||||
check(err)
|
||||
_ = json.NewDecoder(bytes.NewReader(body)).Decode(&result)
|
||||
elapsed := time.Since(start)
|
||||
fmt.Printf("Getting all the IDs took %s\n", elapsed)
|
||||
return result
|
||||
}
|
||||
|
||||
func getStatic(c *router.Context) error {
|
||||
path := path.Clean(strings.TrimPrefix(c.Request.URL.Path, `/static/`))
|
||||
|
||||
data, err := ioutil.ReadFile(`./static/` + path)
|
||||
if err != nil {
|
||||
return c.String(404, `Resource not found`)
|
||||
_ = json.NewDecoder(resp.Body).Decode(&result)
|
||||
IDsMap := map[int]int{}
|
||||
for _, id := range result {
|
||||
IDsMap[id.MyanimelistID] = id.MeikanID
|
||||
}
|
||||
|
||||
c.Response.Header().Set(`Content-Type`, mime.TypeByExtension(filepath.Ext(path)))
|
||||
c.Response.Write(data)
|
||||
|
||||
return nil
|
||||
return IDsMap
|
||||
}
|
||||
|
9
pages/index.html
Normal file
9
pages/index.html
Normal file
@ -0,0 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>This is a page</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
</body>
|
||||
</html>
|
88
render.go
Normal file
88
render.go
Normal file
@ -0,0 +1,88 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"html/template"
|
||||
"io"
|
||||
"mime"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"git.fuyu.moe/Fuyu/router"
|
||||
"git.fuyu.moe/Tracreed/mal-importer/internal/static"
|
||||
"git.fuyu.moe/Tracreed/mal-importer/internal/templates"
|
||||
)
|
||||
|
||||
// Renderer rendders templates
|
||||
type Renderer struct {
|
||||
templates map[string]*template.Template
|
||||
}
|
||||
|
||||
// NewRenderer loads all templates
|
||||
func NewRenderer() *Renderer {
|
||||
t := &Renderer{}
|
||||
if t.templates == nil {
|
||||
t.templates = make(map[string]*template.Template)
|
||||
}
|
||||
|
||||
components := template.New(``)
|
||||
pages := []string{}
|
||||
for _, v := range templates.AssetNames() {
|
||||
if strings.HasPrefix(v, `pages/`) {
|
||||
pages = append(pages, v)
|
||||
continue
|
||||
}
|
||||
|
||||
data, err := templates.Asset(v)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
template.Must(components.New(v).Parse(string(data)))
|
||||
}
|
||||
|
||||
for _, page := range pages {
|
||||
data, err := templates.Asset(page)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
tmpl, _ := components.Clone()
|
||||
|
||||
name := removeExt(strings.TrimPrefix(page, `pages/`))
|
||||
t.templates[name] = template.Must(tmpl.New(page).Parse(string(data)))
|
||||
}
|
||||
|
||||
return t
|
||||
}
|
||||
|
||||
// Render implements echo's Renderer interface
|
||||
func (t *Renderer) Render(w io.Writer, name string, data interface{}, c *router.Context) error {
|
||||
tmpl, ok := t.templates[name]
|
||||
if !ok {
|
||||
return fmt.Errorf(`template '%s' not found`, name)
|
||||
}
|
||||
|
||||
templateData := struct {
|
||||
Content interface{}
|
||||
}{data}
|
||||
|
||||
return tmpl.ExecuteTemplate(w, `base`, templateData)
|
||||
}
|
||||
|
||||
func removeExt(s string) string {
|
||||
return strings.TrimSuffix(s, path.Ext(s))
|
||||
}
|
||||
|
||||
func getStatic(c *router.Context) error {
|
||||
path := path.Clean(strings.TrimPrefix(c.Request.URL.Path, `/static/`))
|
||||
|
||||
data, err := static.Asset(path)
|
||||
if err != nil {
|
||||
return c.String(404, `Resource not found`)
|
||||
}
|
||||
|
||||
c.Response.Header().Set(`Content-Type`, mime.TypeByExtension(filepath.Ext(path)))
|
||||
_, _ = c.Response.Write(data)
|
||||
|
||||
return nil
|
||||
}
|
3
static/stylesheet.css
Normal file
3
static/stylesheet.css
Normal file
@ -0,0 +1,3 @@
|
||||
body {
|
||||
color: black;
|
||||
}
|
18
templates/components/base.gohtml
Normal file
18
templates/components/base.gohtml
Normal file
@ -0,0 +1,18 @@
|
||||
{{ define "base" }}
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name=viewport content="width=device-width, initial-scale=1">
|
||||
|
||||
<title>Meikan data - {{ block "title" . }}Home{{ end }}</title>
|
||||
|
||||
<link rel="stylesheet" href="/static/stylesheet.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="content">
|
||||
{{ block "body" . }}{{ end }}
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
{{ end }}
|
3
templates/pages/index.gohtml
Normal file
3
templates/pages/index.gohtml
Normal file
@ -0,0 +1,3 @@
|
||||
{{ define "body" }}
|
||||
<h1>Hello, 世界!</h1>
|
||||
{{ end }}
|
Loading…
Reference in New Issue
Block a user