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