source: trunk/lib/OpenGuides/Utils.pm @ 785

Last change on this file since 785 was 785, checked in by Dominic Hargreaves, 15 years ago

Use Wiki::Toolkit. Note that CGI::Wiki::Plugin::Diff hasn't been converted yet,
so tests will be broken for now.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.2 KB
Line 
1package OpenGuides::Utils;
2
3use strict;
4use vars qw( $VERSION );
5$VERSION = '0.09';
6
7use Carp qw( croak );
8use Wiki::Toolkit;
9use Wiki::Toolkit::Formatter::UseMod;
10use Wiki::Toolkit::Plugin::RSS::Reader;
11use URI::Escape;
12
13=head1 NAME
14
15OpenGuides::Utils - General utility methods for OpenGuides scripts.
16
17=head1 DESCRIPTION
18
19Provides general utility methods for OpenGuides scripts.  Distributed
20and installed as part of the OpenGuides project, not intended for
21independent installation.  This documentation is probably only useful
22to OpenGuides developers.
23
24=head1 SYNOPSIS
25
26  use OpenGuide::Config;
27  use OpenGuides::Utils;
28
29  my $config = OpenGuides::Config->new( file => "wiki.conf" );
30  my $wiki = OpenGuides::Utils->make_wiki_object( config => $config );
31
32=head1 METHODS
33
34=over 4
35
36=item B<make_wiki_object>
37
38  my $config = OpenGuides::Config->new( file => "wiki.conf" );
39  my $wiki = OpenGuides::Utils->make_wiki_object( config => $config );
40
41Croaks unless an C<OpenGuides::Config> object is supplied.  Returns a
42C<Wiki::Toolkit> object made from the given config file on success,
43croaks if any other error occurs.
44
45The config file needs to define at least the following variables:
46
47=over
48
49=item *
50
51dbtype - one of C<postgres>, C<mysql> and C<sqlite>
52
53=item *
54
55dbname
56
57=item *
58
59indexing_directory - for the L<Search::InvertedIndex> or L<Plucene> files to go
60
61=back
62
63=cut
64
65sub make_wiki_object {
66    my ($class, %args) = @_;
67    my $config = $args{config} or croak "No config param supplied";
68    croak "config param isn't an OpenGuides::Config object"
69        unless UNIVERSAL::isa( $config, "OpenGuides::Config" );
70
71    # Require in the right database module.
72    my $dbtype = $config->dbtype;
73
74    my %cgi_wiki_exts = (
75                          postgres => "Pg",
76                          mysql    => "MySQL",
77                          sqlite   => "SQLite",
78                        );
79
80    my $cgi_wiki_module = "Wiki::Toolkit::Store::" . $cgi_wiki_exts{$dbtype};
81    eval "require $cgi_wiki_module";
82    croak "Can't 'require' $cgi_wiki_module.\n" if $@;
83
84    # Make store.
85    my $store = $cgi_wiki_module->new(
86        dbname => $config->dbname,
87        dbuser => $config->dbuser,
88        dbpass => $config->dbpass,
89        dbhost => $config->dbhost,
90    );
91
92    # Make search.
93    my $search;
94    if ( $config->use_plucene
95         && ( lc($config->use_plucene) eq "y"
96              || $config->use_plucene == 1 )
97       ) {
98        require Wiki::Toolkit::Search::Plucene;
99        $search = Wiki::Toolkit::Search::Plucene->new(
100                                       path => $config->indexing_directory,
101                                                 );
102    } else {
103        require Wiki::Toolkit::Search::SII;
104        require Search::InvertedIndex::DB::DB_File_SplitHash;
105        my $indexdb = Search::InvertedIndex::DB::DB_File_SplitHash->new(
106            -map_name  => $config->indexing_directory,
107            -lock_mode => "EX"
108        );
109        $search = Wiki::Toolkit::Search::SII->new( indexdb => $indexdb );
110    }
111
112    # Make formatter.
113    my $script_name = $config->script_name;
114    my $search_url = $config->script_url . "search.cgi";
115
116    my %macros = (
117        '@SEARCHBOX' =>
118            qq(<form action="$search_url" method="get"><input type="text" size="20" name="search"><input type="submit" name="Go" value="Search"></form>),
119        qr/\@INDEX_LINK\s+\[\[(Category|Locale)\s+([^\]|]+)\|?([^\]]+)?\]\]/ =>
120            sub {
121                  # We may be being called by Wiki::Toolkit::Plugin::Diff,
122                  # which doesn't know it has to pass us $wiki - and
123                  # we don't use it anyway.
124                  if ( UNIVERSAL::isa( $_[0], "Wiki::Toolkit" ) ) {
125                      shift; # just throw it away
126                  }
127                  my $link_title = $_[2] || "View all pages in $_[0] $_[1]";
128                  return qq(<a href="$script_name?action=index;index_type=) . uri_escape(lc($_[0])) . qq(;index_value=) . uri_escape($_[1]) . qq(">$link_title</a>);
129                },
130        qr/\@INDEX_LIST\s+\[\[(Category|Locale)\s+([^\]]+)]]/ =>
131             sub {
132                   my ($wiki, $type, $value) = @_;
133
134                   # We may be being called by Wiki::Toolkit::Plugin::Diff,
135                   # which doesn't know it has to pass us $wiki
136                   unless ( UNIVERSAL::isa( $wiki, "Wiki::Toolkit" ) ) {
137                       return "(unprocessed INDEX_LIST macro)";
138                   }
139
140                   my @nodes = sort $wiki->list_nodes_by_metadata(
141                       metadata_type  => $type,
142                       metadata_value => $value,
143                       ignore_case    => 1,
144                   );
145                   unless ( scalar @nodes ) {
146                       return "\n* No pages currently in "
147                              . lc($type) . " $value\n";
148                   }
149                   my $return = "\n";
150                   foreach my $node ( @nodes ) {
151                       $return .= "* "
152                               . $wiki->formatter->format_link(
153                                                                wiki => $wiki,
154                                                                link => $node,
155                                                              )
156                                . "\n";
157                   }
158                   return $return;
159                 },
160        qr/\@RSS\s+(.+)/ => sub {
161                    # We may be being called by Wiki::Toolkit::Plugin::Diff,
162                    # which doesn't know it has to pass us $wiki - and
163                    # we don't use it anyway.
164                    if ( UNIVERSAL::isa( $_[0], "Wiki::Toolkit" ) ) {
165                        shift; # just throw it away
166                    }
167
168                    my $url = shift;
169
170                    # The URL will already have been processed as an inline
171                    # link, so transform it back again.
172                    if ( $url =~ m/href="([^"]+)/ ) {
173                        $url = $1;
174                    }
175
176                    my $rss = Wiki::Toolkit::Plugin::RSS::Reader->new(url => $url);
177                    my @items = $rss->retrieve;
178
179                    # Ten items only at this till.
180                    $#items = 10 if $#items > 10;
181
182                    # Make a UseMod-formatted list with them - macros are
183                    # processed *before* UseMod formatting is applied but
184                    # *after* inline links like [http://foo/ bar]
185                    my $list = "\n";
186                    foreach (@items) {
187                        my $link        = $_->{link};
188                        my $title       = $_->{title};
189                        my $description = $_->{description};
190                        $list .= qq{* <a href="$link">$title</a>};
191                        $list .= " - $description" if $description;
192                        $list .= "\n";
193                    }
194                    $list .= "</ul>\n";
195        },
196    );
197
198    my $formatter = Wiki::Toolkit::Formatter::UseMod->new(
199        extended_links      => 1,
200        implicit_links      => 0,
201        allowed_tags        => [qw(a p b strong i em pre small img table td
202                                   tr th br hr ul li center blockquote kbd
203                                   div code strike sub sup font)],
204        macros              => \%macros,
205        pass_wiki_to_macros => 1,
206        node_prefix         => "$script_name?",
207        edit_prefix         => "$script_name?action=edit&id=",
208        munge_urls          => 1,
209    );
210
211    my %conf = ( store     => $store,
212                 search    => $search,
213                 formatter => $formatter );
214
215    my $wiki = Wiki::Toolkit->new( %conf );
216    return $wiki;
217}
218
219=item B<get_wgs84_coords>
220
221Returns coordinate data suitable for use with Google Maps (and other GIS
222systems that assume WGS-84 data).
223
224    my ($wgs84_long, $wgs84_lat) = OpenGuides::Utils->get_wgs84_coords(
225                                        longitude => $longitude,
226                                        latitude => $latitude,
227                                        config => $config
228                                   );
229
230=cut
231
232sub get_wgs84_coords {
233    my ($self, %args) = @_;
234    my ($longitude, $latitude, $config) = ($args{longitude}, $args{latitude},
235                                           $args{config})
236       or croak "No longitude supplied to get_wgs84_coords";
237    croak "geo_handler not defined!" unless $config->geo_handler;
238    if ($config->force_wgs84) {
239        # Only as a rough approximation, good enough for large scale guides
240        return ($longitude, $latitude);
241    } elsif ($config->geo_handler == 1) {
242        # Do conversion here
243        return undef;
244    } elsif ($config->geo_handler == 2) {
245        # Do conversion here
246        return undef;
247    } elsif ($config->geo_handler == 3) {
248        if ($config->ellipsoid eq "WGS-84") {
249            return ($longitude, $latitude);
250        } else {
251            # Do conversion here
252            return undef;
253        }
254    } else {
255        croak "Invalid geo_handler config option $config->geo_handler";
256    }
257}
258
259=back
260
261=head1 AUTHOR
262
263The OpenGuides Project (openguides-dev@openguides.org)
264
265=head1 COPYRIGHT
266
267     Copyright (C) 2003-2005 The OpenGuides Project.  All Rights Reserved.
268
269This module is free software; you can redistribute it and/or modify it
270under the same terms as Perl itself.
271
272=cut
273
2741;
Note: See TracBrowser for help on using the repository browser.