2005年8月4日

BloggerHacks: Farrago Recent Comments Hack 1.03

地蔵菩薩。楠寺にて

 どなたのBlogか失念してしまいましたが,なんとサイドバーに,Recent comments なんて欄があるのを拝見しました。Bloggerって,不満に思われているものが実に沢山ありますが,コメントの機能についても「好きじゃない」とか「分かりにくい」などと不満が結構あるようです。
 Bloggerの場合,最近寄せられたコメントを表示する機能がないですから,昔の記事にコメントがついても気が付きにくいですよね。

 それが不満だったとしても,まさか自力で解決してしまう人がいるとは思いませんでした。

BloggerHacks: Farrago Recent Comments Hack 1.03


 英語を読むのが面倒なんで,翻訳サービスに頼ろうとしたらページに使われているJavaScriptが邪魔をしているのか,Google以外では翻訳できませんでした。Googleの翻訳って,絶対内容が変なんで,読むと頭が痛くなりそうです。あたかも英語の勉強しろと云っているようです。→恐いもの見たさの日本語翻訳結果

 自分のBlogに導入するかしないか悩むところですが,手順をざっと読むと,

  1. コメントのタイムスタンプの表記を mm/dd/yyyy hh:mm:ss (02/11/2005 8:37:08 PM) 形式に変更する。
  2. サイドバーの Privious と archives セクションの間に下のコードを挿入します。(原文では In between the code that displays the most recent posts and the code that displays the archives となっているのですが,the code that displays the most recent posts が意味不明。素直に読めば一番最近のポストのコードとアーカイブのコードの間となるが,最近のポストだけを抜き出すことはできないんですので,Privious セクション全体のことと思われます。)

    <!-- **** FARRAGO RECENT COMMENTS HACK **** -->
    <!-- Version 1.03 -->
    <!-- Copyright &#169; 2004 Ebenezer Orthodoxy -->

    <!-- http://boggerhacks.blogspot.com -->
    <!-- ************** OPTIONS *************** -->
    <script type="text/javascript" language="JavaScript1.2">
    var titleText = "Recent Comments";
    var numberToShow = 5;
    var displayTemplate = "[name]:<br/>[title]";
    var nameIsLink = true;

    </script>
    <!-- ********* CODE DO NOT CHANGE ******** -->
    <script type="text/javascript" language="JavaScript1.2">
    var comments=new Array(0);var title = "";
    var itemurl = "";
    function getSortDate(strDate){var d=new Date(strDate);
    var day=''+d.getDate();if(day.length==1)day='0'+day;
    var month=''+(d.getMonth()+1);if(month.length==1)
    month='0'+month;var hour=''+d.getHours();
    if(hour.length==1)hour='0'+hour;var min=''+
    d.getMinutes();if(min.length==1)min='0'+min;var sec=''+
    d.getSeconds();if(sec.length==1)sec= '0'+sec;
    var sortDate=''+d.getFullYear()+month+day+hour+min+sec;
    return sortDate;}
    function recentComment(t,u,i,a,d){var rcmnt=
    document.getElementById('frch'+i).innerHTML;
    while(rcmnt.indexOf("\n") > -1)rcmnt=
    rcmnt.replace("\n","");while(rcmnt.indexOf(" />") > -1)
    rcmnt=rcmnt.replace(" />","/>");
    while(rcmnt.indexOf(" <a/>") > -1)rcmnt=
    rcmnt.replace(" <a/>","<a/>");var author=a;var pos=
    rcmnt.toLowerCase().lastIndexOf('<br><a></a>posted by');
    var pos2=
    rcmnt.toLowerCase().lastIndexOf('<br><a></a><a></a>');
    var pos3=
    rcmnt.toLowerCase().lastIndexOf('<br/><a/><a/>');
    var pos4=
    rcmnt.toLowerCase().lastIndexOf('<br/><a></a><a></a>');
    var aoffset=pos+6;if (pos3 > -1) pos2=pos3;
    if (pos4 > -1) pos2=pos4;
    if (pos2 > -1){pos=pos2;aoffset=
    rcmnt.toLowerCase().lastIndexOf('<a><b> </b></a>');
    if (aoffset==-1)aoffset=
    rcmnt.toLowerCase().lastIndexOf('<a><b></b></a>')-1;}
    if (pos > -1){author=
    rcmnt.substr(aoffset+15,rcmnt.length-1);var expt="";
    expt=rcmnt.substr(0,pos-4).replace(/(<([^>]+)>)/ig,"");}
    else expt=rcmnt.replace(/(<([^>]+)>)/ig,"");
    author=author.replace("<A ","<a ");
    if (expt.length > 50){expt=expt.substr(0,50);
    if (expt.lastIndexOf(' ') > -1)
    expt=expt.substr(0,expt.lastIndexOf(' '));expt+='...';}
    expt=expt.replace('"',"\"");expt=expt.replace("'","\'");
    if (!nameIsLink)author=author.replace(/(<([^>]+)>)/ig,"");
    var st=getSortDate(d)+'<li>'+displayTemplate+'</li>';
    st=st.replace('[name]',author);
    st=st.replace('[title]','<a title="'+expt+'" href="'+
    u+'#c'+i+'">'+t+'</a>');comments.push(st);}</script>

    <MainPage><h2 class="sidebar-title">
    <script type="text/javascript" language="JavaScript1.2">
    document.write(titleText+'</h2>');</script>
    <Blogger>

    <span id="frcht<$BlogItemNumber$>"
    style="visibility:hidden;position:absolute;">
    <BlogItemTitle><$BlogItemTitle$></BlogItemTitle></span>
    <script type="text/javascript" language="JavaScript1.2">

    title=
    document.getElementById('frcht<$BlogItemNumber$>').innerHTML;
    itemurl='<$BlogItemPermalinkURL$>';</script>
    <BlogItemCommentsEnabled><BlogItemComments>
    <span id="frch<$BlogCommentNumber$>"
    style="visibility:hidden;position:absolute;">

    <$BlogCommentBody$></span>
    <script type="text/javascript" language="JavaScript1.2">
    recentComment(title,itemurl,'<$BlogCommentNumber$>',
    '<$BlogCommentAuthor$>','<$BlogCommentDateTime$>');
    </script></BlogItemComments>

    </BlogItemCommentsEnabled></Blogger><ul>
    <script type="text/javascript" language="JavaScript1.2">
    comments.sort();comments.reverse();
    for (i=0; i<10 && i < comments.length && i < numberToShow; i++){
    var s=comments[i];s=s.substr(14,s.length-1); document.write(s);}

    </script><br/><br/><span
    style="font-size:7pt;text-align:center;width:100%;border-top:1px dashed;">
    <a title="Farrago Recent Comments Hack from BloggerHacks"
    href="http://bloggerhacks.blogspot.com">BloggerHacks</a> </span>
    </ul></MainPage>

    <!-- END FARRAGO RECENT COMMENTS HACK -->


    を挿入する。
  3. 上記のコードに "var numberToShow = 5;" という部分は表示件数の設定です。1から10の範囲で表示させる件数を指定することができます。
  4. コメントの表示形式は,"var displayTemplate = "[name]:
    [title]";" せで決定されるようです。[title] by [name] とかの表示に変更することも可能。
  5. [name]で表示されるユーザー名にリンクを張らなくてもいいと思う場合は,"var nameIsLink = true;" を False にすればいいと思います。
  6. Farrago-Metempsychosis Link Correction を併用する場合の注意事項があるのですが,このサービスは現在提供されていないみたいなので無視していいと思います。


 で,導入してみたところ,以下の点が判明。

  1. Recent Comments が表示されるのは最初のページ(インデックスページ)のみ。個別ページ及びアーカイブページには表示されません。
  2. 表示されるのはインデックスページ(blogの表示)内にあるコメントのみ。多くのコメントをするにはインデックスページの表示件数を多くする必要がある。
  3. コードは改変禁止と書いてありますが,原文のコメントを読む限り改良が禁止されている訳ではないようです。
  4. コメントのタイトルには title属性が付加されているので,マウスカーソルをタイトル上に持って行くと,内容の冒頭部分が表示され,結構便利。


 この環境では,Recent Comments が表示されていないので,原因究明が必要ですね。ソースを見てみると結構面白くて使いまわしできそうな部分があります。JavaScriptには明るくないんでカスタマイズにも限界がありますが,もうちょっと遊んでみようと思います。

2 件のコメント:

Unknown さんのコメント...

私は日付のフォーマットを変更するのがいやだったので見送った経緯があります。他にも、MTなどでおなじみのカレンダーを表示するのもありましたね。

OpenCage さんのコメント...

すいません,なかなか自分のblogって見ないもので,新たにコメントいただいていたのに気が付きませんでした。

最近のコメントって,BloggerのAPIで解決できないかなぁ...。できれば画期的なんだけど。