差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

后一修订版两侧同时换到之后的修订记录
blog:archives:2675 [2017/11/03 12:25] – 外部编辑 127.0.0.1blog:archives:2675 [2019/09/14 12:59] 管理员
行 1: 行 1:
-111+====== 资料管理软件私本管理Plus ====== 
 +最近开始使用[[http://ekakin.la.coocan.jp/|私本管理Plus]]进行罗德斯收集物的管理(包括但不仅限于书籍)。 
 + 
 +其能够实现的功能,已经非常接近自己所期望的管理效果了。 
 + 
 +=====  ===== 
 +并且通过私本管理GOOUT还可以将资料同步到web上,实在是很方便。 
 + 
 +<del>不过由于用到的是CGI程序,并且联动的是不支持UTF-8的jcode.pl,所以对中文的支持不好。希望可以慢慢改进吧。</del>感谢shela提供了支持UTF-8的修改版本,现在没有该问题了。 
 + 
 +<blockquote>[8255] Re: 要望 投稿者:shela 投稿日:2017/11/12(Sun) 23:08 
 + 
 +GOOUTのUTF8対応ですが、私が改造したものでよければ(添付ファイル)どうぞ。\\  
 +ファイル名はsearch.cgiに変更してください。特殊なモジュールは使っていないはずなのでPerl 5.8.1以上の環境であればおそらく動くと思います。\\  
 +また、私本管理でCSVファイルを作成する際、文字コードをUTF8またはUNICODEで保存してください。 
 + 
 +添付:[[http://ekakin.la.coocan.jp/cgi/bbs01/img/8255.txt|8255.txt]] (24KB)</blockquote> 
 + 
 +<file txt 8255.txt> 
 +#!/usr/bin/perl 
 + 
 +#----------------------------------------------------------- 
 +#   私本管理GOOUT for SmartPhone  By:EKAKIN 
 +#----------------------------------------------------------- 
 +
 +#----------------------------------------------------------- 
 +#   動作環境 
 +#----------------------------------------------------------- 
 +#  Perl 5.8.1 以降。 
 +#  Perl 5.8.0 は文字コードの扱いに問題があるため、 
 +#  文字化けを起こす等の不具合が発生する可能性があります 
 +#  なお、jcode.plは使用しなくなりました 
 +#----------------------------------------------------------- 
 +
 +#----------------------------------------------------------- 
 +#   改版履歴 
 +#----------------------------------------------------------- 
 +#2015.01.10 Ver2.1.0    modified by shela 
 +#           私本管理 Ver.4のバックアップデータ(*.shn,*.csv)に対応 
 +#           ISBNのチェックディジット計算のバグ修正 
 +#           バックアップデータのヘッダ行を無視するように修正 
 +#           一括画像ローカル保存プラグインに対応 
 +#2015.01.10 Ver2.0.1    検索時、特定の文字列が文字化けして正しく検索できない不具合を修正 
 +# 画像が正しく表示されない不具合を修正 
 +#2011.08.07 Ver2.0.0    改名 
 +#           UI変更 
 +#2010.08.11 Ver1.0.0    公開 
 +#           【Thank you for kmzw】 
 +#----------------------------------------------------------- 
 + 
 +use strict; 
 +use utf8; 
 +use CGI qw/:standard :netscape/; 
 +use Encode qw/decode_utf8/; 
 +use HTML::Entities qw/encode_entities/; 
 + 
 +my $TITLE       = "私本管理GOOUT";      # タイトル 
 +my $VERSION     = "Ver 2.1.0";              # バージョン 
 +my $SCRIPT_NAME = "$ENV{'SCRIPT_NAME'}";    # CGIファイル名 
 + 
 +#----------------------------------------------------------- 
 +#   カスタマイズ 
 +#----------------------------------------------------------- 
 +my $PAGE = 20;                              # 1ページに表示する件数 
 + 
 +# 「No Image」画像の場所を指定します 
 +# cgiと同じ場所の場合は「noimage.jpg」と指定します 
 +# @niftyの場合は「http://homepage○.nifty.com/○○○/ディレクトリ/noimage.jpg」で指定します 
 +# ↓このままでも使用できますが、変更される可能性があります 
 +my $NOIMAGE = "http://homepage1.nifty.com/EKAKIN/cgi/goout/noimage.jpg"; 
 + 
 +# For iPhone 
 +my $ICON_PATH = "http://homepage1.nifty.com/EKAKIN/cgi/goout/iphone_icon.png"; 
 + 
 +my $LINK_URL = "http://www.amazon.co.jp/gp/aw/d/"; 
 + 
 +my $AMAZON_TAG = ""; 
 + 
 +#----------------------------------------------------------- 
 +#   検索ファイル名(フォルダと対になるように追加してください) 
 +#----------------------------------------------------------- 
 +my @FILE = ( "123.csv" ); 
 + 
 +#----------------------------------------------------------- 
 +#   検索フォルダ名(ファイルと対になるように追加してください) 
 +#----------------------------------------------------------- 
 +my @DIR = ( "デフォルト" ); 
 + 
 +#=========================================================== 
 +#   実行処理 
 +#=========================================================== 
 +my %FORM       = (); 
 +my %FDATA      = (); 
 +my @FDATAindex = (); 
 + 
 +# フラグ付きUTF-8文字列をフラグなしにして出力させる 
 +binmode STDOUT, ":utf8"; 
 + 
 +# フォームの内容取得 
 +&formDataGet; 
 + 
 +if ( $ENV{'REQUEST_METHOD'} eq "POST" 
 +    || defined( $FORM{page} ) && $FORM{page} ne ""
 +
 + 
 +    # 検索結果画面表示 
 +    &htmlResult; 
 +
 +else { 
 + 
 +    # 検索画面表示 
 +    &htmlStart; 
 +
 + 
 +exit; 
 + 
 +#----------------------------------------------------------- 
 +#   検索画面表示 
 +#----------------------------------------------------------- 
 +sub htmlStart { 
 +    &htmlHeader01; 
 +    &htmlSearch;    # 検索画面 
 +    &htmlFooter01; 
 +
 + 
 +#----------------------------------------------------------- 
 +#   検索結果表示 
 +#----------------------------------------------------------- 
 +sub htmlResult { 
 +    &htmlHeader02; 
 +    &runSearch;     # 検索処理 
 +    &htmlFooter02; 
 +
 + 
 +#----------------------------------------------------------- 
 +#   スタイルシート 
 +#----------------------------------------------------------- 
 +sub Style { 
 +    print <<"_EOF_"; 
 +<style type="text/css"> 
 + 
 +  /* body 初期設定 */ 
 + 
 +    body { 
 +      background: rgb(197,204,211); 
 +      font-family: Helvetica; 
 +      margin: 0; 
 +      padding: 0; 
 +      -webkit-user-select: none; 
 +      -webkit-text-size-adjust: none; 
 +    } 
 + 
 +  /* a 初期設定 */ 
 + 
 +    a { 
 +      font: 14px Helvetica; 
 +      color: #42688e; 
 +      text-decoration: none; 
 +    } 
 + 
 +    a:hover, a:active { 
 +      color: #ff0066; 
 +      text-decoration: none; 
 +    } 
 + 
 +  /* Center文字列初期設定 */ 
 +    div.center { 
 +      text-align: center; 
 +      margin: 4px 0; 
 +      padding: 0; 
 +      clear: both; 
 +    } 
 + 
 +  /* header 設定 */ 
 + 
 +    div#header { 
 +      background: rgb(109,133,163) repeat-x top; 
 +      border-top: 1px solid rgb(205,213,223); 
 +      border-bottom: 1px solid rgb(46,55,68); 
 +      padding: 5px; 
 +      margin: 0; 
 +      min-height: 44px; 
 +      -webkit-box-sizing: border-box; 
 +    } 
 + 
 +    div#header h1 { 
 +      color: #fff; 
 +      font: bold 18px/30px Helvetica; 
 +      text-shadow: #2d3642 0 -1px 0; 
 +      text-align: center; 
 +      text-overflow: ellipsis; 
 +      white-space: nowrap; 
 +      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: #2d3642 0 -1px 0; 
 +      text-align: center; 
 +      width: 38px; 
 +      border-width: 0 8px 0 14px; 
 +      border:1px solid #263a51; 
 +      padding: 5px 0; 
 +      display: block; 
 +      position: absolute; 
 +      margin-top: -40px; 
 +      background: #42688e; 
 +      -webkit-border-radius: 4px; 
 +    } 
 + 
 +  /* 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: 8px; 
 +    } 
 + 
 +    ul li { 
 +      color: #666; 
 +      border-top: 1px solid #B4B4B4; 
 +      list-style-type: none; 
 +      padding: 10px; 
 +    } 
 + 
 +    li:first-child { 
 +      border-top: 0; 
 +      -webkit-border-top-left-radius: 8px; 
 +      -webkit-border-top-right-radius: 8px; 
 +    } 
 + 
 +    li:last-child { 
 +      -webkit-border-bottom-left-radius: 8px; 
 +      -webkit-border-bottom-right-radius: 8px; 
 +    } 
 + 
 + 
 +  /* form 設定 */ 
 + 
 +    ul#form li { 
 +      padding: 7px 10px; 
 +      text-align: center; 
 +      vertical-align: middle; 
 +    } 
 + 
 +    ul#form li input[type="text"], ul li select { 
 +      color: #777; 
 +      background: #fff; 
 +      border: 0; 
 +      font: normal 17px Helvetica; 
 +      padding: 0; 
 +      display: inline-block; 
 +      margin-left: 0px; 
 +      width: 50%; 
 +      -webkit-appearance: textarea; 
 +    } 
 + 
 +    ul#form li select { 
 +      text-indent: 0px; 
 +      background: transparent no-repeat 100% 3px; 
 +      -webkit-appearance: textfield; 
 +      margin-left: -6px; 
 +      width: 50%; 
 +    } 
 + 
 +    ul#form li input[type="submit"] { 
 +      width: 44%; 
 +      height : 30px; 
 +    } 
 + 
 +    ul#form li.left { 
 +      float: left; 
 +    } 
 + 
 +    ul#form li.right { 
 +      float: right; 
 +    } 
 + 
 + 
 +  /* result 設定 */ 
 + 
 +    ul#result li.img { 
 +      height:80px; 
 +      padding-left: 100px; 
 +    } 
 + 
 +    ul#result img.img { 
 +      display: inline-block; 
 +      width: 60px; 
 +      height:80px; 
 +      margin: 0 0 0 -75px; 
 +      float: left; 
 +      -moz-background-size: cover; 
 +      background-size: cover; 
 +      -webkit-border-radius: 0; 
 +      background: #F4FBFE; 
 +      padding: 0; 
 +    } 
 + 
 +    ul#result div { 
 +      color: #000; 
 +      font: 14px Helvetica; 
 +      text-overflow: ellipsis; 
 +      white-space: nowrap; 
 +      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: 0; 
 +      width: 33%; 
 +      float: left; 
 +      margin: 0; 
 +      padding: 2px 0 0 0; 
 +    } 
 + 
 +    ul#nextpage li.center { 
 +      border: 0; 
 +      -webkit-border-radius: 0; 
 +      width: 34%; 
 +      float: left; 
 +      margin: 0; 
 +      padding: 11px 0; 
 +    } 
 + 
 +    ul#nextpage li.right { 
 +      border: 0; 
 +      -webkit-border-radius: 0; 
 +      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: 0; 
 +      text-align: center; 
 +    } 
 + 
 +    ul#pages li.now { 
 +      border: 1px solid #C0D5DD; 
 +      -webkit-border-radius: 0; 
 +      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: 0; 
 +      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; 
 +    } 
 + 
 +</style> 
 +_EOF_ 
 +
 + 
 +#----------------------------------------------------------- 
 +#   HTML ヘッダ初期 
 +#----------------------------------------------------------- 
 +sub htmlHeader01 { 
 +    print "Content-type: text/html\n\n"; 
 +    print <<"_EOF_"; 
 +<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.1//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile11.dtd"> 
 +<html> 
 +<head> 
 +<title>$TITLE</title> 
 +<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> 
 +<meta id="viewport" name="viewport" content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" /> 
 +<link rel="apple-touch-icon" href="$ICON_PATH" /> 
 +_EOF_ 
 + 
 +    &Style; 
 + 
 +    print <<"_EOF_"; 
 +</head> 
 +<body> 
 +<div id="header"> 
 +  <h1>$TITLE</h1> 
 +</div> 
 + 
 +_EOF_ 
 +
 + 
 +#----------------------------------------------------------- 
 +#   HTML ヘッダ検索後 
 +#----------------------------------------------------------- 
 +sub htmlHeader02 { 
 +    print "Content-Type: text/html\n\n"; 
 +    print <<"_EOF_"; 
 +<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.1//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile11.dtd"> 
 +<html> 
 +<head> 
 +<title>$TITLE</title> 
 +<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> 
 +<meta id="viewport" name="viewport" content="width=320; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;" /> 
 +<link rel="apple-touch-icon" href="$ICON_PATH" /> 
 +<script type="text/javascript"> 
 +  function send(page) { 
 +    var form = document.forms[0]; 
 +    form.page.value = page; 
 +    form.submit(); 
 +  } 
 +</script> 
 +_EOF_ 
 + 
 +    &Style; 
 + 
 +    print <<"_EOF_"; 
 +</head> 
 +<body> 
 +<div id="header"> 
 +  <h1>$TITLE</h1> 
 +  <a href="$SCRIPT_NAME" id="backButton">検索</a> 
 +</div> 
 +_EOF_ 
 +
 + 
 +#----------------------------------------------------------- 
 +#   HTML フッタ初期 
 +#----------------------------------------------------------- 
 +sub htmlFooter01 { 
 +    print << "_EOF_"; 
 +<div class="center"><a href="http://homepage1.nifty.com/EKAKIN" target="_blank">EKAKIN'S SCRIBBLE PAGE</a></div> 
 +</body> 
 +</html> 
 +_EOF_ 
 +
 + 
 +#----------------------------------------------------------- 
 +#   HTML フッタ検索後 
 +#----------------------------------------------------------- 
 +sub htmlFooter02 { 
 +    print << "_EOF_"; 
 +</body> 
 +</html> 
 +_EOF_ 
 +
 + 
 +#----------------------------------------------------------- 
 +#   HTML 検索画面 
 +#----------------------------------------------------------- 
 +sub htmlSearch { 
 +    print <<"_EOF_"; 
 +<form method="post" action="$SCRIPT_NAME" class="tcardform"> 
 + 
 +<ul id="form"> 
 +  <li>ジャンル選択&nbsp;&nbsp; 
 +    <select name="file"> 
 +_EOF_ 
 + 
 +    for ( my $i = 0; $i <= $#FILE; $i++ ) { 
 +        my $genre = encode_entities( $DIR[$i] ); 
 +        if ( defined( $FORM{file} ) && $i eq $FORM{file} ) { 
 +            print "<option value=\"$i\" selected>$genre</option>\n"; 
 +        } 
 +        else { 
 +            print "<option value=\"$i\">$genre</option>\n"; 
 +        } 
 +    } 
 + 
 +    print <<"_EOF_"; 
 +    </select>&rsaquo; 
 +  </li> 
 +  <li>購入/未購入&nbsp;&nbsp;&nbsp;&nbsp; 
 +    <select name="data20"> 
 +_EOF_ 
 +    my @Purchase = ( "", "購入", "未購入", "その他" ); 
 +    for ( my $i = 0; $i <= $#Purchase; ++$i ) { 
 +        if ( defined( $FDATA{20} ) && $Purchase[$i] eq $FDATA{20} ) { 
 +            print 
 +                "<option value=\"$Purchase[$i]\" selected>$Purchase[$i]</option>"; 
 +        } 
 +        else { 
 +            print "<option value=\"$Purchase[$i]\">$Purchase[$i]</option>"; 
 +        } 
 +    } 
 +    print <<"_EOF_"; 
 +    </select>&rsaquo; 
 +  </li> 
 +  <li>ISBN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
 +    <input type="text" name="data0" mode="numeric" istyle="4" size="18" maxlength="13" value="$FDATA{0}" />&nbsp;</li> 
 +  <li>タイトル&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
 +    <input type="text" name="data1" class="tcardtext" mode="hiragana" istyle="1" size="18" value="$FDATA{1}" />&nbsp;</li> 
 +  <li>作者&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
 +    <input type="text" name="data5" class="tcardtext" mode="hiragana" istyle="1" size="18" value="$FDATA{5}" />&nbsp;</li> 
 +_EOF_ 
 +    if ( defined( $FORM{ftype} ) && $FORM{ftype} eq "or" ) { 
 +        print 
 +            "<li><input type=\"radio\" name=\"ftype\" value=\"or\" checked />OR&nbsp;&nbsp;"; 
 +        print 
 +            "<input type=\"radio\" name=\"ftype\" value=\"and\" />AND"; 
 +    } 
 +    else { 
 +        print 
 +            "<li><input type=\"radio\" name=\"ftype\" value=\"or\" />OR&nbsp;&nbsp;"; 
 +        print 
 +            "<input type=\"radio\" name=\"ftype\" value=\"and\" checked />AND"; 
 +    } 
 +    print <<"_EOF_"; 
 +  &nbsp;&nbsp;<input type="submit" value="検索" class="tcardsubmit" /></li> 
 +</ul> 
 +</form> 
 + 
 +<div class="center"> 
 +</div> 
 +_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 "0" ) { 
 + 
 +                # ISBN 
 +                $FDATA{$index} = &isbn_change($value); 
 +            } 
 +            else { 
 + 
 +                # ISBN以外は小文字にして保持 
 +                $FDATA{$index} = lc($value); 
 +            } 
 + 
 +            unless ( $FDATA{$index} eq "" ) { 
 +                push( @FDATAindex, $index ); 
 +            } 
 +        } 
 +        else { 
 + 
 +            # ジャンル、検索タイプ(AND/OR)、ページ 
 +            $FORM{$key} = $value; 
 +        } 
 +    } 
 +
 + 
 +#----------------------------------------------------------- 
 +#   検索処理 
 +#----------------------------------------------------------- 
 +sub runSearch { 
 + 
 +    # ファイルの読み込み 
 +    if ( !open( FH, "<:raw", $FILE[ $FORM{file} ] ) ) { 
 +        &error( "エラー", 
 +            "私本管理バックアップファイルが読み込めません" 
 +        ); 
 +        return; 
 +    } 
 + 
 +    # 初期ページを設定 
 +    if ( !defined( $FORM{page} ) || $FORM{page} eq "" ) { 
 +        $FORM{page} = 1; 
 +    } 
 + 
 +    my $maxRec = $FORM{page} * $PAGE;    # 表示レコード MAX 
 +    my $minRec = $maxRec - $PAGE + 1;    # 表示レコード MIN 
 + 
 +    print "<ul id=\"result\">\n"; 
 + 
 +    my ( $codeSet, $offset ); 
 +    my $count = 0; 
 +    my $flg   = 0; 
 + 
 +    while ( my $line = <FH> ) { 
 + 
 +        if ( $. == 1 ) { 
 +            if ( $line =~ s/^\xEF\xBB\xBF// ) { 
 +                $codeSet = "utf8"; 
 +                $offset  = 3; 
 +            } 
 +            elsif ( $line =~ s/^\xFF\xFE// ) { 
 +                $codeSet = "utf16le"; 
 +                $offset  = 2; 
 +            } 
 +            else { 
 +                $codeSet = "cp932"; 
 +                $offset  = 0; 
 +            } 
 + 
 +            # BOMを除いた先頭へ戻って読み直し 
 +            seek( FH, $offset, 0 ); 
 +            binmode FH, "encoding($codeSet):crlf:utf8"; 
 +            $line = <FH>; 
 +        } 
 + 
 +        chomp($line);    # 改行を取り除く 
 + 
 +        # 「,」区切りでCSVファイル1行読込 
 +        my @array = split( ",", $line ); 
 + 
 +        # ヘッダ行を読み飛ばす 
 +        if ( $array[0] eq "ISBN" ) { 
 +            next; 
 +        } 
 + 
 +        my $found = 0; 
 + 
 +        # 検索 
 +        if ( $#FDATAindex == -1 ) { 
 + 
 +            # 検索項目が未入力の場合は該当ありと判定 
 +            $found = 1; 
 +        } 
 +        elsif ( $FORM{ftype} eq "or" ) { 
 + 
 +            # OR検索の場合は最初に一致項目が出た時点で該当ありと判定 
 +            $found = 0; 
 +            my $data; 
 +            for ( my $i = 0; $i <= $#FDATAindex; $i++ ) { 
 +                $data = $array[ $FDATAindex[$i] ]; 
 +                $data = lc($data); 
 + 
 +                # ISBNは-を削除 x,+,*はXとみなす 
 +                if ( $FDATAindex[$i] == 0 ) { 
 +                    $data = &isbn_change($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" ) { 
 + 
 +            # AND検索の場合は最初に不一致項目が出た時点で該当なしと判定 
 +            $found = 1; 
 +            my $data; 
 +            for ( my $i = 0; $i <= $#FDATAindex; $i++ ) { 
 +                $data = $array[ $FDATAindex[$i] ]; 
 +                $data = lc($data); 
 + 
 +                # ISBNは-を削除 x、+、*はXとみなす 
 +                if ( $FDATAindex[$i] == 0 ) { 
 +                    $data = &isbn_change($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/-//g;          # ハイフンを除去 
 +                $array[0] =~ s/^978|^979//g;    # 先頭に978か979があれば(ISBN13)除去 
 +                $array[0] =~ s/.$//g;    # チェックデジット除去 
 + 
 +                # チェックデジット計算 
 +                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 = "X"; 
 +                } 
 +                elsif ( $check == 11 ) { 
 +                    $check = 0; 
 +                } 
 + 
 +                # タイトル 
 +                $array[1] =~ s/"//g; 
 +                $array[1] = encode_entities( $array[1] ); 
 + 
 +                # 巻 
 +                $array[4] =~ s/"//g; 
 +                if ( $array[4] eq "ONLY ONE" ) { 
 +                    $array[4] = ""; 
 +                } 
 +                $array[4] = encode_entities( $array[4] ); 
 + 
 +                # 作者 
 +                $array[5] =~ s/"//g; 
 +                $array[5] = encode_entities( $array[5] ); 
 + 
 +                # 発行所 
 +                $array[12] =~ s/"//g; 
 +                $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 "<li class=\"img\">"; 
 +                print 
 +                    "<a href=\"$LINK_URL$array[0]$check/&tag=$AMAZON_TAG\"><img src=\"$array[37]\" class=\"img\" /></a>"; 
 +                print 
 +                    "<a href=\"$LINK_URL$array[0]$check/&tag=$AMAZON_TAG\">"; 
 +                print "<div>$array[1] $array[4]</div>"; 
 +                print "<div>$array[5]</div>"; 
 +                print "<div>$array[12]</div>"; 
 +                print "<div>ISBN:$array[0]$check</div>"; 
 +                print "</a>"; 
 +                print "</li>\n"; 
 +            } 
 +            else { 
 +                $flg = 1; 
 +            } 
 +            $found = 0; 
 +        } 
 +    } 
 + 
 +    close(FH); 
 + 
 +    if ( $count == 0 ) { 
 +        print "<div class=\"center\">該当データなし</div></ul>\n"; 
 +    } 
 +    else { 
 +        print 
 +            "</ul>\n<div class=\"center\">該当データ:${count}件</div>\n"; 
 +    } 
 + 
 +    print "<form action=\"$SCRIPT_NAME\" method=\"post\">\n"; 
 +    print "<input type=\"hidden\" name=\"file\" value=\"$FORM{file}\" />\n"; 
 +    if ( defined( $FDATA{0} ) && $FDATA{0} ne "" ) { 
 +        print 
 +            "<input type=\"hidden\" name=\"data0\" value=\"$FDATA{0}\" />\n"; 
 +    } 
 +    if ( defined( $FDATA{1} ) && $FDATA{1} ne "" ) { 
 +        print 
 +            "<input type=\"hidden\" name=\"data1\" value=\"$FDATA{1}\" />\n"; 
 +    } 
 +    if ( defined( $FDATA{5} ) && $FDATA{5} ne "" ) { 
 +        print 
 +            "<input type=\"hidden\" name=\"data5\" value=\"$FDATA{5}\" />\n"; 
 +    } 
 +    if ( defined( $FDATA{20} ) && $FDATA{20} ne "" ) { 
 +        print 
 +            "<input type=\"hidden\" name=\"data20\" value=\"$FDATA{20}\" />\n"; 
 +    } 
 +    print "<input type=\"hidden\" name=\"ftype\" value=\"$FORM{ftype}\" />\n"; 
 +    print "<input type=\"hidden\" name=\"page\" />\n"; 
 +    print "</form>\n"; 
 + 
 +    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 "<ul id=\"nextpage\"><li class=\"left\">"; 
 + 
 +        if ( $p > 1 ) { 
 +            $FORM{page} = $p - 1; 
 +            print "<a href=\"javascript:send('$FORM{page}')\"><</a>"; 
 +        } 
 + 
 +        print "</li><li class=\"center\">$p\/$maxPage</li>"; 
 +        print "<li class=\"right\">"; 
 + 
 +        if ( $p < $maxPage ) { 
 +            $FORM{page} = $p + 1; 
 +            print "<a href=\"javascript:send('$FORM{page}')\">></a>"; 
 +        } 
 +        print "</li></ul>\n"; 
 + 
 +        print "<ul id=\"pages\">\n"; 
 +        for ( my $pagecount = 1; $pagecount <= $maxPage; $pagecount++ ) { 
 +            if ( $pagecount != $p ) { 
 +                print 
 +                    "<li class=\"other\"><a href=\"javascript:send('$pagecount')\">$pagecount</a></li>\n"; 
 +            } 
 +            else { 
 +                print "<li class=\"now\">$pagecount</li>\n"; 
 +            } 
 +        } 
 +        print "</ul>\n"; 
 +    } 
 +
 + 
 +#----------------------------------------------------------- 
 +#  ISBN変換 
 +#----------------------------------------------------------- 
 +sub isbn_change { 
 +    my $isbn = $_[0]; 
 + 
 +    #ISBNは-を削除 x、+、*はXとみなす 
 +    $isbn =~ s/-//g; 
 +    $isbn =~ tr/+*x/X/; 
 +    return $isbn; 
 +
 + 
 +#----------------------------------------------------------- 
 +#   エラーメッセージ 
 +#----------------------------------------------------------- 
 +sub error { 
 +    my @msg = @_; 
 + 
 +    print "<ul id=\"result\">"; 
 +    foreach my $i ( 0 .. $#msg ) { 
 +        print "$msg[$i]<br />\n"; 
 +    } 
 +    print "</ul>\n"; 
 +
 +</file> 
 +因此,今后购买记录的文章应该就不会再出现了。 
 + 
 +{{tag> 
 +私书管理 
 +}} 
 + 
 +~~DISCUSSION~~
  
-~~DISCUSSION~ 
  • 最后更改: 2023/10/03 20:35