counter.js 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. "use strict";
  2. exports.__esModule = true;
  3. var _postcssValueParser = require("postcss-value-parser");
  4. var _postcssValueParser2 = _interopRequireDefault(_postcssValueParser);
  5. var _cache = require("./cache");
  6. var _cache2 = _interopRequireDefault(_cache);
  7. var _isNum = require("./isNum");
  8. var _isNum2 = _interopRequireDefault(_isNum);
  9. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  10. var RESERVED_KEYWORDS = ["unset", "initial", "inherit", "none"];
  11. var cache = {};
  12. var declOneCache = [];
  13. var declTwoCache = [];
  14. exports.default = {
  15. collect: function collect(node, encoder) {
  16. var prop = node.prop,
  17. type = node.type;
  18. if (type !== 'decl') {
  19. return;
  20. }
  21. if (/counter-(reset|increment)/.test(prop)) {
  22. node.value = (0, _postcssValueParser2.default)(node.value).walk(function (child) {
  23. if (child.type === 'word' && !(0, _isNum2.default)(child) && RESERVED_KEYWORDS.indexOf(child.value) === -1) {
  24. (0, _cache2.default)(child.value, encoder, cache);
  25. child.value = cache[child.value].ident;
  26. }
  27. if (child.type === 'space') {
  28. child.value = ' ';
  29. }
  30. });
  31. declOneCache.push(node);
  32. } else if (/content/.test(prop)) {
  33. declTwoCache.push(node);
  34. }
  35. },
  36. transform: function transform() {
  37. declTwoCache.forEach(function (decl) {
  38. decl.value = (0, _postcssValueParser2.default)(decl.value).walk(function (node) {
  39. var type = node.type,
  40. value = node.value;
  41. if (type === 'function' && (value === 'counter' || value === 'counters')) {
  42. (0, _postcssValueParser.walk)(node.nodes, function (child) {
  43. if (child.type === 'word' && child.value in cache) {
  44. cache[child.value].count++;
  45. child.value = cache[child.value].ident;
  46. } else if (child.type === 'div') {
  47. child.before = child.after = '';
  48. }
  49. });
  50. }
  51. if (type === 'space') {
  52. node.value = ' ';
  53. }
  54. return false;
  55. }).toString();
  56. });
  57. declOneCache.forEach(function (decl) {
  58. decl.value = decl.value.walk(function (node) {
  59. if (node.type === 'word' && !(0, _isNum2.default)(node)) {
  60. Object.keys(cache).forEach(function (key) {
  61. var cached = cache[key];
  62. if (cached.ident === node.value && !cached.count) {
  63. node.value = key;
  64. }
  65. });
  66. }
  67. }).toString();
  68. });
  69. // reset cache after transform
  70. cache = {};
  71. declOneCache = [];
  72. declTwoCache = [];
  73. }
  74. };
  75. module.exports = exports["default"];