in response to
sreya's
s2lickable post.
function Page::lay_print_custom_paraphernalia() {
var string id = "";
var string header = "";
var string content = "";
# tagslist
##### 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 $this->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 = """<ul class="tagList">""";
foreach var TagDetail t ($this->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 + """</ul>""";
$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 + """</li>""";
}
# mt:20050624: Now add the new tag.
$list = $list + """<li class="tagItem"><a href="$t.url">$tags[0]</a>""";
} else {
# mt:20050624: This tag has a subtag.
$list_item = """<li class="tagItem"><a href="$t.url">$tags[1]</a></li>""";
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 + """<ul class="tagList">""" + $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 + """</ul></li><li class="tagItem">$tags[0]<ul class="tagList">""" + $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 + """</li>""";
}
# mt:20050624: Now add the new tag.
$list = $list + """<li class="tagItem">$tags[0]<ul class="tagList">""" + $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 + """</ul>""";
}
$list = $list + """</li></ul>""";
$list = """<div class="tagBox">""" + $list + """</div>""";
}
$header = $tag_title;
$id = "tagslist";
$content = $list;
paraphernalia_box_open ($id, $header);
print $content;
paraphernalia_box_close($id, $header);
}
function Page::print_custom_head() {
"""
<style type="text/css">
/* List Alignment */
/* Styles to ensure that the tag list is correctly aligned beneath the sidebox title */
li.tagBox {
padding-left: 0;
margin-left: 0;
list-style: none;
}
ul.tagList {
padding-left: 0;
margin-left: 0;
list-style: none;
}
li.tagItem {
padding-left: 15px;
list-style: none;
}
/* Vertical Scroll */
/* Need to shrink the list width to prevent horizontal scrollbar in Firefox. */
/* Note this won't prevent it if your tags are super long, it will only */
/* prevent it from displaying unnecessarily. For the pleasure of IE users */
/* you can also colour any resulting scrollbars as you desire. */
ul.tagList {
width: 90%;
}
.tagBox {
height: 200px;
overflow: auto;
scrollbar-arrow-color: #dae3b2;
scrollbar-base-color: #ffffcc;
scrollbar-face-color: #ffffcc;
scrollbar-highlight-color: #dae3b2;
scrollbar-darkshadow-color: #dae3b2;
scrollbar-shadow-color: #dae3b2;
}
</style>
""";
}