土曜日, 11月 17, 2007

俗にいう"New Blogger"改造(その3)ラベルのラベルクラウド(タグクラウド)化

俗にいう"New Blogger"改造(その2)アーカイブのカレンダー化 に引き続き今回はNew Bloggerから実装されたらしいラベル機能のクラウド化(よくいうところのタグクラウドってやつですね)について纏めました。
参考もとは前回と同じくphydeaux3というサイトです。 Code for New Blogger Tag Cloud / Label Cloudの部分を参考にしていただければ、私のようなに拙い英語力でも何とか実装できます。
一応、JavaScriptがoffに設定されている場合には通常のラベル表示がされるようになっています。 大きくスタイルシートの設定とコアとなるJavaScript部分そしてウィジット部分の3パートに分かれます。
2008/8/2追記 何故かこんなブログでも役に立ってるみたいなので、 ウィジットの追加ボタンをつくってみた。 ボタンはこっちです。 1.まずはスタイルシートから
]]></b:skin>の前に次のコードを貼り付けます。
/* Label Cloud Styles
----------------------------------------------- */
#labelCloud {text-align:center;font-family:arial,sans-serif;}
#labelCloud .label-cloud li{display:inline;background-image:none !important;padding:0 5px;margin:0;vertical-align:baseline !important;border:0 !important;}
#labelCloud ul{list-style-type:none;margin:0 auto;padding:0;}
#labelCloud a img{border:0;display:inline;margin:0 0 0 3px;padding:0}
#labelCloud a{text-decoration:none}
#labelCloud a:hover{text-decoration:underline}
#labelCloud li a{}
#labelCloud .label-cloud {}
#labelCloud .label-count {padding-left:0.2em;font-size:9px;color:#000}
#labelCloud .label-cloud li:before{content:"" !important}


2.続いてコアになるJavaSccript部分になります。
テンプレートの上部にスタイル部分の終わり(]]></b:skin>)がありますが、それと</head>の間に
]]></b:skin> ここです。ここ!! </head>
以下のコードを貼り付けます。
<script type='text/javascript'>
// Label Cloud User Variables
var cloudMin = 1;
var maxFontSize = 20;
var maxColor = [0,0,255];
var minFontSize = 10;
var minColor = [0,0,0];
var lcShowCount = false;
</script>

えらくシンプルですがこいつがキモになってます。(理由は後半で)
3.後はウィジットの入れ替えになります。

<b:widget id='Label1' locked='false' title='Labels' type='Label'/> の部分に次のコードを貼り付けます。
<b:widget id='Label1' locked='false' title='Label Cloud' type='Label'>
<b:includable id='main'>
<b:if cond='data:title'>
<h2><data:title/></h2>
</b:if>

<div class='widget-content'>
<div id='labelCloud'/>
<script type='text/javascript'>

// Don't change anything past this point -----------------
// Cloud function s() ripped from del.icio.us
function s(a,b,i,x){
if(a>b){
 var m=(a-b)/Math.log(x),v=a-Math.floor(Math.log(i)*m)
    }
else{
 var m=(b-a)/Math.log(x),v=Math.floor(Math.log(i)*m+a)
 }
return v
}


var c=[];
var labelCount = new Array();
var ts = new Object;
<b:loop values='data:labels' var='label'>
var theName = "<data:label.name/>";
ts[theName] = <data:label.count/>;
</b:loop>

for (t in ts){
if (!labelCount[ts[t]]){
  labelCount[ts[t]] = new Array(ts[t])
  }
}
var ta=cloudMin-1;
tz = labelCount.length - cloudMin;
lc2 = document.getElementById('labelCloud');
ul = document.createElement('ul');
ul.className = 'label-cloud';
for(var t in ts){
if(ts[t] < cloudMin){
continue;
}
for (var i=0;3 > i;i++) {
    c[i]=s(minColor[i],maxColor[i],ts[t]-ta,tz)
     }
var fs = s(minFontSize,maxFontSize,ts[t]-ta,tz);
li = document.createElement('li');
li.style.fontSize = fs+'px';
li.style.lineHeight = '1';
a = document.createElement('a');
a.title = ts[t]+' Posts in '+t;
a.style.color = 'rgb('+c[0]+','+c[1]+','+c[2]+')';
a.href = '/search/label/'+encodeURIComponent(t);
if (lcShowCount){
    span = document.createElement('span');
    span.innerHTML = '('+ts[t]+') ';
    span.className = 'label-count';
    a.appendChild(document.createTextNode(t));
    li.appendChild(a);
    li.appendChild(span);
    }
 else {
    a.appendChild(document.createTextNode(t));
    li.appendChild(a);
    }
ul.appendChild(li);
abnk = document.createTextNode(' ');
ul.appendChild(abnk);
}
lc2.appendChild(ul);
</script>

<noscript>
<ul>
<b:loop values='data:labels' var='label'>
<li>
<b:if cond='data:blog.url == data:label.url'>
 <data:label.name/>
<b:else/>
 <a expr:href='data:label.url'><data:label.name/></a>
</b:if>
(<data:label.count/>)
</li>
</b:loop>
</ul>
</noscript>
<b:include name='quickedit'/>
</div>

</b:includable>
</b:widget>
とりあえず、ここまででタグクラウド表示が可能になります。

後は詳細なセッティングになります。
2.で追加したJavaScriptの値をあれこれいじると素敵なことが起こります。

maxFontSize:最大のフォントサイズを設定します。 minFontSize:最小のフォントサイズを設定します。
さらに
maxColor:最大フォントの色 minColor:最小フォントの色
が設定(RGB形式)できちゃいます。 つまり、RGB Color Code Chart等を参考にしてグラデーションがかけれるってことですね。

その他に
lcShowCount:ラベルの横に数字を付けるか付けないか(デフォルトoff)
があったりします。
テーマカラーにあった調整が可能です。 ラベルの書体についてはスタイルシート部分の
#labelCloud {text-align:center;font-family:arial,sans-serif;}
を変更することで対応できます。 ただし、フォントの変更のみをお勧めします。
text-align:justify; text-align:right; text-align:left;
を使い始めると左揃とかできますが、何か見た目がヘンなんでcenterでいいんじゃないでしょうか?
スタイルシートの2行目の
#labelCloud .label-cloud li{display:inline;background-image:none !important;padding:0 5px;margin:0;vertical-align:baseline !important;border:0 !important;}
このあたりはよほどのCSS使いじゃない限り触る必要はないみたいです。 一応、display:inlinedisplay:blockに変更するとラベルを1行ごとに表示できたりします。 最後に
#labelCloud .label-count
についてはlcShowCountがtrueのときに作用します。

とりあえず、ずらずら書いては見たが誰か見てくれるのかなぁ~

6 件のコメント:

WILSON さんのコメント...

はじめまして、参考にさせて頂きタグクラウド化できました。ありがとうございます。

NakuyoUguisu さんのコメント...

どうもはじめまして、ラベルクラウド化を参考にさせていただきました。

Ilha.McMillan さんのコメント...

はじめまして^^
参考にさせていただき、早速導入しました^^
タグクラウドを使用したくてTagClickを使っていたのですがRSSでもATOMでも最新情報を読んでくれず手動でエントリーの追加をしていたので、何かいい方法はないものか探していました。
とっても助かりました、ありがとうございます^^

匿名 さんのコメント...

貴重な情報ありがとうございます。
3を実施したあとプレビューをしても、文字ばかりの画面になってしまうので質問させてください。

>3.後はウィジットの入れ替えになります。

:widget id='Label1'

の部分に次のコードを貼り付けます。

→これは、b:widget id='Label1' locked='false' ~ を切り取ってということですか?

自分の元のコードは 
b:widget id='Label1' locked='false' title='ラベル' type='Label'

なのですが、これと変更すればよいでしょうか?

また、ウィジット テンプレートをデフォルトに戻す 方がいいですか?表示しておいたほうがいいですか?

この手の知識が全然無いもので、長い質問になってしまいましたがよろしくお願いします。

がら さんのコメント...

>alangさん
ちょっとざっくり書きすぎていたかも。。
こんなブログで質問していただいてありがとうございます。
で、ご質問の件ですが、
alangさんのおっしゃる通り、
<b:widget id='Label1' locked='false' title='ラベル' type='Label'>
(省略)
</b:widget>
の部分をごっそり置き換えてもらえればOKです。
(『ウィジットテンプレートの展開』のチェックボックスはオフにすると置き換える対象はよほどのことがない限り1行になります。)

ウィジットテンプレートをデフォルトに戻す必要はありませんよ。
僕もデフォルトではないですし。。。

Unknown さんのコメント...

リンクさせて頂きました〜

failed to read qemu headerのときのメモ

かなり久々。。。 忘れないようにここに書きこんでおく。 ちょっとした手違いで libvirtでイメージを起動しようとすると failed to read qemu header なんておっしゃられて起動しない。。。 vmwareserverを使って...