UNPKG

2.17 kBJavaScriptView Raw
1"use strict";
2
3const STARTERS = 'abcdefghijklmnopqrstuvwxyz_';
4const CHARS = 'abcdefghijklmnopqrstuvwxyz0123456789_-';
5
6module.exports = function(settings) {
7 var selectors = {
8 classes: new Map(),
9 ids: new Map()
10 };
11
12 const SELECTOR_PREPEND = settings.prepend || '';
13
14 selectors.classes.prefix =
15 selectors.ids.prefix =
16 '';
17
18 selectors.classes.prefixLastCharIndex =
19 selectors.ids.prefixLastCharIndex =
20 -1;
21
22 var external_classes = new Map();
23 var external_ids = new Map();
24
25 if (settings.externalSelectors) {
26 external_classes = new Map(settings.externalSelectors.c);
27 external_ids = new Map(settings.externalSelectors.i);
28 }
29
30 this.minifySelector = function(sel, is_a_class) {
31
32 if (is_a_class && external_classes.has(sel)) { return external_classes.get(sel) }
33 else if (!is_a_class && external_ids.has(sel)) { return external_ids.get(sel) }
34
35 let key = is_a_class ? 'classes' : 'ids',
36 prefix = is_a_class ? '.' : '#';
37
38 var new_sel;
39
40 if (!selectors[key].has(sel)) {
41 if (selectors[key].size < STARTERS.length) {
42 new_sel = STARTERS[selectors[key].size];
43 }
44
45 else {
46 let remaining_chars_count = selectors[key].size - STARTERS.length;
47 if (remaining_chars_count % CHARS.length == 0) {
48 let prefix_is_starter = selectors[key].prefix.length == 1;
49 if (prefix_is_starter && selectors[key].prefixLastCharIndex == STARTERS.length - 1 ||
50 selectors[key].prefixLastCharIndex == CHARS.length - 1
51 ) {
52 selectors[key].prefix += CHARS[0];
53 selectors[key].prefixLastCharIndex = 0;
54 } else {
55 ++selectors[key].prefixLastCharIndex;
56 if (prefix_is_starter) {
57 selectors[key].prefix = STARTERS[selectors[key].prefixLastCharIndex];
58 } else {
59 selectors[key].prefix = selectors[key].prefix.slice(0, -1) + CHARS[selectors[key].prefixLastCharIndex];
60 }
61 }
62 }
63 new_sel = selectors[key].prefix + CHARS[remaining_chars_count % CHARS.length];
64 }
65
66 new_sel = SELECTOR_PREPEND + new_sel;
67 selectors[key].set(sel, new_sel);
68 }
69
70 return selectors[key].get(sel);
71
72 };
73
74 this.export = function() {
75 return {
76 c: [...selectors.classes],
77 i: [...selectors.ids]
78 };
79 };
80};