Initial commit:

Added framework to generate DOT and png files of character map chart
from data folder.
Added all figures in the 1-2 chapters.
Added font file SimSum for render chart
This commit is contained in:
2024-09-02 04:59:36 +00:00
commit 8caf0ac3aa
36 changed files with 1236 additions and 0 deletions
+94
View File
@@ -0,0 +1,94 @@
package entity
import (
"fmt"
"os"
r "xyj-figures/pkg/relationship"
yaml "gopkg.in/yaml.v3"
)
type Entity struct {
Schema string `yaml:"schema,flow"`
Type string `yaml:"type,flow"`
Details interface{} `yaml:"details,flow"`
}
type EntityType string
const (
EntityTypeCharacter = "character"
EntityTypeGroup = "group"
)
type EntityDetails interface {
GetRelationships() []r.Relationship
}
func NewEntity() (*Entity, error) {
return &Entity{Schema: "v1"}, nil
}
func Load(path string) (*Entity, error) {
f, err := os.ReadFile(path)
if err != nil {
return nil, fmt.Errorf("failed to open file: %v", err)
}
e, _ := NewEntity()
if err = yaml.Unmarshal(f, &e); err != nil {
return nil, fmt.Errorf("failed to unmarshal file: %v", err)
}
switch e.Type {
case EntityTypeCharacter:
tmp, err := yaml.Marshal(e.Details)
if err != nil {
return nil, fmt.Errorf("failed to marshal filed %s: %v", EntityTypeCharacter, err)
}
c := Character{}
if err = yaml.Unmarshal(tmp, &c); err != nil {
return nil, fmt.Errorf("failed to unmarshal filed %s: %v", EntityTypeCharacter, err)
}
e.Details = c
case EntityTypeGroup:
tmp, err := yaml.Marshal(e.Details)
if err != nil {
return nil, fmt.Errorf("failed to marshal filed %s: %v", EntityTypeGroup, err)
}
g := Group{}
if err = yaml.Unmarshal(tmp, &g); err != nil {
return nil, fmt.Errorf("failed to unmarshal filed %s: %v", EntityTypeGroup, err)
}
e.Details = g
}
return e, nil
}
func (e Entity) Merge(other Entity) error {
if (e.Schema != other.Schema) || (e.Type != other.Type) {
return fmt.Errorf("unmatch merge between %v and %v", e, other)
}
switch e.Type {
case EntityTypeCharacter:
if e.Details.(Character).Name != other.Details.(Character).Name {
return fmt.Errorf("unmatch merge between %v and %v: names unmatch", e, other)
}
e.Details = Character{
Name: e.Details.(Character).Name,
OtherNames: append(e.Details.(Character).OtherNames, other.Details.(Character).OtherNames...),
Relationships: append(e.Details.(Character).Relationships, other.Details.(Character).Relationships...),
Description: fmt.Sprintf("%s%s", e.Details.(Character).Description, other.Details.(Character).Description),
Links: append(e.Details.(Character).Links, other.Details.(Character).Links...),
}
case EntityTypeGroup:
e.Details = Group{
Name: e.Details.(Group).Name,
OtherNames: append(e.Details.(Group).OtherNames, other.Details.(Group).OtherNames...),
Members: append(e.Details.(Group).Members, other.Details.(Group).Members...),
Relationships: append(e.Details.(Group).Relationships, other.Details.(Group).Relationships...),
Description: fmt.Sprintf("%s%s", e.Details.(Group).Description, other.Details.(Group).Description),
Links: append(e.Details.(Group).Links, other.Details.(Group).Links...),
}
}
return nil
}