Exemple #1
0
export default function normalizeAnimation(parsed) {
  const args = getArguments(parsed);

  const values = args.reduce((list, arg) => {
    const state = {
      name: [],
      duration: [],
      timingFunction: [],
      delay: [],
      iterationCount: [],
      direction: [],
      fillMode: [],
      playState: [],
    };
    const stateConditions = [
      { property: 'duration', delegate: isTime },
      { property: 'timingFunction', delegate: isTimingFunction },
      { property: 'delay', delegate: isTime },
      { property: 'iterationCount', delegate: isIterationCount },
      { property: 'direction', delegate: isDirection },
      { property: 'fillMode', delegate: isFillMode },
      { property: 'playState', delegate: isPlayState },
    ];

    arg.forEach((node) => {
      let { type, value } = node;

      if (type === 'space') {
        return;
      }

      value = value.toLowerCase();

      const hasMatch = stateConditions.some(({ property, delegate }) => {
        if (delegate(value, type) && !state[property].length) {
          state[property] = [node, addSpace()];
          return true;
        }
      });

      if (!hasMatch) {
        state.name = [...state.name, node, addSpace()];
      }
    });
    return [
      ...list,
      [
        ...state.name,
        ...state.duration,
        ...state.timingFunction,
        ...state.delay,
        ...state.iterationCount,
        ...state.direction,
        ...state.fillMode,
        ...state.playState,
      ],
    ];
  }, []);

  return getValue(values);
}
Exemple #2
0
    css.walkDecls(/background(-repeat)?|(-webkit-)?mask-repeat/i, (decl) => {
      const value = decl.value;

      if (cache[value]) {
        decl.value = cache[value];

        return;
      }

      const parsed = valueParser(value);

      if (parsed.nodes.length === 1) {
        cache[value] = value;

        return;
      }

      const args = getArguments(parsed);
      const relevant = [];

      args.forEach((arg) => {
        relevant.push({
          start: null,
          end: null,
        });

        arg.forEach((part, index) => {
          const isRepeat = ~repeatKeywords.indexOf(part.value.toLowerCase());
          const len = relevant.length - 1;

          if (relevant[len].start === null && isRepeat) {
            relevant[len].start = index;
            relevant[len].end = index;

            return;
          }

          if (relevant[len].start !== null) {
            if (part.type === 'space') {
              return;
            } else if (isRepeat) {
              relevant[len].end = index;

              return;
            }

            return;
          }
        });
      });

      relevant.forEach((range, index) => {
        if (range.start === null) {
          return;
        }

        const val = args[index].slice(range.start, range.end + 1);

        if (val.length !== 3) {
          return;
        }

        const match = getMatch(
          val.filter(evenValues).map((n) => n.value.toLowerCase())
        );

        if (match) {
          args[index][range.start].value = match;
          args[index][range.start + 1].value = '';
          args[index][range.end].value = '';
        }
      });

      const result = parsed.toString();

      decl.value = result;
      cache[value] = result;
    });