SourceToHTML にGUIを

「SourceToHTML」と「SourceToRTF」をマージし、
また、"HTA"によるユーザーインターフェースを持たせました。

以下は、画面の制御部分です。

.\library\form.js


//**********************************************************************
// 初期化
//**********************************************************************
function form_onload()
{
// すべての前景・背景を 更新する
for (var i=1;i<14;i++)
{
var font = document.getElementById("font" + i);
if (font)
{
// 1 は、 基本色なので、常に有効
if (i == 1)
font.style.color = "#" + document.form1.txtFontColor1.value;
else
{
// 各表示項目の 前景が 有効であれば
var chk = document.getElementById("chkFontEnabled" + i);
if (chk.checked)
{
font.style.color = "#" + document.getElementById("txtFontColor" + i).value;

document.getElementById("txtFontColor" + i).disabled = false;
document.getElementById("cboFontColor" + i).disabled = false;
}
else
{
font.style.color = "#" + document.form1.txtFontColor1.value;

document.getElementById("txtFontColor" + i).disabled = true;
document.getElementById("cboFontColor" + i).disabled = true;
}

// 各表示項目の 背景が 有効であれば
chk = document.getElementById("chkBackEnabled" + i);
if (chk.checked)
{
font.style.backgroundColor = "#" + document.getElementById("txtBackColor" + i).value;

document.getElementById("txtBackColor" + i).disabled = false;
document.getElementById("cboBackColor" + i).disabled = false;
}
else
{
font.style.backgroundColor = "";

document.getElementById("txtBackColor" + i).disabled = true;
document.getElementById("cboBackColor" + i).disabled = true;
}
}
}
}

// すべての背景を更新する
for (var i=1;i<14;i++)
{
var base = document.getElementById("base" + i);
if (base)
{
base.style.backgroundColor = "#" + document.form1.txtBackColor1.value;
}
}
// 変換対象の記号 (for HTML)
document.form1.txtEscapeHtml.value = "&<>|()";

// 変換対象の記号 (for RTF)
document.form1.txtEscapeRtf.value = "\\{}";
document.form1.txtEscapeRtf.disabled = true;

// デバッグ
// alert("form_onload");
}
//**********************************************************************
// 言語タイプ 選択
//**********************************************************************
function cboLangType_change()
{
// デバッグ
// alert(document.form1.cboLangType.value);
}
//**********************************************************************
// 出力形式 選択
//**********************************************************************
function optFormatType_change()
{
if (document.form1.optFormatType[0].checked)
{
// HTML の場合、基本色の設定も 変更できる
document.form1.txtFontColor1.disabled = false;
document.form1.cboFontColor1.disabled = false;
document.form1.txtBackColor1.disabled = false;
document.form1.cboBackColor1.disabled = false;
document.form1.txtEscapeHtml.disabled = false;
document.form1.txtEscapeRtf.disabled = true;
}
else
{
// RTF の場合、基本色の設定は 変更させない
document.form1.txtFontColor1.value = "000000";
document.form1.cboFontColor1.value = "000000";
document.form1.txtBackColor1.value = "FFFFFF";
document.form1.cboBackColor1.value = "FFFFFF";

document.form1.txtFontColor1.disabled = true;
document.form1.cboFontColor1.disabled = true;
document.form1.txtBackColor1.disabled = true;
document.form1.cboBackColor1.disabled = true;
document.form1.txtEscapeHtml.disabled = true;
document.form1.txtEscapeRtf.disabled = false;
}

// イベントを無視させる
ignore = true;
txtFontColor1_change();
txtBackColor1_change();
ignore = false;
}
//**********************************************************************
// 入力ファイル 選択
//**********************************************************************
function txtInFileName_change()
{
// デバッグ
// alert(document.form1.txtInFileName.value);
}
//**********************************************************************
// 出力ファイル 選択
//**********************************************************************
function txtOutFileName_change()
{
// デバッグ
// alert(document.form1.txtOutFileName.value);
}
//**********************************************************************
// 変換対象「記号」
//**********************************************************************
function txtEscapeHtml_change()
{
// 記号以外を 取り除く
var ret = removeInvalidChar(document.form1.txtEscapeHtml.value);

// これは、必須
if (ret.indexOf("&") < 0) ret += "&";
if (ret.indexOf("<") < 0) ret += "<";
if (ret.indexOf(">") < 0) ret += ">";

document.form1.txtEscapeHtml.value = ret;
}
function txtEscapeRtf_change()
{
// 記号以外を 取り除く
var ret = removeInvalidChar(document.form1.txtEscapeRtf.value);

// これは、必須
if (ret.indexOf("\\") < 0) ret += "\\";
if (ret.indexOf("{") < 0) ret += "{";
if (ret.indexOf("}") < 0) ret += "}";

document.form1.txtEscapeRtf.value = ret;
}
// 記号以外を 取り除く
function removeInvalidChar(arg)
{
// 不正な文字を取り除く
var ret = "";

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

// 不正な文字 か?
if (" !\"#$%&\'\(\)*+,-./:;<=>?@\[\\\]^_`\{|\}~".indexOf(c) < 0)
ret += "";
else
ret += c;
}

return ret;
}
//**********************************************************************
// 前景
//**********************************************************************
// イベントを無視する
var ignore = false;
//======================================================================
// 基本色
//======================================================================
function cboFontColor1_change()
{
// 直接指定なら何もしない
if (document.form1.cboFontColor1.value == "") return;

// 直接指定用入力項目を設定する
document.form1.txtFontColor1.value = document.form1.cboFontColor1.value;

// イベントを無視させる
ignore = true;
txtFontColor1_change();
ignore = false;
}
function txtFontColor1_change()
{
// イベントを無視させる
if (!ignore)
document.form1.cboFontColor1.value = "";

// 不正な文字を取り除く
document.form1.txtFontColor1.value = toHex(document.form1.txtFontColor1.value);

// すべての前景を更新する
for (var i=1;i<14;i++)
{
var elem = document.getElementById("font" + i);
if (elem)
{
// 1 は、 基本色なので、常に有効
if (i == 1)
elem.style.color = "#" + document.form1.txtFontColor1.value;
else
{
// 各表示項目が 無効なら
var chk = document.getElementById("chkFontEnabled" + i);
if (!chk.checked)
{
elem.style.color = "#" + document.form1.txtFontColor1.value;
}
}
}
}
}
// 不正な文字を取り除く
function toHex(arg)
{
var ret = "";

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

// 不正な文字 か?
if ("0123456789ABCDEFabcdef".indexOf(c) < 0)
ret += "0";
else
ret += c;
}

// 6文字以上を捨てる
ret = "000000" + ret;
return (ret.substr(ret.length - 6, 6));
}
//======================================================================
// 各表示項目
//======================================================================
function cboFontColor_change(idx)
{
// 直接指定なら何もしない
if (document.getElementById("cboFontColor" + idx).value == "") return;

// 直接指定用入力項目を設定する
document.getElementById("txtFontColor" + idx).value = document.getElementById("cboFontColor" + idx).value;

// イベントを無視させる
ignore = true;
txtFontColor_change(idx);
ignore = false;
}
function txtFontColor_change(idx)
{
// イベントを無視させる
if (!ignore)
document.getElementById("cboFontColor" + idx).value = "";

// 不正な文字を取り除く
document.getElementById("txtFontColor" + idx).value = toHex(document.getElementById("txtFontColor" + idx).value);

// 前景を更新する
var elem = document.getElementById("font" + idx);
if (elem)
{
// 表示項目が有効なら
var chk = document.getElementById("chkFontEnabled" + idx);
if (chk.checked)
elem.style.color = document.getElementById("txtFontColor" + idx).value;
//else
// elem.style.color = document.getElementById("txtFontColor1").value;
}
}
//**********************************************************************
// 背景
//**********************************************************************
//======================================================================
// 基本色
//======================================================================
function cboBackColor1_change()
{
// 直接指定なら何もしない
if (document.form1.cboBackColor1.value == "") return;

// 直接指定用入力項目を設定する
document.form1.txtBackColor1.value = document.form1.cboBackColor1.value;

// イベントを無視させる
ignore = true;
txtBackColor1_change();
ignore = false;
}
function txtBackColor1_change()
{
// イベントを無視させる
if (!ignore)
document.form1.cboBackColor1.value = "";

// 不正な文字を取り除く
document.form1.txtBackColor1.value = toHex(document.form1.txtBackColor1.value);

// すべての背景を更新する
for (var i=1;i<14;i++)
{
var base = document.getElementById("base" + i);
if (base)
{
base.style.backgroundColor = "#" + document.form1.txtBackColor1.value;
}
}
}
//======================================================================
// 各表示項目
//======================================================================
function cboBackColor_change(idx)
{
// 直接指定なら何もしない
if (document.getElementById("cboBackColor" + idx).value == "") return;

// 直接指定用入力項目を設定する
document.getElementById("txtBackColor" + idx).value = document.getElementById("cboBackColor" + idx).value;

// イベントを無視させる
ignore = true;
txtBackColor_change(idx);
ignore = false;
}
function txtBackColor_change(idx)
{
// イベントを無視させる
if (!ignore)
document.getElementById("cboBackColor" + idx).value = "";

// 不正な文字を取り除く
document.getElementById("txtBackColor" + idx).value = toHex(document.getElementById("txtBackColor" + idx).value);

// 背景を更新する
var elem = document.getElementById("font" + idx);
if (elem)
{
// 表示項目が有効なら
var chk = document.getElementById("chkBackEnabled" + idx);
if (chk.checked)
elem.style.backgroundColor = document.getElementById("txtBackColor" + idx).value;
//else
// elem.style.backgroundColor = "";
}
}
//**********************************************************************
// 前景 有効 / 無効
//**********************************************************************
function chkFontEnabled_change(idx)
{
// 前景を更新する
var elem = document.getElementById("font" + idx);
if (elem)
{
// 各表示項目が有効なら
var chk = document.getElementById("chkFontEnabled" + idx);
if (chk.checked)
{
elem.style.color = document.getElementById("txtFontColor" + idx).value;

document.getElementById("txtFontColor" + idx).disabled = false;
document.getElementById("cboFontColor" + idx).disabled = false;
}
else
{
elem.style.color = "#" + document.form1.txtFontColor1.value;

document.getElementById("txtFontColor" + idx).disabled = true;
document.getElementById("cboFontColor" + idx).disabled = true;
}
}
}
//**********************************************************************
// 背景 有効 / 無効
//**********************************************************************
function chkBackEnabled_change(idx)
{
// 背景を更新する
var elem = document.getElementById("font" + idx);
if (elem)
{
// 各表示項目が有効なら
var chk = document.getElementById("chkBackEnabled" + idx);
if (chk.checked)
{
elem.style.backgroundColor = document.getElementById("txtBackColor" + idx).value;

document.getElementById("txtBackColor" + idx).disabled = false;
document.getElementById("cboBackColor" + idx).disabled = false;
}
else
{
elem.style.backgroundColor = ""; // "#" + document.form1.txtBackColor1.value;

document.getElementById("txtBackColor" + idx).disabled = true;
document.getElementById("cboBackColor" + idx).disabled = true;
}
}
}
//**********************************************************************
// 太字
//**********************************************************************
function chkBold_change(idx)
{
var elem = document.getElementById("font" + idx);
if (elem)
{
// 各表示項目が有効なら
var chk = document.getElementById("chkBold" + idx);
if (chk.checked)
elem.style.fontWeight = "bold";
else
elem.style.fontWeight = "";
}
}
//**********************************************************************
// 斜体
//**********************************************************************
function chkItalic_change(idx)
{
var elem = document.getElementById("font" + idx);
if (elem)
{
// 各表示項目が有効なら
var chk = document.getElementById("chkItalic" + idx);
if (chk.checked)
elem.style.fontStyle = "italic";
else
elem.style.fontStyle = "";
}
}
//**********************************************************************
// 下線
//**********************************************************************
function chkUnderLine_change(idx)
{
var elem = document.getElementById("font" + idx);
if (elem)
{
// 各表示項目が有効なら
var chk = document.getElementById("chkUnderLine" + idx);
if (chk.checked)
elem.style.textDecoration = "underline";
else
elem.style.textDecoration = ""; // none
}
}
//**********************************************************************
// "SourceToHtml" の 呼び出し
//**********************************************************************
function callSourceToHtml()
{
// 使用不可
document.form1.cmdExec.disabled = true;

// "SourceToHtml" に 渡す 実行時引数オブジェクト
var arg = new Object();

//入力ファイル名
arg.inFileName = document.form1.txtInFileName.value;

// 出力ファイル名
arg.outFileName = document.form1.txtOutFileName.value;

// 言語タイプ
arg.langType = document.form1.cboLangType.value;

// 出力形式
if (document.form1.optFormatType[0].checked)
arg.formatType = "html";
else
arg.formatType = "rtf";

// 変換対象文字
if (arg.formatType == "html")
arg.escapeChar = document.form1.txtEscapeHtml.value;
else
arg.escapeChar = document.form1.txtEscapeRtf.value;

// 行番号とコードの区切り文字
arg.lineNoDlm = " ";

// 行番号の桁数
arg.lineNoLen = 5;

// 各表示項目の設定
arg.Emphasis = new Array();
for (var i=0;i<13;i++)
arg.Emphasis[i] = new Object();

arg.Emphasis[0].Name = "基本色";
arg.Emphasis[1].Name = "行番号";
arg.Emphasis[2].Name = "予約語";
arg.Emphasis[3].Name = "ディレクティブ";
arg.Emphasis[4].Name = "コメント";
arg.Emphasis[5].Name = "識別子";
arg.Emphasis[6].Name = "文字列";
arg.Emphasis[7].Name = "文字";
arg.Emphasis[8].Name = "数字";
arg.Emphasis[9].Name = "記号";
arg.Emphasis[10].Name = "強調表示1";
arg.Emphasis[11].Name = "強調表示2";
arg.Emphasis[12].Name = "強調表示3";

arg.Emphasis[0].Class = "";
arg.Emphasis[1].Class = "LNO";
arg.Emphasis[2].Class = "KEY";
arg.Emphasis[3].Class = "DIR";
arg.Emphasis[4].Class = "COM";
arg.Emphasis[5].Class = "IDF";
arg.Emphasis[6].Class = "STR";
arg.Emphasis[7].Class = "CHA";
arg.Emphasis[8].Class = "NUM";
arg.Emphasis[9].Class = "DLM";
arg.Emphasis[10].Class = "SP1";
arg.Emphasis[11].Class = "SP2";
arg.Emphasis[12].Class = "SP3";

// 前景色・背景色
for (var i=0;i<13;i++)
{
var idx = i + 1;
arg.Emphasis[i].FontColor = document.getElementById("txtFontColor" + idx).value;
arg.Emphasis[i].BackColor = document.getElementById("txtBackColor" + idx).value;
}

// 有効/無効, 太字, 斜体, 下線
for (var i=1;i<13;i++)
{
var idx = i + 1;
arg.Emphasis[i].FontEnabled = document.getElementById("chkFontEnabled" + idx).checked;
arg.Emphasis[i].BackEnabled = document.getElementById("chkBackEnabled" + idx).checked;
arg.Emphasis[i].Bold = document.getElementById("chkBold" + idx).checked;
arg.Emphasis[i].Italic = document.getElementById("chkItalic" + idx).checked;
arg.Emphasis[i].UnderLine = document.getElementById("chkUnderLine" + idx).checked;

// 有効だが、色を指定していない → 無効にする
if
( (arg.Emphasis[i].FontEnabled)
&& (arg.Emphasis[i].FontColor == arg.Emphasis[0].FontColor)
&& (!arg.Emphasis[i].Bold)
&& (!arg.Emphasis[i].Italic)
&& (!arg.Emphasis[i].UnderLine)
)
arg.Emphasis[i].FontEnabled = false;

if
( (arg.Emphasis[i].BackEnabled)
&& (arg.Emphasis[i].BackColor == arg.Emphasis[0].BackColor)
)
arg.Emphasis[i].BackEnabled = false;
}

// "SourceToHtml" の 呼び出し
main(arg);

// 使用許可
document.form1.cmdExec.disabled = false;
}