@qsp/converters 1.0.0 → 1.0.1

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.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- function e(e,n){(null==n||n>e.length)&&(n=e.length);for(var r=0,t=new Array(n);r<n;r++)t[r]=e[r];return t}function n(n,r){var t="undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(t)return(t=t.call(n)).next.bind(t);if(Array.isArray(n)||(t=function(n,r){if(n){if("string"==typeof n)return e(n,r);var t=Object.prototype.toString.call(n).slice(8,-1);return"Object"===t&&n.constructor&&(t=n.constructor.name),"Map"===t||"Set"===t?Array.from(n):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?e(n,r):void 0}}(n))||r&&n&&"number"==typeof n.length){t&&(n=t);var i=0;return function(){return i>=n.length?{done:!0}:{done:!1,value:n[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r=[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,32,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103];function t(e){return String.fromCharCode(e>=128?r[e-128]:e)}var i=/*#__PURE__*/function(){function e(e){this.cursor=0,this.content=void 0,this.view=void 0,this.isUnicode=void 0,this.content=null!=e?e:new ArrayBuffer(256),this.view=new DataView(this.content),this.isUnicode=0===this.view.getUint8(1)}var r,i,o=e.prototype;return o.ensureSize=function(e){if(!(this.content.byteLength>=e)){var n=new ArrayBuffer(2*this.content.byteLength);new Uint8Array(n).set(new Uint8Array(this.content)),this.content=n,this.view=new DataView(this.content)}},o.finalize=function(){return this.content=this.content.slice(0,this.cursor),this.content},o.read=function(){var e=this.cursor;return this.cursor+=this.isUnicode?Uint16Array.BYTES_PER_ELEMENT:Uint8Array.BYTES_PER_ELEMENT,this.isUnicode?this.view.getUint16(e,!0):this.view.getUint8(e)},o.readLine=function(e){void 0===e&&(e=!0);for(var n=[];!this.eof;){var r=this.read();if(13===r){this.read();break}n.push(e?-5===r?5:r+5:r)}return this.isUnicode?n.map(function(e){return String.fromCharCode(e)}).join(""):n.map(t).join("")},o.write=function(e){this.ensureSize(this.cursor+Int16Array.BYTES_PER_ELEMENT);var n=this.cursor;this.cursor+=Int16Array.BYTES_PER_ELEMENT,this.view.setUint16(n,e,!0)},o.writeString=function(e,r){void 0===r&&(r=!0);for(var t,i=n(e.split("").map(function(e){return e.charCodeAt(0)}).values());!(t=i()).done;){var o=t.value;this.write(r?5===o?-5:o-5:o)}},o.writeLine=function(e,n){void 0===n&&(n=!0),e&&this.writeString(e,n),this.writeString("\r\n",!1)},o.seek=function(e){this.cursor=e},r=e,(i=[{key:"eof",get:function(){return this.cursor>=this.content.byteLength}}])&&function(e,n){for(var r=0;r<n.length;r++){var t=n[r];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(e,t.key,t)}}(r.prototype,i),Object.defineProperty(r,"prototype",{writable:!1}),e}(),o=["'",'"'];function a(e){return e.replace(/'/g,"''")}exports.readQsp=function(e){var n=new i(e);return"QSPGAME"===n.readLine(!1)?function(e){e.readLine(!1),e.readLine();for(var n=parseInt(e.readLine()),r=[],t=0;t<n;t++){for(var i=e.readLine(),o=e.readLine().split(/\r?\n/),a=e.readLine().split(/\r?\n/),s=parseInt(e.readLine()),u=[],c=0;c<s;++c){var d=e.readLine(),f=e.readLine(),h=e.readLine().split(/\r?\n/);u.push({image:d,name:f,code:h})}r.push({name:i,description:o,code:a,actions:u})}return r}(n):function(e){e.seek(0);var n=parseInt(e.readLine(!1));e.readLine(),e.readLine(!1);for(var r=0;r<27;r++)e.readLine();for(var t=[],i=0;i<n;i++){for(var o=e.readLine(),a=e.readLine().split(/\r?\n/),s=e.readLine().split(/\r?\n/),u=[],c=0;c<20;++c){var d=e.readLine(),f=e.readLine().split(/\r?\n/);d&&u.push({name:d,code:f})}t.push({name:o,description:a,code:s,actions:u})}return t}(n)},exports.readQsps=function(e){for(var r,t=[],i=!1,a=null,s=[],u="",c=0,d=n(e.split(/\r?\n/));!(r=d()).done;){var f=r.value;if(i){if(!u&&!c&&f.startsWith("-")){i=!1,a&&(a.code=s,s=[],t.push(a),a=null);continue}s.push(f);for(var h=f.split(""),l=0;l<h.length;++l){var p=h[l];u?p==u&&(h[l+1]==u?l++:u=""):"{"==p?++c:"}"==p?c&&--c:o.includes(p)&&(u=p)}}else f.startsWith("#")&&(i=!0,a={name:f.slice("#".length).trim(),description:[],code:[],actions:[]})}return i&&a&&(a.code=s,t.push(a)),t},exports.writeQsp=function(e){var r=new i;r.writeLine("QSPGAME",!1),r.writeLine("@qsp/converters 1.0",!1),r.writeLine("No"),r.writeLine(String(e.length));for(var t,o=n(e);!(t=o()).done;){var a=t.value;r.writeLine(a.name),r.writeLine(a.description.join("\r\n")),r.writeLine(a.code.join("\r\n")),r.writeLine(String(a.actions.length));for(var s,u=n(a.actions);!(s=u()).done;){var c,d=s.value;r.writeLine(null!=(c=d.image)?c:""),r.writeLine(d.name),r.writeLine(d.code.join("\r\n"))}}return r.finalize()},exports.writeQsps=function(e,n){return void 0===n&&(n="\n"),e.map(function(e){return function(e,n){var r=function(e,n){return e.map(function(r,t){return(t===e.length-1?"*p":"*pl")+" '"+a(r)+"'"+n}).join("")}(e.description,n),t=e.code.length?e.code.join(n)+n:"",i=function(e,n){return e.length?e.map(function(e){return function(e,n){var r=a(e.name),t=e.image?", '"+a(e.image)+"'":"",i=e.code.map(function(e){return" "+e+n}).join("");return"act '"+r+"'"+t+":"+n+i+"end"}(e,n)}).join(n)+n:""}(e.actions,n);return"# "+e.name+n+r+i+t+"--- "+e.name+" ---------------------------------"+n}(e,n)}).join(n)};
1
+ function e(e,n){(null==n||n>e.length)&&(n=e.length);for(var r=0,t=new Array(n);r<n;r++)t[r]=e[r];return t}function n(n,r){var t="undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(t)return(t=t.call(n)).next.bind(t);if(Array.isArray(n)||(t=function(n,r){if(n){if("string"==typeof n)return e(n,r);var t=Object.prototype.toString.call(n).slice(8,-1);return"Object"===t&&n.constructor&&(t=n.constructor.name),"Map"===t||"Set"===t?Array.from(n):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?e(n,r):void 0}}(n))||r&&n&&"number"==typeof n.length){t&&(n=t);var i=0;return function(){return i>=n.length?{done:!0}:{done:!1,value:n[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r=[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,32,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103];function t(e){return String.fromCharCode(e>=128?r[e-128]:e)}var i=/*#__PURE__*/function(){function e(e){this.cursor=0,this.content=void 0,this.view=void 0,this.isUnicode=void 0,this.content=null!=e?e:new ArrayBuffer(256),this.view=new DataView(this.content),this.isUnicode=0===this.view.getUint8(1)}var r,i,o=e.prototype;return o.ensureSize=function(e){if(!(this.content.byteLength>=e)){var n=new ArrayBuffer(2*this.content.byteLength);new Uint8Array(n).set(new Uint8Array(this.content)),this.content=n,this.view=new DataView(this.content)}},o.finalize=function(){return this.content=this.content.slice(0,this.cursor),this.content},o.read=function(){var e=this.cursor;return this.cursor+=this.isUnicode?Uint16Array.BYTES_PER_ELEMENT:Uint8Array.BYTES_PER_ELEMENT,this.isUnicode?this.view.getUint16(e,!0):this.view.getUint8(e)},o.readLine=function(e){void 0===e&&(e=!0);for(var n=[];!this.eof;){var r=this.read();if(13===r){this.read();break}n.push(e?-5===r?5:r+5:r)}return this.isUnicode?n.map(function(e){return String.fromCharCode(e)}).join(""):n.map(t).join("")},o.write=function(e){this.ensureSize(this.cursor+Int16Array.BYTES_PER_ELEMENT);var n=this.cursor;this.cursor+=Int16Array.BYTES_PER_ELEMENT,this.view.setUint16(n,e,!0)},o.writeString=function(e,r){void 0===r&&(r=!0);for(var t,i=n(e.split("").map(function(e){return e.charCodeAt(0)}).values());!(t=i()).done;){var o=t.value;this.write(r?5===o?-5:o-5:o)}},o.writeLine=function(e,n){void 0===n&&(n=!0),e&&this.writeString(e,n),this.writeString("\r\n",!1)},o.seek=function(e){this.cursor=e},r=e,(i=[{key:"eof",get:function(){return this.cursor>=this.content.byteLength}}])&&function(e,n){for(var r=0;r<n.length;r++){var t=n[r];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(e,t.key,t)}}(r.prototype,i),Object.defineProperty(r,"prototype",{writable:!1}),e}(),o=["'",'"'];function a(e){return e.replace(/'/g,"''")}exports.readQsp=function(e){var n=new i(e);return"QSPGAME"===n.readLine(!1)?function(e){e.readLine(!1),e.readLine();for(var n=parseInt(e.readLine()),r=[],t=0;t<n;t++){var i=e.readLine(),o=e.readLine().split(/\r?\n/);1===o.length&&""===o[0]&&(o=[]);for(var a=e.readLine().split(/\r?\n/),s=parseInt(e.readLine()),u=[],c=0;c<s;++c){var d=e.readLine(),f=e.readLine(),h=e.readLine().split(/\r?\n/);u.push({image:d,name:f,code:h})}r.push({name:i,description:o,code:a,actions:u})}return r}(n):function(e){e.seek(0);var n=parseInt(e.readLine(!1));e.readLine(),e.readLine(!1);for(var r=0;r<27;r++)e.readLine();for(var t=[],i=0;i<n;i++){for(var o=e.readLine(),a=e.readLine().split(/\r?\n/),s=e.readLine().split(/\r?\n/),u=[],c=0;c<20;++c){var d=e.readLine(),f=e.readLine().split(/\r?\n/);d&&u.push({name:d,code:f})}t.push({name:o,description:a,code:s,actions:u})}return t}(n)},exports.readQsps=function(e){for(var r,t=[],i=!1,a=null,s=[],u="",c=0,d=n(e.split(/\r?\n/));!(r=d()).done;){var f=r.value;if(i){if(!u&&!c&&f.startsWith("-")){i=!1,a&&(a.code=s,s=[],t.push(a),a=null);continue}s.push(f);for(var h=f.split(""),l=0;l<h.length;++l){var v=h[l];u?v==u&&(h[l+1]==u?l++:u=""):"{"==v?++c:"}"==v?c&&--c:o.includes(v)&&(u=v)}}else f.startsWith("#")&&(i=!0,a={name:f.slice("#".length).trim(),description:[],code:[],actions:[]})}return i&&a&&(a.code=s,t.push(a)),t},exports.writeQsp=function(e){var r=new i;r.writeLine("QSPGAME",!1),r.writeLine("@qsp/converters 1.0",!1),r.writeLine("No"),r.writeLine(String(e.length));for(var t,o=n(e);!(t=o()).done;){var a=t.value;r.writeLine(a.name),r.writeLine(a.description.join("\r\n")),r.writeLine(a.code.join("\r\n")),r.writeLine(String(a.actions.length));for(var s,u=n(a.actions);!(s=u()).done;){var c,d=s.value;r.writeLine(null!=(c=d.image)?c:""),r.writeLine(d.name),r.writeLine(d.code.join("\r\n"))}}return r.finalize()},exports.writeQsps=function(e,n){return void 0===n&&(n="\n"),e.map(function(e){return function(e,n){var r=function(e,n){return e.map(function(r,t){return(t===e.length-1?"*p":"*pl")+" '"+a(r)+"'"+n}).join("")}(e.description,n),t=e.code.length?e.code.join(n)+n:"",i=function(e,n){return e.length?e.map(function(e){return function(e,n){var r=a(e.name),t=e.image?", '"+a(e.image)+"'":"",i=e.code.map(function(e){return" "+e+n}).join("");return"act '"+r+"'"+t+":"+n+i+"end"}(e,n)}).join(n)+n:""}(e.actions,n);return"# "+e.name+n+r+i+t+"--- "+e.name+" ---------------------------------"+n}(e,n)}).join(n)};
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"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 const description = stream.readLine().split(/\\r?\\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","readQsp","stream","locCount","parseInt","locations","i","name","description","code","actsCount","actions","j","image","actionName","actionCode","readNewFormat","readOldFormat","isInLoc","curLoc","locCode","quote","quotesCount","line","startsWith","length","_char","includes","trim","location","_step2","_iterator2","action","_action$image","writeQsps","linebreak","convertLocation","lines","index","convertDescription","convertAction","convertActions"],"mappings":"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"}
1
+ {"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":"szBAAO,IAMmBA,EAAa,CACrC,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,GAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,IAAQ,KAAQ,KAAQ,KAChE,IAAQ,KAAQ,IAAQ,IAAQ,KAAQ,IAAQ,KAAQ,IAAQ,IAChE,IAAQ,IAAQ,KAAQ,IAAQ,IAAQ,KAAQ,KAAQ,KAAQ,IAChE,IAAQ,IAAQ,KAAQ,KAAQ,KAAQ,IAAQ,KAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAChE,KAAQ,MAGV,SAASC,EAAcC,GACrB,OAAaC,OAACC,aACZF,GAAQ,IAAOF,EAAqBE,EAAO,KAAQA,GAI1CG,IAAAA,0BAMX,SAAmBC,EAAAA,GALXC,KAAAA,OAAS,EAK0BC,KAJnCC,aACAC,EAAAA,KAAAA,iBACAC,eAEmC,EACzCH,KAAKC,QAAUH,MAAAA,EAAAA,EAAc,IAAIM,YAAY,KAC7CJ,KAAKE,KAAO,IAAAG,SAAaL,KAAKC,SAC9BD,KAAKG,UAAsC,IAA1BH,KAAKE,KAAKI,SAAS,GATxC,QAYUC,EAAAA,EAAAA,UAZV,OAYUA,EAAAA,WAAA,SAAWC,GACjB,KAAIR,KAAKC,QAAQQ,YAAcD,GAA/B,CACA,MACe,gBAD6B,EAA1BR,KAAKC,QAAQQ,YAE/B,eAAeC,GAAQC,IAAI,IAAAC,WAAeZ,KAAKC,UAC/CD,KAAKC,QAAUS,EACfV,KAAKE,KAAO,IAAAG,SAAaL,KAAKC,WAGzBY,EAAAA,SAAA,WAEL,OADAb,KAAKC,QAAUD,KAAKC,QAAQa,MAAM,EAAGd,KAAKD,aAC9BE,WAOPc,KAAA,WACL,MAAiBf,KAAKD,OAItB,OAHAC,KAAKD,QAAUC,KAAKG,UAChBa,YAAYC,kBACZL,WAAWK,kBACRjB,KAAKG,UACRH,KAAKE,KAAKgB,UAAUC,GAAU,GAC9BnB,KAAKE,KAAKI,SAASa,IAGlBC,EAAAA,SAAA,SAASC,YAAAA,IAAAA,GAAe,GAE7B,IADA,MAAwB,IAChBrB,KAAKsB,KAAK,CAChB,IAAM5B,EAAOM,KAAKe,OAClB,GAAa,KAATrB,EAAe,CACjBM,KAAKe,OACL,MAGAQ,EAAMC,KADJH,GA9EkB,IA+ET3B,EA/ES,EA+E+BA,EA/E/B,EAiFTA,GAGf,OAAYS,KAAAA,UAERoB,EAAME,IAAI,SAAA/B,GAAQC,OAAAA,OAAOC,aAAaF,KAAOgC,KAAK,IAClDH,EAAME,IAAIhC,GAAeiC,KAAK,KAG7BC,EAAAA,MAAA,SAAMC,GACX5B,KAAKO,WAAWP,KAAKD,OAAS8B,WAAWZ,mBACzC,IAAcE,EAAGnB,KAAKD,OACtBC,KAAKD,QAAU8B,WAAWZ,kBAC1BjB,KAAKE,KAAK4B,UAAUX,EAAUS,GAAO,IAGhCG,EAAAA,YAAA,SAAYC,EAAeC,QAAmB,IAAnBA,IAAAA,GAAe,GAE/C,IADA,IACwCC,EAAxCC,EAAAC,EADkBJ,EAAMK,MAAM,IAAIZ,IAAI,SAAC/B,GAAD,SAAuB4C,WAAW,KAC1CC,YAAUL,EAAAC,KAAAK,MAAA,CAAA,MACtCN,EAAAN,MACE5B,KAAK2B,MADHM,EApGkB,IAsGlBQ,GAtGkB,EAsGuBA,EAtGvB,EAyGTA,KAKVC,EAAAA,UAAA,SAAUV,EAAeC,QAAAA,IAAAA,IAAAA,GAAe,GAC7CD,GAAShC,KAAK+B,YAAYC,EAAOC,GACjCjC,KAAK+B,YA/Ga,QA+Gc,MAG3BY,KAAA,SAAKC,GACV5C,KAAKD,OAAS6C,0BA5DhB,WACE,OAAY7C,KAAAA,QAAUC,KAAKC,QAAQQ,uPA3BvCZ,KC1BgBgD,EAAG,CAAC,IAAK,KCFzB,SAAAC,EAAyBd,GACvB,OAAYA,EAACe,QAAQ,KAAM,sBC4DvB,SAAkBrC,GACtB,IAAMsC,EAAS,IAAInD,EAAca,GAEjC,MHhEwB,YG+DTsC,EAAO5B,UAAS,GA5DjC,SAAuB4B,GACrBA,EAAO5B,UAAS,GAChB4B,EAAO5B,WAKP,IAJA,IAAc6B,EAAGC,SAASF,EAAO5B,YAE3B+B,EAA2B,GAEvBC,EAAG,EAAGA,EAAIH,EAAUG,IAAK,CACjC,MAAaJ,EAAO5B,WACLiC,EAAGL,EAAO5B,WAAWiB,MAAM,SACf,IAAvBgB,EAAYC,QAAmC,KAAnBD,EAAY,KAC1CA,EAAc,IAMhB,IAJA,IAAME,EAAOP,EAAO5B,WAAWiB,MAAM,SAE/BmB,EAAYN,SAASF,EAAO5B,YAC5BqC,EAAuB,GACnBC,EAAG,EAAGA,EAAIF,IAAaE,EAAG,CAClC,IAAMC,EAAQX,EAAO5B,WACLwC,EAAGZ,EAAO5B,WACpByC,EAAab,EAAO5B,WAAWiB,MAAM,SAC3CoB,EAAQjC,KAAK,CAAEmC,MAAAA,EAAOG,KAAMF,EAAYL,KAAMM,IAEhDV,EAAU3B,KAAK,CAAEsC,KAAAA,EAAMT,YAAAA,EAAaE,KAAAA,EAAME,QAAAA,IAE5C,OAAON,EAqCeY,CAACf,GAlCzB,SAAuBA,GACrBA,EAAOL,KAAK,GACZ,IAAcM,EAAGC,SAASF,EAAO5B,UAAS,IAC1C4B,EAAO5B,WACP4B,EAAO5B,UAAS,GAChB,IAAK,IAAKgC,EAAG,EAAGA,EAAI,GAAIA,IAEtBJ,EAAO5B,WAIT,IAFA,IAAe+B,EAAkB,GAExBC,EAAI,EAAGA,EAAIH,EAAUG,IAAK,CAMjC,IALA,IAAUU,EAAGd,EAAO5B,WACdiC,EAAcL,EAAO5B,WAAWiB,MAAM,WAC/BW,EAAO5B,WAAWiB,MAAM,SAExBoB,EAAgB,GACpBC,EAAI,EAAGA,EAPA,KAOiBA,EAAG,CAClC,IAAgBE,EAAGZ,EAAO5B,WACpByC,EAAab,EAAO5B,WAAWiB,MAAM,SACvCuB,GACFH,EAAQjC,KAAK,CAAEsC,KAAMF,EAAYL,KAAMM,IAG3CV,EAAU3B,KAAK,CAAEsC,KAAAA,EAAMT,YAAAA,EAAaE,KAAAA,EAAME,QAAAA,IAG5C,OACDN,EASQa,CAAchB,8BF9DE/C,GASvB,IARA,IAQAiC,EARMiB,EAA2B,GAEtBc,GAAG,EACJC,EAAuB,KACtBC,EAAa,GAEfC,EAAG,GACGC,EAAG,EAClBlC,EAAAC,EAHcnC,EAAQoC,MAAM,YAG5BH,EAAAC,KAAAK,MAA0B,CAAf8B,IAAAA,EACTpC,EAAAN,MAAA,GAAIqC,EAAS,CACX,IAAKG,IAAUC,GACTC,EAAKC,WAjBE,KAiBsB,CAC/BN,GAAU,EACNC,IACFA,EAAOX,KAAOY,EACdA,EAAU,GACVhB,EAAU3B,KAAK0C,GACfA,EAAS,MAEX,SAGJC,EAAQ3C,KAAK8C,GAEb,IADA,IAAM/C,EAAQ+C,EAAKjC,MAAM,MACZ,EAAGe,EAAI7B,EAAM+B,SAAUF,EAAG,CACrC,IAAUoB,EAAGjD,EAAM6B,GACfgB,EACE1E,GAAQ0E,IACN7C,EAAM6B,EAAI,IAAMgB,EAClBhB,IAEAgB,EAAQ,IAnCH,KAuCL1E,IAAsB2E,EAtCjB,KAuCA3E,EACH2E,KAAeA,EACVxB,EAAW4B,SAAS/E,KAAO0E,EAAQ1E,SAI9C4E,EAAKC,WAjDM,OAkDbN,GAAU,EACVC,EAAS,CACPJ,KAAMQ,EAAKxD,MApDA,IAoDmBwC,QAAQoB,OACtCrB,YAAa,GACbE,KAAM,GACNE,QAAS,KAWjB,OALIQ,GAAWC,IACbA,EAAOX,KAAOY,EACdhB,EAAU3B,KAAK0C,IAIlBf,6BGlEwBA,GACvB,IAAMH,EAAS,MAEfA,EAAON,UJJiB,WIIK,GAC7BM,EAAON,UAAU,uBAAuB,GACxCM,EAAON,UJLiB,MIMxBM,EAAON,UAAU/C,OAAOwD,EAAUG,SAElC,IAAuBH,IAAWjB,EAAXiB,EAAAA,EAAAA,KAAWjB,EAAAC,KAAAK,MAAA,CAAA,MAChCQ,EAAAA,MAAAA,EAAON,UAAUiC,EAASb,MAC1Bd,EAAON,UAAUiC,EAAStB,YAAY3B,KAAK,SAC3CsB,EAAON,UAAUiC,EAASpB,KAAK7B,KAAK,SAEpCsB,EAAON,UAAU/C,OAAOgF,EAASlB,QAAQH,SACzC,QAAAsB,MAAqBD,EAASlB,WAA9BmB,EAAAC,KAAArC,MAAuC,OAAAsC,EAAAF,EAAAhD,MACrCoB,EAAON,UAA0B,OAAjCqC,EAAiBD,EAAOnB,OAASoB,EAAA,IACjC/B,EAAON,UAAUoC,EAAOhB,MACxBd,EAAON,UAAUoC,EAAOvB,KAAK7B,KAAK,UAGtC,OAAasB,EAACnC,8BFQAmE,SAAU7B,EAA0B8B,GAClD,YADkE,IAAhBA,IAAAA,EAAY,MAC9C9B,EAAC1B,IAAI,SAACkD,GAAaO,OARrC,SAAyBP,EAAuBM,GAC9C,IAAiB5B,EAnBnB,SAA4B8B,EAAiBF,GAC3C,OAAOE,EACJ1D,IAAI,SAAC6C,EAAMc,GAAaA,OAAAA,IAAUD,EAAM7B,OAAS,EAAI,KAAO,OAAUR,KAAAA,EAAgBwB,GAASW,IAAAA,IAC/FvD,KAAK,IAgBY2D,CAAmBV,EAAStB,YAAa4B,GACvD1B,EAAOoB,EAASpB,KAAKD,OAASqB,EAASpB,KAAK7B,KAAKuD,GAAaA,EAAY,GAC1ExB,EARR,SAAwBA,EAAsBwB,GAC5C,OAAKxB,EAAQH,OACCG,EAAChC,IAAI,SAACqD,UATtB,SAAuBA,EAAmBG,GACxC,IAAMnB,EAAOhB,EAAgBgC,EAAOhB,MAC9BH,EAAQmB,EAAOnB,MAAP,MAAqBb,EAAgBgC,EAAOnB,OAAY,IAAA,GAC5DJ,EAAGuB,EAAOvB,KAAK9B,IAAI,SAAC6C,GAAD,MAAA,KAAeA,EAAOW,IAAavD,KAAK,IACrE,cAAeoC,EAAf,IAAuBH,EAAvB,IAAgCsB,EAAY1B,EAA5C,MAK4C+B,CAACR,EAAQG,KAAYvD,KAAKuD,GAAaA,EADvD,GAOZM,CAAeZ,EAASlB,QAASwB,GACjD,WAAYN,EAASb,KAAOmB,EAAY5B,EAAcI,EAAUF,EAAhE,OAA2EoB,EAASb,KAApF,qCAA6HmB,EAI1FC,CAAgBP,EAAUM,KAAYvD,KAAKuD"}
@@ -1,2 +1,2 @@
1
- const n=[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,32,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103];function t(t){return String.fromCharCode(t>=128?n[t-128]:t)}class e{constructor(n){this.cursor=0,this.content=void 0,this.view=void 0,this.isUnicode=void 0,this.content=null!=n?n:new ArrayBuffer(256),this.view=new DataView(this.content),this.isUnicode=0===this.view.getUint8(1)}ensureSize(n){if(this.content.byteLength>=n)return;const t=new ArrayBuffer(2*this.content.byteLength);new Uint8Array(t).set(new Uint8Array(this.content)),this.content=t,this.view=new DataView(this.content)}finalize(){return this.content=this.content.slice(0,this.cursor),this.content}get eof(){return this.cursor>=this.content.byteLength}read(){const n=this.cursor;return this.cursor+=this.isUnicode?Uint16Array.BYTES_PER_ELEMENT:Uint8Array.BYTES_PER_ELEMENT,this.isUnicode?this.view.getUint16(n,!0):this.view.getUint8(n)}readLine(n=!0){const e=[];for(;!this.eof;){const t=this.read();if(13===t){this.read();break}e.push(n?-5===t?5:t+5:t)}return this.isUnicode?e.map(n=>String.fromCharCode(n)).join(""):e.map(t).join("")}write(n){this.ensureSize(this.cursor+Int16Array.BYTES_PER_ELEMENT);const t=this.cursor;this.cursor+=Int16Array.BYTES_PER_ELEMENT,this.view.setUint16(t,n,!0)}writeString(n,t=!0){const e=n.split("").map(n=>n.charCodeAt(0));for(const n of e.values())this.write(t?5===n?-5:n-5:n)}writeLine(n,t=!0){n&&this.writeString(n,t),this.writeString("\r\n",!1)}seek(n){this.cursor=n}}function i(n){const t=new e(n);return"QSPGAME"===t.readLine(!1)?function(n){n.readLine(!1),n.readLine();const t=parseInt(n.readLine()),e=[];for(let i=0;i<t;i++){const t=n.readLine(),i=n.readLine().split(/\r?\n/),r=n.readLine().split(/\r?\n/),s=parseInt(n.readLine()),o=[];for(let t=0;t<s;++t){const t=n.readLine(),e=n.readLine(),i=n.readLine().split(/\r?\n/);o.push({image:t,name:e,code:i})}e.push({name:t,description:i,code:r,actions:o})}return e}(t):function(n){n.seek(0);const t=parseInt(n.readLine(!1));n.readLine(),n.readLine(!1);for(let t=0;t<27;t++)n.readLine();const e=[];for(let i=0;i<t;i++){const t=n.readLine(),i=n.readLine().split(/\r?\n/),r=n.readLine().split(/\r?\n/),s=[];for(let t=0;t<20;++t){const t=n.readLine(),e=n.readLine().split(/\r?\n/);t&&s.push({name:t,code:e})}e.push({name:t,description:i,code:r,actions:s})}return e}(t)}const r=["'",'"'];function s(n){const t=[];let e=!1,i=null,s=[];const o=n.split(/\r?\n/);let c="",a=0;for(const n of o)if(e){if(!c&&!a&&n.startsWith("-")){e=!1,i&&(i.code=s,s=[],t.push(i),i=null);continue}s.push(n);const o=n.split("");for(let n=0;n<o.length;++n){const t=o[n];c?t==c&&(o[n+1]==c?n++:c=""):"{"==t?++a:"}"==t?a&&--a:r.includes(t)&&(c=t)}}else n.startsWith("#")&&(e=!0,i={name:n.slice("#".length).trim(),description:[],code:[],actions:[]});return e&&i&&(i.code=s,t.push(i)),t}function o(n){const t=new e;t.writeLine("QSPGAME",!1),t.writeLine("@qsp/converters 1.0",!1),t.writeLine("No"),t.writeLine(String(n.length));for(const e of n){t.writeLine(e.name),t.writeLine(e.description.join("\r\n")),t.writeLine(e.code.join("\r\n")),t.writeLine(String(e.actions.length));for(const n of e.actions){var i;t.writeLine(null!=(i=n.image)?i:""),t.writeLine(n.name),t.writeLine(n.code.join("\r\n"))}}return t.finalize()}function c(n){return n.replace(/'/g,"''")}function a(n,t="\n"){return n.map(n=>function(n,t){const e=function(n,t){return n.map((e,i)=>`${i===n.length-1?"*p":"*pl"} '${c(e)}'${t}`).join("")}(n.description,t),i=n.code.length?n.code.join(t)+t:"",r=function(n,t){return n.length?n.map(n=>function(n,t){const e=c(n.name),i=n.image?`, '${c(n.image)}'`:"",r=n.code.map(n=>` ${n}${t}`).join("");return`act '${e}'${i}:${t}${r}end`}(n,t)).join(t)+t:""}(n.actions,t);return`# ${n.name}${t}${e}${r}${i}--- ${n.name} ---------------------------------${t}`}(n,t)).join(t)}export{i as readQsp,s as readQsps,o as writeQsp,a as writeQsps};
1
+ const n=[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,32,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103];function t(t){return String.fromCharCode(t>=128?n[t-128]:t)}class e{constructor(n){this.cursor=0,this.content=void 0,this.view=void 0,this.isUnicode=void 0,this.content=null!=n?n:new ArrayBuffer(256),this.view=new DataView(this.content),this.isUnicode=0===this.view.getUint8(1)}ensureSize(n){if(this.content.byteLength>=n)return;const t=new ArrayBuffer(2*this.content.byteLength);new Uint8Array(t).set(new Uint8Array(this.content)),this.content=t,this.view=new DataView(this.content)}finalize(){return this.content=this.content.slice(0,this.cursor),this.content}get eof(){return this.cursor>=this.content.byteLength}read(){const n=this.cursor;return this.cursor+=this.isUnicode?Uint16Array.BYTES_PER_ELEMENT:Uint8Array.BYTES_PER_ELEMENT,this.isUnicode?this.view.getUint16(n,!0):this.view.getUint8(n)}readLine(n=!0){const e=[];for(;!this.eof;){const t=this.read();if(13===t){this.read();break}e.push(n?-5===t?5:t+5:t)}return this.isUnicode?e.map(n=>String.fromCharCode(n)).join(""):e.map(t).join("")}write(n){this.ensureSize(this.cursor+Int16Array.BYTES_PER_ELEMENT);const t=this.cursor;this.cursor+=Int16Array.BYTES_PER_ELEMENT,this.view.setUint16(t,n,!0)}writeString(n,t=!0){const e=n.split("").map(n=>n.charCodeAt(0));for(const n of e.values())this.write(t?5===n?-5:n-5:n)}writeLine(n,t=!0){n&&this.writeString(n,t),this.writeString("\r\n",!1)}seek(n){this.cursor=n}}function i(n){const t=new e(n);return"QSPGAME"===t.readLine(!1)?function(n){n.readLine(!1),n.readLine();const t=parseInt(n.readLine()),e=[];for(let i=0;i<t;i++){const t=n.readLine();let i=n.readLine().split(/\r?\n/);1===i.length&&""===i[0]&&(i=[]);const r=n.readLine().split(/\r?\n/),s=parseInt(n.readLine()),o=[];for(let t=0;t<s;++t){const t=n.readLine(),e=n.readLine(),i=n.readLine().split(/\r?\n/);o.push({image:t,name:e,code:i})}e.push({name:t,description:i,code:r,actions:o})}return e}(t):function(n){n.seek(0);const t=parseInt(n.readLine(!1));n.readLine(),n.readLine(!1);for(let t=0;t<27;t++)n.readLine();const e=[];for(let i=0;i<t;i++){const t=n.readLine(),i=n.readLine().split(/\r?\n/),r=n.readLine().split(/\r?\n/),s=[];for(let t=0;t<20;++t){const t=n.readLine(),e=n.readLine().split(/\r?\n/);t&&s.push({name:t,code:e})}e.push({name:t,description:i,code:r,actions:s})}return e}(t)}const r=["'",'"'];function s(n){const t=[];let e=!1,i=null,s=[];const o=n.split(/\r?\n/);let c="",a=0;for(const n of o)if(e){if(!c&&!a&&n.startsWith("-")){e=!1,i&&(i.code=s,s=[],t.push(i),i=null);continue}s.push(n);const o=n.split("");for(let n=0;n<o.length;++n){const t=o[n];c?t==c&&(o[n+1]==c?n++:c=""):"{"==t?++a:"}"==t?a&&--a:r.includes(t)&&(c=t)}}else n.startsWith("#")&&(e=!0,i={name:n.slice("#".length).trim(),description:[],code:[],actions:[]});return e&&i&&(i.code=s,t.push(i)),t}function o(n){const t=new e;t.writeLine("QSPGAME",!1),t.writeLine("@qsp/converters 1.0",!1),t.writeLine("No"),t.writeLine(String(n.length));for(const e of n){t.writeLine(e.name),t.writeLine(e.description.join("\r\n")),t.writeLine(e.code.join("\r\n")),t.writeLine(String(e.actions.length));for(const n of e.actions){var i;t.writeLine(null!=(i=n.image)?i:""),t.writeLine(n.name),t.writeLine(n.code.join("\r\n"))}}return t.finalize()}function c(n){return n.replace(/'/g,"''")}function a(n,t="\n"){return n.map(n=>function(n,t){const e=function(n,t){return n.map((e,i)=>`${i===n.length-1?"*p":"*pl"} '${c(e)}'${t}`).join("")}(n.description,t),i=n.code.length?n.code.join(t)+t:"",r=function(n,t){return n.length?n.map(n=>function(n,t){const e=c(n.name),i=n.image?`, '${c(n.image)}'`:"",r=n.code.map(n=>` ${n}${t}`).join("");return`act '${e}'${i}:${t}${r}end`}(n,t)).join(t)+t:""}(n.actions,t);return`# ${n.name}${t}${e}${r}${i}--- ${n.name} ---------------------------------${t}`}(n,t)).join(t)}export{i as readQsp,s as readQsps,o as writeQsp,a as writeQsps};
2
2
  //# sourceMappingURL=index.modern.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.modern.js","sources":["../src/qsp-byte-stream.ts","../src/readers/qsp.ts","../src/readers/qsps.ts","../src/writers/qsp.ts","../src/writers/qsps.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 { 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 const description = stream.readLine().split(/\\r?\\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';\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 { 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","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"],"names":["char","fromCharCode","CP1251ToUnicodeTable","QspByteStream","constructor","fromBuffer","this","cursor","content","view","isUnicode","ArrayBuffer","DataView","getUint8","ensureSize","size","byteLength","buffer","set","Uint8Array","finalize","slice","read","position","Uint16Array","BYTES_PER_ELEMENT","getUint16","readLine","shouldDecode","eof","chars","push","map","String","join","convertCP1251","write","value","Int16Array","setUint16","writeString","input","shouldEncode","split","charCodeAt","point","charCodes","values","writeLine","seek","offset","readQsp","stream","parseInt","locations","i","locCount","name","code","actsCount","actions","j","actionName","image","actionCode","description","readNewFormat","readOldFormat","QSP_QUOTES","readQsps","isInLoc","curLoc","locCode","lines","quote","quotesCount","line","startsWith","length","includes","trim","writeQsp","location","action","_action$image","escapeQspString","replace","linebreak","index","convertDescription","convertAction","convertActions","convertLocation"],"mappings":"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"}
1
+ {"version":3,"file":"index.modern.js","sources":["../src/qsp-byte-stream.ts","../src/readers/qsp.ts","../src/readers/qsps.ts","../src/writers/qsp.ts","../src/writers/qsps.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 { 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';\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 { 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","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"],"names":["char","fromCharCode","CP1251ToUnicodeTable","QspByteStream","constructor","fromBuffer","this","cursor","content","view","isUnicode","ArrayBuffer","DataView","getUint8","ensureSize","size","byteLength","buffer","set","Uint8Array","finalize","slice","read","position","Uint16Array","BYTES_PER_ELEMENT","getUint16","readLine","shouldDecode","eof","chars","push","map","String","join","convertCP1251","write","value","Int16Array","setUint16","writeString","input","shouldEncode","split","charCodeAt","point","charCodes","values","writeLine","seek","offset","readQsp","stream","locCount","parseInt","locations","i","name","description","length","code","actsCount","actions","j","actionName","actionCode","image","readNewFormat","readOldFormat","QSP_QUOTES","readQsps","isInLoc","curLoc","locCode","lines","quote","quotesCount","line","startsWith","includes","trim","writeQsp","location","action","_action$image","escapeQspString","replace","linebreak","index","convertDescription","convertAction","convertActions","convertLocation"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- function e(e,n){(null==n||n>e.length)&&(n=e.length);for(var r=0,t=new Array(n);r<n;r++)t[r]=e[r];return t}function n(n,r){var t="undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(t)return(t=t.call(n)).next.bind(t);if(Array.isArray(n)||(t=function(n,r){if(n){if("string"==typeof n)return e(n,r);var t=Object.prototype.toString.call(n).slice(8,-1);return"Object"===t&&n.constructor&&(t=n.constructor.name),"Map"===t||"Set"===t?Array.from(n):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?e(n,r):void 0}}(n))||r&&n&&"number"==typeof n.length){t&&(n=t);var i=0;return function(){return i>=n.length?{done:!0}:{done:!1,value:n[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r=[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,32,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103];function t(e){return String.fromCharCode(e>=128?r[e-128]:e)}var i=/*#__PURE__*/function(){function e(e){this.cursor=0,this.content=void 0,this.view=void 0,this.isUnicode=void 0,this.content=null!=e?e:new ArrayBuffer(256),this.view=new DataView(this.content),this.isUnicode=0===this.view.getUint8(1)}var r,i,o=e.prototype;return o.ensureSize=function(e){if(!(this.content.byteLength>=e)){var n=new ArrayBuffer(2*this.content.byteLength);new Uint8Array(n).set(new Uint8Array(this.content)),this.content=n,this.view=new DataView(this.content)}},o.finalize=function(){return this.content=this.content.slice(0,this.cursor),this.content},o.read=function(){var e=this.cursor;return this.cursor+=this.isUnicode?Uint16Array.BYTES_PER_ELEMENT:Uint8Array.BYTES_PER_ELEMENT,this.isUnicode?this.view.getUint16(e,!0):this.view.getUint8(e)},o.readLine=function(e){void 0===e&&(e=!0);for(var n=[];!this.eof;){var r=this.read();if(13===r){this.read();break}n.push(e?-5===r?5:r+5:r)}return this.isUnicode?n.map(function(e){return String.fromCharCode(e)}).join(""):n.map(t).join("")},o.write=function(e){this.ensureSize(this.cursor+Int16Array.BYTES_PER_ELEMENT);var n=this.cursor;this.cursor+=Int16Array.BYTES_PER_ELEMENT,this.view.setUint16(n,e,!0)},o.writeString=function(e,r){void 0===r&&(r=!0);for(var t,i=n(e.split("").map(function(e){return e.charCodeAt(0)}).values());!(t=i()).done;){var o=t.value;this.write(r?5===o?-5:o-5:o)}},o.writeLine=function(e,n){void 0===n&&(n=!0),e&&this.writeString(e,n),this.writeString("\r\n",!1)},o.seek=function(e){this.cursor=e},r=e,(i=[{key:"eof",get:function(){return this.cursor>=this.content.byteLength}}])&&function(e,n){for(var r=0;r<n.length;r++){var t=n[r];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(e,t.key,t)}}(r.prototype,i),Object.defineProperty(r,"prototype",{writable:!1}),e}();function o(e){var n=new i(e);return"QSPGAME"===n.readLine(!1)?function(e){e.readLine(!1),e.readLine();for(var n=parseInt(e.readLine()),r=[],t=0;t<n;t++){for(var i=e.readLine(),o=e.readLine().split(/\r?\n/),a=e.readLine().split(/\r?\n/),s=parseInt(e.readLine()),u=[],c=0;c<s;++c){var d=e.readLine(),f=e.readLine(),h=e.readLine().split(/\r?\n/);u.push({image:d,name:f,code:h})}r.push({name:i,description:o,code:a,actions:u})}return r}(n):function(e){e.seek(0);var n=parseInt(e.readLine(!1));e.readLine(),e.readLine(!1);for(var r=0;r<27;r++)e.readLine();for(var t=[],i=0;i<n;i++){for(var o=e.readLine(),a=e.readLine().split(/\r?\n/),s=e.readLine().split(/\r?\n/),u=[],c=0;c<20;++c){var d=e.readLine(),f=e.readLine().split(/\r?\n/);d&&u.push({name:d,code:f})}t.push({name:o,description:a,code:s,actions:u})}return t}(n)}var a=["'",'"'];function s(e){for(var r,t=[],i=!1,o=null,s=[],u="",c=0,d=n(e.split(/\r?\n/));!(r=d()).done;){var f=r.value;if(i){if(!u&&!c&&f.startsWith("-")){i=!1,o&&(o.code=s,s=[],t.push(o),o=null);continue}s.push(f);for(var h=f.split(""),l=0;l<h.length;++l){var v=h[l];u?v==u&&(h[l+1]==u?l++:u=""):"{"==v?++c:"}"==v?c&&--c:a.includes(v)&&(u=v)}}else f.startsWith("#")&&(i=!0,o={name:f.slice("#".length).trim(),description:[],code:[],actions:[]})}return i&&o&&(o.code=s,t.push(o)),t}function u(e){var r=new i;r.writeLine("QSPGAME",!1),r.writeLine("@qsp/converters 1.0",!1),r.writeLine("No"),r.writeLine(String(e.length));for(var t,o=n(e);!(t=o()).done;){var a=t.value;r.writeLine(a.name),r.writeLine(a.description.join("\r\n")),r.writeLine(a.code.join("\r\n")),r.writeLine(String(a.actions.length));for(var s,u=n(a.actions);!(s=u()).done;){var c,d=s.value;r.writeLine(null!=(c=d.image)?c:""),r.writeLine(d.name),r.writeLine(d.code.join("\r\n"))}}return r.finalize()}function c(e){return e.replace(/'/g,"''")}function d(e,n){return void 0===n&&(n="\n"),e.map(function(e){return function(e,n){var r=function(e,n){return e.map(function(r,t){return(t===e.length-1?"*p":"*pl")+" '"+c(r)+"'"+n}).join("")}(e.description,n),t=e.code.length?e.code.join(n)+n:"",i=function(e,n){return e.length?e.map(function(e){return function(e,n){var r=c(e.name),t=e.image?", '"+c(e.image)+"'":"",i=e.code.map(function(e){return" "+e+n}).join("");return"act '"+r+"'"+t+":"+n+i+"end"}(e,n)}).join(n)+n:""}(e.actions,n);return"# "+e.name+n+r+i+t+"--- "+e.name+" ---------------------------------"+n}(e,n)}).join(n)}export{o as readQsp,s as readQsps,u as writeQsp,d as writeQsps};
1
+ function e(e,n){(null==n||n>e.length)&&(n=e.length);for(var r=0,t=new Array(n);r<n;r++)t[r]=e[r];return t}function n(n,r){var t="undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(t)return(t=t.call(n)).next.bind(t);if(Array.isArray(n)||(t=function(n,r){if(n){if("string"==typeof n)return e(n,r);var t=Object.prototype.toString.call(n).slice(8,-1);return"Object"===t&&n.constructor&&(t=n.constructor.name),"Map"===t||"Set"===t?Array.from(n):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?e(n,r):void 0}}(n))||r&&n&&"number"==typeof n.length){t&&(n=t);var i=0;return function(){return i>=n.length?{done:!0}:{done:!1,value:n[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r=[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,32,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103];function t(e){return String.fromCharCode(e>=128?r[e-128]:e)}var i=/*#__PURE__*/function(){function e(e){this.cursor=0,this.content=void 0,this.view=void 0,this.isUnicode=void 0,this.content=null!=e?e:new ArrayBuffer(256),this.view=new DataView(this.content),this.isUnicode=0===this.view.getUint8(1)}var r,i,o=e.prototype;return o.ensureSize=function(e){if(!(this.content.byteLength>=e)){var n=new ArrayBuffer(2*this.content.byteLength);new Uint8Array(n).set(new Uint8Array(this.content)),this.content=n,this.view=new DataView(this.content)}},o.finalize=function(){return this.content=this.content.slice(0,this.cursor),this.content},o.read=function(){var e=this.cursor;return this.cursor+=this.isUnicode?Uint16Array.BYTES_PER_ELEMENT:Uint8Array.BYTES_PER_ELEMENT,this.isUnicode?this.view.getUint16(e,!0):this.view.getUint8(e)},o.readLine=function(e){void 0===e&&(e=!0);for(var n=[];!this.eof;){var r=this.read();if(13===r){this.read();break}n.push(e?-5===r?5:r+5:r)}return this.isUnicode?n.map(function(e){return String.fromCharCode(e)}).join(""):n.map(t).join("")},o.write=function(e){this.ensureSize(this.cursor+Int16Array.BYTES_PER_ELEMENT);var n=this.cursor;this.cursor+=Int16Array.BYTES_PER_ELEMENT,this.view.setUint16(n,e,!0)},o.writeString=function(e,r){void 0===r&&(r=!0);for(var t,i=n(e.split("").map(function(e){return e.charCodeAt(0)}).values());!(t=i()).done;){var o=t.value;this.write(r?5===o?-5:o-5:o)}},o.writeLine=function(e,n){void 0===n&&(n=!0),e&&this.writeString(e,n),this.writeString("\r\n",!1)},o.seek=function(e){this.cursor=e},r=e,(i=[{key:"eof",get:function(){return this.cursor>=this.content.byteLength}}])&&function(e,n){for(var r=0;r<n.length;r++){var t=n[r];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(e,t.key,t)}}(r.prototype,i),Object.defineProperty(r,"prototype",{writable:!1}),e}();function o(e){var n=new i(e);return"QSPGAME"===n.readLine(!1)?function(e){e.readLine(!1),e.readLine();for(var n=parseInt(e.readLine()),r=[],t=0;t<n;t++){var i=e.readLine(),o=e.readLine().split(/\r?\n/);1===o.length&&""===o[0]&&(o=[]);for(var a=e.readLine().split(/\r?\n/),s=parseInt(e.readLine()),u=[],c=0;c<s;++c){var d=e.readLine(),f=e.readLine(),h=e.readLine().split(/\r?\n/);u.push({image:d,name:f,code:h})}r.push({name:i,description:o,code:a,actions:u})}return r}(n):function(e){e.seek(0);var n=parseInt(e.readLine(!1));e.readLine(),e.readLine(!1);for(var r=0;r<27;r++)e.readLine();for(var t=[],i=0;i<n;i++){for(var o=e.readLine(),a=e.readLine().split(/\r?\n/),s=e.readLine().split(/\r?\n/),u=[],c=0;c<20;++c){var d=e.readLine(),f=e.readLine().split(/\r?\n/);d&&u.push({name:d,code:f})}t.push({name:o,description:a,code:s,actions:u})}return t}(n)}var a=["'",'"'];function s(e){for(var r,t=[],i=!1,o=null,s=[],u="",c=0,d=n(e.split(/\r?\n/));!(r=d()).done;){var f=r.value;if(i){if(!u&&!c&&f.startsWith("-")){i=!1,o&&(o.code=s,s=[],t.push(o),o=null);continue}s.push(f);for(var h=f.split(""),l=0;l<h.length;++l){var v=h[l];u?v==u&&(h[l+1]==u?l++:u=""):"{"==v?++c:"}"==v?c&&--c:a.includes(v)&&(u=v)}}else f.startsWith("#")&&(i=!0,o={name:f.slice("#".length).trim(),description:[],code:[],actions:[]})}return i&&o&&(o.code=s,t.push(o)),t}function u(e){var r=new i;r.writeLine("QSPGAME",!1),r.writeLine("@qsp/converters 1.0",!1),r.writeLine("No"),r.writeLine(String(e.length));for(var t,o=n(e);!(t=o()).done;){var a=t.value;r.writeLine(a.name),r.writeLine(a.description.join("\r\n")),r.writeLine(a.code.join("\r\n")),r.writeLine(String(a.actions.length));for(var s,u=n(a.actions);!(s=u()).done;){var c,d=s.value;r.writeLine(null!=(c=d.image)?c:""),r.writeLine(d.name),r.writeLine(d.code.join("\r\n"))}}return r.finalize()}function c(e){return e.replace(/'/g,"''")}function d(e,n){return void 0===n&&(n="\n"),e.map(function(e){return function(e,n){var r=function(e,n){return e.map(function(r,t){return(t===e.length-1?"*p":"*pl")+" '"+c(r)+"'"+n}).join("")}(e.description,n),t=e.code.length?e.code.join(n)+n:"",i=function(e,n){return e.length?e.map(function(e){return function(e,n){var r=c(e.name),t=e.image?", '"+c(e.image)+"'":"",i=e.code.map(function(e){return" "+e+n}).join("");return"act '"+r+"'"+t+":"+n+i+"end"}(e,n)}).join(n)+n:""}(e.actions,n);return"# "+e.name+n+r+i+t+"--- "+e.name+" ---------------------------------"+n}(e,n)}).join(n)}export{o as readQsp,s as readQsps,u as writeQsp,d as writeQsps};
2
2
  //# sourceMappingURL=index.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.module.js","sources":["../src/qsp-byte-stream.ts","../src/readers/qsp.ts","../src/readers/qsps.ts","../src/writers/qsp.ts","../src/writers/qsps.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 { 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 const description = stream.readLine().split(/\\r?\\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';\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 { 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","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"],"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","readQsp","stream","locCount","parseInt","locations","i","name","description","code","actsCount","actions","j","image","actionName","actionCode","readNewFormat","readOldFormat","QSP_QUOTES","readQsps","isInLoc","curLoc","locCode","quote","quotesCount","line","startsWith","length","_char","includes","trim","writeQsp","location","_step2","_iterator2","action","_action$image","escapeQspString","replace","writeQsps","linebreak","convertLocation","lines","index","convertDescription","convertAction","convertActions"],"mappings":"szBAAO,IAMmBA,EAAa,CACrC,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,GAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,IAAQ,KAAQ,KAAQ,KAChE,IAAQ,KAAQ,IAAQ,IAAQ,KAAQ,IAAQ,KAAQ,IAAQ,IAChE,IAAQ,IAAQ,KAAQ,IAAQ,IAAQ,KAAQ,KAAQ,KAAQ,IAChE,IAAQ,IAAQ,KAAQ,KAAQ,KAAQ,IAAQ,KAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAChE,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAChE,KAAQ,MAGV,SAASC,EAAcC,GACrB,OAAaC,OAACC,aACZF,GAAQ,IAAOF,EAAqBE,EAAO,KAAQA,GAI1CG,IAAAA,0BAMX,SAAmBC,EAAAA,GALXC,KAAAA,OAAS,EAK0BC,KAJnCC,aACAC,EAAAA,KAAAA,iBACAC,eAEmC,EACzCH,KAAKC,QAAUH,MAAAA,EAAAA,EAAc,IAAIM,YAAY,KAC7CJ,KAAKE,KAAO,IAAAG,SAAaL,KAAKC,SAC9BD,KAAKG,UAAsC,IAA1BH,KAAKE,KAAKI,SAAS,GATxC,QAYUC,EAAAA,EAAAA,UAZV,OAYUA,EAAAA,WAAA,SAAWC,GACjB,KAAIR,KAAKC,QAAQQ,YAAcD,GAA/B,CACA,MACe,gBAD6B,EAA1BR,KAAKC,QAAQQ,YAE/B,eAAeC,GAAQC,IAAI,IAAAC,WAAeZ,KAAKC,UAC/CD,KAAKC,QAAUS,EACfV,KAAKE,KAAO,IAAAG,SAAaL,KAAKC,WAGzBY,EAAAA,SAAA,WAEL,OADAb,KAAKC,QAAUD,KAAKC,QAAQa,MAAM,EAAGd,KAAKD,aAC9BE,WAOPc,KAAA,WACL,MAAiBf,KAAKD,OAItB,OAHAC,KAAKD,QAAUC,KAAKG,UAChBa,YAAYC,kBACZL,WAAWK,kBACRjB,KAAKG,UACRH,KAAKE,KAAKgB,UAAUC,GAAU,GAC9BnB,KAAKE,KAAKI,SAASa,IAGlBC,EAAAA,SAAA,SAASC,YAAAA,IAAAA,GAAe,GAE7B,IADA,MAAwB,IAChBrB,KAAKsB,KAAK,CAChB,IAAM5B,EAAOM,KAAKe,OAClB,GAAa,KAATrB,EAAe,CACjBM,KAAKe,OACL,MAGAQ,EAAMC,KADJH,GA9EkB,IA+ET3B,EA/ES,EA+E+BA,EA/E/B,EAiFTA,GAGf,OAAYS,KAAAA,UAERoB,EAAME,IAAI,SAAA/B,GAAQC,OAAAA,OAAOC,aAAaF,KAAOgC,KAAK,IAClDH,EAAME,IAAIhC,GAAeiC,KAAK,KAG7BC,EAAAA,MAAA,SAAMC,GACX5B,KAAKO,WAAWP,KAAKD,OAAS8B,WAAWZ,mBACzC,IAAcE,EAAGnB,KAAKD,OACtBC,KAAKD,QAAU8B,WAAWZ,kBAC1BjB,KAAKE,KAAK4B,UAAUX,EAAUS,GAAO,IAGhCG,EAAAA,YAAA,SAAYC,EAAeC,QAAmB,IAAnBA,IAAAA,GAAe,GAE/C,IADA,IACwCC,EAAxCC,EAAAC,EADkBJ,EAAMK,MAAM,IAAIZ,IAAI,SAAC/B,GAAD,SAAuB4C,WAAW,KAC1CC,YAAUL,EAAAC,KAAAK,MAAA,CAAA,MACtCN,EAAAN,MACE5B,KAAK2B,MADHM,EApGkB,IAsGlBQ,GAtGkB,EAsGuBA,EAtGvB,EAyGTA,KAKVC,EAAAA,UAAA,SAAUV,EAAeC,QAAAA,IAAAA,IAAAA,GAAe,GAC7CD,GAAShC,KAAK+B,YAAYC,EAAOC,GACjCjC,KAAK+B,YA/Ga,QA+Gc,MAG3BY,KAAA,SAAKC,GACV5C,KAAKD,OAAS6C,0BA5DhB,WACE,OAAY7C,KAAAA,QAAUC,KAAKC,QAAQQ,uPA3BvCZ,KC8BgBgD,SAAAA,EAAQnC,GACtB,IAAYoC,EAAG,IAAAjD,EAAkBa,GAEjC,MD7DwB,YC4DToC,EAAO1B,UAAS,GAzDjC,SAAuB0B,GACrBA,EAAO1B,UAAS,GAChB0B,EAAO1B,WAKP,IAJA,IAAM2B,EAAWC,SAASF,EAAO1B,YAE3B6B,EAA2B,GAEvBC,EAAG,EAAGA,EAAIH,EAAUG,IAAK,CAOjC,IANA,IAAMC,EAAOL,EAAO1B,WACdgC,EAAcN,EAAO1B,WAAWiB,MAAM,SACtCgB,EAAOP,EAAO1B,WAAWiB,MAAM,SAEtBiB,EAAGN,SAASF,EAAO1B,YACrBmC,EAAgB,GACpBC,EAAI,EAAGA,EAAIF,IAAaE,EAAG,CAClC,IAAMC,EAAQX,EAAO1B,WACfsC,EAAaZ,EAAO1B,aACP0B,EAAO1B,WAAWiB,MAAM,SAC3CkB,EAAQ/B,KAAK,CAAEiC,MAAAA,EAAON,KAAMO,EAAYL,KAAMM,IAEhDV,EAAUzB,KAAK,CAAE2B,KAAAA,EAAMC,YAAAA,EAAaC,KAAAA,EAAME,QAAAA,IAE5C,SAqCsBK,CAACd,GAlCzB,SAAuBA,GACrBA,EAAOH,KAAK,GACZ,IAAMI,EAAWC,SAASF,EAAO1B,UAAS,IAC1C0B,EAAO1B,WACP0B,EAAO1B,UAAS,GAChB,IAAK,IAAI8B,EAAI,EAAGA,EAAI,GAAIA,IAEtBJ,EAAO1B,WAIT,IAFA,IAAe6B,EAAkB,GAExBC,EAAI,EAAGA,EAAIH,EAAUG,IAAK,CAMjC,IALA,IAAUC,EAAGL,EAAO1B,WACHgC,EAAGN,EAAO1B,WAAWiB,MAAM,SAClCgB,EAAGP,EAAO1B,WAAWiB,MAAM,WAER,GACpBmB,EAAI,EAAGA,EAPA,KAOiBA,EAAG,CAClC,IAAgBE,EAAGZ,EAAO1B,aACP0B,EAAO1B,WAAWiB,MAAM,SACvCqB,GACFH,EAAQ/B,KAAK,CAAE2B,KAAMO,EAAYL,KAAMM,IAG3CV,EAAUzB,KAAK,CAAE2B,KAAAA,EAAMC,YAAAA,EAAaC,KAAAA,EAAME,QAAAA,IAG5C,OAAON,EAUAY,CAAcf,GCjEvB,IAEgBgB,EAAG,CAAC,IAAK,cAInBC,EAAmB9D,GASvB,IARA,IAQAiC,EARMe,EAA2B,GAEtBe,GAAG,EACJC,EAAuB,KACtBC,EAAa,GAEfC,EAAG,GACGC,EAAG,EAClBjC,EAAAC,EAHcnC,EAAQoC,MAAM,YAG5BH,EAAAC,KAAAK,MAA0B,CAAf6B,IAAAA,EACTnC,EAAAN,MAAA,GAAIoC,EAAS,CACX,IAAKG,IAAUC,GACTC,EAAKC,WAjBE,KAiBsB,CAC/BN,GAAU,EACNC,IACFA,EAAOZ,KAAOa,EACdA,EAAU,GACVjB,EAAUzB,KAAKyC,GACfA,EAAS,MAEX,SAGJC,EAAQ1C,KAAK6C,GAEb,IADA,IAAM9C,EAAQ8C,EAAKhC,MAAM,MACZ,EAAGa,EAAI3B,EAAMgD,SAAUrB,EAAG,CACrC,IAAUsB,EAAGjD,EAAM2B,GACfiB,EACEzE,GAAQyE,IACN5C,EAAM2B,EAAI,IAAMiB,EAClBjB,IAEAiB,EAAQ,IAnCH,KAuCLzE,IAAsB0E,EAtCjB,KAuCA1E,EACH0E,KAAeA,EACVN,EAAWW,SAAS/E,KAAOyE,EAAQzE,SAI9C2E,EAAKC,WAjDM,OAkDbN,GAAU,EACVC,EAAS,CACPd,KAAMkB,EAAKvD,MApDA,IAoDmByD,QAAQG,OACtCtB,YAAa,GACbC,KAAM,GACNE,QAAS,KAWjB,OALIS,GAAWC,IACbA,EAAOZ,KAAOa,EACdjB,EAAUzB,KAAKyC,IAIlBhB,WClEK0B,EAAmB1B,GACvB,IAAMH,EAAS,MAEfA,EAAOJ,UHJiB,WGIK,GAC7BI,EAAOJ,UAAU,uBAAuB,GACxCI,EAAOJ,UHLiB,MGMxBI,EAAOJ,UAAU/C,OAAOsD,EAAUsB,SAElC,IAAuBtB,IAAWf,EAAXe,EAAAA,EAAAA,KAAWf,EAAAC,KAAAK,MAAA,CAAA,MAChCM,EAAAA,MAAAA,EAAOJ,UAAUkC,EAASzB,MAC1BL,EAAOJ,UAAUkC,EAASxB,YAAY1B,KAAK,SAC3CoB,EAAOJ,UAAUkC,EAASvB,KAAK3B,KAAK,SAEpCoB,EAAOJ,UAAU/C,OAAOiF,EAASrB,QAAQgB,SACzC,QAAAM,MAAqBD,EAASrB,WAA9BsB,EAAAC,KAAAtC,MAAuC,OAAAuC,EAAAF,EAAAjD,MACrCkB,EAAOJ,UAA0B,OAAjCsC,EAAiBD,EAAOtB,OAASuB,EAAA,IACjClC,EAAOJ,UAAUqC,EAAO5B,MACxBL,EAAOJ,UAAUqC,EAAO1B,KAAK3B,KAAK,UAGtC,OAAaoB,EAACjC,WCrBhB,SAAAoE,EAAyBjD,GACvB,OAAYA,EAACkD,QAAQ,KAAM,MA4BbC,SAAAA,EAAUlC,EAA0BmC,GAClD,YADkE,IAAhBA,IAAAA,EAAY,MAC9CnC,EAACxB,IAAI,SAACmD,GAAaS,OARrC,SAAyBT,EAAuBQ,GAC9C,IAAiBhC,EAnBnB,SAA4BkC,EAAiBF,GAC3C,OAAOE,EACJ7D,IAAI,SAAC4C,EAAMkB,GAAaA,OAAAA,IAAUD,EAAMf,OAAS,EAAI,KAAO,OAAUU,KAAAA,EAAgBZ,GAASe,IAAAA,IAC/F1D,KAAK,IAgBY8D,CAAmBZ,EAASxB,YAAagC,GACvD/B,EAAOuB,EAASvB,KAAKkB,OAASK,EAASvB,KAAK3B,KAAK0D,GAAaA,EAAY,GAC1E7B,EARR,SAAwBA,EAAsB6B,GAC5C,OAAK7B,EAAQgB,OACChB,EAAC9B,IAAI,SAACsD,UATtB,SAAuBA,EAAmBK,GACxC,IAAMjC,EAAO8B,EAAgBF,EAAO5B,MAC9BM,EAAQsB,EAAOtB,MAAP,MAAqBwB,EAAgBF,EAAOtB,OAAY,IAAA,GAC5DJ,EAAG0B,EAAO1B,KAAK5B,IAAI,SAAC4C,GAAD,MAAA,KAAeA,EAAOe,IAAa1D,KAAK,IACrE,cAAeyB,EAAf,IAAuBM,EAAvB,IAAgC2B,EAAY/B,EAA5C,MAK4CoC,CAACV,EAAQK,KAAY1D,KAAK0D,GAAaA,EADvD,GAOZM,CAAed,EAASrB,QAAS6B,GACjD,WAAYR,EAASzB,KAAOiC,EAAYhC,EAAcG,EAAUF,EAAhE,OAA2EuB,EAASzB,KAApF,qCAA6HiC,EAI1FC,CAAgBT,EAAUQ,KAAY1D,KAAK0D"}
1
+ {"version":3,"file":"index.module.js","sources":["../src/qsp-byte-stream.ts","../src/readers/qsp.ts","../src/readers/qsps.ts","../src/writers/qsp.ts","../src/writers/qsps.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 { 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';\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 { 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","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"],"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","stream","locCount","parseInt","locations","i","description","length","code","actsCount","actions","j","image","actionName","actionCode","name","readNewFormat","readOldFormat","QSP_QUOTES","readQsps","isInLoc","curLoc","locCode","quote","quotesCount","line","startsWith","_char","includes","trim","writeQsp","location","_step2","_iterator2","action","_action$image","escapeQspString","replace","writeQsps","linebreak","convertLocation","lines","index","convertDescription","convertAction","convertActions"],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e||self).converters={})}(this,function(e){function n(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=new Array(n);t<n;t++)r[t]=e[t];return r}function t(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(r)return(r=r.call(e)).next.bind(r);if(Array.isArray(e)||(r=function(e,t){if(e){if("string"==typeof e)return n(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?n(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var i=0;return function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r="QSPGAME",i=[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,32,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103];function o(e){return String.fromCharCode(e>=128?i[e-128]:e)}var a=/*#__PURE__*/function(){function e(e){this.cursor=0,this.content=void 0,this.view=void 0,this.isUnicode=void 0,this.content=null!=e?e:new ArrayBuffer(256),this.view=new DataView(this.content),this.isUnicode=0===this.view.getUint8(1)}var n,r,i=e.prototype;return i.ensureSize=function(e){if(!(this.content.byteLength>=e)){var n=new ArrayBuffer(2*this.content.byteLength);new Uint8Array(n).set(new Uint8Array(this.content)),this.content=n,this.view=new DataView(this.content)}},i.finalize=function(){return this.content=this.content.slice(0,this.cursor),this.content},i.read=function(){var e=this.cursor;return this.cursor+=this.isUnicode?Uint16Array.BYTES_PER_ELEMENT:Uint8Array.BYTES_PER_ELEMENT,this.isUnicode?this.view.getUint16(e,!0):this.view.getUint8(e)},i.readLine=function(e){void 0===e&&(e=!0);for(var n=[];!this.eof;){var t=this.read();if(13===t){this.read();break}n.push(e?-5===t?5:t+5:t)}return this.isUnicode?n.map(function(e){return String.fromCharCode(e)}).join(""):n.map(o).join("")},i.write=function(e){this.ensureSize(this.cursor+Int16Array.BYTES_PER_ELEMENT);var n=this.cursor;this.cursor+=Int16Array.BYTES_PER_ELEMENT,this.view.setUint16(n,e,!0)},i.writeString=function(e,n){void 0===n&&(n=!0);for(var r,i=t(e.split("").map(function(e){return e.charCodeAt(0)}).values());!(r=i()).done;){var o=r.value;this.write(n?5===o?-5:o-5:o)}},i.writeLine=function(e,n){void 0===n&&(n=!0),e&&this.writeString(e,n),this.writeString("\r\n",!1)},i.seek=function(e){this.cursor=e},n=e,(r=[{key:"eof",get:function(){return this.cursor>=this.content.byteLength}}])&&function(e,n){for(var t=0;t<n.length;t++){var r=n[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(n.prototype,r),Object.defineProperty(n,"prototype",{writable:!1}),e}(),s=["'",'"'];function u(e){return e.replace(/'/g,"''")}e.readQsp=function(e){var n=new a(e);return n.readLine(!1)===r?function(e){e.readLine(!1),e.readLine();for(var n=parseInt(e.readLine()),t=[],r=0;r<n;r++){for(var i=e.readLine(),o=e.readLine().split(/\r?\n/),a=e.readLine().split(/\r?\n/),s=parseInt(e.readLine()),u=[],c=0;c<s;++c){var f=e.readLine(),d=e.readLine(),h=e.readLine().split(/\r?\n/);u.push({image:f,name:d,code:h})}t.push({name:i,description:o,code:a,actions:u})}return t}(n):function(e){e.seek(0);var n=parseInt(e.readLine(!1));e.readLine(),e.readLine(!1);for(var t=0;t<27;t++)e.readLine();for(var r=[],i=0;i<n;i++){for(var o=e.readLine(),a=e.readLine().split(/\r?\n/),s=e.readLine().split(/\r?\n/),u=[],c=0;c<20;++c){var f=e.readLine(),d=e.readLine().split(/\r?\n/);f&&u.push({name:f,code:d})}r.push({name:o,description:a,code:s,actions:u})}return r}(n)},e.readQsps=function(e){for(var n,r=[],i=!1,o=null,a=[],u="",c=0,f=t(e.split(/\r?\n/));!(n=f()).done;){var d=n.value;if(i){if(!u&&!c&&d.startsWith("-")){i=!1,o&&(o.code=a,a=[],r.push(o),o=null);continue}a.push(d);for(var h=d.split(""),l=0;l<h.length;++l){var p=h[l];u?p==u&&(h[l+1]==u?l++:u=""):"{"==p?++c:"}"==p?c&&--c:s.includes(p)&&(u=p)}}else d.startsWith("#")&&(i=!0,o={name:d.slice("#".length).trim(),description:[],code:[],actions:[]})}return i&&o&&(o.code=a,r.push(o)),r},e.writeQsp=function(e){var n=new a;n.writeLine(r,!1),n.writeLine("@qsp/converters 1.0",!1),n.writeLine("No"),n.writeLine(String(e.length));for(var i,o=t(e);!(i=o()).done;){var s=i.value;n.writeLine(s.name),n.writeLine(s.description.join("\r\n")),n.writeLine(s.code.join("\r\n")),n.writeLine(String(s.actions.length));for(var u,c=t(s.actions);!(u=c()).done;){var f,d=u.value;n.writeLine(null!=(f=d.image)?f:""),n.writeLine(d.name),n.writeLine(d.code.join("\r\n"))}}return n.finalize()},e.writeQsps=function(e,n){return void 0===n&&(n="\n"),e.map(function(e){return function(e,n){var t=function(e,n){return e.map(function(t,r){return(r===e.length-1?"*p":"*pl")+" '"+u(t)+"'"+n}).join("")}(e.description,n),r=e.code.length?e.code.join(n)+n:"",i=function(e,n){return e.length?e.map(function(e){return function(e,n){var t=u(e.name),r=e.image?", '"+u(e.image)+"'":"",i=e.code.map(function(e){return" "+e+n}).join("");return"act '"+t+"'"+r+":"+n+i+"end"}(e,n)}).join(n)+n:""}(e.actions,n);return"# "+e.name+n+t+i+r+"--- "+e.name+" ---------------------------------"+n}(e,n)}).join(n)}});
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e||self).converters={})}(this,function(e){function n(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=new Array(n);t<n;t++)r[t]=e[t];return r}function t(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(r)return(r=r.call(e)).next.bind(r);if(Array.isArray(e)||(r=function(e,t){if(e){if("string"==typeof e)return n(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?n(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var i=0;return function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r="QSPGAME",i=[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,32,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103];function o(e){return String.fromCharCode(e>=128?i[e-128]:e)}var a=/*#__PURE__*/function(){function e(e){this.cursor=0,this.content=void 0,this.view=void 0,this.isUnicode=void 0,this.content=null!=e?e:new ArrayBuffer(256),this.view=new DataView(this.content),this.isUnicode=0===this.view.getUint8(1)}var n,r,i=e.prototype;return i.ensureSize=function(e){if(!(this.content.byteLength>=e)){var n=new ArrayBuffer(2*this.content.byteLength);new Uint8Array(n).set(new Uint8Array(this.content)),this.content=n,this.view=new DataView(this.content)}},i.finalize=function(){return this.content=this.content.slice(0,this.cursor),this.content},i.read=function(){var e=this.cursor;return this.cursor+=this.isUnicode?Uint16Array.BYTES_PER_ELEMENT:Uint8Array.BYTES_PER_ELEMENT,this.isUnicode?this.view.getUint16(e,!0):this.view.getUint8(e)},i.readLine=function(e){void 0===e&&(e=!0);for(var n=[];!this.eof;){var t=this.read();if(13===t){this.read();break}n.push(e?-5===t?5:t+5:t)}return this.isUnicode?n.map(function(e){return String.fromCharCode(e)}).join(""):n.map(o).join("")},i.write=function(e){this.ensureSize(this.cursor+Int16Array.BYTES_PER_ELEMENT);var n=this.cursor;this.cursor+=Int16Array.BYTES_PER_ELEMENT,this.view.setUint16(n,e,!0)},i.writeString=function(e,n){void 0===n&&(n=!0);for(var r,i=t(e.split("").map(function(e){return e.charCodeAt(0)}).values());!(r=i()).done;){var o=r.value;this.write(n?5===o?-5:o-5:o)}},i.writeLine=function(e,n){void 0===n&&(n=!0),e&&this.writeString(e,n),this.writeString("\r\n",!1)},i.seek=function(e){this.cursor=e},n=e,(r=[{key:"eof",get:function(){return this.cursor>=this.content.byteLength}}])&&function(e,n){for(var t=0;t<n.length;t++){var r=n[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}(n.prototype,r),Object.defineProperty(n,"prototype",{writable:!1}),e}(),s=["'",'"'];function u(e){return e.replace(/'/g,"''")}e.readQsp=function(e){var n=new a(e);return n.readLine(!1)===r?function(e){e.readLine(!1),e.readLine();for(var n=parseInt(e.readLine()),t=[],r=0;r<n;r++){var i=e.readLine(),o=e.readLine().split(/\r?\n/);1===o.length&&""===o[0]&&(o=[]);for(var a=e.readLine().split(/\r?\n/),s=parseInt(e.readLine()),u=[],c=0;c<s;++c){var f=e.readLine(),d=e.readLine(),h=e.readLine().split(/\r?\n/);u.push({image:f,name:d,code:h})}t.push({name:i,description:o,code:a,actions:u})}return t}(n):function(e){e.seek(0);var n=parseInt(e.readLine(!1));e.readLine(),e.readLine(!1);for(var t=0;t<27;t++)e.readLine();for(var r=[],i=0;i<n;i++){for(var o=e.readLine(),a=e.readLine().split(/\r?\n/),s=e.readLine().split(/\r?\n/),u=[],c=0;c<20;++c){var f=e.readLine(),d=e.readLine().split(/\r?\n/);f&&u.push({name:f,code:d})}r.push({name:o,description:a,code:s,actions:u})}return r}(n)},e.readQsps=function(e){for(var n,r=[],i=!1,o=null,a=[],u="",c=0,f=t(e.split(/\r?\n/));!(n=f()).done;){var d=n.value;if(i){if(!u&&!c&&d.startsWith("-")){i=!1,o&&(o.code=a,a=[],r.push(o),o=null);continue}a.push(d);for(var h=d.split(""),l=0;l<h.length;++l){var p=h[l];u?p==u&&(h[l+1]==u?l++:u=""):"{"==p?++c:"}"==p?c&&--c:s.includes(p)&&(u=p)}}else d.startsWith("#")&&(i=!0,o={name:d.slice("#".length).trim(),description:[],code:[],actions:[]})}return i&&o&&(o.code=a,r.push(o)),r},e.writeQsp=function(e){var n=new a;n.writeLine(r,!1),n.writeLine("@qsp/converters 1.0",!1),n.writeLine("No"),n.writeLine(String(e.length));for(var i,o=t(e);!(i=o()).done;){var s=i.value;n.writeLine(s.name),n.writeLine(s.description.join("\r\n")),n.writeLine(s.code.join("\r\n")),n.writeLine(String(s.actions.length));for(var u,c=t(s.actions);!(u=c()).done;){var f,d=u.value;n.writeLine(null!=(f=d.image)?f:""),n.writeLine(d.name),n.writeLine(d.code.join("\r\n"))}}return n.finalize()},e.writeQsps=function(e,n){return void 0===n&&(n="\n"),e.map(function(e){return function(e,n){var t=function(e,n){return e.map(function(t,r){return(r===e.length-1?"*p":"*pl")+" '"+u(t)+"'"+n}).join("")}(e.description,n),r=e.code.length?e.code.join(n)+n:"",i=function(e,n){return e.length?e.map(function(e){return function(e,n){var t=u(e.name),r=e.image?", '"+u(e.image)+"'":"",i=e.code.map(function(e){return" "+e+n}).join("");return"act '"+t+"'"+r+":"+n+i+"end"}(e,n)}).join(n)+n:""}(e.actions,n);return"# "+e.name+n+t+i+r+"--- "+e.name+" ---------------------------------"+n}(e,n)}).join(n)}});
2
2
  //# sourceMappingURL=index.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","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 const description = stream.readLine().split(/\\r?\\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":["QSP_GAMEID","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","readQsp","stream","locCount","parseInt","locations","i","name","description","code","actsCount","actions","j","image","actionName","actionCode","readNewFormat","readOldFormat","isInLoc","curLoc","locCode","quote","quotesCount","line","startsWith","length","_char","includes","trim","location","_step2","_iterator2","action","_action$image","writeQsps","linebreak","convertLocation","lines","index","convertDescription","convertAction","convertActions"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","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":["QSP_GAMEID","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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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@qsp/converters",
3
3
  "type": "module",
4
- "version": "1.0.0",
4
+ "version": "1.0.1",
5
5
  "description": "Converters of different file formats for QSP platform",
6
6
  "keywords": [
7
7
  "qsp",