1 | "use strict";
|
2 |
|
3 | const STARTERS = 'abcdefghijklmnopqrstuvwxyz_';
|
4 | const CHARS = 'abcdefghijklmnopqrstuvwxyz0123456789_-';
|
5 |
|
6 | module.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 | };
|