#!/usr/bin/perl ################################################## # # MovableType用 i-mode変換スクリプト # 「MT4i」 my $version = "2.11"; # Copyright (C) 太鉄 All rights reserved. # Special Thanks # ヴァリウム男爵 & Tonkey & drry # # MT4i - t2o2-Wiki # →http://www.hazama.nu/pukiwiki/index.php?MT4i # TonkeyさんのTonkey Magic # →http://tonkey.mails.ne.jp/ # ヴァリウム男爵の人生迷い箸 # →http://mayoi.net/ # drryさんのdrry+@->Weblog # →http://blog.drry.jp/ # # -- 言い訳ここから -- # ぶっちゃけ、行き当たりばったりの「動けばいいや」で # コーディングしてますし、Perlに関しては素人同然なので、 # ソースが汚い&技術的に未熟な点はご容赦ください。 # -- 言い訳ここまで -- # ################################################## use strict; use CGI; use HTML::Entities; # 外部ファイルの読み込み eval {require 'mt4ilib/Config.pl'; 1} || die print 'Content-type: text/plain\n\n"./mt4ilib/Config.pl"が見付かりません。'; eval {require 'mt4ilib/Func.pl'; 1} || die print 'Content-type: text/plain\n\n"./mt4ilib/Func.pl"が見付かりません。'; # 設定読み込み my %cfg = Config::Read("./mt4icfg.cgi"); unshift @INC, $cfg{MT_DIR} . 'lib'; unshift @INC, $cfg{MT_DIR} . 'extlib'; #################### # Encode.pmの有無調査 my $ecd; eval 'use Encode;'; if($@){ $ecd = 0; }else{ eval 'use Encode::JP::H2Z;'; $ecd = 1; } #################### # Jcode.pmの有無調査 eval 'use Jcode;'; if($@){ print 'Content-type: text/plain\n\n"Jcode.pm"がインストールされていません。'; exit; } #################### # User Agent によるキャリア判別 # 参考:http://specters.net/cgipon/labo/c_dist.html my $ua; my @user_agent = split(/\//,$ENV{'HTTP_USER_AGENT'}); my $png_flag; if ($user_agent[0] eq 'ASTEL') { # ドットi 用の処理 $ua = 'other'; } elsif ($user_agent[0] eq 'UP.Browser') { # EZweb 旧端末用の処理 $ua = 'ezweb'; } elsif ($user_agent[0] =~ /^KDDI/) { # EZweb WAP2.0 対応端末用の処理 $ua = 'ezweb'; } elsif ($user_agent[0] eq 'PDXGW') { # H" 用の処理 $ua = 'other'; } elsif ($user_agent[0] eq 'DoCoMo') { # i-mode 用の処理 $ua = 'i-mode'; } elsif ($user_agent[0] eq 'J-PHONE') { # J-SKY 用の処理 $ua = 'j-sky'; # PNGしか表示できない機種はこれだけなので事前にチェックする if (($user_agent[2] =~ /^J-DN02/) || ($user_agent[2] =~ /^J-P02/) || ($user_agent[2] =~ /^J-P03/) || ($user_agent[2] =~ /^J-T04/) || ($user_agent[2] =~ /^J-SA02/) || ($user_agent[2] =~ /^J-SH02/) || ($user_agent[2] =~ /^J-SH03/)){ $png_flag = 1; } } elsif ($user_agent[1] =~ 'DDIPOCKET') { # AirH"PHONE用の処理 $ua = 'i-mode'; } elsif ($user_agent[0] eq 'L-mode') { # L-mode 用の処理 $ua = 'other'; } else { # それ以外 $ua = 'other'; } #################### # AccessKey用文字列生成 my @nostr; my @akstr; for (my $i = 0; $i <= 9; $i++) { $nostr[$i] = ""; $akstr[$i] = ""; } my $mt4ilinkstr = $cfg{Ainori_Str_o}; my $ExitChtmlTransStr = $cfg{ECTrans_Str_o}; if ($cfg{AccessKey} eq "yes") { if ($ua eq "i-mode" || $ua eq "ezweb") { # i-mode 及び EZweb $mt4ilinkstr = $cfg{Ainori_Str_i}; $ExitChtmlTransStr = $cfg{ECTrans_Str_i}; for (my $i = 1; $i <= 10; $i++) { if ($i < 10) { my $code = 63878 + $i; $nostr[$i] = "&#$code;"; $akstr[$i] = ", accesskey=\"$i\""; } else { $nostr[0] = "戀"; $akstr[0] = ", accesskey=\"0\""; } } } elsif ($ua eq "j-sky") { # J-SKY $mt4ilinkstr = $cfg{Ainori_Str_j}; $ExitChtmlTransStr = $cfg{ECTrans_Str_j}; $nostr[1] = "\x1B\$F<\x0F"; $nostr[2] = "\x1B\$F=\x0F"; $nostr[3] = "\x1B\$F>\x0F"; $nostr[4] = "\x1B\$F?\x0F"; $nostr[5] = "\x1B\$F@\x0F"; $nostr[6] = "\x1B\$FA\x0F"; $nostr[7] = "\x1B\$FB\x0F"; $nostr[8] = "\x1B\$FC\x0F"; $nostr[9] = "\x1B\$FD\x0F"; $nostr[0] = "\x1B\$FE\x0F"; for (my $i = 1; $i <= 10; $i++) { if ($i < 10) { $akstr[$i] = ", directkey=\"$i\" nonumber"; } else { $akstr[0] = ", directkey=\"0\" nonumber"; } } } } #################### # 引数の取得 my $q = new CGI(); if (!$cfg{Blog_ID}) { $cfg{Blog_ID} = $q->param("id"); # blog ID } my $mode = $q->param("mode"); # 処理モード my $no = $q->param("no"); # エントリーNO my $eid = $q->param("eid"); # エントリーID my $ref_eid = $q->param("ref_eid"); # 元記事のエントリーID my $page = $q->param("page"); # ページNO my $sprtpage = $q->param("sprtpage"); # 分割ページ数 my $sprtbyte = $q->param("sprtbyte"); # ページ分割byte数 my $redirect_url = $q->param("url"); # リダイレクト先のURL my $img = $q->param("img"); # 画像のURL my $cat = $q->param("cat"); # カテゴリID my $post_from = $q->param("from"); # 投稿者 my $post_mail = $q->param("mail"); # メール my $post_text = $q->param("text"); # コメント my $pw_text = $q->param("pw_text"); # 暗号化パスワード my $key = $q->param("key"); # 暗号化キー my $entry_cat = $q->param("entry_cat"); # エントリーのカテゴリー my $entry_title = $q->param("entry_title"); # エントリーのタイトル my $entry_text = $q->param("entry_text"); # エントリーの内容 my $entry_text_more = $q->param("entry_text_more"); # エントリーの追記 my $entry_excerpt = $q->param("entry_excerpt"); # エントリーの概要 my $entry_keywords = $q->param("entry_keywords"); # エントリーのキーワード my $entry_tags = $q->param("entry_tags"); # エントリーのタグ my $post_status = $q->param("post_status"); # エントリーのステータス my $post_status_old = $q->param("post_status_old"); # エントリーの編集前のステータス my $allow_comments = $q->param("allow_comments"); # エントリーのコメント許可チェック my $allow_pings = $q->param("allow_pings"); # エントリーのping許可チェック my $text_format = $q->param("convert_breaks"); # エントリーのテキストフォーマット my $entry_created_on = $q->param("entry_created_on"); # エントリーの作成日時 # PerlMagick の有無調査 my $imk = 0; if ($mode eq 'image' || $mode eq 'img_cut') { eval 'use Image::Magick;'; if ($cfg{ImageAutoReduce} eq "imagemagick") { if($@){ $imk = 0; }else{ $imk = 1; } } else { $imk = 0; } } elsif ($cfg{ImageAutoReduce} eq "picto") { $imk = 2; } my $data; # 表示文字列用の変数を宣言する #管理者用暗号化キーをチェック my $admin_mode; if (($key ne "")&&(MT4i::Func::check_crypt($cfg{AdminPassword}.$cfg{Blog_ID},$key))){ $admin_mode = 'yes'; }else{ $admin_mode = 'no'; $key = ""; } #################### # mt.cfgの読み込み require MT; my $mt; if (-e $cfg{MT_DIR} . 'mt-config.cgi') { $mt = MT->new( Config => $cfg{MT_DIR} . 'mt-config.cgi', Directory => $cfg{MT_DIR} ) or die MT->errstr; } else { $mt = MT->new( Config => $cfg{MT_DIR} . 'mt.cfg', Directory => $cfg{MT_DIR} ) or die MT->errstr; } #################### # blog IDが指定されていなかった場合はエラー if (!$cfg{Blog_ID}) { $data = "Error:引数にblog IDを指定してください。
"; # blog一覧表示 $data .= "
"; require MT::Blog; my @blogs = MT::Blog->load(undef, {unique => 1}); # ソート @blogs = sort {$a->id <=> $b->id} @blogs; $data .= ''; $data .= ''; # 表示 for my $blog (@blogs) { my $blog_id = $blog->id; my $blog_name = &conv_euc_z2h($blog->name); my $blog_description = &conv_euc_z2h($blog->description); $data .= ""; } $data .= '
blog IDblog NameDescription
$blog_id$blog_name$blog_description

blog ID の指定方法:
 MT4i.cgi の設定にて "$blog_id" に上記 blog ID を指定するか、
 もしくは上記 blog Name にリンクされている URL でアクセスする。'; &errorout; exit; # exitする } #################### # PublishCharsetの取得 my $conv_in; if (lc $mt->{cfg}->PublishCharset eq lc "Shift_JIS") { $conv_in = "sjis"; } elsif (lc $mt->{cfg}->PublishCharset eq lc "ISO-2022-JP") { $conv_in = "jis"; } elsif (lc $mt->{cfg}->PublishCharset eq lc "UTF-8") { $conv_in = "utf8"; } elsif (lc $mt->{cfg}->PublishCharset eq lc "EUC-JP") { $conv_in = "euc"; } #################### # blog名及び概要の取得 require MT::Blog; my $blog = MT::Blog->load($cfg{Blog_ID}, {unique => 1}); # 不正なblog ID if (!$blog) { $data = 'ID \''.encode_entities($cfg{Blog_ID}).'\' のblogは存在しません。'; &errorout; exit; # exitする } # blog名、概要、コメント関連設定を変数に格納 my $blog_name = &conv_euc_z2h($blog->name); my $description = &conv_euc_z2h($blog->description); my $sort_order_comments = $blog->sort_order_comments; my $email_new_comments = $blog->email_new_comments; my $email_new_pings = $blog->email_new_pings; my $convert_paras = $blog->convert_paras; my $convert_paras_comments = $blog->convert_paras_comments; #################### # 引数$modeの判断 if (!$mode) { &main } if ($mode eq 'individual') { &individual } if ($mode eq 'individual_rcm') { &individual } if ($mode eq 'individual_lnk') { &individual } if ($mode eq 'ainori') { &individual } if ($mode eq 'comment') { &comment } if ($mode eq 'comment_rcm') { &comment } if ($mode eq 'comment_lnk') { &comment } if ($mode eq 'image') { &image } if ($mode eq 'img_cut') { &image_cut } if ($mode eq 'postform') { &postform } if ($mode eq 'postform_rcm') { &postform } if ($mode eq 'postform_lnk') { &postform } if ($mode eq 'post') { &post } if ($mode eq 'post_rcm') { &post } if ($mode eq 'post_lnk') { &post } if ($mode eq 'recentcomment') { &recent_comment } if ($mode eq 'trackback') { &trackback } if ($mode eq 'redirect') { &redirector } # 管理者用バックドアの表示 if ($cfg{AdminDoor} eq "yes"){ if ($mode eq 'admindoor') { &admindoor } } #--- ここから先は管理モードでしか実行できない --- if ($admin_mode eq "yes") { if ($mode eq 'entryform') { &entryform } if ($mode eq 'entry') { &entry } if ($mode eq 'comment_del') { &comment_del } if ($mode eq 'entry_del') { &entry_del } if ($mode eq 'trackback_del') { &trackback_del } if ($mode eq 'trackback_ipban') { &trackback_ipban } if ($mode eq 'comment_ipban') { &comment_ipban } if ($mode eq 'email_comments') { &email_comments } if ($mode eq 'confirm_comment_del') { &confirm } if ($mode eq 'confirm_entry_del') { &confirm } if ($mode eq 'confirm_trackback_del') { &confirm } } ######################################## # Sub Main - トップページの描画 ######################################## sub main { if(!$mode && !$page) { $page = 0 } if ($cfg{AccessKey} eq "yes" && ($ua eq "i-mode" || $ua eq "j-sky" || $ua eq "ezweb")) { # 携帯電話からのアクセスかつアクセスキー有効の場合は$cfg{DispNum}を6以下にする if ($cfg{DispNum} > 6) { $cfg{DispNum} = 6; } } my $rowid; if($page == 0) { $rowid = 0 } else { $rowid = $page * $cfg{DispNum} } #################### # 総件数の取得 my $ttlcnt = &get_ttlcnt; #################### # 一覧の取得 my @entries = &get_entries($rowid, $cfg{DispNum}); # 一覧件数取得($cfg{DispNum}より少ない可能性がある為) my $rowcnt = @entries + 1; #################### # 表示文字列生成 my $adsense = `perl googlead.pl`; $data .= $adsense; $data .= "

"; if ($cfg{Logo_i} && $cfg{Logo_i}) { if ($ua eq 'i-mode') { $data .= "\"$blog_name"; } else { $data .= "\"$blog_name"; } $data .= "

"; } else { $data .= "$blog_name
mobile ver.
"; } # 管理者モード if ($admin_mode eq 'yes'){ $data .= "

管理者モード

"; } if ($cfg{Dscrptn} eq "yes" && $page == 0 && $description) { my $tmp_data .= "
フルーティスト&会社員&主婦を務める小島まり絵のブログです。フルート・吹奏楽・旅・マイホームなど、好きなことやダンナとの日常生活を綴っています。
"; #単なる改行を
タグに置換 #(「ウェブログの説明」に改行が混ざるとauで表示されない不具合への対処) $tmp_data=~s/\r\n/
/g; $tmp_data=~s/\r/
/g; $tmp_data=~s/\n/
/g; $data .= $tmp_data; } $data .= "
"; # カテゴリセレクタ if ($cfg{CatSelect} == 1) { $data .= "
"; if ($key){ $data .= ""; } $data .= ""; $data .= ""; $data .= "
"; $data .= "
"; } #################### # 記事本文 # 検索結果が0件の場合はメッセージ表示 if (@entries <= 0) { $data .= "このカテゴリに属するエントリはありません"; } else { my $i = 0; for my $entry (@entries){ # 結果のフェッチと表示 my $title = &conv_euc_z2h($entry->title); $title = "untitled" if($title eq ''); # 下書き/指定日かどうかを調べる my $ent_status = $entry->status; my $d_f; if ($ent_status == 1) { $d_f = '(下書き)'; } elsif ($ent_status == 3) { $d_f = '(指定日)'; } $title = $d_f . $title; my $created_on = &conv_datetime($entry->created_on); my $comment_cnt = $entry->comment_count; my $ping_cnt = $entry->ping_count; $rowid++; $i++; my $href = &make_href("individual", $rowid, 0, $entry->id, 0); if ($cfg{AccessKey} eq "no" || ($cfg{AccessKey} eq "yes" && $ua ne "i-mode" && $ua ne "ezweb" && $ua ne "j-sky")) { $data .= "$rowid.$title$created_on"; } else { $data .= "$nostr[$i]$title$created_on"; } if ($comment_cnt > 0 && $cfg{CommentColor} ne 'no'){ #コメント数を一覧に付加 $data .= "[$comment_cnt]"; } if ($ping_cnt > 0 && $cfg{TbColor} ne 'no'){ #トラックバック数を一覧に付加 $data .= "[$ping_cnt]"; } $data .= "
"; } # 最終ページの算出 #if ($ttlcnt >= $cfg{DispNum}) { if ($ttlcnt > $cfg{DispNum}) { my $lastpage = int($ttlcnt / $cfg{DispNum}); # int()で小数点以下は切り捨て my $amari = $ttlcnt % $cfg{DispNum}; # 余りの算出 if ($amari > 0) { $lastpage++ } # あまりがあったら+1 my $ttl = $lastpage; # 下のページ数表示用に値取得 $lastpage--; # でもページは0から始まってるので-1(なんか間抜け) # ページ数表示 my $here = $page + 1; $data .= "
$here/$ttl

"; # 引数用ページ数計算 my $nextpage = $page + 1; my $prevpage = $page - 1; # 次、前、最初 if ($rowid < $ttlcnt) { my $href = &make_href("", 0, $nextpage, 0, 0); if ($page == $lastpage - 1 && $amari > 0) { $data .= "$nostr[9]次の$amari件 >
"; } else { $data .= "$nostr[9]次の$cfg{DispNum}件 >
"; } } $rowid = $rowid - $rowcnt; if ($rowid > 0) { my $href = &make_href("", 0, $prevpage, 0, 0); $data .= "$nostr[7]< 前の$cfg{DispNum}件
"; } if ($page > 1) { my $href = &make_href("", 0, 0, 0, 0); $data .= "$nostr[0]<< 最初の$cfg{DispNum}件
"; } # 「最後」リンクの表示判定 if ($page < $lastpage - 1) { my $href = &make_href("", 0, $lastpage, 0, 0); if ($amari > 0) { $data .= "$nostr[8]最後の$amari件 >>
"; } else { $data .= "$nostr[8]最後の$cfg{DispNum}件 >>
"; } } } else { $data .= "
1/1
"; } # 最近のコメント一覧へのリンク if ($page == 0) { require MT::Comment; my $blog_comment_cnt = MT::Comment->count({ blog_id => $cfg{Blog_ID} }); if ($blog_comment_cnt) { my $href = &make_href("recentcomment", 0, 0, 0, 0); $data .= "
最近のコメント$cfg{RecentComment}件"; } } } # 管理者用URLへのリンクを表示する if ($cfg{AdminDoor} eq "yes"){ $data .= "
"; my $href = &make_href("admindoor", 0, 0, 0); $data .= "
"; $data .= "管理者用URLを取得
"; $data .= "\AdminPasswordの値"; $data .= "

"; $data .= ""; $data .= ""; $data .= ""; if ($key){ $data .= ""; } $data .= "
"; if ($admin_mode eq "yes"){ $data .= 'あなたは管理者用URLを入手済みです。このURLをブックマークした後、速やかに「MT4i Manager」にて"AdminDoor"の値を"no"に変更してください。
'; } if ($cfg{AdminPassword} eq "password"){ $data .= '"AdminPassword"がデフォルト値"password"から変更されていません。このままだと他人に管理者URLを推測される可能性が非常に高くなります。速やかに変更してください。
'; } } #管理者用メニュー if ($admin_mode eq "yes"){ $data .= "
"; $data .= "
"; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= "
"; $data .= "
"; if ($email_new_comments){ $data .= ""; }else{ $data .= ""; } $data .= ""; $data .= ""; $data .= ""; $data .= "
"; $data .= "
"; } &htmlout; } ######################################## # Sub Individual - 単記事ページの描画 ######################################## sub individual { my $rowid; if ($no) { $rowid = $no; $no--; } else { $no = 0; my $ttlcnt = &get_ttlcnt; FOUND: while ($ttlcnt > 0) { my @entries = &get_entries($no, $cfg{DispNum}); if (@entries <= 0) { last; } for my $entry (@entries) { $no++; if ($entry->id == $eid) { last FOUND; } } $ttlcnt -= $cfg{DispNum}; } $rowid = $no; $no--; } #################### # 記事の取得 require MT::Entry; my $entry = MT::Entry->load($eid); # 検索結果が0件の場合はメッセージ表示してSTOP(有り得ないけどな) if (!$entry) { $data = 'Entry ID \''.encode_entities($eid).'\' は不正です。'; &errorout; exit; # exitする } # 結果を変数に格納 my $title = &conv_euc_z2h($entry->title); my $text = &conv_euc_z2h(MT->apply_text_filters($entry->text, $entry->text_filters)); my $text_more = &conv_euc_z2h(MT->apply_text_filters($entry->text_more, $entry->text_filters)); my $convert_breaks = $entry->convert_breaks; my $created_on = &conv_datetime($entry->created_on); my $comment_cnt = $entry->comment_count; my $ping_cnt = $entry->ping_count; # コメント投稿機能が強制OFFされている場合はallow_commentsをClosedに my $ent_allow_comments; if ($cfg{ArrowComments} == 1) { $ent_allow_comments = $entry->allow_comments; } else { $ent_allow_comments = 2; } my $ent_status = $entry->status; # 本文と追記を一つにまとめる if($text_more){ $text = "

$text

$text_more

"; } #################### # リンクのURLをchtmltrans経由に変換 $text = &conv_redirect($text, $rowid, $eid); #################### # タグソースURLのスラッシュを%2Fに変換 if ($imk != 2) { $text = &img_url_conv($text); } #################### # 画像の除去(退避) my $href; # aタグを含めた除去、ALTの表示、画像へのリンク if ($imk == 2) { $text =~ s/]*>]*src=["']http:\/\/([^"'>]*)["'][^>]*alt=["']([^"'>]*)["'][^>]*><\/a>/<画像:$2<\/a>>/ig; $text =~ s/]*>]*alt=["']([^"'>]*)["'][^>]*src=["']http:\/\/([^"'>]*)["'][^>]*><\/a>/<画像:$1<\/a>>/ig; # imgタグのみの除去、ALTの表示、画像へのリンク $text =~ s/]*src=["']http:\/\/([^"'>]*)["'][^>]*alt=["']([^"'>]*)["'][^>]*>/<画像:$2<\/a>>/ig; $text =~ s/]*alt=["']([^"'>]*)["'][^>]*src=["']http:\/\/([^"'>]*)["'][^>]*>/<画像:$1<\/a>>/ig; # aタグを含めた除去、画像へのリンク $text =~ s/]*>]*src=["']http:\/\/([^"'>]*)["'][^>]*><\/a>/<画像<\/a>>/ig; # imgタグのみの除去、画像へのリンク $text =~ s/]*src=["']http:\/\/([^"'>]*)["'][^>]*>/<画像<\/a>>/ig; } else { $href = &make_href("image", $rowid, 0, $eid, 0); $text =~ s/]*>]*src=["']([^"'>]*)["'][^>]*alt=["']([^"'>]*)["'][^>]*><\/a>/<画像:$2<\/a>>/ig; $text =~ s/]*>]*alt=["']([^"'>]*)["'][^>]*src=["']([^"'>]*)["'][^>]*><\/a>/<画像:$1<\/a>>/ig; # imgタグのみの除去、ALTの表示、画像へのリンク $text =~ s/]*src=["']([^"'>]*)["'][^>]*alt=["']([^"'>]*)["'][^>]*>/<画像:$2<\/a>>/ig; $text =~ s/]*alt=["']([^"'>]*)["'][^>]*src=["']([^"'>]*)["'][^>]*>/<画像:$1<\/a>>/ig; # aタグを含めた除去、画像へのリンク $text =~ s/]*>]*src=["']([^"'>]*)["'][^>]*><\/a>/<画像<\/a>>/ig; # imgタグのみの除去、画像へのリンク $text =~ s/]*src=["']([^"'>]*)["'][^>]*>/<画像<\/a>>/ig; } #################### # タグ変換等 if($convert_breaks eq '__default__' || ($convert_breaks ne '__default__' && $convert_breaks ne '0' && $convert_paras eq '__default__')) { # bqタグ部の色変更 if ($cfg{BqColor}) { $text=~s/
/
/ig; $text=~s/<\/blockquote>/<\/font><\/blockquote>/ig; } # bqタグのpタグへの変換 if ($cfg{BQ2P} eq "yes") { $text=~s/
/

/ig; $text=~s/<\/blockquote>/<\/p>/ig; } else { # bqタグ周りの余計なbrタグ除去 $text=~s/

/
/ig; $text=~s/
/
/ig; $text=~s/<\/blockquote>

/<\/blockquote>/ig; $text=~s/

/
/ig; $text=~s/<\/blockquote><\/p>/<\/blockquote>/ig; } # pタグ周りの余計なbrタグ除去 $text=~s/

/

/ig; $text=~s/

/

/ig; $text=~s/<\/p>

/<\/p>/ig; $text=~s/
<\/p>/<\/p>/ig; # ulタグ周りの余計なbrタグ除去 $text=~s/

    /
      /ig; $text=~s/
        /
          /ig; $text=~s/

            /
              /ig; $text=~s/<\/ul>

              /<\/ul>/ig; # olタグ周りの余計なbrタグ除去 $text=~s/

                /
                  /ig; $text=~s/
                    /
                      /ig; $text=~s/

                        /
                          /ig; $text=~s/<\/ol>

                          /<\/ol>/ig; # li閉じタグ除去 $text=~s/<\/li>//ig; } #################### # 本文分割処理 if (MT4i::Func::lenb_euc($text) > $cfg{SprtLimit}) { $text = &separate($text, $rowid); } #################### # 表示文字列生成 my $adsense = `perl googlead.pl`; $data .= $adsense; $data .= "
                          "; $data .= "

                          "; # 記事一覧からの閲覧なら記事番号を振る if ($mode eq 'individual') { $data .= "$rowid."; } # 下書き/指定日かどうかを調べる my $d_f; if ($ent_status == 1) { $d_f = '(下書き)'; } elsif ($ent_status == 3) { $d_f = '(指定日)'; } $data .= "$d_f$title"; # カテゴリ名の表示 if ($cfg{IndividualCatLabelDisp} eq 'yes') { my $cat_label = &check_category($entry); $data .= "[$cat_label]"; } if ($cfg{IndividualAuthorDisp} eq 'yes') { # Authorのnicknameがあれば、それを表示。無ければnameを表示する require MT::Author; my $author = MT::Author->load({ id => $entry->author_id }); my $author_name; if ($author){ if ($author->nickname){ $author_name = conv_euc_z2h($author->nickname); }else{ $author_name = $author->name; } $data .= " by ".$author_name; } } $data .= "$created_on

                          "; $data .= "
                          "; $data .= "$text"; my $ttlcnt; # 記事一覧からの閲覧なら記事番号を振る if ($mode eq 'individual') { # 総件数取得 $ttlcnt = &get_ttlcnt; # エントリー数表示 $data .= "
                          $rowid/$ttlcnt

                          "; } else { $data .= "
                          "; } ##################### # Noneでは投稿も表示も無し、Openなら両方OK、Closedは表示のみ # $comment_cntの値 None=0,Open=1,Closed=2 # MT3.2以降では Closed=2 が廃止された模様なので対応 2006/06/21 if ($ent_allow_comments > 0 || ($ent_allow_comments == 0 && $mt->version_number() >= 3.2) ){ if ($comment_cnt > 0) { if ($mode eq 'individual') { $href = &make_href("comment", $rowid, 0, $eid, 0); } elsif ($mode eq 'individual_rcm') { $href = &make_href("comment_rcm", $rowid, 0, $eid, 0); } elsif ($mode eq 'individual_lnk') { $href = &make_href("comment_lnk", $rowid, 0, $eid, $ref_eid); } if ($mode ne 'ainori') { # あいのり時はコメント参照できないように。 # 何故って色々面倒だからさっ。 $data .= "$nostr[8]コメント($comment_cnt)
                          "; } } elsif ($ent_allow_comments == 1) { if ($mode eq 'individual') { $href = &make_href("postform", $rowid, 0, $eid, 0); } elsif ($mode eq 'individual_rcm') { $href = &make_href("postform_rcm", $rowid, 0, $eid, 0); } $data .= "$nostr[8]コメント投稿
                          "; # ※モード「comment_lnk」の時はコメント投稿できない。 # ※参照目的なんだからコメント書くこと無いでしょ、たぶん。 } } # Trackback if ($ping_cnt > 0) { $href = &make_href("trackback", $rowid, 0, $eid); $data .= "$nostr[5]
                          トラックバック($ping_cnt)
                          "; } # 管理者のみ「Entry編集・消去」が可能 if ($admin_mode eq "yes"){ $data .= "
                          "; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= "
                          "; $data .= "
                          "; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= "
                          "; } if ($mode eq 'individual') { # 記事一覧からの閲覧 # 引数用エントリーNO算出 my $nextno = $rowid + 1; my $prevno = $rowid - 1; # 引数用エントリーID算出(prevとnextが引っ繰り返っているので注意) my $nextid; my $previd; my $next = $entry->previous(1); my $prev = $entry->next(1); if ($cat) { my $category = MT::Category->load($cat); while ($next && !$next->is_in_category($category)){ $next = $next->previous(1); } while ($prev && !$prev->is_in_category($category)){ $prev = $prev->next(1); } } elsif ($cfg{NonDispCat}) { # 非表示カテゴリが指定されている場合 # 非表示カテゴリのリストをサブカテゴリも含めて取得する my @nondispcats = split(",", $cfg{NonDispCat}); my @nonsubdispcats; foreach my $nondispcatid (@nondispcats) { # IDからカテゴリオブジェクトを取得 require MT::Category; my $category = MT::Category->load($nondispcatid); if (defined $category) { my @sub_categories = MT4i::Func::get_subcatobjlist($category); foreach my $sub_category (@sub_categories) { push @nonsubdispcats, $sub_category->id; } } } push @nondispcats, @nonsubdispcats; # ぐるぐる回して非表示カテゴリと突合せ while ($next) { # エントリのカテゴリ取得 my @places = MT::Placement->load({ entry_id => $next->id }); if (@places) { my $match = 0; foreach my $place (@places) { foreach my $nondispcat (@nondispcats) { if ($place->category_id == $nondispcat) { $match++; last; } } } if ($match < @places) { last; } else { $next = $next->previous(1); } } else { last; } } while ($prev) { # エントリのカテゴリ取得 my @places = MT::Placement->load({ entry_id => $prev->id }); if (@places) { my $match = 0; foreach my $place (@places) { foreach my $nondispcat (@nondispcats) { if ($place->category_id == $nondispcat) { $match++; last; } } } if ($match < @places) { last; } else { $prev = $prev->next(1); } } else { last; } } } if ($next) { $nextid = $next->id; } if ($prev) { $previd = $prev->id; } if($rowid < $ttlcnt) { $href = &make_href("individual", $nextno, 0, $nextid, 0); $data .= "$nostr[9]次の記事へ >
                          "; } if($rowid > 1) { $href = &make_href("individual", $prevno, 0, $previd, 0); $data .= "$nostr[7]< 前の記事へ
                          "; } # ページ数算出 $page = int($no / $cfg{DispNum}); # int()で小数点以下は切り捨て $href = &make_href("", 0, $page, 0, 0); $data .= "$nostr[0]一覧へ戻る"; } elsif ($mode eq 'individual_rcm') { # 最近コメント一覧からの閲覧 $href = &make_href("recentcomment", 0, 0, 0, 0); $data .= "$nostr[0]最近コメント一覧へ戻る"; } elsif ($mode eq 'individual_lnk') { # 記事中リンクからの閲覧 $href = &make_href("individual", $rowid, 0, $ref_eid, 0); $data .= "$nostr[0]リンク元の記事へ戻る"; } elsif ($mode eq 'ainori') { # あいのり時はリファラへ戻る $href = $ENV{'HTTP_REFERER'}; $data .= "$nostr[0]リンク元へ戻る"; } &htmlout; } ######################################## # Sub Comment - コメント描画 ######################################## sub comment { my $rowid = $no; #################### # entry idの取得 require MT::Entry; my $entry = MT::Entry->load($eid); # 検索結果が0件の場合はメッセージ表示してSTOP(有り得ないけどな) if ($entry <= 0) { $data = 'Entry ID \''.encode_entities($eid).'\' は不正です。'; &errorout; exit; # exitする } # 結果を変数に格納 my $ent_title = &conv_euc_z2h($entry->title); my $ent_created_on = &conv_datetime($entry->created_on); my $ent_id = $entry->id; # コメント投稿機能が強制OFFされている場合はallow_commentsをClosedに my $ent_allow_comments; if ($cfg{ArrowComments} == 1) { $ent_allow_comments = $entry->allow_comments; } else { $ent_allow_comments = 2; } my $ent_status = $entry->status; #################### # コメントの取得 my @comments; # 管理者モードではコメントを逆順表示する if ($admin_mode eq "yes"){ @comments = get_comments($ent_id, '', 'descend', 1); }else{ @comments = get_comments($ent_id, '', $sort_order_comments, 1); } my $author; my $txt; my $created_on; my $text; for my $comment (@comments) { $author = &conv_euc_z2h($comment->author); $txt = &conv_euc_z2h($comment->text); $created_on = &conv_datetime($comment->created_on); $text .= "
                          by $author$created_on

                          $txt"; # 管理者のみ「コメント消去」等が可能 if ($admin_mode eq "yes"){ $text .= "
                          "; $text .= ""; $text .= ""; $text .= ""; $text .= ""; $text .= "id."\">"; $text .= ""; $text .= ""; $text .= "
                          "; } } #################### # タグ変換等 if($convert_paras_comments eq '__default__'){ # 改行のbrタグへの変換 $text=~s/\r\n/
                          /g; $text=~s/\r/
                          /g; $text=~s/\n/
                          /g; } #################### # リンクのURLをchtmltrans経由に変換 $text = &conv_redirect($text, $rowid, $eid); #################### # <_ahref>をに戻す $text=~s/_ahref/a href/g; #################### # 本文分割処理 if (MT4i::Func::lenb_euc($text) > $cfg{SprtLimit}) { $text = &separate($text, $rowid); } #################### # 表示文字列生成 $data .= "

                          "; if ($rowid) { $data .= "$rowid."; } if ($admin_mode eq "yes"){ $data .= "$ent_title$ent_created_onへのコメント(新しい順)

                          "; }else{ $data .= "$ent_title$ent_created_onへのコメント"; } $data .= "$text
                          "; if ($ent_allow_comments == 1){ if ($mode eq 'comment') { my $href = &make_href("postform", $rowid, 0, $eid, 0); $data .= "$nostr[8]
                          コメント投稿
                          "; } elsif ($mode eq 'comment_rcm') { my $href = &make_href("postform_rcm", $rowid, 0, $eid, 0); $data .= "$nostr[8]コメント投稿
                          "; } # ※モード「comment_lnk」の時はコメント投稿できない。 # ※参照目的なんだからコメント書くこと無いでしょ、たぶん。 } my $href = &make_href("individual", $rowid, 0, $eid, 0); if ($mode eq 'comment') { $data .= "$nostr[0]記事へ戻る"; } else { if ($mode eq 'comment_rcm') { $href =~ s/individual/individual_rcm/ig; } elsif ($mode eq 'comment_lnk') { $href = &make_href("individual_lnk", $rowid, 0, $eid, $ref_eid); } $data .= "$nostr[7]元記事を読む
                          "; if ($mode eq 'comment_rcm') { my $href = &make_href("recentcomment", 0, 0, 0, 0); $data .= "$nostr[0]最近コメント一覧へ戻る"; } elsif ($mode eq 'comment_lnk') { my $href = &make_href("individual", $rowid, 0, $ref_eid, 0); $data .= "$nostr[0]リンク元の記事へ戻る"; } } &htmlout; } ######################################## # Sub Recent_Comment - コメントまとめ読み ######################################## sub recent_comment { #################### # コメントの取得 my @comments = get_comments('', $cfg{RecentComment}, 'descend', 1); my $text; require MT::Entry; for my $comment (@comments) { my $author = &conv_euc_z2h($comment->author); my $created_on = &conv_datetime($comment->created_on); my $eid = $comment->entry_id; my $entry = MT::Entry->load($eid); my $entry_title = &conv_euc_z2h($entry->title); my $href = &make_href("comment_rcm", 0, 0, $eid, 0); $text .= "
                          Re:$entry_title
                          by $author$created_on"; } #################### # 表示文字列生成 $data .= "

                          最近のコメント$cfg{RecentComment}件

                          "; $data .= "$text
                          "; my $href = &make_href("", 0, 0, 0, 0); $data .= "
                          $nostr[0]一覧へ戻る"; &htmlout; } ######################################## # Sub Trackback - トラックバック表示 ######################################## sub trackback { my $rowid = $no; #################### # トラックバックの取得 require MT::Trackback; my $tb = MT::Trackback->load( { blog_id => $cfg{Blog_ID} , entry_id => $eid}, { 'sort' => 'created_on', direction => 'descend', unique => 1, limit => 1 }); my @tbpings; require MT::TBPing; if ($mt->version_number() >= 3.2) { @tbpings = MT::TBPing->load( { blog_id => $cfg{Blog_ID}, tb_id => $tb->id, visible => 1, junk_status => [ 0, 1 ] }, { 'sort' => 'created_on', direction => 'descend', unique => 1, limit => $cfg{RecentTB}, 'range_incl' => { 'junk_status' => 1 } }); } else { @tbpings = MT::TBPing->load( { blog_id => $cfg{Blog_ID}, tb_id => $tb->id }, { 'sort' => 'created_on', direction => 'descend', unique => 1, limit => $cfg{RecentTB} }); } my $text; for my $tbping (@tbpings) { my $ping_title = &conv_euc_z2h($tbping->title); my $ping_excerpt = &conv_euc_z2h($tbping->excerpt); my $ping_name = &conv_euc_z2h($tbping->blog_name); my $ping_tracked = conv_datetime($tbping->created_on); my $ping_sourceurl = $tbping->source_url; my $ping_id = $tbping->id; $text .= "
                          $ping_title
                          $ping_excerpt
                          Weblog:$ping_name
                          Tracked:$ping_tracked
                          "; # 管理者のみ「トラックバック削除」等が可能 if ($admin_mode eq "yes"){ $text .= "
                          "; $text .= ""; $text .= ""; $text .= ""; $text .= ""; $text .= ""; $text .= ""; $text .= ""; $text .= "
                          "; } } #################### # リンクのURLをchtmltrans経由に変換 $text = &conv_redirect($text, $rowid, $eid); #################### # <_ahref>をに戻す $text=~s/_ahref/a href/g; #################### # 表示文字列生成 if (@tbpings < $cfg{RecentTB}){ $cfg{RecentTB} = @tbpings; } $data .= "

                          このEntryへの最近のトラックバック$cfg{RecentTB}件(新しい順)

                          "; $data .= "$text
                          "; my $href = &make_href("individual", $rowid, 0, $eid); $data .= "$nostr[0]
                          記事へ戻る"; &htmlout; } ############################################# # Sub Get_Entries - エントリの取得 # 第一引数 : オフセット # 第二引数 : 取得個数 # 管理者の場合には、statusの限定解除 ############################################# sub get_entries { my @ent; require MT::Entry; my %terms = (blog_id => $cfg{Blog_ID}); my %arg = ( 'sort' => 'created_on', direction => 'descend', limit => $_[1], offset => $_[0], ); if ($cat != 0) { # カテゴリ指定あり $arg{'join'} = [ 'MT::Placement', 'entry_id', { blog_id => $cfg{Blog_ID}, category_id => $cat }, { unique => 1 } ]; } if ($admin_mode eq "yes"){ @ent = MT::Entry->load(\%terms, \%arg); } else { $terms{'status'} = 2; if ($cat == 0) { # カテゴリ指定なし if ($cfg{NonDispCat}) { # 非表示カテゴリ指定あり my @entries = MT::Entry->load(\%terms, { 'sort' => 'created_on', direction => 'descend' }); # 非表示カテゴリのリストをサブカテゴリも含めて取得する my @nondispcats = split(",", $cfg{NonDispCat}); my @nonsubdispcats; foreach my $nondispcatid (@nondispcats) { # IDからカテゴリオブジェクトを取得 require MT::Category; my $category = MT::Category->load($nondispcatid); if (defined $category) { my @sub_categories = MT4i::Func::get_subcatobjlist($category); foreach my $sub_category (@sub_categories) { push @nonsubdispcats, $sub_category->id; } } } push @nondispcats, @nonsubdispcats; my $count = 1; foreach my $entry (@entries) { # エントリのカテゴリ取得 my @places = MT::Placement->load({ entry_id => $entry->id }); if (@places) { my $match_cat = 0; foreach my $place (@places) { foreach my $nondispcat (@nondispcats) { if ($place->category_id == $nondispcat) { $match_cat++; last; } } } if ($match_cat < @places) { if ($count > $_[0]) { push @ent, $entry; } $count++; } } else { # Non-Categoryは表示 if ($count > $_[0]) { push @ent, $entry; } $count++; } if ($count == $_[1] + $_[0] + 1) { last; } } } else { # 非表示カテゴリ指定なし @ent = MT::Entry->load(\%terms, \%arg); } } else { # カテゴリ指定あり @ent = MT::Entry->load(\%terms, \%arg); } } return @ent; } ############################################# # Sub Get_Comments - コメントの取得 # 第一引数 : エントリーID # 第二引数 : 取得個数 # 第三引数 : ソート降順/昇順 # 第四引数 : visible値チェックの有無 1:有 0:無 ############################################# sub get_comments { my %arg1; my %arg2; $arg1{'blog_id'} = $cfg{Blog_ID}; if ($_[0] ne '') { $arg1{'entry_id'} = $_[0]; } if ($mt->version_number() >= 3.0 && $_[3] == 1) { $arg1{'visible'} = 1; } $arg2{'sort'} = 'created_on'; $arg2{'direction'} = $_[2]; $arg2{'unique'} = 1; if ($_[1] ne '' && $cfg{NonDispCat} eq '') { $arg2{'limit'} = $_[1]; } require MT::Comment; my @cmnt = MT::Comment->load(\%arg1, \%arg2); # 非表示カテゴリが指定されているか my @comments; if (!$cfg{NonDispCat}) { @comments = @cmnt; } else { my @nondispcats = split(",", $cfg{NonDispCat}); my $count = 0; foreach my $comment (@cmnt) { my @places = MT::Placement->load({ entry_id => $comment->entry_id }); if (@places) { my $match_cat = 0; foreach my $place (@places) { foreach my $nondispcat (@nondispcats) { if ($place->category_id == $nondispcat) { $match_cat++; last; } } } if (@places > $match_cat) { push @comments, $comment; $count++; } } else { # Non-Categoryは表示 push @comments, $comment; $count++; } if ($count == $_[1]) { last; } } } return @comments; } ############################################## # Sub Get_Ttlcnt - 記事総数の取得 ############################################## sub get_ttlcnt { require MT::Entry; require MT::Placement; my %terms; $terms{blog_id} = $cfg{Blog_ID}; if ($admin_mode eq 'no') { $terms{status} = 2; } my %arg = ( 'sort' => 'created_on', direction => 'descend', unique => 1, ); if ($cat == 0) { #カテゴリなし if ($cfg{NonDispCat}) { # 非表示カテゴリ指定あり my @entries = MT::Entry->load(\%terms, \%arg); # 非表示カテゴリのリストをサブカテゴリも含めて取得する my @nondispcats = split(",", $cfg{NonDispCat}); my @nonsubdispcats; foreach my $nondispcatid (@nondispcats) { # IDからカテゴリオブジェクトを取得 require MT::Category; my $category = MT::Category->load($nondispcatid); if (defined $category) { my @sub_categories = MT4i::Func::get_subcatobjlist($category); foreach my $sub_category (@sub_categories) { push @nonsubdispcats, $sub_category->id; } } } push @nondispcats, @nonsubdispcats; my @ent; foreach my $entry (@entries) { # エントリのカテゴリ取得 my @places = MT::Placement->load({ entry_id => $entry->id }); if (@places) { my $match_cat = 0; foreach my $place (@places) { foreach my $nondispcat (@nondispcats) { if ($place->category_id == $nondispcat) { $match_cat++; last; } } } if ($match_cat < @places) { push @ent, $entry; } } else { # Non-Categoryは表示 push @ent, $entry; } } return @ent; } else { # 非表示カテゴリの指定なし return MT::Entry->count(\%terms, \%arg); } } else { #カテゴリあり $arg{'join'} = [ 'MT::Placement', 'entry_id', { blog_id => $cfg{Blog_ID}, category_id => $cat }, { unique => 1 } ]; return MT::Entry->count(\%terms, \%arg); } } ############################################## # Sub Make_Href - HREF文字列の作成 # 第一引数 : mode # 第二引数 : no # 第三引数 : page # 第四引数 : eid # 第五引数 : ref_eid # # 例外として、$modeが"post"の場合には # idを出力しません ############################################## sub make_href { my $h = "$cfg{MyName}"; if ($_[0] ne "post" && $_[0] ne "post_rcm" && $_[0] ne "post_lnk"){ $h .= "?id=$cfg{Blog_ID}"; if ($cat != 0) { $h .= "&cat=$cat"; } if ($_[0] ne "" && $_[0] ne "main") { $h .= "&mode=$_[0]"; } if ($_[1] != 0) { $h .= "&no=$_[1]"; } if ($_[2] != 0) { $h .= "&page=$_[2]"; } if ($_[3] != 0) { $h .= "&eid=$_[3]"; } if ($_[4] != 0) { $h .= "&ref_eid=$_[4]"; } if ($key){ $h .= "&key=$key"; } } return $h; } ######################################## # Sub Image - 画像表示 ######################################## sub image { # PerlMagick が無ければ画像縮小表示処理はしない if ($imk == 0){ $img =~ s/\%2F/\//ig; $data .="

                          "; }else{ # /を%2Fに再エンコード $img =~ s/\//\%2F/ig; $data .="

                          "; } my $href = &make_href("individual", $no, 0, $eid, 0); $data .="$nostr[0]戻る"; &htmlout; } ######################################## # Sub Image_Cut - 画像縮小表示 ######################################## sub image_cut { $img =~ s/\%2F/\//ig; my $url = $img; $url =~ s/http:\/\///; my $host = substr($url, 0, index($url, "/")); my $path = substr($url, index($url, "/")); $data = ""; #################### # ホスト名置換 if ($host eq $cfg{Photo_Host_Original}){ $host = $cfg{Photo_Host_Replace}; } #################### # 画像読み込みをLWPモジュール使用に変更 require HTTP::Request; require LWP::UserAgent; my $ua = LWP::UserAgent->new; $url = 'http://'.$host.$path; my $request = HTTP::Request->new(GET => $url); my $response = $ua->request($request); if ($response->is_success) { $data = $response->as_string; $data =~ /(.*?\r?\n)\r?\n(.*)/s; $data = $2; } else { print "Content-type: text/html\n\nHTTP Error:LWP"; return; } my @blob = $data; #################### # vodafoneの特定機種に限りpng、それ以外はjpgに変換 # サイズに関わらず、pngもしくはjpgに変換するように変更 my $image = Image::Magick->new; $image->BlobToImage(@blob); # デジカメなどのアプリケーション情報の削除 if (Image::Magick->VERSION >= 6.0) { $image->Strip(); } else { $image->Profile( name=>'*' ); $image->Comment(''); } my $format; if ($png_flag){ $image->Set(magick=>'png'); $format = 'png'; $cfg{PhotoWidth} = $cfg{PngWidth}; }else{ $image->Set(magick=>'jpg'); $format = 'jpeg'; } # 参考:http://deneb.jp/Perl/mobile/ my $start_pos = 0; my $user_agent = $ENV{'HTTP_USER_AGENT'}; my $cache_limit = -1024 + MT4i::Func::calc_cache_size( $user_agent ); # 画像が既にキャッシュ許容範囲内なら縮小処理しない @blob = $image->ImageToBlob(); if ( $cache_limit < length($blob[0]) ) { foreach my $i ( $start_pos ..19 ) { my $img2 = $image->Clone(); my $ratio = 1-$i*0.05; my $x = $cfg{PhotoWidth} * $ratio; $img2->Scale($x); @blob = $img2->ImageToBlob(); if ( $cache_limit >= length($blob[0]) ) { last; } } } print "Content-type: image/$format\n"; print "Content-length: ",length($blob[0]),"\n\n"; binmode STDOUT; print STDOUT $blob[0]; } ######################################## # Sub Postform - コメント投稿フォーム ######################################## sub postform { my $rowid = $no; # Entry検索 require MT::Entry; my $entry = MT::Entry->load($eid); # 検索結果が0件の場合はメッセージ表示してSTOP(有り得ないけどな) if ($entry <= 0) { $data = 'Entry ID \''.encode_entities($eid).'\' は不正です。'; &errorout; exit; # exitする } # 結果を変数に格納 my $ent_title = &conv_euc_z2h($entry->title); my $ent_created_on = &conv_datetime($entry->created_on); #################### # 表示文字列生成 $data = "

                          "; if ($rowid) { $data .= "$rowid."; } $data .= "$ent_title$ent_created_onへのコメント投稿


                          "; if ($mt->version_number() >= 3.0 && $cfg{ApproveComment} eq 'no') { $data .= "コメントは投稿後、掲載を保留されます。
                          管理人による承諾後、掲載されます。
                          "; } $data .= $cfg{CommentNotes}; my $href; if ($mode eq 'postform') { $href = &make_href("post", 0, 0, $eid, 0); } elsif ($mode eq 'postform_rcm') { $href = &make_href("post_rcm", 0, 0, $eid, 0); } elsif ($mode eq 'postform_lnk') { $href = &make_href("post_lnk", 0, 0, $eid, 0); } $data .= "
                          "; $data .= "名前"; if ($cfg{PostFromEssential} ne "yes"){ $data .= "(省略可)"; } else { $data .= '(入力必須)'; } $data .= "

                          "; $data .= "メールアドレス"; if ($cfg{PostMailEssential} ne "yes"){ $data .= "(省略可)"; } else { $data .= '(入力必須)'; } $data .= "

                          "; $data .= "コメント"; if ($cfg{PostTextEssential} ne "yes"){ $data .= "(省略可)"; } else { $data .= '(入力必須)'; } $data .= "

                          "; $data .= ""; if ($mode eq 'postform') { $data .= ""; } elsif ($mode eq 'postform_rcm') { $data .= ""; } elsif ($mode eq 'postform_lnk') { $data .= ""; } $data .= "「送信」を押してから書き込み完了まで多少時間がかかります。
                          環境によってはタイムアウトが出ることがありますが、書き込みは完了しています。
                          「送信」の二度押しは絶対にしないで下さい。
                          "; $data .= ""; $data .= ""; if ($key){ $data .= ""; } $data .= ""; $data .= "
                          "; $data .= "
                          "; if ($mode eq 'postform') { $href = &make_href("individual", $rowid, 0, $eid, 0); } elsif ($mode eq 'postform_rcm') { $href = &make_href("individual_rcm", $rowid, 0, $eid, 0); } elsif ($mode eq 'postform_lnk') { $href = &make_href("individual_lnk", $rowid, 0, $eid, 0); } $data .="$nostr[0]戻る"; &htmlout; } ######################################## # Sub Post - コメント投稿->表示処理 ######################################## sub post { require MT::Comment; require MT::App; # SPAM対策 # h1タグ、aタグを含むコメントを弾く # 参考:http://as-is.net/blog/archives/000962.html if ($post_text =~ /

                          /i or $post_text =~ /new($post_from, 'sjis')->euc; $post_text = Jcode->new($post_text, 'sjis')->euc; } #################### # admin_helperをチェック(管理者モード時のみ) my $post_from_org = $post_from; if (($cfg{AdminHelper} eq 'yes') && ($admin_mode eq 'yes')){ if ($post_from_org eq $cfg{AdminHelperID}){ $post_from = $cfg{AdminHelperNM}; $post_mail = $cfg{AdminHelperML}; } } #################### # 必須入力項目をチェック # 名前,mail,textのどれも入力が無ければエラー if(((!$post_from)&&(!$post_text)&&(!$post_mail))|| ((!$post_from)&&($cfg{PostFromEssential} eq "yes"))|| ((!$post_mail)&&($cfg{PostMailEssential} eq "yes"))|| ((!$post_text)&&($cfg{PostTextEssential} eq "yes"))) { $data .="Error!
                          未入力項目があります.
                          "; my $href = &make_href("postform", $rowid, 0, $eid, 0); $data .="$nostr[0]戻る"; &errorout; #return; exit; } #################### # メールアドレスチェック if ($post_mail){ unless($post_mail=~/^[\w\-+\.]+\@[\w\-+\.]+$/i){ $data .="Error!
                          メールアドレスが不正です.
                          "; my $href = &make_href("postform", $rowid, 0, $eid, 0); $data .="$nostr[0]戻る"; &errorout; return; } } # 投稿された文字列の半角カナを全角に変換 if ($ecd == 1) { Encode::JP::H2Z::h2z(\$post_from); Encode::JP::H2Z::h2z(\$post_text); } else { Jcode->new(\$post_from,'euc')->h2z; Jcode->new(\$post_text,'euc')->h2z; } # PublishCharsetに変換 if ($conv_in ne 'euc') { if ($conv_in eq 'utf8' && $ecd == 1) { $post_from = encode("shiftjis",decode("euc-jp",$post_from)); $post_text = encode("shiftjis",decode("euc-jp",$post_text)); $post_from = encode("utf8",decode("cp932",$post_from)); $post_text = encode("utf8",decode("cp932",$post_text)); } else { $post_from = Jcode->new($post_from, 'euc')->$conv_in(); $post_text = Jcode->new($post_text, 'euc')->$conv_in(); } } # 連続投稿防止 # (直前のコメントと比較して同内容であれば # 連続投稿とみなしエラーとする。 # 悪意ある連続投稿防止というよりは、 # タイムアウト後などの不作為の過失防止。) my @comments = get_comments($eid, 1, 'descend', 0); for my $tmp (@comments) { if ($post_from eq $tmp->author && $post_mail eq $tmp->email && $post_text eq $tmp->text) { $data .="Error!
                          同内容のコメントが既に投稿されています
                          "; my $href = &make_href("comment", $rowid, 0, $eid, 0); $data .="$nostr[0]投稿されたコメントを確認する"; &errorout; return; } } # Entry ID、Entry Titleの取得 require MT::Entry; my $entry = MT::Entry->load($eid); # 検索結果が0件の場合はメッセージ表示してSTOP(有り得ないけどな) if ($entry <= 0) { $data = 'Entry ID \''.encode_entities($eid).'\' は不正です。'; &errorout; exit; # exitする } # DB更新 my $comment = MT::Comment->new; my $rm_ip = $ENV{'REMOTE_ADDR'}; $comment->ip($rm_ip); $comment->blog_id($cfg{Blog_ID}); $comment->entry_id($entry->id); $comment->author($post_from); $comment->email($post_mail); $comment->text($post_text); #if ($admin_data[3]){ # $comment->url($admin_data[3]); #} # MT3.0以上ならvisible値設定 if ($mt->version_number() >= 3.0) { # $cfg{ApproveComment}='yes'の場合には、書き込みと同時に掲載を承諾する if ($cfg{ApproveComment} eq 'yes') { $comment->visible(1); } else { $comment->visible(0); } } $comment->save or die $comment->errstr; #################### # MT3.0以上では、通知メール送信及びリビルドをバックグラウンドで行う if ($mt->version_number() >= 3.0) { require MT::Util; MT::Util::start_background_task(sub { # メール送信 if ($blog->email_new_comments) { require MT::Mail; my $author = $entry->author; $mt->set_language($author->preferred_language) if $author && $author->preferred_language; if ($author && $author->email) { my %head = ( To => $author->email, From => $comment->email || $author->email, Subject => '[' . $blog->name . '] ' . $entry->title . &conv_euc2icode(' への新しいコメント from MT4i') ); my $charset; # MT3.3以降で動作を変える if ($mt->version_number() >= 3.3) { $charset = $mt->{cfg}->MailEncoding || $mt->{cfg}->PublishCharset; } else { $charset = $mt->{cfg}->PublishCharset || 'iso-8859-1'; } $head{'Content-Type'} = qq(text/plain; charset="$charset"); my $body = &conv_euc2icode('新しいコメントがウェブログ ') . $blog->name . ' ' . &conv_euc2icode('のエントリー #') . $entry->id . " (" . $entry->title . &conv_euc2icode(') にありました'); # 元記事へのリンク作成 my $link_url = $entry->permalink; use Text::Wrap; $Text::Wrap::cols = 72; $body = Text::Wrap::wrap('', '', $body) . "\n$link_url\n\n" . $body = $body . "\n$link_url\n\n" . &conv_euc2icode('IPアドレス:') . ' ' . $comment->ip . "\n" . &conv_euc2icode('名前:') . ' ' . $comment->author . "\n" . &conv_euc2icode('メールアドレス:') . ' ' . $comment->email . "\n" . &conv_euc2icode('URL:') . ' ' . $comment->url . "\n\n" . &conv_euc2icode('コメント:') . "\n\n" . $comment->text . "\n\n" . &conv_euc2icode("-- \nfrom MT4i v$version\n"); MT::Mail->send(\%head, $body); } } #################### # リビルド # Indexテンプレート if ($cfg{RIT_ID} eq 'ALL') { $mt->rebuild_indexes( BlogID => $cfg{Blog_ID} ) or die $mt->errstr; } else { my @tmp_RIT_ID = split(",", $cfg{RIT_ID}); foreach my $indx_tmpl_id (@tmp_RIT_ID) { require MT::Template; my $tmpl_saved = MT::Template->load($indx_tmpl_id); $mt->rebuild_indexes( BlogID => $cfg{Blog_ID}, Template => $tmpl_saved, Force => 1 ) or die $mt->errstr; } } # Archiveテンプレート if ($cfg{RAT_ID} eq 'ALL') { $mt->rebuild_entry( Entry => $entry ) or die $mt->errstr; } else { my @tmp_RAT_ID = split(",", $cfg{RAT_ID}); foreach my $arc_tmpl_id (@tmp_RAT_ID) { $mt->_rebuild_entry_archive_type( Entry => $entry, Blog => $blog, ArchiveType => $arc_tmpl_id ) or die $mt->errstr; } } }); } else { # メール送信 if ($blog->email_new_comments) { require MT::Mail; my $author = $entry->author; $mt->set_language($author->preferred_language) if $author && $author->preferred_language; if ($author && $author->email) { my %head = ( To => $author->email, From => $comment->email || $author->email, Subject => '[' . $blog->name . '] ' . $entry->title . &conv_euc2icode(' への新しいコメント from MT4i') ); my $charset = $mt->{cfg}->PublishCharset || 'iso-8859-1'; $head{'Content-Type'} = qq(text/plain; charset="$charset"); my $body = &conv_euc2icode('新しいコメントがウェブログ ') . $blog->name . ' ' . &conv_euc2icode('のエントリー #') . $entry->id . " (" . $entry->title . &conv_euc2icode(') にありました'); # 元記事へのリンク作成 my $link_url = $entry->permalink; use Text::Wrap; $Text::Wrap::cols = 72; $body = Text::Wrap::wrap('', '', $body) . "\n$link_url\n\n" . $body = $body . "\n$link_url\n\n" . &conv_euc2icode('IPアドレス:') . ' ' . $comment->ip . "\n" . &conv_euc2icode('名前:') . ' ' . $comment->author . "\n" . &conv_euc2icode('メールアドレス:') . ' ' . $comment->email . "\n" . &conv_euc2icode('URL:') . ' ' . $comment->url . "\n\n" . &conv_euc2icode('コメント:') . "\n\n" . $comment->text . "\n\n" . &conv_euc2icode("-- \nfrom MT4i v$version\n"); MT::Mail->send(\%head, $body); } } #################### # リビルド # Indexテンプレート if ($cfg{RIT_ID} eq 'ALL') { $mt->rebuild_indexes( BlogID => $cfg{Blog_ID} ) or die $mt->errstr; } else { my @tmp_RIT_ID = split(",", $cfg{RIT_ID}); foreach my $indx_tmpl_id (@tmp_RIT_ID) { require MT::Template; my $tmpl_saved = MT::Template->load($indx_tmpl_id); $mt->rebuild_indexes( BlogID => $cfg{Blog_ID}, Template => $tmpl_saved, Force => 1 ) or die $mt->errstr; } } # Archiveテンプレート if ($cfg{RAT_ID} eq 'ALL') { $mt->rebuild_entry( Entry => $entry ) or die $mt->errstr; } else { my @tmp_RAT_ID = split(",", $cfg{RAT_ID}); foreach my $arc_tmpl_id (@tmp_RAT_ID) { $mt->_rebuild_entry_archive_type( Entry => $entry, Blog => $blog, ArchiveType => $arc_tmpl_id ) or die $mt->errstr; } } } # 画面表示 if ($mt->version_number() >= 3.0 && $cfg{ApproveComment} eq 'no') { $data = "コメントが投稿されましたが、掲載は保留されています。
                          管理人による承諾後、掲載されます。
                          "; } else { $data = "コメントが投稿されました
                          "; } my $href; if ($mode eq 'post') { $href = &make_href("comment", $rowid, 0, $eid, 0); } elsif ($mode eq 'post_rcm') { $href = &make_href("comment_rcm", $rowid, 0, $eid, 0); } elsif ($mode eq 'post_lnk') { $href = &make_href("comment_lnk", $rowid, 0, $eid, 0); } $data .="$nostr[0]戻る"; &htmlout; } ######################################## # Sub entryform - 新規Entry/Entry編集 フォーム ######################################## sub entryform { my ($org_title,$org_text,$org_text_more,$org_excerpt,$org_keywords,$org_tags,$org_convert_breaks,$org_created_on,$org_comment_cnt,$org_ent_status,$org_ent_allow_comments,$org_ent_allow_pings); my $rowid = $no; if ($eid == 0){ $data = "

                          新規Entryの作成


                          "; # 現在日時の取得 $ENV{TZ} = 'JST-9'; my $time = time; my ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($time); $mon++; $year = 1900+$year; $mon = sprintf("%.2d",$mon); $mday = sprintf("%.2d",$mday); $hour = sprintf("%.2d",$hour); $sec = sprintf("%.2d",$sec); $min = sprintf("%.2d",$min); $org_created_on = "$year-$mon-$mday $hour:$min:$sec"; }else{ $data = "

                          Entryの編集


                          "; # Entry検索 require MT::Entry; my $entry = MT::Entry->load($eid); # 検索結果が0件の場合はメッセージ表示してSTOP(有り得ないけどな) if (!$entry) { $data = 'Entry ID \''.encode_entities($eid).'\' は不正です。'; &errorout; exit; # exitする } # 編集なので、過去のデータを得る $org_title = &conv_euc_z2h($entry->title); $org_text = &conv_euc_z2h($entry->text); $org_text_more = &conv_euc_z2h($entry->text_more); $org_excerpt = &conv_euc_z2h($entry->excerpt); $org_keywords = &conv_euc_z2h($entry->keywords); if ($mt->version_number() >= 3.3) { require MT::Author; # AuthorNameをPublishCharsetに変換 if ($conv_in ne 'euc') { if ($conv_in eq 'utf8' && $ecd == 1) { $cfg{AuthorName} = encode("shiftjis",decode("euc-jp",$cfg{AuthorName})); $cfg{AuthorName} = encode("utf8",decode("cp932",$cfg{AuthorName})); } else { $cfg{AuthorName} = Jcode->new($cfg{AuthorName}, 'euc')->$conv_in(); } } my $author = MT::Author->load({ name => $cfg{AuthorName} }); my $tag_delim = chr($author->entry_prefs->{tag_delim}); require MT::Tag; my $tags = MT::Tag->join($tag_delim, $entry->tags); $org_tags = &conv_euc_z2h($tags); } $org_convert_breaks = $entry->convert_breaks; $org_created_on = $entry->created_on; $org_created_on =~ s/(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/$1-$2-$3 $4:$5:$6/; $org_comment_cnt = $entry->comment_count; $org_ent_status = $entry->status; $org_ent_allow_comments = $entry->allow_comments; $org_ent_allow_pings = $entry->allow_pings; # タイトルをエンコード $org_title =~ s/&/&/g; $org_title =~ s/ / /g; $org_title =~ s/\/>/g; # 本文をエンコード $org_text =~ s/&/&/g; $org_text =~ s/ / /g; $org_text =~ s/\/>/g; # 追記をエンコード $org_text_more =~ s/&/&/g; $org_text_more =~ s/ / /g; $org_text_more =~ s/\/>/g; # 概要をエンコード $org_excerpt =~ s/&/&/g; $org_excerpt =~ s/ / /g; $org_excerpt =~ s/\/>/g; # キーワードをエンコード $org_keywords =~ s/&/&/g; $org_keywords =~ s/ / /g; $org_keywords =~ s/\/>/g; # タグをエンコード $org_tags =~ s/&/&/g; $org_tags =~ s/ / /g; $org_tags =~ s/\/>/g; } #################### # 表示文字列生成 my $href = &make_href("post", 0, 0, $eid, 0); $data .= "
                          "; # カテゴリセレクタ my $cat_label; if ($eid){ $cat_label = &check_category(MT::Entry->load($eid)); } $data .= "カテゴリ
                          "; $data .= "
                          "; $data .= "タイトル"; $data .= "

                          "; $data .= "Entryの内容"; $data .= "

                          "; $data .= "Extended(追記)"; $data .= "

                          "; $data .= "Excerpt(概要)"; $data .= "

                          "; $data .= "キーワード"; $data .= "

                          "; if ($mt->version_number() >= 3.3) { $data .= "タグ(カンマで区切る)"; $data .= "

                          "; } $data .= "投稿の状態
                          "; $data .= "
                          "; $data .= ""; $data .= "コメント
                          "; $data .= "
                          "; $data .= "トラックバックを受けつける
                          "; if (($eid && $org_ent_allow_pings) || (!$eid && $blog->allow_pings_default == 1)) { $data .= "
                          "; }else{ $data .= "
                          "; } ## テキストフォーマットのロード my $filters = $mt->all_text_filters; my $text_filters = []; for my $filter (keys %$filters) { push @{ $text_filters }, { filter_key => $filter, filter_label => $filters->{$filter}{label}, }; } # ソート $text_filters = [ sort { $a->{filter_key} cmp $b->{filter_key} } @{ $text_filters } ]; # 「なし」を追加 unshift @{ $text_filters }, { filter_key => '0', filter_label => 'なし', }; # 描画 $data .= "テキストフォーマット
                          "; $data .= '
                          '; $data .= "作成日時
                          "; $data .= "
                          "; $data .= ""; $data .= ""; $data .= ""; $data .= ""; if ($key){ $data .= ""; } $data .= ""; $data .= "
                          "; $data .= "
                          "; $href = &make_href("", 0, 0, 0, 0); $data .= "$nostr[0]一覧へ戻る"; &htmlout; } ######################################## # Sub Entry - 新規Entry投稿->表示処理 ######################################## sub entry { my $rowid = $no; $no--; # 投稿内容を一旦EUC-JPに変換 if ($ecd == 1) { $entry_title = encode("euc-jp",decode("shiftjis",$entry_title)); $entry_text = encode("euc-jp",decode("shiftjis",$entry_text)); $entry_text_more = encode("euc-jp",decode("shiftjis",$entry_text_more)); $entry_excerpt = encode("euc-jp",decode("shiftjis",$entry_excerpt)); $entry_keywords = encode("euc-jp",decode("shiftjis",$entry_keywords)); $entry_tags = encode("euc-jp",decode("shiftjis",$entry_tags)); } else { $entry_title = Jcode->new($entry_title, 'sjis')->euc; $entry_text = Jcode->new($entry_text, 'sjis')->euc; $entry_text_more = Jcode->new($entry_text_more, 'sjis')->euc; $entry_excerpt = Jcode->new($entry_excerpt, 'sjis')->euc; $entry_keywords = Jcode->new($entry_keywords, 'sjis')->euc; $entry_tags = Jcode->new($entry_tags, 'sjis')->euc; } # 半角スペース' 'をデコード $entry_title =~ s/ / /g; $entry_text =~ s/ / /g; $entry_text_more =~ s/ / /g; $entry_excerpt =~ s/ / /g; $entry_keywords =~ s/ / /g; $entry_tags =~ s/ / /g; #################### # 必須入力項目をチェック # タイトル、テキストのどちらかの入力が無ければエラー if((!$entry_title)||(!$entry_text)) { $data .="Error!
                          未入力項目があります。「タイトル」と「Entryの内容」は必須です。
                          "; my $href = &make_href("entryform", 0, 0, $eid, 0); $data .="$nostr[0]戻る"; &errorout; return; } # 作成日時の入力が無ければエラー if (!$entry_created_on) { $data .="Error!
                          未入力項目があります。「作成日時」は必須です。
                          "; my $href = &make_href("entryform", 0, 0, $eid, 0); $data .="$nostr[0]戻る"; &errorout; return; } require MT::Author; # AuthorNameをPublishCharsetに変換 if ($conv_in ne 'euc') { if ($conv_in eq 'utf8' && $ecd == 1) { $cfg{AuthorName} = encode("shiftjis",decode("euc-jp",$cfg{AuthorName})); $cfg{AuthorName} = encode("utf8",decode("cp932",$cfg{AuthorName})); } else { $cfg{AuthorName} = Jcode->new($cfg{AuthorName}, 'euc')->$conv_in(); } } if (!$cfg{AuthorName}) { $data = 'MT4i Manager にて Author名(AuthorName)が設定されていません。'; &errorout; exit; # exitする } my $author = MT::Author->load({ name => $cfg{AuthorName} }); if (!$author) { # AuthorNameをEUC-JPに戻す if ($conv_in eq 'utf8' && $ecd == 1) { $cfg{AuthorName} = encode("cp932",decode("utf8",$cfg{AuthorName})); $cfg{AuthorName} = encode("euc-jp",decode("shiftjis",$cfg{AuthorName})); } else { $cfg{AuthorName} = Jcode->new($cfg{AuthorName}, $conv_in)->euc; } $data = "\"$cfg{AuthorName}\"がAuthorとして登録されていません。
                          "; &errorout; exit; # exitする } # 投稿された文字列の半角カナを全角に変換 if ($ecd == 1) { Encode::JP::H2Z::h2z(\$entry_title); Encode::JP::H2Z::h2z(\$entry_text); Encode::JP::H2Z::h2z(\$entry_text_more); Encode::JP::H2Z::h2z(\$entry_excerpt); Encode::JP::H2Z::h2z(\$entry_keywords); Encode::JP::H2Z::h2z(\$entry_tags); } else { Jcode->new(\$entry_title, 'euc')->h2z; Jcode->new(\$entry_text, 'euc')->h2z; Jcode->new(\$entry_text_more, 'euc')->h2z; Jcode->new(\$entry_excerpt, 'euc')->h2z; Jcode->new(\$entry_keywords, 'euc')->h2z; Jcode->new(\$entry_tags, 'euc')->h2z; } # PublishCharsetに変換 if ($conv_in ne 'euc') { if ($conv_in eq 'utf8' && $ecd == 1) { $entry_title = encode("shiftjis",decode("euc-jp",$entry_title)); $entry_text = encode("shiftjis",decode("euc-jp",$entry_text)); $entry_text_more = encode("shiftjis",decode("euc-jp",$entry_text_more)); $entry_excerpt = encode("shiftjis",decode("euc-jp",$entry_excerpt)); $entry_keywords = encode("shiftjis",decode("euc-jp",$entry_keywords)); $entry_tags = encode("shiftjis",decode("euc-jp",$entry_tags)); $entry_title = encode("utf8",decode("cp932",$entry_title)); $entry_text = encode("utf8",decode("cp932",$entry_text)); $entry_text_more = encode("utf8",decode("cp932",$entry_text_more)); $entry_excerpt = encode("utf8",decode("cp932",$entry_excerpt)); $entry_keywords = encode("utf8",decode("cp932",$entry_keywords)); $entry_tags = encode("utf8",decode("cp932",$entry_tags)); } else { $entry_title = Jcode->new($entry_title, 'euc')->$conv_in(); $entry_text = Jcode->new($entry_text, 'euc')->$conv_in(); $entry_text_more = Jcode->new($entry_text_more, 'euc')->$conv_in(); $entry_excerpt = Jcode->new($entry_excerpt, 'euc')->$conv_in(); $entry_keywords = Jcode->new($entry_keywords, 'euc')->$conv_in(); $entry_tags = Jcode->new($entry_tags, 'euc')->$conv_in(); } } require MT::Entry; my $entry; if ($eid){ $entry = MT::Entry->load($eid); }else{ $entry = MT::Entry->new; } $entry->blog_id($blog->id); $entry->status($post_status); $entry->author_id($author->id); $entry->title($entry_title); $entry->text($entry_text); $entry->text_more($entry_text_more); $entry->excerpt($entry_excerpt); $entry->keywords($entry_keywords); if ($mt->version_number() >= 3.3) { my $tag_delim = chr($author->entry_prefs->{tag_delim}); require MT::Tag; my @tags = MT::Tag->split($tag_delim, $entry_tags); $entry->add_tags(@tags); } if ($allow_pings == 1){ $entry->allow_pings(1); }else{ $entry->allow_pings(0); } $entry->allow_comments($allow_comments); $entry->convert_breaks($text_format); $entry_created_on =~ s/(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)/$1$2$3$4$5$6/; $entry->created_on($entry_created_on); $entry->save or die $entry->errstr; if ($entry_cat) { require MT::Placement; my $place = MT::Placement->load({ blog_id => $cfg{Blog_ID} , entry_id => $entry->id }); if (!$place){ $place = MT::Placement->new; } $place->entry_id($entry->id); $place->blog_id($cfg{Blog_ID}); $place->category_id($entry_cat); $place->is_primary(1); $place->save or die $place->errstr; } if ($eid){ $data = "Entryは修正されました
                          "; }else{ $data = "新規Entryが作成されました
                          "; } #################### # 保存のステータスがリリースか、あるいは編集前のステータスがリリースの場合のみ # エントリー及びインデックスのリビルドを行い、ピングを送信する。 if ($post_status == MT::Entry::RELEASE() || $post_status_old eq MT::Entry::RELEASE()) { # MT3.0以上では、リビルド及び更新ping送信をバックグラウンドで行う if ($mt->version_number() >= 3.0) { require MT::Util; MT::Util::start_background_task(sub { # リビルド $mt->rebuild_entry( Entry => $entry, BuildDependencies => 1 ) or die $mt->errstr; #################### # 更新ping送信 # 保存のステータスがリリースの場合のみping送信 if ($post_status == MT::Entry::RELEASE() || $post_status_old eq MT::Entry::RELEASE()) { require MT::XMLRPC; if ($blog->ping_others){ my (@updateping_urls) = split(/\n/,$blog->ping_others); for my $url (@updateping_urls) { MT::XMLRPC->ping_update('weblogUpdates.ping', $blog, $url) or die MT::XMLRPC->errstr; } } } }); } else { # リビルド $mt->rebuild_entry( Entry => $entry, BuildDependencies => 1 ) or die $mt->errstr; #################### # 更新ping送信 # 保存のステータスがリリースの場合のみping送信 if ($post_status == MT::Entry::RELEASE()){ require MT::XMLRPC; if ($blog->ping_others){ my (@updateping_urls) = split(/\n/,$blog->ping_others); for my $url (@updateping_urls) { MT::XMLRPC->ping_update('weblogUpdates.ping', $blog, $url) or die MT::XMLRPC->errstr; } } } } } my $href = &make_href("", 0, 0, 0, 0); $data .= "$nostr[0]一覧へ戻る"; &htmlout; } ######################################## # Sub Entry_del - Entry削除 ######################################## sub entry_del { my $rowid = $no; $no--; require MT::Entry; my $entry = MT::Entry->load($eid); if (!$entry) { $data = 'entry_del::Entry ID \''.encode_entities($eid).'\' は不正です。'; &errorout; exit; # exitする } $entry->remove; #################### # MT3.0以上では、リビルドをバックグラウンドで行う if ($mt->version_number() >= 3.0) { require MT::Util; MT::Util::start_background_task(sub { # リビルド #$mt->rebuild_indexes( Blog => $blog ) # or die $mt->errstr; $mt->rebuild_entry( Entry => $entry, BuildDependencies => 1 ) or die $mt->errstr; }); } else { # リビルド #$mt->rebuild_indexes( Blog => $blog ) # or die $mt->errstr; $mt->rebuild_entry( Entry => $entry, BuildDependencies => 1 ) or die $mt->errstr; } $data = "Entryが削除されました
                          "; my $href = &make_href("", 0, 0, 0, 0); $data .= "$nostr[0]一覧へ戻る"; &htmlout; } ######################################## # Sub Comment_del - コメント削除 ######################################## sub comment_del { my $rowid = $no; $no--; #################### # commentを探す require MT::Comment; my $comment = MT::Comment->load($page); # コメント番号は$pageで渡す if (!$comment) { $data = "comment_del::Comment ID '".encode_entities($page)."' は不正です。"; &errorout; exit; # exitする } $comment->remove() or die $comment->errstr; #このcommentが属するEntryを探す require MT::Entry; my $entry = MT::Entry->load($comment->entry_id); if (!$entry) { $data = "comment_del::Entry ID '".$comment->entry_id."' は不正です。"; &errorout; exit; # exitする } #################### # MT3.0以上では、リビルドをバックグラウンドで行う if ($mt->version_number() >= 3.0) { require MT::Util; MT::Util::start_background_task(sub { # リビルド #$mt->rebuild_indexes( Blog => $blog ) # or die $mt->errstr; $mt->rebuild_entry( Entry => $entry, BuildDependencies => 1 ) or die $mt->errstr; }); } else { # リビルド #$mt->rebuild_indexes( Blog => $blog ) # or die $mt->errstr; $mt->rebuild_entry( Entry => $entry, BuildDependencies => 1 ) or die $mt->errstr; } $data = "コメントが削除されました
                          "; my $href = &make_href("comment", $rowid, 0, $eid, 0); $data .= "$nostr[0]コメント一覧へ戻る"; &htmlout; } ######################################## # Sub Trackback_del - トラックバック削除 ######################################## sub trackback_del { my $rowid = $no; $no--; #################### # pingを探す require MT::TBPing; my $tbping = MT::TBPing->load($page); # トラックバック番号は$pageで渡す if (!$tbping) { $data = "trackback_del::MTPing ID '".encode_entities($page)."' は不正です。"; &errorout; exit; # exitする } $tbping->remove() or die $tbping->errstr; #このtbpingが属するTrackbackを探す require MT::Trackback; my $trackback = MT::Trackback->load($tbping->tb_id); if (!$trackback) { $data = "trackback_del::Trackback ID '".$tbping->tb_id."' は不正です。"; &errorout; exit; # exitする } #このTrackbackが属するEntryを探す require MT::Entry; my $entry = MT::Entry->load($trackback->entry_id); if (!$entry) { $data = "trackback_del::Entry ID '".$trackback->entry_id."' は不正です。"; &errorout; exit; # exitする } #################### # MT3.0以上では、リビルドをバックグラウンドで行う if ($mt->version_number() >= 3.0) { require MT::Util; MT::Util::start_background_task(sub { # リビルド #$mt->rebuild_indexes( Blog => $blog ) # or die $mt->errstr; $mt->rebuild_entry( Entry => $entry, BuildDependencies => 1 ) or die $mt->errstr; }); } else { # リビルド #$mt->rebuild_indexes( Blog => $blog ) # or die $mt->errstr; $mt->rebuild_entry( Entry => $entry, BuildDependencies => 1 ) or die $mt->errstr; } $data = "トラックバックが削除されました
                          "; my $href = &make_href("trackback", $rowid, 0, $eid, 0); $data .= "$nostr[0]トラックバック一覧へ戻る"; &htmlout; } ######################################## # Sub Trackback_ipban - このIPからのトラックバックを禁止&全削除 ######################################## sub trackback_ipban { my $rowid = $no; $no--; #################### # pingを探す require MT::TBPing; my $tbping = MT::TBPing->load($page); # トラックバック番号は$pageで渡す if (!$tbping) { $data = "trackback_ipban::MTPing ID '".encode_entities($page)."' は不正です。"; &errorout; exit; # exitする } require MT::IPBanList; my $ban = MT::IPBanList->new; $ban->blog_id($blog->id); $ban->ip($tbping->ip); $ban->save or die $ban->errstr; #################### # そのIPから送信されたトラックバックを全て探す my @tbpings = MT::TBPing->load( { blog_id => $cfg{Blog_ID}, ip => $tbping->ip}); for my $tbping (@tbpings) { #このtbpingが属するTrackbackを探す require MT::Trackback; my $trackback = MT::Trackback->load($tbping->tb_id); if (!$trackback) { $data = "trackback_ipban::Trackback ID '".$tbping->tb_id."' は不正です。"; &errorout; exit; # exitする } #このTrackbackが属するEntryを探す require MT::Entry; my $entry = MT::Entry->load($trackback->entry_id); if (!$entry) { $data = "trackback_ipban::Entry ID '".$trackback->entry_id."' は不正です。"; &errorout; exit; # exitする } $data .= &conv_euc_z2h($tbping->excerpt)."
                          "; # トラックバックping削除 $tbping->remove() or die $tbping->errstr; #################### # MT3.0以上では、リビルドをバックグラウンドで行う if ($mt->version_number() >= 3.0) { require MT::Util; MT::Util::start_background_task(sub { # entryのリビルド $mt->rebuild_entry( Entry => $entry, BuildDependencies => 1 ) or die $mt->errstr; }); } else { # entryのリビルド $mt->rebuild_entry( Entry => $entry, BuildDependencies => 1 ) or die $mt->errstr; } } $data = "IPを禁止リストに追加し、".@tbpings."件のトラックバックを削除しました。
                          "; my $href = &make_href("trackback", $rowid, 0, $eid ,0); $data .= "$nostr[0]トラックバック一覧へ戻る"; &htmlout; #################### # MT3.0以上では、リビルドをバックグラウンドで行う if ($mt->version_number() >= 3.0) { require MT::Util; MT::Util::start_background_task(sub { # indexのリビルド $mt->rebuild_indexes( Blog => $blog ) or die $mt->errstr; }); } else { # indexのリビルド $mt->rebuild_indexes( Blog => $blog ) or die $mt->errstr; } } ######################################## # Sub Comment_ipban - このIPからのコメントを禁止&全削除 ######################################## sub comment_ipban { my $rowid = $no; $no--; #################### # commentを探す require MT::Comment; my $comment = MT::Comment->load($page); # コメント番号は$pageで渡す if (!$comment) { $data = "comment_ipban::Comment ID '".encode_entities($page)."' は不正です。"; &errorout; exit; # exitする } require MT::IPBanList; my $ban = MT::IPBanList->new; $ban->blog_id($blog->id); $ban->ip($comment->ip); $ban->save or die $ban->errstr; #################### # そのIPから送信されたコメントを全て探す my @comments = MT::Comment->load( { blog_id => $cfg{Blog_ID}, ip => $comment->ip}); for my $comment (@comments) { require MT::Entry; my $entry = MT::Entry->load($comment->entry_id); if (!$entry) { $data = "comment_ipban::Entry ID '".$comment->entry_id."' は不正です。"; &errorout; exit; # exitする } # コメント削除 $comment->remove() or die $comment->errstr; #################### # MT3.0以上では、リビルドをバックグラウンドで行う if ($mt->version_number() >= 3.0) { require MT::Util; MT::Util::start_background_task(sub { # entryのリビルド $mt->rebuild_entry( Entry => $entry,, BuildDependencies => 1 ) or die $mt->errstr; }); } else { # entryのリビルド $mt->rebuild_entry( Entry => $entry, BuildDependencies => 1 ) or die $mt->errstr; } } $data = "IPを禁止リストに追加し、".@comments."件のコメントを削除しました。
                          "; my $href = &make_href("comment", $rowid, 0, $eid, 0); $data .= "$nostr[0]コメント一覧へ戻る"; &htmlout; #################### # MT3.0以上では、リビルドをバックグラウンドで行う if ($mt->version_number() >= 3.0) { require MT::Util; MT::Util::start_background_task(sub { # indexのリビルド $mt->rebuild_indexes( Blog => $blog ) or die $mt->errstr; }); } else { # indexのリビルド $mt->rebuild_indexes( Blog => $blog ) or die $mt->errstr; } } ######################################## # Sub Email_comments - コメントのメール通知制御 ######################################## sub email_comments { if ($email_new_comments){ $blog->email_new_comments(0); }else{ $blog->email_new_comments(1); } $blog->save or die $blog->errstr; if ($email_new_comments){ $data = "コメントのメール通知を停止しました。
                          "; }else{ $data = "コメントのメール通知を再開しました。
                          "; } my $href = &make_href("", 0, $page, 0, 0); $data .= "$nostr[0]一覧へ戻る"; &htmlout; } ######################################## # Sub Confirm - 各種確認 ######################################## sub confirm { my $rowid = $no; # コメントIDは$pageで受け渡し if ($mode eq "confirm_comment_del"){ require MT::Comment; my $comment = MT::Comment->load($page); # コメント番号は$pageで渡す if (!$comment) { $data = "confirm_comment_del::Comment ID '".encode_entities($page)."' は不正です。"; &errorout; exit; # exitする } $data .="本当に以下のコメントを削除してよろしいですか?
                          "; $data .= "
                          "; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= "
                          "; $data .= "
                          "; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= "
                          "; $data .= "
                          "; $data .= "Author:".&conv_euc_z2h($comment->author)."
                          "; $data .= "Text:".&conv_euc_z2h($comment->text)."
                          "; } elsif ($mode eq "confirm_entry_del"){ require MT::Entry; my $entry = MT::Entry->load($eid); if (!$entry) { $data = "confirm_entry_del::Entry ID '".encode_entities($eid)."' は不正です。"; &errorout; exit; # exitする } require MT::Author; my $author = MT::Author->load({ id => $entry->author_id }); my $author_name = ""; if ($author) { $author_name = &conv_euc_z2h($author->name); } $data .="本当に以下のEntryを削除してよろしいですか?
                          "; $data .= "
                          "; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= "
                          "; $data .= "
                          "; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= "
                          "; $data .= "
                          "; if ($author_name){ $data .= "Author:".$author_name."
                          "; } $data .= "Text:".&conv_euc_z2h($entry->text)."
                          "; } elsif ($mode eq "confirm_trackback_del"){ require MT::TBPing; my $tbping = MT::TBPing->load($page); # トラックバック番号は$pageで渡す if (!$tbping) { $data = "confirm_trackback_del::MTPing ID '".encode_entities($page)."' は不正です。"; &errorout; exit; # exitする } $data .="本当に以下のTBを削除してよろしいですか?
                          "; $data .= "
                          "; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= "
                          "; $data .= "
                          "; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= ""; $data .= "
                          "; $data .= "
                          "; $data .= "BlogName:".&conv_euc_z2h($tbping->blog_name)."
                          "; $data .= "Title:".&conv_euc_z2h($tbping->title)."
                          "; $data .= "Excerpt:".&conv_euc_z2h($tbping->excerpt)."
                          "; } else { $data .="confirm::mode '".$mode."' は不正です。
                          "; } &htmlout; } ######################################## # Sub Admindoor - 管理者用URLを表示 ######################################## sub admindoor { my $href; if ($pw_text eq $cfg{AdminPassword}){ $data .= '管理者用URLは'; $href = &make_href("", 0, 0, 0, 0); $href .= '&key='.MT4i::Func::enc_crypt($cfg{AdminPassword}.$cfg{Blog_ID}); $data .= "こちら"; $data .= 'です。リンク先をブックマークした後、速やかに「mt4i Manager」にて"AdminDoor"の値を"no"に変更してください。
                          '; }else{ $data .= "パスワードが違います
                          "; } $key = ""; $href = &make_href("", 0, 0, 0, 0); $data .= "$nostr[0]戻る"; &htmlout; } ######################################## # Sub Separate - 単記事・コメント本文の分割 ######################################## sub separate { my $text = $_[0]; my $rowid = $_[1]; # 区切り文字列を配列に格納しておく my @sprtstrlist = split(",",$cfg{SprtStr}); # 本文のバイト数を求めておく my $maxlen = MT4i::Func::lenb_euc($text); # 初回に分割位置を決め、$sprtbyteへ格納 if (!$sprtbyte) { $sprtpage = 1; my $i = 0; $sprtbyte = "0"; while ($i < $maxlen - $cfg{SprtLimit}) { my $tmpstart = $i; my $tmpend; if ($tmpstart + $cfg{SprtLimit} > $maxlen) { $tmpend = $maxlen - $tmpstart; } else { $tmpend = $cfg{SprtLimit}; } # 区切り文字列の検出 my $sprtstart; my $tmptext = MT4i::Func::midb_euc($text, $tmpstart, $tmpend); foreach my $tmpsprtstr (@sprtstrlist) { if ($tmptext =~ /(.*)$tmpsprtstr/s) { $tmptext = $1; $sprtstart = MT4i::Func::lenb_euc($tmptext) + MT4i::Func::lenb_euc($tmpsprtstr); last; } } if (!$sprtstart) { $sprtstart = $maxlen; } $sprtstart = $sprtstart + $tmpstart; # 分割位置を$sprtbyteに格納 if ($sprtstart < $maxlen) { $sprtbyte .= ",$sprtstart"; } $i = $sprtstart + 1; } } # $sprtbyteを読み取る my @argsprtbyte = split(/,/, $sprtbyte); my $sprtstart = $argsprtbyte[$sprtpage - 1]; my $sprtend; if ($sprtpage - 1 < $#argsprtbyte) { $sprtend = $argsprtbyte[$sprtpage] - $sprtstart; } else { $sprtend = $maxlen - $sprtstart; } #################### # 本文文字列生成 my $tmptext = ""; my $href = &make_href($mode, $rowid, 0, $eid, 0); # まずは記事本文切抜き my $text = MT4i::Func::midb_euc($text, $sprtstart, $sprtend); ##### 足りないタグを補ってみる ##### my $cnt_tag_o; my $cnt_tag_c; # ULタグ $cnt_tag_o = ($text =~ s! $cnt_tag_c) { for (my $i = 0; $i < $cnt_tag_o - $cnt_tag_c; $i++) { $text .= '

            '; } } # OLタグ $cnt_tag_o = ($text =~ s! $cnt_tag_c) { for (my $i = 0; $i < $cnt_tag_o - $cnt_tag_c; $i++) { $text .= ''; } } # BLOCKQUOTEタグ $cnt_tag_o = ($text =~ s! $cnt_tag_c) { for (my $i = 0; $i < $cnt_tag_o - $cnt_tag_c; $i++) { $text .= '
'; } } # FONTタグ $cnt_tag_o = ($text =~ s! $cnt_tag_c) { for (my $i = 0; $i < $cnt_tag_o - $cnt_tag_c; $i++) { $text .= '
'; } } # ページリンク(上) $tmptext .= "< ページ移動:"; for (my $i = 1; $i <= $#argsprtbyte + 1; $i++) { if ($i == $sprtpage) { $tmptext .= " $i"; } else { $tmptext .= " $i"; } } $tmptext .= " >
"; # 記事本文 $tmptext .= $text; # ページリンク(下) $tmptext .= "
< ページ移動:"; for (my $i = 1; $i <= $#argsprtbyte + 1; $i++) { if ($i == $sprtpage) { $tmptext .= " $i"; } else { $tmptext .= " $i"; } } $tmptext .= " >"; return $tmptext; } ######################################## # Sub Conv_euc_z2h - →EUC-JP/全角→半角変換 ######################################## sub conv_euc_z2h { my $tmpstr = $_[0]; # 第一引数をEUC-JPに変換 if ($conv_in ne "euc") { if ($conv_in eq "utf8" && $ecd == 1) { $tmpstr = encode("cp932",decode("utf8",$tmpstr)); $tmpstr = encode("euc-jp",decode("shiftjis",$tmpstr)); } else { $tmpstr = Jcode->new($tmpstr, $conv_in)->euc; } } # 表示文字列の全角文字を半角に変換 if ($cfg{Z2H} eq "yes") { if ($ecd == 1) { Encode::JP::H2Z::z2h(\$tmpstr); $tmpstr = Jcode->new($tmpstr,'euc')->tr('A-Za-z0-9/!?()=&', 'A-Za-z0-9/!?()=&'); } else { $tmpstr = Jcode->new($tmpstr,'euc')->z2h->tr('A-Za-z0-9/!?()=&', 'A-Za-z0-9/!?()=&'); } } return $tmpstr; } ######################################## # Sub Img_Url_Conv - 画像URLのスラッシュを%2Fに変換 ######################################## sub img_url_conv { my $tmpstr = $_[0]; my $str = ""; # ループしながらタグ内URLの置換 while ($tmpstr =~ /(]|"[^"]*"|'[^']*')*src=)("[^"]*"|'[^']*')((?:[^"'>]|"[^"]*"|'[^']*')*>)/i) { my $front = $` . $1; my $url = $2; my $end = $3 . $'; # ダブル・シングルクォーテーションを取り除く $url =~ s/["']//g; # "/"→"%2F" $url =~ s/\//\%2F/g; # ダブルクォーテーションを補いつつ結合 $str .= "$front\"" . $url; $tmpstr = "\"$end"; } $str .= $tmpstr; return $str; } ######################################## # Sub Conv_Redirect - リンクのURLをリダイレクタ経由に変換 ######################################## sub conv_redirect { my $tmpstr = $_[0]; my $ref_rowid = $_[1]; my $ref_eid = $_[2]; my $str = ""; # ループしながらURLの置換 while ($tmpstr =~ /(]|"[^"]*"|'[^']*')*href=)("[^"]*"|'[^']*')((?:[^"'>]|"[^"]*"|'[^']*')*>)/i) { my $front = $` . $1; my $url = $2; my $end = $3; my $backward = $'; my $tmpfront = $1; my $tmpend = $3; my $lnkstr = ""; my $title; # title属性を取り出す if ($tmpfront =~ /title=/i) { my $tmpstr = $tmpfront; $tmpstr =~ s/.*]|"[^"]*"|'[^']*')*title=("[^"]*"|'[^']*')(?:[^"'>]|"[^"]*"|'[^']*')*\Z/$1/i; $title = $tmpstr; } elsif ($tmpend =~ /title=/i) { my $tmpstr = $tmpend; $tmpstr =~ s/\A.*(?:[^"'>]|"[^"]*"|'[^']*')*title=("[^"]*"|'[^']*')(?:[^"'>]|"[^"]*"|'[^']*')*>/$1/i; $title = $tmpstr; } # ダブル・シングルクォーテーションを取り除く $title =~ s/["']//g; $url =~ s/["']//g; if ($title !~ /$cfg{ExitChtmlTrans}/) { my $tmpurl = &make_href("redirect", $ref_rowid, 0, 0, $ref_eid); # "/"→"%2F" $url =~ s!/!\%2F!g; # "&"→"%26" $url =~ s/\&/\%26/g; $url = $tmpurl . '&url=' . $url; } else { # 携帯対応マーク $lnkstr = $ExitChtmlTransStr; } # ダブルクォーテーションを補いつつ結合 $str .= "$front\"" . $url; $tmpstr = "\"$end" . $lnkstr . $backward; } $str .= $tmpstr; # title、target属性の削除(バイト数の無駄) $str =~ s/ target=["'][^"']*["']//ig; $str =~ s/ title=["'][^"']*["']//ig; return $str; } ######################################## # Sub Redirector - リダイレクタ ######################################## sub redirector { # URLを変換 my ($lnkstr,$lnkurl) = &chtmltrans($redirect_url); # モバイル用のURLが見つかったか判定 if ($lnkstr) { # モバイル用URLが見つかった場合 $data .= '

別のサイトへジャンプしようとしています。'; $data .= '携帯電話/モバイル機器用のURLが見つかりました。

'; $data .= "

↓クリック
$lnkstr$lnkurl

"; $data .= '

下記が元のURLになります。'; $data .= '上記で上手く表示できない場合、下記URLをお試し下さい。

'; $data .= "

↓クリック
$redirect_url

"; } else { # モバイル用URLが見つからなかった場合 $data .= '

別のサイトへジャンプしようとしています。

'; $data .= "

↓クリック
$redirect_url

"; $data .= '

上記URLのサイトは携帯電話で正しく表示できないかもしれませんが、'; $data .= '下記URLであれば表示できるかもしれません。

'; $data .= "

↓クリック
$lnkurl

"; } $data .= "
"; my $href = &make_href("individual", $no, 0, $ref_eid, 0); $data .= "$nostr[0]戻る"; $data .= "
"; &htmlout; } ######################################## # Sub Chtmltrans - リンクのURLをchtmltrans経由その他に変換 # 参考:Perlメモ→http://www.din.or.jp/~ohzaki/perl.htm#HTML_Tag ######################################## sub chtmltrans { my $url = $_[0]; my $lnkstr = ""; if ($url =~ m/.*http:\/\/www.amazon.co.jp\/exec\/obidos\/ASIN\/.*/g) { # Amazon個別商品リンクならi-mode対応へ変換 $url =~ s!exec/obidos/ASIN/!gp/aw/rd.html\?a=!g; $url =~ s!ref=nosim/!!g; $url =~ s!ref=nosim!!g; $url =~ s!/$!!g; $url =~ s!/([^/]*-22)!&uid=NULLGWDOCOMO&url=/gp/aw/d.html&lc=msn&at=$1!; $url .= '&dl=1'; $lnkstr = $mt4ilinkstr; } elsif ($url =~ m/.*http:\/\/www.amazlet.com\/browse\/ASIN\/.*/g) { # Amazletへのリンクなら、Amazonのi-mode対応へ変換 $url =~ s!www.amazlet.com/browse/ASIN/!www.amazon.co.jp/gp/aw/rd.html?a=!g; $url =~ s!/ref=nosim/!!g; $url =~ s!/$!!g; $url =~ s!/([^/]*-22)!&uid=NULLGWDOCOMO&url=/gp/aw/d.html&lc=msn&at=$1!; $url .= '&dl=1'; $lnkstr = $mt4ilinkstr; } else { # リンク先を取得 my $mt4ilink = MT4i::Func::get_mt4ilink($url); if ($mt4ilink) { $url = $mt4ilink; $lnkstr = $mt4ilinkstr; } else { # "/"→"@2F"、"?"→"@3F"、"+"→"@2B" $url =~ s/\//\@2F/g; $url =~ s/\?/\@3F/g; $url =~ s/\+/\@2B/g; # URLを生成 my $chtmltransurl = 'http://wmlproxy.google.com/chtmltrans/h=ja/u='; $url = $chtmltransurl . $url . "/c=0"; } } return ($lnkstr,$url); } ######################################## # Sub Htmlout - HTMLの出力 ######################################## sub htmlout { # blog_nameから改行を削除 my $hd_blog_name = $blog_name; $hd_blog_name =~ s!
!!ig; $hd_blog_name =~ s!
!!ig; # HTMLヘッダ/フッタ定義 $data = "$hd_blog_name mobile ver." . $data; if (exists $cfg{AdmNM}) { $data .= "

管理人:"; if (exists $cfg{AdmML}) { $cfg{AdmML} =~ s/\@/\@/g; $cfg{AdmML} =~ s/\./\./g; $data .= "$cfg{AdmNM}"; } else { $data .= "$cfg{AdmNM}"; } $data .= "

"; } $data .= "

Powered by
"; # 管理者モードではMT4i公式ページへのアンカーを表示しない if ($admin_mode eq 'yes') { $data .= "MT4i v$version"; } else { $data .= "MT4i v$version"; } $data .= "

"; # 表示文字列をShift_JISに変換 if ($ecd == 1) { $data = encode("shiftjis",decode("euc-jp",$data)); } else { $data = Jcode->new($data, 'euc')->sjis; } # 表示 binmode(STDOUT); print "Content-type: text/html; charset=Shift_JIS\n"; print "Content-Length: ",length($data),"\n\n"; print $data; } ######################################## # Sub Errorout - エラーの出力 ######################################## sub errorout { # HTMLヘッダ/フッタ定義 $data = "Error" . $data . ""; # 表示文字列をShift_JISに変換 if ($ecd == 1) { $data = encode("shiftjis",decode("euc-jp",$data)); } else { $data = Jcode->new($data, 'euc')->sjis; } # 表示 binmode(STDOUT); print "Content-type: text/html; charset=Shift_JIS\n"; print "Content-Length: ",length($data),"\n\n"; print $data; } ############################################################## # Sub conv_datetime - YYYYMMDDhhmmssを MM/DD hh:mm に変換 ############################################################## sub conv_datetime { if ($mode || (!$mode && $cfg{DT} eq "dt")) { $_[0] =~ s/\d\d\d\d(\d\d)(\d\d)(\d\d)(\d\d)\d\d/($1\/$2 $3:$4)/; } elsif (!$mode && $cfg{DT} eq "d") { $_[0] =~ s/\d\d\d\d(\d\d)(\d\d)\d\d\d\d\d\d/($1\/$2)/; } else { $_[0] = ""; } return $_[0]; } ############################################################ # Sub Check_Category - エントリのプライマリカテゴリラベルを取得 # プライマリカテゴリが非表示設定されている場合は最初に出てきた # サブカテゴリのラベルを取得 ############################################################ sub check_category{ my ($entry) = @_; my $cat_label; require MT::Category; require MT::Placement; my @categories = MT::Category->load({ blog_id => $cfg{Blog_ID} }, { unique => 1 }); if (@categories) { my $place = MT::Placement->load({ entry_id => $entry->id, is_primary => 1 }); if ($place) { my $match_cat = 0; if ($mode ne 'entryform' || $admin_mode eq 'no') { my @nondispcats = split(",", $cfg{NonDispCat}); for my $nondispcat (@nondispcats) { if ($place->category_id == $nondispcat) { $match_cat = 1; last; } } } if ($match_cat == 0) { for my $category (@categories) { if ($category->id == $place->category_id) { if ($cfg{CatDescReplace} eq "yes") { $cat_label = &conv_euc_z2h($category->description); } else { $cat_label = &conv_euc_z2h($category->label); } last; } } } else { my @places = MT::Placement->load({ entry_id => $entry->id }); my @nondispcats = split(",", $cfg{NonDispCat}); for my $category (@categories) { my $match_cat = 0; for my $nondispcat (@nondispcats) { if ($category->id == $nondispcat) { $match_cat = 1; last; } } if ($match_cat == 0) { for my $place (@places) { if ($category->id == $place->category_id) { if ($cfg{CatDescReplace} eq "yes") { $cat_label = &conv_euc_z2h($category->description); } else { $cat_label = &conv_euc_z2h($category->label); } $match_cat = 1; last; } } if ($match_cat == 1) { last; } } } } } } return $cat_label; } ######################################## # Sub Conv_Euc2icode - EUC-JP→MT使用コード変換 ######################################## sub conv_euc2icode { my ($str) = @_; if ($conv_in ne 'euc') { if ($conv_in eq 'utf8' && $ecd == 1) { $str = encode("shiftjis",decode("euc-jp",$str)); $str = encode("utf8",decode("cp932",$str)); } else { $str = Jcode->new($str, 'euc')->$conv_in(); } } return $str; } ################################################## # Sub Get_CatList - セレクタ用カテゴリリストの取得 ################################################## sub get_catlist { my @categories; require MT::Category; my @cats = MT::Category->top_level_categories($cfg{Blog_ID}); # ソート my @s_cats = &sort_cat(@cats); # サブカテゴリの取得 foreach my $category (@s_cats) { my @c_cats = &get_subcatlist($category, 0); foreach my $c_category (@c_cats) { push @categories, $c_category; } } return @categories; } ################################################## # Sub Get_SubCatList - セレクタ用サブカテゴリリストの取得 ################################################## sub get_subcatlist { my $category = shift; my $hierarchy = shift; # 管理者モードでない場合には非表示カテゴリを処理する # 親カテゴリが非表示なら子カテゴリも表示しない if ($admin_mode ne "yes"){ my @nondispcats = split(",", $cfg{NonDispCat}); my $match_cat = 0; for my $nondispcat (@nondispcats) { if ($category->id == $nondispcat) { $match_cat = 1; last; } } if ($match_cat > 0) { return; } } #################### # カテゴリの列挙 my %terms = (blog_id => $cfg{Blog_ID}); # 管理者モードでなければステータスが'公開'のエントリのみカウント if ($admin_mode ne "yes"){ $terms{'status'} = 2; } require MT::Entry; require MT::Placement; my $count = MT::Entry->count( \%terms, { join => [ 'MT::Placement', 'entry_id', { blog_id => $cfg{Blog_ID}, category_id => $category->id } ] }); #if ($count == 0) { # return; #} my @categories; my $blank; foreach (my $i = 0; $i < $hierarchy; $i++) { $blank .= "-"; } my $id = $category->{column_values}->{id}; my $label; if ($cfg{CatDescReplace} eq "yes"){ $label = &conv_euc_z2h($category->{column_values}->{description}); # カテゴリ名ぶった切り if ($cfg{LenCutCat} > 0) { if (MT4i::Func::lenb_euc($label) > $cfg{LenCutCat}) { $label = MT4i::Func::midb_euc($label, 0, $cfg{LenCutCat}); } } $label = $blank . $label; } else { $label = &conv_euc_z2h($category->{column_values}->{label}); # カテゴリ名ぶった切り if ($cfg{LenCutCat} > 0) { if (MT4i::Func::lenb_euc($label) > $cfg{LenCutCat}) { $label = MT4i::Func::midb_euc($label, 0, $cfg{LenCutCat}); } } $label = $blank . $label; } if ($cat == $id){ push @categories, "