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.

index.js 1.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. const cssom = require('cssom');
  2. const os = require('os');
  3. const CSSFontFaceRule = require('cssom/lib/CSSFontFaceRule').CSSFontFaceRule;
  4. /**
  5. * Returns Media Query text for a CSS source.
  6. *
  7. * @param {String} css source
  8. * @api public
  9. */
  10. module.exports = css => {
  11. const rules = cssom.parse(css).cssRules || [];
  12. const queries = [];
  13. let queryMedia;
  14. let queryString;
  15. let style;
  16. let property;
  17. let value;
  18. let important;
  19. let result;
  20. rules.forEach(({ type, media, cssRules }) => {
  21. /* CSS types
  22. STYLE: 1,
  23. IMPORT: 3,
  24. MEDIA: 4,
  25. FONT_FACE: 5,
  26. */
  27. if (type === cssom.CSSMediaRule.prototype.type) {
  28. queryMedia = Array.prototype.slice.call(media).join(', ');
  29. queryString = [];
  30. queryString.push(`${os.EOL}@media ${queryMedia} {`);
  31. cssRules.forEach(rule => {
  32. if (rule.type === cssom.CSSStyleRule.prototype.type || rule.type === CSSFontFaceRule.prototype.type) {
  33. queryString.push(` ${rule.type === cssom.CSSStyleRule.prototype.type ? rule.selectorText : '@font-face'} {`);
  34. for (style = 0; style < rule.style.length; style++) {
  35. property = rule.style[style];
  36. value = rule.style[property];
  37. important = rule.style._importants[property] ? ' !important' : '';
  38. queryString.push(` ${property}: ${value}${important};`);
  39. }
  40. queryString.push(' }');
  41. }
  42. });
  43. queryString.push('}');
  44. result = queryString.length ? queryString.join(os.EOL) + os.EOL : '';
  45. queries.push(result);
  46. }
  47. });
  48. return queries.join(os.EOL);
  49. };