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

Last change on this file since 578 was 578, checked in by Dominic Hargreaves, 17 years ago

copyright updates.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.9 KB
Line 
1package OpenGuides::Utils;
2
3use strict;
4use vars qw( $VERSION );
5$VERSION = '0.08';
6
7use Carp qw( croak );
8use CGI::Wiki;
9use CGI::Wiki::Formatter::UseMod;
10use CGI::Wiki::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 CGI::Wiki;
27  use Config::Tiny;
28  use OpenGuides::Utils;
29
30  my $config = Config::Tiny->read( "wiki.conf" );
31  my $wiki = OpenGuides::Utils->make_wiki_object( config => $config );
32
33=head1 METHODS
34
35=over 4
36
37=item B<make_wiki_object>
38
39  my $config = Config::Tiny->read( "wiki.conf" );
40  my $wiki = OpenGuides::Utils->make_wiki_object( config => $config );
41
42Croaks unless a C<Config::Tiny> object is supplied.  Returns a
43C<CGI::Wiki> object made from the given config file on success,
44croaks if any other error occurs.
45
46The config file needs to define at least the following variables:
47
48=over
49
50=item *
51
52dbtype - one of C<postgres>, C<mysql> and C<sqlite>
53
54=item *
55
56dbname
57
58=item *
59
60indexing_directory - for the L<Search::InvertedIndex> or L<Plucene> files to go
61
62=back
63
64=cut
65
66sub make_wiki_object {
67    my ($class, %args) = @_;
68    my $config = $args{config} or croak "No config param supplied";
69    croak "config param isn't a Config::Tiny object"
70        unless UNIVERSAL::isa( $config, "Config::Tiny" );
71
72    # Require in the right database module.
73    my $dbtype = $config->{_}->{dbtype};
74
75    my %cgi_wiki_exts = (
76                          postgres => "Pg",
77                          mysql    => "MySQL",
78                          sqlite   => "SQLite",
79                        );
80
81    my $cgi_wiki_module = "CGI::Wiki::Store::" . $cgi_wiki_exts{$dbtype};
82    eval "require $cgi_wiki_module";
83    croak "Can't 'require' $cgi_wiki_module.\n" if $@;
84
85    # Make store.
86    my $store = $cgi_wiki_module->new(
87        dbname => $config->{_}{dbname},
88        dbuser => $config->{_}{dbuser},
89        dbpass => $config->{_}{dbpass},
90        dbhost => $config->{_}{dbhost},
91    );
92
93    # Make search.
94    my $search;
95    if ( $config->{_}{use_plucene}
96         && ( lc($config->{_}{use_plucene}) eq "y"
97              || $config->{_}{use_plucene} == 1 )
98       ) {
99        require CGI::Wiki::Search::Plucene;
100        $search = CGI::Wiki::Search::Plucene->new(
101                                       path => $config->{_}{indexing_directory}
102                                                 );
103    } else {
104        require CGI::Wiki::Search::SII;
105        require Search::InvertedIndex::DB::DB_File_SplitHash;
106        my $indexdb = Search::InvertedIndex::DB::DB_File_SplitHash->new(
107            -map_name  => $config->{_}{indexing_directory},
108            -lock_mode => "EX"
109        );
110        $search = CGI::Wiki::Search::SII->new( indexdb => $indexdb );
111    }
112
113    # Make formatter.
114    my $script_name = $config->{_}->{script_name};
115    my $search_url = $config->{_}->{script_url} . "supersearch.cgi";
116
117    my %macros = (
118        '@SEARCHBOX' =>
119            qq(<form action="$search_url" method="get"><input type="text" size="20" name="search"><input type="submit" name="Go" value="Search"></form>),
120        qr/\@INDEX_LINK\s+\[\[(Category|Locale)\s+([^\]|]+)\|?([^\]]+)?\]\]/ =>
121            sub {
122                  my $wiki = shift;
123                  my $link_title = $_[2] || "View all pages in $_[0] $_[1]";
124                  return qq(<a href="$script_name?action=index;index_type=) . uri_escape(lc($_[0])) . qq(;index_value=) . uri_escape($_[1]) . qq(">$link_title</a>);
125                },
126        qr/\@INDEX_LIST\s+\[\[(Category|Locale)\s+([^\]]+)]]/ =>
127             sub {
128                   my ($wiki, $type, $value) = @_;
129                   my @nodes = sort $wiki->list_nodes_by_metadata(
130                       metadata_type  => $type,
131                       metadata_value => $value,
132                       ignore_case    => 1,
133                   );
134                   unless ( scalar @nodes ) {
135                       return "\n* No pages currently in "
136                              . lc($type) . " $value\n";
137                   }
138                   my $return = "\n";
139                   foreach my $node ( @nodes ) {
140                       $return .= "* "
141                               . $wiki->formatter->format_link(
142                                                                wiki => $wiki,
143                                                                link => $node,
144                                                              )
145                                . "\n";
146                   }
147                   return $return;
148                 },
149        qr/\@RSS\s+(.+)/ => sub {
150                    my ($wiki, $url) = @_;
151
152                    # The URL will already have been processed as an inline
153                    # link, so transform it back again.
154                    if ( $url =~ m/href="([^"]+)/ ) {
155                        $url = $1;
156                    }
157
158                    my $rss = CGI::Wiki::Plugin::RSS::Reader->new(url => $url);
159                    my @items = $rss->retrieve;
160
161                    # Ten items only at this till.
162                    $#items = 10 if $#items > 10;
163
164                    # Make a UseMod-formatted list with them - macros are
165                    # processed *before* UseMod formatting is applied but
166                    # *after* inline links like [http://foo/ bar]
167                    my $list = "\n";
168                    foreach (@items) {
169                        my $link        = $_->{link};
170                        my $title       = $_->{title};
171                        my $description = $_->{description};
172                        $list .= qq{* <a href="$link">$title</a>};
173                        $list .= " - $description" if $description;
174                        $list .= "\n";
175                    }
176                    $list .= "</ul>\n";
177        },
178    );
179
180    my $formatter = CGI::Wiki::Formatter::UseMod->new(
181        extended_links      => 1,
182        implicit_links      => 0,
183        allowed_tags        => [qw(a p b strong i em pre small img table td
184                                   tr th br hr ul li center blockquote kbd
185                                   div code strike sub sup font)],
186        macros              => \%macros,
187        pass_wiki_to_macros => 1,
188        node_prefix         => "$script_name?",
189        edit_prefix         => "$script_name?action=edit&id=",
190        munge_urls          => 1,
191    );
192
193    my %conf = ( store     => $store,
194                 search    => $search,
195                 formatter => $formatter );
196
197    my $wiki = CGI::Wiki->new( %conf );
198    return $wiki;
199}
200
201
202=back
203
204=head1 AUTHOR
205
206The OpenGuides Project (openguides-dev@openguides.org)
207
208=head1 COPYRIGHT
209
210     Copyright (C) 2003-2004 The OpenGuides Project.  All Rights Reserved.
211
212This module is free software; you can redistribute it and/or modify it
213under the same terms as Perl itself.
214
215=cut
216
2171;
Note: See TracBrowser for help on using the repository browser.