mca-json 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/nbt/snbt-parse.d.ts.map +1 -1
- package/dist/nbt/snbt-parse.js +7 -4
- package/dist/nbt/snbt-parse.js.map +1 -1
- package/dist/nbt/snbt-to-nbt.js +14 -4
- package/dist/nbt/snbt-to-nbt.js.map +1 -1
- package/package.json +2 -2
- package/src/nbt/snbt-parse.ts +7 -4
- package/src/nbt/snbt-to-nbt.ts +63 -20
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snbt-parse.d.ts","sourceRoot":"","sources":["../../src/nbt/snbt-parse.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAiB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"snbt-parse.d.ts","sourceRoot":"","sources":["../../src/nbt/snbt-parse.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAiB,MAAM,aAAa,CAAC;AA4OtD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,YAqBrC"}
|
package/dist/nbt/snbt-parse.js
CHANGED
|
@@ -16,6 +16,7 @@ const tokenParsers = [
|
|
|
16
16
|
type: 'WHITESPACE',
|
|
17
17
|
pattern: /^\s+/,
|
|
18
18
|
callback: (_pos, _type, _snbtData, matches) => {
|
|
19
|
+
// Do not generate a token for whitespace.
|
|
19
20
|
return matches[0].length;
|
|
20
21
|
},
|
|
21
22
|
},
|
|
@@ -96,8 +97,8 @@ const tokenParsers = [
|
|
|
96
97
|
type: 'BYTE',
|
|
97
98
|
pattern: anchorPattern('([tT][rR][uU][eE]|[fF][aA][lL][sS][eE])'),
|
|
98
99
|
callback: (pos, type, snbtData, matches) => {
|
|
99
|
-
snbtData.addToken(pos, type, matches[
|
|
100
|
-
return matches[
|
|
100
|
+
snbtData.addToken(pos, type, matches[1].toLowerCase() === 'true' ? '1' : '0');
|
|
101
|
+
return matches[1].length;
|
|
101
102
|
},
|
|
102
103
|
},
|
|
103
104
|
{
|
|
@@ -182,9 +183,10 @@ const tokenParsers = [
|
|
|
182
183
|
},
|
|
183
184
|
];
|
|
184
185
|
// Creates a regular expression that will start at the beginning of the string
|
|
185
|
-
// and conclude with an "end of token" marker at the end.
|
|
186
|
+
// and conclude with an "end of token" marker at the end. The lookahead will
|
|
187
|
+
// not capture the end of the token marker.
|
|
186
188
|
function anchorPattern(pattern) {
|
|
187
|
-
return new RegExp(`^${pattern}\s*(
|
|
189
|
+
return new RegExp(`^${pattern}\s*(?=$|,|}|]|:)`);
|
|
188
190
|
}
|
|
189
191
|
export function snbtParse(snbt) {
|
|
190
192
|
const snbtData = new SnbtData();
|
|
@@ -194,6 +196,7 @@ export function snbtParse(snbt) {
|
|
|
194
196
|
if (!increment) {
|
|
195
197
|
throw new Error(`Unexpected token at position ${pos}`);
|
|
196
198
|
}
|
|
199
|
+
debugLog(`Increment position by ${increment}`);
|
|
197
200
|
pos += increment;
|
|
198
201
|
}
|
|
199
202
|
return snbtData;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snbt-parse.js","sourceRoot":"","sources":["../../src/nbt/snbt-parse.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport { SnbtData, SnbtTokenType } from './snbt-data';\n\nconst debugLog = debug('snbt:parse');\n\ninterface TokenParser {\n type: SnbtTokenType;\n pattern: RegExp;\n callback: (\n offset: number,\n type: SnbtTokenType,\n snbtData: SnbtData,\n match: RegExpMatchArray\n ) => number;\n}\n\nfunction testParsers(\n snbtData: SnbtData,\n str: string,\n tokenParsers: TokenParser[],\n pos: number\n) {\n for (const { type, pattern, callback } of tokenParsers) {\n const match = str.match(pattern);\n\n if (match) {\n debugLog(`Matched ${type} at position ${pos}: ${match[0]}`);\n\n return callback(pos, type, snbtData, match);\n }\n }\n\n return false;\n}\n\nconst tokenParsers: TokenParser[] = [\n {\n type: 'WHITESPACE',\n pattern: /^\\s+/,\n callback: (_pos, _type, _snbtData, matches) => {\n return matches[0].length;\n },\n },\n {\n type: 'COLON',\n pattern: /^:/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, ':');\n\n return 1;\n },\n },\n {\n type: 'COMMA',\n pattern: /^,/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, ',');\n\n return 1;\n },\n },\n {\n type: 'BYTE_ARRAY_START',\n pattern: /^\\[\\s*[bB]\\s*;/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 3;\n },\n },\n {\n type: 'INT_ARRAY_START',\n pattern: /^\\[\\s*[iI]\\s*;/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 3;\n },\n },\n {\n type: 'LONG_ARRAY_START',\n pattern: /^\\[\\s*[lL]\\s*;/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 3;\n },\n },\n {\n type: 'COMPOUND_START',\n pattern: /^\\{/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '{');\n\n return 1;\n },\n },\n {\n type: 'COMPOUND_END',\n pattern: /^\\}/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '}');\n\n return 1;\n },\n },\n {\n type: 'LIST_START',\n pattern: /^\\[/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 1;\n },\n },\n {\n type: 'LIST_END',\n pattern: /^\\]/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, ']');\n\n return 1;\n },\n },\n {\n // Byte - true / false converts to 1 / 0\n type: 'BYTE',\n pattern: anchorPattern('([tT][rR][uU][eE]|[fF][aA][lL][sS][eE])'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(\n pos,\n type,\n matches[0].toLowerCase() === 'true' ? '1' : '0'\n );\n\n return matches[0].length;\n },\n },\n {\n // Byte - number with a suffix\n type: 'BYTE',\n pattern: anchorPattern('[-+]?[0-9]+[bB]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // Double - there's another without the D later\n type: 'DOUBLE',\n pattern: anchorPattern('[-+]?[0-9.]+[dD]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n type: 'FLOAT',\n pattern: anchorPattern('[-+]?[0-9.]+[fF]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n type: 'LONG',\n pattern: anchorPattern('[-+]?[0-9]+[lL]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n type: 'SHORT',\n pattern: anchorPattern('[-+]?[0-9]+[sS]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // Double - this must come after other suffixed number types but before\n // Int's matcher\n type: 'DOUBLE',\n pattern: anchorPattern('[-+]?[0-9.]+'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // Int - this must come after all other number types\n type: 'INT',\n pattern: anchorPattern('[-+]?[0-9]+'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // String - single or double quotes\n type: 'STRING',\n pattern: /^([\\\"'])(?:\\\\.|.)*?\\1/,\n callback: (pos, type, snbtData, matches) => {\n const chunk = JSON.parse(`\"${matches[0].slice(1, -1)}\"`);\n snbtData.addToken(pos, type, chunk);\n\n return matches[0].length;\n },\n },\n {\n // String - not quoted and all else failed\n type: 'STRING',\n pattern: anchorPattern('^[-0-9a-zA-Z_.+]+'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n];\n\n// Creates a regular expression that will start at the beginning of the string\n// and conclude with an \"end of token\" marker at the end.\nfunction anchorPattern(pattern: string) {\n return new RegExp(`^${pattern}\\s*(?:$|,|}|]|:)`);\n}\n\nexport function snbtParse(snbt: string) {\n const snbtData = new SnbtData();\n let pos = 0;\n\n while (pos < snbt.length) {\n const increment = testParsers(\n snbtData,\n snbt.slice(pos),\n tokenParsers,\n pos\n );\n\n if (!increment) {\n throw new Error(`Unexpected token at position ${pos}`);\n }\n\n pos += increment;\n }\n\n return snbtData;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"snbt-parse.js","sourceRoot":"","sources":["../../src/nbt/snbt-parse.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport { SnbtData, SnbtTokenType } from './snbt-data';\n\nconst debugLog = debug('snbt:parse');\n\ninterface TokenParser {\n type: SnbtTokenType;\n pattern: RegExp;\n callback: (\n offset: number,\n type: SnbtTokenType,\n snbtData: SnbtData,\n match: RegExpMatchArray\n ) => number;\n}\n\nfunction testParsers(\n snbtData: SnbtData,\n str: string,\n tokenParsers: TokenParser[],\n pos: number\n) {\n for (const { type, pattern, callback } of tokenParsers) {\n const match = str.match(pattern);\n\n if (match) {\n debugLog(`Matched ${type} at position ${pos}: ${match[0]}`);\n\n return callback(pos, type, snbtData, match);\n }\n }\n\n return false;\n}\n\nconst tokenParsers: TokenParser[] = [\n {\n type: 'WHITESPACE',\n pattern: /^\\s+/,\n callback: (_pos, _type, _snbtData, matches) => {\n // Do not generate a token for whitespace.\n return matches[0].length;\n },\n },\n {\n type: 'COLON',\n pattern: /^:/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, ':');\n\n return 1;\n },\n },\n {\n type: 'COMMA',\n pattern: /^,/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, ',');\n\n return 1;\n },\n },\n {\n type: 'BYTE_ARRAY_START',\n pattern: /^\\[\\s*[bB]\\s*;/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 3;\n },\n },\n {\n type: 'INT_ARRAY_START',\n pattern: /^\\[\\s*[iI]\\s*;/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 3;\n },\n },\n {\n type: 'LONG_ARRAY_START',\n pattern: /^\\[\\s*[lL]\\s*;/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 3;\n },\n },\n {\n type: 'COMPOUND_START',\n pattern: /^\\{/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '{');\n\n return 1;\n },\n },\n {\n type: 'COMPOUND_END',\n pattern: /^\\}/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '}');\n\n return 1;\n },\n },\n {\n type: 'LIST_START',\n pattern: /^\\[/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 1;\n },\n },\n {\n type: 'LIST_END',\n pattern: /^\\]/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, ']');\n\n return 1;\n },\n },\n {\n // Byte - true / false converts to 1 / 0\n type: 'BYTE',\n pattern: anchorPattern('([tT][rR][uU][eE]|[fF][aA][lL][sS][eE])'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(\n pos,\n type,\n matches[1].toLowerCase() === 'true' ? '1' : '0'\n );\n\n return matches[1].length;\n },\n },\n {\n // Byte - number with a suffix\n type: 'BYTE',\n pattern: anchorPattern('[-+]?[0-9]+[bB]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // Double - there's another without the D later\n type: 'DOUBLE',\n pattern: anchorPattern('[-+]?[0-9.]+[dD]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n type: 'FLOAT',\n pattern: anchorPattern('[-+]?[0-9.]+[fF]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n type: 'LONG',\n pattern: anchorPattern('[-+]?[0-9]+[lL]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n type: 'SHORT',\n pattern: anchorPattern('[-+]?[0-9]+[sS]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // Double - this must come after other suffixed number types but before\n // Int's matcher\n type: 'DOUBLE',\n pattern: anchorPattern('[-+]?[0-9.]+'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // Int - this must come after all other number types\n type: 'INT',\n pattern: anchorPattern('[-+]?[0-9]+'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // String - single or double quotes\n type: 'STRING',\n pattern: /^([\\\"'])(?:\\\\.|.)*?\\1/,\n callback: (pos, type, snbtData, matches) => {\n const chunk = JSON.parse(`\"${matches[0].slice(1, -1)}\"`);\n snbtData.addToken(pos, type, chunk);\n\n return matches[0].length;\n },\n },\n {\n // String - not quoted and all else failed\n type: 'STRING',\n pattern: anchorPattern('^[-0-9a-zA-Z_.+]+'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n];\n\n// Creates a regular expression that will start at the beginning of the string\n// and conclude with an \"end of token\" marker at the end. The lookahead will\n// not capture the end of the token marker.\nfunction anchorPattern(pattern: string) {\n return new RegExp(`^${pattern}\\s*(?=$|,|}|]|:)`);\n}\n\nexport function snbtParse(snbt: string) {\n const snbtData = new SnbtData();\n let pos = 0;\n\n while (pos < snbt.length) {\n const increment = testParsers(\n snbtData,\n snbt.slice(pos),\n tokenParsers,\n pos\n );\n\n if (!increment) {\n throw new Error(`Unexpected token at position ${pos}`);\n }\n\n debugLog(`Increment position by ${increment}`);\n pos += increment;\n }\n\n return snbtData;\n}\n"]}
|
package/dist/nbt/snbt-to-nbt.js
CHANGED
|
@@ -75,6 +75,14 @@ function snbtToNbtCompound(_token, snbtData) {
|
|
|
75
75
|
nbt.name = name;
|
|
76
76
|
data.push(nbt);
|
|
77
77
|
token = snbtData.token();
|
|
78
|
+
if (token && token.type === 'COMMA') {
|
|
79
|
+
try {
|
|
80
|
+
token = snbtData.token();
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
throw new Error(`${err} - Unexpected end of SNBT data while looking for token after comma`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
78
86
|
}
|
|
79
87
|
return new NbtCompound(data);
|
|
80
88
|
}
|
|
@@ -90,7 +98,8 @@ function snbtToNbtInt(token) {
|
|
|
90
98
|
function snbtToNbtIntArray(_token, snbtData) {
|
|
91
99
|
const ints = [];
|
|
92
100
|
let token = snbtData.token();
|
|
93
|
-
|
|
101
|
+
// The fallback double parser can be used for integers too.
|
|
102
|
+
while (token && (token.type === 'INT' || token.type === 'DOUBLE')) {
|
|
94
103
|
ints.push(parseInt(token.content || ''));
|
|
95
104
|
try {
|
|
96
105
|
token = snbtData.token();
|
|
@@ -98,10 +107,11 @@ function snbtToNbtIntArray(_token, snbtData) {
|
|
|
98
107
|
catch (err) {
|
|
99
108
|
throw new Error(`${err} - Unexpected end of SNBT data while parsing int array`);
|
|
100
109
|
}
|
|
101
|
-
|
|
102
|
-
|
|
110
|
+
// If we see a comma, we expect another number after it. If not, we
|
|
111
|
+
// expect the end of the array.
|
|
112
|
+
if (token.type === 'COMMA') {
|
|
113
|
+
token = snbtData.token();
|
|
103
114
|
}
|
|
104
|
-
token = snbtData.token();
|
|
105
115
|
}
|
|
106
116
|
return new NbtIntArray(ints);
|
|
107
117
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snbt-to-nbt.js","sourceRoot":"","sources":["../../src/nbt/snbt-to-nbt.ts"],"names":[],"mappings":"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","sourcesContent":["import { NbtBase } from '../nbt/nbt-base';\nimport { NbtByteArray } from '../nbt/nbt-byte-array';\nimport { NbtByte } from '../nbt/nbt-byte';\nimport { NbtCompound } from '../nbt/nbt-compound';\nimport { NbtDouble } from '../nbt/nbt-double';\nimport { NbtFloat } from '../nbt/nbt-float';\nimport { NbtIntArray } from '../nbt/nbt-int-array';\nimport { NbtInt } from '../nbt/nbt-int';\nimport { NbtList } from '../nbt/nbt-list';\nimport { NbtLongArray } from '../nbt/nbt-long-array';\nimport { NbtLong } from '../nbt/nbt-long';\nimport { NbtShort } from '../nbt/nbt-short';\nimport { NbtString } from '../nbt/nbt-string';\nimport { SnbtData, SnbtToken } from './snbt-data';\n\nexport const fromSnbtData: {\n [key: string]: (token: SnbtToken, snbtData: SnbtData) => NbtBase<any>;\n} = {\n BYTE: snbtToNbtByte,\n BYTE_ARRAY_START: snbtToNbtByteArray,\n COMPOUND_START: snbtToNbtCompound,\n DOUBLE: snbtToNbtDouble,\n FLOAT: snbtToNbtFloat,\n INT: snbtToNbtInt,\n INT_ARRAY_START: snbtToNbtIntArray,\n LIST_START: snbtToNbtList,\n LONG: snbtToNbtLong,\n LONG_ARRAY_START: snbtToNbtLongArray,\n SHORT: snbtToNbtShort,\n STRING: snbtToNbtString,\n};\n\nexport function snbtToNbt(snbtData: SnbtData): NbtBase<any> {\n const token = snbtData.token();\n const processor = fromSnbtData[token.type];\n\n if (processor) {\n return processor(token, snbtData);\n }\n\n throw new Error(`Invalid, non-matching token ${snbtData.showToken(token)}`);\n}\n\nfunction snbtToNbtByte(token: SnbtToken): NbtByte {\n return new NbtByte(parseInt(token.content || ''));\n}\n\nfunction snbtToNbtByteArray(_token: SnbtToken, snbtData: SnbtData): NbtByteArray {\n const bytes: number[] = [];\n let token = snbtData.token();\n\n while (token && token.type === 'BYTE') {\n bytes.push(parseInt(token.content || ''));\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(`${err} - Unexpected end of SNBT data while parsing byte array`);\n }\n\n if (token.type !== 'COMMA') {\n throw new Error(`Expecting a comma but found ${snbtData.showToken(token)}`);\n }\n\n token = snbtData.token();\n }\n\n return new NbtByteArray(bytes);\n}\n\nfunction snbtToNbtCompound(_token: SnbtToken, snbtData: SnbtData): NbtCompound {\n const data: NbtBase<any>[] = [];\n let token = snbtData.token();\n\n while (token && token.type !== 'COMPOUND_END') {\n if (token.type !== 'STRING') {\n throw new Error(`Expecting a string but found ${snbtData.showToken(token)}`);\n }\n\n const name = token.content;\n let colon;\n\n try {\n colon = snbtData.token();\n } catch (err) {\n throw new Error(`${err} - Unexpected end of SNBT data while looking for colon`);\n }\n\n if (colon.type !== 'COLON') {\n throw new Error(`Expecting a colon but found ${snbtData.showToken(colon)}`);\n }\n\n const nbt = snbtToNbt(snbtData);\n nbt.name = name;\n data.push(nbt);\n token = snbtData.token();\n }\n\n return new NbtCompound(data);\n}\n\nfunction snbtToNbtDouble(token: SnbtToken): NbtDouble {\n return new NbtDouble(parseFloat(token.content.slice(0, -1) || ''));\n}\n\nfunction snbtToNbtFloat(token: SnbtToken): NbtFloat {\n return new NbtFloat(parseFloat(token.content || ''));\n}\n\nfunction snbtToNbtInt(token: SnbtToken): NbtInt {\n return new NbtInt(parseInt(token.content || ''));\n}\n\nfunction snbtToNbtIntArray(_token: SnbtToken, snbtData: SnbtData): NbtIntArray {\n const ints: number[] = [];\n let token = snbtData.token();\n\n while (token && token.type === 'INT') {\n ints.push(parseInt(token.content || ''));\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(`${err} - Unexpected end of SNBT data while parsing int array`);\n }\n\n if (token.type !== 'COMMA') {\n throw new Error(`Expecting a comma but found ${snbtData.showToken(token)}`);\n }\n\n token = snbtData.token();\n }\n\n return new NbtIntArray(ints);\n}\n\nfunction snbtToNbtList(_token: SnbtToken, snbtData: SnbtData): NbtList<any> {\n const list: NbtBase<any>[] = [];\n let token;\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(`${err} - Unexpected end of SNBT data while parsing list at beginning`);\n }\n\n while (token.type !== 'LIST_END') {\n snbtData.step(-1);\n let nbt;\n\n try {\n nbt = snbtToNbt(snbtData);\n } catch (err) {\n throw new Error(`${err} - Error parsing list element`);\n }\n\n list.push(nbt);\n token = snbtData.token();\n\n if (token.type === 'COMMA') {\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(`${err} - Unexpected end of SNBT data while looking for comma or end of list`);\n }\n } else if (token.type !== 'LIST_END') {\n throw new Error(`Expecting a comma or list end but found ${snbtData.showToken(token)}`);\n }\n }\n\n if (!list.length) {\n throw new Error('Empty list not allowed in SNBT because the type cannot be inferred');\n }\n\n const firstType = list[0].type;\n\n for (let i = 1; i < list.length; i++) {\n if (list[i].type !== firstType) {\n throw new Error(`List contains mixed types: ${firstType} and ${list[i].type}`);\n }\n }\n\n return new NbtList(list, firstType);\n}\n\nfunction snbtToNbtLong(token: SnbtToken): NbtLong {\n return new NbtLong(BigInt(token.content.slice(0, -1) || ''));\n}\n\nfunction snbtToNbtLongArray(_token: SnbtToken, snbtData: SnbtData): NbtLongArray {\n const longs: bigint[] = [];\n let token = snbtData.token();\n\n while (token && token.type === 'LONG') {\n longs.push(BigInt(token.content.slice(0, -1) || ''));\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(`${err} - Unexpected end of SNBT data while parsing long array`);\n }\n\n if (token.type !== 'COMMA') {\n throw new Error(`Expecting a comma but found ${snbtData.showToken(token)}`);\n }\n\n token = snbtData.token();\n }\n\n return new NbtLongArray(longs);\n}\n\nfunction snbtToNbtShort(token: SnbtToken): NbtShort {\n return new NbtShort(parseInt(token.content || ''));\n}\n\nfunction snbtToNbtString(token: SnbtToken): NbtString {\n return new NbtString(token.content);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"snbt-to-nbt.js","sourceRoot":"","sources":["../../src/nbt/snbt-to-nbt.ts"],"names":[],"mappings":"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","sourcesContent":["import { NbtBase } from '../nbt/nbt-base';\nimport { NbtByteArray } from '../nbt/nbt-byte-array';\nimport { NbtByte } from '../nbt/nbt-byte';\nimport { NbtCompound } from '../nbt/nbt-compound';\nimport { NbtDouble } from '../nbt/nbt-double';\nimport { NbtFloat } from '../nbt/nbt-float';\nimport { NbtIntArray } from '../nbt/nbt-int-array';\nimport { NbtInt } from '../nbt/nbt-int';\nimport { NbtList } from '../nbt/nbt-list';\nimport { NbtLongArray } from '../nbt/nbt-long-array';\nimport { NbtLong } from '../nbt/nbt-long';\nimport { NbtShort } from '../nbt/nbt-short';\nimport { NbtString } from '../nbt/nbt-string';\nimport { SnbtData, SnbtToken } from './snbt-data';\n\nexport const fromSnbtData: {\n [key: string]: (token: SnbtToken, snbtData: SnbtData) => NbtBase<any>;\n} = {\n BYTE: snbtToNbtByte,\n BYTE_ARRAY_START: snbtToNbtByteArray,\n COMPOUND_START: snbtToNbtCompound,\n DOUBLE: snbtToNbtDouble,\n FLOAT: snbtToNbtFloat,\n INT: snbtToNbtInt,\n INT_ARRAY_START: snbtToNbtIntArray,\n LIST_START: snbtToNbtList,\n LONG: snbtToNbtLong,\n LONG_ARRAY_START: snbtToNbtLongArray,\n SHORT: snbtToNbtShort,\n STRING: snbtToNbtString,\n};\n\nexport function snbtToNbt(snbtData: SnbtData): NbtBase<any> {\n const token = snbtData.token();\n const processor = fromSnbtData[token.type];\n\n if (processor) {\n return processor(token, snbtData);\n }\n\n throw new Error(`Invalid, non-matching token ${snbtData.showToken(token)}`);\n}\n\nfunction snbtToNbtByte(token: SnbtToken): NbtByte {\n return new NbtByte(parseInt(token.content || ''));\n}\n\nfunction snbtToNbtByteArray(\n _token: SnbtToken,\n snbtData: SnbtData\n): NbtByteArray {\n const bytes: number[] = [];\n let token = snbtData.token();\n\n while (token && token.type === 'BYTE') {\n bytes.push(parseInt(token.content || ''));\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while parsing byte array`\n );\n }\n\n if (token.type !== 'COMMA') {\n throw new Error(\n `Expecting a comma but found ${snbtData.showToken(token)}`\n );\n }\n\n token = snbtData.token();\n }\n\n return new NbtByteArray(bytes);\n}\n\nfunction snbtToNbtCompound(_token: SnbtToken, snbtData: SnbtData): NbtCompound {\n const data: NbtBase<any>[] = [];\n let token = snbtData.token();\n\n while (token && token.type !== 'COMPOUND_END') {\n if (token.type !== 'STRING') {\n throw new Error(\n `Expecting a string but found ${snbtData.showToken(token)}`\n );\n }\n\n const name = token.content;\n let colon;\n\n try {\n colon = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while looking for colon`\n );\n }\n\n if (colon.type !== 'COLON') {\n throw new Error(\n `Expecting a colon but found ${snbtData.showToken(colon)}`\n );\n }\n\n const nbt = snbtToNbt(snbtData);\n nbt.name = name;\n data.push(nbt);\n token = snbtData.token();\n\n if (token && token.type === 'COMMA') {\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while looking for token after comma`\n );\n }\n }\n }\n\n return new NbtCompound(data);\n}\n\nfunction snbtToNbtDouble(token: SnbtToken): NbtDouble {\n return new NbtDouble(parseFloat(token.content.slice(0, -1) || ''));\n}\n\nfunction snbtToNbtFloat(token: SnbtToken): NbtFloat {\n return new NbtFloat(parseFloat(token.content || ''));\n}\n\nfunction snbtToNbtInt(token: SnbtToken): NbtInt {\n return new NbtInt(parseInt(token.content || ''));\n}\n\nfunction snbtToNbtIntArray(_token: SnbtToken, snbtData: SnbtData): NbtIntArray {\n const ints: number[] = [];\n let token = snbtData.token();\n\n // The fallback double parser can be used for integers too.\n while (token && (token.type === 'INT' || token.type === 'DOUBLE')) {\n ints.push(parseInt(token.content || ''));\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while parsing int array`\n );\n }\n\n // If we see a comma, we expect another number after it. If not, we\n // expect the end of the array.\n if (token.type === 'COMMA') {\n token = snbtData.token();\n }\n }\n\n return new NbtIntArray(ints);\n}\n\nfunction snbtToNbtList(_token: SnbtToken, snbtData: SnbtData): NbtList<any> {\n const list: NbtBase<any>[] = [];\n let token;\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while parsing list at beginning`\n );\n }\n\n while (token.type !== 'LIST_END') {\n snbtData.step(-1);\n let nbt;\n\n try {\n nbt = snbtToNbt(snbtData);\n } catch (err) {\n throw new Error(`${err} - Error parsing list element`);\n }\n\n list.push(nbt);\n token = snbtData.token();\n\n if (token.type === 'COMMA') {\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while looking for comma or end of list`\n );\n }\n } else if (token.type !== 'LIST_END') {\n throw new Error(\n `Expecting a comma or list end but found ${snbtData.showToken(token)}`\n );\n }\n }\n\n if (!list.length) {\n throw new Error(\n 'Empty list not allowed in SNBT because the type cannot be inferred'\n );\n }\n\n const firstType = list[0].type;\n\n for (let i = 1; i < list.length; i++) {\n if (list[i].type !== firstType) {\n throw new Error(\n `List contains mixed types: ${firstType} and ${list[i].type}`\n );\n }\n }\n\n return new NbtList(list, firstType);\n}\n\nfunction snbtToNbtLong(token: SnbtToken): NbtLong {\n return new NbtLong(BigInt(token.content.slice(0, -1) || ''));\n}\n\nfunction snbtToNbtLongArray(\n _token: SnbtToken,\n snbtData: SnbtData\n): NbtLongArray {\n const longs: bigint[] = [];\n let token = snbtData.token();\n\n while (token && token.type === 'LONG') {\n longs.push(BigInt(token.content.slice(0, -1) || ''));\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while parsing long array`\n );\n }\n\n if (token.type !== 'COMMA') {\n throw new Error(\n `Expecting a comma but found ${snbtData.showToken(token)}`\n );\n }\n\n token = snbtData.token();\n }\n\n return new NbtLongArray(longs);\n}\n\nfunction snbtToNbtShort(token: SnbtToken): NbtShort {\n return new NbtShort(parseInt(token.content || ''));\n}\n\nfunction snbtToNbtString(token: SnbtToken): NbtString {\n return new NbtString(token.content);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mca-json",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"description": "Convert Minecraft MCA (Anvil files) and NBT into JSON and back, or modify directly in memory. Works on region files and player data.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"mca-chunks": "dist/bin/mca-chunks.js",
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"reinstall": "rm -rf node_modules package-lock.json && npm install"
|
|
13
13
|
},
|
|
14
14
|
"type": "module",
|
|
15
|
-
"main": "dist/index.
|
|
15
|
+
"main": "dist/index.js",
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"debug": "^4.4.3",
|
|
18
18
|
"get-stdin": "^10.0.0",
|
package/src/nbt/snbt-parse.ts
CHANGED
|
@@ -38,6 +38,7 @@ const tokenParsers: TokenParser[] = [
|
|
|
38
38
|
type: 'WHITESPACE',
|
|
39
39
|
pattern: /^\s+/,
|
|
40
40
|
callback: (_pos, _type, _snbtData, matches) => {
|
|
41
|
+
// Do not generate a token for whitespace.
|
|
41
42
|
return matches[0].length;
|
|
42
43
|
},
|
|
43
44
|
},
|
|
@@ -130,10 +131,10 @@ const tokenParsers: TokenParser[] = [
|
|
|
130
131
|
snbtData.addToken(
|
|
131
132
|
pos,
|
|
132
133
|
type,
|
|
133
|
-
matches[
|
|
134
|
+
matches[1].toLowerCase() === 'true' ? '1' : '0'
|
|
134
135
|
);
|
|
135
136
|
|
|
136
|
-
return matches[
|
|
137
|
+
return matches[1].length;
|
|
137
138
|
},
|
|
138
139
|
},
|
|
139
140
|
{
|
|
@@ -228,9 +229,10 @@ const tokenParsers: TokenParser[] = [
|
|
|
228
229
|
];
|
|
229
230
|
|
|
230
231
|
// Creates a regular expression that will start at the beginning of the string
|
|
231
|
-
// and conclude with an "end of token" marker at the end.
|
|
232
|
+
// and conclude with an "end of token" marker at the end. The lookahead will
|
|
233
|
+
// not capture the end of the token marker.
|
|
232
234
|
function anchorPattern(pattern: string) {
|
|
233
|
-
return new RegExp(`^${pattern}\s*(
|
|
235
|
+
return new RegExp(`^${pattern}\s*(?=$|,|}|]|:)`);
|
|
234
236
|
}
|
|
235
237
|
|
|
236
238
|
export function snbtParse(snbt: string) {
|
|
@@ -249,6 +251,7 @@ export function snbtParse(snbt: string) {
|
|
|
249
251
|
throw new Error(`Unexpected token at position ${pos}`);
|
|
250
252
|
}
|
|
251
253
|
|
|
254
|
+
debugLog(`Increment position by ${increment}`);
|
|
252
255
|
pos += increment;
|
|
253
256
|
}
|
|
254
257
|
|
package/src/nbt/snbt-to-nbt.ts
CHANGED
|
@@ -45,7 +45,10 @@ function snbtToNbtByte(token: SnbtToken): NbtByte {
|
|
|
45
45
|
return new NbtByte(parseInt(token.content || ''));
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
function snbtToNbtByteArray(
|
|
48
|
+
function snbtToNbtByteArray(
|
|
49
|
+
_token: SnbtToken,
|
|
50
|
+
snbtData: SnbtData
|
|
51
|
+
): NbtByteArray {
|
|
49
52
|
const bytes: number[] = [];
|
|
50
53
|
let token = snbtData.token();
|
|
51
54
|
|
|
@@ -55,11 +58,15 @@ function snbtToNbtByteArray(_token: SnbtToken, snbtData: SnbtData): NbtByteArray
|
|
|
55
58
|
try {
|
|
56
59
|
token = snbtData.token();
|
|
57
60
|
} catch (err) {
|
|
58
|
-
throw new Error(
|
|
61
|
+
throw new Error(
|
|
62
|
+
`${err} - Unexpected end of SNBT data while parsing byte array`
|
|
63
|
+
);
|
|
59
64
|
}
|
|
60
65
|
|
|
61
66
|
if (token.type !== 'COMMA') {
|
|
62
|
-
throw new Error(
|
|
67
|
+
throw new Error(
|
|
68
|
+
`Expecting a comma but found ${snbtData.showToken(token)}`
|
|
69
|
+
);
|
|
63
70
|
}
|
|
64
71
|
|
|
65
72
|
token = snbtData.token();
|
|
@@ -74,7 +81,9 @@ function snbtToNbtCompound(_token: SnbtToken, snbtData: SnbtData): NbtCompound {
|
|
|
74
81
|
|
|
75
82
|
while (token && token.type !== 'COMPOUND_END') {
|
|
76
83
|
if (token.type !== 'STRING') {
|
|
77
|
-
throw new Error(
|
|
84
|
+
throw new Error(
|
|
85
|
+
`Expecting a string but found ${snbtData.showToken(token)}`
|
|
86
|
+
);
|
|
78
87
|
}
|
|
79
88
|
|
|
80
89
|
const name = token.content;
|
|
@@ -83,17 +92,31 @@ function snbtToNbtCompound(_token: SnbtToken, snbtData: SnbtData): NbtCompound {
|
|
|
83
92
|
try {
|
|
84
93
|
colon = snbtData.token();
|
|
85
94
|
} catch (err) {
|
|
86
|
-
throw new Error(
|
|
95
|
+
throw new Error(
|
|
96
|
+
`${err} - Unexpected end of SNBT data while looking for colon`
|
|
97
|
+
);
|
|
87
98
|
}
|
|
88
99
|
|
|
89
100
|
if (colon.type !== 'COLON') {
|
|
90
|
-
throw new Error(
|
|
101
|
+
throw new Error(
|
|
102
|
+
`Expecting a colon but found ${snbtData.showToken(colon)}`
|
|
103
|
+
);
|
|
91
104
|
}
|
|
92
105
|
|
|
93
106
|
const nbt = snbtToNbt(snbtData);
|
|
94
107
|
nbt.name = name;
|
|
95
108
|
data.push(nbt);
|
|
96
109
|
token = snbtData.token();
|
|
110
|
+
|
|
111
|
+
if (token && token.type === 'COMMA') {
|
|
112
|
+
try {
|
|
113
|
+
token = snbtData.token();
|
|
114
|
+
} catch (err) {
|
|
115
|
+
throw new Error(
|
|
116
|
+
`${err} - Unexpected end of SNBT data while looking for token after comma`
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
97
120
|
}
|
|
98
121
|
|
|
99
122
|
return new NbtCompound(data);
|
|
@@ -115,20 +138,23 @@ function snbtToNbtIntArray(_token: SnbtToken, snbtData: SnbtData): NbtIntArray {
|
|
|
115
138
|
const ints: number[] = [];
|
|
116
139
|
let token = snbtData.token();
|
|
117
140
|
|
|
118
|
-
|
|
141
|
+
// The fallback double parser can be used for integers too.
|
|
142
|
+
while (token && (token.type === 'INT' || token.type === 'DOUBLE')) {
|
|
119
143
|
ints.push(parseInt(token.content || ''));
|
|
120
144
|
|
|
121
145
|
try {
|
|
122
146
|
token = snbtData.token();
|
|
123
147
|
} catch (err) {
|
|
124
|
-
throw new Error(
|
|
148
|
+
throw new Error(
|
|
149
|
+
`${err} - Unexpected end of SNBT data while parsing int array`
|
|
150
|
+
);
|
|
125
151
|
}
|
|
126
152
|
|
|
127
|
-
|
|
128
|
-
|
|
153
|
+
// If we see a comma, we expect another number after it. If not, we
|
|
154
|
+
// expect the end of the array.
|
|
155
|
+
if (token.type === 'COMMA') {
|
|
156
|
+
token = snbtData.token();
|
|
129
157
|
}
|
|
130
|
-
|
|
131
|
-
token = snbtData.token();
|
|
132
158
|
}
|
|
133
159
|
|
|
134
160
|
return new NbtIntArray(ints);
|
|
@@ -141,7 +167,9 @@ function snbtToNbtList(_token: SnbtToken, snbtData: SnbtData): NbtList<any> {
|
|
|
141
167
|
try {
|
|
142
168
|
token = snbtData.token();
|
|
143
169
|
} catch (err) {
|
|
144
|
-
throw new Error(
|
|
170
|
+
throw new Error(
|
|
171
|
+
`${err} - Unexpected end of SNBT data while parsing list at beginning`
|
|
172
|
+
);
|
|
145
173
|
}
|
|
146
174
|
|
|
147
175
|
while (token.type !== 'LIST_END') {
|
|
@@ -161,22 +189,30 @@ function snbtToNbtList(_token: SnbtToken, snbtData: SnbtData): NbtList<any> {
|
|
|
161
189
|
try {
|
|
162
190
|
token = snbtData.token();
|
|
163
191
|
} catch (err) {
|
|
164
|
-
throw new Error(
|
|
192
|
+
throw new Error(
|
|
193
|
+
`${err} - Unexpected end of SNBT data while looking for comma or end of list`
|
|
194
|
+
);
|
|
165
195
|
}
|
|
166
196
|
} else if (token.type !== 'LIST_END') {
|
|
167
|
-
throw new Error(
|
|
197
|
+
throw new Error(
|
|
198
|
+
`Expecting a comma or list end but found ${snbtData.showToken(token)}`
|
|
199
|
+
);
|
|
168
200
|
}
|
|
169
201
|
}
|
|
170
202
|
|
|
171
203
|
if (!list.length) {
|
|
172
|
-
throw new Error(
|
|
204
|
+
throw new Error(
|
|
205
|
+
'Empty list not allowed in SNBT because the type cannot be inferred'
|
|
206
|
+
);
|
|
173
207
|
}
|
|
174
208
|
|
|
175
209
|
const firstType = list[0].type;
|
|
176
210
|
|
|
177
211
|
for (let i = 1; i < list.length; i++) {
|
|
178
212
|
if (list[i].type !== firstType) {
|
|
179
|
-
throw new Error(
|
|
213
|
+
throw new Error(
|
|
214
|
+
`List contains mixed types: ${firstType} and ${list[i].type}`
|
|
215
|
+
);
|
|
180
216
|
}
|
|
181
217
|
}
|
|
182
218
|
|
|
@@ -187,7 +223,10 @@ function snbtToNbtLong(token: SnbtToken): NbtLong {
|
|
|
187
223
|
return new NbtLong(BigInt(token.content.slice(0, -1) || ''));
|
|
188
224
|
}
|
|
189
225
|
|
|
190
|
-
function snbtToNbtLongArray(
|
|
226
|
+
function snbtToNbtLongArray(
|
|
227
|
+
_token: SnbtToken,
|
|
228
|
+
snbtData: SnbtData
|
|
229
|
+
): NbtLongArray {
|
|
191
230
|
const longs: bigint[] = [];
|
|
192
231
|
let token = snbtData.token();
|
|
193
232
|
|
|
@@ -197,11 +236,15 @@ function snbtToNbtLongArray(_token: SnbtToken, snbtData: SnbtData): NbtLongArray
|
|
|
197
236
|
try {
|
|
198
237
|
token = snbtData.token();
|
|
199
238
|
} catch (err) {
|
|
200
|
-
throw new Error(
|
|
239
|
+
throw new Error(
|
|
240
|
+
`${err} - Unexpected end of SNBT data while parsing long array`
|
|
241
|
+
);
|
|
201
242
|
}
|
|
202
243
|
|
|
203
244
|
if (token.type !== 'COMMA') {
|
|
204
|
-
throw new Error(
|
|
245
|
+
throw new Error(
|
|
246
|
+
`Expecting a comma but found ${snbtData.showToken(token)}`
|
|
247
|
+
);
|
|
205
248
|
}
|
|
206
249
|
|
|
207
250
|
token = snbtData.token();
|