public function setPattern($arr, $page) { list(, $alias, , $name, $this->anchor) = $this->splice($arr); if (empty($name) && empty($this->anchor)) { return FALSE; } if (empty($name) || !Utility::isWikiName($name)) { if (empty($alias)) { $alias = $name . $this->anchor; } if (!empty($name)) { $name = self::getFullname($name, $page); if (!empty($name) && !Factory::Wiki($name)->isValied()) { return FALSE; } } } return parent::setParam($page, $name, null, 'pagename', $alias); }
/** * ページの関連性データーベースを更新 * @global string $WikiName * @global boolean $autolink * @global type $nowikiname * @global array $search_non_list * @param string $page * @return void */ public function update($page = '') { $time = Factory::Wiki($page)->time(); $rel_old = self::getRel($this->page); $rel_exist = $rel_old === array(); $rel_auto = $rel_new = array(); $pages = self::getObjects($page); if (!empty($pages)) { foreach ($pages as $_obj) { if (!isset($_obj->type) || $_obj->type !== 'pagename' || $_obj->name === $page || empty($_obj->name)) { continue; } if ($_obj instanceof AutoLink) { // Not cool though $rel_auto[] = $_obj->name; } else { if ($_obj instanceof AutoAlias) { $_alias = AutoAlias::getAutoAliasDict($_obj->name); if (Factory::Wiki($_alias)->isValied()) { $rel_auto[] = $_alias; } } else { $rel_new[] = $_obj->name; } } } } // All pages "Referenced to" only by AutoLink $rel_auto = array_diff(array_unique($rel_auto), $rel_new); // All pages "Referenced to" $rel_new = array_merge(array_unique($rel_new), $rel_auto); // update Pages referred from the $page if ($time) { // Page exists self::setRel($this->page, $rel_new); } // .ref: Pages refer to the $page self::add($this->page, array_diff($rel_new, $rel_old), $rel_auto); self::remove($this->page, array_diff($rel_old, $rel_new)); global $autolink, $nowikiname, $search_non_list; // $page seems newly created, and matches with AutoLink if ($time && !$rel_exist && $autolink && (Utility::isWikiName($page) ? $nowikiname : strlen($page) >= $autolink)) { // Update all, because they __MAY__ refer the $page [HEAVY] $search_non_list = 1; $pages = Search::do_search($page, 'AND', TRUE); foreach ($pages as $_page) { if ($_page !== $page) { $this->update($_page); } } } // $pageが削除されたときに、 foreach (self::getRef($this->page) as $line) { list($ref_page, $ref_auto) = explode("\t", rtrim($line)); // $pageをAutoLinkでしか参照していないページを一斉更新する(おいおい) if ($ref_auto) { self::remove($ref_page, array($page)); } } }