Skip to content

Instantly share code, notes, and snippets.

@nanha
Created February 7, 2013 01:43
Show Gist options
  • Save nanha/4727678 to your computer and use it in GitHub Desktop.
Save nanha/4727678 to your computer and use it in GitHub Desktop.
Twitter Archive 페이지에서 핵심인 application.min.js
var Grailbird = function (b, a, c) {
Grailbird.data = Grailbird.data || {};
Grailbird.data[b + "_" + a] = c
};
(function (b) {
var f = {}, e = {}, a = {};
var c = {
empty_month: Hogan.compile('<li class="without-tweets" title="" rel="tooltip" data-placement="bottom" data-date="" data-count="0"><span class="value">{{this_month}}</span></li>'),
month_bar: Hogan.compile('<li><a href="#" class="with-tweets" title="{{str_title}}: {{str_count}}" rel="tooltip" data-placement="bottom" data-idx="{{data_idx}}" data-date="{{str_title}}" data-count="{{this_count}}"><span class="bar" style="height: {{this_height}}%;"></span><span class="value">{{this_month}}</span></a></li>'),
header_str: Hogan.compile('{{title_str}} <span class="count">{{count}} {{content_type}}</span>'),
user_header: Hogan.compile('<li><h1 class="brand">@{{screen_name}}</h1></li>'),
user_nav: Hogan.compile('<a href="#" class="icon-sprite icon-user dropdown-toggle" data-toggle="dropdown"></a><ul class="dropdown-menu"><li><a href="#user-info" data-toggle="modal"><i class="icon-user"></i>View account details</a></li><li class="divider"></li><li><a href="https://twitter.com/{{screen_name}}" target="_blank"><i class="icon-share-alt"></i>View profile on Twitter</a></li></ul>'),
modal_header: Hogan.compile('<h3>Account details <span class="download-date muted">as of {{created_at_relative}}</span></h3>'),
modal_user_details: Hogan.compile('<h3>{{full_name}}</h3><h4 class="muted">@{{screen_name}}</h4><div class="stats muted">{{#bio}}<p>{{bio}}</p>{{/bio}}<p>{{#location}}<a href="https://maps.google.com/?q={{location}}">{{location}}</a>{{/location}}{{#url}}{{#location}} &middot; {{/location}}<a href="{{url}}" title="{{#expanded_url}}{{expanded_url}}{{/expanded_url}}{{^expanded_url}}{{url}}{{/expanded_url}}">{{#display_url}}{{display_url}}{{/display_url}}{{^display_url}}{{url}}{{/display_url}}</a>{{/url}}</p></div>'),
modal_payload_details: Hogan.compile('<p>{{tweets}} <span class="footer-label muted">Tweets</span></p>'),
modal_account_details: Hogan.compile('<p>#{{id}} <span class="footer-label muted">User ID</span></p><p class="truncated">{{created_at_relative}} <span class="footer-label muted">Joined</span></p>'),
nav_tab: Hogan.compile('<li class="{{sectionClass}}"><a href="#">{{sectionName}}</a></li>')
};
b.init = function () {
var g = $(document),
h = $(".tweets-header");
twt.settings.showLocalTimes = true;
twt.settings.product = "archive";
Grailbird.data = Grailbird.data || {};
Grailbird.current_index = 0;
f = Grailbird.user();
f.init();
e = Grailbird.tweets();
f.setState(e);
e.init();
$(".brand").click(function (i) {
i.preventDefault();
i.stopImmediatePropagation();
$(".row .contents, .sidebar").removeClass("container-messages");
$(".tweets-header .nav-clear").hide();
$(".container").removeClass("searching");
f.setState(e);
e.init()
});
$(".tweets-header .nav-arrow").tooltip().click(function () {
e.displayTweets(Number($(this).attr("data-idx")));
$(this).tooltip("show")
});
$(".navbar-search").submit(function (l) {
l.preventDefault();
var k = /^\s+|\s+$/g,
i = $(this).find(".search-query").val(),
j = i.replace(k, "");
if (!Grailbird.isValidSearchStr(j)) {
$(".navbar-search").trigger("invalidSearch");
return
}
$(".navbar-search").trigger("dismissTooltip");
$(".nav-arrow-left, .nav-arrow-right").tooltip("hide").hide();
$(".container .tweets").fadeOut(0, function () {
$(".months .with-tweets, .histogram").removeClass("active");
$(".container").addClass("searching in-progress");
$(".tweets-header-title").empty().text("Searching for ‘" + i + "’ …");
$(this).empty();
$(this).fadeIn(100);
f.search(i)
})
}).tooltip().bind("dismissTooltip", function (i) {
i.preventDefault();
$(this).tooltip("hide")
}).bind("invalidSearch", function (i) {
i.preventDefault();
$(this).attr("data-original-title", "Your query must be at least two characters.").tooltip("show")
});
$(".navbar-search .search-query").blur(function (i) {
$(".navbar-search").trigger("dismissTooltip")
});
$(".sidebar-nav .search-mask, .tweets-header .nav-clear").tooltip().click(jQuery.proxy(function (i) {
i.preventDefault();
f.getState().resetSearch()
}, Grailbird));
$(".icon-compose").tooltip();
$(".icon-compose a").click(function (i) {
i.preventDefault();
twt.popup($(this).attr("href"))
});
$(document).keyup(function (i) {
if ($(".container.searching").length === 0) {
if (i.keyCode === 37) {
i.preventDefault();
$(".nav-arrow-left:visible").click();
$(".nav-arrow-right").tooltip("hide")
}
if (i.keyCode === 39) {
i.preventDefault();
$(".nav-arrow-right:visible").click();
$(".nav-arrow-left").tooltip("hide")
}
} else {
if (i.keyCode === 27) {
$(".tweets-header .nav-clear:visible").click()
}
}
if (i.keyCode === 191) {
$(".navbar-search .search-query:not(:focus)").focus().select()
}
});
$(window).scroll(function () {
var i = g.scrollTop();
if (i > 0) {
h.addClass("raised")
} else {
h.removeClass("raised")
}
})
};
b.extend = function (m) {
var h = Array.prototype.slice.call(arguments, 1),
j = 0,
g = h.length,
n, k;
for (j; j < g; j++) {
k = h[j];
for (n in k) {
if (k[n] !== undefined) {
m[n] = k[n]
}
}
}
return m
};
(function (g) {
g.base = {
init: function () {
$(".navbar-search .search-query").attr("placeholder", this.search_placeholder);
this.buildNavigation();
this.displayTweets(0)
},
buildNavigation: function () {
var k = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
s = this,
h = $('<div class="histogram"><h3></h3><ol class="months unstyled"></ol></div>'),
l, n = [],
p;
$(".content-nav").empty();
var m = _.max(this.status_index, function (i) {
return i.tweet_count
}),
j = function () {
if (l) {
n = n.reverse();
if (n.length < 12) {
for (var i = 0; i < 12; i++) {
if (!n[i] || n[i].match(/class="value">(\d+)<\/span>/)[1] != i + 1) {
n.splice(i, 0, c.empty_month.render({
this_month: i + 1
}))
}
}
}
l.find(".months").append(n.join(""))
}
};
for (var o = 0; o < this.status_index.length; o++) {
var q = k[this.status_index[o]["month"] - 1] + " " + this.status_index[o]["year"],
r = {
this_year: this.status_index[o]["year"],
this_month: this.status_index[o]["month"],
this_count: Grailbird.insertCommas(this.status_index[o]["tweet_count"]),
this_height: (this.status_index[o]["tweet_count"] / m.tweet_count) * 100,
str_title: q,
str_count: Grailbird.insertCommas(this.status_index[o]["tweet_count"]) + " " + this.pluralize(this.status_index[o]["tweet_count"]),
data_idx: o
};
this.status_index[o]["title_str"] = q;
if (this.status_index[o]["year"] !== p) {
j();
l = h.clone();
n = [];
l.find("h3").text(r.this_year);
$(".content-nav").append(l);
p = r.this_year
}
n.push(c.month_bar.render(r))
}
j();
$(".months .with-tweets").tooltip().click(function () {
s.displayTweets(Number($(this).attr("data-idx")))
})
},
displayTweets: function (i) {
Grailbird.current_index = i;
var k = {
border: false,
showMedia: true,
popupWebIntents: true
};
var o = this,
n = 0,
p = 0,
m = this.status_index[i],
h = m.var_name,
l = c.header_str.render({
title_str: m.title_str,
count: Grailbird.insertCommas(m.tweet_count),
content_type: this.pluralize(m.tweet_count)
}),
j = function () {
$(".tweets-header-title").fadeOut(100);
$(".container .contents .tweets").fadeOut(100, function () {
$(".tweets-header-title").empty().html(l).attr("title", "");
$(this).empty();
$(window).scrollTop(0);
$(".navbar-search .search-query").val("");
twt.timeline(Grailbird.data[h], k).renderTo(".tweets");
$(".tweets-header-title").fadeIn(100);
$(this).fadeIn(100)
})
};
if (this.status_index[i].year === undefined) {
$(".user-list .user").removeClass("active");
$($(".user-list .user")[i]).addClass("active");
k.showActions = false
} else {
$(".months .with-tweets, .histogram").removeClass("active");
$('.months .with-tweets[data-idx="' + i + '"]').addClass("active").parents(".histogram").addClass("active")
}
n = Number(i) + 1;
p = Number(i) - 1;
if (i === 0) {
p = null;
$(".tweets-header .nav-arrow-right").hide()
}
if (this.status_index.length - 1 == i) {
n = null;
$(".tweets-header .nav-arrow-left").hide()
}
if (i < this.status_index.length - 1) {
$(".tweets-header .nav-arrow-left").attr({
"data-idx": n,
"data-original-title": this.status_index[n]["title_str"]
}).show()
}
if (i > 0) {
$(".tweets-header .nav-arrow-right").attr({
"data-idx": p,
"data-original-title": this.status_index[p]["title_str"]
}).show()
}
if (!Grailbird.data[h]) {
Grailbird.loadScript(m, j)
} else {
j()
}
},
pluralize: function (h) {
return (Number(h) === 1) ? this.str_singular : this.str_plural
},
search: function (r) {
var m = this.status_index,
n = this.status_index.length,
p, s = [],
q = new RegExp(r, "im"),
i = h(r),
l = new RegExp(i, "im"),
o = 0;
while (n--) {
p = m[n];
if (!Grailbird.data[p.var_name]) {
Grailbird.loadScript(p, (function (t) {
return function () {
j(t.var_name)
}
})(p))
} else {
window.setTimeout((function (t) {
return function () {
j(t.var_name)
}
})(p), 1)
}
}
function h(t) {
return t.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&")
}
function j(u) {
var t = _.filter(Grailbird.data[u], function (w) {
var v = false;
if ( !! w.text.match(q)) {
v = true
} else {
if ( !! (w.user && (w.user.screen_name.match(q) || ("@" + w.user.screen_name).match(q) || w.user.name.match(q)))) {
v = true
} else {
if ( !! (w.entities)) {
_.each(w.entities.urls || [], function (x) {
if ((x.display_url && x.display_url.match(l)) || (x.expanded_url && x.expanded_url.match(l))) {
v = true;
return
}
});
_.each(w.entities.media || [], function (x) {
if ((x.display_url && x.display_url.match(l)) || (x.expanded_url && x.expanded_url.match(l))) {
v = true;
return
}
})
} else {
if ( !! (w.retweeted_status && (w.retweeted_status.text.match(q)))) {
v = true
} else {
if ( !! (w.retweeted_status && (w.retweeted_status.user && w.retweeted_status.user.name.match(q)))) {
v = true
} else {
if ( !! (w.retweeted_status && (w.retweeted_status.user && w.retweeted_status.user.screen_name.match(q)))) {
v = true
} else {
if ( !! (w.retweeted_status && (w.retweeted_status_user && ("@" + w.retweeted_status.user.screen_name).match(q)))) {
v = true
}
}
}
}
}
}
}
return v
});
_.each(t, function (v) {
s.push(v)
});
k()
}
function k() {
o++;
if (o == m.length) {
var t = _.sortBy(s, function (w) {
return Date.parse(w.created_at) * -1
}),
v = [s.length],
u;
v.push((s.length === 1) ? " result matches " : " results match ");
v.push("‘" + r + "’");
u = v.join("");
$(".container .tweets").fadeOut(100, function () {
$(".container").addClass("searching").removeClass("in-progress");
$(".tweets-header-title").empty().text(u).attr("title", u);
$(this).empty();
twt.timeline(t, {
border: false,
showMedia: true,
popupWebIntents: false
}).renderTo(".tweets");
_.each($(".e-content .p-name, .h-card .screen-name"), function (w) {
_.each($(w).find("*").andSelf(), function (x) {
$(x).highlight(r, "found")
})
});
$(this).fadeIn(100)
})
}
}
},
resetSearch: function () {
$(".container").removeClass("searching");
e.displayTweets(Grailbird.current_index)
}
}
})(a);
(function (g) {
var h = function () {
this.str_singular = "Tweet";
this.str_plural = "Tweets";
this.search_placeholder = "Search all Tweets";
this.status_index = tweet_index
};
h.prototype = Grailbird.extend({}, a.base);
g.tweets = function () {
return new h()
}
})(Grailbird);
(function (g) {
var h = function () {
var i
};
h.prototype.init = function () {
user_details.created_at_relative = twt.formattedDate(user_details.created_at);
payload_details.created_at_relative = twt.formattedDate(payload_details.created_at);
user_details.id = Grailbird.insertCommas(user_details.id);
payload_details.tweets = Grailbird.insertCommas(payload_details.tweets);
$("#primary-nav").append(c.user_header.render(user_details));
$("#util-nav .dropdown").append(c.user_nav.render(user_details));
$(".modal-header").append(c.modal_header.render(payload_details));
$(".modal-body .user-details").append(c.modal_user_details.render(user_details));
$(".modal-footer .stats").append(c.modal_payload_details.render(payload_details)).append(c.modal_account_details.render(user_details))
};
h.prototype.setState = function (i) {
this.active_display = i
};
h.prototype.getState = function () {
return this.active_display
};
h.prototype.search = function (i) {
this.active_display.search(i)
};
g.user = function () {
return new h()
}
})(Grailbird);
b.createNavTab = function (i, h) {
var g = "nav-" + i.toLowerCase();
$("#primary-nav").append(c.nav_tab.render({
sectionClass: g,
sectionName: i
}));
$sectionTab = $("." + g);
$sectionTab.click(function (j) {
$(this).addClass("active").siblings().removeClass("active");
$(".row .contents, .sidebar").removeClass("container-messages");
f.setState(h);
h.init()
});
return $sectionTab
};
b.isValidSearchStr = function (g) {
return g.length > 1
};
b.loadScript = function (i, k) {
var j = i.file_name,
h = document.createElement("script"),
g = function () {
i.loaded = true;
k && k()
};
h.src = j;
h.charset = "utf-8";
h.onreadystatechange = function () {
if (this.readyState == "complete" || this.readyState == "loaded") {
g()
}
};
h.onload = g;
document.getElementsByTagName("head")[0].appendChild(h)
};
b.insertCommas = function d(g) {
g = g.toString();
return (g.length > 3) ? self.Grailbird.insertCommas(g.substr(0, g.length - 3)) + "," + g.substr(g.length - 3) : g
}
})(Grailbird);
jQuery.fn.highlight = function (d, c) {
var b = new RegExp(d, "gi"),
a = Hogan.compile('<span class="{{class_name}}">{{{match}}}</span>');
return this.each(function () {
$(this).contents().filter(function () {
return (this.nodeType == 3 && b.test(this.nodeValue)) || ($(this).text().toLowerCase() === d.toLowerCase())
}).replaceWith(function () {
if (this.nodeValue === null) {
return a.render({
class_name: c,
match: $(this).html()
})
} else {
return (this.nodeValue || "").replace(b, function (e) {
return a.render({
class_name: c,
match: e
})
})
}
})
})
};
$(document).ready(function () {
Grailbird.init()
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment