鱼C论坛

 找回密码
 立即注册
查看: 2641|回复: 0

[技术交流] js 处理cue格式的字符串

[复制链接]
发表于 2021-1-16 19:21:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
非常拉跨的一段代码,见笑了。
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[1];
            this.fileType=_cl[2];
        },
        title:function(_cl){
            this.title=_cl[1];
        },
        performer:function(_cl){
            this.performer=_cl[1];
        },
        songwriter:function(){
            this.songwriter=_cl[1];
        },

        // track
        // 因为js的继承反射内容是复制这个对象的引用,所以即使是在子类追加也会追加到基类上,非常拉跨。   所以我把子类的反射的内容写在基类上了...
        
        index:function(_cl){
            var indexNub=parseInt(_cl[1]);
            var time=cue_timeToSecond(_cl[2]);
            var lastTrack;
            if(this.root.track.length-2>=0){
                lastTrack=this.root.track[this.root.track.length-2];
            }
            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[0])*60+parseInt(temp[1])+parseInt(temp[2])/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[p]!=' '){
            for(q=p;(p<str.length);++p){
                if(str[p]=='"'){
                    isQuotes=!isQuotes;
                    if(isQuotes){
                        q=p+1;
                    }
                }
                if((str[p]==' ')&&(!isQuotes)){
                    // 记录指令
                    if(str[p-1]=='"'){
                        tempStr=str.slice(q,p-1);
                    }else{
                        tempStr=str.slice(q,p);
                    }
                    CommandList.push(tempStr);
                    q=p+1;
                }
                else if((str[p]=="\n")||(str[p]=="\r")){
                    // 换行 进入下一条指令
                    if(str[p-1]=='"'){
                        tempStr=str.slice(q,p-1);
                    }else{
                        tempStr=str.slice(q,p);
                    }
                    CommandList.push(tempStr);

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

                    do{ ++p; } while((str[p+1]=="\n")||(str[p+1]=="\r"));
                    CommandList=[];
                    break;
                }
            }
        }
    }
    return rtn;
}
就是把cue的指令的格式转换成json而已。
挺菜的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 19:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表