12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- import postcss from 'postcss';
- import selectorParser from '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);
- });
- };
- });
- export default index;
|