Last active
August 29, 2015 14:01
-
-
Save jamadam/eea0bc3725a73507d5e8 to your computer and use it in GitHub Desktop.
This file contains 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
$(function(){ | |
var api = new MT.MTDataAPIYetAnother({ | |
//baseUrl:"http://192.168.56.101:5000/mt-data-api.cgi", | |
//baseUrl:"http://127.0.0.1:5000", | |
baseUrl:<$MTCGIPath$>mt-data-api.cgi, | |
internalLimit: 1000 | |
}); | |
var routes = { | |
entry: constructEntryPage, | |
month: constructMunthlyArchivePage, | |
category: constructCategoryPage, | |
tag: constructTagPage | |
}; | |
var dispachAjaxPage = function() { | |
var params = parseHashQuery(); | |
var type = params.shift(); | |
(routes[type] || constructIndexPage).apply(this, params); | |
return false; | |
}; | |
dispachAjaxPage(); | |
$(window).on("hashchange", dispachAjaxPage); | |
/** | |
* ブログタイトルを表示 | |
*/ | |
api.getBlog(<$MTBlogID$>, {fields: "name,url"}, function(res) { | |
$("h1 a").html(res.name).attr("href", res.url); | |
}); | |
/** | |
* タグクラウドを作成 | |
*/ | |
api.listTags(<$MTBlogID$>, {maxRank:6, monthLimit:12}, function(res) { | |
if (res.error || res.items.length === 0) { | |
return; | |
} | |
var appender = generateAppender($(".tagCloudContainer")); | |
for (idx in res.items) { | |
var item = res.items[idx]; | |
var text = sprintf("%", item.name); | |
var li = appender(text, sprintf("#!/tag/%", item.name)); | |
li.attr("class", "rank-" + item.rank); | |
} | |
}); | |
/** | |
* 最近の記事一覧を作成 | |
*/ | |
api.listEntries(<$MTBlogID$>, {limit: 5, fields: 'id,title'}, function(res){ | |
if (res.error || res.items.length === 0) { | |
return; | |
} | |
var appender = generateAppender($(".recentEntriesContainer")); | |
for (idx in res.items) { | |
var item = res.items[idx]; | |
var text = item.title; | |
appender(text, window.location.pathname + '#!/entry/' + item.id); | |
} | |
}); | |
/** | |
* 月別アーカイブを作成 | |
*/ | |
api.listMonthlyEntryCounts(<$MTBlogID$>, {monthLimit:6}, function(res){ | |
if (res.error || res.items.length === 0) { | |
return; | |
} | |
var appender = generateAppender($(".monthlyArchiveContainer")); | |
for (idx in res.items) { | |
var item = res.items[idx]; | |
var text = sprintf("%年%月(%)", item.year, item.month, item.totalResults); | |
appender(text, sprintf("#!/month/%/%", item.year, item.month)); | |
} | |
}); | |
/** | |
* カテゴリー一覧を作成 | |
*/ | |
api.listCategoryStats(<$MTBlogID$>, function(res) { | |
if (res.error || res.items.length === 0) { | |
return; | |
} | |
var appender = generateAppender($(".categoryContainer")); | |
for (idx in res.items) { | |
var item = res.items[idx]; | |
var text = sprintf("%(%)", item.label, item.totalResults); | |
appender(text, sprintf("#!/category/%", item.label)); | |
} | |
}); | |
return; | |
/** | |
* prop2にデータを追加 | |
* @param {Object} cont | |
* @param {Array} array | |
* @param {String} type | |
*/ | |
function prop2append(cont, array, type) { | |
if (array.length) { | |
cont.show().find(".data").html(array.map(function(v){ | |
return sprintf('<a href="#!/%/%">%</a>', type, v, v); | |
}).join(', ')); | |
} | |
}; | |
/** | |
* エントリーページを生成 | |
* @param {Number} id | |
*/ | |
function constructEntryPage(id) { | |
var cont = $(".layouts > .entryContainer").clone(); | |
api.getEntry(<$MTBlogID$>, id, function(res) { | |
if (res.error) { | |
return; | |
} | |
assignEntryData(cont, res); | |
swapMain(cont); | |
}); | |
return false; | |
} | |
/** | |
* インデックスページを生成 | |
*/ | |
function constructIndexPage() { | |
var pageContainer = $(".layouts > .pageContainer.type1").clone(); | |
var listContainer = pageContainer.find(".entryListContainer"); | |
var entryContainer = $(".layouts > .entryContainer").clone(); | |
api.listEntries(<$MTBlogID$>, {limit:10}, function(res){ | |
if (res.error || res.items.length === 0) { | |
return; | |
} | |
for (idx in res.items) { | |
var item = res.items[idx]; | |
var cont = entryContainer.clone(); | |
var date = new Date(item.date); | |
assignEntryData(cont, item); | |
cont.appendTo(listContainer); | |
} | |
}); | |
var description = "このブログは、MovableTypeのDataAPI経由のデータをもとにページの全てを生成することを目指す実験用ブログです。"; | |
pageContainer.find(".pageDescription").html(description); | |
swapMain(pageContainer); | |
} | |
/** | |
* 月別一覧ページ | |
* @param {Number} year | |
* @param {Number} month | |
*/ | |
function constructMunthlyArchivePage(year, month) { | |
var pageContainer = $(".layouts > .pageContainer.type2").clone(); | |
var listContainer = pageContainer.find(".entryListContainer"); | |
var entryContainer = $(".layouts > .entryContainer").clone(); | |
api.listEntriesByMonth(<$MTBlogID$>, parseInt(year), parseInt(month), | |
{limit:20}, function(res){ | |
if (res.error || res.items.length === 0) { | |
return; | |
} | |
for (idx in res.items) { | |
var item = res.items[idx]; | |
var cont = entryContainer.clone(); | |
var date = new Date(item.date); | |
assignEntryData(cont, item); | |
cont.appendTo(listContainer); | |
} | |
}); | |
pageContainer.find("h2").html(sprintf("%年%月の記事一覧", year, month)); | |
swapMain(pageContainer); | |
} | |
/** | |
* カテゴリー別一覧ページ | |
* @param {String} basename | |
*/ | |
function constructCategoryPage(label) { | |
var pageContainer = $(".layouts > .pageContainer.type2").clone(); | |
var listContainer = pageContainer.find(".entryListContainer"); | |
var entryContainer = $(".layouts > .entryContainer").clone(); | |
api.listEntries(<$MTBlogID$>, {category:label, limit:10}, function(res){ | |
if (res.error || res.items.length === 0) { | |
return; | |
} | |
for (idx in res.items) { | |
var item = res.items[idx]; | |
var cont = entryContainer.clone(); | |
assignEntryData(cont, item); | |
cont.appendTo(listContainer); | |
} | |
}); | |
pageContainer.find("h2").html(sprintf("「%」カテゴリーの記事一覧", label)); | |
swapMain(pageContainer); | |
} | |
/** | |
* タグ別一覧ページ | |
* @param {String} tag | |
*/ | |
function constructTagPage(tag) { | |
var pageContainer = $(".layouts > .pageContainer.type2").clone(); | |
var listContainer = pageContainer.find(".entryListContainer"); | |
var entryContainer = $(".layouts > .entryContainer").clone(); | |
api.listEntries(<$MTBlogID$>, {tag:tag, limit:10}, function(res){ | |
if (res.error || res.items.length === 0) { | |
return; | |
} | |
for (idx in res.items) { | |
var item = res.items[idx]; | |
var cont = entryContainer.clone(); | |
assignEntryData(cont, item); | |
cont.appendTo(listContainer); | |
} | |
}); | |
pageContainer.find("h2").html(sprintf("「%」タグの記事一覧", tag)); | |
swapMain(pageContainer); | |
} | |
/** | |
* mainコンテナーの内容を差し替え | |
* @param {Object} newContent | |
*/ | |
function swapMain(newContent) { | |
var main = $(".main"); | |
var current = main.children("*"); | |
var fadeIn = function(){ | |
newContent.hide(); | |
main.html(newContent.fadeIn("fast")); | |
}; | |
current.length ? current.fadeOut("fast", fadeIn) : fadeIn(); | |
} | |
/** | |
* エントリーのデータを各クラスに配備 | |
* @param {Object} cont Entry container | |
* @param {Object} item An item | |
*/ | |
function assignEntryData(cont, item) { | |
var date = new Date(item.date); | |
cont.find(".title").html(item.title); | |
cont.find(".body").html(item.excerpt); | |
cont.find(".authInfo .data").html(sprintf( | |
"%(%年%月%日 %:%)", | |
item.author.displayName, | |
date.getFullYear(), | |
date.getMonth() + 1, | |
date.getDate(), | |
pading(date.getHours()), | |
pading(date.getMinutes()) | |
)); | |
cont.find(".trackbacks .data").html(item.trackbacks.length); | |
cont.find(".comments .data").html(item.comments.length); | |
prop2append(cont.find(".categories"), item.categories, 'category'); | |
prop2append(cont.find(".tags"), item.tags, 'tag'); | |
} | |
/** | |
* 汎用のリスト要素追加クロージャー | |
* @param {Object} cont | |
*/ | |
function generateAppender(cont) { | |
var ul = $(".layouts .linkListContainer").clone().appendTo(cont); | |
cont.show(); | |
var tmpl = ul.find("li").remove(); | |
return function (text, href) { | |
var li = tmpl.clone(); | |
li.find("a").html(text).attr('href', href); | |
li.appendTo(ul); | |
return li; | |
}; | |
} | |
/** | |
* 簡易版sprintf | |
* @param {String} format | |
* @param {String} var_args | |
*/ | |
function sprintf(format, var_args) { | |
var values = Array.prototype.slice.call(arguments, 1); | |
for (idx in values) { | |
format = format.replace("%", values[idx]); | |
} | |
return format; | |
} | |
/** | |
* 2桁専用ゼロパディング | |
* @param {Number} num | |
*/ | |
function pading(num) { | |
return ('0' + num).slice(-2); | |
} | |
/** | |
* クエリー文字列をパース | |
* @param {String} string | |
*/ | |
function parseQuery(string) { | |
var vars = {}; | |
if (!string) { | |
return undefined; | |
} | |
string.split('&').map(function(v, i) { | |
var hash = v.split('='); | |
vars[hash[0]] = hash[1]; | |
}); | |
return vars; | |
} | |
/** | |
* ハッシュ内クエリー文字列をパース | |
*/ | |
function parseHashQuery() { | |
var hash = window.location.href.split('#!')[1]; | |
return !hash ? [] : decodeURI(hash).replace(/^\//, '').split('/'); | |
} | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment