//----------------------------------------------------------
// JavatoHtml.mac
// JavaソースをHTML変換
// Yamamoto Yasuma 2005/09/06
// http://www7.plala.or.jp/kfb/
//
// 選択範囲もしくは全文に対して、以下の処理を行います。
// ・Javaキーワードのタグ付け(on/off可能、初期値on)
// ・Javaコメントのタグ付け
// ・タブ->空白変換(空白文字数は秀丸エディタの設定に依存)
// ・&,",<,> の文字実体参照変換
// ・改行タグの付加(on/off可能、初期値off)
// ・ヘッダ・フッタの付加(on/off可能、初期値on)
//
// シフトJISでの動作を想定しています。
// コメント内・ダブルクォート内にキーワードとマッチする文字列があっても、タグをつけません。
// 数万行に達するようなコードを変換するには時間を要します。
// カスタマイズは以下ソースのオプション部分を変更してください。
//----------------------------------------------------------
title "セットアップ中...";
disabledraw;
//----------------------------------------------------------
// オプション
//----------------------------------------------------------
//デバッグするか
#Debug = no;
//ヘッダ・フッタを付加するか
#DoAddHeaderFooter = yes;
//ソースの前に付加する文字列
$Header = "
\n";
//ソースの後に付加する文字列
$Footer = "
\n";
//改行タグを入れるか
#DoReplaceLineBreak = no;
//改行タグ
$LineBreak = "
";
//キーワード強調を行うか?
#DoEmphasizeKeyword = yes;
//キーワードに付加するタグ
$KeywordBegin = "";
$KeywordEnd = "";
//コメントに付加するタグ
$CommentBegin = "";
//----------------------------------------------------------
// 内部動作的な変数
//----------------------------------------------------------
//コメントにつけるタグのマーク。まず使わないような文字を指定
$CommentMarkBegin = "\xff0";
$CommentMarkEnd = "\xff1";
//キーワードにつけるタグのマーク。まず使わないような文字を指定
$KeywordMarkBegin = "\xff2";
$KeywordMarkEnd = "\xff3";
//キーワードにつけるタグのマーク、無効化されたもの。上の二つと文字数が同じでないと正しく動作しません
$KeywordMarkDisabled = "\xff4";
//キーワード
#NumKeyword = 0;
call AddKeyword "abstract";
call AddKeyword "boolean";
call AddKeyword "break";
call AddKeyword "byte";
call AddKeyword "case";
call AddKeyword "catch";
call AddKeyword "char";
call AddKeyword "class";
call AddKeyword "continue";
call AddKeyword "default";
call AddKeyword "do";
call AddKeyword "double";
call AddKeyword "else";
call AddKeyword "enum";
call AddKeyword "extends";
call AddKeyword "false";
call AddKeyword "final";
call AddKeyword "finally";
call AddKeyword "float";
call AddKeyword "for";
call AddKeyword "if";
call AddKeyword "implements";
call AddKeyword "import";
call AddKeyword "instanceof";
call AddKeyword "int";
call AddKeyword "interface";
call AddKeyword "long";
call AddKeyword "native";
call AddKeyword "new";
call AddKeyword "null";
call AddKeyword "package";
call AddKeyword "private";
call AddKeyword "protected";
call AddKeyword "public";
call AddKeyword "return";
call AddKeyword "short";
call AddKeyword "static";
call AddKeyword "super";
call AddKeyword "switch";
call AddKeyword "synchronized";
call AddKeyword "this";
call AddKeyword "throw";
call AddKeyword "throws";
call AddKeyword "transient";
call AddKeyword "true";
call AddKeyword "try";
call AddKeyword "void";
call AddKeyword "volatile";
call AddKeyword "while";
//----------------------------------------------------------
// メイン処理
//----------------------------------------------------------
$SearchBuffer = searchbuffer;
#SearchOption = searchoption;
$ReplaceBuffer = replacebuffer;
//選択範囲をテンポラリに持っていく
if( !selecting )
selectall;
call MoveTemp;
#SrcHidemaru = ##return;
//キーワードにマークをつける
if (#DoEmphasizeKeyword)
{
##i = 0;
call TitleMsg "キーワード処理中...";
// $$MsgNumKeyword = "/" + str(#NumKeyword) + ")";
while (##i < #NumKeyword)
{
// call TitleMsg "キーワード処理中(" + str(##i + 1) + $$MsgNumKeyword;
replaceallfast $Keyword[##i], $KeywordMarkBegin + $Keyword[##i] + $KeywordMarkEnd, word, casesense, noregular;
##i = ##i + 1;
}
}
//コメント処理
gofiletop;
#Finished = false;
call TitleMsg "コメント処理中...";
//$$MsgLineCount = "/" + str(linecount2) + ")";
while (! #Finished)
{
//コメント開始点を探す
// call TitleMsg "コメント処理中(" + str(lineno) + $$MsgLineCount;
searchdown2 "/\\*|//|\"|'", casesense, regular; // /*,//,",'にヒット
if (!result)
{
//終了
#Finished = true;
}
else
{
##ComX = foundtopx;
##ComY = foundtopy;
moveto foundendx - 1, foundendy;
if (code == 0x2a) // *
{
// "/*"コメント
moveto ##ComX, ##ComY; // コメント記号の前に移動
insert $CommentMarkBegin;
right;
right;
##ComBeginX = x;
##ComBeginY = y;
// コメント終了点を探す
searchdown2 "*/", casesense, noregular;
if (result)
{
moveto foundendx, foundendy;
}
else
{
gofileend;
#Finished = true;
}
call DisableKeywordMark ##ComBeginX, ##ComBeginY;
insert $CommentMarkEnd;
}
else
{
if (code == 0x2f) // /
{
// "//"コメント
moveto ##ComX, ##ComY; // コメント記号の前に移動
insert $CommentMarkBegin; //コメント開始タグを挿入
right;
right;
##ComBeginX = x;
##ComBeginY = y;
golineend2; //コメント終了位置(行の最後)に移動
call DisableKeywordMark ##ComBeginX, ##ComBeginY;
insert $CommentMarkEnd;
}
else
{
if (code == 0x22) // "
{
// 開始点まで移動
moveto ##ComX, ##ComY;
// 終了点を探す
setsearch "\"", 2;
while(1)
{
finddown;
if (result)
{
call IsEscape;
if (! ##return)
{
right;
break;
}
}
else
{
gofileend;
#Finished = true;
break;
}
}
call DisableKeywordMark ##ComX, ##ComY;
}
else
{ // '
// 終了点を探す
setsearch "'", 2;
while(1)
{
finddown;
if (result)
{
call IsEscape;
if (! ##return)
{
right;
break;
}
}
else
{
gofileend;
#Finished = true;
break;
}
}
}
}
}
}
}
//タブ->空白変換と実体参照変換
call TitleMsg "タブ・実体参照変換中...";
selectall;
tospace;
replaceallfast "&", "&";
replaceallfast "\"", """;
replaceallfast "<", "<";
replaceallfast ">", ">";
//マークを変換
call TitleMsg "マーク変換中...";
if (#DoEmphasizeKeyword)
{
replaceallfast $KeywordMarkDisabled, "", casesense, noregular;
replaceallfast $KeywordMarkBegin, $KeywordBegin, casesense, noregular;
replaceallfast $KeywordMarkEnd, $KeywordEnd, casesense, noregular;
}
replaceallfast $CommentMarkBegin, $CommentBegin, casesense, noregular;
replaceallfast $CommentMarkEnd, $CommentEnd, casesense, noregular;
//改行タグを入れる
if (#DoReplaceLineBreak)
{
call TitleMsg "改行タグ追加中...";
gofiletop;
while (lineno < linecount2)
{
golineend2;
insert $LineBreak;
down;
}
golineend2;
insert $LineBreak;
}
//ヘッダ・フッタを入れる
call TitleMsg "終了処理中...";
if (#DoAddHeaderFooter)
{
gofiletop;
insert $Header;
gofileend;
insert $Footer;
}
//テンポラリを閉じる
call ReturnTemp #SrcHidemaru;
setsearch $SearchBuffer, #SearchOption;
setreplace $ReplaceBuffer;
enabledraw;
endmacro;
//----------------------------------------------------------
// サブルーチン
//----------------------------------------------------------
//キーワード追加
AddKeyword:
$Keyword[#NumKeyword] = $$1;
#NumKeyword = #NumKeyword + 1;
return;
//キーワードマークを無効に
DisableKeywordMark:
if (! #DoEmphasizeKeyword) return;
##EndX = x;
##EndY = y;
insert $KeywordMarkBegin; //終点に番兵を置く
moveto ##1, ##2;
setsearch $KeywordMarkBegin + "|" + $KeywordMarkEnd, 18;
while(1)
{
finddown2;
// if (result)
// {
if (x == ##EndX && y == ##EndY)
{
beginsel;
moveto foundendx, foundendy;
delete; //番兵を消す
break;
}
else
{
overwrite $KeywordMarkDisabled; //無効化
}
// }
// else
// {
// break;
// }
}
return;
//エスケープ文字かどうかを判別
IsEscape:
##PosX = x;
##PosY = y;
left;
if (code == 0x5c) //\
{
left;
if (code == 0x5c)
{
moveto ##PosX, ##PosY;
return false;
}
else
{
moveto ##PosX, ##PosY;
return true;
}
}
moveto ##PosX, ##PosY;
return false;
//作業用秀丸に移動
MoveTemp:
cut;
##SrcHidemaru = hidemaruhandle(0);
if (#Debug)
{
newfile;
}
else
{
openfile "/h";
}
paste;
return ##SrcHidemaru;
//作業用秀丸から戻る
ReturnTemp:
selectall;
copy;
##TempHidemaru = hidemaruhandle(0);
setactivehidemaru ##1;
closehidemaruforced ##TempHidemaru;
paste;
return;
//タイトルにメッセージを出す(テンポラリ作業中)
TitleMsg:
##TempHidemaru = hidemaruhandle(0);
setactivehidemaru #SrcHidemaru;
title $$1;
setactivehidemaru ##TempHidemaru;
return;