mirror of
https://github.com/LCPQ/QUESTDB_website.git
synced 2024-08-26 14:11:51 +02:00
175 lines
4.2 KiB
JavaScript
175 lines
4.2 KiB
JavaScript
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
|
|
}
|
|
}
|