JavaScript で作る SourceToRTF

これまで、作成してきた「SourceToHTML」を改造して、
「SourceToRTF」を作成しました。

.\application\template.rtf


{\rtf1\ansi\ansicpg932\deff0\deflang1033\deflangfe1041
{\fonttbl
{\f0\fmodern\fprq1\fcharset128 \'82\'6c\'82\'72 \'83\'53\'83\'56\'83\'62\'83\'4e;}
}
{\colortbl;
\red0\green0\blue255;
\red0\green128\blue0;
\red255\green0\blue0;
\red255\green0\blue255;
\red0\green128\blue128;
\red0\green0\blue128;
\red128\green0\blue0;
\red128\green0\blue128;
\red128\green128\blue0;
\red192\green192\blue192;
}
\viewkind4\uc1\pard\lang1041\f0\fs18
%プログラムソース%
\f1\fs20\par
}

SourceToRtf018.js


//******************************************************************************
// C++, C#, Java, JavaScript, VB, Delphi, PL/SQL, T-SQL → RTF 変換処理
//******************************************************************************
// 変換対象文字
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.rtf";

// 行番号
var _lineNo = 0;

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

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

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

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

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

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

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

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

// 雛形ファイルを 閉じる
tsTemp.Close();

//*****************************************************************************
// 初期処理 --- コマンド引数の取得など、各変数の初期化
//*****************************************************************************
function initialize()
{
// コマンド引数が、2つ指定されてなければ、異常終了
if (WScript.Arguments.length < 2)
{
WScript.echo("入力ファイルと 出力ファイルを 指定して下さい。");
WScript.Quit();
}

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

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

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

// 入力ファイル 読み込み専用モードで 開いてみる
var tsTemp;
try
{
tsTemp = _fs.OpenTextFile(_inFileName, 1);
tsTemp.Close();
}
catch (e)
{
WScript.echo(e.description);
WScript.Quit();
}

// 出力ファイルを 新規作成モードで 開いてみる
try
{
tsTemp = _fs.OpenTextFile(_outFileName, 2, -1);
tsTemp.Close();
}
catch (e)
{
WScript.echo(e.description);
WScript.Quit();
}

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

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

// 予約語一覧を取得する
getKeywordList();
}
//=============================================================================
// 言語タイプを 取得する
//=============================================================================
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("\\cf10 " + FormatNum(++_lineNo) + "\\cf0 \t" + _convert.ConvToHtml(context) + "\\par"); // silver
// tsOut.WriteLine(_convert.ConvToHtml(context) + "\\par"); // silver
}
// 入力ファイルを 閉じる
tsIn.Close();
}
//-----------------------------------------------------------------------------
// 数値の書式化 (例: 123 → "00123")
//-----------------------------------------------------------------------------
function FormatNum(num)
{
var s = "00000" + num;

return (s.substr(s.length - 5, 5));
}
//=============================================================================
// テキスト を 変換して返す (文字のエスケ−プだけ)
//=============================================================================
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);

// 変換対象の文字なら、変換して出力 ( "{" → "\{" )
if (_escapeChar.indexOf(c) >= 0)
lineOut += "\\" + c;

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

if (fKeyword && (type == "予約語") ) return '\\cf1 ' + lineOut + '\\cf0 '; // blue
if (fDirective && (type == "ディレクティブ") ) return '\\cf1 ' + lineOut + '\\cf0 '; // blue
if (fComment && (type == "コメント") ) return '\\cf2 ' + lineOut + '\\cf0 '; // green
if (fEmphasis1 && (type == "強調表示1") ) return '\\cf3 ' + lineOut + '\\cf0 '; // red
if (fEmphasis2 && (type == "強調表示2") ) return '\\cf4 ' + lineOut + '\\cf0 '; // fuchsia
if (fEmphasis3 && (type == "強調表示3") ) return '\\cf5 ' + lineOut + '\\cf0 '; // teal
if (fIdent && (type == "識別子") ) return '\\cf6 ' + lineOut + '\\cf0 '; // navy
if (fString && (type == "文字列") ) return '\\cf7 ' + lineOut + '\\cf0 '; // maroon
if (fChar && (type == "文字") ) return '\\cf7 ' + lineOut + '\\cf0 '; // maroon
if (fNumber && (type == "数字") ) return '\\cf8 ' + lineOut + '\\cf0 '; // purple
if (fDelim && (type == "記号") ) return '\\cf9 ' + lineOut + '\\cf0 '; // olive

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.replace(/ +$/,"");
}