UNPKG

1.55 kBPlain TextView Raw
1<!-- eslint-disable vue/multi-word-component-names -->
2<script>
3import compose from 'lodash/fp/compose';
4import fill from 'lodash/fp/fill';
5import filter from 'lodash/fp/filter';
6
7import { intersperse, insert } from '../../../utils/data_utils';
8
9const containsWhitespaceOnly = (vNode) => vNode.text.trim() === '';
10const isTag = (vNode) => typeof vNode.tag === 'string';
11const filterWhitespaceNodes = filter((vNode) => isTag(vNode) || !containsWhitespaceOnly(vNode));
12
13const insertAfterSecondLastItem = insert(-1);
14const replaceSecondLastItem = fill(-2, -1);
15
16// handles the addition of the lastSeparator in these two cases:
17// item1, item2, item3 => item1, item2, and item3
18// item1, item2 => item1 and item2
19const 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
29export 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>