//---------------------------------------------------------- // CpptoHtml.mac // C++ソースをHTML変換 // Yamamoto Yasuma 2005/09/06 // http://www7.plala.or.jp/kfb/ // // 選択範囲もしくは全文に対して、以下の処理を行います。 // ・C++キーワードのタグ付け(on/off可能、初期値on) // ・C++コメントのタグ付け // ・タブ->空白変換(空白文字数は秀丸エディタの設定に依存) // ・&,",<,> の文字実体参照変換 // ・改行タグの付加(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 = ""; $CommentEnd = ""; //---------------------------------------------------------- // 内部動作的な変数 //---------------------------------------------------------- //コメントにつけるタグのマーク。まず使わないような文字を指定 $CommentMarkBegin = "\xff0"; $CommentMarkEnd = "\xff1"; //キーワードにつけるタグのマーク。まず使わないような文字を指定 $KeywordMarkBegin = "\xff2"; $KeywordMarkEnd = "\xff3"; //キーワードにつけるタグのマーク、無効化されたもの。上の二つと文字数が同じでないと正しく動作しません $KeywordMarkDisabled = "\xff4"; //キーワード #NumKeyword = 0; call AddKeyword "#define", no; //正規表現を使うときは後ろのフラグをyesにする call AddKeyword "#elif", no; call AddKeyword "#else|else", yes; //重複するので正規表現で一度に変換 call AddKeyword "#endif", no; call AddKeyword "#error", no; call AddKeyword "#if|if", yes; //重複するので正規表現で一度に変換 call AddKeyword "#ifdef", no; call AddKeyword "#ifndef", no; call AddKeyword "#include", no; call AddKeyword "#line", no; call AddKeyword "#undef", no; call AddKeyword "#pragma", no; call AddKeyword "asm", no; call AddKeyword "auto", no; call AddKeyword "bool", no; call AddKeyword "break", no; call AddKeyword "case", no; call AddKeyword "catch", no; call AddKeyword "char", no; call AddKeyword "class", no; call AddKeyword "const", no; call AddKeyword "const_cast", no; call AddKeyword "continue", no; call AddKeyword "default", no; call AddKeyword "delete", no; call AddKeyword "do", no; call AddKeyword "double", no; call AddKeyword "dynamic_cast", no; call AddKeyword "enum", no; call AddKeyword "explicit", no; call AddKeyword "export", no; call AddKeyword "extern", no; call AddKeyword "false", no; call AddKeyword "float", no; call AddKeyword "for", no; call AddKeyword "friend", no; call AddKeyword "goto", no; call AddKeyword "inline", no; call AddKeyword "int", no; call AddKeyword "long", no; call AddKeyword "mutable", no; call AddKeyword "namespace", no; call AddKeyword "new", no; call AddKeyword "operator", no; call AddKeyword "private", no; call AddKeyword "protected", no; call AddKeyword "public", no; call AddKeyword "register", no; call AddKeyword "reinterpret_cast", no; call AddKeyword "return", no; call AddKeyword "short", no; call AddKeyword "signed", no; call AddKeyword "sizeof", no; call AddKeyword "static", no; call AddKeyword "static_cast", no; call AddKeyword "struct", no; call AddKeyword "switch", no; call AddKeyword "template", no; call AddKeyword "this", no; call AddKeyword "throw", no; call AddKeyword "true", no; call AddKeyword "try", no; call AddKeyword "typedef", no; call AddKeyword "typeid", no; call AddKeyword "typename", no; call AddKeyword "union", no; call AddKeyword "unsigned", no; call AddKeyword "using", no; call AddKeyword "virtual", no; call AddKeyword "void", no; call AddKeyword "volatile", no; call AddKeyword "while", no; //---------------------------------------------------------- // メイン処理 //---------------------------------------------------------- $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; if (! #IsKeywordRegular[##i]) { //キーワードが正規表現でない replaceallfast $Keyword[##i], $KeywordMarkBegin + $Keyword[##i] + $KeywordMarkEnd, word, casesense, noregular; } else { //キーワードが正規表現 setsearch $Keyword[##i], 19; gofiletop; while(1) { finddown2; if (result) { $$Found = gettext(foundtopx, foundtopy, foundendx, foundendy); beginsel; moveto foundendx, foundendy; delete; insert $KeywordMarkBegin + $$Found + $KeywordMarkEnd; } else { break; } } } ##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; #IsKeywordRegular[#NumKeyword] = ##2; #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;