強調表示

Delphi」 の "exit", "break" など、予約語ではないが強調表示したいが、
予約語とは別の色で表示したい、といった要求にも対応できるようにしました。

これまで、「予約語」は、各言語タイプ.key というファイルに保存するよう設定していましたが、
(たとえば、VB.NET なら、vb7.key)
強調表示は3種類(たとえば、VB.NET なら、vb7.sp1, vb7.sp2, vb7.sp3 )設定できるように
しました。

SourceToHtml017.js


//******************************************************************************
// C++, C#, Java, JavaScript, VB, Delphi, PL/SQL, T-SQL → HTML 変換処理
//******************************************************************************
// 変換対象文字
var _escapeChar = "<>&()|";

// 強調表示するか?
var fKeyword = true; // 予約語
var fDirective = true; // ディレクティブ
var fComment = true; // コメント
var fIdent = true; // 識別子
var fString = true; // 文字列
var fChar = true; // 文字
var fNumber = true; // 数字
var fDelim = true; // 記号
var fEmphasis1 = true; // 強調表示 1
var fEmphasis2 = true; // 強調表示 2
var fEmphasis3 = true; // 強調表示 3

// ファイルアクセス用オブジェクト
var _fs;

//入力ファイル名
var _inFileName = "";
// 出力ファイル名
var _outFileName = "";
// 雛形ファイル名
var _tempFileName = ".\\application\\template.html";

// 変換用オブジェクト
var _convert = new Object();
//*****************************************************************************
// 主処理 --- 各処理の呼び出し
//*****************************************************************************
main();

function main()
{
// 初期処理 --- コマンド引数の取得など、各変数の初期化
if (!initialize()) return;

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

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

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

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

// 行番号 を 出力
else if (text == "%行番号%")
putLineNo(tsOut);

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

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

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

// 雛形ファイルを 閉じる
tsTemp.Close();
}
//*****************************************************************************
// 初期処理 --- コマンド引数の取得など、各変数の初期化
//*****************************************************************************
function initialize()
{
// コマンド引数が、2つ指定されてなければ、異常終了
if (WScript.Arguments.length < 2)
{
WScript.echo("コマンド引数が、2つ指定されてないので、終了");
return false;
}

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

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

// FileSystemObject を 生成する
_fs = WScript.CreateObject("Scripting.FileSystemObject");

// 言語タイプを 取得する
getLangType();

// 言語タイプに応じて、変換用オブジェクトを設定する
setConvertOption();

// 予約語一覧を取得する
getKeywordList();

return true;
}
//=============================================================================
// 言語タイプを 取得する
//=============================================================================
function getLangType()
{
// 引数省略時は、"Text" として扱う
_convert.langType = "txt";

// 言語タイプを 取得する
if (WScript.Arguments.length > 2)
_convert.langType = WScript.Arguments(2).toLowerCase();

// 言語タイプを チェックする
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
case "del": // Delphi
case "psql": // PL/SQL
case "tsql": // T-SQL
break;

// 上記以外は、"Text" として扱う
default:
_convert.langType = "txt";
break;
}
}
//=============================================================================
// 言語タイプに応じて、変換用オブジェクトを設定する
//=============================================================================
function setConvertOption()
{
//-------------------------------------------------------------------------
// 大文字・小文字を区別する/しない
//-------------------------------------------------------------------------
switch(_convert.langType)
{
// 大文字・小文字を区別する
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
_convert.ignoreCase = false; // 大文字・小文字を区別する
_convert.getKeyword = getKeywordCase; // 予約語を返す
break;

// 上記以外は、大文字・小文字を区別しない
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
// case "del": // Delphi
// case "psql": // PL/SQL
// case "tsql": // T-SQL
default:
_convert.ignoreCase = true; // 大文字・小文字を区別しない
_convert.getKeyword = getKeywordIgnoreCase; // 予約語を返す
break;
}

//-------------------------------------------------------------------------
// 日本語の使用を許可する/しない
//-------------------------------------------------------------------------
switch(_convert.langType)
{
// 日本語の使用を許可する
case "cs7": // Visual C#.NET
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.useMultiByte = true; // 日本語の使用を許可する
break;

// 上記以外は、日本語の使用を許可しない
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
// case "bcb": // C++Builder
// case "java": // Java
// case "del": // Delphi
default:
_convert.useMultiByte = false; // 日本語の使用を許可しない
break;
}

//-------------------------------------------------------------------------
// 変換用 主処理の 割り当て
//-------------------------------------------------------------------------
if (_convert.langType == "txt")
// テキストなら、文字のエスケ−プだけ
_convert.ConvToHtml = ConvToHtmlText;
else
// それ以外なら変換処理を行う
_convert.ConvToHtml = ConvToHtmlOther;

//-------------------------------------------------------------------------
// トークンの開始を 判定
//-------------------------------------------------------------------------
_convert.state = new Object();
_convert.state.waitStart = new Array();

// ディレクティブか?
var idx = 0;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
// case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^#[A-Za-z]+/)); }; // #
break;
case "del": // Delphi
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\{\$.*\}/)); }; // {$ }
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "ディレクティブ";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 単一行コメントか?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
case "del": // Delphi
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\/\/.*$/)); }; // //
break;
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^'.*$/)); }; // '
break;
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^--.*$/)); }; // --
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "コメント";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 複数行コメントか?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\/\*.*\*\//)); }; // /* */
break;
case "del": // Delphi
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\(\*.*\*\)/)); }; // (* *)
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "コメント";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 複数行コメントか?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
// case "cs7": // Visual C#.NET
// case "bcb": // C++Builder
// case "java": // Java
// case "js": // JavaScript
// case "vj6": // Visual J++ 6.0
// case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
case "del": // Delphi
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\{.*\}/)); }; // { }
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "コメント";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 複数行コメントの 開始か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\/\*.*$/)); }; // /*
_convert.state.waitStart[idx].getTerm = function(arg) { return (arg.match(/^.*\*\//)); }; // */
break;
case "del": // Delphi
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\(\*.*$/)); }; // (*
_convert.state.waitStart[idx].getTerm = function(arg) { return (arg.match(/^.*\*\)/)); }; // *)
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "コメント";
_convert.state.waitStart[idx].nextState = "終了待ち";

// 複数行コメントの 開始か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
// case "cs7": // Visual C#.NET
// case "bcb": // C++Builder
// case "java": // Java
// case "js": // JavaScript
// case "vj6": // Visual J++ 6.0
// case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
case "del": // Delphi
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\{.*$/)); }; // {
_convert.state.waitStart[idx].getTerm = function(arg) { return (arg.match(/^.*\}/)); }; // }
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "コメント";
_convert.state.waitStart[idx].nextState = "終了待ち";

// 文字列か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^"([^"\\]|\\.)*("|$)/)); }; // " \" "
break;
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^"(""|[^"])*("|$)/)); }; // " "" "
break;
case "del": // Delphi
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^'(''|[^'])*('|$)/)); }; // ' '' '
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "文字列";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 文字列か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
// case "cs7": // Visual C#.NET
// case "bcb": // C++Builder
// case "java": // Java
case "js": // JavaScript
// case "vj6": // Visual J++ 6.0
// case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
// case "del": // Delphi
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^'([^'\\]|\\.)*('|$)/)); }; // ' \' '
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "文字列";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 文字か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
// case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^'([^'\\]|\\.)*('|$)/)); }; // ' \' '
break;
case "del": // Delphi
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^#(\$[0-9A-F]|[0-9])+/i)); }; // #$FF #99
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "文字";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 逐語的文字列か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
// case "bcb": // C++Builder
// case "java": // Java
// case "js": // JavaScript
// case "vj6": // Visual J++ 6.0
// case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
// case "del": // Delphi
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^@"(""|[^"])*"/)); }; // @" "" "
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "文字列";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 逐語的文字列の 開始か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
// case "bcb": // C++Builder
// case "java": // Java
// case "js": // JavaScript
// case "vj6": // Visual J++ 6.0
// case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
// case "del": // Delphi
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^@"(""|[^"])*$/)); }; // @" ""
_convert.state.waitStart[idx].getTerm = function(arg) { return (arg.match(/^(""|[^"])*"/)); }; // "" "
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "文字列";
_convert.state.waitStart[idx].nextState = "終了待ち";

// 識別子か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
case "del": // Delphi
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^[A-Za-z_][A-Za-z0-9_]*/)); }; // _z9
break;
case "psql": // PL/SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^[A-Za-z][A-Za-z0-9_#$]*/)); }; // z9$#
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "識別子";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 8進か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^0[0-7]+[A-Z]{0,2}/i)); }; // 07
break;
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
// case "del": // Delphi
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^&O[0-7]+[A-Z]{0,2}/i)); }; // &o7
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "数字";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 16進か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^0X[0-9A-F]+[A-Z]{0,2}/i)); }; // 0xff
break;
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^&H[0-9A-F]+[A-Z]{0,2}/i)); }; // &hff
break;
case "del": // Delphi
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\$[0-9A-F]+/i)); }; // $ff
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "数字";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 数字か? (99e99)
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
case "del": // Delphi
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^[0-9]+\.?[0-9]?e{1}[+-]?[0-9]*[A-Z]{0,2}/i)); };
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "数字";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 数字か? (99.99)
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
case "del": // Delphi
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^[0-9]+\.[0-9]*[A-Z]{0,2}/i)); };
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "数字";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 数字か? (99)
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
case "del": // Delphi
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^[0-9]+[A-Z]{0,2}/i)); };
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "数字";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 正規表現か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
// case "cs7": // Visual C#.NET
// case "bcb": // C++Builder
// case "java": // Java
case "js": // JavaScript
// case "vj6": // Visual J++ 6.0
// case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
// case "del": // Delphi
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\/(\\\/|[^\/])*\//)); }; // / \/ /
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "文字列";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 日付か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
// case "cs7": // Visual C#.NET
// case "bcb": // C++Builder
// case "java": // Java
// case "js": // JavaScript
// case "vj6": // Visual J++ 6.0
// case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
// case "del": // Delphi
// case "psql": // PL/SQL
// case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^#[^'"]+#/)); }; // # #
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "文字列";
_convert.state.waitStart[idx].nextState = "開始待ち";

// エスケープされた識別子か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
// case "cs7": // Visual C#.NET
// case "bcb": // C++Builder
// case "java": // Java
// case "js": // JavaScript
// case "vj6": // Visual J++ 6.0
// case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
// case "del": // Delphi
// case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\[.+(\]|$)/)); }; // [ ]
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "識別子";
_convert.state.waitStart[idx].nextState = "開始待ち";


// エスケープされた識別子か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
// case "vc6": // Visual C++ 6.0
// case "vc7": // Visual C++.NET
// case "cs7": // Visual C#.NET
// case "bcb": // C++Builder
// case "java": // Java
// case "js": // JavaScript
// case "vj6": // Visual J++ 6.0
// case "vj7": // Visual J#.NET
// case "vb6": // Visual Basci 6.0
// case "vb7": // Visual Basci.NET
// case "vba": // Visual Basic for Application
// case "vbs": // VBScript
// case "del": // Delphi
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^"(""|[^"])*("|$)/)); }; // " "" "
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "識別子";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 記号か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
case "del": // Delphi
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^[!"#$%&'\(\)*+,-./:;<=>?@\[\\\]^_`\{|\}~]/)); };
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "記号";
_convert.state.waitStart[idx].nextState = "開始待ち";

// 空白か?
idx++;
_convert.state.waitStart[idx] = new Object();
switch(_convert.langType)
{
case "vc6": // Visual C++ 6.0
case "vc7": // Visual C++.NET
case "cs7": // Visual C#.NET
case "bcb": // C++Builder
case "java": // Java
case "js": // JavaScript
case "vj6": // Visual J++ 6.0
case "vj7": // Visual J#.NET
case "vb6": // Visual Basci 6.0
case "vb7": // Visual Basci.NET
case "vba": // Visual Basic for Application
case "vbs": // VBScript
case "del": // Delphi
case "psql": // PL/SQL
case "tsql": // T-SQL
_convert.state.waitStart[idx].getToken = function(arg) { return (arg.match(/^\s+/)); };
break;
default:
_convert.state.waitStart[idx].getToken = function(arg) { return null; };
break;
}
_convert.state.waitStart[idx].currType = "空白";
_convert.state.waitStart[idx].nextState = "開始待ち";
}
//=============================================================================
// 予約語一覧を取得する
//=============================================================================
function getKeywordList()
{
_convert.keyword = new Array();

// 予約語一覧
_convert.keyword[0] = new Object();

// 強調表示 一覧
_convert.keyword[1] = new Object();
_convert.keyword[2] = new Object();
_convert.keyword[3] = new Object();

var keyFileName = "";
for (var i=0;i<4;i++)
{
// 予約語・強調表示 一覧ファイル名
if (i == 0)
keyFileName = ".\\application\\" + _convert.langType + ".key";
else
keyFileName = ".\\application\\" + _convert.langType + ".sp" + i;

// ファイルがなければ、何もしない
if (!_fs.FileExists(keyFileName)) continue;

// 予約語一覧ファイルを 読み込み専用モードで 開く
var tsKeyword = _fs.OpenTextFile(keyFileName, 1);
while (!tsKeyword.AtEndOfStream)
{
var s = tsKeyword.ReadLine();

// 大文字・小文字を区別しない → 予約語を小文字に変換して登録する
if (_convert.ignoreCase) _convert.keyword[i][s.toLowerCase()] = s;
// 大文字・小文字を区別する → 予約語をそのまま登録する
else _convert.keyword[i][s] = s;
}
tsKeyword.Close();
}
}
//-----------------------------------------------------------------------------
// 予約語か? (大文字・小文字を区別する)
//-----------------------------------------------------------------------------
function getKeywordCase(idx, value)
{
// 予約語一覧に登録されていれば、予約語を返す
return (_convert.keyword[idx][value]);
}
//-----------------------------------------------------------------------------
// 予約語か? (大文字・小文字を区別しない)
//-----------------------------------------------------------------------------
function getKeywordIgnoreCase(idx, value)
{
// 予約語一覧に登録されていれば、予約語を返す
return (_convert.keyword[idx][value.toLowerCase()]);
}
//-----------------------------------------------------------------------------
// その「識別子」は、「予約語」か? または「強調表示」対象か?
//-----------------------------------------------------------------------------
function toEmphasis(context)
{
// その「識別子」は、「予約語」か?
for (var i=0;i<4;i++)
{
// 例えば、VB の 「MyBase.New()」 という文の
// 「New」 は、予約語として表示したくないので。。。
if ((i == 0) && (context.prevToken.charAt(context.prevToken.length - 1) == ".")) continue;

var s = _convert.getKeyword(i, context.token);
if (s)
{
context.token = s;

if (i == 0)
context.type = "予約語";
else
context.type = "強調表示" + i;

break;
}
}
}
//*****************************************************************************
// プログラムソース を 出力
//*****************************************************************************
function SourceToHtml(tsOut)
{
// 入力ファイルを 読み込み専用モードで 開く
var tsIn = _fs.OpenTextFile(_inFileName, 1);

// 文脈オブジェクト
var context = new Object();

//現在の状態
context.state = "開始待ち";

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

// TAB を 空白に 変換
context.value = TabToSpace(context.value);

// プログラムソース を 変換して 出力
tsOut.WriteLine(_convert.ConvToHtml(context));
}
// 入力ファイルを 閉じる
tsIn.Close();
}
//=============================================================================
// テキスト を 変換して返す (文字のエスケ−プだけ)
//=============================================================================
function ConvToHtmlText(context)
{
return tokenToHtml(context.value, "");
}
//=============================================================================
// プログラムソース を 変換して返す
//=============================================================================
function ConvToHtmlOther(context)
{
// 変換出力用文字列
var lineOut = "";

// トークンを退避
context.prevToken = "";
context.prevType = "空白";

// トークンの種類を クリア
if (context.state == "開始待ち")
context.type = "空白";
// トークンを クリア
context.token = "";

while (context.value.length > 0)
{
if (context.state == "開始待ち")
{
var isMatch = false;

for (var i=0;i<_convert.state.waitStart.length;i++)
{
// トークンの種類を判定
if (_convert.state.waitStart[i].getToken(context.value))
{
context.token = RegExp.lastMatch;
context.type = _convert.state.waitStart[i].currType;
context.state = _convert.state.waitStart[i].nextState;
context.value = RegExp.rightContext;
isMatch = true;

// その「識別子」は、「予約語」か? または「強調表示」対象か?
if (context.type == "識別子") toEmphasis(context);

// 終了判定用関数を 割り当て
if (context.state == "終了待ち")
context.getTerm = _convert.state.waitStart[i].getTerm;

break;
}
}
// 2 Byte文字 なら
if (!isMatch)
{
context.token = context.value.charAt(0);
context.type = (_convert.useMultiByte ? "識別子" : "不正な文字");
context.state = "開始待ち";
context.value = context.value.substring(1);
}
}
else // 終了待ち
{
// 終了?
if (context.getTerm(context.value))
{
context.token = RegExp.lastMatch;
context.state = "開始待ち";
context.value = RegExp.rightContext;
}
else // まだ、次の行に続く...
{
context.token = context.value;
context.state = "終了待ち";
context.value = "";
}
}
// トークンの種類が変わったら
if (context.prevType != context.type)
{
// トークンを出力
lineOut += tokenToHtml(context.prevToken, context.prevType);
context.prevToken = context.token;
}
else
{
context.prevToken += context.token;
}
context.prevType = context.type;
}
// トークンを出力
lineOut += tokenToHtml(context.prevToken, context.prevType);

return lineOut;
}
//=============================================================================
// トークンに TAG を付けて 返す
//=============================================================================
function tokenToHtml(token, type)
{
if (token.length < 1) return "";

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

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

// 変換対象の文字なら、変換して出力 ( "0" → "&#x30;" )
if (_escapeChar.indexOf(c) >= 0)
lineOut += "&#x" + c.charCodeAt(0).toString(16) + ";";

// それ以外なら、そのまま出力
else
lineOut += c;
}

if (fKeyword && (type == "予約語") ) return '<SPAN CLASS="KEY">' + lineOut + '</SPAN>';
if (fDirective && (type == "ディレクティブ") ) return '<SPAN CLASS="DIR">' + lineOut + '</SPAN>';
if (fComment && (type == "コメント") ) return '<SPAN CLASS="COM">' + lineOut + '</SPAN>';
if (fIdent && (type == "識別子") ) return '<SPAN CLASS="IDF">' + lineOut + '</SPAN>';
if (fString && (type == "文字列") ) return '<SPAN CLASS="STR">' + lineOut + '</SPAN>';
if (fChar && (type == "文字") ) return '<SPAN CLASS="CHA">' + lineOut + '</SPAN>';
if (fNumber && (type == "数字") ) return '<SPAN CLASS="NUM">' + lineOut + '</SPAN>';
if (fDelim && (type == "記号") ) return '<SPAN CLASS="DLM">' + lineOut + '</SPAN>';
if (fEmphasis1 && (type == "強調表示1") ) return '<SPAN CLASS="SP1">' + lineOut + '</SPAN>';
if (fEmphasis2 && (type == "強調表示2") ) return '<SPAN CLASS="SP2">' + lineOut + '</SPAN>';
if (fEmphasis3 && (type == "強調表示3") ) return '<SPAN CLASS="SP3">' + lineOut + '</SPAN>';
return lineOut;
}
//*****************************************************************************
// 行番号 を 出力
//*****************************************************************************
function putLineNo(tsOut)
{
// 入力ファイルを 読み込み専用モードで 開く
var tsIn = _fs.OpenTextFile(_inFileName, 1);

// 行数を初期化
var lineCnt = 0;

// 行数を数える
while (!tsIn.AtEndOfStream)
{
// 入力ファイルを1行ずつ読む
tsIn.ReadLine();
lineCnt++;
}

// 入力ファイルを 閉じる
tsIn.Close();

// もう一度、入力ファイルを 読み込み専用モードで 開く
tsIn = _fs.OpenTextFile(_inFileName, 1);

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

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

// 行番号を書く
lineNo++;
if (lineNo == 1) tsOut.WriteLine('<SPAN CLASS="LNO">' + FormatNum(lineNo));
else if (lineNo == lineCnt) tsOut.WriteLine( FormatNum(lineNo) + '</SPAN>');
else tsOut.WriteLine( FormatNum(lineNo));
}

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

return (s.substr(s.length - 5, 5));
}
//*****************************************************************************
// 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.replace(/ +$/,"");
}