「attach」で,添付したファイルを表示する「#ref」プラグインをページ末に自動的に付記する

  • ページに「添付」コマンド,つまり「attach」プラグインを用いて画像ファイルなどを添付する際は,そのページにその画像(や非画像添付ファイルへのリンク)を表示することが目的である場合がほとんど。
  • でも,pyukiwikiでは添付作業とページ編集作業は別なので,ブログページなどで画像を貼り付けようと思った場合は,次のような面倒な手順が必要。
    1. 一旦「添付」(attach)で画像を添付し,
    2. その添付ファイル名を(クリップボードに)記憶しておいて,
    3. 次いでそのページの編集(「edit」)モードにして,
    4. 前記記憶したファイル名を「#ref」プラグインの()内に書き,
    5. プレビューで画像の表示サイズを確認し,大き(小さ)すぎる場合は
    6. 「#ref」プラグインに適当に表示倍率を設定し,
    7. 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


Last-modified: 2015-11-08