1 |
using System; |
2 |
using System.Collections.Generic; |
3 |
using System.Globalization; |
4 |
using System.IO; |
5 |
using System.Text; |
6 |
|
7 |
namespace Oni |
8 |
{ |
9 |
internal abstract class Importer |
10 |
{ |
11 |
private readonly ImporterFile file; |
12 |
private Dictionary<string, ImporterTask> dependencies; |
13 |
|
14 |
public Importer() |
15 |
{ |
16 |
this.file = new ImporterFile(); |
17 |
} |
18 |
|
19 |
protected Importer(long templateChecksum) |
20 |
{ |
21 |
this.file = new ImporterFile(templateChecksum); |
22 |
} |
23 |
|
24 |
public ImporterFile ImporterFile => file; |
25 |
|
26 |
public virtual void Import(string filePath, string outputDirPath) |
27 |
{ |
28 |
} |
29 |
|
30 |
public virtual void BeginImport() |
31 |
{ |
32 |
file.BeginImport(); |
33 |
|
34 |
dependencies = new Dictionary<string, ImporterTask>(); |
35 |
} |
36 |
|
37 |
public BinaryWriter RawWriter => file.RawWriter; |
38 |
|
39 |
public void AddDependency(string filePath, TemplateTag type) |
40 |
{ |
41 |
if (!dependencies.ContainsKey(filePath)) |
42 |
dependencies[filePath] = new ImporterTask(filePath, type); |
43 |
} |
44 |
|
45 |
public ICollection<ImporterTask> Dependencies |
46 |
{ |
47 |
get |
48 |
{ |
49 |
if (dependencies == null) |
50 |
return new ImporterTask[0]; |
51 |
|
52 |
return dependencies.Values; |
53 |
} |
54 |
} |
55 |
|
56 |
public ImporterDescriptor CreateInstance(TemplateTag tag, string name = null) => file.CreateInstance(tag, name); |
57 |
|
58 |
public int WriteRawPart(byte[] data) => file.WriteRawPart(data); |
59 |
|
60 |
public int WriteRawPart(string text) => file.WriteRawPart(text); |
61 |
|
62 |
public void Write(string outputDirPath) => file.Write(outputDirPath); |
63 |
|
64 |
protected static string MakeInstanceName(TemplateTag tag, string name) |
65 |
{ |
66 |
string tagName = tag.ToString(); |
67 |
|
68 |
if (!name.StartsWith(tagName, StringComparison.Ordinal)) |
69 |
name = tagName + name; |
70 |
|
71 |
return name; |
72 |
} |
73 |
|
74 |
public static string EncodeFileName(string name, Dictionary<string, string> fileNames = null) |
75 |
{ |
76 |
foreach (char c in Path.GetInvalidFileNameChars()) |
77 |
name = name.Replace(c.ToString(), string.Format(CultureInfo.InvariantCulture, "%{0:X2}", (int)c)); |
78 |
|
79 |
if (fileNames != null) |
80 |
{ |
81 |
string existingName; |
82 |
|
83 |
while (fileNames.TryGetValue(name, out existingName)) |
84 |
{ |
85 |
int i = 0; |
86 |
|
87 |
if (name.Length > 4) |
88 |
i = 4; |
89 |
|
90 |
while (i < name.Length && char.ToLowerInvariant(name[i]) != char.ToLowerInvariant(existingName[i])) |
91 |
i++; |
92 |
|
93 |
name = name.Substring(0, i) + string.Format(CultureInfo.InvariantCulture, "%{0:X2}", (int)name[i]) + name.Substring(i + 1); |
94 |
} |
95 |
|
96 |
fileNames[name] = name; |
97 |
} |
98 |
|
99 |
return name; |
100 |
} |
101 |
|
102 |
public static string DecodeFileName(string fileName) |
103 |
{ |
104 |
fileName = Path.GetFileNameWithoutExtension(fileName); |
105 |
|
106 |
var buffer = new StringBuilder(); |
107 |
|
108 |
for (int i, startIndex = 0; startIndex != -1; startIndex = i) |
109 |
{ |
110 |
i = fileName.IndexOf('%', startIndex); |
111 |
|
112 |
if (i == -1) |
113 |
{ |
114 |
buffer.Append(fileName, startIndex, fileName.Length - startIndex); |
115 |
} |
116 |
else |
117 |
{ |
118 |
buffer.Append(fileName, startIndex, i - startIndex); |
119 |
buffer.Append((char)Int32.Parse(fileName.Substring(i + 1, 2), NumberStyles.HexNumber)); |
120 |
i += 3; |
121 |
} |
122 |
} |
123 |
|
124 |
return buffer.ToString(); |
125 |
} |
126 |
} |
127 |
} |