1 |
using System; |
2 |
using System.Collections.Generic; |
3 |
using System.IO; |
4 |
using System.Text.RegularExpressions; |
5 |
|
6 |
namespace Oni |
7 |
{ |
8 |
internal abstract class Exporter |
9 |
{ |
10 |
private readonly InstanceFileManager fileManager; |
11 |
private readonly string outputDirPath; |
12 |
private readonly Dictionary<string, string> fileNames; |
13 |
private Regex nameFilter; |
14 |
|
15 |
protected Exporter(InstanceFileManager fileManager, string outputDirPath) |
16 |
{ |
17 |
this.fileManager = fileManager; |
18 |
this.outputDirPath = outputDirPath; |
19 |
this.fileNames = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); |
20 |
} |
21 |
|
22 |
public InstanceFileManager InstanceFileManager => fileManager; |
23 |
|
24 |
public string OutputDirPath => outputDirPath; |
25 |
|
26 |
public Regex NameFilter |
27 |
{ |
28 |
get { return nameFilter; } |
29 |
set { nameFilter = value; } |
30 |
} |
31 |
|
32 |
public void ExportFiles(IEnumerable<string> sourceFilePaths) |
33 |
{ |
34 |
Directory.CreateDirectory(outputDirPath); |
35 |
|
36 |
foreach (var sourceFilePath in sourceFilePaths) |
37 |
ExportFile(sourceFilePath); |
38 |
|
39 |
Flush(); |
40 |
} |
41 |
|
42 |
protected virtual void ExportFile(string sourceFilePath) |
43 |
{ |
44 |
Console.WriteLine(sourceFilePath); |
45 |
|
46 |
var file = fileManager.OpenFile(sourceFilePath); |
47 |
var descriptors = GetSupportedDescriptors(file); |
48 |
|
49 |
if (nameFilter != null) |
50 |
descriptors = descriptors.FindAll(x => x.HasName && nameFilter.IsMatch(x.FullName)); |
51 |
|
52 |
foreach (var descriptor in descriptors) |
53 |
ExportInstance(descriptor); |
54 |
} |
55 |
|
56 |
protected abstract void ExportInstance(InstanceDescriptor descriptor); |
57 |
|
58 |
protected virtual void Flush() |
59 |
{ |
60 |
} |
61 |
|
62 |
protected virtual List<InstanceDescriptor> GetSupportedDescriptors(InstanceFile file) |
63 |
{ |
64 |
return file.GetNamedDescriptors(); |
65 |
} |
66 |
|
67 |
protected string CreateFileName(InstanceDescriptor descriptor, string fileExtension) |
68 |
{ |
69 |
string name = Importer.EncodeFileName(descriptor.FullName, fileNames); |
70 |
return Path.Combine(outputDirPath, name + fileExtension); |
71 |
} |
72 |
} |
73 |
} |