2004年03月14日

はてなダイアリー風TextFormat

世の中にはどんなblogツールがあるんだろう…とか思いつつふらふらとWebを見ていたら、blogツール 一覧

BlogツールのMOVABLE TYPEを利用しているのですが、記事内のURLをタグをいちいち入力しなくとも自動的にリンクさせるようなプラグインはありますか?

http://www.hatena.ne.jp/1066279500

Movable Typeではてなダイアリーのような入力補助が使えるようなプラグインはありませんでしょうか?MT-Textileでは、めんどくさいなぁ…と思う人間で、はてなような入力補助をつかいたいのです。

http://www.hatena.ne.jp/1078508513

なんていうページを見つける。ふむふむ…と思いつつ、書かれていた

MovableType用TextFormatプラグイン mt-sukeroku-plus.pl

http://hsj.jp/works/archives/000326.html

を入れてみた。

で、この書き込みがこれを使っての初書き込みなわけだ。結果は如何に?

結果

  • 見出しの先頭はやっぱり「■」かなぁ…と思ってなんとなく設定。*1
  • 脚注の番号の前にリストがあるのはなんか変かも。
  • [ google:blogツール 一覧 ]は認識されなかった。
  • HTMLタグのブラケットは明示的に<とか>みたいに書かないと駄目なのか。
  • あれ。整形済みテキストにdiffの結果放り込んだら化け化けで大変。でも、はてなで試してみても実は同じ結果だった…。

なるほど。そこで…。

使いやすくするべく変更

  1. 脚注が<ul>&<li>で囲まれているのはなんか変な気がしたので<div>&<p>に変更。*2
  2. [ google:検索語 ]を認識するようにした。
  3. 整形済みテキスト内部でHTMLタグをエスケープして、タグ・リンクの追加を行わないようにした。(はてなにはない機能)

*1: ふむふむ。コメントはこうなるのか。

*2: んで、こうなった。

diffをとるとこんな感じ。(Ver.0.20にて)

*** mt-sukeroku-plus_original.pl	Sun Mar 14 14:13:54 2004
--- mt-sukeroku-plus_modified.pl	Sun Mar 14 15:58:12 2004
***************
*** 591,597 ****
      my ($inlineText) = @_;
      
      # ■ リンク
!     if(/(http|https|ftp|mailto|ISBN|isbn|ASIN|asin):([^\x00-\x20()<>\x7F-\xFF])*/){
        # さまざまなパターンについて
        $inlineText =~ s!(
          # []URL[]
--- 591,597 ----
      my ($inlineText) = @_;
      
      # ■ リンク
!     if(!$format_mode_pre && /(http|https|ftp|mailto|ISBN|isbn|ASIN|asin|google):([^\x00-\x20()<>\x7F-\xFF])*/){
        # さまざまなパターンについて
        $inlineText =~ s!(
          # []URL[]
***************
*** 600,605 ****
--- 600,608 ----
          # [URL]
          (\[(http|https|ftp|mailto|isbn|asin|ISBN|ASIN):([^\x00-\x20()<>\x7F-\xFF])*\])
          |
+         # [google]
+         (\[google:[^\]]+\])
+         |
          # src="URL", href="url"
          ((src|href|cite)=\"(http|https|ftp|mailto|isbn|asin|ISBN|ASIN):([^\x00-\x20()<>\x7F-\xFF])*\")
          |
***************
*** 608,614 ****
          )!&$func_inlineLink($1)!gex;
      }
      # ■ 脚注
!     if(/\(\(([^\)]+)\)\)/){
        my $permaUrl = &getMTEntryPermalink($ctx);
        
        my $func_collapse_tag = sub{
--- 611,617 ----
          )!&$func_inlineLink($1)!gex;
      }
      # ■ 脚注
!     if(!$format_mode_pre && /\(\(([^\)]+)\)\)/){
        my $permaUrl = &getMTEntryPermalink($ctx);
        
        my $func_collapse_tag = sub{
***************
*** 638,644 ****
          }
          
          $counter_footnote++;
!         $buffer_footnote = $buffer_footnote . qq(<li class="footnote"><a name="footnote_${footnote_part}${counter_footnote}" href="${permaUrl}#footnote_${footnote_part}${counter_footnote}_root">${footnote_symbol}${counter_footnote}</a>: ) . &$func_inline(${footnote_text}) . qq(</li>);
          return qq(<span class="footnote"><a title=") . &$func_collapse_tag(${footnote_text}) . qq(" href="${permaUrl}#footnote_${footnote_part}${counter_footnote}" name="footnote_${footnote_part}${counter_footnote}_root">${footnote_symbol}${counter_footnote}</a></span>);
        };
        my $func_footnote_switch = sub{
--- 641,647 ----
          }
          
          $counter_footnote++;
!         $buffer_footnote = $buffer_footnote . qq(<p class="footnote"><a name="footnote_${footnote_part}${counter_footnote}" href="${permaUrl}#footnote_${footnote_part}${counter_footnote}_root">${footnote_symbol}${counter_footnote}</a>: ) . &$func_inline(${footnote_text}) . qq(</p>);
          return qq(<span class="footnote"><a title=") . &$func_collapse_tag(${footnote_text}) . qq(" href="${permaUrl}#footnote_${footnote_part}${counter_footnote}" name="footnote_${footnote_part}${counter_footnote}_root">${footnote_symbol}${counter_footnote}</a></span>);
        };
        my $func_footnote_switch = sub{
***************
*** 698,704 ****
      #
      # 見出し 
      #
!     elsif (/^(\*{1,3})(.*)/) {
        my $permaUrl    = &getMTEntryPermalink($ctx);
        my $headingPart = &$func_getTextPartInitChar();
        my $headingTag  = '';
--- 701,707 ----
      #
      # 見出し 
      #
!     elsif (!$format_mode_pre && /^(\*{1,3})(.*)/) {
        my $permaUrl    = &getMTEntryPermalink($ctx);
        my $headingPart = &$func_getTextPartInitChar();
        my $headingTag  = '';
***************
*** 723,758 ****
      #
      # リスト表示。
      #
!     elsif (/^(-+)(.*)$/) {
        &back_push('ul', length($1), \@saved, \@result, '');
        push(@result, '<li>' . &$func_inline($2) . '</li>');
      }
!     elsif (/^(\++)(.*)$/) {
        &back_push('ol', length($1), \@saved, \@result, '');
        push(@result, '<li>' . &$func_inline($2) . '</li>');
      }
      #
      # 用語定義
      #
!     elsif (/^:([^:]+):(.*)/) {
        &back_push('dl', 1, \@saved, \@result, '');
        push(@result, '<dt>' . &$func_inline($1) . '</dt>', '<dd>' . &$func_inline($2) . '</dd>');
      }
      #
      # 引用
      #
!     elsif (/^>>$/) {
        #&back_push('blockquote', 1, \@saved, \@result, '');
        push(@result, '<blockquote>');
      }
!     elsif (/^<<$/) {
        #&back_push('blockquote', 1, \@saved, \@result, '');
        push(@result, '</blockquote>');
      }
      #
      # 整形済みテキスト
      #
!     elsif (/^>\|$/) {
        #&back_push('pre', 1, \@saved, \@result, '');
        if($format_mode_pre != 1){
          push(@result, '<pre>');
--- 726,761 ----
      #
      # リスト表示。
      #
!     elsif (!$format_mode_pre && /^(-+)(.*)$/) {
        &back_push('ul', length($1), \@saved, \@result, '');
        push(@result, '<li>' . &$func_inline($2) . '</li>');
      }
!     elsif (!$format_mode_pre && /^(\++)(.*)$/) {
        &back_push('ol', length($1), \@saved, \@result, '');
        push(@result, '<li>' . &$func_inline($2) . '</li>');
      }
      #
      # 用語定義
      #
!     elsif (!$format_mode_pre && /^:([^:]+):(.*)/) {
        &back_push('dl', 1, \@saved, \@result, '');
        push(@result, '<dt>' . &$func_inline($1) . '</dt>', '<dd>' . &$func_inline($2) . '</dd>');
      }
      #
      # 引用
      #
!     elsif (!$format_mode_pre && /^>>$/) {
        #&back_push('blockquote', 1, \@saved, \@result, '');
        push(@result, '<blockquote>');
      }
!     elsif (!$format_mode_pre && /^<<$/) {
        #&back_push('blockquote', 1, \@saved, \@result, '');
        push(@result, '</blockquote>');
      }
      #
      # 整形済みテキスト
      #
!     elsif (!$format_mode_pre && /^>\|$/) {
        #&back_push('pre', 1, \@saved, \@result, '');
        if($format_mode_pre != 1){
          push(@result, '<pre>');
***************
*** 766,772 ****
          $format_mode_pre = 0;
        }
      }
!     elsif (/^$/){
        if($lastLine =~ /^$/){
          push(@result, "<br />");
        }
--- 769,775 ----
          $format_mode_pre = 0;
        }
      }
!     elsif (!$format_mode_pre && /^$/){
        if($lastLine =~ /^$/){
          push(@result, "<br />");
        }
***************
*** 776,781 ****
--- 779,792 ----
      #
      elsif ($format_mode_draft == 0){
        
+       # 整形済みテキスト中でHTMLタグをエスケープ
+       if ($format_mode_pre){
+         ~ s/\&/\&amp;/g;
+         ~ s/</\&lt;/g;
+         ~ s/>/\&gt;/g;
+         ~ s/\"/\&quot;/g;
+       }
+ 
        if (/^\s+/) {
          if($format_mode_paragraph == 1 && $format_mode_pre != 1){
            push(@result, qq(<p>$_</p>));
***************
*** 829,837 ****
    # 脚注の出力
    #
    if($counter_footnote > 0){
!     push(@result, '<ul class="footnote">');
      push(@result, $buffer_footnote);
!     push(@result, '</ul>');
    }
    
    my $out = join("\n", @result);
--- 840,848 ----
    # 脚注の出力
    #
    if($counter_footnote > 0){
!     push(@result, '<div class="footnote">');
      push(@result, $buffer_footnote);
!     push(@result, '</div>');
    }
    
    my $out = join("\n", @result);
***************
*** 1026,1031 ****
--- 1037,1063 ----
      }
      $localAnswer = qq(<a href="${localAddress}">${localAltText}</a>);
    }
+   ##
+   ## Google 検索
+   ##
+   elsif ($localAddress =~ /^(google):(.+)/) {
+     # 宣言
+     my $localGoogleSearch = $2;
+     # 代替テキストの設定
+     if(defined($localAltText)){
+       if($localAltText eq ''){
+         $localAltText = $localAddress;
+       }
+     }
+     else{
+       $localAltText = $localAddress;
+     }
+     # 空白類を+に変換
+     $localGoogleSearch =~ s/([^\w ])/'%' . unpack('H2', $1)/eg;
+     $localGoogleSearch =~ tr/ /+/;
+     # Googleへのリンク生成
+     $localAnswer = qq(<a href="http://www.google.com/search?lr=lang_ja\&q=${localGoogleSearch}" target="${localTarget}">${localAltText}</a>);
+   }
    #
    # それ以外の場合
    #

「利用に際しては出来ればTrackbackをしかけてくだされば幸いです。」に従って、はじめてのトラックバックをしてみる。…ってこれでいいのかな…?

投稿者 nomoto : 2004年03月14日 16:00 | Web | トラックバック
コメント

mt-sukeroku-plus.plの作者のどなどなです。
ご利用・ご紹介頂きありがとうございます。

面倒くさがって実装していなかった(^^;)google実装がされている!!

このソースを拝借したいと思うのですがよろしいでしょうか?
勝手なお願いですがよろしくお願いします。

あとはてなのエスケープですねぇ…。
私も書き込みテストしているときに表記例を出力するのに困っていたので欲しいところなんですが、書式の拡張をしても追加するのは避けようと思っており、悩ましいです。

Posted by: どなどな : 2004年03月14日 17:46

どなどなさんこんにちは。
mt-sukeroku-plus.pl良い感じです。
ありがたく入れさせていただきました。

google実装のソース、あんなものでよければどうぞご自由に利用・改変ください。
それでは。より良いものになることを期待しております。

Posted by: のもと : 2004年03月14日 18:29

今日は〜^^またブログ覗かせていただきました。よろしくお願いします。
モンクレール http://www.japan2moncler.com

Posted by: モンクレール : 2013年01月12日 22:33

こんにちは、またブログ覗かせていただきました。また、遊びに来ま〜す。よろしくお願いします

Posted by: ヴィトン バッグ : 2013年03月13日 16:45
コメントする









名前、アドレスを登録しますか?