1function generateDeclaration (property, value, position) {
2  return {
3    type: 'declaration',
4    property,
5    value,
6    position
7  }
8}
9function transition (declaration) {
10  var CHUNK_REGEXP = /^(\S*)?\s*(\d*\.?\d+(?:ms|s)?)?\s*(\S*)?\s*(\d*\.?\d+(?:ms|s)?)?$/
11  var match = declaration.value.match(CHUNK_REGEXP)
12  var result = []
13  var position = declaration.position
14  match[1] && result.push(generateDeclaration('transition-property', match[1], position))
15  match[2] && result.push(generateDeclaration('transition-duration', match[2], position))
16  match[3] && result.push(generateDeclaration('transition-timing-function', match[3], position))
17  match[4] && result.push(generateDeclaration('transition-delay', match[4], position))
18  return result
19}
20
21function margin (declaration) {
22  var position = declaration.position
23  var splitResult = declaration.value.split(/\s+/)
24  var result = []
25  switch (splitResult.length) {
26    case 1:
27      splitResult.push(splitResult[0], splitResult[0], splitResult[0])
28      break
29    case 2:
30      splitResult.push(splitResult[0], splitResult[1])
31      break
32    case 3:
33      splitResult.push(splitResult[1])
34      break
35  }
36  result.push(
37    generateDeclaration('margin-top', splitResult[0], position),
38    generateDeclaration('margin-right', splitResult[1], position),
39    generateDeclaration('margin-bottom', splitResult[2], position),
40    generateDeclaration('margin-left', splitResult[3], position)
41  )
42  return result
43}
44
45var parserCollection = {
46  transition,
47  margin
48}
49
50module.exports = function (declarations) {
51  return declarations.reduce((result, declaration) => {
52    var parser = parserCollection[declaration.property]
53    if (parser) {
54      return result.concat(parser(declaration))
55    } else {
56      result.push(declaration)
57      return result
58    }
59  }, [])
60}
61