view: all

HatenaSyntax::getSectionName(HatenaSyntax_Node $root)

構文木からセクション名を得る。失敗した場合、空の文字列を返す。

<?php

$node = HatenaSyntax::parse('*sectionname* header
Lorem ipsum dolor sit amet, 
consectetur adipisicing elit, 
sed do eiusmod tempor incididunt ut
 labore et dolore magna aliqua. ');

HatenaSyntax::getSectionName($node); // => 'sectionname'


$node = HatenaSyntax::parse('* header
Lorem ipsum dolor sit amet, 
consectetur adipisicing elit, 
sed do eiusmod tempor incididunt ut
 labore et dolore magna aliqua. ');

HatenaSyntax::getSectionName($node); // => ''
 
?

HatenaSyntax::getSectionTitle(HatenaSyntax_Node $root, $config = array())

構文木からセクションのタイトルを得る。失敗した場合、空の文字列を返す。

$configはレンダラに渡す設定である。

 
?

HatenaSyntax::hasSeparator(HatenaSyntax_Node $root)

続きを読む記法'===='を持っているかどうかを返す。

<?php
include_once 'HatenaSyntax.php';

$str = '* header
====
body';

$node = HatenaSyntax::parse($str);
HatenaSyntax::hasSeparator($node); // => true
 
?

HatenaSyntax::hasTopHeader(HatenaSyntax_Node $root)

セクションの先頭に見出しを持っているかを取得する。

<?php

$node = HatenaSyntax::parse('* header
Lorem ipsum dolor sit amet, 
consectetur adipisicing elit, 
sed do eiusmod tempor incididunt ut
 labore et dolore magna aliqua. ');

HatenaSyntax::hasTopHeader($node); // => true


$node = HatenaSyntax::parse('Lorem ipsum dolor sit amet, 
consectetur adipisicing elit, 
sed do eiusmod tempor incididunt ut
 labore et dolore magna aliqua. ');

HatenaSyntax::hasTopHeader($node); // => false


$node = HatenaSyntax::parse('** Lorem ipsum dolor sit amet, 
consectetur adipisicing elit, 
sed do eiusmod tempor incididunt ut
 labore et dolore magna aliqua. ');

HatenaSyntax::hasTopHeader($node); // => false
 
?

HatenaSyntax::parse($str)

はてな記法をパースしてHatenaSyntax_Nodeインスタンスからなる構文木を返す。パースを正しく行うには渡す文字列がUTF-8である必要がある。

構文木をHTMLに変換するにはHatenaSyntax::renderNode()を利用する。

 
?

HatenaSyntax::parseAsSections($str)

文字列を受け取ってHatenaSyntax_Nodeインスタンスからなる構文木の配列を返す。

はてなダイアリーの様に、ひとつの記事を複数のセクションに分けたいときに使う。

 
?

HatenaSyntax::render($str, $config = array())

はてな記法をHTMLに変換して返す。$strはUTF-8である必要がある。

$configはレンダラに渡す設定である。

 
?

HatenaSyntax::renderNode(HatenaSyntax_Node $root, Array $config = array())

HatenaSyntax_Nodeからなる構文木をhtmlに変換する。$configはレンダラに渡す設定である。

 
?

HatenaSyntax::separate(HatenaSyntax_Node $root)

続きを読む記法'===='より前の部分を切り離した構文木を返す。

<?php

$str = '* header
body
====
after';

$node = HatenaSyntax::parse($str);
echo HatenaSyntax::renderNode(HatenaSyntax::separate($node));
/*
<div class="section">
<h1> header<a name="4d6fc99703a4619fb889e7e440b0d89b_header_0" id="4d6fc99703a4619fb889e7e440b0d89b_header_0"></a></h1>
<p>body</p>
<div class="separator"></div>

</div>
 */
 
?

このサイトではopenpearで公開しているHatenaSyntaxというライブラリのマニュアルを記述しています。

何かおかしいところや分かりづらい部分などがあったら開発者に連絡しましょう。

はてな記法パーサお試し版ではウェブ上でこのライブラリの動作を試すことが出来ます。

このライブラリはいくつかの利用実績を持っています。

 
?

コードハイライト

本ライブラリはコードハイライトのためのライブラリを含んでいない。

スーパーpre記法で色付け表示したい場合は、コードハイライトのためのライブラリを別に用意し、レンダラに渡す設定の'superprehandler'を設定する。

 
?

サポートする記法

HatenaSyntaxでサポートする記法の一覧。

はてなダイアリのはてな記法についてはこちらを参照。

見出し記法

* 見出し
** 小見出し
*** 小小見出し

名前付き見出し記法

*name* 見出し

この値はHatenaSyntax::getSectionName()で取得できる。

リスト記法

-ぶどう
--巨峰
--マスカット
-もも

順序付きリストも記述できる。

+ぶどう
+もも
++すもも

定義リスト記法

:京都府:京都市
:滋賀県:大津市
:三重県:津市

引用記法

引用する。引用はネストできる。

>>
Lorem ipsum dolor sit amet, 
consectetur adipisicing elit, sed do eiusmod tempor incididunt.
<<

また、引用元を記述できる。

>http://google.com/>
Lorem ipsum dolor sit amet, 
consectetur adipisicing elit, sed do eiusmod tempor incididunt.
<<

pre記法

整形した分をそのまま表示できる。

>|
Lorem ipsum dolor sit amet, 
consectetur adipisicing elit, sed do eiusmod tempor incididunt.
|<

スーパーpre記法

コードなどを色付して表示するための記法。

実際に色付け表示するには別にコードハイライトするライブラリを利用する。

>|html|
<html><head><title>lorem ipsum</title></head>
<body>
Lorem ipsum dolor sit amet, 
consectetur adipisicing elit, sed do eiusmod tempor incididunt.
</body></html>
||< 

表組み記法

|*名前|*色|*個数|
|りんご|赤|1|
|みかん|だいだい|2|

続きを読む記法

実際にはてなダイアリーの様に続きを読む記法を動作させたい場合は、HatenaSyntax::hasSeparator()HatenaSyntax::separate()を利用する。

====

pタグ停止記法

pタグのみ受け付ける。

><p>
Lorem ipsum dolor sit amet, 
consectetur adipisicing elit, sed do eiusmod tempor incididunt.
</p><

脚注記法

二重の丸括弧で囲んだ部分は脚注となる

lorem ipsum((脚注部分)) dolor sit amet, 
consectetur adipisicing elit, sed do eiusmod tempor incididunt.

改行記法

空行を二つ続けると改行する。

http記法

リンクをはる。

[http://google.com]

タイトルを指定するにはこうする。

[http://google.com:title=google]

タイトルの自動取得を指定する場合はこうする。

[http://google.com/:title]

タイトル自動取得の動作はレンダラの設定として渡すコールバックで規定される。詳しくはレンダラに渡す設定を参照。

自動リンク停止記法

[]で囲んだ文字はそのまま解釈される。

[][http://google.com][] これはリンクされずに角括弧がそのまま表示される。

下書き記法

htmlにも表示されないコメントとなる。

<!-- コメント -->

キーワード記法

[[と]]で囲むとキーワードリンクとなる。

目次記法

目次を表示する。

[:contents]
 
?

レンダラに渡す設定

レンダラに渡す設定は、以下のように配列で記述する。全ての項目は省略可能である。

<?php

$config = array(
    // ヘッダの基準値。デフォルトは1
    'headerlevel' => 3,                           

    // 記事の識別子。指定しない場合はランダムなIDが生成される
    'id' => 'hoge',                               

    // htmlをエスケープするか。デフォルトはtrue。
    'htmlescape' => false,                        

    // 記事本体を囲むdiv要素のクラス。デフォルトは'section'
    'sectionclass' => 'section',                  

    // 脚注を囲むdiv要素のクラス。デフォルトは'footnote'
    'footnoteclass' => 'footnote',                

    // キーワード記法のキーワードをアドレスに処理するコールバック
    'keywordlinkhanlder' => 'keywordLinkHandler', 

    // superpre記法の中身を処理するコールバック
    'superprehandler' => 'spreHandler',

    // [http://~~:title]のリンクを処理するコールバック
    'linktitlehandler' => 'linkTitleHandler'
);

echo HatenaSyntax::render($str, $config);

各項目については以下で説明する。

headerlevel - ヘッダの基準値

はてな記法のヘッダの基準値を設定する。例えば 1 に設定した場合、'*'がひとつの見出し記法はh1タグを使って変換される。

<?php

echo HatenaSyntax::render('* header', array('headerlevel' => 1));
/*
<div class="section">
<h1> header<a name="dd7a3c428fa04b8456e3d47d6d930092_header_0" id="dd7a3c428fa04b8456e3d47d6d930092_header_0"></a></h1>
</div>
*/

id - 記事の識別子

ページ内リンクで利用される記事の識別子を指定する。

指定されなかった場合はランダムなidが生成される。

htmlescape - HTMLをエスケープするか

はてな記法内のHTMLをエスケープするか否か。

デフォルトはfalse。

sectionclass - 記事を囲むdiv要素のクラス

記事を囲むdiv要素のクラス属性を指定する。

デフォルトは'section'。

footnoteclass - 脚注を囲むdiv要素のクラス

脚注を囲むdiv要素のクラス属性を指定する。

デフォルトは'footnote'。

keywordlinkhandler - キーワード記法のキーワードをアドレスに変換するコールバック

キーワード記法のキーワードからアドレスを返すコールバックを指定する。

<?php

function handler($keyword)
{
    return './' . $keyword;
}

$str = '[[my_keyword]]';

echo HatenaSyntax::render($str, array('keywordlinkhandler' => 'handler'));
/*
<div class="section">
<p><a href="./my_keyword">my_keyword</a></p>
</div>
 */

superprehandler - superpre記法の中身を処理するコールバック

suprepre記法の中身を処理するコールバックを指定する。

コールバックに渡される引数

最初の引数にその文書の種類(>|hoge|~~||<のhogeの部分)が渡され、二番目の引数に中身の行の配列が渡される。行の配列は、htmlescapeの値に関わらずhtmlエスケープされないので注意する。

<?php

function spre($type, Array $lines)
{
    foreach ($lines as &$line) {
        $line = htmlspecialchars($line, ENT_QUOTES, 'UTF-8');
    }
    return '<pre>' . PHP_EOL . join(PHP_EOL, $lines) . '</pre>' . PHP_EOL;
}

$str = '
>|php|
Lorem ipsum dolor sit amet, 
consectetur adipisicing elit, 
sed do eiusmod tempor incididunt 
ut labore et dolore magna aliqua. 
||<';

echo HatenaSyntax::render($str, array('superprehandler' => 'spre'));
/*
<div class="section">

<pre>
Lorem ipsum dolor sit amet, 
consectetur adipisicing elit, 
sed do eiusmod tempor incididunt 
ut labore et dolore magna aliqua. </pre>

</div>
 */

linktitlehandler - リンクのタイトルを処理するコールバック

[http://example.com:title]という形式のhttp記法をhtmlに変換する際に、URLからタイトルを取得するコールバックを指定する。このコールバックは、引数にURLを取ってタイトルを返さなければならない。

 
?

利用実績

 
?

簡単な使い方

手っ取り早くはてな記法をHTMLに変換するには、HatenaSyntax::render()メソッドを使う。文字列はUTF-8を渡すこと。

<?php
include_once 'HatenaSyntax.php';

echo HatenaSyntax::render('* Lorem ipsum dolor sit amet, 
consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 

+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. 
+ Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum
');
/*結果
<div class="section">
<h1> Lorem ipsum dolor sit amet, <a name="451267207f7cdf8f82dde43033c919d1_header_0" id="451267207f7cdf8f82dde43033c919d1_header_0"></a></h1>
<p>consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </p>
<p>Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </p>

<ol>
<li> Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. </li>
<li> Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum</li>
</ol>


</div>
*/
 
?
閉じる
C-s
保存
C-a
行頭へ移動
C-e
行末へ移動
C-p
一行上へ
C-n
一行下へ
C-f
右に移動
C-b
左に移動
C-m
改行
C-h
backspace