Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Version 1.05

  • Loading branch information...
commit 80d923759d854b542b556858fe966e7b69b6bd65 1 parent a036b0b
Paul Johnson authored
40 CHANGES
View
@@ -48,3 +48,43 @@ Release 1.04 - 29th May 1999
- Add lines2perl
- Improve Makefile.PL environment tests
- Work around IO::Handle::input_line_number bug
+
+Release 1.05
+ - Add LifeLines.pm
+ - Add Event.pm
+ - Add functions to:
+ Gedcom.pm:
+ soundex()
+ Item.pm:
+ level()
+ xref()
+ tag()
+ value()
+ min()
+ max()
+ gedcom()
+ file()
+ line()
+ Individual.pm:
+ name()
+ cased_name()
+ surname()
+ given_names()
+ soundex()
+ sex()
+ older_siblings()
+ younger_siblings()
+ Family.pm:
+ parents()
+ number_of_children()
+ - Change most functions in Individual and Family to check wantarray
+ - Have get_individual check xrefs and soundex
+ - Fix renumber error - xrefs are now calculated and then changed
+ - Change basic.t to reflect renumber fix
+ - Move normalise_dates from Item.pm to Record.pm
+ - Add AUTOLOAD function to Record.pm to provide access based on tag
+ name or description
+ - Change lines2perl to use references to arrays and hashes
+ - Other major changes to lines2perl to increase functionality
+ - Change require 5.004 to require 5.005
+ - Add check for Text/Soundex to Makefile.PL
287 Gedcom.pm
View
@@ -9,25 +9,181 @@
use strict;
-require 5.004;
+require 5.005;
package Gedcom;
use Data::Dumper;
use FileHandle;
-use Gedcom::Grammar 1.04;
-use Gedcom::Individual 1.04;
-use Gedcom::Family 1.04;
+BEGIN { eval "use Text::Soundex" } # We'll use this if it is available
-use vars qw($VERSION);
-$VERSION = "1.04";
+use vars qw($VERSION $Tags);
+
+BEGIN
+{
+ $VERSION = "1.05";
+
+ $Tags =
+ {
+ ABBR => "Abbreviation",
+ ADDR => "Address",
+ ADOP => "Adoption",
+ ADR1 => "Address1",
+ ADR2 => "Address2",
+ AFN => "Afn",
+ AGE => "Age",
+ AGNC => "Agency",
+ ALIA => "Alias",
+ ANCE => "Ancestors",
+ ANCI => "Ances Interest",
+ ANUL => "Annulment",
+ ASSO => "Associates",
+ AUTH => "Author",
+ BAPL => "Baptism-LDS",
+ BAPM => "Baptism",
+ BARM => "Bar Mitzvah",
+ BASM => "Bas Mitzvah",
+ BIRT => "Birth",
+ BLES => "Blessing",
+ BLOB => "Binary Object",
+ BURI => "Burial",
+ CALN => "Call Number",
+ CAST => "Caste",
+ CAUS => "Cause",
+ CENS => "Census",
+ CHAN => "Change",
+ CHAR => "Character",
+ CHIL => "Child",
+ CHR => "Christening",
+ CHRA => "Adult Christening",
+ CITY => "City",
+ CONC => "Concatenation",
+ CONF => "Confirmation",
+ CONL => "Confirmation L",
+ CONT => "Continued",
+ COPR => "Copyright",
+ CORP => "Corporate",
+ CREM => "Cremation",
+ CTRY => "Country",
+ DATA => "Data",
+ DATE => "Date",
+ DEAT => "Death",
+ DESC => "Descendants",
+ DESI => "Descendant Int",
+ DEST => "Destination",
+ DIV => "Divorce",
+ DIVF => "Divorce Filed",
+ DSCR => "Phy Description",
+ EDUC => "Education",
+ EMIG => "Emigration",
+ ENDL => "Endowment",
+ ENGA => "Engagement",
+ EVEN => "Event",
+ FAM => "Family",
+ FAMC => "Family Child",
+ FAMF => "Family File",
+ FAMS => "Family Spouse",
+ FCOM => "First Communion",
+ FILE => "File",
+ FORM => "Format",
+ GEDC => "Gedcom",
+ GIVN => "Given Name",
+ GRAD => "Graduation",
+ HEAD => "Header",
+ HUSB => "Husband",
+ IDNO => "Ident Number",
+ IMMI => "Immigration",
+ INDI => "Individual",
+ LANG => "Language",
+ LEGA => "Legatee",
+ MARB => "Marriage Bann",
+ MARC => "Marr Contract",
+ MARL => "Marr License",
+ MARR => "Marriage",
+ MARS => "Marr Settlement",
+ MEDI => "Media",
+ NAME => "Name",
+ NATI => "Nationality",
+ NATU => "Naturalization",
+ NCHI => "Children_count",
+ NICK => "Nickname",
+ NMR => "Marriage_count",
+ NOTE => "Note",
+ NPFX => "Name_prefix",
+ NSFX => "Name_suffix",
+ OBJE => "Object",
+ OCCU => "Occupation",
+ ORDI => "Ordinance",
+ ORDN => "Ordination",
+ PAGE => "Page",
+ PEDI => "Pedigree",
+ PHON => "Phone",
+ PLAC => "Place",
+ POST => "Postal_code",
+ PROB => "Probate",
+ PROP => "Property",
+ PUBL => "Publication",
+ QUAY => "Quality Of Data",
+ REFN => "Reference",
+ RELA => "Relationship",
+ RELI => "Religion",
+ REPO => "Repository",
+ RESI => "Residence",
+ RESN => "Restriction",
+ RETI => "Retirement",
+ RFN => "Rec File Number",
+ RIN => "Rec Id Number",
+ ROLE => "Role",
+ SEX => "Sex",
+ SLGC => "Sealing Child",
+ SLGS => "Sealing Spouse",
+ SOUR => "Source",
+ SPFX => "Surn Prefix",
+ SSN => "Soc Sec Number",
+ STAE => "State",
+ STAT => "Status",
+ SUBM => "Submitter",
+ SUBN => "Submission",
+ SURN => "Surname",
+ TEMP => "Temple",
+ TEXT => "Text",
+ TIME => "Time",
+ TITL => "Title",
+ TRLR => "Trailer",
+ TYPE => "Type",
+ VERS => "Version",
+ WIFE => "Wife",
+ WILL => "Will",
+ };
+}
+
+use Gedcom::Grammar 1.05;
+use Gedcom::Individual 1.05;
+use Gedcom::Family 1.05;
+use Gedcom::Event 1.05;
sub new
{
my $proto = shift;
my $class = ref($proto) || $proto;
- my $self = { buffer => [], records => [], xrefs => {}, @_ };
+ my $self =
+ {
+ buffer => [],
+ records => [],
+ xrefs => {},
+ types => {},
+ tags => $Tags,
+ @_
+ };
+ # TODO - find a way to do this nicely for different grammars
+ $self->{types}{INDI} = "Individual";
+ $self->{types}{FAM} = "Family";
+# $self->{types}{$_} = "Event"
+# for qw( ADOP ANUL BAPM BARM BASM BIRT BLES BURI CAST CENS CENS CHR CHRA CONF
+# CREM DEAT DIV DIVF DSCR EDUC EMIG ENGA EVEN EVEN FCOM GRAD IDNO IMMI
+# MARB MARC MARL MARR MARS NATI NATU NCHI NMR OCCU ORDN PROB PROP RELI
+# RESI RETI SSN TITL WILL );
bless $self, $class;
# first read in the grammar
@@ -65,11 +221,11 @@ sub new
grammar => $grammar->structure("GEDCOM"),
gedcom => $self,
callback => $self->{callback});
- }
- $self->{record}{children} = [ Gedcom::Record->new(tag => "TRLR") ]
- unless @{$self->{record}{children}};
+ $self->{record}{children} = [ Gedcom::Record->new(tag => "TRLR") ]
+ unless @{$self->{record}{children}};
- $self->collect_xrefs;
+ $self->collect_xrefs;
+ }
$self;
}
@@ -147,8 +303,12 @@ sub renumber
# now, renumber any records left over
$_->renumber(\%args, 1) for @{$self->{record}{children}};
- # and remove new_xref so we can do it again
- delete @$_{qw(renumbered recursed)} for @{$self->{record}{children}};
+ # actually change the xref
+ for my $record (@{$self->{record}{children}})
+ {
+ $record->{xref} = delete $record->{new_xref};
+ delete $record->{recursed}
+ }
# and update the xrefs
$self->collect_xrefs;
@@ -222,40 +382,67 @@ sub get_individual
my $self = shift;
my $name = "@_";
- # Store the name with the individual to avoid continually recalculating it.
- # This is a bit like a Schwartzian transform, with a grep instead of a sort.
- my @ind = map { [ $_->child_value("NAME") => $_ ] } $self->individuals;
+ my $i = $self->resolve_xref($name) || $self->resolve_xref(uc $name);
+ return $i if $i;
+
+ # search for the name in the specified order
+ my $ordered = sub
+ {
+ my ($n, @ind) = @_;
+ map { $_->[1] } grep { $_->[0] =~ $n } @ind
+ };
+
+ # search for the name in any order
+ my $unordered = sub
+ {
+ my ($names, $t, @ind) = @_;
+ map { $_->[1] }
+ grep
+ {
+ my $i = $_->[0];
+ my $r = 1;
+ for my $n (@$names)
+ {
+ # remove matches as they are found
+ # we don't want to match the same name twice
+ last unless $r = $i =~ s/$n->[$t]//;
+ }
+ $r
+ }
+ @ind;
+ };
# look for various matches in decreasing order of exactitude
+ my @individuals = $self->individuals;
my @i;
+
+ # Store the name with the individual to avoid continually recalculating it.
+ # This is a bit like a Schwartzian transform, with a grep instead of a sort.
+ my @ind = map { [ $_->child_value("NAME") => $_ ] } @individuals;
+
for my $n ( map { qr/^$_$/, qr/\b$_\b/, $_ } map { $_, qr/$_/i } qr/\Q$name/ )
{
- return @i if @i = map { $_->[1] } grep { $_->[0] =~ $n } @ind
+ return wantarray ? @i : $i[0] if @i = $ordered->($n, @ind)
}
- # look for the names in any order
# create an array with one element per name
# each element is an array of REs in decreasing order of exactitude
- my @n = map { [ map { qr/\b$_\b/, $_ } map { qr/$_/, qr/$_/i } "\Q$_" ] }
+ my @names = map { [ map { qr/\b$_\b/, $_ } map { qr/$_/, qr/$_/i } "\Q$_" ] }
split / /, $name;
- for my $t (0 .. $#{$n[0]})
+ for my $t (0 .. $#{$names[0]})
{
- return @i if @i = map { $_->[1] }
- grep
- {
- my $i = $_->[0];
- my $r = 1;
- for my $n (@n)
- {
- # remove matches as they are found - we
- # don't want to match the same name twice
- last unless $r = $i =~ s/$n->[$t]//;
- }
- $r
- }
- @ind;
+ return wantarray ? @i : $i[0] if @i = $unordered->(\@names, $t, @ind)
}
- ()
+
+ # check soundex
+ my @sdx = map { [ $_->soundex => $_ ] } @individuals;
+
+ for my $n ( map { qr/$_/ } $name, soundex($name) )
+ {
+ return wantarray ? @i : $i[0] if @i = $ordered->($n, @sdx)
+ }
+
+ return wantarray ? () : undef;
}
sub next_xref
@@ -266,7 +453,8 @@ sub next_xref
my $last = 0;
for my $c (@{$self->{record}{children}})
{
- $last = $1 if exists $c->{xref} and $c->{xref} =~ /$re/ and $1 > $last;
+ # warn "last $last xref $c->{xref}\n";
+ $last = $1 if defined $c->{xref} and $c->{xref} =~ /$re/ and $1 > $last;
}
$type . ++$last
}
@@ -279,7 +467,7 @@ __END__
Gedcom - a class to manipulate Gedcom genealogy files
-Version 1.04 - 29th May 1999
+Version 1.05 - 20th July 1999
=head1 SYNOPSIS
@@ -552,21 +740,24 @@ Return a list of all the families.
Return a list of all individuals matching the specified name.
-There are ten matches performed, and the results from the first
+There are thirteen matches performed, and the results from the first
successful match are returned.
The matches are:
- 1 - Exact
- 2 - On word boundaries
- 3 - Anywhere
- 4 - Exact, case insensitive
- 5 - On word boundaries, case insensitive
- 6 - Anywhere, case insensitive
- 7 - Names in any order, on word boundaries
- 8 - Names in any order, anywhere
- 9 - Names in any order, on word boundaries, case insensitive
- 10 - Names in any order, anywhere, case insensitive
+ 1 - Xref
+ 2 - Exact
+ 3 - On word boundaries
+ 4 - Anywhere
+ 5 - Exact, case insensitive
+ 6 - On word boundaries, case insensitive
+ 7 - Anywhere, case insensitive
+ 8 - Names in any order, on word boundaries
+ 9 - Names in any order, anywhere
+ 10 - Names in any order, on word boundaries, case insensitive
+ 11 - Names in any order, anywhere, case insensitive
+ 12 - Soundex code
+ 13 - Soundex of name
=head2 next_xref
70 Gedcom/Event.pm
View
@@ -0,0 +1,70 @@
+# Copyright 1999, Paul Johnson (pjcj@transeda.com)
+
+# This software is free. It is licensed under the same terms as Perl itself.
+
+# The latest version of this software should be available from my homepage:
+# http://www.transeda.com/pjcj
+
+# documentation at __END__
+
+use strict;
+
+require 5.005;
+
+package Gedcom::Event;
+
+use Gedcom::Record 1.05;
+
+use vars qw($VERSION @ISA);
+$VERSION = "1.05";
+@ISA = qw( Gedcom::Record );
+
+sub type
+{
+ my $self = shift;
+ $self->child_value("TYPE")
+}
+
+sub date
+{
+ my $self = shift;
+ $self->child_value("DATE")
+}
+
+sub place
+{
+ my $self = shift;
+ $self->child_value("PLAC")
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Gedcom::Event - a class to manipulate Gedcom events
+
+Version 1.05 - 20th July 1999
+
+=head1 SYNOPSIS
+
+ use Gedcom::Event;
+
+=head1 DESCRIPTION
+
+A selection of subroutines to handle events in a gedcom file.
+
+Derived from Gedcom::Record.
+
+=head1 HASH MEMBERS
+
+None.
+
+=head1 METHODS
+
+None yet.
+
+=head2 Individual functions
+
+=cut
71 Gedcom/Family.pm
View
@@ -9,44 +9,67 @@
use strict;
-require 5.004;
+require 5.005;
package Gedcom::Family;
-use Gedcom::Record 1.04;
+use Gedcom::Record 1.05;
use vars qw($VERSION @ISA);
-$VERSION = "1.04";
+$VERSION = "1.05";
@ISA = qw( Gedcom::Record );
sub husband
{
my $self = shift;
- $self->resolve($self->child_values("HUSB"));
+ my @a = $self->resolve($self->child_values("HUSB"));
+ wantarray ? @a : $a[0]
}
sub wife
{
my $self = shift;
- $self->resolve($self->child_values("WIFE"));
+ my @a = $self->resolve($self->child_values("WIFE"));
+ wantarray ? @a : $a[0]
+}
+
+sub parents
+{
+ my $self = shift;
+ ($self->husband, $self->wife)
+}
+
+sub number_of_children
+{
+ my ($self) = @_;
+ $self->child_value("NCHI") || $#{[$self->children]}
}
sub children
{
my $self = shift;
- $self->resolve($self->child_values("CHIL"));
+ my @a = $self->resolve($self->child_values("CHIL"));
+ wantarray ? @a : $a[0]
}
sub boys
{
my $self = shift;
- grep { $_->child_value("SEX") !~ /^F/i } $self->children
+ my @a = grep { $_->child_value("SEX") !~ /^F/i } $self->children;
+ wantarray ? @a : $a[0]
}
sub girls
{
my $self = shift;
- grep { $_->child_value("SEX") !~ /^M/i } $self->children
+ my @a = grep { $_->child_value("SEX") !~ /^M/i } $self->children;
+ wantarray ? @a : $a[0]
+}
+
+sub print
+{
+ my $self = shift;
+ $self->SUPER::print; $_->print for @{$self->{children}};
}
1;
@@ -57,17 +80,19 @@ __END__
Gedcom::Family - a class to manipulate Gedcom families
-Version 1.04 - 29th May 1999
+Version 1.05 - 20th July 1999
=head1 SYNOPSIS
use Gedcom::Family;
- my @rel = $f->husband;
- my @rel = $f->wife;
- my @rel = $f->children;
- my @rel = $f->boys;
- my @rel = $f->girls;
+ my @rel = $f->husband
+ my @rel = $f->wife
+ my @rel = $f->parents
+ my $nch = $f->number_of_children
+ my @rel = $f->children
+ my @rel = $f->boys
+ my @rel = $f->girls
=head1 DESCRIPTION
@@ -85,15 +110,23 @@ None yet.
=head2 Individual functions
- my @rel = $f->husband;
- my @rel = $f->wife;
- my @rel = $f->children;
- my @rel = $f->boys;
- my @rel = $f->girls;
+ my @rel = $f->husband
+ my @rel = $f->wife
+ my @rel = $f->parents
+ my @rel = $f->children
+ my @rel = $f->boys
+ my @rel = $f->girls
Return a list of individuals from family $f.
Each function, even those with a singular name such as husband(),
returns a list of individuals holding that releation in $f.
+=head2 number_of_children
+
+ my $nch = $f->number_of_children
+
+Return the number of children in the family, as specified or from
+counting.
+
=cut
8 Gedcom/Grammar.pm
View
@@ -9,16 +9,16 @@
use strict;
-require 5.004;
+require 5.005;
package Gedcom::Grammar;
use Data::Dumper;
-use Gedcom::Item 1.04;
+use Gedcom::Item 1.05;
use vars qw($VERSION @ISA);
-$VERSION = "1.04";
+$VERSION = "1.05";
@ISA = qw( Gedcom::Item );
sub structure
@@ -116,7 +116,7 @@ __END__
Gedcom::Grammar - a class to manipulate Gedcom grammars
-Version 1.04 - 29th May 1999
+Version 1.05 - 20th July 1999
=head1 SYNOPSIS
2,502 Gedcom/Grammar_5_5.pm
View
@@ -7,3514 +7,3514 @@
# This file was automatically generated from gedcom-5.5.grammar
# by Paul Johnson
-# on Wed May 12 22:05:14 1999
+# on Sun Jul 18 22:26:56 1999
# Do not edit this file.
# Edit gedcom-5.5.grammar if changes need to be made.
# Edit parse_grammar or Makefile.PL to increase the legibility of this file.
# (Removal of the leading spaces nearly halves the size of the file.)
-# Version 1.04 - 29th May 1999
+# Version 1.05 - 20th July 1999
use strict;
-require 5.004;
+require 5.005;
package Gedcom::Grammar_5_5;
use vars qw($VERSION $grammar);
-$VERSION = "1.04";
+$VERSION = "1.05";
$grammar = bless( {
level => -1,
-file => 'gedcom-5.5.grammar',
children => [
bless( {
-line => 1,
level => -1,
-structure => 'GEDCOM',
+line => 1,
children => [
bless( {
level => '0',
+min => 1,
line => 3,
children => [],
-min => 1,
-value => '<<HEADER>>',
-max => 1
+max => 1,
+value => '<<HEADER>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '0',
+min => '0',
line => 4,
children => [],
-min => '0',
-value => '<<SUBMISSION_RECORD>>',
-max => 1
+max => 1,
+value => '<<SUBMISSION_RECORD>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '0',
+min => '0',
line => 5,
children => [],
-min => '0',
-value => '<<RECORD>>',
-max => 'M'
+max => 'M',
+value => '<<RECORD>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '0',
+min => 1,
line => 6,
children => [],
-min => 1,
-tag => 'TRLR',
-max => 1
+max => 1,
+tag => 'TRLR'
}, 'Gedcom::Grammar' )
-]
+],
+structure => 'GEDCOM'
}, 'Gedcom::Grammar' ),
bless( {
-line => 8,
level => -1,
-structure => 'HEADER',
+line => 8,
children => [
bless( {
level => '0',
+min => 1,
line => 10,
children => [
bless( {
level => '+1',
+min => 1,
line => 11,
children => [
bless( {
level => '+2',
+min => '0',
line => 12,
children => [],
-min => '0',
-tag => 'VERS',
+max => 1,
value => '<VERSION_NUMBER>',
-max => 1
+tag => 'VERS'
}, 'Gedcom::Grammar' ),
bless( {
level => '+2',
+min => '0',
line => 13,
children => [],
-min => '0',
-tag => 'NAME',
+max => 1,
value => '<NAME_OF_PRODUCT>',
-max => 1
+tag => 'NAME'
}, 'Gedcom::Grammar' ),
bless( {
level => '+2',
+min => '0',
line => 14,
children => [
bless( {
level => '+3',
+min => '0',
line => 15,
children => [],
-min => '0',
-value => '<<ADDRESS_STRUCTURE>>',
-max => 1
+max => 1,
+value => '<<ADDRESS_STRUCTURE>>'
}, 'Gedcom::Grammar' )
],
-min => '0',
-tag => 'CORP',
+max => 1,
value => '<NAME_OF_BUSINESS>',
-max => 1
+tag => 'CORP'
}, 'Gedcom::Grammar' ),
bless( {
level => '+2',
+min => '0',
line => 16,
children => [
bless( {
level => '+3',
+min => '0',
line => 17,
children => [],
-min => '0',
-tag => 'DATE',
+max => 1,
value => '<PUBLICATION_DATE>',
-max => 1
+tag => 'DATE'
}, 'Gedcom::Grammar' ),
bless( {
level => '+3',
+min => '0',
line => 18,
children => [],
-min => '0',
-tag => 'COPR',
+max => 1,
value => '<COPYRIGHT_SOURCE_DATA>',
-max => 1
+tag => 'COPR'
}, 'Gedcom::Grammar' )
],
-min => '0',
-tag => 'DATA',
+max => 1,
value => '<NAME_OF_SOURCE_DATA>',
-max => 1
+tag => 'DATA'
}, 'Gedcom::Grammar' )
],
-min => 1,
-tag => 'SOUR',
+max => 1,
value => '<APPROVED_SYSTEM_ID>',
-max => 1
+tag => 'SOUR'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 19,
children => [],
-min => '0',
-tag => 'DEST',
+max => 1,
value => '<RECEIVING_SYSTEM_NAME>',
-max => 1
+tag => 'DEST'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 20,
children => [
bless( {
level => '+2',
+min => '0',
line => 21,
children => [],
-min => '0',
-tag => 'TIME',
+max => 1,
value => '<TIME_VALUE>',
-max => 1
+tag => 'TIME'
}, 'Gedcom::Grammar' )
],
-min => '0',
-tag => 'DATE',
+max => 1,
value => '<TRANSMISSION_DATE>',
-max => 1
+tag => 'DATE'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => 1,
line => 22,
children => [],
-min => 1,
-tag => 'SUBM',
+max => 1,
value => '@<XREF:SUBM>@',
-max => 1
+tag => 'SUBM'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 23,
children => [],
-min => '0',
-tag => 'SUBN',
+max => 1,
value => '@<XREF:SUBN>@',
-max => 1
+tag => 'SUBN'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 24,
children => [],
-min => '0',
-tag => 'FILE',
+max => 1,
value => '<FILE_NAME>',
-max => 1
+tag => 'FILE'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 25,
children => [],
-min => '0',
-tag => 'COPR',
+max => 1,
value => '<COPYRIGHT_GEDCOM_FILE>',
-max => 1
+tag => 'COPR'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => 1,
line => 26,
children => [
bless( {
level => '+2',
+min => 1,
line => 27,
children => [],
-min => 1,
-tag => 'VERS',
+max => 1,
value => '<VERSION_NUMBER>',
-max => 1
+tag => 'VERS'
}, 'Gedcom::Grammar' ),
bless( {
level => '+2',
+min => 1,
line => 28,
children => [],
-min => 1,
-tag => 'FORM',
+max => 1,
value => '<GEDCOM_FORM>',
-max => 1
+tag => 'FORM'
}, 'Gedcom::Grammar' )
],
-min => 1,
-tag => 'GEDC',
-max => 1
+max => 1,
+tag => 'GEDC'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => 1,
line => 29,
children => [
bless( {
level => '+2',
+min => '0',
line => 30,
children => [],
-min => '0',
-tag => 'VERS',
+max => 1,
value => '<VERSION_NUMBER>',
-max => 1
+tag => 'VERS'
}, 'Gedcom::Grammar' )
],
-min => 1,
-tag => 'CHAR',
+max => 1,
value => '<CHARACTER_SET>',
-max => 1
+tag => 'CHAR'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 31,
children => [],
-min => '0',
-tag => 'LANG',
+max => 1,
value => '<LANGUAGE_OF_TEXT>',
-max => 1
+tag => 'LANG'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 32,
children => [
bless( {
level => '+2',
+min => 1,
line => 33,
children => [],
-min => 1,
-tag => 'FORM',
+max => 1,
value => '<PLACE_HIERARCHY>',
-max => 1
+tag => 'FORM'
}, 'Gedcom::Grammar' )
],
-min => '0',
-tag => 'PLAC',
-max => 1
+max => 1,
+tag => 'PLAC'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 34,
children => [
bless( {
level => '+2',
+min => '0',
line => 35,
children => [],
-min => '0',
-tag => 'CONT',
+max => 'M',
value => '<GEDCOM_CONTENT_DESCRIPTION>',
-max => 'M'
+tag => 'CONT'
}, 'Gedcom::Grammar' ),
bless( {
level => '+2',
+min => '0',
line => 36,
children => [],
-min => '0',
-tag => 'CONC',
+max => 'M',
value => '<GEDCOM_CONTENT_DESCRIPTION>',
-max => 'M'
+tag => 'CONC'
}, 'Gedcom::Grammar' )
],
-min => '0',
-tag => 'NOTE',
+max => 1,
value => '<GEDCOM_CONTENT_DESCRIPTION>',
-max => 1
+tag => 'NOTE'
}, 'Gedcom::Grammar' )
],
-min => 1,
-tag => 'HEAD',
-max => 1
+max => 1,
+tag => 'HEAD'
}, 'Gedcom::Grammar' )
-]
+],
+structure => 'HEADER'
}, 'Gedcom::Grammar' ),
bless( {
-line => 39,
level => -1,
-structure => 'RECORD',
+selection => 1,
+line => 39,
children => [
bless( {
level => '0',
+selection => 1,
+min => 1,
line => 41,
children => [],
-min => 1,
-value => '<<FAM_RECORD>>',
-selection => 1,
-max => 1
+max => 1,
+value => '<<FAM_RECORD>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '0',
+selection => 1,
+min => 1,
line => 43,
children => [],
-min => 1,
-value => '<<INDIVIDUAL_RECORD>>',
-selection => 1,
-max => 1
+max => 1,
+value => '<<INDIVIDUAL_RECORD>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '0',
+selection => 1,
+min => 1,
line => 45,
children => [],
-min => 1,
-value => '<<MULTIMEDIA_RECORD>>',
-selection => 1,
-max => 'M'
+max => 'M',
+value => '<<MULTIMEDIA_RECORD>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '0',
+selection => 1,
+min => 1,
line => 47,
children => [],
-min => 1,
-value => '<<NOTE_RECORD>>',
-selection => 1,
-max => 1
+max => 1,
+value => '<<NOTE_RECORD>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '0',
+selection => 1,
+min => 1,
line => 49,
children => [],
-min => 1,
-value => '<<REPOSITORY_RECORD>>',
-selection => 1,
-max => 1
+max => 1,
+value => '<<REPOSITORY_RECORD>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '0',
+selection => 1,
+min => 1,
line => 51,
children => [],
-min => 1,
-value => '<<SOURCE_RECORD>>',
-selection => 1,
-max => 1
+max => 1,
+value => '<<SOURCE_RECORD>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '0',
+selection => 1,
+min => 1,
line => 53,
children => [],
-min => 1,
-value => '<<SUBMITTER_RECORD>>',
-selection => 1,
-max => 1
+max => 1,
+value => '<<SUBMITTER_RECORD>>'
}, 'Gedcom::Grammar' )
],
-selection => 1
+structure => 'RECORD'
}, 'Gedcom::Grammar' ),
bless( {
-line => 56,
level => -1,
-structure => 'FAM_RECORD',
+line => 56,
children => [
bless( {
level => '0',
+min => 1,
line => 58,
children => [
bless( {
level => '+1',
+min => '0',
line => 59,
children => [
bless( {
level => '+2',
+min => '0',
line => 60,
children => [
bless( {
level => '+3',
+min => 1,
line => 61,
children => [],
-min => 1,
-tag => 'AGE',
+max => 1,
value => '<AGE_AT_EVENT>',
-max => 1
+tag => 'AGE'
}, 'Gedcom::Grammar' )
],
-min => '0',
-tag => 'HUSB',
-max => 1
+max => 1,
+tag => 'HUSB'
}, 'Gedcom::Grammar' ),
bless( {
level => '+2',
+min => '0',
line => 62,
children => [
bless( {
level => '+3',
+min => 1,
line => 63,
children => [],
-min => 1,
-tag => 'AGE',
+max => 1,
value => '<AGE_AT_EVENT>',
-max => 1
+tag => 'AGE'
}, 'Gedcom::Grammar' )
],
-min => '0',
-tag => 'WIFE',
-max => 1
+max => 1,
+tag => 'WIFE'
}, 'Gedcom::Grammar' )
],
-min => '0',
-value => '<<FAMILY_EVENT_STRUCTURE>>',
-max => 'M'
+max => 'M',
+value => '<<FAMILY_EVENT_STRUCTURE>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 64,
children => [],
-min => '0',
-tag => 'HUSB',
+max => 1,
value => '@<XREF:INDI>@',
-max => 1
+tag => 'HUSB'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 65,
children => [],
-min => '0',
-tag => 'WIFE',
+max => 1,
value => '@<XREF:INDI>@',
-max => 1
+tag => 'WIFE'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 66,
children => [],
-min => '0',
-tag => 'CHIL',
+max => 'M',
value => '@<XREF:INDI>@',
-max => 'M'
+tag => 'CHIL'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 67,
children => [],
-min => '0',
-tag => 'NCHI',
+max => 1,
value => '<COUNT_OF_CHILDREN>',
-max => 1
+tag => 'NCHI'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 68,
children => [],
-min => '0',
-tag => 'SUBM',
+max => 'M',
value => '@<XREF:SUBM>@',
-max => 'M'
+tag => 'SUBM'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 69,
children => [],
-min => '0',
-value => '<<LDS_SPOUSE_SEALING>>',
-max => 'M'
+max => 'M',
+value => '<<LDS_SPOUSE_SEALING>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 70,
children => [],
-min => '0',
-value => '<<SOURCE_CITATION>>',
-max => 'M'
+max => 'M',
+value => '<<SOURCE_CITATION>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 71,
children => [],
-min => '0',
-value => '<<MULTIMEDIA_LINK>>',
-max => 'M'
+max => 'M',
+value => '<<MULTIMEDIA_LINK>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 72,
children => [],
-min => '0',
-value => '<<NOTE_STRUCTURE>>',
-max => 'M'
+max => 'M',
+value => '<<NOTE_STRUCTURE>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 73,
children => [
bless( {
level => '+2',
+min => '0',
line => 74,
children => [],
-min => '0',
-tag => 'TYPE',
+max => 1,
value => '<USER_REFERENCE_TYPE>',
-max => 1
+tag => 'TYPE'
}, 'Gedcom::Grammar' )
],
-min => '0',
-tag => 'REFN',
+max => 'M',
value => '<USER_REFERENCE_NUMBER>',
-max => 'M'
+tag => 'REFN'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 75,
children => [],
-min => '0',
-tag => 'RIN',
+max => 1,
value => '<AUTOMATED_RECORD_ID>',
-max => 1
+tag => 'RIN'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 76,
children => [],
-min => '0',
-value => '<<CHANGE_DATE>>',
-max => 1
+max => 1,
+value => '<<CHANGE_DATE>>'
}, 'Gedcom::Grammar' )
],
-min => 1,
-tag => 'FAM',
+max => 1,
xref => '@<XREF:FAM>@',
-max => 1
+tag => 'FAM'
}, 'Gedcom::Grammar' )
-]
+],
+structure => 'FAM_RECORD'
}, 'Gedcom::Grammar' ),
bless( {
-line => 79,
level => -1,
-structure => 'INDIVIDUAL_RECORD',
+line => 79,
children => [
bless( {
level => '0',
+min => 1,
line => 81,
children => [
bless( {
level => '+1',
+min => '0',
line => 82,
children => [],
-min => '0',
-tag => 'RESN',
+max => 1,
value => '<RESTRICTION_NOTICE>',
-max => 1
+tag => 'RESN'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 83,
children => [],
-min => '0',
-value => '<<PERSONAL_NAME_STRUCTURE>>',
-max => 'M'
+max => 'M',
+value => '<<PERSONAL_NAME_STRUCTURE>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 84,
children => [],
-min => '0',
-tag => 'SEX',
+max => 1,
value => '<SEX_VALUE>',
-max => 1
+tag => 'SEX'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 85,
children => [],
-min => '0',
-value => '<<INDIVIDUAL_EVENT_STRUCTURE>>',
-max => 'M'
+max => 'M',
+value => '<<INDIVIDUAL_EVENT_STRUCTURE>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 86,
children => [],
-min => '0',
-value => '<<INDIVIDUAL_ATTRIBUTE_STRUCTURE>>',
-max => 'M'
+max => 'M',
+value => '<<INDIVIDUAL_ATTRIBUTE_STRUCTURE>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 87,
children => [],
-min => '0',
-value => '<<LDS_INDIVIDUAL_ORDINANCE>>',
-max => 'M'
+max => 'M',
+value => '<<LDS_INDIVIDUAL_ORDINANCE>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 88,
children => [],
-min => '0',
-value => '<<CHILD_TO_FAMILY_LINK>>',
-max => 'M'
+max => 'M',
+value => '<<CHILD_TO_FAMILY_LINK>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 89,
children => [],
-min => '0',
-value => '<<SPOUSE_TO_FAMILY_LINK>>',
-max => 'M'
+max => 'M',
+value => '<<SPOUSE_TO_FAMILY_LINK>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 90,
children => [],
-min => '0',
-tag => 'SUBM',
+max => 'M',
value => '@<XREF:SUBM>@',
-max => 'M'
+tag => 'SUBM'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 91,
children => [],
-min => '0',
-value => '<<ASSOCIATION_STRUCTURE>>',
-max => 'M'
+max => 'M',
+value => '<<ASSOCIATION_STRUCTURE>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 92,
children => [],
-min => '0',
-tag => 'ALIA',
+max => 'M',
value => '@<XREF:INDI>@',
-max => 'M'
+tag => 'ALIA'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 93,
children => [],
-min => '0',
-tag => 'ANCI',
+max => 'M',
value => '@<XREF:SUBM>@',
-max => 'M'
+tag => 'ANCI'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 94,
children => [],
-min => '0',
-tag => 'DESI',
+max => 'M',
value => '@<XREF:SUBM>@',
-max => 'M'
+tag => 'DESI'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 95,
children => [],
-min => '0',
-value => '<<SOURCE_CITATION>>',
-max => 'M'
+max => 'M',
+value => '<<SOURCE_CITATION>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 96,
children => [],
-min => '0',
-value => '<<MULTIMEDIA_LINK>>',
-max => 'M'
+max => 'M',
+value => '<<MULTIMEDIA_LINK>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 97,
children => [],
-min => '0',
-value => '<<NOTE_STRUCTURE>>',
-max => 'M'
+max => 'M',
+value => '<<NOTE_STRUCTURE>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 98,
children => [],
-min => '0',
-tag => 'RFN',
+max => 1,
value => '<PERMANENT_RECORD_FILE_NUMBER>',
-max => 1
+tag => 'RFN'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 99,
children => [],
-min => '0',
-tag => 'AFN',
+max => 1,
value => '<ANCESTRAL_FILE_NUMBER>',
-max => 1
+tag => 'AFN'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 100,
children => [
bless( {
level => '+2',
+min => '0',
line => 101,
children => [],
-min => '0',
-tag => 'TYPE',
+max => 1,
value => '<USER_REFERENCE_TYPE>',
-max => 1
+tag => 'TYPE'
}, 'Gedcom::Grammar' )
],
-min => '0',
-tag => 'REFN',
+max => 'M',
value => '<USER_REFERENCE_NUMBER>',
-max => 'M'
+tag => 'REFN'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 102,
children => [],
-min => '0',
-tag => 'RIN',
+max => 1,
value => '<AUTOMATED_RECORD_ID>',
-max => 1
+tag => 'RIN'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 103,
children => [],
-min => '0',
-value => '<<CHANGE_DATE>>',
-max => 1
+max => 1,
+value => '<<CHANGE_DATE>>'
}, 'Gedcom::Grammar' )
],
-min => 1,
-tag => 'INDI',
+max => 1,
xref => '@<XREF:INDI>@',
-max => 1
+tag => 'INDI'
}, 'Gedcom::Grammar' )
-]
+],
+structure => 'INDIVIDUAL_RECORD'
}, 'Gedcom::Grammar' ),
bless( {
-line => 106,
level => -1,
-structure => 'MULTIMEDIA_RECORD',
+line => 106,
children => [
bless( {
level => '0',
+min => 1,
line => 108,
children => [
bless( {
level => '+1',
+min => 1,
line => 109,
children => [],
-min => 1,
-tag => 'FORM',
+max => 1,
value => '<MULTIMEDIA_FORMAT>',
-max => 1
+tag => 'FORM'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 110,
children => [],
-min => '0',
-tag => 'TITL',
+max => 1,
value => '<DESCRIPTIVE_TITLE>',
-max => 1
+tag => 'TITL'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 111,
children => [],
-min => '0',
-value => '<<NOTE_STRUCTURE>>',
-max => 'M'
+max => 'M',
+value => '<<NOTE_STRUCTURE>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => 1,
line => 112,
children => [
bless( {
level => '+2',
+min => 1,
line => 113,
children => [],
-min => 1,
-tag => 'CONT',
+max => 'M',
value => '<ENCODED_MULTIMEDIA_LINE>',
-max => 'M'
+tag => 'CONT'
}, 'Gedcom::Grammar' )
],
-min => 1,
-tag => 'BLOB',
-max => 1
+max => 1,
+tag => 'BLOB'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 114,
children => [],
-min => '0',
-tag => 'OBJE',
+max => 1,
value => '@<XREF:OBJE>@',
-max => 1
+tag => 'OBJE'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 115,
children => [
bless( {
level => '+2',
+min => '0',
line => 116,
children => [],
-min => '0',
-tag => 'TYPE',
+max => 1,
value => '<USER_REFERENCE_TYPE>',
-max => 1
+tag => 'TYPE'
}, 'Gedcom::Grammar' )
],
-min => '0',
-tag => 'REFN',
+max => 'M',
value => '<USER_REFERENCE_NUMBER>',
-max => 'M'
+tag => 'REFN'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 117,
children => [],
-min => '0',
-tag => 'RIN',
+max => 1,
value => '<AUTOMATED_RECORD_ID>',
-max => 1
+tag => 'RIN'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 118,
children => [],
-min => '0',
-value => '<<CHANGE_DATE>>',
-max => 1
+max => 1,
+value => '<<CHANGE_DATE>>'
}, 'Gedcom::Grammar' )
],
-min => 1,
-tag => 'OBJE',
+max => 1,
xref => '@<XREF:OBJE>@',
-max => 1
+tag => 'OBJE'
}, 'Gedcom::Grammar' )
-]
+],
+structure => 'MULTIMEDIA_RECORD'
}, 'Gedcom::Grammar' ),
bless( {
-line => 121,
level => -1,
-structure => 'NOTE_RECORD',
+line => 121,
children => [
bless( {
+level => '0',
min => 1,
-xref => '@<XREF:NOTE>@',
-max => 1,
line => 123,
-level => '0',
children => [
bless( {
level => '+1',
+min => '0',
line => 124,
children => [],
-min => '0',
-tag => 'CONC',
+max => 'M',
value => '<SUBMITTER_TEXT>',
-max => 'M'
+tag => 'CONC'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 125,
children => [],
-min => '0',
-tag => 'CONT',
+max => 'M',
value => '<SUBMITTER_TEXT>',
-max => 'M'
+tag => 'CONT'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 126,
children => [],
-min => '0',
-value => '<<SOURCE_CITATION>>',
-max => 'M'
+max => 'M',
+value => '<<SOURCE_CITATION>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 127,
children => [
bless( {
level => '+2',
+min => '0',
line => 128,
children => [],
-min => '0',
-tag => 'TYPE',
+max => 1,
value => '<USER_REFERENCE_TYPE>',
-max => 1
+tag => 'TYPE'
}, 'Gedcom::Grammar' )
],
-min => '0',
-tag => 'REFN',
+max => 'M',
value => '<USER_REFERENCE_NUMBER>',
-max => 'M'
+tag => 'REFN'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 129,
children => [],
-min => '0',
-tag => 'RIN',
+max => 1,
value => '<AUTOMATED_RECORD_ID>',
-max => 1
+tag => 'RIN'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 130,
children => [],
-min => '0',
-value => '<<CHANGE_DATE>>',
-max => 1
+max => 1,
+value => '<<CHANGE_DATE>>'
}, 'Gedcom::Grammar' )
],
-tag => 'NOTE',
-value => '<SUBMITTER_TEXT>'
+max => 1,
+xref => '@<XREF:NOTE>@',
+value => '<SUBMITTER_TEXT>',
+tag => 'NOTE'
}, 'Gedcom::Grammar' )
-]
+],
+structure => 'NOTE_RECORD'
}, 'Gedcom::Grammar' ),
bless( {
-line => 133,
level => -1,
-structure => 'REPOSITORY_RECORD',
+line => 133,
children => [
bless( {
level => '0',
+min => 1,
line => 135,
children => [
bless( {
level => '+1',
+min => '0',
line => 136,
children => [],
-min => '0',
-tag => 'NAME',
+max => 1,
value => '<NAME_OF_REPOSITORY>',
-max => 1
+tag => 'NAME'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 137,
children => [],
-min => '0',
-value => '<<ADDRESS_STRUCTURE>>',
-max => 1
+max => 1,
+value => '<<ADDRESS_STRUCTURE>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 138,
children => [],
-min => '0',
-value => '<<NOTE_STRUCTURE>>',
-max => 'M'
+max => 'M',
+value => '<<NOTE_STRUCTURE>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 139,
children => [
bless( {
level => '+2',
+min => '0',
line => 140,
children => [],
-min => '0',
-tag => 'TYPE',
+max => 1,
value => '<USER_REFERENCE_TYPE>',
-max => 1
+tag => 'TYPE'
}, 'Gedcom::Grammar' )
],
-min => '0',
-tag => 'REFN',
+max => 'M',
value => '<USER_REFERENCE_NUMBER>',
-max => 'M'
+tag => 'REFN'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 141,
children => [],
-min => '0',
-tag => 'RIN',
+max => 1,
value => '<AUTOMATED_RECORD_ID>',
-max => 1
+tag => 'RIN'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 142,
children => [],
-min => '0',
-value => '<<CHANGE_DATE>>',
-max => 1
+max => 1,
+value => '<<CHANGE_DATE>>'
}, 'Gedcom::Grammar' )
],
-min => 1,
-tag => 'REPO',
+max => 1,
xref => '@<XREF:REPO>@',
-max => 1
+tag => 'REPO'
}, 'Gedcom::Grammar' )
-]
+],
+structure => 'REPOSITORY_RECORD'
}, 'Gedcom::Grammar' ),
bless( {
-line => 145,
level => -1,
-structure => 'SOURCE_RECORD',
+line => 145,
children => [
bless( {
level => '0',
+min => 1,
line => 147,
children => [
bless( {
level => '+1',
+min => '0',
line => 148,
children => [
bless( {
level => '+2',
+min => '0',
line => 149,
children => [
bless( {
level => '+3',
+min => '0',
line => 150,
children => [],
-min => '0',
-tag => 'DATE',
+max => 1,
value => '<DATE_PERIOD>',
-max => 1
+tag => 'DATE'
}, 'Gedcom::Grammar' ),
bless( {
level => '+3',
+min => '0',
line => 151,
children => [],
-min => '0',
-tag => 'PLAC',
+max => 1,
value => '<SOURCE_JURISDICTION_PLACE>',
-max => 1
+tag => 'PLAC'
}, 'Gedcom::Grammar' )
],
-min => '0',
-tag => 'EVEN',
+max => 'M',
value => '<EVENTS_RECORDED>',
-max => 'M'
+tag => 'EVEN'
}, 'Gedcom::Grammar' ),
bless( {
level => '+2',
+min => '0',
line => 152,
children => [],
-min => '0',
-tag => 'AGNC',
+max => 1,
value => '<RESPONSIBLE_AGENCY>',
-max => 1
+tag => 'AGNC'
}, 'Gedcom::Grammar' ),
bless( {
level => '+2',
+min => '0',
line => 153,
children => [],
-min => '0',
-value => '<<NOTE_STRUCTURE>>',
-max => 'M'
+max => 'M',
+value => '<<NOTE_STRUCTURE>>'
}, 'Gedcom::Grammar' )
],
-min => '0',
-tag => 'DATA',
-max => 1
+max => 1,
+tag => 'DATA'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 154,
children => [
bless( {
level => '+2',
+min => '0',
line => 155,
children => [],
-min => '0',
-tag => 'CONT',
+max => 'M',
value => '<SOURCE_ORIGINATOR>',
-max => 'M'
+tag => 'CONT'
}, 'Gedcom::Grammar' ),
bless( {
level => '+2',
+min => '0',
line => 156,
children => [],
-min => '0',
-tag => 'CONC',
+max => 'M',
value => '<SOURCE_ORIGINATOR>',
-max => 'M'
+tag => 'CONC'
}, 'Gedcom::Grammar' )
],
-min => '0',
-tag => 'AUTH',
+max => 1,
value => '<SOURCE_ORIGINATOR>',
-max => 1
+tag => 'AUTH'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 157,
children => [
bless( {
level => '+2',
+min => '0',
line => 158,
children => [],
-min => '0',
-tag => 'CONT',
+max => 'M',
value => '<SOURCE_DESCRIPTIVE_TITLE>',
-max => 'M'
+tag => 'CONT'
}, 'Gedcom::Grammar' ),
bless( {
level => '+2',
+min => '0',
line => 159,
children => [],
-min => '0',
-tag => 'CONC',
+max => 'M',
value => '<SOURCE_DESCRIPTIVE_TITLE>',
-max => 'M'
+tag => 'CONC'
}, 'Gedcom::Grammar' )
],
-min => '0',
-tag => 'TITL',
+max => 1,
value => '<SOURCE_DESCRIPTIVE_TITLE>',
-max => 1
+tag => 'TITL'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 160,
children => [],
-min => '0',
-tag => 'ABBR',
+max => 1,
value => '<SOURCE_FILED_BY_ENTRY>',
-max => 1
+tag => 'ABBR'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 161,
children => [
bless( {
level => '+2',
+min => '0',
line => 162,
children => [],
-min => '0',
-tag => 'CONT',
+max => 'M',
value => '<SOURCE_PUBLICATION_FACTS>',
-max => 'M'
+tag => 'CONT'
}, 'Gedcom::Grammar' ),
bless( {
level => '+2',
+min => '0',
line => 163,
children => [],
-min => '0',
-tag => 'CONC',
+max => 'M',
value => '<SOURCE_PUBLICATION_FACTS>',
-max => 'M'
+tag => 'CONC'
}, 'Gedcom::Grammar' )
],
-min => '0',
-tag => 'PUBL',
+max => 1,
value => '<SOURCE_PUBLICATION_FACTS>',
-max => 1
+tag => 'PUBL'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 164,
children => [
bless( {
level => '+2',
+min => '0',
line => 165,
children => [],
-min => '0',
-tag => 'CONT',
+max => 'M',
value => '<TEXT_FROM_SOURCE>',
-max => 'M'
+tag => 'CONT'
}, 'Gedcom::Grammar' ),
bless( {
level => '+2',
+min => '0',
line => 166,
children => [],
-min => '0',
-tag => 'CONC',
+max => 'M',
value => '<TEXT_FROM_SOURCE>',
-max => 'M'
+tag => 'CONC'
}, 'Gedcom::Grammar' )
],
-min => '0',
-tag => 'TEXT',
+max => 1,
value => '<TEXT_FROM_SOURCE>',
-max => 1
+tag => 'TEXT'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 167,
children => [],
-min => '0',
-value => '<<SOURCE_REPOSITORY_CITATION>>',
-max => 1
+max => 1,
+value => '<<SOURCE_REPOSITORY_CITATION>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 168,
children => [],
-min => '0',
-value => '<<MULTIMEDIA_LINK>>',
-max => 'M'
+max => 'M',
+value => '<<MULTIMEDIA_LINK>>'
}, 'Gedcom::Grammar' ),
bless( {
level => '+1',
+min => '0',
line => 169,
children => [],
-min => '0',