hobix 0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/hobix +90 -0
- data/lib/hobix/api.rb +91 -0
- data/lib/hobix/article.rb +22 -0
- data/lib/hobix/base.rb +477 -0
- data/lib/hobix/bixwik.rb +200 -0
- data/lib/hobix/commandline.rb +661 -0
- data/lib/hobix/comments.rb +99 -0
- data/lib/hobix/config.rb +39 -0
- data/lib/hobix/datamarsh.rb +110 -0
- data/lib/hobix/entry.rb +83 -0
- data/lib/hobix/facets/comments.rb +74 -0
- data/lib/hobix/facets/publisher.rb +314 -0
- data/lib/hobix/facets/trackbacks.rb +80 -0
- data/lib/hobix/linklist.rb +76 -0
- data/lib/hobix/out/atom.rb +92 -0
- data/lib/hobix/out/erb.rb +64 -0
- data/lib/hobix/out/okaynews.rb +55 -0
- data/lib/hobix/out/quick.rb +312 -0
- data/lib/hobix/out/rdf.rb +97 -0
- data/lib/hobix/out/redrum.rb +26 -0
- data/lib/hobix/out/rss.rb +115 -0
- data/lib/hobix/plugin/bloglines.rb +73 -0
- data/lib/hobix/plugin/calendar.rb +220 -0
- data/lib/hobix/plugin/flickr.rb +110 -0
- data/lib/hobix/plugin/recent_comments.rb +82 -0
- data/lib/hobix/plugin/sections.rb +91 -0
- data/lib/hobix/plugin/tags.rb +60 -0
- data/lib/hobix/publish/ping.rb +53 -0
- data/lib/hobix/publish/replicate.rb +283 -0
- data/lib/hobix/publisher.rb +18 -0
- data/lib/hobix/search/dictionary.rb +141 -0
- data/lib/hobix/search/porter_stemmer.rb +203 -0
- data/lib/hobix/search/simple.rb +209 -0
- data/lib/hobix/search/vector.rb +100 -0
- data/lib/hobix/storage/filesys.rb +398 -0
- data/lib/hobix/trackbacks.rb +94 -0
- data/lib/hobix/util/objedit.rb +193 -0
- data/lib/hobix/util/patcher.rb +155 -0
- data/lib/hobix/webapp/cli.rb +195 -0
- data/lib/hobix/webapp/htmlform.rb +107 -0
- data/lib/hobix/webapp/message.rb +177 -0
- data/lib/hobix/webapp/urigen.rb +141 -0
- data/lib/hobix/webapp/webrick-servlet.rb +90 -0
- data/lib/hobix/webapp.rb +723 -0
- data/lib/hobix/weblog.rb +860 -0
- data/lib/hobix.rb +223 -0
- metadata +87 -0
@@ -0,0 +1,220 @@
|
|
1
|
+
## calendar.rb -- Hobix calendar plugin
|
2
|
+
##
|
3
|
+
## Displays a one-month calendar in the sidebar. The calendar links
|
4
|
+
## individual days to a daily, monthly or yearly index page. Daily and
|
5
|
+
## monthly index pages display the corresponding month in the sidebar;
|
6
|
+
## yearly pages do something arbitrary and likely to be wrong; other
|
7
|
+
## pages display the current month.
|
8
|
+
##
|
9
|
+
## The plugin generates separate sidebar .html file for each month. It
|
10
|
+
## places these files in htdocs/calendar/.
|
11
|
+
##
|
12
|
+
## USAGE:
|
13
|
+
##
|
14
|
+
## 1) In hobix.yaml (e.g. by running 'hobix edit <blogname>'), in the
|
15
|
+
## 'required' block, AFTER the "lib/local" line, append as follows:
|
16
|
+
##
|
17
|
+
## required:
|
18
|
+
## - hobix/plugin/calendar
|
19
|
+
##
|
20
|
+
## The plugin overwrites some of the default definitions in
|
21
|
+
## lib/local.rb, so in most cases it will need to be loaded later.
|
22
|
+
## You can also specify any of the following arguments:
|
23
|
+
##
|
24
|
+
## required:
|
25
|
+
## - hobix/plugin/calendar:
|
26
|
+
## start-on-monday: true
|
27
|
+
## point-to-index: daily
|
28
|
+
## day-symbols: ["Mon" "Tue" "Wed" "Thu" "Fri" "Sat" "Sun"]
|
29
|
+
##
|
30
|
+
## Options for 'point-to-index' are 'daily', 'monthly' and
|
31
|
+
## 'yearly'.
|
32
|
+
##
|
33
|
+
## NOTES:
|
34
|
+
##
|
35
|
+
## 1) If you redefine 'sidebar_list' in hobix.yaml, you'll need to
|
36
|
+
## explicitly add a 'sidebar_calendar' item.
|
37
|
+
## 2) Every sidebar page is regenerated every time you do an
|
38
|
+
## upgen. This is slow.
|
39
|
+
## 3) The sidebar on yearly index pages is December of that year,
|
40
|
+
## regardless of whether that month contains any posts. That's a
|
41
|
+
## little weird.
|
42
|
+
|
43
|
+
require 'date'
|
44
|
+
|
45
|
+
class Array
|
46
|
+
def uniq_c
|
47
|
+
ret = {}
|
48
|
+
each { |e| ret[e] = 1 + (ret[e] || 0) }
|
49
|
+
ret
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
module Hobix
|
54
|
+
|
55
|
+
## we just keep parameters from hobix.yaml here
|
56
|
+
class SidebarCalendarPlugin < BasePlugin
|
57
|
+
def initialize(weblog, params = {})
|
58
|
+
@@start_on_monday = lambda { |x| (x.nil? ? false : x) }[params['start-on-monday']]
|
59
|
+
@@point_to_index = (params['point-to-index'] || "monthly").to_sym
|
60
|
+
@@day_syms = params['day-symbols'] || (@@start_on_monday ? %w(Mo Tu We Th Fr Sa Su) : %w(Su Mo Tu We Th Fr Sa))
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.start_on_monday?; @@start_on_monday; end
|
64
|
+
def self.point_to_index; @@point_to_index; end
|
65
|
+
def self.day_syms; @@day_syms; end
|
66
|
+
|
67
|
+
DIR = "/calendar"
|
68
|
+
def self.dir_to(date, ext = true)
|
69
|
+
date.strftime("#{DIR}/sidebar-%Y-%m") + (ext ? ".html" : "")
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
class Out::Quick
|
74
|
+
alias calendar_old_sidebar_list_erb sidebar_list_erb
|
75
|
+
def sidebar_list_erb
|
76
|
+
l = calendar_old_sidebar_list_erb
|
77
|
+
if l.last == "sidebar_hobix"
|
78
|
+
l[0 ... (l.length - 1)] + ['sidebar_calendar', 'sidebar_hobix']
|
79
|
+
else
|
80
|
+
l + ['sidebar_calendar']
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def sidebar_calendar_ssi
|
85
|
+
%q{<!--#include virtual="<%= weblog.link.path + SidebarCalendarPlugin.dir_to(page.timestamp || Time.now)%>"-->}
|
86
|
+
end
|
87
|
+
|
88
|
+
def sidebar_erb
|
89
|
+
sidebar_calendar_ssi
|
90
|
+
end
|
91
|
+
|
92
|
+
## overwrite the default day header so that we can jump to the
|
93
|
+
## corresponding day in the main body of the monthly/yearly index
|
94
|
+
## files
|
95
|
+
def day_header_erb; %{ <h2 class="dayHeader"><a name="<%= day.strftime( "%Y%m%d" ) %>"><%= day.strftime( "%A, %B %d, %Y" ) %></a></h2> }; end
|
96
|
+
end
|
97
|
+
|
98
|
+
class Weblog
|
99
|
+
## generate all the sidebar calendar files
|
100
|
+
def skel_sidebar(path_storage)
|
101
|
+
months = path_storage.get_months(storage.find)
|
102
|
+
|
103
|
+
months.extend Hobix::Enumerable
|
104
|
+
months.each_with_neighbors do |prev, cur, nexxt|
|
105
|
+
month_start, month_end, month_id = cur
|
106
|
+
|
107
|
+
entries = path_storage.within(month_start, month_end)
|
108
|
+
page = Page.new SidebarCalendarPlugin.dir_to(month_start, false)
|
109
|
+
page.timestamp = month_start
|
110
|
+
page.updated = Time.now #path_storage.last_modified(entries)
|
111
|
+
page.prev = prev[0].strftime("/%Y/%m/") if prev
|
112
|
+
page.next = nexxt[0].strftime("/%Y/%m/") if nexxt
|
113
|
+
|
114
|
+
days = entries.map do |entry|
|
115
|
+
day = entry.created
|
116
|
+
Date.new(day.year, day.mon, day.day)
|
117
|
+
end.uniq_c
|
118
|
+
offset = (month_start.wday - (SidebarCalendarPlugin.start_on_monday? ? 1 : 0)) % 7
|
119
|
+
|
120
|
+
yield :page => page, :months => months, :month => month_start, :days => days, :offset => offset, :day_syms => SidebarCalendarPlugin.day_syms, :index => SidebarCalendarPlugin.point_to_index
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
## generate the HTML
|
126
|
+
class Out::Quick
|
127
|
+
def sidebar_calendar_erb
|
128
|
+
%{
|
129
|
+
<style type="text/css">
|
130
|
+
.sidebarCalendar a { text-decoration: none; font-weight: bold; }
|
131
|
+
.sidebarCalendarHeader { text-align: center; }
|
132
|
+
.sidebarCalendarContentRow { color: #888; text-align: right; }
|
133
|
+
</style>
|
134
|
+
|
135
|
+
<div class="sidebarBox">
|
136
|
+
<h2 class="sidebarTitle">Calendar</h2>
|
137
|
+
<table class="sidebarCalendar">
|
138
|
+
<+ sidebar_calendar_caption +>
|
139
|
+
<+ sidebar_calendar_header +>
|
140
|
+
<+ sidebar_calendar_contents +>
|
141
|
+
</table>
|
142
|
+
</div>
|
143
|
+
}
|
144
|
+
end
|
145
|
+
|
146
|
+
def sidebar_calendar_contents_erb
|
147
|
+
%q{
|
148
|
+
<tr class="sidebarCalendarContentRow">
|
149
|
+
<% offset.times do %>
|
150
|
+
<td class="sidebarCalendarFiller"> </td>
|
151
|
+
<% end %>
|
152
|
+
|
153
|
+
<%
|
154
|
+
current = offset
|
155
|
+
first = Date.new(month.year, month.mon, 1)
|
156
|
+
last = (first >> 1) - 1
|
157
|
+
%>
|
158
|
+
|
159
|
+
<% (first .. last).each do |d| %>
|
160
|
+
<% if (current % 7) == 0 %>
|
161
|
+
</tr><tr class="sidebarCalendarContentRow">
|
162
|
+
<% end %>
|
163
|
+
<% current += 1 %>
|
164
|
+
|
165
|
+
<% if days.keys.include? d %>
|
166
|
+
<%
|
167
|
+
title = d.strftime("%A, %B %e: " + (days[d] == 1 ? "one entry" : "#{days[d]} entries"))
|
168
|
+
link = case index
|
169
|
+
when :yearly:
|
170
|
+
d.strftime("/%Y/#%Y%m%d")
|
171
|
+
when :monthly:
|
172
|
+
d.strftime("/%Y/%m/#%Y%m%d")
|
173
|
+
else
|
174
|
+
d.strftime("/%Y/%m/%d.html#%Y%m%d")
|
175
|
+
end
|
176
|
+
%>
|
177
|
+
<td class="sidebarCalendarLinkDay"><a title="<%= title %>" href="<%= weblog.expand_path link %>"><%= d.strftime("%e") %></a></td>
|
178
|
+
<% else %>
|
179
|
+
<td class="sidebarCalendarEmptyDay"><%= d.strftime("%e") %></td>
|
180
|
+
<% end %>
|
181
|
+
<% end %>
|
182
|
+
|
183
|
+
<% (7 - offset).times do %>
|
184
|
+
<td class="sidebarCalendarFiller"> </td>
|
185
|
+
<% end %>
|
186
|
+
|
187
|
+
</tr>
|
188
|
+
}
|
189
|
+
end
|
190
|
+
|
191
|
+
def sidebar_calendar_header_erb
|
192
|
+
%{
|
193
|
+
<tr class="sidebarCalendarHeaderRow">
|
194
|
+
<% day_syms.each do |d| %>
|
195
|
+
<th class="sidebarCalendarHeader"><%= d %></th>
|
196
|
+
<% end %>
|
197
|
+
</tr>
|
198
|
+
}
|
199
|
+
end
|
200
|
+
|
201
|
+
def sidebar_calendar_caption_erb
|
202
|
+
%q{
|
203
|
+
<caption class="sidebarCalendarCaption">
|
204
|
+
<% if page.prev %>
|
205
|
+
<a href="<%= weblog.expand_path page.prev %>">←</a>
|
206
|
+
<% else %>
|
207
|
+
←
|
208
|
+
<% end %>
|
209
|
+
<a href="<%= weblog.expand_path month.strftime("/%Y/%m/")%>"><%= month.strftime("%B %Y") %></a>
|
210
|
+
<% if page.next %>
|
211
|
+
<a href="<%= weblog.expand_path page.next %>">→</a>
|
212
|
+
<% else %>
|
213
|
+
→
|
214
|
+
<% end %>
|
215
|
+
</caption>
|
216
|
+
}
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
## flickr.rb -- Hobix Flickr plugin
|
2
|
+
##
|
3
|
+
## Displays your Flickr photostream ("badge") on the sidebar. This is
|
4
|
+
## based on the instructions at http://flickr.com/badge_new.gne. That
|
5
|
+
## page provides a lot more functionality in terms of colors and sizes
|
6
|
+
## and whatnot; this plugin just makes it slightly easier to do the
|
7
|
+
## most common thing.
|
8
|
+
##
|
9
|
+
## You'll need to discover your Flickr userid to use this (different
|
10
|
+
## from your username). You can use the tool at
|
11
|
+
## http://eightface.com/code/idgettr/, or simply examine your Flickr
|
12
|
+
## RSS URL for the "id" parameter. It should look something like
|
13
|
+
## this: 34479244@N00.
|
14
|
+
##
|
15
|
+
## USAGE:
|
16
|
+
##
|
17
|
+
## 1) In hobix.yaml (e.g. by running 'hobix edit <blogname>'), in the
|
18
|
+
## 'required' block, append as follows:
|
19
|
+
##
|
20
|
+
## required:
|
21
|
+
## - hobix/plugin/flickr:
|
22
|
+
## userid: <your flickr userid (see above)>
|
23
|
+
##
|
24
|
+
## You can also specify any of the following arguments:
|
25
|
+
##
|
26
|
+
## required:
|
27
|
+
## - hobix/plugin/flickr:
|
28
|
+
## userid: <your flickr userid>
|
29
|
+
## num: <number of pics to use (default 5)>
|
30
|
+
## size: <small, thumbnail or midsize (default small)>
|
31
|
+
## title: <title (default "Recent Pictures"), or nil for none>
|
32
|
+
## in-sidebarBox-div: <true or false (default true)>
|
33
|
+
##
|
34
|
+
## NOTES:
|
35
|
+
##
|
36
|
+
## 1) If you redefine 'sidebar_list' in hobix.yaml, you'll need to
|
37
|
+
## explicitly add a 'sidebar_flickr' item.
|
38
|
+
|
39
|
+
module Hobix
|
40
|
+
|
41
|
+
## we just keep parameters from hobix.yaml here
|
42
|
+
class FlickrPlugin < BasePlugin
|
43
|
+
def initialize(weblog, params = {})
|
44
|
+
raise %{the flickr plugin needs a "userid" parameter. see hobix/plugin/flickr.rb for details} unless params.member? "userid"
|
45
|
+
@@userid = params["userid"]
|
46
|
+
@@num = params["num"] || 5
|
47
|
+
@@size =
|
48
|
+
case params["size"]
|
49
|
+
when nil, "small"
|
50
|
+
"s"
|
51
|
+
when "thumbnail"
|
52
|
+
"t"
|
53
|
+
when "midsize"
|
54
|
+
"m"
|
55
|
+
else
|
56
|
+
raise %{unknown size value "#{params["size"]}" for flickr plugin. use "small", "thumbnail" or "midsize"}
|
57
|
+
end
|
58
|
+
@@title = params["title"] || "Recent Pictures"
|
59
|
+
@@in_sidebarBox_div = lambda { |x| (x.nil? ? true : x) }[params["in-sidebarBox-div"]]
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.userid; @@userid; end
|
63
|
+
def self.num; @@num; end
|
64
|
+
def self.size; @@size; end
|
65
|
+
def self.title; @@title; end
|
66
|
+
def self.in_sidebarBox_div?; @@in_sidebarBox_div; end
|
67
|
+
end
|
68
|
+
|
69
|
+
class Out::Quick
|
70
|
+
alias flickr_old_sidebar_list_erb sidebar_list_erb
|
71
|
+
def sidebar_list_erb
|
72
|
+
l = flickr_old_sidebar_list_erb
|
73
|
+
if l.last == "sidebar_hobix"
|
74
|
+
l[0 ... (l.length - 1)] + ['sidebar_flickr', 'sidebar_hobix']
|
75
|
+
else
|
76
|
+
l + ['sidebar_flickr']
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def sidebar_flickr_erb
|
81
|
+
(FlickrPlugin.in_sidebarBox_div? ? %{<div class="sidebarBox">} : "") +
|
82
|
+
(FlickrPlugin.title ? %{<h2 class="sidebarTitle">#{FlickrPlugin.title}</h2>} : "") +
|
83
|
+
%{
|
84
|
+
<!-- Start of Flickr Badge -->
|
85
|
+
<!-- Start of Flickr Badge -->
|
86
|
+
<style type="text/css">
|
87
|
+
#flickr_badge_source_txt {padding:0; font: 11px Arial, Helvetica, Sans serif; color:#666666;}
|
88
|
+
#flickr_badge_icon {display:block !important; margin:0 !important; border: 1px solid rgb(0, 0, 0) !important;}
|
89
|
+
#flickr_icon_td {padding:0 5px 0 0 !important;}
|
90
|
+
.flickr_badge_image {text-align:center !important;}
|
91
|
+
.flickr_badge_image img {border: 1px solid black !important;}
|
92
|
+
#flickr_www {display:block; padding:0 10px 0 10px !important; font: 11px Arial, Helvetica, Sans serif !important; color:#3993ff !important;}
|
93
|
+
#flickr_badge_uber_wrapper a:hover,
|
94
|
+
#flickr_badge_uber_wrapper a:link,
|
95
|
+
#flickr_badge_uber_wrapper a:active,
|
96
|
+
#flickr_badge_uber_wrapper a:visited {text-decoration:none !important; background:inherit !important;color:#3993ff;}
|
97
|
+
#flickr_badge_wrapper {border: solid 1px #000000}
|
98
|
+
#flickr_badge_source {padding:0 !important; font: 11px Arial, Helvetica, Sans serif !important; color:#666666 !important;}
|
99
|
+
</style>
|
100
|
+
<table id="flickr_badge_uber_wrapper" cellpadding="0" cellspacing="10" border="0"><tr><td><a href="http://www.flickr.com" id="flickr_www">www.<strong style="color:#3993ff">flick<span style="color:#ff1c92">r</span></strong>.com</a><table cellpadding="0" cellspacing="10" border="0" id="flickr_badge_wrapper">
|
101
|
+
<script type="text/javascript" src="http://www.flickr.com/badge_code_v2.gne?count=#{FlickrPlugin.num}&display=latest&size=#{FlickrPlugin.size}&layout=v&source=user&user=#{FlickrPlugin.userid}"></script>
|
102
|
+
</table>
|
103
|
+
</td></tr></table>
|
104
|
+
<!-- End of Flickr Badge -->
|
105
|
+
} +
|
106
|
+
(FlickrPlugin.in_sidebarBox_div? ? "</div>" : "")
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
## recent_comments.rb -- Hobix recent comments plugin
|
2
|
+
##
|
3
|
+
## Displays a list of recent comments posted on your blog.
|
4
|
+
##
|
5
|
+
## USAGE:
|
6
|
+
##
|
7
|
+
## 1) In hobix.yaml (e.g. by running 'hobix edit <blogname>'), simply
|
8
|
+
## add 'hobix/plugin/recent_comments' to the 'required' list, as
|
9
|
+
## follows:
|
10
|
+
##
|
11
|
+
## required:
|
12
|
+
## - hobix/plugin/recent_comments
|
13
|
+
##
|
14
|
+
## And that's it!
|
15
|
+
##
|
16
|
+
## You can also specify any of the following arguments:
|
17
|
+
##
|
18
|
+
## required:
|
19
|
+
## - hobix/plugin/recent_comments:
|
20
|
+
## num: <number of comments (default 5)>
|
21
|
+
##
|
22
|
+
## NOTES:
|
23
|
+
##
|
24
|
+
## 1) If you redefine 'sidebar_list' in hobix.yaml, you'll need to
|
25
|
+
## explicitly add a 'sidebar_recent_comments' item.
|
26
|
+
## 2) Currently pretty slow, as it basically take a brute force
|
27
|
+
## approach.
|
28
|
+
|
29
|
+
module Hobix
|
30
|
+
|
31
|
+
## we just keep parameters from hobix.yaml here
|
32
|
+
class RecentCommentsPlugin < BasePlugin
|
33
|
+
def initialize(weblog, params = {})
|
34
|
+
@@num = params["num"] || 5
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.num; @@num; end
|
38
|
+
end
|
39
|
+
|
40
|
+
class Hobix::Out::Quick
|
41
|
+
def all_comments(weblog, entries)
|
42
|
+
entries.map do |ie|
|
43
|
+
begin
|
44
|
+
comments = weblog.storage.load_attached(ie.id, "comments")
|
45
|
+
e = weblog.storage.load_entry ie.id
|
46
|
+
comments.each { |c| yield e.link, e.title, c.author, c.created }
|
47
|
+
rescue Errno::ENOENT
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def recent_comments(weblog, entries, num)
|
53
|
+
comments = []
|
54
|
+
all_comments(weblog, entries) { |*c| comments.push c }
|
55
|
+
comments.map { |x| x }.sort_by { |x| x[3] }.reverse[0 ... num]
|
56
|
+
end
|
57
|
+
|
58
|
+
def sidebar_recent_comments_erb
|
59
|
+
%q{
|
60
|
+
<div class="sidebarBox">
|
61
|
+
<h2 class="sidebarTitle">Recent Comments</h2>
|
62
|
+
<ul>
|
63
|
+
<% recent_comments( weblog, weblog.storage.find, RecentCommentsPlugin.num ).each do |link, title, auth, created| %>
|
64
|
+
<li><a href="<%= link %>"><%= title %></a> by <%= auth %> on <nobr><%= created.strftime "%m/%d at %I:%M %P" %></nobr></li>
|
65
|
+
<% end %>
|
66
|
+
</ul>
|
67
|
+
</div>
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
alias recent_comments_old_sidebar_list_erb sidebar_list_erb
|
72
|
+
def sidebar_list_erb
|
73
|
+
l = recent_comments_old_sidebar_list_erb
|
74
|
+
if l.last == "sidebar_hobix"
|
75
|
+
l[0 ... (l.length - 1)] + ['sidebar_recent_comments', 'sidebar_hobix']
|
76
|
+
else
|
77
|
+
l + ['sidebar_recent_comments']
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
## sections.rb -- Hobix section list plugin
|
2
|
+
##
|
3
|
+
## Displays a list of all the sections of your blog.
|
4
|
+
##
|
5
|
+
## USAGE:
|
6
|
+
##
|
7
|
+
## 1) In hobix.yaml (e.g. by running 'hobix edit <blogname>'), simply
|
8
|
+
## add 'hobix/plugin/sections' to the 'required' list, as follows:
|
9
|
+
##
|
10
|
+
## required:
|
11
|
+
## - hobix/plugin/sections
|
12
|
+
##
|
13
|
+
## And that's it!
|
14
|
+
##
|
15
|
+
## NOTES:
|
16
|
+
##
|
17
|
+
## 1) If you redefine 'sidebar_list' in hobix.yaml, you'll need to
|
18
|
+
## explicitly add a 'sidebar_section_list' item.
|
19
|
+
## 2) The default Hobix CSS doesn't indent lists, so the hierarchy is
|
20
|
+
## lost upon display. You can add something like this to your CSS file
|
21
|
+
## to fix this:
|
22
|
+
##
|
23
|
+
## .sidebarBox ul {
|
24
|
+
## margin:7px;
|
25
|
+
## padding:0px;
|
26
|
+
## }
|
27
|
+
|
28
|
+
class Hobix::Out::Quick
|
29
|
+
def section_list( entries, topname = "top level" )
|
30
|
+
counts = {}
|
31
|
+
entries.each do |entry|
|
32
|
+
path = ( entry.id.split("/")[0 ... -1] || [] ) # nil in ruby 1.8.1 if path is ""
|
33
|
+
counts[path] = 1 + ( counts[path] || 0 )
|
34
|
+
end
|
35
|
+
|
36
|
+
list = []; seen = {}
|
37
|
+
counts[[]] ||= 0 # force the root
|
38
|
+
counts.sort.each do |path, count|
|
39
|
+
if path == []
|
40
|
+
list.push [topname, "", 0, counts[path]]
|
41
|
+
else
|
42
|
+
path.inject( "." ) do |s, x|
|
43
|
+
prefix = s + "/" + x
|
44
|
+
unless seen[prefix]
|
45
|
+
length = prefix.count '/'
|
46
|
+
list.push [x, prefix, length, ( length == path.length ? count : 0 ) ]
|
47
|
+
seen[prefix] = true
|
48
|
+
end
|
49
|
+
prefix
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
list
|
54
|
+
end
|
55
|
+
|
56
|
+
def sidebar_section_list_erb
|
57
|
+
%q{
|
58
|
+
<div class="sidebarBox">
|
59
|
+
<h2 class="sidebarTitle">Sections</h2>
|
60
|
+
<% curlev = -1 %>
|
61
|
+
<% section_list( weblog.storage.find ).each do |name, path, lev, num| %>
|
62
|
+
<% if ( lev > curlev ) %>
|
63
|
+
<% ( lev - curlev ).times do %> <ul> <% end %>
|
64
|
+
<% else # less than or equal %>
|
65
|
+
</li>
|
66
|
+
<% end %>
|
67
|
+
<% if ( curlev > lev ) %>
|
68
|
+
<% ( curlev - lev ).times do %> </ul></li> <% end %>
|
69
|
+
<% end %>
|
70
|
+
|
71
|
+
<% curlev = lev %>
|
72
|
+
<li>
|
73
|
+
<a href="<%= weblog.expand_path path %>"><%= name %></a><% if num != 0 then %>: <%= num %> <% end %>
|
74
|
+
<% end %>
|
75
|
+
<% ( curlev + 1 ).times do %>
|
76
|
+
</li></ul>
|
77
|
+
<% end %>
|
78
|
+
</div>
|
79
|
+
}
|
80
|
+
end
|
81
|
+
|
82
|
+
alias sections_old_sidebar_list_erb sidebar_list_erb
|
83
|
+
def sidebar_list_erb
|
84
|
+
l = sections_old_sidebar_list_erb
|
85
|
+
if l.last == "sidebar_hobix"
|
86
|
+
l[0 ... (l.length - 1)] + ['sidebar_section_list', 'sidebar_hobix']
|
87
|
+
else
|
88
|
+
l + ['sidebar_section_list']
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
## tags.rb -- Hobix tag list plugin
|
2
|
+
##
|
3
|
+
## Displays a list of all the tags of your blog.
|
4
|
+
##
|
5
|
+
## USAGE:
|
6
|
+
##
|
7
|
+
## 1) In hobix.yaml (e.g. by running 'hobix edit <blogname>'), simply
|
8
|
+
## add 'hobix/plugin/tags' to the 'required' list, as follows:
|
9
|
+
##
|
10
|
+
## required:
|
11
|
+
## - hobix/plugin/tags
|
12
|
+
##
|
13
|
+
## And that's it!
|
14
|
+
##
|
15
|
+
## NOTES:
|
16
|
+
##
|
17
|
+
## 1) If you redefine 'sidebar_list' in hobix.yaml, you'll need to
|
18
|
+
## explicitly add a 'sidebar_tag_list' item.
|
19
|
+
|
20
|
+
class Hobix::Out::Quick
|
21
|
+
def tags_list(entries)
|
22
|
+
tags = { }
|
23
|
+
entries.each do |e|
|
24
|
+
if e.tags
|
25
|
+
e.tags.each do |t|
|
26
|
+
tags[t] ||= 0
|
27
|
+
tags[t] += 1
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
tags
|
32
|
+
end
|
33
|
+
|
34
|
+
def sidebar_tag_list_erb
|
35
|
+
%q{
|
36
|
+
<div class="sidebarBox">
|
37
|
+
<h2 class="sidebarTitle">Tags</h2>
|
38
|
+
<ul>
|
39
|
+
<% tags_list(weblog.storage.find).sort.each do |name, count| %>
|
40
|
+
<li>
|
41
|
+
<a href="<%= weblog.link %>/tags/<%=name%>/index.html"><%= name
|
42
|
+
%></a>: <%=count%>
|
43
|
+
</li>
|
44
|
+
<% end %>
|
45
|
+
</ul>
|
46
|
+
</div>
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
alias tags_old_sidebar_list_erb sidebar_list_erb
|
51
|
+
def sidebar_list_erb
|
52
|
+
l = tags_old_sidebar_list_erb
|
53
|
+
if l.last == "sidebar_hobix"
|
54
|
+
l[0 ... (l.length - 1)] + ['sidebar_tag_list', 'sidebar_hobix']
|
55
|
+
else
|
56
|
+
l + ['sidebar_tag_list']
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
#
|
2
|
+
# = hobix/out/ping.rb
|
3
|
+
#
|
4
|
+
# XML-RPC pingt for Hobix.
|
5
|
+
#
|
6
|
+
# Copyright (c) 2003-2004 why the lucky stiff
|
7
|
+
#
|
8
|
+
# Written & maintained by why the lucky stiff <why@ruby-lang.org>
|
9
|
+
#
|
10
|
+
# This program is free software, released under a BSD license.
|
11
|
+
# See COPYING for details.
|
12
|
+
#
|
13
|
+
#--
|
14
|
+
# $Id$
|
15
|
+
#++
|
16
|
+
require 'hobix/base'
|
17
|
+
require 'xmlrpc/client'
|
18
|
+
|
19
|
+
module Hobix
|
20
|
+
module Publish
|
21
|
+
class Ping < Hobix::BasePublish
|
22
|
+
def initialize( weblog, urls )
|
23
|
+
@title = weblog.title
|
24
|
+
@link = weblog.link
|
25
|
+
@urls = urls
|
26
|
+
end
|
27
|
+
def watch
|
28
|
+
['index']
|
29
|
+
end
|
30
|
+
def publish( pages )
|
31
|
+
@urls.each do |u|
|
32
|
+
link = @link.to_s
|
33
|
+
u, link = u.keys.first, u.values.first if Hash === u
|
34
|
+
puts "pinging #{ u }..."
|
35
|
+
u = URI::parse( u )
|
36
|
+
begin
|
37
|
+
server = XMLRPC::Client.new( u.host, u.path, u.port )
|
38
|
+
|
39
|
+
begin
|
40
|
+
result = server.call( "weblogUpdates.ping", @title, link )
|
41
|
+
rescue XMLRPC::FaultException => e
|
42
|
+
puts "Error: "
|
43
|
+
puts e.faultCode
|
44
|
+
puts e.faultString
|
45
|
+
end
|
46
|
+
rescue Exception => e
|
47
|
+
puts "Error: #{ e.message }"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|