From 448c40e41cc35b30fa63b8ae2efe67f960eb55ac Mon Sep 17 00:00:00 2001 From: Sami Samhuri Date: Thu, 25 Nov 2010 22:03:27 -0800 Subject: [PATCH] first real stab at a project page --- proj/batteries/index.html | 199 ++++++++++++++++-- proj/forkme.png | Bin 0 -> 7791 bytes proj/gh.png | Bin 0 -> 11297 bytes proj/gitter.js | 425 ++++++++++++++++++++++++++++++++++++++ proj/index.html | 70 +++++++ proj/spinner.gif | Bin 0 -> 1849 bytes style.css | 45 +++- 7 files changed, 711 insertions(+), 28 deletions(-) create mode 100644 proj/forkme.png create mode 100644 proj/gh.png create mode 100644 proj/gitter.js create mode 100644 proj/spinner.gif diff --git a/proj/batteries/index.html b/proj/batteries/index.html index 481ac9b..738f3a1 100644 --- a/proj/batteries/index.html +++ b/proj/batteries/index.html @@ -1,19 +1,184 @@ - -batteries for node - -

- A slightly higher-level library for node
- github project -

+ #info { text-align: center + ; margin: 0 auto + ; padding: 1em + ; border: solid 1px #ccc + ; width: 90% + ; max-width: 950px + ; background-color: #fff + ; border-radius: 20px + ; -webkit-border-radius: 20px + ; -moz-border-radius: 20px + } + + h4 { margin: 0.5em 0 0.7em } + + #info > div { text-align: center + ; font-size: 1.3em + ; width: 32% + ; max-width: 400px + ; float: left + ; padding: 0.5em 0.2em + ; border-left: dashed 1px #aaa + } + + #info > div:first-child { border-left: none } + + #info div:last-child { clear: both + ; float: none + ; border: none + ; height: 0 + ; width: 0 + ; padding: 0 + } + + + + + +← samhuri.net +

← projects

+Fork me on GitHub +

batteries

+

useful stuff for node

+ + + + + + +
watchers forks
+
+
+

branches

+ +
+
+

languages

+ +
+
+

contributors

+ +
+
+
\ No newline at end of file diff --git a/proj/forkme.png b/proj/forkme.png new file mode 100644 index 0000000000000000000000000000000000000000..146ef8a800602169cf78c686fc5a6d138a76bc0a GIT binary patch literal 7791 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 Xh_BoY=iA}_00000NkvXXu0mjfj@5wR literal 0 HcmV?d00001 diff --git a/proj/gitter.js b/proj/gitter.js new file mode 100644 index 0000000..d3328c8 --- /dev/null +++ b/proj/gitter.js @@ -0,0 +1,425 @@ +/// gitter +/// http://github.com/samsonjs/gitter +/// @_sjs +/// +/// Copyright 2010 Sami Samhuri +/// MIT License + +// TODO: +// - authentication and write APIs + +(function() { + var global = this + , isBrowser = 'document' in global + // when running in the browser request is set later + , request = isBrowser ? null : require('request') + , Blob, Branch, Commit, Raw, Repo, Tree, User + , api + + api = { + blob: function(repo, sha, path, cb) { + return new Blob(repo, sha, path, cb) + }, + branch: function(repo, branch, cb) { + return new Branch(repo, branch, cb) + }, + commits: function(repo, branch, cb) { + return new Branch(repo, branch).getCommits(cb) + }, + commit: function(repo, sha, cb) { + return new Commit(repo, sha, cb) + }, + raw: function(repo, sha, cb) { + return new Raw(repo, sha, cb) + }, + repo: function(repo, cb) { + return new Repo(repo, cb) + }, + branches: function(repo, cb) { + return new Repo(repo).getBranches(cb) + }, + collaborators: function(repo, cb) { + return new Repo(repo).getCollaborators(cb) + }, + contributors: function(repo, cb) { + return new Repo(repo).getContributors(cb) + }, + languages: function(repo, cb) { + return new Repo(repo).getLanguages(cb) + }, + network: function(repo, cb) { + return new Repo(repo).getNetwork(cb) + }, + tags: function(repo, cb) { + return new Repo(repo).getTags(cb) + }, + watchers: function(repo, cb) { + return new Repo(repo).getWatchers(cb) + }, + tree: function(repo, sha, cb) { + return new Tree(repo, sha, cb) + }, + blobs: function(repo, sha, cb) { + return new Tree(repo, sha).getBlobs(cb) + }, + user: function(user, cb) { + return new User(user, cb) + }, + followers: function(user, cb) { + return new User(user).getFollowers(cb) + }, + following: function(user, cb) { + return new User(user).getFollowing(cb) + }, + repos: function(user, cb) { + return new User(user).getRepos(cb) + }, + watched: function(user, cb) { + return new User(user).getWatched(cb) + } + } + if (isBrowser) global.GITR = api + else module.exports = api + + + // Define resources // + + Blob = createResource('blob/show/:repo/:tree/:path', { + has: [ ['commits', 'commits/list/:repo/:tree/:path'] ] + }) + Branch = createResource('commits/show/:repo/:branch', { + has: [ ['commits', 'commits/list/:repo/:branch'] ] + }) + Commit = createResource('commits/show/:repo/:sha') + Raw = createResource('blob/show/:repo/:sha') + Repo = createResource('repos/show/:repo', { + has: [ 'branches' + , 'collaborators' + , 'contributors' + , 'languages' + , 'network' + , 'tags' + , 'watchers' + ] + }) + Tree = createResource('tree/show/:repo/:sha', { + has: [ ['blobs', 'blob/all/:repo/:sha'] + , ['fullBlobs', 'blob/full/:repo/:sha'] + , ['fullTree', 'tree/full/:repo/:sha'] + ] + }) + Tree.prototype._processData = function(data) { + Resource.prototype._processData.call(this, data) + this.blobs = this.data() + } + + User = createResource('user/show/:user', { + has: [ 'followers' + , 'following' + , ['repos', 'repos/show/:user'] + , ['watched', 'repos/watched/:user'] + ] + }) + + // Construct a new github resource. + // + // options: + // - params: params for constructor (optional, inferred from route if missing) + // - has: list of related resources, accessors are created for each item + // + // The members of the `has` list are arrays of the form [name, route, unpack]. + // The first member, name, is used to create an accessor (e.g. getName), and + // is required. + // + // Route and unpack are optional. Route specifies the endpoint for this + // resource and defaults to the name appended to the main resource's endpoint. + // + // Unpack is a function that extracts the desired value from the object fetched + // for this resource. It defaults to a function that picks out the only property + // from an object, or returns the entire walue if not an object or it contains + // more than one property. + // + // When passing only the name you may pass it directly without wrapping it in + // an array. + function createResource(route, options) { + if (!route) throw new Error('route is required') + options = options || {} + + var resource = function() { Resource.apply(this, [].slice.call(arguments)) } + inherits(resource, Resource) + + resource.prototype._route = route + resource.prototype._params = options.params || paramsFromRoute(route) + + resource.has = function(prop, route, unpack) { + unpack = unpack || onlyProp + var dataProp = '_' + prop + , fn = 'get' + titleCaseFirst(prop) + , processData = function(d) { + getter(this, dataProp, function() { return camelize(unpack(d))}) + } + , result = function(resource) { return this[dataProp] } + resource.prototype[fn] = function(cb, force) { + return this._fetch({ prop: dataProp + , route: route || this._route + '/' + prop + , processData: processData.bind(this) + , result: result.bind(this) + }, cb.bind(this), force) + } + return resource + } + if (options.has) options.has.forEach(function(args) { + resource.has.apply(resource, Array.isArray(args) ? args : [args]) + }) + + return resource + } + + // Assigns the given resource args to the new instance. Sets the path to the + // endpoint for main resource data. + // + // If the optional last arg is a function main data is fetched immediately, + // and that function is used as the callback. + // + // If the optional last arg is an object then it is set as the main resource + // data. + function Resource(/* ...args, opt: data or callback */) { + var args = [].slice.call(arguments) + , last = args[args.length - 1] + + // assign params from args + this._params.forEach(function(param, i) { + this[param] = args[i] + }.bind(this)) + + // set the resource path + this.urlPath = this.resolve(this._route) + + if (typeof last === 'function') this.fetch(last) + else if (typeof last === 'object') this.data(last) + } + + // Set or get main data for this resource, or fetch + // a specific property from the data. + // + // When the data param is empty cached data is returned. + // + // When the data param is a string the property by that name + // is looked up in the cached data. + // + // Otherwise cached data is set to the data param. + Resource.prototype.data = function(data) { + if (!data) return this._data + if (typeof data === 'string' && typeof this._data === 'object') return this._data[data] + + getter(this, '_data', function() { return data }, {configurable: true}) + return this + } + + // Fetch the main data for this resource. + // + // cb: callback(err, data) + // force: if true load data from github, bypassing the local cache + Resource.prototype.fetch = function(cb, force) { + return this._fetch({ prop: '_data' + , route: this.urlPath + , processData: this._processData.bind(this) + , result: function(resource) { return resource } + }, cb.bind(this), force) + } + + // 'repos/show/:user/:repo/branches' -> 'repos/show/samsonjs/gitter + Resource.prototype.resolve = function(route) { // based on crock's supplant + if (route.indexOf(':') < 0) return route + return route.replace(/:(\w+)\b/g, function (s, prop) { + var val = this[prop] + if (typeof val !== 'string' && typeof val !== 'number') + throw new Error('no suitable property named "' + prop + '" (found ' + val + ')') + return val + }.bind(this)) + } + + // Fetch arbitrary data from github. + // + // options: + // - prop: name of data cache property + // - route: route to github endpoint (can contain resource params) + // - processData: function that processes fetched data + // - result: function to obtain the result passed to the callback + // cb: callback(err, data) + // force: if true load data from github, bypassing the local cache + Resource.prototype._fetch = function(options, cb, force) { + if (!force && this[options.prop]) { + cb(null, options.result(this)) + return this + } + + // Interpolate resource params + var path = this.resolve(options.route) + + // Make the request + return this._get(path, function(err, data) { + if (err) { + cb(err) + return + } + options.processData(data) + cb(null, options.result(this)) + }.bind(this)) + } + + // Fetch data from github. JSON responses are parsed. + // + // path: github endpoint + // cb: callback(err, data) + Resource.prototype._get = function(path, cb) { + request({uri: 'http://github.com/api/v2/json/' + path}, function(err, response, body) { + if (err) + cb(err) + else if (isBrowser) + cb(null, body) // body is an object + else if (response.statusCode !== 200) + cb(new Error('failed to fetch ' + path + ': ' + response.statusCode)) + else if (response.headers['content-type'].match(/json/)) + cb(null, JSON.parse(body)) + else + cb(null, body) + }) + return this + } + + // Descendents of Resource can overwrite _processData and _unpack to process + // the main resource data differently. + + Resource.prototype._processData = function(data) { + return this.data(camelize(this._unpack(data))) + } + Resource.prototype._unpack = onlyProp + + + // Utilities // + + function camel(s) { // created_at => createdAt + return s.replace(/_(.)/g, function(_, l) { return l.toUpperCase() }) + } + function camelize(obj) { // camelize all keys of an object, or all objects in an array + if (!obj || typeof obj === 'string') return obj + if (Array.isArray(obj)) return obj.map(camelize) + return Object.keys(obj).reduce(function(newObj, k) { + newObj[camel(k)] = obj[k] + return newObj + }, {}) + } + + function getter(obj, prop, fn, opts) { // minor convenience + opts = opts || {} + opts.get = fn + Object.defineProperty(obj, prop, opts) + } + + // util.inherits from node + function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false + } + }) + } + // get an only property, if any + function onlyProp(obj) { + if (obj && typeof obj === 'object') { + var keys = Object.keys(obj) + if (keys.length === 1) return obj[keys[0]] + } + return obj + } + + // 'repos/show/:user/:repo/branches' -> ['user', 'repo'] + function paramsFromRoute(route) { + if (route.indexOf(':') === -1) return [] + return route.split('/') + .filter(function(s) { return s.charAt(0) === ':' }) + .map(function(s) { return s.slice(1) }) + } + + function titleCaseFirst(s) { return s.charAt(0).toUpperCase() + s.slice(1) } + + + // Browser Utilities // + + if (isBrowser) (function() { + var update, merge, load, _jsonpCounter = 1 + request = function(options, cb) { // jsonp request, quacks like mikeal's request module + var jsonpCallbackName = '_jsonpCallback' + _jsonpCounter++ + , url = options.uri + '?callback=GITR.' + jsonpCallbackName + GITR[jsonpCallbackName] = function(obj) { + cb(null, null, obj) + setTimeout(function() { delete GITR[jsonpCallbackName] }, 0) + } + load(url) + } + + // bind from Prototype (for Safari 5) + if (!Function.prototype.bind) { + update = function(array, args) { + var arrayLength = array.length, length = args.length + while (length--) array[arrayLength + length] = args[length] + return array + } + merge = function(array, args) { + array = [].slice.call(array, 0) + return update(array, args) + } + Function.prototype.bind = function(context) { + if (arguments.length < 2 && typeof arguments[0] === 'undefined') return this + var __method = this, args = [].slice.call(arguments, 1) + return function() { + var a = merge(args, arguments) + return __method.apply(context, a) + } + } + } + // bootstrap loader from LABjs + load = function(url) { + var oDOC = document + , handler + , head = oDOC.head || oDOC.getElementsByTagName("head") + + // loading code borrowed directly from LABjs itself + // (now removes script elem when done and nullifies its reference --sjs) + setTimeout(function () { + if ("item" in head) { // check if ref is still a live node list + if (!head[0]) { // append_to node not yet ready + setTimeout(arguments.callee, 25) + return + } + head = head[0]; // reassign from live node list ref to pure node ref -- avoids nasty IE bug where changes to DOM invalidate live node lists + } + var scriptElem = oDOC.createElement("script"), + scriptdone = false + scriptElem.onload = scriptElem.onreadystatechange = function () { + if ((scriptElem.readyState && scriptElem.readyState !== "complete" && scriptElem.readyState !== "loaded") || scriptdone) { + return false + } + scriptElem.onload = scriptElem.onreadystatechange = null + scriptElem.parentNode.removeChild(scriptElem) + scriptElem = null + scriptdone = true + }; + scriptElem.src = url + head.insertBefore(scriptElem, head.firstChild) + }, 0) + + // required: shim for FF <= 3.5 not having document.readyState + if (oDOC.readyState == null && oDOC.addEventListener) { + oDOC.readyState = "loading" + oDOC.addEventListener("DOMContentLoaded", function handler() { + oDOC.removeEventListener("DOMContentLoaded", handler, false) + oDOC.readyState = "complete" + }, false) + } + } + }()) +}()) diff --git a/proj/index.html b/proj/index.html index bc9f17f..b47da3d 100644 --- a/proj/index.html +++ b/proj/index.html @@ -4,6 +4,16 @@ samhuri.net + + + ← samhuri.net +Fork me on GitHub

projects

+

+ GitHub +

+ + + + + + + + + + +
projects followers
watching projects + following people

JS Function arity

diff --git a/proj/spinner.gif b/proj/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..06dbc2bc21dddcf0e09b566d5b211aee89570f52 GIT binary patch literal 1849 zcma*odr(tX9tZHtz31lM+(&Y`A`Ou`NeG&R#DrIfV%?hng21vs6v>ooRQQFbk7E_K!V( z{?5!fpZWgIZ%*d6t%i*j24bL}AZUJm9)h6R*;%L4IWse3G#VWaN1#$zSSXcBhlYlH zJ|D}n{r&w2f+Qp)SS*&n?*G4}{}!h?td_mjU6Kad-rW*QwWYCUk7d^e+sjpZAn6kT z5rM;`{~_}-wm+L@%+E;JphLm}C3WzQAQD0wBoY|rOTQX{(@pp-WAA8Iw0HKl|15j) zhGh(SFWu#5zUCw^T!}C~eC}~?{xG-r7ugQC>taC+|L^xr&a%{#cgUOZXIM&v?)k^2 z1i5%0!U00wq)r4vlAwXBA_m5J5WNeuBm-XJQ5pG4GD%vc|K){+TJ{AkHqN@SJKczX zU}QRd9n*_bf^h94)6Ctv{CUfz_;qs#RDuQ$DR%y1&5G-a6rhf*4Y zl+UOD1*GE{GQ7vv;c-tTIMkz0ovO>9j%b5hpa@a*CBJ#W!0@ndSwF|%hMkdFtXiU) z`BEp+yhkt8ZY>tg&uyH@%^%K4jDrbA;et&vnnzZ3z22@e6<27z2Vk13kb7OtISyxv z(XoO-LNQCZe3lfzc%*pNqU<9T+p~teThOEB+~e&U0mC|zS{Q)dJZ)!^1f7L(zg*L> z*vSW%?dR~@@0(}x6-V^A`~ImD;)NaBUnP8;RH=bS2@pk`wp>>8r&jGjmGPy%1BW}v zoPo}ca$~bze@efc3kapuEVW1!%teOZT3j2Tw5=hjiAf02d}7dL0oFC%@=RXp5Ow#% z@a>+AM|YWt$n&e`>sB-32gBcuTi>R>*|8@lp`y6thc7ydyqDsuUn~YzZf|{-R@-3y zL#wx{Ii}xxL_csiW*LBn0-A$>zp4WOmkf6=ilrjlW?-l9+bCd7|i?*b5NTmy<<6NZ0T8$SN@mwdC2f z6jqK=N@bS@!=YSj%>h0}*4p+%0HbTIrE$w7UMT6+AZZ&DAo*qZAAi(OtNbIfl#Dw^ zJWeiCp~zi#&t6x}m9)O^eR4HiLV3QA<<0>HZ8%$^lrSE94Wb}=+MM^!b>n#5&-JQR zkr-CEu9C;_F*7DqDisulV6Pmg$nFL0TPn%~*m^-`Z3^BgU(sNpnx%nW(!eV9A&FvI zHL3X3lw8Wji^6=8KbQDE-e%b?svdFxxdh$8r97@7$ojeI`6AL8Ob6QC$qh&>ZWVDX1F{0vJnT%%mE;GveKWR%C} zM&4d;Jf3s9|HAA)yVUPo`Aq;0do#)uHSXi5*QF*)x@MVVHr+cN)uMZ__F|&Ta#p8d z53TOKtce!PJUuie8UWol-S(`c2nH?UGqJP{!4RR4u$LCfn)q-hj0^f=h(VYy)T6eN zhRO!ja-aDBTcgeyP(8Ua4IdiOog^*CQa?R(cP#9AgL9`j>EX-6Yf1lzX(!~``M1XC zNmM<4<6d~wWZ$Xrk0K}UteTrq@LBBk#MsjkK;pbuVhe)NI7(7Pf(l?lxC7=1Z7Pzl zMbS;nV4NI5_N{1$P)&XC)huOGQ+h^zpYUZfb*1n6>!`#*b3y52LGmi+<4sY5jyD#- zw&$d}DTguLAfnRtjrM*JfqtHqUu6rQoU=g%1E9xk%;)TDm^2<8n-0IhTsQFaek)MY}>PK4;nBk=ow4pF>vzkO& gna%Org-kgQCf=+BeMi^RbuY;YE~rTjend;_cdi8t>i_@% literal 0 HcmV?d00001 diff --git a/style.css b/style.css index 71b281a..a4c527d 100644 --- a/style.css +++ b/style.css @@ -4,13 +4,20 @@ body { background-color: #f7f7f7 } h1 { text-align: center - ; vertical-align: center - ; font-size: 4em - ; font-weight: normal - ; height: 100% - ; margin: 0.6em 0 0.4em - ; padding: 0 - } + ; vertical-align: center + ; font-size: 4em + ; font-weight: normal + ; margin: 0.6em 0 0.4em + ; padding: 0 + } + +h2 { text-align: center + ; vertical-align: center + ; font-size: 2em + ; font-weight: normal + ; margin: 0.2em 0 1em + ; padding: 0 + } ul { text-align: center ; margin: 0 auto @@ -24,6 +31,11 @@ ul { text-align: center ; -moz-border-radius: 20px } +a { color: #22a + ; text-decoration: none + ; border-bottom: dashed 1px #22a + } + li { display: inline ; font-size: 2em ; margin: 0 @@ -32,13 +44,12 @@ li { display: inline li:after { content: ' •' } li:last-child:after { content: '' } -li a { color: #22a - ; text-decoration: none - ; border-bottom: dashed 1px #22a - ; padding: 5px +li a { padding: 5px ; text-shadow: #999 5px 5px 5px } li a:visited { color: #227 } + +li a:hover, li a:active { color: #000 ; text-shadow: #aa7 5px 5px 5px ; border-bottom: dashed 1px #000 @@ -57,6 +68,18 @@ p#promoteJS { margin-top: 3em ; text-align: center } +td { font-size: 1.5em + ; line-height: 1.6em + } + +td:nth-child(2) { padding: 0 10px } + + +.highlight { background-image: -webkit-gradient(radial, 50% 50%, 5, 50% 50%, 15, from(#ffa), to(#f7f7f7)) + ; background-image: -moz-radial-gradient(center 45deg, circle contain, #ffa 0%, #f7f7f7 100%) + ; font-size: 1.2em + } + /* iPad (landscape) */