refinerycms-feedsucker 1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ module Admin
2
+ class FeedsuckerFeedsController < Admin::BaseController
3
+
4
+ crudify :feedsucker_feed
5
+
6
+ end
7
+ end
@@ -0,0 +1,30 @@
1
+ class FeedsuckerFeedsController < ApplicationController
2
+
3
+ before_filter :find_all_feedsucker_feeds
4
+ before_filter :find_page
5
+
6
+ def index
7
+ # you can use meta fields from your model instead (e.g. browser_title)
8
+ # by swapping @page for @feedsucker_feed in the line below:
9
+ present(@page)
10
+ end
11
+
12
+ def show
13
+ @feedsucker_feed = FeedsuckerFeed.find(params[:id])
14
+
15
+ # you can use meta fields from your model instead (e.g. browser_title)
16
+ # by swapping @page for @feedsucker_feed in the line below:
17
+ present(@page)
18
+ end
19
+
20
+ protected
21
+
22
+ def find_all_feedsucker_feeds
23
+ @feedsucker_feeds = FeedsuckerFeed.find(:all, :order => "position ASC")
24
+ end
25
+
26
+ def find_page
27
+ @page = Page.find_by_link_url("/feedsucker_feeds")
28
+ end
29
+
30
+ end
@@ -0,0 +1,70 @@
1
+ require 'rexml/document'
2
+ require 'net/http'
3
+
4
+ class FeedsuckerFeed < ActiveRecord::Base
5
+
6
+ acts_as_indexed :fields => [:title, :nicetitle, :url]
7
+ has_many :posts, :class_name =>'FeedsuckerPost'
8
+
9
+
10
+ validates :title, :presence => true, :uniqueness => true
11
+ validates :url, :presence => true, :uniqueness => true
12
+
13
+ def before_create
14
+ self.number_of_posts ||= 0 # Load all entries/posts by default
15
+ self.delete_preview ||= true # delete all old posts by default
16
+ end
17
+
18
+ def suck!
19
+ #items = self.xpath_post_url ? xml_feed_items : rss_or_atom_feed_items
20
+ items = xml_feed_items
21
+ if items.any?
22
+ last_item = self.number_of_posts > 0 ? self.number_of_posts : items.size
23
+ self.posts.destroy_all if self.delete_preview
24
+ items[0..last_item-1].each do |item|
25
+ unless FeedsuckerPost.find_by_url(item[:post_url])
26
+ self.posts << FeedsuckerPost.create(
27
+ :feedsucker_feed_id => self.id,
28
+ :blog_title => item[:blog_title],
29
+ :blog_url => item[:blog_url],
30
+ :title => item[:post_title],
31
+ :content => item[:post_content],
32
+ :date => item[:post_date],
33
+ :url => item[:post_url])
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ def self.suck_all!
40
+ self.find(:all).each {|feed| feed.suck!}
41
+ end
42
+
43
+ private
44
+ def xml_feed_items
45
+ xmldata = Net::HTTP.get_response(URI.parse(self.url)).body
46
+ xmldoc = REXML::Document.new(xmldata)
47
+ xpath_defaults = xpath_defaults_for(xmldoc)
48
+ xpath = self.xpath_post_url || xpath_defaults[:post_url]
49
+ items = REXML::XPath.match(xmldoc, xpath).map {|url| {:post_url => url.to_s}}
50
+ %w{post_title post_content post_date
51
+ blog_title blog_url}.each do |suffix|
52
+ xpath = self.send("xpath_#{suffix}") || xpath_defaults[suffix.to_sym]
53
+ REXML::XPath.match(xmldoc, xpath).each_with_index do |value, index|
54
+ items[index][suffix.to_sym] = value.to_s
55
+ end
56
+ end
57
+ items
58
+ end
59
+
60
+ def xpath_defaults_for(xmldoc)
61
+ # TODO: xpaths if xmldoc is an Atom feed
62
+ { :blog_title => '//channel/title/text()',
63
+ :blog_url => '//channel/link/text()',
64
+ :post_title => '//item/title/text()',
65
+ :post_url => '//item/link/text()',
66
+ :post_date => '//item/pubDate/text()',
67
+ :post_content => '//item/description/text()' }
68
+ end
69
+
70
+ end
@@ -0,0 +1,22 @@
1
+ class FeedsuckerPost < ActiveRecord::Base
2
+
3
+ belongs_to :feed, :class_name => 'FeedsuckerFeed', :foreign_key => 'feedsucker_feed_id'
4
+ validates_presence_of :feed
5
+
6
+ def method_missing(method, *args, &block)
7
+ if (method.to_s =~ /^(.+)_without_tags$/)
8
+ if str = self.send($1)
9
+ str.gsub!(/&lt;.*?&gt;/,'')
10
+ begin
11
+ strip_tags(str)
12
+ rescue
13
+ ActionController::Base.helpers.strip_tags(str)
14
+ end
15
+ end
16
+ else
17
+ super
18
+ end
19
+ end
20
+
21
+
22
+ end
@@ -0,0 +1,18 @@
1
+ <li class='clearfix record <%= cycle("on", "on-hover") %>' id="<%= dom_id(feedsucker_feed) -%>">
2
+ <span class='title'>
3
+ <%= feedsucker_feed.title %>
4
+ <span class="preview">&nbsp;</span>
5
+ </span>
6
+ <span class='actions'>
7
+ <%= link_to refinery_icon_tag("application_go.png"), feedsucker_feed_url(feedsucker_feed),
8
+ :title => t('.view_live_html'),
9
+ :target => "_blank" %>
10
+ <%= link_to refinery_icon_tag("application_edit.png"), edit_admin_feedsucker_feed_path(feedsucker_feed),
11
+ :title => t('.edit') %>
12
+ <%= link_to refinery_icon_tag("delete.png"), admin_feedsucker_feed_path(feedsucker_feed),
13
+ :class => "cancel confirm-delete",
14
+ :title => t('.delete'),
15
+ :confirm => t('message', :scope => 'shared.admin.delete', :title => feedsucker_feed.title),
16
+ :method => :delete %>
17
+ </span>
18
+ </li>
@@ -0,0 +1,29 @@
1
+ <%= form_for [:admin, @feedsucker_feed] do |f| -%>
2
+ <%= render :partial => "/shared/admin/error_messages", :locals => {
3
+ :object => @feedsucker_feed,
4
+ :include_object_name => true
5
+ } %>
6
+
7
+ <div class='field'>
8
+ <%= f.label :title -%>
9
+ <%= f.text_field :title, :class => 'larger widest' -%>
10
+ </div>
11
+
12
+ <div class='field'>
13
+ <%= f.label :nicetitle -%>
14
+ <%= f.text_field :nicetitle -%>
15
+ </div>
16
+
17
+ <div class='field'>
18
+ <%= f.label :url -%>
19
+ <%= f.text_field :url -%>
20
+ </div>
21
+
22
+ <%= render :partial => "/shared/admin/form_actions",
23
+ :locals => {
24
+ :f => f,
25
+ :continue_editing => false,
26
+ :delete_title => t('delete', :scope => 'admin.feedsucker_feeds.feedsucker_feed'),
27
+ :delete_confirmation => t('message', :scope => 'shared.admin.delete', :title => @feedsucker_feed.title)
28
+ } %>
29
+ <% end -%>
@@ -0,0 +1,4 @@
1
+ <ul id='sortable_list'>
2
+ <%= render :partial => 'feedsucker_feed', :collection => @feedsucker_feeds %>
3
+ </ul>
4
+ <%= render :partial => "/shared/admin/sortable_list", :locals => {:continue_reordering => (defined?(continue_reordering) ? continue_reordering : true)} %>
@@ -0,0 +1 @@
1
+ <%= render :partial => "form" %>
@@ -0,0 +1,56 @@
1
+ <div id='records'>
2
+ <% if searching? %>
3
+ <h2><%= t('results_for', :scope => 'shared.admin.search', :query => params[:search]) %></h2>
4
+ <% end %>
5
+ <% if @feedsucker_feeds.any? %>
6
+ <%= will_paginate @feedsucker_feeds %>
7
+
8
+ <%= render :partial => "sortable_list" %>
9
+
10
+ <%= will_paginate @feedsucker_feeds %>
11
+ <% else %>
12
+ <p>
13
+ <% unless searching? %>
14
+ <strong>
15
+ <%= t('.no_items_yet') %>
16
+ </strong>
17
+ <% else %>
18
+ <%= t('no_results', :scope => 'shared.admin.search') %>
19
+ <% end %>
20
+ </p>
21
+ <% end %>
22
+ </div>
23
+ <div id='actions'>
24
+ <ul>
25
+ <% if Admin::FeedsuckerFeedsController.searchable? %>
26
+ <li>
27
+ <%= render :partial => "/shared/admin/search",
28
+ :locals => {
29
+ :url => admin_feedsucker_feeds_url
30
+ } %>
31
+ </li>
32
+ <% end %>
33
+ <li>
34
+ <%= link_to t('.create_new'), new_admin_feedsucker_feed_url,
35
+ :class => "add_icon" %>
36
+ </li>
37
+ <% if !searching? and FeedsuckerFeed.count > 1 and Admin::FeedsuckerFeedsController.sortable? %>
38
+ <li>
39
+ <%= link_to t('.reorder', :what => "Feedsucker Feeds"),
40
+ admin_feedsucker_feeds_url,
41
+ :id => "reorder_action",
42
+ :class => "reorder_icon" %>
43
+
44
+ <%= link_to t('.reorder_done', :what => "Feedsucker Feeds"),
45
+ admin_feedsucker_feeds_url,
46
+ :id => "reorder_action_done",
47
+ :style => "display: none;",
48
+ :class => "reorder_icon" %>
49
+ </li>
50
+ <% end %>
51
+ </ul>
52
+ </div>
53
+ <%= render :partial => "/shared/admin/make_sortable",
54
+ :locals => {
55
+ :tree => false
56
+ } if !searching? and FeedsuckerFeed.count > 1 %>
@@ -0,0 +1 @@
1
+ <%= render :partial => "form" %>
@@ -0,0 +1,11 @@
1
+ <% content_for :body_content_left do %>
2
+ <ul id="feedsucker_feeds">
3
+ <% @feedsucker_feeds.each do |feedsucker_feed| %>
4
+ <li>
5
+ <%= link_to feedsucker_feed.title, feedsucker_feed_url(feedsucker_feed) %>
6
+ </li>
7
+ <% end %>
8
+ </ul>
9
+ <% end %>
10
+
11
+ <%= render :partial => "/shared/content_page" %>
@@ -0,0 +1,40 @@
1
+ <% content_for :body_content_title do %>
2
+ <%= @feedsucker_feed.title %>
3
+ <% end %>
4
+
5
+ <% content_for :body_content_left do %>
6
+
7
+ <section>
8
+ <h1>Title</h1>
9
+ <p> <%=raw @feedsucker_feed.title %>
10
+ </p>
11
+ </section>
12
+
13
+ <section>
14
+ <h1>Nicetitle</h1>
15
+ <p> <%=raw @feedsucker_feed.nicetitle %>
16
+ </p>
17
+ </section>
18
+
19
+ <section>
20
+ <h1>Url</h1>
21
+ <p> <%=raw @feedsucker_feed.url %>
22
+ </p>
23
+ </section>
24
+
25
+ <% end %>
26
+
27
+ <% content_for :body_content_right do %>
28
+ <aside>
29
+ <h2><%= t('.other') %></h2>
30
+ <ul id="feedsucker_feeds">
31
+ <% @feedsucker_feeds.each do |feedsucker_feed| %>
32
+ <li>
33
+ <%= link_to feedsucker_feed.title, feedsucker_feed_url(feedsucker_feed) %>
34
+ </li>
35
+ <% end %>
36
+ </ul>
37
+ </aside>
38
+ <% end %>
39
+
40
+ <%= render :partial => "/shared/content_page" %>
@@ -0,0 +1,24 @@
1
+ en:
2
+ shared:
3
+ admin:
4
+ image_picker:
5
+ image: image
6
+ plugins:
7
+ feedsucker_feeds:
8
+ title: Feedsucker Feeds
9
+ admin:
10
+ feedsucker_feeds:
11
+ index:
12
+ title: Feedsucker Feeds
13
+ create_new: Add New Feedsucker Feed
14
+ reorder: Reorder Feedsucker Feeds
15
+ reorder_done: Done Reordering Feedsucker Feeds
16
+ sorry_no_results: Sorry! There are no results found.
17
+ no_items_yet: There are no Feedsucker Feeds yet. Click "Add New Feedsucker Feed" to add your first feedsucker feed.
18
+ feedsucker_feed:
19
+ view_live_html: View this feedsucker feed live <br/><em>(opens in a new window)</em>
20
+ edit: Edit this feedsucker feed
21
+ delete: Remove this feedsucker feed forever
22
+ feedsucker_feeds:
23
+ show:
24
+ other: Other Feedsucker Feeds
@@ -0,0 +1,24 @@
1
+ es:
2
+ shared:
3
+ admin:
4
+ image_picker:
5
+ image: image
6
+ plugins:
7
+ feedsucker_feeds:
8
+ title: Feeds
9
+ admin:
10
+ feedsucker_feeds:
11
+ index:
12
+ title: Feeds
13
+ create_new: Añadir nuevo feed
14
+ reorder: Reordenar feeds
15
+ reorder_done: Ya he terminado
16
+ sorry_no_results: ¡Lo sentimos, no hay resultados!
17
+ no_items_yet: Todavía no se ha creado ningún feed. Haz clic en "Añadir nuevo feed" para crear el primero
18
+ feedsucker_feed:
19
+ view_live_html: Ver este feed en la página </em>(en una nueva ventana)</em>
20
+ edit: Editar este feed
21
+ delete: Eliminar este feed
22
+ feedsucker_feeds:
23
+ show:
24
+ other: Otros feeds
@@ -0,0 +1,24 @@
1
+ lolcat:
2
+ shared:
3
+ admin:
4
+ image_picker:
5
+ image: IMAGE
6
+ plugins:
7
+ feedsucker_feeds:
8
+ title: Feedsucker Feeds
9
+ admin:
10
+ feedsucker_feeds:
11
+ index:
12
+ title: Feedsucker Feeds
13
+ create_new: CREATE NEW Feedsucker Feed
14
+ reorder: REORDR Feedsucker Feeds
15
+ reorder_done: DUN REORDERIN Feedsucker Feeds
16
+ sorry_no_results: SRY! THAR R NO RESULTS FINDZ.
17
+ no_items_yet: THAR R NO Feedsucker Feeds YET. CLICK "CREATE NEW Feedsucker Feed" 2 ADD UR FURST feedsucker feed.
18
+ feedsucker_feed:
19
+ view_live_html: VIEW DIS feedsucker feed LIV <BR/><EM>(OPENS IN NEW WINDOW)</EM>
20
+ edit: EDIT DIS feedsucker feed
21
+ delete: REMOOV DIS feedsucker feed FOREVR
22
+ feedsucker_feeds:
23
+ show:
24
+ other: OTHR Feedsucker Feeds
@@ -0,0 +1,20 @@
1
+ nb:
2
+ plugins:
3
+ feedsucker_feeds:
4
+ title: Feedsucker Feeds
5
+ admin:
6
+ feedsucker_feeds:
7
+ index:
8
+ title: Feedsucker Feeds
9
+ create_new: Lag en ny Feedsucker Feed
10
+ reorder: Endre rekkefølgen på Feedsucker Feeds
11
+ reorder_done: Ferdig å endre rekkefølgen Feedsucker Feeds
12
+ sorry_no_results: Beklager! Vi fant ikke noen resultater.
13
+ no_items_yet: Det er ingen Feedsucker Feeds enda. Klikk på "Lag en ny Feedsucker Feed" for å legge til din første feedsucker feed.
14
+ feedsucker_feed:
15
+ view_live_html: Vis hvordan denne feedsucker feed ser ut offentlig <br/><em>(åpner i et nytt vindu)</em>
16
+ edit: Rediger denne feedsucker feed
17
+ delete: Fjern denne feedsucker feed permanent
18
+ feedsucker_feeds:
19
+ show:
20
+ other: Andre Feedsucker Feeds
@@ -0,0 +1,20 @@
1
+ nl:
2
+ plugins:
3
+ feedsucker_feeds:
4
+ title: Feedsucker Feeds
5
+ admin:
6
+ feedsucker_feeds:
7
+ index:
8
+ title: Feedsucker Feeds
9
+ create_new: Maak een nieuwe Feedsucker Feed
10
+ reorder: Wijzig de volgorde van de Feedsucker Feeds
11
+ reorder_done: Klaar met het wijzingen van de volgorde van de Feedsucker Feeds
12
+ sorry_no_results: Helaas! Er zijn geen resultaten gevonden.
13
+ no_items_yet: Er zijn nog geen Feedsucker Feeds. Druk op 'Maak een nieuwe Feedsucker Feed' om de eerste aan te maken.
14
+ feedsucker_feed:
15
+ view_live_html: Bekijk deze feedsucker feed op de website <br/><em>(opent een nieuw venster)</em>
16
+ edit: Bewerk deze feedsucker feed
17
+ delete: Verwijder deze feedsucker feed voor eeuwig
18
+ feedsucker_feeds:
19
+ show:
20
+ other: Andere Feedsucker Feeds
@@ -0,0 +1,11 @@
1
+ Refinery::Application.routes.draw do
2
+ resources :feedsucker_feeds, :only => [:index, :show]
3
+
4
+ scope(:path => 'refinery', :as => 'admin', :module => 'admin') do
5
+ resources :feedsucker_feeds, :except => :show do
6
+ collection do
7
+ post :update_positions
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ class RefinerycmsFeedsuckerFeeds < Refinery::Generators::EngineInstaller
2
+
3
+ source_root File.expand_path('../../../', __FILE__)
4
+ engine_name "feedsucker_feeds"
5
+
6
+ end
@@ -0,0 +1,19 @@
1
+ require 'refinery'
2
+
3
+ module Refinery
4
+ module FeedsuckerFeeds
5
+ class Engine < Rails::Engine
6
+ initializer "static assets" do |app|
7
+ app.middleware.insert_after ::ActionDispatch::Static, ::ActionDispatch::Static, "#{root}/public"
8
+ end
9
+
10
+ config.after_initialize do
11
+ Refinery::Plugin.register do |plugin|
12
+ plugin.name = "feedsucker_feeds"
13
+ plugin.activity = {
14
+ :class => FeedsuckerFeed}
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ namespace :refinery do
2
+
3
+ namespace :feedsucker do
4
+
5
+ # call this task my running: rake refinery:feedsucker_feeds:my_task
6
+ # desc "Description of my task below"
7
+ # task :my_task => :environment do
8
+ # # add your logic here
9
+ # end
10
+
11
+ desc "Suck all feeds"
12
+ task :suck_all => :environment do
13
+ FeedsuckerFeed.find(:all).each do |feed|
14
+ feed.suck!
15
+ end
16
+ end
17
+
18
+ end
19
+
20
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: refinerycms-feedsucker
3
+ version: !ruby/object:Gem::Version
4
+ hash: 15
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 0
9
+ version: "1.0"
10
+ platform: ruby
11
+ authors:
12
+ - The Cocktail
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-02-01 00:00:00 +01:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: refinerycms
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 41
29
+ segments:
30
+ - 0
31
+ - 9
32
+ - 9
33
+ version: 0.9.9
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ description: Ruby on Rails Feedsucker engine for Refinery CMS
37
+ email:
38
+ executables: []
39
+
40
+ extensions: []
41
+
42
+ extra_rdoc_files: []
43
+
44
+ files:
45
+ - lib/generators/refinerycms_feedsucker_feeds_generator.rb
46
+ - lib/refinerycms-feedsucker_feeds.rb
47
+ - lib/tasks/feedsucker_feeds.rake
48
+ - config/locales/en.yml
49
+ - config/locales/es.yml
50
+ - config/locales/lolcat.yml
51
+ - config/locales/nb.yml
52
+ - config/locales/nl.yml
53
+ - config/routes.rb
54
+ - app/controllers/admin/feedsucker_feeds_controller.rb
55
+ - app/controllers/feedsucker_feeds_controller.rb
56
+ - app/models/feedsucker_feed.rb
57
+ - app/models/feedsucker_post.rb
58
+ - app/views/admin/feedsucker_feeds/_feedsucker_feed.html.erb
59
+ - app/views/admin/feedsucker_feeds/_form.html.erb
60
+ - app/views/admin/feedsucker_feeds/_sortable_list.html.erb
61
+ - app/views/admin/feedsucker_feeds/edit.html.erb
62
+ - app/views/admin/feedsucker_feeds/index.html.erb
63
+ - app/views/admin/feedsucker_feeds/new.html.erb
64
+ - app/views/feedsucker_feeds/index.html.erb
65
+ - app/views/feedsucker_feeds/show.html.erb
66
+ has_rdoc: true
67
+ homepage: http://github.com/thecocktail/refinerycms-feedsucker
68
+ licenses: []
69
+
70
+ post_install_message:
71
+ rdoc_options: []
72
+
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ hash: 3
81
+ segments:
82
+ - 0
83
+ version: "0"
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ hash: 3
90
+ segments:
91
+ - 0
92
+ version: "0"
93
+ requirements: []
94
+
95
+ rubyforge_project:
96
+ rubygems_version: 1.3.7
97
+ signing_key:
98
+ specification_version: 3
99
+ summary: Feedsucker engine for Refinery CMS
100
+ test_files: []
101
+