yodel_blog 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/lib/layouts/blog.atom +32 -0
- data/lib/migrations/01_blog_model.rb +13 -0
- data/lib/migrations/02_article_model.rb +20 -0
- data/lib/migrations/03_update_blog_fields_for_admin.rb +21 -0
- data/lib/models/blog.rb +84 -0
- data/lib/yodel_blog.rb +3 -0
- data/yodel_blog.gemspec +22 -0
- metadata +55 -0
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,32 @@
|
|
1
|
+
xml.instruct!
|
2
|
+
|
3
|
+
xml.feed "xmlns" => "http://www.w3.org/2005/Atom" do
|
4
|
+
xml.title self.title
|
5
|
+
xml.link "rel" => "self", "href" => request.url
|
6
|
+
xml.link "rel" => "alternate", "href" => URI.escape(request.scheme_and_host + self.path)
|
7
|
+
xml.id request.url
|
8
|
+
xml.updated articles.first.published.strftime "%Y-%m-%dT%H:%M:%SZ" if articles.any?
|
9
|
+
xml.summary "" # FIXME: implement
|
10
|
+
xml.author do
|
11
|
+
xml.name site.name
|
12
|
+
end
|
13
|
+
|
14
|
+
articles.each do |article|
|
15
|
+
xml.entry do
|
16
|
+
xml.title article.title
|
17
|
+
xml.link "rel" => "alternate", "href" => article.path
|
18
|
+
xml.id URI.escape(request.scheme_and_host + article.path)
|
19
|
+
xml.updated article.published.strftime "%Y-%m-%dT%H:%M:%SZ"
|
20
|
+
xml.author { xml.name article.author.name } if !article.author.nil?
|
21
|
+
xml.summary article.content #HTML.new(article.content).to_text # FIXME: implement correctly
|
22
|
+
|
23
|
+
xml.content "type" => "html" do
|
24
|
+
xml.text! article.content
|
25
|
+
end
|
26
|
+
|
27
|
+
#unless article.attachment.nil?
|
28
|
+
# xml.link "rel" => "enclosure", "type" => article.attachment.mime_type, "href" => URI.escape(request.scheme_and_host + article.attachment.url.to_s), "length" => article.attachment.length
|
29
|
+
#end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class BlogModelMigration < Migration
|
2
|
+
def self.up(site)
|
3
|
+
site.pages.create_model :blogs do |blogs|
|
4
|
+
add_field :articles_per_page, :integer, default: 5
|
5
|
+
add_field :blog, :self
|
6
|
+
blogs.record_class_name = 'Blog'
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.down(site)
|
11
|
+
site.blogs.destroy
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class ArticleModelMigration < Migration
|
2
|
+
def self.up(site)
|
3
|
+
site.pages.create_model :articles do |articles|
|
4
|
+
add_field :published, :time
|
5
|
+
add_field :tags, :tags
|
6
|
+
add_field :blog, :alias, of: :parent
|
7
|
+
add_field :search_title, :function, fn: 'format("News: {{title}}")'
|
8
|
+
add_one :author, model: :user
|
9
|
+
articles.allowed_parents = [site.blogs]
|
10
|
+
end
|
11
|
+
|
12
|
+
site.blogs.modify do |blogs|
|
13
|
+
blogs.allowed_children = [site.articles]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.down(site)
|
18
|
+
site.articles.destroy
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class UpdateBlogFieldsForAdminMigration < Migration
|
2
|
+
def self.up(site)
|
3
|
+
site.blogs.modify do |blogs|
|
4
|
+
blogs.modify_field :articles_per_page, section: 'Options'
|
5
|
+
end
|
6
|
+
|
7
|
+
site.articles.modify do |articles|
|
8
|
+
articles.modify_field :author, show_blank: true, blank_text: 'None'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.down(site)
|
13
|
+
site.blogs.modify do |blogs|
|
14
|
+
blogs.modify_field :articles_per_page, section: nil
|
15
|
+
end
|
16
|
+
|
17
|
+
site.articles.modify do |articles|
|
18
|
+
articles.modify_field :author, show_blank: false, blank_text: nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/models/blog.rb
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
class Blog < Page
|
2
|
+
respond_to :get do
|
3
|
+
with :atom do |xml|
|
4
|
+
@xml = xml
|
5
|
+
layout('atom').render(self)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def xml
|
10
|
+
@xml
|
11
|
+
end
|
12
|
+
|
13
|
+
def articles
|
14
|
+
return @articles if @articles
|
15
|
+
query = site.articles.where(parent: id).order('published desc')
|
16
|
+
|
17
|
+
# FIXME: merge in to search page
|
18
|
+
if params['tag']
|
19
|
+
@tag = params['tag']
|
20
|
+
query = query.where(tags: @tag)
|
21
|
+
@page_params = "tag=#{params['tag']}&"
|
22
|
+
elsif params['month'] && params['year']
|
23
|
+
@month = [[params['month'].to_i, 1].max, 12].min # constrain the month between 1..12
|
24
|
+
@year = params['year'].to_i
|
25
|
+
query = query.where(:published.gte => Time.local(@year, @month, 1), :published.lte => Time.local(@year, @month + 1, 1))
|
26
|
+
@page_params = "year=#{params['year']}&month=#{params['month']}&"
|
27
|
+
else
|
28
|
+
@page_params = ''
|
29
|
+
end
|
30
|
+
|
31
|
+
@total_articles = query.count
|
32
|
+
@number_of_pages = (@total_articles.to_f / articles_per_page).ceil
|
33
|
+
query.limit(articles_per_page).skip(page_number * articles_per_page).all
|
34
|
+
end
|
35
|
+
|
36
|
+
def first_page?
|
37
|
+
page_number == 0
|
38
|
+
end
|
39
|
+
|
40
|
+
def last_page?
|
41
|
+
page_number == @number_of_pages - 1
|
42
|
+
end
|
43
|
+
|
44
|
+
def page_number
|
45
|
+
@page_number ||= params['page'].to_i
|
46
|
+
end
|
47
|
+
|
48
|
+
def tag_path(tag)
|
49
|
+
"#{path}?tag=#{CGI::escape(tag || '')}"
|
50
|
+
end
|
51
|
+
|
52
|
+
def month_path(month, year)
|
53
|
+
"#{path}?month=#{month}&year=#{year}"
|
54
|
+
end
|
55
|
+
|
56
|
+
def all_article_months
|
57
|
+
counts = Hash.new(0)
|
58
|
+
|
59
|
+
# generate a count of articles for each month
|
60
|
+
children.each do |child|
|
61
|
+
date = child.published.at_beginning_of_month
|
62
|
+
counts[date] += 1
|
63
|
+
end
|
64
|
+
|
65
|
+
# collect the months into an array of counted values
|
66
|
+
months = counts.each_pair.collect {|date, count| OpenStruct.new(date: date, count: count, path: month_path(date.month, date.year))}
|
67
|
+
months.sort_by(&:date).reverse
|
68
|
+
end
|
69
|
+
|
70
|
+
def all_article_tags
|
71
|
+
counts = Hash.new(0)
|
72
|
+
|
73
|
+
# count the number of articles each tag appears in
|
74
|
+
children.each do |child|
|
75
|
+
child.tags.each do |tag|
|
76
|
+
counts[tag] += 1
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# collect the tags into an array of counted values
|
81
|
+
tags = counts.each_pair.collect {|tag, count| OpenStruct.new(tag: tag, count: count, path: tag_path(tag))}
|
82
|
+
tags.sort_by(&:count).reverse
|
83
|
+
end
|
84
|
+
end
|
data/lib/yodel_blog.rb
ADDED
data/yodel_blog.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "yodel_blog"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'yodel_blog'
|
7
|
+
s.version = YodelBlog::VERSION
|
8
|
+
s.authors = ['Will Cannings']
|
9
|
+
s.email = ['me@willcannings.com']
|
10
|
+
s.homepage = 'http://yodelcms.com'
|
11
|
+
s.summary = 'Yodel CMS Blog Extension'
|
12
|
+
s.description = 'Yodel CMS Blog Extension'
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
|
19
|
+
# specify any dependencies here; for example:
|
20
|
+
# s.add_development_dependency "rspec"
|
21
|
+
# s.add_runtime_dependency "rest-client"
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: yodel_blog
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Will Cannings
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-12-09 00:00:00.000000000Z
|
13
|
+
dependencies: []
|
14
|
+
description: Yodel CMS Blog Extension
|
15
|
+
email:
|
16
|
+
- me@willcannings.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- .gitignore
|
22
|
+
- Gemfile
|
23
|
+
- Rakefile
|
24
|
+
- lib/layouts/blog.atom
|
25
|
+
- lib/migrations/01_blog_model.rb
|
26
|
+
- lib/migrations/02_article_model.rb
|
27
|
+
- lib/migrations/03_update_blog_fields_for_admin.rb
|
28
|
+
- lib/models/blog.rb
|
29
|
+
- lib/yodel_blog.rb
|
30
|
+
- yodel_blog.gemspec
|
31
|
+
homepage: http://yodelcms.com
|
32
|
+
licenses: []
|
33
|
+
post_install_message:
|
34
|
+
rdoc_options: []
|
35
|
+
require_paths:
|
36
|
+
- lib
|
37
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ! '>='
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
44
|
+
none: false
|
45
|
+
requirements:
|
46
|
+
- - ! '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
requirements: []
|
50
|
+
rubyforge_project:
|
51
|
+
rubygems_version: 1.8.10
|
52
|
+
signing_key:
|
53
|
+
specification_version: 3
|
54
|
+
summary: Yodel CMS Blog Extension
|
55
|
+
test_files: []
|