readGedcom(parse_dates = TRUE) now retains dates that
are precise only to the month or the year. Previously these became
NA, which discarded most of the dates in a typical
historical pedigree. Partial dates are completed with the midpoint of
the known interval (the 15th of a known month, 15 June for a known
year); set the new impute_partial_dates = FALSE to restore
the stricter behavior and keep only dates that specify a day.Abt.,
Aft.), as Ancestry.com exports them, are now stripped.
Previously only the specification’s unpunctuated forms
(ABT, AFT) were recognized, so
"Aft. Oct 1896" failed to parse.readGedcom() no longer leaves a stray / in
the name column when a name suffix follows the surname
(e.g. 1 NAME William Pitt /Waugh/ Jr parsed as
William Pitt Waugh/ Jr). Both surname delimiters are now
removed.readGedcom() no longer errors with “missing value where
TRUE/FALSE needed” when a spouse record has no SEX line.
Individuals with unknown sex are skipped during parent mapping rather
than compared.The “Getting Started” vignette now walks through exporting a GEDCOM file from a genealogy service, including the instability of person IDs across exports and a note on the privacy implications of sharing an export containing living people.
Added two example GEDCOM files, installed under
inst/extdata, drawn from the W. Henderson Waugh Family Tree
and covering eight individuals (all deceased) across four families:
waugh.ged — a clean excerpt for documentation
examples.waugh_messy.ged — the same individuals retaining
source-export defects (conflicting duplicate BIRT blocks,
competing PLAC lines, an uncertain surname, a missing
SEX value, and an individual with no birth record).parseIndividuals.R,
parseEvents.R, parseLines.R,
parseFamily.R, and postProcessGedcom.R;
readGedcom.R is now a slim orchestration entry point
only.make_event_fields(),
make_name_piece_mappings(),
make_attribute_mappings(),
make_relationship_mappings()) that build static tag-mapping
tables. These are called once in readGedcom() before the
per-individual lapply, and passed in as a
mappings argument to parseIndividualBlock(),
avoiding redundant reconstruction on every block.processEventLine() if/else chain with a
data-driven dispatch over the event_fields lookup table,
reducing the cost of adding new event types to a single table
entry.blocks list in
splitIndividuals() (vector("list", n)) rather
than growing it element-by-element.test-parseEvents.R, test-convertCoords.R,
test-postProcessGedcom.R, and
test-readGedcom.R.NEWS.md file to track changes to the
package.