Darth_EF 发表于 2021-1-16 19:21:31

js 处理cue格式的字符串

非常拉跨的一段代码,见笑了。

function DEF_CUEOBJ(){
    this.performer="";
    this.songwriter="";
    this.title="";
    this.file="";
    this.fileType="";
    this.rem=[];
    this.track=[];
}
DEF_CUEOBJ.prototype={
    setCommand:{
      /**
         * @param {Array<String>} _cl 指令的字符串数组
         */
      rem:function(_cl){
            this.rem.push(_cl);
      },
      file:function(_cl){
            this.file=_cl;
            this.fileType=_cl;
      },
      title:function(_cl){
            this.title=_cl;
      },
      performer:function(_cl){
            this.performer=_cl;
      },
      songwriter:function(){
            this.songwriter=_cl;
      },

      // track
      // 因为js的继承反射内容是复制这个对象的引用,所以即使是在子类追加也会追加到基类上,非常拉跨。   所以我把子类的反射的内容写在基类上了...
      
      index:function(_cl){
            var indexNub=parseInt(_cl);
            var time=cue_timeToSecond(_cl);
            var lastTrack;
            if(this.root.track.length-2>=0){
                lastTrack=this.root.track;
            }
            switch(indexNub){
                case 1:
                  this.op=time;
                  if(lastTrack&&(lastTrack.ed==undefined)){
                        lastTrack.ed=time;
                  }
                break;
                case 0:
                  lastTrack.ed=time;
                break;
                default:
                  this.indexList.push(time);
                break;
            }
      }
    }
}
function DEF_CUEOBJTrack(file,root,trackIndex){
    this.performer="";
    this.songwriter="";
    this.title="";
    this.ListIndex;
    this.rem=[];
    this.trackIndex=trackIndex;
    this.root=root;
    this.file=file;
    this.op;    //秒
    this.ed;
    this.indexList=[];
}
inheritClass(DEF_CUEOBJ,DEF_CUEOBJTrack);

DEF_CUEOBJTrack.prototype.getDuration=function(){
    return this.ed-this.op;
}

/**
* 把cue的表示时间的格式转换成秒
* @param {String} timeStr mm:ss:ff
* @returns {Number}
*/
function cue_timeToSecond(timeStr){
    var temp=timeStr.split(':');
   
    return parseInt(temp)*60+parseInt(temp)+parseInt(temp)/75;
}

function loadCue(str){
    var p=0,q=0,isQuotes=false;
    var tempStr;
    var rtn=new DEF_CUEOBJ();
    var then=rtn;
    var CommandList=[];
    for(;p<str.length;++p){
      if(str!=' '){
            for(q=p;(p<str.length);++p){
                if(str=='\"'){
                  isQuotes=!isQuotes;
                  if(isQuotes){
                        q=p+1;
                  }
                }
                if((str==' ')&&(!isQuotes)){
                  // 记录指令
                  if(str=='\"'){
                        tempStr=str.slice(q,p-1);
                  }else{
                        tempStr=str.slice(q,p);
                  }
                  CommandList.push(tempStr);
                  q=p+1;
                }
                else if((str=="\n")||(str=="\r")){
                  // 换行 进入下一条指令
                  if(str=='\"'){
                        tempStr=str.slice(q,p-1);
                  }else{
                        tempStr=str.slice(q,p);
                  }
                  CommandList.push(tempStr);

                  if(CommandList.toLowerCase()=="track"){
                        then=new DEF_CUEOBJTrack(rtn.file,rtn,rtn.track.length);
                        rtn.track.push(then);
                  }
                  else{
                        if(then.setCommand.toLowerCase()]){
                            then.setCommand.toLowerCase()].call(then,CommandList);
                        }
                        else{
                            // 不支持这个指令
                        }
                  }

                  do{ ++p; } while((str=="\n")||(str=="\r"));
                  CommandList=[];
                  break;
                }
            }
      }
    }
    return rtn;
}
就是把cue的指令的格式转换成json而已。
挺菜的。
页: [1]
查看完整版本: js 处理cue格式的字符串