ipfs storage for images and other nontext items. for use with etica - runs on etica network and currencys
https://collect.etica-stats.org
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.3 KiB
97 lines
2.3 KiB
'use strict' |
|
|
|
exports.parse = function (source, transform) { |
|
return new ArrayParser(source, transform).parse() |
|
} |
|
|
|
class ArrayParser { |
|
constructor (source, transform) { |
|
this.source = source |
|
this.transform = transform || identity |
|
this.position = 0 |
|
this.entries = [] |
|
this.recorded = [] |
|
this.dimension = 0 |
|
} |
|
|
|
isEof () { |
|
return this.position >= this.source.length |
|
} |
|
|
|
nextCharacter () { |
|
var character = this.source[this.position++] |
|
if (character === '\\') { |
|
return { |
|
value: this.source[this.position++], |
|
escaped: true |
|
} |
|
} |
|
return { |
|
value: character, |
|
escaped: false |
|
} |
|
} |
|
|
|
record (character) { |
|
this.recorded.push(character) |
|
} |
|
|
|
newEntry (includeEmpty) { |
|
var entry |
|
if (this.recorded.length > 0 || includeEmpty) { |
|
entry = this.recorded.join('') |
|
if (entry === 'NULL' && !includeEmpty) { |
|
entry = null |
|
} |
|
if (entry !== null) entry = this.transform(entry) |
|
this.entries.push(entry) |
|
this.recorded = [] |
|
} |
|
} |
|
|
|
consumeDimensions () { |
|
if (this.source[0] === '[') { |
|
while (!this.isEof()) { |
|
var char = this.nextCharacter() |
|
if (char.value === '=') break |
|
} |
|
} |
|
} |
|
|
|
parse (nested) { |
|
var character, parser, quote |
|
this.consumeDimensions() |
|
while (!this.isEof()) { |
|
character = this.nextCharacter() |
|
if (character.value === '{' && !quote) { |
|
this.dimension++ |
|
if (this.dimension > 1) { |
|
parser = new ArrayParser(this.source.substr(this.position - 1), this.transform) |
|
this.entries.push(parser.parse(true)) |
|
this.position += parser.position - 2 |
|
} |
|
} else if (character.value === '}' && !quote) { |
|
this.dimension-- |
|
if (!this.dimension) { |
|
this.newEntry() |
|
if (nested) return this.entries |
|
} |
|
} else if (character.value === '"' && !character.escaped) { |
|
if (quote) this.newEntry(true) |
|
quote = !quote |
|
} else if (character.value === ',' && !quote) { |
|
this.newEntry() |
|
} else { |
|
this.record(character.value) |
|
} |
|
} |
|
if (this.dimension !== 0) { |
|
throw new Error('array dimension not balanced') |
|
} |
|
return this.entries |
|
} |
|
} |
|
|
|
function identity (value) { |
|
return value |
|
}
|
|
|