TumblrでjQueryつかって目次を自動生成する
はじめに
上のページを参考にしてやってみたところ、このスクリプトでは複数記事があった場合に対応できないのと、h1, h2タグの階層構造に対応していないことに気づいて、ちょっと不便だな、となった。ということで、改良したからメモ。
目次
やりかた
Step1: JQueryを使えるようにする
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
上記コードをテーマのHTMLのヘッダかどっかに突っ込む。
Step2: JSのコードの追加
追加するコードは以下。これをテーマのヘッダかどこかに入れる。
function getLevel(tagName) {
if (tagName.toLowerCase() == "h1")
return 1;
else if (tagName.toLowerCase() == "h2")
return 2;
else
return -1;
}
$(function() {
$(".toc").each(function() {
var toc = $(this);
var article = $(this).closest("article");
var article_id = article.attr("id");
var toc_id = "toc-" + article_id;
var index_tree = $('<ul></ul>');
var current_node = index_tree;
var prevLevel = 1;
article.find("h1,h2:not(.post-title)").each(function(i) {
var id = '' + article_id + '-chapter-' + i;
$(this).attr('id', id);
var level = getLevel($(this).get(0).tagName);
var text = '<li><a href="#' + id + '">' + $(this).html() + '</a></li>';
if (level > prevLevel) {
var new_node = $('<ul></ul>');
current_node.find("li:last").append(new_node);
current_node = new_node;
prevLevel = level;
} else if (level < prevLevel) {
current_node = current_node.parent().closest("ul");
prevLevel = level;
}
current_node.append(text);
$(this).append('<span class="back-toc"><a href="#' + toc_id + '">↑</a></span>');
});
$(this).append(index_tree);
$(this).attr('id', toc_id);
});
});
$(function() {
$('a[href^=#]').click(function() {
var speed = 400;
var href = $(this).attr("href");
var target = $(href == "#" || href == "" ? 'html' : href);
var position = target.offset().top;
$('body,html').animate({
scrollTop: position
}, speed, 'swing');
return false;
});
});
Step3: 本文に目次をつける
本文中の目次つけたいところにこれを置く。
<div class="toc"></div>