2017-12-26

Blogger ラベル頻度順パンくずリスト

English»

前回の記事「Blogger パンくずリスト(構造化データ対応)の作成」でBlogger のパンくずリストで複数のラベルを表示する場合、アルファベット順になることを書きました。

ラベルがツリー構造になっている場合、上位の階層にあるラベルほど使用頻度が高くなりますので、パンくずリストをラベル頻度順に並べることで「ほぼ」階層順に表示することができます。

アルファベット順のパンくずリストを JavaScript でラベル頻度順に並べ替えてみます。

前提

  • ラベルガジェットを表示し、「ラベル毎の投稿数」を表示していること。
  • ラベルガジェットの ID が Label1 であること
  • パンくずリストの ID が breadcrumb であること
  • パンくずリストが <li> タグを使用し、構造化データの形式が RDFa であること

参考

を参照してください。

JavaScript

次の JavaScript を HTML の編集</body> の前に挿入してください。

JavaScript
<script type='text/javascript'>
//<![CDATA[
(function(){
var label = document.getElementById('Label1');
if (label == null) return;
var breadcrumb = document.getElementById('breadcrumb');
if (breadcrumb == null) return;
// store label name and count into object
var labelCounts = {};
// 'div ul li' is for List, 'div>span' is for Cloud
var elms = label.querySelectorAll('div ul li, div>span');
[].forEach.call(elms, function(elm) {
if (elm.childElementCount == 2) {
labelCounts[elm.children[0].innerHTML] = Number(elm.children[1].innerHTML.replace(/[()]/g, ''));
}
});
// sort breadcrumbs by label frequency
var i = 0;
[].slice.call(breadcrumb.querySelectorAll('li'))
.sort(function (a, b) {
var a = a.textContent.replace(/\r?\n/g, '');
var b = b.textContent.replace(/\r?\n/g, '');
if (labelCounts[a] == null || labelCounts[b] == null) return 0;
if (labelCounts[a] > labelCounts[b]) return -1;
if (labelCounts[a] < labelCounts[b]) return 1;
}).forEach(function(li) {
// set content attribute for RDFa
pos = li.querySelector('[property="position"]');
if (pos != null) {
pos.setAttribute('content', ++i);
}
breadcrumb.appendChild(li);
});
})();
//]]>
</script>

パンくずリストがラベル頻度順にソートされて表示されます。

ラベルの頻度が同じ場合は、アルファベット順(元のまま)となります。

No comments:

Post a Comment