アンカー名重複を防ぐためにも、見出しタイトル出力で自動的に固定したアンカー出力を

  • ページ: BugTrack
  • 投稿者: reimy
  • 優先順位: 低
  • 状態: 完了
  • カテゴリー: 本体新機能
  • 投稿日: 2003-04-24 (木) 01:03:44
  • バージョン:

メッセージ

BugTrack/285関連。

*、**、***で自動的に固定的なアンカーを出力してほしい。

手動でアンカーを付けると、#calendar_viewなどで複数ページを一括表示した場合に、アンカー名が重複してしまうので、一意的な固定したアンカーを出力してほしい。一つ一つの記事で重複しないアンカー名を手作業で付けるのはあまりにも非効率で非現実的な作業になってしまう。手作業で付け始めて困難に直面してます。

その場合、*、**、***で指定したタイトル全体を<a>タイトル</a>で囲んでほしい。

&aname(hoge);ではなく&aname(hoge){hogehoge};形式でのアンカー名設定が普及しない内にやらないと厄介なことになる(処理によってはアンカーがネストしてしまうおそれがある)ので、1.4リリースまでに…という意味で、あえて「緊急」にしておきます。


  • 見出し全体を<a>~</a>で囲んでしまうと、見出しの中でWikiNameやBracketNameにリンクを張ることができなくなってしまいますが。 -- ぱんだ 2003-04-24 (木) 14:19:55
    • そうしないと第三者にアンカーの存在がわかりません。もしくはタイトルの末尾に<a style="font-size:10px;vertical-align:super">■</a>というようにでもしますか? -- reimy 2003-04-24 (木) 14:19:58
  • とりあえず第一案です。 -- ぱんだ 2003-04-24 (木) 14:19:55
    1. ページの更新時に(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]書いておくことも可能です。その場合、自動挿入はされません。
    2. コンバート時置換ルールに、上記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">&dagger;</a>',
      • ユーザ定義ルールなので、ページのどこに書いてあっても置換の対象になります。
    3. おまけ CSS .anchorを定義
      default.ja.css,default.en.css
      +.anchor
      +{
      +  font-size:xx-small;
      +  vertical-align:super;
      +}
  • これだと#contentsや#ls2の出力にも † が出力されてしまいますねぇ…。ちとまずい。 -- reimy 2003-04-24 (木) 15:20:47
    • ちょっと#contentsと#ls2の暫定対処。インチキっぽいやり方なのであくまで暫定 -- reimy 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); // &dagger;を削除
         array_push($params['result'], '<li><a href="'.$href.LS2_CONTENT_HEAD.$anchor.'">'.
          $s_title.'</a>'
  • 主眼とする部分(固有番号のアンカー設定)は暫定解決したので、重要度を「低」に下げます。 -- reimy 2003-04-25 (金) 14:17:20

  • それとアンカーにhrefで設定する飛び先は単純に#hogehogeではなく、セキュリティホールmemoのアンカーのように、includeしているページについてはincludeされたページのURlを付加してほしい。calendar2やcalendar_viewなどでincludeしている場合、日が変わるとそのページに存在しないアンカーとなってしまうので。 -- reimy 2003-04-24 (木) 16:01:01
    • そうするとconvert_html内で何とかするしかないですね。現状ではconvert_html()には明示的にページ名を渡すようにはなっていないんで、(あ、でも、$digestを生成するのに$vars['page']を使っちゃってるか…) うーん。次バージョンではこのあたりの独立性を考えないと。 -- ぱんだ 2003-04-25 (金) 11:40:31
  • 第二案を添付します。 308.diff.2(現在、このファイルは削除されています) -- ぱんだ 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 2003-04-25 (金) 21:22:19
    • ということで、再び#contentsの泥縄的対策。 -- reimy 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 2003-04-25 (金) 22:12:06
  • ついでに#contentsの<a>~</a>の間の無駄な空白を省く。 -- reimy 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に投入しました。 -- ぱんだ 2003-04-26 (土) 14:20:40
  • いただきました。#contentsの処理もスマートになってる(heart) -- reimy 2003-04-26 (土) 19:56:39
  • ついでに#contentsや#ls2での飛び先も固定アンカーを使うように改造してみました。PukiWiki/1.4/ちょっと便利に参照。固定アンカーのないページは従来通りcontent_1_1形式のアンカーを参照するので、一応互換性はとれてる(つもり)。 -- reimy 2003-04-27 (日) 03:08:10
  • BugTrack2/96 アンカーIDの重複する可能性について -- 2005-07-24 (日) 18:39:22

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2005-07-24 (日) 18:39:22
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.410 sec.

OSDN