Skip to content

Commit e015efa

Browse files
authored
Add FAMS code in individual nodes when made a spouse in a family. (#310)
1 parent 7e19583 commit e015efa

File tree

5 files changed

+70
-9
lines changed

5 files changed

+70
-9
lines changed

child_node.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package gedcom
22

3-
import "fmt"
4-
53
// ChildNode is the natural, adopted, or sealed (LDS) child of a father and a
64
// mother.
75
type ChildNode struct {
@@ -18,7 +16,11 @@ func newChildNode(family *FamilyNode, value string, children ...Node) *ChildNode
1816

1917
func newChildNodeWithIndividual(family *FamilyNode, individual *IndividualNode) *ChildNode {
2018
// TODO: check individual belongs to the same document as family
21-
return newChildNode(family, fmt.Sprintf("@%s@", individual.Pointer()))
19+
20+
famChild := NewNode(TagFamilyChild, family.Identifier(), "")
21+
individual.AddNode(famChild)
22+
23+
return newChildNode(family, individual.Identifier())
2224
}
2325

2426
func (node *ChildNode) Family() *FamilyNode {

family_node.go

+29-4
Original file line numberDiff line numberDiff line change
@@ -139,23 +139,48 @@ func (node *FamilyNode) AddChild(individual *IndividualNode) *ChildNode {
139139

140140
func (node *FamilyNode) SetHusband(individual *IndividualNode) *FamilyNode {
141141
if individual == nil {
142-
DeleteNodesWithTag(node, TagHusband)
142+
husband := node.Husband().Individual()
143+
nodes := husband.Nodes()
143144

145+
for _, subNode := range nodes {
146+
if subNode.Tag() == TagFamilySpouse && subNode.Value() == node.Identifier() {
147+
husband.DeleteNode(subNode)
148+
}
149+
}
150+
151+
DeleteNodesWithTag(node, TagHusband)
152+
node.husband = nil
153+
node.cachedHusband = true
144154
return node
145155
}
156+
157+
n := NewNode(TagFamilySpouse, node.Identifier(), "")
158+
individual.AddNode(n)
146159

147160
return node.SetHusbandPointer(individual.Pointer())
148161
}
149162

150163
func (node *FamilyNode) SetWife(individual *IndividualNode) *FamilyNode {
151164
if individual == nil {
152-
DeleteNodesWithTag(node, TagWife)
165+
wife := node.Wife().Individual()
166+
nodes := wife.Nodes()
153167

168+
for _, subNode := range nodes {
169+
if subNode.Tag() == TagFamilySpouse && subNode.Value() == node.Identifier() {
170+
wife.DeleteNode(subNode)
171+
}
172+
}
173+
174+
DeleteNodesWithTag(node, TagWife)
175+
node.wife = nil
176+
node.cachedWife = true
154177
return node
155178
}
156179

157-
return node.SetWifePointer(individual.Pointer())
158-
}
180+
n := NewNode(TagFamilySpouse, node.Identifier(), "")
181+
individual.AddNode(n)
182+
183+
return node.SetWifePointer(individual.Pointer())}
159184

160185
func (node *FamilyNode) SetWifePointer(pointer string) *FamilyNode {
161186
wife := node.Wife()

family_node_test.go

+26-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,31 @@ var familyTests = []struct {
3838
husband: nil,
3939
wife: jane,
4040
},
41+
{
42+
doc: func(doc *gedcom.Document) {
43+
jane := individual(doc, "P2", "Jane /Doe/", "3 Mar 1803", "14 June 1877")
44+
elliot := individual(doc, "P1", "Elliot /Chance/", "4 Jan 1843", "17 Mar 1907")
45+
f3 := doc.AddFamily("F3")
46+
f3.SetWife(jane)
47+
f3.SetHusband(elliot)
48+
f3.SetWife(nil)
49+
},
50+
husband: elliot,
51+
wife: nil,
52+
},
53+
{
54+
doc: func(doc *gedcom.Document) {
55+
jane := individual(doc, "P2", "Jane /Doe/", "3 Mar 1803", "14 June 1877")
56+
elliot := individual(doc, "P1", "Elliot /Chance/", "4 Jan 1843", "17 Mar 1907")
57+
f3 := doc.AddFamily("F3")
58+
f3.SetHusband(elliot)
59+
f3.SetWife(jane)
60+
f3.SetHusband(nil)
61+
62+
},
63+
husband: nil,
64+
wife: jane,
65+
},
4166
}
4267

4368
func TestFamilyNode_Husband(t *testing.T) {
@@ -614,4 +639,4 @@ func TestFamilyNode_Warnings(t *testing.T) {
614639
assertEqual(t, f1.Warnings().Strings(), test.expected)
615640
})
616641
}
617-
}
642+
}

nodes.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ func (nodes Nodes) FlattenAll(document *Document, result Nodes) {
161161
func (nodes Nodes) deleteNode(n Node) (Nodes, bool) {
162162
for i, node2 := range nodes {
163163
if node2 == n {
164-
return append(nodes[:i], nodes[i+2:]...), true
164+
return append(nodes[:i], nodes[i+1:]...), true
165165
}
166166
}
167167

simple_node.go

+9
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,15 @@ func (node *SimpleNode) Pointer() string {
5656
return node.pointer
5757
}
5858

59+
// Identifier returns the identifier for the node; empty string if the node is nil
60+
func (node *SimpleNode) Identifier() string {
61+
if node == nil {
62+
return ""
63+
}
64+
65+
return fmt.Sprintf("@%s@", node.pointer)
66+
}
67+
5968
// Equals compares two nodes for value equality.
6069
//
6170
// 1. If either or both nodes are nil then false is always returned.

0 commit comments

Comments
 (0)