{"version":3,"file":"rxn-parser.js","sources":["../node_modules/isutf8/dist/index.esm.js","../node_modules/ensure-string/lib-esm/index.js","../src/index.js"],"sourcesContent":["/*\n    https://tools.ietf.org/html/rfc3629\n\n    UTF8-char = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4\n\n    UTF8-1    = %x00-7F\n\n    UTF8-2    = %xC2-DF UTF8-tail\n\n    UTF8-3    = %xE0 %xA0-BF UTF8-tail\n                %xE1-EC 2( UTF8-tail )\n                %xED %x80-9F UTF8-tail\n                %xEE-EF 2( UTF8-tail )\n\n    UTF8-4    = %xF0 %x90-BF 2( UTF8-tail )\n                %xF1-F3 3( UTF8-tail )\n                %xF4 %x80-8F 2( UTF8-tail )\n\n    UTF8-tail = %x80-BF\n*/\n/**\n * Check if a Node.js Buffer or Uint8Array is UTF-8.\n */\nfunction isUtf8(buf) {\n    if (!buf) {\n        return false;\n    }\n    var i = 0;\n    var len = buf.length;\n    while (i < len) {\n        // UTF8-1 = %x00-7F\n        if (buf[i] <= 0x7F) {\n            i++;\n            continue;\n        }\n        // UTF8-2 = %xC2-DF UTF8-tail\n        if (buf[i] >= 0xC2 && buf[i] <= 0xDF) {\n            // if(buf[i + 1] >= 0x80 && buf[i + 1] <= 0xBF) {\n            if (buf[i + 1] >> 6 === 2) {\n                i += 2;\n                continue;\n            }\n            else {\n                return false;\n            }\n        }\n        // UTF8-3 = %xE0 %xA0-BF UTF8-tail\n        // UTF8-3 = %xED %x80-9F UTF8-tail\n        if (((buf[i] === 0xE0 && buf[i + 1] >= 0xA0 && buf[i + 1] <= 0xBF) ||\n            (buf[i] === 0xED && buf[i + 1] >= 0x80 && buf[i + 1] <= 0x9F)) && buf[i + 2] >> 6 === 2) {\n            i += 3;\n            continue;\n        }\n        // UTF8-3 = %xE1-EC 2( UTF8-tail )\n        // UTF8-3 = %xEE-EF 2( UTF8-tail )\n        if (((buf[i] >= 0xE1 && buf[i] <= 0xEC) ||\n            (buf[i] >= 0xEE && buf[i] <= 0xEF)) &&\n            buf[i + 1] >> 6 === 2 &&\n            buf[i + 2] >> 6 === 2) {\n            i += 3;\n            continue;\n        }\n        // UTF8-4 = %xF0 %x90-BF 2( UTF8-tail )\n        //          %xF1-F3 3( UTF8-tail )\n        //          %xF4 %x80-8F 2( UTF8-tail )\n        if (((buf[i] === 0xF0 && buf[i + 1] >= 0x90 && buf[i + 1] <= 0xBF) ||\n            (buf[i] >= 0xF1 && buf[i] <= 0xF3 && buf[i + 1] >> 6 === 2) ||\n            (buf[i] === 0xF4 && buf[i + 1] >= 0x80 && buf[i + 1] <= 0x8F)) &&\n            buf[i + 2] >> 6 === 2 &&\n            buf[i + 3] >> 6 === 2) {\n            i += 4;\n            continue;\n        }\n        return false;\n    }\n    return true;\n}\n\nexport { isUtf8 as default };\n","import isutf8 from 'isutf8';\n/**\n * Ensure that the data is string. If it is an ArrayBuffer it will be converted to string using TextDecoder.\n * @param blob\n * @param options\n * @returns\n */\nexport function ensureString(blob, options = {}) {\n    if (typeof blob === 'string') {\n        return blob;\n    }\n    if (ArrayBuffer.isView(blob) || blob instanceof ArrayBuffer) {\n        const { encoding = guessEncoding(blob) } = options;\n        const decoder = new TextDecoder(encoding);\n        return decoder.decode(blob);\n    }\n    throw new TypeError(`blob must be a string, ArrayBuffer or ArrayBufferView`);\n}\nfunction guessEncoding(blob) {\n    const uint8 = ArrayBuffer.isView(blob)\n        ? new Uint8Array(blob.buffer, blob.byteOffset, blob.byteLength)\n        : new Uint8Array(blob);\n    if (uint8.length >= 2) {\n        if (uint8[0] === 0xfe && uint8[1] === 0xff) {\n            return 'utf-16be';\n        }\n        if (uint8[0] === 0xff && uint8[1] === 0xfe) {\n            return 'utf-16le';\n        }\n    }\n    //@ts-expect-error an ArrayBuffer is also ok\n    if (!isutf8(blob))\n        return 'latin1';\n    return 'utf-8';\n}\n//# sourceMappingURL=index.js.map","import { ensureString } from 'ensure-string';\n\n/**\n * Parse a rxn file and return an object with reagents and products\n * @param {import('cheminfo-types').TextData} rxn\n * @returns\n */\n\nexport default function parse(rxn) {\n  rxn = ensureString(rxn);\n  // we will find the delimiter in order to be much faster and not use regular expression\n  let header = rxn.slice(0, 1000);\n  let crlf = '\\n';\n  if (header.includes('\\r\\n')) {\n    crlf = '\\r\\n';\n  } else if (header.includes('\\r')) {\n    crlf = '\\r';\n  }\n\n  let rxnParts = rxn.split(`${crlf}$MOL${crlf}`);\n\n  let reagents = [];\n  let products = [];\n\n  let result = {};\n  result.reagents = reagents;\n  result.products = products;\n\n  // the first part is expected to contain the number of reagents and products\n\n  // First part should start with $RXN\n  // and the fifth line should contain the number of reagents and products\n  if (rxnParts.length === 0) throw new Error('file looks empty');\n\n  header = rxnParts[0];\n  if (header.indexOf('$RXN') !== 0) {\n    throw new Error('file does not start with $RXN');\n  }\n\n  let lines = header.split(crlf);\n  if (lines.length < 5) throw new Error('incorrect number of lines in header');\n\n  let numberReagents = lines[4].slice(0, 3) >> 0;\n  let numberProducts = lines[4].slice(3, 6) >> 0;\n\n  // hack for JSME\n  let thirdNumber = lines[4].slice(6, 9) >> 0; // for jsme\n\n  if (thirdNumber && rxnParts[1]) {\n    let lines = rxnParts[1].split(crlf);\n    if (lines[0]) {\n      numberReagents = lines[0]\n        .trim()\n        .replace(/>[^>]*$/, '')\n        .split(/[.>]/).length;\n    }\n  }\n\n  if (numberReagents + numberProducts !== rxnParts.length - 1) {\n    throw new Error('not the correct number of molecules');\n  }\n\n  for (let i = 1; i < rxnParts.length; i++) {\n    if (i <= numberReagents) {\n      reagents.push(rxnParts[i]);\n    } else {\n      products.push(rxnParts[i]);\n    }\n  }\n  return result;\n}\n"],"names":["isUtf8","buf","i","len","length","ensureString","blob","options","ArrayBuffer","isView","encoding","guessEncoding","decoder","TextDecoder","decode","TypeError","uint8","Uint8Array","buffer","byteOffset","byteLength","isutf8","parse","rxn","header","slice","crlf","includes","rxnParts","split","reagents","products","result","Error","indexOf","lines","numberReagents","numberProducts","thirdNumber","trim","replace","push"],"mappings":"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","x_google_ignoreList":[0,1]}