newraina/mePlayer

View on GitHub
src/js/lyric.js

Summary

Maintainability
A
3 hrs
Test Coverage
import { LYRIC_CURRENT_CLASS, LYRIC_NEXT_CLASS } from './constants'

var lyrics

// 歌词解析脚本
// 修改自:https://github.com/DIYgod/APlayer
function parse(text) {
  var lyric = text.split('\n')
  var lrc = []
  var len = lyric.length
  var reg1 = /\[(\d{2}):(\d{2})\.(\d{2,3})]/g
  var reg2 = /\[(\d{2}):(\d{2})\.(\d{2,3})]/
  for (var i = 0; i < len; i++) {
    var time = lyric[i].match(reg1)
    var lrcText = lyric[i].replace(reg1, '').replace(/^\s+|\s+$/g, '')
    // 排除空行
    if (!lrcText) {
      continue
    }
    if (time != null) {
      var timeLen = time.length
      for (var j = 0; j < timeLen; j++) {
        var oneTime = reg2.exec(time[j])
        var lrcTime =
          oneTime[1] * 60 +
          parseInt(oneTime[2]) +
          parseInt(oneTime[3]) / ((oneTime[3] + '').length === 2 ? 100 : 1000)
        lrc.push({
          time: lrcTime,
          text: lrcText
        })
      }
    }
  }
  lrc.sort(function(a, b) {
    return a.time - b.time
  })

  lyrics = lrc
  return this
}

// 歌词文本解析成DOM结构
function renderTo(target) {
  if (!lyrics) {
    console.error('未指定歌词文本!')
    return
  }
  var lyricHTML = ''
  for (let i = 0; i < lyrics.length; i++) {
    lyricHTML += `<p>${lyrics[i].text}</p>`
  }
  target.innerHTML = lyricHTML
  target.querySelector('p').className = LYRIC_CURRENT_CLASS
  target.querySelector('p + p').className = LYRIC_NEXT_CLASS
  return this
}

function currentIndex(time) {
  if (time < lyrics[0].time) return 0
  for (var i = 0, l = lyrics.length; i < l; i++) {
    if (
      time >= lyrics[i].time &&
      (!lyrics[i + 1] || time <= lyrics[i + 1].time)
    ) {
      break
    }
  }
  return i
}

export { parse, renderTo, currentIndex }