Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

new docs

  • Loading branch information...
commit 6486b4c0142ec3c03aae550e1cf70afa8c206240 1 parent 15fc134
@tj tj authored
View
17 highlight.js
@@ -0,0 +1,17 @@
+$(function(){
+ $('code').each(function(){
+ $(this).html(highlight($(this).text()));
+ });
+});
+
+function highlight(js) {
+ return js
+ .replace(/</g, '&lt;')
+ .replace(/>/g, '&gt;')
+ .replace(/\/\/(.*)/gm, '<span class="comment">//$1</span>')
+ .replace(/('.*')/gm, '<span class="string">$1</span>')
+ .replace(/(\d+\.\d+)/gm, '<span class="number">$1</span>')
+ .replace(/(\d+)/gm, '<span class="number">$1</span>')
+ .replace(/\bnew *(\w+)/gm, '<span class="keyword">new</span> <span class="init">$1</span>')
+ .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '<span class="keyword">$1</span>')
+}
View
170 index.html
@@ -0,0 +1,170 @@
+<!DOCTYPE html><html><head><title>node-zeromq</title><link rel="stylesheet" href="style.css"><script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script><script src="highlight.js"></script><script src="menu.js"></script></head><body><h1>node-zeromq</h1><p><a href="http://www.zeromq.org/">ZeroMQ </a>bindings for Node.js
+</p><div class="comment"><h2>types</h2><div class="description"><p>Map of socket types.</p></div><a href="#" class="view-source">View source</a><pre><code>var types = exports.types = {
+ pub: zmq.ZMQ_PUB
+ , sub: zmq.ZMQ_SUB
+ , req: zmq.ZMQ_REQ
+ , xreq: zmq.ZMQ_XREQ
+ , rep: zmq.ZMQ_REP
+ , xrep: zmq.ZMQ_XREP
+ , push: zmq.ZMQ_PUSH
+ , pull: zmq.ZMQ_PULL
+ , dealer: zmq.ZMQ_DEALER
+ , router: zmq.ZMQ_ROUTER
+ , pair: zmq.ZMQ_PAIR
+};</code></pre></div><div class="comment"><h2>opts</h2><div class="description"><p>Map of socket options.</p></div><a href="#" class="view-source">View source</a><pre><code>var opts = exports.options = {
+ _fd: zmq.ZMQ_FD
+ , _ioevents: zmq.ZMQ_EVENTS
+ , _receiveMore: zmq.ZMQ_RCVMORE
+ , _subscribe: zmq.ZMQ_SUBSCRIBE
+ , _unsubscribe: zmq.ZMQ_UNSUBSCRIBE
+ , affinity: zmq.ZMQ_AFFINITY
+ , backlog: zmq.ZMQ_BACKLOG
+ , hwm: zmq.ZMQ_HWM
+ , identity: zmq.ZMQ_IDENTITY
+ , linger: zmq.ZMQ_LINGER
+ , mcast_loop: zmq.ZMQ_MCAST_LOOP
+ , rate: zmq.ZMQ_RATE
+ , rcvbuf: zmq.ZMQ_RCVBUF
+ , reconnect_ivl: zmq.ZMQ_RECONNECT_IVL
+ , recovery_ivl: zmq.ZMQ_RECOVERY_IVL
+ , sndbuf: zmq.ZMQ_SNDBUF
+ , swap: zmq.ZMQ_SWAP
+};
+
+// Context management happens here. We lazily initialize a default context,
+// and use that everywhere. Also cleans up on exit.
+var ctx;
+function defaultContext() {
+ if (ctx) return ctx;
+
+ var io_threads = 1;
+ if (process.env.ZMQ_IO_THREADS) {
+ io_threads = parseInt(process.env.ZMQ_IO_THREADS, 10);
+ if (!io_threads || io_threads < 1) {
+ console.warn('Invalid number in ZMQ_IO_THREADS, using 1 IO thread.');
+ io_threads = 1;
+ }
+ }
+
+ ctx = new zmq.Context(io_threads);
+ process.on('exit', function() {
+ // ctx.close();
+ ctx = null;
+ });
+
+ return ctx;
+};</code></pre></div><div class="comment"><h2>Socket()</h2><div class="description"><p>Create a new socket of the given <code>type</code>.</p></div><a href="#" class="view-source">View source</a><pre><code>function Socket(type) {
+ this.type = type;
+ this._zmq = new zmq.Socket(defaultContext(), types[type]);
+ this._outgoing = [];
+ this._watcher = new IOWatcher;
+ this._watcher.callback = this._flush.bind(this);
+ this._watcher.set(this._fd, true, false);
+ this._watcher.start();
+};</code></pre></div><div class="comment"><h2>Socket.prototype.setsockopt()</h2><div class="description"><p>Set <code>opt</code> to <code>val</code>.</p></div><a href="#" class="view-source">View source</a><pre><code>Socket.prototype.setsockopt = function(opt, val){
+ this._zmq.setsockopt(opts[opt] || opt, val);
+ return this;
+};</code></pre></div><div class="comment"><h2>Socket.prototype.getsockopt()</h2><div class="description"><p>Get socket <code>opt</code>.</p></div><a href="#" class="view-source">View source</a><pre><code>Socket.prototype.getsockopt = function(opt){
+ return this._zmq.getsockopt(opts[opt] || opt);
+};</code></pre></div><div class="comment"><h2>Socket.prototype.bind()</h2><div class="description"><p>Async bind.</p>
+
+<p>Emits the "bind" event.</p></div><a href="#" class="view-source">View source</a><pre><code>Socket.prototype.bind = function(addr, cb) {
+ var self = this;
+ self._watcher.stop();
+ self._zmq.bind(addr, function(err) {
+ self._watcher.start();
+ self.emit('bind');
+ cb && cb(err);
+ });
+ return this;
+};</code></pre></div><div class="comment"><h2>Socket.prototype.bindSync()</h2><div class="description"><p>Sync bind.</p></div><a href="#" class="view-source">View source</a><pre><code>Socket.prototype.bindSync = function(addr) {
+ this._watcher.stop();
+ try {
+ this._zmq.bindSync(addr);
+ } catch (e) {
+ this._watcher.start();
+ throw e;
+ }
+ this._watcher.start();
+ return this;
+};</code></pre></div><div class="comment"><h2>Socket.prototype.connect()</h2><div class="description"><p>Connect to <code>addr</code>.</p></div><a href="#" class="view-source">View source</a><pre><code>Socket.prototype.connect = function(addr) {
+ this._zmq.connect(addr);
+ return this;
+};</code></pre></div><div class="comment"><h2>Socket.prototype.subscribe()</h2><div class="description"><p>Subscribe with the given <code>filter</code>.</p></div><a href="#" class="view-source">View source</a><pre><code>Socket.prototype.subscribe = function(filter) {
+ this._subscribe = filter;
+ return this;
+};</code></pre></div><div class="comment"><h2>Socket.prototype.unsubscribe()</h2><div class="description"><p>Unsubscribe with the given <code>filter</code>.</p></div><a href="#" class="view-source">View source</a><pre><code>Socket.prototype.unsubscribe = function(filter) {
+ this._unsubscribe = filter;
+ return this;
+};</code></pre></div><div class="comment"><h2>Socket.prototype.send()</h2><div class="description"><p>Send the given <code>msg</code>.</p></div><a href="#" class="view-source">View source</a><pre><code>Socket.prototype.send = function(msg, flags) {
+ // allow strings etc
+ if (!Buffer.isBuffer(msg)) {
+ msg = new Buffer(String(msg), 'utf8');
+ }
+
+ this._outgoing.push([msg, flags || 0]);
+ this._flush();
+
+ return this;
+};
+
+// The workhorse that does actual send and receive operations.
+// This helper is called from `send` above, and in response to
+// the watcher noticing the signaller fd is readable.
+Socket.prototype._flush = function() {
+ var args;
+
+ // Don't allow recursive flush invocation as it can lead to stack
+ // exhaustion and write starvation
+ if (this._flushing) return;
+
+ this._flushing = true;
+ try {
+ while (true) {
+ var emitArgs
+ , flags = this._ioevents;
+
+ if (!this._outgoing.length) {
+ flags &= ~zmq.ZMQ_POLLOUT;
+ }
+
+ if (!flags) break;
+
+ if (flags & zmq.ZMQ_POLLIN) {
+ emitArgs = ['message'];
+
+ do {
+ emitArgs.push(new Buffer(this._zmq.recv()));
+ } while (this._receiveMore);
+
+ this.emit.apply(this, emitArgs);
+ if (this._zmq.state != zmq.STATE_READY) {
+ this._flushing = false;
+ return;
+ }
+ }
+
+ // We send as much as possible in one burst so that we don't
+ // starve sends if we receive more than one message for each
+ // one sent.
+ while (flags & zmq.ZMQ_POLLOUT && this._outgoing.length) {
+ args = this._outgoing.shift();
+ this._zmq.send(args[0], args[1]);
+ flags = this._ioevents;
+ }
+ }
+ } catch (e) {
+ this.emit('error', e);
+ }
+
+ this._flushing = false;
+};</code></pre></div><div class="comment"><h2>Socket.prototype.close()</h2><div class="description"><p>Close the socket.</p></div><a href="#" class="view-source">View source</a><pre><code>Socket.prototype.close = function() {
+ this._watcher.stop();
+ this._watcher = null;
+ this._zmq.close();
+ return this;
+};</code></pre></div><div class="comment"><h2>exports.socket()</h2><div class="description"><p>Create a <code>type</code> socket with the given <code>options</code>.</p></div><a href="#" class="view-source">View source</a><pre><code>exports.socket = function(type, options) {
+ var sock = new Socket(type);
+ for (var key in options) sock[key] = options[key];
+ return sock;
+};</code></pre></div></body></html>
View
1  index.json
@@ -0,0 +1 @@
+[{"tags":[],"description":{"full":"<p>Module dependencies.</p>","summary":"<p>Module dependencies.</p>","body":""},"ignore":false,"code":"var EventEmitter = require('events').EventEmitter\n , IOWatcher = process.binding('io_watcher').IOWatcher\n , zmq = require('../binding');","ctx":{"type":"declaration","name":"EventEmitter","value":"require('events').EventEmitter","string":"EventEmitter"}},{"tags":[],"description":{"full":"<p>Expose bindings as the module.</p>","summary":"<p>Expose bindings as the module.</p>","body":""},"ignore":false,"code":"exports = module.exports = zmq;"},{"tags":[],"description":{"full":"<p>Map of socket types.</p>","summary":"<p>Map of socket types.</p>","body":""},"ignore":false,"code":"var types = exports.types = {\n pub: zmq.ZMQ_PUB\n , sub: zmq.ZMQ_SUB\n , req: zmq.ZMQ_REQ\n , xreq: zmq.ZMQ_XREQ\n , rep: zmq.ZMQ_REP\n , xrep: zmq.ZMQ_XREP\n , push: zmq.ZMQ_PUSH\n , pull: zmq.ZMQ_PULL\n , dealer: zmq.ZMQ_DEALER\n , router: zmq.ZMQ_ROUTER\n , pair: zmq.ZMQ_PAIR\n};","ctx":{"type":"declaration","name":"types","value":"exports.types = {","string":"types"}},{"tags":[],"description":{"full":"<p>Map of socket options.</p>","summary":"<p>Map of socket options.</p>","body":""},"ignore":false,"code":"var opts = exports.options = {\n _fd: zmq.ZMQ_FD\n , _ioevents: zmq.ZMQ_EVENTS\n , _receiveMore: zmq.ZMQ_RCVMORE\n , _subscribe: zmq.ZMQ_SUBSCRIBE\n , _unsubscribe: zmq.ZMQ_UNSUBSCRIBE\n , affinity: zmq.ZMQ_AFFINITY\n , backlog: zmq.ZMQ_BACKLOG\n , hwm: zmq.ZMQ_HWM\n , identity: zmq.ZMQ_IDENTITY\n , linger: zmq.ZMQ_LINGER\n , mcast_loop: zmq.ZMQ_MCAST_LOOP\n , rate: zmq.ZMQ_RATE\n , rcvbuf: zmq.ZMQ_RCVBUF\n , reconnect_ivl: zmq.ZMQ_RECONNECT_IVL\n , recovery_ivl: zmq.ZMQ_RECOVERY_IVL\n , sndbuf: zmq.ZMQ_SNDBUF\n , swap: zmq.ZMQ_SWAP\n};\n\n// Context management happens here. We lazily initialize a default context,\n// and use that everywhere. Also cleans up on exit.\nvar ctx;\nfunction defaultContext() {\n if (ctx) return ctx;\n\n var io_threads = 1;\n if (process.env.ZMQ_IO_THREADS) {\n io_threads = parseInt(process.env.ZMQ_IO_THREADS, 10);\n if (!io_threads || io_threads < 1) {\n console.warn('Invalid number in ZMQ_IO_THREADS, using 1 IO thread.');\n io_threads = 1;\n }\n }\n\n ctx = new zmq.Context(io_threads);\n process.on('exit', function() {\n // ctx.close();\n ctx = null;\n });\n\n return ctx;\n};","ctx":{"type":"declaration","name":"opts","value":"exports.options = {","string":"opts"}},{"tags":[{"type":"constructor","string":""},{"type":"param","types":["String","Number"],"name":"type","description":""},{"type":"api","visibility":"public"}],"description":{"full":"<p>Create a new socket of the given <code>type</code>.</p>","summary":"<p>Create a new socket of the given <code>type</code>.</p>","body":""},"isPrivate":false,"ignore":false,"code":"function Socket(type) {\n this.type = type;\n this._zmq = new zmq.Socket(defaultContext(), types[type]);\n this._outgoing = [];\n this._watcher = new IOWatcher;\n this._watcher.callback = this._flush.bind(this);\n this._watcher.set(this._fd, true, false);\n this._watcher.start();\n};","ctx":{"type":"function","name":"Socket","string":"Socket()"}},{"tags":[],"description":{"full":"<p>Inherit from <code>EventEmitter.prototype</code>.</p>","summary":"<p>Inherit from <code>EventEmitter.prototype</code>.</p>","body":""},"ignore":false,"code":"Socket.prototype.__proto__ = EventEmitter.prototype;","ctx":{"type":"property","constructor":"Socket","name":"__proto__","value":"EventEmitter.prototype","string":"Socket.prototype__proto__"}},{"tags":[{"type":"param","types":["String","Number"],"name":"opt","description":""},{"type":"param","types":["Mixed"],"name":"val","description":""},{"type":"return","types":["Socket"],"description":"for chaining"},{"type":"api","visibility":"public"}],"description":{"full":"<p>Set <code>opt</code> to <code>val</code>.</p>","summary":"<p>Set <code>opt</code> to <code>val</code>.</p>","body":""},"isPrivate":false,"ignore":false,"code":"Socket.prototype.setsockopt = function(opt, val){\n this._zmq.setsockopt(opts[opt] || opt, val);\n return this;\n};","ctx":{"type":"method","constructor":"Socket","name":"setsockopt","string":"Socket.prototype.setsockopt()"}},{"tags":[{"type":"param","types":["String","Number"],"name":"opt","description":""},{"type":"return","types":["Mixed"],"description":""},{"type":"api","visibility":"public"}],"description":{"full":"<p>Get socket <code>opt</code>.</p>","summary":"<p>Get socket <code>opt</code>.</p>","body":""},"isPrivate":false,"ignore":false,"code":"Socket.prototype.getsockopt = function(opt){\n return this._zmq.getsockopt(opts[opt] || opt);\n};","ctx":{"type":"method","constructor":"Socket","name":"getsockopt","string":"Socket.prototype.getsockopt()"}},{"tags":[],"description":{"full":"<p>Socket opt accessors allowing <code>sock.backlog = val</code><br />instead of <code>sock.setsockopt('backlog', val)</code>.</p>","summary":"<p>Socket opt accessors allowing <code>sock.backlog = val</code><br />instead of <code>sock.setsockopt('backlog', val)</code>.</p>","body":""},"ignore":false,"code":"Object.keys(opts).forEach(function(name){\n Socket.prototype.__defineGetter__(name, function() {\n return this._zmq.getsockopt(opts[name]);\n });\n\n Socket.prototype.__defineSetter__(name, function(val) {\n if ('string' == typeof val) val = new Buffer(val, 'utf8');\n return this._zmq.setsockopt(opts[name], val);\n });\n});"},{"tags":[{"type":"param","types":["String"],"name":"addr","description":""},{"type":"param","types":["Function"],"name":"cb","description":""},{"type":"return","types":["Socket"],"description":"for chaining"},{"type":"api","visibility":"public"}],"description":{"full":"<p>Async bind.</p>\n\n<p>Emits the \"bind\" event.</p>","summary":"<p>Async bind.</p>","body":"<p>Emits the \"bind\" event.</p>"},"isPrivate":false,"ignore":false,"code":"Socket.prototype.bind = function(addr, cb) {\n var self = this;\n self._watcher.stop();\n self._zmq.bind(addr, function(err) {\n self._watcher.start();\n self.emit('bind');\n cb && cb(err);\n });\n return this;\n};","ctx":{"type":"method","constructor":"Socket","name":"bind","string":"Socket.prototype.bind()"}},{"tags":[{"type":"param","types":["String"],"name":"addr","description":""},{"type":"return","types":["Socket"],"description":"for chaining"},{"type":"api","visibility":"public"}],"description":{"full":"<p>Sync bind.</p>","summary":"<p>Sync bind.</p>","body":""},"isPrivate":false,"ignore":false,"code":"Socket.prototype.bindSync = function(addr) {\n this._watcher.stop();\n try {\n this._zmq.bindSync(addr);\n } catch (e) {\n this._watcher.start();\n throw e;\n }\n this._watcher.start();\n return this;\n};","ctx":{"type":"method","constructor":"Socket","name":"bindSync","string":"Socket.prototype.bindSync()"}},{"tags":[{"type":"param","types":["String"],"name":"addr","description":""},{"type":"return","types":["Socket"],"description":"for chaining"},{"type":"api","visibility":"public"}],"description":{"full":"<p>Connect to <code>addr</code>.</p>","summary":"<p>Connect to <code>addr</code>.</p>","body":""},"isPrivate":false,"ignore":false,"code":"Socket.prototype.connect = function(addr) {\n this._zmq.connect(addr);\n return this;\n};","ctx":{"type":"method","constructor":"Socket","name":"connect","string":"Socket.prototype.connect()"}},{"tags":[{"type":"param","types":["String"],"name":"filter","description":""},{"type":"return","types":["Socket"],"description":"for chaining"},{"type":"api","visibility":"public"}],"description":{"full":"<p>Subscribe with the given <code>filter</code>.</p>","summary":"<p>Subscribe with the given <code>filter</code>.</p>","body":""},"isPrivate":false,"ignore":false,"code":"Socket.prototype.subscribe = function(filter) {\n this._subscribe = filter;\n return this;\n};","ctx":{"type":"method","constructor":"Socket","name":"subscribe","string":"Socket.prototype.subscribe()"}},{"tags":[{"type":"param","types":["String"],"name":"filter","description":""},{"type":"return","types":["Socket"],"description":"for chaining"},{"type":"api","visibility":"public"}],"description":{"full":"<p>Unsubscribe with the given <code>filter</code>.</p>","summary":"<p>Unsubscribe with the given <code>filter</code>.</p>","body":""},"isPrivate":false,"ignore":false,"code":"Socket.prototype.unsubscribe = function(filter) {\n this._unsubscribe = filter;\n return this;\n};","ctx":{"type":"method","constructor":"Socket","name":"unsubscribe","string":"Socket.prototype.unsubscribe()"}},{"tags":[{"type":"param","types":["String","Buffer"],"name":"msg","description":""},{"type":"param","types":["Number"],"name":"flags","description":""},{"type":"return","types":["Socket"],"description":"for chaining"},{"type":"api","visibility":"public"}],"description":{"full":"<p>Send the given <code>msg</code>.</p>","summary":"<p>Send the given <code>msg</code>.</p>","body":""},"isPrivate":false,"ignore":false,"code":"Socket.prototype.send = function(msg, flags) {\n // allow strings etc\n if (!Buffer.isBuffer(msg)) {\n msg = new Buffer(String(msg), 'utf8');\n }\n\n this._outgoing.push([msg, flags || 0]);\n this._flush();\n\n return this;\n};\n\n// The workhorse that does actual send and receive operations.\n// This helper is called from `send` above, and in response to\n// the watcher noticing the signaller fd is readable.\nSocket.prototype._flush = function() {\n var args;\n\n // Don't allow recursive flush invocation as it can lead to stack\n // exhaustion and write starvation\n if (this._flushing) return;\n\n this._flushing = true;\n try {\n while (true) {\n var emitArgs\n , flags = this._ioevents;\n\n if (!this._outgoing.length) {\n flags &= ~zmq.ZMQ_POLLOUT;\n }\n\n if (!flags) break;\n \n if (flags & zmq.ZMQ_POLLIN) {\n emitArgs = ['message'];\n\n do {\n emitArgs.push(new Buffer(this._zmq.recv()));\n } while (this._receiveMore);\n\n this.emit.apply(this, emitArgs);\n if (this._zmq.state != zmq.STATE_READY) {\n this._flushing = false;\n return;\n }\n }\n\n // We send as much as possible in one burst so that we don't\n // starve sends if we receive more than one message for each\n // one sent.\n while (flags & zmq.ZMQ_POLLOUT && this._outgoing.length) {\n args = this._outgoing.shift();\n this._zmq.send(args[0], args[1]);\n flags = this._ioevents;\n }\n }\n } catch (e) {\n this.emit('error', e);\n }\n\n this._flushing = false;\n};","ctx":{"type":"method","constructor":"Socket","name":"send","string":"Socket.prototype.send()"}},{"tags":[{"type":"return","types":["Socket"],"description":"for chaining"},{"type":"api","visibility":"public"}],"description":{"full":"<p>Close the socket.</p>","summary":"<p>Close the socket.</p>","body":""},"isPrivate":false,"ignore":false,"code":"Socket.prototype.close = function() {\n this._watcher.stop();\n this._watcher = null;\n this._zmq.close();\n return this;\n};","ctx":{"type":"method","constructor":"Socket","name":"close","string":"Socket.prototype.close()"}},{"tags":[{"type":"param","types":["String"],"name":"type","description":""},{"type":"param","types":["Object"],"name":"options","description":""},{"type":"return","types":["Socket"],"description":""},{"type":"api","visibility":"public"}],"description":{"full":"<p>Create a <code>type</code> socket with the given <code>options</code>.</p>","summary":"<p>Create a <code>type</code> socket with the given <code>options</code>.</p>","body":""},"isPrivate":false,"ignore":false,"code":"exports.socket = function(type, options) {\n var sock = new Socket(type);\n for (var key in options) sock[key] = options[key];\n return sock;\n};","ctx":{"type":"method","receiver":"exports","name":"socket","string":"exports.socket()"}}]
View
8 menu.js
@@ -0,0 +1,8 @@
+
+$(function(){
+ $('pre').hide();
+ $('.view-source').click(function(e){
+ $(this).next('pre').slideToggle('fast');
+ e.preventDefault();
+ });
+})
View
61 style.css
@@ -0,0 +1,61 @@
+
+body {
+ font: 14px/1.6 "Helvetica Neue", Helvetica, Arial, sans-serif;
+ margin: 0;
+ padding: 50px 150px;
+ color: #2C2C2C;
+ border-top: 2px solid #ddd;
+}
+
+h2 {
+ margin-top: 20px;
+ font-weight: 100;
+ letter-spacing: 1px;
+ border-bottom: 1px solid #eee;
+}
+
+a {
+ color: #8A6343;
+ font-weight: bold;
+ text-decoration: none;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+code {
+ font: 12px monaco, monospace;
+}
+
+pre {
+ margin: 30px;
+ padding: 30px;
+ border: 1px solid #eee;
+ border-bottom-color: #ddd;
+ -webkit-border-radius: 2px;
+ -moz-border-radius: 2px;
+ -webkit-box-shadow: inset 0 0 10px #eee;
+ -moz-box-shadow: inset 0 0 10px #eee;
+ overflow-x: auto;
+}
+
+footer {
+ background: #eee;
+ padding: 50px 0;
+ text-align: right;
+ border-top: 1px solid #ddd;
+}
+
+footer span {
+ display: block;
+ margin-right: 30px;
+ color: #888;
+ font-size: 12px;
+}
+
+code .comment { color: #ddd }
+code .init { color: #2F6FAD }
+code .string { color: #5890AD }
+code .keyword { color: #8A6343 }
+code .number { color: #2F6FAD }
View
25 template.jade
@@ -0,0 +1,25 @@
+!!! 5
+html
+ head
+ title node-zeromq
+ link(rel='stylesheet', href='style.css')
+ script(src='http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js')
+ script(src='highlight.js')
+ script(src='menu.js')
+ body
+ h1 node-zeromq
+ p
+ a(href='http://www.zeromq.org/') ZeroMQ
+ | bindings for Node.js
+
+ for comment, i in comments
+ ctx = comment.ctx
+ if comment.ignore || !i || !ctx || comment.isPrivate || ~ctx.string.indexOf('__proto__')
+ - continue
+
+ .comment
+ h2= comment.ctx.string
+ .description!= comment.description.full
+ a.view-source(href='#') View source
+ pre
+ code!= comment.code
Please sign in to comment.
Something went wrong with that request. Please try again.