in response to
simons_flower's
s2smoothsailing post.
this code is a quick'n'dirty conversion of
murklinstest's
s2flexisquares bi-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.
# Making the delimiter an empty string will result in an un-tiered list,
# which may be what you prefer, but this code is serious overkill for
# that purpose.
var string delimiter = ":";
# Specify the title of your tag box!
var string tag_title = "Tags";
##### End Config #####
var Page p = get_page();
var string list = "";
# mt:20050627
# Replaced erroneous return code with if statement (otherwise
# entire sidebar not printed at all if no visible tags!).
if (size $p->visible_tag_list() > 0)
{
# mt:20050624
# Can't use delimiter longer than one char, so truncate if necessary.
if ($delimiter->length() > 1)
{
$delimiter = $delimiter->substr(0, 1);
}
var bool list_started = false;
var string list_item = "";
var string[] prev_tags = ["", ""];
# mt:20050624: Start the list.
$list = """
""";
foreach var TagDetail t ($p->visible_tag_list())
{
var string[] tags;
if ($t.name)
{
# mt:20050624
# Split tags into a 1- or 2-element array on delimiter. Oh god, my
# kingdom for a function. Adapted from lj-user rane500's explode
# function to only care about first instance of the delimiter.
var int array_counter = 0;
var string buffer = "";
var bool found_delimiter = false;
foreach var string char ($t.name)
{
if (($found_delimiter == false) and ($char == $delimiter))
{
$found_delimiter = true;
$tags[$array_counter] = $buffer;
$array_counter = $array_counter + 1;
$buffer = "";
}
else
{
$buffer = $buffer + $char;
}
}
$tags[$array_counter] = $buffer;
# mt:20050624: Now examine the tags array to determine how to display the tag.
if (size $tags == 1)
{
# mt:20050624: This tag has no subtag.
if ($list_started)
{
# mt:20050624: Previous tag had a subtag, so must close its outstanding list.
$list = $list + """
""";
$list_started = false;
}
if ($prev_tags[0] != "")
{
# mt:20050624: This is not the very first tag in the list, so close off previous tag.
$list = $list + """""";
}
# mt:20050624: Now add the new tag.
$list = $list + """
$tags[0]""";
}
else
{
# mt:20050624: This tag has a subtag.
$list_item = """ $tags[1]""";
if (($tags[0] == $prev_tags[0]) and ($list_started))
{
# mt:20050624
# This tag fits under the previous tag's tier, and it is not the first item in that tier.
$list = $list + $list_item;
}
elseif (($tags[0] == $prev_tags[0]) and ($list_started == false))
{
# mt:20050624
# This tag fits under the previous tag's tier, and it is the very first item in that tier.
$list = $list + """
""" + $list_item;
$list_started = true;
}
elseif (($tags[0] != $prev_tags[0]) and ($list_started))
{
# mt:20050624: This tag initializes a new tier and must also close off the previous tag's list.
# $list_started retains its true state.
$list = $list + """
$tags[0]""" + $list_item;
}
elseif (($tags[0] != $prev_tags[0]) and ($list_started == false))
{
# mt:20050624: This tag initializes a new tier but does not have to close off a list.
if ($prev_tags[0] != "")
{
# mt:20050624: This is not the very first tag in the list, so close off previous tag.
$list = $list + """
""";
}
# mt:20050624: Now add the new tag.
$list = $list + """
$tags[0]""" + $list_item;
$list_started = true;
}
}
$prev_tags = $tags;
}
# mt:20050623: Next tag in the list!
}
# mt:20050624: Close any outstanding lists.
if ($list_started)
{
$list = $list + """
""";
}
$list = $list + """""";
# mt:20050625: Enclose the entire list in an li tag as required by the layout.
# $list = """
""" + $list + """""";
# mt:20050623: Add styling to box title.
# $tag_title = """
$tag_title""";
}
##### Specify Box Order #####
# mt:20050627
# Okay, now that's done, just print out all your sidebar boxes in the order you
# want, including a call for this one -- print_sidebar_box($tag_title, $list) --
# nested within an if statement to prevent tags box from printing in the event
# of no visible tags.
# print_userpic();
# print_sidebar_blurb();
# if ($list != ""){print_sidebar_box($tag_title, $list);}
# print_sidebar_linklist();
# print_sidebar_calendar();
##### End Box Order #####
if ($list != ""){
$this->lay_print_sidebox_top($tag_title);
print $list;
$this->lay_print_sidebox_bottom();
}
}