Wiki-Toolkit-Plugin-JSON-0.03/0002755000175000017500000000000011101041336014075 5ustar domdomWiki-Toolkit-Plugin-JSON-0.03/SIGNATURE0000644000175000017500000000216111101041336015357 0ustar domdomThis file contains message digests of all files listed in MANIFEST, signed via the Module::Signature module, version 0.55. To verify the content in this distribution, first make sure you have Module::Signature installed, then type: % cpansign -v It will check each file's integrity, as well as the signature's validity. If "==> Signature verified OK! <==" is not displayed, the distribution may already have been compromised, and you should not run its Makefile.PL or Build.PL. -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 SHA1 ea2e6812366c47c5312b6672033b2d84c3b3ffff Build.PL SHA1 ac82cfd56d01c843beb99c815a256575d6f1ed5a CHANGES SHA1 1ac5f7a9ea07efdbb4ca6296f656ed30979c8bbc MANIFEST SHA1 27163ccd34a725233fa6fb811b481008fb4b469f META.yml SHA1 9fac6f034ce9889fcc0916351df871264de7b8f8 Makefile.PL SHA1 1600febcc1f79ce28e874ac1adeb100a81ec4c50 lib/Wiki/Toolkit/Plugin/JSON.pm SHA1 ff1b0bda7a7dc4ada8f3ab8189c5a4f0f86a422f t/001_load.t -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux) iD8DBQFJBELbYzuFKFF44qURAqqtAKDO7h4mMAeX4DDb3azUPyQUkbtoUACeLwz8 pKEHR1uPh9/eBbnQZY+s014= =UScx -----END PGP SIGNATURE----- Wiki-Toolkit-Plugin-JSON-0.03/META.yml0000444000175000017500000000073611101041333015345 0ustar domdom--- name: Wiki-Toolkit-Plugin-JSON version: 0.03 author: [] abstract: A Wiki::Toolkit plugin to output RecentChanges JSON. license: perl resources: license: http://dev.perl.org/licenses/ requires: JSON: 0 Time::Piece: 0 URI::Escape: 0 provides: Wiki::Toolkit::Plugin::JSON: file: lib/Wiki/Toolkit/Plugin/JSON.pm version: 0.03 generated_by: Module::Build version 0.280801 meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.2.html version: 1.2 Wiki-Toolkit-Plugin-JSON-0.03/MANIFEST0000444000175000017500000000020511101041333015214 0ustar domdomBuild.PL CHANGES lib/Wiki/Toolkit/Plugin/JSON.pm MANIFEST Makefile.PL META.yml t/001_load.t SIGNATURE Added here by Module::Build Wiki-Toolkit-Plugin-JSON-0.03/CHANGES0000444000175000017500000000046311101041333015064 0ustar domdom2008-10-26: 0.03 * Add missing prerequisites 2008-10-24: 0.02 * Fix URL below * Update copyright * Add minimal test suite with use_ok 2008-10-18: 0.01 * Initial release, taken from http://dev.openguides.org/attachment/ticket/154/ Wiki-Toolkit-Plugin-JSON-0.03/t/0002755000175000017500000000000011101041333014335 5ustar domdomWiki-Toolkit-Plugin-JSON-0.03/t/001_load.t0000444000175000017500000000010511101041333016011 0ustar domdomuse Test::More tests => 1; use_ok( "Wiki::Toolkit::Plugin::JSON" ); Wiki-Toolkit-Plugin-JSON-0.03/Makefile.PL0000444000175000017500000000160211101041333016037 0ustar domdom unless (eval "use Module::Build::Compat 0.02; 1" ) { print "This module requires Module::Build to install itself.\n"; require ExtUtils::MakeMaker; my $yn = ExtUtils::MakeMaker::prompt (' Install Module::Build now from CPAN?', 'y'); unless ($yn =~ /^y/i) { warn " *** Cannot install without Module::Build. Exiting ...\n"; exit 1; } require Cwd; require File::Spec; require CPAN; # Save this 'cause CPAN will chdir all over the place. my $cwd = Cwd::cwd(); my $makefile = File::Spec->rel2abs($0); CPAN::Shell->install('Module::Build::Compat'); chdir $cwd or die "Cannot chdir() back to $cwd: $!"; exec $^X, $makefile, @ARGV; # Redo now that we have Module::Build } Module::Build::Compat->run_build_pl(args => \@ARGV); Module::Build::Compat->write_makefile();Wiki-Toolkit-Plugin-JSON-0.03/lib/0002755000175000017500000000000011101041333014640 5ustar domdomWiki-Toolkit-Plugin-JSON-0.03/lib/Wiki/0002755000175000017500000000000011101041333015543 5ustar domdomWiki-Toolkit-Plugin-JSON-0.03/lib/Wiki/Toolkit/0002755000175000017500000000000011101041333017170 5ustar domdomWiki-Toolkit-Plugin-JSON-0.03/lib/Wiki/Toolkit/Plugin/0002755000175000017500000000000011101041333020426 5ustar domdomWiki-Toolkit-Plugin-JSON-0.03/lib/Wiki/Toolkit/Plugin/JSON.pm0000444000175000017500000002214411101041333021534 0ustar domdompackage Wiki::Toolkit::Plugin::JSON; use strict; use vars qw( $VERSION ); $VERSION = '0.03'; use POSIX 'strftime'; use Time::Piece; use URI::Escape; use Carp qw( croak ); BEGIN { require constant; eval { require JSON::Syck; JSON::Syck->import(); }; unless ($@) { constant->import( JSON_SYCK => 1 ); } else { eval { require JSON; JSON->import() }; die "Couldn't find a JSON Package, install JSON::Syck or JSON" if $@; constant->import( JSON_SYCK => 0 ); } } sub new { my $class = shift; my $self = {@_}; bless $self, $class; unless ( $self->{wiki} && UNIVERSAL::isa( $self->{wiki}, 'Wiki::Toolkit' ) ) { croak 'No Wiki::Toolkit object supplied'; } # Mandatory arguments. foreach my $arg (qw/site_name site_url make_node_url recent_changes_link/) { croak "No $arg supplied" unless $self->{$arg}; } $self->{timestamp_fmt} = $Wiki::Toolkit::Store::Database::timestamp_fmt; $self->{utc_offset} = strftime "%z", localtime; $self->{utc_offset} =~ s/(..)(..)$/$1:$2/; return $self; } sub recent_changes { my ( $self, %args ) = @_; my $wiki = $self->{wiki}; # If we're not passed any parameters to limit the items returned, default to 15. my %criteria = ( ignore_case => 1, ); if ( $args{days} ) { $criteria{days} = $args{days}; } else { $criteria{last_n_changes} = $args{items} || 15; } if ( $args{ignore_minor_edits} ) { $criteria{metadata_wasnt} = { major_change => 0 }; } if ( $args{filter_on_metadata} ) { $criteria{metadata_was} = $args{filter_on_metadata}; } my @changes = $wiki->list_recent_changes(%criteria); foreach my $change (@changes) { $change->{timestamp} = $change->{last_modified}; # Make a Time::Piece object. my $time = Time::Piece->strptime( $change->{timestamp}, $self->{timestamp_fmt} ); my $utc_offset = $self->{utc_offset}; $change->{timestamp} = $time->strftime("%Y-%m-%dT%H:%M:%S$utc_offset"); $change->{author} = $change->{metadata}{username}[0] || $change->{metadata}{host}[0] || ''; $change->{description} = $change->{metadata}{comment}[0] || ''; $change->{status} = ( 1 == $change->{version} ) ? 'new' : 'updated'; $change->{major_change} = $change->{metadata}{major_change}[0]; $change->{major_change} = 1 unless defined $change->{major_change}; $change->{importance} = $change->{major_change} ? 'major' : 'minor'; $change->{url} = $self->{make_node_url}->( $change->{name}, $change->{version} ); if ( $self->{make_diff_url} ) { $change->{diff_url} = $self->{make_diff_url}->( $change->{name} ); } if ( $self->{make_history_url} ) { $change->{history_url} = $self->{make_history_url}->( $change->{name} ); } my $change->{node_url} = $self->{make_node_url}->( $change->{name} ); my $rdf_url = $change->{node_url}; $rdf_url =~ s/\?/\?id=/; $rdf_url .= ';format=rdf'; $change->{rdf_url} = $rdf_url; # make XML-clean my $title = $change->{name}; $title =~ s/&/&/g; $title =~ s//>/g; $change->{title} = $title; } return $self->make_json( \@changes ); } sub make_json { my ( $self, $data ) = @_; if (JSON_SYCK) { return JSON::Syck::Dump($data); } else { return JSON::objToJson($data); } } 1; __END__ =head1 NAME Wiki::Toolkit::Plugin::JSON - A Wiki::Toolkit plugin to output RecentChanges JSON. =head1 DESCRIPTION This is an alternative access to the recent changes of a Wiki::Toolkit wiki. It outputs JSON. =head1 SYNOPSIS use Wiki::Toolkit; use Wiki::Toolkit::Plugin::JSON; my $wiki = Wiki::Toolkit->new( ... ); # See perldoc Wiki::Toolkit # Set up the JSON feeder with the mandatory arguments - see # C below for more, optional, arguments. my $json = Wiki::Toolkit::Plugin::JSON->new( wiki => $wiki, site_name => 'My Wiki', site_url => 'http://example.com/', make_node_url => sub { my ($node_name, $version) = @_; return 'http://example.com/?id=' . uri_escape($node_name) . ';version=' . uri_escape($version); }, recent_changes_link => 'http://example.com/?RecentChanges', ); print "Content-type: application/xml\n\n"; print $json->recent_changes; =head1 METHODS =head2 C my $json = Wiki::Toolkit::Plugin::JSON->new( # Mandatory arguments: wiki => $wiki, site_name => 'My Wiki', site_url => 'http://example.com/', make_node_url => sub { my ($node_name, $version) = @_; return 'http://example.com/?id=' . uri_escape($node_name) . ';version=' . uri_escape($version); }, recent_changes_link => 'http://example.com/?RecentChanges', # Optional arguments: site_description => 'My wiki about my stuff', interwiki_identifier => 'MyWiki', make_diff_url => sub { my $node_name = shift; return 'http://example.com/?diff=' . uri_escape($node_name) }, make_history_url => sub { my $node_name = shift; return 'http://example.com/?hist=' . uri_escape($node_name) }, ); C must be a L object. C, and C and C, if supplied, must be coderefs. The mandatory arguments are: =over 4 =item * wiki =item * site_name =item * site_url =item * make_node_url =item * recent_changes_link =back =head2 C $wiki->write_node( 'About This Wiki', 'blah blah blah', $checksum, { comment => 'Stub page, please update!', username => 'Fred', } ); print "Content-type: application/xml\n\n"; print $json->recent_changes; # Or get something other than the default of the latest 15 changes. print $json->recent_changes( items => 50 ); print $json->recent_changes( days => 7 ); # Or ignore minor edits. print $json->recent_changes( ignore_minor_edits => 1 ); # Personalise your feed further - consider only changes # made by Fred to pages about bookshops. print $json->recent_changes( filter_on_metadata => { username => 'Fred', category => 'Bookshops', }, ); If using C, note that only changes satisfying I criteria will be returned. B Many of the fields emitted by the JSON generator are taken from the node metadata. The form of this metadata is I mandated by L. Your wiki application should make sure to store some or all of the following metadata when calling C: =over 4 =item B - a brief comment summarising the edit that has just been made. Defaults to the empty string. =item B - an identifier for the person who made the edit; will be used as the Dublin Core contributor for this item. Defaults to the empty string. =item B - the hostname or IP address of the computer used to make the edit; if no username is supplied then this will be used as the Dublin Core contributor for this item. Defaults to the empty string. =item B - true if the edit was a major edit and false if it was a minor edit; used for the importance of the item. Defaults to true (ie if C was not defined or was explicitly stored as C). =back =head2 C print $json->rss_timestamp(); Returns the timestamp of the feed in POSIX::strftime style ("Tue, 29 Feb 2000 12:34:56 GMT"), which is equivalent to the timestamp of the most recent item in the feed. Takes the same arguments as recent_changes(). You will most likely need this to print a Last-Modified HTTP header so user-agents can determine whether they need to reload the feed or not. =head1 SEE ALSO =over 4 =item * L =item * L =item * L =back =head1 MAINTAINER Earle Martin . Originally by Kake Pugh . =head1 COPYRIGHT AND LICENSE Copyright 2003-4 Kake Pugh. Subsequent modifications copyright 2005 Earle Martin. Copyright 2008 the Wiki::Toolkit team This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 THANKS The members of the Semantic Web Interest Group channel on irc.freenode.net, #swig, were very useful in the development of this module. =cut Wiki-Toolkit-Plugin-JSON-0.03/Build.PL0000444000175000017500000000063411101041333015365 0ustar domdom#!/usr/bin/perl use strict; use Module::Build; Module::Build->new( module_name => 'Wiki::Toolkit::Plugin::JSON', requires => { 'JSON' => 0, 'Time::Piece' => 0, 'URI::Escape' => 0, }, license => 'perl', sign => 1, dist_abstract => 'A Wiki::Toolkit plugin to output RecentChanges JSON.', )->create_build_script;