root/branches/hackathon-mt/MT-Plagger/MT-Plagger.pl

Revision 1273 (checked in by miyagawa, 4 years ago)

import MT-Plagger first cut

Line 
1 # Plagger plugin for Movable Type
2 # Author: Six Apart (http://www.sixapart.com)
3 # Released under the Artistic License
4 #
5 # $Id$
6
7 package MT::Plugin::Plagger;
8 use strict;
9 use MT::Plugin;
10 use base qw(MT::Plugin);
11
12 our $VERSION = 0.1;
13
14 use MT;
15 my $plugin = __PACKAGE__->new({
16     name => "MT-Plagger",
17     version => $VERSION,
18     description => "Bootstrapt Plagger process out of newly created or updated MT::Entry and MT::Blog",
19     author_name => "Six Apart, Ltd.",
20     author_link => "http://www.sixapart.com/",
21     settings => new MT::PluginSettings([
22         ['plagger_config'],
23     ]),
24     config_template => 'config.tmpl',
25 #    l10n_class => 'GoogleSearch::L10N',
26 });
27 MT->add_plugin($plugin);
28 MT->add_callback('CMSPostSave.entry', 9, $plugin, \&bootstrap_plagger);
29
30 use MT::Tag;
31 use MT::ObjectTag;
32
33 use Encode;
34 use Plagger;
35 use Plagger::Entry;
36 use Plagger::Feed;
37
38 sub bootstrap_plagger {
39     my($eh, $app, $e, $old) = @_;
40
41     return if $e->status != MT::Entry::RELEASE;
42
43     my $config = $plugin->get_config_hash('blog:' . $e->blog_id);
44     my $context = Plagger->new(config => \$config->{plagger_config});
45
46     my $blog = $e->blog;
47
48     my $feed = Plagger::Feed->new;
49     $feed->title( decode_utf8($blog->name) );
50     $feed->description( decode_utf8($blog->description) );
51     $feed->link( $blog->site_url );
52     $feed->language( $blog->language );
53     $feed->updated( MT::Util::ts2iso($e->created_on) );
54
55     my $entry = Plagger::Entry->new;
56     $entry->title( decode_utf8($e->title) );
57     $entry->author( decode_utf8($e->author->name) );
58
59     $entry->tags( _tags_for($e) );
60     $entry->link( $e->permalink );
61     $entry->summary( $e->excerpt );
62
63     $entry->body( _apply_text_filter($e, $e->text) . _apply_text_filter($e, $e->text_more) );
64     $entry->date( MT::Util::ts2iso($e->created_on) );
65
66     $feed->add_entry($entry);
67
68     $context->subscription->add($feed);
69     $context->update->add($feed);
70
71     $context->run_with_feeds;
72 }
73
74 sub _apply_text_filter {
75     my($e, $text) = @_;
76     return '' unless defined $text;
77
78     my $convert_breaks = defined $e->convert_breaks
79         ? $e->convert_breaks : $e->blog->convert_paras;
80     if ($convert_breaks) {
81         my $filters = $e->text_filters;
82         push @$filters, '__default__' unless @$filters;
83         $text = MT->apply_text_filters($text, $filters);
84     }
85
86     return $text;
87 }
88
89 sub _tags_for {
90     my $e = shift;
91
92     my @tags = MT::Tag->load(undef, {
93         sort => 'name',
94         join => [ 'MT::ObjectTag', 'tag_id', {
95             object_id => $e->id,
96             blog_id   => $e->blog_id,
97             object_datasource => MT::Entry->datasource,
98         } , {
99             unique => 1,
100         } ],
101     });
102
103     return map $_->name, @tags;
104 }
105
106 1;
Note: See TracBrowser for help on using the browser.