詳細を隠す

メインルーチンが長くなり過ぎて、見にくくなったので、関数を作成して、詳細な処理を関数内に隠します。
また、入・出力ファイル名を、ハードコーディングせずに、コマンド引数として渡すようにします。

SourceToHtml006.js


// 雛形ファイル名
var tempFileName = ".\\application\\template.html";

// 変換対象文字
var escapeChar = "<>&()|";
//*****************************************************************************
// 主処理
//*****************************************************************************
main();

function main()
{
// コマンド引数が、2つ指定されてなければ、異常終了
if (WScript.Arguments.length < 2)
{
WScript.echo("コマンド引数が、2つ指定されてないので、終了");
return;
}

//入力ファイル名を 取得する
var inFileName = WScript.Arguments(0);

// 出力ファイル名を 取得する
var outFileName = WScript.Arguments(1);

// FileSystemObject を 生成
var fs = WScript.CreateObject("Scripting.FileSystemObject");

// 雛形ファイルを 読み込み専用モードで 開く
var tsTemp = fs.OpenTextFile(tempFileName, 1);

// 出力ファイルを 新規作成モードで 開く
var tsOut = fs.OpenTextFile(outFileName, 2, -1);

// 雛形ファイルの終わりまで繰り返す
while (!tsTemp.AtEndOfStream)
{
// 雛形ファイルを 1行ずつ読む
var line = tsTemp.ReadLine();

// 入力ファイル名 を 出力
if (line.indexOf("%入力ファイル名%") >= 0)
tsOut.WriteLine(line.replace("%入力ファイル名%", fs.GetFileName(inFileName)));

// 行番号 を 出力
else if (line == "%行番号%")
putLineNo(fs, tsOut, inFileName);

// プログラムソース を 出力
else if (line == "%プログラムソース%")
SourceToHtml(fs, tsOut, inFileName);

// 雛形ファイルを そのまま出力
else
tsOut.WriteLine(line);
}

// 出力ファイルを 閉じる
tsOut.Close();

// 雛形ファイルを 閉じる
tsTemp.Close();
}
//*****************************************************************************
// 行番号 を 出力
//*****************************************************************************
function putLineNo(fs, tsOut, inFileName)
{
// 入力ファイルを 読み込み専用モードで 開く
var tsIn = fs.OpenTextFile(inFileName, 1);

// 行番号を初期化
var lineNo = 0;

// 入力ファイルの終わりまで繰り返す
while (!tsIn.AtEndOfStream)
{
// 入力ファイルを1行ずつ読む
tsIn.ReadLine();

// 行番号を書く
tsOut.WriteLine(FormatNum(++lineNo));
}

// 入力ファイルを 閉じる
tsIn.Close();
}
//-----------------------------------------------------------------------------
// 数値の書式化 (例: 123 → "00123")
//-----------------------------------------------------------------------------
function FormatNum(num)
{
var s = "00000" + num;

return (s.substr(s.length - 5, 5));
}
//*****************************************************************************
// プログラムソース を 出力
//*****************************************************************************
function SourceToHtml(fs, tsOut, inFileName)
{
// 入力ファイルを 読み込み専用モードで 開く
var tsIn = fs.OpenTextFile(inFileName, 1);

// 入力ファイルの終わりまで繰り返す
while (!tsIn.AtEndOfStream)
{
// 入力ファイルを 1行ずつ読む
var lineIn = tsIn.ReadLine();

// TAB を 空白に 変換
lineIn = TabToSpace(lineIn);

// 変換出力用文字列
var lineOut = "";

while (lineIn.length > 0)
{
// 英数字なら
if (lineIn.match("^[0-9A-Za-z]+"))
{
// 「予約語」として出力
lineOut += putToken(RegExp.lastMatch, "予約語");

// 入力文字列を切り詰める
lineIn = RegExp.rightContext;
}
// それ以外なら
else
{
// そのまま出力
lineOut += putToken(lineIn.substr(0, 1), "");

// 入力文字列を 1文字 切り詰める
lineIn = lineIn.substr(1, lineIn.length - 1);
}
}
// 変換した文字列を書く
tsOut.WriteLine(lineOut);
}
// 入力ファイルを 閉じる
tsIn.Close();
}
//-----------------------------------------------------------------------------
// トークンを出力
//-----------------------------------------------------------------------------
function putToken(token, type)
{
if (token.length < 1) return "";

// 変換出力用文字列
var lineOut = "";

// 1文字ずつ処理する
for (var i=0;i<token.length;i++)
{
// 1文字取り出す
var c = token.substr(i, 1);

// 変換対象の文字か?
if (escapeChar.indexOf(c) >= 0)
{
// 変換して出力
// escape : "0" → "%30"
// replace : "%30" → "&#x30;"
lineOut += escape(c).replace("%", "&#x") + ";";
}
else
{
// そのまま出力
lineOut += c;
}
}

if (type == "予約語") return '<SPAN CLASS="KEY">' + lineOut + '</SPAN>';
return lineOut;
}
//-----------------------------------------------------------------------------
// TAB を 空白に 変換
//-----------------------------------------------------------------------------
function TabToSpace(lineIn)
{
// 変換出力用文字列
var lineOut = "";

// 現在位置
var pos = 0;

// 1文字ずつ処理する
for (var i=0;i<lineIn.length;i++)
{
// 1文字取り出す
var c = lineIn.substr(i, 1);

// TAB か?
if (c == "\t")
{
// 空白何文字分に置き換えればよいか
var num = 4 - (pos % 4);
// 現在位置を加算
pos += num;
// 変換して出力
lineOut += " ".substr(0, num);
}
else
{
// 現在位置を加算
if (escape(c).length < 4)
pos++;
else
pos += 2;
// そのまま出力
lineOut += c;
}
}

return lineOut;
}

実行形式


Z:\>SourceToHtml006.js TEST.txt TEST.html