1 |
|
2 | <script>
|
3 | import compose from 'lodash/fp/compose';
|
4 | import fill from 'lodash/fp/fill';
|
5 | import filter from 'lodash/fp/filter';
|
6 |
|
7 | import { intersperse, insert } from '../../../utils/data_utils';
|
8 |
|
9 | const containsWhitespaceOnly = (vNode) => vNode.text.trim() === '';
|
10 | const isTag = (vNode) => typeof vNode.tag === 'string';
|
11 | const filterWhitespaceNodes = filter((vNode) => isTag(vNode) || !containsWhitespaceOnly(vNode));
|
12 |
|
13 | const insertAfterSecondLastItem = insert(-1);
|
14 | const replaceSecondLastItem = fill(-2, -1);
|
15 |
|
16 |
|
17 |
|
18 |
|
19 | const addLastSeparator = (lastSeparator) => (items) => {
|
20 | if (!lastSeparator) {
|
21 | return items;
|
22 | }
|
23 |
|
24 | return items.length > 3
|
25 | ? insertAfterSecondLastItem(lastSeparator, items)
|
26 | : replaceSecondLastItem(lastSeparator, items);
|
27 | };
|
28 |
|
29 | export default {
|
30 | functional: true,
|
31 | props: {
|
32 | separator: {
|
33 | type: String,
|
34 | default: ', ',
|
35 | required: false,
|
36 | },
|
37 | lastSeparator: {
|
38 | type: String,
|
39 | default: '',
|
40 | required: false,
|
41 | },
|
42 | },
|
43 | render(createElement, context) {
|
44 | const {
|
45 | props: { separator, lastSeparator },
|
46 | slots,
|
47 | data,
|
48 | } = context;
|
49 |
|
50 | const filterAndSeparate = compose(
|
51 | addLastSeparator(lastSeparator),
|
52 | intersperse(separator),
|
53 | filterWhitespaceNodes
|
54 | );
|
55 |
|
56 | return createElement('span', data, filterAndSeparate(slots().default));
|
57 | },
|
58 | };
|
59 | </script>
|