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

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

Fix bug with diff display on nodes containing macros.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.8 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                  # We may be being called by CGI::Wiki::Plugin::Diff,
123                  # which doesn't know it has to pass us $wiki - and
124                  # we don't use it anyway.
125                  if ( UNIVERSAL::isa( $_[0], "CGI::Wiki" ) ) {
126                      shift; # just throw it away
127                  }
128                  my $link_title = $_[2] || "View all pages in $_[0] $_[1]";
129                  return qq(<a href="$script_name?action=index;index_type=) . uri_escape(lc($_[0])) . qq(;index_value=) . uri_escape($_[1]) . qq(">$link_title</a>);
130                },
131        qr/\@INDEX_LIST\s+\[\[(Category|Locale)\s+([^\]]+)]]/ =>
132             sub {
133                   my ($wiki, $type, $value) = @_;
134
135                   # We may be being called by CGI::Wiki::Plugin::Diff,
136                   # which doesn't know it has to pass us $wiki
137                   unless ( UNIVERSAL::isa( $wiki, "CGI::Wiki" ) ) {
138                       return "(unprocessed INDEX_LIST macro)";
139                   }
140
141                   my @nodes = sort $wiki->list_nodes_by_metadata(
142                       metadata_type  => $type,
143                       metadata_value => $value,
144                       ignore_case    => 1,
145                   );
146                   unless ( scalar @nodes ) {
147                       return "\n* No pages currently in "
148                              . lc($type) . " $value\n";
149                   }
150                   my $return = "\n";
151                   foreach my $node ( @nodes ) {
152                       $return .= "* "
153                               . $wiki->formatter->format_link(
154                                                                wiki => $wiki,
155                                                                link => $node,
156                                                              )
157                                . "\n";
158                   }
159                   return $return;
160                 },
161        qr/\@RSS\s+(.+)/ => sub {
162                    # We may be being called by CGI::Wiki::Plugin::Diff,
163                    # which doesn't know it has to pass us $wiki - and
164                    # we don't use it anyway.
165                    if ( UNIVERSAL::isa( $_[0], "CGI::Wiki" ) ) {
166                        shift; # just throw it away
167                    }
168
169                    my $url = shift;
170
171                    # The URL will already have been processed as an inline
172                    # link, so transform it back again.
173                    if ( $url =~ m/href="([^"]+)/ ) {
174                        $url = $1;
175                    }
176
177                    my $rss = CGI::Wiki::Plugin::RSS::Reader->new(url => $url);
178                    my @items = $rss->retrieve;
179
180                    # Ten items only at this till.
181                    $#items = 10 if $#items > 10;
182
183                    # Make a UseMod-formatted list with them - macros are
184                    # processed *before* UseMod formatting is applied but
185                    # *after* inline links like [http://foo/ bar]
186                    my $list = "\n";
187                    foreach (@items) {
188                        my $link        = $_->{link};
189                        my $title       = $_->{title};
190                        my $description = $_->{description};
191                        $list .= qq{* <a href="$link">$title</a>};
192                        $list .= " - $description" if $description;
193                        $list .= "\n";
194                    }
195                    $list .= "</ul>\n";
196        },
197    );
198
199    my $formatter = CGI::Wiki::Formatter::UseMod->new(
200        extended_links      => 1,
201        implicit_links      => 0,
202        allowed_tags        => [qw(a p b strong i em pre small img table td
203                                   tr th br hr ul li center blockquote kbd
204                                   div code strike sub sup font)],
205        macros              => \%macros,
206        pass_wiki_to_macros => 1,
207        node_prefix         => "$script_name?",
208        edit_prefix         => "$script_name?action=edit&id=",
209        munge_urls          => 1,
210    );
211
212    my %conf = ( store     => $store,
213                 search    => $search,
214                 formatter => $formatter );
215
216    my $wiki = CGI::Wiki->new( %conf );
217    return $wiki;
218}
219
220
221=back
222
223=head1 AUTHOR
224
225The OpenGuides Project (openguides-dev@openguides.org)
226
227=head1 COPYRIGHT
228
229     Copyright (C) 2003-2004 The OpenGuides Project.  All Rights Reserved.
230
231This module is free software; you can redistribute it and/or modify it
232under the same terms as Perl itself.
233
234=cut
235
2361;
Note: See TracBrowser for help on using the repository browser.