1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
import {stitchArrays} from '#sugar';
import {filterMultipleArrays, sortMultipleArrays} from '#wiki-data';
export default {
contentDependencies: ['linkArtTagDynamically'],
extraDependencies: ['html', 'language'],
// Recursion ain't too pretty!
query(ancestorArtTag, targetArtTag) {
const recursive = artTag => {
const artTags =
artTag.directDescendantArtTags.slice();
const displayBriefly =
!artTags.includes(targetArtTag) &&
artTags.length > 3;
const artTagsIncludeTargetArtTag =
artTags.map(artTag => artTag.allDescendantArtTags.includes(targetArtTag));
const numExemptArtTags =
(displayBriefly
? artTagsIncludeTargetArtTag
.filter(includesTargetArtTag => !includesTargetArtTag)
.length
: null);
const sublists =
stitchArrays({
artTag: artTags,
includesTargetArtTag: artTagsIncludeTargetArtTag,
}).map(({artTag, includesTargetArtTag}) =>
(includesTargetArtTag
? recursive(artTag)
: null));
if (displayBriefly) {
filterMultipleArrays(artTags, sublists,
(artTag, sublist) =>
artTag === targetArtTag ||
sublist !== null);
} else {
sortMultipleArrays(artTags, sublists,
(artTagA, artTagB, sublistA, sublistB) =>
(sublistA && sublistB
? 0
: !sublistA && !sublistB
? 0
: sublistA
? 1
: -1));
}
return {
displayBriefly,
numExemptArtTags,
artTags,
sublists,
};
};
return {root: recursive(ancestorArtTag)};
},
relations(relation, query, _ancestorArtTag, _targetArtTag) {
const recursive = ({artTags, sublists}) => ({
artTagLinks:
artTags
.map(artTag => relation('linkArtTagDynamically', artTag)),
sublists:
sublists
.map(sublist => (sublist ? recursive(sublist) : null)),
});
return {root: recursive(query.root)};
},
data(query, _ancestorArtTag, targetArtTag) {
const recursive = ({displayBriefly, numExemptArtTags, artTags, sublists}) => ({
displayBriefly,
numExemptArtTags,
artTagsAreTargetTag:
artTags
.map(artTag => artTag === targetArtTag),
sublists:
sublists
.map(sublist => (sublist ? recursive(sublist) : null)),
});
return {root: recursive(query.root)};
},
generate(data, relations, {html, language}) {
const recursive = (dataNode, relationsNode) =>
html.tag('dl', {class: dataNode === data.root && 'tree-list'}, [
dataNode.displayBriefly &&
html.tag('dt',
language.$('artTagSidebar.otherTagsExempt', {
tags:
language.countArtTags(dataNode.numExemptArtTags, {unit: true}),
})),
stitchArrays({
isTargetTag: dataNode.artTagsAreTargetTag,
dataSublist: dataNode.sublists,
artTagLink: relationsNode.artTagLinks,
relationsSublist: relationsNode.sublists,
}).map(({
isTargetTag, dataSublist,
artTagLink, relationsSublist,
}) => [
html.tag('dt',
{class: (dataSublist || isTargetTag) && 'current'},
artTagLink),
dataSublist &&
html.tag('dd',
recursive(dataSublist, relationsSublist)),
]),
]);
return recursive(data.root, relations.root);
},
};
|