1<?php 2namespace Fisharebest\Webtrees; 3 4/** 5 * webtrees: online genealogy 6 * Copyright (C) 2015 webtrees development team 7 * This program is free software: you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation, either version 3 of the License, or 10 * (at your option) any later version. 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <http://www.gnu.org/licenses/>. 17 */ 18 19/** 20 * Class Note - Class file for a Shared Note (NOTE) object 21 */ 22class Note extends GedcomRecord { 23 const RECORD_TYPE = 'NOTE'; 24 const URL_PREFIX = 'note.php?nid='; 25 26 /** 27 * Get an instance of a note object. For single records, 28 * we just receive the XREF. For bulk records (such as lists 29 * and search results) we can receive the GEDCOM data as well. 30 * 31 * @param string $xref 32 * @param Tree $tree 33 * @param string|null $gedcom 34 * 35 * @return Note|null 36 */ 37 public static function getInstance($xref, Tree $tree, $gedcom = null) { 38 $record = parent::getInstance($xref, $tree, $gedcom); 39 40 if ($record instanceof Note) { 41 return $record; 42 } else { 43 return null; 44 } 45 } 46 47 /** 48 * Get the text contents of the note 49 * 50 * @return string|null 51 */ 52 public function getNote() { 53 if (preg_match('/^0 @' . WT_REGEX_XREF . '@ NOTE ?(.*(?:\n1 CONT ?.*)*)/', $this->gedcom . $this->pending, $match)) { 54 return preg_replace("/\n1 CONT ?/", "\n", $match[1]); 55 } else { 56 return null; 57 } 58 } 59 60 /** {@inheritdoc} */ 61 protected function canShowByType($access_level) { 62 // Hide notes if they are attached to private records 63 $linked_ids = Database::prepare( 64 "SELECT l_from FROM `##link` WHERE l_to=? AND l_file=?" 65 )->execute(array( 66 $this->xref, $this->tree->getTreeId(), 67 ))->fetchOneColumn(); 68 foreach ($linked_ids as $linked_id) { 69 $linked_record = GedcomRecord::getInstance($linked_id, $this->tree); 70 if ($linked_record && !$linked_record->canShow($access_level)) { 71 return false; 72 } 73 } 74 75 // Apply default behaviour 76 return parent::canShowByType($access_level); 77 } 78 79 /** {@inheritdoc} */ 80 protected function createPrivateGedcomRecord($access_level) { 81 return '0 @' . $this->xref . '@ NOTE ' . I18N::translate('Private'); 82 } 83 84 /** {@inheritdoc} */ 85 protected static function fetchGedcomRecord($xref, $tree_id) { 86 return Database::prepare( 87 "SELECT o_gedcom FROM `##other` WHERE o_id = :xref AND o_file = :tree_id AND o_type = 'NOTE'" 88 )->execute(array( 89 'xref' => $xref, 90 'tree_id' => $tree_id, 91 ))->fetchOne(); 92 } 93 94 /** 95 * Create a name for this note - apply (and remove) markup, then take 96 * a maximum of 100 characters from the first line. 97 * 98 * {@inheritdoc} 99 */ 100 public function extractNames() { 101 $text = $this->getNote(); 102 103 if ($text) { 104 switch ($this->getTree()->getPreference('FORMAT_TEXT')) { 105 case 'markdown': 106 $text = Filter::markdown($text); 107 $text = Filter::unescapeHtml($text); 108 break; 109 } 110 111 list($text) = explode("\n", $text); 112 $this->addName('NOTE', strlen($text) > 100 ? mb_substr($text, 0, 100) . I18N::translate('…') : $text, $this->getGedcom()); 113 } 114 } 115} 116