예제 #1
0
/**
 * builds the form for adding new facts
 *
 * @param string $fact the new fact we are adding
 */
function create_add_form($fact)
{
    global $tags, $FULL_SOURCES, $emptyfacts;
    $tags = array();
    // handle  MARRiage TYPE
    if (substr($fact, 0, 5) == 'MARR_') {
        $tags[0] = 'MARR';
        add_simple_tag('1 MARR');
        insert_missing_subtags($fact);
    } else {
        $tags[0] = $fact;
        if ($fact == '_UID') {
            $fact .= ' ' . WT_Gedcom_Tag::createUid();
        }
        // These new level 1 tags need to be turned into links
        if (in_array($fact, array('ASSO'))) {
            $fact .= ' @';
        }
        if (in_array($fact, $emptyfacts)) {
            add_simple_tag('1 ' . $fact . ' Y');
        } else {
            add_simple_tag('1 ' . $fact);
        }
        insert_missing_subtags($tags[0]);
        //-- handle the special SOURce case for level 1 sources [ 1759246 ]
        if ($fact == 'SOUR') {
            add_simple_tag('2 PAGE');
            add_simple_tag('3 TEXT');
            if ($FULL_SOURCES) {
                add_simple_tag('3 DATE', '', WT_Gedcom_Tag::getLabel('DATA:DATE'));
                add_simple_tag('2 QUAY');
            }
        }
    }
}
예제 #2
0
/**
 * import record into database
 *
 * this function will parse the given gedcom record and add it to the database
 *
 * @param string  $gedrec the raw gedcom record to parse
 * @param integer $ged_id import the record into this gedcom
 * @param boolean $update whether or not this is an updated record that has been accepted
 */
function import_record($gedrec, $ged_id, $update)
{
    global $USE_RIN, $GENERATE_UIDS, $keep_media;
    static $sql_insert_indi = null;
    static $sql_insert_fam = null;
    static $sql_insert_sour = null;
    static $sql_insert_media = null;
    static $sql_insert_other = null;
    if (!$sql_insert_indi) {
        $sql_insert_indi = WT_DB::prepare("INSERT INTO `##individuals` (i_id, i_file, i_rin, i_sex, i_gedcom) VALUES (?,?,?,?,?)");
        $sql_insert_fam = WT_DB::prepare("INSERT INTO `##families` (f_id, f_file, f_husb, f_wife, f_gedcom, f_numchil) VALUES (?,?,?,?,?,?)");
        $sql_insert_sour = WT_DB::prepare("INSERT INTO `##sources` (s_id, s_file, s_name, s_gedcom) VALUES (?,?,?,?)");
        $sql_insert_media = WT_DB::prepare("INSERT INTO `##media` (m_id, m_ext, m_type, m_titl, m_filename, m_file, m_gedcom) VALUES (?, ?, ?, ?, ?, ?, ?)");
        $sql_insert_other = WT_DB::prepare("INSERT INTO `##other` (o_id, o_file, o_type, o_gedcom) VALUES (?,?,?,?)");
    }
    // Escaped @ signs (only if importing from file)
    if (!$update) {
        $gedrec = str_replace('@@', '@', $gedrec);
    }
    // Standardise gedcom format
    $gedrec = reformat_record_import($gedrec);
    // import different types of records
    if (preg_match('/^0 @(' . WT_REGEX_XREF . ')@ (' . WT_REGEX_TAG . ')/', $gedrec, $match)) {
        list(, $xref, $type) = $match;
        // check for a _UID, if the record doesn't have one, add one
        if ($GENERATE_UIDS && !strpos($gedrec, "\n1 _UID ")) {
            $gedrec .= "\n1 _UID " . WT_Gedcom_Tag::createUid();
        }
    } elseif (preg_match('/0 (HEAD|TRLR)/', $gedrec, $match)) {
        $type = $match[1];
        $xref = $type;
        // For HEAD/TRLR, use type as pseudo XREF.
    } else {
        echo WT_I18N::translate('Invalid GEDCOM format'), '<br><pre>', $gedrec, '</pre>';
        return;
    }
    // If the user has downloaded their GEDCOM data (containing media objects) and edited it
    // using an application which does not support (and deletes) media objects, then add them
    // back in.
    if ($keep_media && $xref) {
        $old_linked_media = WT_DB::prepare("SELECT l_to FROM `##link` WHERE l_from=? AND l_file=? AND l_type='OBJE'")->execute(array($xref, $ged_id))->fetchOneColumn();
        foreach ($old_linked_media as $media_id) {
            $gedrec .= "\n1 OBJE @" . $media_id . "@";
        }
    }
    switch ($type) {
        case 'INDI':
            // Convert inline media into media objects
            $gedrec = convert_inline_media($ged_id, $gedrec);
            $record = new WT_Individual($xref, $gedrec, null, $ged_id);
            if ($USE_RIN && preg_match('/\\n1 RIN (.+)/', $gedrec, $match)) {
                $rin = $match[1];
            } else {
                $rin = $xref;
            }
            $sql_insert_indi->execute(array($xref, $ged_id, $rin, $record->getSex(), $gedrec));
            // Update the cross-reference/index tables.
            update_places($xref, $ged_id, $gedrec);
            update_dates($xref, $ged_id, $gedrec);
            update_links($xref, $ged_id, $gedrec);
            update_names($xref, $ged_id, $record);
            break;
        case 'FAM':
            // Convert inline media into media objects
            $gedrec = convert_inline_media($ged_id, $gedrec);
            if (preg_match('/\\n1 HUSB @(' . WT_REGEX_XREF . ')@/', $gedrec, $match)) {
                $husb = $match[1];
            } else {
                $husb = '';
            }
            if (preg_match('/\\n1 WIFE @(' . WT_REGEX_XREF . ')@/', $gedrec, $match)) {
                $wife = $match[1];
            } else {
                $wife = '';
            }
            $nchi = preg_match_all('/\\n1 CHIL @(' . WT_REGEX_XREF . ')@/', $gedrec, $match);
            if (preg_match('/\\n1 NCHI (\\d+)/', $gedrec, $match)) {
                $nchi = max($nchi, $match[1]);
            }
            $sql_insert_fam->execute(array($xref, $ged_id, $husb, $wife, $gedrec, $nchi));
            // Update the cross-reference/index tables.
            update_places($xref, $ged_id, $gedrec);
            update_dates($xref, $ged_id, $gedrec);
            update_links($xref, $ged_id, $gedrec);
            break;
        case 'SOUR':
            // Convert inline media into media objects
            $gedrec = convert_inline_media($ged_id, $gedrec);
            $record = new WT_Source($xref, $gedrec, null, $ged_id);
            if (preg_match('/\\n1 TITL (.+)/', $gedrec, $match)) {
                $name = $match[1];
            } elseif (preg_match('/\\n1 ABBR (.+)/', $gedrec, $match)) {
                $name = $match[1];
            } else {
                $name = $xref;
            }
            $sql_insert_sour->execute(array($xref, $ged_id, $name, $gedrec));
            // Update the cross-reference/index tables.
            update_links($xref, $ged_id, $gedrec);
            update_names($xref, $ged_id, $record);
            break;
        case 'REPO':
            // Convert inline media into media objects
            $gedrec = convert_inline_media($ged_id, $gedrec);
            $record = new WT_Repository($xref, $gedrec, null, $ged_id);
            $sql_insert_other->execute(array($xref, $ged_id, $type, $gedrec));
            // Update the cross-reference/index tables.
            update_links($xref, $ged_id, $gedrec);
            update_names($xref, $ged_id, $record);
            break;
        case 'NOTE':
            $record = new WT_Note($xref, $gedrec, null, $ged_id);
            $sql_insert_other->execute(array($xref, $ged_id, $type, $gedrec));
            // Update the cross-reference/index tables.
            update_links($xref, $ged_id, $gedrec);
            update_names($xref, $ged_id, $record);
            break;
        case 'OBJE':
            $record = new WT_Media($xref, $gedrec, null, $ged_id);
            $sql_insert_media->execute(array($xref, $record->extension(), $record->getMediaType(), $record->title, $record->file, $ged_id, $gedrec));
            // Update the cross-reference/index tables.
            update_links($xref, $ged_id, $gedrec);
            update_names($xref, $ged_id, $record);
            break;
        case 'HEAD':
            // Force HEAD records to have a creation date.
            if (!strpos($gedrec, "\n1 DATE ")) {
                $gedrec .= "\n1 DATE " . date('j M Y');
            }
            // No break;
        // No break;
        case 'TRLR':
        case 'SUBM':
        case 'SUBN':
            $sql_insert_other->execute(array($xref, $ged_id, $type, $gedrec));
            // Update the cross-reference/index tables.
            update_links($xref, $ged_id, $gedrec);
            break;
        default:
            $record = new WT_GedcomRecord($xref, $gedrec, null, $ged_id);
            $sql_insert_other->execute(array($xref, $ged_id, $type, $gedrec));
            // Update the cross-reference/index tables.
            update_links($xref, $ged_id, $gedrec);
            update_names($xref, $ged_id, $record);
            break;
    }
}