function addClipping(WT_GedcomRecord $record) { global $WT_SESSION; if ($record->canShowName()) { $WT_SESSION->cart[WT_GED_ID][$record->getXref()] = true; // Add directly linked records preg_match_all('/\\n\\d (?:OBJE|NOTE|SOUR|REPO) @(' . WT_REGEX_XREF . ')@/', $record->getGedcom(), $matches); foreach ($matches[1] as $match) { $WT_SESSION->cart[WT_GED_ID][$match] = true; } } }
function create_edit_form(WT_GedcomRecord $record, WT_Fact $fact) { global $ADVANCED_PLAC_FACTS, $date_and_time, $FULL_SOURCES, $tags; $pid = $record->getXref(); $tags = array(); $gedlines = explode("\n", $fact->getGedcom()); $linenum = 0; $fields = explode(' ', $gedlines[$linenum]); $glevel = $fields[0]; $level = $glevel; $type = $fact->getTag(); $parent = $fact->getParent(); $level0type = $parent::RECORD_TYPE; $level1type = $type; $i = $linenum; $inSource = false; $levelSource = 0; $add_date = true; // List of tags we would expect at the next level // NB add_missing_subtags() already takes care of the simple cases // where a level 1 tag is missing a level 2 tag. Here we only need to // handle the more complicated cases. $expected_subtags = array('SOUR' => array('PAGE', 'DATA'), 'DATA' => array('TEXT'), 'PLAC' => array('MAP'), 'MAP' => array('LATI', 'LONG')); if ($FULL_SOURCES) { $expected_subtags['SOUR'][] = 'QUAY'; $expected_subtags['DATA'][] = 'DATE'; } if (preg_match_all('/(' . WT_REGEX_TAG . ')/', $ADVANCED_PLAC_FACTS, $match)) { $expected_subtags['PLAC'] = array_merge($match[1], $expected_subtags['PLAC']); } $stack = array(0 => $level0type); // Loop on existing tags : while (true) { // Keep track of our hierarchy, e.g. 1=>BIRT, 2=>PLAC, 3=>FONE $stack[(int) $level] = $type; // Merge them together, e.g. BIRT:PLAC:FONE $label = implode(':', array_slice($stack, 1, $level)); $text = ''; for ($j = 2; $j < count($fields); $j++) { if ($j > 2) { $text .= ' '; } $text .= $fields[$j]; } $text = rtrim($text); while ($i + 1 < count($gedlines) && preg_match("/" . ($level + 1) . " CONT ?(.*)/", $gedlines[$i + 1], $cmatch) > 0) { $text .= "\n" . $cmatch[1]; $i++; } if ($type == "SOUR") { $inSource = true; $levelSource = $level; } elseif ($levelSource >= $level) { $inSource = false; } if ($type != "DATA" && $type != "CONT") { $tags[] = $type; $person = WT_Individual::getInstance($pid); $subrecord = $level . ' ' . $type . ' ' . $text; if ($inSource && $type == "DATE") { add_simple_tag($subrecord, '', WT_Gedcom_Tag::getLabel($label, $person)); } elseif (!$inSource && $type == "DATE") { add_simple_tag($subrecord, $level1type, WT_Gedcom_Tag::getLabel($label, $person)); $add_date = false; } elseif ($type == 'STAT') { add_simple_tag($subrecord, $level1type, WT_Gedcom_Tag::getLabel($label, $person)); } elseif ($level0type == 'REPO') { $repo = WT_Repository::getInstance($pid); add_simple_tag($subrecord, $level0type, WT_Gedcom_Tag::getLabel($label, $repo)); } else { add_simple_tag($subrecord, $level0type, WT_Gedcom_Tag::getLabel($label, $person)); } } // Get a list of tags present at the next level $subtags = array(); for ($ii = $i + 1; isset($gedlines[$ii]) && preg_match('/^\\s*(\\d+)\\s+(\\S+)/', $gedlines[$ii], $mm) && $mm[1] > $level; ++$ii) { if ($mm[1] == $level + 1) { $subtags[] = $mm[2]; } } // Insert missing tags if (!empty($expected_subtags[$type])) { foreach ($expected_subtags[$type] as $subtag) { if (!in_array($subtag, $subtags)) { if (!$inSource || $subtag != "DATA") { add_simple_tag($level + 1 . ' ' . $subtag, '', WT_Gedcom_Tag::getLabel("{$label}:{$subtag}")); } if (!empty($expected_subtags[$subtag])) { foreach ($expected_subtags[$subtag] as $subsubtag) { add_simple_tag($level + 2 . ' ' . $subsubtag, '', WT_Gedcom_Tag::getLabel("{$label}:{$subtag}:{$subsubtag}")); } } } } } // Awkward special cases if ($level == 2 && $type == 'DATE' && in_array($level1type, $date_and_time) && !in_array('TIME', $subtags)) { add_simple_tag("3 TIME"); // TIME is NOT a valid 5.5.1 tag } if ($level == 2 && $type == 'STAT' && WT_Gedcom_Code_Temp::isTagLDS($level1type) && !in_array('DATE', $subtags)) { add_simple_tag("3 DATE", '', WT_Gedcom_Tag::getLabel('STAT:DATE')); } $i++; if (isset($gedlines[$i])) { $fields = explode(' ', $gedlines[$i]); $level = $fields[0]; if (isset($fields[1])) { $type = trim($fields[1]); } else { $level = 0; } } else { $level = 0; } if ($level <= $glevel) { break; } } if ($level1type != '_PRIM') { insert_missing_subtags($level1type, $add_date); } return $level1type; }
function getActionPreview(WT_GedcomRecord $record) { $old_lines = preg_split('/[\\n]+/', $record->getGedcom()); $new_lines = preg_split('/[\\n]+/', $this->updateRecord($record->getXref(), $record->getGedcom())); // Find matching lines using longest-common-subsequence algorithm. $lcs = self::LCS($old_lines, $new_lines, 0, count($old_lines) - 1, 0, count($new_lines) - 1); $diff_lines = array(); $last_old = -1; $last_new = -1; while ($lcs) { list($old, $new) = array_shift($lcs); while ($last_old < $old - 1) { $diff_lines[] = self::decorateDeletedText($old_lines[++$last_old]); } while ($last_new < $new - 1) { $diff_lines[] = self::decorateInsertedText($new_lines[++$last_new]); } $diff_lines[] = $new_lines[$new]; $last_old = $old; $last_new = $new; } while ($last_old < count($old_lines) - 1) { $diff_lines[] = self::decorateDeletedText($old_lines[++$last_old]); } while ($last_new < count($new_lines) - 1) { $diff_lines[] = self::decorateInsertedText($new_lines[++$last_new]); } return '<pre>' . self::createEditLinks(implode("\n", $diff_lines)) . '</pre>'; }