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]