hobix 0.6
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.
- data/COPYING +18 -0
- data/README +18 -0
- data/Rakefile +96 -0
- data/bin/hobix +94 -0
- data/contrib/blosxom-to-hobix.rb +253 -0
- data/contrib/txp-to-hobix.rb +56 -0
- data/contrib/webrick-all-mine.rb +20 -0
- data/doc/CHANGELOG +285 -0
- data/doc/rdoc/classes/Hobix/API.html +382 -0
- data/doc/rdoc/classes/Hobix/Article.html +111 -0
- data/doc/rdoc/classes/Hobix/BaseContent.html +692 -0
- data/doc/rdoc/classes/Hobix/BaseEntry.html +218 -0
- data/doc/rdoc/classes/Hobix/BaseFacet.html +205 -0
- data/doc/rdoc/classes/Hobix/BaseOutput.html +122 -0
- data/doc/rdoc/classes/Hobix/BasePlugin.html +201 -0
- data/doc/rdoc/classes/Hobix/BaseProperties/ClassMethods.html +243 -0
- data/doc/rdoc/classes/Hobix/BaseProperties.html +218 -0
- data/doc/rdoc/classes/Hobix/BasePublish.html +157 -0
- data/doc/rdoc/classes/Hobix/BaseStorage.html +417 -0
- data/doc/rdoc/classes/Hobix/BixWik/Entry.html +196 -0
- data/doc/rdoc/classes/Hobix/BixWik/IndexEntry.html +170 -0
- data/doc/rdoc/classes/Hobix/BixWik/WikiRedCloth.html +111 -0
- data/doc/rdoc/classes/Hobix/BixWik.html +418 -0
- data/doc/rdoc/classes/Hobix/BixWikPlugin.html +158 -0
- data/doc/rdoc/classes/Hobix/CommandLine.html +1970 -0
- data/doc/rdoc/classes/Hobix/Comment.html +113 -0
- data/doc/rdoc/classes/Hobix/Config.html +212 -0
- data/doc/rdoc/classes/Hobix/DataMarsh.html +667 -0
- data/doc/rdoc/classes/Hobix/Entry.html +178 -0
- data/doc/rdoc/classes/Hobix/EntryEnum.html +162 -0
- data/doc/rdoc/classes/Hobix/Enumerable.html +170 -0
- data/doc/rdoc/classes/Hobix/Facets/WikiEdit.html +180 -0
- data/doc/rdoc/classes/Hobix/Facets.html +111 -0
- data/doc/rdoc/classes/Hobix/LinkList.html +182 -0
- data/doc/rdoc/classes/Hobix/Out/Quick.html +412 -0
- data/doc/rdoc/classes/Hobix/Out.html +119 -0
- data/doc/rdoc/classes/Hobix/Page.html +381 -0
- data/doc/rdoc/classes/Hobix/Trackback.html +113 -0
- data/doc/rdoc/classes/Hobix/UriStr.html +198 -0
- data/doc/rdoc/classes/Hobix/WebApp/QueryString.html +207 -0
- data/doc/rdoc/classes/Hobix/WebApp/QueryValidationFailure.html +111 -0
- data/doc/rdoc/classes/Hobix/WebApp.html +1383 -0
- data/doc/rdoc/classes/Hobix/Weblog/AuthorNotFound.html +111 -0
- data/doc/rdoc/classes/Hobix/Weblog.html +2082 -0
- data/doc/rdoc/classes/Hobix.html +399 -0
- data/doc/rdoc/classes/Kernel.html +139 -0
- data/doc/rdoc/classes/Regexp.html +154 -0
- data/doc/rdoc/classes/YAML/Omap.html +144 -0
- data/doc/rdoc/classes/YAML.html +111 -0
- data/doc/rdoc/created.rid +1 -0
- data/doc/rdoc/files/COPYING.html +129 -0
- data/doc/rdoc/files/README.html +131 -0
- data/doc/rdoc/files/doc/CHANGELOG.html +101 -0
- data/doc/rdoc/files/lib/hobix/api_rb.html +119 -0
- data/doc/rdoc/files/lib/hobix/article_rb.html +126 -0
- data/doc/rdoc/files/lib/hobix/base_rb.html +128 -0
- data/doc/rdoc/files/lib/hobix/bixwik_rb.html +126 -0
- data/doc/rdoc/files/lib/hobix/commandline_rb.html +140 -0
- data/doc/rdoc/files/lib/hobix/comments_rb.html +126 -0
- data/doc/rdoc/files/lib/hobix/config_rb.html +125 -0
- data/doc/rdoc/files/lib/hobix/datamarsh_rb.html +108 -0
- data/doc/rdoc/files/lib/hobix/entry_rb.html +118 -0
- data/doc/rdoc/files/lib/hobix/linklist_rb.html +127 -0
- data/doc/rdoc/files/lib/hobix/publisher_rb.html +126 -0
- data/doc/rdoc/files/lib/hobix/trackbacks_rb.html +128 -0
- data/doc/rdoc/files/lib/hobix/webapp_rb.html +127 -0
- data/doc/rdoc/files/lib/hobix/weblog_rb.html +135 -0
- data/doc/rdoc/files/lib/hobix_rb.html +127 -0
- data/doc/rdoc/fr_class_index.html +67 -0
- data/doc/rdoc/fr_file_index.html +44 -0
- data/doc/rdoc/fr_method_index.html +307 -0
- data/doc/rdoc/index.html +24 -0
- data/doc/rdoc/rdoc-style.css +208 -0
- data/git_hobix_update.php +13 -0
- data/lib/hobix/api.rb +91 -0
- data/lib/hobix/article.rb +22 -0
- data/lib/hobix/base.rb +480 -0
- data/lib/hobix/bixwik.rb +200 -0
- data/lib/hobix/commandline.rb +677 -0
- data/lib/hobix/comments.rb +98 -0
- data/lib/hobix/config.rb +39 -0
- data/lib/hobix/datamarsh.rb +110 -0
- data/lib/hobix/entry.rb +84 -0
- data/lib/hobix/facets/comments.rb +99 -0
- data/lib/hobix/facets/publisher.rb +314 -0
- data/lib/hobix/facets/trackbacks.rb +80 -0
- data/lib/hobix/linklist.rb +81 -0
- data/lib/hobix/out/atom.rb +101 -0
- data/lib/hobix/out/erb.rb +64 -0
- data/lib/hobix/out/okaynews.rb +55 -0
- data/lib/hobix/out/quick.rb +314 -0
- data/lib/hobix/out/rdf.rb +97 -0
- data/lib/hobix/out/redrum.rb +26 -0
- data/lib/hobix/out/rss.rb +128 -0
- data/lib/hobix/plugin/akismet.rb +196 -0
- data/lib/hobix/plugin/bloglines.rb +73 -0
- data/lib/hobix/plugin/calendar.rb +212 -0
- data/lib/hobix/plugin/flickr.rb +110 -0
- data/lib/hobix/plugin/recent_comments.rb +84 -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 +408 -0
- data/lib/hobix/trackbacks.rb +93 -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 +893 -0
- data/lib/hobix.rb +230 -0
- data/share/default-blog/hobix.yaml +16 -0
- data/share/default-blog/htdocs/site.css +174 -0
- data/share/default-blog/skel/entry.html.quick +0 -0
- data/share/default-blog/skel/index.atom.atom +0 -0
- data/share/default-blog/skel/index.html.quick-summary +0 -0
- data/share/default-blog/skel/index.xml.rss +0 -0
- data/share/default-blog/skel/index.yaml.okaynews +0 -0
- data/share/default-blog/skel/monthly.html.quick-archive +0 -0
- data/share/default-blog/skel/section.html.quick-archive +0 -0
- data/share/default-blog/skel/yearly.html.quick-archive +0 -0
- data/share/default-blog-modes.yaml +7 -0
- data/share/default-blog.apache-cgi.patch +8 -0
- data/share/default-blog.apache-ssi.patch +38 -0
- data/share/default-blog.apache2-ssi.patch +3 -0
- data/share/default-blog.cgi.patch +8 -0
- data/share/default-blog.comments.patch +5 -0
- data/share/default-blog.prototype.patch +766 -0
- data/share/default-blog.publisher.patch +5 -0
- data/share/default-blog.wiki.patch +29 -0
- data/share/publisher/css/control.css +90 -0
- data/share/publisher/css/form.css +238 -0
- data/share/publisher/css/form.import.css +72 -0
- data/share/publisher/css/main-menu.css +134 -0
- data/share/publisher/i/hobix-emblazen-1.png +0 -0
- data/share/publisher/i/hobix-emblazen-2.png +0 -0
- data/share/publisher/i/hobix-emblazen-3.png +0 -0
- data/share/publisher/i/hobix-emblazen-4.png +0 -0
- data/share/publisher/i/hobix-emblazen-5.png +0 -0
- data/share/publisher/i/hobix-emblazen-6.png +0 -0
- data/share/publisher/i/hobix-emblazen-7.png +0 -0
- data/share/publisher/index.erb +66 -0
- data/share/publisher/js/controls.js +261 -0
- data/share/publisher/js/dragdrop.js +476 -0
- data/share/publisher/js/effects.js +570 -0
- data/share/publisher/js/prototype.js +1011 -0
- metadata +230 -0
|
@@ -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.expand_path "tags/#{ name }/" %>"><%= 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
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
# Content replication: will replicate and/or update the target with
|
|
2
|
+
# the files generated by Hobix
|
|
3
|
+
# Can handle (currently) copy via FTP and on local filesystem. Plug of sftp should
|
|
4
|
+
# not be hard.
|
|
5
|
+
#
|
|
6
|
+
# == How to use
|
|
7
|
+
# Add the follozing to your hobix.yaml file:
|
|
8
|
+
#
|
|
9
|
+
# - replicate:
|
|
10
|
+
# target: ftp://user:pass@isp.com/foo/bar/
|
|
11
|
+
# production_link: http://www.myisp.com/~me/blog
|
|
12
|
+
#
|
|
13
|
+
# production_link is optionnal and has been stolen from Sebastian Kanthak
|
|
14
|
+
# (http://www.kanthak.net/explorations/blog/hobix/staging_hobix.html)
|
|
15
|
+
#
|
|
16
|
+
# It allows to change the link to the weblog based on the HOBIX_ENV variable
|
|
17
|
+
# which mean that you can have a local test blog (link set to /home/me/foo/blog/htdocs)
|
|
18
|
+
# for example, and a "production" blog (link is http://www.myisp.com/~me/blog) and it should
|
|
19
|
+
# be uploaded to isp.com/foo/bar/ using given user/pass
|
|
20
|
+
#
|
|
21
|
+
# Thus to sum-up:
|
|
22
|
+
#
|
|
23
|
+
# * If the HOBIX_ENV variable is set to "production", then the link is changed
|
|
24
|
+
# to value of production_link (if available) and the page are uploaded to target
|
|
25
|
+
# * If HOBIX_ENV is not set, then the link is not changed and the page go to htdocs
|
|
26
|
+
#
|
|
27
|
+
#
|
|
28
|
+
# == TODO
|
|
29
|
+
# - Beautify/simplify code
|
|
30
|
+
# - Potentially add some other "non-generated" files (for example css files..)
|
|
31
|
+
#
|
|
32
|
+
# Copyright - Frederick Ros
|
|
33
|
+
# License: same as Ruby's one
|
|
34
|
+
#
|
|
35
|
+
# $Id$
|
|
36
|
+
#
|
|
37
|
+
require 'hobix/base'
|
|
38
|
+
require 'net/ftp'
|
|
39
|
+
require 'fileutils'
|
|
40
|
+
|
|
41
|
+
module Publish
|
|
42
|
+
|
|
43
|
+
Target = Struct.new( :path, :host, :user, :passwd )
|
|
44
|
+
|
|
45
|
+
class PublishReplication < Hobix::BasePublish
|
|
46
|
+
attr_reader :production, :replicator, :weblog
|
|
47
|
+
|
|
48
|
+
def initialize( blog, hash_opt )
|
|
49
|
+
@weblog = blog
|
|
50
|
+
hash_opt['items'] = nil
|
|
51
|
+
hash_opt['source'] = weblog.output_path
|
|
52
|
+
|
|
53
|
+
if ENV['HOBIX_ENV'] == "production"
|
|
54
|
+
@production = true
|
|
55
|
+
#
|
|
56
|
+
# Change link if a production one is given
|
|
57
|
+
#
|
|
58
|
+
blog.link = hash_opt['production_link'] || blog.link
|
|
59
|
+
else
|
|
60
|
+
@production = false
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
if hash_opt['target'] =~ /^ftp:\/\/([^:]+):([^@]+)@([^\/]+)(\/.*)$/
|
|
64
|
+
tgt = Target.new($4,$3,$1,$2)
|
|
65
|
+
|
|
66
|
+
@replicator = ReplicateFtp::new(hash_opt, tgt)
|
|
67
|
+
else
|
|
68
|
+
#
|
|
69
|
+
# File replication
|
|
70
|
+
#
|
|
71
|
+
tgt = Target.new(hash_opt['target'])
|
|
72
|
+
@replicator = ReplicateFS.new(hash_opt, tgt)
|
|
73
|
+
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def watch
|
|
78
|
+
['index']
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def publish( page_name )
|
|
82
|
+
return unless production
|
|
83
|
+
replicator.items = weblog.updated_pages.map { |o| o.link }
|
|
84
|
+
replicator.copy do |nb,f,src,tgt|
|
|
85
|
+
puts "## Replicating #{src}"
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
module Hobix
|
|
93
|
+
class Weblog
|
|
94
|
+
attr_reader :updated_pages
|
|
95
|
+
|
|
96
|
+
alias p_publish_orig p_publish
|
|
97
|
+
|
|
98
|
+
def p_publish( obj )
|
|
99
|
+
@updated_pages ||= []
|
|
100
|
+
@updated_pages << obj
|
|
101
|
+
p_publish_orig( obj )
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
class Replicate
|
|
108
|
+
|
|
109
|
+
attr_accessor :items, :target, :source
|
|
110
|
+
|
|
111
|
+
def initialize(hash_src, hash_tgt)
|
|
112
|
+
@items = hash_src['items']
|
|
113
|
+
@source = hash_src['source']
|
|
114
|
+
@target = hash_tgt['path']
|
|
115
|
+
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
DIRFILE = /^(.*\/)?([^\/]*)$/
|
|
120
|
+
|
|
121
|
+
def get_dirs
|
|
122
|
+
dirs = Array.new
|
|
123
|
+
|
|
124
|
+
dirfiles = items.collect do |itm|
|
|
125
|
+
dir,file = DIRFILE.match(itm).captures
|
|
126
|
+
|
|
127
|
+
if dir && dir.strip.size != 0
|
|
128
|
+
dirs.push dir
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
dirs
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def get_files
|
|
136
|
+
files = Array.new
|
|
137
|
+
dirfiles = items.collect do |itm|
|
|
138
|
+
dir,file = DIRFILE.match(itm).captures
|
|
139
|
+
|
|
140
|
+
if file && file.strip.size != 0
|
|
141
|
+
files.push itm
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
files
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def check_and_make_dirs
|
|
149
|
+
dirs = get_dirs
|
|
150
|
+
|
|
151
|
+
dirs.each do |dir|
|
|
152
|
+
# Check existence and create if not present
|
|
153
|
+
dir = File.join(target,dir)
|
|
154
|
+
if !directory?(dir)
|
|
155
|
+
# Let's create it !
|
|
156
|
+
mkdir_p(dir)
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def copy_files ( &block)
|
|
163
|
+
files = get_files
|
|
164
|
+
|
|
165
|
+
nb_files = files.size
|
|
166
|
+
|
|
167
|
+
files.each do |file|
|
|
168
|
+
|
|
169
|
+
src_f = File.join(source,file)
|
|
170
|
+
tgt_f = File.join(target,file)
|
|
171
|
+
|
|
172
|
+
if block_given?
|
|
173
|
+
yield nb_files,file, src_f, tgt_f
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
cp(src_f,tgt_f)
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def copy (&block)
|
|
182
|
+
if respond_to?(:login)
|
|
183
|
+
send :login
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
check_and_make_dirs
|
|
187
|
+
|
|
188
|
+
copy_files &block
|
|
189
|
+
|
|
190
|
+
if respond_to?(:logout)
|
|
191
|
+
send :logout
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
class ReplicateFtp < Replicate
|
|
200
|
+
|
|
201
|
+
attr_accessor :ftp, :passwd, :user, :host
|
|
202
|
+
|
|
203
|
+
def initialize(hash_src, hash_tgt)
|
|
204
|
+
super(hash_src,hash_tgt)
|
|
205
|
+
|
|
206
|
+
@user = hash_tgt['user']
|
|
207
|
+
@passwd = hash_tgt['passwd']
|
|
208
|
+
@host = hash_tgt['host']
|
|
209
|
+
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def login
|
|
213
|
+
@ftp = Net::FTP.open(host)
|
|
214
|
+
ftp.login user,passwd
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def logout
|
|
218
|
+
ftp.close
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def directory?(d)
|
|
222
|
+
old_dir = ftp.pwd
|
|
223
|
+
|
|
224
|
+
begin
|
|
225
|
+
ftp.chdir d
|
|
226
|
+
# If we successfully change to d, we could now return to orig dir
|
|
227
|
+
# otherwise we're in the rescue section ...
|
|
228
|
+
ftp.chdir(old_dir)
|
|
229
|
+
return true
|
|
230
|
+
|
|
231
|
+
rescue Net::FTPPermError
|
|
232
|
+
if $!.to_s[0,3] == "550"
|
|
233
|
+
# 550 : No such file or directory
|
|
234
|
+
return false
|
|
235
|
+
end
|
|
236
|
+
raise Net::FTPPermError, $!
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def mkdir_p(tgt)
|
|
242
|
+
old_dir = ftp.pwd
|
|
243
|
+
tgt.split(/\/+/).each do |dir|
|
|
244
|
+
next if dir.size == 0
|
|
245
|
+
# Let's try to go down
|
|
246
|
+
begin
|
|
247
|
+
ftp.chdir(dir)
|
|
248
|
+
# Ok .. So it was already existing ..
|
|
249
|
+
rescue Net::FTPPermError
|
|
250
|
+
if $!.to_s[0,3] == "550"
|
|
251
|
+
# 550 : No such file or directory : let's create ..
|
|
252
|
+
ftp.mkdir(dir)
|
|
253
|
+
# and retry
|
|
254
|
+
retry
|
|
255
|
+
end
|
|
256
|
+
raise Net::FTPPermError, $!
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
ftp.chdir(old_dir)
|
|
260
|
+
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def cp(src,tgt)
|
|
265
|
+
ftp.putbinaryfile src, tgt
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
class ReplicateFS < Replicate
|
|
270
|
+
|
|
271
|
+
def directory?(d)
|
|
272
|
+
File.directory? d
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def mkdir_p(tgt)
|
|
276
|
+
FileUtils.mkdir_p tgt
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def cp(src,tgt)
|
|
280
|
+
FileUtils.cp src, tgt
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#
|
|
2
|
+
# = hobix/publisher.rb
|
|
3
|
+
#
|
|
4
|
+
# Hobix command-line weblog system, web-based publishing interface.
|
|
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
|
+
|
|
17
|
+
require 'hobix/facets/publisher'
|
|
18
|
+
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# Maintain a dictionary mapping words to consecutive integers (the
|
|
2
|
+
# first unique word is 0, the second is 1 and so on)
|
|
3
|
+
|
|
4
|
+
require 'hobix/search/porter_stemmer'
|
|
5
|
+
module Hobix
|
|
6
|
+
module Search
|
|
7
|
+
module Simple
|
|
8
|
+
class Dictionary
|
|
9
|
+
STOP_WORDS = {
|
|
10
|
+
"a" => 1,
|
|
11
|
+
"again" => 1,
|
|
12
|
+
"all" => 1,
|
|
13
|
+
"along" => 1,
|
|
14
|
+
"also" => 1,
|
|
15
|
+
"an" => 1,
|
|
16
|
+
"and" => 1,
|
|
17
|
+
"arialhelvetica" => 1,
|
|
18
|
+
"as" => 1,
|
|
19
|
+
"at" => 1,
|
|
20
|
+
"but" => 1,
|
|
21
|
+
"by" => 1,
|
|
22
|
+
"came" => 1,
|
|
23
|
+
"can" => 1,
|
|
24
|
+
"cant" => 1,
|
|
25
|
+
"couldnt" => 1,
|
|
26
|
+
"did" => 1,
|
|
27
|
+
"didn" => 1,
|
|
28
|
+
"didnt" => 1,
|
|
29
|
+
"do" => 1,
|
|
30
|
+
"doesnt" => 1,
|
|
31
|
+
"dont" => 1,
|
|
32
|
+
"entrytitledetail" => 1,
|
|
33
|
+
"ever" => 1,
|
|
34
|
+
"first" => 1,
|
|
35
|
+
"fontvariant" => 1,
|
|
36
|
+
"from" => 1,
|
|
37
|
+
"have" => 1,
|
|
38
|
+
"her" => 1,
|
|
39
|
+
"here" => 1,
|
|
40
|
+
"him" => 1,
|
|
41
|
+
"how" => 1,
|
|
42
|
+
"i" => 1,
|
|
43
|
+
"if" => 1,
|
|
44
|
+
"in" => 1,
|
|
45
|
+
"into" => 1,
|
|
46
|
+
"is" => 1,
|
|
47
|
+
"isnt" => 1,
|
|
48
|
+
"it" => 1,
|
|
49
|
+
"itll" => 1,
|
|
50
|
+
"just" => 1,
|
|
51
|
+
"last" => 1,
|
|
52
|
+
"least" => 1,
|
|
53
|
+
"like" => 1,
|
|
54
|
+
"most" => 1,
|
|
55
|
+
"my" => 1,
|
|
56
|
+
"new" => 1,
|
|
57
|
+
"no" => 1,
|
|
58
|
+
"not" => 1,
|
|
59
|
+
"now" => 1,
|
|
60
|
+
"of" => 1,
|
|
61
|
+
"on" => 1,
|
|
62
|
+
"or" => 1,
|
|
63
|
+
"should" => 1,
|
|
64
|
+
"sidebartitl" => 1,
|
|
65
|
+
"sinc" => 1,
|
|
66
|
+
"so" => 1,
|
|
67
|
+
"some" => 1,
|
|
68
|
+
"textdecoration" => 1,
|
|
69
|
+
"th" => 1,
|
|
70
|
+
"than" => 1,
|
|
71
|
+
"that" => 1,
|
|
72
|
+
"the" => 1,
|
|
73
|
+
"their" => 1,
|
|
74
|
+
"then" => 1,
|
|
75
|
+
"those" => 1,
|
|
76
|
+
"to" => 1,
|
|
77
|
+
"told" => 1,
|
|
78
|
+
"too" => 1,
|
|
79
|
+
"true" => 1,
|
|
80
|
+
"try" => 1,
|
|
81
|
+
"until" => 1,
|
|
82
|
+
"url" => 1,
|
|
83
|
+
"us" => 1,
|
|
84
|
+
"were" => 1,
|
|
85
|
+
"when" => 1,
|
|
86
|
+
"whether" => 1,
|
|
87
|
+
"while" => 1,
|
|
88
|
+
"with" => 1,
|
|
89
|
+
"within" => 1,
|
|
90
|
+
"yes" => 1,
|
|
91
|
+
"you" => 1,
|
|
92
|
+
"youll" => 1,
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
attr_reader :total, :clsf, :words
|
|
96
|
+
|
|
97
|
+
def initialize
|
|
98
|
+
@total = 0
|
|
99
|
+
@clsf = {}
|
|
100
|
+
@words = {}
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def add_word(word, classifications = [], mod = 1)
|
|
104
|
+
word = Stemmable::stem_porter(word)
|
|
105
|
+
if STOP_WORDS[word]
|
|
106
|
+
nil
|
|
107
|
+
else
|
|
108
|
+
@words[word] ||= {:pos => @words.size, :clsf => {}}
|
|
109
|
+
classifications.each do |c|
|
|
110
|
+
@clsf[c] ||= {}
|
|
111
|
+
@clsf[c][word] ||= 0
|
|
112
|
+
@clsf[c][word] += mod
|
|
113
|
+
@total += mod
|
|
114
|
+
end
|
|
115
|
+
@words[word][:pos]
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def remove_word(word, classifications = [])
|
|
120
|
+
add_word(word, classifications, -1)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def find(word)
|
|
124
|
+
word = Stemmable::stem_porter(word)
|
|
125
|
+
if @words[word] and not STOP_WORDS[word]
|
|
126
|
+
@words[word][:pos]
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def size
|
|
131
|
+
@words.size
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def dump
|
|
135
|
+
puts @words.keys.sort
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|