1 | "use strict";
|
2 |
|
3 | const utilities = require("extra-utilities");
|
4 | const Jimp = require("jimp");
|
5 | const Tile = require("./tile.js");
|
6 |
|
7 | class TileFileTypeProperties {
|
8 | constructor() {
|
9 | let self = this;
|
10 |
|
11 | let _properties = {
|
12 | idCounter: 0
|
13 | };
|
14 |
|
15 | Object.defineProperty(self, "idCounter", {
|
16 | enumerable: true,
|
17 | get() {
|
18 | return _properties.idCounter;
|
19 | },
|
20 | set(value) {
|
21 | const newIDCounter = utilities.parseInteger(value);
|
22 |
|
23 | if(!isNaN(newIDCounter) && isFinite(newIDCounter) && newIDCounter > _properties.idCounter) {
|
24 | _properties.idCounter = newIDCounter;
|
25 | }
|
26 | }
|
27 | });
|
28 | }
|
29 | }
|
30 |
|
31 | class TileFileType {
|
32 | constructor(id, name, extension, mimeType) {
|
33 | if(typeof id === "string") {
|
34 | mimeType = extension;
|
35 | extension = name;
|
36 | name = id;
|
37 | id = NaN;
|
38 | }
|
39 |
|
40 | let self = this;
|
41 |
|
42 | let _properties = {
|
43 | id: NaN
|
44 | };
|
45 |
|
46 | Object.defineProperty(self, "id", {
|
47 | enumerable: true,
|
48 | get() {
|
49 | return _properties.id;
|
50 | },
|
51 | set(value) {
|
52 | let newID = utilities.parseInteger(value);
|
53 |
|
54 |
|
55 | if(!isNaN(newID) && newID < 0) {
|
56 | _properties.id = newID;
|
57 | }
|
58 | }
|
59 | });
|
60 |
|
61 | Object.defineProperty(self, "name", {
|
62 | enumerable: true,
|
63 | get() {
|
64 | return _properties.name;
|
65 | },
|
66 | set(value) {
|
67 | _properties.name = utilities.trimString(value);
|
68 | }
|
69 | });
|
70 |
|
71 | Object.defineProperty(self, "extension", {
|
72 | enumerable: true,
|
73 | get() {
|
74 | return _properties.extension;
|
75 | },
|
76 | set(value) {
|
77 | let extension = utilities.trimString(value);
|
78 |
|
79 | if(utilities.isNonEmptyString(extension)) {
|
80 | extension = extension.toUpperCase();
|
81 | }
|
82 |
|
83 | _properties.extension = extension;
|
84 | }
|
85 | });
|
86 |
|
87 | Object.defineProperty(self, "mimeType", {
|
88 | enumerable: true,
|
89 | get() {
|
90 | return _properties.mimeType;
|
91 | },
|
92 | set(value) {
|
93 | _properties.mimeType = utilities.trimString(value);
|
94 | }
|
95 | });
|
96 |
|
97 | self.id = id;
|
98 | self.name = name;
|
99 | self.extension = extension;
|
100 | self.mimeType = mimeType;
|
101 |
|
102 | if(isNaN(self.id)) {
|
103 | _properties.id = TileFileType.idCounter++;
|
104 | }
|
105 | }
|
106 |
|
107 | static getFileType(value) {
|
108 | if(TileFileType.isTileFileType(value)) {
|
109 | for(let i = 0; i < TileFileType.FileTypes.length; i++) {
|
110 | if(TileFileType.FileTypes[i] === value) {
|
111 | return TileFileType.FileTypes[i];
|
112 | }
|
113 |
|
114 | return TileFileType.Invalid;
|
115 | }
|
116 | }
|
117 | else if(typeof value === "string") {
|
118 | const formattedValue = utilities.trimString(value);
|
119 |
|
120 | for(let i = 0; i < TileFileType.FileTypes.length; i++) {
|
121 | const fileType = TileFileType.FileTypes[i];
|
122 | const id = utilities.parseInteger(formattedValue);
|
123 |
|
124 | if(fileType.id === id ||
|
125 | utilities.equalsIgnoreCase(fileType.name, formattedValue) ||
|
126 | utilities.equalsIgnoreCase(fileType.extension, formattedValue) ||
|
127 | utilities.equalsIgnoreCase(fileType.mimeType, formattedValue)) {
|
128 | return fileType;
|
129 | }
|
130 | }
|
131 |
|
132 | return TileFileType.Invalid;
|
133 | }
|
134 | else if(Number.isInteger(value)) {
|
135 | for(let i = 0; i < TileFileType.FileTypes.length; i++) {
|
136 | if(TileFileType.FileTypes[i].id === value) {
|
137 | return TileFileType.FileTypes[i];
|
138 | }
|
139 | }
|
140 |
|
141 | return TileFileType.Invalid;
|
142 | }
|
143 |
|
144 | return TileFileType.Invalid;
|
145 | }
|
146 |
|
147 | equals(value) {
|
148 | let self = this;
|
149 |
|
150 | if(!self.isValid() || !TileFileType.isValid(value)) {
|
151 | return false;
|
152 | }
|
153 |
|
154 | return utilities.equalsIgnoreCase(self.name, value.name) &&
|
155 | utilities.equalsIgnoreCase(self.extension, value.extension);
|
156 | }
|
157 |
|
158 | toString() {
|
159 | let self = this;
|
160 |
|
161 | return self.name + " Tile File Type (" + self.extension + ")";
|
162 | }
|
163 |
|
164 | static isTileFileType(value) {
|
165 | return value instanceof TileFileType;
|
166 | }
|
167 |
|
168 | isValid() {
|
169 | let self = this;
|
170 |
|
171 | return self.id >= 0 &&
|
172 | utilities.isNonEmptyString(self.name) &&
|
173 | utilities.isNonEmptyString(self.extension) &&
|
174 | utilities.isNonEmptyString(self.mimeType);
|
175 | }
|
176 |
|
177 | static isValid(value) {
|
178 | return TileFileType.isTileFileType(value) &&
|
179 | value.isValid();
|
180 | }
|
181 | }
|
182 |
|
183 | Object.defineProperty(Tile, "FileType", {
|
184 | value: TileFileType,
|
185 | enumerable: true
|
186 | });
|
187 |
|
188 | Object.defineProperty(TileFileType, "properties", {
|
189 | value: new TileFileTypeProperties(),
|
190 | enumerable: false
|
191 | });
|
192 |
|
193 | Object.defineProperty(TileFileType, "idCounter", {
|
194 | enumerable: true,
|
195 | get() {
|
196 | return TileFileType.properties.idCounter;
|
197 | },
|
198 | set(value) {
|
199 | TileFileType.properties.idCounter = value;
|
200 | }
|
201 | });
|
202 |
|
203 | Object.defineProperty(TileFileType, "Invalid", {
|
204 | value: new TileFileType(
|
205 | -1,
|
206 | "Invalid"
|
207 | ),
|
208 | enumerable: true
|
209 | });
|
210 |
|
211 | Object.defineProperty(TileFileType, "PNG", {
|
212 | value: new TileFileType(
|
213 | "Portable Network Graphics",
|
214 | "PNG",
|
215 | Jimp.MIME_PNG
|
216 | ),
|
217 | enumerable: true
|
218 | });
|
219 |
|
220 | Object.defineProperty(TileFileType, "GIF", {
|
221 | value: new TileFileType(
|
222 | "Graphics Interchange Format",
|
223 | "GIF",
|
224 | Jimp.MIME_GIF
|
225 | ),
|
226 | enumerable: true
|
227 | });
|
228 |
|
229 | Object.defineProperty(TileFileType, "BMP", {
|
230 | value: new TileFileType(
|
231 | "Bitmap",
|
232 | "BMP",
|
233 | Jimp.MIME_BMP
|
234 | ),
|
235 | enumerable: true
|
236 | });
|
237 |
|
238 | Object.defineProperty(TileFileType, "FileTypes", {
|
239 | value: [
|
240 | TileFileType.PNG,
|
241 | TileFileType.GIF,
|
242 | TileFileType.BMP
|
243 | ],
|
244 | enumerable: true
|
245 | });
|
246 |
|
247 | module.exports = TileFileType;
|