/** * あいまい検索用正規表現の集合体を取得する。 * * @param string もとになるキーワード * @return array(string) あいまい検索用正規表現を集めた配列 */ static function makefuzzyexplist($key) { //仮名は全角カタカナに、英数字・空白文字は半角に、 濁点付きの文字を一文字に、記号は全角に。 $_key = mb_strtolower(mb_convert_kana($key, 'KVCas')); foreach (self::$han2zen_mark_table as $han => $zen) { $_key = mb_ereg_replace(mb_ereg_quote($han), $zen, $_key); } //2文字以上での表現を1文字にする foreach (self::$two2one as $from => $to) { $_key = mb_ereg_replace($from, $to, $_key); } //文字により削除(表記ゆれまたはごみ) $_key = mb_ereg_replace('[ッー・゛゜、。]', '', $_key); //異体文字に対応する。 $char = array(); $len = mb_strlen($_key); for ($i = 0; $i < $len; $i++) { $c = mb_substr($_key, $i, 1); $char[] = isset($GLOBALS['itaimojitable'][$c]) ? $GLOBALS['itaimojitable'][$c] : mb_ereg_quote($c); } //ちょっと違う単語を許すようにする $list = self::makeagrepexplist($char); //表記ゆれになる文字を挟み込む $ret = array(); foreach ($list as $a) { $ret[] = join('[・ーー]?', $a); } return $ret; }
public function do_url() { if (!isset(Vars::$get['blogname']) || trim(Vars::$get['blogname']) == '') { throw new PluginException('パラメータが足りません。', $this); } $blogname = trim(Vars::$get['blogname']); $num = isset(Vars::$get['recent']) && Vars::$get['recent'] > 0 ? (int) Vars::$get['recent'] : 15; $db = DataBase::getinstance(); $_exp = $db->escape('^' . mb_ereg_quote($blogname) . '/\\d{4}-\\d{2}-\\d{2}/'); $query = "SELECT pagename,timestamp FROM page"; $query .= " WHERE php('mb_ereg', '{$_exp}', pagename)"; $query .= " ORDER BY timestamp DESC, pagename ASC LIMIT {$num}"; $result = $db->query($query); $list = array(); $prefixsize = mb_strlen($blogname . '/9999-99-99/'); while ($row = $db->fetch($result)) { $item['timestamp'] = $row['timestamp']; $item['pagename'] = mb_substr($row['pagename'], $prefixsize); $item['url'] = getURL(Page::getinstance($row['pagename'])); $list[] = $item; } $smarty = $this->getSmarty(); $smarty->assign('rssurl', SCRIPTURL . '?' . htmlspecialchars($_SERVER['QUERY_STRING'])); $smarty->assign('sitename', SITENAME); $smarty->assign('blogurl', getURL(Page::getinstance($blogname))); $smarty->assign('blogname', $blogname); $smarty->assign('list', $list); header('Content-Type: application/xml; charset=UTF-8'); header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $item['timestamp'][0]) . ' GMT'); $smarty->display('blogrss10.tpl.htm'); exit; }
function do_url() { if (!keys_exists(Vars::$post, 'base', 'config')) { throw new PluginException('パラメータが足りません', $this); } $source = Page::getinstance(':config/plugin/tracker/' . Vars::$post['config'] . '/page')->getsource(); foreach (Vars::$post as $key => $data) { if (mb_strpos($key, 'param_') === 0) { $name = '[' . mb_substr($key, 6) . ']'; $_data = trim($data); $_data = mb_ereg_replace('\\[', '[', $_data, 'm'); $_data = mb_ereg_replace('\\]', ']', $_data, 'm'); $replace[$name] = $_data; } } $replace['[_date]'] = date('Y-m-d H:i:s'); $replace['[_base]'] = Vars::$post['base']; foreach ($replace as $name => $data) { $source = mb_ereg_replace(mb_ereg_quote($name), $data, $source, 'm'); } $db = DataBase::getinstance(); self::$sqlite_pattern = '^' . mb_ereg_quote(Vars::$post['base']) . '/(\\d+)'; $db->create_aggregate('plugin_tracker_maxnum', array('Plugin_tracker', 'sqlite_maxnum'), array('Plugin_tracker', 'sqlite_maxnum_finalize'), 1); $row = $db->fetch($db->query("SELECT plugin_tracker_maxnum(pagename) FROM page")); $num = $row[0] + 1; $title = isset(Vars::$post['param_title']) && trim(Vars::$post['param_title']) != '' ? '/' . trim(Vars::$post['param_title']) : ''; $page = Page::getinstance(Vars::$post['base'] . '/' . $num . $title); $page->write($source); redirect($page); }
function do_block($page, $param1, $param2) { $prefix = trim($param1); $pattern = '^' . mb_ereg_quote($prefix) . '/(\\d{1,4})-(\\d{2})'; if (mb_ereg($pattern, $page->getpagename(), $m)) { $year = $m[1]; $month = $m[2]; } else { if (isset(Vars::$get['year']) && isset(Vars::$get['month'])) { $year = Vars::$get['year']; $month = Vars::$get['month']; } else { $year = date('Y'); $month = date('n'); } } $smarty = $this->getSmarty(); $day = 1; $last = date('t', mktime(0, 0, 0, $month, 1, $year)); while ($day <= $last) { $line = array_fill(0, 7, ' '); $d = date('w', mktime(0, 0, 0, $month, $day, $year)); for (; $d < 7 && $day <= $last; $d++, $day++) { $p = Page::getinstance(sprintf('%s/%04d-%02d-%02d', $prefix, $year, $month, $day)); $line[$d] = $p->isexist() ? makelink($p, $day) : $day; } $table[] = $line; } $smarty->assign('table', $table); $smarty->assign('year', $year); $smarty->assign('month', $month); $smarty->assign('prefix', $prefix); $smarty->assign('page', $page->getpagename()); return $smarty->fetch('blogcalendar.tpl.htm'); }
protected function includepage($pagename, $source, $home) { mb_ereg('^' . mb_ereg_quote($home) . '/\\d+/(.+)$', $pagename, $m); $smarty = $this->getsmarty(); $smarty->assign('title', $pagename); $smarty->assign('alias', $m[1]); $smarty->assign('body', convert_block($source, $pagename)); return $smarty->fetch('include.tpl.htm'); }
function do_block($page, $param1, $param2) { $arg = array_map('trim', explode(',', $param1)); $base = isset($arg[0]) && $arg[0] != '' ? $arg[0] : $page->getpagename(); $config = isset($arg[1]) && $arg[1] != '' ? $arg[1] : 'default'; $this->sortkey = isset($arg[2]) ? array_slice($arg, 2) : array(); $configpagename = ':config/plugin/tracker/' . $config; $configdata = Plugin_tracker::Page2data(Page::getinstance($configpagename)); $this->type2name = array(); foreach ($configdata['form'] as $name => $line) { if (mb_ereg('\\[(.+?)\\]', $line[0], $m)) { $this->type2name[$m[1]] = $name; } } $this->selectorder = $this->getselectorderlist($configdata); $bgcolorlist = $this->getbgcolorlist($configdata); $list = array(); $db = DataBase::getinstance(); $query = 'SELECT pagename, source FROM page'; $query .= ' WHERE pagename like \'' . $db->escape($base) . '%\''; $query .= ' ORDER BY timestamp DESC'; $result = $db->query($query); while ($row = $db->fetch($result)) { if (!mb_ereg('^' . mb_ereg_quote($base) . '/(\\d+)/(.+)$', $row[0], $m)) { continue; } $item = array(); $item['var']['_page'] = $row[0]; $item['var']['_num'] = $m[1]; $item['var']['_title'] = $m[2]; foreach (explode("\n", $row[1]) as $line) { if (mb_ereg('^[-ー・](.+?)[\\t ]*[::][\\t ]*(.+?)[\\t ]*$', $line, $m)) { if (!isset($item[$m[1]])) { $item['var'][$m[1]] = $m[2]; $item['bgcolor'][$m[1]] = isset($bgcolorlist[$m[1]][$m[2]]) ? $bgcolorlist[$m[1]][$m[2]] : null; } } } $list[] = $item; } usort($list, array($this, 'cmp')); $smarty = $this->getSmarty(); $smarty->assign('list', $list); if (trim($param2) == '') { return '<p class="warning">表示項目を指定してください</p>'; } $smarty->assign('varname', array_map('trim', explode(',', $param2))); return $smarty->fetch('trackerlist.tpl.htm'); }
protected function record() { if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] != '') { if (!mb_ereg('^' . mb_ereg_quote(SCRIPTDIR), $_SERVER['HTTP_REFERER']) && !mb_ereg('^(?:ftp|https?)://[^.]+?/', $_SERVER['HTTP_REFERER'])) { $db = DataBase::getinstance(); $_url = $db->escape($_SERVER['HTTP_REFERER']); $_pagename = $db->escape($this->getcurrentPage()->getpagename()); $db->begin(); $db->query("UPDATE plugin_referrer SET count = count + 1 WHERE pagename = '{$_pagename}' AND url = '{$_url}'"); if ($db->changes() == 0) { $db->query("INSERT INTO plugin_referrer VALUES('{$_pagename}', '{$_url}', 1)"); } $db->commit(); } } }
function do_url() { if (!isset(Vars::$post['bbsname']) || Vars::$post['bbsname'] == '') { throw new PluginException('パラメータが足りません。', $this); } if (!isset(Vars::$post['text']) || Vars::$post['text'] == '') { redirect(Page::getinstance(isset(Vars::$post['pagename']) ? Vars::$post['pagename'] : '')); } $db = DataBase::getinstance(); self::$sqlite_pattern = '^' . mb_ereg_quote(Vars::$post['bbsname']) . '/(\\d+)/.+$'; $db->create_aggregate('maxbbsnum', array('Plugin_bbs', 'sqlite_maxbbsnum'), array('Plugin_bbs', 'sqlite_maxbbsnum_finalize'), 1); $row = $db->fetch($db->query("SELECT maxbbsnum(pagename) FROM page")); $num = $row[0] + 1; $subject = isset(Vars::$post['subject']) && trim(Vars::$post['subject']) != '' ? trim(Vars::$post['subject']) : '(無題)'; $page = Page::getinstance(Vars::$post['bbsname'] . "/{$num}/{$subject}"); $smarty = $this->getSmarty(); $smarty->assign('timestamp', time()); $name = isset(Vars::$post['name']) ? trim(Vars::$post['name']) : ''; $smarty->assign('name', $name); $smarty->assign('text', Vars::$post['text']); $page->write($smarty->fetch('bbs.tpl')); setcookie('name', $name, time() + 60 * 60 * 24 * 30); redirect($page); }
protected function _markword_normal($w) { return mb_ereg_quote($w); }
/** * 投稿記事の保存。 */ protected function write() { if (mb_ereg('^' . mb_ereg_quote($this->blogname) . '/.+?/(.+)$', $this->continuefrom, $m)) { $continuefrom = "[[{$m[1]}>{$this->continuefrom}]]"; } else { $continuefrom = ''; } $catlist = ''; foreach ($this->categories as $c) { $catlist .= "[[[{$c}>{$this->categorypagename}/{$c}]]]"; } $smarty = $this->getSmarty(); $smarty->assign('subject', $this->subject); $smarty->assign('text', $this->text); $smarty->assign('categorylist', $catlist); $smarty->assign('timestamp', time()); $smarty->assign('continuefrom', $continuefrom); $smarty->assign('pagename', $this->pagename); $source = $smarty->fetch('blog.tpl'); //autolsプラグインと衝突しないように、書き込み順に注意。 DataBase::getinstance()->begin(); $this->_write_datepage(); Page::getinstance($this->pagename)->write($source); $this->_write_category(); $this->_write_continue(); DataBase::getinstance()->commit(); }
function do_search_fuzzy($word, $type = 'AND', $non_format = FALSE, $non_fuzzy = FALSE) { global $whatsnew, $non_list, $search_non_list; global $search_auth, $search_fuzzy; static $fuzzypattern = array('ヴァ' => 'バ', 'ヴィ' => 'ビ', 'ヴェ' => 'ベ', 'ヴォ' => 'ボ', 'ヴ' => 'ブ', 'ヰ' => 'イ', 'ヱ' => 'エ', 'ヵ' => 'カ', 'ァ' => 'ア', 'ィ' => 'イ', 'ゥ' => 'ウ', 'ェ' => 'エ', 'ォ' => 'オ', 'ャ' => 'ヤ', 'ュ' => 'ユ', 'ョ' => 'ヨ'); $retval = array(); $b_type = $type == 'AND'; // AND:TRUE OR:FALSE $keys = get_search_words(preg_split('/\\s+/', $word, -1, PREG_SPLIT_NO_EMPTY)); $_pages = get_existpages(); $pages = array(); $non_list_pattern = '/' . $non_list . '/'; foreach ($_pages as $page) { if ($page == $whatsnew || !$search_non_list && preg_match($non_list_pattern, $page)) { continue; } // 検索対象ページの制限をかけるかどうか (ページ名は制限外) if ($search_auth && !check_readable($page, false, false)) { $source = get_source(); // 検索対象ページ内容を空に。 } else { $source = get_source($page); } if (!$non_format) { array_unshift($source, $page); } // ページ名も検索対象に $b_match = FALSE; //miko modified if (!$search_fuzzy || $non_fuzzy) { foreach ($keys as $key) { $tmp = preg_grep('/' . $key . '/', $source); $b_match = !empty($tmp); if ($b_match xor $b_type) { break; } } if ($b_match) { $pages[$page] = get_filetime($page); } } else { $fuzzy_from = array_keys($fuzzypattern); $fuzzy_to = array_values($fuzzypattern); $words = preg_split('/\\s+/', $word, -1, PREG_SPLIT_NO_EMPTY); $_source = mb_strtolower(mb_convert_kana(join("\n", $source), 'KVCas')); for ($i = 0; $i < count($fuzzy_from); $i++) { $_source = mb_ereg_replace($fuzzy_from[$i], $fuzzy_to[$i], $_source); } $_source = mb_ereg_replace('[ッー・゛゜、。]', '', $_source); foreach ($keys as $key) { $_keyword = mb_strtolower(mb_convert_kana($word, 'KVCas')); for ($i = 0; $i < count($fuzzy_from); $i++) { $_keyword = mb_ereg_replace($fuzzy_from[$i], $fuzzy_to[$i], $_keyword); } $_keyword = mb_ereg_replace('[ッー・゛゜、。]', '', $_keyword); $b_match = mb_ereg(mb_ereg_quote($_keyword), $_source); } if ($b_match) { $pages[$page] = get_filetime($page); } } //miko modified } if ($non_format) { return array_keys($pages); } $r_word = rawurlencode($word); $s_word = htmlspecialchars($word); if (empty($pages)) { return str_replace('$1', $s_word, $_string['notfoundresult']); } ksort($pages); $retval = '<ul>' . "\n"; foreach ($pages as $page => $time) { $s_page = htmlspecialchars($page); $passage = get_passage($time); $retval .= ' <li><a href="' . get_page_uri($page, '', 'word=' . $r_word) . '">' . $s_page . '</a>' . $passage . '</li>' . "\n"; } $retval .= '</ul>' . "\n"; $retval .= str_replace('$1', $s_word, str_replace('$2', count($pages), str_replace('$3', count($_pages), $b_type ? $_string['andresult'] : $_string['orresult']))); return $retval; }
protected function __construct($datepagelist) { $this->datepagelist = $datepagelist; $this->pattern = '^(' . mb_ereg_quote($datepagelist->gethome()) . '/\\d{4}-\\d{2}-\\d{2})/.+$'; }
/** * 配列要素にヒットする正規表現を生成する。 * * @param array(string) &$pagelist この関数の実行後、$pagelistの中身は保証されない。 * @return string 正規表現 */ function makelinkexp(&$pagelist) { if (count($pagelist) <= 1) { return count($pagelist) == 0 ? '' : mb_ereg_quote($pagelist[0]); } $emptyflag = false; $bin = array(); while ($pagelist != array()) { $pagename = array_pop($pagelist); if ($pagename != '') { $bin[mb_substr($pagename, 0, 1)][] = mb_substr($pagename, 1); } else { $emptyflag = true; } } $key = array_keys($bin); foreach ($key as $k) { $ret[] = mb_ereg_quote($k) . makelinkexp($bin[$k]); } if (count($ret) == 1) { return $emptyflag ? '(?:' . $ret[0] . ')?' : $ret[0]; } else { return '(?:' . join('|', $ret) . ')' . ($emptyflag ? '?' : ''); } }