SSブログ

ソネブロを改造する [技術系]

たまには(初めて?)システム屋らしいコトを書いてみるとしましょう
ソネブロ限定の話題で申し訳無いっス('`)

ソネブロにはいくつかのblogパーツ(ガジェット?)があるんですけれども
その中の一つに「タグクラウド」っちゅーものがあります。(他社blogにもあると思います)

20100321.jpg

ゴチャゴチャしていて見辛いし、美しくないので俺は好きではありません…
というコトで、ちょいと改造して「タグツリー」なるものを作ってみました。

この中の[+] をクリックすると、親タグに紐付く子タグが展開されます。
現在の実装では、親タグと子タグの紐付けは前方一致にて行っていますので(手抜き)
「バイエル」と「バイエルXXX~XXX」が親子関係となります。

ちょいと改造する事で、前方一致以外のグルーピングも可能となりますので
使い勝手はそれなりに良いかなぁと思いますだ。

「タグクラウド」としての機能は失われますが、ある種の決まったタグを多用する方で
整然と管理したい方にはオススメでございます('ー`)


実装はソース内のコメントを見てくださいまし!
 
ソースが見れないコトもあるので、載せておくっス

<div class="sidebar" id="side_tag">
<h3 class="sidebar-title"><% content.title | html %></h3>
<div class="sidebar-body">
<% content.header -%>
<div id="tag_cloud_<% content.id %>" style="word-break:break-all;">
<% loop:list_tags -%>
<a class="_tag" title="<% tag.word%>" href="<% blog.tag_url(tag) %>"><% tag.word | html %></a><br>
<% /loop -%>
</div>
<% content.footer -%>
</div>
<div class="sidebar-end"></div>
</div>
<script type="text/javascript">
<!--
var keyWords = new Array("バイエル");
var tagS = "<a class=\"_tag\" ";
var tagE = "</a>";
var tagBR = "<br>";
var strOpen = "[+]";
var strClose = "[-]";

sort();
group();

/*
  funtion : タグのソートを行う
  param : なし
*/
function sort()
{
    var elmTagCloud = document.getElementById("tag_cloud_<% content.id %>");
    var elmHref = elmTagCloud.getElementsByTagName("a");
    var htmlStrArr = new Array();
    var htmlStr = "";

    // <a>タグの要素数回、処理を行う
    for(var i = 0;i < elmHref.length; i++)
    {
        // タグの再構成
        htmlStrArr[i] = tagS + "title=\"" + rename(elmHref[i].title) + "\" href=\"" +
                        elmHref[i].href + "\">" + rename(elmHref[i].innerHTML) + tagE;
    }

    // 再構成後のタグをソートする
    htmlStrArr.sort();

    // ソート後のタグを連結する
    for(var i = 0;i < htmlStrArr.length; i++)
    {
        htmlStr += htmlStrArr[i] + tagBR;
    }

    // タグエレメントの内容を書き換える
    elmTagCloud.innerHTML = htmlStr;
}

/*
  funtion : 表示内容の変換を行う
  param : 変換前表示内容
  return : 変換後表示内容
*/
function rename(name)
{
    // 変換を行う
    if(name == "バイエル1~10"){ return "バイエル001~010";}
    if(name == "バイエル01~10"){ return "バイエル001~010";}
    if(name == "バイエル11~20"){ return "バイエル011~020";}
    if(name == "バイエル21~30"){ return "バイエル021~030";}

    return name;
}

/*
  funtion : タグのグルーピングを行う
  param : なし
*/
function group()
{
    var groupNo = 0;
    var elmTagCloud = document.getElementById("tag_cloud_<% content.id %>");
    var elmHref = elmTagCloud.getElementsByTagName("a");
    var htmlStr = "";
    var reg;

    // キーワード(親タグ)数回、処理を行う
    for(var i = 0;i < keyWords.length; i++)
    {
        // 親タグ正規表現オブジェクトの作成
        reg = new RegExp("^" + keyWords[i]);

        // <a>タグ要素数回、処理を行う
        for(var j = 0; j < elmHref.length; j++)
        {
            // 処理対象が親タグの場合
            if(keyWords[i] == elmHref[j].title)
            {
                htmlStr += "<span id=\"grp" + groupNo + "\" onclick=\"showHide('grp" +                         groupNo + "')\">" + strOpen + "</span>" +
                        tagS + "title=\"" + elmHref[j].title + "\" href=\"" +
                        elmHref[j].href + "\">" + elmHref[j].innerHTML + tagE + tagBR;
            }
            // 処理対象が子タグの場合(前方一致)
            else if(elmHref[j].title.match(reg))
            {
                htmlStr += "<span id=\"grp" + groupNo + "-" + j + "\" style=\"display:none\"> " +                         tagS + "title=\"" + elmHref[j].title + "\" href=\"" +
                        elmHref[j].href + "\">" + elmHref[j].innerHTML + tagE + tagBR + "</span>";
            }
            // 無関係タグの場合
            // 複数の親タグが存在する場合、無関係タグが複数表示されるため
            // その場合には、ここではタグの再構成を行わず最外ループ終了後に
            // 無関係タグを追加するよう変更する必要がある。
            // この時、既に追加された子タグを判別する処理が必要となるが
            // 今回は未実装とする。(仮配列作って、そちらに突っ込んでおけば良い)
            else
            {
                htmlStr += tagS + "title=\"" + elmHref[j].title + "\" href=\"" +
                        elmHref[j].href + "\">" + elmHref[j].innerHTML + tagE + tagBR;
            }
        }
    }

    // タグエレメントの内容を書き換える
    elmTagCloud.innerHTML = htmlStr;
}

/*
  funtion : タグの表示を制御する
  param : グループID
*/
function showHide(grpId)
{
    var spans = document.getElementsByTagName("span");

    // 子タグ正規表現オブジェクトの作成
    reg = new RegExp("^" + grpId + "-");

    // <span>要素数回、処理を行う
    for(var i = 0; i < spans.length; i++)
    {
        // 親タグの先頭記号の場合
        if(spans[i].id == grpId)
        {
            // 開く場合、閉じる表示に変更
            if(spans[i].innerHTML == strOpen)
            {
                spans[i].innerHTML = strClose;
            }
            // 閉じる場合、開く表示に変更
            else
            {
                spans[i].innerHTML = strOpen;
            }
        }
        // 子タグの場合
        else if(spans[i].id.match(reg))
        {
            // 非表示の場合、表示に変更
            if(spans[i].style.display == "none")
            {
                spans[i].style.display = "block";
            }
            // 表示の場合、非表示に変更
            else
            {
                spans[i].style.display = "none";
            }
        }
    }
}
// -->
</script>
 
nice!(59)  コメント(18)  トラックバック(0) 

nice! 59

コメント 18

鶴

あれぇ~~~チンプンカンプンでわからないけど・・・・すごいことされたのですね~
by (2010-03-21 01:26) 

雨香

タグツリー凄い便利です!!バイエルの聴きたい所探しやすいです!!
でも、上の記事内はさっぱりわかりません;
お昼はこの作業をなさっていたのですね。
サイドバーがとても気になっていましたww

by 雨香 (2010-03-21 01:36) 

tamanossimo

あたしもこんな風にしたいなぁ・・・・
コピーして貼り付けてもだめでしょう?!

by tamanossimo (2010-03-21 01:40) 

ちょいのり

タグにこだわりが無いからなあ・・・オイラってば^^;

by ちょいのり (2010-03-21 02:32) 

nyankome

便利ですね~。
こういう便利な技を紹介頂けると嬉しいです。

by nyankome (2010-03-21 10:50) 

yablinsky

なかなかいい感じですね。私は<script>タグを使ったことがありませんので尊敬です。Caelumさんのマイカテゴリーもとてもいいと思っていたのですが、今回のはかなりプログラミングと言う感じで複雑なのですが、マイカテゴリーも解説してくださると助かります。
by yablinsky (2010-03-21 11:52) 

ぷち

うちは仕事でWebを触っていて、ソースを見るのですが、
こんなんできません!!
勉強になります!!

by ぷち (2010-03-21 17:56) 

ぱえ

すげぇ。
インチキSEの私とは全然違うw

そして勉強しようとさえしない自分が居る・・・(-_-

そういえば、カテゴリーも綺麗にツリー化してるなぁ、と
前から思っておりました。
凄いっす。
羨ましいっす。

by ぱえ (2010-03-21 23:21) 

Caelum

こんばんは、本職Caelumです!

>>鶴さん
なにやら小難しく見えますが、こけおどしであります('w`)
ブログパーツをカスタマイズすると、こんな事もできますよ~って感じの
ご紹介でございます('ー`)b

by Caelum (2010-03-22 04:52) 

Caelum

>>雨香さん
ソネブロは記事管理機能(カテゴリ、タグ)が弱っちいので
標準でこういう部品があってもいいなぁ…と思うんですよね('`)

>お昼の作業
正解!この作業をしておりました('ー`)b
サイドバーに怪しい文字が表示されたり、消えたりしてましたネ
そんなところまで気付いて頂けるとは、何だか嬉しいです(*´ー`)

by Caelum (2010-03-22 05:10) 

Caelum

>>tamanossimoさん
このままコピーをすると、以下のようになりまする。

・文字の大きさが統一される
・タグが昇順ソートされる(A→Zの順で並び替えされる)
・1行につき1タグになるので、全体が縦長になる

「バイエル」と書いてある部分を変更すると、グルーピングもできますが
場合によっては他の部分も改造する必要があるので、触らない方が
良いかもしれませぬ。(正常に動作しなくなる可能性アリ)

マトモに動かなくなった場合は、HTML編集の中にある
「初期状態に戻す」というボタンで元に戻りますヨ。

by Caelum (2010-03-22 05:17) 

Caelum

>>ちょいのりさん
俺もバイエル以外はあんまりタグを付けないので、この機能を
フル活用する機会は無さそうです('w`)

ソネブロはカテゴリ管理機能がちょっと弱ような気がするので
タグを上手く使うと、結構管理しやすくなるかもしれませぬ。
その辺り、ちょいと模索してみようと思います('ー`)

by Caelum (2010-03-22 05:20) 

Caelum

>>nyankomeさん
こういうのがあると、タグもちょっと使いやすくなりますよね('ー`)
今後もチョロチョロと、こういった技術ネタを書いて行こうと思います!

今回は技術解説も何も無くてアレでしたが、次回からはもっと
ポイントを押さえた、ソネブロ以外の方にも役立つような技術記事を
書こうと思うっス('ー`)

by Caelum (2010-03-22 05:38) 

Caelum

>>yablinskyさん
ソネブロはスクリプトのプレビューが出来ないっぽいので
開発効率がめちゃくちゃ悪いっス('w`)

>マイカテゴリー
むっふっふ、実は割と自信作であります('ー`)b
これはあえてガッツリ作り込み系にはしなかったので、割と簡単な
構造となっておりまして、組み込みも割りと容易かと思います。
近いうちにご紹介致しますネ

by Caelum (2010-03-22 05:44) 

Caelum

>>ぷちさん
おお、Web系のお仕事だったのですね('ー`)
というコトは、職業的には親戚みたいな感じですナ!

今回のソースはかなり思い付きで作られておりますゆえ
あまり洗練されておらず、読み辛いですよね('`)

…と思って改めて見直したら、マズい所を発見してしまった!
現状の動作には全く関係無いので、問題は無いんですけれど('A`)

→groupNoをインクリメントし忘れているため、複数のグループがあると
 グループ0が上書きされてしまい、最初のグループが消滅する!
 どちらにしても、複数グループには未対応なので問題無しですが('`)

by Caelum (2010-03-22 05:55) 

Caelum

>>ぱえさん
いやー、でも結構ボロボロっスよ、コレ('w`)
もっと洗練されたものを公開しないとアカンですね…
複数グループ対応版を作ったら、改めて公開しようと思います!

>カテゴリー
雑多なblogなので、このように分けてみました('ー`)b
コレについては、近日中に公開致しますネ

by Caelum (2010-03-22 05:58) 

にごろ

ソネブロ他社にたよりっきりですよね^。^
言語は幅広くOKですか?

by にごろ (2010-03-22 14:19) 

Caelum

>>にごろさん
ソネブロのエンジンはSeesaaからの提供物ですからねぇ
自社開発よりもコスト面で有利だったんでしょうね、きっと。
技術が統一されるコトにより、更なる改良も期待できますから
それはそれでアリかなぁ…どうでしょうね('w`)

>言語
得意順に並べると、こんなトコロですかねぇ

1.Java 2.HTML(JS、CSS含) 3.SQL(PL*SQL含) 4.VB(VBA含)
5.C 6.C++ 7.perl 8.Pascal
※SQLはOracle限定です、DB2もちょっとは触れますがアレです('A`)

1~4まではほぼ差が無いですが、5以降はかなり差があります
アセンブラ、COBOL、C#、.net等は全く出来ません(触った事がありません)

by Caelum (2010-03-22 22:23) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました