// 正解データと比較して結果を生成する private static void CompareDirectories(HTMLWriter hw, String strCorrectDataPath, String strDirName ) { if (Directory.Exists(strCorrectDataPath)) { foreach (var cmpfile in Directory.GetFiles(strCorrectDataPath)) { // 比較正解データが.pngかをチェックする if (!cmpfile.EndsWith(".png")) continue; // 比較先が存在するかをチェックする String strCmpFileName = new FileInfo(cmpfile).Name; // 名前だけを取り出す if (File.Exists(strCmpFileName)) { CompareImage( hw, strDirName, strCmpFileName, strCorrectDataPath + "\\" + strCmpFileName ); } else { hw.MissingCompareImage( strDirName, strCmpFileName ); } hw.WriteLine(); } } }
private void WriteStyles(HTMLWriter writer) { writer.StartTag("style", "type=\"text/css\""); { writer.WriteValue("body { background: #202020; color: #b3b3b3; font-family: sans-serif; }"); writer.WriteValue("a { color: #9e9e9e; }"); writer.WriteValue(".field_type { background: #418dff; color: #000; text-align: center; border: 1px solid #203e6b; padding: 3px; }"); writer.WriteValue(".field_value { background: #000; color: #fff; border: 1px solid black; padding: 3px; }"); writer.WriteValue(".fields_table { font-size: 10px; margin: 5px; }"); writer.WriteValue(".fsm_state { background: #252525; color: #a9a9a9; border: 1px solid #cecece; margin: 10px; width: 600px; }"); writer.WriteValue(".fsm_active_state { border: 2px solid gold; }"); writer.WriteValue(".fsm_state_name { background: #101010; padding: 10px; }"); writer.WriteValue(".error { background: #a90000; }"); writer.WriteValue(".fsm_action { background: #383838; border: 1px solid #000000; margin: 5px; border-radius: 5px; }"); writer.WriteValue(".fsm_action_name { padding: 10px; font-size: 14px; font-weight: bold; border-bottom: 1px solid black; }"); writer.WriteValue(".variable_ref { background: #ffb441; color: #000; font-size: 9px; display: inline-block; border-radius: 3px; border: 1px solid #6b4b1a; }"); writer.WriteValue(".transition_table { margin: 2px; font-size: 12px; }"); writer.WriteValue(".state_phase { background: #383838; border: 1px solid #000000; margin: 5px; border-radius: 5px; font-size: 18px; text-align: center; }"); writer.WriteValue(".arrow { border: solid #909090; border-width: 0 2px 2px 0; display: inline-block; padding: 10px; width: 1px; }"); writer.WriteValue(".right { transform: rotate(-45deg); -webkit-transform: rotate(-45deg); }"); writer.WriteValue(".left { transform: rotate(135deg); -webkit-transform: rotate(135deg); }"); writer.WriteValue(".up { transform: rotate(-135deg); -webkit-transform: rotate(-135deg); }"); writer.WriteValue(".down { transform: rotate(45deg); -webkit-transform: rotate(45deg); }"); writer.WriteValue(".center_arrow { margin-left: 289px; margin-top: -10px; margin-bottom: 2px; }"); } writer.EndTag(); }
/// 画像を比較する private static void CompareImage( HTMLWriter hw, String strDirName, String strCmpFileName, String strCorrectImagePath ) { // 結果ファイルとの比較の作成 Bitmap imageResult = new Bitmap(Image.FromFile(strCmpFileName)); Bitmap imageCorrect = new Bitmap(Image.FromFile(strCorrectImagePath)); if (imageResult.Size != imageCorrect.Size) { hw.ImageSizeDifferent(strDirName, strCmpFileName); } else { // サイズが同じ.比較画像の作成 double dErrorSum = 0; int nErrorCnt = 0; var sizeImage = imageResult.Size; Bitmap imageCompare = new Bitmap(sizeImage.Width, sizeImage.Height); for (int iy = 0; iy < sizeImage.Height; ++iy) { for (int ix = 0; ix < sizeImage.Width; ++ix) { var pixel1 = imageResult.GetPixel(ix, iy); var pixel2 = imageCorrect.GetPixel(ix, iy); var pixel3 = Color.FromArgb(pixel1.R ^ pixel2.R, pixel1.G ^ pixel2.G, pixel1.B ^ pixel2.B); imageCompare.SetPixel(ix, iy, pixel3); dErrorSum += pixel3.R + pixel3.G + pixel3.B; ++nErrorCnt; } } // 比較した結果の画像を保存 String strTmpPath = "..\\" + strCmpImageFolderName + "\\" + strCmpFileName; imageCompare.Save(strTmpPath, ImageFormat.Png); // エラーとみなす閾値を超えているかのチェック bool bError = dErrorSum >= 10000; if (!bError) { // エラーが少ないときの対処 // 何も表示しない #if false // hw.WriteNoError(strDirName, strCmpFileName); #else return; #endif } else { hw.WriteErrorValue(dErrorSum); // エラー値を表示する hw.WriteTestResult(strDirName, strCmpFileName); } } }
/// <summary> /// Dump world to the given folder. /// </summary> /// <param name="folder">The folder without trailing slash to dump world to - /// must exists.</param> public void Dump(string folder) { UnityEngine.Object[] objects = Resources.FindObjectsOfTypeAll <UnityEngine.Object>(); cssStylePath = $"{folder}/style.css"; WriteStyles(); HTMLWriter.WriteDocument( $"{folder}/index.html", "INDEX", cssStylePath, (HTMLWriter writer) => { writer.StartTag("table"); writer.StartTag("tr"); { writer.OneLiner("td", "#"); writer.OneLiner("td", "Name"); writer.OneLiner("td", "Type"); } writer.EndTag(); int index = 1; foreach (var obj in objects) { if (CanSkipObject(obj)) { continue; } writer.StartTag("tr"); { writer.OneLiner("td", index.ToString()); string objectFile = DumpObject(obj, folder, writer.FileName); writer.StartTag("td"); { writer.Link(objectFile, ((obj.name.Trim().Length > 0) ? obj.name : "NO NAME")); } writer.EndTag(); writer.StartTag("td"); { writer.WriteValue(obj.GetType().Name); } writer.EndTag(); } writer.EndTag(); ++index; System.GC.Collect(); } writer.EndTag(); }); }
public void Test_Writers() { using (HTMLWriter writer = new HTMLWriter()) { EWriter_Test(writer); } using (RTFWriter writer = new RTFWriter()) { EWriter_Test(writer); } /*using (PDFWriter writer = new PDFWriter()) { * // TravisCI crash * }*/ }
private static void PrintObjectFields(object obj, HTMLWriter writer) { if (obj == null) { return; } writer.StartTag("table", "class=\"fields_table\""); Type type = obj.GetType(); FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.FlattenHierarchy); foreach (var fi in fields) { writer.StartTag("tr"); { var fieldType = fi.FieldType; writer.StartTag("td", "width=\"50px\""); { writer.StartTag("div", "class=\"field_type\""); writer.WriteValue(fieldType.Name); writer.EndTag(); } writer.EndTag(); writer.StartTag("td", "width=\"100px\""); { writer.WriteValue(fi.Name); } writer.EndTag(); writer.StartTag("td", "width=\"300px\""); { writer.StartTag("div", "class=\"field_value\""); { var value = fi.GetValue(obj); PrintValue(obj, value, writer); } writer.EndTag(); } writer.EndTag(); } writer.EndTag(); } writer.EndTag(); }
private static void PrintValue(object obj, object value, HTMLWriter writer) { if (value == null) { writer.WriteValue("null"); return; } if (value is FsmEvent && obj is FsmStateAction) { var fsmEvent = ((FsmEvent)value); var action = (FsmStateAction)obj; var state = action.State; var fsm = action.Fsm; writer.WriteValue(fsmEvent.Name + " "); foreach (var transition in fsm.GlobalTransitions) { if (transition.FsmEvent == fsmEvent) { writer.Link($"#{transition.ToState}", $"({transition.ToState})"); } } foreach (var transition in state.Transitions) { if (transition.FsmEvent == fsmEvent) { writer.Link($"#{transition.ToState}", $"({transition.ToState})"); } } } else { writer.WriteValue(value.ToString()); } if (value is NamedVariable) { string variableName = ((NamedVariable)value).Name; if (variableName.Length > 0) { writer.WriteValue($" <div class=\"variable_ref\">{variableName}</div>"); } } }
string DumpObject( UnityEngine.Object obj, string folder, string previousFile = "") { Directory.CreateDirectory(folder); DumpObjectDelegate bestDumpDelegate = null; foreach (var kv in dumpMethods) { if (kv.Key.GetHashCode() == obj.GetType().GetHashCode()) { bestDumpDelegate = kv.Value; break; } if (obj.GetType().IsSubclassOf(kv.Key)) { bestDumpDelegate = kv.Value; } } try { if (bestDumpDelegate != null) { string fileName = $"{folder}/{BuildFileName(obj)}"; HTMLWriter.WriteDocument(fileName, $"{obj.name} - {obj.GetType().FullName}", cssStylePath, (HTMLWriter writer) => { writer.Link(previousFile, "< GO BACK"); writer.NewLine(); writer.OneLiner("h1", obj.name); writer.OneLiner("b", $"Type: {obj.GetType().FullName}"); writer.ShortTag("hr"); bestDumpDelegate.Invoke(obj, writer, this, folder); }); return(fileName); } } catch (Exception e) { Logger.Error("Failed to dump object!"); Logger.Error(e.Message); Logger.Error(e.StackTrace); return($"#exception_{e.Message}"); } return("#failed_to_generate_file"); }
private static bool BuildHTMLFromTextWork(MetaDoc xmlTextWork) { bool bRet = false; Globals.m_Logger.Info(string.Format("Converting {0} to html", xmlTextWork.GetFileName())); HTMLWriter htmlWriter = new HTMLWriter(xmlTextWork); if (!htmlWriter.Save()) { Globals.m_Logger.Error(string.Format("Unable to save {0}!", htmlWriter.GetOutFileName())); } else { Globals.m_Logger.Info(string.Format("{0} generated", htmlWriter.GetOutFileName())); bRet = true; } bRet &= htmlWriter.ValidateHTML(); return(bRet); }
private static List <MetaDoc> UpgradeHTMLToPublishFolder(List <MetaDoc> textWorks, Boolean forced) { string destFolder = Globals.IndexFolder(); destFolder = destFolder.TrimEnd('\\') + "\\"; // normalize the end List <MetaDoc> updatedWorks = new List <MetaDoc>(); for (int iTw = 0; iTw < textWorks.Count; iTw++) { if (!textWorks[iTw].IsShowInGlobalIndex()) { continue; } if (textWorks[iTw].IsAlreadyPublished() && !forced) { continue; } HTMLWriter writer = new HTMLWriter(textWorks[iTw]); string htmlFilePath = Utils.ChangePathExtension(destFolder + textWorks[iTw].GetFileName(), Globals.HTML_EXT); if (textWorks[iTw].GetHashes().Count > 0) { string archivedHTHMFilePath = Globals.IndexFolder() + textWorks[iTw].GetHashes()[0].GetHash() + Globals.HTML_EXT; if (!File.Exists(archivedHTHMFilePath)) { File.Move(htmlFilePath, archivedHTHMFilePath); } } writer.Save(htmlFilePath, true, Globals.IsAbstractOnly()); textWorks[iTw].AddHash(new DocHash(textWorks[iTw].GetCurrentHash())); textWorks[iTw].Save(); updatedWorks.Add(textWorks[iTw]); Globals.m_Logger.Info(string.Format("{0} selected to be updated", htmlFilePath)); } return(updatedWorks); }
private static void PrintValue(object obj, object value, HTMLWriter writer) { if (value == null) { writer.WriteValue("null"); return; } if (value is FsmEvent && obj is FsmStateAction) { var fsmEvent = ((FsmEvent)value); var action = (FsmStateAction)obj; var state = action.State; var fsm = action.Fsm; writer.WriteValue(fsmEvent.Name + " "); foreach (var transition in fsm.GlobalTransitions) { if (transition.FsmEvent == fsmEvent) { writer.Link($"#{transition.ToState}", $"({transition.ToState})"); } } foreach (var transition in state.Transitions) { if (transition.FsmEvent == fsmEvent) { writer.Link($"#{transition.ToState}", $"({transition.ToState})"); } } } else { writer.WriteValue(value.ToString()); } if (value is NamedVariable) { string variableName = ((NamedVariable)value).Name; if (variableName.Length > 0) { writer.WriteValue($" <div class=\"variable_ref\">{variableName}</div>"); } } if (value is FsmProperty) { string propertyName = ((FsmProperty)value).PropertyName; if (propertyName.Length > 0) { writer.WriteValue($" <div class=\"variable_ref\">{propertyName}</div>"); } } if (value is FsmOwnerDefault) { var val = (FsmOwnerDefault)value; writer.WriteValue(DumpOwnerDefault(val)); } if (value is FsmEventTarget) { var val = (FsmEventTarget)value; string eventTargetInfo = val.target.ToString() + " "; if (val.excludeSelf.Value) { eventTargetInfo += "(excludeSelf) "; } if (val.fsmComponent != null) { eventTargetInfo += $"(fsmComponent: {val.fsmComponent.name}) "; } if (val.fsmName != null) { eventTargetInfo += $"(fsmName: {val.fsmName.Value}) "; } if (val.gameObject != null) { eventTargetInfo += "(" + DumpOwnerDefault(val.gameObject) + ") "; } if (val.sendToChildren.Value) { eventTargetInfo += "(sendToChildren) "; } writer.WriteValue(eventTargetInfo); } }
// static void Main(string[] args) { // 実行する自動GUIテストスクリプトのフィルタ String strTargetDirFilter = "*"; // 引数に何もなければ全部のテストを実行 if (args.Length > 0) strTargetDirFilter = args[0]; // 引数を受け取ってフィルタとする // 対象プログラムが存在するかをチェックする if (!File.Exists(strTargetExePath)) { System.Console.WriteLine("対象EXEが見つかりません"); return; } // 対象プログラムのパスをフルパスに変換する strTargetExePath = new FileInfo(strTargetExePath).FullName; System.Environment.CurrentDirectory = strScriptFolder; String strPushDir = System.Environment.CurrentDirectory; // テスト対象のホームページ作成 using (HTMLWriter hw = new HTMLWriter(strHTMLName) ) { // テストを実行していく var dirlist = Directory.GetDirectories(".", strTargetDirFilter); foreach (var dirnameM in dirlist) { System.Environment.CurrentDirectory = strPushDir; // 余分な文字を外す (.\)の部分 String strDirname = new FileInfo(dirnameM).Name; // テストスクリプトがあるかをチェックする if (!File.Exists(strDirname + "\\" + strTestScriptName )) continue; // ディレクトリを保存する strPushDir = System.Environment.CurrentDirectory; // 一時ファイル保存用フォルダ Directory.CreateDirectory(strDirname + "\\" + strCmpImageFolderName); // 結果保存フォルダに移動する Directory.CreateDirectory(strDirname + "\\" + strResultFolderName ); System.Environment.CurrentDirectory += "\\" + strDirname + "\\" + strResultFolderName ; // プログラム実行 System.Console.WriteLine("Run " + strDirname); hw.WriteDirName(strDirname); // 説明付加 hw.AddReadMe(); // 対象プログラムを実行する var process = System.Diagnostics.Process.Start(strTargetExePath, strAutoTestCommand + " \"..\\"+strTestScriptName+"\"" ); process.WaitForExit(nWaitForKill); // 一定時間経っても終了していなかったら消す if (!process.HasExited) { process.Kill(); hw.KillProcess(); } // 比較対象のフォルダと画像を比較する String strCorrectDataPath = "..\\" + strCorrectDataFolderName; CompareDirectories(hw, strCorrectDataPath, strDirname); hw.Flush(); } hw.CloseHTML(); } }
private static void Main(string[] args) { using var html = new HTMLWriter("output.html"); PrettyFormatters.Add(new ColorFormatter(html)); WriteLine($"ConLib Example"); Write($"Using ConLib "); WriteVersion(); WriteLine(); Section($"Value highlighting (colors from type):", () => { WriteLine($" String: {"banana"}"); WriteLine($" Numbers: {93}, {Math.E:f4}, 0x{0x8b:x} "); WriteLine($" Booleans: {true} and {false}"); WriteLine($" Time: {DateTime.Now:O} (DateTime) and {TimeSpan.FromSeconds(23)} (TimeSpan)"); WriteLine($" Objects: {new Program()} and {new object()}"); WriteLine($" Exception: {new ArgumentNullException("target")}"); WriteLine($" Null: {null} (null) and {DBNull.Value} (DBNull)"); }); Section($"Explicit colors: ", () => { WriteLine($" Number {3} is the {"only"} {true} {new Exception("YOLO!")}", Green, Blue, Red, Yellow); }); Section($"Jobs:", () => { DoChore("Foo", () => { WriteLine($"Output from within task"); Task.Delay(100).Wait(); WriteLine($"Some work has been done"); Task.Delay(100).Wait(); WriteLine($"Let's do some subtasks!"); DoChore("Subtask 1", () => { WriteLine($"Output from within subtask"); Task.Delay(1000).Wait(); WriteLine($"Everything is done!"); }); DoChore("Subtask 2", () => { WriteLine($"Subtask that is about to fail"); throw new ArgumentOutOfRangeException("PI", 4, $"Subtask failed!") { HelpLink = "https://lmgtfy.com/?q=how%20to%20code", }; }); }, continueOnFail: true); WriteLine($"At least we didn't throw in {"Main"}{"()"}!", Yellow, White); }); Section($"Output capture and indentation: ", () => { DoChore("Capture StdOut", () => { System.Console.Write("Output from System.Console.WriteLine(), which is correctly indented."); }); DoChore("Capture StdErr", () => { System.Console.Error.WriteLine("Output from System.Console.Error.WriteLine(), which causes the job to fail."); }, continueOnFail: true); DoChore("Run external program", () => { //Exec("ping localhost"); }); }); Section($"Tasks:", () => { DoTask("Doing the dishes", () => Task.Delay(500)); DoTask("Mopping the floors", () => Task.Delay(500)); DoTask("Cooking dinner", () => Task.Delay(500).ContinueWith(t => throw new Exception("House is on fire!") ), continueOnFail: true); WriteLine(); WriteLine($"At least we didn't throw in {"Main"}{"()"}!", Yellow, White); });