Changeset 1741
- Timestamp:
- 10/13/06 16:42:23
- Files:
-
- trunk/plagger (modified) (previous)
- trunk/plagger/Makefile.PL (modified) (1 diff)
- trunk/plagger/deps/Summary-Auto.yaml (added)
- trunk/plagger/deps/Summary-English.yaml (added)
- trunk/plagger/deps/Summary-HatenaBookmark.yaml (added)
- trunk/plagger/deps/Summary-Simple.yaml (added)
- trunk/plagger/deps/Summary-TextOriginal.yaml (added)
- trunk/plagger/deps/Summary-TrackbackRDF.yaml (added)
- trunk/plagger/lib/Plagger.pm (modified) (3 diffs)
- trunk/plagger/lib/Plagger/Entry.pm (modified) (2 diffs)
- trunk/plagger/lib/Plagger/Feed.pm (modified) (3 diffs)
- trunk/plagger/lib/Plagger/FeedParser.pm (modified) (2 diffs)
- trunk/plagger/lib/Plagger/Plugin/Aggregator/Simple.pm (modified) (4 diffs)
- trunk/plagger/lib/Plagger/Plugin/CustomFeed/Script.pm (modified) (2 diffs)
- trunk/plagger/lib/Plagger/Plugin/Filter/Babelfish.pm (modified) (1 diff)
- trunk/plagger/lib/Plagger/Plugin/Filter/EntryFullText.pm (modified) (3 diffs)
- trunk/plagger/lib/Plagger/Plugin/Filter/FindEnclosures.pm (modified) (2 diffs)
- trunk/plagger/lib/Plagger/Plugin/Filter/GuessLanguage.pm (modified) (2 diffs)
- trunk/plagger/lib/Plagger/Plugin/Filter/HTMLScrubber.pm (modified) (2 diffs)
- trunk/plagger/lib/Plagger/Plugin/Filter/StripRSSAd.pm (modified) (1 diff)
- trunk/plagger/lib/Plagger/Plugin/Filter/StripTagsFromTitle.pm (modified) (1 diff)
- trunk/plagger/lib/Plagger/Plugin/Publish/Feed.pm (modified) (1 diff)
- trunk/plagger/lib/Plagger/Plugin/Search/Estraier.pm (modified) (1 diff)
- trunk/plagger/lib/Plagger/Plugin/Search/Grep.pm (modified) (1 diff)
- trunk/plagger/lib/Plagger/Plugin/Summary (added)
- trunk/plagger/lib/Plagger/Plugin/Summary/Auto.pm (added)
- trunk/plagger/lib/Plagger/Plugin/Summary/English.pm (added)
- trunk/plagger/lib/Plagger/Plugin/Summary/HatenaBookmark.pm (added)
- trunk/plagger/lib/Plagger/Plugin/Summary/Simple.pm (added)
- trunk/plagger/lib/Plagger/Plugin/Summary/TextOriginal.pm (added)
- trunk/plagger/lib/Plagger/Plugin/Summary/TrackbackRDF.pm (added)
- trunk/plagger/lib/Plagger/Plugin/Widget/Simple.pm (modified) (1 diff)
- trunk/plagger/lib/Plagger/Text.pm (added)
- trunk/plagger/lib/Plagger/Thing.pm (modified) (2 diffs)
- trunk/plagger/lib/Plagger/Util.pm (modified) (3 diffs)
- trunk/plagger/t/99-pod-spell.t (modified) (6 diffs)
- trunk/plagger/t/TestPlagger.pm (modified) (1 diff)
- trunk/plagger/t/core/atom-type.t (added)
- trunk/plagger/t/core/cache.t (modified) (1 diff)
- trunk/plagger/t/core/feed-language.t (added)
- trunk/plagger/t/core/plaintext.t (added)
- trunk/plagger/t/core/text.t (added)
- trunk/plagger/t/core/title_text.t (added)
- trunk/plagger/t/core/unicode.t (modified) (1 diff)
- trunk/plagger/t/plugins/Filter-EntryFullText/force.t (added)
- trunk/plagger/t/plugins/Filter-EntryFullText/summary.t (added)
- trunk/plagger/t/plugins/Filter-GuessLanguage/guesslanguage.t (modified) (3 diffs)
- trunk/plagger/t/plugins/Filter-HTMLScrubber/base.t (modified) (2 diffs)
- trunk/plagger/t/plugins/Publish-Feed/fullcontent.t (modified) (1 diff)
- trunk/plagger/t/plugins/Summary-Auto (added)
- trunk/plagger/t/plugins/Summary-Auto/base.t (added)
- trunk/plagger/t/plugins/Summary-Auto/eft.t (added)
- trunk/plagger/t/plugins/Summary-English (added)
- trunk/plagger/t/plugins/Summary-English/base.t (added)
- trunk/plagger/t/plugins/Summary-HatenaBookmark (added)
- trunk/plagger/t/plugins/Summary-HatenaBookmark/base.t (added)
- trunk/plagger/t/plugins/Summary-Simple (added)
- trunk/plagger/t/plugins/Summary-Simple/base.t (added)
- trunk/plagger/t/plugins/Summary-TextOriginal (added)
- trunk/plagger/t/plugins/Summary-TextOriginal/base.t (added)
- trunk/plagger/t/plugins/Summary-TrackbackRDF (added)
- trunk/plagger/t/plugins/Summary-TrackbackRDF/base.t (added)
- trunk/plagger/t/samples/atom-type.xml (added)
- trunk/plagger/t/samples/atom10-example.xml (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/plagger/Makefile.PL
r1732 r1741 65 65 recommends('HTML::TreeBuilder::XPath'), 66 66 ], 67 'Better html to text formatter' => [ 68 -default => 1, 69 recommends('HTML::TreeBuilder'), 70 recommends('HTML::FormatText'), 71 ], 67 72 ); 68 73 trunk/plagger/lib/Plagger.pm
r1729 r1741 197 197 sub autoload_plugin { 198 198 my($self, $plugin) = @_; 199 unless ($self->is_loaded($plugin )) {200 $self->load_plugin( { module => $plugin });199 unless ($self->is_loaded($plugin->{module})) { 200 $self->load_plugin($plugin); 201 201 } 202 202 } … … 274 274 } 275 275 276 return if $once; 276 277 return @ret; 277 278 } … … 291 292 $self->load_plugin({ module => 'Aggregator::Simple' }); 292 293 } 294 $self->autoload_plugin({ module => 'Summary::Auto' }); 295 $self->autoload_plugin({ module => 'Summary::Simple' }); 293 296 294 297 for my $feed ($self->subscription->feeds) { trunk/plagger/lib/Plagger/Entry.pm
r1668 r1741 3 3 4 4 use base qw( Plagger::Thing ); 5 __PACKAGE__->mk_accessors(qw( title author tags link feed_link summary body rate icon meta source )); 5 __PACKAGE__->mk_accessors(qw( tags link feed_link rate icon meta source language )); 6 __PACKAGE__->mk_text_accessors(qw( title author summary body )); 6 7 __PACKAGE__->mk_date_accessors(qw( date )); 7 8 … … 65 66 sub title_text { 66 67 my $self = shift; 67 Plagger::Util::strip_html($self->title);68 $self->title ? $self->title->plaintext : undef; 68 69 } 69 70 70 71 sub body_text { 71 72 my $self = shift; 72 Plagger::Util::strip_html($self->body || '');73 $self->body ? $self->body->plaintext : undef; 73 74 } 74 75 trunk/plagger/lib/Plagger/Feed.pm
r1668 r1741 3 3 4 4 use base qw( Plagger::Thing ); 5 __PACKAGE__->mk_accessors(qw( link url image description language author tags meta type source_xml aggregator )); 5 __PACKAGE__->mk_accessors(qw( link url image language tags meta type source_xml aggregator )); 6 __PACKAGE__->mk_text_accessors(qw( description author title )); 6 7 __PACKAGE__->mk_date_accessors(qw( updated )); 7 8 … … 42 43 } 43 44 44 sub title {45 my $self = shift;46 if (@_) {47 my $title = shift;48 utf8::decode($title) unless utf8::is_utf8($title);49 $self->{title} = $title;50 }51 $self->{title};52 }53 54 45 sub id { 55 46 my $self = shift; … … 65 56 sub title_text { 66 57 my $self = shift; 67 Plagger::Util::strip_html($self->title);58 $self->title ? $self->title->plaintext : undef; 68 59 } 69 60 trunk/plagger/lib/Plagger/FeedParser.pm
r1492 r1741 3 3 4 4 use Feed::Find; 5 use XML::Atom; 5 6 use XML::Feed; 6 7 use XML::Feed::RSS; 7 8 $XML::Feed::RSS::PREFERRED_PARSER = "XML::RSS::LibXML"; 9 $XML::Atom::ForceUnicode = 1; 8 10 9 11 use Plagger::Util; … … 20 22 } 21 23 22 local $XML::Atom::ForceUnicode = 1;23 24 my $remote = eval { XML::Feed->parse($content_ref) } 24 25 or Carp::croak("Parsing content failed: " . ($@ || XML::Feed->errstr)); trunk/plagger/lib/Plagger/Plugin/Aggregator/Simple.pm
r1686 r1741 7 7 use Plagger::FeedParser; 8 8 use Plagger::UserAgent; 9 use Plagger::Text; 9 10 use List::Util qw(first); 10 11 use UNIVERSAL::require; … … 135 136 $entry->feed_link($feed->link); 136 137 $entry->id($e->id); 137 $entry->body(_u($e->content->body || $e->summary->body)); 138 139 my $content = feed_to_text($e, $e->content); 140 my $summary = feed_to_text($e, $e->summary); 141 $entry->body($content || $summary); 142 $entry->summary($summary) if $summary; 143 144 # per-entry level language support in Atom 145 if ($remote->format eq 'Atom' && $e->{entry}->content && $e->{entry}->content->lang) { 146 $entry->language($e->{entry}->content->lang); 147 } 138 148 139 149 # enclosure support, to be added to XML::Feed … … 165 175 166 176 # TODO: move MediaRSS, Hatena, iTunes and those specific parser to be subclassed 167 168 # Media RSS 169 my $media_ns = "http://search.yahoo.com/mrss"; 170 my $media = $e->{entry}->{$media_ns}->{group} || $e->{entry}; 171 my $content = $media->{$media_ns}->{content} || []; 172 $content = [ $content ] unless ref $content && ref $content eq 'ARRAY'; 173 174 for my $media_content (@{$content}) { 175 my $enclosure = Plagger::Enclosure->new; 176 $enclosure->url( URI->new($media_content->{url}) ); 177 $enclosure->auto_set_type($media_content->{type}); 178 $entry->add_enclosure($enclosure); 179 } 180 181 if (my $thumbnail = $media->{$media_ns}->{thumbnail}) { 182 $entry->icon({ 183 url => $thumbnail->{url}, 184 width => $thumbnail->{width}, 185 height => $thumbnail->{height}, 186 }); 187 } 188 189 # Hatena Image extensions 190 my $hatena = $e->{entry}->{"http://www.hatena.ne.jp/info/xmlns#"} || {}; 191 if ($hatena->{imageurl}) { 192 my $enclosure = Plagger::Enclosure->new; 193 $enclosure->url($hatena->{imageurl}); 194 $enclosure->auto_set_type; 195 $entry->add_enclosure($enclosure); 196 } 197 198 if ($hatena->{imageurlsmall}) { 199 $entry->icon({ url => $hatena->{imageurlsmall} }); 200 } 201 202 # Apple photocast feed 203 my $apple = $e->{entry}->{"http://www.apple.com/ilife/wallpapers"} || {}; 204 if ($apple->{image}) { 205 my $enclosure = Plagger::Enclosure->new; 206 $enclosure->url( URI->new($apple->{image}) ); 207 $enclosure->auto_set_type; 208 $entry->add_enclosure($enclosure); 209 } 210 if ($apple->{thumbnail}) { 211 $entry->icon({ url => $apple->{thumbnail} }); 212 } 177 $self->handle_media_rss($entry, $e); 178 $self->handle_hatena_image($entry, $e); 179 $self->handle_apple_photocast($entry, $e); 213 180 214 181 my $args = { … … 227 194 } 228 195 196 sub handle_media_rss { 197 my($self, $entry, $e) = @_; 198 199 my $media_ns = "http://search.yahoo.com/mrss"; 200 my $media = $e->{entry}->{$media_ns}->{group} || $e->{entry}; 201 my $content = $media->{$media_ns}->{content} || []; 202 $content = [ $content ] unless ref $content && ref $content eq 'ARRAY'; 203 204 for my $media_content (@{$content}) { 205 my $enclosure = Plagger::Enclosure->new; 206 $enclosure->url( URI->new($media_content->{url}) ); 207 $enclosure->auto_set_type($media_content->{type}); 208 $entry->add_enclosure($enclosure); 209 } 210 211 if (my $thumbnail = $media->{$media_ns}->{thumbnail}) { 212 $entry->icon({ 213 url => $thumbnail->{url}, 214 width => $thumbnail->{width}, 215 height => $thumbnail->{height}, 216 }); 217 } 218 } 219 220 sub handle_hatena_image { 221 my($self, $entry, $e) = @_; 222 223 # Hatena Image extensions 224 my $hatena = $e->{entry}->{"http://www.hatena.ne.jp/info/xmlns#"} || {}; 225 if ($hatena->{imageurl}) { 226 my $enclosure = Plagger::Enclosure->new; 227 $enclosure->url($hatena->{imageurl}); 228 $enclosure->auto_set_type; 229 $entry->add_enclosure($enclosure); 230 } 231 232 if ($hatena->{imageurlsmall}) { 233 $entry->icon({ url => $hatena->{imageurlsmall} }); 234 } 235 } 236 237 sub handle_apple_photocast { 238 my($self, $entry, $e) = @_; 239 240 my $apple = $e->{entry}->{"http://www.apple.com/ilife/wallpapers"} || {}; 241 if ($apple->{image}) { 242 my $enclosure = Plagger::Enclosure->new; 243 $enclosure->url( URI->new($apple->{image}) ); 244 $enclosure->auto_set_type; 245 $entry->add_enclosure($enclosure); 246 } 247 if ($apple->{thumbnail}) { 248 $entry->icon({ url => $apple->{thumbnail} }); 249 } 250 } 251 252 sub feed_to_text { 253 my($e, $content) = @_; 254 return unless $content->body; 255 256 if (ref($e) eq 'XML::Feed::Entry::Atom') { 257 # in Atom, be a little strict with TextConstruct 258 # TODO: this actually doesn't work since XML::Feed and XML::Atom does the right 259 # thing with Atom 1.0 TextConstruct 260 if ($content->type eq 'text/plain' || $content->type eq 'text') { 261 return Plagger::Text->new(type => 'text', data => $content->body); 262 } else { 263 return Plagger::Text->new(type => 'html', data => $content->body); 264 } 265 } elsif (ref($e) eq 'XML::Feed::Entry::RSS') { 266 # in RSS there's no explicit way to declare the type. Just guess it 267 return Plagger::Text->new_from_text($content->body); 268 } else { 269 die "Something is wrong: $e"; 270 } 271 } 272 229 273 sub _u { 230 274 my $str = shift; trunk/plagger/lib/Plagger/Plugin/CustomFeed/Script.pm
r1719 r1741 1 1 package Plagger::Plugin::CustomFeed::Script; 2 2 use strict; 3 use base qw( Plagger::Plugin );3 use base qw( Plagger::Plugin::Aggregator::Simple ); 4 4 5 5 use URI; … … 46 46 if ($output =~ /^<\?xml/) { 47 47 $context->log(debug => "Looks like output is RSS/Atom"); 48 $self-> Plagger::Plugin::Aggregator::Simple::handle_feed($args->{feed}->url, \$output, $args->{feed});48 $self->SUPER::handle_feed($args->{feed}->url, \$output, $args->{feed}); 49 49 } else { 50 50 eval { trunk/plagger/lib/Plagger/Plugin/Filter/Babelfish.pm
r1734 r1741 13 13 my($self, $context) = @_; 14 14 15 $context->autoload_plugin( 'Filter::GuessLanguage');15 $context->autoload_plugin({ module => 'Filter::GuessLanguage' }); 16 16 $context->register_hook( 17 17 $self, trunk/plagger/lib/Plagger/Plugin/Filter/EntryFullText.pm
r1686 r1741 96 96 97 97 my $handler = first { $_->handle_force($args) } @{ $self->{plugins} }; 98 if ( !$handler && $args->{entry}->body && $args->{entry}->body =~ /<\w+>/&& !$self->conf->{force_upgrade} ) {98 if ( !$handler && $args->{entry}->body && $args->{entry}->body->is_html && !$self->conf->{force_upgrade} ) { 99 99 $self->log(debug => $args->{entry}->link . " already contains body. Skipped"); 100 100 return; … … 139 139 $context->log(info => "Extract content succeeded on " . $args->{entry}->permalink); 140 140 my $resolver = HTML::ResolveLink->new( base => $args->{entry}->permalink ); 141 142 # if body was already there, set that to summary 143 if ($args->{entry}->body) { 144 $args->{entry}->summary($args->{entry}->body); 145 } 146 141 147 $data->{body} = $resolver->resolve( $data->{body} ); 142 148 $args->{entry}->body($data->{body}); … … 144 150 $args->{entry}->author($data->{author}) if $data->{author}; 145 151 $args->{entry}->icon({ url => $data->{icon} }) if $data->{icon}; 152 $args->{entry}->summary($data->{summary}) if $data->{summary}; 146 153 147 154 # extract date using found one trunk/plagger/lib/Plagger/Plugin/Filter/FindEnclosures.pm
r1606 r1741 14 14 my($self, $context) = @_; 15 15 16 $context->autoload_plugin( 'Filter::ResolveRelativeLink');16 $context->autoload_plugin({ module => 'Filter::ResolveRelativeLink' }); 17 17 $context->register_hook( 18 18 $self, … … 82 82 $self->add_enclosure($args->{entry}, [ 'a', { href => $args->{entry}->permalink } ], 'href' ); 83 83 84 my $parser = HTML::TokeParser->new(\$args->{entry}->body); 84 return unless $args->{entry}->body; 85 86 my $parser = HTML::TokeParser->new(\$args->{entry}->body->data); 85 87 while (my $tag = $parser->get_tag('a', 'embed', 'img', 'object')) { 86 88 if ($tag->[0] eq 'a' ) { trunk/plagger/lib/Plagger/Plugin/Filter/GuessLanguage.pm
r1249 r1741 121 121 my ($self, $context, $args) = @_; 122 122 123 return $args->{entry}-> {language} if $args->{entry}->{language};123 return $args->{entry}->language if $args->{entry}->language; 124 124 125 125 $context->log(debug => "start guessing entry's language"); … … 129 129 if ($code) { 130 130 $context->log(debug => "guessed: $code"); 131 $args->{entry}-> {language} = $code;131 $args->{entry}->language($code); 132 132 return $code; 133 133 } trunk/plagger/lib/Plagger/Plugin/Filter/HTMLScrubber.pm
r1734 r1741 53 53 my ( $self, $context ) = @_; 54 54 55 $context->register_hook( $self, 'update.entry.fixup' => \&update, ); 55 $context->register_hook( 56 $self, 57 'update.entry.fixup' => \&update, 58 'plugin.init' => \&initialize, 59 ); 60 } 61 62 sub initialize { 63 my($self, $context, $args) = @_; 56 64 57 65 $self->{scrubber} = do { … … 84 92 my ( $self, $context, $args ) = @_; 85 93 86 if (defined $args->{entry}->body) { 94 if (defined $args->{entry}->body && $args->{entry}->body->is_html) { 95 $context->log(debug => "Scrubbing body for" . $args->{entry}->permalink || '(no-link)'); 87 96 my $body = $self->{scrubber}->scrub( $args->{entry}->body ); 88 97 $args->{entry}->body($body); trunk/plagger/lib/Plagger/Plugin/Filter/StripRSSAd.pm
r1594 r1741 8 8 my $self = shift; 9 9 $self->SUPER::init(@_); 10 Plagger->context->autoload_plugin( 'Filter::BloglinesContentNormalize');10 Plagger->context->autoload_plugin({ module => 'Filter::BloglinesContentNormalize' }); 11 11 12 12 $self->load_assets('*.yaml', sub { $self->load_yaml(@_) }); trunk/plagger/lib/Plagger/Plugin/Filter/StripTagsFromTitle.pm
r1173 r1741 15 15 sub filter { 16 16 my($self, $context, $args) = @_; 17 if (defined $args->{entry}->title ) {17 if (defined $args->{entry}->title && $args->{entry}->title->is_html) { 18 18 $args->{entry}->title( Plagger::Util::strip_html($args->{entry}->title) ); 19 19 } trunk/plagger/lib/Plagger/Plugin/Publish/Feed.pm
r1734 r1741 13 13 sub register { 14 14 my($self, $context) = @_; 15 $context->autoload_plugin( 'Filter::FloatingDateTime');15 $context->autoload_plugin({ module => 'Filter::FloatingDateTime' }); 16 16 $context->register_hook( 17 17 $self, trunk/plagger/lib/Plagger/Plugin/Search/Estraier.pm
r1391 r1741 42 42 my $doc = Search::Estraier::Document->new; 43 43 $doc->add_attr('@uri' => $args->{entry}->permalink); 44 $doc->add_attr('@title' => _u($args->{entry}->title));44 $doc->add_attr('@title' => $args->{entry}->title->utf8); 45 45 $doc->add_attr('@cdate' => $args->{entry}->date->format('W3CDTF')) if $args->{entry}->date; 46 $doc->add_attr('@author' => _u($args->{entry}->author)) if $args->{entry}->author;46 $doc->add_attr('@author' => $args->{entry}->author->utf8) if $args->{entry}->author; 47 47 48 $doc->add_text( _u($args->{entry}->body_text));49 $doc->add_hidden_text( _u($args->{entry}->title));48 $doc->add_text($args->{entry}->body->utf8); 49 $doc->add_hidden_text($args->{entry}->title->utf8); 50 50 51 51 $doc->add_attr('@id' => $id) if $id; # update mode trunk/plagger/lib/Plagger/Plugin/Search/Grep.pm
r1670 r1741 41 41 $config->{$id} = { 42 42 link => $entry->link, 43 author => _u($entry->author ),43 author => _u($entry->author || ''), 44 44 date => $entry->date ? $entry->date->format('W3CDTF') : '', 45 title => _u($entry->title ),46 body => _u($entry-> summary) || '',45 title => _u($entry->title->plaintext), 46 body => _u($entry->body->plaintext) || '', 47 47 }; 48 48 trunk/plagger/lib/Plagger/Plugin/Widget/Simple.pm
r1734 r1741 59 59 $string = eval $string; 60 60 Plagger->context->log(error => $@) if $@; 61 62 $string = "$string"; # stringify ::Content 61 63 utf8::encode($string) if utf8::is_utf8($string); 62 64 } trunk/plagger/lib/Plagger/Thing.pm
r1024 r1741 2 2 use strict; 3 3 use base qw( Class::Accessor::Fast ); 4 5 use Plagger::Text; 6 use Scalar::Util qw(blessed); 4 7 5 8 sub has_tag { … … 43 46 } 44 47 48 sub mk_text_accessors { 49 my $class = shift; 50 for my $key (@_) { 51 no strict 'refs'; 52 *{"$class\::$key"} = sub { 53 my $obj = shift; 54 if (@_) { 55 my $text = $_[0]; 56 unless ( blessed($text) && $text->isa('Plagger::Text') ) { 57 $text = Plagger::Text->new_from_text($text); 58 } 59 $obj->{$key} = $text; 60 } else { 61 return $obj->{$key}; 62 } 63 }; 64 } 65 } 66 45 67 1; trunk/plagger/lib/Plagger/Util.pm
r1668 r1741 7 7 use List::Util qw(min); 8 8 use HTML::Entities; 9 use HTML::Tagset; 9 10 use MIME::Types; 10 11 use MIME::Type; 12 use Plagger::Text; 11 13 12 14 our $Detector; … … 26 28 sub strip_html { 27 29 my $html = shift; 28 $html =~ s/<[^>]*>//g; 29 HTML::Entities::decode($html); 30 31 eval { 32 require HTML::FormatText; 33 require HTML::TreeBuilder; 34 }; 35 36 if ($@) { 37 # dump stripper 38 $html =~ s/<[^>]*>//g; 39 return HTML::Entities::decode($html); 40 } 41 42 my $tree = HTML::TreeBuilder->new; 43 $tree->parse($html); 44 $tree->eof; 45 46 my $formatter = HTML::FormatText->new(leftmargin => 0); 47 my $text = $formatter->format($tree); 48 # utf8::decode($text); 49 $text =~ s/\s*$//s; 50 $text; 30 51 } 31 52 … … 157 178 '<' => '<', 158 179 '>' => '>', 159 "'" => '"', 180 '"' => '"', 181 "'" => ''', 160 182 ); 161 183 trunk/plagger/t/99-pod-spell.t
r1734 r1741 8 8 9 9 use FindBin; 10 use Test::More;11 10 use Test::Spelling; 12 11 … … 40 39 CDTF 41 40 CONFIGS 41 CPAN 42 42 CSV 43 43 CVS … … 149 149 al 150 150 ascii 151 atomfeed 151 152 authen 152 153 autodiscovery … … 183 184 exe 184 185 extendedPing 186 fallbacks 185 187 feedburner's 186 188 foaf … … 208 210 irc 209 211 ircbot 212 ized 210 213 ja 211 214 javascript … … 283 286 xul 284 287 yaml 288 plaintext 289 Trackback trunk/plagger/t/TestPlagger.pm
r1722 r1741 316 316 my $stuff = shift; 317 317 318 # interp ertin $foo::bar to their values in the string318 # interpolate in $foo::bar to their values in the string 319 319 # (but not \$foo::bar) 320 $stuff =~ s/(?<!\\) # check there's no backslash before this321 (\$[\w\:]+ ) # look for a $var possibly with packages322 /$1/eegx; # replace it with its value320 $stuff =~ s/(?<!\\) # check there's no backslash before this 321 (\$[\w\:]+(?:[\{\[]\w+[\]\}])?) # look for a $var possibly with packages 322 /$1/eegx; # replace it with its value 323 323 324 324 $stuff =~ s/\\\$/\$/g; # turn the escaped \$ into $ 325 326 325 $stuff; 327 326 } trunk/plagger/t/core/cache.t
r1300 r1741 21 21 package Plagger::Plugin::Test::Cache; 22 22 use base qw( Plagger::Plugin ); 23 use Plagger::UserAgent;24 23 25 24 sub register { trunk/plagger/t/core/unicode.t
r1356 r1741 15 15 - file://$t::TestPlagger::BaseDirURI/t/samples/rss-full.xml 16 16 --- expected 17 ok utf8::is_utf8( $context->update->feeds->[0]->title );18 ok utf8::is_utf8( $context->update->feeds->[0]->description );19 ok utf8::is_utf8( $context->update->feeds->[0]->entries->[0]->title );20 ok utf8::is_utf8( $context->update->feeds->[0]->entries->[0]->body );17 ok utf8::is_utf8( $context->update->feeds->[0]->title->data ); 18 ok utf8::is_utf8( $context->update->feeds->[0]->description->data ); 19 ok utf8::is_utf8( $context->update->feeds->[0]->entries->[0]->title->data ); 20 ok utf8::is_utf8( $context->update->feeds->[0]->entries->[0]->body->data ); trunk/plagger/t/plugins/Filter-GuessLanguage/guesslanguage.t
r1483 r1741 4 4 5 5 test_plugin_deps; 6 test_requires_network;7 8 6 plan tests => 12; 9 7 … … 100 98 target: both 101 99 --- expected 102 is $context->update->feeds->[0]->entries->[0]-> {language}, 'en';103 is $context->update->feeds->[0]->entries->[1]-> {language}, 'de';104 is $context->update->feeds->[0]->entries->[2]-> {language}, 'ja';100 is $context->update->feeds->[0]->entries->[0]->language, 'en'; 101 is $context->update->feeds->[0]->entries->[1]->language, 'de'; 102 is $context->update->feeds->[0]->entries->[2]->language, 'ja'; 105 103 106 104 === Mixed atom feed without xml:lang … … 115 113 target: both 116 114 --- expected 117 is $context->update->feeds->[0]->entries->[0]-> {language}, 'en';118 is $context->update->feeds->[0]->entries->[1]-> {language}, 'de';119 is $context->update->feeds->[0]->entries->[2]-> {language}, 'ja';115 is $context->update->feeds->[0]->entries->[0]->language, 'en'; 116 is $context->update->feeds->[0]->entries->[1]->language, 'de'; 117 is $context->update->feeds->[0]->entries->[2]->language, 'ja'; trunk/plagger/t/plugins/Filter-HTMLScrubber/base.t
r1534 r1741 4 4 test_plugin_deps; 5 5 plan 'no_plan'; 6 run_eval_expected ;6 run_eval_expected_with_capture; 7 7 8 8 __END__ … … 11 11 --- input config 12 12 plugins: 13 - module: CustomFeed::Debug14 config:15 title: foo16 link: 'http://www.example.net/'17 entry:18 - title: bar19 link: 'http://www.example.net/1'20 body: |21 <script type="text/javascript">22 function pla() {23 alert("Plagger is a pluggable aggregator");24 }25 </script>26 <p>27 <a href="#" onclick="pla()">Plagger is a pluggable aggregator</a>28 </p>29 13 - module: Filter::HTMLScrubber 30 14 --- expected 31 15 ok 1, $block->name; 32 unlike $context->update->feeds->[0]->entries->[0]->body, qr!</?script .*?>!sm;33 16 17 === Simple test 18 --- input config 19 plugins: 20 - module: CustomFeed::Debug 21 config: 22 title: Foo Bar 23 entry: 24 - title: Nasty 25 body: Foo <style>bar</style> 26 - module: Filter::HTMLScrubber 27 --- expected 28 unlike $context->update->feeds->[0]->entries->[0]->body, qr!<style>bar</style>! 29 30 === Don't scrub non-HTML 31 --- input config 32 global: 33 log: 34 level: debug 35 plugins: 36 - module: CustomFeed::Debug 37 config: 38 title: Foo Bar 39 entry: 40 - title: Nasty 41 body: This is not HTML. 42 - module: Filter::HTMLScrubber 43 --- expected 44 unlike $warnings, qr/Scrubbing/; 45 46 trunk/plagger/t/plugins/Publish-Feed/fullcontent.t
r1467 r1741 32 32 --- expected 33 33 file_doesnt_contain($main::output, qr/<a href=/); 34 file_contains($main::output, qr/for\s+ http/s);34 file_contains($main::output, qr/for\s+(\*\s*)?http/s); 35 35 trunk/plagger/t/samples/atom10-example.xml
r1201 r1741 1 1 <?xml version="1.0" encoding="utf-8"?> 2 <feed xmlns="http://www.w3.org/2005/Atom" >2 <feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"> 3 3 4 4 <title>Example Feed</title> … … 18 18 </entry> 19 19 20 <entry> 21 <title>Atom-Powered Robots Run Amok</title> 22 <link href="http://example.org/2003/12/13/atom03"/> 23 <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> 24 <updated>2003-12-13T18:30:02Z</updated> 25 <summary>Some text.</summary> 26 <content type="xhtml" xml:lang="ja"> 27 <div xmlns="http://www.w3.org/1999/xhtml">foo</div> 28 </content> 29 </entry> 30 20 31 </feed>
