@bscotch/gcdata 0.24.1 → 0.26.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.
- package/dist/GameChanger.d.ts +29 -123
- package/dist/GameChanger.d.ts.map +1 -1
- package/dist/cl2.character.pointers.d.ts +1 -1
- package/dist/cl2.character.pointers.d.ts.map +1 -1
- package/dist/cl2.credits.d.ts +4 -0
- package/dist/cl2.credits.d.ts.map +1 -0
- package/dist/cl2.credits.js +4 -0
- package/dist/cl2.credits.js.map +1 -0
- package/dist/cl2.credits.parse.d.ts +5 -0
- package/dist/cl2.credits.parse.d.ts.map +1 -0
- package/dist/cl2.credits.parse.js +334 -0
- package/dist/cl2.credits.parse.js.map +1 -0
- package/dist/cl2.credits.pointers.d.ts +3 -0
- package/dist/cl2.credits.pointers.d.ts.map +1 -0
- package/dist/cl2.credits.pointers.js +2 -0
- package/dist/cl2.credits.pointers.js.map +1 -0
- package/dist/cl2.credits.stringify.d.ts +4 -0
- package/dist/cl2.credits.stringify.d.ts.map +1 -0
- package/dist/cl2.credits.stringify.js +42 -0
- package/dist/cl2.credits.stringify.js.map +1 -0
- package/dist/cl2.credits.types.d.ts +29 -0
- package/dist/cl2.credits.types.d.ts.map +1 -0
- package/dist/cl2.credits.types.js +28 -0
- package/dist/cl2.credits.types.js.map +1 -0
- package/dist/cl2.quest.pointers.d.ts +1 -1
- package/dist/cl2.quest.pointers.d.ts.map +1 -1
- package/dist/cl2.quest.utils.d.ts +1 -1
- package/dist/cl2.shared.types.d.ts +4 -29
- package/dist/cl2.shared.types.d.ts.map +1 -1
- package/dist/cl2.shared.types.js +4 -0
- package/dist/cl2.shared.types.js.map +1 -1
- package/dist/cl2.storyline.pointers.d.ts +1 -1
- package/dist/cl2.storyline.pointers.d.ts.map +1 -1
- package/dist/cl2.types.auto.d.ts +23192 -17509
- package/dist/cl2.types.auto.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types.cl2.rumpus.d.ts +6 -174
- package/dist/types.cl2.rumpus.d.ts.map +1 -1
- package/dist/types.cl2.rumpus.js +5 -9
- package/dist/types.cl2.rumpus.js.map +1 -1
- package/dist/types.d.ts +16 -392
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +11 -17
- package/dist/types.js.map +1 -1
- package/package.json +7 -7
- package/dist/cl2.chats.d.ts +0 -1
- package/dist/cl2.chats.d.ts.map +0 -1
- package/dist/cl2.chats.js +0 -2
- package/dist/cl2.chats.js.map +0 -1
- package/dist/cl3.quest.stringify.d.ts +0 -5
- package/dist/cl3.quest.stringify.d.ts.map +0 -1
- package/dist/cl3.quest.stringify.js +0 -154
- package/dist/cl3.quest.stringify.js.map +0 -1
- package/dist/cl3.quest.types.d.ts +0 -84
- package/dist/cl3.quest.types.d.ts.map +0 -1
- package/dist/cl3.quest.types.js +0 -33
- package/dist/cl3.quest.types.js.map +0 -1
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import { assert } from './assert.js';
|
|
2
|
+
import { linePatterns, } from './cl2.credits.types.js';
|
|
3
|
+
import { prepareParserHelpers } from './cl2.shared.parse.js';
|
|
4
|
+
import { creditsSchemaId } from './cl2.shared.types.js';
|
|
5
|
+
import { bsArrayToArray, createBsArrayKey, updateBsArrayOrder, } from './helpers.js';
|
|
6
|
+
export function parseStringifiedCredits(text, packed) {
|
|
7
|
+
const result = {
|
|
8
|
+
diagnostics: [],
|
|
9
|
+
hovers: [],
|
|
10
|
+
edits: [],
|
|
11
|
+
completions: [],
|
|
12
|
+
words: [],
|
|
13
|
+
parsed: {
|
|
14
|
+
sections: [],
|
|
15
|
+
comments: [], // Don't really need this, but here for consistency
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
const helpers = prepareParserHelpers(text, packed, { schemaId: creditsSchemaId }, result);
|
|
19
|
+
let currentSection = undefined;
|
|
20
|
+
let currentRole = undefined;
|
|
21
|
+
for (const line of helpers.lines) {
|
|
22
|
+
const trace = [];
|
|
23
|
+
try {
|
|
24
|
+
// Is this just a blank line?
|
|
25
|
+
if (!line) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const parsedLine = helpers.parseCurrentLine(linePatterns);
|
|
29
|
+
if (!parsedLine)
|
|
30
|
+
continue;
|
|
31
|
+
const indicator = parsedLine.indicator?.value;
|
|
32
|
+
if (indicator === '===') {
|
|
33
|
+
// Then this is a Gap entry
|
|
34
|
+
assert(currentSection, 'Gaps are not supported');
|
|
35
|
+
}
|
|
36
|
+
else if (indicator?.startsWith('\t-')) {
|
|
37
|
+
// Then this is a specific person and they need to be added
|
|
38
|
+
// to the current role
|
|
39
|
+
assert(currentRole, 'Cannot add a person without being in a Role');
|
|
40
|
+
const name = parsedLine.text?.value;
|
|
41
|
+
// Detect if it's a CJK name
|
|
42
|
+
const cjk = name && /^[\u4E00-\u9FFF]+$/.test(name);
|
|
43
|
+
currentRole.names.push({
|
|
44
|
+
name: name ?? '',
|
|
45
|
+
cjk: !!cjk,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
else if (indicator?.startsWith('\t') && line.trim()) {
|
|
49
|
+
// Then this is a Role line
|
|
50
|
+
currentRole = {
|
|
51
|
+
id: parsedLine.arrayTag?.value || '',
|
|
52
|
+
type: 'role',
|
|
53
|
+
role: parsedLine.text?.value || '',
|
|
54
|
+
names: [],
|
|
55
|
+
};
|
|
56
|
+
if (!currentRole.id) {
|
|
57
|
+
currentRole.id = createBsArrayKey();
|
|
58
|
+
result.edits.push({
|
|
59
|
+
newText: `#${currentRole.id} `,
|
|
60
|
+
start: parsedLine.indicator.end,
|
|
61
|
+
end: parsedLine.indicator.end,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
assert(currentSection, 'Cannot add a Role without being in a Section');
|
|
65
|
+
currentSection.roles.push(currentRole);
|
|
66
|
+
}
|
|
67
|
+
else if (!line.match(/^\s+/)) {
|
|
68
|
+
// Then this is a Section line
|
|
69
|
+
currentSection = {
|
|
70
|
+
id: parsedLine.arrayTag?.value || '',
|
|
71
|
+
title: parsedLine.text?.value || '',
|
|
72
|
+
roles: [],
|
|
73
|
+
};
|
|
74
|
+
if (!currentSection.id) {
|
|
75
|
+
currentSection.id = createBsArrayKey();
|
|
76
|
+
result.edits.push({
|
|
77
|
+
newText: `#${currentSection.id} `,
|
|
78
|
+
start: parsedLine.indicator.end,
|
|
79
|
+
end: parsedLine.indicator.end,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
result.parsed.sections.push(currentSection);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
if (err instanceof Error) {
|
|
87
|
+
err.cause = trace;
|
|
88
|
+
}
|
|
89
|
+
throw err;
|
|
90
|
+
}
|
|
91
|
+
helpers.index += line.length;
|
|
92
|
+
}
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
export async function updateChangesFromParsedCredits(parsed, moteId, packed) {
|
|
96
|
+
const _traceLogs = [];
|
|
97
|
+
const trace = (log) => _traceLogs.push(log);
|
|
98
|
+
trace(`Updating mote ${moteId}`);
|
|
99
|
+
try {
|
|
100
|
+
// We're always going to be computing ALL changes, so clear whatever
|
|
101
|
+
// we previously had.
|
|
102
|
+
packed.clearMoteChanges(moteId, ['data/sections/*']);
|
|
103
|
+
const moteWorking = packed.working.getMote(moteId);
|
|
104
|
+
const moteBase = packed.base.getMote(moteId);
|
|
105
|
+
assert(moteWorking, `Mote ${moteId} not found in working copy`);
|
|
106
|
+
const schema = packed.working.getSchema(moteWorking.schema_id);
|
|
107
|
+
assert(schema, `${moteWorking.schema_id} schema not found in working copy`);
|
|
108
|
+
assert(schema.name, 'Chat mote must have a name pointer');
|
|
109
|
+
const updateMote = (path, value) => {
|
|
110
|
+
packed.updateMoteData(moteId, path, value);
|
|
111
|
+
};
|
|
112
|
+
trace('Finding existing Credits identifiers');
|
|
113
|
+
// Collect what's currently in the mote so we can do some
|
|
114
|
+
// lookups to minimize ID changes and identify stuff to delete
|
|
115
|
+
/** SectionID:RoleID:PersonID:Name */
|
|
116
|
+
const existingSectionsNameLookup = new Map();
|
|
117
|
+
/** SectionID:RoleID:Name:PersonId */
|
|
118
|
+
const existingSectionsPersonIdLookup = new Map();
|
|
119
|
+
/** SectiondId:RoleIds for single entry roles */
|
|
120
|
+
const singleEntryRoleIdLookup = new Map();
|
|
121
|
+
for (const section of bsArrayToArray(moteBase.data.sections)) {
|
|
122
|
+
const sectionId = section.id;
|
|
123
|
+
existingSectionsNameLookup.set(sectionId, new Map());
|
|
124
|
+
existingSectionsPersonIdLookup.set(sectionId, new Map());
|
|
125
|
+
singleEntryRoleIdLookup.set(sectionId, new Set());
|
|
126
|
+
const singleEntryRoleIds = singleEntryRoleIdLookup.get(sectionId);
|
|
127
|
+
for (const role of bsArrayToArray(section.element.entries)) {
|
|
128
|
+
const element = role.element;
|
|
129
|
+
if (element.type === 'Gap') {
|
|
130
|
+
// Gaps are not supported
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (element.type === 'Single Entry') {
|
|
134
|
+
singleEntryRoleIds.add(role.id);
|
|
135
|
+
}
|
|
136
|
+
const roleId = role.id;
|
|
137
|
+
existingSectionsNameLookup
|
|
138
|
+
.get(sectionId)
|
|
139
|
+
.set(roleId, existingSectionsNameLookup.get(sectionId).get(roleId) || new Map());
|
|
140
|
+
existingSectionsPersonIdLookup
|
|
141
|
+
.get(sectionId)
|
|
142
|
+
.set(roleId, existingSectionsPersonIdLookup.get(sectionId).get(roleId) ||
|
|
143
|
+
new Map());
|
|
144
|
+
const nameLookup = existingSectionsNameLookup
|
|
145
|
+
.get(sectionId)
|
|
146
|
+
.get(roleId);
|
|
147
|
+
const personIdLookup = existingSectionsPersonIdLookup
|
|
148
|
+
.get(sectionId)
|
|
149
|
+
.get(roleId);
|
|
150
|
+
if (element.type === 'Single Entry') {
|
|
151
|
+
const name = element.name.name;
|
|
152
|
+
assert(name, 'Entry must have a name');
|
|
153
|
+
nameLookup.set(roleId, name);
|
|
154
|
+
personIdLookup.set(name, roleId);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
for (const person of bsArrayToArray(element.names)) {
|
|
158
|
+
const name = person.element?.name;
|
|
159
|
+
assert(name, 'Entry must have a name');
|
|
160
|
+
nameLookup.set(person.id, name);
|
|
161
|
+
personIdLookup.set(name, person.id);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
trace('Updating sections');
|
|
167
|
+
// Track the section IDs so we can remove any that are no longer present
|
|
168
|
+
/** Map of sectionId:roleId:personId */
|
|
169
|
+
const parsedIds = new Map();
|
|
170
|
+
for (const section of parsed.sections) {
|
|
171
|
+
parsedIds.set(section.id, parsedIds.get(section.id) || new Map());
|
|
172
|
+
const roleIds = parsedIds.get(section.id);
|
|
173
|
+
updateMote(`data/sections/${section.id}/element/name/text`, section.title);
|
|
174
|
+
const sectionExistedAlready = existingSectionsNameLookup.get(section.id);
|
|
175
|
+
for (const role of section.roles) {
|
|
176
|
+
const roleExistedAlready = sectionExistedAlready?.get(role.id);
|
|
177
|
+
roleIds.set(role.id, roleIds.get(role.id) || new Set());
|
|
178
|
+
const personIds = roleIds.get(role.id);
|
|
179
|
+
// If this role was a single entry but is now a group,
|
|
180
|
+
// then we need to do some work to convert it. (If it was a group but has a single entry just let it be.)
|
|
181
|
+
const wasSingleEntry = !!singleEntryRoleIdLookup
|
|
182
|
+
.get(section.id)
|
|
183
|
+
?.has(role.id);
|
|
184
|
+
if (wasSingleEntry && role.names.length > 1) {
|
|
185
|
+
trace(`Converting single entry role ${role.id} (${role.role}) to group`);
|
|
186
|
+
// Delete the entire role and replace it with a Group role
|
|
187
|
+
updateMote(`data/sections/${section.id}/element/entries/${role.id}`, null);
|
|
188
|
+
updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/type`, 'Group');
|
|
189
|
+
// Add each name to the names field
|
|
190
|
+
for (const person of role.names) {
|
|
191
|
+
// Will need a new ID for each person
|
|
192
|
+
const personId = createBsArrayKey();
|
|
193
|
+
person.id = personId;
|
|
194
|
+
personIds.add(personId);
|
|
195
|
+
updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/names/${personId}/element/name`, person.name);
|
|
196
|
+
// Ensure CJK is set
|
|
197
|
+
updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/names/${personId}/element/use_cjk`, person.cjk);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
else if (wasSingleEntry ||
|
|
201
|
+
(role.names.length === 1 && !roleExistedAlready)) {
|
|
202
|
+
trace(`Updating single-entry role ${role.id} (${role.role})`);
|
|
203
|
+
// Then WAS a single entry OR the role didn't exist
|
|
204
|
+
// but is being added as a single entry. So keep it
|
|
205
|
+
// single-entry!
|
|
206
|
+
personIds.add(role.id);
|
|
207
|
+
role.names[0].id = role.id;
|
|
208
|
+
updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/type`, 'Single Entry');
|
|
209
|
+
// Add the name to the name field
|
|
210
|
+
updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/name/name`, role.names[0].name);
|
|
211
|
+
// Ensure CJK is set
|
|
212
|
+
updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/name/use_cjk`, role.names[0].cjk);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
trace(`Updating group role ${role.id} (${role.role})`);
|
|
216
|
+
// Group entry! Either we're adding a new group or
|
|
217
|
+
// updating an existing one, but we do the same thing
|
|
218
|
+
// either way.
|
|
219
|
+
updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/type`, 'Group');
|
|
220
|
+
// Add each name to the names field
|
|
221
|
+
for (const person of role.names) {
|
|
222
|
+
// See if we already have an id matching this name
|
|
223
|
+
const personId = existingSectionsPersonIdLookup
|
|
224
|
+
.get(section.id)
|
|
225
|
+
?.get(role.id)
|
|
226
|
+
?.get(person.name) || createBsArrayKey();
|
|
227
|
+
personIds.add(personId);
|
|
228
|
+
person.id = personId;
|
|
229
|
+
updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/names/${personId}/element/name`, person.name);
|
|
230
|
+
// Ensure CJK is set
|
|
231
|
+
updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/names/${personId}/element/use_cjk`, person.cjk);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Upsert the role name. If it's one of a few special roles
|
|
235
|
+
// that indicate NO role, then we want to ensure it's not set
|
|
236
|
+
// instead. (Do this after the prior logic in case we first converted a single-entry group, otherwise we'd lose the change)
|
|
237
|
+
const isUntitledRole = !role.role || role.role.match(/^(\?\?\?|none|na|undefined)$/i);
|
|
238
|
+
trace(`Updating role name ${role.id} with text "${role.role}"`);
|
|
239
|
+
updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/role/text`, isUntitledRole ? null : role.role);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// Remove any content that is no longer present
|
|
243
|
+
for (const [sectionId, existingRoles,] of existingSectionsNameLookup.entries()) {
|
|
244
|
+
const parsedRoles = parsedIds.get(sectionId);
|
|
245
|
+
if (!parsedRoles) {
|
|
246
|
+
updateMote(`data/sections/${sectionId}`, null);
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
// Delete any leftover roles
|
|
250
|
+
for (const [existingRoleId, existingPeople,] of existingRoles.entries()) {
|
|
251
|
+
if (!parsedRoles.has(existingRoleId)) {
|
|
252
|
+
updateMote(`data/sections/${sectionId}/element/entries/${existingRoleId}`, null);
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
// Delete any leftover people
|
|
256
|
+
for (const existingPersonId of existingPeople.keys()) {
|
|
257
|
+
if (!parsedRoles.get(existingRoleId).has(existingPersonId)) {
|
|
258
|
+
packed.updateMoteData(moteId, `data/sections/${sectionId}/element/entries/${existingRoleId}/element/names/${existingPersonId}`, null);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Fix the sort order of sections, roles, and people
|
|
266
|
+
const orderedSections = parsed.sections.map((s) => {
|
|
267
|
+
assert(s.id, `Section ID required`);
|
|
268
|
+
let section = moteBase?.data.sections?.[s.id];
|
|
269
|
+
if (!section) {
|
|
270
|
+
section = moteWorking.data.sections?.[s.id];
|
|
271
|
+
assert(section, `Section ${s.id} not found in base or working mote`);
|
|
272
|
+
// @ts-expect-error - order is a required field, but it'll be re-added
|
|
273
|
+
delete section.order;
|
|
274
|
+
}
|
|
275
|
+
const orderedRoles = s.roles.map((r) => {
|
|
276
|
+
assert(r.id, `Role ID required`);
|
|
277
|
+
let role = section.element?.entries?.[r.id];
|
|
278
|
+
if (!role) {
|
|
279
|
+
role = moteWorking.data.sections?.[s.id]?.element?.entries?.[r.id];
|
|
280
|
+
assert(role, `Role ${r.id} not found in section ${s.id}`);
|
|
281
|
+
// @ts-expect-error - order is a required field, but it'll be re-added
|
|
282
|
+
delete role.order;
|
|
283
|
+
}
|
|
284
|
+
// Update the order of the people if it's a group
|
|
285
|
+
if (r.names.length > 1) {
|
|
286
|
+
const orderedPeople = r.names.map((p) => {
|
|
287
|
+
assert(p.name, `Person name required`);
|
|
288
|
+
assert(p.id, `Person ID required`);
|
|
289
|
+
// Get the ID we found/set earlier
|
|
290
|
+
// @ts-expect-error - Should be a group type by this point, but could be single entry in the base data
|
|
291
|
+
let person = role.element?.names?.[p.id];
|
|
292
|
+
if (!person) {
|
|
293
|
+
const workingRole = moteWorking.data.sections?.[s.id]?.element?.entries?.[r.id]
|
|
294
|
+
?.element;
|
|
295
|
+
assert(workingRole?.type === 'Group', 'Base data element must be a group');
|
|
296
|
+
person = workingRole.names?.[p.id];
|
|
297
|
+
assert(person, `Person ${p.name} not found in section ${s.id}`);
|
|
298
|
+
delete person.order;
|
|
299
|
+
}
|
|
300
|
+
return { ...person, id: p.id };
|
|
301
|
+
});
|
|
302
|
+
updateBsArrayOrder(orderedPeople);
|
|
303
|
+
return { ...role, people: orderedPeople, id: r.id };
|
|
304
|
+
}
|
|
305
|
+
return { ...role, people: [], id: r.id };
|
|
306
|
+
});
|
|
307
|
+
updateBsArrayOrder(orderedRoles);
|
|
308
|
+
return { ...section, roles: orderedRoles, id: s.id };
|
|
309
|
+
});
|
|
310
|
+
updateBsArrayOrder(orderedSections);
|
|
311
|
+
// Turn those updates into actual changes
|
|
312
|
+
for (const section of orderedSections) {
|
|
313
|
+
trace(`Updating section ${section.id}`);
|
|
314
|
+
updateMote(`data/sections/${section.id}/order`, section.order);
|
|
315
|
+
for (const role of section.roles) {
|
|
316
|
+
updateMote(`data/sections/${section.id}/element/entries/${role.id}/order`, role.order);
|
|
317
|
+
for (const person of role.people) {
|
|
318
|
+
updateMote(`data/sections/${section.id}/element/entries/${role.id}/element/names/${person.id}/order`, person.order);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
trace(`Writing changes`);
|
|
323
|
+
await packed.writeChanges();
|
|
324
|
+
}
|
|
325
|
+
catch (err) {
|
|
326
|
+
console.error(err);
|
|
327
|
+
console.error(_traceLogs);
|
|
328
|
+
if (err instanceof Error) {
|
|
329
|
+
err.cause = _traceLogs;
|
|
330
|
+
}
|
|
331
|
+
throw err;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=cl2.credits.parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cl2.credits.parse.js","sourceRoot":"","sources":["../src/cl2.credits.parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type CreditsMoteDataPointer = `data/${CreditsMotePointer}`;
|
|
2
|
+
export type CreditsMotePointer = `` | `name` | `sections/${string}/element/entries/${string}/element/name/name` | `sections/${string}/element/entries/${string}/element/name/use_cjk` | `sections/${string}/element/entries/${string}/element/name` | `sections/${string}/element/entries/${string}/element/names/${string}/element/name` | `sections/${string}/element/entries/${string}/element/names/${string}/element/use_cjk` | `sections/${string}/element/entries/${string}/element/names/${string}/element` | `sections/${string}/element/entries/${string}/element/names/${string}/order` | `sections/${string}/element/entries/${string}/element/names/${string}` | `sections/${string}/element/entries/${string}/element/names` | `sections/${string}/element/entries/${string}/element/role/skip` | `sections/${string}/element/entries/${string}/element/role/text` | `sections/${string}/element/entries/${string}/element/role` | `sections/${string}/element/entries/${string}/element/type` | `sections/${string}/element/entries/${string}/element` | `sections/${string}/element/entries/${string}/order` | `sections/${string}/element/entries/${string}` | `sections/${string}/element/entries` | `sections/${string}/element/group_color/b` | `sections/${string}/element/group_color/g` | `sections/${string}/element/group_color/r` | `sections/${string}/element/group_color` | `sections/${string}/element/name/skip` | `sections/${string}/element/name/text` | `sections/${string}/element/name` | `sections/${string}/element/subtext/skip` | `sections/${string}/element/subtext/text` | `sections/${string}/element/subtext` | `sections/${string}/element` | `sections/${string}/order` | `sections/${string}` | `sections` | `wip/notes/${string}/element/author` | `wip/notes/${string}/element/text` | `wip/notes/${string}/element/timestamp` | `wip/notes/${string}/element` | `wip/notes/${string}/order` | `wip/notes/${string}` | `wip/notes` | `wip/staging` | `wip`;
|
|
3
|
+
//# sourceMappingURL=cl2.credits.pointers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cl2.credits.pointers.d.ts","sourceRoot":"","sources":["../src/cl2.credits.pointers.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,sBAAsB,GAAG,QAAQ,kBAAkB,EAAE,CAAC;AAClE,MAAM,MAAM,kBAAkB,GAAG,EAAE,GAC/B,MAAM,GACN,YAAY,MAAM,oBAAoB,MAAM,oBAAoB,GAChE,YAAY,MAAM,oBAAoB,MAAM,uBAAuB,GACnE,YAAY,MAAM,oBAAoB,MAAM,eAAe,GAC3D,YAAY,MAAM,oBAAoB,MAAM,kBAAkB,MAAM,eAAe,GACnF,YAAY,MAAM,oBAAoB,MAAM,kBAAkB,MAAM,kBAAkB,GACtF,YAAY,MAAM,oBAAoB,MAAM,kBAAkB,MAAM,UAAU,GAC9E,YAAY,MAAM,oBAAoB,MAAM,kBAAkB,MAAM,QAAQ,GAC5E,YAAY,MAAM,oBAAoB,MAAM,kBAAkB,MAAM,EAAE,GACtE,YAAY,MAAM,oBAAoB,MAAM,gBAAgB,GAC5D,YAAY,MAAM,oBAAoB,MAAM,oBAAoB,GAChE,YAAY,MAAM,oBAAoB,MAAM,oBAAoB,GAChE,YAAY,MAAM,oBAAoB,MAAM,eAAe,GAC3D,YAAY,MAAM,oBAAoB,MAAM,eAAe,GAC3D,YAAY,MAAM,oBAAoB,MAAM,UAAU,GACtD,YAAY,MAAM,oBAAoB,MAAM,QAAQ,GACpD,YAAY,MAAM,oBAAoB,MAAM,EAAE,GAC9C,YAAY,MAAM,kBAAkB,GACpC,YAAY,MAAM,wBAAwB,GAC1C,YAAY,MAAM,wBAAwB,GAC1C,YAAY,MAAM,wBAAwB,GAC1C,YAAY,MAAM,sBAAsB,GACxC,YAAY,MAAM,oBAAoB,GACtC,YAAY,MAAM,oBAAoB,GACtC,YAAY,MAAM,eAAe,GACjC,YAAY,MAAM,uBAAuB,GACzC,YAAY,MAAM,uBAAuB,GACzC,YAAY,MAAM,kBAAkB,GACpC,YAAY,MAAM,UAAU,GAC5B,YAAY,MAAM,QAAQ,GAC1B,YAAY,MAAM,EAAE,GACpB,UAAU,GACV,aAAa,MAAM,iBAAiB,GACpC,aAAa,MAAM,eAAe,GAClC,aAAa,MAAM,oBAAoB,GACvC,aAAa,MAAM,UAAU,GAC7B,aAAa,MAAM,QAAQ,GAC3B,aAAa,MAAM,EAAE,GACrB,WAAW,GACX,aAAa,GACb,KAAK,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cl2.credits.pointers.js","sourceRoot":"","sources":["../src/cl2.credits.pointers.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cl2.credits.stringify.d.ts","sourceRoot":"","sources":["../src/cl2.credits.stringify.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,WAAW,GAClB,MAAM,CA0CR"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { assert } from './assert.js';
|
|
2
|
+
import { bsArrayToArray } from './helpers.js';
|
|
3
|
+
export function stringifyCredits(mote, packed) {
|
|
4
|
+
const blocks = [];
|
|
5
|
+
// Have each section appear as a Markdown-style # header,
|
|
6
|
+
// with its elementId as a prefix
|
|
7
|
+
if (mote.data.sections) {
|
|
8
|
+
for (const section of bsArrayToArray(mote.data.sections)) {
|
|
9
|
+
const sectionId = section.id;
|
|
10
|
+
const sectionName = section.element.name.text;
|
|
11
|
+
blocks.push(`#${sectionId} ${sectionName}`);
|
|
12
|
+
// Each entry could either be a single credit or a credits group, but lets represent them the same in either case:
|
|
13
|
+
// For each *role*, tab in once and have `\t#<roleId> <roleName>`, followed by a newline, followed by `\t-<Credit Name>`
|
|
14
|
+
// When we parse this we can then use singletons for entries
|
|
15
|
+
// with only one person
|
|
16
|
+
for (const entry of bsArrayToArray(section.element.entries)) {
|
|
17
|
+
const entryId = entry.id;
|
|
18
|
+
const element = entry.element;
|
|
19
|
+
if (element.type === 'Gap') {
|
|
20
|
+
// Gaps are not supported
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
// Roles aren't strictly required (e.g. in cases where the section and role are the same)
|
|
24
|
+
blocks.push(`\t#${entryId} ${element.role?.text ?? '???'}`);
|
|
25
|
+
if (element.type === 'Single Entry') {
|
|
26
|
+
assert(element.name.name, `Entry must have a name`);
|
|
27
|
+
blocks.push(`\t- ${element.name.name}`);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
for (const person of bsArrayToArray(element.names)) {
|
|
31
|
+
assert(person.element?.name, `Entry must have a name`);
|
|
32
|
+
blocks.push(`\t- ${person.element.name}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
blocks.push('');
|
|
36
|
+
}
|
|
37
|
+
blocks.push('');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return blocks.join('\n');
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=cl2.credits.stringify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cl2.credits.stringify.js","sourceRoot":"","sources":["../src/cl2.credits.stringify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,UAAU,gBAAgB,CAC9B,IAAiB,EACjB,MAAmB;IAEnB,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,yDAAyD;IACzD,iCAAiC;IACjC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvB,KAAK,MAAM,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzD,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;YAC7B,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,IAAI,WAAW,EAAE,CAAC,CAAC;YAE5C,kHAAkH;YAClH,wHAAwH;YACxH,4DAA4D;YAC5D,uBAAuB;YAEvB,KAAK,MAAM,KAAK,IAAI,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC9B,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;oBAC3B,yBAAyB;oBACzB,SAAS;gBACX,CAAC;gBACD,yFAAyF;gBACzF,MAAM,CAAC,IAAI,CAAC,MAAM,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;gBAC5D,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBACpC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;oBACpD,MAAM,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC1C,CAAC;qBAAM,CAAC;oBACN,KAAK,MAAM,MAAM,IAAI,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;wBACnD,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC;wBACvD,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC5C,CAAC;gBACH,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Gcdata } from './GameChanger.js';
|
|
2
|
+
import { CreditsMote, ParserResult } from './cl2.shared.types.js';
|
|
3
|
+
import type { BschemaRoot } from './types.js';
|
|
4
|
+
export interface CreditsUpdateResult extends ParserResult<{
|
|
5
|
+
sections: CreditsUpdateResultSection[];
|
|
6
|
+
}> {
|
|
7
|
+
}
|
|
8
|
+
export interface CreditsUpdateResultSection {
|
|
9
|
+
id: string;
|
|
10
|
+
title: string;
|
|
11
|
+
roles: CreditsUpdateResultRole[];
|
|
12
|
+
}
|
|
13
|
+
export interface CreditsUpdateResultRole {
|
|
14
|
+
type: 'role';
|
|
15
|
+
id: string;
|
|
16
|
+
role?: string;
|
|
17
|
+
names: {
|
|
18
|
+
/** ID added when converting to Mote data */
|
|
19
|
+
id?: string;
|
|
20
|
+
name: string;
|
|
21
|
+
cjk?: boolean;
|
|
22
|
+
}[];
|
|
23
|
+
}
|
|
24
|
+
export declare function listCredits(gcData: Gcdata): [CreditsMote];
|
|
25
|
+
export declare function isCreditsMote(mote: any): mote is CreditsMote;
|
|
26
|
+
export declare function getCreditsMote(gcData: Gcdata, moteId: string): CreditsMote | undefined;
|
|
27
|
+
export declare function getCreditsSchema(gcData: Gcdata): BschemaRoot | undefined;
|
|
28
|
+
export declare const linePatterns: string[];
|
|
29
|
+
//# sourceMappingURL=cl2.credits.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cl2.credits.types.d.ts","sourceRoot":"","sources":["../src/cl2.credits.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAIL,WAAW,EAEX,YAAY,EACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,mBACf,SAAQ,YAAY,CAAC;IACnB,QAAQ,EAAE,0BAA0B,EAAE,CAAC;CACxC,CAAC;CAAG;AAEP,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,uBAAuB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QACL,4CAA4C;QAC5C,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,OAAO,CAAC;KACf,EAAE,CAAC;CACL;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,WAAW,CAAC,CAIzD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,IAAI,WAAW,CAE5D;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,WAAW,GAAG,SAAS,CAIzB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAExE;AAED,eAAO,MAAM,YAAY,UAUxB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { assert } from './assert.js';
|
|
2
|
+
import { arrayTagPattern, commentLinePattern, creditsSchemaId, } from './cl2.shared.types.js';
|
|
3
|
+
export function listCredits(gcData) {
|
|
4
|
+
return gcData.listMotesBySchema(creditsSchemaId);
|
|
5
|
+
}
|
|
6
|
+
export function isCreditsMote(mote) {
|
|
7
|
+
return mote.schema_id === creditsSchemaId;
|
|
8
|
+
}
|
|
9
|
+
export function getCreditsMote(gcData, moteId) {
|
|
10
|
+
const mote = gcData.getMote(moteId);
|
|
11
|
+
assert(!mote || isCreditsMote(mote), `Mote ${moteId} is not a storyline`);
|
|
12
|
+
return mote;
|
|
13
|
+
}
|
|
14
|
+
export function getCreditsSchema(gcData) {
|
|
15
|
+
return gcData.getSchema(creditsSchemaId);
|
|
16
|
+
}
|
|
17
|
+
export const linePatterns = [
|
|
18
|
+
// Gap Line (===)
|
|
19
|
+
`^(?<indicator>===)\\s*$`,
|
|
20
|
+
// Name Line (\t- <name>)
|
|
21
|
+
`^(?<indicator>\\t-\\s*)(?<text>.*?)\\s*$`,
|
|
22
|
+
// Role Line (\t#<roleId> <roleName>)
|
|
23
|
+
`^(?<indicator>\\t)${arrayTagPattern}?\\s*(?<text>.*?)\\s*$`,
|
|
24
|
+
// Section Line (#<sectionId> <sectionName>)
|
|
25
|
+
`^(${arrayTagPattern}\\s+)?(?<text>[^\t]+)$`,
|
|
26
|
+
commentLinePattern,
|
|
27
|
+
];
|
|
28
|
+
//# sourceMappingURL=cl2.credits.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cl2.credits.types.js","sourceRoot":"","sources":["../src/cl2.credits.types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EACL,eAAe,EACf,kBAAkB,EAGlB,eAAe,GAEhB,MAAM,uBAAuB,CAAC;AA0B/B,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,MAAM,CAAC,iBAAiB,CAAc,eAAe,CAE3D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAS;IACrC,OAAO,IAAI,CAAC,SAAS,KAAK,eAAe,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,MAAc;IAEd,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAc,MAAM,CAAC,CAAC;IACjD,MAAM,CAAC,CAAC,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,QAAQ,MAAM,qBAAqB,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO,MAAM,CAAC,SAAS,CAAC,eAAe,CAAgB,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,iBAAiB;IACjB,yBAAyB;IACzB,yBAAyB;IACzB,0CAA0C;IAC1C,qCAAqC;IACrC,qBAAqB,eAAe,wBAAwB;IAC5D,4CAA4C;IAC5C,KAAK,eAAe,wBAAwB;IAC5C,kBAAkB;CACnB,CAAC"}
|