Change to more minimalistic website design + few HTML modernizations
I didn't touch the actual man page pages yet, but they seem to have mostly survived my CSS changes. There's a LOT of general UI improvements to be done, while this commit is really just a different style of paint.
This commit is contained in:
parent
b531f71ab0
commit
3db1283a16
5 changed files with 152 additions and 204 deletions
217
www/index.pl
217
www/index.pl
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
use v5.26;
|
||||
use warnings;
|
||||
use TUWF ':html_', ':xml';
|
||||
use TUWF ':html5_', ':xml';
|
||||
use POSIX 'ceil';
|
||||
use SQL::Interp 'sql', 'sql_interp';
|
||||
use Time::Local 'timegm';
|
||||
|
|
@ -196,26 +196,25 @@ sub framework_ {
|
|||
|
||||
html_ sub {
|
||||
head_ sub {
|
||||
link_ rel => 'stylesheet', type => 'text/css', href => '/man.css?4';
|
||||
link_ rel => 'stylesheet', type => 'text/css', href => '/man.css?5';
|
||||
title_ $o{title}.' - manned.org';
|
||||
};
|
||||
body_ sub {
|
||||
div_ id => 'header', sub {
|
||||
a_ href => '/', 'manned.org';
|
||||
header_ sub {
|
||||
a_ href => '/', 'Manned.org';
|
||||
form_ action => '/browse/search', method => 'get', sub {
|
||||
input_ type => 'text', name => 'q', id => 'q', tabindex => 1;
|
||||
input_ type => 'submit', value => ' ';
|
||||
input_ type => 'submit', value => 'Search';
|
||||
}
|
||||
};
|
||||
div_ id => 'body', sub {
|
||||
$content->();
|
||||
br_ style => 'clear: both';
|
||||
};
|
||||
div_ id => 'footer', sub {
|
||||
lit_ 'All manual pages are copyrighted by their respective authors.
|
||||
| <a href="/info/about">About manned.org</a>
|
||||
| <a href="mailto:contact@manned.org">Contact</a>
|
||||
| <a href="https://code.blicky.net/yorhel/manned">Source</a>';
|
||||
main_ class => $o{mainclass}, $content;
|
||||
footer_ sub {
|
||||
span_ sub {
|
||||
a_ href => '/info/about', 'about'; txt_ ' | ';
|
||||
a_ href => 'mailto:contact@manned.org', 'contact'; txt_ ' | ';
|
||||
a_ href => 'https://code.blicky.net/yorhel/manned', 'source';
|
||||
};
|
||||
span_ 'all manual pages are copyrighted by their respective authors.';
|
||||
};
|
||||
script_ type => 'text/javascript', src => '/man.js', '';
|
||||
}
|
||||
|
|
@ -253,7 +252,7 @@ sub paginate_ {
|
|||
};
|
||||
|
||||
my $lp = ceil($count/$perpage);
|
||||
p_ class => 'paginate', sub {
|
||||
nav_ class => 'paginate', sub {
|
||||
l_ 1 if $p > 1+4;
|
||||
b_ '...' if $p > 1+5;
|
||||
l_ $_ for (($p > 4 ? $p-4 : 1)..($p+4 > $lp ? $lp : $p+4));
|
||||
|
|
@ -278,47 +277,48 @@ TUWF::get '/' => sub {
|
|||
|
||||
sub num { local $_=shift; 1 while(s/(\d)(\d{3})($|,)/$1,$2/); $_ };
|
||||
|
||||
framework_ title => 'Man Pages Archive', sub {
|
||||
h1_ 'Man Pages Archive';
|
||||
p_ class => 'txt', sub {
|
||||
lit sprintf <<' _', map num($stats->{$_}), qw|hashes mans files packages|;
|
||||
Indexing <b>%s</b> versions of <b>%s</b> manual pages found in <b>%s</b>
|
||||
files of <b>%s</b> packages.
|
||||
<br /><br />
|
||||
Manned.org aims to index all manual pages from a variety of systems, both
|
||||
old and new, and provides a convenient interface for looking up and viewing
|
||||
the various versions of each man page.
|
||||
<a href="/info/about">About manned.org »</a>
|
||||
_
|
||||
};
|
||||
framework_ title => 'Man Pages Archive', mainclass => 'thin', sub {
|
||||
h1_ 'Welcome to Manned.org';
|
||||
h2_ 'The archive for man pages';
|
||||
lit sprintf <<' _', map num($stats->{$_}), qw|hashes mans files packages|;
|
||||
<p>
|
||||
Indexing <b>%s</b> versions of <b>%s</b> manual pages found in
|
||||
<b>%s</b> files of <b>%s</b> packages.
|
||||
</p><p>
|
||||
Manned.org aims to index all manual pages from a variety of systems, both
|
||||
old and new, and provides a convenient interface for looking up and viewing
|
||||
the various versions of each man page.
|
||||
<a href="/info/about">More information »</a>
|
||||
</p>
|
||||
_
|
||||
|
||||
h2_ 'Browse the manuals';
|
||||
ul_ id => 'systems', sub {
|
||||
h2_ 'Indexed systems';
|
||||
div_ class => 'systems', sub {
|
||||
my %sys;
|
||||
push $sys{$_->{name}}->@*, $_ for(systems->@*);
|
||||
li_ sub {
|
||||
push $sys{$_->{name}}->@*, $_ for systems->@*;
|
||||
div_ sub {
|
||||
my $sys = $sys{$_};
|
||||
my $img = $sys->[0]{short} =~ s/^(.+)-.+$/$1/r;
|
||||
if(@$sys == 1) {
|
||||
a_ href => "/pkg/$sys->[0]{short}", sub {
|
||||
span_ style => "background-image: url('images/$img.png')", '';
|
||||
img_ src => "images/$img.png";
|
||||
b_ $sys->[0]{name};
|
||||
};
|
||||
return;
|
||||
}
|
||||
span_ style => "background-image: url('images/$img.png')", '';
|
||||
b_ $sys->[0]{name};
|
||||
my $i = 0;
|
||||
for(reverse @$sys) {
|
||||
a_ href => "/pkg/$_->{short}", ++$i > 3 ? (class => 'hidden') : (), $_->{release};
|
||||
lit_ ' ';
|
||||
}
|
||||
a_ href => '#', class => 'more', 'more...' if $i > 3;
|
||||
img_ src => "images/$img.png";
|
||||
div_ sub {
|
||||
b_ $sys->[0]{name};
|
||||
for(reverse @$sys) {
|
||||
a_ href => "/pkg/$_->{short}", $_->{release};
|
||||
lit_ ' ';
|
||||
}
|
||||
};
|
||||
} for sort keys %sys;
|
||||
};
|
||||
|
||||
h2_ 'Other sites';
|
||||
ul_ id => 'external', sub {
|
||||
h2_ 'Other relevant sites';
|
||||
ul_ sub {
|
||||
li_ sub { a_ href => 'http://man7.org/linux/man-pages/index.html', 'man7.org'; txt_ ' - Linux man pages from several upstream projects.' };
|
||||
li_ sub { a_ href => 'https://manpag.es/', 'ManPag.es'; txt_ ' - Man pages from several Linux distributions.' };
|
||||
li_ sub { a_ href => 'https://www.mankier.com/', 'ManKier'; txt_ ' - Fedora Rawhide + some manually imported man pages; Nicely formatted and with some unique features.' };
|
||||
|
|
@ -336,16 +336,15 @@ TUWF::get '/' => sub {
|
|||
li_ sub { a_ href => 'https://manpages.ubuntu.com/', 'Ubuntu Manuals' };
|
||||
li_ sub { a_ href => 'https://man.voidlinux.org/', 'Void Linux manpages' };
|
||||
};
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
TUWF::get '/info/about' => sub {
|
||||
framework_ title => 'About', sub {
|
||||
framework_ title => 'About', mainclass => 'thin', sub {
|
||||
h1_ 'About Manned.org';
|
||||
div_ id => 'about', sub {
|
||||
lit <<' _';
|
||||
<h2>Goal</h2>
|
||||
lit <<' _';
|
||||
<h2 id="goal">Goal</h2>
|
||||
<p>
|
||||
The state of online indices of manual pages used to be a sad one. Existing
|
||||
sites used to only offer you a single version of a man page: From one
|
||||
|
|
@ -355,7 +354,7 @@ TUWF::get '/info/about' => sub {
|
|||
harder to find a manual for a specific system. Additionally, some sites
|
||||
rendered the manuals in an unreadable way, didn't correctly handle special
|
||||
formatting - like tables - or didn't correctly display non-ASCII characters.
|
||||
<br /><br />
|
||||
</p><p>
|
||||
Nowadays there are many good alternatives, but Manned.org was one of the
|
||||
sites created in order to improve that situation. This site aims to index
|
||||
the manual pages from a variaty of systems, both old and new, and allows you
|
||||
|
|
@ -363,14 +362,14 @@ TUWF::get '/info/about' => sub {
|
|||
system behaves. The manuals are stored in the database as UTF-8, and are
|
||||
passed through <a href="http://www.gnu.org/software/groff/">groff</a> to
|
||||
render them in (mostly) the same way as they are displayed in your terminal.
|
||||
<br /><br />
|
||||
</p><p>
|
||||
This website is <a href="https://code.blicky.net/yorhel/manned">open
|
||||
source</a> (MIT licensed) and written in a combination of Perl and Rust. The
|
||||
entire PostgreSQL database is available for download (see "Database
|
||||
download" below).
|
||||
source</a> (MIT licensed) and written in a combination of Perl and Rust.
|
||||
The entire PostgreSQL database is available
|
||||
<a href="#database-download">for download</a>.
|
||||
</p>
|
||||
|
||||
<h2>URL format</h2>
|
||||
<h2 id="url-format">URL format</h2>
|
||||
<p>You can link to specific packages and man pages with several URL formats.
|
||||
These URLs will keep working in the future, so you should not have to worry
|
||||
about eventual dead links.</p>
|
||||
|
|
@ -419,7 +418,7 @@ TUWF::get '/info/about' => sub {
|
|||
pages; Linking to a package that doesn't have any will result in a 404
|
||||
page.</p>
|
||||
|
||||
<h2>The indexing process</h2>
|
||||
<h2 id="indexing">The indexing process</h2>
|
||||
<p>
|
||||
All man pages are fetched right from the (binary) packages available on the
|
||||
public repositories of Linux distributions. In particular:<br />
|
||||
|
|
@ -491,7 +490,7 @@ TUWF::get '/info/about' => sub {
|
|||
The repositories are scanned for new packages on a daily basis.
|
||||
</p>
|
||||
|
||||
<h2>Database download</h2>
|
||||
<h2 id="database-download">Database download</h2>
|
||||
<p>
|
||||
This site is backed by a PostgreSQL database containing all the man pages.
|
||||
Weekly dumps of the full database are available for download at
|
||||
|
|
@ -508,7 +507,7 @@ TUWF::get '/info/about' => sub {
|
|||
major version bumps may occur.
|
||||
</p>
|
||||
|
||||
<h2>Other systems</h2>
|
||||
<h2 id="other-systems">Other systems</h2>
|
||||
<p>
|
||||
Suggestions for new (or old) systems to index are welcome.
|
||||
<br /><br />
|
||||
|
|
@ -524,7 +523,7 @@ TUWF::get '/info/about' => sub {
|
|||
here. :-(
|
||||
</p>
|
||||
|
||||
<h2>Future plans</h2>
|
||||
<h2 id="future-plans">Future plans</h2>
|
||||
<p>
|
||||
This site isn't nearly as awesome yet as it could be. Here's some ideas that
|
||||
would be nice to have in the future:
|
||||
|
|
@ -538,7 +537,7 @@ TUWF::get '/info/about' => sub {
|
|||
</ul>
|
||||
</p>
|
||||
|
||||
<h2>Copyright</h2>
|
||||
<h2 id="copyright">Copyright</h2>
|
||||
<p>
|
||||
All manual pages are copyrighted by their respective authors. The manuals
|
||||
have been fetched from publically available repositories of free and
|
||||
|
|
@ -549,7 +548,7 @@ TUWF::get '/info/about' => sub {
|
|||
know and I will have it removed as soon as possible.
|
||||
</p>
|
||||
_
|
||||
} }
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -576,20 +575,19 @@ TUWF::get '/browse/search' => sub {
|
|||
my $man = search_man $q, 150;
|
||||
return tuwf->resRedirect("/$man->[0]{name}.$man->[0]{section}", 'temp') if @$man == 1;
|
||||
|
||||
framework_ title => 'Search results for '.$q, sub {
|
||||
framework_ title => 'Search results for '.$q, mainclass => 'searchres', sub {
|
||||
h1_ 'Search results for '.$q;
|
||||
# Package search would also be useful.
|
||||
p_ 'Note: This is just a simple case-insensitive prefix match on the man names. In the future we\'ll have more powerful search functionality. Hopefully.';
|
||||
if(@$man) {
|
||||
ul_ id => 'searchres', sub {
|
||||
ul_ sub {
|
||||
li_ sub {
|
||||
a_ href => "/$_->{name}.$_->{section}", $_->{name};
|
||||
i_ " $_->{section}";
|
||||
small_ " $_->{section}";
|
||||
} for @$man;
|
||||
}
|
||||
} else {
|
||||
br_; br_;
|
||||
b_ 'No results :-(';
|
||||
p_ 'No results :-(';
|
||||
}
|
||||
};
|
||||
};
|
||||
|
|
@ -785,31 +783,32 @@ TUWF::get qr{/pkg/([^/]+)} => sub {
|
|||
$f->{c} ne 'all' ? ('AND LOWER(SUBSTR(name, 1, 1)) =', \$f->{c}) : ();
|
||||
my $count = tuwf->dbVali('SELECT count(*) FROM', $packages_with_man, 'p WHERE', $where);
|
||||
my $pkg = tuwf->dbPagei({ results => 200, page => $f->{p} },
|
||||
'SELECT id, system, name, category FROM', $packages_with_man, 'p WHERE', $where, 'ORDER BY name'
|
||||
'SELECT id, system, name, category FROM', $packages_with_man, 'p WHERE', $where, 'ORDER BY name, category'
|
||||
);
|
||||
|
||||
my $title = "Packages for $sys->{name}".($sys->{release}?" $sys->{release}":"");
|
||||
framework_ title => $title, sub {
|
||||
div_ id => 'pkglist', sub {
|
||||
h1_ $title;
|
||||
|
||||
p_ class => 'charselect', sub {
|
||||
my $title = $sys->{name}.($sys->{release}?" $sys->{release}":"");
|
||||
framework_ title => $title, mainclass => 'pkglist', sub {
|
||||
div_ sub {
|
||||
div_ sub {
|
||||
h1_ $title;
|
||||
};
|
||||
nav_ class => 'charselect', sub {
|
||||
for('all', 0, 'a'..'z') {
|
||||
a_ href => "/pkg/$short?c=$_", $_?uc$_:'#' if $_ ne $f->{c};
|
||||
b_ $_?uc$_:'#' if $_ eq $f->{c};
|
||||
}
|
||||
};
|
||||
};
|
||||
small_ '(Packages without man pages are not listed)';
|
||||
|
||||
p_ 'Note: Packages without man pages are not listed.';
|
||||
paginate_ "/pkg/$short?c=$f->{c};p=", $count, 200, $f->{p};
|
||||
ul_ id => 'packages', sub {
|
||||
li_ sub {
|
||||
a_ href => "/pkg/$short/$_->{category}/$_->{name}", $_->{name};
|
||||
i_ ' '.$_->{category};
|
||||
} for @$pkg;
|
||||
};
|
||||
paginate_ "/pkg/$short?c=$f->{c};p=", $count, 200, $f->{p};
|
||||
}
|
||||
paginate_ "/pkg/$short?c=$f->{c};p=", $count, 200, $f->{p};
|
||||
ul_ sub {
|
||||
li_ sub {
|
||||
a_ href => "/pkg/$short/$_->{category}/$_->{name}", $_->{name};
|
||||
small_ ' '.$_->{category};
|
||||
} for @$pkg;
|
||||
};
|
||||
paginate_ "/pkg/$short?c=$f->{c};p=", $count, 200, $f->{p};
|
||||
};
|
||||
};
|
||||
|
||||
|
|
@ -846,33 +845,39 @@ TUWF::get qr{/pkg/([^/]+)/(.+)} => sub {
|
|||
# Latest version of this package determines last modification date of the page.
|
||||
tuwf->resLastMod($vers->[0]{released});
|
||||
|
||||
my $title = "$sys->{name}".($sys->{release}?" $sys->{release}":"")." / $pkg->{category} / $pkg->{name}";
|
||||
framework_ title => "$title $sel->{version}", sub {
|
||||
h1_ $title;
|
||||
|
||||
div_ id => 'pkgversions', sub {
|
||||
h2_ 'Versions';
|
||||
ul_ sub {
|
||||
li_ sub {
|
||||
a_ href => "/pkg/$sys->{short}/$pkg->{category}/$pkg->{name}/$_->{version}", $_->{version} if $_ != $sel;
|
||||
b_ " $_->{version}" if $_ == $sel;
|
||||
i_ " $_->{released}";
|
||||
} for(@$vers);
|
||||
}
|
||||
my $sysname = $sys->{name}.($sys->{release}?" $sys->{release}":"");
|
||||
my $subtitle = " / $pkg->{category} / $pkg->{name}";
|
||||
framework_ title => "$sysname$subtitle $sel->{version}", mainclass => 'pkgpage', sub {
|
||||
h1_ sub {
|
||||
a_ href => "/pkg/$sys->{short}", $sysname;
|
||||
txt_ $subtitle;
|
||||
};
|
||||
|
||||
div_ id => 'pkgmans', sub {
|
||||
h2_ "Manuals for version $sel->{version}";
|
||||
paginate_ "/pkg/$sys->{short}/$pkg->{category}/$pkg->{name}/$sel->{version}?p=", $count, 200, $p;
|
||||
ul_ sub {
|
||||
li_ sub {
|
||||
a_ href => "/$_->{name}/".substr($_->{hash},0,8), "$_->{name}($_->{section})";
|
||||
b_ " $_->{locale}" if $_->{locale};
|
||||
i_ " $_->{filename}";
|
||||
} for(@$mans);
|
||||
div_ sub {
|
||||
section_ sub {
|
||||
h2_ 'Versions';
|
||||
ul_ sub {
|
||||
li_ sub {
|
||||
a_ href => "/pkg/$sys->{short}/$pkg->{category}/$pkg->{name}/$_->{version}", $_->{version} if $_ != $sel;
|
||||
b_ " $_->{version}" if $_ == $sel;
|
||||
small_ " $_->{released}";
|
||||
} for(@$vers);
|
||||
}
|
||||
};
|
||||
paginate_ "/pkg/$sys->{short}/$pkg->{category}/$pkg->{name}/$sel->{version}?p=", $count, 200, $p;
|
||||
}
|
||||
|
||||
section_ sub {
|
||||
h2_ "Manuals for version $sel->{version}";
|
||||
paginate_ "/pkg/$sys->{short}/$pkg->{category}/$pkg->{name}/$sel->{version}?p=", $count, 200, $p;
|
||||
ul_ sub {
|
||||
li_ sub {
|
||||
a_ href => "/$_->{name}/".substr($_->{hash},0,8), "$_->{name}($_->{section})";
|
||||
b_ " $_->{locale}" if $_->{locale};
|
||||
small_ " $_->{filename}";
|
||||
} for(@$mans);
|
||||
};
|
||||
paginate_ "/pkg/$sys->{short}/$pkg->{category}/$pkg->{name}/$sel->{version}?p=", $count, 200, $p;
|
||||
};
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue