Arranging records

The ability to order records by type in a GEDCOM file is a task purely done for aesthetics - it has no functional value, other than perhaps making records easier to find. We can see in the example below that records are given in the order they were defined:

library(tidyged)
library(tidyged.utils)

some_unref <- gedcom(subm("Me")) |> 
  add_indi(qn = "Tom Smith") |> 
  add_indi(qn = "Tammy Smith") |> 
  add_indi(qn = "Alice White") |> 
  add_indi(qn = "Phil Brown") |>
  add_famg() |> 
  add_famg() |> 
  add_famg() |> 
  add_famg() |> 
  add_famg() |> 
  add_famg() |> 
  add_repo("Test repo") 
#> Added Unknown Individual: @I1@
#> Added Unknown Individual: @I2@
#> Added Unknown Individual: @I3@
#> Added Unknown Individual: @I4@
#> Added Family Group: @F1@
#> Added Family Group: @F2@
#> Added Family Group: @F3@
#> Added Family Group: @F4@
#> Added Family Group: @F5@
#> Added Family Group: @F6@
#> Added Repository: @R1@

unique(some_unref$record)
#>  [1] "HD"   "@U1@" "@I1@" "@I2@" "@I3@" "@I4@" "@F1@" "@F2@" "@F3@" "@F4@"
#> [11] "@F5@" "@F6@" "@R1@" "TR"

We now use the arrange_records() function to arrange them in a specific order, given by a character string giving the first initial of each record type (header, trailer, and submitter records do not move):

ordered <- arrange_records(some_unref, "RIFSNM")

unique(ordered$record)
#>  [1] "HD"   "@U1@" "@R1@" "@I1@" "@I2@" "@I3@" "@I4@" "@F1@" "@F2@" "@F3@"
#> [11] "@F4@" "@F5@" "@F6@" "TR"

Arranging children by date of birth

The order_famg_children_all() function ensures all children are represented in Family Group records in order of date of birth. This is an extension of the order_famg_children() function found in the tidyged package but applies to all Family Group records.

Duplicate notes

With all records and many subrecords, it’s possible to include custom notes to augment the information provided. These can either be the notes themselves, or a pointer to a top level Note record:

notes <- gedcom(subm("Me")) |>
  add_note("This is a generic note.") |> 
  add_indi(indi_notes = c("This is a bespoke note.", "This is a generic note.")) |> 
  add_repo("My repository", repo_notes = c("This is a bespoke note.", "This is a generic note."))
#> Added Note: @N1@
#> Added Unknown Individual: @I1@
#> Added Repository: @R1@

knitr::kable(notes)
level record tag value
0 HD HEAD
1 HD GEDC
2 HD VERS 5.5.5
2 HD FORM LINEAGE-LINKED
3 HD VERS 5.5.5
1 HD CHAR UTF-8
1 HD DEST gedcompendium
1 HD SOUR gedcompendium
2 HD NAME The ‘gedcompendium’ ecosystem of packages for the R language
2 HD CORP Jamie Lendrum
3 HD ADDR
3 HD EMAIL
3 HD WWW https://jl5000.github.io/tidyged/
1 HD DATE 25 JUN 2022
1 HD LANG English
1 HD SUBM @U1@
0 @U1@ SUBM
1 @U1@ NAME Me
1 @U1@ CHAN
2 @U1@ DATE 25 JUN 2022
0 @N1@ NOTE This is a generic note.
1 @N1@ CHAN
2 @N1@ DATE 25 JUN 2022
0 @I1@ INDI
1 @I1@ SEX U
1 @I1@ CHAN
2 @I1@ DATE 25 JUN 2022
1 @I1@ NOTE This is a bespoke note.
1 @I1@ NOTE This is a generic note.
0 @R1@ REPO
1 @R1@ NAME My repository
1 @R1@ NOTE This is a bespoke note.
1 @R1@ NOTE This is a generic note.
1 @R1@ CHAN
2 @R1@ DATE 25 JUN 2022
0 TR TRLR

In the above example, there is a generic note recorded in a top level Note record. This same note message has been used for the individual and repository defined, but they have been repeated rather than pointing to the Note record. There is also a repeated bespoke note given in the Individual and Repository records.

The consolidate_notes() function will simplify the file, replacing note values with pointers to top level Note records (creating them if necessary) if they are repeated:

consolidate_notes(notes) |> 
  knitr::kable()
#> Added Note: @N2@
level record tag value
0 HD HEAD
1 HD GEDC
2 HD VERS 5.5.5
2 HD FORM LINEAGE-LINKED
3 HD VERS 5.5.5
1 HD CHAR UTF-8
1 HD DEST gedcompendium
1 HD SOUR gedcompendium
2 HD NAME The ‘gedcompendium’ ecosystem of packages for the R language
2 HD CORP Jamie Lendrum
3 HD ADDR
3 HD EMAIL
3 HD WWW https://jl5000.github.io/tidyged/
1 HD DATE 25 JUN 2022
1 HD LANG English
1 HD SUBM @U1@
0 @U1@ SUBM
1 @U1@ NAME Me
1 @U1@ CHAN
2 @U1@ DATE 25 JUN 2022
0 @N1@ NOTE This is a generic note.
1 @N1@ CHAN
2 @N1@ DATE 25 JUN 2022
0 @I1@ INDI
1 @I1@ SEX U
1 @I1@ CHAN
2 @I1@ DATE 25 JUN 2022
1 @I1@ NOTE @N2@
1 @I1@ NOTE @N1@
0 @R1@ REPO
1 @R1@ NAME My repository
1 @R1@ NOTE @N2@
1 @R1@ NOTE @N1@
1 @R1@ CHAN
2 @R1@ DATE 25 JUN 2022
0 @N2@ NOTE This is a bespoke note.
1 @N2@ CHAN
2 @N2@ DATE 25 JUN 2022
0 TR TRLR