diff --git a/Gemfile b/Gemfile index ba3c61d..195f03e 100644 --- a/Gemfile +++ b/Gemfile @@ -32,6 +32,10 @@ gem "oauth" # for parsing incoming mail gem "mail" +# for planet rss aggregation +gem "feed-normalizer" +gem "loofah" + group :test, :development do gem "rspec-rails", "~> 2.6" gem "machinist" diff --git a/Gemfile.lock b/Gemfile.lock index 372bafd..ccf5b51 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -39,7 +39,11 @@ GEM execjs (2.2.1) faker (1.4.2) i18n (~> 0.5) + feed-normalizer (1.5.2) + hpricot (>= 0.6) + simple-rss (>= 1.1) hike (1.2.3) + hpricot (0.8.6) htmlentities (4.3.2) i18n (0.6.11) innertube (1.1.0) @@ -48,6 +52,8 @@ GEM thor (>= 0.14, < 2.0) json (1.8.1) kgio (2.9.2) + loofah (2.0.0) + nokogiri (>= 1.5.9) machinist (2.0) mail (2.5.4) mime-types (~> 1.16) @@ -97,6 +103,7 @@ GEM rspec-core (~> 2.99.0) rspec-expectations (~> 2.99.0) rspec-mocks (~> 2.99.0) + simple-rss (1.3.1) sprockets (2.12.1) hike (~> 1.2) multi_json (~> 1.0) @@ -136,8 +143,10 @@ DEPENDENCIES dynamic_form exception_notification faker + feed-normalizer htmlentities jquery-rails + loofah machinist mail mysql2 (>= 0.3.14) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index ce754cb..4130afe 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -494,6 +494,10 @@ li .domain { font-size: 8.5pt; vertical-align: middle; } +li .domain a { + color: #888; + text-decoration: none; +} .merge { background: url(data:image/png;base64,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) no-repeat; @@ -1121,3 +1125,10 @@ div.fieldWithErrors { font-style: italic; padding-left: 0.5em; } + + + +div.weblog_content { + padding: 0 2em; + overflow-x: auto; +} diff --git a/app/controllers/settings_controller.rb b/app/controllers/settings_controller.rb index 945324f..7cbaed8 100644 --- a/app/controllers/settings_controller.rb +++ b/app/controllers/settings_controller.rb @@ -38,7 +38,7 @@ private :email_replies, :email_messages, :email_mentions, :pushover_replies, :pushover_messages, :pushover_mentions, :pushover_user_key, :pushover_device, :pushover_sound, - :mailing_list_mode, + :mailing_list_mode, :weblog_feed_url ) end end diff --git a/app/controllers/weblogs_controller.rb b/app/controllers/weblogs_controller.rb new file mode 100644 index 0000000..8345690 --- /dev/null +++ b/app/controllers/weblogs_controller.rb @@ -0,0 +1,24 @@ +class WeblogsController < ApplicationController + before_filter { @page = page } + + WEBLOGS_PER_PAGE = 10 + + def index + @pages = (Weblog.count / WEBLOGS_PER_PAGE.to_f).ceil + if @page > @pages + @page = @pages + end + @show_more = @page < @pages + + @weblogs = Weblog.order("created_at DESC"). + offset((@page - 1) * WEBLOGS_PER_PAGE). + limit(WEBLOGS_PER_PAGE) + + render :action => "index" + end + +private + def page + params[:page].to_i > 0 ? params[:page].to_i : 1 + end +end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 2a451b9..00ce8b8 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -16,4 +16,8 @@ module ApplicationHelper label_tag(nil, time_ago_in_words(*args), :title => args.first.strftime("%F %T %z")) end + + def main_root_url + Rails.application.routes.url_helpers.root_url + end end diff --git a/app/models/user.rb b/app/models/user.rb index f3abc17..ebbc906 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -19,6 +19,7 @@ class User < ActiveRecord::Base belongs_to :banned_by_user, :class_name => "User" has_many :invitations + has_many :weblogs has_secure_password @@ -31,6 +32,10 @@ class User < ActiveRecord::Base :format => { :with => /\A[A-Za-z0-9][A-Za-z0-9_-]{0,24}\Z/ }, :uniqueness => { :case_sensitive => false } + validates :weblog_feed_url, + :format => { :with => /\Ahttps?:\/\/([^\.]+\.)+[a-z]+(\/|\z)/ }, + :allow_blank => true + validates_each :username do |record,attr,value| if BANNED_USERNAMES.include?(value.to_s.downcase) record.errors.add(attr, "is not permitted") diff --git a/app/models/weblog.rb b/app/models/weblog.rb new file mode 100644 index 0000000..7bca796 --- /dev/null +++ b/app/models/weblog.rb @@ -0,0 +1,9 @@ +class Weblog < ActiveRecord::Base + belongs_to :user + + serialize :tags, Array + + def sanitized_content + Loofah.fragment(self.content).scrub!(:strip).scrub!(:nofollow).to_s.html_safe + end +end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index d4e2dc0..adf048f 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -65,7 +65,7 @@ -