class code { constructor(name,version){ this.name=name; this.version=version; }; toString() { var str=this.name; if (this.version) { str=str+' ('+this.version+')'; } return str; } } class basis { constructor(name,type){ this.name=name; this.type=type; } toString() { var str=this.name; if (this.type) { str=str+' ('+this.type+')'; } return str; } } class geometry { constructor(method,basis){ this.method=method this.basis=basis } toString() { var str=this.method; if (this.basis) { str=str+'/'+this.basis.name; } return str; } } class state{ constructor(number,multiplicity,symetry){ this.number=number; this.multiplicity=multiplicity; this.symetry=symetry; }; toString() { var str=this.number+ ' ^'+this.multiplicity+this.symetry; return str; }; toLaTeX() { var tex= String.raw`${this.number}\:\vphantom{\mathrm{${this.symetry.charAt(0)}}}^{${this.multiplicity}}\mathrm{${this.symetry}}`; return tex; }; } class doi{ constructor(doistring){ this.string=doistring }; toString() { return this.string; }; get url() { return 'https://doi.org/'+this.string; }; } class excitation{ constructor(start,end,Eabs){ this.start=start; this.end=end; this.Eabs=Eabs; } toString() { return this.start+ ', ' + this.end +', '+ this.Eabs.toPrecision(3); } } class data { constructor(){ this.title=''; this.code=null; this.geometry=null; this.method=null; this.basis=null; this.doi=null; this.excitations=[]; } static async loadAsync(file) { return data.loadString(await getTextFromFileAsync(getFullDataPath(file))); } static loadString(text) { // for each line with metadata var ismetaArea=true; //metadata RegExp (start with #; maybe somme spaces; : ; maybe somme space; datas) var meta=/^#\s*([A-Za-z]+)\s*:\s*(.*)$/; var dat=new data(); function readmeta(line){ // get key value var match=line.match(meta); // normalize key to lower var key=match[1].toLowerCase(); //if data has value if(match.length==3 && match[2]) { var val=match[2]; switch(key) { case "title": dat.title=val; break; case "code": var vals=val.split(",") if(vals.length>=2){ dat.code=new code(vals[0],vals[1]); } else { dat.code=new code(vals[0],null); } break; case "geometry": var vals=val.split(",") switch(vals.length){ case 1: dat.geometry=new geometry(vals[0],null); break; case 2: dat.geometry=new geometry(vals[0],new basis(vals[1],null)); break; case 3: dat.geometry=new geometry(vals[0],new basis(vals[1],vals[2])); break; } break; case "method": dat.method=val; break; case "basis": var vals=val.split(",") if(vals.length>=2){ dat.basis=new basis(vals[0],vals[1]) } else { dat.basis=new basis(vals[0],null); } break; case "doi": dat.doi=new doi(val); break; } } } function readrow(line){ var vals=line.split(/\s+/); var start=new state(parseInt(vals[0],10),parseInt(vals[1],10),vals[2]); var end=new state(parseInt(vals[3],10),vals[4],vals[5]); var ex=new excitation(start,end,parseFloat(vals[6],10)); dat.excitations.push(ex); }; text.split("\n").forEach(function(line) { //if it's not empty line line=line.trim(); if (line){ //if # may be metadata or comment if (line.charAt(0)=="#") { //if it's metadata if(ismetaArea && meta.test(line)) { readmeta(line); } } else { //else its row ismetaArea=false; readrow(line); } } }); return dat } }