-
Notifications
You must be signed in to change notification settings - Fork 0
/
5-createStructure.js
56 lines (46 loc) · 1.68 KB
/
5-createStructure.js
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
/**
Extracts parts based on position of partSeparator (if one exists)
*/
const defineParts = tokens => {
const partSeparatorIndex = tokens.findIndex(token => token.type === 'partSeparator');
const hasPartSeparator = partSeparatorIndex >= 0;
// Drop part separator token once it has been consumed
hasPartSeparator && tokens.splice(partSeparatorIndex, 1);
const parts = [
{
type: 'tibia',
key: 'tibia',
tokens: hasPartSeparator ? tokens.slice(0, partSeparatorIndex) : [],
},
{
type: 'tarsus',
key: 'tarsus',
tokens: hasPartSeparator ? tokens.slice(partSeparatorIndex, tokens.length) : tokens,
},
];
return parts.filter(part => part.tokens.length > 0);
};
/**
Extracts legs based on position of legSeparator (if one exists)
*/
const defineLegs = tokens => {
const legSeparatorIndex = tokens.findIndex(token => token.type === 'legSeparator');
const hasLegSeparator = legSeparatorIndex >= 0;
// Drop leg separator token once it has been consumed
hasLegSeparator && tokens.splice(legSeparatorIndex, 1);
const legs = hasLegSeparator
? [
{ type: 'left', key: 'left', tokens: tokens.slice(0, legSeparatorIndex) },
{ type: 'right', key: 'right', tokens: tokens.slice(legSeparatorIndex, tokens.length) },
]
: [{ type: 'unspecified', key: 'unspecified', tokens: tokens }];
return legs.filter(leg => leg.tokens.length > 0);
};
/**
Defines structure by legs, then iterates over legs to define part structure.
*/
const createStructure = tokens => {
const legs = defineLegs(tokens);
return legs.map(leg => Object.assign({}, leg, { tokens: defineParts(leg.tokens) }));
};
export default createStructure;