@datamoc/mw_games 0.5.1 → 0.5.3
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.
- package/README.md +7 -4
- package/dist/actors/EntityTemplate.d.ts +42 -1
- package/dist/actors/EntityTemplate.d.ts.map +1 -1
- package/dist/actors/EntityTemplate.js +56 -4
- package/dist/actors/EntityTemplate.js.map +1 -1
- package/dist/actors/index.d.ts +2 -2
- package/dist/actors/index.d.ts.map +1 -1
- package/dist/actors/index.js +1 -1
- package/dist/actors/index.js.map +1 -1
- package/dist/core/Registry.d.ts +31 -0
- package/dist/core/Registry.d.ts.map +1 -0
- package/dist/core/Registry.js +46 -0
- package/dist/core/Registry.js.map +1 -0
- package/dist/core/SceneComponents.d.ts +67 -0
- package/dist/core/SceneComponents.d.ts.map +1 -0
- package/dist/core/SceneComponents.js +76 -0
- package/dist/core/SceneComponents.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/dist/i18n/EditSession.d.ts +101 -0
- package/dist/i18n/EditSession.d.ts.map +1 -0
- package/dist/i18n/EditSession.js +150 -0
- package/dist/i18n/EditSession.js.map +1 -0
- package/dist/i18n/Fluent.js +9 -1
- package/dist/i18n/Fluent.js.map +1 -1
- package/dist/i18n/FormatSpec.d.ts +74 -0
- package/dist/i18n/FormatSpec.d.ts.map +1 -0
- package/dist/i18n/FormatSpec.js +302 -0
- package/dist/i18n/FormatSpec.js.map +1 -0
- package/dist/i18n/SemanticMessage.d.ts +15 -2
- package/dist/i18n/SemanticMessage.d.ts.map +1 -1
- package/dist/i18n/SemanticMessage.js +16 -2
- package/dist/i18n/SemanticMessage.js.map +1 -1
- package/dist/i18n/Validate.d.ts +26 -0
- package/dist/i18n/Validate.d.ts.map +1 -1
- package/dist/i18n/Validate.js +33 -0
- package/dist/i18n/Validate.js.map +1 -1
- package/dist/i18n/index.d.ts +32 -2
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +76 -9
- package/dist/i18n/index.js.map +1 -1
- package/dist/mw_games.global.js +98 -91
- package/dist/rpg/Quest.d.ts +45 -0
- package/dist/rpg/Quest.d.ts.map +1 -1
- package/dist/rpg/Quest.js +76 -0
- package/dist/rpg/Quest.js.map +1 -1
- package/dist/rpg/index.d.ts +2 -2
- package/dist/rpg/index.d.ts.map +1 -1
- package/dist/rpg/index.js +1 -1
- package/dist/rpg/index.js.map +1 -1
- package/dist/two-d/render/AnimatedSprite.d.ts +4 -0
- package/dist/two-d/render/AnimatedSprite.d.ts.map +1 -1
- package/dist/two-d/render/AnimatedSprite.js +4 -0
- package/dist/two-d/render/AnimatedSprite.js.map +1 -1
- package/dist/two-d/render/LayeredSprite.d.ts +8 -0
- package/dist/two-d/render/LayeredSprite.d.ts.map +1 -1
- package/dist/two-d/render/LayeredSprite.js +8 -0
- package/dist/two-d/render/LayeredSprite.js.map +1 -1
- package/dist/two-d/render/TileMap.d.ts +7 -0
- package/dist/two-d/render/TileMap.d.ts.map +1 -1
- package/dist/two-d/render/TileMap.js +7 -0
- package/dist/two-d/render/TileMap.js.map +1 -1
- package/dist/two-d/render/TintedSprite.d.ts +12 -0
- package/dist/two-d/render/TintedSprite.d.ts.map +1 -1
- package/dist/two-d/render/TintedSprite.js +12 -0
- package/dist/two-d/render/TintedSprite.js.map +1 -1
- package/dist/two-d/ui/Label.d.ts +14 -0
- package/dist/two-d/ui/Label.d.ts.map +1 -1
- package/dist/two-d/ui/Label.js +40 -0
- package/dist/two-d/ui/Label.js.map +1 -1
- package/dist/two-d/ui/MessageBox.d.ts +1 -1
- package/dist/two-d/ui/MessageBox.d.ts.map +1 -1
- package/dist/two-d/ui/MessageBox.js +8 -7
- package/dist/two-d/ui/MessageBox.js.map +1 -1
- package/dist/two-d/ui/NinePatch.d.ts +2 -0
- package/dist/two-d/ui/NinePatch.d.ts.map +1 -1
- package/dist/two-d/ui/NinePatch.js +2 -0
- package/dist/two-d/ui/NinePatch.js.map +1 -1
- package/dist/two-d/ui/RichLabel.d.ts +56 -0
- package/dist/two-d/ui/RichLabel.d.ts.map +1 -0
- package/dist/two-d/ui/RichLabel.js +135 -0
- package/dist/two-d/ui/RichLabel.js.map +1 -0
- package/dist/two-d/ui/index.d.ts +6 -0
- package/dist/two-d/ui/index.d.ts.map +1 -1
- package/dist/two-d/ui/index.js +3 -0
- package/dist/two-d/ui/index.js.map +1 -1
- package/dist/two-d/ui/markdown.d.ts +55 -0
- package/dist/two-d/ui/markdown.d.ts.map +1 -0
- package/dist/two-d/ui/markdown.js +145 -0
- package/dist/two-d/ui/markdown.js.map +1 -0
- package/dist/two-d/ui/reveal.d.ts +41 -0
- package/dist/two-d/ui/reveal.d.ts.map +1 -0
- package/dist/two-d/ui/reveal.js +22 -0
- package/dist/two-d/ui/reveal.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditSession.d.ts","sourceRoot":"","sources":["../../src/i18n/EditSession.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAgB,MAAM,YAAY,CAAC;AAGxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,0FAA0F;AAC1F,MAAM,WAAW,OAAO;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC;IACnC,oGAAoG;IACpG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,cAAc,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACzB,wCAAwC;IACxC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,WAAW,CAE7E;AAED,yEAAyE;AACzE,eAAO,MAAM,YAAY,WAAW,CAAC;AAErC,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,6FAA6F;AAC7F,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,EAAE,CAG1D;AAkBD,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAkCrE;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAInE;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,GAAE,SAAc,GAAG,OAAO,EAAE,CAYnF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAc1F;AAED,iGAAiG;AACjG,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CAI3E;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CAK9E;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAM3F;AAED,8FAA8F;AAC9F,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAMhE;AAED,wGAAwG;AACxG,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CAE7D"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { catalogCompleteness, messageText } from './Content.js';
|
|
2
|
+
export function createEditSession(base, target) {
|
|
3
|
+
return { base, target };
|
|
4
|
+
}
|
|
5
|
+
/** the suffix marking a sound-cue entry rather than translatable text */
|
|
6
|
+
export const AUDIO_SUFFIX = '.audio';
|
|
7
|
+
export function isAudioKey(key) {
|
|
8
|
+
return key.endsWith(AUDIO_SUFFIX);
|
|
9
|
+
}
|
|
10
|
+
/** every translatable key across both catalogs, sorted; `*.audio` cues are not translated */
|
|
11
|
+
export function sessionKeys(session) {
|
|
12
|
+
const keys = new Set([...Object.keys(session.base.messages), ...Object.keys(session.target.messages)]);
|
|
13
|
+
return [...keys].filter((key) => !isAudioKey(key)).sort();
|
|
14
|
+
}
|
|
15
|
+
function audioText(value) {
|
|
16
|
+
if (value === undefined)
|
|
17
|
+
return undefined;
|
|
18
|
+
const text = messageText(value);
|
|
19
|
+
return text === '' ? undefined : text;
|
|
20
|
+
}
|
|
21
|
+
/** text channels sharing one semantic type share its cue: `combat.damage.log` shows
|
|
22
|
+
* `combat.damage.audio` when it has no `<key>.audio` of its own */
|
|
23
|
+
const TEXT_CHANNELS = ['log', 'compact', 'accessibility', 'debug'];
|
|
24
|
+
function familyAudioKey(key) {
|
|
25
|
+
const dot = key.lastIndexOf('.');
|
|
26
|
+
if (dot <= 0 || !TEXT_CHANNELS.includes(key.slice(dot + 1)))
|
|
27
|
+
return undefined;
|
|
28
|
+
return `${key.slice(0, dot)}${AUDIO_SUFFIX}`;
|
|
29
|
+
}
|
|
30
|
+
export function sessionRow(session, key) {
|
|
31
|
+
const baseValue = session.base.messages[key];
|
|
32
|
+
const targetValue = session.target.messages[key];
|
|
33
|
+
const status = baseValue !== undefined && targetValue !== undefined ? 'ok' : baseValue === undefined ? 'extra' : 'missing';
|
|
34
|
+
const cueKeys = [`${key}${AUDIO_SUFFIX}`];
|
|
35
|
+
const family = familyAudioKey(key);
|
|
36
|
+
if (family)
|
|
37
|
+
cueKeys.push(family);
|
|
38
|
+
let sound;
|
|
39
|
+
let soundKey;
|
|
40
|
+
let soundInherited = false;
|
|
41
|
+
for (const candidate of cueKeys) {
|
|
42
|
+
const own = audioText(session.target.messages[candidate]);
|
|
43
|
+
if (own !== undefined) {
|
|
44
|
+
sound = own;
|
|
45
|
+
soundKey = candidate;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
const inherited = audioText(session.base.messages[candidate]);
|
|
49
|
+
if (inherited !== undefined) {
|
|
50
|
+
sound = inherited;
|
|
51
|
+
soundKey = candidate;
|
|
52
|
+
soundInherited = true;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
key,
|
|
58
|
+
baseText: baseValue === undefined ? '' : messageText(baseValue),
|
|
59
|
+
targetText: targetValue === undefined ? '' : messageText(targetValue),
|
|
60
|
+
status,
|
|
61
|
+
sound,
|
|
62
|
+
soundKey,
|
|
63
|
+
soundInherited,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Which audio key `setTargetSound` writes for `key`: the key's own `<key>.audio` when one
|
|
68
|
+
* already exists on either side, else the family's (`<type>.audio` for a channel key),
|
|
69
|
+
* else the key's own. One cue per family rather than one per channel.
|
|
70
|
+
*/
|
|
71
|
+
export function cueKeyFor(session, key) {
|
|
72
|
+
const own = `${key}${AUDIO_SUFFIX}`;
|
|
73
|
+
if (own in session.target.messages || own in session.base.messages)
|
|
74
|
+
return own;
|
|
75
|
+
return familyAudioKey(key) ?? own;
|
|
76
|
+
}
|
|
77
|
+
export function sessionRows(session, filter = {}) {
|
|
78
|
+
const query = filter.query?.toLowerCase() ?? '';
|
|
79
|
+
return sessionKeys(session)
|
|
80
|
+
.map((key) => sessionRow(session, key))
|
|
81
|
+
.filter((row) => !filter.missingOnly || row.status === 'missing')
|
|
82
|
+
.filter((row) => query === '' ||
|
|
83
|
+
row.key.toLowerCase().includes(query) ||
|
|
84
|
+
row.baseText.toLowerCase().includes(query) ||
|
|
85
|
+
row.targetText.toLowerCase().includes(query));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Sets the target's text for `key`, preserving a plural structure when the new text parses
|
|
89
|
+
* as a plain JSON object over an existing plural entry - otherwise the entry becomes the
|
|
90
|
+
* string as typed. A select message (from an FTL source) edited here downgrades to a
|
|
91
|
+
* plain string; the tool warns about that on save rather than this function refusing it.
|
|
92
|
+
*/
|
|
93
|
+
export function setTargetText(session, key, text) {
|
|
94
|
+
const current = session.target.messages[key] ?? session.base.messages[key];
|
|
95
|
+
let value = text;
|
|
96
|
+
if (current !== undefined && typeof current === 'object' && !('format' in current)) {
|
|
97
|
+
try {
|
|
98
|
+
const parsed = JSON.parse(text);
|
|
99
|
+
if (parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
100
|
+
value = parsed;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
// not JSON - keep the string as typed
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return { ...session, target: { ...session.target, messages: { ...session.target.messages, [key]: value } } };
|
|
108
|
+
}
|
|
109
|
+
/** fills a missing target entry with the base language's own value, plural structure included */
|
|
110
|
+
export function copyFromBase(session, key) {
|
|
111
|
+
const baseValue = session.base.messages[key];
|
|
112
|
+
if (baseValue === undefined)
|
|
113
|
+
throw new Error(`copyFromBase: "${key}" is not a key in the base catalog`);
|
|
114
|
+
return { ...session, target: { ...session.target, messages: { ...session.target.messages, [key]: baseValue } } };
|
|
115
|
+
}
|
|
116
|
+
export function deleteTargetKey(session, key) {
|
|
117
|
+
if (!(key in session.target.messages))
|
|
118
|
+
throw new Error(`deleteTargetKey: "${key}" is not a key in the target catalog`);
|
|
119
|
+
const messages = { ...session.target.messages };
|
|
120
|
+
delete messages[key];
|
|
121
|
+
return { ...session, target: { ...session.target, messages } };
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Associates a sound cue with `key` by setting the target's audio entry (`cueKeyFor`
|
|
125
|
+
* picks the family's `<type>.audio` for a channel key with no cue of its own). An empty
|
|
126
|
+
* path clears the cue (removing the entry rather than storing an empty string, which
|
|
127
|
+
* `validateMessageAudio` would flag).
|
|
128
|
+
*/
|
|
129
|
+
export function setTargetSound(session, key, path) {
|
|
130
|
+
const messages = { ...session.target.messages };
|
|
131
|
+
const audioKey = cueKeyFor(session, key);
|
|
132
|
+
if (path === '')
|
|
133
|
+
delete messages[audioKey];
|
|
134
|
+
else
|
|
135
|
+
messages[audioKey] = path;
|
|
136
|
+
return { ...session, target: { ...session.target, messages } };
|
|
137
|
+
}
|
|
138
|
+
/** fraction of the base catalog's translatable keys the target also has; cue keys excluded */
|
|
139
|
+
export function sessionCompleteness(session) {
|
|
140
|
+
const stripAudio = (catalog) => ({
|
|
141
|
+
...catalog,
|
|
142
|
+
messages: Object.fromEntries(Object.entries(catalog.messages).filter(([key]) => !isAudioKey(key))),
|
|
143
|
+
});
|
|
144
|
+
return catalogCompleteness(stripAudio(session.base), stripAudio(session.target));
|
|
145
|
+
}
|
|
146
|
+
/** swaps which catalog is the reference and which is edited, for main-language-to-main-language work */
|
|
147
|
+
export function swapSession(session) {
|
|
148
|
+
return { base: session.target, target: session.base };
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=EditSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditSession.js","sourceRoot":"","sources":["../../src/i18n/EditSession.ts"],"names":[],"mappings":"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"}
|
package/dist/i18n/Fluent.js
CHANGED
|
@@ -65,7 +65,15 @@ export function parseFTL(locale, source, options = {}) {
|
|
|
65
65
|
return { locale, direction: options.direction ?? (/^(ar|he|fa|ur)(?:-|$)/i.test(locale) ? 'rtl' : 'ltr'), messages };
|
|
66
66
|
}
|
|
67
67
|
function normalize(text) {
|
|
68
|
-
|
|
68
|
+
//`{$name}` renders as `{name}`; a conversion or format spec rides along untouched
|
|
69
|
+
//(`{$dmg:03d}` becomes `{dmg:03d}`), for `t()`'s own f-string handling downstream
|
|
70
|
+
return text
|
|
71
|
+
.replace(/\{\s*\$([\w-]+)\s*(?:!([sra]))?\s*(?::\s*([^{}]*?))?\s*\}/g, (_, name, conv, spec) => {
|
|
72
|
+
const conversion = conv ? `!${conv}` : '';
|
|
73
|
+
const suffix = spec === undefined ? '' : `:${spec.trim()}`;
|
|
74
|
+
return `{${name}${conversion}${suffix}}`;
|
|
75
|
+
})
|
|
76
|
+
.trim();
|
|
69
77
|
}
|
|
70
78
|
function selectMessage(locale, selectorName, variants) {
|
|
71
79
|
const defaults = variants.filter((variant) => variant.default);
|
package/dist/i18n/Fluent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Fluent.js","sourceRoot":"","sources":["../../src/i18n/Fluent.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Fluent.js","sourceRoot":"","sources":["../../src/i18n/Fluent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python f-string-style value formatting for catalog messages: `{dmg:03d}`, `{hp:.1%}`,
|
|
3
|
+
* `{name:>12}`. Plain `{token}` interpolation stays exactly as it was; a format spec after
|
|
4
|
+
* a colon picks a deterministic, locale-independent rendering (padded damage numbers, hex
|
|
5
|
+
* ids, fixed-precision percentages), the counterpart to `Format.ts`, whose `Intl` wrappers
|
|
6
|
+
* render the locale-aware way instead ("1,234" vs "1 234").
|
|
7
|
+
*
|
|
8
|
+
* Supported subset of
|
|
9
|
+
* https://docs.python.org/3/library/string.html#format-specification-mini-language -
|
|
10
|
+
* `[[fill]align][sign][z][#][0][width][,|_][.precision][type]` with types
|
|
11
|
+
* `b c d e E f F g G n o s x X %`, verified case by case against CPython itself
|
|
12
|
+
* (two-digit exponents, stripped `g` precision, `_` grouping binary/octal/hex in fours).
|
|
13
|
+
* Deliberately outside the subset: nested replacement fields in the spec (`{:{width}}`),
|
|
14
|
+
* which are left for a game to resolve before calling `t()`. Anything outside the subset
|
|
15
|
+
* returns `undefined` rather than guessing, and `t()` leaves that placeholder untouched
|
|
16
|
+
* the way it already does for a missing token.
|
|
17
|
+
*
|
|
18
|
+
* One divergence no implementation choice can close: JavaScript numbers carry no
|
|
19
|
+
* int/float distinction, so integer-valued floats always take the integer path (`3.0`
|
|
20
|
+
* renders as `3`, and takes `d` where CPython would raise for a float). Games that need
|
|
21
|
+
* `3.0` spell it with an explicit float type (`{v:.1f}`).
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* import { formatSpec, tokenizeMessage, diffPlaceholders } from '@datamoc/mw_games/i18n';
|
|
26
|
+
*
|
|
27
|
+
* formatSpec(7, '03d'); // '007'
|
|
28
|
+
* formatSpec(0.125, '.1%'); // '12.5%'
|
|
29
|
+
* formatSpec('hi', '^7'); // ' hi '
|
|
30
|
+
*
|
|
31
|
+
* tokenizeMessage('Hit for {dmg:03d}!');
|
|
32
|
+
* // ['Hit for ', { raw: '{dmg:03d}', token: 'dmg', debug: false, conv: undefined, spec: '03d' }, '!']
|
|
33
|
+
*
|
|
34
|
+
* diffPlaceholders('Hit for {dmg:03d}!', 'Touché pour {dmg} !');
|
|
35
|
+
* // { missing: [], extra: [], changed: [{ token: 'dmg', base: ':03d', target: '' }] }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export interface Placeholder {
|
|
39
|
+
/** the placeholder exactly as written, for untouched passthrough */
|
|
40
|
+
raw: string;
|
|
41
|
+
token: string;
|
|
42
|
+
debug: boolean;
|
|
43
|
+
conv: string | undefined;
|
|
44
|
+
spec: string | undefined;
|
|
45
|
+
}
|
|
46
|
+
export type MessagePart = string | Placeholder;
|
|
47
|
+
/**
|
|
48
|
+
* Splits a message into literal text and `{token}`, `{token:spec}`, `{token!conv}` and
|
|
49
|
+
* `{token=}` placeholders - the single definition of that grammar, shared by `t()`'s own
|
|
50
|
+
* interpolation and by `diffPlaceholders` below, so the editor's consistency check can
|
|
51
|
+
* never disagree with the runtime about what counts as a placeholder.
|
|
52
|
+
*/
|
|
53
|
+
export declare function tokenizeMessage(text: string): MessagePart[];
|
|
54
|
+
export interface PlaceholderDiff {
|
|
55
|
+
/** tokens the base message needs that the target never supplies */
|
|
56
|
+
missing: string[];
|
|
57
|
+
/** tokens the target supplies that the base never needs */
|
|
58
|
+
extra: string[];
|
|
59
|
+
/** same token, different conversion/spec/debug shape on each side */
|
|
60
|
+
changed: Array<{
|
|
61
|
+
token: string;
|
|
62
|
+
base: string;
|
|
63
|
+
target: string;
|
|
64
|
+
}>;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Compares two message texts placeholder by placeholder - the check a translation editor
|
|
68
|
+
* runs between a reference string and its translation, since a dropped or reworded token
|
|
69
|
+
* (`{dmg:03d}` becoming `{damage}`, or vanishing entirely) reaches the player as a raw
|
|
70
|
+
* placeholder exactly the way a missing key would.
|
|
71
|
+
*/
|
|
72
|
+
export declare function diffPlaceholders(baseText: string, targetText: string): PlaceholderDiff;
|
|
73
|
+
export declare function formatSpec(value: string | number, spec: string, language?: string): string | undefined;
|
|
74
|
+
//# sourceMappingURL=FormatSpec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormatSpec.d.ts","sourceRoot":"","sources":["../../src/i18n/FormatSpec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,MAAM,WAAW,WAAW;IAC3B,oEAAoE;IACpE,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,CAAC;AAI/C;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAgB3D;AAMD,MAAM,WAAW,eAAe;IAC/B,mEAAmE;IACnE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qEAAqE;IACrE,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,eAAe,CAiBtF;AAqFD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAO,GAAG,MAAM,GAAG,SAAS,CAkGpG"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python f-string-style value formatting for catalog messages: `{dmg:03d}`, `{hp:.1%}`,
|
|
3
|
+
* `{name:>12}`. Plain `{token}` interpolation stays exactly as it was; a format spec after
|
|
4
|
+
* a colon picks a deterministic, locale-independent rendering (padded damage numbers, hex
|
|
5
|
+
* ids, fixed-precision percentages), the counterpart to `Format.ts`, whose `Intl` wrappers
|
|
6
|
+
* render the locale-aware way instead ("1,234" vs "1 234").
|
|
7
|
+
*
|
|
8
|
+
* Supported subset of
|
|
9
|
+
* https://docs.python.org/3/library/string.html#format-specification-mini-language -
|
|
10
|
+
* `[[fill]align][sign][z][#][0][width][,|_][.precision][type]` with types
|
|
11
|
+
* `b c d e E f F g G n o s x X %`, verified case by case against CPython itself
|
|
12
|
+
* (two-digit exponents, stripped `g` precision, `_` grouping binary/octal/hex in fours).
|
|
13
|
+
* Deliberately outside the subset: nested replacement fields in the spec (`{:{width}}`),
|
|
14
|
+
* which are left for a game to resolve before calling `t()`. Anything outside the subset
|
|
15
|
+
* returns `undefined` rather than guessing, and `t()` leaves that placeholder untouched
|
|
16
|
+
* the way it already does for a missing token.
|
|
17
|
+
*
|
|
18
|
+
* One divergence no implementation choice can close: JavaScript numbers carry no
|
|
19
|
+
* int/float distinction, so integer-valued floats always take the integer path (`3.0`
|
|
20
|
+
* renders as `3`, and takes `d` where CPython would raise for a float). Games that need
|
|
21
|
+
* `3.0` spell it with an explicit float type (`{v:.1f}`).
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* import { formatSpec, tokenizeMessage, diffPlaceholders } from '@datamoc/mw_games/i18n';
|
|
26
|
+
*
|
|
27
|
+
* formatSpec(7, '03d'); // '007'
|
|
28
|
+
* formatSpec(0.125, '.1%'); // '12.5%'
|
|
29
|
+
* formatSpec('hi', '^7'); // ' hi '
|
|
30
|
+
*
|
|
31
|
+
* tokenizeMessage('Hit for {dmg:03d}!');
|
|
32
|
+
* // ['Hit for ', { raw: '{dmg:03d}', token: 'dmg', debug: false, conv: undefined, spec: '03d' }, '!']
|
|
33
|
+
*
|
|
34
|
+
* diffPlaceholders('Hit for {dmg:03d}!', 'Touché pour {dmg} !');
|
|
35
|
+
* // { missing: [], extra: [], changed: [{ token: 'dmg', base: ':03d', target: '' }] }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
const PLACEHOLDER_PATTERN = /\{(\w+)(=)?(?:!([sra]))?(?::([^{}]*))?\}/g;
|
|
39
|
+
/**
|
|
40
|
+
* Splits a message into literal text and `{token}`, `{token:spec}`, `{token!conv}` and
|
|
41
|
+
* `{token=}` placeholders - the single definition of that grammar, shared by `t()`'s own
|
|
42
|
+
* interpolation and by `diffPlaceholders` below, so the editor's consistency check can
|
|
43
|
+
* never disagree with the runtime about what counts as a placeholder.
|
|
44
|
+
*/
|
|
45
|
+
export function tokenizeMessage(text) {
|
|
46
|
+
const parts = [];
|
|
47
|
+
PLACEHOLDER_PATTERN.lastIndex = 0;
|
|
48
|
+
let cursor = 0;
|
|
49
|
+
let match;
|
|
50
|
+
while ((match = PLACEHOLDER_PATTERN.exec(text)) !== null) {
|
|
51
|
+
if (match.index > cursor)
|
|
52
|
+
parts.push(text.slice(cursor, match.index));
|
|
53
|
+
//group 1 always participates; the rest may be absent at runtime
|
|
54
|
+
const token = match[1];
|
|
55
|
+
const conv = match[3];
|
|
56
|
+
const spec = match[4];
|
|
57
|
+
parts.push({ raw: match[0], token, debug: match[2] === '=', conv, spec });
|
|
58
|
+
cursor = match.index + match[0].length;
|
|
59
|
+
}
|
|
60
|
+
if (cursor < text.length)
|
|
61
|
+
parts.push(text.slice(cursor));
|
|
62
|
+
return parts;
|
|
63
|
+
}
|
|
64
|
+
function placeholderSignature(part) {
|
|
65
|
+
return `${part.debug ? '=' : ''}${part.conv ? `!${part.conv}` : ''}${part.spec === undefined ? '' : `:${part.spec}`}`;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Compares two message texts placeholder by placeholder - the check a translation editor
|
|
69
|
+
* runs between a reference string and its translation, since a dropped or reworded token
|
|
70
|
+
* (`{dmg:03d}` becoming `{damage}`, or vanishing entirely) reaches the player as a raw
|
|
71
|
+
* placeholder exactly the way a missing key would.
|
|
72
|
+
*/
|
|
73
|
+
export function diffPlaceholders(baseText, targetText) {
|
|
74
|
+
const base = new Map();
|
|
75
|
+
const target = new Map();
|
|
76
|
+
for (const part of tokenizeMessage(baseText)) {
|
|
77
|
+
if (typeof part !== 'string')
|
|
78
|
+
base.set(part.token, placeholderSignature(part));
|
|
79
|
+
}
|
|
80
|
+
for (const part of tokenizeMessage(targetText)) {
|
|
81
|
+
if (typeof part !== 'string')
|
|
82
|
+
target.set(part.token, placeholderSignature(part));
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
missing: [...base.keys()].filter((token) => !target.has(token)),
|
|
86
|
+
extra: [...target.keys()].filter((token) => !base.has(token)),
|
|
87
|
+
changed: [...base].flatMap(([token, baseSig]) => {
|
|
88
|
+
const targetSig = target.get(token);
|
|
89
|
+
return targetSig !== undefined && targetSig !== baseSig ? [{ token, base: baseSig, target: targetSig }] : [];
|
|
90
|
+
}),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
const SPEC_PATTERN = /^(?:(.)?([<>=^]))?([+\- ])?(z)?(#)?(0)?(\d+)?([,_])?(?:\.(\d+))?([bcdeEfFgGnosxX%])?$/;
|
|
94
|
+
const INT_RADIX = { b: 2, o: 8, x: 16, X: 16 };
|
|
95
|
+
const INT_PREFIX = { b: '0b', o: '0o', x: '0x', X: '0X' };
|
|
96
|
+
const FINITE_FLOAT_TYPES = new Set(['f', 'F', 'e', 'E', 'g', 'G', '%', 'n']);
|
|
97
|
+
/** `str()` for a number: integers plain, non-integers as-is, infinities Python-spelled */
|
|
98
|
+
function reprNumber(value) {
|
|
99
|
+
if (Number.isNaN(value))
|
|
100
|
+
return 'nan';
|
|
101
|
+
if (value === Infinity)
|
|
102
|
+
return 'inf';
|
|
103
|
+
if (value === -Infinity)
|
|
104
|
+
return '-inf';
|
|
105
|
+
if (Object.is(value, -0))
|
|
106
|
+
return '-0.0';
|
|
107
|
+
return String(value);
|
|
108
|
+
}
|
|
109
|
+
function groupDigits(digits, separator, size = 3, digit = '\\d') {
|
|
110
|
+
return digits.replace(new RegExp(`\\B(?=(${digit}{${size}})+(?!${digit}))`, 'g'), separator);
|
|
111
|
+
}
|
|
112
|
+
/** groups the leading digit run of a decimal rendering (`1,234.5`, `1_234.5`) */
|
|
113
|
+
function groupDecimalRendering(text, separator) {
|
|
114
|
+
const match = /^(\d+)/.exec(text);
|
|
115
|
+
if (!match)
|
|
116
|
+
return text;
|
|
117
|
+
return groupDigits(match[1], separator) + text.slice(match[1].length);
|
|
118
|
+
}
|
|
119
|
+
function padText(text, width, fill, align) {
|
|
120
|
+
if (text.length >= width)
|
|
121
|
+
return text;
|
|
122
|
+
const pad = fill.repeat(width - text.length);
|
|
123
|
+
if (align === '<')
|
|
124
|
+
return text + pad;
|
|
125
|
+
//a centered field with an odd spare character puts it on the right, like CPython
|
|
126
|
+
if (align === '^')
|
|
127
|
+
return pad.slice(0, Math.floor(pad.length / 2)) + text + pad.slice(Math.floor(pad.length / 2));
|
|
128
|
+
return pad + text;
|
|
129
|
+
}
|
|
130
|
+
/** CPython pads an exponent to at least two digits (`1.23e+3` renders as `1.23e+03`) */
|
|
131
|
+
function padExponent(text) {
|
|
132
|
+
return text.replace(/([eE][+-])(\d)$/, '$10$2');
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Significant-digits formatting with stripped zeros. CPython's `g` renders fixed while
|
|
136
|
+
* the exponent stays below the precision; a bare precision without a type (`{v:.4}`)
|
|
137
|
+
* switches to exponential one digit sooner - same shape, a tighter threshold.
|
|
138
|
+
*/
|
|
139
|
+
function formatGeneral(magnitude, precision, upper, alt, fixedBelow) {
|
|
140
|
+
const digits = precision === 0 ? 1 : precision;
|
|
141
|
+
if (magnitude === 0)
|
|
142
|
+
return alt ? `0.${'0'.repeat(digits - 1)}` : '0';
|
|
143
|
+
const exponent = Math.floor(Math.log10(magnitude));
|
|
144
|
+
let out;
|
|
145
|
+
if (exponent >= -4 && exponent < (fixedBelow ?? digits)) {
|
|
146
|
+
out = magnitude.toFixed(digits - 1 - exponent);
|
|
147
|
+
if (!alt)
|
|
148
|
+
out = out.replace(/(\.\d*?)0+$/, '$1').replace(/\.$/, '');
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
out = padExponent(magnitude.toExponential(digits - 1));
|
|
152
|
+
if (!alt)
|
|
153
|
+
out = out.replace(/(\.\d*?)0+(e|$)/, '$1$2').replace(/\.e/i, 'e');
|
|
154
|
+
}
|
|
155
|
+
return upper ? out.toUpperCase() : out;
|
|
156
|
+
}
|
|
157
|
+
function localeSeparators(language) {
|
|
158
|
+
let group = ',';
|
|
159
|
+
let decimal = '.';
|
|
160
|
+
for (const part of new Intl.NumberFormat(language).formatToParts(1000.5)) {
|
|
161
|
+
if (part.type === 'group')
|
|
162
|
+
group = part.value;
|
|
163
|
+
if (part.type === 'decimal')
|
|
164
|
+
decimal = part.value;
|
|
165
|
+
}
|
|
166
|
+
return { group, decimal };
|
|
167
|
+
}
|
|
168
|
+
function formatStringSpec(value, fillChar, alignChar, zeroFlag, width, precision) {
|
|
169
|
+
const text = precision === undefined ? value : value.slice(0, precision);
|
|
170
|
+
//unlike numbers, a string keeps its left alignment behind a `0` flag (`'ab'` as
|
|
171
|
+
//`05` renders `'ab000'`), since zero-padding a word has no sign to sit behind
|
|
172
|
+
return padText(text, width, fillChar ?? (zeroFlag ? '0' : ' '), alignChar ?? '<');
|
|
173
|
+
}
|
|
174
|
+
export function formatSpec(value, spec, language = 'en') {
|
|
175
|
+
if (spec === '')
|
|
176
|
+
return typeof value === 'number' ? reprNumber(value) : value;
|
|
177
|
+
const parsed = SPEC_PATTERN.exec(spec);
|
|
178
|
+
if (!parsed)
|
|
179
|
+
return undefined;
|
|
180
|
+
const groups = parsed.slice(1);
|
|
181
|
+
const [fillChar, alignChar, sign, zFlag, altFlag, zeroFlag, widthDigits, grouping, precisionDigits, type] = groups;
|
|
182
|
+
const precision = precisionDigits === undefined ? undefined : Number(precisionDigits);
|
|
183
|
+
const width = widthDigits === undefined ? 0 : Number(widthDigits);
|
|
184
|
+
if (typeof value === 'string') {
|
|
185
|
+
//strings take width/alignment/fill and `.precision` truncation only - every other
|
|
186
|
+
//option is numeric, and CPython raises for those rather than coercing the string
|
|
187
|
+
if (sign || zFlag || altFlag || grouping || alignChar === '=' || (type !== undefined && type !== 's'))
|
|
188
|
+
return undefined;
|
|
189
|
+
return formatStringSpec(value, fillChar, alignChar, zeroFlag, width, precision);
|
|
190
|
+
}
|
|
191
|
+
//CPython's `s` is string-only: a number behind one raises rather than stringifying
|
|
192
|
+
if (type === 's')
|
|
193
|
+
return undefined;
|
|
194
|
+
if (type === 'c') {
|
|
195
|
+
//a code point, not a number rendered as text - numeric dressing of any kind is refused
|
|
196
|
+
if (sign || altFlag || zeroFlag || grouping || precision !== undefined)
|
|
197
|
+
return undefined;
|
|
198
|
+
const code = Math.trunc(value);
|
|
199
|
+
if (code < 0 || code > 0x10ffff)
|
|
200
|
+
return undefined;
|
|
201
|
+
return padText(String.fromCodePoint(code), width, fillChar ?? ' ', alignChar ?? '>');
|
|
202
|
+
}
|
|
203
|
+
if (!Number.isFinite(value)) {
|
|
204
|
+
if (type !== undefined && !FINITE_FLOAT_TYPES.has(type))
|
|
205
|
+
return undefined;
|
|
206
|
+
//CPython spells these lowercase except behind an uppercase float type
|
|
207
|
+
let text = Number.isNaN(value) ? 'nan' : 'inf';
|
|
208
|
+
if (type === 'F' || type === 'E' || type === 'G')
|
|
209
|
+
text = text.toUpperCase();
|
|
210
|
+
if (type === '%')
|
|
211
|
+
text += '%';
|
|
212
|
+
const signText = value < 0 ? '-' : sign === '+' ? '+' : sign === ' ' ? ' ' : '';
|
|
213
|
+
return padText(signText + text, width, fillChar ?? ' ', alignChar ?? '>');
|
|
214
|
+
}
|
|
215
|
+
let negative = value < 0 || Object.is(value, -0);
|
|
216
|
+
//Python 3.11's `z`: a negative zero renders as a positive one
|
|
217
|
+
if (zFlag && value === 0)
|
|
218
|
+
negative = false;
|
|
219
|
+
const magnitude = Math.abs(value);
|
|
220
|
+
const separator = grouping === ',' ? ',' : grouping === '_' ? '_' : '';
|
|
221
|
+
let body;
|
|
222
|
+
if (type === undefined) {
|
|
223
|
+
//no type: `str()` plus sign/grouping/width - a precision without a type reads as
|
|
224
|
+
//significant digits, except on an integer, where CPython raises
|
|
225
|
+
if (precision !== undefined) {
|
|
226
|
+
if (Number.isInteger(magnitude))
|
|
227
|
+
return undefined;
|
|
228
|
+
body = formatGeneral(magnitude, precision, false, !!altFlag, precision - 1);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
body = reprNumber(magnitude);
|
|
232
|
+
}
|
|
233
|
+
if (separator)
|
|
234
|
+
body = groupDecimalRendering(body, separator);
|
|
235
|
+
}
|
|
236
|
+
else if (type === 'd') {
|
|
237
|
+
if (precision !== undefined || !Number.isInteger(magnitude))
|
|
238
|
+
return undefined;
|
|
239
|
+
body = String(Math.trunc(magnitude));
|
|
240
|
+
if (separator)
|
|
241
|
+
body = groupDigits(body, separator);
|
|
242
|
+
}
|
|
243
|
+
else if (type in INT_RADIX) {
|
|
244
|
+
//integer-only, like `d`; `,` is refused on a non-decimal base while `_` groups
|
|
245
|
+
//binary, octal and hex in fours rather than threes (`dead_beef`, `1010_1010`)
|
|
246
|
+
if (precision !== undefined || !Number.isInteger(magnitude) || grouping === ',')
|
|
247
|
+
return undefined;
|
|
248
|
+
body = Math.trunc(magnitude).toString(INT_RADIX[type]);
|
|
249
|
+
if (type === 'X')
|
|
250
|
+
body = body.toUpperCase();
|
|
251
|
+
if (separator)
|
|
252
|
+
body = groupDigits(body, separator, 4, '[0-9a-fA-F]');
|
|
253
|
+
if (altFlag)
|
|
254
|
+
body = INT_PREFIX[type] + body;
|
|
255
|
+
}
|
|
256
|
+
else if (type === 'n') {
|
|
257
|
+
//locale-aware, so it shares none of the fixed separators above - and takes none
|
|
258
|
+
if (grouping || (precision !== undefined && Number.isInteger(magnitude)))
|
|
259
|
+
return undefined;
|
|
260
|
+
if (Number.isInteger(magnitude)) {
|
|
261
|
+
body = new Intl.NumberFormat(language).format(Math.trunc(magnitude));
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
const { group, decimal } = localeSeparators(language);
|
|
265
|
+
const general = formatGeneral(magnitude, precision ?? 6, false, !!altFlag);
|
|
266
|
+
const mantissa = general.split('e')[0];
|
|
267
|
+
const exponent = general.slice(mantissa.length);
|
|
268
|
+
body = groupDecimalRendering(mantissa, group).replace('.', decimal) + exponent;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
else if (type === 'f' || type === 'F') {
|
|
272
|
+
body = magnitude.toFixed(precision ?? 6);
|
|
273
|
+
if (separator)
|
|
274
|
+
body = groupDecimalRendering(body, separator);
|
|
275
|
+
}
|
|
276
|
+
else if (type === 'e' || type === 'E') {
|
|
277
|
+
body = padExponent(magnitude.toExponential(precision ?? 6));
|
|
278
|
+
if (type === 'E')
|
|
279
|
+
body = body.toUpperCase();
|
|
280
|
+
if (separator)
|
|
281
|
+
body = groupDecimalRendering(body, separator);
|
|
282
|
+
}
|
|
283
|
+
else if (type === 'g' || type === 'G') {
|
|
284
|
+
body = formatGeneral(magnitude, precision ?? 6, type === 'G', !!altFlag);
|
|
285
|
+
if (separator)
|
|
286
|
+
body = groupDecimalRendering(body, separator);
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
// '%' - fixed digits of the value times a hundred, then the sign itself
|
|
290
|
+
const hundredths = magnitude * 100;
|
|
291
|
+
body = (Number.isFinite(hundredths) ? hundredths.toFixed(precision ?? 6) : 'inf') + '%';
|
|
292
|
+
if (separator && Number.isFinite(hundredths))
|
|
293
|
+
body = groupDecimalRendering(body, separator);
|
|
294
|
+
}
|
|
295
|
+
const signText = negative ? '-' : sign === '+' ? '+' : sign === ' ' ? ' ' : '';
|
|
296
|
+
const fill = fillChar ?? (zeroFlag && !alignChar ? '0' : ' ');
|
|
297
|
+
const align = alignChar ?? (zeroFlag && !alignChar ? '=' : '>');
|
|
298
|
+
if (align === '=')
|
|
299
|
+
return signText + padText(body, width - signText.length, fill, '>');
|
|
300
|
+
return padText(signText + body, width, fill, align);
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=FormatSpec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormatSpec.js","sourceRoot":"","sources":["../../src/i18n/FormatSpec.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,8 +33,11 @@ export interface GrammaticalEntity {
|
|
|
33
33
|
forms?: Record<string, string>;
|
|
34
34
|
}
|
|
35
35
|
/** Where the same semantic message ends up: a game log line, a compact HUD number, an
|
|
36
|
-
* accessibility announcement,
|
|
37
|
-
|
|
36
|
+
* accessibility announcement, a debug dump, or the sound effect played alongside it - one
|
|
37
|
+
* simulation event, several presentations. The `audio` entry holds a sound path (an asset
|
|
38
|
+
* path `mwg/audio`'s `Sound` plays), not display text, so it resolves through `tRaw`
|
|
39
|
+
* rather than `t()`: no typographic spacing, no right-to-left wrapping. */
|
|
40
|
+
export type MessageChannel = 'log' | 'compact' | 'accessibility' | 'debug' | 'audio';
|
|
38
41
|
export interface MessageFormatter {
|
|
39
42
|
format(message: SemanticMessage, channel: MessageChannel): string;
|
|
40
43
|
}
|
|
@@ -65,7 +68,17 @@ export interface MessageFormatter {
|
|
|
65
68
|
* console.log(formatter.format(message, 'log')); // 'The gnoll takes 7 damage.'
|
|
66
69
|
* console.log(formatter.format(message, 'compact')); // '-7 HP'
|
|
67
70
|
* console.log(formatter.format(message, 'debug')); // falls back to the bare type: the key itself, if undeclared
|
|
71
|
+
* console.log(formatter.format(message, 'audio')); // 'sounds/sword-hit.wav', or '' when no '<type>.audio' entry exists
|
|
68
72
|
* ```
|
|
73
|
+
*
|
|
74
|
+
* The `audio` channel is deliberately narrower than the text channels: it resolves only
|
|
75
|
+
* `<type>.audio`, never falling back to the bare type the way text does. A bare type
|
|
76
|
+
* holding a sentence (`'combat.damage': 'combat.damage generic'`) is not a playable path,
|
|
77
|
+
* so falling back to it would hand the game garbage to load. Sounds that need no
|
|
78
|
+
* per-channel variation are still shared - every text channel already falls back to the
|
|
79
|
+
* same bare type, while `audio` stays a separate entry a translator never touches and the
|
|
80
|
+
* base language usually owns alone (runtime lookup falls back to the base catalog, so a
|
|
81
|
+
* translated catalog needs no copy of it).
|
|
69
82
|
*/
|
|
70
83
|
export declare function createCatalogFormatter(): MessageFormatter;
|
|
71
84
|
//# sourceMappingURL=SemanticMessage.d.ts.map
|