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.
Files changed (156) hide show
  1. data/COPYING +18 -0
  2. data/README +18 -0
  3. data/Rakefile +96 -0
  4. data/bin/hobix +94 -0
  5. data/contrib/blosxom-to-hobix.rb +253 -0
  6. data/contrib/txp-to-hobix.rb +56 -0
  7. data/contrib/webrick-all-mine.rb +20 -0
  8. data/doc/CHANGELOG +285 -0
  9. data/doc/rdoc/classes/Hobix/API.html +382 -0
  10. data/doc/rdoc/classes/Hobix/Article.html +111 -0
  11. data/doc/rdoc/classes/Hobix/BaseContent.html +692 -0
  12. data/doc/rdoc/classes/Hobix/BaseEntry.html +218 -0
  13. data/doc/rdoc/classes/Hobix/BaseFacet.html +205 -0
  14. data/doc/rdoc/classes/Hobix/BaseOutput.html +122 -0
  15. data/doc/rdoc/classes/Hobix/BasePlugin.html +201 -0
  16. data/doc/rdoc/classes/Hobix/BaseProperties/ClassMethods.html +243 -0
  17. data/doc/rdoc/classes/Hobix/BaseProperties.html +218 -0
  18. data/doc/rdoc/classes/Hobix/BasePublish.html +157 -0
  19. data/doc/rdoc/classes/Hobix/BaseStorage.html +417 -0
  20. data/doc/rdoc/classes/Hobix/BixWik/Entry.html +196 -0
  21. data/doc/rdoc/classes/Hobix/BixWik/IndexEntry.html +170 -0
  22. data/doc/rdoc/classes/Hobix/BixWik/WikiRedCloth.html +111 -0
  23. data/doc/rdoc/classes/Hobix/BixWik.html +418 -0
  24. data/doc/rdoc/classes/Hobix/BixWikPlugin.html +158 -0
  25. data/doc/rdoc/classes/Hobix/CommandLine.html +1970 -0
  26. data/doc/rdoc/classes/Hobix/Comment.html +113 -0
  27. data/doc/rdoc/classes/Hobix/Config.html +212 -0
  28. data/doc/rdoc/classes/Hobix/DataMarsh.html +667 -0
  29. data/doc/rdoc/classes/Hobix/Entry.html +178 -0
  30. data/doc/rdoc/classes/Hobix/EntryEnum.html +162 -0
  31. data/doc/rdoc/classes/Hobix/Enumerable.html +170 -0
  32. data/doc/rdoc/classes/Hobix/Facets/WikiEdit.html +180 -0
  33. data/doc/rdoc/classes/Hobix/Facets.html +111 -0
  34. data/doc/rdoc/classes/Hobix/LinkList.html +182 -0
  35. data/doc/rdoc/classes/Hobix/Out/Quick.html +412 -0
  36. data/doc/rdoc/classes/Hobix/Out.html +119 -0
  37. data/doc/rdoc/classes/Hobix/Page.html +381 -0
  38. data/doc/rdoc/classes/Hobix/Trackback.html +113 -0
  39. data/doc/rdoc/classes/Hobix/UriStr.html +198 -0
  40. data/doc/rdoc/classes/Hobix/WebApp/QueryString.html +207 -0
  41. data/doc/rdoc/classes/Hobix/WebApp/QueryValidationFailure.html +111 -0
  42. data/doc/rdoc/classes/Hobix/WebApp.html +1383 -0
  43. data/doc/rdoc/classes/Hobix/Weblog/AuthorNotFound.html +111 -0
  44. data/doc/rdoc/classes/Hobix/Weblog.html +2082 -0
  45. data/doc/rdoc/classes/Hobix.html +399 -0
  46. data/doc/rdoc/classes/Kernel.html +139 -0
  47. data/doc/rdoc/classes/Regexp.html +154 -0
  48. data/doc/rdoc/classes/YAML/Omap.html +144 -0
  49. data/doc/rdoc/classes/YAML.html +111 -0
  50. data/doc/rdoc/created.rid +1 -0
  51. data/doc/rdoc/files/COPYING.html +129 -0
  52. data/doc/rdoc/files/README.html +131 -0
  53. data/doc/rdoc/files/doc/CHANGELOG.html +101 -0
  54. data/doc/rdoc/files/lib/hobix/api_rb.html +119 -0
  55. data/doc/rdoc/files/lib/hobix/article_rb.html +126 -0
  56. data/doc/rdoc/files/lib/hobix/base_rb.html +128 -0
  57. data/doc/rdoc/files/lib/hobix/bixwik_rb.html +126 -0
  58. data/doc/rdoc/files/lib/hobix/commandline_rb.html +140 -0
  59. data/doc/rdoc/files/lib/hobix/comments_rb.html +126 -0
  60. data/doc/rdoc/files/lib/hobix/config_rb.html +125 -0
  61. data/doc/rdoc/files/lib/hobix/datamarsh_rb.html +108 -0
  62. data/doc/rdoc/files/lib/hobix/entry_rb.html +118 -0
  63. data/doc/rdoc/files/lib/hobix/linklist_rb.html +127 -0
  64. data/doc/rdoc/files/lib/hobix/publisher_rb.html +126 -0
  65. data/doc/rdoc/files/lib/hobix/trackbacks_rb.html +128 -0
  66. data/doc/rdoc/files/lib/hobix/webapp_rb.html +127 -0
  67. data/doc/rdoc/files/lib/hobix/weblog_rb.html +135 -0
  68. data/doc/rdoc/files/lib/hobix_rb.html +127 -0
  69. data/doc/rdoc/fr_class_index.html +67 -0
  70. data/doc/rdoc/fr_file_index.html +44 -0
  71. data/doc/rdoc/fr_method_index.html +307 -0
  72. data/doc/rdoc/index.html +24 -0
  73. data/doc/rdoc/rdoc-style.css +208 -0
  74. data/git_hobix_update.php +13 -0
  75. data/lib/hobix/api.rb +91 -0
  76. data/lib/hobix/article.rb +22 -0
  77. data/lib/hobix/base.rb +480 -0
  78. data/lib/hobix/bixwik.rb +200 -0
  79. data/lib/hobix/commandline.rb +677 -0
  80. data/lib/hobix/comments.rb +98 -0
  81. data/lib/hobix/config.rb +39 -0
  82. data/lib/hobix/datamarsh.rb +110 -0
  83. data/lib/hobix/entry.rb +84 -0
  84. data/lib/hobix/facets/comments.rb +99 -0
  85. data/lib/hobix/facets/publisher.rb +314 -0
  86. data/lib/hobix/facets/trackbacks.rb +80 -0
  87. data/lib/hobix/linklist.rb +81 -0
  88. data/lib/hobix/out/atom.rb +101 -0
  89. data/lib/hobix/out/erb.rb +64 -0
  90. data/lib/hobix/out/okaynews.rb +55 -0
  91. data/lib/hobix/out/quick.rb +314 -0
  92. data/lib/hobix/out/rdf.rb +97 -0
  93. data/lib/hobix/out/redrum.rb +26 -0
  94. data/lib/hobix/out/rss.rb +128 -0
  95. data/lib/hobix/plugin/akismet.rb +196 -0
  96. data/lib/hobix/plugin/bloglines.rb +73 -0
  97. data/lib/hobix/plugin/calendar.rb +212 -0
  98. data/lib/hobix/plugin/flickr.rb +110 -0
  99. data/lib/hobix/plugin/recent_comments.rb +84 -0
  100. data/lib/hobix/plugin/sections.rb +91 -0
  101. data/lib/hobix/plugin/tags.rb +60 -0
  102. data/lib/hobix/publish/ping.rb +53 -0
  103. data/lib/hobix/publish/replicate.rb +283 -0
  104. data/lib/hobix/publisher.rb +18 -0
  105. data/lib/hobix/search/dictionary.rb +141 -0
  106. data/lib/hobix/search/porter_stemmer.rb +203 -0
  107. data/lib/hobix/search/simple.rb +209 -0
  108. data/lib/hobix/search/vector.rb +100 -0
  109. data/lib/hobix/storage/filesys.rb +408 -0
  110. data/lib/hobix/trackbacks.rb +93 -0
  111. data/lib/hobix/util/objedit.rb +193 -0
  112. data/lib/hobix/util/patcher.rb +155 -0
  113. data/lib/hobix/webapp/cli.rb +195 -0
  114. data/lib/hobix/webapp/htmlform.rb +107 -0
  115. data/lib/hobix/webapp/message.rb +177 -0
  116. data/lib/hobix/webapp/urigen.rb +141 -0
  117. data/lib/hobix/webapp/webrick-servlet.rb +90 -0
  118. data/lib/hobix/webapp.rb +723 -0
  119. data/lib/hobix/weblog.rb +893 -0
  120. data/lib/hobix.rb +230 -0
  121. data/share/default-blog/hobix.yaml +16 -0
  122. data/share/default-blog/htdocs/site.css +174 -0
  123. data/share/default-blog/skel/entry.html.quick +0 -0
  124. data/share/default-blog/skel/index.atom.atom +0 -0
  125. data/share/default-blog/skel/index.html.quick-summary +0 -0
  126. data/share/default-blog/skel/index.xml.rss +0 -0
  127. data/share/default-blog/skel/index.yaml.okaynews +0 -0
  128. data/share/default-blog/skel/monthly.html.quick-archive +0 -0
  129. data/share/default-blog/skel/section.html.quick-archive +0 -0
  130. data/share/default-blog/skel/yearly.html.quick-archive +0 -0
  131. data/share/default-blog-modes.yaml +7 -0
  132. data/share/default-blog.apache-cgi.patch +8 -0
  133. data/share/default-blog.apache-ssi.patch +38 -0
  134. data/share/default-blog.apache2-ssi.patch +3 -0
  135. data/share/default-blog.cgi.patch +8 -0
  136. data/share/default-blog.comments.patch +5 -0
  137. data/share/default-blog.prototype.patch +766 -0
  138. data/share/default-blog.publisher.patch +5 -0
  139. data/share/default-blog.wiki.patch +29 -0
  140. data/share/publisher/css/control.css +90 -0
  141. data/share/publisher/css/form.css +238 -0
  142. data/share/publisher/css/form.import.css +72 -0
  143. data/share/publisher/css/main-menu.css +134 -0
  144. data/share/publisher/i/hobix-emblazen-1.png +0 -0
  145. data/share/publisher/i/hobix-emblazen-2.png +0 -0
  146. data/share/publisher/i/hobix-emblazen-3.png +0 -0
  147. data/share/publisher/i/hobix-emblazen-4.png +0 -0
  148. data/share/publisher/i/hobix-emblazen-5.png +0 -0
  149. data/share/publisher/i/hobix-emblazen-6.png +0 -0
  150. data/share/publisher/i/hobix-emblazen-7.png +0 -0
  151. data/share/publisher/index.erb +66 -0
  152. data/share/publisher/js/controls.js +261 -0
  153. data/share/publisher/js/dragdrop.js +476 -0
  154. data/share/publisher/js/effects.js +570 -0
  155. data/share/publisher/js/prototype.js +1011 -0
  156. 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