Skip to content

Instantly share code, notes, and snippets.

@geta6
Created May 30, 2012 04:13
Show Gist options
  • Save geta6/2833686 to your computer and use it in GitHub Desktop.
Save geta6/2833686 to your computer and use it in GitHub Desktop.
gyazzのrow-textをjsでevalします id='req'に生テキストが入っててid='res'が存在してれば動く
var scr;
String.prototype.repeat = function (num) {
for (var i = 0, b = ''; i < num; i++) b += this;
return b;
};
(function () {
// CONSTANTS
var reg = {
boost : /^(\s*)(.*)$/gi,
fixer : /(\s\s+)/gi,
bolds : /\[\[\[(.+?)\]\]\]/gi,
image : /\[\[(https*:\/\/.+?\.(jpg|jpeg|png|gif|tif))\]\]/gi,
altmg : /\[\[(https*:\/\/.+?) (https*:\/\/.+?\.(jpg|jpeg|png|gif|tif))\]\]/gi,
alter : /\[\[(https*:\/\/.+?) (.+?)\]\]/gi,
gistc : /\[\[(https:\/\/gist\.github\.com\/(.+?)\.js\?file=(.+?))\]\]/gi,
outer : /\[\[(https*:\/\/.+?)\]\]/gi,
dirup : /\[\[(.+?)::(.+?)\]\]/gi,
twttr : /\[\[(@(.+?))\]\]/gi,
inner : /\[\[(.+?)\]\]/gi
} , loc = 'gyazz.com'
, lpn = location.href.replace(new RegExp('https*:\\/\\/' + loc + '\\/(.*)', 'gi'), '$1')
, box = (lpn.split('/'))[0]
, doc = ((lpn.split('/')).slice(1)).join('/')
, req = document.getElementById('req')
, raw = req.innerHTML.split("\n")
, res = document.getElementById('res')
, ind = raw.map(function (sig) { return sig.replace(reg.boost, '$1').length })
, fix = raw.map(function (sig, n) { return sig.replace(reg.boost,'$2').split(reg.fixer) })
, fxn = 0, fxr = 0;
// TEST
if ('http' == lpn.substr(0,4)) {
alert("FIXME on script.js:22 loc = '" + loc + "'");
return false;
}
if (null == req) {
alert("FIXME on script.js:26 req = document.getElementById(~)");
return false;
}
if (null == res) {
alert("FIXME on script.js:28 res = document.getElementById(~)");
return false;
}
req.style.display = 'none';
// TRANSLATOR
for (var i = 0; i < raw.length; i++) {
// RegExp
raw[i] = raw[i]
.replace(reg.boost, '$2')
.replace(reg.bolds, '<b>$1</b>')
.replace(reg.altmg, '<a href="$1"><img src="$2"></a>')
.replace(reg.image, '<a href="$1"><img src="$1"></a>')
.replace(reg.alter, '<a href="$1">$2</a>')
.replace(reg.gistc, '<div class="embgist">$1</div>')
.replace(reg.outer, '<a href="$1">$1</a>')
.replace(reg.dirup, '<a href="//'+loc+'/'+'$1/$2">$2</a>')
.replace(reg.twttr, '<a href="//twitter.com/$2">$1</a>')
.replace(reg.inner, '<a href="//'+loc+'/'+box+'/$1">$1</a>');
// Table Emulator Prepare
if (0 < fix[i].length - 1) {
var fxc = 0;
if (i != 0 && fix[i-1].length != fix[i].length) {
fxn++;
fxr = 1;
} else {
fxr++;
}
for (var j = 0; j < fix[i].length; ++j) {
if (0 == j%2) {
fxc++;
fix[i][j] = '<div class="fixspan " x-idt="' + String(fxn) + String(fxc) + '" x-idi="' + String(fxn) + String(fxr) + String(fxc) + '">' + fix[i][j] + '</div>';
} else {
fix[i][j] = '';
}
}
raw[i] = '<span class="fxn' + fxn + '">' + fix[i].join('') + '</span>';
}
// Indent
if (i != 0 && ind[i] > ind[i-1]) {
raw[i] = '<ul><li>'.repeat(ind[i]-ind[i-1]) + raw[i];
} else if (i != 0 && ind[i] < ind[i-1]) {
raw[i] = '</li></ul>'.repeat(ind[i-1]-ind[i]) + '<li>' + raw[i];
} else {
raw[i] = '</li><li>' + raw[i];
}
}
res.innerHTML = '<ul>' + raw.join('') + '</ul>';
// Table Emulator Execute
for (var i = 1; i <= fxn; i++) {
var max = {}, row = document.querySelectorAll('.fxn' + i);
for (var r = 0; r < row.length; r++) {
var col = row[r].querySelectorAll('.fixspan');
for (var c = 0; c < col.length; c++) {
var ids = [ i, r+1, c+1 ]
, idi = ids.join('')
, idt = String(ids[0]) + String(ids[2])
, cwt = document.querySelector('div[x-idi="' + idi + '"]').clientWidth;
if ('undefined' == typeof(max[idt])) max[idt] = 0;
max[idt] = max[idt] < cwt ? cwt : max[idt];
}
}
for (var j = 0; j < row.length; j++) {
var str = row[j].getElementsByTagName('div');
for (var k = 0; k < str.length; k++) {
str[k].style.width = max[str[k].getAttribute('x-idt')] + 12 + 'px';
}
}
}
// GIST
scr = document.querySelectorAll('.embgist');
if (0 < scr.length) {
var xhr = [];
for (var i = 0; i < scr.length; i++) {
var uri = scr[i].innerText;
scr[i].innerHTML = '<b><i>[[[ loading gist... ]]]</b></i>';
scr[i].style.display = 'block';
xhr[i] = new XMLHttpRequest();
xhr[i].onreadystatechange = function () {
if (4 == this.readyState) {
var res = JSON.parse(this.responseText);
scr[res.id].innerHTML = res.code.replace(/\\n*/g, '').replace(/document\.write\('(.+)'\)/gi, '$1');
}
}
xhr[i].open('POST', '/gist?id='+i+'&code='+uri, true);
xhr[i].send();
}
}
}());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment