[Paid] Multi-Level Tags in Sidebar

Aug 22, 2007 16:36

This code is almost identical to the tutorial found at s2expressive (which, in turn, was borrowed from s2flexisquares). That is because I blatantly stole it and adapted it slightly to work for Bloggish by changing the classes and one measly line of code.

As usual, you may change the stuff in green.

[Edit] Just when I thought I went and did something clever, I found out it's unecessary. Looks like the original code was written for Bloggish, too. Here it is.

function print_module_tags(string title) {

# Specify your delimiter.  One character only -- extra chars get truncated.

var string delimiter = ":";

# Do you want to show the tag use counts?

var bool show_count = true;

# Specify the text to show just before the use count, if any

var string pre_count = "(";

# Specify the text to show just after the use count, if any

var string post_count = ")";

### Don't change below unless you know what you are doing!

var Page p = get_page();

var string list = "";

if (size $p->visible_tag_list() > 0) {

if ($delimiter->length() > 1) {

$delimiter = $delimiter->substr(0, 1);

}

var string[] closing_html;

var string[] prev_tags;

var int tag_list_pos = 0;

var string tier_code = "";

$closing_html[0] = "";

$prev_tags[0] = "";

foreach var TagDetail t ($p->visible_tag_list()) {

var string[] tags;

if ($t.name) {

var int array_counter = 0;

var string buffer = "";

foreach var string char ($t.name) {

if($char == $delimiter) {

$tags[$array_counter] = $buffer;

$array_counter = $array_counter + 1;

$buffer = "";

}

else {

$buffer = $buffer + $char;

}

}

$tags[$array_counter] = $buffer;

var int pos = 0;

foreach var string tier($tags) {

if (size $closing_html <= $pos) {

$closing_html[$pos] = "";

}

if (size $prev_tags <= $pos) {

$prev_tags[$pos] = "";

}

if (size $tags == ($pos + 1)) {

$tier_code = """ $tier""";

if ($show_count) {

$tier_code = $tier_code + """ ${pre_count}${t.use_count}${post_count}""";

}

}

else {

$tier_code = """$tier""";

}

if ($prev_tags[$pos] == "") {

$list = $list + """
  • $tier_code""";

    $closing_html[$pos] = "
";

}

elseif ($tags[$pos] != $prev_tags[$pos]) {

var int i = 0;

foreach var string html ($closing_html) {

if ($i > $pos) {

$list = $list + $closing_html[$i];

$closing_html[$i] = "";

}

$i++;

}

if ($closing_html[$pos] == "") {

$list = $list + """
  • $tier_code""";

    $closing_html[$pos] = "
";

}

else {

$list = $list + """
  • $tier_code""";

    }

    }

    else {

    }

    $pos++;

    }

    $prev_tags = $tags;

    }

    $tag_list_pos++;

    }

    var int i = 0;

    var string remaining_html = "";

    foreach var string html ($closing_html) {

    if ($html != "") {

    $remaining_html = $html + $remaining_html;

    $closing_html[$i] = "";

    }

    $i++;

    }

    $list = $list + $remaining_html;

    }

    open_module("categories", $title, "");

    print """$list""";

    var string tags_url = $p.journal->base_url() + "/tag/";

    close_module();

    }

    How to use this code

    In order for this code to display your tags properly, you will need to rename them using your delimiter (default is :). For example, I've used:

    movies:anchorman
    movies:the notebook
    movies:stranger than fiction.
    music:cas haley
    music:andrew stein
    music:jasonmraz:tv
    music:open mic night
    music:the white stripes



    Tweaking with CSS

    I personally like my inner links to have a different list style to differentiate them a bit more, so I used the following CSS for that:

    .module-categories ul ul li{
    list-style-type:circle;
    margin: 3px 0 1px 15px;
    padding-left:0;
    background:none;
    }
  • theme layers, tutorial:tags, tags, tutorial, modules:tags, modules

    Previous post Next post
    Up