/// <summary> /// 既に読み込まれているSQObjectsから生成します。 /// </summary> public static void Generate() { Program.CurrentDir = @"..\Editor\Manual\js\"; var DestTreeFile = "auto-tree.js"; var DestTreeDocument = "auto-document.js"; #region <内部ツリー生成> Console.WriteLine("内部ツリーを生成しています..."); var root = new JSNode("組み込みオブジェクト"); for (var i = 0; i < Enum.GetValues(typeof(RootNode)).Length; i++) { switch ((RootNode)i) { case RootNode.Const: root.SubNodes.Add(new JSNode("定数")); break; case RootNode.Enum: root.SubNodes.Add(new JSNode("列挙体")); break; case RootNode.Function: root.SubNodes.Add(new JSNode("グローバル関数")); break; case RootNode.Value: root.SubNodes.Add(new JSNode("グローバル変数")); break; case RootNode.Class: root.SubNodes.Add(new JSNode("クラス")); break; case RootNode.EventHandler: root.SubNodes.Add(new JSNode("イベントハンドラー")); break; } } CreateJSNodes(root); root.Sort(); #endregion #region <ツリーJS生成> Console.WriteLine("ツリー生成用のJavaScriptを作成します..."); using (var W = new StreamWriter(Program.CurrentDir + DestTreeFile, false, Encoding.UTF8)) { //固定部分 W.WriteLine("// JavaScript Document"); W.WriteLine("// 「組み込みオブジェクト」ツリーと同様の構造を出力します。"); W.WriteLine("document.open();"); W.WriteLine(""); W.WriteLine("var text = \"\""); W.WriteLine(""); W.WriteLine("+ '<div class=\"section\">'"); W.WriteLine("+ '<div class=\"title\"><span class=\"arrow\"></span>組み込みオブジェクト</div>'"); W.WriteLine("+ ' <div class=\"content\">'"); //可変部分 foreach (var node in root.SubNodes) { WriteExtendableNode(node, W, 2); } //固定部分 W.WriteLine("+ ' </div>'"); W.WriteLine("+ '</div>'"); W.WriteLine(";"); W.WriteLine(""); W.WriteLine("document.write(text);"); W.WriteLine("document.close();"); } #endregion #region <ドキュメントJS生成> Console.WriteLine("ドキュメント用のJavaScriptを作成します..."); using (var W = new StreamWriter(Program.CurrentDir + DestTreeDocument, false, Encoding.UTF8)) { //固定部分 W.WriteLine("// JavaScript Document"); W.WriteLine("// 「組み込みオブジェクト」ツリーに対応するドキュメントを出力します。"); W.WriteLine("function GenerateAutoDocument(strClassPath) {"); W.WriteLine(" var div = document.getElementById(\"mainContainer\");"); W.WriteLine(" div.innerHTML = \"<div id =\\\"breadcrumb\\\"><a href=\\\"index.html\\\">HOME</a> > 組み込みオブジェクト</div>\";"); W.WriteLine(" div.innerHTML += generator(strClassPath);"); //W.WriteLine(" div.innerHTML += generator[strClassPath]();"); W.WriteLine("}"); W.WriteLine(""); W.WriteLine("function generator(strClassPath) {"); //W.WriteLine("var generator = {"); W.WriteLine(" switch(strClassPath) {"); //可変部分 foreach (var obj in GenerateCPPDocument.SQObjects) { var buf = $" case \"{obj.ClassPath.Replace("\\", ":")}\": return \""; //string buf = $"[\"{obj.ClassPath.Replace("\\", ":")}\"]() {{ return \""; //タイトル見出し buf += $"<h2>{obj.Summary}</h2>"; if (!string.IsNullOrEmpty(obj.Comment)) { //DXライブラリのリファレンスマニュアルにはリンクを挿入する if (obj.Comment.IndexOf("DXライブラリのリファレンスマニュアル") != -1) { obj.Comment = obj.Comment.Replace("DXライブラリのリファレンスマニュアル", "DXライブラリの<a href=\\\"http://dxlib.o.oo7.jp/dxfunc.html\\\" target=\\\"_blank\\\">リファレンスマニュアル</a>"); } //末尾以外の句点には改行を挿入する buf += $"<div class=\\\"text\\\">{obj.Comment.TrimEnd(new char[] { '。' }).Replace(" 。 ", " 。 <br> ")}。<hr>"; } else { buf += $"<div class=\\\"text\\\">特に解説はありません。<hr>"; } //種別に応じて表記内容を変える switch (obj.NodeID) { case GenerateCPPDocument.ObjectType.Const: switch (obj.SubType) { case GenerateCPPDocument.ObjectSubType.Const: buf += "<h3>定義位置</h3>"; buf += $"<div class=\\\"text\\\">{obj.ClassPath.Replace("\\", "::")}</div>"; buf += "<h3>オブジェクト種別</h3>"; buf += "<div class=\\\"text\\\">定数</div>"; break; case GenerateCPPDocument.ObjectSubType.Enum: buf += "<h3>定義位置</h3>"; buf += $"<div class=\\\"text\\\">{obj.ClassPath.Replace("\\", "::")}</div>"; buf += "<h3>オブジェクト種別</h3>"; buf += "<div class=\\\"text\\\">列挙体</div>"; break; case GenerateCPPDocument.ObjectSubType.EnumMember: buf += "<h3>定義位置</h3>"; buf += $"<div class=\\\"text\\\">{obj.ClassPath.Replace("\\", "::")}</div>"; buf += "<h3>オブジェクト種別</h3>"; buf += "<div class=\\\"text\\\">列挙体メンバー</div>"; break; } break; case GenerateCPPDocument.ObjectType.Value: case GenerateCPPDocument.ObjectType.GameObject: switch (obj.SubType) { case GenerateCPPDocument.ObjectSubType.Class: buf += "<h3>定義位置</h3>"; buf += $"<div class=\\\"text\\\">{obj.ClassPath.Replace("\\", "::")}</div>"; buf += "<h3>オブジェクト種別</h3>"; buf += "<div class=\\\"text\\\">クラス</div>"; buf += "<h3>継承元クラス</h3>"; if (!string.IsNullOrEmpty(obj.SuperClassName)) { buf += $"<div class=\\\"text\\\">{obj.SuperClassName}</div>"; } else { buf += $"<div class=\\\"text\\\">継承しているクラスはありません。</div>"; } break; case GenerateCPPDocument.ObjectSubType.ClassValue: case GenerateCPPDocument.ObjectSubType.GlobalValue: case GenerateCPPDocument.ObjectSubType.MemberValue: case GenerateCPPDocument.ObjectSubType.MemberProperty: buf += "<h3>定義位置</h3>"; buf += $"<div class=\\\"text\\\">{obj.ClassPath.Replace("\\", "::")}</div>"; buf += "<h3>オブジェクト種別</h3>"; switch (obj.SubType) { case GenerateCPPDocument.ObjectSubType.ClassValue: buf += "<div class=\\\"text\\\">静的変数</div>"; break; case GenerateCPPDocument.ObjectSubType.GlobalValue: buf += "<div class=\\\"text\\\">グローバル変数</div>"; break; case GenerateCPPDocument.ObjectSubType.MemberValue: buf += "<div class=\\\"text\\\">メンバー変数</div>"; break; case GenerateCPPDocument.ObjectSubType.MemberProperty: buf += "<div class=\\\"text\\\">メンバープロパティ</div>"; break; } buf += "<h3>型</h3>"; buf += $"<div class=\\\"text\\\">{obj.ReturnType}</div>"; break; case GenerateCPPDocument.ObjectSubType.ClassFunc: case GenerateCPPDocument.ObjectSubType.GlobalFunc: case GenerateCPPDocument.ObjectSubType.MemberFunc: buf += "<h3>定義位置</h3>"; buf += $"<div class=\\\"text\\\">{obj.ClassPath.Replace("\\", "::")}</div>"; buf += "<h3>オブジェクト種別</h3>"; switch (obj.SubType) { case GenerateCPPDocument.ObjectSubType.ClassFunc: buf += "<div class=\\\"text\\\">静的関数</div>"; break; case GenerateCPPDocument.ObjectSubType.GlobalFunc: buf += "<div class=\\\"text\\\">グローバル関数</div>"; break; case GenerateCPPDocument.ObjectSubType.MemberFunc: buf += "<div class=\\\"text\\\">メンバー関数</div>"; break; } //引数リスト buf += "<h3>引数リスト</h3><div class=\\\"text\\\">"; if (obj.ArgumentList.Count > 0) { buf += "<ul>"; for (var i = 0; i < obj.ArgumentList.Count; i++) { buf += $"<li>第{i + 1}引数 [{obj.ArgumentList[i]}]: {obj.ArgComments[i]}</li>"; } buf += "</ul>"; } else { buf += "引数はありません。"; } buf += "</div>"; //戻り値 if (obj.ReturnType != "void") { buf += $"<h3>戻り値</h3><div class=\\\"text\\\">{obj.ReturnType}: {obj.ReturnComment.Replace("。", "。<br>")}</div>"; } else { buf += $"<h3>戻り値</h3><div class=\\\"text\\\">{obj.ReturnType}: 戻り値はありません。</div>"; } break; } break; case GenerateCPPDocument.ObjectType.SQEventHandler: buf += "<h3>関数名</h3>"; buf += $"<div class=\\\"text\\\">{obj.Name}</div>"; buf += "<h3>オブジェクト種別</h3>"; buf += "<div class=\\\"text\\\">スクリプト関数定義/イベントハンドラー</div>"; //引数リスト buf += "<h3>引数リスト</h3><div class=\\\"text\\\">"; if (obj.ArgumentList.Count > 0) { buf += "<ul>"; for (var i = 0; i < obj.ArgumentList.Count; i++) { buf += $"<li>第{i + 1}引数 [{obj.ArgumentList[i]}]: {obj.ArgComments[i]}</li>"; } buf += "</ul>"; } else { buf += "引数はありません。"; } buf += "</div>"; //戻り値 if (obj.ReturnType != "void") { buf += $"<h3>戻り値</h3><div class=\\\"text\\\">{obj.ReturnType}: {obj.ReturnComment.Replace("。", "。<br>")}</div>"; } else { buf += $"<h3>戻り値</h3><div class=\\\"text\\\">{obj.ReturnType}: 戻り値はありません。</div>"; } break; } buf += "</div>"; //buf += "\"; },"; buf += "\";"; W.WriteLine(buf); } //固定部分 W.WriteLine(" }"); W.WriteLine("}"); //W.WriteLine("};"); } #endregion Console.WriteLine($"\nHTML用のJavaScriptの生成が完了しました ->\n\t{DestTreeFile}\n\t{DestTreeDocument}\n"); }