UNPKG

5.01 kBJavaScriptView Raw
1"use strict";
2
3const utilities = require("extra-utilities");
4const Jimp = require("jimp");
5const Tile = require("./tile.js");
6
7class 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
31class 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 // only allow negative special values to be set manually
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
183Object.defineProperty(Tile, "FileType", {
184 value: TileFileType,
185 enumerable: true
186});
187
188Object.defineProperty(TileFileType, "properties", {
189 value: new TileFileTypeProperties(),
190 enumerable: false
191});
192
193Object.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
203Object.defineProperty(TileFileType, "Invalid", {
204 value: new TileFileType(
205 -1,
206 "Invalid"
207 ),
208 enumerable: true
209});
210
211Object.defineProperty(TileFileType, "PNG", {
212 value: new TileFileType(
213 "Portable Network Graphics",
214 "PNG",
215 Jimp.MIME_PNG
216 ),
217 enumerable: true
218});
219
220Object.defineProperty(TileFileType, "GIF", {
221 value: new TileFileType(
222 "Graphics Interchange Format",
223 "GIF",
224 Jimp.MIME_GIF
225 ),
226 enumerable: true
227});
228
229Object.defineProperty(TileFileType, "BMP", {
230 value: new TileFileType(
231 "Bitmap",
232 "BMP",
233 Jimp.MIME_BMP
234 ),
235 enumerable: true
236});
237
238Object.defineProperty(TileFileType, "FileTypes", {
239 value: [
240 TileFileType.PNG,
241 TileFileType.GIF,
242 TileFileType.BMP
243 ],
244 enumerable: true
245});
246
247module.exports = TileFileType;