package Base::HTML;
use strict;
use warnings FATAL => qw( all );
use base 'Exporter';
our @EXPORT_OK = qw(html story link_list alpha_links);
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use Cwd qw(cwd realpath);
use File::Basename;
use HTML::Entities qw(encode_entities);
use List::Util qw(first);
use Base::Roots;
use Base::Menu qw(get_menu);
use Base::Data qw(data_file get_hash);
use Base::HTML::Element qw(head title links script body div heading paragraph list anchor);
use Util::Convert qw(idify textify);
use Base::Sorts qw(article_sort);
use Base::Nifty qw(line);
my $full_path = realpath($0);
my $root_path = get_root('path');
my $root_link = get_root('link');
my $root_name = get_root('name');
my $root_user = get_root('user');
my $root_mail = get_root('mail');
my %link = (
mail => anchor($root_user, { href => "mailto:$root_mail" }),
name => anchor($root_name, { href => $root_link }),
);
my %other_sites = get_hash(
file => data_file('Base','other_sites.txt'),
headings => [qw(site link)],
);
my %reciprocated_links = get_hash(
file => data_file('Base','reciprocated_links.txt'),
headings => [qw(site link)],
);
my $relative_path = $full_path;
$relative_path =~ s/$root_path\///;
$relative_path =~ s/\.\w+$//;
my @relative_path_split = split(/\//,$relative_path);
my @styles = (get_root('css').'/main.css');
sub get_styles {
my ($style_dir) = @_;
while (@relative_path_split) {
my $var = shift @relative_path_split;
$var =~ s/(\.\w{2,4})$//;
next if $var eq 'working';
if (-f ("$style_dir/$var.css")) {
my $new_style = "$style_dir/$var.css";
$new_style =~ s/$root_path/$root_link/;
push @styles, $new_style;
}
get_styles("$style_dir/$var");
}
return @styles;
}
sub link_list {
my ($tab,$heading,%hash) = @_;
my $heading_id = idify($heading);
my @items;
for my $key (sort {lc $a->{site} cmp lc $b->{site}} values %hash) {
my $link = $key->{link};
my $site = $key->{site};
push @items, anchor($site, { href => "http://$link", target => '_blank' });
}
heading($tab,2,$heading, { id => $heading_id });
paragraph($tab + 1,'Links will open in a new tab.', { class => 'no_indent' });
list($tab + 1,'u',\@items);
}
sub html {
my (%opt) = @_;
my $heading = textify(basename($0)) !~ /index/ ? textify(basename($0)) : 'My '.lc((split(/\//,cwd))[-1]);
my $title = textify(join(' - ',($root_name,map(ucfirst,split(/\//,$relative_path)))));
$title .= textify(" - $opt{heading}") if $opt{heading};
my $page_heading = $opt{heading} ? $opt{heading} : $heading;
my $page_heading_id = idify($page_heading);
$page_heading =~ s/_/ /g;
print "content-type: text/html \n\n";
line(0,q());
line(0,q());
head(0, sub {
links(1, [map {{ rel => 'stylesheet', type => 'text/css', href => $_ }} get_styles($root_path.'/files/css')]);
script(1,{ type => 'text/javascript', src => "$root_link/files/javascript/list.js" });
}, { title => $title });
body(0, sub {
div(1, sub {
heading(2,1,'Site menu', { id => 'Site_menu' });
list(3,'u',get_menu( directory => $root_path, tab => 2, color => 0, full => 0 ), { onclick => 'list_onclick(event)' });
link_list(3,qq($root_user off-site),%other_sites);
link_list(3,qq(Reciprocated links),%reciprocated_links);
}, { class => 'left' });
div(1, sub {
heading(2,1,$page_heading, { id => $page_heading_id });
&{$opt{code}};
paragraph(3,"Contact $link{mail}!", { class => 'address' });
}, { class => 'right' });
});
line(0,q());
}
1;