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

Reply via email to