|
|
@ -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) |
|
|
} |
|
|
} |
|
|
|