From 4e96c000810acc457d73cdc209ae912c4d182e9f Mon Sep 17 00:00:00 2001 From: n0m1s Date: Tue, 23 Jul 2019 19:31:00 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9A=97=20HTML=20character=20sheet=20generati?= =?UTF-8?q?on=20(first=20test)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jdr/sheet.go | 56 ++++++++++++++++++++++++++++++++- jdr/type.go | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 3 +- 3 files changed, 144 insertions(+), 2 deletions(-) diff --git a/jdr/sheet.go b/jdr/sheet.go index 002599d..8460c31 100644 --- a/jdr/sheet.go +++ b/jdr/sheet.go @@ -1,19 +1,31 @@ package jdr import ( - //"html/template" + "html/template" "encoding/xml" "errors" "os" + "log" ) type Page struct { Items []SheetItem } +func (self *Page) ToHTML() template.HTML { + ret := "" + + for _, item := range(self.Items) { + ret += string(item.ToHTML()) + } + + return template.HTML(ret) +} + type SheetItem interface { Name() string + ToHTML() template.HTML } type Block struct { @@ -25,6 +37,24 @@ func (self *Block) Name() string { return self.name } +func (self *Block) ToHTML() template.HTML { + begin := `
` + legend := `` + template.HTMLEscapeString(self.Name()) + `` + end := `
` + + ret := template.HTML(begin) + if self.Name() != "" { + ret += template.HTML(legend) + } + + for _, item := range(self.Items) { + ret += item.ToHTML() + } + ret += template.HTML(end) + + return ret +} + type Variable struct { Type VariableType name string @@ -34,11 +64,35 @@ func (self *Variable) Name() string { return self.name } +func (self *Variable) ToHTML() template.HTML { + label := "" + if self.name != "" { + label = `` + } + + html, err := self.Type.ToHTML(self.Type.DefaultValue()) + if err != nil { + log.Fatal(err) + } + + return template.HTML(label) + html +} + type CharacterSheet struct { types map[string]VariableType Pages []*Page } +func (self *CharacterSheet) Render() template.HTML { + ret := template.HTML("") + + for _, page := range(self.Pages) { + ret += page.ToHTML() + } + + return ret +} + func (self *CharacterSheet) AddType(t VariableType) { if self.types == nil { self.types = make(map[string]VariableType) diff --git a/jdr/type.go b/jdr/type.go index c61939b..e62b60d 100644 --- a/jdr/type.go +++ b/jdr/type.go @@ -1,6 +1,8 @@ package jdr import( + "html/template" + "log" "errors" "strings" @@ -13,6 +15,7 @@ var regexp_d = regexp.MustCompile(`^[1-9][0-9]*d([468]|1[02]|20|100)$`) type VariableType interface { Name() string Validate(value string) bool + ToHTML(value string) (template.HTML, error) DefaultValue() string } @@ -26,6 +29,10 @@ func (*VariableType_badType) Validate(s string) bool { return false } +func (*VariableType_badType) ToHTML(value string) (template.HTML, error) { + return template.HTML(""), errors.New("unknown type") +} + func (*VariableType_badType) DefaultValue() string { return "" } @@ -52,6 +59,21 @@ func (self *VariableType_bool) Validate(value string) bool { return err == nil } +func (self *VariableType_bool) ToHTML(value string) (template.HTML, error) { + val, err := self.ToBool(value) + if err != nil { + return template.HTML(""), err + } + + ret := `` + + return template.HTML(ret), nil +} + func (self *VariableType_bool) DefaultValue() string { return "false" } @@ -71,6 +93,16 @@ func (self *VariableType_int) Validate(value string) bool { return err == nil } +func (self *VariableType_int) ToHTML(value string) (template.HTML, error) { + val, err := self.ToInt(value) + if err != nil { + return template.HTML(""), err + } + + ret := `` + return template.HTML(ret), nil +} + func (self *VariableType_int) DefaultValue() string { return "0" } @@ -90,6 +122,17 @@ func (self *VariableType_float) Validate(value string) bool { return err == nil } +func (self *VariableType_float) ToHTML(value string) (template.HTML, error) { + val, err := self.ToFloat(value) + if err != nil { + return template.HTML(""), err + } + + ret := `` + + return template.HTML(ret), nil +} + func (self *VariableType_float) DefaultValue() string { return "0.0" } @@ -104,6 +147,11 @@ func (*VariableType_string) Validate(s string) bool { return true } +func (self *VariableType_string) ToHTML(value string) (template.HTML, error) { + ret := `` + return template.HTML(ret), nil +} + func (self *VariableType_string) DefaultValue() string { return "" } @@ -118,6 +166,13 @@ func (*VariableType_d) Validate(s string) bool { return regexp_d.MatchString(s) } +func (self *VariableType_d) ToHTML(value string) (template.HTML, error) { + //FIXME: non-generic version + ret := `` + + return template.HTML(ret), nil +} + func (self *VariableType_d) DefaultValue() string { //FIXME: non-generic version return "" @@ -170,6 +225,33 @@ func (self *CustomEnum) Validate(value string) bool { return err == nil } +func (self *CustomEnum) ToHTML(value string) (template.HTML, error) { + selectItem := value != "" + + value_id := 0 + if selectItem { + var err error + value_id, err = self.ToId(value) + if err != nil { + return template.HTML(""), err + } + } + + ret := `` + + return template.HTML(ret), nil +} + func (self *CustomEnum) DefaultValue() string { return "" } @@ -189,6 +271,11 @@ func (self *CustomStruct) Validate(s string) bool { return false } +func (self *CustomStruct) ToHTML(value string) (template.HTML, error) { + //FIXME: implement + return template.HTML(""), nil +} + func (self *CustomStruct) DefaultValue() string { //FIXME: non-generic version return "" diff --git a/main.go b/main.go index 02f9c18..5b84b2c 100644 --- a/main.go +++ b/main.go @@ -36,9 +36,10 @@ func main() { log.Fatal(http.ListenAndServe(":8080", r)) */ - _, err := jdr.ReadCharacterSheet("jdr-desc/wasteland.xml") + sheet, err := jdr.ReadCharacterSheet("jdr-desc/wasteland.xml") if err != nil { log.Fatal("error: ", err) } + log.Println(sheet.Render()) //log.Println(sheet.CustomTypes.Enums[0].Name) }