grid.js 2.92 KB
'use strict';
const joinGridValue = require('../lib/joinGridValue');

/**
 * @param {import('postcss-value-parser').ParsedValue} gridAutoFlow
 * @return {import('postcss-value-parser').ParsedValue | string}
 */
const normalizeGridAutoFlow = (gridAutoFlow) => {
  let newValue = { front: '', back: '' };
  let shouldNormalize = false;
  gridAutoFlow.walk((node) => {
    if (node.value === 'dense') {
      shouldNormalize = true;
      newValue.back = node.value;
    } else if (['row', 'column'].includes(node.value.trim().toLowerCase())) {
      shouldNormalize = true;
      newValue.front = node.value;
    } else {
      shouldNormalize = false;
    }
  });
  if (shouldNormalize) {
    return `${newValue.front.trim()} ${newValue.back.trim()}`;
  }
  return gridAutoFlow;
};

/**
 * @param {import('postcss-value-parser').ParsedValue} gridGap
 * @return {import('postcss-value-parser').ParsedValue | string}
 */
const normalizeGridColumnRowGap = (gridGap) => {
  let newValue = { front: '', back: '' };
  let shouldNormalize = false;
  gridGap.walk((node) => {
    // console.log(node);
    if (node.value === 'normal') {
      shouldNormalize = true;
      newValue.front = node.value;
    } else {
      newValue.back = `${newValue.back} ${node.value}`;
    }
  });
  if (shouldNormalize) {
    return `${newValue.front.trim()} ${newValue.back.trim()}`;
  }
  return gridGap;
};

/**
 * @param {import('postcss-value-parser').ParsedValue} grid
 * @return {string | string[]}
 */
const normalizeGridColumnRow = (grid) => {
  // cant do normalization here using node, so copy it as a string
  let gridValue = grid.toString().split('/'); // node -> string value, split ->  " 2 / 3 span " ->  [' 2','3 span ']
  if (gridValue.length > 1) {
    return joinGridValue(
      gridValue.map((gridLine) => {
        let normalizeValue = {
          front: '',
          back: '',
        };
        gridLine = gridLine.trim(); // '3 span ' -> '3 span'
        gridLine.split(' ').forEach((node) => {
          // ['3','span']
          if (node === 'span') {
            normalizeValue.front = node; // span _
          } else {
            normalizeValue.back = `${normalizeValue.back} ${node}`; // _ 3
          }
        });
        return `${normalizeValue.front.trim()} ${normalizeValue.back.trim()}`; // span 3
      })
      // returns "2 / span 3"
    );
  }
  // doing this separating if `/` is not present as while joining('/') , it will add `/` at the end
  return gridValue.map((gridLine) => {
    let normalizeValue = {
      front: '',
      back: '',
    };
    gridLine = gridLine.trim();
    gridLine.split(' ').forEach((node) => {
      if (node === 'span') {
        normalizeValue.front = node;
      } else {
        normalizeValue.back = `${normalizeValue.back} ${node}`;
      }
    });
    return `${normalizeValue.front.trim()} ${normalizeValue.back.trim()}`;
  });
};

module.exports = {
  normalizeGridAutoFlow,
  normalizeGridColumnRowGap,
  normalizeGridColumnRow,
};