【しばらく編集不可モードで運営します】 編集(管理者用) | 差分 | 新規作成 | 一覧 | RSS | FrontPage | 検索 | 更新履歴

TrackBackもどきメモ - YukiWikiでTrackBack

目次

YukiWikiTrackBack する(される?)方法のメモとか・・・。

TrackBackのまじめな仕様は、 TrackBack技術仕様書(http://lowlife.jp/translation/mttrackback.html ) というふうにRDFを埋め込んだりとなんか面倒な気がします。 (気がするだけかもしれませんが・・・)

とりあえず、簡単な部分のTrackBack機能をテキトーな感じにYukiWikiにつけてみよう! という試み。

受信

えーと、

こんな感じでいいっすか?

Wiki.cgiへの変更・追加点

いろいろ変数を設定しているはじめの方に追加($url_cgi_trackbackは書き換えてね)

 my $url_cgi_trackback = 'cgiのURL(フルパス)を記述してください'; # add [trackback]
 my $embed_trackback = '[[#trackback]]'; # add [trackback]
 my $embed_rtrackback = '[[#rtrackback]]'; # add [trackback]

sub mainの中

 #### mod [tarackback] start
 #   if ($command_do{$form{mycmd}}) {
     if (&is_trackback) {
         &response_trackback;
     } elsif ($command_do{$form{mycmd}}) {
 #### mod [tarackback] end

sub embedded_to_htmlの中(} else { return $embedded;の前に)

 #### add [trackback] start
    } elsif ($embedded eq $embed_trackback or $embedded eq $embed_rtrackback) {
         $_ = qq(<p class="trackback">''TrackBack'' - $url_cgi_trackback/@{[&encode($form{mypage})]}</p>); # この書き方はWalWiki用かなYukiWikiだと<b></b>で囲わないと太字にならないんじゃ?試してないけど…
         return ($_) ? $_ : &escape($embedded);
 #### add [trackback] end

追加サブルーチン(どこか後ろの方に追加)

 #### add [trackback] start
 sub is_trackback {
     if ( $form{url} && $ENV{'PATH_INFO'} ) {
         return ( 1 );
     }
     return ( 0 );
 }
 #### add [trackback] end

 #### add [trackback] start
 sub response_trackback {
     # 一応エスケープします。
     $form{url} = &escape($form{url});
     $form{title} = &escape($form{title});
     $form{excerpt} = &escape($form{excerpt});
     $form{blog_name} = &escape($form{blog_name});
 
     # コメントを書き込む際の状態に近づけます。
     $form{mycmd} = 'comment';
     $form{mypage} = &unarmor_name(&armor_name(&escape(substr($ENV{'PATH_INFO'},1,length($ENV{'PATH_INFO'})-1))));
     $form{myLastModified} = &get_info($form{mypage}, $info_LastModified);
     $form{mytouch} = 'on';
 
     # ここからdo_commentをベースに書き込みを設定。
     my ($content) = $database{$form{mypage}};
     my $datestr = &get_now;
     my $namestr = $form{blog_name} ? " ''[[$form{blog_name}]]'' : " : " ";
     my $error = 1;
     my $error_msg = 'The error message'; # エラーメッセージはそれぞれお好みで書き換えてください。
     $form{mymsg} = $content;
     if (not $content) {
         $error_msg = 'Ping ID is Invalid';
     } elsif ($form{url} && $form{mypage}) {
         if ($content =~ s/(^|\n)(\Q$embed_trackback\E)/- $datestr$namestr$form{title} $form{url}\n--$form{excerpt}\n$1$2/) {
             ;
         } else {
             $content =~ s/(^|\n)(\Q$embed_rtrackback\E)/$1$2\n- $datestr$namestr$form{title} $form{url}\n--$form{excerpt}/;
         }
         if ($form{mymsg} eq $content) {
             $error_msg = 'Ping ID is Invalid';
             last;
         }
         $form{mymsg} = $content;
 
         # ここからはdo_writeをベースにデータベースに書き込み。
         if (&frozen_reject()) {
             $error_msg = 'Ping ID is Invalid';
             last;
         }
         if (not &is_editable($form{mypage})) {
             $error_msg = 'Ping ID is Invalid';
             last;
         }
         if ($form{myLastModified} ne &get_info($form{mypage}, $info_LastModified)) {
             $error_msg = 'Ping ID is Invalid';
             last;
         }
         # Making diff
         if (1) {
             &open_diff;
             my @msg1 = split(/\n/, $database{$form{mypage}});
             my @msg2 = split(/\n/, $form{mymsg});
             $diffbase{$form{mypage}} = &difftext(\@msg1, \@msg2);
             &close_diff;
         }
         $database{$form{mypage}} = $form{mymsg};
         &send_mail_to_admin($form{mypage}, "Modify");
         if ($form{mytouch}) {
             &set_info($form{mypage}, $info_LastModified, '' . localtime);
             &update_recent_changes;
         }
         &set_info($form{mypage}, $info_IsFrozen, 0 + $form{myfrozen});
 
         # エラーが発生しなかったことを設定してxml発行。
         $error = 0;
         print <<"EOD";
 Content-type: text/xml
 
 <?xml version="1.0" encoding="iso-8859-1"?>
 <response>
 <error>0</error>
 </response>
 EOD
     }
 
     # エラーが発生した場合の処理。(エラーxmlの発行)
     if ($error) {
         print <<"EOD";
 Content-type: text/xml
 
 <?xml version="1.0" encoding="iso-8859-1"?>
 <response>
 <error>1</error>
 <message>$error_msg</message>
 </response>
 EOD
     }
 }
 #### add [trackback] end

問題点

えーと、文字コード関係をまったく考えてないので、異なる文字コード環境(?)ではうまく受信できないでしょうね。

他にもいろいろ問題を抱えてると思うので、皆様、弄ってやってください。(超他力本願)

・・・つーか、勢いで書いてみましたが、Wikiなんだから自分で書き込めばいいんですよね・・・。

文字コード処理提案

なんて仰々しいものじゃないですが、sub code_convert を使えばいいんじゃない? 上の sub response_trackback の最初の部分を

 $form{url} = &escape(&code_convert(\$form{url}, $kanjicode));
 $form{title} = &escape(&code_convert(\$form{title}, $kanjicode));
 $form{excerpt} = &escape(&code_convert(\$form{excerpt}, $kanjicode));
 $form{blog_name} = &escape(&code_convert(\$form{blog_name}, $kanjicode));

見たいな感じに書き換えれば…。 どうかな?

送信

えー・・・。

<form>でPOSTすれば?(ヲイ)

コメント