summaryrefslogtreecommitdiff
path: root/Xerl/Page/Menu.pm
diff options
context:
space:
mode:
Diffstat (limited to 'Xerl/Page/Menu.pm')
-rw-r--r--Xerl/Page/Menu.pm128
1 files changed, 128 insertions, 0 deletions
diff --git a/Xerl/Page/Menu.pm b/Xerl/Page/Menu.pm
new file mode 100644
index 0000000..b835148
--- /dev/null
+++ b/Xerl/Page/Menu.pm
@@ -0,0 +1,128 @@
+# Xerl (c) 2005-2009, Dipl.-Inform. (FH) Paul C. Buetow
+#
+# E-Mail: xerl@dev.buetow.org WWW: http://xerl.buetow.org
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# * Neither the name of P. B. Labs nor the names of its contributors may
+# be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED Paul C. Buetow ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT Paul C. Buetow BE LIABLE FOR ANY DIRECT,
+# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+package Xerl::Page::Menu;
+
+use strict;
+use warnings;
+
+use Xerl::Page::Configure;
+use Xerl::Tools::FileIO;
+use Xerl::XML::Element;
+
+sub generate($;$) {
+ my Xerl::Page::Menu $self = $_[0];
+ my Xerl::Page::Configure $config = $self->get_config();
+
+ my @site = split /\//, $config->get_site();
+ my @compare = @site;
+ my $site = pop @site;
+
+ my ( $content, $siteadd ) = ( 'content/', '' );
+
+ my Xerl::XML::Element $menuelem =
+ $self->get_menu( $content, $siteadd, shift @compare );
+
+ $self->push_array($menuelem)
+ if $menuelem->first_array()->array_length() > 1;
+
+ for my $s (@site) {
+ $content .= "$s.sub/";
+ $siteadd .= "$s/";
+ $menuelem = $self->get_menu( $content, $siteadd, shift @compare );
+ $self->push_array($menuelem)
+ if $menuelem->first_array()->array_length() > 1;
+ }
+
+ return undef;
+}
+
+sub get_menu($$$$) {
+ my Xerl::Page::Menu $self = $_[0];
+ my Xerl::Page::Configure $config = $self->get_config();
+ my ( $content, $siteadd, $compare ) = ( @_[ 1 ... 2 ], lc $_[3] );
+ my $issubsection = $content =~ m{\.sub/$};
+ my $pattern = qr/\.(?:xml)|(?:sub)$/;
+
+ my Xerl::Tools::FileIO $io = Xerl::Tools::FileIO->new(
+ path => $config->get_hostpath() . $content,
+ basename => 1,
+ );
+
+ Xerl::Main::Global::REDIRECT( $config->get_404() ) unless $io->exists();
+
+ $io->dslurp();
+ my $dir = $io->get_array();
+
+ my ( @prec, @dir );
+ map {
+ if (/^\d+\..+\./) { push @prec, $_ }
+ else { push @dir, $_ }
+ }
+ grep {
+ $_ !~ /^home\.xml$/i
+ && $_ !~ /\.feed\.xml$/i
+ && $_ !~ /\.hide\.xml$/i
+ } @$dir;
+
+ my Xerl::XML::Element $root = Xerl::XML::Element->new();
+ my Xerl::XML::Element $menu = Xerl::XML::Element->new();
+
+ $menu->set_name('menu');
+
+ for ( $issubsection ? ( @dir, @prec ) : ( 'home.xml', @dir, @prec ) ) {
+ my ($site) = /(.*)$pattern/o;
+
+ $site =~ s#\.$#/home#o;
+ $site =~ s/^\d+\.//;
+
+ my $linkname = $site;
+ $linkname =~ s/(?:\d+\.)?(.)/\U$1/o;
+ $compare .= '/' if $linkname =~ s#(.*/)[^/]+$#$1#;
+
+ my Xerl::XML::Element $item = Xerl::XML::Element->new(
+ params => { link => "?site=$siteadd$site" },
+ text => $linkname
+ );
+
+ $compare =~ s/^(\d+\.)//;
+ $item->set_name(
+ lc $linkname eq lc $compare ? 'activemenuitem' : 'menuitem' );
+
+ $item->set_prev($menu);
+ $menu->push_array($item);
+ }
+
+ $root->push_array($menu);
+ $menu->set_prev($root);
+
+ return $root;
+}
+
+1;