all files / music-notation/roman/ parse.js

100% Statements 13/13
100% Branches 6/6
100% Functions 1/1
100% Lines 11/11
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31                                    30× 30× 28× 28× 28× 28×    
'use strict'
 
var memoize = require('../memoize')
var R = require('./regex')
var toArray = require('../array/from-props')
// roman numberals to pitch property number
var NUM = {i: 0, ii: 1, iii: 2, iv: 3, v: 4, vi: 5, vii: 6}
 
/**
 * Roman to coordinate: convert from [roman numerals](https://en.wikipedia.org/wiki/Roman_numeral_analysis)
 * to [music-notation]()
 *
 * @name roman.parse
 * @function
 * @param {String} str - the roman numeral string
 * @return {Array} the roman number in array-notation or null if not valid numeral
 *
 * @example
 * var parse = require('music-notation/roman.parse')
 * parse('V') // => [1]
 * parse('bII') // => [-5]
 */
module.exports = memoize(function (str) {
  var m = R.exec(str)
  if (!m || m[3]) return null
  var num = NUM[m[2].toLowerCase()]
  var alt = m[1].length
  if (m[1][0] === 'b') alt = -alt
  return toArray(num, alt)
})