Browse Source

variable-group parser

master
n0m1s 6 years ago
parent
commit
6f729650cc
Signed by: nomis GPG Key ID: BC0454CAD76FE803
1 changed files with 94 additions and 4 deletions
  1. +94
    -4
      jdr/sheet.go

+ 94
- 4
jdr/sheet.go View File

@ -70,11 +70,22 @@ func (n *xmlNode) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
return d.DecodeElement((*node)(n), &start) return d.DecodeElement((*node)(n), &start)
} }
func parseVariable(root xmlNode, sheet *CharacterSheet) (*Variable, error) {
func parseVariable(root xmlNode, sheet *CharacterSheet, defaults *Variable) (*Variable, error) {
ret := &Variable{} ret := &Variable{}
typeOk := false typeOk := false
nameOk := false nameOk := false
if defaults != nil {
switch defaults.Type.(type) {
case *VariableType_badType:
typeOk = false
default:
typeOk = true
ret.Type = defaults.Type
}
}
for i := 0; i < len(root.Attrs); i++ { for i := 0; i < len(root.Attrs); i++ {
attrName := root.Attrs[i].Name.Local attrName := root.Attrs[i].Name.Local
attrVal := root.Attrs[i].Value attrVal := root.Attrs[i].Value
@ -128,12 +139,91 @@ func parseBlock(root xmlNode, sheet *CharacterSheet) (*Block, error) {
return ret, nil return ret, nil
} }
func parseItem(root xmlNode, sheet *CharacterSheet) (SheetItem, error) {
func parseVariableGroup(root xmlNode, sheet *CharacterSheet, defaults *Variable) ([]*Variable, error) {
ret := []*Variable{}
typeOk := false
if defaults == nil {
defaults = &Variable{}
} else {
typeOk = true
}
for i := 0; i < len(root.Attrs); i++ {
attrName := root.Attrs[i].Name.Local
attrVal := root.Attrs[i].Value
switch attrName {
case "default-type":
t, err := sheet.getType(attrVal)
if err != nil {
return nil, err
}
defaults.Type = t
typeOk = true
}
}
if !typeOk {
defaults.Type = &VariableType_badType{}
}
for i := 0; i < len(root.Nodes); i++ {
node := root.Nodes[i]
switch node.XMLName.Local {
case "variable":
item, err := parseVariable(node, sheet, defaults)
if err != nil {
return nil, err
}
ret = append(ret, item)
case "variable-group":
items, err := parseVariableGroup(node, sheet, defaults)
if err != nil {
return nil, err
}
for j := 0; j < len(items); j++ {
ret = append(ret, items[j])
}
default:
return nil, errors.New("Unknown variable-group item: \"" + node.XMLName.Local + "\"")
}
}
return ret, nil
}
func parseItem(root xmlNode, sheet *CharacterSheet) ([]SheetItem, error) {
switch root.XMLName.Local { switch root.XMLName.Local {
case "block": case "block":
return parseBlock(root, sheet)
block, err := parseBlock(root, sheet)
if err != nil {
return nil, err
}
return []SheetItem{block}, nil
case "variable": case "variable":
return parseVariable(root, sheet)
variable, err := parseVariable(root, sheet, nil)
if err != nil {
return nil, err
}
return []SheetItem{variable}, err
case "variable-group":
variables, err := parseVariableGroup(root, sheet, nil)
if err != nil {
return nil, err
}
items := make([]SheetItem, len(variables))
for i, v := range variables {
items[i] = SheetItem(v)
}
return items, nil
default: default:
return nil, errors.New("Unknown item: " + root.XMLName.Local) return nil, errors.New("Unknown item: " + root.XMLName.Local)
} }


Loading…
Cancel
Save