/**
 * @file text-track-list-converter.js 用於捕獲文本軌道狀態和
 * 根據捕獲重新創建曲目。
 *
 * @module 文本軌道列表轉換器
 */

/**
 * 檢查單個 {@link TextTrack} 並返回一個兼容 JSON 的 javascript 對象
 * 表示 {@link TextTrack} 的狀態。
 *
 * @param {TextTrack} 軌道
 * 要查詢的文本軌道。
 *
 * @return {對象}
 * TextTrack 的可序列化 javascript 表示。
 * @私人的
 */
const trackToJson_ = 函數(軌道){
  const ret = [
    '種類','標籤','語言','id',
    'inBandMetadataTrackDispatchType', 'mode', 'src'
  ].reduce((acc, prop, i) => {

    如果(軌道[道具]){
      acc[prop] = track[prop];
    }

    返回帳戶;
  },{
    線索:track.cues && Array.prototype.map.call(track.cues, function(cue) {
      返回 {
        開始時間:cue.startTime,
        結束時間:cue.endTime,
        文本:cue.text,
        id: cue.id
      };
    })
  });

  返還;
};

/**
 * 檢查 {@link Tech} 並返回一個與 JSON 兼容的 javascript 數組,代表
 * 當前配置的所有 {@link TextTrack} 的狀態。返回數組兼容
 * {@link 文本軌道列表轉換器:JSONTO 文本軌道}。
 *
 * @param {技術}技術
 * 要查詢的技術對象
 *
 * @return {數組}
 * {@link Tech} 的可序列化 javascript 表示
 * {@link TextTrackList}。
 */
const textTracksToJson = 函數(技術){

  const trackEls = tech.$$('track');

  const trackObjs = Array.prototype.map.call(trackEls, (t) => t.track);
  const tracks = Array.prototype.map.call(trackEls, function(trackEl) {
    const json = trackToJson_(trackEl.track);

    如果(trackEl.src){
      json.src = trackEl.src;
    }
    返回json;
  });

  返回 tracks.concat(Array.prototype.filter.call(tech.textTracks(), function(track) {
    返回 trackObjs.indexOf(track) === -1;
  }).map(trackToJson_));
};

/**
 * 在基於 javascript 數組的 {@link Tech} 上創建一組遠程 {@link TextTrack}
 * 對象 {@link TextTrack} 表示。
 *
 * @param {數組} json
 * 一組 `TextTrack` 表示對象,就像那些將是
 * 由 textTracksToJson 製作。
 *
 * @param {技術}技術
 * 用於創建 TextTrack 的 Tech。
 */
const jsonToTextTracks = function(json, tech) {
  json.forEach(函數(軌跡){
    const addedTrack = tech.addRemoteTextTrack(track).track;

    如果(!track.src && track.cues){
      track.cues.forEach((cue) => addedTrack.addCue(cue));
    }
  });

  返回 tech.textTracks();
};

導出默認 {textTracksToJson, jsonToTextTracks, trackToJson_};