PukiWiki/1.4/ちょっと便利に
階層構造化されたページのタイトルを短く表示†
PukiWiki2のページに
現状のままでも良いけど、ディレクトリに相当する部分を分離表示するだけでもだいぶソレっぽくなると思うのですよ 例えば、とっても深い dir/dir2/dir3/ほげのページ に対して表示上のページ名(ページの先頭にデカデカと書かれる部分)は、ほげのページ として それ以前の部分を小さく添え書きするってのはダメですか? なんか 1.3系や1.4系でもすぐできる気がするけど -- 通行人? 2004-06-18 (金) 12:45:57
といふのがあったので、なんとなくやってみました。
skin/pukiwiki.skin.*.php、スキンを書き換えるだけです。
スキンの書き換え†
最新のCVSを元にすると45行目のh1タグの出力近辺をいじります。
<h1 class="title"><?php echo $page ?></h1>
を
<?php
if(mb_ereg("(.*)/(.*)", $title, $regs)){
$t = $regs[2]; //ページタイトル
$p = $regs[1]; //タイトルを除いたページのパス
$e = rawurlencode($t);
echo "<h1 class=\"title\"><a href=\"$script?$r_page&cmd=search&word=$e\">$t</a></h1>\n<span class=\"size1\">$p</span>";
}else{
echo "<h1 class=\"title\">$page</h1>";
}
?>
としただけです。
サンプル†
Linux備忘記/Redhat9でOpenLDAPを利用する/Migration toolsの日本語訳
コメント†
- validかどうか検証できるようなページではないので、してません。 -- kent
- ニーズによるとは思いますが、PC/AT、TCP/IP、S/MIME といった用語をページ名に含めたい場合、もう少し改造 (NGワードの設定およびエスケープ処理など) が要りそうですね。 -- henoheno
- PukiWiki1.4.3とPHP4.3.6だと、mb_ereg()が使えませんでしたがereg()でOKでした -- 「柴田」
- mb_ereg() は、(mbstring が有効なら)4.2.0 以降なら使えるとPHP マニュアルにありますが・・・。 --
- これってプラグイン化したほうがいいですかね。スキン側の問題なので微妙ですが。要望があればやります。 -- kent
- ところでそもそもPC/ATというページを擬似階層構造ではなく作れるものでしたっけ・・・。 -- kent
- 検索とかしていても反応してしまうのがいやだったので、条件に && $vars['cmd'] == 'read' を足してみました。http://morejams.no-ip.com/ --
- 質問箱4/50を参考にh1のリンクを削除したのですが、この項目と組み合わせるとリンクが出てきちゃいます、どの用にいじったらよいでしょうか? --
- 単純に<a>タグのくくりを消すで良いと思うけど --
<?php
if(mb_ereg("(.*)/(.*)", $title, $regs)){
$t = $regs[2]; //ページタイトル
$p = $regs[1]; //タイトルを除いたページのパス
- $e = rawurlencode($t);
- echo "<h1 class=\"title\"><a href=\"$script?$r_page&cmd=search&word=$e\">$t</a></h1>\n<span class=\"size1\">$p</span>";
+ echo "<h1 class=\"title\">$t</h1>\n<span class=\"size1\">$p</span>";
}else{
- echo "<h1 class=\"title\">$page</h1>";
+ echo "<h1 class=\"title\">$title</h1>";
}
?>
- 消してもリンクが残り、Backlinks forというのがでちゃうんですよね。見た感じどこにもリンクの要素が無いと思うのですが、どうしてもリンクが消えません。ちなみに下層に行く、つまりtest/testというページだとリンクがちゃんと消えます。一層のページやトップがこのリンクが残ってしまいます。 --
- official:質問箱4/50の後半部分に載っている、lib/pukiwiki.php の方は何もいじってないからこうなるんだよな…、たぶん。
もしそうなら、else の部分の修正を忘れてます(汗)。一部修正しました、これならどうですか。 --
- $page = $base; だったのを $page = $title;に変更しましたが特に変化はありませんでした。うーん、このタイトルを短く表示さえしなければちゃんと消えるんですけどねー。 --
- あ、申し訳ないです。echo "<h1 class=\"title\">$page</h1>";の方を変更してませんでした。こちらも変更したら無事うまく動作できました。ありがとうございます! --
- これって&は&じゃないと不味いんじゃないだろうか。 -- 0th track
- XSS が起こる可能性があるので、勝手に書き換えておきました。 --
- title.inc.phpでもこの機能を使いたいのですが可能でしょうか?この修正をすると<h1>の変更ができなくなってしまいます。 --
- if の条件文にある$title を、$_page か$vars['page'] に読み替えたらどうなりますか?(閲覧時以外は動かないようにしないと、不都合が出るかもしれませんが・・・) --
- $vars['page']はエラーがでて表示きませんでしたが、$_pageにするとこの修正が適用されず、<h1>も指定したものに変化してくれませんでした。現在は
<?php
if(mb_ereg("(.*)/(.*)", $title, $regs)){
$t = $regs[2]; //ページタイトル
$p = $regs[1]; //タイトルを除いたページのパス
echo "<h1 class=\"title\">$t</h1>\n<span class=\"size1\">$p</span>";
}else{
echo "<h1 class=\"title\">$title</h1>";
}
?>
という状態になっています。 --
- mb_eregをpreg_matchとしたらどうですか? -- 0th track
- preg_matchにし、$_pageなども試してみたのですがmb_eregと変わらずの結果となりました。 --
- pluginのソースを見ましたが、$titleと$pageを書き換えているだけなので使えるはずなんですが・・・。 -- 0th track
- 念のために確認したいのですが、どのファイルを修正しようとしてますか? --
- 再度試してみましたが、やはりダメですね。<title>は大丈夫なのですがやはり<h1>がプラグインとこの修正が両方適用されずに***/***/***と表示されてしまいます。どこか他に影響しているところがあるのでしょうか。 --
- pukiwiki.skin.phpを修正しています。この修正ではそれ以外は特にいじっていないですね。 --
- ***/***/*** は表示しているページのページ名全部ですか?
あと、「現在は~という状態になっています」の中でelse の時に$title を返してますが、それだと#title(タイトル1, タイトル2) と指定した時に<h1> の中にタイトル1 が返ってくるような・・・(else に来た場合) --
- ***/***/***はそうですね、ページ名全部になっています。$titleにした時はタイトル1が<h1>にきて、$_pageや$pageにした場合は***/***/***が帰ってくる状態になっています。
タイトル2が<h1>にきてくれるのが基本動作になると思うのですが、うまくいかない状態です。 --
- こうしたらどうなりますか?
<?php
mb_regex_encoding(SOURCE_ENCODING); //mb_ereg() で文字化けしないようにおまじない
if($page == make_search($_page) && mb_ereg("(.*)/(.*)", $_page, $regs)){
// $_page の中身はエスケープされていないので、忘れずにしておく
$t = htmlspecialchars($regs[2]); //ページタイトル
$p = htmlspecialchars($regs[1]); //タイトルを除いたページのパス
echo "<h1 class=\"title\">$t</h1>\n<span class=\"size1\">$p</span>";
}else{
echo "<h1 class=\"title\">$page</h1>";
}
?>
title プラグインでタイトルを設定したときなどは、問答無用で「短く表示」を使わなくするために条件を増やしてみました。 --
- おお、できました・・・っと思ったんですが、謎の現象が。#titleで記入し、更新した直後は希望通りの動作になるんですが、その後に一度でもブラウザの更新ボタン(wikiの編集では無いです)を押すと<h1>元に戻ってしまいます。
元に戻った時の状態はaaa/bbb/cccとした場合、cccにBacklinks forのリンクがある状態で表示されました。今まではこのリンクを消してるようにもしていたのですが。 --
- えーと、それはif が成立してccc aaa/bbb と分割されてますか、それともaaa/bbb/ccc ですか?どこでrelated へのリンクが付いたのかをもう少し絞り込まないと、誰もアドバイスできないかと。(上の中では比較用にmake_search() を使ってはいますが、出力にかかわる部分ではリンクを作ってはいないんですが)
それから、上の「$page == make_search($_page)」の部分はofficial:質問箱4/50の後半部分のようにlib/pukiwiki.php の$page を改造していないこと前提で書かれています。
あと1つ補足、「echo "<h1 class=\"title\">$page</h1>";」の部分の$page 、title プラグインでタイトル2の内容(省略した場合はタイトル1)がこれに入るので、ここはこのままにしてください。($title や他のものに変えるには、もっと前の工程を変えないと無理です) --
- ccc aaa/bbbと分割されている状態です。relatedへのリンクはブラウザの更新ボタンを押した時に分割されたcccに出てきます。
編集完了時が理想な形なのですが、更新後(他ブラウザから見た場合も)<h1>が元にもどっていたので、更新しました画面でだけ理想通りの動作になってるのかも?しれません
lib/pukiwiki.php の$pageの改造をしていましたので元の$page = $title;に戻して試しましたが動作の変化はありませんでした。 --
- 「$page == make_search($_page)」の部分はlib/pukiwiki.php の$page に応じて変形してくれというだけです。デフォルトの「$page = make_search($base);」であればこの比較の形で、
「$page = $title = htmlspecialchars(strip_bracket($base));」なら「$page === htmlspecialchars(strip_bracket($_page))」のように*1なります。
まあ、比較はどちらに分岐するかにしか関係ないので、リンクになってしまう事には関係ないはずですが。 --
- html.phpは$_page = isset($vars['page']) ? $vars['page'] : '';となっていました。
ソースはそれで間違い無いです、mb_ereg() で分割した直後の$tとは何を指すのかわかりませんでした、すいません。
echo "<h1 class=\"title\">$t</h1>";の行でしたら&pageと違いはありませんでした。 --
- var_dump() を使うなりして、変数$t にどんな値が入っているかを知りたいのです。
$t に代入した直後の値がもしccc ならecho() するまでのわずかな間、または出力後にリンクに置き換えられたと原因を絞れます。
逆に、この段階ですでにrelated へのリンクになっているのなら、$_page に代入された時点でリンクが混じっているのかをチェックしてさらに範囲を絞り込む、というように各工程をチェックしていかないと、(同じ状況を完全に再現できない限り)こちらからはアドバイスしづらいのです。 --
- 下記のようにしてみましたところarray(1) { [0]=> int(1) }となりました。
<?php
$t = array(1);
var_dump($t);
?>
このリンクの件を修正できれば<h1>にタイトル2と指定しているのにcccと表示される問題も解決できるのでしょうか?
原因が1つだともしかして探るのも楽なのかなと思いまして。
自分ではどう探っていいかわからないので工程をチェックしていただきありがとうございます。 --
- え~と、そちらでチェックしてくださいという事なのですが・・・。ここに書かれている部分以外がすべてデフォルトということはまずないので、同じ条件でチェックできません。(title プラグイン導入と「短く表示」の修正以外がデフォルト状態のPukiWiki 1.4.8_alpha2 で問題ないのは、確認しましたが・・・) --
- 変数に格納されている値を得る方法は間違っていないのですが、今欲しいのは「$t = htmlspecialchars($regs[2]);」の直後の値など、データの出力にかかわる値です。こちらでは、ccc aaa/bbb と分割される場合はどれもリンクにはならなかったので、そうなる原因が不明です。
タイトルを指定した場合、しなかった場合のどちらもccc aaa/bbb とccc がリンクになるのかなども、こちらでは確かめようがありません。 --
- ここの修正は基本的に、「短く表示」かそれとも本来のまま表示(タイトルを指定したのならその値)か、の2択です。
なので、タイトル2 を指定しているのにタイトル2 が表示されず、「短く表示」のみを表示しているのなら分岐条件にまだ穴があるという事です。 --
- 先ほどpukiwikiを新しく最初からいれみたのですが、確かにそちらでは完璧な動作をしてくれました。
ということやはり自分で原因を見つけるしかないということですね。
試しに怪しそうなhtml.phpとpukiwiki.phpを初期のと交換してみたのですが、それでも変わりなく機能しなかったので、他に原因がありそうです。
どこで変になってしまったかファイルを1つずつ初期のpukiwikiに戻してみますので、もしも原因がわかりましたら念のために報告しておきます。
長々とお付き合いしてくれてありがとうございました。大変参考になりました。 --
- ウチではこんな感じ
echo('<h1 class="title">' . (($title === $defaultpage) ? $page_title : ((strrpos($title, '/') === false) ? $title : substr($title, strrpos($title, '/') + 1))) . '</h1>');
タイトルの下にtopicpathプラグイン入れてるので。 -- 0th track