@cabin-icarus/tooltip_generator 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,438 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __values = (this && this.__values) || function(o) {
22
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
23
+ if (m) return m.call(o);
24
+ if (o && typeof o.length === "number") return {
25
+ next: function () {
26
+ if (o && i >= o.length) o = void 0;
27
+ return { value: o && o[i++], done: !o };
28
+ }
29
+ };
30
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
31
+ };
32
+ var __read = (this && this.__read) || function (o, n) {
33
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
34
+ if (!m) return o;
35
+ var i = m.call(o), r, ar = [], e;
36
+ try {
37
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
38
+ }
39
+ catch (error) { e = { error: error }; }
40
+ finally {
41
+ try {
42
+ if (r && !r.done && (m = i["return"])) m.call(i);
43
+ }
44
+ finally { if (e) throw e.error; }
45
+ }
46
+ return ar;
47
+ };
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ exports.LocalizationCompiler = void 0;
50
+ var fs = __importStar(require("fs"));
51
+ var path = __importStar(require("path"));
52
+ var valve_kv_1 = require("valve-kv");
53
+ var languages_1 = require("~resource/languages");
54
+ var LocalizationCompiler = /** @class */ (function () {
55
+ function LocalizationCompiler() {
56
+ this.addon_filepath = path.join("node_modules/~resource", "addon_");
57
+ this.filepath_format = ".txt";
58
+ this.currentWrites = new Set();
59
+ }
60
+ // Helper functions
61
+ LocalizationCompiler.prototype.TransformForLocalization = function (text, modifier) {
62
+ if (modifier) {
63
+ text = text.replace(/\{([^f]\w+)\}($|[^%])/g, "%d$1%$2");
64
+ text = text.replace(/\{([^f]\w+)\}%/g, "%d$1%%%");
65
+ text = text.replace(/\{f(\w+)\}($|[^%])/g, "%f$1%$2");
66
+ text = text.replace(/\{f(\w+)\}%/g, "%f$1%%%");
67
+ text = text.replace(/%\{([^f]\w+)\}/g, "%%%d$1%");
68
+ text = text.replace(/%\{f(\w+)\}/g, "%%%f$1%");
69
+ return text;
70
+ }
71
+ else {
72
+ text = text.replace(/\{(\w*)}($|[^%])/g, "%$1%$2");
73
+ text = text.replace(/\{(\w*)}%/g, "%$1%%%");
74
+ text = text.replace(/%\{(\w*)}/g, "%%%$1%");
75
+ return text;
76
+ }
77
+ };
78
+ LocalizationCompiler.prototype.OnLocalizationDataChanged = function (allData) {
79
+ var e_1, _a, e_2, _b;
80
+ // console.log("Localization event fired");
81
+ var Abilities = new Array();
82
+ var Modifiers = new Array();
83
+ var StandardTooltips = new Array();
84
+ //let Talents: Array<HeroTalents> = new Array<HeroTalents>();
85
+ var localization_info = {
86
+ AbilityArray: Abilities,
87
+ ModifierArray: Modifiers,
88
+ StandardArray: StandardTooltips,
89
+ };
90
+ try {
91
+ for (var _c = __values(Object.entries(allData)), _d = _c.next(); !_d.done; _d = _c.next()) {
92
+ var _e = __read(_d.value, 2), key = _e[0], data = _e[1];
93
+ if (data.AbilityArray) {
94
+ Array.prototype.push.apply(Abilities, data.AbilityArray);
95
+ }
96
+ if (data.ModifierArray) {
97
+ Array.prototype.push.apply(Modifiers, data.ModifierArray);
98
+ }
99
+ if (data.StandardArray) {
100
+ Array.prototype.push.apply(StandardTooltips, data.StandardArray);
101
+ }
102
+ }
103
+ }
104
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
105
+ finally {
106
+ try {
107
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
108
+ }
109
+ finally { if (e_1) throw e_1.error; }
110
+ }
111
+ // Generate information for every language
112
+ var languages = Object.values(languages_1.Language).filter(function (v) { return typeof v !== "number"; });
113
+ try {
114
+ for (var languages_2 = __values(languages), languages_2_1 = languages_2.next(); !languages_2_1.done; languages_2_1 = languages_2.next()) {
115
+ var language = languages_2_1.value;
116
+ if (language !== languages_1.Language.None) {
117
+ var tokens = this.GenerateContentStringForLanguage(language, localization_info);
118
+ this.WriteContentToAddonFile(language, tokens);
119
+ }
120
+ }
121
+ }
122
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
123
+ finally {
124
+ try {
125
+ if (languages_2_1 && !languages_2_1.done && (_b = languages_2.return)) _b.call(languages_2);
126
+ }
127
+ finally { if (e_2) throw e_2.error; }
128
+ }
129
+ };
130
+ LocalizationCompiler.prototype.GenerateContentStringForLanguage = function (language, localized_data) {
131
+ var e_3, _a, e_4, _b, e_5, _c, e_6, _d, e_7, _e, e_8, _f, e_9, _g, e_10, _h;
132
+ var tokens = {};
133
+ // Go over standard tooltips
134
+ if (localized_data.StandardArray) {
135
+ try {
136
+ for (var _j = __values(localized_data.StandardArray), _k = _j.next(); !_k.done; _k = _j.next()) {
137
+ var standardLocalization = _k.value;
138
+ // Check for name override for the language we're checking
139
+ var standard_tooltip_string = standardLocalization.name;
140
+ if (standardLocalization.language_overrides && standardLocalization.language_overrides.length > 0) {
141
+ try {
142
+ for (var _l = (e_4 = void 0, __values(standardLocalization.language_overrides)), _m = _l.next(); !_m.done; _m = _l.next()) {
143
+ var language_override = _m.value;
144
+ if (language_override.language === language) {
145
+ standard_tooltip_string = language_override.name_override;
146
+ }
147
+ }
148
+ }
149
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
150
+ finally {
151
+ try {
152
+ if (_m && !_m.done && (_b = _l.return)) _b.call(_l);
153
+ }
154
+ finally { if (e_4) throw e_4.error; }
155
+ }
156
+ }
157
+ tokens[standardLocalization.classname] = standard_tooltip_string;
158
+ }
159
+ }
160
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
161
+ finally {
162
+ try {
163
+ if (_k && !_k.done && (_a = _j.return)) _a.call(_j);
164
+ }
165
+ finally { if (e_3) throw e_3.error; }
166
+ }
167
+ }
168
+ // Go over abilities for this language
169
+ if (localized_data.AbilityArray) {
170
+ try {
171
+ for (var _o = __values(localized_data.AbilityArray), _p = _o.next(); !_p.done; _p = _o.next()) {
172
+ var ability = _p.value;
173
+ // Class name is identical for all languages, so we would always use it
174
+ var ability_string = "DOTA_Tooltip_Ability_" + ability.ability_classname;
175
+ // Name
176
+ var ability_name = ability.name;
177
+ var ability_description = ability.description;
178
+ //let reimagined_effects = ability.reimagined_effects;
179
+ var ability_lore = ability.lore;
180
+ var ability_notes = ability.notes;
181
+ var scepter_description = ability.scepter_description;
182
+ var shard_description = ability.shard_description;
183
+ var ability_specials = ability.ability_specials;
184
+ if (ability.language_overrides) {
185
+ try {
186
+ for (var _q = (e_6 = void 0, __values(ability.language_overrides)), _r = _q.next(); !_r.done; _r = _q.next()) {
187
+ var language_override = _r.value;
188
+ if (language_override.language === language) {
189
+ // Check for name override
190
+ if (language_override.name_override) {
191
+ ability_name = language_override.name_override;
192
+ }
193
+ // Check for description overrides
194
+ if (language_override.description_override) {
195
+ ability_description = language_override.description_override;
196
+ }
197
+ // Check for reimagined effect overrides
198
+ //if (language_override.reimagined_effects_override)
199
+ //{
200
+ //reimagined_effects = language_override.reimagined_effects_override;
201
+ //}
202
+ // Check for lore override
203
+ if (language_override.lore_override) {
204
+ ability_lore = language_override.lore_override;
205
+ }
206
+ // Check for note override
207
+ if (language_override.notes_override) {
208
+ ability_notes = language_override.notes_override;
209
+ }
210
+ // Check for scepter override
211
+ if (language_override.scepter_description_override) {
212
+ scepter_description = language_override.scepter_description_override;
213
+ }
214
+ // Check for shard override
215
+ if (language_override.shard_description_override) {
216
+ shard_description = language_override.shard_description_override;
217
+ }
218
+ // Check for ability specials override, if any
219
+ if (language_override.ability_specials_override) {
220
+ ability_specials = language_override.ability_specials_override;
221
+ }
222
+ }
223
+ }
224
+ }
225
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
226
+ finally {
227
+ try {
228
+ if (_r && !_r.done && (_d = _q.return)) _d.call(_q);
229
+ }
230
+ finally { if (e_6) throw e_6.error; }
231
+ }
232
+ }
233
+ // Add name localization
234
+ if (ability_name) {
235
+ tokens[ability_string] = ability_name;
236
+ }
237
+ // Add description localization
238
+ if (ability_description) {
239
+ ability_description = this.TransformForLocalization(ability_description, false);
240
+ tokens[ability_string + "_description"] = ability_description;
241
+ }
242
+ // Lore, if any
243
+ if (ability_lore) {
244
+ var transformed_lore = this.TransformForLocalization(ability_lore, false);
245
+ tokens[ability_string + "_Lore"] = transformed_lore;
246
+ }
247
+ // Notes, if any
248
+ if (ability_notes) {
249
+ var counter = 0;
250
+ try {
251
+ for (var ability_notes_1 = (e_7 = void 0, __values(ability_notes)), ability_notes_1_1 = ability_notes_1.next(); !ability_notes_1_1.done; ability_notes_1_1 = ability_notes_1.next()) {
252
+ var note = ability_notes_1_1.value;
253
+ var transformed_note = this.TransformForLocalization(note, false);
254
+ tokens[ability_string + "_Note" + counter] = transformed_note;
255
+ counter++;
256
+ }
257
+ }
258
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
259
+ finally {
260
+ try {
261
+ if (ability_notes_1_1 && !ability_notes_1_1.done && (_e = ability_notes_1.return)) _e.call(ability_notes_1);
262
+ }
263
+ finally { if (e_7) throw e_7.error; }
264
+ }
265
+ }
266
+ // Scepter, if any
267
+ if (scepter_description) {
268
+ var ability_scepter_description = this.TransformForLocalization(scepter_description, false);
269
+ tokens[ability_string + "_scepter_description"] = ability_scepter_description;
270
+ }
271
+ // Shard, if any
272
+ if (shard_description) {
273
+ var ability_shard_description = this.TransformForLocalization(shard_description, false);
274
+ tokens[ability_string + "_shard_description"] = ability_shard_description;
275
+ }
276
+ // Ability specials, if any
277
+ if (ability_specials) {
278
+ try {
279
+ for (var ability_specials_1 = (e_8 = void 0, __values(ability_specials)), ability_specials_1_1 = ability_specials_1.next(); !ability_specials_1_1.done; ability_specials_1_1 = ability_specials_1.next()) {
280
+ var ability_special = ability_specials_1_1.value;
281
+ // Construct the ability special
282
+ var ability_special_text = "";
283
+ if (ability_special.percentage) {
284
+ ability_special_text = "%";
285
+ }
286
+ else if (ability_special.item_stat) {
287
+ ability_special_text = "+$";
288
+ }
289
+ ability_special_text += ability_special.text;
290
+ tokens[ability_string + "_" + ability_special.ability_special] = ability_special_text;
291
+ }
292
+ }
293
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
294
+ finally {
295
+ try {
296
+ if (ability_specials_1_1 && !ability_specials_1_1.done && (_f = ability_specials_1.return)) _f.call(ability_specials_1);
297
+ }
298
+ finally { if (e_8) throw e_8.error; }
299
+ }
300
+ }
301
+ }
302
+ }
303
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
304
+ finally {
305
+ try {
306
+ if (_p && !_p.done && (_c = _o.return)) _c.call(_o);
307
+ }
308
+ finally { if (e_5) throw e_5.error; }
309
+ }
310
+ }
311
+ // Go over modifiers
312
+ if (localized_data.ModifierArray) {
313
+ try {
314
+ for (var _s = __values(localized_data.ModifierArray), _t = _s.next(); !_t.done; _t = _s.next()) {
315
+ var modifier = _t.value;
316
+ var modifier_string = "DOTA_Tooltip_" + modifier.modifier_classname;
317
+ // Name
318
+ var modifier_name = modifier.name;
319
+ var modifier_description = modifier.description;
320
+ if (modifier.language_overrides) {
321
+ try {
322
+ for (var _u = (e_10 = void 0, __values(modifier.language_overrides)), _v = _u.next(); !_v.done; _v = _u.next()) {
323
+ var language_override = _v.value;
324
+ if (language_override.language === language) {
325
+ // Name overrides for a specific language, if necessary
326
+ if (language_override.name_override) {
327
+ modifier_name = language_override.name_override;
328
+ }
329
+ // Description overrides for a specific language, if necessary
330
+ if (language_override.description_override) {
331
+ modifier_description = language_override.description_override;
332
+ }
333
+ }
334
+ }
335
+ }
336
+ catch (e_10_1) { e_10 = { error: e_10_1 }; }
337
+ finally {
338
+ try {
339
+ if (_v && !_v.done && (_h = _u.return)) _h.call(_u);
340
+ }
341
+ finally { if (e_10) throw e_10.error; }
342
+ }
343
+ }
344
+ // Add name to localization string
345
+ if (modifier_name) {
346
+ tokens[modifier_string] = modifier_name;
347
+ }
348
+ // Add description to localization string
349
+ if (modifier_description) {
350
+ modifier_description = this.TransformForLocalization(modifier_description, true);
351
+ tokens[modifier_string + "_description"] = modifier_description;
352
+ }
353
+ }
354
+ }
355
+ catch (e_9_1) { e_9 = { error: e_9_1 }; }
356
+ finally {
357
+ try {
358
+ if (_t && !_t.done && (_g = _s.return)) _g.call(_s);
359
+ }
360
+ finally { if (e_9) throw e_9.error; }
361
+ }
362
+ }
363
+ return tokens;
364
+ };
365
+ LocalizationCompiler.prototype.WriteContentToAddonFile = function (language, tokens) {
366
+ var _this = this;
367
+ // Set based on language
368
+ var filepath = this.addon_filepath + language.toString() + this.filepath_format;
369
+ // Add the opening tokens
370
+ var kv = { lang: { Language: language, Tokens: tokens } };
371
+ // Serialize!
372
+ var write_string = valve_kv_1.serialize(kv);
373
+ // Try writing if the output is not busy
374
+ this.TryWriting(filepath, write_string, function () {
375
+ // Prepare the output
376
+ _this.currentWrites.add(language);
377
+ if (_this.writeTimeout) {
378
+ clearTimeout(_this.writeTimeout);
379
+ }
380
+ _this.writeTimeout = setTimeout(function () { return _this.FinishWrite(); }, 500);
381
+ });
382
+ };
383
+ LocalizationCompiler.prototype.TryWriting = function (filepath, write_string, success, tries) {
384
+ var _this = this;
385
+ if (tries === void 0) { tries = 0; }
386
+ if (tries > 5) {
387
+ console.log("\x1b[31m%s\x1b[0m", "Tried too many times to write without success!");
388
+ return;
389
+ }
390
+ try {
391
+ // Remove file contents, or create a fresh one if it doesn't exists yet.
392
+ var fd = fs.openSync(filepath, 'w');
393
+ fs.closeSync(fd);
394
+ // Write to the file
395
+ fs.writeFileSync(filepath, write_string);
396
+ }
397
+ catch (_a) {
398
+ // try again after a short time
399
+ setTimeout(function () { return _this.TryWriting(filepath, write_string, success, tries + 1); }, 1000);
400
+ return;
401
+ }
402
+ success();
403
+ };
404
+ // Print the output
405
+ LocalizationCompiler.prototype.FinishWrite = function () {
406
+ var e_11, _a;
407
+ if (this.currentWrites.size === 0)
408
+ return;
409
+ var languages = [];
410
+ try {
411
+ for (var _b = __values(this.currentWrites.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
412
+ var language = _c.value;
413
+ languages.push(language);
414
+ }
415
+ }
416
+ catch (e_11_1) { e_11 = { error: e_11_1 }; }
417
+ finally {
418
+ try {
419
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
420
+ }
421
+ finally { if (e_11) throw e_11.error; }
422
+ }
423
+ this.currentWrites.clear();
424
+ var languageText = languages[0];
425
+ if (languages.length > 1) {
426
+ var lastLang = languages.splice(-1)[0];
427
+ var otherLangs = languages.join(", ");
428
+ if (otherLangs !== "") {
429
+ languageText = otherLangs;
430
+ }
431
+ languageText += " and " + lastLang;
432
+ }
433
+ console.log("Finished writing tooltips for " + languageText);
434
+ console.log("");
435
+ };
436
+ return LocalizationCompiler;
437
+ }());
438
+ exports.LocalizationCompiler = LocalizationCompiler;