this code is a quick'n'dirty conversion of
s2flexisquared's
s2flexisquares multi-level tags in sidebar.
the following set commands should be added to your user layer and replace any that are currently in there.
set layout_sidebox_profile_visibility = "1";
set layout_sidebox_latestmonth_visibility = "2";
set layout_sidebox_links_visibility = "3";
set layout_sidebox_summary_visibility = "4";
set layout_sidebox_multisearch_visibility = "5";
set layout_sidebox_freetext_2_visibility = "6";
set layout_sidebox_tags_visibility = "hide";the following function overrides should be placed into a theme layer. if you are using one of the system-provided theme layers, you'll need to move those set commands for the colors into your user layer, create a new theme layer, place this code into it, and attach the new theme layer to your style.
function Page::print_custom_head()
{
"""
""";
}
function Page::lay_print_sidebar_freetextbox_2() {
##### Config #####
# Specify your delimiter. One char only -- extra chars get truncated.
var string delimiter = ":";
# Do you want to show the tag use counts? Set to true or false.
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 = "]";
# Specify the title of your tag box!
var string tag_title = "Tags";
##### End Config #####
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) {
# mt:20050623
# Split tags into array on delimiter. Oh god, my kingdom
# for a function. Stolen shamelessly from lj-user rane500.
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) {
# mt:20050623
# $closing_html keeps track of html that is used to close off open
# lists. Its length must be kept >= to that of the current tag.
$closing_html[$pos] = "";
}
if (size $prev_tags <= $pos) {
# mt:20050625
# The current tag has more tiers than the previous tag. To avoid array
# ref errors when comparing the current tier to the previous one (which
# is non-existent, of course) add empty string to $prev_tags.
$prev_tags[$pos] = "";
}
# mt:20050623
# If we're on a tag's last tier, we need to return a link to the tag,
# otherwise plain text is returned.
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""";
}
# mt:20050625
# $prev_tags stuffed with dummy empty string when it has fewer tiers than
# current tag.
if ($prev_tags[$pos] == "") {
# mt:20050623
# The current tag has more tiers than the previous tag, so a new
# list must be opened.
if (($tag_list_pos == 0) and ($pos == 0)) {
# mt:20061216
# The outermost ul is supplied later by print_sidebar_box,
# so omit it from this stage.
$list = $list + """
$tier_code""";
$closing_html[$pos] = "";
}
else {
$list = $list + """
- $tier_code""";
$closing_html[$pos] = "
";
}
}
elseif ($tags[$pos] != $prev_tags[$pos]) {
# mt:20050623
# The current tag's tier is not the same as the previous tag's tier of
# the same level. This means we may need to close some lists.
var int i = size $closing_html;
foreach var string html ($closing_html) {
if ($i > $pos) {
$list = $list + $closing_html[$i];
# mt:20050623: As we append the closing code, pop it off the array.
$closing_html[$i] = "";
}
$i--;
}
if ($closing_html[$pos] == "") {
# mt:20050623
# This is the first tier at this level, so open list.
$list = $list + """
- $tier_code""";
$closing_html[$pos] = "
";
}
else {
# mt:20050623
# There have already been tiers added at this level, so just close the previous
# list item before adding the new tier.
$list = $list + """
$tier_code""";
}
}
else {
# mt:20050623
# The current tag's tier is exactly the same as the previous tag's tier at
# this same level. It has already been included in the list, so do nothing.
}
# mt:20050623: Moving on to next tier in this tag!
$pos++;
}
$prev_tags = $tags;
}
# mt:20050623: Next tag in the list!
$tag_list_pos++;
}
# mt:20050623
# All the tags have been added so close all outstanding lists.
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;
}
if ($list != ""){
$this->lay_print_sidebox_top($tag_title);
print """""";
$this->lay_print_sidebox_bottom();
}
}