[LON-CAPA-cvs] cvs: loncom /interface lonhtmlcommon.pm

droeschl droeschl@source.lon-capa.org
Wed, 18 Feb 2009 19:28:45 -0000


droeschl		Wed Feb 18 19:28:45 2009 EDT

  Modified files:              
    /loncom/interface	lonhtmlcommon.pm 
  Log:
  Refactoring of generate_menu. 
  Some css styles adjusted, such that the submenu look is equal to the mainmenu.
  Empty categories won't be shown anymore. 
  
  
Index: loncom/interface/lonhtmlcommon.pm
diff -u loncom/interface/lonhtmlcommon.pm:1.200 loncom/interface/lonhtmlcommon.pm:1.201
--- loncom/interface/lonhtmlcommon.pm:1.200	Thu Jan 22 14:44:40 2009
+++ loncom/interface/lonhtmlcommon.pm	Wed Feb 18 19:28:45 2009
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common html routines
 #
-# $Id: lonhtmlcommon.pm,v 1.200 2009/01/22 14:44:40 bisitz Exp $
+# $Id: lonhtmlcommon.pm,v 1.201 2009/02/18 19:28:45 droeschl Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -2032,10 +2032,11 @@
 # An array of following structure:
 #   ({	categorytitle => 'Categorytitle',
 #	items => [
-#		    {	linktext    =>	'Text to be displayed',
-#			url	    =>	'URL the link is pointing to, i.e. /adm/site?action=dosomething',
+#		    {	
+#           linktext    =>	'Text to be displayed',
+#			url	        =>	'URL the link is pointing to, i.e. /adm/site?action=dosomething',
 #			permission  =>	'Contains permissions as returned from lonnet::allowed(),
-#					 must evaluate to true in order to activate the link',
+#					         must evaluate to true in order to activate the link',
 #			icon        =>  'icon filename',
 #			alttext	    =>	'alt text for the icon',
 #			help	    =>	'Name of the corresponding helpfile',
@@ -2054,42 +2055,74 @@
 # subject to change during this project.
 # Don't rely on its current functionality as it might be 
 # changed or removed.
-# TODO:
-# check for empty values
 # --------------------------
-
 sub generate_menu {
     my @menu = @_;
-    my $menu_html = qq|<div class="LC_columnSection">|;
 
-    foreach my $category (@menu) { #FIXME: insert appropriate classnames for styles when they're finished.
-	$menu_html .='<div class="LC_ContentBoxSpecial">
-			<h3 class="LC_hcell">'.mt($category->{'categorytitle'}).'</h3>
-			<ul class="LC_ListStyleNormal">';
-	foreach my $item ( @{ $category->{items} } ) {
-	    next unless $item->{'permission'};
-	    $menu_html .= qq|<li class="LC_menubuttons_inline_text"><a href="$item->{'url'}" title="|.mt($item->{'linktitle'}).'">';
-            if($item->{'icon'}){
-                $menu_html .= qq|<img class ="LC_noBorder LC_middle" src="/res/adm/pages/$item->{'icon'}" alt="|;
-		if($item->{'alttext'}){
-		    $menu_html .= $item->{'alttext'}.'"/></a>';
-		} else { #use linktext as alt text for the icon
-		    $menu_html .= qq|$item->{'linktext'}"/></a>|;
-                } 
-            }
-	    $menu_html .= qq|<a href="$item->{'url'}" title="|.mt($item->{'linktitle'}).'">';
-            $menu_html .= mt($item->{'linktext'}).'</a>';
-	    if (exists($item->{'help'})) {
-		$menu_html .= Apache::loncommon::help_open_topic($item->{'help'});
-	    }
-	    $menu_html .= '</li>';
-	}
-	$menu_html .= '</ul></div>';
+    # usage: $wrap->(element, content, {attribute => value,...});
+    # output: content enclosed in html conform tags
+    my $wrap = sub {
+        return
+            qq|<$_[0]|
+          . join( '', map { qq| $_="${$_[2]}{$_}"| } keys %{ $_[2] } )
+          . ($_[1] ? qq|>$_[1]</$_[0]>| : qq|/>|). "\n";
+    };
+    
+    # subs for specific html elements
+    my $h3  = sub { return $wrap->( "h3",  @_ ) };
+    my $div = sub { return $wrap->( "div", @_ ) };
+    my $ul  = sub { return $wrap->( "ul",  @_ ) };
+    my $li  = sub { return $wrap->( "li",  @_ ) };
+    my $a   = sub { return $wrap->( "a",   @_ ) };
+    my $img = sub { return $wrap->( "img", @_ ) };
+    
+    my @categories; # each element represents the entire markup for a category
+   
+    foreach my $category (@menu) {
+        my @links;  # contains the links for the current $category
+        foreach my $link (@{$$category{items}}) {
+            next unless $$link{permission};
+            
+            # create the markup for the current $link and push it into @links.
+            # each entry consists of an image and a text optionally followed 
+            # by a help link.
+            push @links, $li->(
+                        $a->(
+                            $img->("", {
+                                class => "LC_noBorder LC_middle",
+                                src   => "/res/adm/pages/$$link{icon}",
+                                alt   => defined($$link{alttext}) ?
+                                $$link{alttext} : $$link{linktext}
+                            }), {
+                            href  => $$link{url},
+                            title => $$link{linktitle}
+                            }).
+                        $a->($$link{linktext}, {
+                            href  => $$link{url},
+                            title => $$link{linktitle},
+                            class => "LC_menubuttons_link"
+                            }).
+                         (defined($$link{help}) ? 
+                         Apache::loncommon::help_open_topic($$link{help}) : ''),
+                         {class => "LC_menubuttons_inline_text"});
+        }
+
+        # wrap categorytitle in <h3>, concatenate with 
+        # joined and in <ul> tags wrapped @links
+        # and wrap everything in an enclosing <div> and push it into
+        # @categories
+        # such that each element looks like:
+        # <div><h3>title</h3><ul><li>...</li>...</ul></div>
+        # the category won't be added if there aren't any links
+        push @categories, 
+            $div->($h3->($$category{categorytitle}, {class=>"LC_hcell"}).
+            $ul->(join('' ,@links),  {class =>"LC_ListStyleNormal" }),
+            {class=>"LC_ContentBoxSpecial"}) if scalar(@links);
     }
-    $menu_html .= qq|</div>|;
-    return $menu_html;
-}
 
+    # wrap the joined @categories in another <div> (column layout)
+    return $div->(join('', @categories), {class => "LC_columnSection"});
+}
 
 1;