refinerycms-feedsucker 1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
+