Created
February 17, 2010 07:43
-
-
Save koyachi/306407 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// http://assets1.github.com/javascripts/bundle_github.js のグラフ書いてる処理抜粋 | |
$(function(){ | |
$(".graph .bars").each(function(){ | |
var a = this; | |
if ($(a).is(":visible")) { | |
var b = function(c){ new ParticipationGraph(a,c) }, | |
d = $(this).attr("rel"); | |
$.get(d,null,b,"text") | |
} | |
}) | |
}); | |
ParticipationGraph = function(a,b) { | |
this.BAR_WIDTH = 7; | |
this.ownerCommits = this.allCommits = null; | |
this.primer = new Primer(a,416,20); | |
this.data = b; | |
this.readData(); | |
this.draw() | |
}; | |
ParticipationGraph.prototype = { | |
readData: function() { | |
var a = this.data.split("\n"); | |
this.allCommits = a[0] ? this.base64BytesToIntArray(a[0]) : ""; | |
this.ownerCommits = a[1] ? this.base64BytesToIntArray(a[1]) : "" | |
}, | |
max: function(a) { | |
for (var b=a[0],d=1;d<a.length;d++) | |
if (a[d]>b) b=a[d]; | |
return b | |
}, | |
integerize: function(a) { | |
for (var b=[],d=0;d<a.length;d++) | |
b.push(parseInt(a[d])); | |
return b | |
}, | |
base64ByteToInt: function(a) { | |
var b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!-"; | |
return b.indexOf(a) | |
}, | |
base64BytesToIntArray: function(a) { | |
for(var b=[],d,c=0;c<a.length;c++) | |
if (c%2==0) | |
d=64*this.base64ByteToInt(a.charAt(c)); | |
else { | |
d+=this.base64ByteToInt(a.charAt(c)); | |
b.push(d) | |
} | |
return b | |
}, | |
draw: function() { | |
var a = this.max(this.allCommits); | |
a = a >= 20 ? 19/a : 1; | |
var b = new Primer.Layer; | |
b.bind(this.primer); | |
for (var d=0; d<this.allCommits.length; d++) { | |
var c = new Primer.Layer; | |
c.bind(this.primer); | |
c.setFillStyle("#CACACA"); | |
var e = this.allCommits[d]*a; | |
c.fillRect(d*(this.BAR_WIDTH+1),20-e,this.BAR_WIDTH,e); | |
b.addChild(c) | |
} | |
var f = new Primer.Layer; | |
f.bind(this.primer); | |
for (d=0;d<this.ownerCommits.length;d++) { | |
c = new Primer.Layer; | |
c.bind(this.primer); | |
c.setFillStyle("#336699"); | |
e = this.ownerCommits[d]*a; | |
c.fillRect(d*(this.BAR_WIDTH+1),20-e,this.BAR_WIDTH,e); | |
f.addChild(c) | |
} | |
this.primer.addChild(b); | |
this.primer.addChild(f) | |
} | |
}; | |
//------- | |
function definePrimer(a) { | |
function b(d,c,e,f) { | |
this.container = d; | |
this.width = c; | |
this.height = e; | |
this.primer = this; | |
this.useGlobalMouseMove = f; | |
this.actions = []; | |
this.init(); | |
this.autoDraw = true | |
} | |
b.prototype = { | |
init: function() { | |
a("html head").append("<style>.primer_text { position: absolute; margin: 0; padding: 0; line-height: normal; z-index: 0;}</style>"); | |
var d = a(this.container).eq(0); | |
d.append('<div id="primer_text"></div>'); | |
var c = a("#primer_text",d).eq(0); | |
c.css("position","relative"); | |
this.element = c; | |
c = document.createElement("canvas"); | |
c.width = this.width; | |
c.height=this.height; | |
c.style.zIndex = "0"; | |
if (c.getContext) d.append(c); | |
else window.G_vmlCanvasManager && window.G_vmlCanvasManager.initElement(a(c).appendTo(d).get(0)); | |
d = a("canvas",d); | |
var e = d[0]; | |
this.context = e.getContext("2d"); | |
this.root = new b.Layer; | |
this.root.bind(this); | |
this.setupExt(); | |
var f=this; | |
this.useGlobalMouseMove ? | |
a("body").bind("mousemove", function(g) { | |
if (a(g.target).parents().find(this.container)) { | |
var h = a(e); | |
h = h.offset(); | |
g.localX = g.pageX - h.left; | |
g.localY = g.pageY - h.top; | |
f.ghost(g) | |
} | |
else | |
f.outOfBounds() | |
}) : | |
d.eq(0).bind("mousemove", function(g){ | |
var h = a(g.currentTarget).offset(); | |
g.localX = g.pageX - h.left; | |
g.localY = g.pageY - h.top; | |
f.ghost(g) | |
}) | |
}, | |
getX: function() { | |
return 0 | |
}, | |
getY: function() { | |
return 0 | |
}, | |
getGlobalX: function() { | |
return 0 | |
}, | |
getGlobalY: function() { | |
return 0 | |
}, | |
addChild: function(d) { | |
d.bind(this); | |
this.root.addChild(d); | |
this.draw() | |
}, | |
removeChild: function(d){ | |
this.root.removeChild(d); | |
this.draw() | |
}, | |
draw: function(d) { | |
if (d||this.autoDraw) { | |
this.context.clearRect(0,0,this.width,this.height); | |
a(".primer_text",this.element).remove(); | |
this.setupExt(); | |
this.root.draw() | |
} | |
}, | |
ghost: function(d){ | |
this.root.ghost(d); | |
for (var c in this.actions) { | |
d = this.actions[c]; | |
d[0](d[1]) | |
} | |
this.actions = [] | |
}, | |
outOfBounds: function(){}, | |
setupExt: function(){ | |
this.context.ext = { | |
textAlign: "left", | |
font: "10px sans-serif" | |
} | |
} | |
}; | |
b.Layer = function() { | |
this.element = this.context = this.primer = null; | |
this.children = []; | |
this.calls = []; | |
this.yVal = this.xVal = 0; | |
this.visibleVal = true; | |
this.mouseoverVal = function(){}; | |
this.mouseoutVal = function(){}; | |
this.mouseWithin = false | |
}; | |
b.Layer.prototype = { | |
bind: function(d){ | |
this.parent = d; | |
this.primer = d.primer; | |
this.context = this.primer.context; | |
this.element = this.primer.element; | |
for (var c in this.children) this.children[c].bind(this) | |
}, | |
getX: function() { | |
return this.xVal | |
}, | |
setX: function(d) { | |
this.xVal = d; | |
this.primer && this.primer.draw() | |
}, | |
getY: function() { | |
return this.yVal | |
}, | |
setY: function(d) { | |
this.yVal = d; | |
this.primer && this.primer.draw() | |
}, | |
getGlobalX: function() { | |
return this.getX() + this.parent.getGlobalX() | |
}, | |
getGlobalY: function() { | |
return this.getY() + this.parent.getGlobalY() | |
}, | |
getVisible: function() { | |
return this.visibleVal | |
}, | |
setVisible: function(d) { | |
this.visibleVal = d; | |
this.primer && this.primer.draw() | |
}, | |
addChild: function(d) { | |
d.bind(this); | |
this.children.push(d); | |
this.primer && this.primer.draw() | |
}, | |
removeChild: function(d) { | |
for (var c=[],e=0;e<this.children.length;e++) { | |
var f = this.children[e]; | |
f != d && c.push(f) | |
} | |
this.children = c | |
}, | |
mouseover: function(d) { | |
this.mouseoverVal = d | |
}, | |
mouseout: function(d) { | |
this.mouseoutVal = d | |
}, | |
setFillStyle: function(d) { | |
this.calls.push(["fillStyle",d]) | |
}, | |
setStrokeStyle: function(d) { | |
this.calls.push(["strokeStyle",d]) | |
}, | |
setLineWidth: function(d) { | |
this.calls.push(["lineWidth",d]) | |
}, | |
beginPath: function() { | |
this.calls.push(["beginPath"]) | |
}, | |
moveTo: function(d,c) { | |
this.calls.push(["moveTo",d,c]) | |
}, | |
lineTo: function(d,c){ | |
this.calls.push(["lineTo",d,c]) | |
}, | |
quadraticCurveTo: function(d,c,e,f) { | |
this.calls.push(["quadraticCurveTo",d,c,e,f]) | |
}, | |
arc: function(d,c,e,f,g,h) { | |
this.calls.push(["arc",d,c,e,f,g,h]) | |
}, | |
fill: function() { | |
this.calls.push(["fill"]) | |
}, | |
stroke: function() { | |
this.calls.push(["stroke"]) | |
}, | |
fillRect: function(d,c,e,f) { | |
this.calls.push(["fillRect",d,c,e,f]) | |
}, | |
fillText:function(d,c,e,f,g) { | |
this.calls.push(["fillText",d,c,e,f,g]) | |
}, | |
setTextAlign: function(d){ | |
this.calls.push(["textAlign",d]) | |
}, | |
setFont: function(d) { | |
this.calls.push(["font",d]) | |
}, | |
rect: function(d,c,e,f) { | |
this.beginPath(); | |
this.moveTo(d,c); | |
this.lineTo(d+e,c); | |
this.lineTo(d+e,c+f); | |
this.lineTo(d,c+f); | |
this.lineTo(d,c) | |
}, | |
roundedRect: function(d,c,e,f,g) { | |
this.beginPath(); | |
this.moveTo(d,c+g); | |
this.lineTo(d,c+f-g); | |
this.quadraticCurveTo(d,c+f,d+g,c+f); | |
this.lineTo(d+e-g,c+f); | |
this.quadraticCurveTo(d+e,c+f,d+e,c+f-g); | |
this.lineTo(d+e,c+g); | |
this.quadraticCurveTo(d+e,c,d+e-g,c); | |
this.lineTo(d+g,c); | |
this.quadraticCurveTo(d,c,d,c+g) | |
}, | |
fillRoundedRect: function(d,c,e,f,g) { | |
this.roundedRect(d,c,e,f,g); | |
this.fill() | |
}, | |
draw: function() { | |
if (this.getVisible()) { | |
this.context.save(); | |
this.context.translate(this.getX(),this.getY()); | |
for (var d in this.calls) { | |
var c = this.calls[d]; | |
switch (c[0]) { | |
case "strokeStyle": | |
this.context.strokeStyle = c[1]; | |
break; | |
case "lineWidth": | |
this.context.lineWidth = c[1]; | |
break; | |
case "fillStyle": | |
this.context.fillStyle = c[1]; | |
break; | |
case "fillRect": | |
this.context.fillRect(c[1],c[2],c[3],c[4]); | |
break; | |
case "beginPath": | |
this.context.beginPath(); | |
break; | |
case "moveTo": | |
this.context.moveTo(c[1],c[2]); | |
break; | |
case "lineTo": | |
this.context.lineTo(c[1],c[2]); | |
break; | |
case "quadraticCurveTo": | |
this.context.quadraticCurveTo(c[1],c[2],c[3],c[4]); | |
break; | |
case "arc": | |
this.context.arc(c[1],c[2],c[3],c[4],c[5],c[6]); | |
break; | |
case "fill": | |
this.context.fill(); | |
break; | |
case "stroke": | |
this.context.stroke(); | |
break; | |
case "fillText": | |
this.extFillText(c[1],c[2],c[3],c[4],c[5]); | |
break; | |
case "textAlign": | |
this.context.ext.textAlign=c[1]; | |
case "font": | |
this.context.ext.font=c[1] | |
} | |
} | |
for (d=0;d<this.children.length;d++) this.children[d].draw(); | |
this.context.restore() | |
} | |
}, | |
extFillText: function(d,c,e,f,g) { | |
var h = ""; | |
h += "left: " + (this.getGlobalX() + c) + "px;"; | |
h += "top: " + (this.getGlobalY() + e) + "px;"; | |
h += "width: " + f + "px;"; | |
h += "text-align: " + this.context.ext.textAlign + ";"; | |
h += "color: " + this.context.fillStyle + ";"; | |
h += "font: " + this.context.ext.font + ";"; | |
this.element.append('<p class="primer_text ' + g + '" style="' + h + '">' + d + "</p>") | |
}, | |
ghost: function(d) { | |
if (this.getVisible()) { | |
this.context.save(); | |
this.context.translate(this.getX(),this.getY()); | |
for (var c in this.calls) { | |
var e = this.calls[c]; | |
switch (e[0]) { | |
case "fillRect": | |
this.ghostFillRect(d,e[1],e[2],e[3],e[4]); | |
break; | |
case "beginPath": | |
this.context.beginPath(); | |
break; | |
case "moveTo": | |
this.context.moveTo(e[1],e[2]); | |
break; | |
case "lineTo": | |
this.context.lineTo(e[1],e[2]); | |
break; | |
case "quadraticCurveTo": | |
this.context.quadraticCurveTo(e[1],e[2],e[3],e[4]); | |
break; | |
case "arc": | |
this.context.arc(e[1],e[2],e[3],e[4],e[5],e[6]); | |
break; | |
case "fill": | |
this.ghostFill(d); | |
break | |
} | |
} | |
if (!jQuery.browser.safari) { | |
d.localX -= this.getX(); | |
d.localY -= this.getY() | |
} | |
for (c in this.children) this.children[c].ghost(d); | |
if (!jQuery.browser.safari) { | |
d.localX += this.getX(); | |
d.localY += this.getY() | |
} | |
this.context.restore() | |
} | |
}, | |
ghostDetect: function(d) { | |
if (jQuery.browser.safari) { | |
testX = d.localX; | |
testY = d.localY | |
} | |
else { | |
testX = d.localX - this.getX(); | |
testY = d.localY - this.getY() | |
} | |
if (this.context.isPointInPath(testX,testY)) { | |
this.mouseWithin || this.primer.actions.push([this.mouseoverVal,d]); | |
this.mouseWithin = true | |
} | |
else { | |
this.mouseWithin && this.primer.actions.push([this.mouseoutVal,d]); | |
this.mouseWithin = false | |
} | |
}, | |
ghostFillRect: function(d,c,e,f,g) { | |
this.context.beginPath(); | |
this.context.moveTo(c,e); | |
this.context.lineTo(c+f,e); | |
this.context.lineTo(c+f,e+g); | |
this.context.lineTo(c,e+g); | |
this.context.lineTo(c,e); | |
this.ghostDetect(d) | |
}, | |
ghostFill: function(d) { | |
this.ghostDetect(d) | |
} | |
}; | |
return b | |
} | |
var Primer = definePrimer(window.jQuery); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment