Browse Source

fixed templating

master
David Alasow 4 years ago
parent
commit
c5e839e13e
  1. 16
      Makefile
  2. 3
      internal/static/static.go
  3. 3
      internal/templates/templates.go
  4. 116
      main.go
  5. 9
      pages/index.html
  6. 88
      render.go
  7. 3
      static/stylesheet.css
  8. 18
      templates/components/base.gohtml
  9. 3
      templates/pages/index.gohtml

16
Makefile

@ -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

@ -0,0 +1,3 @@
package static
//go:generate go-bindata -pkg $GOPACKAGE --prefix "../../static/" ../../static/...

3
internal/templates/templates.go

@ -0,0 +1,3 @@
package templates
//go:generate go-bindata -pkg $GOPACKAGE --prefix "../../templates/" ../../templates/...

116
main.go

@ -1,40 +1,17 @@
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"`
Anime []jikanAPIAnime `json:"anime"`
}
type jikanAPIAnime struct {
@ -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

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html>
<head>
<title>This is a page</title>
</head>
<body>
</body>
</html>

88
render.go

@ -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

@ -0,0 +1,3 @@
body {
color: black;
}

18
templates/components/base.gohtml

@ -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

@ -0,0 +1,3 @@
{{ define "body" }}
<h1>Hello, 世界!</h1>
{{ end }}
Loading…
Cancel
Save