前回の記事「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