[user/theme] - [smoothsailing] - [bi-level tags in sidebar]

Nov 21, 2005 11:41

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();
    }
    }

    function lay_print_sidebar_freetextbox_2, class page, layout smoothsailing, function print_custom_head

    Previous post Next post
    Up