HTMLで書かれたデータを取り込むで作成した当せん番号のデータに基づき、これをブラウザで照会できるよう、HTML入力フォームを作りたい。入力の手間を減らすため、抽せん回はドロップダウンメニューで選択できるようにする。当せん番号データファイルから該当する番号を動的に選択肢として(<option>)生成するものとする。
動的にHTMLを生成したいことは多々ある。Open usp Tukubaiには、このような使い道を想定したコマンドmojihameが用意されている。テンプレートとなるHTMLを用意。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta http-equiv="Content-Style-Type" content="text/css
" />
<title>Open usp Tukubai 宝くじ当せんチェック</title>
<style type="text/css">
* {padding:0px;} /* defaultのpaddingを全て0に */
td.komoku {font-size:15px; text-align:right;}
</style>
<script type="text/javascript">
function getXMLHttpRequest(){
if(!window.ActiveXObject) { //FF,Crome,IE8対応
return new XMLHttpRequest();
}
try{ //IE7対応
return new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e){ //IE6対応
return new ActiveXObject("Microsoft.XMLHTTP");
}
}
function GetOutput(){
var httpReq = getXMLHttpRequest();
httpReq.open("POST","LOTTERY.AJAX",true);
httpReq.setRequestHeader(
'Content-Type','application/x-www-form-urlencoded'
);
httpReq.onreadystatechange = function(){
if(httpReq.readyState != 4 ||
httpReq.status != 200 ) return;
document.getElementById('output').innerHTML
= httpReq.responseText;
}
httpReq.send(sendAJAX());
}
// AJAXの送信情報の作成
function sendAJAX(){
var data = "NUMBER=" +
document.getElementById("number").value + "&";
data = data + "GROUP=" +
document.getElementById("group").value + "&";
data = data + "KIND=" +
document.getElementById("kind").value;
return data;
}
</script>
</head>
<body onload="GetOutput();">
<form name="INPUT_FORM" id="INPUT_FORM" style="width:800px; height:600px;"/>
<div>
<table style="width:800px; height:50px; text-align:cent
er; border:3px solid #000000;">
<tr>
<td style="width:100px; border:solid 1px;" />
<strong>USP</strong>
</td>
<td style="font-size:22px">
<strong>Tukubai 宝くじ当せんチェック</strong>
</td>
</tr>
</table>
<br />
<table style="width:800px; height:120px;" />
<tr>
<td class="komoku" style="width:360px;">
番号6桁
</td>
<td style="width:400px; text-align:left;">
<input type="text" name="number" id="number"
style="width:150px;" onkeyup="GetOutput();"
value="" />
</td>
</tr>
<tr>
<td class="komoku" style="width:360px;">組</td>
<td style="width:400px; text-align:left;">
<select name="group" id="group"
style="width:150px;"
onchange="GetOutput();" />
<option value="00" />選択して下さい</option>
<!-- ###GROUP_LIST### -->
<option value="%1" />%2</option>
<!-- ###GROUP_LIST### -->
</select>
</td>
</tr>
<tr>
<td class="komoku" style="width:360px;">
宝くじ種類
</td>
<td style="width:400px; text-align:left;">
<select name="kind" id="kind"
style="width:350px;" onchange="GetOutput();" />
<option value="00" />選択して下さい</option>
<!-- ###KIND_LIST### -->
<option value="%1" />%2</option>
<!-- ###KIND_LIST### -->
</select>
</td>
</tr>
</table>
</div>
<br />
<label for="output">当せん可能性:</label><br />
<div id="output">
<!-- ###OUTPUT### -->
<textarea cols="97" rows="10">
<!-- ###FILEHAME### -->
</textarea>
<table style="width:800px;">
<tr>
<td style="font-size:18px; text-align:right;">
賞金 ###AMOUNT###
</td>
</tr>
</table>
<!-- ###OUTPUT### -->
</div>
</form>
</body>
</html>
テンプレートにはmojihameが反応するマクロ文字列を埋め込んでおく。このテンプレートHTMLと表データをmojihameに掛けると、データがハメ込まれたHTMLになる。HTMLを生成するCGIは次のようになる。
#!/bin/sh
#
######################################################
# LOTTERY.CGI 当せん番号チェックのHTMLフォームを自動生成
# (CGIというdirectory作成後、その下に配置してください)
#
# Written by N.Tounaka(tounaka@usp-lab.com)
# Date : 7 Sep.2012
# Arrenged by USP MAGAZINE(mag@uap-lab.com)
# Date : 8 Sep.2012
######################################################
# 環境変数のセット
export PATH=$PATH:/home/USERNAME/tukubai/bin
export LANG=ja_JP.UTF-8
# シェル変数のセット
homedir=$(pwd); homedir=${homedir%/*}
htmd=$homedir/HTML
pomd=$homedir/POMPA
# ヘッダーの出力
cat << HTTP_HEADER
Content-type: text/html
HTTP_HEADER
# ドロップダウンリスト(組番号,抽せん回の2か所)を
# はめ込みながら、HTML本体を出力
cat $htmd/LOTTERY.HTML |
mojihame -d_ -lGROUP_LIST - $pomd/GROUP_LIST |
mojihame -d_ -lKIND_LIST - $pomd/KIND_LIST
exit 0
HTMLテンプレートはそれなりのサイズになるが、CGIスクリプトは短く、実質14行だ。Open usp Tukubaiを使えばシェルスクリプトで簡単に動的にHTMLを生成できる。
HTMLテンプレートの95行、97行、109行、111行がmojihameで使用するマクロ文字列だ。1行に2フィールドあるデータとHTMLテンプレートをmojihameで処理すると各行のn番目のフィールドが%nにハメ込まれ、それが行数分だけ繰り返される。結果として、<option>タグ行が自動生成される。mojihameのおかげでCGIスクリプト内にはループ文を書かなくて済むため、スッキリしたソースコードになる。
※ usp Tukubaiはユニバーサル・シェル・プログラミング研究所の登録商標。
※1 Open usp Tukubaiは最新バージョンを採用のこと。古いバージョンでは適切に動作しない可能性がある。
※2 USP MAGAZINE 2012 autumnより加筆修正後転載。
※3 本ページで公開されているプログラムとそれに付随するデータの著作権およびライセンスは、特に断りがない限りOpen usp Tukubai本体と同じMITライセンスに準拠するものとする。