{"version":3,"file":"index.cjs","sources":["../src/qsp-byte-stream.ts","../src/readers/qsps.ts","../src/writers/qsps.ts","../src/readers/qsp.ts","../src/writers/qsp.ts"],"sourcesContent":["export const QSP_CODREMOV = 5;\nconst QSP_STRSDELIM = '\\r\\n';\nexport const QSP_GAMEID = 'QSPGAME';\nexport const QSP_PASSWD = 'No';\n\n// prettier-ignore\nconst CP1251ToUnicodeTable: number[] = [\n  0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, 0x20ac,\n  0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f, 0x0452, 0x2018,\n  0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0020, 0x2122, 0x0459,\n  0x203a, 0x045a, 0x045c, 0x045b, 0x045f, 0x00a0, 0x040e, 0x045e, 0x0408,\n  0x00a4, 0x0490, 0x00a6, 0x00a7, 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac,\n  0x00ad, 0x00ae, 0x0407, 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5,\n  0x00b6, 0x00b7, 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455,\n  0x0457, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,\n  0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x0420,\n  0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429,\n  0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x0430, 0x0431, 0x0432,\n  0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b,\n  0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444,\n  0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d,\n  0x044e, 0x044f,\n];\n\nfunction convertCP1251(char: number): string {\n  return String.fromCharCode(\n    char >= 0x80 ? CP1251ToUnicodeTable[char - 0x80] : char\n  );\n}\n\nexport class QspByteStream {\n  private cursor = 0;\n  private content: ArrayBuffer;\n  private view: DataView;\n  private isUnicode: boolean;\n\n  public constructor(fromBuffer?: ArrayBuffer) {\n    this.content = fromBuffer ?? new ArrayBuffer(256);\n    this.view = new DataView(this.content);\n    this.isUnicode = this.view.getUint8(1) === 0;\n  }\n\n  private ensureSize(size: number): void {\n    if (this.content.byteLength >= size) return;\n    const newLength = this.content.byteLength * 2;\n    const buffer = new ArrayBuffer(newLength);\n    new Uint8Array(buffer).set(new Uint8Array(this.content));\n    this.content = buffer;\n    this.view = new DataView(this.content);\n  }\n\n  public finalize(): ArrayBuffer {\n    this.content = this.content.slice(0, this.cursor);\n    return this.content;\n  }\n\n  public get eof(): boolean {\n    return this.cursor >= this.content.byteLength;\n  }\n\n  public read(): number {\n    const position = this.cursor;\n    this.cursor += this.isUnicode\n      ? Uint16Array.BYTES_PER_ELEMENT\n      : Uint8Array.BYTES_PER_ELEMENT;\n    return this.isUnicode\n      ? this.view.getUint16(position, true)\n      : this.view.getUint8(position);\n  }\n\n  public readLine(shouldDecode = true): string {\n    const chars: number[] = [];\n    while (!this.eof) {\n      const char = this.read();\n      if (char === 0x0d) {\n        this.read();\n        break;\n      }\n      if (shouldDecode) {\n        chars.push(char === -QSP_CODREMOV ? QSP_CODREMOV : char + QSP_CODREMOV);\n      } else {\n        chars.push(char);\n      }\n    }\n    return this.isUnicode\n      ? // eslint-disable-next-line prefer-spread\n        chars.map(char => String.fromCharCode(char)).join('')\n      : chars.map(convertCP1251).join('');\n  }\n\n  public write(value: number): void {\n    this.ensureSize(this.cursor + Int16Array.BYTES_PER_ELEMENT);\n    const position = this.cursor;\n    this.cursor += Int16Array.BYTES_PER_ELEMENT;\n    this.view.setUint16(position, value, true);\n  }\n\n  public writeString(input: string, shouldEncode = true): void {\n    const charCodes = input.split('').map((char): number => char.charCodeAt(0));\n    for (const point of charCodes.values()) {\n      if (shouldEncode) {\n        this.write(\n          point === QSP_CODREMOV ? -QSP_CODREMOV : point - QSP_CODREMOV\n        );\n      } else {\n        this.write(point);\n      }\n    }\n  }\n\n  public writeLine(input: string, shouldEncode = true): void {\n    input && this.writeString(input, shouldEncode);\n    this.writeString(QSP_STRSDELIM, false);\n  }\n\n  public seek(offset: number): void {\n    this.cursor = offset;\n  }\n}\n","import { QspLocation } from '../contracts';\n\nconst QSP_STARTLOC = '#';\nconst QSP_ENDLOC = '-';\nconst QSP_QUOTES = [\"'\", '\"'];\nconst QSP_LCURLY = '{';\nconst QSP_RCURLY = '}';\n\nexport function readQsps(content: string): QspLocation[] {\n  const locations: QspLocation[] = [];\n\n  let isInLoc = false;\n  let curLoc: QspLocation | null = null;\n  let locCode: string[] = [];\n  const lines = content.split(/\\r?\\n/);\n  let quote = '';\n  let quotesCount = 0;\n  for (const line of lines) {\n    if (isInLoc) {\n      if (!quote && !quotesCount) {\n        if (line.startsWith(QSP_ENDLOC)) {\n          isInLoc = false;\n          if (curLoc) {\n            curLoc.code = locCode;\n            locCode = [];\n            locations.push(curLoc);\n            curLoc = null;\n          }\n          continue;\n        }\n      }\n      locCode.push(line);\n      const chars = line.split('');\n      for (let i = 0; i < chars.length; ++i) {\n        const char = chars[i];\n        if (quote) {\n          if (char == quote) {\n            if (chars[i + 1] == quote) {\n              i++;\n            } else {\n              quote = '';\n            }\n          }\n        } else {\n          if (char == QSP_LCURLY) ++quotesCount;\n          else if (char == QSP_RCURLY) {\n            if (quotesCount) --quotesCount;\n          } else if (QSP_QUOTES.includes(char)) quote = char;\n        }\n      }\n    } else {\n      if (line.startsWith(QSP_STARTLOC)) {\n        isInLoc = true;\n        curLoc = {\n          name: line.slice(QSP_STARTLOC.length).trim(),\n          description: [],\n          code: [],\n          actions: [],\n        };\n      }\n    }\n  }\n\n  if (isInLoc && curLoc) {\n    curLoc.code = locCode;\n    locations.push(curLoc);\n  }\n\n  return locations;\n}\n","import { QspAction, QspLocation } from '../contracts';\n\nfunction escapeQspString(input: string): string {\n  return input.replace(/'/g, \"''\");\n}\n\nfunction convertDescription(lines: string[], linebreak: string): string {\n  return lines\n    .map((line, index) => `${index === lines.length - 1 ? '*p' : '*pl'} '${escapeQspString(line)}'${linebreak}`)\n    .join('');\n}\n\nfunction convertAction(action: QspAction, linebreak: string): string {\n  const name = escapeQspString(action.name);\n  const image = action.image ? `, '${escapeQspString(action.image)}'` : '';\n  const code = action.code.map((line) => `  ${line}${linebreak}`).join('');\n  return `act '${name}'${image}:${linebreak}${code}end`;\n}\n\nfunction convertActions(actions: QspAction[], linebreak: string): string {\n  if (!actions.length) return '';\n  return actions.map((action) => convertAction(action, linebreak)).join(linebreak) + linebreak;\n}\n\nfunction convertLocation(location: QspLocation, linebreak: string): string {\n  const description = convertDescription(location.description, linebreak);\n  const code = location.code.length ? location.code.join(linebreak) + linebreak : '';\n  const actions = convertActions(location.actions, linebreak);\n  return `# ${location.name}${linebreak}${description}${actions}${code}--- ${location.name} ---------------------------------${linebreak}`;\n}\n\nexport function writeQsps(locations: QspLocation[], linebreak = '\\n'): string {\n  return locations.map((location) => convertLocation(location, linebreak)).join(linebreak);\n}\n","import { QspAction, QspLocation } from '../contracts';\nimport { QspByteStream, QSP_GAMEID } from '../qsp-byte-stream';\n\n// format description https://github.com/QSPFoundation/qsp/blob/master/help/gam_desc.txt\n\nfunction readNewFormat(stream: QspByteStream): QspLocation[] {\n  stream.readLine(false); // tool version\n  stream.readLine(); // password\n  const locCount = parseInt(stream.readLine());\n\n  const locations: QspLocation[] = [];\n\n  for (let i = 0; i < locCount; i++) {\n    const name = stream.readLine();\n    let description = stream.readLine().split(/\\r?\\n/);\n    if (description.length === 1 && description[0] === '') {\n      description = [];\n    }\n    const code = stream.readLine().split(/\\r?\\n/);\n\n    const actsCount = parseInt(stream.readLine());\n    const actions: QspAction[] = [];\n    for (let j = 0; j < actsCount; ++j) {\n      const image = stream.readLine();\n      const actionName = stream.readLine();\n      const actionCode = stream.readLine().split(/\\r?\\n/);\n      actions.push({ image, name: actionName, code: actionCode });\n    }\n    locations.push({ name, description, code, actions });\n  }\n  return locations;\n}\n\nfunction readOldFormat(stream: QspByteStream): QspLocation[] {\n  stream.seek(0);\n  const locCount = parseInt(stream.readLine(false));\n  stream.readLine(); // password\n  stream.readLine(false); // tool version\n  for (let i = 0; i < 27; i++) {\n    //empty reserved lines\n    stream.readLine();\n  }\n  const locations: QspLocation[] = [];\n  const actsCount = 20;\n  for (let i = 0; i < locCount; i++) {\n    const name = stream.readLine();\n    const description = stream.readLine().split(/\\r?\\n/);\n    const code = stream.readLine().split(/\\r?\\n/);\n\n    const actions: QspAction[] = [];\n    for (let j = 0; j < actsCount; ++j) {\n      const actionName = stream.readLine();\n      const actionCode = stream.readLine().split(/\\r?\\n/);\n      if (actionName) {\n        actions.push({ name: actionName, code: actionCode });\n      }\n    }\n    locations.push({ name, description, code, actions });\n  }\n\n  return locations;\n}\n\nexport function readQsp(buffer: ArrayBuffer): QspLocation[] {\n  const stream = new QspByteStream(buffer);\n  const header = stream.readLine(false);\n  if (header === QSP_GAMEID) {\n    return readNewFormat(stream);\n  }\n\n  return readOldFormat(stream);\n}\n","import { QspLocation } from '../contracts';\nimport { QspByteStream, QSP_GAMEID, QSP_PASSWD } from '../qsp-byte-stream';\n\nexport function writeQsp(locations: QspLocation[]): ArrayBuffer {\n  const stream = new QspByteStream();\n\n  stream.writeLine(QSP_GAMEID, false);\n  stream.writeLine('@qsp/converters 1.0', false);\n  stream.writeLine(QSP_PASSWD);\n  stream.writeLine(String(locations.length));\n\n  for (const location of locations) {\n    stream.writeLine(location.name);\n    stream.writeLine(location.description.join('\\r\\n'));\n    stream.writeLine(location.code.join('\\r\\n'));\n\n    stream.writeLine(String(location.actions.length));\n    for (const action of location.actions) {\n      stream.writeLine(action.image ?? '');\n      stream.writeLine(action.name);\n      stream.writeLine(action.code.join('\\r\\n'));\n    }\n  }\n  return stream.finalize();\n}\n"],"names":["CP1251ToUnicodeTable","convertCP1251","char","String","fromCharCode","QspByteStream","fromBuffer","cursor","this","content","view","isUnicode","ArrayBuffer","DataView","getUint8","ensureSize","size","byteLength","buffer","set","Uint8Array","finalize","slice","read","Uint16Array","BYTES_PER_ELEMENT","getUint16","position","readLine","shouldDecode","eof","chars","push","map","join","write","value","Int16Array","setUint16","writeString","input","shouldEncode","_step","_iterator","_createForOfIteratorHelperLoose","split","charCodeAt","values","done","point","writeLine","seek","offset","QSP_QUOTES","escapeQspString","replace","stream","locCount","parseInt","locations","i","description","length","code","actsCount","actions","j","image","actionName","actionCode","name","readNewFormat","readOldFormat","isInLoc","curLoc","locCode","quote","quotesCount","line","startsWith","_char","includes","trim","location","_step2","_iterator2","action","_action$image","writeQsps","linebreak","convertLocation","lines","index","convertDescription","convertAction","convertActions"],"mappings":"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"}