細々と使ってきたけど、自分の環境では安定したようなので公開。
タイトルまんま。↑のような目次を表示するプラグイン。動作にはPHP Markdown Extraが必要。Wordpressのバージョンは低くても動くような気がしないでもない。
このサイトではWordpressのページ機能を利用した全てのページでは自動的に目次を生成しているのだが、個別ページではなく通常の投稿でもたまーに長い文章を書くときがあるので、そっちでも自動で目次生成してくれたら楽だな~、と思って作った。
toc_for_md.phps
使い方
テンプレートに埋め込んで全ての記事に目次をつけるか、特定の記事にのみ目次をつけるかのどちらかになる。
テンプレートに埋め込む
以下のコードをテンプレートの本文ループ内のどこかに挿入する。
<?php
$toc = new toc_for_markdown;
$toc->create_toc( $post->post_content );
echo $toc->tochtml;
?>
本文に見出しが存在する場合は目次を表示する。
記事に埋め込む
特定の記事にのみ目次を表示させたい場合は、記事本文内に以下のコードを挿入する。
<!--TOC-->
or
<!--TOC min="2" max="3"-->
このコードは前後に文字を入れず、行の内容がこのコードだけになるようにすること。(そうしないとpre要素内に誤爆する)
minの値は取得する見出しの最低レベル、maxは最高レベル。省略した場合は予め設定された最低レベル・最高レベルで取得する。
目次を表示しない
テンプレートに埋め込んで常に目次を生成している場合に、特定の記事で目次を表示したくない場合は、以下のコードを記事本文に挿入する。挿入場所はどこでも構わないが、行の内容はこのコードだけにすること。
<!--disable TOC-->
プラグインの設定
- $html_prefix
- 目次の直前に追加するHTMLを指定する。
- $html_suffix
- 目次の直後に追加するHTMLを指定する。
- $def_minlv
- 取得する見出しの最低レベル。
- $def_maxlv
- 取得する見出しの最高レベル。
- $toc_startcnt
- 目次を生成する場合の見出しの最低数。見出しの数がこの値に満たないと目次が生成されない。テンプレートに埋め込んでいる場合にのみ有効。
目次の生成について
例えば以下のような文章があったとする。見出しと見出しの間には適当な文章が存在すると思いねぇ。
# タクティクスオウガ
## Chapter1
### 僕にその手を汚せというのか
## Chapter2
### 誰も僕を責めることはできない
### 思い通りにいかないのが世の中なんて割り切りたくないから
この文章を最低1最高2で目次にすると
<ul>
<li><a href="">タクティクスオウガ</a>
<ul>
<li><a href="">Chapter1</a></li>
<li><a href="">Chapter2</a></li>
<ul>
</li>
</ul>
このように、h1とh2だけ取得して目次を作成する。作成されたリストには見出しまでのリンクが付き、見出しにも適当なidが振られる。既にidが指定されていたらそのidへリンクするようにする。
Wordpressなら大抵本文のタイトルがh1だと思うので、h2からh3まで取得するのが丁度いいはずだ。h4まで取得すると目次が冗長になってしまう可能性がある。そこら辺は本文によって変えるといいだろう。
目次用のCSS
このCSSを適用することでこの記事トップの見出しにようにそれっぽく見えるようになる。見出しのHTMLはMarkdownを利用して生成しているのでidやclassを振ることができない。プラグインデフォルトのようにdivあたりで囲んでやるとよい。
.index ol {
counter-reset : list;
}
.index ol li {
list-style-type : none;
}
.index ol li:before {
content : counters( list, "." ) ". ";
counter-increment : list;
}
使用上の注意
- コメント中の見出しにも反応するので、あんまり入れないように。
- アンティークブラウザでは上記CSSを適用しても見出しっぽく見えない。
Markdown使ってないけど目次が欲しい方はTable of Contents Generatorをどうぞ。
Info
- 投稿日
- 2008年9月3日
- タグ
- php、site
- このエントリの固定リンク
- http://diary/log/1845.html
- ブックマークに追加する
-
- コメント
2008
0903
Tagsphpsite
ブログツール
Wordpress 2.3を使用。2.5はプラグインの仕様が変わってしまったので、使用するプラグイン全てが対応するまで見送る方向。
なぜWordpress?
便利だから。特にページ作成機能。普及しているのでプラグインも多い。
欠点はコードのカオスっぷり。統一感の無さが泣ける。ってか1.xの頃から全く変わってないのは呆れるわ。
サイトをどのように弄ったか
静的生成廃止
- テンプレートに修正が入ると全ページ出力し直さなければならない
- 時間指定投稿ができない
- キャッシュ系の機能とプラグインが豊富になってきた
などなどの理由により。
レイアウト
サイドバーを取り払い、エラスティックにしてAutoPagerizeにも対応。なるべくシンプルになるように心がけた。
キャッシュの利用
Wordpressを素のままで扱うとSQLクエリの過多でサーバーが重くなってしまうので、積極的にキャッシュを利用するようにした。
具体的にはWordpressに標準で備わっているオブジェクトキャッシュ。さらにプラグインのWP Super cacheを導入。極力データベースへアクセスしないようにした。
この時点でトップページを開いた時に要する時間は初回2秒前後、キャッシュ後0.3秒前後。
サイトの構成が安定したら一部ファイルにmod_expireを設定して、クライアント側でのキャッシュも行ってもらうつもり。レイアウトに使っている画像なんかは特に。
画像の連結
縦と横のサイズが固定されている要素に繰り返さないで表示する画像は連結できるので、RPGツクールのマップチップの如く、ひたすら連結。
参考:icon_chip.png
トータルサイズは微増するが、httpアクセスが激減するという効果があるので実に有効。ページのローディングを妨げないようになる。
サイズが固定されていなくても、条件次第ではチップに組み込むことが可能だったりする。要工夫。
この手法はCSS Spriteとか言うらしい。
JavaScriptの積極的廃止
自分が常にJavaScriptをオフにしていることもあるが、サイトに仕込まれているJavaScriptはよほどのことが無い限り必要ではない、もしくは、無くてもいいようにサイトを設計すべきだと判断した。
というわけで、現在入れているのはGoogle Analytics等のアクセス解析のみ。
あと、JavaScriptじゃないけど「なかのひと」も外した。たまにしか見なかったし、表示するスペースが無かったので。
関連するエントリの表示
表示にはプラグインのSimple Tagsを利用。
タグの設定が甘い上に少ないので微妙に関連していないようなエントリも表示されている気がするが、そのうち解決すると思うので放置中。
目次の自動生成
本文からH1~H6の見出しを取得して、それらへのアンカーをリストで表示するようにした。コードはこなかじ。
<?php
if( is_archive( ) && !$already_out ) {
$already_out = true;
$header_list = array( );
foreach( $posts as $p ) {
array_push( $header_list, "1. [" . preg_replace( '/\[(.*?)\]\(.*?\)/', "$1", $p->post_title ) . "](#p" . $p->ID . ")" );
}
}
if( is_page( ) ) {
$header_cnt = 1;
$header_list = array( );
function getHeader( $matches ) {
global $header_cnt, $header_list;
$title = preg_replace( '/^\s|\s$/', "", preg_replace( '/\[(.*?)\]\(.*?\)/', "$1", $matches[2] ) );
$tab = str_repeat( "\t", strlen( $matches[1] ) - 2 );
$anchor = $matches[3] ? $matches[3] : "h" . $header_cnt++;
array_push( $header_list, $tab . "1. [" . $title . "](#" . $anchor . ")" );
return $matches[1] . " " . $title . " {#" . $anchor . "}";
}
if( $page > count( $pages ) )
$page = count( $pages );
$pages[$page-1] = preg_replace( '/\r\n|\r|\n/', "\n", $pages[$page-1] );
preg_replace_callback('{
^(\#{2,6})
[ ]*
(.+?)
(?:[ ]+\{\#([-_:a-zA-Z0-9]+)\})?
$
}xm','getHeader', $pages[$page-1] );
}
?>
<?php if( count( $header_list ) > 0 ) : ?>
<div class="index">
<p>目次</p>
<?php
$header_html = Markdown( join( $header_list, "\n" ) );
echo $header_html;
?>
要はMarkdownテキストから見出し部分(行頭が#の連続)を取得して、それらの頭に数字を付けて無理やり順序付きリストにしてからMarkdownに放り込んでいる。idが指定されていないなら自動で付加。
URLについて
ワードプレス標準の動的URL設定が融通がきかないので結局mod_rewriteでゴリゴリ書いた。
はてなブックマークの注目エントリーを表示
最初はJSONとか考えたが、HTMLにしてしまうのが最もシンプル且つ効率的(どうせ再利用しないし)だと判断した。
スクリプトの中身はPraggerのRSS::loadで読み込んで適当に数を絞ってるだけ。
ブックマークコメントを表示
JavaScriptを使わずにブックマークコメントを表示を参照。
利用しているプラグイン
Pager、いわゆるカテゴリ等のページで現在のページ番号と前後及び始端終端の番号を表示するやつ、といえば分かるだろうか。Google検索の最下部のアレとか。
スタイルは以下のページから拝借した。
Some styles for your pagination
スパム対策として広く使われているプラグイン。要登録。
こちらもスパム対策。投稿者の投稿頻度、ページを開いてから投稿するまでの時間、内容に含まれるURLの数などなど、様々な手法で評価してスパムかどうかを判断することができる。
Wordpress標準のタグ機能を拡張するプラグイン。タグクラウドの表示や一括編集、関連したエントリの表示等ができる。
一度出力したページをキャッシュすることで、次回以降のDBアクセス時間を無くし、表示までの時間を大幅に短縮することができるプラグイン。何かとDBアクセスを行うWordpressには必須のプラグイン。
Markdown記法でエントリを記述できるようになる。可読性が高く、DBも微妙にスリム化できる。このプラグインを通さないようなテキストまでMarkdown記法を使ってしまうほど愛用している。
利用していないが注目したプラグイン
パンくずリストを表示するプラグイン。サイトURL設計が微妙にアレなので結局このプラグインからコードを拝借してパンくずリストを生成するようにした。
投稿時にAmazonから商品を検索して記事の中に商品の画像とリンクをD&Dでサクっと入れることができるようになるプラグイン。Operaで動かなかったので見送り。
自分の好きなフォントで表示できるというのは非常に魅力的だったが、画像だらけになるのは嫌なので結局使わなかった。
今後の方針
- 旧ページを新レイアウトへ以降
- Wordpressのアップグレード
- サイト内に自分用wikiを置きたい
Info
- 投稿日
- 2008年7月14日
- タグ
- php、site
- このエントリの固定リンク
- http://diary/log/1773.html
- ブックマークに追加する
-
- コメント
2008
0714
Tagsphpsite
特定の製品について、購入から長期間たつと作動不能となり、販売店などで点検してもらわないと再起動しない仕組みを検討する。タイマーにあらかじめ設定した時期が来ると、自動的に回路に電流が流れなくなるような機能で、使用を続けたい消費者は点検を受けなければならない。
経産省:「安全な家電」へ法改正検討 松下製温風機事故受け
これはひどい。安全にかこつけて搾取しようとしてるようにしか見えん。
Info
- 投稿日
- 2006年1月28日
- タグ
- php
- このエントリの固定リンク
- http://diary/log/1307.html
- ブックマークに追加する
-
- コメント
2006
0128
Tagsphp
「電気用品安全法」のせいで4/1から古いゲーム機の販売ができなくなる可能性がある
レトロゲーマーに最大の危機が。仮に完全に施行されたら本体の買い換えが不可能ってことか。そして意見の募集が2年前から既に行われていたとは。全く知らんかったぞ。
あー、とりあえずサターンとDCだけでも確保しとくのがいいのかね。さすがに4/1から一斉に販売禁止にはならんだろうが、徐々に徐々になっていのだろうし。
つか、中古販売中心の店舗って非っ常にマズイのでは?
Info
- 投稿日
- 2006年1月23日
- タグ
- php
- このエントリの固定リンク
- http://diary/log/1302.html
- ブックマークに追加する
-
- コメント
2006
0123
Tagsphp
論争 はしでカレー 学校給食4割スプーン使わず
ある小学校長は「日本人なら、はし。カレーでもスプーンは必要ない」と言い切り、今後もスプーンとの併用はしない考えだ。
最初ネタかと思ったらしっかり富山新聞のドメインだしなー。
校長はカレーを箸ですすればいいと思うが、生徒には両方出して選択させようとは微塵も思わないのか。と、ややマジメに答えようとするのがバカらしく見えてしまうんだが。
Info
- 投稿日
- 2005年12月14日
- タグ
- php
- このエントリの固定リンク
- http://diary/log/1266.html
- ブックマークに追加する
-
- コメント
2005
1214
Tagsphp