Skip to content

Commit 2767004

Browse files
committed
content: "featuring" credits
1 parent cb14011 commit 2767004

6 files changed

+193
-75
lines changed

src/content/dependencies/generateAlbumReleaseInfo.js

+1
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ export default {
6969
[
7070
relations.artistContributionsLine.slots({
7171
stringKey: capsule + '.by',
72+
featuringStringKey: capsule + '.by.featuring',
7273
chronologyKind: 'album',
7374
}),
7475

src/content/dependencies/generateAlbumTrackListItem.js

+20-12
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {compareArrays, empty} from '#sugar';
33
export default {
44
contentDependencies: [
55
'generateAlbumTrackListMissingDuration',
6-
'linkContribution',
6+
'generateArtistCredit',
77
'linkTrack',
88
],
99

@@ -31,11 +31,10 @@ export default {
3131
relations(relation, query, track) {
3232
const relations = {};
3333

34-
if (!empty(track.artistContribs)) {
35-
relations.contributionLinks =
36-
track.artistContribs
37-
.map(contrib => relation('linkContribution', contrib));
38-
}
34+
relations.credit =
35+
relation('generateArtistCredit',
36+
track.artistContribs,
37+
track.album.artistContribs);
3938

4039
relations.trackLink =
4140
relation('linkTrack', track);
@@ -113,16 +112,25 @@ export default {
113112
: relations.missingDuration);
114113
}
115114

116-
if (data.showArtists) {
115+
const artistCapsule = language.encapsulate(itemCapsule, 'withArtists');
116+
117+
relations.credit.setSlots({
118+
normalStringKey:
119+
artistCapsule + '.by',
120+
121+
featuringStringKey:
122+
artistCapsule + '.featuring',
123+
124+
normalFeaturingStringKey:
125+
artistCapsule + '.by.featuring',
126+
});
127+
128+
if (!html.isBlank(relations.credit)) {
117129
workingCapsule += '.withArtists';
118130
workingOptions.by =
119131
html.tag('span', {class: 'by'},
120132
html.metatag('chunkwrap', {split: ','},
121-
html.resolve(
122-
language.$(itemCapsule, 'withArtists.by', {
123-
artists:
124-
language.formatConjunctionList(relations.contributionLinks),
125-
}))));
133+
html.resolve(relations.credit)));
126134
}
127135

128136
return language.$(workingCapsule, workingOptions);
+130-50
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {empty} from '#sugar';
1+
import {compareArrays, empty} from '#sugar';
22

33
export default {
44
contentDependencies: [
@@ -8,75 +8,155 @@ export default {
88

99
extraDependencies: ['html', 'language'],
1010

11-
query: (contributions) => ({
12-
normalContributions:
13-
contributions
14-
.filter(contrib => !contrib.annotation?.startsWith(`edits for wiki`)),
11+
query: (creditContributions, contextContributions) => {
12+
const query = {};
1513

16-
wikiEditContributions:
17-
contributions
18-
.filter(contrib => contrib.annotation?.startsWith(`edits for wiki`)),
19-
}),
14+
const featuringFilter = contribution =>
15+
contribution.annotation === 'featuring';
16+
17+
const wikiEditFilter = contribution =>
18+
contribution.annotation?.startsWith('edits for wiki');
19+
20+
const normalFilter = contribution =>
21+
!featuringFilter(contribution) &&
22+
!wikiEditFilter(contribution);
23+
24+
query.normalContributions =
25+
creditContributions.filter(normalFilter);
26+
27+
query.featuringContributions =
28+
creditContributions.filter(featuringFilter);
2029

21-
relations: (relation, query, _contributions) => ({
22-
contributionLinks:
30+
query.wikiEditContributions =
31+
creditContributions.filter(wikiEditFilter);
32+
33+
const contextNormalContributions =
34+
contextContributions.filter(normalFilter);
35+
36+
query.normalContributionsAreDifferent =
37+
!compareArrays(
38+
query.normalContributions.map(({artist}) => artist),
39+
contextNormalContributions.map(({artist}) => artist),
40+
{checkOrder: false});
41+
42+
return query;
43+
},
44+
45+
relations: (relation, query, _creditContributions, _contextContributions) => ({
46+
normalContributionLinks:
2347
query.normalContributions
2448
.map(contrib => relation('linkContribution', contrib)),
2549

50+
featuringContributionLinks:
51+
query.featuringContributions
52+
.map(contrib => relation('linkContribution', contrib)),
53+
2654
wikiEditsPart:
2755
relation('generateArtistCreditWikiEditsPart',
2856
query.wikiEditContributions),
2957
}),
3058

31-
data: (query, _contributions) => ({
59+
data: (query, _creditContributions, _contextContributions) => ({
60+
normalContributionsAreDifferent:
61+
query.normalContributionsAreDifferent,
62+
3263
hasWikiEdits:
3364
!empty(query.wikiEditContributions),
3465
}),
3566

3667
slots: {
37-
showAnnotation: {type: 'boolean', default: true},
38-
showExternalLinks: {type: 'boolean', default: true},
39-
showChronology: {type: 'boolean', default: true},
68+
// This string is mandatory.
69+
normalStringKey: {type: 'string'},
70+
71+
// This string is optional.
72+
// Without it, there's no special behavior for "featuring" credits.
73+
normalFeaturingStringKey: {type: 'string'},
74+
75+
// This string is optional.
76+
// Without it, "featuring" credits will always be alongside main credits.
77+
// It won't be used if contextContributions isn't provided.
78+
featuringStringKey: {type: 'string'},
79+
80+
showAnnotation: {type: 'boolean', default: false},
81+
showExternalLinks: {type: 'boolean', default: false},
82+
showChronology: {type: 'boolean', default: false},
83+
showWikiEdits: {type: 'boolean', default: false},
4084

4185
trimAnnotation: {type: 'boolean', default: false},
4286

4387
chronologyKind: {type: 'string'},
44-
45-
stringKey: {type: 'string'},
4688
},
4789

48-
generate(data, relations, slots, {language}) {
49-
const contributionsList =
50-
language.formatConjunctionList(
51-
relations.contributionLinks.map(link =>
52-
link.slots({
53-
showAnnotation: slots.showAnnotation,
54-
showExternalLinks: slots.showExternalLinks,
55-
showChronology: slots.showChronology,
56-
57-
trimAnnotation: slots.trimAnnotation,
58-
59-
chronologyKind: slots.chronologyKind,
60-
})));
61-
62-
return language.$(slots.stringKey, {
63-
[language.onlyIfOptions]: ['artists'],
64-
65-
artists:
66-
(data.hasWikiEdits
67-
? language.encapsulate('misc.artistLink.withEditsForWiki', capsule =>
68-
language.$(capsule, {
69-
// It's nonsense to display "+ edits" without
70-
// having any regular contributions, also.
71-
[language.onlyIfOptions]: ['artists'],
72-
73-
artists: contributionsList,
74-
edits:
75-
relations.wikiEditsPart.slots({
76-
showAnnotation: slots.showAnnotation,
77-
}),
78-
}))
79-
: contributionsList),
80-
});
90+
generate(data, relations, slots, {html, language}) {
91+
if (!slots.normalStringKey) return html.blank();
92+
93+
for (const link of [
94+
...relations.normalContributionLinks,
95+
...relations.featuringContributionLinks,
96+
]) {
97+
link.setSlots({
98+
showExternalLinks: slots.showExternalLinks,
99+
showChronology: slots.showChronology,
100+
trimAnnotation: slots.trimAnnotation,
101+
chronologyKind: slots.chronologyKind,
102+
});
103+
}
104+
105+
for (const link of relations.normalContributionLinks) {
106+
link.setSlots({
107+
showAnnotation: slots.showAnnotation,
108+
});
109+
}
110+
111+
for (const link of relations.featuringContributionLinks) {
112+
link.setSlots({
113+
showAnnotation: false,
114+
});
115+
}
116+
117+
if (empty(relations.normalContributionLinks)) {
118+
return html.blank();
119+
}
120+
121+
const artistsList =
122+
(data.hasWikiEdits && slots.showWikiEdits
123+
? language.$('misc.artistLink.withEditsForWiki', {
124+
artists:
125+
language.formatConjunctionList(relations.normalContributionLinks),
126+
127+
edits:
128+
relations.wikiEditsPart.slots({
129+
showAnnotation: slots.showAnnotation,
130+
}),
131+
})
132+
: language.formatConjunctionList(relations.normalContributionLinks));
133+
134+
const featuringList =
135+
language.formatConjunctionList(relations.featuringContributionLinks);
136+
137+
const everyoneList =
138+
language.formatConjunctionList([
139+
...relations.normalContributionLinks,
140+
...relations.featuringContributionLinks,
141+
]);
142+
143+
if (empty(relations.featuringContributionLinks)) {
144+
if (data.normalContributionsAreDifferent) {
145+
return language.$(slots.normalStringKey, {artists: artistsList});
146+
} else {
147+
return html.blank();
148+
}
149+
}
150+
151+
if (data.normalContributionsAreDifferent && slots.normalFeaturingStringKey) {
152+
return language.$(slots.normalFeaturingStringKey, {
153+
artists: artistsList,
154+
featuring: featuringList,
155+
});
156+
} else if (slots.featuringStringKey) {
157+
return language.$(slots.featuringStringKey, {artists: featuringList});
158+
} else {
159+
return language.$(slots.normalStringKey, {artists: everyoneList});
160+
}
81161
},
82162
};

src/content/dependencies/generateReleaseInfoContributionsLine.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ export default {
44

55
relations: (relation, contributions) => ({
66
credit:
7-
relation('generateArtistCredit', contributions),
7+
relation('generateArtistCredit', contributions, []),
88
}),
99

1010
slots: {
1111
stringKey: {type: 'string'},
12+
featuringStringKey: {type: 'string'},
13+
1214
chronologyKind: {type: 'string'},
1315
},
1416

@@ -17,11 +19,13 @@ export default {
1719
showAnnotation: true,
1820
showExternalLinks: true,
1921
showChronology: true,
22+
showWikiEdits: true,
2023

2124
trimAnnotation: false,
2225

23-
stringKey: slots.stringKey,
24-
2526
chronologyKind: slots.chronologyKind,
27+
28+
normalStringKey: slots.stringKey,
29+
normalFeaturingStringKey: slots.featuringStringKey,
2630
}),
2731
};

src/content/dependencies/generateTrackReleaseInfo.js

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export default {
5656
[
5757
relations.artistContributionLinks.slots({
5858
stringKey: capsule + '.by',
59+
featuringStringKey: capsule + '.by.featuring',
5960
chronologyKind: 'track',
6061
}),
6162

src/strings-default.yaml

+34-10
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,10 @@ releaseInfo:
249249

250250
# Descriptions
251251

252-
by: "By {ARTISTS}."
252+
by:
253+
_: "By {ARTISTS}."
254+
featuring: "By {ARTISTS}, featuring {FEATURING}."
255+
253256
from: "From {ALBUM}."
254257

255258
coverArtBy: "Cover art by {ARTISTS}."
@@ -399,18 +402,29 @@ trackList:
399402

400403
item:
401404
_: "{TRACK}"
402-
withDuration: "{DURATION} {TRACK}"
403-
withArtists: "{TRACK} {BY}"
404-
withDuration.withArtists: "{DURATION} {TRACK} {BY}"
405405

406-
withDuration.duration:
407-
_: "({DURATION})"
408-
missing: "_:__"
409-
missing.info: "no duration provided; treated as zero seconds long"
406+
withDuration:
407+
_: >-
408+
{DURATION} {TRACK}
409+
410+
duration:
411+
_: "({DURATION})"
412+
missing: "_:__"
413+
missing.info: "no duration provided; treated as zero seconds long"
414+
415+
withArtists:
416+
_: >-
417+
{TRACK} {BY}
410418
411-
withArtists.by: "by {ARTISTS}"
419+
by: "by {ARTISTS}"
420+
featuring: "feat. {ARTISTS}"
421+
by.featuring: "by {ARTISTS} feat. {FEATURING}"
412422
413-
rerelease: "{TRACK} (rerelease)"
423+
withDuration.withArtists: >-
424+
{DURATION} {TRACK} {BY}
425+
426+
rerelease: >-
427+
{TRACK} (rerelease)
414428
415429
#
416430
# misc:
@@ -480,6 +494,16 @@ misc:
480494

481495
seeOriginalRelease: "See {ORIGINAL}!"
482496

497+
artistCredit:
498+
withNormalArtists: >-
499+
{NORMAL}
500+
501+
withFeaturingArtists: >-
502+
feat. {FEATURING}
503+
504+
withNormalArtists.withFeaturingArtists: >-
505+
{NORMAL} feat. {FEATURING}
506+
483507
# artistLink:
484508
# Artist links have special accents which are made conditionally
485509
# present in a variety of places across the wiki.

0 commit comments

Comments
 (0)