cdx
Version:
A parser and generator for (Internet Archive) CDX files.
96 lines (87 loc) • 2.29 kB
text/coffeescript
_ = require "lodash"
CDXRecord = require "./CDXRecord"
stream = require "stream"
module.exports = class CDXRecordCollection extends stream.Transform
constructor: ( = []) ->
super
.objectMode = false
.objectMode = true
= false
= ""
= _.invert
records: []
signature: null
delimiter: null
signatureMap:
compressedRecordSize: "S"
compressedDATFileOffset: "D"
compressedARCFileOffset: "V"
uncompressedDATFileOffset: "d"
uncompressedARCFileOffset: "v"
ARCDocumentLength: "n"
oldStyleChecksum: "c"
newStyleChecksum: "k"
canonicalizedUrl: "A"
canonicalizedFrame: "F"
canonicalizedHost: "H"
canonicalizedImage: "I"
canonicalizedJumpPoint: "J"
canonicalizedLink: "L"
canonicalizedPath: "P"
canonicalizedRedirect: "R"
canonicalizedHrefURL: "X"
canonicalizedSrcURL: "Y"
canonicalizedScriptURL: "Z"
originalMimeType: "m"
originalURL: "a"
originalFrame: "f"
originalHost: "h"
originalImage: "i"
originalJumpPoint: "j"
originalLink: "l"
originalPath: "p"
originalRedirect: "r"
originalHrefURL: "x"
originalSrcURL: "y"
originalScriptURL: "z"
date: "b"
IP: "e"
fileName: "g"
port: "o"
responseCode: "s"
title: "t"
metaTags: "M"
massagedURL: "N"
languageString: "Q"
uniqueness: "U"
newsGroup: "B"
rulespaceCategory: "C"
multiColumnLanguageDescription: "G"
someWeirdFBISWhatsChangedKindaThing: "K" # Yeah well, what did you expect me to do with that? :|
comment: "#"
_parseSignature: (signatureData) ->
= signatureData[...1]
signatureMarkers = signatureData[5...].split(" ")
= ([marker] for marker in signatureMarkers)
_transform: (chunk, encoding, done) ->
+= chunk
lines = .split(/\r?\n/)
= lines.pop()
for line in lines
if not
# The first line is the header.
line
= true
else
try
record =
this.push record
catch err
this.emit "error", err
return
done()
createRecord: (data) ->
record = new CDXRecord(, )
record.parseRecord data
.push record
return record