188c88e8eSopenharmony_cifunction generateDeclaration (property, value, position) {
288c88e8eSopenharmony_ci  return {
388c88e8eSopenharmony_ci    type: 'declaration',
488c88e8eSopenharmony_ci    property,
588c88e8eSopenharmony_ci    value,
688c88e8eSopenharmony_ci    position
788c88e8eSopenharmony_ci  }
888c88e8eSopenharmony_ci}
988c88e8eSopenharmony_cifunction transition (declaration) {
1088c88e8eSopenharmony_ci  var CHUNK_REGEXP = /^(\S*)?\s*(\d*\.?\d+(?:ms|s)?)?\s*(\S*)?\s*(\d*\.?\d+(?:ms|s)?)?$/
1188c88e8eSopenharmony_ci  var match = declaration.value.match(CHUNK_REGEXP)
1288c88e8eSopenharmony_ci  var result = []
1388c88e8eSopenharmony_ci  var position = declaration.position
1488c88e8eSopenharmony_ci  match[1] && result.push(generateDeclaration('transition-property', match[1], position))
1588c88e8eSopenharmony_ci  match[2] && result.push(generateDeclaration('transition-duration', match[2], position))
1688c88e8eSopenharmony_ci  match[3] && result.push(generateDeclaration('transition-timing-function', match[3], position))
1788c88e8eSopenharmony_ci  match[4] && result.push(generateDeclaration('transition-delay', match[4], position))
1888c88e8eSopenharmony_ci  return result
1988c88e8eSopenharmony_ci}
2088c88e8eSopenharmony_ci
2188c88e8eSopenharmony_cifunction margin (declaration) {
2288c88e8eSopenharmony_ci  var position = declaration.position
2388c88e8eSopenharmony_ci  var splitResult = declaration.value.split(/\s+/)
2488c88e8eSopenharmony_ci  var result = []
2588c88e8eSopenharmony_ci  switch (splitResult.length) {
2688c88e8eSopenharmony_ci    case 1:
2788c88e8eSopenharmony_ci      splitResult.push(splitResult[0], splitResult[0], splitResult[0])
2888c88e8eSopenharmony_ci      break
2988c88e8eSopenharmony_ci    case 2:
3088c88e8eSopenharmony_ci      splitResult.push(splitResult[0], splitResult[1])
3188c88e8eSopenharmony_ci      break
3288c88e8eSopenharmony_ci    case 3:
3388c88e8eSopenharmony_ci      splitResult.push(splitResult[1])
3488c88e8eSopenharmony_ci      break
3588c88e8eSopenharmony_ci  }
3688c88e8eSopenharmony_ci  result.push(
3788c88e8eSopenharmony_ci    generateDeclaration('margin-top', splitResult[0], position),
3888c88e8eSopenharmony_ci    generateDeclaration('margin-right', splitResult[1], position),
3988c88e8eSopenharmony_ci    generateDeclaration('margin-bottom', splitResult[2], position),
4088c88e8eSopenharmony_ci    generateDeclaration('margin-left', splitResult[3], position)
4188c88e8eSopenharmony_ci  )
4288c88e8eSopenharmony_ci  return result
4388c88e8eSopenharmony_ci}
4488c88e8eSopenharmony_ci
4588c88e8eSopenharmony_civar parserCollection = {
4688c88e8eSopenharmony_ci  transition,
4788c88e8eSopenharmony_ci  margin
4888c88e8eSopenharmony_ci}
4988c88e8eSopenharmony_ci
5088c88e8eSopenharmony_cimodule.exports = function (declarations) {
5188c88e8eSopenharmony_ci  return declarations.reduce((result, declaration) => {
5288c88e8eSopenharmony_ci    var parser = parserCollection[declaration.property]
5388c88e8eSopenharmony_ci    if (parser) {
5488c88e8eSopenharmony_ci      return result.concat(parser(declaration))
5588c88e8eSopenharmony_ci    } else {
5688c88e8eSopenharmony_ci      result.push(declaration)
5788c88e8eSopenharmony_ci      return result
5888c88e8eSopenharmony_ci    }
5988c88e8eSopenharmony_ci  }, [])
6088c88e8eSopenharmony_ci}
61