postcss-less
Version:
LESS parser for PostCSS
68 lines (56 loc) • 2.27 kB
JavaScript
import {atEndPattern, openedCurlyBracket, variablePattern, wordEndPattern} from './globals';
import unclosed from './unclosed';
export default function tokenizeAtRule (state) {
// it's an interpolation
if (state.css.charCodeAt(state.pos + 1) === openedCurlyBracket) {
state.nextPos = state.css.indexOf('}', state.pos + 2);
if (state.nextPos === -1) {
unclosed(state, 'interpolation');
}
state.cssPart = state.css.slice(state.pos, state.nextPos + 1);
state.lines = state.cssPart.split('\n');
state.lastLine = state.lines.length - 1;
if (state.lastLine > 0) {
state.nextLine = state.line + state.lastLine;
state.nextOffset = state.nextPos - state.lines[state.lastLine].length;
} else {
state.nextLine = state.line;
state.nextOffset = state.offset;
}
state.tokens.push([
'word', state.cssPart,
state.line, state.pos - state.offset,
state.nextLine, state.nextPos - state.nextOffset
]);
state.offset = state.nextOffset;
state.line = state.nextLine;
} else {
atEndPattern.lastIndex = state.pos + 1;
atEndPattern.test(state.css);
if (atEndPattern.lastIndex === 0) {
state.nextPos = state.css.length - 1;
} else {
state.nextPos = atEndPattern.lastIndex - 2;
}
state.cssPart = state.css.slice(state.pos, state.nextPos + 1);
state.token = 'at-word';
// check if it's a variable
if (variablePattern.test(state.cssPart)) {
wordEndPattern.lastIndex = state.pos + 1;
wordEndPattern.test(state.css);
if (wordEndPattern.lastIndex === 0) {
state.nextPos = state.css.length - 1;
} else {
state.nextPos = wordEndPattern.lastIndex - 2;
}
state.cssPart = state.css.slice(state.pos, state.nextPos + 1);
state.token = 'word';
}
state.tokens.push([
state.token, state.cssPart,
state.line, state.pos - state.offset,
state.line, state.nextPos - state.offset
]);
}
state.pos = state.nextPos;
}