playable
Version:
Video player based on HTML5Video
83 lines • 3.67 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var utils_1 = require("./utils");
var isElementMatchesSelector_1 = (0, tslib_1.__importDefault)(require("./isElementMatchesSelector"));
// NOTE: "inspired" by https://github.com/marcj/css-element-queries/blob/1.0.2/src/ElementQueries.js#L340-L393
var CSS_SELECTOR_PATTERN = /,?[\s\t]*([^,\n]*?)((?:\[[\s\t]*?(?:[a-z-]+-)?(?:min|max)-width[\s\t]*?[~$\^]?=[\s\t]*?"[^"]*?"[\s\t]*?])+)([^,\n\s\{]*)/gim;
var QUERY_ATTR_PATTERN = /\[[\s\t]*?(?:([a-z-]+)-)?(min|max)-width[\s\t]*?[~$\^]?=[\s\t]*?"([^"]*?)"[\s\t]*?]/gim;
function getQueriesFromCssSelector(cssSelector) {
var results = [];
if (cssSelector.indexOf('min-width') === -1 &&
cssSelector.indexOf('max-width') === -1) {
return [];
}
cssSelector = cssSelector.replace(/'/g, '"');
(0, utils_1.forEachMatch)(cssSelector, CSS_SELECTOR_PATTERN, function (matchedSelectors) {
var _a = matchedSelectors.slice(1), selectorPart1 = _a[0], attribute = _a[1], selectorPart2 = _a[2];
var selector = selectorPart1 + selectorPart2;
(0, utils_1.forEachMatch)(attribute, QUERY_ATTR_PATTERN, function (matchedAttributes) {
var _a = matchedAttributes.slice(1), _b = _a[0], prefix = _b === void 0 ? '' : _b, mode = _a[1], width = _a[2];
results.push({
selector: selector,
prefix: prefix,
mode: mode,
width: parseInt(width, 10),
});
});
});
return results;
}
function getQueriesFromRules(rules) {
return (0, utils_1.reduce)(rules, function (results, rule) {
// https://developer.mozilla.org/en-US/docs/Web/API/CSSRule
// CSSRule.STYLE_RULE
if (rule.type === 1) {
var selector = rule.selectorText || rule.cssText;
return results.concat(getQueriesFromCssSelector(selector));
}
// NOTE: add other `CSSRule` types if required.
// Example - https://github.com/marcj/css-element-queries/blob/1.0.2/src/ElementQueries.js#L384-L390
return results;
}, []);
}
function getQueries() {
return (0, utils_1.reduce)(document.styleSheets, function (results, styleSheet) {
// NOTE: browser may not able to read rules for cross-domain stylesheets
try {
var rules = styleSheet.cssRules ||
styleSheet.rules;
if (rules) {
return results.concat(getQueriesFromRules(rules));
}
if (styleSheet.cssText) {
return results.concat(getQueriesFromCssSelector(styleSheet.cssText));
}
}
catch (e) { }
return results;
}, []);
}
function getQueriesForElement(element, prefix) {
if (prefix === void 0) { prefix = ''; }
var matchedSelectors = new Map();
var queries = [];
getQueries().forEach(function (query) {
if (!matchedSelectors.has(query.selector)) {
matchedSelectors.set(query.selector, (0, isElementMatchesSelector_1.default)(element, query.selector));
}
if (!matchedSelectors.get(query.selector)) {
return;
}
if (query.prefix === prefix &&
!queries.some(function (_query) { return _query.mode === query.mode && _query.width === query.width; })) {
queries.push({
mode: query.mode,
width: query.width,
});
}
});
return queries.sort(function (a, b) { return a.width - b.width; });
}
exports.default = getQueriesForElement;
//# sourceMappingURL=getQueriesForElement.js.map