いわゆる「10年日記」的機能を追加する
ずっとtdiaryによるweb日記から日々のTwitterのつぶやきをこのページにまとめているわけですが1、ふと、日付毎につぶやきはまとまっているのだから、ちょっと見せ方を変えるだけでいわゆる「10年日記」的な機能は簡単に実現出来ることに気が付きました。
そこでぼんやり実現方法を考えていたんですが、今回はhugoレベルに手を入れて10年日記ページを生成させるよりも、すでに日別になっている現在のページをフロントエンドで合成した方がお手軽で早そう、と思い、そっちの方向で実現してみることにしました。
準備
フロントエンドで「過去をさかのぼってカレンダー上の『その日』のエントリを合成」するには、やはりJavaScriptでAjax的にページを読んだりする必要がありますので、今回このページとしては初めてjqueryを導入しました。また合成したページはフローティングポップアップで表示されるようにしてみたかったので、そのためのJS libraryであるところのcolorboxも利用しました。それぞれ下記リンクから入手出来ます。
上記JS libraryを、hugo-home/static/以下に置いておいて、hugo-home/layouts/partials/header.htmlなどで以下のような感じで読み込んでおきます。
<link rel="stylesheet" href="/css/colorbox.css">
:
<script src="/js/jquery-1.12.1.min.js"></script>
<script src="/js/jquery.colorbox-min.js"></script>
実際のコード
最近のJS libraryは高機能なので、以下のようなコードだけでやりたいことが実現出来てしまいます。今回僕はindexページでのみ10年日記機能を有効にしたかったので、hugo-home/layouts/index.htmlのヘッダを読み込んでいる直後に以下のようなコードを追加しました。
<script type="text/javascript">
<!--//
function cyclic(date) {
var year = date.substring(0, 4);
var monthday = date.substring(5, 7) + date.substring(8, 10);
var getmain = function(y, md){
return $.Deferred(function(defer){
$.ajax({url:"/" + y + "/" + md + "/"}).done(function(data){
defer.resolve("<main role='main'>" + $("main", data).html() +"</main>");
}).fail(function(){
defer.resolve("");
});
}).promise();
};
var dfds = [];
for (var i = year; i > 2003; i--)
dfds.push(getmain(i, monthday));
$.when.apply(this, dfds).done(function(){
var h = "";
var resArray = Array.prototype.slice.call(arguments);
$.each(resArray, function(i, res){
if (res != "")
h = h + res + "<hr/>";
});
if (h != "")
$.colorbox({width:"100%", maxWidth:"770px", height:"100%", html:h});
});
}
//-->
</script>
その上で、上記関数を以下のような形で呼び出すようにしました。
<span onclick="cyclic('{{ .Date.Format "2006-01-02" }}');" style="cursor: pointer"><i class="icon-calendar calendar_icon"></i></span>
上記はカレンダー型のicon fontを使っているので若干複雑に見えますが、ようはaタグの代わりにspanタグでclickイベントを拾い、関数を適当な引数で呼び出しているだけです。簡単ですな。
おしまい
少しでもお楽しみいただければ幸いでした。
-
tdiaryを使い始めてからでも2004年からだから、もう12年になるのか。その前のHTML直書き時代を入れると20年近く! ↩︎