*アンカー名重複を防ぐためにも、見出しタイトル出力で自動的に固定したアンカー出力を [#ad4513bc] -ページ: BugTrack -投稿者: [[reimy]] -優先順位: 低 -状態: 完了 -カテゴリー: 本体新機能 -投稿日: 2003-04-24 (木) 01:03:44 -バージョン: **メッセージ [#b56851b8] [[BugTrack/285]]関連。 *、**、***で自動的に固定的なアンカーを出力してほしい。 手動でアンカーを付けると、#calendar_viewなどで複数ページを一括表示した場合に、アンカー名が重複してしまうので、一意的な固定したアンカーを出力してほしい。一つ一つの記事で重複しないアンカー名を手作業で付けるのはあまりにも非効率で非現実的な作業になってしまう。手作業で付け始めて困難に直面してます。 その場合、*、**、***で指定したタイトル全体を<a>タイトル</a>で囲んでほしい。 &aname(hoge);ではなく&aname(hoge){hogehoge};形式でのアンカー名設定が普及しない内にやらないと厄介なことになる(処理によってはアンカーがネストしてしまうおそれがある)ので、''1.4リリースまでに…という意味''で、あえて「緊急」にしておきます。 ---- -見出し全体を<a>~</a>で囲んでしまうと、見出しの中でWikiNameやBracketNameにリンクを張ることができなくなってしまいますが。 -- [[ぱんだ]] &new{2003-04-24 (木) 14:19:55}; --そうしないと第三者にアンカーの存在がわかりません。もしくはタイトルの末尾に<a style="font-size:10px;vertical-align:super">■</a>というようにでもしますか? -- [[reimy]] &new{2003-04-24 (木) 14:19:58}; -とりあえず第一案です。 -- [[ぱんだ]] &new{2003-04-24 (木) 14:19:55}; ++ページの更新時に(now ?などの置換と同時期に)見出し行に固有IDを挿入 file.php/make_str_rules() // 日付・時刻置換処理 foreach ($arr as $str) { if ($str != '' and $str{0} != ' ' and $str{0} != "\t") { foreach ($str_rules as $rule => $replace) { $str = preg_replace("/$rule/",$replace,$str); } } + // 見出しに固有IDを付与する + if (preg_match('/^(\*{1,3}(.(?!\[#[A-Za-z][\w-]+\]))+)$/',$str,$matches)) + { + $anchor = md5(uniqid($matches[2],1)); + $str = rtrim($matches[1])." [#A$anchor]\n"; + } $retvars[] = $str; } ---md5()の出力をそのまま使っているので、妙に長い(32+1桁)です。 ---未来永劫絶対にユニークである、とは断言できないですが、たぶん大丈夫でしょう。 ---アンカーにしたい文字列を手動で[ #hogehoge]書いておくことも可能です。その場合、自動挿入はされません。 ++コンバート時置換ルールに、上記IDをアンカーに置換するルールを追加 default.ini.php,i_mode.ini.php,jphone.ini.phpなど '#related' => '<del>#related</del>', +'\[#([A-Za-z][\w-]+)\]' => '<a class="anchor" id="$1" href="#$1" title="$1">†</a>', ---ユーザ定義ルールなので、ページのどこに書いてあっても置換の対象になります。 ++おまけ CSS .anchorを定義 default.ja.css,default.en.css +.anchor +{ + font-size:xx-small; + vertical-align:super; +} -これだと''#contentsや#ls2の出力にも † が出力''されてしまいますねぇ…。ちとまずい。 -- [[reimy]] &new{2003-04-24 (木) 15:20:47}; --ちょっと#contentsと#ls2の暫定対処。インチキっぽいやり方なのであくまで暫定 -- [[reimy]] &new{2003-04-25 (金) 01:55:24}; ~convert_html 800行めあたり // 行頭\nで整形済みを表す ... X( + $text = preg_replace("/\s\[#[A-Za-z][\w-]+\]/",'',$text); // [#...]を削除 $text = "\n<a href=\"#$id\">".strip_htmltag(inline2(inline($text,TRUE)))."</a>\n"; ~ls2.inc.php 195行めあたり // array_push($params['result'], '<li>'.$s_title // .'<a href="'.$href.LS2_CONTENT_HEAD.$anchor.'">'.$_ls2_messages['msg_go'].'</a>' + $s_title = preg_replace("/\s\&dagger\;$/",'',$s_title); // †を削除 array_push($params['result'], '<li><a href="'.$href.LS2_CONTENT_HEAD.$anchor.'">'. $s_title.'</a>' -主眼とする部分(固有番号のアンカー設定)は暫定解決したので、重要度を「低」に下げます。 -- [[reimy]] &new{2003-04-25 (金) 14:17:20}; ---- -それとアンカーにhrefで設定する飛び先は単純に#hogehogeではなく、[[セキュリティホールmemo:http://www.st.ryukoku.ac.jp/~kjm/security/memo/]]のアンカーのように、includeしているページについては''includeされたページのURl''を付加してほしい。calendar2やcalendar_viewなどでincludeしている場合、日が変わるとそのページに存在しないアンカーとなってしまうので。 -- [[reimy]] &new{2003-04-24 (木) 16:01:01}; --そうするとconvert_html内で何とかするしかないですね。現状ではconvert_html()には明示的にページ名を渡すようにはなっていないんで、(あ、でも、$digestを生成するのに$vars['page']を使っちゃってるか…) うーん。次バージョンではこのあたりの独立性を考えないと。 -- [[ぱんだ]] &new{2003-04-25 (金) 11:40:31}; -第二案を添付します。 %%308.diff.2%%(現在、このファイルは削除されています) -- [[ぱんだ]] &new{2003-04-25 (金) 15:27:21}; --33桁はあまりにも長いので、固有IDを8桁(ランダムな英字1文字+md5ハッシュのランダムな部分文字列7文字)にしました。 --固有ID部のHTML化にaname.inc.phpを使用するようにしました。&anameにパラメータが二つ増えています。(full:フルパス使用/super:上付きに) --ls2.inc.php内で固有ID部を削除するようにしました。 -第二案に変えたら、#contentsで再び † が表示されるようになってしまった…。キリストの復活(苦笑) -- [[reimy]] &new{2003-04-25 (金) 21:22:19}; --ということで、再び#contentsの泥縄的対策。 -- [[reimy]] &new{2003-04-25 (金) 22:00:19}; ~convert_html 800行あたり function Contents_UList($text,$id,$level,$id) { + if (preg_match('/^(.*)\&aname\(.*\)\{.*\}\;(.*)$/',$text,$matches)) + { + $text = $matches[1].$matches[2]; + } // テキストのリフォーム // 行頭\nで整形済みを表す ... X( -第二案がいいですね。#contents対策が終われば、cvs行きかな。 -- [[reimy]] &new{2003-04-25 (金) 22:12:06}; -ついでに#contentsの<a>~</a>の間の無駄な空白を省く。 -- [[reimy]] &new{2003-04-26 (土) 02:35:13}; ~convert_html.php 809行めあたり // テキストのリフォーム // 行頭\nで整形済みを表す ... X( - $text = "\n<a href=\"#$id\">".strip_htmltag(inline2(inline($text,TRUE)))."</a>\n"; + $text = "\n<a href=\"#$id\">".trim(strip_htmltag(inline2(inline($text,TRUE))))."</a>\n"; parent::ListContainer('ul', 'li', --$level, $text); } -cvsに投入しました。 -- [[ぱんだ]] &new{2003-04-26 (土) 14:20:40}; --pukiwiki.ini.phpに、以下の設定を追加しました。 ///////////////////////////////////////////////// // 見出し行に固有のアンカーを自動挿入する $fixed_heading_anchor = 0; --[[cvs:pukiwiki.ini.php]](v1.4:r1.35) --[[cvs:file.php]](v1.4:r1.18) --[[cvs:convert_html.php]](v1.4:r1.32) --[[cvs:skin/default.en.css]](v1.4:r1.17) --[[cvs:skin/default.ja.css]](v1.4:r1.18) --[[cvs:plugin/ls2.inc.php]](v1.4:r1.11) --[[cvs:plugin/aname.inc.php]](v1.4:r1.12) -いただきました。#contentsの処理もスマートになってる&heart; -- [[reimy]] &new{2003-04-26 (土) 19:56:39}; -ついでに#contentsや#ls2での飛び先も固定アンカーを使うように改造してみました。[[PukiWiki/1.4/ちょっと便利に>PukiWiki/1.4/ちょっと便利に/固定アンカーをcontentsの飛び先に]]参照。固定アンカーのないページは従来通りcontent_1_1形式のアンカーを参照するので、一応互換性はとれてる(つもり)。 -- [[reimy]] &new{2003-04-27 (日) 03:08:10}; -[[BugTrack2/96]] アンカーIDの重複する可能性について -- &new{2005-07-24 (日) 18:39:22}; #comment