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
data/COPYING
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
Copyright (c) 2004 why the lucky stiff
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
of this software and associated documentation files (the "Software"), to
|
|
5
|
+
deal in the Software without restriction, including without limitation the
|
|
6
|
+
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
7
|
+
sell copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
furnished to do so, subject to the following conditions:
|
|
9
|
+
|
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
|
11
|
+
all copies or substantial portions of the Software.
|
|
12
|
+
|
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
16
|
+
THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
17
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
18
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
Hi, this is Hobix SVN. I can't imagine inadvertantly pulling
|
|
2
|
+
a checkout on Hobix source code, but if you did: well, then,
|
|
3
|
+
Hobix is a weblahhging tool. It comes with a command-line and
|
|
4
|
+
a buncha libraries.
|
|
5
|
+
|
|
6
|
+
If you want to read all about it, see http://hobix.com/ for the
|
|
7
|
+
full deal.
|
|
8
|
+
|
|
9
|
+
If you want to try Hobix out, I suggest using the online installer,
|
|
10
|
+
which can be activated by running:
|
|
11
|
+
|
|
12
|
+
ruby -ropen-uri -e 'eval(open("http://go.hobix.com/").read)'
|
|
13
|
+
|
|
14
|
+
Or you can install the CVS version here by using:
|
|
15
|
+
|
|
16
|
+
sudo ruby setup.rb
|
|
17
|
+
|
|
18
|
+
Goo* luc*! -- _why
|
data/Rakefile
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
require 'rake'
|
|
2
|
+
require 'rake/clean'
|
|
3
|
+
require 'rake/gempackagetask'
|
|
4
|
+
require 'rake/rdoctask'
|
|
5
|
+
require 'grancher/task'
|
|
6
|
+
require 'fileutils'
|
|
7
|
+
include FileUtils
|
|
8
|
+
|
|
9
|
+
NAME = "hobix"
|
|
10
|
+
VERS = "0.6"
|
|
11
|
+
CLEAN.include ['**/.*.sw?', '*.gem', '.config']
|
|
12
|
+
RDOC_OPTS = [ '--quiet', '--title', "The Book of Hobix",
|
|
13
|
+
# "--template", "extras/flipbook_rdoc.rb",
|
|
14
|
+
"--opname", "index.html",
|
|
15
|
+
"--line-numbers",
|
|
16
|
+
"--main", "README",
|
|
17
|
+
"--inline-source" ]
|
|
18
|
+
|
|
19
|
+
desc "Packages up Hobix."
|
|
20
|
+
task :default => [:package]
|
|
21
|
+
task :package => [:clean]
|
|
22
|
+
|
|
23
|
+
task :doc => [:rdoc, :after_doc]
|
|
24
|
+
|
|
25
|
+
Rake::RDocTask.new do |rdoc|
|
|
26
|
+
rdoc.rdoc_dir = 'doc/rdoc'
|
|
27
|
+
rdoc.options += RDOC_OPTS
|
|
28
|
+
# rdoc.template = "extras/flipbook_rdoc.rb"
|
|
29
|
+
rdoc.main = "README"
|
|
30
|
+
rdoc.title = "The Book of Hobix"
|
|
31
|
+
rdoc.rdoc_files.add ['README', 'doc/CHANGELOG', 'COPYING', 'lib/hobix.rb', 'lib/hobix/*.rb']
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
task :after_doc do
|
|
35
|
+
# cp "extras/Camping.gif", "doc/rdoc/"
|
|
36
|
+
# cp "extras/permalink.gif", "doc/rdoc/"
|
|
37
|
+
sh %{scp -r doc/rdoc/* #{ENV['USER']}@rubyforge.org:/var/www/gforge-projects/hobix/}
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
spec =
|
|
41
|
+
Gem::Specification.new do |s|
|
|
42
|
+
s.name = NAME
|
|
43
|
+
s.version = VERS
|
|
44
|
+
s.platform = Gem::Platform::RUBY
|
|
45
|
+
s.has_rdoc = true
|
|
46
|
+
s.extra_rdoc_files = ["README", "doc/CHANGELOG", "COPYING"]
|
|
47
|
+
s.rdoc_options += RDOC_OPTS + ['--exclude', '^(contrib)\/']
|
|
48
|
+
s.summary = "the white pantsuit of weblahhing"
|
|
49
|
+
s.description = s.summary
|
|
50
|
+
s.author = "why the lucky stiff"
|
|
51
|
+
s.email = 'why@ruby-lang.org'
|
|
52
|
+
s.homepage = 'http://hobix.com'
|
|
53
|
+
s.executables = ['hobix']
|
|
54
|
+
|
|
55
|
+
s.add_dependency('RedCloth')
|
|
56
|
+
s.required_ruby_version = '>= 1.8.2'
|
|
57
|
+
|
|
58
|
+
s.files = %w(COPYING README Rakefile git_hobix_update.php) +
|
|
59
|
+
Dir.glob("{bin,doc,test,share,lib,contrib}/**/*") +
|
|
60
|
+
Dir.glob("ext/**/*.{h,c,rb}") +
|
|
61
|
+
Dir.glob("examples/**/*.rb")
|
|
62
|
+
|
|
63
|
+
s.require_path = "lib"
|
|
64
|
+
# s.extensions = FileList["ext/**/extconf.rb"].to_a
|
|
65
|
+
s.bindir = "bin"
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
Rake::GemPackageTask.new(spec) do |p|
|
|
69
|
+
p.need_tar = true
|
|
70
|
+
p.need_zip = true
|
|
71
|
+
p.gem_spec = spec
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
task :install do
|
|
75
|
+
sh %{rake gem}
|
|
76
|
+
sh %{gem install pkg/#{NAME}-#{VERS}}
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
task :uninstall => [:clean] do
|
|
80
|
+
sh %{gem uninstall #{NAME}}
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
Grancher::Task.new do |g|
|
|
84
|
+
g.branch = 'gh-pages'
|
|
85
|
+
g.push_to = 'origin'
|
|
86
|
+
g.message = 'Updated website' # defaults to 'Updated files.'
|
|
87
|
+
|
|
88
|
+
# Put the website-directory in the root
|
|
89
|
+
g.directory 'school/htdocs'
|
|
90
|
+
|
|
91
|
+
# doc -> doc
|
|
92
|
+
g.directory 'doc', 'doc'
|
|
93
|
+
|
|
94
|
+
# README -> README
|
|
95
|
+
g.file 'README', 'README.txt'
|
|
96
|
+
end
|
data/bin/hobix
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#! /usr/bin/ruby1.8
|
|
2
|
+
require 'hobix/commandline'
|
|
3
|
+
require 'optparse'
|
|
4
|
+
|
|
5
|
+
cmdline = Class.new
|
|
6
|
+
cmdline.extend Hobix::CommandLine
|
|
7
|
+
|
|
8
|
+
def print_usage( cmdline )
|
|
9
|
+
puts "hobix #{ Hobix::VERSION } on ruby #{ ::RUBY_VERSION } (#{ ::RUBY_RELEASE_DATE }) [#{ ::RUBY_PLATFORM }]"
|
|
10
|
+
puts "Usage: hobix command weblog-name [command-options]"
|
|
11
|
+
puts "Commands are"
|
|
12
|
+
['app', 'weblog', 'action'].each do |cmd_type|
|
|
13
|
+
cmdline.methods.collect do |m|
|
|
14
|
+
if m =~ /^(\w+)_(#{ cmd_type })$/
|
|
15
|
+
[$1, $&]
|
|
16
|
+
end
|
|
17
|
+
end.compact.sort.each do |cmd, m|
|
|
18
|
+
args = "#{ cmd } #{ cmdline.method( "#{ m }_args" ).call.join( ' ' ) }"
|
|
19
|
+
exp = cmdline.method( "#{ m }_explain" ).call.gsub( /\n/, "\n" + ( " " * 40 ) )
|
|
20
|
+
puts " %-38s%-40s" % [args, exp]
|
|
21
|
+
end
|
|
22
|
+
puts
|
|
23
|
+
end
|
|
24
|
+
exit
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
config = nil
|
|
28
|
+
opts = OptionParser.new
|
|
29
|
+
opts.on( "-c", "--config FILE", String ) { |val| config = val }
|
|
30
|
+
|
|
31
|
+
args = opts.parse( *ARGV )
|
|
32
|
+
print_usage( cmdline ) if args.length < 1 or args[0] == 'help'
|
|
33
|
+
|
|
34
|
+
# unfreeze the arguments
|
|
35
|
+
cmd, *opts = args.collect do |arg|
|
|
36
|
+
arg.dup
|
|
37
|
+
end
|
|
38
|
+
args.clear
|
|
39
|
+
|
|
40
|
+
cmdline.login( config )
|
|
41
|
+
|
|
42
|
+
mname = nil
|
|
43
|
+
if cmd == 'setup_blogs'
|
|
44
|
+
mname = cmd
|
|
45
|
+
elsif cmdline.respond_to? "#{ cmd }_app"
|
|
46
|
+
mname = "#{ cmd }_app"; opts = [YAML::load( DATA )]
|
|
47
|
+
elsif cmdline.respond_to? "#{ cmd }_weblog"
|
|
48
|
+
mname = "#{ cmd }_weblog"
|
|
49
|
+
elsif cmdline.respond_to? "#{ cmd }_action"
|
|
50
|
+
weblog = opts.shift
|
|
51
|
+
unless cmdline.config['weblogs'].respond_to? :has_key?
|
|
52
|
+
puts "*** no weblogs found in your configuration."
|
|
53
|
+
puts "*** use `hobix create' or `hobix add' to setup."
|
|
54
|
+
exit
|
|
55
|
+
end
|
|
56
|
+
unless cmdline.config['weblogs'].has_key? weblog
|
|
57
|
+
puts "*** no weblog `#{ weblog }' found in your configuration."
|
|
58
|
+
puts "*** type `hobix help' and check your spelling."
|
|
59
|
+
exit
|
|
60
|
+
end
|
|
61
|
+
begin
|
|
62
|
+
hobix_weblog = URI::parse( cmdline.config['weblogs'][ weblog ] )
|
|
63
|
+
rescue URI::InvalidURIError
|
|
64
|
+
hobix_weblog = URI.parse ''
|
|
65
|
+
end
|
|
66
|
+
if hobix_weblog.scheme and hobix_weblog.scheme.length > 1
|
|
67
|
+
mname = "#{ hobix_weblog.scheme }_#{ cmd }_remote"
|
|
68
|
+
unless cmdline.respond_to? mname
|
|
69
|
+
opts.unshift cmd
|
|
70
|
+
mname = hobix_weblog.scheme
|
|
71
|
+
end
|
|
72
|
+
else
|
|
73
|
+
hobix_weblog = Hobix::Weblog.load( cmdline.config['weblogs'][ weblog ] )
|
|
74
|
+
mname = "#{ cmd }_action"
|
|
75
|
+
end
|
|
76
|
+
opts.unshift hobix_weblog
|
|
77
|
+
end
|
|
78
|
+
unless mname
|
|
79
|
+
abort "*** no hobix command `#{ cmd }'. use `hobix' without arguments to get help."
|
|
80
|
+
end
|
|
81
|
+
m = cmdline.method( mname )
|
|
82
|
+
if m.arity == opts.length or (m.arity < 0 and opts.length >= m.arity.abs - 1)
|
|
83
|
+
m.call( *opts )
|
|
84
|
+
else
|
|
85
|
+
arglist = [cmd] + cmdline.method( "#{ mname }_args" ).call
|
|
86
|
+
need = m.arity
|
|
87
|
+
need = need.abs - 1 if need < 0
|
|
88
|
+
puts "*** wrong arguments (#{opts.length} given, #{need} needed)"
|
|
89
|
+
puts "*** use syntax: `hobix #{ arglist.join( ' ' ) }'"
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
__END__
|
|
93
|
+
# configuration
|
|
94
|
+
--- {}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
|
|
3
|
+
## VERSION 0.2
|
|
4
|
+
##
|
|
5
|
+
## This is a preliminary Blosxom to Hobix entry conversion
|
|
6
|
+
## script. Right now it's heavily biased towards the plugins and the
|
|
7
|
+
## subset of Blosxom that I used. Feel free to send me comments (or
|
|
8
|
+
## patches!) if it's not doing what you want.
|
|
9
|
+
##
|
|
10
|
+
## Example usage:
|
|
11
|
+
##
|
|
12
|
+
## ./blosxom-to-hobix.rb -e /usr/share/blosxom/plugins/state/.entries_index.index /var/www/blosxom/ /var/www/hobix/entries/ goatlord
|
|
13
|
+
##
|
|
14
|
+
## This will run over all the .blog files all in subdirectories of
|
|
15
|
+
## /var/www/blosxom, and convert them to .yaml files in the
|
|
16
|
+
## appropriate subdirectory of /var/www/hobix/entries/ (creating
|
|
17
|
+
## directories as needed), with the author set to 'goatlord'. It will
|
|
18
|
+
## set the creation times to the corresponding entry in the
|
|
19
|
+
## entries_index state file, or from the file's mtime otherwise. (If
|
|
20
|
+
## you don't use the entries_index plugin, you don't worry about the
|
|
21
|
+
## -e option.)
|
|
22
|
+
##
|
|
23
|
+
## Right now this will detect Tiki usage if it sees a //tiki line, and
|
|
24
|
+
## do some preliminary Tiki -> Textile conversion. I only used a small
|
|
25
|
+
## subset of the Tiki stuff, so don't expect this to do all the
|
|
26
|
+
## conversion right off the bat.
|
|
27
|
+
##
|
|
28
|
+
## I find that this works best with fold_lines turned on in RedCloth.
|
|
29
|
+
## I enable them via the following code in lib/local.rb:
|
|
30
|
+
##
|
|
31
|
+
## module Hobix
|
|
32
|
+
##
|
|
33
|
+
## class RedClothFoldLines < RedCloth
|
|
34
|
+
## def initialize(*args)
|
|
35
|
+
## x = super(*args)
|
|
36
|
+
## x.fold_lines = true
|
|
37
|
+
## x
|
|
38
|
+
## end
|
|
39
|
+
## end
|
|
40
|
+
##
|
|
41
|
+
## def Entry::text_processor; RedClothFoldLines; end
|
|
42
|
+
##
|
|
43
|
+
## Good luck. --William <wmorgan-b2h@masanjin.net> 9/17/04
|
|
44
|
+
##
|
|
45
|
+
## This file is released under the GNU Public License.
|
|
46
|
+
|
|
47
|
+
require 'optparse'
|
|
48
|
+
require 'find'
|
|
49
|
+
require 'yaml'
|
|
50
|
+
require 'hobix'
|
|
51
|
+
|
|
52
|
+
class Options
|
|
53
|
+
def initialize # defaults
|
|
54
|
+
@parse_tiki = true
|
|
55
|
+
@entries_index = nil
|
|
56
|
+
@overwrite = false
|
|
57
|
+
|
|
58
|
+
@blosxom_extension = ".blog"
|
|
59
|
+
@hobix_extension = ".yaml"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def parse(args)
|
|
63
|
+
opts = OptionParser.new do |o|
|
|
64
|
+
o.banner = "Usage: blosxom-to-hobix [options] <blosxom-root> <hobix-root>"
|
|
65
|
+
o.separator ""
|
|
66
|
+
o.separator "Where [options] are:"
|
|
67
|
+
|
|
68
|
+
o.on("-t", "--no-parse-tiki", TrueClass,
|
|
69
|
+
"Don't convert Tiki to Textile when found") do |fl|
|
|
70
|
+
@parse_tiki = fl
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
o.on("-e", "--entries-index n", @entries_index.class,
|
|
74
|
+
"Entries_index data file") do |s|
|
|
75
|
+
@entries_index = s
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
o.on("-o", "--overwrite", TrueClass,
|
|
79
|
+
"Overwrite destination files without mercy") do |fl|
|
|
80
|
+
@overwrite = fl
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
o.on("-b", "--blosxom-extension", @blosxom_extension.class,
|
|
84
|
+
"Blosxom filename extension (default: #@blosxom_extension)") do |s|
|
|
85
|
+
@blosxom_extension = s
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
o.on("-x", "--hobix-extension", @hobix_extension.class,
|
|
89
|
+
"Hobix filename extension (default: #@hobix_extension)") do |s|
|
|
90
|
+
@hobix_extension = s
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
o.on_tail("-h", "--help", "Show this message") { puts opts ; exit }
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
opts.parse!(args)
|
|
97
|
+
self
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def method_missing(meth); instance_eval "@#{meth}"; end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def each_file(root, extension)
|
|
104
|
+
Find.find(root) do |fn|
|
|
105
|
+
yield fn if FileTest.file?(fn) && (fn =~ /#{extension}$/)
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def tiki_to_textile(s)
|
|
110
|
+
@in_bq ||= false # in block-quote mode
|
|
111
|
+
@in_pre ||= false # in pre mode
|
|
112
|
+
|
|
113
|
+
## this is kind of a mess.
|
|
114
|
+
|
|
115
|
+
xend = '[\s,.\?!-]'
|
|
116
|
+
|
|
117
|
+
map = {
|
|
118
|
+
## hack alert---inline urls in a pre-block we pull out of the pre block;
|
|
119
|
+
## otherwise they don't render.
|
|
120
|
+
/^\s+(\w+:\/\/.+)(#{xend}|$)/ => '"\1":\1\2',
|
|
121
|
+
|
|
122
|
+
## inline urls
|
|
123
|
+
/(^|\s)(\w+:\/\/.+)(#{xend}|$)/ => '\1"\2":\2\3',
|
|
124
|
+
|
|
125
|
+
## named urls
|
|
126
|
+
/\[(.*?)\]:(.+?)(#{xend}|$)/ => '"\1":\2\3',
|
|
127
|
+
|
|
128
|
+
## images
|
|
129
|
+
/\{(.*?)\}:(.+?)(#{xend}|$)/ => '!\2(\1)!\3',
|
|
130
|
+
|
|
131
|
+
## italics
|
|
132
|
+
/(\s|^)\/(.+?)\/(#{xend}|$)/ => '\1_\2_\3',
|
|
133
|
+
|
|
134
|
+
## these two were local hacks i made to tiki (to emulate latex
|
|
135
|
+
## hyphenation styles), so they may not apply to you.
|
|
136
|
+
/([^-])--([^-])/ => '\1-\2',
|
|
137
|
+
/([^-])---([^-])/ => '\1--\2',
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
map.each { |k, v| s.gsub! k, v }
|
|
141
|
+
|
|
142
|
+
if @in_bq
|
|
143
|
+
if s =~ /^[^>]$/
|
|
144
|
+
@in_bq = false
|
|
145
|
+
elsif s =~ /^>\s*(\S.*)$/
|
|
146
|
+
s = $1
|
|
147
|
+
end
|
|
148
|
+
elsif s =~ /^>\s*(\S.*)$/
|
|
149
|
+
@in_bq = true
|
|
150
|
+
s = "bq. " + $1
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
if @in_pre
|
|
154
|
+
if (s =~ /^\S/) || (s =~ /^\s*$/)
|
|
155
|
+
@in_pre = false
|
|
156
|
+
s += "</pre>\n"
|
|
157
|
+
end
|
|
158
|
+
elsif s =~ /^\s+\S/
|
|
159
|
+
s = "<pre>\n" + s
|
|
160
|
+
@in_pre = true
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
s
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def convert(bf, hf, author, date, opts)
|
|
167
|
+
title = bf.readline.chomp
|
|
168
|
+
tiki = false
|
|
169
|
+
content = ""
|
|
170
|
+
|
|
171
|
+
bf.each_line do |l|
|
|
172
|
+
if (l =~ /^\/\/Tiki/i) && opts.parse_tiki
|
|
173
|
+
tiki = true
|
|
174
|
+
else
|
|
175
|
+
l = tiki_to_textile(l) if tiki
|
|
176
|
+
content += l.chomp + "\n" # force newline
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
#puts "content is [#{content.chomp + "\n"}]"
|
|
181
|
+
|
|
182
|
+
hf.write(Hobix::Entry.new do |e|
|
|
183
|
+
e.title = title
|
|
184
|
+
e.content = content.chomp + "\n"
|
|
185
|
+
e.author = author
|
|
186
|
+
e.summary = nil
|
|
187
|
+
e.contributors = nil
|
|
188
|
+
e.tagline = nil
|
|
189
|
+
e.created = date
|
|
190
|
+
end.to_yaml)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def rec_mkdir(path)
|
|
194
|
+
if File.exists? path
|
|
195
|
+
true
|
|
196
|
+
else
|
|
197
|
+
unless File.exists? File.dirname(path)
|
|
198
|
+
rec_mkdir File.dirname(path)
|
|
199
|
+
end
|
|
200
|
+
Dir.mkdir path
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
def run(broot, hroot, author, opts)
|
|
205
|
+
entries_index = Hash.new
|
|
206
|
+
|
|
207
|
+
if opts.entries_index
|
|
208
|
+
IO.foreach(opts.entries_index) do |l|
|
|
209
|
+
if l =~ /'(.*?)' => (\d+)/
|
|
210
|
+
entries_index[$1] = $2
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
each_file(broot, opts.blosxom_extension) do |bfn|
|
|
216
|
+
hfn = File.join hroot,
|
|
217
|
+
bfn.gsub(/^#{broot}\//, "").gsub(/#{opts.blosxom_extension}$/,
|
|
218
|
+
opts.hobix_extension)
|
|
219
|
+
unless File.exists? File.dirname(hfn)
|
|
220
|
+
puts "## creating #{File.dirname(hfn)}"
|
|
221
|
+
rec_mkdir File.dirname(hfn)
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
if File.exists?(hfn) && !opts.overwrite
|
|
225
|
+
puts "## File #{hfn} already exists; skipping"
|
|
226
|
+
next
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
puts "#{bfn} => #{hfn}"
|
|
230
|
+
bfile = File.open(bfn, "r")
|
|
231
|
+
hfile = File.open(hfn, "w")
|
|
232
|
+
date = if entries_index[bfn]
|
|
233
|
+
Time.at(entries_index[bfn].to_i)
|
|
234
|
+
else
|
|
235
|
+
File.mtime(bfile)
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
convert bfile, hfile, author, date, opts
|
|
239
|
+
bfile.close
|
|
240
|
+
hfile.close
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
if $0 == __FILE__
|
|
245
|
+
opts = Options.new.parse ARGV
|
|
246
|
+
broot = ARGV.shift or
|
|
247
|
+
raise "First argument must be a Blosxom root. Try '-h'"
|
|
248
|
+
hroot = ARGV.shift or
|
|
249
|
+
raise "Second argument must be a Hobix root. Try '-h'"
|
|
250
|
+
author = ARGV.shift or raise "Third argument must be the author name. Try '-h'"
|
|
251
|
+
|
|
252
|
+
run broot.gsub(/\/$/, ""), hroot.gsub(/\/$/, ""), author, opts
|
|
253
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
#
|
|
2
|
+
# txp_to_hobix.rb
|
|
3
|
+
#
|
|
4
|
+
# Converts a textpattern xml dump file generated with sqldump into a set of Hobix YAML entry files.
|
|
5
|
+
#
|
|
6
|
+
# Hobix::Entry code lifted from http://www.anvilwerks.com/src/wordpress_to_hobix.rb
|
|
7
|
+
#
|
|
8
|
+
# (c) 2005 erngui.com
|
|
9
|
+
#
|
|
10
|
+
require "rexml/document"
|
|
11
|
+
include REXML # so that we don't have to prefix everything with REXML::...
|
|
12
|
+
|
|
13
|
+
require "hobix"
|
|
14
|
+
require "hobix/entry"
|
|
15
|
+
require "fileutils"
|
|
16
|
+
require "parsedate"
|
|
17
|
+
|
|
18
|
+
txpdump = ARGV.shift
|
|
19
|
+
outdir = ARGV.shift
|
|
20
|
+
|
|
21
|
+
usage = <<EOT
|
|
22
|
+
Usage:
|
|
23
|
+
|
|
24
|
+
ruby txp_to_hobix.rb <txp dump file> <output directory>
|
|
25
|
+
|
|
26
|
+
Converts a textpattern xml dump file generated with sqldump into a set of Hobix YAML entry files.
|
|
27
|
+
|
|
28
|
+
EOT
|
|
29
|
+
|
|
30
|
+
unless txpdump and outdir
|
|
31
|
+
puts usage
|
|
32
|
+
exit(1)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
txpexport = Document.new File.new(txpdump)
|
|
36
|
+
FileUtils.mkdir_p outdir
|
|
37
|
+
|
|
38
|
+
txpexport.elements.each("*/textpattern") do |e|
|
|
39
|
+
entry = Hobix::Entry.new()
|
|
40
|
+
entry.title = e.elements["Title"].text
|
|
41
|
+
entry.author = e.elements["AuthorID"].text
|
|
42
|
+
res = ParseDate.parsedate(e.elements["Posted"].text)
|
|
43
|
+
posted = Time.local(*res)
|
|
44
|
+
entry.created = posted
|
|
45
|
+
entry.summary = e.elements["Excerpt"].text if e.elements["Excerpt"].text
|
|
46
|
+
entry.content = e.elements["Body"].text
|
|
47
|
+
|
|
48
|
+
# use the post title as filename after removing dodgy characters
|
|
49
|
+
yamlfile = File.join(outdir, e.elements["Title"].text.downcase.tr(" :?!", "-").gsub(/[^a-zA-Z0-9-]+/, "") + ".yaml")
|
|
50
|
+
|
|
51
|
+
puts "writing: #{yamlfile}"
|
|
52
|
+
puts yamlfile.gsub(/(\w)\w*/, '\1').tr("-", "")
|
|
53
|
+
File.open(yamlfile, "w") do |f|
|
|
54
|
+
f.write(entry.to_yaml + "\n")
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/local/bin/ruby
|
|
2
|
+
require 'webrick'
|
|
3
|
+
include WEBrick
|
|
4
|
+
|
|
5
|
+
s = HTTPServer.new(
|
|
6
|
+
:Port => 2000,
|
|
7
|
+
:DocumentRoot => Dir::pwd + "/htdocs"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
## mount subdirectories
|
|
11
|
+
require 'hobix/config'
|
|
12
|
+
require 'hobix/weblog'
|
|
13
|
+
config = File.open( File.expand_path( "~/.hobixrc" ) ) { |f| YAML::load( f ) }
|
|
14
|
+
config['weblogs'].each do |name, path|
|
|
15
|
+
weblog = Hobix::Weblog.load( path )
|
|
16
|
+
s.mount("/#{ name }", HTTPServlet::FileHandler, weblog.output_path)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
trap("INT"){ s.shutdown }
|
|
20
|
+
s.start
|