gedcom 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. data/History.txt +4 -0
  2. data/Manifest.txt +74 -0
  3. data/README.txt +129 -0
  4. data/Rakefile +13 -0
  5. data/lib/gedcom.rb +105 -0
  6. data/lib/gedcom/address_record.rb +77 -0
  7. data/lib/gedcom/adoption_record.rb +57 -0
  8. data/lib/gedcom/association_record.rb +79 -0
  9. data/lib/gedcom/cause_record.rb +45 -0
  10. data/lib/gedcom/change_date_record.rb +39 -0
  11. data/lib/gedcom/character_set_record.rb +41 -0
  12. data/lib/gedcom/citation_data_record.rb +49 -0
  13. data/lib/gedcom/citation_event_type_record.rb +42 -0
  14. data/lib/gedcom/corporate_record.rb +36 -0
  15. data/lib/gedcom/date_record.rb +206 -0
  16. data/lib/gedcom/encoded_line_record.rb +34 -0
  17. data/lib/gedcom/event_age_record.rb +36 -0
  18. data/lib/gedcom/event_record.rb +258 -0
  19. data/lib/gedcom/events_list_record.rb +61 -0
  20. data/lib/gedcom/families_individuals.rb +79 -0
  21. data/lib/gedcom/family_record.rb +89 -0
  22. data/lib/gedcom/gedcom_all.rb +41 -0
  23. data/lib/gedcom/gedcom_base.rb +337 -0
  24. data/lib/gedcom/gedcom_record.rb +44 -0
  25. data/lib/gedcom/header_data_record.rb +49 -0
  26. data/lib/gedcom/header_record.rb +75 -0
  27. data/lib/gedcom/header_source_record.rb +42 -0
  28. data/lib/gedcom/individual_attribute_record.rb +86 -0
  29. data/lib/gedcom/individual_record.rb +128 -0
  30. data/lib/gedcom/multimedia_citation_record.rb +55 -0
  31. data/lib/gedcom/multimedia_record.rb +72 -0
  32. data/lib/gedcom/name_record.rb +58 -0
  33. data/lib/gedcom/note_citation_record.rb +37 -0
  34. data/lib/gedcom/note_record.rb +61 -0
  35. data/lib/gedcom/place_record.rb +46 -0
  36. data/lib/gedcom/refn_record.rb +32 -0
  37. data/lib/gedcom/repository_caln.rb +33 -0
  38. data/lib/gedcom/repository_citation_record.rb +43 -0
  39. data/lib/gedcom/repository_record.rb +41 -0
  40. data/lib/gedcom/source_citation_record.rb +74 -0
  41. data/lib/gedcom/source_record.rb +84 -0
  42. data/lib/gedcom/source_scope_record.rb +35 -0
  43. data/lib/gedcom/submission_record.rb +53 -0
  44. data/lib/gedcom/submitter_record.rb +53 -0
  45. data/lib/gedcom/text_record.rb +31 -0
  46. data/lib/gedcom/trailer_record.rb +22 -0
  47. data/lib/gedcom/transmission.rb +103 -0
  48. data/lib/gedcom/transmission_base.rb +267 -0
  49. data/lib/parser/class_tracker.rb +33 -0
  50. data/lib/parser/ged_line.rb +99 -0
  51. data/lib/parser/gedcom_parser.rb +798 -0
  52. data/lib/parser/instruction.rb +14 -0
  53. data/lib/parser/parse_state.rb +49 -0
  54. data/test/test_gedcom.rb +7 -0
  55. data/test_data/Document.RTF +1 -0
  56. data/test_data/Document.tex +1 -0
  57. data/test_data/ImgFile.BMP +0 -0
  58. data/test_data/ImgFile.GIF +0 -0
  59. data/test_data/ImgFile.JPG +0 -0
  60. data/test_data/ImgFile.MAC +0 -0
  61. data/test_data/ImgFile.PCX +0 -0
  62. data/test_data/ImgFile.PIC +0 -0
  63. data/test_data/ImgFile.PNG +0 -0
  64. data/test_data/ImgFile.PSD +0 -0
  65. data/test_data/ImgFile.TGA +0 -0
  66. data/test_data/ImgFile.TIF +0 -0
  67. data/test_data/README.txt +1 -16
  68. data/test_data/TGC551.ged +1 -0
  69. data/test_data/TGC551LF.ged +2162 -0
  70. data/test_data/TGC55C.ged +1 -0
  71. data/test_data/TGC55CLF.ged +2202 -0
  72. data/test_data/force.wav +0 -0
  73. data/test_data/suntun.mov +0 -0
  74. data/test_data/top.mpg +0 -0
  75. metadata +140 -0
@@ -0,0 +1,4 @@
1
+ === 0.9.0 / 2009-03-14
2
+
3
+ * transcription of code from original Rails source base.
4
+
@@ -0,0 +1,74 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ lib/gedcom/address_record.rb
6
+ lib/gedcom/adoption_record.rb
7
+ lib/gedcom/cause_record.rb
8
+ lib/gedcom/change_date_record.rb
9
+ lib/gedcom/character_set_record.rb
10
+ lib/gedcom/citation_data_record.rb
11
+ lib/gedcom/citation_event_type_record.rb
12
+ lib/gedcom/corporate_record.rb
13
+ lib/gedcom/date_record.rb
14
+ lib/gedcom/encoded_line_record.rb
15
+ lib/gedcom/event_age_record.rb
16
+ lib/gedcom/event_record.rb
17
+ lib/gedcom/events_list_record.rb
18
+ lib/gedcom/families_individuals.rb
19
+ lib/gedcom/family_record.rb
20
+ lib/gedcom/gedcom_all.rb
21
+ lib/gedcom/gedcom_base.rb
22
+ lib/gedcom/gedcom_record.rb
23
+ lib/gedcom/header_data_record.rb
24
+ lib/gedcom/header_record.rb
25
+ lib/gedcom/header_source_record.rb
26
+ lib/gedcom/individual_attribute_record.rb
27
+ lib/gedcom/individual_record.rb
28
+ lib/gedcom/association_record.rb
29
+ lib/gedcom/multimedia_citation_record.rb
30
+ lib/gedcom/multimedia_record.rb
31
+ lib/gedcom/name_record.rb
32
+ lib/gedcom/note_citation_record.rb
33
+ lib/gedcom/note_record.rb
34
+ lib/gedcom/place_record.rb
35
+ lib/gedcom/refn_record.rb
36
+ lib/gedcom/repository_caln.rb
37
+ lib/gedcom/repository_citation_record.rb
38
+ lib/gedcom/repository_record.rb
39
+ lib/gedcom/source_citation_record.rb
40
+ lib/gedcom/source_record.rb
41
+ lib/gedcom/source_scope_record.rb
42
+ lib/gedcom/submission_record.rb
43
+ lib/gedcom/submitter_record.rb
44
+ lib/gedcom/text_record.rb
45
+ lib/gedcom/trailer_record.rb
46
+ lib/gedcom/transmission.rb
47
+ lib/gedcom/transmission_base.rb
48
+ lib/gedcom.rb
49
+ lib/parser/class_tracker.rb
50
+ lib/parser/ged_line.rb
51
+ lib/parser/gedcom_parser.rb
52
+ lib/parser/instruction.rb
53
+ lib/parser/parse_state.rb
54
+ test/test_gedcom.rb
55
+ test_data/Document.RTF
56
+ test_data/Document.tex
57
+ test_data/ImgFile.BMP
58
+ test_data/ImgFile.GIF
59
+ test_data/ImgFile.JPG
60
+ test_data/ImgFile.MAC
61
+ test_data/ImgFile.PCX
62
+ test_data/ImgFile.PIC
63
+ test_data/ImgFile.PNG
64
+ test_data/ImgFile.PSD
65
+ test_data/ImgFile.TGA
66
+ test_data/ImgFile.TIF
67
+ test_data/README.txt
68
+ test_data/TGC551.ged
69
+ test_data/TGC551LF.ged
70
+ test_data/TGC55C.ged
71
+ test_data/TGC55CLF.ged
72
+ test_data/force.wav
73
+ test_data/suntun.mov
74
+ test_data/top.mpg
@@ -0,0 +1,129 @@
1
+ = gedcom
2
+
3
+ * http://rubyforge.org/projects/gedcom/
4
+
5
+ == DESCRIPTION:
6
+
7
+ A Ruby GEDCOM text file parser and producer, that produces a tree of objects from each of the
8
+ GEDCOM file types and subtypes. Understands the full GEDCOM 5.5.1 grammar, and will handle
9
+ unknown tags hierarchies as a Note class.
10
+
11
+
12
+ == FEATURES/PROBLEMS:
13
+
14
+ * Gedcom multicharacter ANSEL encoding is currently not understood when reading and writing, but is preserved if the file is opened as ASCII-8BIT.
15
+ * CR line termination causes issues for systems with native LF line termination (CRLF is fine).
16
+ * Dates are currently just strings, but I want to parse these and test their validatity.
17
+ This is not as easy as it may seem at first, as dates may be in many formats,
18
+ they may be partial, or may actually be strings decribing the date.
19
+ * For my own use, I bend the GEDCOM 5.5 standard by allowing the reading of the following types in non-standard ways.
20
+ These will not affect the reading and writing of valid GEDCOM 5.5.
21
+ * * 'NOTE' type to appear in places it is not defined to exist in GEDCOM.
22
+ This is necessary in order to be able to convert user defined tags into NOTE records.
23
+ * * 'RESN' type to appear in places it is not defined to exist in GEDCOM.
24
+ I wanted to be able to mark any record as restricted.
25
+ * * 'SUBM' type to appear in 'EVEN' records.
26
+ I wanted to be able to track where I got the event information from.
27
+ * * 'SEX' type to appear multiple times in an 'INDI' record,
28
+ as a person's sex can now be changed.
29
+ * * 'SEX' type to allow more than 'M', 'F' and 'U',
30
+ to allow for the XXY, XXXY and X and other genetic anomolies associated with gender.
31
+ * * 'NAME' type allows event details ( eg 'DATE') ,
32
+ as names changes are events, not just an attribute.
33
+ * * 'ADDR' type allows a 'TYPE' entry
34
+ to qualify what the address is for (e.g. home, work, ...) .
35
+ * User defined tags are converted to the NOTE type, with sublevels being CONT lines.
36
+ These are recognised as any tag starting with '_'.
37
+ * Haven't yet merged in the code to pretty print a family tree.
38
+ * Want to add a merge option, to take multiple transmission and make a single one from them.
39
+ * save/load (to/from a database) is yet to be ported. GedcomBase#to_db is a dummy function.
40
+
41
+ == SYNOPSIS:
42
+
43
+ require 'gedcom'
44
+
45
+ puts "parse TGC551LF.ged"
46
+ g = Gedcom.file("../test_data/TGC551LF.ged", "r:ASCII-8BIT") #OK with LF line endings.
47
+ g.transmissions[0].summary
48
+ puts
49
+ puts "parse TGC55CLF.ged"
50
+ g.file("../test_data/TGC55CLF.ged", "r:ASCII-8BIT") #Ok with CR LF line endings.
51
+ g.transmissions[1].summary
52
+
53
+
54
+ #print the parsed file to see if it matches the source file.
55
+ #Note CONT and CONC breaks may end up in different places
56
+ #Note Order of TAGS at the same level may be different
57
+ #Note User TAGS are output as Notes.
58
+ File.open( "../test_data/TGC551LF.out", "w:ASCII-8BIT") do |file|
59
+ file.print g.transmissions[0].to_gedcom
60
+ end
61
+ File.open( "../test_data/TGC55CLF.out", "w:ASCII-8BIT") do |file|
62
+ file.print g.transmissions[1].to_gedcom
63
+ end
64
+ puts "\nComplete"
65
+
66
+
67
+ == REQUIREMENTS:
68
+
69
+ * require 'rubygems'
70
+
71
+ == INSTALL:
72
+
73
+ * sudo gem install gedcom
74
+
75
+ == LICENSE:
76
+
77
+ Distributed under the Ruby License.
78
+
79
+ Copyright (c) 2009
80
+
81
+ 1. You may make and give away verbatim copies of the source form of the
82
+ software without restriction, provided that you duplicate all of the
83
+ original copyright notices and associated disclaimers.
84
+
85
+ 2. You may modify your copy of the software in any way, provided that
86
+ you do at least ONE of the following:
87
+
88
+ a) place your modifications in the Public Domain or otherwise
89
+ make them Freely Available, such as by posting said
90
+ modifications to Usenet or an equivalent medium, or by allowing
91
+ the author to include your modifications in the software.
92
+
93
+ b) use the modified software only within your corporation or
94
+ organization.
95
+
96
+ c) rename any non-standard executables so the names do not conflict
97
+ with standard executables, which must also be provided.
98
+
99
+ d) make other distribution arrangements with the author.
100
+
101
+ 3. You may distribute the software in object code or executable
102
+ form, provided that you do at least ONE of the following:
103
+
104
+ a) distribute the executables and library files of the software,
105
+ together with instructions (in the manual page or equivalent)
106
+ on where to get the original distribution.
107
+
108
+ b) accompany the distribution with the machine-readable source of
109
+ the software.
110
+
111
+ c) give non-standard executables non-standard names, with
112
+ instructions on where to get the original software distribution.
113
+
114
+ d) make other distribution arrangements with the author.
115
+
116
+ 4. You may modify and include the part of the software into any other
117
+ software (possibly commercial). But some files in the distribution
118
+ may not written by the author, so that they are not under this terms.
119
+
120
+ 5. The scripts and library files supplied as input to or produced as
121
+ output from the software do not automatically fall under the
122
+ copyright of the software, but belong to whomever generated them,
123
+ and may be sold commercially, and may be aggregated with this
124
+ software.
125
+
126
+ 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
127
+ IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
128
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
129
+ PURPOSE.
@@ -0,0 +1,13 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require 'lib/gedcom.rb'
6
+
7
+ Hoe.new('gedcom', Gedcom::VERSION) do |p|
8
+ p.rubyforge_name = "gedcom"
9
+ p.developer( "Rob Burrowes","rob@burrowes.org")
10
+ p.remote_rdoc_dir = '' # Release to root
11
+ end
12
+
13
+ # vim: syntax=Ruby
@@ -0,0 +1,105 @@
1
+ #Gedcom class holds an array of GEDCOM transmissions (that is parsed GEDCOM files)
2
+ #Each transmission relates to the loading of a GEDCOM text file, parsing it into
3
+ #a tree, starting with a Transmission class at its root. Within the Transmission
4
+ #class are arrays for each of the level 0 GEDCOM record types of these classes:
5
+ # * Header_record
6
+ # * Submission_record
7
+ # * Submitter_record
8
+ # * Individual_record
9
+ # * Family_record
10
+ # * Source_record
11
+ # * Repository_record
12
+ # * Multimedia_record
13
+ # * Note_record
14
+ # * Trailer_record
15
+ #
16
+ #Each of these classes has arrays for each of the Level 1 Gedcom records types
17
+ #associated with the Level 0 type. Some of these are attributes, that is they contain
18
+ #the actual data, while others are classes that contain attributes and/or classes
19
+ #e.g. an Individual_record class object could have any or all of these:
20
+ #
21
+ # * individual_ref ( that is individual_ref = 'I42' if the GEDCOM line is '0 INDI @I42@')
22
+ # Then 1 level down it is possible to get local attributes for this object
23
+ # * restriction (from the GEDCOM "1 RESN restriction_value" )
24
+ # * registered_ref_id (from the GEDCOM "1 RFN registered_ref_id" )
25
+ # * lds_ancestral_file_no (from the GEDCOM "1 AFN lds_ancestral_file_no" )
26
+ # * automated_record_id (from the GEDCOM "1 RIN automated_record_id" )
27
+ # Also arrays of classes may exist for these:
28
+ # * Name_record (from the GEDCOM "1 NAME ..." )
29
+ # * Individual_attribute_record (from the GEDCOM "1 [SEX | TITL | ... ] ...")
30
+ # * Event_record (from the GEDCOM "1 [BIRT | DEAT | ... ] ... ")
31
+ # * Families_individuals (from the GEDCOM "1 [FAMC | FAMS] ...")
32
+ # * Individuals_individuals (from the GEDCOM "1 [ANCI | DESO | ASSO] ...")
33
+ # * Multimedia_citation_record (from the GEDCOM "1 OBJE ...")
34
+ # * Source_citation_record (from the GEDCOM "1 SOUR ...")
35
+ # * Note_citation_record (from the GEDCOM "1 NOTE ...")
36
+ # * Refn_record (from the GEDCOM "1 REFN ...")
37
+ # * Change_date_record (from the GEDCOM "1 CHAN ...")
38
+ # And References to other record types:
39
+ # * alias_ref (from the GEDCOM "1 ALIA alias_ref" )
40
+ # * submitter_ref (from the GEDCOM "1 SUBM submitter_ref" )
41
+ #
42
+ # Below say an Event object in an Individual_record object, you could get further arrays of
43
+ # attributes and other objects holding further levels of the GEDCOM hierarchy.
44
+ #
45
+ #These can all be seen in the TAGS hash in parser/gedcom_parser.rb, which defines
46
+ #what TAGS are valid when, and what action to take when a particular tag is encountered
47
+ #in the input stream.
48
+ #
49
+ #The reverse, that is the conversion back to GEDCOM format is not a simple reversal of the
50
+ #TAGS entries. The generation of GEDCOM from the objects is done recursively, by calling the
51
+ #objects to_gedcom() method. This can occur at any level, from Transmission downward.
52
+ #
53
+
54
+ def path(s,fs='/')
55
+ last_fs = s.rindex(fs)
56
+ last_fs ? s[0..last_fs] : ""
57
+ end
58
+
59
+ $: << "#{path(__FILE__)}gedcom"
60
+ $: << "#{path(__FILE__)}parser"
61
+
62
+ require 'gedcom_parser.rb'
63
+
64
+ class Gedcom
65
+ VERSION = '0.9.0'
66
+ attr_accessor :transmissions
67
+
68
+ def initialize(transmission = nil)
69
+ @transmissions = []
70
+ add_transmission(transmission) if transmission != nil
71
+ end
72
+
73
+ def self.file(*a)
74
+ g = Gedcom.new
75
+ g.file(*a)
76
+ return g
77
+ end
78
+
79
+ def file(*a)
80
+ transmission = Transmission.new
81
+ gedcom_parser = GedcomParser.new(transmission)
82
+
83
+ File.open(*a) do |file|
84
+ file.each_line("\n") do |line|
85
+ begin
86
+ gedcom_parser.parse( file.lineno, line )
87
+ rescue => exception
88
+ puts "#{file.lineno}: #{exception} - " + line
89
+ # raise exception
90
+ end
91
+ end
92
+ end
93
+
94
+ @transmissions << transmission
95
+
96
+ end
97
+
98
+ def add_transmission(transmission)
99
+ @transmissions << transmission
100
+ end
101
+
102
+ def each
103
+ @transmissions.each { |t| yield t }
104
+ end
105
+ end
@@ -0,0 +1,77 @@
1
+ require 'gedcom_base.rb'
2
+
3
+ #Address_record a sub-record of HEAD, REPO, SUBM and all types of Event records.
4
+ #
5
+ #ADDRESS_STRUCTURE:=
6
+ # n ADDR <ADDRESS_LINE> {0:1}
7
+ # +1 CONT <ADDRESS_LINE> {0:M}
8
+ # +1 ADR1 <ADDRESS_LINE1> {0:1}
9
+ # +1 ADR2 <ADDRESS_LINE2> {0:1}
10
+ # +1 CITY <ADDRESS_CITY> {0:1}
11
+ # +1 STAE <ADDRESS_STATE> {0:1}
12
+ # +1 POST <ADDRESS_POSTAL_CODE> {0:1}
13
+ # +1 CTRY <ADDRESS_COUNTRY> {0:1}
14
+ #
15
+ # I have not included the Phone number from Address_record, and include it in the parent
16
+ # records that include ADDRESS_STRUCTURE. This is functionally equivalent, as PHON is not
17
+ # a sub-record of ADDR, but at the same level.
18
+ #
19
+ # n PHON <PHONE_NUMBER> {0:3}
20
+ #
21
+ #==ADDRESS_CITY:= {Size=1:60}
22
+ # The name of the city used in the address. Isolated for sorting or indexing.
23
+ #
24
+ #==ADDRESS_COUNTRY:= {Size=1:60}
25
+ # The name of the country that pertains to the associated address. Isolated by some systems for sorting
26
+ # or indexing. Used in most cases to facilitate automatic sorting of mail.
27
+ #
28
+ #==ADDRESS_LINE:= {Size=1:60}
29
+ # Address information that, when combined with NAME and CONTinuation lines, meets requirements
30
+ # for sending communications through the mail.
31
+ #
32
+ #==ADDRESS_LINE1:= {Size=1:60}
33
+ # The first line of the address used for indexing. This corresponds to the ADDRESS_LINE value of the
34
+ # ADDR line in the address structure.
35
+ #
36
+ #==ADDRESS_LINE2:= {Size=1:60}
37
+ # The second line of the address used for indexing. This corresponds to the ADDRESS_LINE value of
38
+ # the first CONT line subordinate to the ADDR tag in the address structure.
39
+ #
40
+ #==ADDRESS_POSTAL_CODE:= {Size=1:10}
41
+ # The ZIP or postal code used by the various localities in handling of mail. Isolated for sorting or
42
+ # indexing.
43
+ #
44
+ #==ADDRESS_STATE:= {Size=1:60}
45
+ # The name of the state used in the address. Isolated for sorting or indexing.
46
+ #
47
+ # The address structure should be formed as it would appear on a mailing label using the ADDR and
48
+ # ADDR.CONT lines. These lines are required if an ADDRess is present. Optionally, additional
49
+ # structure is provided for systems that have structured their addresses for indexing and sorting.
50
+ #
51
+ #The attributes are all arrays for the level +1 tags/records.
52
+ #* Those ending in _ref are GEDCOM XREF index keys
53
+ #* Those ending in _record are array of classes of that type.
54
+ #* The remainder are arrays of attributes that could be present in this record.
55
+ class Address_record < GEDCOMBase
56
+ attr_accessor :address, :address_line1, :address_line2, :city, :state, :post_code, :country, :address_type
57
+ attr_accessor :note_citation_record
58
+
59
+ ClassTracker << :Address_record
60
+
61
+ #new sets up the state engine arrays @this_level and @sub_level, which drive the to_gedcom method generating GEDCOM output.
62
+ def initialize(*a)
63
+ super(*a)
64
+ @this_level = [ [:cont, "ADDR", :address] ]
65
+ @sub_level = [ #level + 1
66
+ [:print, "ADR1", :address_line1],
67
+ [:print, "ADR2", :address_line2],
68
+ [:print, "CITY", :city],
69
+ [:print, "STAE", :state],
70
+ [:print, "POST", :post_code],
71
+ [:print, "CTRY", :country],
72
+ [:print, "TYPE", :address_type], #non standard.
73
+ [:walk, nil, :note_citation_record],
74
+ ]
75
+ end
76
+
77
+ end
@@ -0,0 +1,57 @@
1
+ require 'gedcom_base.rb'
2
+
3
+ #Adoption_record is a rarely seen sub-record of FAMC in Individual Event_record.
4
+ #These can occur is Event_record BIRT and ADOP event types.
5
+ #
6
+ #=INDIVIDUAL_EVENT_STRUCTURE:=
7
+ # ...
8
+ # -1 ADOP [Y|<NULL>] {1:1} (Not this ADOP record. This is the event.)
9
+ # ...
10
+ # n FAMC @<XREF:FAM>@ {0:1} (This FAMC and its ADOP record.)
11
+ # +1 ADOP <ADOPTED_BY_WHICH_PARENT> {0:1}
12
+ # ...
13
+ # n BIRT [Y|<NULL>] {1:1}
14
+ # ...
15
+ # +1 FAMC @<XREF:FAM>@ {0:1} (And this FAMC in the BIRT Event.)
16
+ # ...
17
+ #
18
+ #==ADOPTED_BY_WHICH_PARENT:= {Size=1:4}
19
+ # HUSB | WIFE | BOTH
20
+ #
21
+ # A code which shows which parent in the associated family record adopted this person.
22
+ # Where:
23
+ # HUSB:: The HUSBand in the associated family adopted this person.
24
+ # WIFE:: The WIFE in the associated family adopted this person.
25
+ # BOTH:: Both HUSBand and WIFE adopted this person.
26
+ #
27
+ # Linkage between a child and the family they belonged to at the time of an event can also optionally
28
+ # be shown by a FAMC pointer subordinate to the appropriate event. For example, a FAMC pointer
29
+ # subordinate to an adoption event would show which family adopted this individual. Biological parent
30
+ # or parents can be indicated by a FAMC pointer subordinate to the birth event. The FAMC tag can
31
+ # also optionally be used subordinate to an ADOPtion, or BIRTh event to differentiate which set of
32
+ # parents were related by adoption, sealing, or birth.
33
+ #
34
+ #The attributes are all arrays for the level +1 tags/records.
35
+ #* Those ending in _ref are GEDCOM XREF index keys
36
+ #* Those ending in _record are array of classes of that type.
37
+ #* The remainder are arrays of attributes that could be present in this record.
38
+ class Adoption_record < GEDCOMBase
39
+ attr_accessor :birth_family_ref, :adopt_family_ref, :adopted_by
40
+ attr_accessor :note_citation_record
41
+
42
+ ClassTracker << :Adoption_record
43
+
44
+ #new sets up the state engine arrays @this_level and @sub_level, which drive the to_gedcom method generating GEDCOM output.
45
+ def initialize(*a)
46
+ super(*a)
47
+ @this_level = [ [:xref, "FAMC", :birth_family_ref ], #Only adopted family version of birth event record
48
+ [:xref, "FAMC", :adopt_family_ref] #Adopted family version of ADOP event record
49
+ ]
50
+ @sub_level = [ #level 1
51
+ [:print, "ADOP", :adopted_by], #Only adopted family version of ADOP event record
52
+ [:walk, nil, :note_citation_record ]
53
+ ]
54
+ end
55
+
56
+ end
57
+