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

Last change on this file since 469 was 469, checked in by kake, 17 years ago

Added option of using Plucene for searching.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.9 KB
Line 
1package OpenGuides::Utils;
2
3use strict;
4use vars qw( $VERSION );
5$VERSION = '0.07';
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 $link_title = $_[2] || "View all pages in $_[0] $_[1]";
123                  return qq(<a href="$script_name?action=index;index_type=) . uri_escape(lc($_[0])) . qq(;index_value=) . uri_escape($_[1]) . qq(">$link_title</a>);
124                },
125        qr/\@RSS\s+\[(.*?)\]/ => sub { 
126                                      # Get the URL. It's already been formatted into a
127                                      # hyperlink so we need to reverse that.
128                                      my $url_raw = $_[0];
129                                      $url_raw =~ />(.*?)</;
130                                      my $url = $1;
131
132                                      # Retrieve the RSS from the given URL.
133                                      my $rss = CGI::Wiki::Plugin::RSS::Reader->new(url => $url);
134                                      my @items = $rss->retrieve;
135
136                                      # Ten items only at this till.
137                                      $#items = 10 if $#items > 10;
138
139                                      # Make an HTML list with them.
140                                      my $list  = "<ul>\n";
141                                      foreach (@items)
142                                      {
143                                        my $link  = $_->{link};
144                                        my $title = $_->{title};
145                                        $list .= qq{\t<li><a href="$link">$title</a></li>\n};
146                                      }
147                                      $list .= "</ul>\n";
148                                    }
149    );
150
151    my $formatter = CGI::Wiki::Formatter::UseMod->new(
152        extended_links      => 1,
153        implicit_links      => 0,
154        allowed_tags        => [qw(a p b strong i em pre small img table td
155                                   tr th br hr ul li center blockquote kbd
156                                   div code strike sub sup font)],
157        macros              => \%macros,
158        node_prefix         => "$script_name?",
159        edit_prefix         => "$script_name?action=edit&id=",
160        munge_urls          => 1,
161    );
162
163    my %conf = ( store     => $store,
164                 search    => $search,
165                 formatter => $formatter );
166
167    my $wiki = CGI::Wiki->new( %conf );
168    return $wiki;
169}
170
171
172=back
173
174=head1 AUTHOR
175
176The OpenGuides Project (openguides-dev@openguides.org)
177
178=head1 COPYRIGHT
179
180     Copyright (C) 2003 The OpenGuides Project.  All Rights Reserved.
181
182This module is free software; you can redistribute it and/or modify it
183under the same terms as Perl itself.
184
185=cut
186
1871;
Note: See TracBrowser for help on using the repository browser.