murklinstest (murklinstest) wrote,
murklinstest
murklinstest

[Flexible Squares] Diffs between old and new multilevel tags code

I released a new version of the Flexible Squares Multilevel Tags tutorial, which is quite different from the now obsolete original. Besides the addition of actual instructions, the code itself underwent some changes. They are detailed here in red comments for any interested parties.

Code

# mt:20070126
# Use the tags-specific function instead of print_sidebar to print out the tags

function print_sidebar_tags() {

#####   Config   #####

  # Specify your delimiter.  One char only -- extra chars get truncated.
  var string delimiter = ":";
  
  # mt:20070126
  # Some new configuration options to enable/disable the display of tag counts

  # 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 = "]";

##### 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)) {
            # mt:20070126
            # Add in the rel attribute, to match the layer's default display of the tags list
            $tier_code = """<a rel="tag" href="$t.url">$tier</a>""";
            # mt:20070126
            # Include logic for showing the tag count, if enabled in the Config section
            if ($show_count) {
              $tier_code = $tier_code + """&nbsp;${pre_count}${t.use_count}${post_count}""";
            }
          }
          else {
            $tier_code = """$tier""";
          }
          
          # mt:20070126
          # The list now uses standard Flexible Squares sidebar classes. The outermost container,
          # which used to be an <li> to fit with the layout's sidebar list system, is now a <ul>,
          # to match the layer's current sidebar code. That outermost container's class used to
          # be tagBox, but it now gets the standard sbarlist  and sbarcontent classes, 
          # added when the tags list gets printed via print_sidebar_box. The inner <ul>
          # tags used to be of class tagList, but that is no longer necessary and they go classless.
          # The <li> tags used to be of class tagItem, but they now use the standard sidebar list
          # item class, sbaritem.

          # 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 + """<li class="sbaritem">$tier_code""";                  
              $closing_html[$pos] = "</li>";  
            }
            else {
              $list = $list + """<ul><li class="sbaritem">$tier_code""";                  
              $closing_html[$pos] = "</li></ul>";
            }
          }
          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.
            # mt:20070126
            # Iterate through the list backward, since this makes more logical sense,
            # considering we are popping off closing tags to match earlier opening tags.
            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 + """<ul><li class="sbaritem">$tier_code""";
              $closing_html[$pos] = "</li></ul>";
            }
            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 + """</li><li class="sbaritem">$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;
  }
  
  # mt:20070126
  # No longer enclose the list in an <li>, it needs a <ul> now, which will be 
  # supplied by print_sidebar_box, the function used to print out sidebar boxes.
  
  var string list_title = ($*text_sidebar_tags != "") ? "<li class='sbartitle'>$*text_sidebar_tags</li>" : "";
  print_sidebar_box("""$list_title""", $list, "sidebar_tags");

  # mt:20070126
  # No longer print out all the sidebar boxes in this tags code. That gets done in print_sidebar.
}
Tags: code:tagsbox:multi-level, layout:flexiblesquares
Subscribe

  • Post a new comment

    Error

    default userpic
    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments