AnnoCPAN

 view release on metacpan or  search on metacpan

MANIFEST  view on Meta::CPAN

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

config.pl  view on Meta::CPAN

    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',

}

delete.sql  view on Meta::CPAN

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 )