who-needs-wp 0.5.2 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -82,7 +82,7 @@ who-needs-wp can place a [Twitter][Twitter] stream in the side bar. This can eit
82
82
  Modifying `.who-needs-wp.yaml` and add:
83
83
 
84
84
  :twitter:
85
- :user: <your twitter user>
85
+ :username: <your twitter user>
86
86
  :search: <your twitter search>
87
87
 
88
88
  ## Delicious
@@ -0,0 +1,33 @@
1
+ module WhoNeedsWP
2
+ # Abstract class to be implemented by all sidebar elements
3
+ class Sidebar
4
+ # A list of Sidebar instances which will be rendered
5
+ @@content = []
6
+
7
+ # The HTML output of all of the sidebar instances combined
8
+ @@generated = nil
9
+
10
+ # Iterate through all of the side bar instances, render them and return as HTML
11
+ def self.render_all
12
+ if @@generated == nil
13
+ retval = []
14
+ @@content.each do |content|
15
+ retval << content.render
16
+ end
17
+ @@generated = retval.join
18
+ end
19
+ return @@generated
20
+ end
21
+
22
+ # Create a new instance of this sidebar
23
+ def initialize
24
+ @logger = Logger.new(STDOUT)
25
+ @@content << self
26
+ end
27
+
28
+ # Render this peice of sidebar content. Returns HTML.
29
+ def render
30
+ # To be implemented.
31
+ end
32
+ end
33
+ end
@@ -14,13 +14,9 @@ module WhoNeedsWP
14
14
  }
15
15
  end
16
16
  end
17
-
18
-
19
- def self.page_index
20
- @sidebar << @template['pageindex'].render(Object.new, {
21
- :pages => @pages,
22
- :options => @options
23
- })
17
+
18
+ def self.get_pages
19
+ @pages
24
20
  end
25
21
 
26
22
  def self.generate_pages
@@ -1,7 +1,7 @@
1
1
 
2
2
  module WhoNeedsWP
3
3
  def self.load_posts
4
- @POSTS = []
4
+ @posts = []
5
5
  Dir.glob('posts/**/*.markdown').each do |filename|
6
6
  @logger.debug "Loading post #{filename}"
7
7
  match = filename.match(/([0-9]{4})\/([0-9]{2})\/([0-9]{2})\/([^\.]*)/)
@@ -16,37 +16,25 @@ module WhoNeedsWP
16
16
  :created_at => date
17
17
  }
18
18
  # Generate a unique post ID to be used in the Atom feed
19
- post[:id] = "#{options[:url]}#{generated_filename}".gsub(/http:\/\//, 'tag:')
19
+ post[:id] = "#{@options[:url]}#{generated_filename}".gsub(/http:\/\//, 'tag:')
20
20
  match = post[:id].match(/([^\/]*)\/(.*)/)
21
21
  post[:id] = "#{match[1]},#{date.strftime('%Y-%m-%d')}:#{match[2]}" if match
22
22
  # Append the post to the global list of posts
23
- @POSTS << post
23
+ @posts << post
24
24
  end
25
25
  # Sort the posts, newest first
26
- @POSTS.sort! { |a, b| a[:created_at] <=> b[:created_at] }
27
- @POSTS.reverse!
26
+ @posts.sort! { |a, b| a[:created_at] <=> b[:created_at] }
27
+ @posts.reverse!
28
28
  end
29
-
30
-
31
- def self.recentposts
32
- @sidebar << @template['recentposts'].render(Object.new, {
33
- :posts => @POSTS[0..5],
34
- :options => @options
35
- })
36
- end
37
-
38
- def self.options
39
- return @options
40
- end
41
-
42
- def self.POSTS
43
- return @POSTS
29
+
30
+ def self.get_posts
31
+ return @posts
44
32
  end
45
33
 
46
34
  def self.rss(filename, limit=10)
47
35
  file = File.open(filename, "w")
48
36
  file.write @template['rss'].render(Object.new, {
49
- :posts => @POSTS[0..limit],
37
+ :posts => @posts[0..limit],
50
38
  :options => @options
51
39
  })
52
40
  file.close
@@ -55,18 +43,18 @@ module WhoNeedsWP
55
43
  def self.atom(filename, limit=10)
56
44
  file = File.open(filename, "w")
57
45
  file.write @template['atom'].render(Object.new, {
58
- :posts => @POSTS[0..limit],
46
+ :posts => @posts[0..limit],
59
47
  :options => @options
60
48
  })
61
49
  file.close
62
50
  end
63
51
 
64
52
  def self.generate_posts
65
- @POSTS.each_index do |index|
53
+ @posts.each_index do |index|
66
54
  # Calculate the previous and next posts
67
- post = @POSTS[index]
68
- previous_post = @POSTS[index + 1] if index + 1 < @POSTS.length
69
- next_post = @POSTS[index - 1] if index > 1
55
+ post = @posts[index]
56
+ previous_post = @posts[index + 1] if index + 1 < @posts.length
57
+ next_post = @posts[index - 1] if index > 1
70
58
 
71
59
  # Read the contents of the file
72
60
  markdown = File.read(post[:filename][:original])
@@ -0,0 +1,41 @@
1
+ require 'nokogiri'
2
+
3
+ module WhoNeedsWP
4
+ class Delicious < Sidebar
5
+ # Create a new Delicious sidebar
6
+ def initialize(username)
7
+ super()
8
+ @username = username
9
+ validate_options
10
+ end
11
+
12
+ # See Sidebar.render
13
+ def render
14
+ WhoNeedsWP::render_template("delicious", { :posts => get_bookmarks })
15
+ end
16
+
17
+ private
18
+
19
+ # Ensure that the Delicious username is set
20
+ def validate_options
21
+ if @username == nil or @username.empty?
22
+ raise "You need to provide a Delicious username"
23
+ end
24
+ end
25
+
26
+ # Return a list of bookmarks from Delicious
27
+ def get_bookmarks
28
+ @logger.debug "Fetching bookmarks from Delicious"
29
+ bookmarks = []
30
+ doc = Nokogiri::XML(open("http://feeds.delicious.com/v2/rss/#{@username}?count=5"))
31
+ doc.xpath('//channel/item').each do |item|
32
+ bookmarks << {
33
+ :title => (item/'title').first.content,
34
+ :url => (item/'link').first.content,
35
+ :date => Date.parse((item/'pubDate').first.content)
36
+ }
37
+ end
38
+ return bookmarks
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,9 @@
1
+ module WhoNeedsWP
2
+ # A sidebar component to display a list of pages
3
+ class PageIndex < Sidebar
4
+ # See Sidebar.render
5
+ def render
6
+ WhoNeedsWP::render_template("pageindex", { :pages => WhoNeedsWP::get_pages })
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module WhoNeedsWP
2
+ # A sidebar component to display a list of recent posts
3
+ class RecentPosts < Sidebar
4
+ # See Sidebar.render
5
+ def render
6
+ WhoNeedsWP::render_template("recentposts", { :posts => WhoNeedsWP::get_posts[0..5] })
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,85 @@
1
+ require 'twitter'
2
+
3
+ module WhoNeedsWP
4
+ # A class combining all the common functions required by Twitter sidebar components
5
+ class TwitterSidebar < Sidebar
6
+ protected
7
+ # Format a Tweet so that all the links appear in HTML
8
+ def format_text(text)
9
+ text = text.gsub(/(http:\/\/[^ ]+)/, '<a href="\1">\1</a>')
10
+ text = text.gsub(/(@([^ :]+))/, '<a href="http://twitter.com/\2">\1</a>')
11
+ return text.gsub(/(#([^ :]+))/, '<a href="http://twitter.com/#search?q=%23\2">\1</a>')
12
+ end
13
+
14
+ # Format all the tweets in the specified list
15
+ def format_tweets(tweets)
16
+ tweets.each do |tweet|
17
+ tweet[:html] = format_text(tweet[:text])
18
+ end
19
+ end
20
+ end
21
+
22
+ # A Sidebar component which displays a list of a user's tweets
23
+ class TwitterFeed < TwitterSidebar
24
+ # Create a new Twitter sidebar based on "username"'s tweets
25
+ def initialize(username)
26
+ super()
27
+ @username = username
28
+ validate_options
29
+ end
30
+
31
+ # See Sidebar.render
32
+ def render
33
+ WhoNeedsWP::render_template("twitter", {
34
+ :tweets => tweets,
35
+ :feed_title => "@#{@username}"
36
+ })
37
+ end
38
+
39
+ private
40
+
41
+ # Ensure the the Twitter username is set
42
+ def validate_options
43
+ if @username == nil or @username.empty?
44
+ raise "You need to provide a Twitter username"
45
+ end
46
+ end
47
+
48
+ # Return a list of tweets for the specified user
49
+ def tweets(per_page = 5)
50
+ return format_tweets(Twitter::Search.new.from(@username).per_page(per_page).fetch().results)
51
+ end
52
+ end
53
+
54
+ # A Sidebar component which displays a twitter search term
55
+ class TwitterSearch < TwitterSidebar
56
+ # Create a new Twitter sidebar based on a search of "term"
57
+ def initialize(term)
58
+ super()
59
+ @term = term
60
+ validate_options
61
+ end
62
+
63
+ # See Sidebar.render
64
+ def render
65
+ WhoNeedsWP::render_template("twitter", {
66
+ :tweets => tweets,
67
+ :feed_title => "Tweets for \"#{@term}\""
68
+ })
69
+ end
70
+
71
+ private
72
+
73
+ # Ensure the the Twitter search term is set
74
+ def validate_options
75
+ if @term == nil or @term.empty?
76
+ raise "You need to provide a Twitter search term"
77
+ end
78
+ end
79
+
80
+ # Return a list of tweets for the specified user
81
+ def tweets(per_page = 5)
82
+ return format_tweets(Twitter::Search.new(@term).per_page(per_page).fetch().results)
83
+ end
84
+ end
85
+ end
@@ -7,4 +7,4 @@
7
7
  - tweets.each do |tweet|
8
8
  %li
9
9
  %span.date= Date.parse(tweet[:created_at]).strftime('%Y-%m-%d')
10
- %span= WhoNeedsWP::parse_tweet tweet[:text]
10
+ %span= tweet[:html]
@@ -1,21 +1,24 @@
1
-
2
-
3
1
  module WhoNeedsWP
2
+ # Render the specified template with the given options
3
+ def self.render_template(name, data)
4
+ data[:options] = @options
5
+ @template[name].render(Object.new, data)
6
+ end
4
7
 
5
8
  # Render the specified HTML contents within the layout template
6
9
  def self.render_html(filename, type, contents, title = "")
7
10
  File.open(filename, "w") do |file|
8
11
  body = @template['body'].render(Object.new, {
9
- :content => contents,
10
- :options => @options,
11
- :sidebar => @sidebar.join,
12
- :layout_name => type
13
- })
12
+ :content => contents,
13
+ :options => @options,
14
+ :sidebar => Sidebar.render_all,
15
+ :layout_name => type
16
+ })
14
17
  file.puts @template['layout'].render(Object.new, {
15
- :content => body,
16
- :options => @options,
17
- :title => title
18
- })
18
+ :content => body,
19
+ :options => @options,
20
+ :title => title
21
+ })
19
22
  end
20
23
  end
21
24
 
data/lib/who-needs-wp.rb CHANGED
@@ -2,8 +2,8 @@
2
2
  require 'rubygems'
3
3
  require 'rdiscount'
4
4
  require 'haml'
5
- require 'twitter'
6
- require 'nokogiri'
5
+
6
+
7
7
  require 'open-uri'
8
8
  require 'sass'
9
9
  require 'makers-mark'
@@ -12,8 +12,11 @@ require 'rss/maker'
12
12
  require 'net/ssh'
13
13
  require 'net/sftp'
14
14
  require 'who-needs-wp/css.rb'
15
- require 'who-needs-wp/twitter.rb'
16
- require 'who-needs-wp/delicious.rb'
15
+ require 'who-needs-wp/Sidebar.rb'
16
+ require 'who-needs-wp/sidebar/twitter.rb'
17
+ require 'who-needs-wp/sidebar/delicious.rb'
18
+ require 'who-needs-wp/sidebar/recentposts.rb'
19
+ require 'who-needs-wp/sidebar/pageindex.rb'
17
20
  require 'who-needs-wp/templates.rb'
18
21
  require 'who-needs-wp/posts.rb'
19
22
  require 'who-needs-wp/pages.rb'
@@ -37,10 +40,23 @@ module WhoNeedsWP
37
40
  self.load_templates
38
41
  self.load_posts
39
42
  self.load_pages
40
- self.recentposts
41
- self.page_index
42
- self.twitter
43
- self.delicious
43
+ if @posts.length > 0
44
+ RecentPosts.new
45
+ end
46
+ if @pages.length > 0
47
+ PageIndex.new
48
+ end
49
+ if @options[:twitter]
50
+ if @options[:twitter][:username]
51
+ TwitterFeed.new(@options[:twitter][:username])
52
+ end
53
+ if @options[:twitter][:search]
54
+ TwitterSearch.new(@options[:twitter][:search])
55
+ end
56
+ end
57
+ if @options[:delicious]
58
+ delicious = Delicious.new(@options[:delicious][:user])
59
+ end
44
60
  self.generate_posts
45
61
  self.generate_pages
46
62
  self.index
@@ -56,8 +72,8 @@ module WhoNeedsWP
56
72
  # Generate the index page for the blog
57
73
  def self.index
58
74
  contents = ""
59
- if @POSTS.length > 0
60
- @POSTS[0..3].each do |post|
75
+ if @posts.length > 0
76
+ @posts[0..3].each do |post|
61
77
  contents << post[:html]
62
78
  end
63
79
  else
@@ -69,7 +85,7 @@ module WhoNeedsWP
69
85
  # Generate a page containing a list of all posts
70
86
  def self.all_posts
71
87
  self.render_html("posts/all.html", "post_index", @template['all_posts'].render(Object.new, {
72
- :posts => @POSTS,
88
+ :posts => @posts,
73
89
  :options => @options
74
90
  }), "All Posts")
75
91
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 5
8
- - 2
9
- version: 0.5.2
7
+ - 6
8
+ - 0
9
+ version: 0.6.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Owen Griffin
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-27 00:00:00 +00:00
17
+ date: 2010-03-28 00:00:00 +00:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -118,7 +118,6 @@ dependencies:
118
118
  description: A static web site generator.
119
119
  email: owen.griffin@gmail.com
120
120
  executables:
121
- - wordpress2wnwp~
122
121
  - wordpress2wnwp
123
122
  - who-needs-wp
124
123
  extensions: []
@@ -129,10 +128,14 @@ extra_rdoc_files:
129
128
  - README.md
130
129
  files:
131
130
  - lib/who-needs-wp.rb
131
+ - lib/who-needs-wp/Sidebar.rb
132
132
  - lib/who-needs-wp/css.rb
133
- - lib/who-needs-wp/delicious.rb
134
133
  - lib/who-needs-wp/pages.rb
135
134
  - lib/who-needs-wp/posts.rb
135
+ - lib/who-needs-wp/sidebar/delicious.rb
136
+ - lib/who-needs-wp/sidebar/pageindex.rb
137
+ - lib/who-needs-wp/sidebar/recentposts.rb
138
+ - lib/who-needs-wp/sidebar/twitter.rb
136
139
  - lib/who-needs-wp/stylesheets/base.sass
137
140
  - lib/who-needs-wp/stylesheets/pygments.sass
138
141
  - lib/who-needs-wp/stylesheets/reset-fonts-grids.sass
@@ -149,7 +152,6 @@ files:
149
152
  - lib/who-needs-wp/templates/recentposts.haml
150
153
  - lib/who-needs-wp/templates/rss.haml
151
154
  - lib/who-needs-wp/templates/twitter.haml
152
- - lib/who-needs-wp/twitter.rb
153
155
  - LICENSE
154
156
  - README.html
155
157
  - README.md
data/bin/wordpress2wnwp~ DELETED
@@ -1,6 +0,0 @@
1
- #!/bin/ruby
2
-
3
- prefix = ARGV[3]
4
- DB = Sequel.connect('postgres://localhost/#{ARGV[0]}?user=#{ARGV[1]}&password=#{ARGV[2]}')
5
-
6
- dataset = DB.from('wp_#{prefix}_posts')
@@ -1,20 +0,0 @@
1
-
2
- module WhoNeedsWP
3
- def self.delicious
4
- if @options[:delicious]
5
- delicious = []
6
- doc = Nokogiri::XML(open("http://feeds.delicious.com/v2/rss/#{@options[:delicious][:user]}?count=5"))
7
- doc.xpath('//channel/item').each do |item|
8
- delicious << {
9
- :title => (item/'title').first.content,
10
- :url => (item/'link').first.content,
11
- :date => Date.parse((item/'pubDate').first.content)
12
- }
13
- end
14
- @sidebar << @template['delicious'].render(Object.new, {
15
- :posts => delicious,
16
- :options => @options
17
- })
18
- end
19
- end
20
- end
@@ -1,29 +0,0 @@
1
-
2
- module WhoNeedsWP
3
-
4
- def self.parse_tweet(text)
5
- text = text.gsub(/(http:\/\/[^ ]+)/, '<a href="\1">\1</a>')
6
- text = text.gsub(/(@([^ :]+))/, '<a href="http://twitter.com/\2">\1</a>')
7
- return text.gsub(/(#([^ :]+))/, '<a href="http://twitter.com/#search?q=%23\2">\1</a>')
8
- end
9
-
10
- def self.twitter
11
- if @options[:twitter][:user] != nil and not @options[:twitter][:user].empty?
12
- @logger.debug "Reading Tweets for user #{@options[:twitter][:user]}"
13
- tweets = Twitter::Search.new.from(@options[:twitter][:user]).per_page(5).fetch().results
14
- @sidebar << @template['twitter'].render(Object.new, {
15
- :tweets => tweets,
16
- :feed_title => "@#{@options[:twitter][:user]}",
17
- :options => @options
18
- })
19
- end
20
- if @options[:twitter][:search] != nil and not @options[:twitter][:search].empty?
21
- @logger.debug "Searching Twitter for #{@options[:twitter][:search]}"
22
- @sidebar << @template['twitter'].render(Object.new, {
23
- :tweets => Twitter::Search.new(@options[:twitter][:search]).per_page(5).fetch().results,
24
- :feed_title => "Tweets for \"#{@options[:twitter][:search]}\"",
25
- :options => @options
26
- })
27
- end
28
- end
29
- end