public function format($str) { if (module_const('is_cache', false)) { $store_key = array('__hatenaformat_format', $str); if (Store::has($store_key)) { return Store::get($store_key); } } $str = HatenaSyntax::render($str, Text::dict(module_const('option')) + array('headerlevel' => 3, 'htmlescape' => true, 'linktitlehandler' => 'HatenaFormat::linktitleHandler', 'keywordlinkhandler' => 'HatenaFormat::keywordlinkHandler')); if (module_const('is_cache', false)) { Store::set($store_key, $str, self::CACHE_EXPIRE); } return $str; }
protected function __fm_description__() { return HatenaSyntax::render($this->description()); }
$CON = preg_replace(array_fill(0, count($htmlcodes[1]) + 1, '/{HTML}/'), $htmlcodes[1], $CON, 1); */ } plugin('formatEnd'); plugin('formatFinished'); // Loading template. If does not exist, use built-in default $html = file_exists($TEMPLATE) ? file_get_contents(clear_path($TEMPLATE)) : fallback_template(); // including pages in pure HTML while (preg_match('/{include:([^}]+)}/U', $html, $m)) { $inc = str_replace(array('{html}', '{/html}'), '', @file_get_contents("{$PG_DIR}{$m['1']}.txt")); $html = str_replace($m[0], $inc, $html); } plugin('template'); $html = preg_replace('/\\{([^}]* )?plugin:.+( [^}]*)?\\}/U', '', $html); // get rid of absent plugin tags $hs_ex = new HatenaSyntax(); //this part is setting on Template Tag $tpl_subs = array('HOME_URL' => '?page=MainPage', 'INFO_URL' => '?page=infomation', 'MEMBER_URL' => '?page=members', 'ARCHIVES_URL' => '?page=MainPage&Archives=1', 'CONTACT_URL' => '?page=contact_us', 'MAKE_NEW_ARTICLE' => '<a href="?blog=true&page=_Blog__' . date("YmdHmi") . '&action=edit">ブログ新規記事を作成する</a>', 'SYNTAX_EXPLAIN' => $action == "edit" || $preview ? preg_replace("/\\!--/", "<br /><a href='#syntax_explain'>▲先頭に戻る</a><hr />", $hs_ex->ConvertHatenaSyntax(file_get_contents("syntax_explain.txt"))) : "", 'TOOLBAR' => isset($_SESSION['jichikaiLogin']) ? $action == "edit" || $preview ? file_get_contents("plugins/toolbar.html") : "" : "", 'BlogArticleList' => $bl->BlogList(5), 'EditInfo' => isset($_SESSION['jichikaiLogin']) ? "|{MAKE_NEW_ARTICLE}|{EDIT}|" : "{LOGIN}", 'LOGIN' => '|<form action="logincheck.php" method="post"><input name="backto" type="hidden" value="?page=' . $page . '" /><label>ユーザー名 <input name="user" type="text" size="20" /></label>|<label>パスワード <input type="password" name="pass" size="20" /></label>|<input type="submit" size="15" value="ログイン" /></form>|', 'HEAD' => $HEAD . ($action ? '<meta name="robots" content="noindex, nofollow"/>' : ''), 'SEARCH_FORM' => '<form action="' . $self . '" method="get"><span><input type="hidden" name="action" value="search"/><input type="submit" style="display:none;"/>', '\\/SEARCH_FORM' => "</span></form>", 'SEARCH_INPUT' => '<input type="text" name="query" value="' . h($query) . '"/>', 'SEARCH_SUBMIT' => "<input class=\"submit\" type=\"submit\" value=\"{$T_SEARCH}\"/>", 'HOME' => "<a href=\"{$self}?page=" . u($START_PAGE) . "\">{$T_HOME}</a>", 'RECENT_CHANGES' => "<a href=\"{$self}?action=recent\">{$T_RECENT_CHANGES}</a>", 'ERROR' => $error, 'HISTORY' => $page ? "<a href=\"{$self}?page=" . u($page) . "&action=history\">{$T_HISTORY}</a>" : "", 'PAGE_TITLE_HEAD' => preg_match("/_Blog__/", $page) ? $blogTitle : ($_GET["Archives"] ? "Archives" : h($TITLE)), 'PAGE_URL' => u($page), 'EDIT' => !$action ? "<a href=\"{$self}?page=" . u($page) . "&action=edit" . (is_writable("{$PG_DIR}{$page}.txt") ? "\">{$T_EDIT}</a>" : "&showsource=1\">{$T_SHOW_SOURCE}</a>") : "", 'WIKI_TITLE' => h($WIKI_TITLE), 'LAST_CHANGED_TEXT' => $last_changed_ts ? $T_LAST_CHANGED : "", 'LAST_CHANGED' => $last_changed_ts ? date($DATE_FORMAT, $last_changed_ts + $LOCAL_HOUR * 3600) : "", 'CONTENT' => $action != "edit" ? $_GET["Archives"] ? $ARCON : $CON : "", 'TOC' => $TOC, 'SYNTAX' => isset($_SESSION['jichikaiLogin']) ? $action == "edit" || $preview ? "<a href='javascript:void(0);' onClick='Show_Syntax(this)'>▼記法について</a>" : "" : "", 'SHOW_PAGE' => $action == "edit" || $preview ? "<a href=\"{$self}?page=" . u($page) . "\">{$T_SHOW_PAGE}</a>" : "", 'COOKIE' => '<a href="' . $self . '?page=' . u($page) . '&action=' . u($action) . '&erasecookie=1">' . $T_ERASE_COOKIE . '</a>', 'CONTENT_FORM' => isset($_SESSION['jichikaiLogin']) ? $CON_FORM_BEGIN : "", '\\/CONTENT_FORM' => isset($_SESSION['jichikaiLogin']) ? $CON_FORM_END : "", 'CONTENT_TEXTAREA' => isset($_SESSION['jichikaiLogin']) ? $CON_TEXTAREA : "", 'CONTENT_SUBMIT' => isset($_SESSION['jichikaiLogin']) ? $CON_SUBMIT : "", 'CONTENT_PREVIEW' => isset($_SESSION['jichikaiLogin']) ? $CON_PREVIEW : "", 'RENAME_TEXT' => $RENAME_TEXT, 'RENAME_INPUT' => $RENAME_INPUT, 'EDIT_SUMMARY_TEXT' => $EDIT_SUMMARY_TEXT, 'EDIT_SUMMARY_INPUT' => $EDIT_SUMMARY, 'FORM_PASSWORD' => $FORM_PASSWORD, 'FORM_PASSWORD_INPUT' => $FORM_PASSWORD_INPUT); foreach ($tpl_subs as $tpl => $rpl) { // substituting values $html = template_replace($tpl, $rpl, $html); } foreach ($tpl_subs as $tpl => $rpl) { // substituting values $html = template_replace($tpl, $rpl, $html); } header('Content-type: text/html; charset=UTF-8'); die($html); // Function library function h($t) {
/** * パッケージの詳細 * @param string $package_name パッケージ名 * @param string $path リポジトリのパス * @request string $lang ロケール * @request string $tag タグ * @context OpenpearPackage $package パッケージ * @context string $body 説明 */ public function document_browse($package_name, $path = '') { $lang = $this->in_vars('lang', Gettext::lang()); if (empty($path)) { $this->redirect_method('document_browse', $package_name, '/' . $lang . '/README'); } else { if (strlen($path) > 4) { $lang = substr($path, 1, 2); } } $package = C(OpenpearPackage)->find_get(Q::eq('name', $package_name)); $path = rtrim(ltrim($path, ' /.'), '/'); $root = File::absolute(OpenpearConfig::svn_root(), implode('/', array($package->name(), 'doc'))); $repo_path = File::absolute($root, $path); $this->vars('package', $package); try { $body = Subversion::cmd('cat', array($repo_path)); } catch (Exception $e) { $body = ''; } if (empty($body)) { Http::status_header(404); $body = '* Not found.' . PHP_EOL; $body .= 'Requested page is not found in our repositories.'; } $this->vars('lang', $lang); $this->vars('body', HatenaSyntax::render($body)); $this->vars('tree', Subversion::cmd('list', array($root . '/' . $lang), array('recursive' => 'recursive'))); $this->add_vars_other_tree($package_name, 'doc'); }
<?php include_once dirname(__FILE__) . '/../lib/HatenaSyntax.php'; $str = '*hogehoge fugafuga'; var_dump(HatenaSyntax::parse($str)); /* object(HatenaSyntax_Node)#217 (2) { ["type":protected]=> string(4) "root" ["data":protected]=> array(3) { [0]=> object(HatenaSyntax_Node)#213 (2) { ["type":protected]=> string(6) "header" ["data":protected]=> array(2) { ["level"]=> int(0) ["body"]=> array(8) { [0]=> string(1) "h" [1]=> string(1) "o" [2]=> string(1) "g" [3]=> string(1) "e"
<?php require 'plugins/original_HatenaSyntax.php'; $h = new HatenaSyntax(); $t = "|test|aaaa|\n|a|[http://google.com]|"; echo $h->ConvertHatenaSyntax($t);
foreach ($lines as &$line) { $line = htmlspecialchars($line, ENT_QUOTES, 'utf-8'); } $body = join(PHP_EOL, $lines); return '<pre class="superpre ' . htmlspecialchars($type, ENT_QUOTES, 'utf-8') . '">' . PHP_EOL . $body . '</pre>'; } function keywordLinkHandler($path) { return './' . $path; } function linkTitleHandler($url) { return $url; } // オプションは全て省略可。第二引数自体も省略可。 echo HatenaSyntax::render($str, array('headerlevel' => 3, 'id' => 'hoge', 'htmlescape' => false, 'sectionclass' => 'section', 'footnoteclass' => 'footnote', 'keywordlinkhanlder' => 'keywordLinkHandler', 'superprehandler' => 'spreHandler', 'linktitlehandler' => 'linkTitleHandler')); /* 結果 <div class="section"> <h3>header1<a name="ea703e7aa1efda0064eaa507d9e8ab7e_header_0" id="ea703e7aa1efda0064eaa507d9e8ab7e_header_0"></a></h3> <div class="toc"><ol> <li> <a href="#ea703e7aa1efda0064eaa507d9e8ab7e_header_0">header1</a> <ol> <li> <a href="#ea703e7aa1efda0064eaa507d9e8ab7e_header_1">header2</a> <ol> <li><a href="#ea703e7aa1efda0064eaa507d9e8ab7e_header_2">blockquote header</a></li> </ol> </li> </ol> </li>
public function setChangelog($value) { $this->pm('changelog', HatenaSyntax::render($value, $this->_hatena_config)); }
$text = <<<EOS *s1* hoge a *s2* fuga b *s3* piyo c EOS; $nodes = HatenaSyntax::parseAsSections($text); foreach ($nodes as $node) { $name = HatenaSyntax::getSectionName($node); echo "<!--{$name}-->\n"; echo HatenaSyntax::renderNode($node); echo "\n"; } /* 結果 <!--s1--> <div class="section"> <h1> hoge<a name="0a5f00d24e95fc67f4933ba9d374a09f_header_0" id="0a5f00d24e95fc67f4933ba9d374a09f_header_0"></a></h1> <p>a</p> </div> <!--s2--> <div class="section"> <h1> fuga<a name="685dfe890c0b3e6cb12683009061a63d_header_0" id="685dfe890c0b3e6cb12683009061a63d_header_0"></a></h1> <p>b</p>
<?php include_once dirname(__FILE__) . '/../t.php'; $t = new lime_test(); $hs = new HatenaSyntax(); $node = $hs->parse('*hoge*header'); $t->is($hs->getSectionName($node), 'hoge'); $node = $hs->parse('*hoge'); $t->is($hs->getSectionName($node), ''); $node = $hs->parse('**hoge*header'); $t->is($hs->getSectionName($node), ''); $node = $hs->parse(''); $t->pass(); $nodes = $hs->parseAsSections("\n*hoge\n*fuga\n*piyo"); $t->is(count($nodes), 3); $nodes = $hs->parseAsSections("*hoge\n\nfuga"); $t->is(count($nodes), 1); $title = $hs->getSectionTitle($hs->parse('*hahaha')); $t->is($title, 'hahaha'); $title = $hs->getSectionTitle($hs->parse('*hoge*s[http://google.com]')); $t->is($title, 'shttp://google.com'); $hasTopHeader = $hs->hasTopHeader($hs->parse('*hoge')); $t->ok($hasTopHeader); $hasTopHeader = $hs->hasTopHeader($hs->parse('hoge')); $t->ok(!$hasTopHeader); $hasSeparator = $hs->hasSeparator($hs->parse('* fuga')); $t->ok(!$hasSeparator); $hasSeparator = $hs->hasSeparator($hs->parse("* hoge\n====\nhahaha")); $t->ok($hasSeparator); $node = $hs->separate($hs->parse("* hoge\n====\nhahaha")); $t->is(count($node->getData()), 2);