On Thu, Jan 12, 2006 at 06:15:17PM -0700, Nate Fuhriman wrote: > I am using gedcom.pm to create a simple gedcom editing program. it's > basically a thin layer to allow a user access to gedcom files. I am having > some > problems though and was wondering if anybody out there could help.
Looks like that'll be me then ;-) > how do I automatically find out if I can have multiple items. IE I can have > many FAMS tags but only one SEX tag. I have tried using $record->max but > that always fails as an invalid call. Yes. You'll need to get into the actual grammar object to get this information. I don't have a proper API to this, so there is a possibility that things might change, but something like the following should give you the information you want: $record->{grammar}->valid_items->{$tag}[0]{min} $record->{grammar}->valid_items->{$tag}[0]{max} Here, $record is the parent record, and $tag the name of the tag you are interested in. For example: my $i = $ged->get_individual("I8"); print $i->{grammar}->valid_items->{NAME}[0]{max}; print $i->{grammar}->valid_items->{SEX}[0]{max}; The call to $i->{grammar}->valid_items returns a hash reference, the keys of which are the names of all the valid items for that record. The values are arrays of hashes, each hash containing the grammar, the min and the max. There is an array of hashes because the same tag can refer to more than one grammar. This is the case with NOTEs for example, which can either be inline or can point to a note record. It is safe (at the moment) to just look at the first record since where there are multiple records, the min and max are always the same. The docs (and maybe even the source) to Gedcom::Grammar may shed a little light on this. > how do I properly link external documents to SOUR. I have a gedcom file that > was created with PAF that shows > 1 OBJE hello > 2 FORM png > 2 FILE page1.png > 2 NOTE some description > but gedcom.pm says that form, file and note are not valid tags for obje. is > there a different way? sample code maybe? I'm afraid you'll need to be a little more explicit in describing this, or better still send some minimal GEDCOM file, since it "works for me". Here's the GEDCOM file I tested it with. This was created by Gedcom.pm and I just added your four lines. 0 HEAD 1 SOUR Gedcom.pm 2 NAME Gedcom.pm 2 VERS 1.1502 2 CORP Paul Johnson 3 ADDR http://www.pjcj.net 2 DATA 3 COPR Copyright 1998-2005, Paul Johnson ([EMAIL PROTECTED]) 1 NOTE 2 CONT This output was generated by Gedcom.pm. 2 CONT Gedcom.pm is Copyright 1999-2005, Paul Johnson ([EMAIL PROTECTED]) 2 CONT Version 1.1502 - 20th December 2005 2 CONT 2 CONT Gedcom.pm is free. It is licensed under the same terms as Perl itself. 2 CONT 2 CONT The latest version of Gedcom.pm should be available from my homepage: 2 CONT http://www.pjcj.net 1 GEDC 2 VERS 5.5 2 FORM LINEAGE-LINKED 1 DATE Mon Jan 23 12:31:25 2006 1 CHAR ANSEL 1 SUBM @SUBM1@ 0 @SUBM1@ SUBM 1 NAME Paul Johnson 1 OBJE hello 2 FORM png 2 FILE page1.png 2 NOTE some description 0 TRLR > how do I setup the CONT tag? if I add a note it just goes on a single line. Take a look at the code in Gedcom::new, which creates the GEDCOM file above. Basically, you just add CONT records to a NOTE record. > This probably leads to another point of confusion I have. It looks like some > tags (NOTE,PLAC) allow data to be put to them and have sub tags. is there a > way to automatically recognize this? Yes. This is a pain, I think, since it means that I need to have separate methods to return the value associated with a tag or the record. Again, I don't have a proper API for this, but the information is available. (And I have just noticed that I don't give any warning if a value is provided where none is expected.) You can access the information so: my $i = $ged->get_individual("I1"); print "NOTE [", exists $i->get_record("note")->{grammar}{value}, "]\n"; print "BIRT [", exists $i->get_record("birt")->{grammar}{value}, "]\n"; If the "value" key is present in the grammar, then a value is allowed, otherwise it is not. > Thanks in advance. > Nate > > FYI once I have the program working I'm more than happy to share. :) I look forward to it. Sorry for the delayed reply. -- Paul Johnson - [EMAIL PROTECTED] http://www.pjcj.net