grid-shorthand.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. 'use strict';
  2. var parser = require('postcss-value-parser');
  3. function convert(value) {
  4. if (value && value.length === 2 && value[0] === 'span' && parseInt(value[1], 10) > 0) {
  5. return [false, parseInt(value[1], 10)];
  6. }
  7. if (value && value.length === 1 && parseInt(value[0], 10) > 0) {
  8. return [parseInt(value[0], 10), false];
  9. }
  10. return [false, false];
  11. }
  12. function translate(values, startIndex, endIndex) {
  13. var startValue = values[startIndex];
  14. var endValue = values[endIndex];
  15. if (!startValue) {
  16. return [false, false];
  17. }
  18. var _convert = convert(startValue),
  19. start = _convert[0],
  20. spanStart = _convert[1];
  21. var _convert2 = convert(endValue),
  22. end = _convert2[0],
  23. spanEnd = _convert2[1];
  24. if (start && !endValue) {
  25. return [start, false];
  26. }
  27. if (spanStart && end) {
  28. return [end - spanStart, spanStart];
  29. }
  30. if (start && spanEnd) {
  31. return [start, spanEnd];
  32. }
  33. if (start && end) {
  34. return [start, end - start];
  35. }
  36. return [false, false];
  37. }
  38. function parse(decl) {
  39. var node = parser(decl.value);
  40. var values = [];
  41. var current = 0;
  42. values[current] = [];
  43. for (var _iterator = node.nodes, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
  44. var _ref;
  45. if (_isArray) {
  46. if (_i >= _iterator.length) break;
  47. _ref = _iterator[_i++];
  48. } else {
  49. _i = _iterator.next();
  50. if (_i.done) break;
  51. _ref = _i.value;
  52. }
  53. var i = _ref;
  54. if (i.type === 'div') {
  55. current += 1;
  56. values[current] = [];
  57. } else if (i.type === 'word') {
  58. values[current].push(i.value);
  59. }
  60. }
  61. return values;
  62. }
  63. function parseTemplateShortcut(decl) {
  64. var node = parser(decl.value, { loose: true });
  65. var values = [];
  66. var current = 0;
  67. values[current] = [];
  68. for (var _iterator2 = node.nodes, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
  69. var _ref2;
  70. if (_isArray2) {
  71. if (_i2 >= _iterator2.length) break;
  72. _ref2 = _iterator2[_i2++];
  73. } else {
  74. _i2 = _iterator2.next();
  75. if (_i2.done) break;
  76. _ref2 = _i2.value;
  77. }
  78. var i = _ref2;
  79. if (i.type === 'div') {
  80. current += 1;
  81. values[current] = [];
  82. } else {
  83. values[current].push(parser.stringify(i));
  84. }
  85. }
  86. return values;
  87. }
  88. function walkRepeat(node) {
  89. var fixed = [];
  90. for (var _iterator3 = node.nodes, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {
  91. var _ref3;
  92. if (_isArray3) {
  93. if (_i3 >= _iterator3.length) break;
  94. _ref3 = _iterator3[_i3++];
  95. } else {
  96. _i3 = _iterator3.next();
  97. if (_i3.done) break;
  98. _ref3 = _i3.value;
  99. }
  100. var i = _ref3;
  101. if (i.nodes) {
  102. walkRepeat(i);
  103. }
  104. fixed.push(i);
  105. if (i.type === 'function' && i.value === 'repeat') {
  106. var first = i.nodes.shift();
  107. if (first) {
  108. var count = first.value;
  109. i.nodes.shift();
  110. i.value = '';
  111. fixed.push({ type: 'word', value: '[' + count + ']' });
  112. }
  113. }
  114. }
  115. node.nodes = fixed;
  116. }
  117. function changeRepeat(value) {
  118. var ast = parser(value);
  119. walkRepeat(ast);
  120. return ast.toString();
  121. }
  122. module.exports = {
  123. parse: parse,
  124. translate: translate,
  125. changeRepeat: changeRepeat,
  126. parseTemplateShortcut: parseTemplateShortcut
  127. };