Exemple #1
0
        /// <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> &gt; 組み込みオブジェクト</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");
        }