jcampconverter 11.0.3 → 11.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -192,6 +192,10 @@ export declare interface ParseJcampCSOptions {
192
192
  logger?: Logger;
193
193
  }
194
194
 
195
+ export declare function removeComment(value: string, separator?: string): string;
196
+
197
+ export declare const removeCommentRegExp: RegExp;
198
+
195
199
  export declare interface Spectrum {
196
200
  [key: string]: any;
197
201
  data: Record<string, number[]>;
@@ -1,4 +1,6 @@
1
- import{ensureString as fe}from"ensure-string";var $=/\s*\$\$.*/;function M(e){return e.replace($,"")}function Te(e,m={}){e=fe(e);let{flatten:n=!1}=m,s=e.split(/\r?\n/),f=[],i=[],t=[],l={title:"",jcamp:"",children:[]},r=0,p=e.includes("## ");for(let c=0;c<s.length;c++){let b=s[c],h=p?b.replaceAll(" ",""):b;if(h.startsWith("##NTUPLES")&&r++,h.startsWith("##TITLE")){let o=[h.slice(8).trim()];for(let a=c+1;a<s.length&&!s[a].startsWith("##");a++)o.push(s[a].trim());i.push({title:o.join(`
1
+ import{ensureString as fe}from"ensure-string";var $=/\s*\$\$.*/;function M(e,m=/\r\n/.exec(e)?`\r
2
+ `:`
3
+ `){return e.split(m).map(s=>s.replace($,"")).filter(Boolean).join(m).trim()}function Te(e,m={}){e=fe(e);let{flatten:n=!1}=m,s=e.split(/\r?\n/),f=[],i=[],t=[],l={title:"",jcamp:"",children:[]},r=0,p=e.includes("## ");for(let c=0;c<s.length;c++){let b=s[c],h=p?b.replaceAll(" ",""):b;if(h.startsWith("##NTUPLES")&&r++,h.startsWith("##TITLE")){let o=[h.slice(8).trim()];for(let a=c+1;a<s.length&&!s[a].startsWith("##");a++)o.push(s[a].trim());i.push({title:o.join(`
2
4
  `),jcamp:`${b}
3
5
  `,children:[]}),l=i.at(-1),f.push(l)}else if(h.startsWith("##END")&&r===0&&l){l.jcamp+=`${b}
4
6
  `;let o=i.pop();if(!o)throw new Error("Not finished");i.length>0?(l=i.at(-1),l.children?.push(o)):(l=void 0,t.push(o))}else if(l?.jcamp){l.jcamp+=`${b}
@@ -6,4 +8,4 @@ import{ensureString as fe}from"ensure-string";var $=/\s*\$\$.*/;function M(e){re
6
8
  ##`).split(`
7
9
  ##`);n.logger?.trace({profiling:!0},"Split to LDRS"),p[0]&&(p[0]=p[0].replace(/^[\r\n ]*##/,""));for(let c of p){let b=c.indexOf("="),h=b>0?c.slice(0,Math.max(0,b)):c,o=b>0?h.match(n.noTrimRegExp)?c.slice(Math.max(0,b+1)):c.slice(Math.max(0,b+1)).trim():"",a=h.replaceAll(/[_ -]/g,"").toUpperCase();if(a==="DATATABLE"){let u=o.indexOf(`
8
10
  `);if(u===-1&&(u=o.indexOf("\r")),u>0){let d=o.slice(0,Math.max(0,u)).split(/[ ,;\t]+/);z(t,r,d[0]),r.datatable=d[0],d[1]?.includes("PEAKS")?a="PEAKTABLE":d[1]&&(d[1].indexOf("XYDATA")||d[0].indexOf("++")>0)&&(a="XYDATA",r.nbPoints&&r.lastX!==void 0&&r.firstX!==void 0&&(r.deltaX=(r.lastX-r.firstX)/(r.nbPoints-1)))}}if(a==="XYDATA"){n.wantXY&&(w(r),o.match(/.*\+\+.*/)?(r.nbPoints&&r.lastX!==void 0&&r.firstX!==void 0&&(r.deltaX=(r.lastX-r.firstX)/(r.nbPoints-1)),k(r,o,n)):P(r,o,n),t?.spectra.push(r),r={data:{}});continue}else if(a==="PEAKTABLE"){n.wantXY&&(w(r),P(r,o,n),t?.spectra.push(r),r={data:{}});continue}if(a==="PEAKASSIGNMENTS"){n.wantXY&&(o.match(/.*[^A-Z]*.*/)&&V(r,o),t?.spectra.push(r),r={data:{}});continue}if(n.removeComments&&(o=o.split(/\r?\n/).map(u=>u.replace(/ *\$\$.*$/,"")).join(`
9
- `)),a==="TITLE"){let u=t;u.children||(u.children=[]),t={spectra:[],ntuples:{},info:{},meta:{},tmp:{}},u.children.push(t),l.push(u),s.push(t),t.title=o}else a==="DATATYPE"?(t.dataType=o,o.match(/^nd|\snd\s/i)&&(t.twoD=!0)):a==="NTUPLES"?o.match(/^nd|\snd\s/i)&&(t.twoD=!0):a==="DATACLASS"?t.dataClass=o:a==="JCAMPDX"?t.jcampDX=M(o):a==="JCAMPCS"?t.jcampCS=M(o):a==="XUNITS"?r.xUnits=o:a==="YUNITS"?r.yUnits=o:a==="FIRSTX"?r.firstX=Number(o):a==="LASTX"?r.lastX=Number(o):a==="FIRSTY"?r.firstY=Number(o):a==="LASTY"?r.lastY=Number(o):a==="NPOINTS"?r.nbPoints=Number(o):a==="XFACTOR"?r.xFactor=Number(o):a==="YFACTOR"?r.yFactor=Number(o):a==="MAXX"?r.maxX=Number(o):a==="MINX"?r.minX=Number(o):a==="MAXY"?r.maxY=Number(o):a==="MINY"?r.minY=Number(o):a==="DELTAX"?r.deltaX=Number(o):a===".OBSERVEFREQUENCY"||a==="$SFO1"?r.observeFrequency||(r.observeFrequency=Number(o)):a===".OBSERVENUCLEUS"?r.xType||(t.xType=o.replaceAll(/[^a-zA-Z0-9]/g,"")):a==="$OFFSET"?(t.shiftOffsetNum=0,r.shiftOffsetVal||(r.shiftOffsetVal=Number(o))):a==="$REFERENCEPOINT"||(a==="VARNAME"?t.ntuples.varname=o.split(L):a==="SYMBOL"?t.ntuples.symbol=o.split(L):a==="VARTYPE"?t.ntuples.vartype=o.split(L):a==="VARFORM"?t.ntuples.varform=o.split(L):a==="VARDIM"?t.ntuples.vardim=E(o.split(L)):a==="UNITS"?t.ntuples.units=o.split(L):a==="FACTOR"?t.ntuples.factor=E(o.split(L)):a==="FIRST"?t.ntuples.first=E(o.split(L)):a==="LAST"?t.ntuples.last=E(o.split(L)):a==="MIN"?t.ntuples.min=E(o.split(L)):a==="MAX"?t.ntuples.max=E(o.split(L)):a===".NUCLEUS"?t.ntuples&&(t.ntuples.nucleus=o.split(L).map(u=>u.replaceAll(/[^a-zA-Z0-9]/g,""))):a==="PAGE"?(r.page=o.trim(),r.pageValue=Number(o.replace(/^.*=/,"")),r.pageSymbol=r.page.replace(/[=].*/,"")):a==="RETENTIONTIME"?r.pageValue=Number(o):ne(a)?r[U(a)]=o:a==="SAMPLEDESCRIPTION"?r.sampleDescription=o:a.startsWith("$NUC")?!t.tmp[a]&&!o.includes("off")&&(t.tmp[a]=o.replaceAll(/[<>]/g,"")):a==="END"&&(t=l.pop()));if(t?.info&&t.meta&&a.match(n.keepRecordsRegExp)){let u,d;h.startsWith("$")?(d=n.canonicMetadataLabels?a.slice(1):h.slice(1),u=t.meta):(d=n.canonicDataLabels?a:h,u=t.info),n.dynamicTyping&&(o=de(o)),u[d]?(Array.isArray(u[d])||(u[d]=[u[d]]),u[d].push(o)):u[d]=o}}if(n.logger?.trace({profiling:!0},"Finished parsing"),q(s,f,n),n.logger?.trace({profiling:!0},"Total time"),f.entries=i.children||[],f.flatten=s,n.logger){n.logger.debug("Finished jcamp conversion");for(let c of f.flatten)n.logger.debug(`${c.dataType} - ${c.title}`)}return f}function pt(e,m){let{logger:n,OCL:s}=m;if(!e.info.ATOMLIST||!e.info.BONDLIST){n?.warn("No ATOMLIST or BONDLIST in the JCAMP-CS entry");return}Ae(e,n);let f=ye(e.info.ATOMLIST),i=xe(e.info.BONDLIST),t=Ce(e.info.CHARGE,n),l=he(s,f,i,t,n);return{molecule:l,molfile:l.toMolfile()}}function he(e,m,n,s,f){let i={S:e.Molecule.cBondTypeSingle,D:e.Molecule.cBondTypeDouble,T:e.Molecule.cBondTypeTriple,Q:e.Molecule.cBondTypeQuadruple},t={},l=new e.Molecule(m.length,n.length);for(let r of m){let p=e.Molecule.getAtomicNoFromLabel(r.element);p||(f?.error(`Atomic number of ${r.element} could not be determined`),p=e.Molecule.getAtomicNoFromLabel("X")),t[r.atomNumber]=l.addAtom(p),l.setAtomMapNo(t[r.atomNumber],r.atomNumber,!1)}for(let r of n){if(t[r.atomNumber1]===void 0){f?.error(`A bond goes to atomNumber ${r.atomNumber1} that does not exists`);continue}if(t[r.atomNumber2]===void 0){f?.error(`A bond goes to atomNumber ${r.atomNumber2} that does not exists`);continue}let p=l.addBond(t[r.atomNumber1],t[r.atomNumber2]);l.setBondType(p,i[r.bondType])}for(let r of s){if(t[r.atomNumber]===void 0){f?.error(`A charge goes to atomNumber ${r.atomNumber} that does not exists`);continue}l.setAtomCharge(t[r.atomNumber],r.value)}return l}function ye(e){let m=e.split(/\r?\n/).map(s=>M(s)).filter(Boolean),n=[];for(let s of m){let[f,i,t]=s.trim().split(/\s+/);n.push({atomNumber:Number(f),element:i,nbImplicitHydrogens:t?.length>0?Number(t):void 0})}return n}function xe(e){let m=e.split(/\r?\n/).map(s=>M(s)).filter(Boolean),n=[];for(let s of m){let[f,i,t]=s.trim().split(/\s+/);n.push({atomNumber1:Number(f),atomNumber2:Number(i),bondType:t})}return n}function Ce(e,m){if(!e)return[];let n=e.split(/\r?\n/).map(f=>M(f)).filter(Boolean),s=[];for(let f of n){let[i,t,l]=f.trim().split(/\s+/);l!==void 0&&m?.warn("Charge on multiple atom is not supported"),s.push({atomNumber:Number(t),value:Number(i)})}return s}function Ae(e,m){let n=["STEREOPAIR","STEREOCENTER","RADICAL","STEREOMOLECULE"];for(let s of n)e.info[s]&&m?.warn(`JCAMP-CS parser do not support: ${s}`)}export{mt as convert,Te as createTree,pt as parseJcampCS};
11
+ `)),a==="TITLE"){let u=t;u.children||(u.children=[]),t={spectra:[],ntuples:{},info:{},meta:{},tmp:{}},u.children.push(t),l.push(u),s.push(t),t.title=o}else a==="DATATYPE"?(t.dataType=o,o.match(/^nd|\snd\s/i)&&(t.twoD=!0)):a==="NTUPLES"?o.match(/^nd|\snd\s/i)&&(t.twoD=!0):a==="DATACLASS"?t.dataClass=o:a==="JCAMPDX"?t.jcampDX=M(o):a==="JCAMPCS"?t.jcampCS=M(o):a==="XUNITS"?r.xUnits=o:a==="YUNITS"?r.yUnits=o:a==="FIRSTX"?r.firstX=Number(o):a==="LASTX"?r.lastX=Number(o):a==="FIRSTY"?r.firstY=Number(o):a==="LASTY"?r.lastY=Number(o):a==="NPOINTS"?r.nbPoints=Number(o):a==="XFACTOR"?r.xFactor=Number(o):a==="YFACTOR"?r.yFactor=Number(o):a==="MAXX"?r.maxX=Number(o):a==="MINX"?r.minX=Number(o):a==="MAXY"?r.maxY=Number(o):a==="MINY"?r.minY=Number(o):a==="DELTAX"?r.deltaX=Number(o):a===".OBSERVEFREQUENCY"||a==="$SFO1"?r.observeFrequency||(r.observeFrequency=Number(o)):a===".OBSERVENUCLEUS"?r.xType||(t.xType=o.replaceAll(/[^a-zA-Z0-9]/g,"")):a==="$OFFSET"?(t.shiftOffsetNum=0,r.shiftOffsetVal||(r.shiftOffsetVal=Number(o))):a==="$REFERENCEPOINT"||(a==="VARNAME"?t.ntuples.varname=o.split(L):a==="SYMBOL"?t.ntuples.symbol=o.split(L):a==="VARTYPE"?t.ntuples.vartype=o.split(L):a==="VARFORM"?t.ntuples.varform=o.split(L):a==="VARDIM"?t.ntuples.vardim=E(o.split(L)):a==="UNITS"?t.ntuples.units=o.split(L):a==="FACTOR"?t.ntuples.factor=E(o.split(L)):a==="FIRST"?t.ntuples.first=E(o.split(L)):a==="LAST"?t.ntuples.last=E(o.split(L)):a==="MIN"?t.ntuples.min=E(o.split(L)):a==="MAX"?t.ntuples.max=E(o.split(L)):a===".NUCLEUS"?t.ntuples&&(t.ntuples.nucleus=o.split(L).map(u=>u.replaceAll(/[^a-zA-Z0-9]/g,""))):a==="PAGE"?(r.page=o.trim(),r.pageValue=Number(o.replace(/^.*=/,"")),r.pageSymbol=r.page.replace(/[=].*/,"")):a==="RETENTIONTIME"?r.pageValue=Number(o):ne(a)?r[U(a)]=o:a==="SAMPLEDESCRIPTION"?r.sampleDescription=o:a.startsWith("$NUC")?!t.tmp[a]&&!o.includes("off")&&(t.tmp[a]=o.replaceAll(/[<>]/g,"")):a==="END"&&(t=l.pop()));if(t?.info&&t.meta&&a.match(n.keepRecordsRegExp)){let u,d;h.startsWith("$")?(d=n.canonicMetadataLabels?a.slice(1):h.slice(1),u=t.meta):(d=n.canonicDataLabels?a:h,u=t.info),n.dynamicTyping&&(o=de(o)),u[d]?(Array.isArray(u[d])||(u[d]=[u[d]]),u[d].push(o)):u[d]=o}}if(n.logger?.trace({profiling:!0},"Finished parsing"),q(s,f,n),n.logger?.trace({profiling:!0},"Total time"),f.entries=i.children||[],f.flatten=s,n.logger){n.logger.debug("Finished jcamp conversion");for(let c of f.flatten)n.logger.debug(`${c.dataType} - ${c.title}`)}return f}function pt(e,m){let{logger:n,OCL:s}=m;if(!e.info.ATOMLIST||!e.info.BONDLIST){n?.warn("No ATOMLIST or BONDLIST in the JCAMP-CS entry");return}Ae(e,n);let f=ye(e.info.ATOMLIST),i=xe(e.info.BONDLIST),t=Ce(e.info.CHARGE,n),l=he(s,f,i,t,n);return{molecule:l,molfile:l.toMolfile()}}function he(e,m,n,s,f){let i={S:e.Molecule.cBondTypeSingle,D:e.Molecule.cBondTypeDouble,T:e.Molecule.cBondTypeTriple,Q:e.Molecule.cBondTypeQuadruple},t={},l=new e.Molecule(m.length,n.length);for(let r of m){let p=e.Molecule.getAtomicNoFromLabel(r.element);p||(f?.error(`Atomic number of ${r.element} could not be determined`),p=e.Molecule.getAtomicNoFromLabel("X")),t[r.atomNumber]=l.addAtom(p),l.setAtomMapNo(t[r.atomNumber],r.atomNumber,!1)}for(let r of n){if(t[r.atomNumber1]===void 0){f?.error(`A bond goes to atomNumber ${r.atomNumber1} that does not exists`);continue}if(t[r.atomNumber2]===void 0){f?.error(`A bond goes to atomNumber ${r.atomNumber2} that does not exists`);continue}let p=l.addBond(t[r.atomNumber1],t[r.atomNumber2]);l.setBondType(p,i[r.bondType])}for(let r of s){if(t[r.atomNumber]===void 0){f?.error(`A charge goes to atomNumber ${r.atomNumber} that does not exists`);continue}l.setAtomCharge(t[r.atomNumber],r.value)}return l}function ye(e){let m=e.split(/\r?\n/).map(s=>M(s)).filter(Boolean),n=[];for(let s of m){let[f,i,t]=s.trim().split(/\s+/);n.push({atomNumber:Number(f),element:i,nbImplicitHydrogens:t?.length>0?Number(t):void 0})}return n}function xe(e){let m=e.split(/\r?\n/).map(s=>M(s)).filter(Boolean),n=[];for(let s of m){let[f,i,t]=s.trim().split(/\s+/);n.push({atomNumber1:Number(f),atomNumber2:Number(i),bondType:t})}return n}function Ce(e,m){if(!e)return[];let n=e.split(/\r?\n/).map(f=>M(f)).filter(Boolean),s=[];for(let f of n){let[i,t,l]=f.trim().split(/\s+/);l!==void 0&&m?.warn("Charge on multiple atom is not supported"),s.push({atomNumber:Number(t),value:Number(i)})}return s}function Ae(e,m){let n=["STEREOPAIR","STEREOCENTER","RADICAL","STEREOMOLECULE"];for(let s of n)e.info[s]&&m?.warn(`JCAMP-CS parser do not support: ${s}`)}export{mt as convert,Te as createTree,pt as parseJcampCS,M as removeComment,$ as removeCommentRegExp};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jcampconverter",
3
- "version": "11.0.3",
3
+ "version": "11.0.5",
4
4
  "description": "Parse and convert JCAMP-DX data",
5
5
  "license": "CC-BY-NC-SA-4.0",
6
6
  "type": "module",
@@ -37,14 +37,14 @@
37
37
  "devDependencies": {
38
38
  "benchmark": "^2.1.4",
39
39
  "cheminfo-build": "^1.2.1",
40
- "esbuild": "^0.25.5",
41
- "fifo-logger": "^1.0.0",
42
- "jcamp-data-test": "^1.0.0",
40
+ "esbuild": "^0.25.8",
41
+ "fifo-logger": "^2.0.0",
42
+ "jcamp-data-test": "^2.1.0",
43
43
  "jest-matcher-deep-close-to": "^3.0.2",
44
44
  "jscpd": "^4.0.5",
45
- "ml-spectra-processing": "^14.12.0",
45
+ "ml-spectra-processing": "^14.14.1",
46
46
  "rimraf": "^6.0.1",
47
- "vitest": "^3.1.4"
47
+ "vitest": "^3.2.4"
48
48
  },
49
49
  "dependencies": {
50
50
  "cheminfo-types": "^1.8.1",
@@ -52,7 +52,7 @@
52
52
  "ensure-string": "^1.2.0",
53
53
  "gyromagnetic-ratio": "^2.0.0",
54
54
  "ml-array-median": "^1.1.6",
55
- "openchemlib": "^9.2.0"
55
+ "openchemlib": "^9.6.0"
56
56
  },
57
57
  "volta": {
58
58
  "extends": "../../../package.json"