";
my $trackbackguide = "
";
$FullUrl = $q->url(-full=>1) if ($FullUrl eq "");
my $encoded = &EncodeUrl($id);
my $url = $FullUrl . &ScriptLinkChar() . "action=tb&id=$encoded";
if (&PageCanReceiveTrackbackPing($id)) {
$trackbackguide .= &T('Trackback address of this page:')." ".
" ".
$url;
} else {
$trackbackguide .= &T('This page can not receive Trackback');
}
if (&UserCanSendTrackbackPing($id)) {
$FullUrl = $q->url(-full=>1) if ($FullUrl eq "");
my $url = $FullUrl . &ScriptLinkChar . $encoded;
my $title = $id;
if ($FreeLinks) {
$title =~ s/_/ /g; # Display with spaces
}
my $excerpt = $Text{'text'};
$excerpt =~ s/<.*?>//g;
if (length($excerpt) > 255) {
$excerpt = substr($excerpt, 0, 252);
$excerpt =~ s/(([\x80-\xff].)*)[\x80-\xff]?$/$1/;
$excerpt .= "...";
}
$excerpt =~ s/(\r?\n)/ /g;
$excerpt = &QuoteHtml($excerpt);
$excerpt =~ s/"/"/g; # " 를 quot;로 변환
$trackbackguide .= "\n
";
$trackbackguide .= &GetFormStart("Trackback_ping") .
&GetHiddenValue("action", "send_ping") .
&GetHiddenValue("title", "$title") .
&GetHiddenValue("blog_name", "$SiteName") .
&GetHiddenValue("excerpt", "$excerpt") .
&GetHiddenValue("url", "$url") .
&GetHiddenValue("id", "$id") .
"
" .
"" . &T('Send Trackback Ping of this page to:') . " |
" .
"" . &T('Trackback URL:') . " | " .
"" . $q->textfield(-name=>"ping_url", -default=>"", -override=>1, -size=>100, -maxlength=>200) . " |
" .
"" . &T('Permalink URL (optional):') . " | " .
"" .
$q->textfield(-name=>"ping_permalink", -default=>"", -override=>1, -size=>100, -maxlength=>200) . " |
" .
"" . $q->submit(&T('Send Ping')) . " |
" .
"
" .
$q->endform;
}
$result .= &MacroMemo("", &T('Send Trackback'), $trackbackguide, "trackbackguidecontent");
$result .= "
";
}
}}}
==== # wiki.pl 내에 추가할 EncodeUrl() 함수 ====
이 함수는 나름대로 중요하여, 따로 빼어서 표시해 둔다. 이 함수는 스트링을 인자로 받아서, 다음 문자를 제외하고는 한바이트씩 "%FF"와 같이 두자리의 16진수로 변환한다.
* a~z
* A~Z
* 0~9
* "_", ".", "-"
* "/" - '''주의:''' 다른 곳에서 보는 urlencode 함수들은 "/"도 "%2F"로 인코딩한다. 그러나 여기서는 아래와 같은 이유로 "/"를 인코딩하지 않도록 했다.
** 1) 쿼리에 들어간 스트링의 경우는 "/"나 "%2F"나 동일하게 동작한다.
** 2) URL에 들어간 경우는 "/"여야만 제대로 웹서버가 인식한다. [[/SlashLinks처리]]를 할 때 이것이 문제가 된다.
** 3) (무책임한 말이지만) 현재는 EncodeUrl()이 쓰이는 곳이 이 [[/TrackBack]]과 [[/RSS제공]]의 action=rss, [[/blog매크로시리즈]]의 action=blog_rss, 이렇게 세 곳 밖에 없다. 셋 다 페이지이름을 URL에 포함시킬 때 인코딩하는 것이라서, "%2F"보다는 "/"가 낫다고 판단된다.
*** 참고로, Firefox 주소창에 한글을 쓸 경우 자동으로 인코딩해서 보여주는데 이 때도 EUC-KR, UTF-8 두 경우 다 "/"는 인코딩하지 않고 있다.
{{{#!vim perl
sub EncodeUrl {
my ($string) = @_;
$string =~ s!([^/a-zA-Z0-9_.-])!uc sprintf "%%%02x", ord($1)!eg;
return $string;
}
}}}
=== # action/tb.pl 추가 ===
ext2.1g의 action/tb.pl을 그대로 옮겼음. [[/Comments와Thread매크로스팸막기]]나 [[/UTF-8트랙백받기]]에 관련된 코드(ext2부터는 반대로 UTF-8이 아닌 트랙백을 처리하는 코드)까지 다 포함되어 있다.
{{{#!vim perl
sub action_tb {
use strict;
my $id = &GetParam("id","");
$id =~ s/\s+$//;
my $normal_id = $id;
my $url = &GetParam('url');
my $title = &GetParam('title', $url);
my $blog_name = &GetParam('blog_name');
my $excerpt = &GetParam('excerpt');
# tcode
my $tcode = &GetParam('tc',"");
my ($code_today, $code_yesterday);
$code_today = &simple_crypt(length($id).substr(&CalcDay($Now),5));
$code_yesterday = &simple_crypt(length($id).substr(&CalcDay($Now - 86400),5));
if (($tcode ne $code_today) && ($tcode ne $code_yesterday)) { # spam
&SendTrackbackResponse("1", "SPAM trackback");
return;
}
# 인코딩 컨버트
if ($q->content_type() =~ /charset=(.+)\b/i) {
# POST요청이면서, 인코딩이 명시되어 있는 경우
my $remote_enc = $1;
$title = convert_encode($title, "$remote_enc", "$HttpCharset");
$blog_name = convert_encode($blog_name, "$remote_enc", "$HttpCharset");
$excerpt = convert_encode($excerpt, "$remote_enc", "$HttpCharset");
} else {
# 인코딩을 추측해서 변환
$title = guess_and_convert($title);
$blog_name = guess_and_convert($blog_name);
$excerpt = guess_and_convert($excerpt);
}
# 블로그 지원을 위한 꽁수
my ($blogrcpage, $blogrccomment);
if ($id =~ m/(.+)(\/|%2f|%2F)(.+)/) {
$blogrcpage = "$1/BlogRc";
} else {
$blogrcpage = "BlogRc";
}
if (-f &GetPageFile($blogrcpage)) {
$blogrccomment = $excerpt;
} else {
$blogrcpage = "";
}
# 처음 200글자까지만 남김
$excerpt = (&split_string($excerpt, 200))[0];
$excerpt .= " ...";
$excerpt =~ s/(\r?\n)/ /g;
$excerpt = &QuoteHtml($excerpt);
$excerpt = "