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,141 @@
|
|
|
1
|
+
require 'uri'
|
|
2
|
+
|
|
3
|
+
module Hobix
|
|
4
|
+
class WebApp
|
|
5
|
+
# :stopdoc:
|
|
6
|
+
class URIGen
|
|
7
|
+
def initialize(scheme, server_name, server_port, script_name, path_info)
|
|
8
|
+
@scheme = scheme
|
|
9
|
+
@server_name = server_name
|
|
10
|
+
@server_port = server_port
|
|
11
|
+
@script_name = script_name
|
|
12
|
+
@path_info = path_info
|
|
13
|
+
uri = "#{scheme}://#{server_name}:#{server_port}"
|
|
14
|
+
uri << script_name.gsub(%r{[^/]+}) {|segment| pchar_escape(segment) }
|
|
15
|
+
uri << path_info.gsub(%r{[^/]+}) {|segment| pchar_escape(segment) }
|
|
16
|
+
@base_uri = URI.parse(uri)
|
|
17
|
+
end
|
|
18
|
+
attr_reader :base_uri
|
|
19
|
+
|
|
20
|
+
def make_relative_uri(hash)
|
|
21
|
+
script = nil
|
|
22
|
+
path_info = nil
|
|
23
|
+
query = nil
|
|
24
|
+
fragment = nil
|
|
25
|
+
hash.each_pair {|k,v|
|
|
26
|
+
case k
|
|
27
|
+
when :script then script = v
|
|
28
|
+
when :path_info then path_info = v
|
|
29
|
+
when :query then query = v
|
|
30
|
+
when :fragment then fragment = v
|
|
31
|
+
else
|
|
32
|
+
raise ArgumentError, "unexpected: #{k} => #{v}"
|
|
33
|
+
end
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if !script
|
|
37
|
+
script = @script_name
|
|
38
|
+
elsif %r{\A/} !~ script
|
|
39
|
+
script = @script_name.sub(%r{[^/]*\z}) { script }
|
|
40
|
+
while script.sub!(%r{/[^/]*/\.\.(?=/|\z)}, '')
|
|
41
|
+
end
|
|
42
|
+
script.sub!(%r{\A/\.\.(?=/|\z)}, '')
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
path_info = '/' + path_info if %r{\A[^/]} =~ path_info
|
|
46
|
+
|
|
47
|
+
dst = "#{script}#{path_info}"
|
|
48
|
+
dst.sub!(%r{\A/}, '')
|
|
49
|
+
dst.sub!(%r{[^/]*\z}, '')
|
|
50
|
+
dst_basename = $&
|
|
51
|
+
|
|
52
|
+
src = "#{@script_name}#{@path_info}"
|
|
53
|
+
src.sub!(%r{\A/}, '')
|
|
54
|
+
src.sub!(%r{[^/]*\z}, '')
|
|
55
|
+
|
|
56
|
+
while src[%r{\A[^/]*/}] == dst[%r{\A[^/]*/}]
|
|
57
|
+
if $~
|
|
58
|
+
src.sub!(%r{\A[^/]*/}, '')
|
|
59
|
+
dst.sub!(%r{\A[^/]*/}, '')
|
|
60
|
+
else
|
|
61
|
+
break
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
rel_path = '../' * src.count('/')
|
|
66
|
+
rel_path << dst << dst_basename
|
|
67
|
+
rel_path = './' if rel_path.empty?
|
|
68
|
+
|
|
69
|
+
rel_path.gsub!(%r{[^/]+}) {|segment| pchar_escape(segment) }
|
|
70
|
+
if /\A[A-Za-z][A-Za-z0-9+\-.]*:/ =~ rel_path # It seems absolute URI.
|
|
71
|
+
rel_path.sub!(/:/, '%3A')
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
if query
|
|
75
|
+
case query
|
|
76
|
+
when QueryString
|
|
77
|
+
query = query.instance_eval { @escaped_query_string }
|
|
78
|
+
when Hash
|
|
79
|
+
query = query.map {|k, v|
|
|
80
|
+
case v
|
|
81
|
+
when String
|
|
82
|
+
"#{form_escape(k)}=#{form_escape(v)}"
|
|
83
|
+
when Array
|
|
84
|
+
v.map {|e|
|
|
85
|
+
unless String === e
|
|
86
|
+
raise ArgumentError, "unexpected query value: #{e.inspect}"
|
|
87
|
+
end
|
|
88
|
+
"#{form_escape(k)}=#{form_escape(e)}"
|
|
89
|
+
}
|
|
90
|
+
else
|
|
91
|
+
raise ArgumentError, "unexpected query value: #{v.inspect}"
|
|
92
|
+
end
|
|
93
|
+
}.join(';')
|
|
94
|
+
else
|
|
95
|
+
raise ArgumentError, "unexpected query: #{query.inspect}"
|
|
96
|
+
end
|
|
97
|
+
unless query.empty?
|
|
98
|
+
query = '?' + uric_escape(query)
|
|
99
|
+
end
|
|
100
|
+
else
|
|
101
|
+
query = ''
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
if fragment
|
|
105
|
+
fragment = "#" + uric_escape(fragment)
|
|
106
|
+
else
|
|
107
|
+
fragment = ''
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
URI.parse(rel_path + query + fragment)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def make_absolute_uri(hash)
|
|
114
|
+
@base_uri + make_relative_uri(hash)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
Alpha = 'a-zA-Z'
|
|
118
|
+
Digit = '0-9'
|
|
119
|
+
AlphaNum = Alpha + Digit
|
|
120
|
+
Mark = '\-_.!~*\'()'
|
|
121
|
+
Unreserved = AlphaNum + Mark
|
|
122
|
+
PChar = Unreserved + ':@&=+$,'
|
|
123
|
+
def pchar_escape(s)
|
|
124
|
+
s.gsub(/[^#{PChar}]/on) {|c| sprintf("%%%02X", c[0]) }
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
Reserved = ';/?:@&=+$,'
|
|
128
|
+
Uric = Reserved + Unreserved
|
|
129
|
+
def uric_escape(s)
|
|
130
|
+
s.gsub(/[^#{Uric}]/on) {|c| sprintf("%%%02X", c[0]) }
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def form_escape(s)
|
|
134
|
+
s.gsub(/[#{Reserved}\x00-\x1f\x7f-\xff]/on) {|c|
|
|
135
|
+
sprintf("%%%02X", c[0])
|
|
136
|
+
}.gsub(/ /on) { '+' }
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
# :startdoc:
|
|
140
|
+
end
|
|
141
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# webapp/webrick-servlet.rb provides an adaptor for a webapp and WEBrick.
|
|
2
|
+
#
|
|
3
|
+
# webapp/webrick-servlet.rb registers a handler for .webrick extension
|
|
4
|
+
# using WEBrick::HTTPServlet::FileHandler.add_handler.
|
|
5
|
+
# So WEBrick based HTTP server which require webapp/webrick-servlet.rb
|
|
6
|
+
# can run a web application using webapp which filename has .webrick
|
|
7
|
+
# extension.
|
|
8
|
+
#
|
|
9
|
+
# Such HTTP server can be defined as follows.
|
|
10
|
+
#
|
|
11
|
+
# require 'webapp/webrick-servlet'
|
|
12
|
+
# httpd = WEBrick::HTTPServer.new(:Port => 10080, :DocumentRoot => Dir.getwd)
|
|
13
|
+
# trap(:INT){ httpd.shutdown }
|
|
14
|
+
# httpd.start
|
|
15
|
+
#
|
|
16
|
+
# Apart from that, webapp/webrick-servlet.rb provides
|
|
17
|
+
# WebApp::WEBrickServletHandler.load_servlet which load WEBrick servlet
|
|
18
|
+
# using webapp.
|
|
19
|
+
#
|
|
20
|
+
# WebApp::WEBrickServletHandler.load_servlet can be used for constructing
|
|
21
|
+
# a web site with a single web application as follows.
|
|
22
|
+
#
|
|
23
|
+
# require 'webapp/webrick-servlet'
|
|
24
|
+
# servlet = ARGV.shift
|
|
25
|
+
# httpd = WEBrick::HTTPServer.new(:Port => 10080)
|
|
26
|
+
# trap(:INT){ httpd.shutdown }
|
|
27
|
+
# httpd.mount("/", WebApp::WEBrickServletHandler.load_servlet(servlet))
|
|
28
|
+
# httpd.start
|
|
29
|
+
#
|
|
30
|
+
# When above server accept a request to http://host:10080/foo/bar,
|
|
31
|
+
# the servlet takes /foo/bar as a path_info.
|
|
32
|
+
#
|
|
33
|
+
# Note that the servlet loading mechanism may be used without webapp
|
|
34
|
+
# because the mechanism itself is not webapp dependent.
|
|
35
|
+
|
|
36
|
+
require 'webrick'
|
|
37
|
+
|
|
38
|
+
module Hobix
|
|
39
|
+
class WebApp
|
|
40
|
+
class WEBrickServletHandler
|
|
41
|
+
LoadedServlets = {}
|
|
42
|
+
def WEBrickServletHandler.get_instance(config, name)
|
|
43
|
+
unless LoadedServlets[name]
|
|
44
|
+
LoadedServlets[name] = load_servlet(name)
|
|
45
|
+
end
|
|
46
|
+
LoadedServlets[name]
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# load a WEBrick servlet written using webapp.
|
|
50
|
+
# WEBrickServletHandler.load_servlet returns a WEBrick servlet
|
|
51
|
+
# generated by WEBrick::HTTPServlet::ProcHandler.
|
|
52
|
+
def WEBrickServletHandler.load_servlet(path)
|
|
53
|
+
begin
|
|
54
|
+
Thread.current[:webrick_load_servlet] = true
|
|
55
|
+
load path, true
|
|
56
|
+
unless Thread.current[:webrick_load_servlet].respond_to? :call
|
|
57
|
+
raise "WEBrick servlet is not registered: #{path}"
|
|
58
|
+
end
|
|
59
|
+
procedure = Thread.current[:webrick_load_servlet]
|
|
60
|
+
return WEBrick::HTTPServlet::ProcHandler.new(procedure)
|
|
61
|
+
ensure
|
|
62
|
+
Thread.current[:webrick_load_servlet] = nil
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
WEBrick::HTTPServlet::FileHandler.add_handler('webrick',
|
|
69
|
+
Hobix::WebApp::WEBrickServletHandler)
|
|
70
|
+
|
|
71
|
+
if $0 == __FILE__
|
|
72
|
+
# usage: [-p port] [docroot|servlet]
|
|
73
|
+
require 'optparse'
|
|
74
|
+
port = 10080
|
|
75
|
+
ARGV.options {|q|
|
|
76
|
+
q.def_option('--help', 'show this message') {puts q; exit(0)}
|
|
77
|
+
q.def_option('--port=portnum', 'specify server port (default: 10080)') {|num| port = num.to_i }
|
|
78
|
+
q.parse!
|
|
79
|
+
}
|
|
80
|
+
docroot = ARGV.shift || Dir.getwd
|
|
81
|
+
httpd = WEBrick::HTTPServer.new(:Port => port)
|
|
82
|
+
trap(:INT){ httpd.shutdown }
|
|
83
|
+
if File.directory? docroot
|
|
84
|
+
httpd.mount("/", WEBrick::HTTPServlet::FileHandler, docroot, WEBrick::Config::HTTP[:DocumentRootOptions])
|
|
85
|
+
httpd.start
|
|
86
|
+
else
|
|
87
|
+
httpd.mount("/", Hobix::WebApp::WEBrickServletHandler.load_servlet(docroot))
|
|
88
|
+
httpd.start
|
|
89
|
+
end
|
|
90
|
+
end
|