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" strip "github.com/grokify/html-strip-tags-go" "github.com/squk/lotr/cmd/beornextract/types" ) func main() { fmt.Println("LOTR CARD PARSE") f, err := bazel.Runfile(".") if err != nil { panic(err) } err = filepath.Walk(f, func(path string, info os.FileInfo, err error) error { if err != nil { return err } fmt.Println(path, info.Size()) return nil }) if err != nil { log.Println(err) } // Open our jsonFile 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 } // defer the closing of our jsonFile so that we can parse it later on defer jsonFile.Close() byteValue, _ := ioutil.ReadAll(jsonFile) 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)) }