hobix 0.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|