kunzite (kunzite1) wrote in s2layers,
kunzite
kunzite1
s2layers

  • Music:

[theme] - [lickable] - [multi-level tags]

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>
  """;
}
Tags: class page, function lay_print_custom_paraphernalia, function print_custom_head, layout lickable
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 3 comments