差别
这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版两侧同时换到之后的修订记录 | |||
blog:archives:2675 [2017/11/03 12:25] – 外部编辑 127.0.0.1 | blog:archives:2675 [2019/09/14 12:59] – 管理员 | ||
---|---|---|---|
行 1: | 行 1: | ||
- | 111 | + | ====== 资料管理软件私本管理Plus ====== |
+ | 最近开始使用[[http:// | ||
+ | |||
+ | 其能够实现的功能,已经非常接近自己所期望的管理效果了。 | ||
+ | |||
+ | ===== ===== | ||
+ | 并且通过私本管理GOOUT还可以将资料同步到web上,实在是很方便。 | ||
+ | |||
+ | < | ||
+ | |||
+ | < | ||
+ | |||
+ | GOOUTのUTF8対応ですが、私が改造したものでよければ(添付ファイル)どうぞ。\\ | ||
+ | ファイル名はsearch.cgiに変更してください。特殊なモジュールは使っていないはずなのでPerl 5.8.1以上の環境であればおそらく動くと思います。\\ | ||
+ | また、私本管理でCSVファイルを作成する際、文字コードをUTF8またはUNICODEで保存してください。 | ||
+ | |||
+ | 添付:[[http:// | ||
+ | |||
+ | <file txt 8255.txt> | ||
+ | # | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # Perl 5.8.1 以降。 | ||
+ | # Perl 5.8.0 は文字コードの扱いに問題があるため、 | ||
+ | # 文字化けを起こす等の不具合が発生する可能性があります | ||
+ | # なお、jcode.plは使用しなくなりました | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | #2015.01.10 Ver2.1.0 | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | # | ||
+ | #2015.01.10 Ver2.0.1 | ||
+ | # | ||
+ | #2011.08.07 Ver2.0.0 | ||
+ | # | ||
+ | #2010.08.11 Ver1.0.0 | ||
+ | # | ||
+ | # | ||
+ | |||
+ | use strict; | ||
+ | use utf8; | ||
+ | use CGI qw/: | ||
+ | use Encode qw/ | ||
+ | use HTML:: | ||
+ | |||
+ | my $TITLE | ||
+ | my $VERSION | ||
+ | my $SCRIPT_NAME = " | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | my $PAGE = 20; # 1ページに表示する件数 | ||
+ | |||
+ | # 「No Image」画像の場所を指定します | ||
+ | # cgiと同じ場所の場合は「noimage.jpg」と指定します | ||
+ | # @niftyの場合は「http:// | ||
+ | # ↓このままでも使用できますが、変更される可能性があります | ||
+ | my $NOIMAGE = " | ||
+ | |||
+ | # For iPhone | ||
+ | my $ICON_PATH = " | ||
+ | |||
+ | my $LINK_URL = " | ||
+ | |||
+ | my $AMAZON_TAG = ""; | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | my @FILE = ( " | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | my @DIR = ( " | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | my %FORM = (); | ||
+ | my %FDATA | ||
+ | my @FDATAindex = (); | ||
+ | |||
+ | # フラグ付きUTF-8文字列をフラグなしにして出力させる | ||
+ | binmode STDOUT, ": | ||
+ | |||
+ | # フォームの内容取得 | ||
+ | & | ||
+ | |||
+ | if ( $ENV{' | ||
+ | || defined( $FORM{page} ) && $FORM{page} ne "" | ||
+ | { | ||
+ | |||
+ | # 検索結果画面表示 | ||
+ | & | ||
+ | } | ||
+ | else { | ||
+ | |||
+ | # 検索画面表示 | ||
+ | & | ||
+ | } | ||
+ | |||
+ | exit; | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | sub htmlStart { | ||
+ | & | ||
+ | & | ||
+ | & | ||
+ | } | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | sub htmlResult { | ||
+ | & | ||
+ | & | ||
+ | & | ||
+ | } | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | sub Style { | ||
+ | print <<" | ||
+ | <style type=" | ||
+ | |||
+ | /* body 初期設定 */ | ||
+ | |||
+ | body { | ||
+ | background: rgb(197, | ||
+ | font-family: | ||
+ | margin: 0; | ||
+ | padding: 0; | ||
+ | -webkit-user-select: | ||
+ | -webkit-text-size-adjust: | ||
+ | } | ||
+ | |||
+ | /* a 初期設定 */ | ||
+ | |||
+ | a { | ||
+ | font: 14px Helvetica; | ||
+ | color: #42688e; | ||
+ | text-decoration: | ||
+ | } | ||
+ | |||
+ | a:hover, a:active { | ||
+ | color: #ff0066; | ||
+ | text-decoration: | ||
+ | } | ||
+ | |||
+ | /* Center文字列初期設定 */ | ||
+ | div.center { | ||
+ | text-align: center; | ||
+ | margin: 4px 0; | ||
+ | padding: 0; | ||
+ | clear: both; | ||
+ | } | ||
+ | |||
+ | /* header 設定 */ | ||
+ | |||
+ | div#header { | ||
+ | background: rgb(109, | ||
+ | border-top: 1px solid rgb(205, | ||
+ | border-bottom: | ||
+ | padding: 5px; | ||
+ | margin: 0; | ||
+ | min-height: 44px; | ||
+ | -webkit-box-sizing: | ||
+ | } | ||
+ | |||
+ | div#header h1 { | ||
+ | color: #fff; | ||
+ | font: bold 18px/30px Helvetica; | ||
+ | text-shadow: | ||
+ | text-align: center; | ||
+ | text-overflow: | ||
+ | white-space: | ||
+ | overflow: hidden; | ||
+ | padding: 5px 0; | ||
+ | margin: 2px 0 0 0; | ||
+ | top: 0; | ||
+ | } | ||
+ | |||
+ | div#header #backButton { | ||
+ | left: 6px; | ||
+ | right: auto; | ||
+ | color: #fff; | ||
+ | font: bold 10px/20px Helvetica; | ||
+ | text-shadow: | ||
+ | text-align: center; | ||
+ | width: 38px; | ||
+ | border-width: | ||
+ | border:1px solid #263a51; | ||
+ | padding: 5px 0; | ||
+ | display: block; | ||
+ | position: absolute; | ||
+ | margin-top: -40px; | ||
+ | background: #42688e; | ||
+ | -webkit-border-radius: | ||
+ | } | ||
+ | |||
+ | /* list 初期設定 */ | ||
+ | |||
+ | ul { | ||
+ | color: black; | ||
+ | background: #fff; | ||
+ | border: 1px solid #B4B4B4; | ||
+ | font: bold 17px Helvetica; | ||
+ | padding: 0 10px; | ||
+ | margin: 15px 10px 17px 10px; | ||
+ | -webkit-border-radius: | ||
+ | } | ||
+ | |||
+ | ul li { | ||
+ | color: #666; | ||
+ | border-top: 1px solid #B4B4B4; | ||
+ | list-style-type: | ||
+ | padding: 10px; | ||
+ | } | ||
+ | |||
+ | li: | ||
+ | border-top: 0; | ||
+ | -webkit-border-top-left-radius: | ||
+ | -webkit-border-top-right-radius: | ||
+ | } | ||
+ | |||
+ | li: | ||
+ | -webkit-border-bottom-left-radius: | ||
+ | -webkit-border-bottom-right-radius: | ||
+ | } | ||
+ | |||
+ | |||
+ | /* form 設定 */ | ||
+ | |||
+ | ul#form li { | ||
+ | padding: 7px 10px; | ||
+ | text-align: center; | ||
+ | vertical-align: | ||
+ | } | ||
+ | |||
+ | ul#form li input[type=" | ||
+ | color: #777; | ||
+ | background: #fff; | ||
+ | border: 0; | ||
+ | font: normal 17px Helvetica; | ||
+ | padding: 0; | ||
+ | display: inline-block; | ||
+ | margin-left: | ||
+ | width: 50%; | ||
+ | -webkit-appearance: | ||
+ | } | ||
+ | |||
+ | ul#form li select { | ||
+ | text-indent: | ||
+ | background: transparent no-repeat 100% 3px; | ||
+ | -webkit-appearance: | ||
+ | margin-left: | ||
+ | width: 50%; | ||
+ | } | ||
+ | |||
+ | ul#form li input[type=" | ||
+ | width: 44%; | ||
+ | height : 30px; | ||
+ | } | ||
+ | |||
+ | ul#form li.left { | ||
+ | float: left; | ||
+ | } | ||
+ | |||
+ | ul#form li.right { | ||
+ | float: right; | ||
+ | } | ||
+ | |||
+ | |||
+ | /* result 設定 */ | ||
+ | |||
+ | ul#result li.img { | ||
+ | height: | ||
+ | padding-left: | ||
+ | } | ||
+ | |||
+ | ul#result img.img { | ||
+ | display: inline-block; | ||
+ | width: 60px; | ||
+ | height: | ||
+ | margin: 0 0 0 -75px; | ||
+ | float: left; | ||
+ | -moz-background-size: | ||
+ | background-size: | ||
+ | -webkit-border-radius: | ||
+ | background: #F4FBFE; | ||
+ | padding: 0; | ||
+ | } | ||
+ | |||
+ | ul#result div { | ||
+ | color: #000; | ||
+ | font: 14px Helvetica; | ||
+ | text-overflow: | ||
+ | white-space: | ||
+ | overflow: hidden; | ||
+ | display: block; | ||
+ | margin: 0; | ||
+ | padding: 0; | ||
+ | } | ||
+ | |||
+ | ul#result a { | ||
+ | |||
+ | } | ||
+ | |||
+ | /* nextpage 設定 */ | ||
+ | |||
+ | ul#nextpage { | ||
+ | background: #fff; | ||
+ | clear: both; | ||
+ | height: 44px; | ||
+ | text-align: center; | ||
+ | } | ||
+ | |||
+ | ul#nextpage li.left { | ||
+ | border: 0; | ||
+ | -webkit-border-radius: | ||
+ | width: 33%; | ||
+ | float: left; | ||
+ | margin: 0; | ||
+ | padding: 2px 0 0 0; | ||
+ | } | ||
+ | |||
+ | ul#nextpage li.center { | ||
+ | border: 0; | ||
+ | -webkit-border-radius: | ||
+ | width: 34%; | ||
+ | float: left; | ||
+ | margin: 0; | ||
+ | padding: 11px 0; | ||
+ | } | ||
+ | |||
+ | ul#nextpage li.right { | ||
+ | border: 0; | ||
+ | -webkit-border-radius: | ||
+ | width: 33%; | ||
+ | float: right; | ||
+ | margin: 0; | ||
+ | padding: 2px 0 0 0; | ||
+ | } | ||
+ | |||
+ | ul#nextpage li a { | ||
+ | display: block; | ||
+ | width: 100%; | ||
+ | margin: 0; | ||
+ | padding: 10px 0; | ||
+ | } | ||
+ | |||
+ | |||
+ | /* pages 設定 */ | ||
+ | |||
+ | ul#pages { | ||
+ | margin: 4px 4px 4px 0; | ||
+ | border: 0; | ||
+ | -webkit-border-radius: | ||
+ | text-align: center; | ||
+ | } | ||
+ | |||
+ | ul#pages li.now { | ||
+ | border: 1px solid #C0D5DD; | ||
+ | -webkit-border-radius: | ||
+ | width: 30px; | ||
+ | height: 22px; | ||
+ | float: left; | ||
+ | margin: 0 0 1px 1px; | ||
+ | background: #fff; | ||
+ | padding: 4px 0; | ||
+ | } | ||
+ | |||
+ | ul#pages li.other { | ||
+ | border: 1px solid #C0D5DD; | ||
+ | -webkit-border-radius: | ||
+ | width: 30px; | ||
+ | height: 30px; | ||
+ | float: left; | ||
+ | margin: 0 0 1px 1px; | ||
+ | background: #F4FBFE; | ||
+ | padding: 0; | ||
+ | } | ||
+ | |||
+ | ul#pages li a { | ||
+ | display: block; | ||
+ | width: 100%; | ||
+ | margin: 0; | ||
+ | padding: 6px 0; | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | _EOF_ | ||
+ | } | ||
+ | |||
+ | # | ||
+ | # HTML ヘッダ初期 | ||
+ | # | ||
+ | sub htmlHeader01 { | ||
+ | print " | ||
+ | print <<" | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | <meta http-equiv=" | ||
+ | <meta id=" | ||
+ | <link rel=" | ||
+ | _EOF_ | ||
+ | |||
+ | & | ||
+ | |||
+ | print <<" | ||
+ | </ | ||
+ | < | ||
+ | <div id=" | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | _EOF_ | ||
+ | } | ||
+ | |||
+ | # | ||
+ | # HTML ヘッダ検索後 | ||
+ | # | ||
+ | sub htmlHeader02 { | ||
+ | print " | ||
+ | print <<" | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | <meta http-equiv=" | ||
+ | <meta id=" | ||
+ | <link rel=" | ||
+ | <script type=" | ||
+ | function send(page) { | ||
+ | var form = document.forms[0]; | ||
+ | form.page.value = page; | ||
+ | form.submit(); | ||
+ | } | ||
+ | </ | ||
+ | _EOF_ | ||
+ | |||
+ | & | ||
+ | |||
+ | print <<" | ||
+ | </ | ||
+ | < | ||
+ | <div id=" | ||
+ | < | ||
+ | <a href=" | ||
+ | </ | ||
+ | _EOF_ | ||
+ | } | ||
+ | |||
+ | # | ||
+ | # HTML フッタ初期 | ||
+ | # | ||
+ | sub htmlFooter01 { | ||
+ | print << " | ||
+ | <div class=" | ||
+ | </ | ||
+ | </ | ||
+ | _EOF_ | ||
+ | } | ||
+ | |||
+ | # | ||
+ | # HTML フッタ検索後 | ||
+ | # | ||
+ | sub htmlFooter02 { | ||
+ | print << " | ||
+ | </ | ||
+ | </ | ||
+ | _EOF_ | ||
+ | } | ||
+ | |||
+ | # | ||
+ | # HTML 検索画面 | ||
+ | # | ||
+ | sub htmlSearch { | ||
+ | print <<" | ||
+ | <form method=" | ||
+ | |||
+ | <ul id=" | ||
+ | < | ||
+ | <select name=" | ||
+ | _EOF_ | ||
+ | |||
+ | for ( my $i = 0; $i <= $#FILE; $i++ ) { | ||
+ | my $genre = encode_entities( $DIR[$i] ); | ||
+ | if ( defined( $FORM{file} ) && $i eq $FORM{file} ) { | ||
+ | print "< | ||
+ | } | ||
+ | else { | ||
+ | print "< | ||
+ | } | ||
+ | } | ||
+ | |||
+ | print <<" | ||
+ | </ | ||
+ | </ | ||
+ | < | ||
+ | <select name=" | ||
+ | _EOF_ | ||
+ | my @Purchase = ( "", | ||
+ | for ( my $i = 0; $i <= $#Purchase; ++$i ) { | ||
+ | if ( defined( $FDATA{20} ) && $Purchase[$i] eq $FDATA{20} ) { | ||
+ | |||
+ | "< | ||
+ | } | ||
+ | else { | ||
+ | print "< | ||
+ | } | ||
+ | } | ||
+ | print <<" | ||
+ | </ | ||
+ | </ | ||
+ | < | ||
+ | <input type=" | ||
+ | < | ||
+ | <input type=" | ||
+ | < | ||
+ | <input type=" | ||
+ | _EOF_ | ||
+ | if ( defined( $FORM{ftype} ) && $FORM{ftype} eq " | ||
+ | |||
+ | "< | ||
+ | |||
+ | "< | ||
+ | } | ||
+ | else { | ||
+ | |||
+ | "< | ||
+ | |||
+ | "< | ||
+ | } | ||
+ | print <<" | ||
+ | & | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <div class=" | ||
+ | </ | ||
+ | _EOF_ | ||
+ | } | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | sub formDataGet { | ||
+ | |||
+ | # 入力パラメータ取得 | ||
+ | foreach my $key (param) { | ||
+ | $key = decode_utf8($key); | ||
+ | my $value = decode_utf8( param($key) ); | ||
+ | if ( $key =~ /data(\d+)/ ) { | ||
+ | my $index = $1; | ||
+ | if ( $index eq " | ||
+ | |||
+ | # ISBN | ||
+ | $FDATA{$index} = & | ||
+ | } | ||
+ | else { | ||
+ | |||
+ | # ISBN以外は小文字にして保持 | ||
+ | $FDATA{$index} = lc($value); | ||
+ | } | ||
+ | |||
+ | unless ( $FDATA{$index} eq "" | ||
+ | push( @FDATAindex, | ||
+ | } | ||
+ | } | ||
+ | else { | ||
+ | |||
+ | # ジャンル、検索タイプ(AND/ | ||
+ | $FORM{$key} = $value; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | sub runSearch { | ||
+ | |||
+ | # ファイルの読み込み | ||
+ | if ( !open( FH, "<: | ||
+ | &error( " | ||
+ | " | ||
+ | ); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | # 初期ページを設定 | ||
+ | if ( !defined( $FORM{page} ) || $FORM{page} eq "" | ||
+ | $FORM{page} = 1; | ||
+ | } | ||
+ | |||
+ | my $maxRec = $FORM{page} * $PAGE; | ||
+ | my $minRec = $maxRec - $PAGE + 1; # 表示レコード MIN | ||
+ | |||
+ | print "< | ||
+ | |||
+ | my ( $codeSet, $offset ); | ||
+ | my $count = 0; | ||
+ | my $flg = 0; | ||
+ | |||
+ | while ( my $line = <FH> ) { | ||
+ | |||
+ | if ( $. == 1 ) { | ||
+ | if ( $line =~ s/ | ||
+ | $codeSet = " | ||
+ | $offset | ||
+ | } | ||
+ | elsif ( $line =~ s/ | ||
+ | $codeSet = " | ||
+ | $offset | ||
+ | } | ||
+ | else { | ||
+ | $codeSet = " | ||
+ | $offset | ||
+ | } | ||
+ | |||
+ | # BOMを除いた先頭へ戻って読み直し | ||
+ | seek( FH, $offset, 0 ); | ||
+ | binmode FH, " | ||
+ | $line = < | ||
+ | } | ||
+ | |||
+ | chomp($line); | ||
+ | |||
+ | # 「, | ||
+ | my @array = split( ",", | ||
+ | |||
+ | # ヘッダ行を読み飛ばす | ||
+ | if ( $array[0] eq " | ||
+ | next; | ||
+ | } | ||
+ | |||
+ | my $found = 0; | ||
+ | |||
+ | # 検索 | ||
+ | if ( $# | ||
+ | |||
+ | # 検索項目が未入力の場合は該当ありと判定 | ||
+ | $found = 1; | ||
+ | } | ||
+ | elsif ( $FORM{ftype} eq " | ||
+ | |||
+ | # OR検索の場合は最初に一致項目が出た時点で該当ありと判定 | ||
+ | $found = 0; | ||
+ | my $data; | ||
+ | for ( my $i = 0; $i <= $# | ||
+ | $data = $array[ $FDATAindex[$i] ]; | ||
+ | $data = lc($data); | ||
+ | |||
+ | # ISBNは-を削除 x, | ||
+ | if ( $FDATAindex[$i] == 0 ) { | ||
+ | $data = & | ||
+ | } | ||
+ | if ( index( $data, $FDATA{ $FDATAindex[$i] } ) > -1 ) { | ||
+ | $found = 1; | ||
+ | last; | ||
+ | } | ||
+ | elsif ( $FDATAindex[$i] == 1 || $FDATAindex[$i] == 5 ) { | ||
+ | |||
+ | # タイトルカナ検索 / 作者カナ検索 | ||
+ | my $n = int( $FDATAindex[$i] ) + 1; | ||
+ | $data = $array[$n]; | ||
+ | $data = lc($data); | ||
+ | if ( index( $data, $FDATA{ $FDATAindex[$i] } ) > -1 ) { | ||
+ | $found = 1; | ||
+ | last; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | elsif ( $FORM{ftype} eq " | ||
+ | |||
+ | # AND検索の場合は最初に不一致項目が出た時点で該当なしと判定 | ||
+ | $found = 1; | ||
+ | my $data; | ||
+ | for ( my $i = 0; $i <= $# | ||
+ | $data = $array[ $FDATAindex[$i] ]; | ||
+ | $data = lc($data); | ||
+ | |||
+ | # ISBNは-を削除 x、+、*はXとみなす | ||
+ | if ( $FDATAindex[$i] == 0 ) { | ||
+ | $data = & | ||
+ | } | ||
+ | if ( index( $data, $FDATA{ $FDATAindex[$i] } ) == -1 ) { | ||
+ | |||
+ | # タイトルカナ検索 / 作者カナ検索 | ||
+ | if ( $FDATAindex[$i] == 1 || $FDATAindex[$i] == 5 ) { | ||
+ | my $n = int( $FDATAindex[$i] ) + 1; | ||
+ | $data = $array[$n]; | ||
+ | $data = lc($data); | ||
+ | if ( index( $data, $FDATA{ $FDATAindex[$i] } ) == -1 ) | ||
+ | { | ||
+ | $found = 0; | ||
+ | last; | ||
+ | } | ||
+ | } | ||
+ | else { | ||
+ | $found = 0; | ||
+ | last; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | # 検索にヒットした場合 | ||
+ | if ($found) { | ||
+ | $count++; | ||
+ | |||
+ | if ( $minRec <= $count && $maxRec >= $count ) { | ||
+ | |||
+ | # ISBN | ||
+ | $array[0] =~ s/ | ||
+ | $array[0] =~ s/ | ||
+ | $array[0] =~ s/ | ||
+ | |||
+ | # チェックデジット計算 | ||
+ | my @num_splt = split( //, $array[0] ); # 1文字ずつ分割 | ||
+ | my $check = 0; | ||
+ | for ( my $i = 0; $i < 9; $i++ ) { | ||
+ | $check = $check + $num_splt[$i] * ( 10 - $i ); | ||
+ | } | ||
+ | $check = 11 - ( $check % 11 ); | ||
+ | if ( $check == 10 ) { | ||
+ | $check = " | ||
+ | } | ||
+ | elsif ( $check == 11 ) { | ||
+ | $check = 0; | ||
+ | } | ||
+ | |||
+ | # タイトル | ||
+ | $array[1] =~ s/"// | ||
+ | $array[1] = encode_entities( $array[1] ); | ||
+ | |||
+ | # 巻 | ||
+ | $array[4] =~ s/"// | ||
+ | if ( $array[4] eq "ONLY ONE" ) { | ||
+ | $array[4] = ""; | ||
+ | } | ||
+ | $array[4] = encode_entities( $array[4] ); | ||
+ | |||
+ | # 作者 | ||
+ | $array[5] =~ s/"// | ||
+ | $array[5] = encode_entities( $array[5] ); | ||
+ | |||
+ | # 発行所 | ||
+ | $array[12] =~ s/"// | ||
+ | $array[12] = encode_entities( $array[12] ); | ||
+ | |||
+ | # 一括画像ローカル保存プラグイン利用時は備考6を画像のURLとする | ||
+ | if ( length( $array[37] ) > 0 | ||
+ | && substr( $array[37], 1, 1 ) eq ":" | ||
+ | { | ||
+ | $array[37] = $array[66]; | ||
+ | } | ||
+ | |||
+ | # 画像がない場合 | ||
+ | if ( $array[37] eq "" | ||
+ | $array[37] = $NOIMAGE; | ||
+ | } | ||
+ | |||
+ | print "< | ||
+ | |||
+ | "<a href=\" | ||
+ | |||
+ | "<a href=\" | ||
+ | print "< | ||
+ | print "< | ||
+ | print "< | ||
+ | print "< | ||
+ | print "</ | ||
+ | print "</ | ||
+ | } | ||
+ | else { | ||
+ | $flg = 1; | ||
+ | } | ||
+ | $found = 0; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | close(FH); | ||
+ | |||
+ | if ( $count == 0 ) { | ||
+ | print "< | ||
+ | } | ||
+ | else { | ||
+ | |||
+ | "</ | ||
+ | } | ||
+ | |||
+ | print "< | ||
+ | print "< | ||
+ | if ( defined( $FDATA{0} ) && $FDATA{0} ne "" | ||
+ | |||
+ | "< | ||
+ | } | ||
+ | if ( defined( $FDATA{1} ) && $FDATA{1} ne "" | ||
+ | |||
+ | "< | ||
+ | } | ||
+ | if ( defined( $FDATA{5} ) && $FDATA{5} ne "" | ||
+ | |||
+ | "< | ||
+ | } | ||
+ | if ( defined( $FDATA{20} ) && $FDATA{20} ne "" | ||
+ | |||
+ | "< | ||
+ | } | ||
+ | print "< | ||
+ | print "< | ||
+ | print "</ | ||
+ | |||
+ | if ( $flg == 1 ) { | ||
+ | my $p = $FORM{page}; | ||
+ | my $maxPage = int( $count / $PAGE ); | ||
+ | if ( $count % $PAGE != 0 ) { | ||
+ | $maxPage++; | ||
+ | } | ||
+ | |||
+ | # 指定ページが範囲外の場合は先頭または最終ページにする | ||
+ | if ( $p < 1 ) { | ||
+ | $p = 1; | ||
+ | } | ||
+ | elsif ( $p > $maxPage ) { | ||
+ | $p = $maxPage; | ||
+ | } | ||
+ | |||
+ | print "< | ||
+ | |||
+ | if ( $p > 1 ) { | ||
+ | $FORM{page} = $p - 1; | ||
+ | print "<a href=\" | ||
+ | } | ||
+ | |||
+ | print "</ | ||
+ | print "< | ||
+ | |||
+ | if ( $p < $maxPage ) { | ||
+ | $FORM{page} = $p + 1; | ||
+ | print "<a href=\" | ||
+ | } | ||
+ | print "</ | ||
+ | |||
+ | print "< | ||
+ | for ( my $pagecount = 1; $pagecount <= $maxPage; $pagecount++ ) { | ||
+ | if ( $pagecount != $p ) { | ||
+ | |||
+ | "< | ||
+ | } | ||
+ | else { | ||
+ | print "< | ||
+ | } | ||
+ | } | ||
+ | print "</ | ||
+ | } | ||
+ | } | ||
+ | |||
+ | # | ||
+ | # ISBN変換 | ||
+ | # | ||
+ | sub isbn_change { | ||
+ | my $isbn = $_[0]; | ||
+ | |||
+ | # | ||
+ | $isbn =~ s/-//g; | ||
+ | $isbn =~ tr/ | ||
+ | return $isbn; | ||
+ | } | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | sub error { | ||
+ | my @msg = @_; | ||
+ | |||
+ | print "< | ||
+ | foreach my $i ( 0 .. $#msg ) { | ||
+ | print " | ||
+ | } | ||
+ | print "</ | ||
+ | } | ||
+ | </ | ||
+ | 因此,今后购买记录的文章应该就不会再出现了。 | ||
+ | |||
+ | {{tag> | ||
+ | 私书管理 | ||
+ | }} | ||
+ | |||
+ | ~~DISCUSSION~~ | ||
- | ~~DISCUSSION~ |