Changeset 1622
- Timestamp:
- 08/29/06 07:10:58
- Files:
-
- branches/hackathon-summary/plagger (modified) (previous)
- branches/hackathon-summary/plagger/Changes (modified) (1 diff)
- branches/hackathon-summary/plagger/MANIFEST (modified) (19 diffs)
- branches/hackathon-summary/plagger/Makefile.PL (modified) (4 diffs)
- branches/hackathon-summary/plagger/assets/plugins/Filter-EntryFullText/slashcode.pl (modified) (1 diff)
- branches/hackathon-summary/plagger/assets/plugins/Filter-EntryFullText/zakzak.yaml (modified) (1 diff)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/feedburner (deleted)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/feedburner.pat (added)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/google_adsense (deleted)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/google_adsense.pat (added)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/google_adsense2 (deleted)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/google_adsense2.pat (added)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/pheedo (deleted)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/pheedo.pat (added)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/pheedo_jp (deleted)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/pheedo_jp.pat (added)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/pheedo_jp2.pat (added)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/pheedo_jp_ad_entry.yaml (modified) (1 diff)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/plaza_rakuten (deleted)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/plaza_rakuten.pat (added)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/rssad_jp (deleted)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/rssad_jp.pat (added)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/seesaa (deleted)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/seesaa.pat (added)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/valueclick (deleted)
- branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/valueclick.pat (added)
- branches/hackathon-summary/plagger/assets/plugins/Filter-TruePermalink/google_groups.yaml (added)
- branches/hackathon-summary/plagger/assets/plugins/Filter-TruePermalink/redirectors.yaml (deleted)
- branches/hackathon-summary/plagger/assets/plugins/Filter-TruePermalink/refrss.yaml (modified) (1 diff)
- branches/hackathon-summary/plagger/assets/plugins/Filter-TruePermalink/rssquery.yaml (added)
- branches/hackathon-summary/plagger/assets/plugins/Notify-IRC/irc_notify.tt (modified) (1 diff)
- branches/hackathon-summary/plagger/assets/plugins/Widget-Simple/1470.yaml (added)
- branches/hackathon-summary/plagger/assets/plugins/Widget-Simple/blogmap.yaml (added)
- branches/hackathon-summary/plagger/assets/plugins/Widget-Simple/digg.yaml (added)
- branches/hackathon-summary/plagger/assets/plugins/Widget-Simple/google_pagerank.yaml (modified) (1 diff)
- branches/hackathon-summary/plagger/assets/plugins/Widget-Simple/technorati.yaml (added)
- branches/hackathon-summary/plagger/bin/plagger-search (modified) (2 diffs)
- branches/hackathon-summary/plagger/deps/Filter-FloatingDateTime.yaml (added)
- branches/hackathon-summary/plagger/deps/Filter-Markdown.yaml (added)
- branches/hackathon-summary/plagger/deps/Filter-URLBL.yaml (added)
- branches/hackathon-summary/plagger/deps/Publish-CHTML.yaml (added)
- branches/hackathon-summary/plagger/examples/weather-notify.yaml (added)
- branches/hackathon-summary/plagger/lib/Plagger.pm (modified) (3 diffs)
- branches/hackathon-summary/plagger/lib/Plagger/Plugin.pm (modified) (2 diffs)
- branches/hackathon-summary/plagger/lib/Plagger/Plugin/Aggregator/Simple.pm (modified) (2 diffs)
- branches/hackathon-summary/plagger/lib/Plagger/Plugin/Filter/EntryFullText.pm (modified) (4 diffs)
- branches/hackathon-summary/plagger/lib/Plagger/Plugin/Filter/FindEnclosures.pm (modified) (2 diffs)
- branches/hackathon-summary/plagger/lib/Plagger/Plugin/Filter/HEADEnclosureMetadata.pm (modified) (1 diff)
- branches/hackathon-summary/plagger/lib/Plagger/Plugin/Filter/Rule.pm (modified) (1 diff)
- branches/hackathon-summary/plagger/lib/Plagger/Plugin/Filter/SpamAssassin.pm (modified) (2 diffs)
- branches/hackathon-summary/plagger/lib/Plagger/Plugin/Filter/StripRSSAd.pm (modified) (2 diffs)
- branches/hackathon-summary/plagger/lib/Plagger/Plugin/Filter/TruePermalink.pm (modified) (5 diffs)
- branches/hackathon-summary/plagger/lib/Plagger/Plugin/Publish/CHTML.pm (modified) (1 diff)
- branches/hackathon-summary/plagger/lib/Plagger/Plugin/Publish/Feed.pm (modified) (1 diff)
- branches/hackathon-summary/plagger/lib/Plagger/Plugin/Publish/OutlineText.pm (modified) (1 diff)
- branches/hackathon-summary/plagger/lib/Plagger/Plugin/Publish/Pipe.pm (modified) (1 diff)
- branches/hackathon-summary/plagger/lib/Plagger/Plugin/Search/Rast.pm (modified) (5 diffs)
- branches/hackathon-summary/plagger/lib/Plagger/Plugin/Subscription/Bookmarks/InternetExplorer.pm (modified) (1 diff)
- branches/hackathon-summary/plagger/lib/Plagger/Plugin/Subscription/Bookmarks/Mozilla.pm (modified) (1 diff)
- branches/hackathon-summary/plagger/lib/Plagger/Plugin/Subscription/Bookmarks/Safari.pm (modified) (1 diff)
- branches/hackathon-summary/plagger/lib/Plagger/Plugin/Widget/Simple.pm (modified) (1 diff)
- branches/hackathon-summary/plagger/lib/Plagger/Rule/Always.pm (modified) (1 diff)
- branches/hackathon-summary/plagger/lib/Plagger/Util.pm (modified) (3 diffs)
- branches/hackathon-summary/plagger/lib/Plagger/Walker.pm (modified) (1 diff)
- branches/hackathon-summary/plagger/t/99-perlcritic.t (added)
- branches/hackathon-summary/plagger/t/core/feed-parser-discover.t (modified) (1 diff)
- branches/hackathon-summary/plagger/t/core/feed-parser.t (modified) (1 diff)
- branches/hackathon-summary/plagger/t/core/mime-is-enclosure.t (added)
- branches/hackathon-summary/plagger/t/perlcriticrc (added)
- branches/hackathon-summary/plagger/t/plugins/Filter-Emoticon/google_talk.t (modified) (2 diffs)
- branches/hackathon-summary/plagger/t/plugins/Filter-Emoticon/msn.t (modified) (1 diff)
- branches/hackathon-summary/plagger/t/plugins/Filter-EntryFullText/kojiinet.t (modified) (1 diff)
- branches/hackathon-summary/plagger/t/plugins/Filter-EntryFullText/slashcode.t (added)
- branches/hackathon-summary/plagger/t/plugins/Filter-FloatingDateTime (added)
- branches/hackathon-summary/plagger/t/plugins/Filter-FloatingDateTime/base.t (added)
- branches/hackathon-summary/plagger/t/plugins/Filter-HTMLScrubber/base.t (modified) (2 diffs)
- branches/hackathon-summary/plagger/t/plugins/Filter-HatenaDiaryKeywordLink/base.t (modified) (1 diff)
- branches/hackathon-summary/plagger/t/plugins/Filter-HatenaFormat (added)
- branches/hackathon-summary/plagger/t/plugins/Filter-HatenaFormat/base.t (added)
- branches/hackathon-summary/plagger/t/plugins/Filter-Markdown (added)
- branches/hackathon-summary/plagger/t/plugins/Filter-Markdown/base.t (added)
- branches/hackathon-summary/plagger/t/plugins/Filter-SpamAssassin (added)
- branches/hackathon-summary/plagger/t/plugins/Filter-SpamAssassin/base.t (added)
- branches/hackathon-summary/plagger/t/plugins/Filter-StripRSSAd/pheedo.t (added)
- branches/hackathon-summary/plagger/t/plugins/Filter-TruePermalink/bigfile.t (added)
- branches/hackathon-summary/plagger/t/plugins/Filter-TruePermalink/google-groups.t (added)
- branches/hackathon-summary/plagger/t/plugins/Filter-TruePermalink/oreilly.t (modified) (2 diffs)
- branches/hackathon-summary/plagger/t/plugins/Filter-TruePermalink/redirect.t (added)
- branches/hackathon-summary/plagger/t/plugins/Filter-TruePermalink/refrss.t (added)
- branches/hackathon-summary/plagger/t/plugins/Filter-URLBL (added)
- branches/hackathon-summary/plagger/t/plugins/Filter-URLBL/base.t (added)
- branches/hackathon-summary/plagger/t/plugins/Notify-Growl (added)
- branches/hackathon-summary/plagger/t/plugins/Notify-Growl/growl.t (added)
- branches/hackathon-summary/plagger/t/plugins/Publish-CHTML (added)
- branches/hackathon-summary/plagger/t/plugins/Publish-CHTML/publish.t (added)
- branches/hackathon-summary/plagger/t/plugins/Publish-OPML (added)
- branches/hackathon-summary/plagger/t/plugins/Publish-OPML/publish.t (added)
- branches/hackathon-summary/plagger/t/plugins/Publish-OutlineText (added)
- branches/hackathon-summary/plagger/t/plugins/Publish-OutlineText/publish.t (added)
- branches/hackathon-summary/plagger/t/plugins/Publish-PDF (added)
- branches/hackathon-summary/plagger/t/plugins/Publish-PDF/publish.t (added)
- branches/hackathon-summary/plagger/t/plugins/Search-Estraier/search.t (modified) (1 diff)
- branches/hackathon-summary/plagger/t/plugins/SmartFeed-All (added)
- branches/hackathon-summary/plagger/t/plugins/SmartFeed-All/base.t (added)
- branches/hackathon-summary/plagger/t/plugins/Subscription-2chThreadlist/base.t (modified) (1 diff)
- branches/hackathon-summary/plagger/t/regression/mime-type-dup.t (modified) (2 diffs)
- branches/hackathon-summary/plagger/t/regression/mime-type-filename.t (added)
- branches/hackathon-summary/plagger/t/regression/rss2-image.t (added)
- branches/hackathon-summary/plagger/t/samples/hatena-rss.xml (added)
- branches/hackathon-summary/plagger/t/samples/rss2-image.xml (added)
- branches/hackathon-summary/plagger/t/samples/spamassassin (added)
- branches/hackathon-summary/plagger/t/samples/spamassassin/ham_rule.txt (added)
- branches/hackathon-summary/plagger/t/samples/spamassassin/spam_rule.txt (added)
- branches/hackathon-summary/plagger/tools/chimps-smoker.pl (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/hackathon-summary/plagger/Changes
r1370 r1622 1 1 The latest, HTML version of this document is always available at http://plagger.org/trac.cgi/wiki/PlaggerChangeLog 2 3 == 0.7.9 (2006/08/24) == 4 5 === Core === 6 7 * Fixed BaseDirURI logic to allow empty dirname on Mac OSX (Yappo) 8 * Added tests to lots of plugins thanks to Testathoners 9 * Added Plagger::Walker util class to serialize feed data 10 * Merged from hackathon-mt branch. Added Plagger->set_context method 11 * Split bootstrap into new() and run() to be used in persisten programs 12 * Added $context->search() stub to get Plagger::Feed object from Search::* backends 13 * Added bin/plagger-search prototype CLI 14 * Added bin/plagger-atom-stream-consumer, very experimental AtomStream consumer 15 * Updated Plagger::Template->new() parameter 16 * assets_path: can now be localized per plugins using config:assets_path 17 * lots of fixes to tests so it can work on Windows 18 * decode config.yaml as UTF-8 automatically before run, unless you specify global:no_decode_utf8=1 19 * chimps-client: create lock dir to avoid double excecution 20 * Split feed parsing logic from Aggregator::Simple to Plagger::FeedParser so plugins can use. 21 * Added $ua->fetch_parse($feed) and $ua->find_parse($url) 22 * Fixed misusage of Term::Encoding (Yappo) 23 * Support entry level image in RSS 0.91 and 2.0 24 25 26 === New Plugins === 27 28 * Publish::JSON: Serialize feed to JSON (miyagawa) 29 * Publish::Serializer: Dump feed to various format using Data::Serializer (naoya, miyagawa) 30 * Notify::Audio: Play sound files when feed comes. Support playing enclosure files as well (miyagawa, youpy) 31 32 === Plugins Updates === 33 34 * Publish::Gmail: support APOP authentication in POP before SMTP 35 * Filter::Delicious: use Plagger::UA for caching. 36 * CustomFeed::Yahoo360JP: removed from the distro since no one is using it and it's broken 37 * Widget::Simple: Added lots of widgets (hsbt, jiro, drawnboy) 38 * Filter::EntryFullText: Fixed XHTML numeric entities issue when using XPath (spotted by otsune) 39 * Filter::2chRSSContent: Strip AD entry 40 * CustomFeed::YouTube: fix regexp to get page content (mizzy) 41 * Subscription::OPML: Fixed bug where containers are not correctly loaded because of array reference 42 * Subscriptoin::OPML: Ditch XML::OPML and rewrite OPML parser using XML::LibXML::SAX 43 * Filter::EntryFullText: extract_capture defaults to 'body' (suggested by otsune) 44 * Search::Rast: implemented searcher.search API (Yappo) 45 * Filter::TruePermalink: Fixed ref=rss YAML. Removed redirectors.yaml and instead introduced 'follow_redirect' config (default: 1) 46 * Notify::IRC: use color code scheme to colorize feed title and author (#movabletype) 2 47 3 48 == 0.7.8 (2006/08/18) == branches/hackathon-summary/plagger/MANIFEST
r1379 r1622 49 49 assets/plugins/Filter-EntryFullText/japan_zdnet_com.yaml 50 50 assets/plugins/Filter-EntryFullText/juno.yaml 51 assets/plugins/Filter-EntryFullText/kojii_net.yaml 51 52 assets/plugins/Filter-EntryFullText/kyodo.yaml 52 53 assets/plugins/Filter-EntryFullText/kyoko_shimbun_news.yaml … … 118 119 assets/plugins/Filter-FindEnclosures/yourfilehost.pl 119 120 assets/plugins/Filter-FindEnclosures/youtube.pl 120 assets/plugins/Filter-StripRSSAd/feedburner 121 assets/plugins/Filter-StripRSSAd/google_adsense 122 assets/plugins/Filter-StripRSSAd/google_adsense2 121 assets/plugins/Filter-StripRSSAd/feedburner.pat 122 assets/plugins/Filter-StripRSSAd/google_adsense.pat 123 assets/plugins/Filter-StripRSSAd/google_adsense2.pat 123 124 assets/plugins/Filter-StripRSSAd/namaan_ad.yaml 124 assets/plugins/Filter-StripRSSAd/pheedo 125 assets/plugins/Filter-StripRSSAd/pheedo_jp 125 assets/plugins/Filter-StripRSSAd/pheedo.pat 126 assets/plugins/Filter-StripRSSAd/pheedo_jp.pat 126 127 assets/plugins/Filter-StripRSSAd/pheedo_jp_ad_entry.yaml 127 assets/plugins/Filter-StripRSSAd/plaza_rakuten 128 assets/plugins/Filter-StripRSSAd/rssad_jp 129 assets/plugins/Filter-StripRSSAd/seesaa 130 assets/plugins/Filter-StripRSSAd/valueclick 128 assets/plugins/Filter-StripRSSAd/plaza_rakuten.pat 129 assets/plugins/Filter-StripRSSAd/rssad_jp.pat 130 assets/plugins/Filter-StripRSSAd/seesaa.pat 131 assets/plugins/Filter-StripRSSAd/valueclick.pat 131 132 assets/plugins/Filter-TruePermalink/2chrss.yaml 132 133 assets/plugins/Filter-TruePermalink/blogpeople.yaml … … 140 141 assets/plugins/Filter-TruePermalink/rd_yahoo.yaml 141 142 assets/plugins/Filter-TruePermalink/reddit.yaml 142 assets/plugins/Filter-TruePermalink/redirectors.yaml143 143 assets/plugins/Filter-TruePermalink/refrss.yaml 144 assets/plugins/Filter-TruePermalink/rssquery.yaml 144 145 assets/plugins/Filter-TruePermalink/tech_souken.yaml 145 146 assets/plugins/Filter-TruePermalink/tiyu_to.yaml … … 176 177 assets/plugins/Subscription-Planet/default.yaml 177 178 assets/plugins/Subscription-Planet/ja.yaml 179 assets/plugins/Widget-Simple/1470.yaml 178 180 assets/plugins/Widget-Simple/bloglines.yaml 181 assets/plugins/Widget-Simple/blogmap.yaml 179 182 assets/plugins/Widget-Simple/bulkfeeds.yaml 180 183 assets/plugins/Widget-Simple/delicious.yaml 181 184 assets/plugins/Widget-Simple/delicious_bookmark_users.yaml 185 assets/plugins/Widget-Simple/digg.yaml 186 assets/plugins/Widget-Simple/google_pagerank.yaml 182 187 assets/plugins/Widget-Simple/hatena_bookmark.yaml 183 188 assets/plugins/Widget-Simple/hatena_bookmark_users.yaml … … 185 190 assets/plugins/Widget-Simple/mm.yaml 186 191 assets/plugins/Widget-Simple/reddit.yaml 192 assets/plugins/Widget-Simple/technorati.yaml 187 193 AUTHORS 194 bin/plagger-atom-stream-consumer 188 195 bin/plagger-ircbot 196 bin/plagger-search 189 197 bin/spotlight_comment.scpt 190 198 Changes … … 194 202 deps/CustomFeed-Mixi.yaml 195 203 deps/CustomFeed-SVNLog.yaml 204 deps/Filter-2chNewsokuTitle.yaml 205 deps/Filter-2chRSSContent.yaml 206 deps/Filter-AtomLinkRelated.yaml 196 207 deps/Filter-Babelfish.yaml 208 deps/Filter-BlogPet.yaml 197 209 deps/Filter-Delicious.yaml 210 deps/Filter-DeliciousFeedTags.yaml 198 211 deps/Filter-Emoticon.yaml 199 212 deps/Filter-EntryFullText.yaml 200 213 deps/Filter-ExtractAuthorName.yaml 214 deps/Filter-FeedFlareStripper.yaml 201 215 deps/Filter-GuessLanguage.yaml 216 deps/Filter-HatenaBookmarkTag.yaml 202 217 deps/Filter-HatenaBookmarkUsersCount.yaml 203 218 deps/Filter-HatenaDiaryKeywordLink.yaml 204 219 deps/Filter-HatenaFormat.yaml 220 deps/Filter-HatenaKeywordTag.yaml 205 221 deps/Filter-HTMLScrubber.yaml 206 222 deps/Filter-ImageInfo.yaml 223 deps/Filter-Markdown.yaml 207 224 deps/Filter-Pipe.yaml 225 deps/Filter-POPFile.yaml 208 226 deps/Filter-Profanity.yaml 209 227 deps/Filter-ResolveRelativeLink.yaml 210 228 deps/Filter-Romanize.yaml 211 229 deps/Filter-RSSLiberalDateTime.yaml 230 deps/Filter-SpamAssassin.yaml 231 deps/Filter-StripRSSAd.yaml 232 deps/Filter-tDiaryComment.yaml 212 233 deps/Filter-Thumbnail.yaml 213 234 deps/Filter-TTP.yaml 235 deps/Filter-URLBL.yaml 236 deps/Notify-Audio-iTunesWin32.yaml 237 deps/Notify-Audio-MSWin32.yaml 238 deps/Notify-Audio.yaml 214 239 deps/Notify-Balloon.yaml 215 240 deps/Notify-Beep.yaml … … 220 245 deps/Notify-UpdatePing.yaml 221 246 deps/Publish-2chdat.yaml 247 deps/Publish-CHTML.yaml 222 248 deps/Publish-CSV.yaml 223 249 deps/Publish-Delicious.yaml … … 227 253 deps/Publish-IMAP.yaml 228 254 deps/Publish-JavaScript.yaml 255 deps/Publish-JSON.yaml 229 256 deps/Publish-Maildir.yaml 230 257 deps/Publish-MT.yaml … … 233 260 deps/Publish-Planet.yaml 234 261 deps/Publish-PowerPoint.yaml 262 deps/Publish-Serializer.yaml 235 263 deps/Publish-Speech-MacOSX.yaml 236 264 deps/Publish-Speech-Win32.yaml … … 243 271 deps/Subscription-Bloglines.yaml 244 272 deps/Subscription-Bookmarks-InternetExplorer.yaml 273 deps/Subscription-Bookmarks-Mozilla.yaml 245 274 deps/Subscription-Bookmarks-Safari.yaml 246 275 deps/Subscription-DBI.yaml … … 248 277 deps/Subscription-HatenaRSS.yaml 249 278 deps/Subscription-LivedoorReader.yaml 279 deps/Subscription-Odeo.yaml 250 280 deps/Subscription-OPML.yaml 281 deps/Subscription-PingServer.yaml 251 282 deps/Subscription-PlanetINI.yaml 283 deps/Subscription-XOXO.yaml 284 deps/Subscription-XPath.yaml 252 285 deps/Widget-Simple.yaml 253 286 examples/atode.yaml … … 259 292 examples/planet.yaml 260 293 examples/podcast.yaml 294 examples/rss2email.yaml 261 295 examples/search.yaml 296 examples/weather-notify.yaml 262 297 examples/xoxo-planet.yaml 263 298 examples/xoxo2opml.yaml … … 300 335 lib/Plagger/Entry.pm 301 336 lib/Plagger/Feed.pm 337 lib/Plagger/FeedParser.pm 302 338 lib/Plagger/Mechanize.pm 303 339 lib/Plagger/Operator.pm … … 382 418 lib/Plagger/Plugin/Filter/TTP.pm 383 419 lib/Plagger/Plugin/Filter/URLBL.pm 420 lib/Plagger/Plugin/Notify/Audio.pm 421 lib/Plagger/Plugin/Notify/Audio/iTunesMac.pm 422 lib/Plagger/Plugin/Notify/Audio/iTunesWin32.pm 423 lib/Plagger/Plugin/Notify/Audio/MSWin32.pm 384 424 lib/Plagger/Plugin/Notify/Balloon.pm 385 425 lib/Plagger/Plugin/Notify/Beep.pm … … 409 449 lib/Plagger/Plugin/Publish/IMAP.pm 410 450 lib/Plagger/Plugin/Publish/JavaScript.pm 451 lib/Plagger/Plugin/Publish/JSON.pm 411 452 lib/Plagger/Plugin/Publish/LivedoorClip.pm 412 453 lib/Plagger/Plugin/Publish/Maildir.pm … … 422 463 lib/Plagger/Plugin/Publish/PowerPoint.pm 423 464 lib/Plagger/Plugin/Publish/PSP.pm 465 lib/Plagger/Plugin/Publish/Serializer.pm 424 466 lib/Plagger/Plugin/Publish/Speech.pm 425 467 lib/Plagger/Plugin/Publish/Speech/MacOSX.pm … … 485 527 lib/Plagger/UserAgent.pm 486 528 lib/Plagger/Util.pm 529 lib/Plagger/Walker.pm 487 530 Makefile.PL 488 531 MANIFEST This list of files … … 490 533 plagger 491 534 t/00_compile.t 535 t/assets/plugins/Test-AssetsPath/assets_path.tt 536 t/samples/assets_path.tt 492 537 t/samples/atom-category.xml 538 t/samples/atom-related.xml 493 539 t/samples/atom10-example.xml 494 540 t/samples/babelfish.xml 541 t/samples/config.ini 495 542 t/samples/delicious.xml 543 t/samples/feed.xml 544 t/samples/feeds.txt 496 545 t/samples/googlevideo.xml 497 546 t/samples/guess-language/english.xml … … 507 556 t/samples/included.yaml 508 557 t/samples/monkey.rss 558 t/samples/mozilla-bookmarks.html 509 559 t/samples/nasty.xml 510 560 t/samples/non-http-link.xml 561 t/samples/opml-nested.xml 562 t/samples/opml.xml 511 563 t/samples/photocast.rss 512 564 t/samples/rss-20.xml 513 565 t/samples/rss-full.xml 566 t/samples/rss2-image.xml 514 567 t/samples/rss2sample.xml 568 t/samples/safari_bookmarks.plist 569 t/samples/sample.foaf 570 t/samples/spamassassin/ham_rule.txt 571 t/samples/spamassassin/spam_rule.txt 515 572 t/samples/tags-in-title.xml 573 t/samples/tags-to-title.xml 574 t/samples/tdiary.rdf 575 t/samples/top10news.xml 516 576 t/samples/vox.xml 577 t/samples/xoxo.html 517 578 t/TestPlagger.pm 518 579 tools/check-dependencies.pl branches/hackathon-summary/plagger/Makefile.PL
r1544 r1622 29 29 requires('XML::Feed', 0.12); 30 30 requires('XML::LibXML'); 31 requires('XML::Atom', 0. 19);31 requires('XML::Atom', 0.23); 32 32 requires('XML::RSS::LibXML', 0.20); 33 33 requires('Encode', 2.10); … … 43 43 features( 44 44 'Better Encoding detection' => [ 45 -default => 1,45 -default => 0, 46 46 recommends('Encode::Detect'), 47 47 ], … … 57 57 'Liberal XML parsing' => [ 58 58 -default => 1, 59 recommends('XML::Liberal', 0.1 3),59 recommends('XML::Liberal', 0.14), 60 60 recommends('XML::RSS::Liberal'), 61 61 ], … … 96 96 auto_include; 97 97 auto_install; 98 98 99 install_script('plagger'); 99 100 install_script('bin/plagger-ircbot'); branches/hackathon-summary/plagger/assets/plugins/Filter-EntryFullText/slashcode.pl
r757 r1622 1 1 sub handle { 2 2 my($self, $args) = @_; 3 $args->{entry}->permalink =~ m!article\.pl\?sid=\d\d/\d\d/\d\d/\d+ !;3 $args->{entry}->permalink =~ m!article\.pl\?sid=\d\d/\d\d/\d\d/\d+|/~\w+/journal/\d+$!; 4 4 } 5 5 branches/hackathon-summary/plagger/assets/plugins/Filter-EntryFullText/zakzak.yaml
r519 r1622 1 1 # used with http://www.zakzak.co.jp/ or http://bulknews.net/rss/rdf.cgi?ZakZak 2 2 author: youpy 3 custom_feed_handle: http://www\.zakzak\.co\.jp/ $3 custom_feed_handle: http://www\.zakzak\.co\.jp/ 4 4 custom_feed_follow_link: (?:top|spo|gei)/\d+.*?\.html 5 5 handle: http://www\.zakzak\.co\.jp/(?:top|spo|gei)/\d+ branches/hackathon-summary/plagger/assets/plugins/Filter-StripRSSAd/pheedo_jp_ad_entry.yaml
r758 r1622 1 condition: $args->{entry}->link =~ m!^http://www\.pheedo\.jp/click\.phdo\? z=\w+&a=\w+&unq=\w+!1 condition: $args->{entry}->link =~ m!^http://www\.pheedo\.jp/click\.phdo\?(?:a=[\w\/]+|z=\w+&a=\w+&unq=\w+)! && $args->{entry}->title =~ m!^AD:! 2 2 strip: 1 3 3 branches/hackathon-summary/plagger/assets/plugins/Filter-TruePermalink/refrss.yaml
r690 r1622 1 1 author: youpy 2 rewrite: s/[\?&](?:ref|from|FM)=(?:atom|rss)// 2 rewrite: s/[\?&;](?:ref|from|FM)=(?:atom|rss|rssall)([&;].*)?$/$1/ 3 branches/hackathon-summary/plagger/assets/plugins/Notify-IRC/irc_notify.tt
r1232 r1622 1 [%- SET title = feed.title || '(no-title)' -%] 2 [% feed.title_text %]: [% entry.title_text %] - [% entry.link %][% IF entry.author %] by [% entry.author %][% END %] 1 [% IF feed.title %][% feed.title_text %]: [% END %][% entry.title_text %][% IF entry.author %] (03[% entry.author %])[% END %] - 14[% entry.permalink %] branches/hackathon-summary/plagger/assets/plugins/Widget-Simple/google_pagerank.yaml
r1380 r1622 2 2 query: 3 3 q: $args->{feed}->link 4 content_dynamic: <img src="http://www.pagerankon.com/smerankcheck.php?site=[% feed.link %]&s=style7" border="0" alt="Google PageRank" >4 content_dynamic: <img src="http://www.pagerankon.com/smerankcheck.php?site=[% feed.link %]&s=style7" border="0" alt="Google PageRank" style="border:0;vertical-align:middle" /> branches/hackathon-summary/plagger/bin/plagger-search
r1391 r1622 3 3 use warnings; 4 4 5 use Encode ;5 use Encode (); 6 6 use FindBin; 7 7 use Getopt::Long; … … 15 15 16 16 my $context = Plagger->new(config => $path); 17 my $query = Encode::decode_utf8($ARGV[0]);17 my $query = decode($ARGV[0]); 18 18 19 19 my @feeds = $context->search($query); 20 20 21 21 my $feed = $feeds[0]; 22 binmode STDOUT, ":utf8"; 23 print "Search for '$query': ", $feed->count, " entries found.\n\n"; 22 binmode STDOUT, ":utf8" unless $context->conf->{log}->{encoding}; 23 exit unless $feed; 24 print "Search for '" . encode($query) . "': ", $feed->count , " entries found.\n\n"; 24 25 25 26 for my $entry ($feed->entries) { 26 print $entry->title, $entry->author ? "(by " . $entry->author. ")" : '', "\n";27 print $entry->body; # summary27 print encode($entry->title), $entry->author ? "(by " . encode($entry->author) . ")" : '', "\n"; 28 print encode($entry->body); # summary 28 29 print $entry->permalink, "\n"; 29 30 } 30 31 32 sub decode { 33 my $str = shift; 34 if ($context->conf->{log}->{encoding}) { 35 $str = Encode::decode($context->conf->{log}->{encoding}, $str); 36 } else { 37 $str = Encode::decode_utf8($str); 38 } 39 return $str; 40 } 41 42 sub encode { 43 my $str = shift; 44 if ($context->conf->{log}->{encoding}) { 45 $str = Encode::decode_utf8($str) unless utf8::is_utf8($str); 46 $str = Encode::encode($context->conf->{log}->{encoding}, $str); 47 } 48 return $str; 49 } branches/hackathon-summary/plagger/lib/Plagger.pm
r1618 r1622 1 1 package Plagger; 2 2 use strict; 3 our $VERSION = '0.7. 8';3 our $VERSION = '0.7.9'; 4 4 5 5 use 5.8.1; … … 91 91 } 92 92 93 open my $fh, $self->{config_path} or $self->error("$self->{config_path}: $!");93 open my $fh, '<', $self->{config_path} or $self->error("$self->{config_path}: $!"); 94 94 my $data = join '', <$fh>; 95 95 close $fh; … … 187 187 my($self, $file) = @_; 188 188 189 open my $fh, $file or die "$file: $!";189 open my $fh, '<', $file or die "$file: $!"; 190 190 while (<$fh>) { 191 191 /^package (Plagger::Plugin::.*?);/ and return $1; branches/hackathon-summary/plagger/lib/Plagger/Plugin.pm
r1412 r1622 13 13 use File::Find::Rule (); 14 14 use File::Spec; 15 use Scalar::Util qw(blessed); 15 16 16 17 sub new { … … 149 150 my($self, $rule, $callback) = @_; 150 151 151 my $context = Plagger->context;152 153 my $dir = $self->assets_dir;152 unless (blessed($rule) && $rule->isa('File::Find::Rule')) { 153 $rule = File::Find::Rule->name($rule); 154 } 154 155 155 156 # $rule isa File::Find::Rule 156 for my $file ($rule->in($dir)) { 157 $callback->($file); 157 for my $file ($rule->in($self->assets_dir)) { 158 my $base = File::Basename::basename($file); 159 $callback->($file, $base); 158 160 } 159 161 } branches/hackathon-summary/plagger/lib/Plagger/Plugin/Aggregator/Simple.pm
r1611 r1622 99 99 100 100 if ($remote->format =~ /^RSS/) { 101 $feed->image( $remote->{rss}->image)101 $feed->image( \%{$remote->{rss}->image} ) 102 102 if $remote->{rss}->image; 103 103 } elsif ($remote->format eq 'Atom') { … … 170 170 } 171 171 172 # entry image support 173 if ($remote->format =~ /^RSS / and my $img = $e->{entry}->{image}) { 174 $entry->icon(\%$img); 175 } 176 172 177 # TODO: move MediaRSS, Hatena, iTunes and those specific parser to be subclassed 173 178 $self->handle_media_rss($entry, $e); branches/hackathon-summary/plagger/lib/Plagger/Plugin/Filter/EntryFullText.pm
r1573 r1622 37 37 my $context = Plagger->context; 38 38 39 my $dir = $self->assets_dir; 40 my $dh = DirHandle->new($dir) or $context->error("$dir: $!"); 41 for my $file (grep -f $_->[0] && $_->[0] =~ /\.(?:pl|yaml)$/, 42 map [ File::Spec->catfile($dir, $_), $_ ], sort $dh->read) { 43 $self->load_plugin(@$file); 44 } 45 } 46 47 sub load_plugin { 48 my($self, $file, $base) = @_; 49 50 Plagger->context->log(debug => "loading $file"); 51 52 my $load_method = $file =~ /\.pl$/ ? 'load_plugin_perl' : 'load_plugin_yaml'; 53 push @{ $self->{plugins} }, $self->$load_method($file, $base); 39 $self->load_assets('*.yaml', sub { $self->load_plugin_yaml(@_) }); 40 $self->load_assets('*.pl', sub { $self->load_plugin_perl(@_) }); 54 41 } 55 42 … … 57 44 my($self, $file, $base) = @_; 58 45 59 open my $fh, $file or Plagger->context->error("$file: $!"); 46 Plagger->context->log(debug => "Load plugin $file"); 47 48 open my $fh, '<', $file or Plagger->context->error("$file: $!"); 60 49 (my $pkg = $base) =~ s/\.pl$//; 61 50 my $plugin_class = "Plagger::Plugin::Filter::EntryFullText::Site::$pkg"; … … 80 69 Plagger->context->error($@) if $@; 81 70 82 return$plugin_class->new;71 push @{ $self->{plugins} }, $plugin_class->new; 83 72 } 84 73 85 74 sub load_plugin_yaml { 86 75 my($self, $file, $base) = @_; 76 77 Plagger->context->log(debug => "Load YAML $file"); 87 78 my @data = YAML::LoadFile($file); 88 79 89 return map { Plagger::Plugin::Filter::EntryFullText::YAML->new($_, $base) }90 @data;80 push @{ $self->{plugins} }, 81 map { Plagger::Plugin::Filter::EntryFullText::YAML->new($_, $base) } @data; 91 82 } 92 83 … … 253 244 if (my @match = $args->{content} =~ /$self->{extract}/s) { 254 245 my @capture = split /\s+/, $self->{extract_capture}; 246 @capture = ('body') unless @capture; 255 247 @{$data}{@capture} = @match; 256 248 } branches/hackathon-summary/plagger/lib/Plagger/Plugin/Filter/FindEnclosures.pm
r1551 r1622 53 53 my($self, $file, $base) = @_; 54 54 55 open my $fh, $file or Plagger->context->error("$file: $!");55 open my $fh, '<', $file or Plagger->context->error("$file: $!"); 56 56 (my $pkg = $base) =~ s/\.pl$//; 57 57 my $plugin_class = "Plagger::Plugin::Filter::FindEnclosures::Site::$pkg"; … … 184 184 185 185 my $mime = $type ? MIME::Type->new(type => $type) : Plagger::Util::mime_type_of( URI->new($url) ); 186 $mime && $mime->mediaType =~ m!^(?:audio|video|image)$!;186 Plagger::Util::mime_is_enclosure($mime); 187 187 } 188 188 branches/hackathon-summary/plagger/lib/Plagger/Plugin/Filter/HEADEnclosureMetadata.pm
r1505 r1622 71 71 my($res, $header) = @_; 72 72 73 my $value = $res->header($header) or return undef; 73 my $value = $res->header($header) or return undef; ## no critic 74 74 $value =~ s/;.*?$//; 75 75 $value; branches/hackathon-summary/plagger/lib/Plagger/Plugin/Filter/Rule.pm
r444 r1622 28 28 29 29 if ($args->{feed}->count == 0) { 30 $context->log(debug => "Deleting " . $args->{feed}-> url. " since it has 0 entries");30 $context->log(debug => "Deleting " . $args->{feed}->title . " since it has 0 entries"); 31 31 $context->update->delete_feed($args->{feed}) 32 32 } branches/hackathon-summary/plagger/lib/Plagger/Plugin/Filter/SpamAssassin.pm
r1432 r1622 32 32 33 33 # create a pseudo mail header to skip some of the sa's default tests 34 my $status = $sa->check_message_text( 35 MIME::Lite->new( 36 From => 'plagger@localhost', 37 To => 'plagger@localhost', 38 Subject => encode('MIME-Header', $entry->title_text), 39 Data => $entry->body_text, 40 )->as_string 41 ); 34 35 my $mail = MIME::Lite->new( 36 From => 'plagger@localhost', 37 To => 'plagger@localhost', 38 Subject => encode('MIME-Header', $entry->title_text), 39 'X-Mailer' => 'plagger', 40 Data => $entry->body_text, 41 )->as_string; 42 43 my $status = $sa->check_message_text( $mail ); 42 44 43 45 if ($status->is_spam) { … … 65 67 new: 66 68 local_tests_only: 1 67 config_text: 68 - score NO_RELAYS 0.0 69 - score NO_RECEIVED 0.0 69 site_rules_filename: some_rule.cf 70 70 71 71 =head1 CONFIG branches/hackathon-summary/plagger/lib/Plagger/Plugin/Filter/StripRSSAd.pm
r1551 r1622 9 9 $self->SUPER::init(@_); 10 10 Plagger->context->autoload_plugin({ module => 'Filter::BloglinesContentNormalize' }); 11 $self->load_patterns();12 }13 11 14 sub load_patterns { 15 my $self = shift; 16 17 my $dir = $self->assets_dir; 18 my $dh = DirHandle->new($dir) or Plagger->context->error("$dir: $!"); 19 for my $file (grep -f $_->[0] && $_->[1] =~ /^[\w\-\.]+$/, 20 map [ File::Spec->catfile($dir, $_), $_ ], sort $dh->read) { 21 $self->load_pattern(@$file); 22 } 23 } 24 25 sub load_pattern { 26 my($self, $file, $base) = @_; 27 28 Plagger->context->log(debug => "loading $file"); 29 30 if ($file =~ /\.yaml$/) { 31 $self->load_yaml($file, $base); 32 } else { 33 $self->load_regexp($file, $base); 34 } 12 $self->load_assets('*.yaml', sub { $self->load_yaml(@_) }); 13 $self->load_assets('*.pat', sub { $self->load_regexp(@_)}); 35 14 } 36 15 37 16 sub load_regexp { 38 17 my($self, $file, $base) = @_; 18 Plagger->context->log(debug => "Load regexp $file"); 39 19 40 open my $fh, $file or Plagger->context->error("$file: $!");20 open my $fh, '<', $file or Plagger->context->error("$file: $!"); 41 21 my $re = join '', <$fh>; 42 22 chomp($re); … … 47 27 sub load_yaml { 48 28 my($self, $file, $base) = @_; 29 Plagger->context->log(debug => "Load YAML $file"); 49 30 50 31 my $pattern = eval { YAML::LoadFile($file) } branches/hackathon-summary/plagger/lib/Plagger/Plugin/Filter/TruePermalink.pm
r933 r1622 12 12 my $self = shift; 13 13 $self->SUPER::init(@_); 14 $self->conf->{follow_redirect} = 1 unless exists $self->conf->{follow_redirect}; 14 15 $self->load_plugins; 15 16 } … … 18 19 my $self = shift; 19 20 20 my $dir = $self->assets_dir; 21 my $dh = DirHandle->new($dir) or Plagger->context->error("$dir: $!"); 22 for my $file (grep -f $_->[0] && $_->[1] =~ /\.yaml$/, 23 map [ File::Spec->catfile($dir, $_), $_ ], sort $dh->read) { 24 $self->load_plugin(@$file); 25 } 26 } 27 28 sub load_plugin { 29 my($self, $file, $base) = @_; 30 31 Plagger->context->log(debug => "loading $file"); 32 my $data = YAML::LoadFile($file); 33 if (ref($data) eq 'ARRAY') { 34 push @{$self->{redirectors}}, { follow_link => "^(?:" . join("|", @$data) . ")" }; 35 } else { 36 push @{$self->{plugins}}, $data; 37 } 21 $self->load_assets( 22 '*.yaml', 23 sub { 24 my $file = shift; 25 Plagger->context->log(debug => "loading $file"); 26 my $data = YAML::LoadFile($file); 27 if (ref($data) eq 'ARRAY') { 28 # redirectors.yaml ... make it backward compatible to ignore 29 } else { 30 push @{$self->{plugins}}, $data; 31 } 32 }, 33 ); 38 34 } 39 35 … … 99 95 } 100 96 101 unless ($count) { 102 for my $red (@{ $self->{redirectors} }) { 103 next unless $red->{follow_link}; 104 if ($link =~ /$red->{follow_link}/i) { 105 my $url = $self->follow_redirect($link); 106 if ($url && $url ne $link) { 107 $count++; 108 $rewritten = $url; 109 last; 110 } 111 } 97 # No match to known sites. Try redirect by issuing GET 98 if (!$count && $self->conf->{follow_redirect}) { 99 my $url = $self->follow_redirect($link); 100 if ($url && $url ne $link) { 101 $count++; 102 $rewritten = $url; 112 103 } 113 104 } … … 127 118 "redirector:$link", 128 119 sub { 120 Plagger->context->log(debug => "Issuing GET to $link to follow redirects"); 129 121 my $ua = Plagger::UserAgent->new; 130 my $res = $ua->simple_request( HTTP::Request->new(GET => $link) ); 122 123 # don't care about content body ... immediately die 124 my $res = $ua->simple_request( HTTP::Request->new(GET => $link), sub { die } ); 131 125 if ($res->is_redirect) { 132 126 return $res->header('Location'); 133 127 } 134 return ;128 return ''; 135 129 }, 136 130 '1 day', 137 131 ); 138 132 139 Plagger->context->log(debug => "Resolv ing redirection of $link:$url") if $url;133 Plagger->context->log(debug => "Resolved redirection of $link => $url") if $url; 140 134 141 135 return $url; … … 165 159 tries to rewrite url of them. 166 160 161 =head1 CONFIG 162 163 =over 4 164 165 =item follow_redirect 166 167 If set to 1, this plugin issues GET request to entry permalinks to see 168 if the server returns 301 or 302 redirect to other URL. Defaults to 1. 169 170 =back 171 167 172 =head1 PATTERN FILES 168 173 branches/hackathon-summary/plagger/lib/Plagger/Plugin/Publish/CHTML.pm
r1454 r1622 121 121 my $earlier; 122 122 my $file = "$path/earlier"; 123 if (open my $in, $file) {123 if (open my $in, '<', $file) { 124 124 $earlier = <$in>; 125 125 close $in; 126 126 } 127 open my $out, "> $file"or $self->context->error("$file: $!");127 open my $out, ">", $file or $self->context->error("$file: $!"); 128 128 print $out $self->id; 129 129 close $out; branches/hackathon-summary/plagger/lib/Plagger/Plugin/Publish/Feed.pm
r1621 r1622 62 62 my $entry = XML::Feed::Entry->new($feed_format); 63 63 $entry->title($e->title); 64 $entry->link($e-> link);64 $entry->link($e->permalink); 65 65 $entry->summary($e->body_text) if defined $e->body; 66 66 branches/hackathon-summary/plagger/lib/Plagger/Plugin/Publish/OutlineText.pm
r801 r1622 35 35 36 36 foreach my $entry (@{ $feed->entries }) { 37 $out .= '..' . $entry->title. "\n";37 $out .= '..' . ($entry->title || '') . "\n"; 38 38 39 39 my $body = $entry->body_text; branches/hackathon-summary/plagger/lib/Plagger/Plugin/Publish/Pipe.pm
r246 r1622 15 15 sub feed { 16 16 my($self, $context, $args) = @_; 17 18 open my $out, "|" . $self->conf->{command} or $context->error("Can't open pipe: $!"); 17 18 open my $out, "|" . $self->conf->{command} or $context->error("Can't open pipe: $!"); ## no critic 19 19 $context->log(info => "Publishing to " . $self->conf->{command}); 20 20 for my $entry ($args->{feed}->entries) { branches/hackathon-summary/plagger/lib/Plagger/Plugin/Search/Rast.pm
r131 r1622 3 3 use base qw( Plagger::Plugin ); 4 4 5 use Encode ;5 use Encode (); 6 6 use POSIX; 7 7 use Rast; … … 11 11 $context->register_hook( 12 12 $self, 13 'publish.feed' => \&feed,13 'publish.feed' => \&feed, 14 14 'publish.finalize' => \&finalize, 15 'searcher.search' => \&search, 15 16 ); 16 17 } … … 95 96 $feed->link, 96 97 $entry->permalink, 97 $self-> convert($entry->title) || '',98 $self-> convert($entry->author) || '',98 $self->encode($entry->title) || '', 99 $self->encode($entry->author) || '', 99 100 POSIX::strftime('%Y-%m-%dT%H:%M:%S', localtime($time)), 100 $self-> convert(join(' ', @{ $entry->tags }))101 $self->encode(join(' ', @{ $entry->tags })) 101 102 ]; 102 103 103 my $text = $self-> convert($entry->text);104 my $text = $self->encode($entry->text); 104 105 unless ($result->hit_count) { 105 106 my $id = $rast->register($text, $options); … … 113 114 } 114 115 115 sub convert{116 sub encode { 116 117 my ($self, $str) = @_; 117 118 utf8::decode($str) unless utf8::is_utf8($str); 118 return encode($self->{encode}, $str); 119 return Encode::encode($self->{encode}, $str); 120 } 121 122 sub decode { 123 my ($self, $str) = @_; 124 return Encode::decode($self->{encode}, $str); 119 125 } 120 126 … … 123 129 return unless $self->{rast}; 124 130 $self->{rast}->close; 131 } 132 133 sub search { 134 my($self, $context, $args) = @_; 135 136 my $result = $self->{rast}->search($self->encode($args->{query}), { 137 need_summary => 1, 138 properties => [qw/feedlink permalink title author/], 139 }); 140 141 my $feed = Plagger::Feed->new; 142 $feed->type('search:Rast'); 143 $feed->title("Search: $args->{query}"); 144 145 while (my $row = $result->fetch) { 146 my $entry = Plagger::Entry->new; 147 148 $entry->link($row->{properties}->[0]); 149 $entry->permalink($row->{properties}->[1]); 150 $entry->title($self->decode($row->{properties}->[2])); 151 $entry->author($self->decode($row->{properties}->[3])) ; 152 $entry->body($self->decode($row->{summary})); 153 $feed->add_entry($entry); 154 } 155 156 return $feed; 125 157 } 126 158 branches/hackathon-summary/plagger/lib/Plagger/Plugin/Subscription/Bookmarks/InternetExplorer.pm
r994 r1622 1 1 package Plagger::Plugin::Subscription::Bookmarks::InternetExplorer; 2 use strict; 2 3 use base qw( Plagger::Plugin::Subscription::Bookmarks ); 3 4 branches/hackathon-summary/plagger/lib/Plagger/Plugin/Subscription/Bookmarks/Mozilla.pm
r998 r1622 1 1 package Plagger::Plugin::Subscription::Bookmarks::Mozilla; 2 use strict; 2 3 use base qw( Plagger::Plugin::Subscription::XPath ); 3 4 branches/hackathon-summary/plagger/lib/Plagger/Plugin/Subscription/Bookmarks/Safari.pm
r1488 r1622 1 1 package Plagger::Plugin::Subscription::Bookmarks::Safari; 2 use strict; 2 3 use base qw( Plagger::Plugin::Subscription::Bookmarks ); 3 4 branches/hackathon-summary/plagger/lib/Plagger/Plugin/Widget/Simple.pm
r1525 r1622 22 22 my $found; 23 23 $self->load_assets( 24 File::Find::Rule->name("$name.yaml"),24 "$name.yaml", 25 25 sub { 26 26 my $data = YAML::LoadFile(shift); branches/hackathon-summary/plagger/lib/Plagger/Rule/Always.pm
r78 r1622 1 1 package Plagger::Rule::Always; 2 use strict; 2 3 use base qw( Plagger::Rule ); 3 4 branches/hackathon-summary/plagger/lib/Plagger/Util.pm
r1620 r1622 2 2 use strict; 3 3 our @ISA = qw(Exporter); 4 our @EXPORT_OK = qw( strip_html dumbnail decode_content extract_title load_uri mime_type_of filename_for );4 our @EXPORT_OK = qw( strip_html dumbnail decode_content extract_title load_uri mime_type_of filename_for mime_is_enclosure ); 5 5 6 6 use Encode (); … … 154 154 our $mimetypes = MIME::Types->new; 155 155 $mimetypes->addType( MIME::Type->new(type => 'video/x-flv', extensions => [ 'flv' ]) ); 156 $mimetypes->addType( MIME::Type->new(type => 'audio/aac', extensions => [ 'm4a', '.aac' ]) ); 156 $mimetypes->addType( MIME::Type->new(type => 'audio/aac', extensions => [ 'm4a', 'aac' ]) ); 157 $mimetypes->addType( MIME::Type->new(type => 'video/mp4', extensions => [ 'mp4', 'm4v' ]) ); 157 158 158 159 sub mime_type_of { … … 160 161 161 162 if (UNIVERSAL::isa($ext, 'URI')) { 162 $ext = ( $ext->path =~ /\.(\w+) / )[0];163 $ext = ( $ext->path =~ /\.(\w+)$/ )[0]; 163 164 } 164 165 165 166 return unless $ext; 166 167 return $mimetypes->mimeTypeOf($ext); 168 } 169 170 sub mime_is_enclosure { 171 my $mime = shift; 172 return unless $mime; 173 $mime->mediaType =~ m!^(?:audio|video|image)$! || $mime->type eq 'application/ogg'; 167 174 } 168 175 branches/hackathon-summary/plagger/lib/Plagger/Walker.pm
r1479 r1622 16 16 my($self, $stuff) = @_; 17 17 $self = $self->new( apply_keys => 1 ) unless ref $self; 18 $self->apply(sub { $_[0] = Encode::decode_utf8($_[0]) unless utf8::is_utf8($_[0]) })->($stuff);18 $self->apply(sub { utf8::decode($_[0]) unless utf8::is_utf8($_[0]) })->($stuff); 19 19 } 20 20 21 sub apply($&;@) { 21 sub apply($&;@) { ## no critic 22 22 my $self = shift; 23 23 my $code = shift; branches/hackathon-summary/plagger/t/core/feed-parser-discover.t
r1492 r1622 21 21 === Straight Feed URL 22 22 --- input 23 http:// d.hatena.ne.jp/miyagawa/rss23 http://feeds.feedburner.com/bulknews 24 24 --- expected 25 http:// d.hatena.ne.jp/miyagawa/rss25 http://feeds.feedburner.com/bulknews 26 26 27 === Straight Feed URL RSS227 === Straight Feed TypePad 28 28 --- input 29 http:// d.hatena.ne.jp/miyagawa/rss229 http://bulknews.typepad.com/blog/atom.xml 30 30 --- expected 31 http:// d.hatena.ne.jp/miyagawa/rss231 http://bulknews.typepad.com/blog/atom.xml 32 32 33 33 === Auto-Disocvery 34 34 --- input 35 http:// d.hatena.ne.jp/miyagawa/35 http://subtech.g.hatena.ne.jp/miyagawa/ 36 36 --- expected 37 http:// d.hatena.ne.jp/miyagawa/rss37 http://subtech.g.hatena.ne.jp/miyagawa/rss2 38 38 39 39 === No RSS Auto-Discovery branches/hackathon-summary/plagger/t/core/feed-parser.t
r1492 r1622 19 19 === Straight Feed URL 20 20 --- input 21 http:// d.hatena.ne.jp/miyagawa/rss21 http://subtech.g.hatena.ne.jp/miyagawa/rss 22 22 --- expected 23 miyagawaの日記 24 25 === Straight Feed URL RSS2 26 --- input 27 http://d.hatena.ne.jp/miyagawa/rss2 28 --- expected 29 miyagawaの日記 23 Bulknews::Subtech 30 24 31 25 === Auto-Discovery 32 26 --- input 33 http:// d.hatena.ne.jp/miyagawa/27 http://blog.bulknews.net/mt/ 34 28 --- expected 35 miyagawaの日記 29 blog.bulknews.net branches/hackathon-summary/plagger/t/plugins/Filter-Emoticon/google_talk.t
r1508 r1622 20 20 - module: Filter::Emoticon 21 21 config: 22 driver: MSN22 driver: GoogleTalk 23 23 option: 24 24 strict: 1 … … 26 26 --- expected 27 27 ok 1, $block->name; 28 is $context->update->feeds->[0]->entries->[0]->body, 'Yet Another Perl Hacker <img src="http://example.com/emo/regular_smile.gif" />' 28 is $context->update->feeds->[0]->entries->[0]->body, 'Yet Another Perl Hacker <img src="http://mail.google.com/mail/help/images/screenshots/chat/wink_nose.gif" />' 29 branches/hackathon-summary/plagger/t/plugins/Filter-Emoticon/msn.t
r1508 r1622 3 3 4 4 test_plugin_deps; 5 test_requires('Text::Emoticon::MSN' );5 test_requires('Text::Emoticon::MSN', 0.03); 6 6 plan 'no_plan'; 7 7 run_eval_expected; branches/hackathon-summary/plagger/t/plugins/Filter-EntryFullText/kojiinet.t
r1383 r1622 24 24 - module: Filter::EntryFullText 25 25 --- expected 26 ok $context->update->feeds->[0]->entries->[0]->body; 26 27 unlike $context->update->feeds->[0]->entries->[0]->body, qr/&#\d+;/; 27 28 branches/hackathon-summary/plagger/t/plugins/Filter-HTMLScrubber/base.t
r1571 r1622 4 4 test_plugin_deps; 5 5 plan 'no_plan'; 6 run_eval_expected _with_capture;6 run_eval_expected; 7 7 8 8 __END__ … … 11 11 --- input config 12 12 plugins: 13 - module: CustomFeed::Debug 14 config: 15 title: foo 16 link: 'http://www.example.net/' 17 entry: 18 - title: bar 19 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> 13 29 - module: Filter::HTMLScrubber 14 30 --- expected 15 31 ok 1, $block->name; 32 unlike $context->update->feeds->[0]->entries->[0]->body, qr!</?script .*?>!sm; 16 33 17 === Simple test18 --- input config19 plugins:20 - module: CustomFeed::Debug21 config:22 title: Foo Bar23 entry:24 - title: Nasty25 body: Foo <style>bar</style>26 - module: Filter::HTMLScrubber27 --- expected28 unlike $context->update->feeds->[0]->entries->[0]->body, qr!<style>bar</style>!29 30 === Don't scrub non-HTML31 --- input config32 global:33 log:34 level: debug35 plugins:36 - module: CustomFeed::Debug37 config:38 title: Foo Bar39 entry:40 - title: Nasty41 body: This is not HTML.42 - module: Filter::HTMLScrubber43 --- expected44 unlike $warning, qr/Scrubbing/;45 46 branches/hackathon-summary/plagger/t/plugins/Filter-HatenaDiaryKeywordLink/base.t
r1444 r1622 2 2 use t::TestPlagger; 3 3 4 test_requires_network 'b.hatena.ne.jp:80'; 4 plan skip_all => 'The site it tries to test is unreliable.' unless $ENV{TEST_UNRELIABLE_NETWORK}; 5 test_requires_network 'd.hatena.ne.jp:80'; 6 test_plugin_deps; 5 7 6 8 plan 'no_plan'; branches/hackathon-summary/plagger/t/plugins/Filter-TruePermalink/oreilly.t
r1301 r1622 1 1 use t::TestPlagger; 2 2 3 test_requires_network; 3 4 plan 'no_plan'; 4 5 run_eval_expected; … … 9 10 --- input config 10 11 plugins: 11 - module: Subscription::Config12 - module: CustomFeed::Debug 12 13 config: 13 feed: 14 - http://www.makezine.com/ 14 title: Make 15 link: http://www.makezine.com/ 16 entry: 17 - title: Foo 18 link: http://www.makezine.com/blog/archive/2006/08/usb_bbq.html?CMP=OTC-0D6B48984890 15 19 - module: Filter::TruePermalink 16 20 --- expected branches/hackathon-summary/plagger/t/plugins/Search-Estraier/search.t
r1391 r1622 15 15 16 16 my $ver = `estconfig --version`; 17 if ($ver =~ /^1\.3 / && $^O eq 'freebsd') {18 plan skip_all => " This test doesn't work with 1.3.x on FreeBSD: $ver";17 if ($ver =~ /^1\.3\.[0-8]/ && $^O eq 'freebsd') { 18 plan skip_all => "Estraier 1.3.x doesn't work on FreeBSD until 1.3.9: $ver"; 19 19 } 20 20 branches/hackathon-summary/plagger/t/plugins/Subscription-2chThreadlist/base.t
r1496 r1622 2 2 use t::TestPlagger; 3 3 4 plan skip_all => 'The site it tries to test is unreliable.' unless $ENV{TEST_UNRELIABLE_NETWORK}; 4 5 test_requires_network('rss.s2ch.net:80'); 5 6 plan tests => 1; branches/hackathon-summary/plagger/t/regression/mime-type-dup.t
r846 r1622 1 1 use strict; 2 use Test::More tests => 3;2 use Test::More tests => 5; 3 3 4 4 use Plagger::Util; … … 9 9 is Plagger::Util::mime_type_of("flv"), "video/x-flv"; 10 10 is Plagger::Util::mime_type_of("m4a"), "audio/aac"; 11 is Plagger::Util::mime_type_of("foo.mp4"), "video/mp4"; 12 is Plagger::Util::mime_type_of("bar.m4v"), "video/mp4"; 11 13 12 14 is $warning, undef; branches/hackathon-summary/plagger/tools/chimps-smoker.pl
r1452 r1622 9 9 our $lockdir = "$ENV{HOME}/.plagger-smoke.lock"; 10 10 mkdir $lockdir, 0777 or die "Other process is running!\n"; 11 our $rmdir = 1; 11 12 12 13 our $repo = "http://svn.bulknews.net/repos/plagger"; 14 our $trac = "http://plagger.org/trac"; 13 15 our $file = "$ENV{HOME}/.plagger-smoke.yml"; 14 16 … … 20 22 my $run; 21 23 while (++$config->{revision} <= $current) { 22 run_chimps($config->{revision}); 24 my $branch = get_branch($config->{revision}); 25 run_chimps($config->{revision}, $branch); 23 26 $run++; 24 27 } … … 27 30 YAML::DumpFile($file, $config) if $run; 28 31 29 rmdir $lockdir if -e $lockdir;32 END { rmdir $lockdir if $rmdir && -e $lockdir }; 30 33 31 34 sub run_chimps { 32 my $revision = shift;35 my($revision, $branch) = @_; 33 36 34 37 my $workdir = tempdir(CLEANUP => 1); … … 41 44 } 42 45 46 warn "Testing r$revision on $branch\n"; 47 43 48 delete $ENV{LANG}; # svn doesn't grok LANG=ja_JP.UTF-8 44 system("svn co -r $revision $repo/ trunk/plagger $checkout");49 system("svn co -r $revision $repo/$branch/plagger $checkout"); 45 50 chdir $checkout; 46 51 … … 61 66 return; 62 67 } 68 69 sub get_branch { 70 my $revision = shift; 71 my $diff = LWP::Simple::get("$trac/changeset/$revision?format=diff"); 72 $diff =~ m!^Index: (branches/[^/]+|trunk)/! and return $1; 73 return "trunk"; 74 }
