hummus-recipe
Version:
A powerful PDF tool for NodeJS based on HummusJS
80 lines (59 loc) • 1.81 kB
text/coffeescript
{Number:NumberT} = require './Number'
utils = require './utils'
class ArrayT
constructor: (, , = 'count') ->
decode: (stream, parent) ->
pos = stream.pos
res = []
ctx = parent
if ?
length = utils.resolveLength , stream, parent
if instanceof NumberT
# define hidden properties
Object.defineProperties res,
parent: { value: parent }
_startOffset: { value: pos }
_currentOffset: { value: 0, writable: true }
_length: { value: length }
ctx = res
if not length? or == 'bytes'
target = if length?
stream.pos + length
else if parent?._length
parent._startOffset + parent._length
else
stream.length
while stream.pos < target
res.push .decode(stream, ctx)
else
for i in [0...length] by 1
res.push .decode(stream, ctx)
return res
size: (array, ctx) ->
unless array
return .size(null, ctx) * utils.resolveLength(, null, ctx)
size = 0
if instanceof NumberT
size += .size()
ctx = parent: ctx
for item in array
size += .size(item, ctx)
return size
encode: (stream, array, parent) ->
ctx = parent
if instanceof NumberT
ctx =
pointers: []
startOffset: stream.pos
parent: parent
ctx.pointerOffset = stream.pos +
.encode(stream, array.length)
for item in array
.encode(stream, item, ctx)
if instanceof NumberT
i = 0
while i < ctx.pointers.length
ptr = ctx.pointers[i++]
ptr.type.encode(stream, ptr.val)
return
module.exports = ArrayT