AnnoCPAN
view release on metacpan or search on metacpan
tt/note.html
tt/note.txt
tt/note_dump.xml
tt/note_form.html
tt/note_help.html
tt/note_table.html
tt/pod.html
tt/pod_families.html
tt/podver_note_count.txt
tt/policy.html
tt/prefs.html
tt/rss.html
tt/show.html
tt/show_author.html
tt/show_author_recent.html
tt/show_dist.html
tt/show_notepos.html
tt/show_user.html
tt/util.tt
update.sh
cache_html => 0,
pre_line_wrap => 72,
template_path => '../tt',
cookie_duration => 3000,
secret => 'life is like a box of chocolates',
# default user preferences
js => 1,
tol => 60.0,
style => 'side',
prefs => [qw(js tol style)],
# webspace parameters
root_uri_abs => 'http://annocpan.org',
root_uri_rel => '',
img_root => '/img',
}
drop table dist, distver, pod, podver, section, user, vote, note, notepos, author, prefs;
html/annocpan.css view on Meta::CPAN
#login_form {
position: absolute;
right: 20px;
top: 10px;
}
#login_form form {
font-size: 80%;
}
/* preferences form */
#prefs input.checkbox {
display: block;
float: left;
margin-bottom: 0.5ex;
}
/* search form */
#searchform {
padding: 1ex 0;
}
lib/AnnoCPAN/Config.pm view on Meta::CPAN
recent_notes => 25,
min_similarity => 0.5,
cache_html => 1,
pre_line_wrap => 72,
template_path => '../tt',
# default user preferences
js => 1,
tol => 60.0,
style => 'side',
prefs => [qw(js tol style)],
# webspace parameters
root_uri_abs => 'http://www.annocpan.org',
root_uri_rel => '',
img_root => '/img',
}
=head1 CONFIGURATION VARIABLES
=over
lib/AnnoCPAN/Control.pm view on Meta::CPAN
=cut
sub default_vars {
my ($self) = @_;
+{
param => sub { $self->param(@_) },
user => $self->user,
mode => $self->mode,
log => $self->{log},
prefs => sub { $self->prefs(@_) },
my_html => sub { $self->my_html(@_) },
request_uri => $ENV{REQUEST_URI},
cgi => $self->cgi,
root_uri_rel => AnnoCPAN::Config->option('root_uri_rel'),
img_root => AnnoCPAN::Config->option('img_root'),
root_uri_abs => AnnoCPAN::Config->option('root_uri_abs'),
NO => \&NO,
}
}
=item $obj->prefs($pref_name)
Returns the value for a given user preference.
=cut
sub prefs {
my ($self, $name) = @_;
my $user = $self->user;
my $value;
if ($user) {
$value = AnnoCPAN::DBI::Prefs->retrieve(user => $user, name => $name);
}
defined $value ? $value->value : AnnoCPAN::Config->option($name);
}
=item $obj->cookies
lib/AnnoCPAN/Control.pm view on Meta::CPAN
my ($self) = @_;
$self->delete_cookie('key');
$self->user(undef);
$self->redirect($self->param('from'));
return;
#$self->Main({message => "You have logged out"});
}
sub Prefs {
my ($self) = @_;
return $self->error("Can't edit prefs without logging in first!")
unless $self->user;
({}, 'prefs');
}
sub Save_prefs {
my ($self) = @_;
# XXX untaint
my $user = $self->user;
return $self->error("Can't edit prefs without logging in first!")
unless $user;
AnnoCPAN::DBI::Prefs->search(user => $user)->delete_all;
for my $name (@{AnnoCPAN::Config->option('prefs')}) {
AnnoCPAN::DBI::Prefs->create({user => $user, name => $name,
value => $self->param($name) || '' });
}
({ message => 'Preferences saved'}, 'prefs');
}
sub Delete {
my ($self) = @_;
return $self->_delete if $self->param('fast');
my ($vars) = $self->_delete;
return $self->Main($vars) if $vars->{error};
$self->Show($vars);
}
lib/AnnoCPAN/DBI.pm view on Meta::CPAN
=back
=cut
sub can_move { shift->can_delete(@_) }
sub can_hide { shift->can_delete(@_) }
package AnnoCPAN::DBI::Prefs;
use base 'AnnoCPAN::DBI';
__PACKAGE__->table('prefs');
__PACKAGE__->columns(Essential => qw(id user name value));
__PACKAGE__->has_a(user => 'AnnoCPAN::DBI::User');
package AnnoCPAN::DBI::Vote;
use base 'AnnoCPAN::DBI';
__PACKAGE__->table('vote');
__PACKAGE__->columns(Essential => qw(id note user value));
=head2 AnnoCPAN::DBI::Note
lib/AnnoCPAN/DBI.pm view on Meta::CPAN
# ONE TO MANY
AnnoCPAN::DBI::Dist->has_many(distvers => 'AnnoCPAN::DBI::DistVer',
{ order_by => 'mtime' });
AnnoCPAN::DBI::Pod->has_many(podvers => 'AnnoCPAN::DBI::PodVer');
AnnoCPAN::DBI::Pod->has_many(notes => 'AnnoCPAN::DBI::Note');
AnnoCPAN::DBI::Pod->has_many(pod_dists => 'AnnoCPAN::DBI::PodDist');
AnnoCPAN::DBI::PodVer->has_many(sections => 'AnnoCPAN::DBI::Section',
{ order_by => 'pos' } );
AnnoCPAN::DBI::DistVer->has_many(podvers => 'AnnoCPAN::DBI::PodVer');
AnnoCPAN::DBI::User->has_many(prefs => 'AnnoCPAN::DBI::Prefs');
AnnoCPAN::DBI::User->has_many(
notes => 'AnnoCPAN::DBI::Note', { order_by => 'time DESC' });
AnnoCPAN::DBI::Section->has_many(notepos => 'AnnoCPAN::DBI::NotePos');
AnnoCPAN::DBI::Section->has_many(original_notes => 'AnnoCPAN::DBI::Note');
AnnoCPAN::DBI::Note->has_many(notepos => 'AnnoCPAN::DBI::NotePos');
# MANY TO MANY
AnnoCPAN::DBI::Section->has_many(
notes => ['AnnoCPAN::DBI::NotePos' => 'note']);
tables.tt.sql view on Meta::CPAN
create index notepos_index_section on notepos(section);
create table author (
[% id %],
pause_id varchar(255),
name varchar(255),
email varchar(255),
url varchar(255)
);
create table prefs (
[% id %],
user integer,
name varchar(255),
value text
);
create index user_index on prefs(user);
tt/header.html view on Meta::CPAN
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>AnnoCPAN - [% title | html %]</title>
<meta name="description" content='AnnoCPAN is an "Annotated CPAN"; a site
where users can add notes next to the POD documentation for Perl modules'>
<meta name="keywords" content="cpan, perl, module, modules, documentation, annocpan">
<link rel="stylesheet" type="text/css" href="[% root_uri_rel %]/annocpan.css">
[% IF prefs('style') == 'side' %]
<link rel="stylesheet" title="margin notes" type="text/css" href="[% root_uri_rel %]/layout-side.css">
<link rel="alternate stylesheet" title="inline notes" type="text/css" href="[% root_uri_rel %]/layout-inline.css">
[% ELSE %]
<link rel="stylesheet" title="inline notes" type="text/css" href="[% root_uri_rel %]/layout-inline.css">
<link rel="alternate stylesheet" title="margin notes" type="text/css" href="[% root_uri_rel %]/layout-side.css">
[% END %]
[% IF prefs('js') %]
[% FOR script = scripts %]
<script src="[% root_uri_rel %]/[% script %].js" type="text/javascript"></script>
[% END %]
[% END %]
<link rel="alternate" title="New CPAN Distributions" href="[% root_uri_abs %]/recent_dists.rss" type="application/rss+xml">
[% IF rss == 'global' %]
<link rel="alternate" title="AnnoCPAN Recent Notes" href="[% root_uri_abs %]/recent.rss" type="application/rss+xml">
[% ELSIF rss == 'author' %]
<link rel="alternate" title="AnnoCPAN Notes for [% author %]" href="[% root_uri_abs %]/~[% author %]/recent.rss" type="application/rss+xml">
[% END %]
[% IF user %]
<style type="text/css">
#pod2html .cb { display: inline; }
.u_[% user.id %] { display: inline; }
[% IF user.privs > 1 %]
.button { display: inline; }
[% END %]
[% FOR val = [50,60,70,80,90,100] -%]
[% IF val < prefs('tol') %].sim_[% val %] { display: none; }[% END %]
[%- END %]
</style>
[% END %]
</head>
<body>
<h1><a href="[% root_uri_rel %]/"><img src="[% img_root %]/annocpan.png" alt="Annotated CPAN" height="50" width="280"></a></h1>
<ul id="nav">
<li><a href="[% root_uri_rel %]/">Home</a>
<li><a href="[% root_uri_rel %]/about">About</a>
<li><a href="[% root_uri_rel %]/faq">FAQ</a>
<li><a href="[% root_uri_rel %]/news">News</a>
[% IF user %]
<li class="right"><a href="[% root_uri_rel %]/prefs">Prefs</a>
<li class="right"><a href="[% root_uri_rel %]/?mode=logout;from=[% request_uri | myuri %]">Logout</a>
[% ELSE %]
<li class="right"><a href="[% root_uri_rel %]/new_user">New user</a>
[% END %]
</ul>
<div id="content">
[% IF error %]
tt/prefs.html view on Meta::CPAN
[% PROCESS header.html title='Edit Preferences'%]
[% PROCESS login_form.html %]
[% PROCESS form.html %]
[%
styles = ['side', 'inline'];
chk = 'checked="checked"';
%]
<h2>Edit Preferences</h2>
<form method="post" id="prefs" class="float">
<input type="hidden" name="mode" value="save_prefs">
<label for="js">JavaScript</label>
<input type="checkbox" class="checkbox" id="js" name="js" [% chk IF prefs('js') %] value="1"><br>
<label for="style">Style</label>
<select id="style" name="style" class="text">
[% FOR type = styles %]
<option [% 'selected="selected"' IF type == prefs('style') %]>[% type %]</option>
[% END %]
</select><br>
<label for="tol" class="text">Uncertainty threshold</label>
<select id="tol" name="tol" class="text">
[% FOR val = [50,60,70,80,90,100] %]
<option [% 'selected="selected"' IF val == prefs('tol') %]>[% val %]</option>
[% END %]
</select> %<br>
<input type="submit" class="text"><br>
</form>
[% PROCESS footer.html %]
( run in 2.135 seconds using v1.01-cache-2.11-cpan-0bb4e1dffa6 )