.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / postcss-less / dist / tokenizer / tokenize-opened-parenthesis.js
1 'use strict';
2
3 Object.defineProperty(exports, "__esModule", {
4   value: true
5 });
6 exports.default = tokenizeOpenedParenthesis;
7
8 var _globals = require('./globals');
9
10 var _unclosed = require('./unclosed');
11
12 var _unclosed2 = _interopRequireDefault(_unclosed);
13
14 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
16 function findClosedParenthesisPosition(css, length, start) {
17   var openedParenthesisCount = 0;
18
19   for (var i = start; i < length; i++) {
20     var symbol = css[i];
21
22     if (symbol === '(') {
23       openedParenthesisCount++;
24     } else if (symbol === ')') {
25       openedParenthesisCount--;
26
27       if (!openedParenthesisCount) {
28         return i;
29       }
30     }
31   }
32
33   return -1;
34 }
35
36 // it is not very reasonable to reduce complexity beyond this level
37 // eslint-disable-next-line complexity
38 function tokenizeOpenedParenthesis(state) {
39   var nextSymbolCode = state.css.charCodeAt(state.pos + 1);
40   var tokensCount = state.tokens.length;
41   var prevTokenCssPart = tokensCount ? state.tokens[tokensCount - 1][1] : '';
42
43   if (prevTokenCssPart === 'url' && nextSymbolCode !== _globals.singleQuote && nextSymbolCode !== _globals.doubleQuote && nextSymbolCode !== _globals.space && nextSymbolCode !== _globals.newline && nextSymbolCode !== _globals.tab && nextSymbolCode !== _globals.feed && nextSymbolCode !== _globals.carriageReturn) {
44     state.nextPos = state.pos;
45
46     do {
47       state.escaped = false;
48       state.nextPos = state.css.indexOf(')', state.nextPos + 1);
49
50       if (state.nextPos === -1) {
51         (0, _unclosed2.default)(state, 'bracket');
52       }
53
54       state.escapePos = state.nextPos;
55
56       while (state.css.charCodeAt(state.escapePos - 1) === _globals.backslash) {
57         state.escapePos -= 1;
58         state.escaped = !state.escaped;
59       }
60     } while (state.escaped);
61
62     state.tokens.push(['brackets', state.css.slice(state.pos, state.nextPos + 1), state.line, state.pos - state.offset, state.line, state.nextPos - state.offset]);
63     state.pos = state.nextPos;
64   } else {
65     state.nextPos = findClosedParenthesisPosition(state.css, state.length, state.pos);
66     state.cssPart = state.css.slice(state.pos, state.nextPos + 1);
67
68     var foundParam = state.cssPart.indexOf('@') >= 0;
69     var foundString = /['"]/.test(state.cssPart);
70
71     if (state.cssPart.length === 0 || state.cssPart === '...' || foundParam && !foundString) {
72       // we're dealing with a mixin param block
73       if (state.nextPos === -1) {
74         (0, _unclosed2.default)(state, 'bracket');
75       }
76
77       state.tokens.push([state.symbol, state.symbol, state.line, state.pos - state.offset]);
78     } else {
79       var badBracket = _globals.badBracketPattern.test(state.cssPart);
80
81       if (state.nextPos === -1 || badBracket) {
82         state.tokens.push([state.symbol, state.symbol, state.line, state.pos - state.offset]);
83       } else {
84         state.tokens.push(['brackets', state.cssPart, state.line, state.pos - state.offset, state.line, state.nextPos - state.offset]);
85         state.pos = state.nextPos;
86       }
87     }
88   }
89 }
90 module.exports = exports['default'];