From 35f48a157e3bc0752d50d1e2f6d1bd8295d34e6b Mon Sep 17 00:00:00 2001 From: Christian Nieves Date: Tue, 18 Jul 2023 00:38:41 -0500 Subject: [PATCH] CSV for lotr-lcg-set-generator --- cmd/beornextract/BUILD | 2 +- cmd/beornextract/main.go | 80 +++++++++++++++++++++++++++++++--- cmd/beornextract/types/card.go | 60 +++++++++++++------------ deps.bzl | 7 +++ go.mod | 1 + go.sum | 2 + 6 files changed, 116 insertions(+), 36 deletions(-) diff --git a/cmd/beornextract/BUILD b/cmd/beornextract/BUILD index 36b2e8f..cd0ce28 100644 --- a/cmd/beornextract/BUILD +++ b/cmd/beornextract/BUILD @@ -14,7 +14,7 @@ go_library( importpath = "github.com/squk/lotr/cmd/beornextract", deps = [ "//cmd/beornextract/types", - "@com_github_davecgh_go_spew//spew", + "@com_github_grokify_html_strip_tags_go//:html-strip-tags-go", "@io_bazel_rules_go//go/tools/bazel:go_default_library", ], ) diff --git a/cmd/beornextract/main.go b/cmd/beornextract/main.go index afbc314..1590bbb 100644 --- a/cmd/beornextract/main.go +++ b/cmd/beornextract/main.go @@ -1,15 +1,19 @@ package main import ( + "encoding/csv" "encoding/json" "fmt" "io/ioutil" "log" "os" "path/filepath" + "regexp" + "strconv" + "strings" "github.com/bazelbuild/rules_go/go/tools/bazel" - "github.com/davecgh/go-spew/spew" + strip "github.com/grokify/html-strip-tags-go" "github.com/squk/lotr/cmd/beornextract/types" ) @@ -32,19 +36,81 @@ func main() { } // Open our jsonFile - // jsonFile, err := os.Open("cmd/beornextract/data/Bot.Cards.json") - jsonFile, err := bazel.Runfile("cmd/beornextract/data/Bot.Cards.json") + jsonFile, err := os.Open("cmd/beornextract/data/Bot.Cards.json") + // jsonFile, err := bazel.Runfile("cmd/beornextract/data/Bot.Cards.json") // if we os.Open returns an error then handle it if err != nil { fmt.Println(err) return } - fmt.Println("Successfully Opened users.json") // defer the closing of our jsonFile so that we can parse it later on defer jsonFile.Close() byteValue, _ := ioutil.ReadAll(jsonFile) - c := []types.HallOfBeornCard{} - json.Unmarshal(byteValue, &c) - spew.Dump(c) + cards := []types.HallOfBeornCard{} + json.Unmarshal(byteValue, &cards) + + // Open a file for writing + csvFile, err := os.Create("/Users/christian/Downloads/lotr-lcg-set-generator.csv") + defer csvFile.Close() + if err != nil { + // Handle error + } + + // Create a writer + w := csv.NewWriter(csvFile) + + // Write some rows + for _, card := range cards { + if card.EncounterSet != "" { + continue // skip non=player cards + } + + w.Write( + []string{ + card.Octgnid, + "", // hidden + "", // hidden + card.EncounterSet, + strconv.Itoa(card.Position), + strconv.Itoa(card.Quantity), + card.Name, + fmt.Sprintf( + "%t", + card.IsUnique, + ), + card.TypeName, + card.SphereName, + card.Traits, + extractKeywords(card.Text), + card.Cost, + card.EngagementCost, + strconv.Itoa(card.Threat), + strconv.Itoa(card.Willpower), + strconv.Itoa(card.Attack), + strconv.Itoa(card.Defense), + strconv.Itoa(card.Health), + "", // Quest Points + "", // Victory Points + "", // Special Icon + transformText(card.Name, card.Text), + card.Flavor, + }, + ) + } + + // Close the writer + w.Flush() + // spew.Dump(c) +} + +func transformText(name, text string) string { + return strip.StripTags( + strings.ReplaceAll(text, name, "[name]"), // insert name tag + ) +} + +func extractKeywords(text string) string { + pattern := regexp.MustCompile(`((?:(?:[A-Z][a-z]+(\.|\s[0-9]+\.)\s)+))`) + return strings.TrimSpace(pattern.FindString(text)) } diff --git a/cmd/beornextract/types/card.go b/cmd/beornextract/types/card.go index e4db05f..92adfe8 100644 --- a/cmd/beornextract/types/card.go +++ b/cmd/beornextract/types/card.go @@ -1,33 +1,37 @@ package types type HallOfBeornCard struct { - PackCode string `json:"pack_code"` - PackName string `json:"pack_name"` - IsOfficial bool `json:"is_official"` - TypeCode string `json:"type_code"` - TypeName string `json:"type_name"` - SphereCode string `json:"sphere_code"` - SphereName string `json:"sphere_name"` - Position int `json:"position"` - Code string `json:"code"` - Name string `json:"name"` - Traits string `json:"traits"` - Text string `json:"text"` - Flavor string `json:"flavor"` - IsUnique bool `json:"is_unique"` - Threat int `json:"threat"` - Willpower int `json:"willpower"` - Attack int `json:"attack"` - Defense int `json:"defense"` - Health int `json:"health"` - Quantity int `json:"quantity"` - DeckLimit int `json:"deck_limit"` - Illustrator string `json:"illustrator"` - Octgnid string `json:"octgnid"` - HasErrata bool `json:"has_errata"` - URL string `json:"url"` - Imagesrc string `json:"imagesrc"` + PackCode string `json:"pack_code,omitempty"` + PackName string `json:"pack_name,omitempty"` + IsOfficial bool `json:"is_official,omitempty"` + TypeCode string `json:"type_code,omitempty"` + TypeName string `json:"type_name,omitempty"` + SphereCode string `json:"sphere_code,omitempty"` + SphereName string `json:"sphere_name,omitempty"` + Position int `json:"position,omitempty"` + Code string `json:"code,omitempty"` + Cost string `json:"cost,omitempty"` + Name string `json:"name,omitempty"` + Traits string `json:"traits,omitempty"` + Text string `json:"text,omitempty"` + Flavor string `json:"flavor,omitempty"` + IsUnique bool `json:"is_unique,omitempty"` + Threat int `json:"threat,omitempty"` + Willpower int `json:"willpower,omitempty"` + Attack int `json:"attack,omitempty"` + Defense int `json:"defense,omitempty"` + Health int `json:"health,omitempty"` + Quantity int `json:"quantity,omitempty"` + DeckLimit int `json:"deck_limit,omitempty"` + Illustrator string `json:"illustrator,omitempty"` + Octgnid string `json:"octgnid,omitempty"` + HasErrata bool `json:"has_errata,omitempty"` + URL string `json:"url,omitempty"` + Imagesrc string `json:"imagesrc,omitempty"` + + EncounterSet string `json:"encounter_set,omitempty"` + EngagementCost string `json:"engagement_cost,omitempty"` + ThreatStrength int `json:"threat_strength,omitempty"` } -type NormalizedCard struct { -} +type NormalizedCard struct{} diff --git a/deps.bzl b/deps.bzl index e70f841..d65984e 100644 --- a/deps.bzl +++ b/deps.bzl @@ -30,6 +30,13 @@ def go_dependencies(): sum = "h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=", version = "v1.5.2", ) + go_repository( + name = "com_github_grokify_html_strip_tags_go", + build_file_proto_mode = "disable_global", + importpath = "github.com/grokify/html-strip-tags-go", + sum = "h1:0fThFwLbW7P/kOiTBs03FsJSV9RM2M/Q/MOnCQxKMo0=", + version = "v0.0.1", + ) go_repository( name = "com_github_mattn_go_sqlite3", diff --git a/go.mod b/go.mod index eb6b7bc..bca8f0c 100644 --- a/go.mod +++ b/go.mod @@ -6,5 +6,6 @@ require github.com/davecgh/go-spew v1.1.1 require ( github.com/bazelbuild/rules_go v0.41.0 // indirect + github.com/grokify/html-strip-tags-go v0.0.1 // indirect github.com/mattn/go-sqlite3 v1.14.17 // indirect ) diff --git a/go.sum b/go.sum index cb2bf78..04cc0dc 100644 --- a/go.sum +++ b/go.sum @@ -2,5 +2,7 @@ github.com/bazelbuild/rules_go v0.41.0 h1:JzlRxsFNhlX+g4drDRPhIaU5H5LnI978wdMJ0v github.com/bazelbuild/rules_go v0.41.0/go.mod h1:TMHmtfpvyfsxaqfL9WnahCsXMWDMICTw7XeK9yVb+YU= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/grokify/html-strip-tags-go v0.0.1 h1:0fThFwLbW7P/kOiTBs03FsJSV9RM2M/Q/MOnCQxKMo0= +github.com/grokify/html-strip-tags-go v0.0.1/go.mod h1:2Su6romC5/1VXOQMaWL2yb618ARB8iVo6/DR99A6d78= github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM= github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=