using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.Text; namespace Common { public enum OutputFormat { [FieldDisplayName("Excel (Tab separated)")] Excel, [FieldDisplayName("Plain text")] Plain, [FieldDisplayName("CSV")] Csv, [FieldDisplayName("HTML")] Html, [FieldDisplayName("ListView")] ListView, [FieldDisplayName("MediaWiki")] MediaWiki, [FieldDisplayName("JSON")] Json, [FieldDisplayName("XML")] Xml }; public class TableRow { public List Cells = new List(); public void AddCell(string text) { Cells.Add(text); } } public class TableColumn { public string Name; public ColumnDataType DataType; } public class Table { public string Title; public List Rows = new List(); public List Columns = new List(); public void Clear() { Columns.Clear(); Rows.Clear(); } public void AddColumn(string name, ColumnDataType dataType = ColumnDataType.String) { Columns.Add(new TableColumn() { DataType = dataType, Name = name }); } public TableRow AddRow() { TableRow row = new TableRow(); Rows.Add(row); return row; } public string GetOutputTabs() { StringBuilder output = new StringBuilder(); output.AppendLine(string.Join("\t", Columns.Select(x => x.Name))); foreach (var row in Rows) { output.AppendLine(string.Join("\t", row.Cells)); } return output.ToString(); } public string GetOutputPlain() { StringBuilder output = new StringBuilder(); output.AppendLine(string.Join(Environment.NewLine, Columns.Select(x => x.Name))); output.AppendLine(); output.AppendLine("==========================="); output.AppendLine(); foreach (var row in Rows) { output.AppendLine(string.Join(Environment.NewLine, row.Cells)); output.AppendLine(); output.AppendLine("==========================="); output.AppendLine(); } return output.ToString(); } public string GetOutputCsv() { StringBuilder output = new StringBuilder(); output.AppendLine(string.Join(",", Columns.Select(x => "\"" + x.Name + "\""))); foreach (var row in Rows) { output.AppendLine(string.Join(",", row.Cells.Select(x => "\"" + x.Replace("\"", "\"\"") + "\""))); } return output.ToString(); } public string GetOutputHtml() { StringBuilder output = new StringBuilder(); output.AppendLine(""); if (!string.IsNullOrEmpty(Title)) { output.AppendLine(" "); output.AppendLine(" " + Title + ""); output.AppendLine(" "); } output.AppendLine(" "); output.AppendLine(" "); output.AppendLine(" "); foreach (var row in Rows) { output.AppendLine(" "); } output.AppendLine("
" + string.Join("", Columns.Select(x => x.Name.Replace(Environment.NewLine, "
"))) + "
" + string.Join("", row.Cells.Select(x => x.Replace(Environment.NewLine, "
"))) + "
"); output.AppendLine(" "); output.AppendLine(""); return output.ToString(); } public string GetOutputXml() { StringBuilder output = new StringBuilder(); output.AppendLine(""); output.AppendLine(""); if (!string.IsNullOrEmpty(Title)) output.AppendLine(" " + Title + ""); output.AppendLine(" "); foreach (var row in Rows) { output.AppendLine(" "); int x = 0; foreach (var cell in row.Cells) { string columnName = ""; if (x < Columns.Count) columnName = Columns[x].Name.Replace("\"", "\\\""); output.AppendLine(" " + cell + ""); x++; } output.AppendLine(" "); } output.AppendLine(" "); output.AppendLine("
"); return output.ToString(); } public string GetOutputMediaWiki() { StringBuilder output = new StringBuilder(); output.AppendLine("{| class=\"wikitable sortable\""); output.AppendLine("! " + string.Join(" !! ", Columns.Select(x => x.Name.Replace(Environment.NewLine, "
")))); if (!string.IsNullOrEmpty(Title)) output.AppendLine("|+ " + Title); foreach (var row in Rows) { output.AppendLine("|-"); output.AppendLine("| " + string.Join(" || ", row.Cells.Select(x => x.Replace(Environment.NewLine, "
")))); } output.AppendLine("|}"); return output.ToString(); } public string GetOutputJson() { StringBuilder output = new StringBuilder(); output.AppendLine("["); for (int y = 0; y < Rows.Count; y++) { output.AppendLine(" {"); for (int x = 0; x < Rows[y].Cells.Count; x++) { string columnName = ""; if (x < Columns.Count) columnName = Columns[x].Name.Replace("\"", "\\\""); output.Append(" \"" + columnName + "\": \"" + Rows[y].Cells[x].Replace("\"", "\\\"") + "\""); if (x < Rows[y].Cells.Count - 1) { output.Append(","); } output.AppendLine(); } output.Append(" }"); if (y < Rows.Count - 1) { output.Append(","); } output.AppendLine(); } output.AppendLine("]"); return output.ToString(); } public void GetOutputListView(ListView listView) { listView.BeginUpdate(); try { List listViewItems = new List { Capacity = Rows.Count }; while (listView.Columns.Count < Columns.Count) listView.Columns.Add(Columns[listView.Columns.Count].Name); for (int i = 0; i < Columns.Count; i++) { listView.Columns[i].Tag = i; } ListViewManager listViewManager = new ListViewManager(listView); for (int i = 0; i < Columns.Count; i++) { listViewManager.SetColumnDataType(i, Columns[i].DataType); } foreach (var row in Rows) { while (listView.Columns.Count < row.Cells.Count) listView.Columns.Add(""); ListViewItem item = new ListViewItem(); int i = 0; foreach (string cell in row.Cells) { if (i == 0) item.Text = cell; else item.SubItems.Add(cell); i++; } listViewItems.Add(item); } // Add prepared list view items into visible list view at once listView.Items.Clear(); listView.Items.AddRange(listViewItems.ToArray()); // Update columns width foreach (ColumnHeader column in listView.Columns) { column.Width = listView.Width / listView.Columns.Count; } } finally { listView.EndUpdate(); } } public string GetOutput(OutputFormat outputFormat) { switch (outputFormat) { case OutputFormat.Excel: return GetOutputTabs(); case OutputFormat.Plain: return GetOutputPlain(); case OutputFormat.Csv: return GetOutputCsv(); case OutputFormat.Html: return GetOutputHtml(); case OutputFormat.MediaWiki: return GetOutputMediaWiki(); case OutputFormat.Json: return GetOutputJson(); case OutputFormat.Xml: return GetOutputXml(); default: return ""; } } public static string GetFileExt(OutputFormat outputFormat) { string[] outputFormatFileExt = new string[] { ".txt", ".txt", ".csv", ".htm", ".txt", ".txt", ".json", ".xml"}; return outputFormatFileExt[(int)outputFormat]; } public void LoadFromListView(ListView listView) { Clear(); Columns.Capacity = listView.Columns.Count; foreach (ColumnHeader column in listView.Columns) { AddColumn(column.Text); } Rows.Capacity = listView.Items.Count; for (int i = 0; i < listView.Items.Count; i++) { TableRow row = AddRow(); row.Cells.Capacity = listView.Items[i].SubItems.Count; foreach (ListViewItem.ListViewSubItem subItem in listView.Items[i].SubItems) { row.AddCell(subItem.Text); } } } } }