Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement text importers/exporters #82

Merged
merged 3 commits into from
Feb 27, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions OpenKh.Tools.Kh2TextEditor/OpenKh.Tools.Kh2TextEditor.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
<OutputPath>..\bin\$(Configuration)\</OutputPath>
<ExtrasEnableWpfProjectSetup>true</ExtrasEnableWpfProjectSetup>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CsvHelper" Version="15.0.0" />
<PackageReference Include="YamlDotNet" Version="8.1.0" />
</ItemGroup>
<ItemGroup>
<Reference Include="System.Xaml" />
<Reference Include="WindowsBase" />
Expand Down
27 changes: 27 additions & 0 deletions OpenKh.Tools.Kh2TextEditor/Services/CsvTextExporter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using CsvHelper;
using CsvHelper.Configuration;
using OpenKh.Tools.Kh2TextEditor.Models;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OpenKh.Tools.Kh2TextEditor.Services
{
class CsvTextExporter : ITextExporter
{
void ITextExporter.Export(IEnumerable<ExchangeableMessage> messages, TextWriter writer)
{
new CsvWriter(writer, new CsvConfiguration(CultureInfo.InvariantCulture)
{
Delimiter = ","
})
.WriteRecords(messages);
}

(string, string[]) ITextExporter.Filter() => ("CSV", "csv".Split(';'));
}
}
27 changes: 27 additions & 0 deletions OpenKh.Tools.Kh2TextEditor/Services/CsvTextImporter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using CsvHelper;
using CsvHelper.Configuration;
using OpenKh.Tools.Kh2TextEditor.Models;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OpenKh.Tools.Kh2TextEditor.Services
{
class CsvTextImporter : ITextImporter
{
(string, string[]) ITextImporter.Filter() => ("CSV", "csv".Split(';'));

IEnumerable<ExchangeableMessage> ITextImporter.Import(TextReader reader)
{
return new CsvReader(reader, new CsvConfiguration(CultureInfo.InvariantCulture)
{
Delimiter = ",",
})
.GetRecords<ExchangeableMessage>();
}
}
}
17 changes: 17 additions & 0 deletions OpenKh.Tools.Kh2TextEditor/Services/ExchangeableMessage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace OpenKh.Tools.Kh2TextEditor.Services
{
public class ExchangeableMessage
{
[XmlElement]
public int Id { get; set; }
[XmlElement]
public string Text { get; set; }
}
}
16 changes: 16 additions & 0 deletions OpenKh.Tools.Kh2TextEditor/Services/ITextExporter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using OpenKh.Tools.Kh2TextEditor.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OpenKh.Tools.Kh2TextEditor.Services
{
public interface ITextExporter
{
void Export(IEnumerable<ExchangeableMessage> messages, TextWriter writer);
(string, string[]) Filter();
}
}
16 changes: 16 additions & 0 deletions OpenKh.Tools.Kh2TextEditor/Services/ITextImporter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using OpenKh.Tools.Kh2TextEditor.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OpenKh.Tools.Kh2TextEditor.Services
{
public interface ITextImporter
{
IEnumerable<ExchangeableMessage> Import(TextReader reader);
(string, string[]) Filter();
}
}
24 changes: 24 additions & 0 deletions OpenKh.Tools.Kh2TextEditor/Services/PlainTextExporter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using OpenKh.Tools.Kh2TextEditor.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OpenKh.Tools.Kh2TextEditor.Services
{
class PlainTextExporter : ITextExporter
{
void ITextExporter.Export(IEnumerable<ExchangeableMessage> messages, TextWriter writer)
{
foreach (var one in messages)
{
writer.WriteLine($"{one.Id}: {one.Text}");
writer.WriteLine("---");
}
}

(string, string[]) ITextExporter.Filter() => ("Plain text", "txt".Split(';'));
}
}
35 changes: 35 additions & 0 deletions OpenKh.Tools.Kh2TextEditor/Services/TextExporters.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OpenKh.Tools.Kh2TextEditor.Services
{
public class TextExporters
{
public static IEnumerable<ITextExporter> GetAll() => new ITextExporter[]
{
new PlainTextExporter(),
new CsvTextExporter(),
new XmlTextExporter(),
new YamlTextExporter(),
};

public static ITextExporter FindFromFile(string fileName)
{
var selectedExtension = Path.GetExtension(fileName).TrimStart('.');
var textExporters = GetAll();

return textExporters
.Where(
exporter => exporter.Filter().Item2
.Any(
it => string.Compare(it, selectedExtension, true) == 0
)
)
.FirstOrDefault() ?? textExporters.First(); // fallback
}
}
}
34 changes: 34 additions & 0 deletions OpenKh.Tools.Kh2TextEditor/Services/TextImporters.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OpenKh.Tools.Kh2TextEditor.Services
{
public class TextImporters
{
public static IEnumerable<ITextImporter> GetAll() => new ITextImporter[]
{
new CsvTextImporter(),
new XmlTextImporter(),
new YamlTextImporter(),
};

public static ITextImporter FindFromFile(string fileName)
{
var selectedExtension = Path.GetExtension(fileName).TrimStart('.');
var textExporters = GetAll();

return textExporters
.Where(
exporter => exporter.Filter().Item2
.Any(
it => string.Compare(it, selectedExtension, true) == 0
)
)
.FirstOrDefault();
}
}
}
34 changes: 34 additions & 0 deletions OpenKh.Tools.Kh2TextEditor/Services/XmlTextExporter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using OpenKh.Tools.Kh2TextEditor.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace OpenKh.Tools.Kh2TextEditor.Services
{
public class XmlTextExporter : ITextExporter
{
void ITextExporter.Export(IEnumerable<ExchangeableMessage> messages, TextWriter writer)
{
new XmlSerializer(typeof(RootModel)).Serialize(
writer,
new RootModel
{
Message = messages.ToArray()
}
);
}

(string, string[]) ITextExporter.Filter() => ("XML", "xml".Split(';'));

[XmlRoot("Messages")]
public class RootModel
{
[XmlElement]
public ExchangeableMessage[] Message { get; set; }
}
}
}
29 changes: 29 additions & 0 deletions OpenKh.Tools.Kh2TextEditor/Services/XmlTextImporter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using OpenKh.Tools.Kh2TextEditor.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;

namespace OpenKh.Tools.Kh2TextEditor.Services
{
public class XmlTextImporter : ITextImporter
{
(string, string[]) ITextImporter.Filter() => ("XML", "xml".Split(';'));

IEnumerable<ExchangeableMessage> ITextImporter.Import(TextReader reader)
{
var model = (RootModel)new XmlSerializer(typeof(RootModel)).Deserialize(reader);
return model.Message;
}

[XmlRoot("Messages")]
public class RootModel
{
[XmlElement]
public ExchangeableMessage[] Message { get; set; }
}
}
}
28 changes: 28 additions & 0 deletions OpenKh.Tools.Kh2TextEditor/Services/YamlTextExporter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using OpenKh.Tools.Kh2TextEditor.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OpenKh.Tools.Kh2TextEditor.Services
{
class YamlTextExporter : ITextExporter
{
void ITextExporter.Export(IEnumerable<ExchangeableMessage> messages, TextWriter writer)
{
new YamlDotNet.Serialization.SerializerBuilder()
.Build()
.Serialize(
writer,
new
{
Messages = messages
}
);
}

(string, string[]) ITextExporter.Filter() => ("YAML", "yml".Split(';'));
}
}
29 changes: 29 additions & 0 deletions OpenKh.Tools.Kh2TextEditor/Services/YamlTextImporter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using OpenKh.Tools.Kh2TextEditor.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OpenKh.Tools.Kh2TextEditor.Services
{
class YamlTextImporter : ITextImporter
{
(string, string[]) ITextImporter.Filter() => ("YAML", "yml".Split(';'));

IEnumerable<ExchangeableMessage> ITextImporter.Import(TextReader reader)
{
var model = new YamlDotNet.Serialization.DeserializerBuilder()
.Build()
.Deserialize<RootModel>(reader);

return model.Messages;
}

public class RootModel
{
public ExchangeableMessage[] Messages { get; set; }
}
}
}
Loading