フォルダ配下の画像一覧HTMLの作成バッチ


はじめに

「アニメーションGIF」はエクスプローラ上だとアニメーションされないらしく、一挙に数十ファイルのアニメーションGIFを1ウインドウで表示させたい。
というワガママさんに、一覧表示するHTMLを出力するからブラウザで見ろと対応した。

使い方

  1. 一気に表示させたい画像を一つのフォルダにまとめる
  2. 作ったバッチをそのフォルダにコピーする
  3. バッチを実行する
  4. "thumbnail.html"が作成されるのでブラウザで表示する

作ったバッチ

make_thumbnail_html.bat
@echo off
rem 画像をタイル状に表示させるHTMLを作るバッチ

rem 出力するファイル名
set HTML_FILE=thumbnail.html
rem タイルの列数
set TABLE_COLUMNS=3
rem タイルの幅(画像の幅)
set IMAGE_WIDTH=300

rem 検出する画像ファイルの拡張子
set FILE_TYPES=*.gif, *.png, *.jpeg, *.jpg, *.bmp

rem 出力先のファイルを消す(あったら)
if exist "%HTML_FILE%" del "%HTML_FILE%"

rem フォルダの名前を取得する
for %%I in (.) do set CUR_DIRNAME=%%~nI%%~xI

rem HTMLファイルの先頭部を出力する
call :OUT_HTML "^<!DOCTYPE html^>"
call :OUT_HTML "^<html lang='ja'^>"
call :OUT_HTML "^<head^>"
call :OUT_HTML "^<meta charset='Shift_JIS'^>"
call :OUT_HTML "^<title^>%CUR_DIRNAME%^</title^>"
call :OUT_HTML "^<style type='text/css'^>^<!-- td {vertical-align:top;}--^>^</style^>"
call :OUT_HTML "^</head^>"
call :OUT_HTML "^<body^>"

set /a FILE_COUNT=0
set /a COLUMN_NO=0

call :OUT_HTML "^<table^>"

rem ファイルを検索してタイルを出力する
for %%a in (%FILE_TYPES%) do (
     echo %%a
     call :OUT_TD_TAG "%%a"
)
rem 列数に満たなかった分だけ空のTDタグを出力する
if %COLUMN_NO% LSS %TABLE_COLUMNS% (
    call :OUT_DUMMY_TD_TAG
)
call :OUT_HTML "^</table^>"

rem HTMLファイルの終端部を出力する
call :OUT_HTML "^</body^>"
call :OUT_HTML "^</html^>"

goto :EOF

rem ============================================================
:OUT_TD_TAG

set IMAGE_FILE=%~1

rem 列番号を求める
set /A COLUMN_NO=%FILE_COUNT% %% %TABLE_COLUMNS% + 1

rem 1列目ならTRタグを出力する
if %COLUMN_NO% EQU 1 (
    call :OUT_HTML "^<tr^>"
)

rem 画像用タグを出力する
call :OUT_HTML "  ^<td^>"
if "%IMAGE_FILE%" NEQ "" (
    call :OUT_HTML "    %IMAGE_FILE%^<br/^>"
    call :OUT_HTML "    ^<img width='%IMAGE_WIDTH%' src='%IMAGE_FILE%' /^>"
)
call :OUT_HTML "  ^</td^>"

rem 最終列なら/TRタグを出力する
if %COLUMN_NO% EQU %TABLE_COLUMNS% (
    call :OUT_HTML "^</tr^>"
)

rem ファイル数を数える
set /a FILE_COUNT=%FILE_COUNT%+1

exit /b

rem ============================================================
:OUT_DUMMY_TD_TAG

rem 列数に満たない分のTDタグの個数を計算する
set /A DUMMY_LOOP=%TABLE_COLUMNS%-%COLUMN_NO%

rem 空のTDタグを出力する
for /l %%i in (1,1,%DUMMY_LOOP%) do (
    call :OUT_TD_TAG ""
)

exit /b

rem ============================================================
:OUT_HTML
set OUT_TEXT=%1
set OUT_TEXT=%OUT_TEXT:^^=^%

echo %OUT_TEXT:"=% >> %HTML_FILE%

exit /b

まとめ

Windows Batchだけで心配だったが、なんとか出力できた。
アニメーションGIF数十ファイルを表示させると壮観だが結構うざい。

HTMLタグ<,>のエスケープが面倒で、他に良い方法が思いつかなかった。
バッチファイルのセオリーのようなものが見つからなかったので、もう少し調べてみようと思う。