[Home]WikiExplorer

UseModWiki | RecentChanges | Preferences

This is following on from an idea presented on MeatBall:WikiBrowser, for using DHTML to display a link tree from your current starting point. This involves a hack to the UseMod source to provide a DoTree? function, invoked using action=tree&id=PageName.

This is now using more standard JavaScript, and no longer depends on anyone elses code. The following is a patch for UseMod v0.92. Note: I have tested this with Mozilla and Internet Explorer. It does not work with Netscape v4 (as far as I can tell).

-- KevinTaylor

How about some screenshots? Really! If ever a picture was worth a thousand words...


31d30
< 
938c937
<   my ($id, $title, $oldId, $extraHeader) = @_;
---
>   my ($id, $title, $oldId) = @_;
949c948
<   $result .= &GetHtmlHeader("$SiteName: $title", $extraHeader);
---
>   $result .= &GetHtmlHeader("$SiteName: $title");
996c995
<   my ($title, $headExtra) = @_;
---
>   my ($title) = @_;
1016,1019d1014
<   if (defined ($headExtra))
<   {
<     $html .= $headExtra;
<   }
1109d1103
<   $bartext .= " | " . &GetTreeLink($id, T('Tree'));
2465,2466d2458
<     } elsif ($action eq "tree") {
<       &DoTree($id) if &ValidIdOrDie ($id);
4047,4168c4039
< 
< sub GetTreeLink {
<    my ($id, $name) = @_;
< 
<    return &ScriptLink("action=tree&id=$id", $name);
< }
< 
< sub DoTree {
<    my ($id) = @_;
< 
<    my @links = GetPageLinks ($id, 1, 0, 0);
<    @links = sort (@links);
< 
<    my $script =<<'SCRIPT';
< <script language="JavaScript1.2">
< 
< function change(id){
<    if (document.all)
<    {
<       // Internet Explorer - I do something different
<       // here, as using getElementById (Which IE supports)
<       // does funny things for nested items
<       var srcIdx = event.srcElement.sourceIndex
<       var el = document.all[srcIdx+1]
<       if (el.id == id)
<       {
<          if (el.style.display=="none") {
<             el.style.display=''
<          }
<          else {
<             el.style.display="none"
<          }
<       }
<    }
<    else if(document.getElementById)
<    {
<       // The W3C Standard DOM way
<       var el = document.getElementById(id)
<       if (el.style.display=="none") {
<          el.style.display=''
<       }
<       else {
<          el.style.display="none"
<       }
<    }
<    else
<    {
<       // Don't do Netscape 4 ...
<       return
<    }
< }
< 
< //-->
< </script>
< SCRIPT
< 
<    print &GetHeader($id, &QuoteHtml(T('Tree View')), '', $script);
<    print "<p>Link Tree View for $id\n<ul>\n";
< 
<    # Output the top-level page
<    print "   <li>".&GetPageLink($id)."</li>\n";
< 
<    # Then the next set of entries
<    my $headCount = 0;
<    my %lseen = ();
<    $lseen{$id}++;
<    foreach my $l (@links)
<    {
<       next if (defined ($lseen{$l}));
<       $lseen{$l}++;
< 
<       print "   <li onClick=\"javascript:change(\'listHead".$headCount."\')\"><b>$l</b></li>\n";
<       print "   <ul id=\"listHead".$headCount."\" style=\"display:none\">\n";
<       $headCount++;
<       print "      <li>".&GetPageLink($l)."</li>\n";
<       my @sublinks = GetPageLinks ($l, 1, 0, 0);
<       @sublinks = sort (@sublinks);
<       my %slseen = ();
<       foreach my $sl (@sublinks)
<       {
<          next if (defined ($slseen{$sl}));
<          $slseen{$sl}++;
< 
<          if (defined ($lseen{$sl}))
<          {
<             # Output, but with no link
<             print "      <li><i>$sl</i></li>\n";
<          }
<          else
<          {
<             print "      <li onClick=\"javascript:change(\'listHead".$headCount."\')\"><b>$sl</b></li>\n";
<             print "      <ul id=\"listHead".$headCount."\" style=\"display:none\">\n";
<             $headCount++;
<             print "         <li>". &GetPageLink($sl) . "</li>\n";
<          
<             my @subsublinks = GetPageLinks ($sl, 1, 0, 0);
<             @subsublinks = sort (@subsublinks);
<             my %sslseen = ();
<             foreach my $ssl (@subsublinks)
<             {
<                next if (defined ($sslseen{$ssl}));
<                $sslseen{$ssl}++;
<          
<                if ((defined ($lseen{$ssl})) || (defined ($slseen{$ssl})))
<                {
<                   # Output, but with no link
<                   print "         <li><i>$ssl</i></li>\n";
<                }
<                else
<                {
<                   print "         <li>". &GetPageLink($ssl) . "</li>\n";
<                }
<             }
<             print "      </ul>\n";
<          }
<       }
<       print "   </ul>\n";
<    }
<   
<    print "</ul>\n<hr>\n";
<    print &GetFooterText ($id, '');
< }
---
> #END_OF_OTHER_CODE



This looks good, any chance of the source being displayed in context to make it easy to integrate without error?

This works well in 1.0 too. Here's some context:

Changed lines in sub GetHeader:

   my ($id, $title, $oldId, $extraHeader) = @_;

   $result .= &GetHtmlHeader("$SiteName: $title", $extraHeader);

Change first line in sub GetHtmlHeader:

   my ($title, $headExtra) = @_;

(and add this before the head tag is closed)

   if (defined ($headExtra))
   {
     $html .= $headExtra;
   }

Add to sub GetGotoBar:

   $bartext .= " | " . &GetTreeLink($id, T('Tree'));
Add to sub DoOtherRequest:
     } elsif ($action eq "tree") {
       &DoTree($id) if &ValidIdOrDie ($id);

Drop the subs in before #END_OF_OTHER_CODE and load action=tree&id=PageName? and behold a most excellent patch.


UseModWiki | RecentChanges | Preferences
Edit text of this page | View other revisions | Search MetaWiki
Last edited March 29, 2005 4:58 pm by MarkusLude (diff)
Search: