cpp2html2.wsf


000001| <Job id="cpp2HTML"> 000002| <Script Language=JavaScript> 000003| ///////////////////////////////////////////////////// 000004| //C++,JScriptソースをHTMLにコンバートするスクリプト 000005| // 000006| // 2001/7/26 000007| // 000008| // Copyright (C) 2001 Satoshi Fujiwara 000009| ///////////////////////////////////////////////////// 000010| 000011| // Constants // 000012| 000013| // サポートするファイル拡張子 000014| SupportFileType = new Array("CPP","H","C","WSF","JS","JAVA"); 000015| // コメントの色 000016| var CommentColor = "green"; 000017| var KeywordsColor = "blue"; 000018| 000019| var NamespaceColor = "darkblue"; 000020| var ClassColor = "Brown"; 000021| var InterfaceColor = "red"; 000022| var AbstractColor = "orange"; 000023| 000024| // エスケープ文字 000025| var EscChar = new Array(new Array("&","&amp;"),new Array("<","&lt;"),new Array(">","&gt;"),new Array(" "," ")); 000026| 000027| // C++キーワード 000028| var CPPKeywords = new Array( 000029| // プリプロセッサ 000030| "#if","#include","#define","#ifdef","#endif","#pragma","#error","#else", 000031| "#import","#undef","#elif","#line","#ifndef", 000032| // キーワード 000033| "for","if","while","else","return","int","float","unsigned","class","const", 000034| "switch","case","default","try","catch","do","volatile","private","public","static", 000035| "protected","std","using","namespace","double","short","bool","void","virtual","char","long", 000036| "asm","continue","defult","inline","enum","new","delete","operator","template", 000037| "typeid","interface","finally","goto","mutable","throw","sizeof","typename","auto", 000038| "bad_cast","bad_typeid","break","const_cast","dynamic_cast","except","explicit", 000039| "extern","false","true","friend","goto","mutable","register","reinterpret_cast", 000040| "return","signed","static_cast","struct","this","typedef","union","using", 000041| // MS固有 000042| "allocate","__asm","__inline","property","__int8","selectany","__based","__int16", 000043| "__cdecl","__int32","__stdcall","__declspec","__int64","thread","dllexport","__leave", 000044| "__try","dllimport","__multiple_inheritance","uuid","__except","naked","__uuidof","__fastcall", 000045| "nothrow","__virtual_inheritance","__finally" 000046| ); 000047| 000048| // JScript キーワード 000049| var JSKeywords = new Array( 000050| "break","delete","function","return","typeof", 000051| "case","do","if","switch","var", 000052| "catch","else","in","this","void", 000053| "continue","false","instanceof","throw","while", 000054| "debugger","finally","new","true","with", 000055| "default","for","null","try", 000056| //将来的に使用される予約語 000057| "abstract","double","goto","native","static", 000058| "boolean","enum","implements","package","super", 000059| "byte","export","import","private","synchronized", 000060| "char","extends","int","protected","throws", 000061| "class","final","interface","public","transient", 000062| "const","float","long","short","volatile", 000063| //オブジェクト 000064| "Array","Boolean","Date","Function","Global","Math","Number","Object","RegExp","Error","String", 000065| "Enumerator", 000066| // MS固有 000067| "VBArray" 000068| ); 000069| 000070| // 言語別キーワードを、拡張子で判別する連想配列 000071| var SupportKeywords = { 000072| "C" : CPPKeywords, 000073| "CPP" : CPPKeywords, 000074| "H" : CPPKeywords, 000075| "WSF" : JSKeywords, 000076| "JS" : JSKeywords, 000077| "JAVA" : CPPKeywords 000078| }; 000079| 000080| // JScriptキーワード 000081| 000082| var Keywords = new Array(); 000083| var Keywords1 = new Array(); 000084| var KeyWords2 = new Array(); 000085| var KeyWords3 = new Array(); 000086| 000087| // 必要であれば以下を編集 000088| // ユーザー定義クラス 000089| 000090| // インターフェース 000091| var Interfaces = new Array("Characters","Character","Interface","System","Input","Sound","Scene","Listener"); 000092| // クラス 000093| var Classes = new Array("ZK01","ZK02","SystemImpl","InputImpl","SoundImpl","Bullets","Enemys","Armys"); 000094| // 抽象クラス 000095| var AbstractClasses = new Array("Abstract","AbstractCharacter","AbstractCharacters"); 000096| // 名前空間 000097| var Namespaces = new Array("sf","system","console","input","keyboard","mouse","application","sound","command","std"); 000098| 000099| var tab = 4; 000100| var outputFile; 000101| 000102| var CommentTagBegin = "<font color=\"" + CommentColor + "\">"; 000103| var CommentTagEnd = "</font>"; 000104| 000105| var fs = new ActiveXObject("Scripting.FileSystemObject"); 000106| 000107| // メイン // 000108| function main() 000109| { 000110| var oArgs = WScript.Arguments; // パラメータ 000111| for(var i = 0;i < oArgs.Count();i++){ 000112| var path = oArgs(i); // path 000113| if(fs.FileExists(path)){ 000114| makeHTMLFile(path); 000115| } else { 000116| if(fs.FolderExists(path)){ 000117| makeFolderHTML(path); 000118| } 000119| } 000120| } 000121| }// main() 000122| 000123| // フォルダーの中身を列挙してHTMLファイルを作る 000124| function makeFolderHTML(path) 000125| { 000126| var files = new Enumerator(fs.GetFolder(path).files); 000127| for (; !files.atEnd(); files.moveNext()){ 000128| makeHTMLFile(files.item().Path); 000129| } 000130| var folders = new Enumerator(fs.GetFolder(path).subfolders); 000131| for (; !folders.atEnd(); folders.moveNext()){ 000132| makeFolderHTML(folders.item().Path); 000133| } 000134| 000135| }// MakeFolderHTML 000136| 000137| // ソースファイル→HTML // 000138| function makeHTMLFile(fname){ 000139| // 初期化 000140| var lineNumber = 1; // 行番号 000141| var outString = ""; // 出力HTMLバッファ 000142| var ext = ""; // 拡張子 000143| 000144| try { 000145| ext = checkFileType(fname); 000146| } catch(e) { 000147| return; 000148| } 000149| 000150| try { 000151| var inputFile = fs.OpenTextFile(fname,1); 000152| } catch(e) { 000153| WScript.Echo("ファイルオープンエラー:" + e); 000154| WScript.Quit(); 000155| } 000156| 000157| outputFile = fs.CreateTextFile(fname.replace(/\.(.*)/,"_$1.html")); 000158| var srcName = fname.split(/\\/); 000159| 000160| // ソースファイルネームを取り出す。 000161| 000162| srcName = srcName[srcName.length - 1]; 000163| writeHeader(srcName); 000164| 000165| setupKeywords(ext); 000166| 000167| outputFile.WriteLine("<body><pre>"); 000168| outputFile.WriteLine("<p>" + srcName + "</p><hr/>"); 000169| // outputFile.WriteLine("000000| 000-------010-------020-------030-------040-------050-------060-------070-------080-------090-------100-------"); 000170| 000171| var bBackSlash = false; 000172| var bComment = false; 000173| var bString = false; 000174| 000175| while(!inputFile.AtEndOfStream){ 000176| var s = inputFile.ReadLine(); 000177| var sresult = ""; 000178| bBackSlash = false; 000179| bString = false; 000180| 000181| if(s.length != 0){ 000182| var i = 0; 000183| var fragment = ""; 000184| 000185| // タブ→スペース変換 000186| s = checkTab(s); 000187| 000188| // エスケープキャラクタ 000189| s = checkEscape(s); 000190| 000191| while(i < s.length){ 000192| var character = s.substr(i,1); 000193| switch(character) 000194| { 000195| // スラッシュ 000196| case "/": 000197| if((!bBackSlash) && (!bString) && (!bComment)){ 000198| var character1 = s.substr(i + 1,1); 000199| switch(character1){ 000200| case "*": 000201| bComment = true; 000202| fragment = checkKeywords(KeywordsColor,fragment); 000203| sresult += fragment + CommentTagBegin + character + character1; 000204| i ++; 000205| fragment = ""; 000206| character = ""; 000207| break; 000208| 000209| case "/": 000210| fragment = checkKeywords(KeywordsColor,fragment); 000211| sresult += fragment + CommentTagBegin + s.substr(i,s.length - i) + CommentTagEnd; 000212| i = s.length; 000213| fragment = ""; 000214| character = ""; 000215| break; 000216| } 000217| } 000218| break; 000219| 000220| // ダブルコーテーション 000221| case "\"": 000222| if((!bBackSlash) && (!bComment)){ 000223| if(bString){ 000224| sresult += "\""; 000225| character = ""; 000226| bString = false; 000227| } else { 000228| fragment = checkKeywords(KeywordsColor,fragment); 000229| sresult += fragment + "\""; 000230| character = ""; 000231| fragment = ""; 000232| bString = true; 000233| } 000234| } 000235| break; 000236| 000237| case "*": 000238| if(bComment){ 000239| if(s.substr(i + 1,1) == "/"){ 000240| bComment = false; 000241| sresult += "*/" + CommentTagEnd; 000242| character = ""; 000243| fragment = ""; 000244| i++; 000245| } 000246| } 000247| break; 000248| } 000249| 000250| // バックスラッシュチェック 000251| if(character == "\""){ 000252| if(bBackSlash) 000253| bBackSlash = false; 000254| else 000255| bBackSlash = true; 000256| } else { 000257| bBackSlash = false; 000258| } 000259| 000260| i++; 000261| if(bComment || bString) 000262| sresult += character; 000263| else 000264| fragment += character; 000265| } 000266| 000267| } 000268| fragment = checkKeywords(KeywordsColor,fragment); 000269| outString += getLineNumber(lineNumber) + sresult + fragment + "\r\n"; 000270| fragment = ""; 000271| lineNumber++; 000272| } 000273| 000274| outString += "</pre></body>"; 000275| writeTail(outString); 000276| 000277| outputFile.Write(outString); 000278| outputFile.Close(); 000279| inputFile.CLose(); 000280| 000281| }// MakeHTMLFile 000282| 000283| 000284| // エスケープキャラクターのチェック // 000285| function checkEscape(s) 000286| { 000287| for(var i = 0;i < EscChar.length;i++){ 000288| s = s.replace(new RegExp(EscChar[i][0],"g"),EscChar[i][1]); 000289| } 000290| return s; 000291| }// checkEscape 000292| 000293| 000294| // タブのチェック 000295| 000296| var CheckTabRegEx = /\t/; 000297| 000298| function checkTab(s) 000299| { 000300| while(s.match(CheckTabRegEx)){ 000301| var l = s.search(CheckTabRegEx); 000302| l = tab - l % tab; 000303| s = s.replace(/\t/," ".substr(0,l)); 000304| } 000305| return s; 000306| }// checkTab 000307| 000308| 000309| // スペース文字列を返す 000310| function space(l) 000311| { 000312| var s = ""; 000313| 000314| for(var i = 0;i < l;i++) 000315| { 000316| s += " "; 000317| } 000318| return s; 000319| }// space 000320| 000321| // ヘッダー 000322| function writeHeader(title) 000323| { 000324| outputFile.WriteLine("<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>"); 000325| outputFile.WriteLine("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/strict.dtd\">"); 000326| outputFile.WriteLine("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">"); 000327| outputFile.WriteLine("<head>"); 000328| outputFile.WriteLine("<title>" + title + "</title>"); 000329| outputFile.WriteLine("</head>"); 000330| }// writeHeader 000331| 000332| function writeTail(outString){ 000333| outString = "</html>\n"; 000334| }// writeTail 000335| 000336| // キーワードのチェック 000337| function checkKeywords(color,s) 000338| { 000339| for(var i = 0;i < Keywords.length;i++) 000340| { 000341| s = s.replace(Keywords[i],"<font color=\"" + color + "\">$1</font>$2"); 000342| s = s.replace(Keywords1[i],"$1<font color=\"" + color + "\">$2</font>$3"); 000343| } 000344| return s; 000345| }// checkKeywords 000346| 000347| 000348| 000349| 000350| // 行番号の取得 000351| function getLineNumber(lineNumber) 000352| { 000353| var s = "000000" + lineNumber; 000354| return s.substr(s.length - 6,6) + "| " ; 000355| }// getLineNumber 000356| 000357| 000358| //ファイルフォーマットのチェック 000359| // サポートしているファイルフォーマットかどうかチェックし、拡張子を返す。 000360| function checkFileType(fname) 000361| { 000362| var ext = fname.split(/\./); 000363| 000364| ext = ext[1].toUpperCase(); 000365| 000366| for(i = 0 ; i < SupportFileType.length ; i++){ 000367| if(SupportFileType[i] == ext){ 000368| return ext; 000369| } 000370| } 000371| 000372| throw "このファイルタイプは、サポートされていません。 interface "; 000373| 000374| }// checkFileType 000375| 000376| //拡張子ごとのキーワードリストのセットアップ 000377| // 若干の高速化をはかるため、このようなことをしている。 000378| function setupKeywords(ext) 000379| { 000380| var tmpKeywords = SupportKeywords[ext]; 000381| var sepChar = "[\\s\\)\\(\\{\\};:\\,\\*&\\[\\]\\/]"; 000382| for(var i = 0;i < tmpKeywords.length;i++){ 000383| var re = new RegExp("(^" + tmpKeywords[i] + ")(" + sepChar + "|$)","g"); 000384| Keywords[i] = re; 000385| var re1 = new RegExp("(" + sepChar + ")(" + tmpKeywords[i] + ")(" + sepChar + "|$)","g"); 000386| Keywords1[i] = re1; 000387| } 000388| }// setupKeywords 000389| 000390| // main // 000391| main(); 000392| </SCRIPT> 000393| </Job>