AddlocalIdentName.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. /* eslint-disable */
  2. const postcss = require('postcss');
  3. const syntax = require('postcss-less');
  4. const LocalIdentNameplugin = postcss.plugin('LocalIdentNameplugin', ({ localIdentName }) => {
  5. return lessAST => {
  6. // loop add localIdentName
  7. const loop = nodes => {
  8. nodes.forEach(item => {
  9. // Not converted :global
  10. if (item.nodes && item.selector !== ':global') {
  11. loop(item.nodes);
  12. }
  13. // 将global的 节点加到 parents
  14. if (item.selector === ':global') {
  15. const parentNodes = item.parent.nodes;
  16. const childrenNodes = item.nodes;
  17. const index = parentNodes.findIndex(node => {
  18. return node.selector === ':global';
  19. });
  20. childrenNodes.unshift(index, 1);
  21. Array.prototype.splice.apply(parentNodes, item.nodes);
  22. item.parent.nodes = parentNodes;
  23. return;
  24. }
  25. // 删除 :global(className) 保留 className
  26. if (item.selector) {
  27. if (item.selector.includes(':global(')) {
  28. // converted :global(.className)
  29. const className = item.selector.match(/:global\((\S*)\)/)[1];
  30. item.selector = className;
  31. return;
  32. }
  33. if (item.selector.includes('(')) {
  34. return;
  35. }
  36. const className = item.selector.replace(/\./g, `.${localIdentName}`);
  37. item.selector = className;
  38. }
  39. });
  40. };
  41. loop(lessAST.nodes);
  42. };
  43. });
  44. const AddlocalIdentName = (lessPath, lessText, localIdentName) => {
  45. return postcss([LocalIdentNameplugin({ localIdentName })]).process(lessText, { syntax });
  46. };
  47. module.exports = AddlocalIdentName;