{"version":3,"file":"cif-to-json.esm.js","sources":["../src/cifParser.js","../src/moleculeFromCifJson.js","../src/moleculeFromCif.js"],"sourcesContent":["/**\n * Parse a CIF (Crystallographic Information File) string into a JSON object.\n * Supports single-quoted, double-quoted, and semicolon-delimited text fields.\n * Handles both classic crystallographic CIF and mmCIF / CCD format (dotted tags\n * like `_chem_comp_atom.atom_id`).\n * @param {string} input - CIF file content as a string.\n * @returns {object} Parsed CIF data. Scalar fields are top-level keys; loop\n *   sections become arrays keyed on the common tag prefix (trailing `_` or `.`\n *   stripped). Each array row uses the full tag name as its property key.\n */\nexport function cifParser(input) {\n  return buildJson(tokenize(input));\n}\n\n/**\n * Tokenize CIF content into a flat array of typed tokens.\n * @param {string} input - Raw CIF text to tokenize.\n * @returns {Array<{type: 'data'|'loop'|'tag'|'value', value?: string|null}>} Flat token stream.\n */\nfunction tokenize(input) {\n  const tokens = [];\n  const lines = input.split(/\\r?\\n/);\n\n  let inSemicolon = false;\n  let semicolonLines = [];\n\n  for (const rawLine of lines) {\n    // --- Semicolon-delimited text block ---\n    if (inSemicolon) {\n      if (rawLine.startsWith(';')) {\n        // Closing semicolon: emit the accumulated text\n        tokens.push({ type: 'value', value: semicolonLines.join('\\n') });\n        inSemicolon = false;\n        semicolonLines = [];\n      } else {\n        semicolonLines.push(rawLine);\n      }\n      continue;\n    }\n\n    const line = rawLine.trimEnd();\n\n    if (!line.trim()) continue;\n    if (line.trimStart().startsWith('#')) continue;\n\n    // Opening semicolon (must be the very first character of the line)\n    if (line.startsWith(';')) {\n      inSemicolon = true;\n      // Text may start on the same line as the opening semicolon;\n      // if the semicolon is alone on its line the remainder is empty — skip it.\n      const afterSemi = line.slice(1);\n      semicolonLines = afterSemi ? [afterSemi] : [];\n      continue;\n    }\n\n    // Inline tokenization\n    let i = 0;\n    while (i < line.length) {\n      // Skip whitespace\n      while (i < line.length && (line[i] === ' ' || line[i] === '\\t')) i++;\n      if (i >= line.length) break;\n\n      const ch = line[i];\n\n      // Inline comment\n      if (ch === '#') break;\n\n      // Quoted string (single or double)\n      if (ch === '\"' || ch === \"'\") {\n        const closeIdx = line.indexOf(ch, i + 1);\n        if (closeIdx === -1) {\n          // Unclosed quote — consume rest of line\n          tokens.push({ type: 'value', value: line.slice(i + 1) });\n          break;\n        }\n        tokens.push({ type: 'value', value: line.slice(i + 1, closeIdx) });\n        i = closeIdx + 1;\n        continue;\n      }\n\n      // Unquoted token — read until whitespace or comment\n      let end = i;\n      while (\n        end < line.length &&\n        line[end] !== ' ' &&\n        line[end] !== '\\t' &&\n        line[end] !== '#'\n      ) {\n        end++;\n      }\n      const token = line.slice(i, end);\n      i = end;\n\n      if (/^loop_$/i.test(token)) {\n        tokens.push({ type: 'loop' });\n      } else if (token.startsWith('data_')) {\n        tokens.push({ type: 'data', value: token.slice(5) });\n      } else if (token.startsWith('_')) {\n        tokens.push({ type: 'tag', value: token });\n      } else if (token === '.' || token === '?') {\n        // CIF missing / unknown value → empty string (backward-compatible)\n        tokens.push({ type: 'value', value: '' });\n      } else {\n        tokens.push({ type: 'value', value: token });\n      }\n    }\n  }\n\n  // Unclosed semicolon block (malformed CIF) — emit what we have\n  if (inSemicolon && semicolonLines.length > 0) {\n    tokens.push({ type: 'value', value: semicolonLines.join('\\n') });\n  }\n\n  return tokens;\n}\n\n/**\n * Build a plain JSON object from the token stream.\n * @param {Array<{type: string, value?: string|null}>} tokens - Flat token stream from {@link tokenize}.\n * @returns {object} Parsed CIF data as a plain object.\n */\nfunction buildJson(tokens) {\n  const result = {};\n  let i = 0;\n\n  while (i < tokens.length) {\n    const token = tokens[i];\n\n    // data_ header — skip (block name is not surfaced as a key)\n    if (token.type === 'data') {\n      i++;\n      continue;\n    }\n\n    if (token.type === 'loop') {\n      i++;\n\n      // Collect column headers\n      const headers = [];\n      while (i < tokens.length && tokens[i].type === 'tag') {\n        headers.push(tokens[i].value);\n        i++;\n      }\n\n      if (headers.length === 0) continue;\n\n      // Determine the shared prefix, stripping a trailing `_` or `.`\n      const common = getCommonBeginning(headers).replace(/[_.]$/, '');\n\n      // Collect data rows\n      const rows = [];\n      while (i < tokens.length && tokens[i].type === 'value') {\n        const row = {};\n        for (let h = 0; h < headers.length; h++) {\n          if (i >= tokens.length || tokens[i].type !== 'value') break;\n          row[headers[h]] = tokens[i].value;\n          i++;\n        }\n        if (Object.keys(row).length === headers.length) {\n          rows.push(row);\n        }\n      }\n\n      result[common] = rows;\n      continue;\n    }\n\n    if (token.type === 'tag') {\n      const tag = token.value;\n      i++;\n      if (i < tokens.length && tokens[i].type === 'value') {\n        result[tag] = tokens[i].value;\n        i++;\n      }\n      continue;\n    }\n\n    // Stray value token (should not happen in well-formed CIF)\n    i++;\n  }\n\n  return result;\n}\n\n/**\n * Return the longest common prefix shared by all strings.\n * @param {string[]} strings - Array of strings to compare.\n * @returns {string} Longest common prefix.\n */\nfunction getCommonBeginning(strings) {\n  if (strings.length === 0) return '';\n  let common = '';\n  for (let pos = 0; pos < strings[0].length; pos++) {\n    const ch = strings[0][pos];\n    for (let k = 1; k < strings.length; k++) {\n      if (strings[k][pos] !== ch) return common;\n    }\n    common += ch;\n  }\n  return common;\n}\n","/**\n * Normalize a CCD element symbol to the mixed-case form OCL expects.\n * CCD writes `C`, `Cl`, `FE`, …; OCL requires `C`, `Cl`, `Fe`, …\n * @param {string} symbol - Raw element symbol from CCD.\n * @returns {string} Mixed-case element symbol.\n */\nfunction normalizeSymbol(symbol) {\n  if (!symbol) return '';\n  return symbol[0].toUpperCase() + symbol.slice(1).toLowerCase();\n}\n\n/**\n * Look up a value in a CDD loop row, treating CIF missing-value markers\n * (`.` and `?`, both mapped to `''` by cifParser) as absent.\n * @param {Record<string,string>} row - Parsed CIF loop row object.\n * @param {string} key - Full tag name to look up.\n * @returns {string} The string value, or `''` if absent or missing.\n */\nfunction get(row, key) {\n  return row[key] ?? '';\n}\n\n/**\n * Build an OpenChemLib `Molecule` from the parsed JSON of a single wwPDB\n * Chemical Component Dictionary (CCD) block.\n *\n * The JSON is expected to come from `cifParser` applied to a single\n * `data_XXX` CCD block. Atoms are added with their ideal Cartesian\n * coordinates (`pdbx_model_Cartn_*_ideal`); this gives OCL enough 3D\n * information to encode tetrahedral and double-bond stereochemistry\n * directly in the resulting idCode — no additional stereo-detection call\n * is required.\n *\n * Returns `null` for entries that cannot be represented as a small\n * molecule: single-atom ions (< 2 atoms), unknown element symbols, or\n * bonds that reference non-existent atom IDs.\n * @param {object} json - Output of `cifParser` for one CCD block.\n * @param {object} Molecule - OpenChemLib `Molecule` class constructor (peer dependency).\n * @returns {{ molecule: object, code: string, name: string, type: string, formula: string, nbAtoms: number } | null} Parsed result or `null` when the entry cannot be represented.\n */\nexport function moleculeFromCifJson(json, Molecule) {\n  const atomRows = /** @type {Array<Record<string,string>>} */ (\n    json._chem_comp_atom ?? []\n  );\n  const bondRows = /** @type {Array<Record<string,string>>} */ (\n    json._chem_comp_bond ?? []\n  );\n\n  if (atomRows.length < 2) return null;\n\n  const code =\n    json['_chem_comp.id'] ?? json['_chem_comp.three_letter_code'] ?? '';\n  const name = json['_chem_comp.name'] ?? '';\n  const type = json['_chem_comp.type'] ?? '';\n  const formula = json['_chem_comp.formula'] ?? '';\n\n  const molecule = new Molecule(atomRows.length, bondRows.length);\n  /** @type {Map<string, number>} */\n  const atomIndex = new Map();\n\n  for (const row of atomRows) {\n    const atomId = get(row, '_chem_comp_atom.atom_id');\n    const rawSymbol = get(row, '_chem_comp_atom.type_symbol');\n    if (!atomId || !rawSymbol) return null;\n\n    const symbol = normalizeSymbol(rawSymbol);\n    const atomicNo = Molecule.getAtomicNoFromLabel(symbol);\n    if (!atomicNo) return null;\n\n    const i = molecule.addAtom(atomicNo);\n\n    // Prefer ideal coordinates; fall back to model coordinates.\n    const xIdeal = get(row, '_chem_comp_atom.pdbx_model_Cartn_x_ideal');\n    const yIdeal = get(row, '_chem_comp_atom.pdbx_model_Cartn_y_ideal');\n    const zIdeal = get(row, '_chem_comp_atom.pdbx_model_Cartn_z_ideal');\n    const xModel = get(row, '_chem_comp_atom.model_Cartn_x');\n    const yModel = get(row, '_chem_comp_atom.model_Cartn_y');\n    const zModel = get(row, '_chem_comp_atom.model_Cartn_z');\n\n    molecule.setAtomX(i, Number.parseFloat(xIdeal || xModel || '0'));\n    molecule.setAtomY(i, Number.parseFloat(yIdeal || yModel || '0'));\n    molecule.setAtomZ(i, Number.parseFloat(zIdeal || zModel || '0'));\n\n    const charge = Number.parseInt(\n      get(row, '_chem_comp_atom.charge') || '0',\n      10,\n    );\n    if (charge) molecule.setAtomCharge(i, charge);\n\n    atomIndex.set(atomId, i);\n  }\n\n  for (const row of bondRows) {\n    const atom1 = get(row, '_chem_comp_bond.atom_id_1');\n    const atom2 = get(row, '_chem_comp_bond.atom_id_2');\n    if (!atom1 || !atom2) return null;\n\n    const a = atomIndex.get(atom1);\n    const b = atomIndex.get(atom2);\n    if (a === undefined || b === undefined) return null;\n\n    const bondIdx = molecule.addBond(a, b);\n    const order = (\n      get(row, '_chem_comp_bond.value_order') || 'SING'\n    ).toUpperCase();\n    molecule.setBondType(bondIdx, bondTypeConstant(order, Molecule));\n  }\n\n  return { molecule, code, name, type, formula, nbAtoms: atomRows.length };\n}\n\n/**\n * Map a CCD `value_order` string to the corresponding OCL bond-type constant.\n * @param {string} order - CCD bond order (e.g. `'SING'`, `'DOUB'`, `'TRIP'`, `'AROM'`).\n * @param {object} Molecule - OCL Molecule class (for bond-type constants).\n * @returns {number} OCL bond type constant.\n */\nfunction bondTypeConstant(order, Molecule) {\n  switch (order) {\n    case 'DOUB':\n      return Molecule.cBondTypeDouble;\n    case 'TRIP':\n      return Molecule.cBondTypeTriple;\n    case 'AROM':\n    case 'AROMATIC':\n      return Molecule.cBondTypeDelocalized;\n    default:\n      return Molecule.cBondTypeSingle;\n  }\n}\n","import { cifParser } from './cifParser.js';\nimport { moleculeFromCifJson } from './moleculeFromCifJson.js';\n\n/**\n * Parse a CIF block and build an OpenChemLib `Molecule` from it.\n *\n * Parses the CIF text with `cifParser` and delegates to\n * `moleculeFromCifJson` which handles the wwPDB Chemical Component\n * Dictionary (CCD) mmCIF schema (`_chem_comp_atom` / `_chem_comp_bond`).\n * When processing the full `components.cif` file, the caller is responsible\n * for splitting the stream into individual `data_XXX` blocks before calling\n * this function.\n * @param {string} cifText - Raw CIF text for a single block.\n * @param {object} Molecule - OpenChemLib `Molecule` class constructor (peer dependency).\n * @returns {{ molecule: object, code: string, name: string, type: string, formula: string, nbAtoms: number } | null}\n *   Parsed result, or `null` when the entry cannot be represented as a\n *   small molecule (single-atom ions, unknown elements, malformed bonds).\n */\nexport function moleculeFromCif(cifText, Molecule) {\n  const json = cifParser(cifText);\n  return moleculeFromCifJson(json, Molecule);\n}\n"],"names":["cifParser","input","buildJson","tokenize","tokens","lines","split","inSemicolon","semicolonLines","rawLine","startsWith","push","type","value","join","line","trimEnd","trim","trimStart","afterSemi","slice","i","length","ch","closeIdx","indexOf","end","token","test","result","headers","common","getCommonBeginning","replace","rows","row","h","Object","keys","tag","strings","pos","k","normalizeSymbol","symbol","toUpperCase","toLowerCase","get","key","moleculeFromCifJson","json","Molecule","atomRows","_chem_comp_atom","bondRows","_chem_comp_bond","code","name","formula","molecule","atomIndex","Map","atomId","rawSymbol","atomicNo","getAtomicNoFromLabel","addAtom","xIdeal","yIdeal","zIdeal","xModel","yModel","zModel","setAtomX","Number","parseFloat","setAtomY","setAtomZ","charge","parseInt","setAtomCharge","set","atom1","atom2","a","b","undefined","bondIdx","addBond","order","setBondType","bondTypeConstant","nbAtoms","cBondTypeDouble","cBondTypeTriple","cBondTypeDelocalized","cBondTypeSingle","moleculeFromCif","cifText"],"mappings":"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"}