{"_id":"atok","_rev":"84-4d5f14e6eeccd32d5567b27b70acc80c","name":"atok","description":"Fast, easy and dynamic tokenizer for Node Streams","dist-tags":{"latest":"0.4.3"},"versions":{"0.1.1":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.1","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./index","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.9","_defaultsLoaded":true,"dist":{"shasum":"65448fdf2a8e0285678845d07d0bc75cac8152a8","tarball":"https://registry.npmjs.org/atok/-/atok-0.1.1.tgz","integrity":"sha512-v0SWpNEsDeynakAMJhrvCPOby0WQ2QKvPcTYsi+2qkTOk/4fvRafRqRGTgzb63MKQtTWc7HZvN/yyclnV5upvA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG2Q8JTq07JXfCp5aMqDFCYFQo0inFin5cjoUJ3TGqjhAiEAzteKa6/77eiHIIiFhkTTgGuc25197v9ytV8Lous0YhU="}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.2":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.2","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"71c01f1d7158fd3789212cffd5f24514e1c2585d","tarball":"https://registry.npmjs.org/atok/-/atok-0.1.2.tgz","integrity":"sha512-EH67nlfz5uZtNX2mM0mpD3gayPr5dkZixEldumYtvAwtik7PiDaCmgRoCglJxkMMz4KlOxxfHcZse11/i3jCvw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCRwvJdKUQk07RjNqjRI6fjVQB9dl04V7egyjqJS75N5wIgb0iEqqnA0xlOJGDfF5XKvldc92BI9HD0NFWJCU0A7ic="}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.3":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.3","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"f6e4bdab3d2a500fe8be6dd55c9ea7a5b99317fa","tarball":"https://registry.npmjs.org/atok/-/atok-0.1.3.tgz","integrity":"sha512-Lo+mjb0SBx1WO6amI/1NOcEdqzWSv2ke4mM0EyR1iYzItfpVMRgPmKQf5Oei44MSy7aQbPU6LWiIpZir/O4BDA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCgKkwpmfVyYd8rEAbYq94N5CiOMXXdxQ/A5mCHRfd1nAIhAL//0RrSNTX0mos2C1sriuRaL/yizSoEN1KYY/YRHOYf"}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.4":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.4","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"f638dc4e0a3619a6c14b5ae618547f5e12e6aa69","tarball":"https://registry.npmjs.org/atok/-/atok-0.1.4.tgz","integrity":"sha512-LBIXSBBYFhn1wv3BHFK8TURs70+UHyHDqGwKB6Z3sK+9CG3ShqY7lltbRnYCSPRwb18zo13GdgmeQxn/pXyytg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHP5lm0Skst7Wq9A/dMWNjHFcZDFW0gvk4Rzc7/y6olKAiA0rbHxgHrsp2NZ0GeycGxKVwJFmvLu5xCculIwQWe2Eg=="}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.5":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.5","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"6386c1c61e5de5a68cbd9ce714f72ec802f7dd76","tarball":"https://registry.npmjs.org/atok/-/atok-0.1.5.tgz","integrity":"sha512-tC3cLmtfBB4A08WfzS/CIGx25Hn3GCdl5EnsFNifCCcx4pVYMMHDR+eHgr0YOXx0ivDW1mj1ZihEndoBDzMXnQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH5KAhnHHAluCTUXfmuBfI6zOxRfdD1qI/+EYlaTcJOqAiEA6qCi9y2ozUr8TKwoV/XSPl2X6xXZy5J3IrL2N/728Gc="}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.6":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.6","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"69088d27d1782bc6988fa082aa499b551ef64818","tarball":"https://registry.npmjs.org/atok/-/atok-0.1.6.tgz","integrity":"sha512-bGdtfBltDSdZHOShCYUI8ssCqptRCBq+CnTx3ISTc5TPce9H31GpcZL/EgayXeaGUfgJ+zkjRTLTGMZDYcDy2w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGFsghMxXVJZndhbfdruAVLhqO3FJQQJar48eH/5FNDmAiEAs9wzdDSzYnd7/PzqzKpvCLIXKvpFmT7jAJDDN5VCix4="}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.7":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.7","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.7","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"5efeb06a94ee1b7ebfb8a8595445e4ed1493d454","tarball":"https://registry.npmjs.org/atok/-/atok-0.1.7.tgz","integrity":"sha512-+Ukno6s1dWZlnDwl/ECqyEJPOWr/zfpYHd4ZeI63Z1xoB8TLiQDmTJJ/382r00dCocSNrGS7OTHkPWqdQYaNDg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCg7zSTREu2Nw9wgWlbpqOcLybH08vDbq3x9VyZvpasMAIgfLZd/ZMC4JEqy+rL3RgkGXgUKt/8b3gTDFpv2qtgHWA="}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.8":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.8","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.8","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.0-3","_nodeVersion":"v0.6.10","_defaultsLoaded":true,"dist":{"shasum":"4c450145af285a98696790504fad6a7b1ce28bbd","tarball":"https://registry.npmjs.org/atok/-/atok-0.1.8.tgz","integrity":"sha512-mxpUWUv9rBrlzLK5Io2Y/3+SzvEx8kszmgCTnhmF5oTnwXutAC+FjvD/qB5Ll1EWN/WYzwJ7nMDL01CSu1zp9A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC+tJtFgQCj5D4/BFfEayub9/oGCMkdVMrLJ5C4LLoE+gIgBVIweH2OEg65Ji57xNJ5inG6g0tSvQ1uNMPR9P2F3Go="}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.9":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.9","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.9","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"2e823a639bc850f7c1d4f2ff010755615976535b","tarball":"https://registry.npmjs.org/atok/-/atok-0.1.9.tgz","integrity":"sha512-M6Vl7DSQqoJ5H4NULcM6falsx6S3NL/FPRzthDvzhmrZqxe0bMUtuOWqQ7+PDd5tSfRk/byrcf8oXeteEmC+NA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC70ocl0Lcx7I8Ox6DLeEirejkwuJtsHUGkalVwV6vJ1AIhAMEdKPhLv6e+P1v1s0Oq8Efjw2nFQ7l7iG0USAtOXucf"}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.1.10":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.1.10","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.2"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.1.10","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"bc606f239852bbbfaed26088b5ef5b090e4b68de","tarball":"https://registry.npmjs.org/atok/-/atok-0.1.10.tgz","integrity":"sha512-ZWO73wZcKxYeNvzbIsOeRhj5xmyIkt5NK6pJBHOIewYOP8PJm73SC0crXjE73KprRFvl1g3RHmQ5M5bfLN5JhA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCZXhLdwq7jdrNxXxPMSmPaJpUeFFUnO/l5lZAbxUs8ugIgO9lIsLbH6/wboXmnwED4fMjWuWlw/Bc/L14MzVmDjOQ="}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.2.0":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.2.0","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.2"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.2.0","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"4c7f24dafa6403fb7d0c6c959bfeb312e3c095af","tarball":"https://registry.npmjs.org/atok/-/atok-0.2.0.tgz","integrity":"sha512-cAD49neoXmY8aOjN08PO1QBQZRMtBnUQPpPcuxyLEeEbkDGWLaYI0kNewySiJEkInvSr/KhQOWWmPrrJj25X5w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDnbrbB4w7QOFCEC1IlADpWSuF88tQgeSBBgZ4SqCL+YgIgRFa9TuJzM4iv2DT/tkozsoTXzoea/JiFCUHEmpSNV3o="}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.2.1":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.2.1","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.2"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.2.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"43a4a5863ecd7159503cbade34faeedb8be205a3","tarball":"https://registry.npmjs.org/atok/-/atok-0.2.1.tgz","integrity":"sha512-p5nMnDQvYbEvxZXSvtcFWdmSk3W+7B7OJjUaRv6qne+rPdRa6z6o78WzvRd7BLNVNwuFNuCjov3DUALwGHrdog==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDEYPTyTQE3cjOdy8BBvl3HVGi8X5o9D1visMw6zwI7owIgbZNfYZgVZXoan04hvzyH43hraWq69ccjBHfR0laDK2U="}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.2.2":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.2.2","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.2"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.2.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.2","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"19dad972f943fbd34caa1b09fe044705d9e9b40f","tarball":"https://registry.npmjs.org/atok/-/atok-0.2.2.tgz","integrity":"sha512-DiaROHu71PY8DUYONEPEPcx/EYesAJ8LJPN8c9PfzGz7lDusvJPDGhJ1EbixbSluYl96n9VBHSga2tXkv7DJGw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCmhRKaiWPZ1A2fYqR4jPY4UzyhcotBuPzkFs4hn76vRwIgPCHgpe/63whp9rRZDtCEz0AH03gSjg1YOm+QDdUbcm8="}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.2.3":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.2.3","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.5"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.2.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.9","_nodeVersion":"v0.6.13","_defaultsLoaded":true,"dist":{"shasum":"14bfcc5cd9153315eaf42c431add82c41e671433","tarball":"https://registry.npmjs.org/atok/-/atok-0.2.3.tgz","integrity":"sha512-3FtQ1Fw2EyFmcuL6rDtbUh2FOmfe68Vbs4WNepfBzwgWRtew8mbvhFVwePTyG5f9/0qfYSVppr8Jyptp7mIwnw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBFfpvu9xJWjoagxYUD7cUPl9pGSZAV29J4U05ld4dEwAiBOFdNax7DdlX1+jOvaXsAy4LgdutKkOuENTJ9TleNPQg=="}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.2.4":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.2.4","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.5"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.2.4","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.16","_nodeVersion":"v0.6.15","_defaultsLoaded":true,"dist":{"shasum":"ba9adad17f52f06a7d7fa0dba7f3960e100660ec","tarball":"https://registry.npmjs.org/atok/-/atok-0.2.4.tgz","integrity":"sha512-e6Wfg00lrP+M8pFBlGyR59vMvFZiKhjBj1oJQ5dBhJsvvNDn1obzNuBhQfHCH/XbT3lZijyo2wOoMnPTogSTxw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCvz26mykwScROY14EdvN7e6JM5zlKx0KqREuI9DS/Y7gIgBcRgqJDBam8XJEscukl5S3B7uJbW/SyCkqTJ0N6TB/s="}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.2.5":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.2.5","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3","fnutils":">= 0.0.1"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.7","dox":"latest","dox-template":"latest"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.2.5","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"df5cad358c7b84661d46a00276573ffd2692d176","tarball":"https://registry.npmjs.org/atok/-/atok-0.2.5.tgz","integrity":"sha512-/+W50icn7jS9wk27A1IDEmeagR6ScfisbPN/367ecg4JK2ZRo8x+aar2R1+hIs81lJLlXGc2hHH2NyLPS32Ajg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDVEiLpNciviO8miCLiOSxh6N7KAU5YXFo4NkC7LxLE2wIhAJj52ZfkTHeZSNMGapQ9/w0IkR6dS2+gSAF4TGccW0wg"}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.2.6":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.2.6","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3","fnutils":">= 0.0.1"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.7","dox":"latest","dox-template":"latest"},"scripts":{"test":"mocha test/*-test.js"},"_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"_id":"atok@0.2.6","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"e68eaf2df047d6101bf6c0f5875858809266baa4","tarball":"https://registry.npmjs.org/atok/-/atok-0.2.6.tgz","integrity":"sha512-P/6/q5i1iAEr7P6yVg5LcaFai18lw5O1erzecrFIvlMqjwBWa3sxGDK/JhDiJEWzQ+wHW2xZgJZtIRJZ3YInnA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG8eJvApdU3Lin0laq2TFo5FThDH0k64AcL6ZM1n2a1hAiEA+t7SN2h0eSgTMn6wgwo/pRBVX7P5Vg1+QB7ZDfh9LP4="}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.2.7":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.2.7","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":"0.0.7","fnutils":">= 0.0.1"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.7","dox":"latest","dox-template":"latest"},"scripts":{"test":"mocha test/*-test.js"},"readme":"# ATOK - async tokenizer\n\n\n## Overview\n\nAtok is a fast, easy and flexible tokenizer designed for use with [node.js](http://nodejs.org). It is based around the [Stream](http://nodejs.org/docs/latest/api/streams.html) concept and is implemented as a read/write one.\n\nIt was originally inspired by [node-tokenizer](https://github.com/floby/node-tokenizer), but quickly grew into its own form as I wanted it to be RegExp agnostic so it could be used on node Buffer intances and more importantly *faster*.\n\nAtok is built using [ekam](https://github.com/pierrec/node-ekam) as it abuses includes and dynamic method generation.\n\nAtok is the fundation for the [atok-parser](https://github.com/pierrec/node-atok-parser), which provides the environment for quickly building efficient and easier to maintain parsers.\n\n\n## Download\n\nIt is published on node package manager (npm). To install, do:\n\n    npm install atok\n\n\n## Quick example\n\nGiven the following json to be parsed:\n\n    [\"Hello world!\"]\n\nThe following code would be a very simple JSON parser for it.\n\n``` javascript\nvar Tokenizer = require('atok')\nvar tok = new Tokenizer\n\n// Define the parser rules\n// By default it will emit data events when a rule is matched\ntok\n    // Define the quiet property for the following rules (quiet=dont tokenize but emit/trigger the handler)\n    // Only used to improve performance\n    .quiet(true)\n        // first argument is a match on the current position in the buffer\n        .addRule('[', 'array-start')\n        .addRule(']', 'array-end')\n    .quiet() // Turn the quiet property off\n    // The second pattern will only match if it is not escaped (default escape character=\\)\n    .escaped(true)\n        .addRule('\"', '\"', 'string')\n    .escaped()\n    // Array item separator\n    .addRule(',', 'separator')\n    // Skip the match, in this case whitespaces\n    .ignore(true)\n        .addRule([' ','\\n', '\\t','\\r'], 'whitespaces')\n    .ignore()\n    // End of the buffer reached\n    // This is usually only needed when implementing synchronous parsers\n    .addRule(0, 'end')\n\n// Setup some variables\nvar stack = []\nvar inArray = false\n\n// Attach listeners to the tokenizer\ntok.on('data', function (token, idx, type) {\n    // token=the matched data\n    // idx=when using array of patterns, the index of the matched pattern\n    // type=string identifiers used in the rule definition\n    switch (type) {\n        case 'array-start':\n            stack.push([])\n            inArray = true\n        break\n        case 'array-end':\n            inArray = false\n        break\n        case 'string':\n            if (inArray)\n                stack[ stack.length-1 ].push(token)\n            else\n                throw new Error('only Arrays supported')\n        break\n        case 'separator':\n        break\n        case 'end':\n            console.log('results is of type', typeof stack[0], 'with', stack[0].length, 'item(s)')\n            console.log('results:', stack[0])\n            stack = []\n        break\n        default:\n            throw new Error('Unknown type: ' + type)\n    }\n})\n\n// Send some data to be parsed!\ntok.write('[ \"Hello\", \"world!\" ]')\n```\n\n__Output__\n\n    results is object with 1 item(s)\n    results: [ 'Hello world!' ]\n\n\n## Documentation\n\nSee [here](http://pierrec.github.com/node-atok/).\n\n\n## Testing\n\nAtok has a fairly extended set of tests written for [mocha](https://github.com/visionmedia/mocha). See the [test](https://github.com/pierrec/node-atok/tree/master/test) directory.\n\n\n## Issues\n\nSee the TODO file.\n\n\n## License\n\n[Here](https://github.com/pierrec/node-atok/tree/master/LICENSE)","_id":"atok@0.2.7","dist":{"shasum":"0d4c34b0a76431ea165d78426b56e0475badd14a","tarball":"https://registry.npmjs.org/atok/-/atok-0.2.7.tgz","integrity":"sha512-PlMxnCxYbbbwJcxPjTEyA7la4MC/N/r2Q4A+NZld33V1b96qWhn3NXXXmLetN6UWIpmn19GUoYZOqY05dhLIww==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCle+RSAPGiNSaoCXXu07+dD2SFYrRUDlcQ8McK8Ier8AIhAK/vWyU+uGGdMboVQ9gDy8z5GGt7CJDSGuoyn3Wddhe4"}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.3.0":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.3.0","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3","fnutils":">= 0.0.1"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.7","dox":"latest","dox-template":"latest","fstream":"latest"},"scripts":{"test":"mocha test/*-test.js"},"readme":"# ATOK - async tokenizer\n\n\n## Overview\n\nAtok is a fast, easy and flexible tokenizer designed for use with [node.js](http://nodejs.org). It is based around the [Stream](http://nodejs.org/docs/latest/api/streams.html) concept and is implemented as a read/write one.\n\nIt was originally inspired by [node-tokenizer](https://github.com/floby/node-tokenizer), but quickly grew into its own form as I wanted it to be RegExp agnostic so it could be used on node Buffer intances and more importantly *faster*.\n\nAtok is built using [ekam](https://github.com/pierrec/node-ekam) as it abuses includes and dynamic method generation.\n\nAtok is the fundation for the [atok-parser](https://github.com/pierrec/node-atok-parser), which provides the environment for quickly building efficient and easier to maintain parsers.\n\nThis is a work in progress as Buffer data is still converted into String before being processed. Removing this drawback is planned for the next version (0.4.0).\n\n\n## Core concepts\n\nFirst let's see some definitions. In atok's terms:\n\n* a `subrule` is an atomic check against the current data. It can be represented by a user defined function (rarely), a string or a number, or an array of those, as well as specific objects defining a range of values for instance (e.g. { start: 'a', end: 'z' } is equivalent to /[a-z]/ in RegExp)\n* a `rule` is an ordered combination of subrules. Each subrule is evaluated in order and if any fails, the whole rule is considered failed. If all of them are valid, then the handler supplied at rule instanciation is triggered, or if none was supplied, an event is emitted (the event name has to be supplied when defining the rule).\n* a `ruleSet` is a list of `rules` that are saved under a given name. Using `ruleSets` is useful when writting a parser to break down its complexity.\n* a `property` is an option applicable to the current rules being created.\n    * properties are set using their own methods. For instance, a `rule` may load a different `ruleSet` upon match using `next()`\n    * properties are defined before the rules they need to be applied to. E.g. atok.next('rules2').addRule(...)\n    * once defined, properties are applied to all subsequent rules, unless turned off by calling the property method with no argument or false. E.g. in atok.next('rules2').addRule(...).addRule(...).next().addRule(...) only rule 1 and 2 will load the `ruleSet` _rules2_ if they match.\n\n\nThe default workflow in atok is as follow:\n\n* data is provided to the tokenizer\n* the tokenizer evaluates each of its `rules` against it (its current `ruleSet`)\n    * if none match, it stops and waits for more\n    * if one matches, it triggers the handler/emit an event, then go back to rules evaluation\n\n\nThe default workflow can be altered using the `continue()` and `next()` property methods:\n\n* `continue(jump[, jumpOnFail])`: the next `rule` being checked is relative to the one that matched, downward if jump value is positive, upward if negative. In case the `rule` fails, by default, the tokenizer will process to the next one. This can be modified by specifying the jumpOnFail value.\n    * `continue(0)`: go to the next `rule` on success\n    * `continue(-1)`: reevaluate the current `rule` on success\n    * `continue(-2)`: go to the previous `rule` on success\n* `next(ruleSet[, index])`: when the handler returns, the tokenizer will evaluate rules from the new `ruleSet`, starting at the first one or the one at _index_.\n\n\nIt is important to note that the tokenizer is _highly_ dynamic:\n\n* `ruleSets` can be changed by handlers\n* `rules` and `ruleSets` can be created by handlers based on the data being processed\n* after a match, the tokenizer can branch to a different `ruleSet`\n\n\n## Download\n\nAtok is published on node package manager (npm). To install, do:\n\n    npm install atok\n\n\n## Quick example\n\nGiven the following json to be parsed:\n\n    [\"Hello world!\"]\n\nThe following code would be a very simple JSON parser for it.\n\n``` javascript\nvar Tokenizer = require('atok')\nvar tok = new Tokenizer\n\n// Define the parser rules\n// By default it will emit data events when a rule is matched\ntok\n    // Define the quiet property for the following rules (quiet=dont tokenize but emit/trigger the handler)\n    // Only used to improve performance\n    .quiet(true)\n        // first argument is a match on the current position in the buffer\n        .addRule('[', 'array-start')\n        .addRule(']', 'array-end')\n    .quiet() // Turn the quiet property off\n    // The second pattern will only match if it is not escaped (default escape character=\\)\n    .escaped(true)\n        .addRule('\"', '\"', 'string')\n    .escaped()\n    // Array item separator\n    .addRule(',', 'separator')\n    // Skip the match, in this case whitespaces\n    .ignore(true)\n        .addRule([' ','\\n', '\\t','\\r'], 'whitespaces')\n    .ignore()\n    // End of the buffer reached\n    // This is usually only needed when implementing synchronous parsers\n    .addRule(0, 'end')\n\n// Setup some variables\nvar stack = []\nvar inArray = false\n\n// Attach listeners to the tokenizer\ntok.on('data', function (token, idx, type) {\n    // token=the matched data\n    // idx=when using array of patterns, the index of the matched pattern\n    // type=string identifiers used in the rule definition\n    switch (type) {\n        case 'array-start':\n            stack.push([])\n            inArray = true\n        break\n        case 'array-end':\n            inArray = false\n        break\n        case 'string':\n            if (inArray)\n                stack[ stack.length-1 ].push(token)\n            else\n                throw new Error('only Arrays supported')\n        break\n        case 'separator':\n        break\n        case 'end':\n            console.log('results is of type', typeof stack[0], 'with', stack[0].length, 'item(s)')\n            console.log('results:', stack[0])\n            stack = []\n        break\n        default:\n            throw new Error('Unknown type: ' + type)\n    }\n})\n\n// Send some data to be parsed!\ntok.write('[ \"Hello\", \"world!\" ]')\n```\n\n__Output__\n\n    results is object with 1 item(s)\n    results: [ 'Hello world!' ]\n\n\n## Documentation\n\nSee [here](http://pierrec.github.com/node-atok/).\n\n\n## Testing\n\nAtok has a fairly extended set of tests written for [mocha](https://github.com/visionmedia/mocha). See the [test](https://github.com/pierrec/node-atok/tree/master/test) directory.\n\n\n## Issues\n\nSee the TODO file.\n\n\n## License\n\nMIT [Here](https://github.com/pierrec/node-atok/tree/master/LICENSE)","_id":"atok@0.3.0","dist":{"shasum":"a6dc4cf46627b6e4ac816b1ba32efeb4ef7217dd","tarball":"https://registry.npmjs.org/atok/-/atok-0.3.0.tgz","integrity":"sha512-Lh0VBfFt1V9RahazwsN3Cq7hu9Wiw0EDwvUtovUGI3bOIFABFsMiMGvhHl/I9hQMh3f2uqB5PXQeh7pt5WSJ8Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC7wikbnBf/D8uTimuHPkMcb070DuNSZ46j3q0d+8C4SQIgZoUyAwf4YiFwDvT0L/iK3Q63jERcm+qhAPISkJK4a7g="}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.3.1":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.3.1","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3","fnutils":">= 0.0.1"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.7","dox":"latest","dox-template":"latest","fstream":"latest"},"scripts":{"test":"mocha test/*-test.js"},"readme":"# ATOK - async tokenizer\n\n\n## Overview\n\nAtok is a fast, easy and flexible tokenizer designed for use with [node.js](http://nodejs.org). It is based around the [Stream](http://nodejs.org/docs/latest/api/streams.html) concept and is implemented as a read/write one.\n\nIt was originally inspired by [node-tokenizer](https://github.com/floby/node-tokenizer), but quickly grew into its own form as I wanted it to be RegExp agnostic so it could be used on node Buffer intances and more importantly *faster*.\n\nAtok is built using [ekam](https://github.com/pierrec/node-ekam) as it abuses includes and dynamic method generation.\n\nAtok is the fundation for the [atok-parser](https://github.com/pierrec/node-atok-parser), which provides the environment for quickly building efficient and easier to maintain parsers.\n\nThis is a work in progress as Buffer data is still converted into String before being processed. Removing this drawback is planned for the next version (0.4.0).\n\n\n## Core concepts\n\nFirst let's see some definitions. In atok's terms:\n\n* a `subrule` is an atomic check against the current data. It can be represented by a user defined function (rarely), a string or a number, or an array of those, as well as specific objects defining a range of values for instance (e.g. { start: 'a', end: 'z' } is equivalent to /[a-z]/ in RegExp)\n* a `rule` is an ordered combination of subrules. Each subrule is evaluated in order and if any fails, the whole rule is considered failed. If all of them are valid, then the handler supplied at rule instanciation is triggered, or if none was supplied, an event is emitted (the event name has to be supplied when defining the rule).\n* a `ruleSet` is a list of `rules` that are saved under a given name. Using `ruleSets` is useful when writting a parser to break down its complexity.\n* a `property` is an option applicable to the current rules being created.\n    * properties are set using their own methods. For instance, a `rule` may load a different `ruleSet` upon match using `next()`\n    * properties are defined before the rules they need to be applied to. E.g. atok.next('rules2').addRule(...)\n    * once defined, properties are applied to all subsequent rules, unless turned off by calling the property method with no argument or false. E.g. in atok.next('rules2').addRule(...).addRule(...).next().addRule(...) only rule 1 and 2 will load the `ruleSet` _rules2_ if they match.\n\n\nThe default workflow in atok is as follow:\n\n* data is provided to the tokenizer\n* the tokenizer evaluates each of its `rules` against it (its current `ruleSet`)\n    * if none match, it stops and waits for more\n    * if one matches, it triggers the handler/emit an event, then go back to rules evaluation\n\n\nThe default workflow can be altered using the `continue()` and `next()` property methods:\n\n* `continue(jump[, jumpOnFail])`: the next `rule` being checked is relative to the one that matched, downward if jump value is positive, upward if negative. In case the `rule` fails, by default, the tokenizer will process to the next one. This can be modified by specifying the jumpOnFail value.\n    * `continue(0)`: go to the next `rule` on success\n    * `continue(-1)`: reevaluate the current `rule` on success\n    * `continue(-2)`: go to the previous `rule` on success\n* `next(ruleSet[, index])`: when the handler returns, the tokenizer will evaluate rules from the new `ruleSet`, starting at the first one or the one at _index_.\n\n\nIt is important to note that the tokenizer is _highly_ dynamic:\n\n* `ruleSets` can be changed by handlers\n* `rules` and `ruleSets` can be created by handlers based on the data being processed\n* after a match, the tokenizer can branch to a different `ruleSet`\n\n\n## Download\n\nAtok is published on node package manager (npm). To install, do:\n\n    npm install atok\n\n\n## Quick example\n\nGiven the following json to be parsed:\n\n    [\"Hello world!\"]\n\nThe following code would be a very simple JSON parser for it.\n\n``` javascript\nvar Tokenizer = require('atok')\nvar tok = new Tokenizer\n\n// Define the parser rules\n// By default it will emit data events when a rule is matched\ntok\n    // Define the quiet property for the following rules (quiet=dont tokenize but emit/trigger the handler)\n    // Only used to improve performance\n    .quiet(true)\n        // first argument is a match on the current position in the buffer\n        .addRule('[', 'array-start')\n        .addRule(']', 'array-end')\n    .quiet() // Turn the quiet property off\n    // The second pattern will only match if it is not escaped (default escape character=\\)\n    .escaped(true)\n        .addRule('\"', '\"', 'string')\n    .escaped()\n    // Array item separator\n    .addRule(',', 'separator')\n    // Skip the match, in this case whitespaces\n    .ignore(true)\n        .addRule([' ','\\n', '\\t','\\r'], 'whitespaces')\n    .ignore()\n\n// Setup some variables\nvar stack = []\nvar inArray = false\n\n// Attach listeners to the tokenizer\ntok.on('data', function (token, idx, type) {\n    // token=the matched data\n    // idx=when using array of patterns, the index of the matched pattern\n    // type=string identifiers used in the rule definition\n    switch (type) {\n        case 'array-start':\n            stack.push([])\n            inArray = true\n        break\n        case 'array-end':\n            inArray = false\n        break\n        case 'string':\n            if (inArray)\n                stack[ stack.length-1 ].push(token)\n            else\n                throw new Error('only Arrays supported')\n        break\n        case 'separator':\n        break\n        default:\n            throw new Error('Unknown type: ' + type)\n    }\n})\ntok.on('end', function () {\n    console.log('results is of type', typeof stack[0], 'with', stack[0].length, 'item(s)')\n    console.log('results:', stack[0])\n    \n})\n\n// Send some data to be parsed!\ntok.end('[ \"Hello\", \"world!\" ]')\n```\n\n__Output__\n\n    results is object with 1 item(s)\n    results: [ 'Hello world!' ]\n\n\n## Documentation\n\nSee [here](http://pierrec.github.com/node-atok/).\n\n\n## Testing\n\nAtok has a fairly extended set of tests written for [mocha](https://github.com/visionmedia/mocha). See the [test](https://github.com/pierrec/node-atok/tree/master/test) directory.\n\n\n## Issues\n\nSee the TODO file.\n\n\n## License\n\nMIT [Here](https://github.com/pierrec/node-atok/tree/master/LICENSE)","_id":"atok@0.3.1","dist":{"shasum":"812164af84df1ff53f8acdbcd1ae4a75d7b0f9be","tarball":"https://registry.npmjs.org/atok/-/atok-0.3.1.tgz","integrity":"sha512-IMZN/nHxnAogAbhRRbkwxYUhqWGJovuCRZjDodJtuX9+Is/BmI5NW98SslbY8iNnjJDHnxrBmOmv/G7cMKYjkQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGAt+KvleETD/FHMWHuPb6HpW9tWVdELCFrdoi/VCnXVAiEAhI278oTLpInDxFceb4oWwkM+m2QjEzTaCXCWUfQ1NKc="}]},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"directories":{}},"0.3.2":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and flexible tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.3.2","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3","fnutils":">= 0.0.1"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.7","dox":"latest","dox-template":"latest","fstream":"latest"},"scripts":{"test":"mocha test/*-test.js"},"readme":"# ATOK - async tokenizer\n\n\n## Overview\n\nAtok is a fast, easy and flexible tokenizer designed for use with [node.js](http://nodejs.org). It is based around the [Stream](http://nodejs.org/docs/latest/api/streams.html) concept and is implemented as a read/write one.\n\nIt was originally inspired by [node-tokenizer](https://github.com/floby/node-tokenizer), but quickly grew into its own form as I wanted it to be RegExp agnostic so it could be used on node Buffer intances and more importantly *faster*.\n\nAtok is built using [ekam](https://github.com/pierrec/node-ekam) as it abuses includes and dynamic method generation.\n\nAtok is the fundation for the [atok-parser](https://github.com/pierrec/node-atok-parser), which provides the environment for quickly building efficient and easier to maintain parsers.\n\nThis is a work in progress as Buffer data is still converted into String before being processed. Removing this drawback is planned for the next version (0.4.0).\n\n\n## Core concepts\n\nFirst let's see some definitions. In atok's terms:\n\n* a `subrule` is an atomic check against the current data. It can be represented by a user defined function (rarely), a string or a number, or an array of those, as well as specific objects defining a range of values for instance (e.g. { start: 'a', end: 'z' } is equivalent to /[a-z]/ in RegExp)\n* a `rule` is an __ordered__ combination of subrules. Each subrule is evaluated in order and if any fails, the whole rule is considered failed. If all of them are valid, then the handler supplied at rule instanciation is triggered, or if none was supplied, a data event is emitted instead.\n* a `ruleSet` is a list of `rules` that are saved under a given name. Using `ruleSets` is useful when writting a parser to break down its complexity into smaller, easier to solve chunks.\n* a `property` is an option applicable to the current rules being created.\n    * properties are set using their own methods. For instance, a `rule` may load a different `ruleSet` upon match using `next()`\n    * properties are defined before the rules they need to be applied to. E.g. atok.next('rules2').addRule(...)\n    * once defined, properties are applied to all subsequent rules, unless turned off by calling the property method with no argument or false. E.g. in atok.next('rules2').addRule(...).addRule(...).next().addRule(...) only rule 1 and 2 will load the `ruleSet` _rules2_ if they match.\n\n\nThe default workflow in atok is as follow:\n\n* data is provided to the tokenizer\n* the tokenizer evaluates each of its `rules` against it (its current `ruleSet`)\n    * if none match, it stops and waits for more\n    * if one matches, it triggers the handler/emit an event, then go back to rules evaluation\n\n\nThe default workflow can be altered using the `continue()` and `next()` property methods:\n\n* `continue(jump[, jumpOnFail])`: the next `rule` being checked is relative to the one that matched, downward if jump value is positive, upward if negative. In case the `rule` fails, by default, the tokenizer will process to the next one. This can be modified by specifying the jumpOnFail value.\n    * `continue(0)`: go to the next `rule` on success\n    * `continue(-1)`: reevaluate the current `rule` on success\n    * `continue(-2)`: go to the previous `rule` on success\n* `next(ruleSet[, index])`: when the handler returns, the tokenizer will evaluate rules from the new `ruleSet`, starting at the first one or the one at _index_.\n\n\nIt is important to note that the tokenizer is _highly_ dynamic:\n\n* `ruleSets` can be changed by handlers\n* `rules` and `ruleSets` can be created by handlers based on the data being processed\n* after a match, the tokenizer can branch to a different `ruleSet`\n\n\n## Download\n\nAtok is published on node package manager (npm). To install, do:\n\n    npm install atok\n\n\n## Quick example\n\nGiven the following json to be parsed:\n\n    [\"Hello world!\"]\n\nThe following code would be a very simple JSON parser for it.\n\n``` javascript\nvar Tokenizer = require('atok')\nvar tok = new Tokenizer\n\n// Define the parser rules\n// By default it will emit data events when a rule is matched\ntok\n    // Define the quiet property for the following rules (quiet=dont tokenize but emit/trigger the handler)\n    // Only used to improve performance\n    .quiet(true)\n        // first argument is a match on the current position in the buffer\n        .addRule('[', 'array-start')\n        .addRule(']', 'array-end')\n    .quiet() // Turn the quiet property off\n    // The second pattern will only match if it is not escaped (default escape character=\\)\n    .escaped(true)\n        .addRule('\"', '\"', 'string')\n    .escaped()\n    // Array item separator\n    .addRule(',', 'separator')\n    // Skip the match, in this case whitespaces\n    .ignore(true)\n        .addRule([' ','\\n', '\\t','\\r'], 'whitespaces')\n    .ignore()\n\n// Setup some variables\nvar stack = []\nvar inArray = false\n\n// Attach listeners to the tokenizer\ntok.on('data', function (token, idx, type) {\n    // token=the matched data\n    // idx=when using array of patterns, the index of the matched pattern\n    // type=string identifiers used in the rule definition\n    switch (type) {\n        case 'array-start':\n            stack.push([])\n            inArray = true\n        break\n        case 'array-end':\n            inArray = false\n        break\n        case 'string':\n            if (inArray)\n                stack[ stack.length-1 ].push(token)\n            else\n                throw new Error('only Arrays supported')\n        break\n        case 'separator':\n        break\n        default:\n            throw new Error('Unknown type: ' + type)\n    }\n})\ntok.on('end', function () {\n    console.log('results is of type', typeof stack[0], 'with', stack[0].length, 'item(s)')\n    console.log('results:', stack[0])\n    \n})\n\n// Send some data to be parsed!\ntok.end('[ \"Hello\", \"world!\" ]')\n```\n\n__Output__\n\n    results is object with 1 item(s)\n    results: [ 'Hello world!' ]\n\n\n## Documentation\n\nSee [here](http://pierrec.github.com/node-atok/).\n\n\n## Testing\n\nAtok has a fairly extended set of tests written for [mocha](https://github.com/visionmedia/mocha). See the [test](https://github.com/pierrec/node-atok/tree/master/test) directory.\n\n\n## Issues\n\nSee the TODO file.\n\n\n## License\n\nMIT [Here](https://github.com/pierrec/node-atok/tree/master/LICENSE)","_id":"atok@0.3.2","dist":{"shasum":"58d229f74d0ee545bd475b806a04e07f229cdd95","tarball":"https://registry.npmjs.org/atok/-/atok-0.3.2.tgz","integrity":"sha512-wXZBTSCIBKmz1wrk1EI6FNgjgf3XAZCvA8YFEaYzUWILB9s25L9yKobBoyteLaMT/rJLhcOAmSb0vIqR5lolcA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCgnm4BXQs8qjFYEPNTHC0O+n+arHqtJb8w/P9ZT44rVQIhAIAR3V4y3TwJmSYbKAooECIIozaQH8FweRG+Fp1wT6C0"}]},"_npmVersion":"1.1.61","_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}]},"0.4.0":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and dynamic tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.4.0","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3","fnutils":">= 0.0.1"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.7","dox":"latest","dox-template":"latest","fstream":"latest"},"scripts":{"test":"mocha test/*-test.js"},"readme":"# ATOK - async tokenizer\n\n\n## Overview\n\nAtok is a fast, easy and dynamic tokenizer designed for use with [node.js](http://nodejs.org). It is based around the [Stream](http://nodejs.org/docs/latest/api/streams.html) concept and is implemented as a read/write one.\n\nIt was originally inspired by [node-tokenizer](https://github.com/floby/node-tokenizer), but quickly grew into its own form as I wanted it to be RegExp agnostic so it could be used on node Buffer intances and more importantly *faster*.\n\nAtok is built using [ekam](https://github.com/pierrec/node-ekam) as it abuses includes and dynamic method generation.\n\nAtok is the fundation for the [atok-parser](https://github.com/pierrec/node-atok-parser), which provides the environment for quickly building efficient and easier to maintain parsers.\n\n\n## Core concepts\n\nFirst let's see some definitions. In atok's terms:\n\n* a `subrule` is an atomic check against the current data. It can be represented by a user defined function (rarely), a string or a number, or an array of those, as well as specific objects defining a range of values for instance (e.g. { start: 'a', end: 'z' } is equivalent to /[a-z]/ in RegExp)\n* a `rule` is an __ordered__ combination of subrules. Each subrule is evaluated in order and if any fails, the whole rule is considered failed. If all of them are valid, then the handler supplied at rule instanciation is triggered, or if none was supplied, a data event is emitted instead.\n* a `ruleSet` is a list of `rules` that are saved under a given name. Using `ruleSets` is useful when writting a parser to break down its complexity into smaller, easier to solve chunks. RuleSets can be created or altered __on the fly__ by any of its handlers.\n* a `property` is an option applicable to the current rules being created.\n    * properties are set using their own methods. For instance, a `rule` may load a different `ruleSet` upon match using `next()`\n    * properties are defined before the rules they need to be applied to. E.g. atok.next('rules2').addRule(...)\n    * once defined, properties are applied to all subsequent rules, unless turned off by calling the property method with no argument or false. E.g. in atok.next('rules2').addRule(...).addRule(...).next().addRule(...) only rule 1 and 2 will load the `ruleSet` _rules2_ if they match.\n\n\nThe default workflow in atok is as follow:\n\n* data is provided to the tokenizer\n* the tokenizer evaluates each of its `rules` against it (its current `ruleSet`)\n    * if none match, it stops and waits for more\n    * if one matches, it triggers the handler/emit an event, then go back to rules evaluation\n\n\nThe default workflow can be altered using the `continue()` and `next()` property methods:\n\n* `continue(jump[, jumpOnFail])`: the next `rule` being checked is relative to the one that matched, downward if jump value is positive, upward if negative. In case the `rule` fails, by default, the tokenizer will process to the next one. This can be modified by specifying the jumpOnFail value.\n    * `continue(0)`: go to the next `rule` on success\n    * `continue(-1)`: reevaluate the current `rule` on success\n    * `continue(-2)`: go to the previous `rule` on success\n* `next(ruleSet[, index])`: when the handler returns, the tokenizer will evaluate rules from the new `ruleSet`, starting at the first one or the one at _index_.\n\n\nIt is important to note that the tokenizer is _highly_ dynamic:\n\n* `ruleSets` can be changed by handlers\n* `rules` and `ruleSets` can be created by handlers based on the data being processed\n* after a match, the tokenizer can branch to a different `ruleSet`\n\n\n## Download\n\nAtok is published on node package manager (npm). To install, do:\n\n    npm install atok\n\n\n## Quick example\n\nGiven the following json to be parsed:\n\n    [\"Hello world!\"]\n\nThe following code would be a very simple JSON parser for it.\n\n``` javascript\nvar Tokenizer = require('atok')\nvar tok = new Tokenizer\n\n// Define the parser rules\n// By default it will emit data events when a rule is matched\ntok\n    // Define the quiet property for the following rules (quiet=dont tokenize but emit/trigger the handler)\n    // Only used to improve performance\n    .quiet(true)\n        // first argument is a match on the current position in the buffer\n        .addRule('[', 'array-start')\n        .addRule(']', 'array-end')\n    .quiet() // Turn the quiet property off\n    // The second pattern will only match if it is not escaped (default escape character=\\)\n    .escaped(true)\n        .addRule('\"', '\"', 'string')\n    .escaped()\n    // Array item separator\n    .addRule(',', 'separator')\n    // Skip the match, in this case whitespaces\n    .ignore(true)\n        .addRule([' ','\\n', '\\t','\\r'], 'whitespaces')\n    .ignore()\n\n// Setup some variables\nvar stack = []\nvar inArray = false\n\n// Attach listeners to the tokenizer\ntok.on('data', function (token, idx, type) {\n    // token=the matched data\n    // idx=when using array of patterns, the index of the matched pattern\n    // type=string identifiers used in the rule definition\n    switch (type) {\n        case 'array-start':\n            stack.push([])\n            inArray = true\n        break\n        case 'array-end':\n            inArray = false\n        break\n        case 'string':\n            if (inArray)\n                stack[ stack.length-1 ].push(token)\n            else\n                throw new Error('only Arrays supported')\n        break\n        case 'separator':\n        break\n        default:\n            throw new Error('Unknown type: ' + type)\n    }\n})\ntok.on('end', function () {\n    console.log('results is of type', typeof stack[0], 'with', stack[0].length, 'item(s)')\n    console.log('results:', stack[0])\n    \n})\n\n// Send some data to be parsed!\ntok.end('[ \"Hello\", \"world!\" ]')\n```\n\n__Output__\n\n    results is object with 1 item(s)\n    results: [ 'Hello world!' ]\n\n\n## Documentation\n\nSee [here](http://pierrec.github.com/node-atok/).\n\n\n## Testing\n\nAtok has a fairly extended set of tests written for [mocha](https://github.com/visionmedia/mocha). See the [test](https://github.com/pierrec/node-atok/tree/master/test) directory.\n\n\n## Issues\n\nSee the TODO file.\n\n\n## License\n\nMIT [Here](https://github.com/pierrec/node-atok/tree/master/LICENSE)","readmeFilename":"README.md","_id":"atok@0.4.0","dist":{"shasum":"adfe52a5b6da6999ab80899efe5b47105a15e5d1","tarball":"https://registry.npmjs.org/atok/-/atok-0.4.0.tgz","integrity":"sha512-u9Fg42AV4KhQZhmtzcX4otQTfV9nQNciXPEHQI4WXcKbgytcDPf8OxRKfeqLJvtiDs3NLzQlDj9uHfZn3rySpg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEaOm/B+/Hz5eZ89JIXbrEx9NHx8jF+ZqRkLo/DplzuXAiBKueLZWLwzT55u6JcHDf/jIBssKw8cDU2/MPjLLDJL7w=="}]},"_npmVersion":"1.1.65","_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}]},"0.4.1":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and dynamic tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.4.1","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3","fnutils":">= 0.0.1","buffertools":">= 1.1"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.7","dox":"latest","dox-template":"latest","fstream":"latest"},"scripts":{"test":"mocha test/*-test.js"},"readme":"# ATOK - async tokenizer\n\n\n## Overview\n\nAtok is a fast, easy and dynamic tokenizer designed for use with [node.js](http://nodejs.org). It is based around the [Stream](http://nodejs.org/docs/latest/api/streams.html) concept and is implemented as a read/write one.\n\nIt was originally inspired by [node-tokenizer](https://github.com/floby/node-tokenizer), but quickly grew into its own form as I wanted it to be RegExp agnostic so it could be used on node Buffer intances and more importantly *faster*.\n\nAtok is built using [ekam](https://github.com/pierrec/node-ekam) as it abuses includes and dynamic method generation.\n\nAtok is the fundation for the [atok-parser](https://github.com/pierrec/node-atok-parser), which provides the environment for quickly building efficient and easier to maintain parsers.\n\n\n## Core concepts\n\nFirst let's see some definitions. In atok's terms:\n\n* a `subrule` is an atomic check against the current data. It can be represented by a user defined function (rarely), a string or a number, or an array of those, as well as specific objects defining a range of values for instance (e.g. { start: 'a', end: 'z' } is equivalent to /[a-z]/ in RegExp)\n* a `rule` is an __ordered__ combination of subrules. Each subrule is evaluated in order and if any fails, the whole rule is considered failed. If all of them are valid, then the handler supplied at rule instanciation is triggered, or if none was supplied, a data event is emitted instead.\n* a `ruleSet` is a list of `rules` that are saved under a given name. Using `ruleSets` is useful when writting a parser to break down its complexity into smaller, easier to solve chunks. RuleSets can be created or altered __on the fly__ by any of its handlers.\n* a `property` is an option applicable to the current rules being created.\n    * properties are set using their own methods. For instance, a `rule` may load a different `ruleSet` upon match using `next()`\n    * properties are defined before the rules they need to be applied to. E.g. atok.next('rules2').addRule(...)\n    * once defined, properties are applied to all subsequent rules, unless turned off by calling the property method with no argument or false. E.g. in atok.next('rules2').addRule(...).addRule(...).next().addRule(...) only rule 1 and 2 will load the `ruleSet` _rules2_ if they match.\n\n\nThe default workflow in atok is as follow:\n\n* data is provided to the tokenizer\n* the tokenizer evaluates each of its `rules` against it (its current `ruleSet`)\n    * if none match, it stops and waits for more\n    * if one matches, it triggers the handler/emit an event, then go back to rules evaluation\n\n\nThe default workflow can be altered using the `continue()` and `next()` property methods:\n\n* `continue(jump[, jumpOnFail])`: the next `rule` being checked is relative to the one that matched, downward if jump value is positive, upward if negative. In case the `rule` fails, by default, the tokenizer will process to the next one. This can be modified by specifying the jumpOnFail value.\n    * `continue(0)`: go to the next `rule` on success\n    * `continue(-1)`: reevaluate the current `rule` on success\n    * `continue(-2)`: go to the previous `rule` on success\n* `next(ruleSet[, index])`: when the handler returns, the tokenizer will evaluate rules from the new `ruleSet`, starting at the first one or the one at _index_.\n\n\nIt is important to note that the tokenizer is _highly_ dynamic:\n\n* `ruleSets` can be changed by handlers\n* `rules` and `ruleSets` can be created by handlers based on the data being processed\n* after a match, the tokenizer can branch to a different `ruleSet`\n\n\n## Download\n\nAtok is published on node package manager (npm). To install, do:\n\n    npm install atok\n\n\n## Quick example\n\nGiven the following json to be parsed:\n\n    [\"Hello world!\"]\n\nThe following code would be a very simple JSON parser for it.\n\n``` javascript\nvar Tokenizer = require('atok')\nvar tok = new Tokenizer\n\n// Define the parser rules\n// By default it will emit data events when a rule is matched\ntok\n    // Define the quiet property for the following rules (quiet=dont tokenize but emit/trigger the handler)\n    // Only used to improve performance\n    .quiet(true)\n        // first argument is a match on the current position in the buffer\n        .addRule('[', 'array-start')\n        .addRule(']', 'array-end')\n    .quiet() // Turn the quiet property off\n    // The second pattern will only match if it is not escaped (default escape character=\\)\n    .escaped(true)\n        .addRule('\"', '\"', 'string')\n    .escaped()\n    // Array item separator\n    .addRule(',', 'separator')\n    // Skip the match, in this case whitespaces\n    .ignore(true)\n        .addRule([' ','\\n', '\\t','\\r'], 'whitespaces')\n    .ignore()\n\n// Setup some variables\nvar stack = []\nvar inArray = false\n\n// Attach listeners to the tokenizer\ntok.on('data', function (token, idx, type) {\n    // token=the matched data\n    // idx=when using array of patterns, the index of the matched pattern\n    // type=string identifiers used in the rule definition\n    switch (type) {\n        case 'array-start':\n            stack.push([])\n            inArray = true\n        break\n        case 'array-end':\n            inArray = false\n        break\n        case 'string':\n            if (inArray)\n                stack[ stack.length-1 ].push(token)\n            else\n                throw new Error('only Arrays supported')\n        break\n        case 'separator':\n        break\n        default:\n            throw new Error('Unknown type: ' + type)\n    }\n})\ntok.on('end', function () {\n    console.log('results is of type', typeof stack[0], 'with', stack[0].length, 'item(s)')\n    console.log('results:', stack[0])\n    \n})\n\n// Send some data to be parsed!\ntok.end('[ \"Hello\", \"world!\" ]')\n```\n\n__Output__\n\n    results is object with 1 item(s)\n    results: [ 'Hello world!' ]\n\n\n## Documentation\n\nSee [here](http://pierrec.github.com/node-atok/).\n\n\n## Testing\n\nAtok has a fairly extended set of tests written for [mocha](https://github.com/visionmedia/mocha). See the [test](https://github.com/pierrec/node-atok/tree/master/test) directory.\n\n\n## Issues\n\nSee the TODO file.\n\n\n## License\n\nMIT [Here](https://github.com/pierrec/node-atok/tree/master/LICENSE)","readmeFilename":"README.md","_id":"atok@0.4.1","dist":{"shasum":"1972583995eaa501ab51050df67d8706d7695985","tarball":"https://registry.npmjs.org/atok/-/atok-0.4.1.tgz","integrity":"sha512-t+Es8ncGmaQ7sZU9NFsWy8midXRDaVCsmma+9B4vqd/aAG05xI2klxYIzz/nJKIbkXQtYLCdlR0pGaksX9W1nw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIESUEteqHPs6Z6M8PBErIuzID9tt9tJiLUH5AuH9V8vCAiBcund+K6mJEZMrzuykmkmwySYTwz3CRDa2++KIejUtvg=="}]},"_npmVersion":"1.1.65","_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}]},"0.4.2":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and dynamic tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.4.2","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3","fnutils":">= 0.0.1","buffertools":">= 1.1"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.7","dox":"latest","dox-template":"latest","fstream":"latest"},"scripts":{"test":"mocha test/*-test.js"},"readme":"# ATOK - async tokenizer\n\n\n## Overview\n\nAtok is a fast, easy and dynamic tokenizer designed for use with [node.js](http://nodejs.org). It is based around the [Stream](http://nodejs.org/docs/latest/api/streams.html) concept and is implemented as a read/write one.\n\nIt was originally inspired by [node-tokenizer](https://github.com/floby/node-tokenizer), but quickly grew into its own form as I wanted it to be RegExp agnostic so it could be used on node Buffer intances and more importantly *faster*.\n\nAtok is built using [ekam](https://github.com/pierrec/node-ekam) as it abuses includes and dynamic method generation.\n\nAtok is the fundation for the [atok-parser](https://github.com/pierrec/node-atok-parser), which provides the environment for quickly building efficient and easier to maintain parsers.\n\n\n## Core concepts\n\nFirst let's see some definitions. In atok's terms:\n\n* a `subrule` is an atomic check against the current data. It can be represented by a user defined function (rarely), a string or a number, or an array of those, as well as specific objects defining a range of values for instance (e.g. { start: 'a', end: 'z' } is equivalent to /[a-z]/ in RegExp)\n* a `rule` is an __ordered__ combination of subrules. Each subrule is evaluated in order and if any fails, the whole rule is considered failed. If all of them are valid, then the handler supplied at rule instanciation is triggered, or if none was supplied, a data event is emitted instead.\n* a `ruleSet` is a list of `rules` that are saved under a given name. Using `ruleSets` is useful when writting a parser to break down its complexity into smaller, easier to solve chunks. RuleSets can be created or altered __on the fly__ by any of its handlers.\n* a `property` is an option applicable to the current rules being created.\n    * properties are set using their own methods. For instance, a `rule` may load a different `ruleSet` upon match using `next()`\n    * properties are defined before the rules they need to be applied to. E.g. atok.next('rules2').addRule(...)\n    * once defined, properties are applied to all subsequent rules, unless turned off by calling the property method with no argument or false. E.g. in atok.next('rules2').addRule(...).addRule(...).next().addRule(...) only rule 1 and 2 will load the `ruleSet` _rules2_ if they match.\n\n\nThe default workflow in atok is as follow:\n\n* data is provided to the tokenizer\n* the tokenizer evaluates each of its `rules` against it (its current `ruleSet`)\n    * if none match, it stops and waits for more\n    * if one matches, it triggers the handler/emit an event, then go back to rules evaluation\n\n\nThe default workflow can be altered using the `continue()` and `next()` property methods:\n\n* `continue(jump[, jumpOnFail])`: the next `rule` being checked is relative to the one that matched, downward if jump value is positive, upward if negative. In case the `rule` fails, by default, the tokenizer will process to the next one. This can be modified by specifying the jumpOnFail value.\n    * `continue(0)`: go to the next `rule` on success\n    * `continue(-1)`: reevaluate the current `rule` on success\n    * `continue(-2)`: go to the previous `rule` on success\n* `next(ruleSet[, index])`: when the handler returns, the tokenizer will evaluate rules from the new `ruleSet`, starting at the first one or the one at _index_.\n\n\nIt is important to note that the tokenizer is _highly_ dynamic:\n\n* `ruleSets` can be changed by handlers\n* `rules` and `ruleSets` can be created by handlers based on the data being processed\n* after a match, the tokenizer can branch to a different `ruleSet`\n\n\n## Download\n\nAtok is published on node package manager (npm). To install, do:\n\n    npm install atok\n\n\n## Quick example\n\nGiven the following json to be parsed:\n\n    [\"Hello world!\"]\n\nThe following code would be a very simple JSON parser for it.\n\n``` javascript\nvar Tokenizer = require('atok')\nvar tok = new Tokenizer\n\n// Define the parser rules\n// By default it will emit data events when a rule is matched\ntok\n    // Define the quiet property for the following rules (quiet=dont tokenize but emit/trigger the handler)\n    // Only used to improve performance\n    .quiet(true)\n        // first argument is a match on the current position in the buffer\n        .addRule('[', 'array-start')\n        .addRule(']', 'array-end')\n    .quiet() // Turn the quiet property off\n    // The second pattern will only match if it is not escaped (default escape character=\\)\n    .escaped(true)\n        .addRule('\"', '\"', 'string')\n    .escaped()\n    // Array item separator\n    .addRule(',', 'separator')\n    // Skip the match, in this case whitespaces\n    .ignore(true)\n        .addRule([' ','\\n', '\\t','\\r'], 'whitespaces')\n    .ignore()\n\n// Setup some variables\nvar stack = []\nvar inArray = false\n\n// Attach listeners to the tokenizer\ntok.on('data', function (token, idx, type) {\n    // token=the matched data\n    // idx=when using array of patterns, the index of the matched pattern\n    // type=string identifiers used in the rule definition\n    switch (type) {\n        case 'array-start':\n            stack.push([])\n            inArray = true\n        break\n        case 'array-end':\n            inArray = false\n        break\n        case 'string':\n            if (inArray)\n                stack[ stack.length-1 ].push(token)\n            else\n                throw new Error('only Arrays supported')\n        break\n        case 'separator':\n        break\n        default:\n            throw new Error('Unknown type: ' + type)\n    }\n})\ntok.on('end', function () {\n    console.log('results is of type', typeof stack[0], 'with', stack[0].length, 'item(s)')\n    console.log('results:', stack[0])\n    \n})\n\n// Send some data to be parsed!\ntok.end('[ \"Hello\", \"world!\" ]')\n```\n\n__Output__\n\n    results is object with 1 item(s)\n    results: [ 'Hello world!' ]\n\n\n## Documentation\n\nSee [here](http://pierrec.github.com/node-atok/).\n\n\n## Testing\n\nAtok has a fairly extended set of tests written for [mocha](https://github.com/visionmedia/mocha). See the [test](https://github.com/pierrec/node-atok/tree/master/test) directory.\n\n\n## Issues\n\nSee the TODO file.\n\n\n## License\n\nMIT [Here](https://github.com/pierrec/node-atok/tree/master/LICENSE)","readmeFilename":"README.md","_id":"atok@0.4.2","dist":{"shasum":"4d648c958a09696c20e266780cfb9ee7bf766840","tarball":"https://registry.npmjs.org/atok/-/atok-0.4.2.tgz","integrity":"sha512-gUDzLryctVmkdm4oRrnkUUHhZlB3RhmRCjhyrT1PXiRUCh/ttB8MU4Z4Knox2uYf7tyafGseDqvlI46UF6qh3w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDuZK/8Hw2+j83Lxwfj/amvKeiEmXpFCjzMwp63r036zwIhAKJOGNI8UzblRIv1cAvW1oeglxBc+FR6g7jhjUkHHgW5"}]},"_npmVersion":"1.1.65","_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}]},"0.4.3":{"author":{"name":"Pierre Curto"},"name":"atok","description":"Fast, easy and dynamic tokenizer for Node Streams","keywords":["tokenizer","token","async","stream"],"version":"0.4.3","homepage":"http://github.com/pierrec/node-atok","repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"main":"./lib/tokenizer.js","bugs":{"url":"http://github.com/pierrec/node-atok/issues"},"licenses":[{"type":"MIT","url":"http://github.com/pierrec/node-atok/raw/master/LICENSE"}],"engines":{"node":">= 0.6"},"dependencies":{"inherits":">= 1.0","ev":">= 0.0.3","fnutils":">= 0.0.1","buffertools":">= 1.1"},"devDependencies":{"mocha":">= 0.10","bench":">= 0.3","ekam":">= 0.0.7","dox":"latest","dox-template":"latest","fstream":"latest"},"scripts":{"test":"mocha test/*-test.js"},"readme":"# ATOK - async tokenizer\n\n\n## Overview\n\nAtok is a fast, easy and dynamic tokenizer designed for use with [node.js](http://nodejs.org). It is based around the [Stream](http://nodejs.org/docs/latest/api/streams.html) concept and is implemented as a read/write one.\n\nIt was originally inspired by [node-tokenizer](https://github.com/floby/node-tokenizer), but quickly grew into its own form as I wanted it to be RegExp agnostic so it could be used on node Buffer intances and more importantly *faster*.\n\nAtok is built using [ekam](https://github.com/pierrec/node-ekam) as it abuses includes and dynamic method generation.\n\nAtok is the fundation for the [atok-parser](https://github.com/pierrec/node-atok-parser), which provides the environment for quickly building efficient and easier to maintain parsers.\n\n\n## Core concepts\n\nFirst let's see some definitions. In atok's terms:\n\n* a `subrule` is an atomic check against the current data. It can be represented by a user defined function (rarely), a string or a number, or an array of those, as well as specific objects defining a range of values for instance (e.g. { start: 'a', end: 'z' } is equivalent to /[a-z]/ in RegExp)\n* a `rule` is an __ordered__ combination of subrules. Each subrule is evaluated in order and if any fails, the whole rule is considered failed. If all of them are valid, then the handler supplied at rule instanciation is triggered, or if none was supplied, a data event is emitted instead.\n* a `ruleSet` is a list of `rules` that are saved under a given name. Using `ruleSets` is useful when writting a parser to break down its complexity into smaller, easier to solve chunks. RuleSets can be created or altered __on the fly__ by any of its handlers.\n* a `property` is an option applicable to the current rules being created.\n    * properties are set using their own methods. For instance, a `rule` may load a different `ruleSet` upon match using `next()`\n    * properties are defined before the rules they need to be applied to. E.g. atok.next('rules2').addRule(...)\n    * once defined, properties are applied to all subsequent rules, unless turned off by calling the property method with no argument or false. E.g. in atok.next('rules2').addRule(...).addRule(...).next().addRule(...) only rule 1 and 2 will load the `ruleSet` _rules2_ if they match.\n\n\nThe default workflow in atok is as follow:\n\n* data is provided to the tokenizer\n* the tokenizer evaluates each of its `rules` against it (its current `ruleSet`)\n    * if none match, it stops and waits for more\n    * if one matches, it triggers the handler/emit an event, then go back to rules evaluation\n\n\nThe default workflow can be altered using the `continue()` and `next()` property methods:\n\n* `continue(jump[, jumpOnFail])`: the next `rule` being checked is relative to the one that matched, downward if jump value is positive, upward if negative. In case the `rule` fails, by default, the tokenizer will process to the next one. This can be modified by specifying the jumpOnFail value.\n    * `continue(0)`: go to the next `rule` on success\n    * `continue(-1)`: reevaluate the current `rule` on success\n    * `continue(-2)`: go to the previous `rule` on success\n* `next(ruleSet[, index])`: when the handler returns, the tokenizer will evaluate rules from the new `ruleSet`, starting at the first one or the one at _index_.\n\n\nIt is important to note that the tokenizer is _highly_ dynamic:\n\n* `ruleSets` can be changed by handlers\n* `rules` and `ruleSets` can be created by handlers based on the data being processed\n* after a match, the tokenizer can branch to a different `ruleSet`\n\n\n## Download\n\nAtok is published on node package manager (npm). To install, do:\n\n    npm install atok\n\n\n## Quick example\n\nGiven the following json to be parsed:\n\n    [\"Hello world!\"]\n\nThe following code would be a very simple JSON parser for it.\n\n``` javascript\nvar Tokenizer = require('atok')\nvar tok = new Tokenizer\n\n// Define the parser rules\n// By default it will emit data events when a rule is matched\ntok\n    // Define the quiet property for the following rules (quiet=dont tokenize but emit/trigger the handler)\n    // Only used to improve performance\n    .quiet(true)\n        // first argument is a match on the current position in the buffer\n        .addRule('[', 'array-start')\n        .addRule(']', 'array-end')\n    .quiet() // Turn the quiet property off\n    // The second pattern will only match if it is not escaped (default escape character=\\)\n    .escaped(true)\n        .addRule('\"', '\"', 'string')\n    .escaped()\n    // Array item separator\n    .addRule(',', 'separator')\n    // Skip the match, in this case whitespaces\n    .ignore(true)\n        .addRule([' ','\\n', '\\t','\\r'], 'whitespaces')\n    .ignore()\n\n// Setup some variables\nvar stack = []\nvar inArray = false\n\n// Attach listeners to the tokenizer\ntok.on('data', function (token, idx, type) {\n    // token=the matched data\n    // idx=when using array of patterns, the index of the matched pattern\n    // type=string identifiers used in the rule definition\n    switch (type) {\n        case 'array-start':\n            stack.push([])\n            inArray = true\n        break\n        case 'array-end':\n            inArray = false\n        break\n        case 'string':\n            if (inArray)\n                stack[ stack.length-1 ].push(token)\n            else\n                throw new Error('only Arrays supported')\n        break\n        case 'separator':\n        break\n        default:\n            throw new Error('Unknown type: ' + type)\n    }\n})\ntok.on('end', function () {\n    console.log('results is of type', typeof stack[0], 'with', stack[0].length, 'item(s)')\n    console.log('results:', stack[0])\n    \n})\n\n// Send some data to be parsed!\ntok.end('[ \"Hello\", \"world!\" ]')\n```\n\n__Output__\n\n    results is object with 1 item(s)\n    results: [ 'Hello world!' ]\n\n\n## Documentation\n\nSee [here](http://pierrec.github.com/node-atok/).\n\n\n## Testing\n\nAtok has a fairly extended set of tests written for [mocha](https://github.com/visionmedia/mocha). See the [test](https://github.com/pierrec/node-atok/tree/master/test) directory.\n\n\n## Issues\n\nSee the TODO file.\n\n\n## License\n\nMIT [Here](https://github.com/pierrec/node-atok/tree/master/LICENSE)","readmeFilename":"README.md","_id":"atok@0.4.3","dist":{"shasum":"a1670c0767c5af7b34ee0c0bd5e3b3fb8c15b554","tarball":"https://registry.npmjs.org/atok/-/atok-0.4.3.tgz","integrity":"sha512-AJ2q77OCcuODRrkY6A9tgaV2Z3pj/0iC49YiD9INEyLWFA600qToBbHWpHH0dQcRo9rcHZ4uZP/aTFU8t4X3ww==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDfnxOXk9e92C4IF3v4NQ6jMR5QNV9F18XDJY2r9Gx4tQIgGeFvw8CxhNG351fe3MVd2CqN2zunnb/e3anrcyNiKJE="}]},"_npmVersion":"1.1.66","_npmUser":{"name":"pierrec","email":"pierre.curto@gmail.com"},"maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}]}},"readme":"# ATOK - async tokenizer\n\n## Overview\n\nAtok is a fast, easy and flexible tokenizer designed for use with [node.js](http://nodejs.org). It is based around the [Stream](http://nodejs.org/docs/latest/api/streams.html) concept and is implemented as one.\n\nIt was originally inspired by [node-tokenizer](https://github.com/floby/node-tokenizer), but quickly grew into its own form as I wanted it to be RegExp agnostic so it could be used on node Buffer intances and more importantly *faster*. As of the first release, it does not support Buffer instances (yet!) but it is planned to be the next major feature.\n\n\n## Download\n\nIt is published on node package manager (npm). To install, do:\n\n    npm install atok\n\n\n## Quick example\n\nGiven the following json to be parsed:\n\n    [\"Hello world!\"]\n\nThe following code would be a very simple JSON parser for it.\n\n``` javascript\nvar Tokenizer = require('..')\nvar tok = new Tokenizer\n\n// Define the parser rules\n// By default it will emit data events when a rule is matched\ntok\n    // Define the quiet property for the following rules (quiet=dont tokenize but emit/trigger the handler)\n    // Only used to improve performance\n    .quiet(true)\n        // first argument is a match on the current position in the buffer\n        .addRule('[', 'array-start')\n        .addRule(']', 'array-end')\n    .quiet() // Turn the quiet property off\n    // The second pattern will only match if it is not escaped (default escape character=\\)\n    .escaped(true)\n        .addRule('\"', '\"', 'string')\n    .escaped()\n    // Array item separator\n    .addRule(',', 'separator')\n    // Skip the match, in this case whitespaces\n    .ignore(true)\n        .addRule([' ','\\n', '\\t','\\r'], 'whitespaces')\n    .ignore()\n    // End of the buffer reached\n    // This is usually only needed when implementing synchronous parsers\n    .addRule(0, 'end')\n\n// Setup some variables\nvar stack = []\nvar inArray = false\n\n// Attach listeners to the tokenizer\ntok.on('data', function (token, idx, type) {\n    // token=the matched data\n    // idx=when using array of patterns, the index of the matched pattern\n    // type=string identifiers used in the rule definition\n    switch (type) {\n        case 'array-start':\n            stack.push([])\n            inArray = true\n        break\n        case 'array-end':\n            inArray = false\n        break\n        case 'string':\n            if (inArray)\n                stack[ stack.length-1 ].push(token)\n            else\n                throw new Error('only Arrays supported')\n        break\n        case 'separator':\n        break\n        case 'end':\n            console.log('results is of type', typeof stack[0], 'with', stack[0].length, 'item(s)')\n            console.log('results:', stack[0])\n            stack = []\n        break\n        default:\n            throw new Error('Unknown type: ' + type)\n    }\n})\n\n// Send some data to be parsed!\ntok.write('[ \"Hello\", \"world!\" ]')\n```\n\n__Output__\n\n    results is object with 1 item(s)\n    results: [ 'Hello world!' ]\n\n## Documentation\n\nSee [here](http://pierrec.github.com/node-atok/). Documentation generated by [ndoc](https://github.com/nodeca/ndoc).\n\n## Testing\n\nAtok has a fairly extended set of tests written for [mocha](https://github.com/visionmedia/mocha). See the [test](https://github.com/pierrec/node-atok/tree/master/test) directory.\n\n## Performance\n\nAtok performance was tested by writing a JSON parser and comparing its results to the excellent Douglas Crockford's [](). It currently scores slower on data sets containing small items, but much faster on large ones.\n\nThe JSON parser based on atok will be published soon as well as the benchmarks for it.\n\nThere are plans to increase performance, as listed in the [TODO](https://github.com/pierrec/node-atok/tree/master/TODO.md) document.\n\n## License\n\n[Here](https://github.com/pierrec/node-atok/tree/master/LICENSE)","maintainers":[{"name":"pierrec","email":"pierre.curto@gmail.com"}],"time":{"modified":"2022-06-13T03:41:15.717Z","created":"2012-01-30T21:02:49.332Z","0.1.1":"2012-01-30T21:02:53.206Z","0.1.2":"2012-02-03T17:26:43.872Z","0.1.3":"2012-02-05T18:04:43.999Z","0.1.4":"2012-02-06T18:35:43.985Z","0.1.5":"2012-02-09T13:03:03.513Z","0.1.6":"2012-02-09T15:33:17.384Z","0.1.7":"2012-02-12T14:47:29.308Z","0.1.8":"2012-02-12T21:51:11.556Z","0.1.9":"2012-02-20T22:05:27.745Z","0.1.10":"2012-02-23T21:06:21.970Z","0.2.0":"2012-02-24T17:16:23.156Z","0.2.1":"2012-02-26T16:32:16.630Z","0.2.2":"2012-02-29T14:49:07.834Z","0.2.3":"2012-03-16T16:14:40.912Z","0.2.4":"2012-04-20T13:10:34.366Z","0.2.5":"2012-05-14T13:13:50.799Z","0.2.6":"2012-05-31T10:25:17.706Z","0.2.7":"2012-06-25T19:13:15.778Z","0.3.0":"2012-07-10T08:36:49.877Z","0.3.1":"2012-07-26T12:22:35.916Z","0.3.2":"2012-09-16T13:50:51.679Z","0.4.0":"2012-11-06T18:06:37.028Z","0.4.1":"2012-11-08T21:47:37.072Z","0.4.2":"2012-11-21T22:41:25.021Z","0.4.3":"2012-12-05T18:39:31.619Z"},"author":{"name":"Pierre Curto"},"repository":{"type":"git","url":"git://github.com/pierrec/node-atok.git"},"users":{"fgribreau":true,"joshjung":true,"jimnox":true}}