「attach」で,添付したファイルを表示する「#ref」プラグインをページ末に自動的に付記する
- ページに「添付」コマンド,つまり「attach」プラグインを用いて画像ファイルなどを添付する際は,そのページにその画像(や非画像添付ファイルへのリンク)を表示することが目的である場合がほとんど。
- でも,pyukiwikiでは添付作業とページ編集作業は別なので,ブログページなどで画像を貼り付けようと思った場合は,次のような面倒な手順が必要。
- 一旦「添付」(attach)で画像を添付し,
- その添付ファイル名を(クリップボードに)記憶しておいて,
- 次いでそのページの編集(「edit」)モードにして,
- 前記記憶したファイル名を「#ref」プラグインの()内に書き,
- プレビューで画像の表示サイズを確認し,大き(小さ)すぎる場合は
- 「#ref」プラグインに適当に表示倍率を設定し,
- v.,vi.を繰り返す
- で,この面倒さを一気に解消すべく,「attach」プラグインを改造してみることに。
まずは「attach.inc.pl」本体の改造
「#ref」行をページ末尾に自動挿入する処理の追加
- ファイルのアップロード処理を行う「sub attach_upload」ルーチン内の「close FILE;」の手前あたりに,画像添付時に添付したファイルのファイル名がセットされた「#ref」行をページ末尾に自動挿入する処理を加えてみます
#----------------------------------------------
my $lines = $::database{$::form{mypage}};
my $is_image = ($ffile =~ /\.(gif|png|jpe?g)$/i);
my $zoom_w = 100;
my $zoom_h = 100;
my $zoom = '';
my $width = 0;
my $height = 0;
if ($is_image) {
##----画像ファイルの場合,画像のサイズを取得して,縦も横も500ピクセルを超えないように倍率を設定------
($width, $height) = getimagesize_attach($ffile, $obj->{basename}); #画像サイズを取得
if ($width > 500) {
$zoom_w = 500 / $width * 100;
}
if ($height > 500) {
$zoom_h = 500 / $height * 100;
}
if ($zoom_w < $zoom_h) {
$zoom = $zoom_w . '%';
} else {
$zoom = $zoom_h . '%';
}
##----倍率設定終了-------------------------------------------------------------------------------
$::form{mymsg} = $lines . "\n\n\#ref\(" . $ffile . "\," . $page . "\," . $zoom . "\)\n"; #
} else {
$::form{mymsg} = $lines . "\n\n\#ref\(" . $ffile . "\," . $page . "\)\n"; #
}
# $::form{mymsg} .= "\-width\=" . $width . "\ height\=" . $height;
# $::form{mymsg} .= "\n\n\-zoom_w\=" . $zoom_h . "\ zoom_h\=" . $zoom_w;
$::form{mytouch} = 'on';
&do_write2('FrozenWrite');#conflictルーチンがないものをindex.cgiに追加(H27.9.26koala
&close_db;
#----------------------------------------------
- 上記追加部分のうち「##」で挟んだ部分は,添付するファイルが画像ファイルの場合に,その縦横サイズを調べた結果から,縦横が500ピクセルを超えないように倍率を計算し,それを「#ref」に設定するための手続きです
画像ファイルの縦横ピクセル数を調べるサブルーチン
- 画像ファイルの縦横ピクセル数を調べる下記サブルーチンを,「attach.inc.pl」内に追加して,これを上記「 #画像サイズを取得」と注記されている行で呼び出しています。
sub getimagesize_attach
{
my ($imgfile, $datafile) = @_;
my $width = 0;
my $height = 0;
my ($data, $m, $c, $l);
if (!$datafile) {
$datafile = $imgfile;
}
if ($imgfile =~ /\.jpe?g$/i) {
open(FILE, "$datafile") || return (0, 0);
binmode FILE;
read(FILE, $data, 2);
while (1) { # read Exif Blocks
read(FILE, $data, 4);
($m, $c, $l) = unpack("a a n", $data);
if ($m ne "\xFF") {
$width = $height = 0;
last;
} elsif ((ord($c) >= 0xC0) && (ord($c) <= 0xC3)) {
read(FILE, $data, 5);
($height, $width) = unpack("xnn", $data);
last;
} else {
read(FILE, $data, ($l - 2));
}
}
close(FILE);
} elsif ($imgfile =~ /\.gif$/i) {
open(FILE, "$datafile") || return (0,0);
binmode(FILE);
sysread(FILE, $data, 10);
close(FILE);
$data = substr($data, -4) if ($data =~ /^GIF/);
$width = unpack("v", substr($data, 0, 2));
$height = unpack("v", substr($data, 2, 2));
} elsif ($imgfile =~ /\.png$/i) {
open(FILE, "$datafile") || return (0,0);
binmode(FILE);
read(FILE, $data, 24);
close(FILE);
$width = unpack("N", substr($data, 16, 20));
$height = unpack("N", substr($data, 20, 24));
}
return ($width, $height);
}
index.cgiへのサブルーチン追加
- 上記添付ファイル名付きの#ref行を追加する処理を行おうとすると,ページ編集の競合のエラー(conflict)が表示されます。添付処理でindex.cgiの「&do_write」ルーチンが呼び出されており,その中での競合判定処理で引っかかっているものと思われ,根本的に解決しようと思いましたが,面倒なので,index.cgiの「&do_write」の競合警告処理(下記)だけを殺してみてはどうかな,と,それだけ殺したサブルーチン「「&do_write2」を別途追加して,attachからはこちらを呼び出すようにするという,乱暴な解決策を採用してみました。
- これでうまくいったので,それ以上考えないようにしてそのままにしてあります。特に問題は生じていないようです。
# return if (&conflict($::form{mypage}, $::form{mymsg}));
使用感
- 正直,これすごく便利です。
- 写真を貼り付けるときに,今までだと,(1)添付作業,(2)ファイル名だけを#refに転記,(3)一旦表示してみて,写真が大きすぎたら編集モードにもどり,表示倍率を変えてみてまた表示して・・・の作業が必要でしたが,この改良で,添付作業が終了すれば(2)(3)はすでに終了しているので,あとは必要に応じて表示位置(#refプラグインの置き場所)を変えるだけ。写真付きページの作成や更新の能率が大幅にアップしました。
- 自動生成される「#ref()」にはページ名も自動設定されているので,その写真を他のページに表示させたいときも,この「#ref()」をそのまま転記すれば済む点も,今までとは手間が雲泥の差!
Counter: 1701,
today: 1,
yesterday: 1