function plugin_read_action() { global $vars, $_read_msg; $page = isset($vars['page']) ? Utility::stripBracket($vars['page']) : null; $ret = array('msg' => null, 'body' => null); $id = isset($vars['id']) ? $vars['id'] : null; if (!$page) { return $ret; } // 読み込むことができるページか $wiki = Factory::Wiki($page); if ($wiki->isReadable(true)) { return array('msg' => Utility::htmlsc($page), 'body' => $wiki->render($id)); //return $ret; } global $referer; $referer = 0; // InterWikiNameに含まれるページか? // ?adv:FrontPageみたいな感じでアクセス if (preg_match('/^' . RendererDefines::INTERWIKINAME_PATTERN . '$/', $page, $match)) { $url = InterWikiName::getInterWikiUrl($match[2], $match[3]); if ($url == false) { return array('msg' => $_read_msg['title_invalied'], 'body' => sprintf($_read_msg['msg_ibvaliediw'], $match[2])); } Utility::redirect($url); return; } // AutoAliasに含まれるページか? $realpage = AutoAlias::getAutoAlias($page); if (count($realpage) === 1) { // AutoAliasの指定先のページを指定 $a_wiki = Factory::Wiki($realpage); if ($a_wiki->isValied()) { Utility::redirect($a_wiki->link()); return; } else { if (Utility::isUri($realpage)) { Utility::redirect($realpage); return; } } } else { if (count($realpage) >= 2) { $body = '<p>'; $body .= $_read_msg['msg_invalidwn'] . '<br />'; foreach ($realpage as $entry) { $link[] = '[[' . $entry . '>' . $entry . ']]&br;'; } $body .= InlineFactory::Wiki(join("\n", $link)); $body .= '</p>'; return array('msg' => $_read_msg['title_invalied'], 'body' => $body); } } Utility::notfound(); exit; }
/** * ページの自動リンクを作成 * @global type $vars * @global type $link_compact * @global type $related * @global type $_symbol_noexists * @param string $page ページ名 * @param string $alias リンクの名前 * @param string $anchor ページ内アンカー(アドレスの#以降のテキスト) * @param string $refer リンク元 * @param boolean $isautolink 自動リンクか? * @return string */ public static function setAutoLink($page, $alias = '', $anchor = '', $refer = '', $isautolink = FALSE) { global $vars, $link_compact, $related, $_symbol_noexists, $related; if (empty($page)) { // ページ内リンク return '<a href="' . $anchor . '">' . Utility::htmlsc($alias) . '</a>'; } $wiki = Factory::Wiki($page); if (!$wiki->has()) { // ページが存在しない場合は、AutoAliasから該当ページが存在するかを確認する foreach (AutoAlias::getAutoAliasDict() as $aliaspage => $realpage) { if (Factory::Wiki($realpage)->has()) { // リンクをエイリアス先に return self::setLink($page, $aliaspage); } } } else { if (!isset($related[$page]) && isset($vars['page']) && $page !== $vars['page']) { $related[$page] = $wiki->time(); } } $s_page = Utility::htmlsc($page); $anchor_name = empty($alias) ? $page : $alias; $anchor_name = str_replace('&#039;', '\'', $anchor_name); // 'が'になってしまう問題をとりあえず解消 if ($isautolink || $wiki->has()) { // ページが存在する場合 // 用語集にページ名と同じワードが含まれていた場合 $glossary = Glossary::getGlossary($page); if (!empty($glossary)) { // AutoGlossray return '<abbr class="glossary" title="' . $glossary . ' ' . $wiki->passage(false, true) . '">' . '<a href="' . $wiki->uri() . '"' . ($isautolink === true ? ' class="autolink"' : '') . '>' . $anchor_name . '</a></abbr>'; } return '<a href="' . $wiki->uri() . $anchor . '" ' . (!$link_compact ? 'title="' . $s_page . ' ' . $wiki->passage(false, true) . '"' : '') . ($isautolink === true ? ' class="autolink"' : '') . '>' . $anchor_name . '</a>'; } else { // Dangling link if (Auth::check_role('readonly')) { return Utility::htmlsc($alias); } // No dacorations $retval = $anchor_name . '<a href="' . $wiki->uri('edit', empty($refer) ? null : array('refer' => $refer)) . '" rel="nofollow">' . $_symbol_noexists . '</a>'; return $link_compact ? $retval : sprintf(RendererDefines::NOEXISTS_STRING, $retval); } }
/** * リンクのデーターベースを初期化 * @return void */ public function init() { // Init database $this->adapter->query('DELETE FROM rel', Adapter::QUERY_MODE_EXECUTE); $this->adapter->query('DELETE FROM ref', Adapter::QUERY_MODE_EXECUTE); $ref = array(); // Reference from foreach (Listing::pages('wiki') as $_page) { $rel = array(); // Reference to $objs = self::getObjects($_page); if (empty($objs)) { continue; } foreach ($objs as $_obj) { if (!isset($_obj->type) || $_obj->type !== 'pagename' || empty($_obj->name) || $_obj->name === $_page) { continue; } $_name = $_obj->name; if ($_obj instanceof AutoAlias) { $_alias = AutoAlias::getAutoAlias($_name); if (!Factory::Wiki($_alias)->isValied()) { continue; } // not PageName $_name = $_alias; } $rel[] = $_name; if (!isset($ref[$_name][$_page])) { $ref[$_name][$_page] = 1; } if (!$_obj instanceof AutoLink) { $ref[$_name][$_page] = 0; } } ksort($rel, SORT_NATURAL); if (empty($rel)) { continue; } self::setRel($_page, $rel); } unset($rel, $_page); ksort($ref, SORT_NATURAL); foreach ($ref as $_page => $arr) { foreach ($arr as $ref_page => $ref_auto) { $data[] = $ref_page . "\t" . $ref_auto; } self::setRef($_page, $data); unset($data); } // メモリを開放 self::getObjects(); unset($ref_page, $ref_auto); // 最適化 $this->adapter->query('VACUUM', Adapter::QUERY_MODE_EXECUTE); }
function __construct($start) { parent::__construct($start); }