137 lines
2.9 KiB
Go
137 lines
2.9 KiB
Go
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/jessevdk/go-flags"
|
|
"github.com/squk/lotr/cmd/beornextract/types"
|
|
)
|
|
|
|
type Options struct {
|
|
RawConversion bool `short:"r" long:"raw" description:"Enable to keep the original text from HallOfBeorn dump. Enable to prep for ALEP pipeline."`
|
|
}
|
|
|
|
var opts = Options{
|
|
RawConversion: false,
|
|
}
|
|
|
|
func main() {
|
|
_, err := flags.ParseArgs(&opts, os.Args)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
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 := os.Open("cmd/beornextract/data/Export.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,
|
|
findKeywords(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),
|
|
card.QuestPoints,
|
|
strconv.Itoa(card.VictoryPoints),
|
|
"", // Special Icon
|
|
transformText(card.Name, card.Text),
|
|
card.Flavor,
|
|
},
|
|
)
|
|
}
|
|
|
|
// Close the writer
|
|
w.Flush()
|
|
// spew.Dump(c)
|
|
}
|
|
|
|
func transformText(name, text string) string {
|
|
if opts.RawConversion {
|
|
return text
|
|
}
|
|
|
|
out := strings.ReplaceAll(text, name, "[name]") // insert name tag
|
|
out = strip.StripTags(out)
|
|
out = keywordPattern.ReplaceAllLiteralString(out, "")
|
|
return strings.TrimSpace(out)
|
|
}
|
|
|
|
var keywordPattern = regexp.MustCompile(`((?:(?:[A-Z][a-z]+(\.|\s[0-9]+\.)\s*)+))`)
|
|
|
|
func findKeywords(text string) string {
|
|
return strings.TrimSpace(keywordPattern.FindString(text))
|
|
}
|