You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
3.6 KiB

'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
// @flow
/*:: import type {
CombinatorTokenType,
SelectorTokenType
} from './types';*/
var escapeValue = function escapeValue(value /*: string*/) /*: string*/ {
return JSON.stringify(value);
};
var renderSelector = function renderSelector(selectorToken /*: SelectorTokenType*/) {
var tokens = selectorToken.body;
var parts = [];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = tokens[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var token = _step.value;
var part = void 0;
if (token.type === 'universalSelector') {
part = '*';
} else if (token.type === 'typeSelector') {
part = token.name;
} else if (token.type === 'idSelector') {
part = '#' + token.name;
} else if (token.type === 'classSelector') {
part = '.' + token.name;
} else if (token.type === 'attributePresenceSelector') {
part = '[' + token.name + ']';
} else if (token.type === 'attributeValueSelector') {
part = '[' + token.name + token.operator + escapeValue(token.value) + ']';
} else if (token.type === 'pseudoClassSelector') {
part = ':' + token.name;
if (token.parameters.length) {
part += '(' + token.parameters.map(escapeValue).join(', ') + ')';
}
} else if (token.type === 'pseudoElementSelector') {
part = '::' + token.name;
} else {
throw new Error('Unknown token.');
}
parts.push(part);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return parts.join('');
};
exports.default = function () {
var generate = function generate(tokens /*: Array<SelectorTokenType | CombinatorTokenType>*/) /*: string*/ {
/**
* @todo Think of a better name. This array contains selectors or combinators.
*/
var sequences /*: Array<string>*/ = [];
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = tokens[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var token = _step2.value;
if (token.type === 'selector') {
sequences.push(renderSelector(token));
} else if (token.type === 'descendantCombinator') {
sequences.push(' ');
} else if (token.type === 'childCombinator') {
sequences.push(' > ');
} else if (token.type === 'adjacentSiblingCombinator') {
sequences.push(' + ');
} else if (token.type === 'generalSiblingCombinator') {
sequences.push(' ~ ');
} else {
throw new Error('Unknown token.');
}
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
return sequences.join('');
};
return {
generate: generate
};
};
//# sourceMappingURL=createGenerator.js.map