1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- 'use strict';
- function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
- var postcss = _interopDefault(require('postcss'));
- var selectorParser = _interopDefault(require('postcss-selector-parser'));
- var index = postcss.plugin('postcss-dir-pseudo-class', opts => {
- const dir = Object(opts).dir;
- const preserve = Boolean(Object(opts).preserve);
- return root => {
-
- root.walkRules(/:dir\([^\)]*\)/, rule => {
- let currentRule = rule;
- if (preserve) {
- currentRule = rule.cloneBefore();
- }
- currentRule.selector = selectorParser(selectors => {
-
- selectors.nodes.forEach(selector => {
-
- selector.walk(node => {
- if ('pseudo' === node.type && ':dir' === node.value) {
-
- const prev = node.prev();
- const next = node.next();
- const prevIsSpaceCombinator = prev && prev.type && 'combinator' === prev.type && ' ' === prev.value;
- const nextIsSpaceCombinator = next && next.type && 'combinator' === next.type && ' ' === next.value;
- if (prevIsSpaceCombinator && (nextIsSpaceCombinator || !next)) {
- node.replaceWith(selectorParser.universal());
- } else {
- node.remove();
- }
- const first = selector.nodes[0];
- const firstIsSpaceCombinator = first && 'combinator' === first.type && ' ' === first.value;
- const firstIsHtml = first && 'tag' === first.type && 'html' === first.value;
- const firstIsRoot = first && 'pseudo' === first.type && ':root' === first.value;
- if (first && !firstIsHtml && !firstIsRoot && !firstIsSpaceCombinator) {
- selector.prepend(selectorParser.combinator({
- value: ' '
- }));
- }
- const value = node.nodes.toString();
- const isdir = dir === value;
- const dirAttr = selectorParser.attribute({
- attribute: 'dir',
- operator: '=',
- quoteMark: '"',
- value: `"${value}"`
- });
- const notDirAttr = selectorParser.pseudo({
- value: `${firstIsHtml || firstIsRoot ? '' : 'html'}:not`
- });
- notDirAttr.append(selectorParser.attribute({
- attribute: 'dir',
- operator: '=',
- quoteMark: '"',
- value: `"${'ltr' === value ? 'rtl' : 'ltr'}"`
- }));
- if (isdir) {
-
- if (firstIsHtml) {
-
- selector.insertAfter(first, notDirAttr);
- } else {
-
- selector.prepend(notDirAttr);
- }
- } else if (firstIsHtml) {
-
- selector.insertAfter(first, dirAttr);
- } else {
-
- selector.prepend(dirAttr);
- }
- }
- });
- });
- }).processSync(currentRule.selector);
- });
- };
- });
- module.exports = index;
|