#!/usr/local/bin/perl5.8 -w ################################################## # # MovableType用 i-mode変換スクリプト # 「MT4i」 my $version = "3.0.4"; # Copyright (C) 太鉄 All rights reserved. # Special Thanks # ヴァリウム男爵 & Tonkey & drry # # MT4i - t2o2-Wiki # →http://hazama.nu/pukiwiki/?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::Template; use Storable qw(lock_store lock_retrieve); use FindBin qw($Bin); use List::Util qw(first); use HTTP::Date; ########################################################################### 公開時にはコメントアウトする - ここから use CGI::Carp qw(fatalsToBrowser); ########################################################################### 公開時にはコメントアウトする - ここまで my $bin; my $log_pl; our %cfg; BEGIN { $bin = $Bin; # 外部ファイルの読み込み eval {require $bin.'/lib/mt4i/Config.pl'; 1}; if ($@) { print "Content-type: text/plain; charset=EUC-JP\n\nFile not found: $bin/lib/mt4i/Config.pl"; exit; } eval {require $bin.'/lib/mt4i/Func.pl'; 1}; if ($@) { print "Content-type: text/plain; charset=EUC-JP\n\nFile not found: $bin/lib/mt4i/Func.pl"; exit; } # Log library $log_pl = $bin.'/lib/mt4i/Log.pl'; # 設定読み込み %cfg = Config::Read($bin.'/mt4icfg.cgi'); if (!$cfg{MT_DIR}) { print "Content-type: text/plain; charset=EUC-JP\n\nCan't read configuration."; exit; } # Set environment variable for the plug-in. $ENV{MT_HOME} = $cfg{MT_DIR}; # Move to MT home directory chdir $cfg{MT_DIR}; } use lib $cfg{MT_DIR} . 'lib'; use lib $cfg{MT_DIR} . 'extlib'; #################### # HTML::Entities の有無調査 eval 'use HTML::Entities;'; my $hentities = ($@) ? 0 : 1 ; #################### # Jcode.pmの有無調査 eval 'use Jcode;'; if($@){ print "Content-type: text/plain; charset=EUC-JP\n\n\"Jcode.pm\"がインストールされていません。"; exit; } # User Agent によるキャリア判別 my ($ua, $png_flag) = MT4i::Func::get_ua(); #################### # AccessKey用文字列生成 my @nostr; my @akstr; for (my $i = 0; $i <= 9; $i++) { $nostr[$i] = ""; $akstr[$i] = ""; } my $clock_icon; my $mt4ilinkstr = $cfg{Ainori_Str_o}; my $ExitChtmlTransStr = $cfg{ECTrans_Str_o}; if ($cfg{AccessKey} eq "yes") { for (my $i = 1; $i <= 10; $i++) { if ($i < 10) { $akstr[$i] = " accesskey=\"$i\""; } else { $akstr[0] = " accesskey=\"0\""; } } $akstr[10] = " accesskey=\"*\""; $akstr[11] = " accesskey=\"#\""; 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;"; } else { $nostr[0] = "戀"; } } $nostr[10] = "[*]"; $nostr[11] = "礪"; # 時計アイコン $clock_icon = "丹"; } 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"; $nostr[10] = "[*]"; $nostr[11] = "\x1B\$F0\x0F"; # 時計アイコン $clock_icon = "\x1B\$GN\x0F"; } } #################### # 引数の取得 my $q = new CGI(); my $blog_id = $q->param("id") ? $q->param("id") : $cfg{Blog_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"); # エントリーの作成日時 my $entry_authored_on = $q->param("entry_authored_on"); # エントリーの公開日時 # PerlMagick の有無調査 my $imk = 0; if ($mode eq 'image' || $mode eq 'img_cut') { eval 'use Image::Magick;'; if ($cfg{ImageAutoReduce} eq "imagemagick") { $imk = ($@) ? 0 : 1 ; } else { $imk = 0; } } elsif ($cfg{ImageAutoReduce} eq "picto") { $imk = 2; } #管理者用暗号化キーをチェック my $admin_mode; if (($key ne "")&&(MT4i::Func::check_crypt($cfg{AdminPassword}.$blog_id,$key))){ $admin_mode = 'yes'; }else{ $admin_mode = 'no'; $key = ""; } ### Global Variables ### # mt object my $mt; # Encode.pm my $ecd; # PublishCharset my $conv_in; # blog object my $blog; # blog info my $blog_name; my $description; my $sort_order_comments; my $email_new_comments; my $email_new_pings; my $convert_paras; my $convert_paras_comments; # for Output my $data; # for Last_Modified header my $cache_last_mod_gmt; #################### # 引数$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 'comment_form') { &comment_form } if ($mode eq 'comment_form_rcm') { &comment_form } if ($mode eq 'comment_form_lnk') { &comment_form } if ($mode eq 'post_comment') { &post_comment } if ($mode eq 'post_comment_rcm') { &post_comment } if ($mode eq 'post_comment_lnk') { &post_comment } if ($mode eq 'recentcomment') { &recent_comment } if ($mode eq 'trackback') { &trackback } if ($mode eq 'redirect') { &redirector } #--- ここから先は管理モードでしか実行できない --- 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{CachePageCountIndex} || $page < $cfg{CachePageCountIndex}) && $admin_mode eq 'no') { my $ccat = ($cat) ? 'c'.$cat : 'c0' ; my $template = _readcache('b'.$blog_id.'/idx'.$ccat.'/p'.$page.$ua); &_cacheout($template) if $template; } # Get MT Object etc. &_get_mt_object(); # HTMLテンプレートをオープン my $template = _tmpl_open('index.tmpl'); 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 @entries = &get_entries($rowid, $cfg{DispNum}); # 一覧件数取得($cfg{DispNum}より少ない可能性がある為) my $rowcnt = @entries + 1; #################### # 表示文字列生成 #################### # 記事本文 my @entry_index = (); my $entry_page; my $odd = 1; if (@entries > 0) { 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 = MT::Util::format_ts($cfg{IndexDtFormat}, $mt->version_number() >= 4.0 ? $entry->authored_on : $entry->created_on, undef, $cfg{DtLang}); my $comment_cnt = $entry->comment_count; my $ping_cnt = $entry->ping_count; $rowid++; $i++; my $href = &make_href("individual", $rowid, 0, $entry->id, 0); my %row_data; # 行データのための新しいハッシュを取得 if ($cfg{AccessKey} eq "no" || ($cfg{AccessKey} eq "yes" && $ua ne "i-mode" && $ua ne "ezweb" && $ua ne "j-sky")) { $row_data{ENTRY_ROW_NO} = "$rowid."; $row_data{ENTRY_ACCESS_KEY} = ''; $row_data{ICON_CLOCK} = ''; } else { $row_data{ENTRY_ROW_NO} = $nostr[$i]; $row_data{ENTRY_ACCESS_KEY} = $akstr[$i]; $row_data{ICON_CLOCK} = "$clock_icon"; } $row_data{ENTRY_LINK_TITLE} = encode("shiftjis", decode("euc-jp", $title)); $row_data{ENTRY_LINK_URL} = $href; $row_data{ENTRY_CREATED_ON} = encode("shiftjis", decode("euc-jp", $created_on)); if ($comment_cnt > 0) { $row_data{ENTRY_COMMENT_CNT} = "[$comment_cnt]"; } if ($ping_cnt > 0) { $row_data{ENTRY_PING_CNT} = "[$ping_cnt]"; } # Judge odd or even $row_data{ENTRY_ODD} = $odd; $row_data{ENTRY_EVEN} = !$odd; $odd = !$odd; # 必須のステップ - この行のリファレンスをループに入れる! push(@entry_index, \%row_data); } # エントリ総件数の取得 my $ttlcnt = &get_ttlcnt; # 最終ページの算出 if ($ttlcnt > $cfg{DispNum}) { my $lastpage; my $amari; $lastpage = int($ttlcnt / $cfg{DispNum}); # int()で小数点以下は切り捨て $amari = $ttlcnt % $cfg{DispNum}; # 余りの算出 if ($amari > 0) { $lastpage++ } # あまりがあったら+1 my $ttl = $lastpage; # 下のページ数表示用に値取得 $lastpage--; # でもページは0から始まってるので-1(なんか間抜け) # ページ数表示 my $here = $page + 1; $entry_page .= "$here/$ttl"; # 引数用ページ数計算 my $nextpage = $page + 1; my $prevpage = $page - 1; # 次、前、最初 # 次 if ($rowid < $ttlcnt) { $template->param(ENTRY_INDEX_NAVI_NEXT => 1); my $href = &make_href("", 0, $nextpage, 0, 0); $template->param(ENTRY_INDEX_NAVI_NEXT_URL => $href); $template->param(ENTRY_INDEX_NAVI_NEXT_COUNT => ($page == $lastpage - 1 && $amari > 0) ? $amari : $cfg{DispNum} ); } else { $template->param(ENTRY_INDEX_NAVI_NEXT => 0); } # 前 $rowid = $rowid - $rowcnt; if ($rowid > 0) { $template->param(ENTRY_INDEX_NAVI_PREV => 1); my $href = &make_href("", 0, $prevpage, 0, 0); $template->param(ENTRY_INDEX_NAVI_PREV_URL => $href); $template->param(ENTRY_INDEX_NAVI_PREV_COUNT => $cfg{DispNum}); } else { $template->param(ENTRY_INDEX_NAVI_PREV => 0); } # 最初 if ($page > 1) { $template->param(ENTRY_INDEX_NAVI_BEGIN => 1); my $href = &make_href("", 0, 0, 0, 0); $template->param(ENTRY_INDEX_NAVI_BEGIN_URL => $href); $template->param(ENTRY_INDEX_NAVI_BEGIN_COUNT => $cfg{DispNum}); } else { $template->param(ENTRY_INDEX_NAVI_BEGIN => 0); } # 「最後」リンクの表示判定 if ($page < $lastpage - 1) { $template->param(ENTRY_INDEX_NAVI_LAST => 1); my $href = &make_href("", 0, $lastpage, 0, 0); $template->param(ENTRY_INDEX_NAVI_LAST_URL => $href); $template->param(ENTRY_INDEX_NAVI_LAST_COUNT => ($amari > 0) ? $amari : $cfg{DispNum}); } else { $template->param(ENTRY_INDEX_NAVI_LAST => 0); } if ($rowid < $ttlcnt || $rowid > 0 || $page > 1 || $page < $lastpage - 1) { $template->param(ENTRY_INDEX_NAVI => 1); } else { $template->param(ENTRY_INDEX_NAVI => 0); } } else { $entry_page .= "1/1"; $template->param(ENTRY_INDEX_NAVI => 0); } } # fill in some parameters $template->param(BLOG_LOGO => &index_title_logo); $template->param(BLOG_DESCRIPTION => &index_blog_description); $template->param(CATEGORY_SELECTOR => &index_category_selector); $template->param(ENTRIES => \@entry_index); $template->param(ENTRY_PAGE => encode("shiftjis",decode("euc-jp",$entry_page))); $template->param(LINK_RECENT_COMMENT => &index_link_recent_comment); $template->param(ADMIN_MENU => &index_admin_menu); $template->param(ADMIN_INFO => &index_admin_info); $template->param(TOP => $page == 0 ? 1 : 0 ); $template->param(HOME => $page == 0 && !$cat ? 1 : 0 ); $template->param(CELLPHONE => ($ua eq "i-mode" || $ua eq "ezweb" || $ua eq "j-sky") ? 1 : 0 ); # Common $template = _tmpl_common($template); # キャッシュへ出力 if ((!$cfg{CachePageCountIndex} || $page < $cfg{CachePageCountIndex}) && $admin_mode eq 'no') { my $ccat = ($cat) ? 'c'.$cat : 'c0' ; _writecache('b'.$blog_id.'/idx'.$ccat.'/p'.$page.$ua, $template); } # Output &_cacheout($template); } # ----- トップロゴ ----- sub index_title_logo { my $str; if ($cfg{Logo_i} && $cfg{Logo_o}) { $str = ($ua eq 'i-mode') ? "" : "" ; } else { $str = $blog_name; } return encode("shiftjis",decode("euc-jp",$str)); } # ----- カテゴリセレクタ ----- sub index_category_selector { my $str; $str .= "
"; if ($key){ $str .= ""; } $str .= ""; $str .= ""; $str .= "
"; return encode("shiftjis",decode("euc-jp", $str)); } # ----- 概要 ----- sub index_blog_description { my $str; if ($description) { my $tmp_data .= "$description"; #単なる改行を
タグに置換 #(「ウェブログの説明」に改行が混ざるとauで表示されない不具合への対処) $tmp_data=~s/\r\n/
/g; $tmp_data=~s/\r/
/g; $tmp_data=~s/\n/
/g; $str .= $tmp_data; } return encode("shiftjis",decode("euc-jp", $str)); } # ----- 最近のコメント一覧へのリンク ----- sub index_link_recent_comment { require MT::Comment; my $str; my $blog_comment_cnt = MT::Comment->count({ blog_id => $blog_id }); if ($blog_comment_cnt) { my $href = &make_href("recentcomment", 0, 0, 0, 0); $str .= "最近のコメント$cfg{RecentComment}件"; } return encode("shiftjis",decode("euc-jp",$str)); } # ----- 管理者用メニュー ----- sub index_admin_menu { my $str; $str .= "
"; $str .= ""; $str .= ""; $str .= ""; $str .= ""; $str .= "
"; $str .= "
"; $str .= ($email_new_comments) ? "" : ""; $str .= ""; $str .= ""; $str .= ""; $str .= "
"; return encode("shiftjis",decode("euc-jp", $str)); } sub index_admin_info { # 管理人情報 my $str; if (exists $cfg{AdmNM}) { $str .= "管理人:"; if (exists $cfg{AdmML}) { $cfg{AdmML} =~ s/\@/\@/g; $cfg{AdmML} =~ s/\./\./g; $str .= "$cfg{AdmNM}"; } else { $str .= "$cfg{AdmNM}"; } } return encode("shiftjis",decode("euc-jp", $str)); } #---------------------------------------------------------------------------------------------------- ######################################## # Sub Individual - 単記事ページの描画 ######################################## sub individual { # 携帯電話からのアクセスかつアクセスキー有効の場合は$cfg{DispNum}を6以下にする if ($cfg{AccessKey} eq "yes" && ($ua eq "i-mode" || $ua eq "j-sky" || $ua eq "ezweb")) { if ($cfg{DispNum} > 6) { $cfg{DispNum} = 6; } } # キャッシュを読む my $template; if ($admin_mode eq 'no') { my $ccat = ($cat) ? 'c'.$cat : 'c0' ; my $csprtpage = ($sprtpage) ? $sprtpage : '0' ; $template = _readcache('b'.$blog_id.'/e'.$eid.'/'.$ccat.'/p'.$csprtpage.$ua); } my $ent_allow_comments; my $entry; my $rowid; unless ($template) { # Get MT Object etc. &_get_mt_object(); $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--; } #################### # 記事の取得 $entry = _get_entry($eid); # 検索結果が0件の場合はメッセージ表示してSTOP(有り得ないけどな) if (!$entry) { &errout( ($hentities == 1) ? 'Entry ID "'.encode_entities($eid).'" is wrong.' : 'Entry ID "'.$eid.'" is wrong.' ); } # HTMLテンプレートをオープン $template = _tmpl_open('individual.tmpl'); # 結果をテンプレートに埋め込む $template->param(ENTRY_ID => $entry->id); $template->param(ENTRY_CREATED_ON => encode("shiftjis", decode("euc-jp", MT::Util::format_ts($cfg{IndividualDtFormat}, $mt->version_number() >= 4.0 ? $entry->authored_on : $entry->created_on, undef, $cfg{DtLang})))); # 結果を変数に格納 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)); # コメント投稿機能が強制OFFされている場合はallow_commentsをClosedに $ent_allow_comments = ($cfg{ArrowComments} == 1) ? $entry->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=\n*["']http:\/\/([^"'>]*)["'][^>]*alt=\n*["']([^"'>]*)["'][^>]*><\/a>/<画像:$2<\/a>>/ig; $text =~ s/]*>]*alt=\n*["']([^"'>]*)["'][^>]*src=\n*["']http:\/\/([^"'>]*)["'][^>]*><\/a>/<画像:$1<\/a>>/ig; # imgタグのみの除去、ALTの表示、画像へのリンク $text =~ s/]*src=\n*["']http:\/\/([^"'>]*)["'][^>]*alt=\n*["']([^"'>]*)["'][^>]*>/<画像:$2<\/a>>/ig; $text =~ s/]*alt=\n*["']([^"'>]*)["'][^>]*src=\n*["']http:\/\/([^"'>]*)["'][^>]*>/<画像:$1<\/a>>/ig; # aタグを含めた除去、画像へのリンク $text =~ s/]*>]*src=\n*["']http:\/\/([^"'>]*)["'][^>]*><\/a>/<画像<\/a>>/ig; # imgタグのみの除去、画像へのリンク $text =~ s/]*src=\n*["']http:\/\/([^"'>]*)["'][^>]*>/<画像<\/a>>/ig; } else { $href = &make_href("image", $rowid, 0, $eid, 0); $text =~ s/]*>]*src=\n*["']([^"'>]*)["'][^>]*alt=\n*["']([^"'>]*)["'][^>]*><\/a>/<画像:$2<\/a>>/ig; $text =~ s/]*>]*alt=\n*["']([^"'>]*)["'][^>]*src=\n*["']([^"'>]*)["'][^>]*><\/a>/<画像:$1<\/a>>/ig; # imgタグのみの除去、ALTの表示、画像へのリンク $text =~ s/]*src=\n*["']([^"'>]*)["'][^>]*alt=\n*["']([^"'>]*)["'][^>]*>/<画像:$2<\/a>>/ig; $text =~ s/]*alt=\n*["']([^"'>]*)["'][^>]*src=\n*["']([^"'>]*)["'][^>]*>/<画像:$1<\/a>>/ig; # aタグを含めた除去、画像へのリンク $text =~ s/]*>]*src=\n*["']([^"'>]*)["'][^>]*><\/a>/<画像<\/a>>/ig; # imgタグのみの除去、画像へのリンク $text =~ s/]*src=\n*["']([^"'>]*)["'][^>]*>/<画像<\/a>>/ig; } #################### # タグ変換等 if($entry->convert_breaks eq '__default__' || ($entry->convert_breaks ne '__default__' && $entry->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/

'; } } # FONTタグ $cnt_tag_o = ($text =~ s! $cnt_tag_c) { for (my $i = 0; $i < $cnt_tag_o - $cnt_tag_c; $i++) { $text .= '
'; } } return $text; } ######################################## # Sub Conv_euc_z2h - →EUC-JP/全角→半角変換 ######################################## sub conv_euc_z2h { my $tmpstr = $_[0]; return $tmpstr unless $tmpstr; # 第一引数をEUC-JPに変換 if ($conv_in ne "euc") { if ($conv_in eq "utf8" && $ecd == 1) { # Replace 'FULLWIDTH TILDE' to 'WAVE DASH' # http://digit.que.ne.jp/work/wiki.cgi?Perl%E3%83%A1%E3%83%A2%2F%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E6%89%B1%E3%81%84#putf8_wave_dash $tmpstr =~ s/\xEF\xBD\x9E/\xE3\x80\x9C/go; # Replace 'FULLWIDTH HYPHEN-MINUS' to 'MINUS SIGN' # http://www.spacemonkey.jp/p/blog/read-sn_0611301604201.html $tmpstr =~ s/\xEF\xBC\x8D/\xE2\x88\x92/go; $tmpstr = encode("euc-jp",decode("utf8",$tmpstr)); } else { $tmpstr = Jcode->new($tmpstr, $conv_in)->euc; } } # 表示文字列の全角文字を半角に変換 if ($cfg{Z2H} eq "yes") { my $from = 'A-Za-z0-9/!?()=&'; my $to = 'A-Za-z0-9/!?()=&'; if ($ecd == 1) { Encode::JP::H2Z::z2h(\$tmpstr); $tmpstr = Jcode->new($tmpstr,'euc')->tr($from, $to)->euc; } else { $tmpstr = Jcode->new($tmpstr,'euc')->z2h->tr($from, $to)->euc; } } 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", "+"->"%2B" $url =~ s/\//\%2F/g; $url =~ s/\+/\%2B/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; } # Remove quote $title =~ s/["']//g; $url =~ s/["']//g; if ($cfg{ChtmlTrans} && $url !~ /^#/) { if ($title !~ /$cfg{ExitChtmlTrans}/) { $url = _conv_url_to_redirector($url, $ref_rowid, $ref_eid); } else { # Icon for cellular phone $lnkstr = $ExitChtmlTransStr; } } # Unites supplementing a double quotation. $str .= "$front\"" . $url; $tmpstr = "\"$end" . $lnkstr . $backward; } $str .= $tmpstr; # Remove title and target attribute $str =~ s/ target=["'][^"']*["']//ig; $str =~ s/ title=["'][^"']*["']//ig; return $str; } ######################################## # Sub _Conv_URL_To_Redirector ######################################## sub _conv_url_to_redirector { my ($url, $rowid, $eid) = @_; # Convert sorce URL to redirector my $tmpurl = &make_href("redirect", $rowid, 0, 0, $eid); # URL encode # via http://sonic64.com/2003-08-31.html $url =~ s/([^\w ])/'%'.unpack('H2', $1)/eg; $url =~ tr/ /+/; $url = $tmpurl . '&url=' . $url; return $url; } ######################################## # Sub Redirector - リダイレクタ ######################################## sub redirector { # HTMLテンプレートをオープン my $template = _tmpl_open('redirector.tmpl'); # URLを変換 my ($lnkstr,$lnkurl) = &chtmltrans($redirect_url); $template->param(MLD_STR => $lnkstr) if $lnkstr; $template->param(SOURCE_URL => $redirect_url); $template->param(MOBILE_URL => $lnkurl); my $href = &make_href("individual", $no, 0, $ref_eid, 0); $template->param(BACK_URL => $href); # Common $template = _tmpl_common($template); # Output &_cacheout($template); } ######################################## # 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.amazon.co.jp/gp/product/.*!g) { # 新 Amazon リンクなら携帯対応 URL へ変換 # 個別商品リンクのテキストのみ $url =~ s!(http://www.amazon.co.jp/gp/)product/(.*)\?ie=(.*)&tag=(.*)&linkCode.*!$1aw/rd.html?ie=$3&dl=1&uid=NULLGWDOCOMO&a=$2&at=$4&url=%2Fgp%2Faw%2Fd\.html!g; } elsif ($url =~ m/.*http:\/\/www.amazon.co.jp\/gp\/redirect.html.*/g) { # 新 Amazon リンクなら携帯対応 URL へ変換 # テキストリンク | 特定のページ $url =~ s!(http://www.amazon.co.jp/gp/).*product/(.*)\?ie=(.*)&tag=(.*)&linkCode.*!$1aw/rd.html?ie=$3&dl=1&uid=NULLGWDOCOMO&a=$2&at=$4&url=%2Fgp%2Faw%2Fd\.html!g; } 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; } elsif ($url =~ m!.*http://www.nicovideo.jp/.*!g) { # NicoNicoDouga $url =~ s/www.nicovideo.jp/m.nicovideo.jp/g; } else { # リンク先を取得 my $mt4ilink = MT4i::Func::get_mt4ilink($url); if ($mt4ilink) { $url = $mt4ilink; $lnkstr = $mt4ilinkstr; } else { if ($cfg{MobileGW} eq '1') { # 通勤ブラウザ # 'http://'を削除 $url =~ s!http://!!g; # URLを生成 my $chtmltransurl = 'http://www.sjk.co.jp/c/w.exe?y='; $url = $chtmltransurl . $url; } elsif ($cfg{MobileGW} eq '2') { # Google mobile Gateway # "/"→"%2F"、"?"→"%3F"、"+"→"%2B" $url =~ s/\//\%2F/g; $url =~ s/\?/\%3F/g; $url =~ s/\+/\%2B/g; # URLを生成 my $chtmltransurl = 'http://www.google.co.jp/gwt/n?u='; $url = $chtmltransurl . $url; } } } 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公式ページへのアンカーを表示しない $data .= ($admin_mode eq 'yes') ? "MT4i v$version" : "MT4i v$version"; $data .= "

"; # 表示文字列をShift_JISに変換 $data = ($ecd == 1) ? encode("shiftjis",decode("euc-jp",$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 Errout - エラーの出力 ######################################## sub errout { my $str = shift; # Open template file and set parameter my $template = _tmpl_open('error.tmpl'); $template->param(ERROR_MESSAGE => $str); # Write log eval {require $log_pl; 1}; if ($@) { print "Content-type: text/plain; charset=EUC-JP\n\nFile not found: $log_pl"; exit; } MT4i::Log::writelog($str); # Common $template = _tmpl_common($template); # Output &_cacheout($template); } ############################################################## # Sub conv_datetime - YYYYMMDDhhmmssを MM/DD hh:mm に変換 ############################################################## sub conv_datetime { $_[0] =~ s/\d\d\d\d(\d\d)(\d\d)(\d\d)(\d\d)\d\d/($1\/$2 $3:$4)/; 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 => $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 = MT4i::Func::get_nondispcats(); $match_cat = 1 if (first { $place->category_id == $_ } @nondispcats); } if ($match_cat == 0) { my $category = first { $_->id == $place->category_id } @categories; $cat_label = &conv_euc_z2h( ($category && $cfg{CatDescReplace} eq "yes") ? $category->description : $category->label ); } else { my @places = MT::Placement->load({ entry_id => $entry->id }); my @nondispcats = MT4i::Func::get_nondispcats(); for my $category (@categories) { if (!(first { $category->id == $_ } @nondispcats) && first { $category->id == $_->category_id } @places) { $cat_label = &conv_euc_z2h( ($cfg{CatDescReplace} eq "yes") ? $category->description : $category->label ); last; } } } } } return $cat_label; } ######################################## # Sub Conv_Euc2icode - EUC-JP→MT使用コード変換 ######################################## sub conv_euc2icode { my ($str) = @_; if ($conv_in ne 'euc') { $str = ($conv_in eq 'utf8' && $ecd == 1) ? encode("utf8",decode("euc-jp",$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($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 = MT4i::Func::get_nondispcats(); return if (first { $category->id == $_ } @nondispcats); } #################### # カテゴリの列挙 my %terms = (blog_id => $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 => $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; } my $selected = ($cat == $id) ? ' selected' : '' ; push @categories, "