| HTML-Widgets-NavMenu documentation | Contained in the HTML-Widgets-NavMenu distribution. |
HTML::Widgets::NavMenu::Iterator::NavMenu - navmenu iterator.
For internal use only.
Generate a UL tag of depth $depth.
Calculates the highlighted text for the node $node. Normally surrounds it
with <b> ... </b> tags.
Gets the tag for the link - an item in the menu.
Retrieves the current role.
| HTML-Widgets-NavMenu documentation | Contained in the HTML-Widgets-NavMenu distribution. |
package HTML::Widgets::NavMenu::Iterator::NavMenu; use strict; use warnings; use base qw(HTML::Widgets::NavMenu::Iterator::Html); use HTML::Widgets::NavMenu::EscapeHtml; __PACKAGE__->mk_acc_ref([qw( _ul_classes )]);
sub _init { my $self = shift; my $args = shift; $self->SUPER::_init($args); # Make a fresh copy just to be on the safe side. $self->_ul_classes([ @{$args->{'ul_classes'}} ]); return 0; }
# Depth is 1 for the uppermost depth. sub gen_ul_tag { my ($self, $args) = @_; my $depth = $args->{'depth'}; my $class = $self->_get_ul_class({'depth' => $depth}); return "<ul" . (defined($class) ? (" class=\"" . escape_html($class) . "\"") : "" ) . ">"; } sub _get_ul_class { my ($self, $args) = @_; my $depth = $args->{'depth'}; return $self->_ul_classes->[$depth-1]; }
sub get_currently_active_text { my $self = shift; my $node = shift; return "<b>" . $node->text() . "</b>"; }
sub get_link_tag { my $self = shift; my $node = $self->top->_node(); if ($node->CurrentlyActive()) { return $self->get_currently_active_text($node); } else { return $self->get_a_tag(); } } sub _start_root { my $self = shift; $self->_add_tags( $self->gen_ul_tag( { 'depth' => $self->stack->len() } ) ); } sub _start_sep { my $self = shift; $self->_add_tags("</ul>"); } sub _start_handle_role { my $self = shift; return $self->_start_handle_non_role(); }
sub get_open_sub_menu_tags { my $self = shift; return ("<br />", $self->gen_ul_tag( {'depth' => $self->stack->len()} ) ); } sub _start_handle_non_role { my $self = shift; my $top_item = $self->top; my @tags_to_add = ("<li>", $self->get_link_tag()); if ($top_item->_num_subs_to_go() && $self->_is_expanded()) { push @tags_to_add, ($self->get_open_sub_menu_tags()); } $self->_add_tags(@tags_to_add); } sub _start_regular { my $self = shift; my $top_item = $self->top; my $node = $self->top->_node(); if ($self->_is_hidden()) { # Do nothing } else { if ($self->_is_role_specified()) { $self->_start_handle_role(); } else { $self->_start_handle_non_role(); } } } sub _end_sep { my $self = shift; $self->_add_tags( $self->gen_ul_tag( { 'depth' => $self->stack->len()-1 } ) ); } sub _end_handle_role { my $self = shift; return $self->_end_handle_non_role(); } sub _end_handle_non_role { my $self = shift; return $self->SUPER::_end_regular(); } sub _end_regular { my $self = shift; if ($self->_is_hidden()) { # Do nothing } elsif ($self->_is_role_specified()) { $self->_end_handle_role(); } else { $self->_end_handle_non_role(); } } sub _is_hidden { my $self = shift; return $self->top->_node()->hide(); } sub _is_expanded { my $self = shift; my $node = $self->top->_node(); return ($node->expanded() || $self->top->_accum_state->{'show_always'}); }
sub get_role { my $self = shift; return $self->top->_node->role(); } sub _is_role_specified { my $self = shift; return defined($self->get_role()); } 1;