#!/usr/bin/perl use utf8; binmode(STDOUT, ":utf8"); # 魚楠の辞書CGI 1.0.0 Copyright 2013 ◆UOXJ7Oxg.I # H25.11.08 第一版 # 【できること】 # 見出し語検索 # 完全一致、前方一致、後方一致、部分一致 # 訳語検索 # 完全一致、前方一致、後方一致、部分一致 # 用例検索 # 全文検索 # 項目番号を指定して表示 # 単番、範囲指定 (a-b, a-, -b) # 編集 # 新規登録 # 【設置方法】 # 辞書ファイルとログファイルを用意して下記の設定を書き換えてパーミッションを適切に指定します。 # 【注意】 # Windows で UTF-8 のファイルを編集するとファイルの先頭に BOM というデータが付きサーバによってはエラーになることがあります。 # そんなときは debomater をどうぞ。 # http://pc8.sakura.ne.jp/software/debomater/ # 【設定】 # 編集用パスワード $epass = 'abcd1234'; # 辞書ファイル $src = './klel.txt'; # 編集履歴記録ファイル $log = './log.txt'; # 編集履歴の保存件数 $logmax = 100; # 各種区切り文字 # 1-1 見出し語開始タグ $istart = '[['; # 1-2 見出し語終了タグ $iend = ']]'; # 2-1 訳語開始タグ $tstart = '{{'; # 2-2 訳語終了タグ $tend = '}}'; # 2-3 検索用訳語仕切り文字 $splitter = '{}'; # 2-4 表示用訳語仕切り文字 $separator = ', '; # 3-1 用例開始タグ $ustart = '(('; # 3-2 用例終了タグ $uend = '))'; # 4-1 改行置換文字 $br = '<>'; # 5-1 編集欄の行数 $erows = 20; # 5-2 編集欄の幅 $ecols = 80; # 5-3 編集欄の書式※ #ENTRY には見出し語が入ります。 $format = <<"_FORMAT_"; $istart#ENTRY$iend [訳語] $tstart $tend $br [用例] $ustart $uend _FORMAT_ if ($ENV{'REQUEST_METHOD'} eq 'POST') { read (STDIN, $QUERY, $ENV{'CONTENT_LENGTH'}); } else { $QUERY = $ENV{'QUERY_STRING'}; } @PARTS = split (/&/, $QUERY); foreach (@PARTS) { local ($variable, $value) = split(/=/); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack('H2', $1)/eg; utf8::decode($value); $VAR{$variable} = $value; } $arg = $VAR{'arg'}; $what = $VAR{'what'}; $how = $VAR{'how'}; $text = $VAR{'text'}; $pass = $VAR{'pass'}; $what = 0 if (($what < 0) or ($what > 7)); $how = 0 if (($how < 0) or ($how > 3)); @ch1 = ('', '', '', '', ''); @ch2 = ('', '', '', ''); if ($what > 4) { $ch1[0] = 'checked'; } else { $ch1[$what] = ' checked'; } $ch2[$how] = ' checked'; if ($arg) { @lines = undef; if (open(IN, "<$src")) { @lines = ; close(IN); } foreach (@lines) { utf8::decode($_); } @result = (); $key = ''; if ($what == 0) { if ($how == 0) { $key = quotemeta($istart . $arg . $iend); } elsif ($how == 1) { $key = quotemeta($istart) . "(.*)" . quotemeta($arg) . "(.*)" . quotemeta($iend); } elsif ($how == 2) { $key = quotemeta($istart . $arg); } elsif ($how == 3) { $key = quotemeta($arg . $iend); } foreach $line (@lines) { if ($line =~ m/$key/) { push(@result, $line); } } if ((@result < 1) and ($how == 0)) { $what = 5; #$text = $istart . "\n" . $arg . "\n" . $iend . "\n" . $tstart . "\n" . $tend . "\n" . $ustart . "\n" . $uend; $text = $format; $text =~ s/#ENTRY/$arg/g; } elsif (@result == 1) { $result[0] =~ m/\Q$istart\E(.+)\Q$iend\E/; $result[0] .= "$br$1 を編集"; } } elsif ($what == 1) { if ($how == 0) { $key = "(" . quotemeta($tstart ). "|" . quotemeta($splitter) . ")" . quotemeta($arg) . "(" . quotemeta($splitter) . "|" . quotemeta($tend) . ")"; } elsif ($how == 1) { $key = "(" . quotemeta($tstart ). "|" . quotemeta($splitter) . ").*" . quotemeta($arg) . ".*(" . quotemeta($splitter) . "|" . quotemeta($tend) . ")"; } elsif ($how == 2) { $key = "(" . quotemeta($tstart ). "|" . quotemeta($splitter) . ")" . quotemeta($arg); } elsif ($how == 3) { $key = quotemeta($arg) . "(" . quotemeta($splitter) . "|" . quotemeta($tend) . ")"; } foreach $line (@lines) { if ($line =~ m/$key/) { push(@result, $line); } } if (@result == 1) { $result[0] =~ m/\Q$istart\E(.+)\Q$iend\E/; $result[0] .= "$br$1 を編集"; } } elsif ($what == 2) { foreach $line (@lines) { if ($line =~ m/\Q$ustart\E.*?\Q$arg\E.*?\Q$uend\E/) { push(@result, $line); } } if (@result == 1) { $result[0] =~ m/\Q$istart\E(.+)\Q$iend\E/; $result[0] .= "$br$1 を編集"; } } elsif ($what == 3) { foreach $line (@lines) { if ($line =~ m/\Q$arg\E/) { push(@result, $line); } } if (@result == 1) { $result[0] =~ m/\Q$istart\E(.+)\Q$iend\E/; $result[0] .= "$br$1 を編集"; } } elsif ($what == 4) { if ($arg =~ m/(\d+)-(\d+)/) { for ($i = $1 - 1; $i < $2; $i ++) { push(@result, $lines[$i]); } } elsif ($arg =~ m/(\d+)-/) { for ($i = $1 - 1; $i <= $#lines; $i ++) { push(@result, $lines[$i]); } } elsif ($arg =~ m/-(\d+)/) { for ($i =0; $i < $1; $i ++) { push(@result, $lines[$i]); } } elsif ($arg =~ m/(\d+)/) { push(@result, $lines[$1 - 1]); } if (@result == 1) { $result[0] =~ m/\Q$istart\E(.+)\Q$iend\E/; $result[0] .= "$br$1 を編集"; } } elsif ($what == 5) { $key = quotemeta($istart . $arg . $iend); foreach $line (@lines) { if ($line =~ m/$key/) { $text = $line; $text =~ s/\Q$istart\E/$istart\n/; $text =~ s/\Q$iend\E/\n$iend\n/; $text =~ s/\Q$tstart\E/\n$tstart\n/; $text =~ s/\Q$tend\E/\n$tend\n/; $text =~ s/\Q$splitter\E/\n/g; $text =~ s/\Q$ustart\E/\n$ustart\n/; $text =~ s/\Q$uend\E/\n$uend\n/; $text =~ s/\Q$br\E/$br\n/g; } } } elsif ($what == 6) { unless ($pass eq $epass) { $what = 5; } else { $etext = $text; $etext =~ s/\Q$tend\E(.*)(\r\n|\r|\n)/$tend$1/g; $etext =~ s/(\r\n|\r|\n)\Q$tend\E/$tend/; $etext =~ s/\Q$tstart\E(\r\n|\r|\n)/$tstart/; $etext =~ s/\Q$tstart\E(.*)(\r\n|\r|\n)/$tstart$1$splitter/g; $etext =~ s/(\r\n|\r|\n)//g; } } elsif ($what == 7) { $key = quotemeta($istart . $arg . $iend); $old = ''; foreach $line (@lines) { if ($line =~ m/$key/) { $old = $line; $new = $text . "\n"; $line = $new; } } unless ($old) { $new = $text . "\n"; push(@lines, $new); @lines = sort(@lines); } if (open(OUT, ">$src")) { print(OUT @lines); close(OUT); if (open(IN, "<$log")) { @lines = ; foreach (@lines) { utf8::decode($_); } unshift(@lines, ($new, $old)); splice(@lines, $logmax * 2); if (open(OUT, ">$log")) { print(OUT @lines); close(OUT); } } $what = 0; $new .= "$br$arg を編集"; push(@result, $new); } } foreach $line (@result) { $line =~ s/\Q$istart\E(.+?)\Q$iend\E/$1<\/a>/; $line =~ s/\Q$istart\E//g; $line =~ s/\Q$iend\E//g; $line =~ s/\Q$tstart$splitter\E/$tstart/g; $line =~ s/\Q$tstart//g; $line =~ s/\Q$splitter$tend\E/$tend/g; $line =~ s/\Q$tend\E//g; $line =~ s/\Q$splitter\E/$separator/g; $line =~ s/\Q$ustart\E//g; $line =~ s/\Q$uend\E//g; $line =~ s/\Q$br\E/
/g; } } print "Content-type: text/html\n\n"; print <<"_HEAD_"; 辞書

辞書


見出し語 訳語 用例 全文 項目番号
完全一致 部分一致 前方一致 後方一致

_HEAD_ if ($what == 5) { print <<"_EDIT_";


パスワード:

_EDIT_ } elsif ($what == 6) { print <<"_EDIT_";



パスワード:

_EDIT_ } else { foreach (@result) { print "

" . $_ . "

"; } } print <<"_FOOT_"; _FOOT_ __END__