contents2_1.inc.php

サマリ#contents のプラグイン化、そして拡張
リビジョン1.0
対応バージョン1.4.x
投稿者sonots
投稿日2005-02-07 (月) 14:01:14

説明

sonots:contents2_1.inc.php に引っ越しました。フルスクラッチから書き直したsonots:contentsx.inc.php が最新版です。

  • rev.3 キャッシュ機能 2006-06-03

contents プラグインは実際のところプラグインではなく、本体組み込みの機能です。 拡張がしにくいのでプラグイン化しました。 アイデアの多くは自作プラグイン/ls2_1.inc.phpからきています。ということで名前はcontents2_1 です。

#contents をおいた位置より上の見出しが表示されても無駄だなと思っていた人が使うかもしれません。例えばこのページだと上の contents2_1.inc.php のリンクがいらない、と。

MenuBar に

#contents2_1(fromhere=false,hierarchy=false)

としておくのも便利かもしれません。hierarchy はお好みで。

関連

(欲しいプラグイン/170)(欲しいプラグイン/91)(続・質問箱/221)(続・質問箱/220)(質問箱/287)(欲しいプラグイン/125)(dev:BugTrack/617) (質問箱/59)(続・質問箱/447)(続・質問箱/306)

既知の問題点

問題1.include オプションを完全にはできないことが発覚しました。アンカー番号は convert_html が呼ばれた回数が振られるのですが、#contents2_1 が数えているのは結局のところ #include の数にしかすぎません。 つまり、convert_html を呼ぶ include 以外のプラグインが呼ばれるときっとずれます。

問題2.#include でとりこまれたページで表示される #contents2_1 のアンカーリンクの番号がまた1からはじまりうまくいきません。これは痛いです。

考察1.convert_html 中の static $contents_id を global にしたらどうかと考えてみましたが、だめです。

考察2.plugin_contents2_1_convert を convert_html が呼んだときに引数で $contents_id を渡す ことができたらどうかと考えてみましたが、そのように convert_html を改造できたとしても、問題2は直せますが問題1は変わりません。
ちなみに本体組み込み #contents は convert_html が $contents_id を渡しているこのような形です。include オプションがないのでこれ以上は悩む必要がないのです。
問題2のためにやりたいところですが、はてさて・・・。

考察3.とりあえず固定アンカーで逃げる。現在の pukiwiki はデフォルトで $fixed_heading_anchor = 1; のようなので全然ありみたいですね。

現状解.固定アンカーで逃げています。とりあえず解決

書式

#contents2_1([オプション])
&contents2_1([オプション]);

インライン型プラグイン時は強制的に display=inline となります。

オプション

  • page=ページ名

    見出しリストを行うページを指定。デフォルトはカレントページ。

  • fromhere=true|false

    #contents2_1 がある次の行以降の見出しのみをリストする。fromhere だけでも true になります。
    ファイル中の PLUGIN_CONTENTS2_1_FROMHEARE で初期値を設定できます。デフォルトで TRUE です。
    Note: 現状では #contents2_1 が2つあると一番上のものだけに反応してしまいます。 あえて page オプションで表示ページと異なるページを指定した場合は発動しないようにしています。

  • display=hierarchy|flat|inline

    リスト表示形式の指定。hierarchy では見出しのレベルに応じた階層的リスト表示。 flat では見出しのレベルによらず平らに表示。inline では横に並べて表示。
    ファイル中の PLUGIN_CONTENTS2_1_DISPLAY で初期値を設定できます。デフォルトは hierarchy です。
    Note: インライン型プラグインとして使用する場合は強制的に display=inline となる。

  • inline_before=文字列

    display=inline 時の前につける文字を設定。
    ファイル中の PLUGIN_LS2_1_DISPLAY_INLINE_BEFORE で初期値を設定できます。デフォルトでは '[ ' です。

  • inline_delimiter=文字列

    display=inline 時の区切り文字を設定。
    ファイル中の PLUGIN_LS2_1_DISPLAY_INLINE_DELIMITER で初期値を設定できます。デフォルトでは ' | ' です。

  • inline_after=文字列

    display=inline 時の後ろにつける文字を設定。
    ファイル中の PLUGIN_LS2_1_DISPLAY_INLINE_AFTER で初期値を設定できます。デフォルトでは ' ]' です。

  • compact=true|false

    リストのレベルを調節する。display=hierarchy 用のオプションです。compact だけでも true になります。
    ファイル中の PLUGIN_CONTENTS2_1_COMPACT で初期値を設定できます。デフォルトで TRUE です。

  • number=\d+ *1

    表示件数の指定。
    Note: include ページ名の表示も1つとカウントします。

  • depth=\d*[-+]?\d**2

    見出しレベル指定。1 なら見出しレベル 1 のみを表示する。 2-3 のような指定も可能 (2,3 の意)。2- のように指定するとレベル 2 以上の見出し。。 2+1 のような指定も可能 (2 とそこから +1 。つまり 2,3 の意)。
    Note: include ページ名がレベル0、見出しはレベル1以降です。 現状は compact を使用していても(デフォルトで TRUE)、depth オプションで指定するレベルは変わりません。 よって見た目と指定すべきレベルが違うかもしれません。一旦 compact=false として調べれば確実です。

  • except=正規表現

    リストしない見出しを正規表現にて指定。
    ヒント: ereg で判定を行います。 except=Test|sample → Test または sample を含む見出しを除く。

  • include=true|false

    #include プラグインで取り込んでいるページとその見出しも扱う。include だけでも true になります。
    ファイル中の PLUGIN_CONTENTS2_1_INCLUDE で初期値を設定できます。デフォルトで TRUE です。
    Note: ページタイトルへのジャンプは #include がアンカーを張ってくれないと無理です。 下のもっと便利に - include2.inc.php をご覧ください。

  • fixed_anchor=true|false

    固定アンカーがあればそれを利用する。fixed_anchor だけでも true になります。推奨です。
    ファイル中の PLUGIN_CONTENTS2_1_FIXEDANCHOR で初期値を設定できます。デフォルトで TRUE です。
    Note: 固定アンカーをつけるためには pukiwiki.ini.php 中で $fixed_heading_anchor = 1 と設定しなければいけません。現在の pukiwiki ではデフォルトで 1 です。

ダウンロード

拡張子の番号をはずして、plugin ディレクトリに放りこんでください。

リビジョン日付変更点
filev1.1303/05/2005include ページタイトルに対するアンカーが固定なアンカーになるように変更。自作プラグイン/include2.inc.phpの最新版が対応しているので include にはそちらを利用してください。これに伴い改造include.inc.phpは表面上消しました。
filev1.1203/04/2005自作プラグイン/include2.inc.phpの対応を受けて対応。#include, #include2 共に認識します。
filev1.1102/26/2005既知の問題点を固定アンカーで回避。display=inline 時の区切り文字等をオプションでも設定できるようにした。
filev1.1002/18/2005要望をうけてリストではなく横一列に表示する機能を追加。それをうけて hierarchy=true,false オプションは display=hierarchy,flat となり、今回の追加機能は display=inline と指定することになりました。depth オプション指定時のレベルを変更。include ページ名がレベル0、見出しはレベル1以降とたぶんわかりやすくなりました。インライン型プラグインとして実行可能に。ただし強制的に display=inline です。CSSで設定しやすいようにHTMLにクラス名を追加。ソースコードの整理。
filev1.0902/14/2005typo が原因で depth オプションが正しく動いていなかったので修正
filev1.0702/08/2005pageオプション使用時でもリンクにアンカーしか使用していなかったので修正
filev1.0602/08/2005v1.05の修正でv1.04時に修正したはずの症状がまたでていたので修正
filev1.0502/08/2005今度は再帰 include のときのアンカーの処理が間違っていたので修正
filev1.0402/08/2005別のところでまたアンカー付けの処理が間違っていたので修正
filev1.0302/08/2005アンカー付けの処理が間違っていたので修正
filev1.0202/06/2005page オプションを指定した場合 fromhere オプションが発動しないようにした。
filev1.0102/06/2005初版

もっと便利に - include2.inc.php

include プラグインは現状ではページタイトルの見出しにアンカーをつけてくれないので、 ジャンプできません。

自作プラグイン/include2.inc.php は #contetns2_1 のアンカーリンクに対応しているのでそちらを利用するとページタイトルへジャンプできるようになります。

使用例

次のような「とあるページ」があったとします。

**AA
#contents2_1
*B
***BBB
**CC
#include(別のページ)
*D

「別のページ」の内容は次のとおりだったとします。

*1
#contents2_1
**11

「とあるページ」の #contetns2_1 が変更されると思ってください。


#contents2_1
    • BBB
  • CC
  • 別のページ
      • 11

#contents2_1(fromhere=false)
  • AA
    • BB
  • CC
  • 別のページ
      • 11

MenuBar に設定する場合は fromhere=false を用いることになるでしょう。


#contents2_1(page=別のページ)
    • 11

#contents2_1(compact=false)
    • BBB (表現できません。もう一段階さがります。)
    • CC
  • 別のページ
      • 11
#contents2_1(compact=false,include=false)
    • BBB
    • CC

#contents2_1(compact=false,depth=1-2)
    • CC
    • 11
#contents2_1(compact=true,depth=1-2)
  • CC
    • 11
#contents2_1(compact=false,depth=1-2,include=false)
    • CC

#contents2_1(display=flat)
  • BBB
  • CC
  • 別のページ
  • 11

#contents2_1(display=inline,depth=1)

[ B | 1 | D ]


#contents2_1(number=5)
    • BBB
  • CC
  • 別のページ

#contents2_1(except=B)
  • CC
  • 別のページ
      • 11

#contents2_1(include=false)
    • BBB
  • CC

コメント

バグ、リクエストなどがあったら教えてください。リクエストは詳細な仕様も書いてくれたりするとうれしいです。

  • include ページタイトルへのジャンプがうまくいきません。#include プラグインがアンカーをつけてくれないので。とりあえず #content_2 のようにリンクを作っているので、#include のタイトルにそのようなアンカーを作る改造をすれば利用できます。 -- sonots 2005-02-07 (月) 15:11:12
  • アンケート。include=true のときは include ページ名タイトルがレベル1になって、見出しはレベル2以降になります。include=false のときはページタイトルがでてくることはないので、見出しがレベル1以降ということにしています。なので、depth オプション指定時に include を切り替えるたびに値をかえないといけなくなっています。どちらがよいでしょうか?
    選択肢投票
    現状(include=true 時は見出しレベルが2以降、include=false 時は見出しレベルが1以降)3
    include=true 時は見出しレベルが2以降、include=false でも見出しはレベル2以降0
    include=true 時は見出しレベルが2以降
    include=false の時は見出しのリスト表示レベルは1以降、でも depth では2以降(include=true時と同じになる)
    0
    include=true の時は見出しのリスト表示レベルが2以降、でも、depth では1以降
    include=false 時は見出しレベルが1以降(アンケート3とほぼ同じ。depth が -1)
    1
    compact=false のときの表示でレベル1がない場合がでてくるのが変かと思ったのです。compact=true にしておけばどちらでも結局詰まって同じように見えます。よって、常に compact=true (デフォルトです)の人には include=false でも見出しのレベルが変わらないのほうがうれしいかもしれません。しかし、compact=false を使いたくなったときに表示がやっぱり変なので。しかし・・・。 あ、もう一つ選択の余地がありました。depth オプションでの見出しの指定は常に2以降、つまり include オプションによらないが、表示は現状のように include オプションによって変わる。選択肢4になりました。ご協力ありがとうございました。-- sonots 2005-02-08 (火) 07:03:55
  • 試してみました。デフォルトでオンになっているfromhere機能が地味に便利ですね。私の場合 *見出しの後の行で #contents を使うことが多く、最初の *見出しがリストされるのは意味がないなぁと思っていたので重宝しそうです。
    includeオプションの説明ですがちょっと分かりにくいと思ったので、勝手に補足してみました。⌣ -- sagen 2005-02-08 (火) 10:31:45
  • あ、それから何かリストとリンク先がずれるなぁと思って、プラグインを眺めて今気づいたのですが、
    55: //見出しアンカーの開始番号
    56: define('PLUGIN_CONTENTS2_1_ANCHOR_ORIGIN',0);
    57: define('PLUGIN_CONTENTS2_1_PAGE_ANCHOR_ORIGIN',1);
    実際に使われているのは「PLUGIN_CONTENTS2_1_ANCHOR_ORIGIN」で「PLUGIN_CONTENTS2_1_PAGE_ANCHOR_ORIGIN」は使われていませんよね。57行目は削除して56行目の0を1にした方がいいのではないでしょうか。 -- sagen 2005-02-08 (火) 11:02:08
  • すいません。使用例のほうの include の説明が間違ってました。というわけで、include オプションの説明の修正はちょっと意味が違っちゃっていたのでまた修正しました。
    PLUGIN_CONTENTS2_1_PAGE_ANCHOR_ORIGIN は contents_1_0 などの 1 のほうで PLUGIN_CONTENTS2_1_ANCHOR_ORIGIN は 0 のほうを意味します。が、設定しておいて使いわすれていました。じかに = 1 とか書いちゃってました。ずれるのはそこではなくて、depth オプションなどで削ったときに +1 しそこなっちゃっているみたいです。修正しました。ありがとうございます。-- sonots 2005-02-08 (火) 16:46:01
  • ああ、つまりinclude=true(デフォルト)では、ページをincludeしていようがいまいが、depthオプションで見出しはレベル2以降になる、ということですか。勘違いしていました。&worried; それならいっそのこと、includeで取り込むページはレベル0として扱った方が、見出しのレベルがずれないので良いような気がします。-- sagen 2005-02-08 (火) 19:36:13
    • レベル0になってしまうと、<ul> が0個という意味になってしまいます。depth で使用するレベルとリスト表示で使用するレベルは同じですので。そこで、depth で使用するレベルとリスト表示で使用するレベルを分けて考えたのがアンケート3です。おそらく意図しているのは新たに追加のアンケート4でいいですよね?なんだかぐちゃぐちゃになってきました &worried;-- sonots 2005-02-08 (火) 21:25:28
  • v1.03をそのまま入れてみましたが、やはりリンクがずれます(depthオプションは未使用)。htmlを保存して見てみると、どうやら#contents2_1の前にある見出しにもアンカーが埋め込まれているのに、リストの方はそれを考慮せずにリンクを生成しているのでずれが生じるようです。 -- sagen 2005-02-08 (火) 19:36:13
    • 申し訳ない。一番利用頻度の高い使用方法がテスト漏れしていたなんて不覚です。ありがとうございました。 -- sonots 2005-02-08 (火) 21:25:28
  • include されるページ内に #contents2_1 がある場合その #contents2_1 のアンカーリンクの番号がいまのところうまくいきません(また content_1_0 から始まる)。#contents のほうは本体組み込みなので include されているということがわかって処理、もしくはわからなくても処理できているのかもしれません。なにかその判断に利用できる変数があるといいんですが。後で探しますが、ご存知の方いたらぜひ &smile; (convert_html の static $contents_id が global だったら終了みたいですね・・・)-- sonots 2005-02-09 (水) 06:50:52
  • v1.05にしてみましたが、まだずれます。&worried; とりあえず*見出しの直後に#contetns2_1を使っているので、define('PLUGIN_CONTENTS2_1_ANCHOR_ORIGIN',1); にしておいて事なきを得ていますが、これだと別の場所に書いた時はずれるんですよね……うーむ。#contents2_1(fromhere)が見つかった時点での$anchorを記録しておいて、279行目のリスト作成時にその値から始めないと駄目なような気がします。……勘違いだったらすみません。 -- sagen 2005-02-09 (水) 11:01:17
  • あぁ orz。 ver1.04 で修正して安心してしまって ver1.05 でいじっていたら再発しちゃったみたいです。今度こそ大丈夫(なはず)。 $anchor の記録というかカウント(++$anchor)する前に抜けちゃってるってかんじですね。-- sonots 2005-02-09 (水) 15:59:26
  • v1.07にしてアンカーとリンクが正しい対応関係になっているのを確認しました。&smile; お疲れ様でした。 -- sagen 2005-02-09 (水) 23:07:43
  • やはり contents のプラグイン化は無理があるっぽいです・・・ orz。convert_html の改造、また改造できたとしても・・・既知の問題点 -- sonots 2005-02-11 (金) 17:49:35
  • リクエストです。しかし、できればという感じです。contentプラグインは基本的に目次を縦方向にならべますが、横方向にならべるようにしたらまた別の便利さがでてくると思います。たとえば、レベル1のタイトルがすべて、「目次→|AA|B|CC|DDDD|E|」というように並んでくれて、各項目にリンクが貼られていたら便利です。 -- よう? 2005-02-12 (土) 09:46:00
    • レベル2、3も許可するとどういう挙動になるといいですか?include ページも許可するとどういう挙動になるといいですか?一番簡単にできそうと思われる方法は hierarchy=false の表示に対してスタイルシートで inline 化して横並びにさせることです。そして depth=1 となればお望みの挙動にはなると思います。デフォルトでは depth 制限しないので、レベル2、3, include ページに対してもレベルに区別なく出たもの順で全部横並びになるでしょう。これで OK ですかね?-- sonots 2005-02-12 (土) 12:14:56
      • 具体的にどのように作業をすればよろしいのでしょうか。是非、教えてください。レベル2、レベル3についての挙動はあんまり考えていないです。 -- よう? 2005-02-14 (月) 09:36:28
    • いや、仕様が決まれば作業は私がやります。ではレベル2、レベル3については上の記述のとおりでいいですかね。 -- sonots 2005-02-14 (月) 10:36:22
      • レベル2とレベル3について上の記述のとおりでいいと思います。楽しみにまってまーす。 -- よう? 2005-02-14 (月) 11:05:03
    • あ、これはインラインプラグインとして使いたいですか? &contents2_1 のような。行中にでも書けるという感じです。そうなると ul タグじゃ W3C 的にうまくないんですよね。また、インラインプラグインとしてよびだすときは、この表示形式だけ許可、現状のリスト表示はだめ、みたいな処理もいれないといけないかも。まぁこの辺は考えずにインラインとして使いたいか、別に現状的にブロックとして使えればいいのかだけ要望をください。 -- sonots 2005-02-14 (月) 11:22:44
    • filecontents2_1.inc.php.10.alpha アルファ版です。例のリストタグを inline 化して横並びにさせる方法です。イメージ的にはこれでいいでしょうか?あとは上のインラインプラグイン関係をやるかやらないかですね。display=inline とオプションをつけてください。区切り文字はファイル中で設定できます。現状デフォルトの区切り文字は [lol][111] のようになっています。最初は [lol|111] としようとしたのですが、1, l, | が見分けづらいなぁと思いまして。 hierarchy=true|false は display オプションにとりこまれて、display=hierarchy|flat|inline という指定方法になっています。見出しレベル1にしぼる場合は depth でしぼってください。depth で指定する数字が気に入らなければ上のアンケートに投票してください。 -- sonots 2005-02-14 (月) 13:19:49
      • 早速試してみました。対応、ありがとうございます。なかなかいい具合です。欲をだすと、インラインプラグインとしても使ってみたいです。けど、対応できたらということです。本当にどうもありがとうございました。 -- よう? 2005-02-16 (水) 22:53:06
  • v1.10 になって仕様が結構変わってしまったので注意してください。 -- sonots 2005-02-19 (土) 12:12:44
  • 既知の問題点の解決のめどが立つまで*3、開発を中止します。試みは失敗しましたorz -- sonots 2005-02-21 (月) 16:55:18
  • 固定アンカーで解決したことにします。開発を再開します。 -- sonots 2005-02-26 (土) 15:29:42

*1 \d+ は正規表現による表記です。例えば \d は数字のことです。
*2 \d*[-+]?\d* は正規表現による表記です。\d は数字のことです。
*3 PukiWikiの設計上、解決できるとしてもきっとめんどくさすぎる

添付ファイル: filecontents2_1.inc.php.13 2532件 [詳細] fileinclude.inc.php.1.diff 769件 [詳細] fileinclude.inc.php.2.diff 820件 [詳細] fileinclude.inc.php.2 623件 [詳細] filecontents2_1.inc.php.12 1436件 [詳細] filecontents2_1.inc.php.11 1493件 [詳細] filecontents2_1.inc.php.10 1506件 [詳細] filecontents2_1.inc.php.10.alpha 1435件 [詳細] filecontents2_1.inc.php.9 1459件 [詳細] filecontents2_1.inc.php.8 765件 [詳細] filecontents2_1.inc.php.7 1464件 [詳細] filecontents2_1.inc.php.6 1443件 [詳細] fileinclude.inc.php.1 757件 [詳細] filecontents2_1.inc.php.5 1478件 [詳細] filecontents2_1.inc.php.4 1499件 [詳細] filecontents2_1.inc.php.3 1473件 [詳細] filecontents2_1.inc.php.2 1549件 [詳細] filecontents2_1.inc.php.1 1567件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-08-06 (水) 00:35:56
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.661 sec.

OSDN