source: trunk/lib/OpenGuides.pm @ 365

Last change on this file since 365 was 365, checked in by kake, 18 years ago

Update copyright notice.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.6 KB
Line 
1package OpenGuides;
2use strict;
3
4use CGI;
5use OpenGuides::Template;
6use OpenGuides::Utils;
7
8use vars qw( $VERSION );
9
10$VERSION = '0.33_02';
11
12=head1 NAME
13
14OpenGuides - A complete web application for managing a collaboratively-written guide to a city or town.
15
16=head1 DESCRIPTION
17
18The OpenGuides software provides the framework for a collaboratively-written
19city guide.  It is similar to a wiki but provides somewhat more structured
20data storage allowing you to annotate wiki pages with information such as
21category, location, and much more.  It provides searching facilities
22including "find me everything within a certain distance of this place".
23Every page includes a link to a machine-readable (RDF) version of the page.
24
25=head1 METHODS
26
27=over
28
29=item B<new>
30
31  my $guide = OpenGuides->new( config => $config );
32
33=cut
34
35sub new {
36    my ($class, %args) = @_;
37    my $self = {};
38    bless $self, $class;
39    my $wiki = OpenGuides::Utils->make_wiki_object( config => $args{config} );
40    $self->{wiki} = $wiki;
41    $self->{config} = $args{config};
42    return $self;
43}
44
45=item B<wiki>
46
47An accessor, returns the underlying L<CGI::Wiki> object.
48
49=cut
50
51sub wiki {
52    my $self = shift;
53    return $self->{wiki};
54}
55
56=item B<config>
57
58An accessor, returns the underlying L<Config::Tiny> object.
59
60=cut
61
62sub config {
63    my $self = shift;
64    return $self->{config};
65}
66
67=item B<display_node>
68
69  # Print node to STDOUT.
70  $guide->display_node(
71                        id      => "Calthorpe Arms",
72                        version => 2,
73                      );
74
75  # Or return output as a string (useful for writing tests).
76  $guide->display_node(
77                        id            => "Calthorpe Arms",
78                        return_output => 1,
79                      );
80
81If C<version> is omitted then the latest version will be displayed.
82
83=cut
84
85sub display_node {
86    my ($self, %args) = @_;
87    my $return_output = $args{return_output} || 0;
88    my $version = $args{version};
89    my $id = $args{id} || "Home";
90    my $wiki = $self->wiki;
91    my $config = $self->config;
92
93    my %tt_vars;
94
95    if ( $id =~ /^(Category|Locale) (.*)$/ ) {
96        my $type = $1;
97        $tt_vars{is_indexable_node} = 1;
98        $tt_vars{index_type} = lc($type);
99        $tt_vars{index_value} = $2;
100    }
101
102    my %current_data = $wiki->retrieve_node( $id );
103    my $current_version = $current_data{version};
104    undef $version if ($version && $version == $current_version);
105    my %criteria = ( name => $id );
106    $criteria{version} = $version if $version;#retrieve_node default is current
107
108    my %node_data = $wiki->retrieve_node( %criteria );
109    my $raw = $node_data{content};
110    if ( $raw =~ /^#REDIRECT\s+(.+?)\s*$/ ) {
111        my $redirect = $1;
112        # Strip off enclosing [[ ]] in case this is an extended link.
113        $redirect =~ s/^\[\[//;
114        $redirect =~ s/\]\]\s*$//;
115        # See if this is a valid node, if not then just show the page as-is.
116        if ( $wiki->node_exists($redirect) ) {
117            redirect_to_node($redirect);
118        }
119    }
120    my $content    = $wiki->format($raw);
121    my $modified   = $node_data{last_modified};
122    my %metadata   = %{$node_data{metadata}};
123
124    my %metadata_vars = OpenGuides::Template->extract_metadata_vars(
125                            wiki     => $wiki,
126                            config   => $config,
127                            metadata => $node_data{metadata} );
128
129    %tt_vars = (
130                 %tt_vars,
131                 %metadata_vars,
132                 content       => $content,
133                 geocache_link => $self->make_geocache_link($id),
134                 last_modified => $modified,
135                 version       => $node_data{version},
136                 node_name     => CGI->escapeHTML($id),
137                 node_param    => CGI->escape($id),
138                 language      => $config->{_}->{default_language},
139               );
140
141
142    # We've undef'ed $version above if this is the current version.
143    $tt_vars{current} = 1 unless $version;
144
145    if ($id eq "RecentChanges") {
146        my $minor_edits = $self->get_cookie( "show_minor_edits_in_rc" );
147        my %criteria = ( days => 7 );
148        $criteria{metadata_was} = { edit_type => "Normal edit" }
149          unless $minor_edits;
150        my @recent = $wiki->list_recent_changes( %criteria );
151        @recent = map { {name          => CGI->escapeHTML($_->{name}),
152                         last_modified => CGI->escapeHTML($_->{last_modified}),
153                         comment       => CGI->escapeHTML($_->{metadata}{comment}[0]),
154                         username      => CGI->escapeHTML($_->{metadata}{username}[0]),
155                         host          => CGI->escapeHTML($_->{metadata}{host}[0]),
156                         username_param => CGI->escape($_->{metadata}{username}[0]),
157                         edit_type     => CGI->escapeHTML($_->{metadata}{edit_type}[0]),
158                         url           => "$config->{_}->{script_name}?"
159          . CGI->escape($wiki->formatter->node_name_to_node_param($_->{name})) }
160                       } @recent;
161        $tt_vars{recent_changes} = \@recent;
162        $tt_vars{days} = 7;
163        my $output = $self->process_template(
164                                          id            => $id,
165                                          template      => "recent_changes.tt",
166                                          tt_vars       => \%tt_vars,
167                                            );
168        return $output if $return_output;
169        print $output;
170    } elsif ($id eq "Home") {
171        my @recent = $wiki->list_recent_changes(
172            last_n_changes => 10,
173            metadata_was   => { edit_type => "Normal edit" },
174        );
175        @recent = map { {name          => CGI->escapeHTML($_->{name}),
176                         last_modified => CGI->escapeHTML($_->{last_modified}),
177                         comment       => CGI->escapeHTML($_->{metadata}{comment}[0]),
178                         username      => CGI->escapeHTML($_->{metadata}{username}[0]),
179                         url           => "$config->{_}->{script_name}?"
180          . CGI->escape($wiki->formatter->node_name_to_node_param($_->{name})) }
181                       } @recent;
182        $tt_vars{recent_changes} = \@recent;
183        my $output = $self->process_template(
184                                              id            => $id,
185                                              template      => "home_node.tt",
186                                              tt_vars       => \%tt_vars,
187                                            );
188        return $output if $return_output;
189        print $output;
190    } else {
191        my $output = $self->process_template(
192                                              id            => $id,
193                                              template      => "node.tt",
194                                              tt_vars       => \%tt_vars,
195                                            );
196        return $output if $return_output;
197        print $output;
198    }
199}
200
201sub process_template {
202    my ($self, %args) = @_;
203    my %output_conf = ( wiki     => $self->wiki,
204                        config   => $self->config,
205                        node     => $args{id},
206                        template => $args{template},
207                        vars     => $args{tt_vars},
208    );
209    return OpenGuides::Template->output( %output_conf );
210}
211
212sub get_cookie {
213    my $self = shift;
214    my $config = $self->config;
215    my $pref_name = shift or return "";
216    my %cookie_data = OpenGuides::CGI->get_prefs_from_cookie(config=>$config);
217    return $cookie_data{$pref_name};
218}
219
220sub make_geocache_link {
221    my $self = shift;
222    my $wiki = $self->wiki;
223    my $config = $self->config;
224    return "" unless $self->get_cookie( "include_geocache_link" );
225    my $node = shift || $config->{_}->{home_name};
226    my %current_data = $wiki->retrieve_node( $node );
227    my %criteria     = ( name => $node );
228    my %node_data    = $wiki->retrieve_node( %criteria );
229    my %metadata     = %{$node_data{metadata}};
230    my $latitude     = $metadata{latitude}[0];
231    my $longitude    = $metadata{longitude}[0];
232    my $geocache     = CGI::Wiki::Plugin::GeoCache->new();
233    my $link_text    = "Look for nearby geocaches";
234
235    if ($latitude && $longitude) {
236        my $cache_url    = $geocache->make_link(
237                                        latitude  => $latitude,
238                                        longitude => $longitude,
239                                        link_text => $link_text
240                                );
241        return $cache_url;
242    }
243    else {
244        return "";
245    }
246}
247
248=back
249
250=head1 BUGS AND CAVEATS
251
252At the moment, the location data uses a United-Kingdom-specific module,
253so the location features might not work so well outside the UK.
254
255=head1 SEE ALSO
256
257=over 4
258
259=item * L<http://london.openguides.org/|The Open Guide to London>, the first and biggest OpenGuides site.
260
261=item * L<http://openguides.org/|The OpenGuides website>, with a list of all live OpenGuides installs.
262
263=item * L<CGI::Wiki>, the Wiki toolkit which does the heavy lifting for OpenGuides
264
265=back
266
267=head1 FEEDBACK
268
269If you have a question, a bug report, or a patch, or you're interested
270in joining the development team, please contact openguides-dev@openguides.org
271(moderated mailing list, will reach all current developers but you'll have
272to wait for your post to be approved) or kake@earth.li (a real person who
273may take a little while to reply to your mail if she's busy).
274
275=head1 AUTHOR
276
277The OpenGuides Project (openguides-dev@openguides.org)
278
279=head1 COPYRIGHT
280
281     Copyright (C) 2003-4 The OpenGuides Project.  All Rights Reserved.
282
283The OpenGuides distribution is free software; you can redistribute it
284and/or modify it under the same terms as Perl itself.
285
286=head1 CREDITS
287
288Programming by Earle Martin, Kake Pugh, Ivor Williams.  Testing and
289bug reporting by Cal Henderson, Bob Walker, Kerry Bosworth, Dominic
290Hargreaves, Simon Cozens, among others.  Much of the Module::Build
291stuff copied from the Siesta project L<http://siesta.unixbeard.net/>
292
293=cut
294
2951;
Note: See TracBrowser for help on using the repository browser.