qwikdoc 0.0.1

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 (335) hide show
  1. data/.gitignore +5 -0
  2. data/.rspec +2 -0
  3. data/CHANGES +3 -0
  4. data/COPYING +340 -0
  5. data/Gemfile +3 -0
  6. data/README.md +10 -0
  7. data/Rakefile +10 -0
  8. data/TextFormattingRules +137 -0
  9. data/TextFormattingRules.ja +143 -0
  10. data/bin/qwikdoc +34 -0
  11. data/lib/qwik_doc.rb +15 -0
  12. data/lib/qwik_doc/hack.rb +184 -0
  13. data/qwikdoc.gemspec +26 -0
  14. data/spec/qwik_doc_spec.rb +305 -0
  15. data/spec/spec_helper.rb +12 -0
  16. data/vendor/qwik/Makefile +63 -0
  17. data/vendor/qwik/Rakefile +17 -0
  18. data/vendor/qwik/act-aa.rb +83 -0
  19. data/vendor/qwik/act-archive.rb +386 -0
  20. data/vendor/qwik/act-attach.rb +304 -0
  21. data/vendor/qwik/act-backup.rb +236 -0
  22. data/vendor/qwik/act-basic.rb +325 -0
  23. data/vendor/qwik/act-book.rb +161 -0
  24. data/vendor/qwik/act-calc.rb +371 -0
  25. data/vendor/qwik/act-charset.rb +251 -0
  26. data/vendor/qwik/act-christel.rb +112 -0
  27. data/vendor/qwik/act-chronology.rb +149 -0
  28. data/vendor/qwik/act-code.rb +155 -0
  29. data/vendor/qwik/act-comment.rb +554 -0
  30. data/vendor/qwik/act-config.rb +49 -0
  31. data/vendor/qwik/act-counter.rb +125 -0
  32. data/vendor/qwik/act-day.rb +96 -0
  33. data/vendor/qwik/act-describe.rb +135 -0
  34. data/vendor/qwik/act-diary.rb +109 -0
  35. data/vendor/qwik/act-edit.rb +317 -0
  36. data/vendor/qwik/act-embed-html.rb +296 -0
  37. data/vendor/qwik/act-emode.rb +150 -0
  38. data/vendor/qwik/act-event.rb +187 -0
  39. data/vendor/qwik/act-file.rb +303 -0
  40. data/vendor/qwik/act-files.rb +771 -0
  41. data/vendor/qwik/act-getpass.rb +295 -0
  42. data/vendor/qwik/act-history.rb +136 -0
  43. data/vendor/qwik/act-html.rb +204 -0
  44. data/vendor/qwik/act-httpauth.rb +147 -0
  45. data/vendor/qwik/act-include.rb +142 -0
  46. data/vendor/qwik/act-interwiki.rb +189 -0
  47. data/vendor/qwik/act-isearch.rb +109 -0
  48. data/vendor/qwik/act-keywords.rb +137 -0
  49. data/vendor/qwik/act-lang.rb +81 -0
  50. data/vendor/qwik/act-license.rb +63 -0
  51. data/vendor/qwik/act-list.rb +287 -0
  52. data/vendor/qwik/act-login.rb +410 -0
  53. data/vendor/qwik/act-logout.rb +60 -0
  54. data/vendor/qwik/act-mail.rb +159 -0
  55. data/vendor/qwik/act-map.rb +292 -0
  56. data/vendor/qwik/act-md5.rb +42 -0
  57. data/vendor/qwik/act-mdlb.rb +741 -0
  58. data/vendor/qwik/act-media.rb +416 -0
  59. data/vendor/qwik/act-member.rb +157 -0
  60. data/vendor/qwik/act-menu.rb +142 -0
  61. data/vendor/qwik/act-metadata.rb +323 -0
  62. data/vendor/qwik/act-mlsubmitform.rb +49 -0
  63. data/vendor/qwik/act-monitor.rb +167 -0
  64. data/vendor/qwik/act-new.rb +418 -0
  65. data/vendor/qwik/act-pagelist.rb +248 -0
  66. data/vendor/qwik/act-password.rb +145 -0
  67. data/vendor/qwik/act-plan.rb +210 -0
  68. data/vendor/qwik/act-povray.rb +230 -0
  69. data/vendor/qwik/act-presen.rb +380 -0
  70. data/vendor/qwik/act-redirect.rb +133 -0
  71. data/vendor/qwik/act-ring.rb +1071 -0
  72. data/vendor/qwik/act-rrefs.rb +255 -0
  73. data/vendor/qwik/act-ruby.rb +116 -0
  74. data/vendor/qwik/act-sample.rb +170 -0
  75. data/vendor/qwik/act-save.rb +295 -0
  76. data/vendor/qwik/act-schedule.rb +374 -0
  77. data/vendor/qwik/act-search.rb +180 -0
  78. data/vendor/qwik/act-searchwords.rb +51 -0
  79. data/vendor/qwik/act-sendpass.rb +83 -0
  80. data/vendor/qwik/act-site.rb +89 -0
  81. data/vendor/qwik/act-sitebackup.rb +419 -0
  82. data/vendor/qwik/act-sitelog.rb +118 -0
  83. data/vendor/qwik/act-smil.rb +299 -0
  84. data/vendor/qwik/act-status.rb +220 -0
  85. data/vendor/qwik/act-style.rb +608 -0
  86. data/vendor/qwik/act-table.rb +263 -0
  87. data/vendor/qwik/act-tableform.rb +241 -0
  88. data/vendor/qwik/act-tag.rb +103 -0
  89. data/vendor/qwik/act-text.rb +70 -0
  90. data/vendor/qwik/act-textarea.rb +164 -0
  91. data/vendor/qwik/act-theme.rb +346 -0
  92. data/vendor/qwik/act-toc.rb +112 -0
  93. data/vendor/qwik/act-typekey.rb +198 -0
  94. data/vendor/qwik/act-under-const.rb +94 -0
  95. data/vendor/qwik/act-webservice.rb +321 -0
  96. data/vendor/qwik/act-wema.rb +558 -0
  97. data/vendor/qwik/act-wysiwyg.rb +238 -0
  98. data/vendor/qwik/action.rb +325 -0
  99. data/vendor/qwik/autoreload.rb +98 -0
  100. data/vendor/qwik/bench-bench.rb +28 -0
  101. data/vendor/qwik/bench-emode.rb +47 -0
  102. data/vendor/qwik/bench-format-xml.rb +70 -0
  103. data/vendor/qwik/bench-large-table.rb +62 -0
  104. data/vendor/qwik/bench-md5.rb +14 -0
  105. data/vendor/qwik/bench-module-session.rb +19 -0
  106. data/vendor/qwik/bench-page.rb +50 -0
  107. data/vendor/qwik/bench-s-md5.rb +28 -0
  108. data/vendor/qwik/bench-session.rb +25 -0
  109. data/vendor/qwik/bench-textformat.rb +31 -0
  110. data/vendor/qwik/catalog-factory.rb +91 -0
  111. data/vendor/qwik/catalog-ja.rb +479 -0
  112. data/vendor/qwik/catalog-ml-ja.rb +145 -0
  113. data/vendor/qwik/check-act-monitor.rb +112 -0
  114. data/vendor/qwik/check-act-monitor2.rb +46 -0
  115. data/vendor/qwik/check-act-theme.rb +27 -0
  116. data/vendor/qwik/check-event.rb +112 -0
  117. data/vendor/qwik/check-event2.rb +55 -0
  118. data/vendor/qwik/check-htree-rexml.rb +77 -0
  119. data/vendor/qwik/check-htree.rb +51 -0
  120. data/vendor/qwik/check-libxml.rb +135 -0
  121. data/vendor/qwik/check-many-pages.rb +47 -0
  122. data/vendor/qwik/check-monitor.rb +33 -0
  123. data/vendor/qwik/check-observer.rb +67 -0
  124. data/vendor/qwik/check-server.rb +61 -0
  125. data/vendor/qwik/check-uuencode.rb +33 -0
  126. data/vendor/qwik/check-webdav.rb +65 -0
  127. data/vendor/qwik/check-xml-xpath.rb +27 -0
  128. data/vendor/qwik/common-backtrace.rb +94 -0
  129. data/vendor/qwik/common-basic.rb +111 -0
  130. data/vendor/qwik/common-condition.rb +142 -0
  131. data/vendor/qwik/common-error.rb +48 -0
  132. data/vendor/qwik/common-gettext.rb +50 -0
  133. data/vendor/qwik/common-javascript.rb +45 -0
  134. data/vendor/qwik/common-notice.rb +132 -0
  135. data/vendor/qwik/common-plain.rb +105 -0
  136. data/vendor/qwik/common-plugin.rb +111 -0
  137. data/vendor/qwik/common-res.rb +76 -0
  138. data/vendor/qwik/common-resolve.rb +92 -0
  139. data/vendor/qwik/common-send.rb +171 -0
  140. data/vendor/qwik/common-session.rb +139 -0
  141. data/vendor/qwik/common-surface.rb +261 -0
  142. data/vendor/qwik/common-url.rb +90 -0
  143. data/vendor/qwik/compat/Makefile +12 -0
  144. data/vendor/qwik/compat/add_load_path.rb +1 -0
  145. data/vendor/qwik/config.rb +299 -0
  146. data/vendor/qwik/db-b-backup.rb +142 -0
  147. data/vendor/qwik/db-backup.rb +184 -0
  148. data/vendor/qwik/db-berkeley.rb +306 -0
  149. data/vendor/qwik/db-filesystem.rb +305 -0
  150. data/vendor/qwik/db-indexer.rb +154 -0
  151. data/vendor/qwik/db-searchwords.rb +238 -0
  152. data/vendor/qwik/description-ja.rb +267 -0
  153. data/vendor/qwik/description.rb +256 -0
  154. data/vendor/qwik/dev-add-copyright.rb +23 -0
  155. data/vendor/qwik/dev-backup.rb +24 -0
  156. data/vendor/qwik/dev-bench.rb +175 -0
  157. data/vendor/qwik/dev-calctime.rb +52 -0
  158. data/vendor/qwik/dev-css-compressor.rb +60 -0
  159. data/vendor/qwik/dev-extract-catalog.rb +102 -0
  160. data/vendor/qwik/dev-js-compressor.rb +73 -0
  161. data/vendor/qwik/dev-release.rb +235 -0
  162. data/vendor/qwik/dev-replace.rb +353 -0
  163. data/vendor/qwik/dev-sendmail.rb +25 -0
  164. data/vendor/qwik/farm.rb +283 -0
  165. data/vendor/qwik/gettext.rb +56 -0
  166. data/vendor/qwik/group-cond.rb +157 -0
  167. data/vendor/qwik/group-config.rb +247 -0
  168. data/vendor/qwik/group-confirm.rb +147 -0
  169. data/vendor/qwik/group-db.rb +326 -0
  170. data/vendor/qwik/group-mail.rb +195 -0
  171. data/vendor/qwik/group-member.rb +307 -0
  172. data/vendor/qwik/group-sendmail.rb +231 -0
  173. data/vendor/qwik/group-site.rb +374 -0
  174. data/vendor/qwik/group-sweep.rb +63 -0
  175. data/vendor/qwik/group.rb +157 -0
  176. data/vendor/qwik/helper.rb +6 -0
  177. data/vendor/qwik/html-generator.rb +104 -0
  178. data/vendor/qwik/html-to-wabisabi.rb +149 -0
  179. data/vendor/qwik/htree-diff.rb +87 -0
  180. data/vendor/qwik/htree-format-xml.rb +57 -0
  181. data/vendor/qwik/htree-generator.rb +144 -0
  182. data/vendor/qwik/htree-get.rb +251 -0
  183. data/vendor/qwik/htree-html-generator.rb +179 -0
  184. data/vendor/qwik/htree-template.rb +263 -0
  185. data/vendor/qwik/htree-to-wabisabi.rb +171 -0
  186. data/vendor/qwik/loadlib.rb +79 -0
  187. data/vendor/qwik/logger.rb +115 -0
  188. data/vendor/qwik/mail-body.rb +171 -0
  189. data/vendor/qwik/mail-header.rb +474 -0
  190. data/vendor/qwik/mail-multipart.rb +193 -0
  191. data/vendor/qwik/mail-parse.rb +147 -0
  192. data/vendor/qwik/mail.rb +341 -0
  193. data/vendor/qwik/mailaddress.rb +83 -0
  194. data/vendor/qwik/mdlb-model.rb +81 -0
  195. data/vendor/qwik/mdlb-sample.rb +324 -0
  196. data/vendor/qwik/ml-catalog-factory.rb +27 -0
  197. data/vendor/qwik/ml-exception.rb +15 -0
  198. data/vendor/qwik/ml-generator.rb +28 -0
  199. data/vendor/qwik/ml-gettext.rb +137 -0
  200. data/vendor/qwik/ml-logger.rb +82 -0
  201. data/vendor/qwik/ml-memory.rb +65 -0
  202. data/vendor/qwik/ml-msg-validator.rb +86 -0
  203. data/vendor/qwik/ml-processor.rb +609 -0
  204. data/vendor/qwik/ml-quickml-server.rb +122 -0
  205. data/vendor/qwik/ml-sendmail.rb +0 -0
  206. data/vendor/qwik/ml-server.rb +107 -0
  207. data/vendor/qwik/ml-session.rb +348 -0
  208. data/vendor/qwik/ml-sweeper.rb +101 -0
  209. data/vendor/qwik/mock-logger.rb +65 -0
  210. data/vendor/qwik/mock-sendmail.rb +78 -0
  211. data/vendor/qwik/mock-socket.rb +82 -0
  212. data/vendor/qwik/modulobe.rb +406 -0
  213. data/vendor/qwik/mongrel-server.rb +72 -0
  214. data/vendor/qwik/page-files.rb +249 -0
  215. data/vendor/qwik/page-generate.rb +82 -0
  216. data/vendor/qwik/page-get.rb +262 -0
  217. data/vendor/qwik/page-images.rb +168 -0
  218. data/vendor/qwik/page-put.rb +128 -0
  219. data/vendor/qwik/page-rrefs.rb +154 -0
  220. data/vendor/qwik/page-title.rb +0 -0
  221. data/vendor/qwik/page-wikidb.rb +234 -0
  222. data/vendor/qwik/page.rb +67 -0
  223. data/vendor/qwik/pages.rb +444 -0
  224. data/vendor/qwik/parse-plugin.rb +249 -0
  225. data/vendor/qwik/parser-emode.rb +116 -0
  226. data/vendor/qwik/parser-inline.rb +273 -0
  227. data/vendor/qwik/parser.rb +350 -0
  228. data/vendor/qwik/password.rb +183 -0
  229. data/vendor/qwik/periodic.rb +79 -0
  230. data/vendor/qwik/qp.rb +56 -0
  231. data/vendor/qwik/qwik-service.rb +341 -0
  232. data/vendor/qwik/qwik.rb +5 -0
  233. data/vendor/qwik/qwikweb-adduser.rb +34 -0
  234. data/vendor/qwik/qwikweb-catalog-validator.rb +110 -0
  235. data/vendor/qwik/qwikweb-incgen.rb +28 -0
  236. data/vendor/qwik/qwikweb-makesite.rb +41 -0
  237. data/vendor/qwik/qwikweb-server.rb +44 -0
  238. data/vendor/qwik/qwikweb-showpassword.rb +26 -0
  239. data/vendor/qwik/qwikweb-watchlog.rb +67 -0
  240. data/vendor/qwik/request-path.rb +304 -0
  241. data/vendor/qwik/request-ua.rb +76 -0
  242. data/vendor/qwik/request-webrick.rb +81 -0
  243. data/vendor/qwik/request.rb +91 -0
  244. data/vendor/qwik/resolve-tdiary.rb +292 -0
  245. data/vendor/qwik/resolve.rb +121 -0
  246. data/vendor/qwik/response.rb +228 -0
  247. data/vendor/qwik/server-memory.rb +57 -0
  248. data/vendor/qwik/server-webrick.rb +102 -0
  249. data/vendor/qwik/server.rb +252 -0
  250. data/vendor/qwik/site-config.rb +149 -0
  251. data/vendor/qwik/site-db.rb +136 -0
  252. data/vendor/qwik/site-event.rb +162 -0
  253. data/vendor/qwik/site-files.rb +86 -0
  254. data/vendor/qwik/site-group.rb +103 -0
  255. data/vendor/qwik/site-index.rb +47 -0
  256. data/vendor/qwik/site-log.rb +64 -0
  257. data/vendor/qwik/site-member.rb +230 -0
  258. data/vendor/qwik/site-monitor.rb +97 -0
  259. data/vendor/qwik/site-pages.rb +62 -0
  260. data/vendor/qwik/site-plan.rb +139 -0
  261. data/vendor/qwik/site-report.rb +282 -0
  262. data/vendor/qwik/site-resolve.rb +230 -0
  263. data/vendor/qwik/site-rrefs.rb +18 -0
  264. data/vendor/qwik/site-search.rb +180 -0
  265. data/vendor/qwik/site-timeline.rb +153 -0
  266. data/vendor/qwik/site-url.rb +189 -0
  267. data/vendor/qwik/site.rb +76 -0
  268. data/vendor/qwik/smil-time.rb +105 -0
  269. data/vendor/qwik/smtp-session.rb +331 -0
  270. data/vendor/qwik/template-generator.rb +149 -0
  271. data/vendor/qwik/template.rb +85 -0
  272. data/vendor/qwik/test-common.rb +10 -0
  273. data/vendor/qwik/test-ml-info.rb +225 -0
  274. data/vendor/qwik/test-module-ml.rb +142 -0
  275. data/vendor/qwik/test-module-path.rb +110 -0
  276. data/vendor/qwik/test-module-public.rb +70 -0
  277. data/vendor/qwik/test-module-server.rb +98 -0
  278. data/vendor/qwik/test-module-session.rb +264 -0
  279. data/vendor/qwik/test-module-suite.rb +91 -0
  280. data/vendor/qwik/test-ms-applemail.rb +59 -0
  281. data/vendor/qwik/test-ms-attach.rb +174 -0
  282. data/vendor/qwik/test-ms-basic.rb +40 -0
  283. data/vendor/qwik/test-ms-close.rb +35 -0
  284. data/vendor/qwik/test-ms-confirm.rb +75 -0
  285. data/vendor/qwik/test-ms-ignore-spam.rb +57 -0
  286. data/vendor/qwik/test-ms-japanese.rb +97 -0
  287. data/vendor/qwik/test-ms-jfilename.rb +82 -0
  288. data/vendor/qwik/test-ms-large.rb +58 -0
  289. data/vendor/qwik/test-ms-member.rb +103 -0
  290. data/vendor/qwik/test-ms-multipart.rb +84 -0
  291. data/vendor/qwik/test-ms-org.rb +129 -0
  292. data/vendor/qwik/test-ms-plan.rb +130 -0
  293. data/vendor/qwik/test-ms-post.rb +53 -0
  294. data/vendor/qwik/test-ms-quopri.rb +76 -0
  295. data/vendor/qwik/test-sub-quopri.rb +45 -0
  296. data/vendor/qwik/test-submit-base64.rb +59 -0
  297. data/vendor/qwik/test-submit-forward.rb +61 -0
  298. data/vendor/qwik/test-submit-html-mail.rb +52 -0
  299. data/vendor/qwik/test-submit-japanese.rb +135 -0
  300. data/vendor/qwik/test-submit-jfilename.rb +144 -0
  301. data/vendor/qwik/test-submit-uuencode.rb +71 -0
  302. data/vendor/qwik/test-suite-all.rb +8 -0
  303. data/vendor/qwik/test-suite-basic.rb +9 -0
  304. data/vendor/qwik/test-suite-ml.rb +9 -0
  305. data/vendor/qwik/test-typekey.rb +64 -0
  306. data/vendor/qwik/testunit.rb +45 -0
  307. data/vendor/qwik/tokenizer-inline.rb +294 -0
  308. data/vendor/qwik/tokenizer.rb +332 -0
  309. data/vendor/qwik/typekey.rb +160 -0
  310. data/vendor/qwik/util-basic.rb +135 -0
  311. data/vendor/qwik/util-charset.rb +332 -0
  312. data/vendor/qwik/util-css.rb +56 -0
  313. data/vendor/qwik/util-csv-tokenizer.rb +113 -0
  314. data/vendor/qwik/util-filename.rb +112 -0
  315. data/vendor/qwik/util-pathname.rb +202 -0
  316. data/vendor/qwik/util-pid.rb +58 -0
  317. data/vendor/qwik/util-safe.rb +67 -0
  318. data/vendor/qwik/util-sendmail.rb +273 -0
  319. data/vendor/qwik/util-string.rb +203 -0
  320. data/vendor/qwik/util-time.rb +125 -0
  321. data/vendor/qwik/util-webrick.rb +176 -0
  322. data/vendor/qwik/version.rb +11 -0
  323. data/vendor/qwik/wabisabi-basic.rb +163 -0
  324. data/vendor/qwik/wabisabi-diff.rb +130 -0
  325. data/vendor/qwik/wabisabi-format-xml.rb +310 -0
  326. data/vendor/qwik/wabisabi-generator.rb +262 -0
  327. data/vendor/qwik/wabisabi-index.rb +174 -0
  328. data/vendor/qwik/wabisabi-table.rb +212 -0
  329. data/vendor/qwik/wabisabi-template.rb +295 -0
  330. data/vendor/qwik/wabisabi-to-htree.rb +111 -0
  331. data/vendor/qwik/wabisabi-to-wiki.rb +690 -0
  332. data/vendor/qwik/wabisabi-traverse.rb +207 -0
  333. data/vendor/qwik/wabisabi-validator.rb +116 -0
  334. data/vendor/qwik/wabisabi.rb +5 -0
  335. metadata +416 -0
File without changes
@@ -0,0 +1,234 @@
1
+ # Copyright (C) 2003-2006 Kouichirou Eto, All rights reserved.
2
+ # This is free software with ABSOLUTELY NO WARRANTY.
3
+ # You can redistribute it and/or modify it under the terms of the GNU GPL 2.
4
+
5
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
6
+
7
+ class Array
8
+ def to_hash
9
+ hash = {}
10
+ self.each {|k, v| hash[k] = v }
11
+ return hash
12
+ end
13
+ end
14
+
15
+ module Qwik
16
+ class Page
17
+ def wikidb
18
+ # @wikidb = WikiDB.new(self) unless defined?(@wikidb)
19
+ # return @wikidb
20
+ WikiDB.new(self)
21
+ end
22
+ end
23
+
24
+ class WikiDB
25
+ include Enumerable
26
+
27
+ def initialize(page)
28
+ @page = page
29
+ @str = nil
30
+ check_new
31
+ end
32
+
33
+ def array
34
+ check_new
35
+ return @array.dup # dup prevent from destructive method
36
+ end
37
+
38
+ def hash
39
+ check_new
40
+ return @hash.dup # dup prevent from destructive method
41
+ end
42
+
43
+ def rev_hash
44
+ check_new
45
+ return @rev_hash.dup # dup prevent from destructive method
46
+ end
47
+
48
+ def [](key)
49
+ v = hash[key]
50
+ return nil if v.nil?
51
+ return v.dup # dup prevent from destructive method
52
+ end
53
+
54
+ def exist?(key)
55
+ return self[key]
56
+ end
57
+
58
+ def each
59
+ array.each {|k, v|
60
+ k = k.dup # unfreeze
61
+ v = v.dup # dup prevent from destructive method
62
+ yield(k, v)
63
+ }
64
+ end
65
+
66
+ def add(k, *ar)
67
+ ar = ar.flatten
68
+ @page.add(WikiDB.encode_line(k, ar)+"\n")
69
+ end
70
+
71
+ def remove(key)
72
+ return false unless exist?(key) # Return if the key is not exist.
73
+ str = @page.load
74
+ newstr, status = WikiDB.generate_without(str, key)
75
+ # @page.store(newstr, str.md5hex) # FIXME: Check collision.
76
+ @page.store(newstr) # FIXME: Store should check the collision.
77
+ return status
78
+ end
79
+
80
+ private
81
+
82
+ def check_new
83
+ str = @page.load
84
+ return if str == @str # Do nothing.
85
+ @str = str
86
+
87
+ @array = WikiDB.parse(@str)
88
+ @hash = @array.to_hash
89
+ @rev_hash = @hash.invert
90
+ return nil
91
+ end
92
+
93
+ SIGNATURE = ['|', ',', ':']
94
+
95
+ def self.parse(str)
96
+ array = []
97
+ str.each {|line|
98
+ firstchar = line[0, 1]
99
+ next unless SIGNATURE.include?(firstchar)
100
+ ar = line.chomp.split(firstchar)
101
+ ar.shift # Drop the first column.
102
+ k = ar.shift
103
+ ar = ar.map {|a| a.strip }
104
+ v = (firstchar == ':') ? ar.join(':') : ar
105
+ v.freeze
106
+ array << [k, v]
107
+ }
108
+ return array
109
+ end
110
+
111
+ def self.generate_without(str, key)
112
+ status = false
113
+ newar = []
114
+ str.each {|line|
115
+ firstchar = line[0, 1]
116
+ if SIGNATURE.include?(firstchar)
117
+ ar = line.chomp.split(firstchar)
118
+ ar.shift # Drop the first column.
119
+ k = ar.shift
120
+ if k && k == key # Do not add the line with the key.
121
+ status = true # ok.
122
+ next # Delete the line.
123
+ end
124
+ end
125
+ newar << line
126
+ }
127
+ return newar.join, status
128
+ end
129
+
130
+ def self.encode_line(k, *ar)
131
+ ar = ar.flatten
132
+ nar = []
133
+ nar << '' # Empty entry.
134
+ nar << k # The key.
135
+ nar << ar if ar && ! ar.empty?
136
+ str = nar.flatten.join(',')
137
+ return str
138
+ end
139
+ end
140
+ end
141
+
142
+ if $0 == __FILE__
143
+ require 'qwik/test-common'
144
+ $test = true
145
+ end
146
+
147
+ if defined?($test) && $test
148
+ class TestWikiDB < Test::Unit::TestCase
149
+ include TestSession
150
+
151
+ def test_class_method
152
+ c = Qwik::WikiDB
153
+
154
+ # test_parse
155
+ eq [["k", ["v"]]], c.parse(',k,v')
156
+ eq [["k", ["v"]]], c.parse('|k|v')
157
+ eq [["k", "v"]], c.parse(':k:v')
158
+ eq [["k", "v"]], c.parse(':k: v')
159
+ eq [["k", "v"]], c.parse(':k: v')
160
+
161
+ # test_encode_line
162
+ eq ',k,v', c.encode_line('k', 'v')
163
+ eq ',k,v1,v2', c.encode_line('k', ['v1', 'v2'])
164
+ eq ',k,v1,v2', c.encode_line('k', 'v1', 'v2')
165
+ eq ',k,,v2', c.encode_line('k', nil, 'v2')
166
+ end
167
+
168
+ def test_colon
169
+ page = @site.create_new
170
+ wdb = Qwik::WikiDB.new(page)
171
+ page.store(':k: v')
172
+ eq true, !!wdb.exist?('k')
173
+ eq 'v', wdb['k']
174
+ end
175
+
176
+ def test_all
177
+ page = @site.create_new
178
+ wdb = Qwik::WikiDB.new(page)
179
+
180
+ # test_exist?
181
+ eq false, !!wdb.exist?('k')
182
+ wdb.add('k', 'v')
183
+ eq ",k,v\n", page.load
184
+
185
+ eq true, !!wdb.exist?('k')
186
+ eq ['v'], wdb['k']
187
+ eq 'v', wdb['k'][0]
188
+ eq false, wdb['k'][0].frozen?
189
+
190
+ # test_hash
191
+ eq({'k'=>['v']}, wdb.hash)
192
+ wdb.add('k', 'v2')
193
+ eq ['v2'], wdb['k'] # can get second value
194
+
195
+ # test_remove
196
+ eq true, wdb.remove('k') # remove
197
+ eq false, wdb.remove('k') # fail to remove
198
+
199
+ # test_add
200
+ eq false, !!wdb.exist?('k')
201
+ wdb.add('k', 'v1', 'v2')
202
+ eq true, !!wdb.exist?('k')
203
+ eq ['v1', 'v2'], wdb['k']
204
+ eq({'k'=>['v1', 'v2']}, wdb.hash)
205
+ eq true, wdb.remove('k') # remove
206
+ eq false, wdb.remove('k') # fail to remove
207
+
208
+ wdb.add('a', 'b')
209
+ wdb.add('c', 'd')
210
+ eq({'a'=>['b'], 'c'=>['d']}, wdb.hash)
211
+
212
+ # test_each
213
+ wdb.each {|k, v|
214
+ eq false, k.frozen?
215
+ assert_instance_of(Array, v)
216
+ }
217
+
218
+ eq [['a', ['b']], ['c', ['d']]], wdb.array
219
+ wdb.array.each {|name, args|
220
+ args = args.dup
221
+ t = args.shift
222
+ }
223
+ eq [['a', ['b']], ['c', ['d']]], wdb.array
224
+
225
+ # test_nil
226
+ page = @site.create_new
227
+ wdb = Qwik::WikiDB.new(page)
228
+ eq false, !!wdb.exist?('k')
229
+ wdb.add('k', nil, 'v2')
230
+ eq ",k,,v2\n", page.load
231
+ eq ['', 'v2'], wdb['k']
232
+ end
233
+ end
234
+ end
@@ -0,0 +1,67 @@
1
+ # Copyright (C) 2003-2006 Kouichirou Eto, All rights reserved.
2
+ # This is free software with ABSOLUTELY NO WARRANTY.
3
+ # You can redistribute it and/or modify it under the terms of the GNU GPL 2.
4
+
5
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
6
+ require 'qwik/page-get'
7
+ require 'qwik/page-put'
8
+ require 'qwik/page-wikidb'
9
+
10
+ module Qwik
11
+ class Page
12
+ def initialize(config, pages, key)
13
+ @pages = pages
14
+ @key = key.to_s
15
+ @db = @pages.db
16
+ @db.create(@key)
17
+
18
+ # init_generate
19
+
20
+ # FIXME
21
+ @files = nil
22
+ @rrefs = nil
23
+ @cache = {}
24
+ end
25
+ attr_reader :key
26
+
27
+ attr_accessor :files
28
+ attr_accessor :rrefs
29
+ attr_reader :cache
30
+
31
+ def inspect
32
+ return "#<Page:"+@key+">"
33
+ end
34
+
35
+ def url
36
+ return @key+'.html'
37
+ end
38
+
39
+ def <=>(other)
40
+ return self.key <=> other.key
41
+ end
42
+ end
43
+ end
44
+
45
+ if $0 == __FILE__
46
+ require 'qwik/farm'
47
+ require 'qwik/server-memory'
48
+ require 'qwik/test-module-session'
49
+ $test = true
50
+ end
51
+
52
+ if defined?($test) && $test
53
+ class TestPage < Test::Unit::TestCase
54
+ include TestSession
55
+
56
+ def test_all
57
+ pages = @site.get_pages
58
+ page = pages.create_new
59
+
60
+ # test_url
61
+ ok_eq('1.html', page.url)
62
+
63
+ # test_key
64
+ ok_eq('1', page.key)
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,444 @@
1
+ # Copyright (C) 2003-2006 Kouichirou Eto, All rights reserved.
2
+ # This is free software with ABSOLUTELY NO WARRANTY.
3
+ # You can redistribute it and/or modify it under the terms of the GNU GPL 2.
4
+
5
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
6
+ require 'qwik/db-filesystem'
7
+ require 'qwik/db-backup'
8
+ require 'qwik/db-indexer'
9
+ require 'qwik/page'
10
+
11
+ module Qwik
12
+ class PageExistError < StandardError; end
13
+ class PageCollisionError < StandardError; end
14
+
15
+ class Pages
16
+ FIRST_PAGE_ID = '1'
17
+
18
+ def initialize(config, dir)
19
+ @config = nil # FIXME: This is not used.
20
+
21
+ dir = dir.path
22
+ spath = config.super_dir.path
23
+
24
+ if config.db == 'fsdb'
25
+ @db = FileSystemDB.new(dir, spath)
26
+ elsif config.db == 'bdb' # Notice: This setting is experimental.
27
+ require 'qwik/db-berkeley'
28
+ @db = BerkeleyDB.new(dir, spath)
29
+ else
30
+ raise 'Unknown database type.'
31
+ end
32
+
33
+ @backupdb = BackupDB.new(dir)
34
+ @db.register_observer(@backupdb)
35
+
36
+ # Register Senna indexer # Notice: This setting is experimental.
37
+ if config[:use_senna] == 'true'
38
+ @index = DBIndexer.new(dir)
39
+ @db.register_observer(@index)
40
+ end
41
+ end
42
+ attr_reader :db
43
+ attr_reader :backupdb
44
+ attr_reader :index
45
+
46
+ def close
47
+ @db.close
48
+ end
49
+
50
+ def create(k) # Create a new page.
51
+ raise PageExistError if baseexist?(k)
52
+ page = Page.new(@config, self, k)
53
+ return page
54
+ end
55
+
56
+ def create_new
57
+ return create(get_new_id)
58
+ end
59
+
60
+ def baseexist?(k)
61
+ return @db.baseexist?(k)
62
+ end
63
+
64
+ def exist?(k)
65
+ return @db.exist?(k)
66
+ end
67
+
68
+ def get(k)
69
+ return nil if ! exist?(k)
70
+ page = Page.new(@config, self, k)
71
+ return page
72
+ end
73
+
74
+ def [](k)
75
+ return get(k)
76
+ end
77
+
78
+ def delete(k)
79
+ page = get(k)
80
+ page.delete
81
+ end
82
+
83
+ def to_a(all=nil)
84
+ ar = []
85
+ each(all) {|page|
86
+ ar << page
87
+ }
88
+ return ar
89
+ end
90
+
91
+ def list(all = false, with_super = false)
92
+ ar = []
93
+ @db.list(with_super).each {|key|
94
+ next if ! all && /\A_/ =~ key
95
+ ar << key
96
+ }
97
+ ar
98
+ end
99
+
100
+ def each(all = false, with_super = false)
101
+ list(all, with_super).each {|key|
102
+ page = self[key]
103
+ next if page.nil? # What?
104
+ yield(page)
105
+ }
106
+ end
107
+
108
+ def each_all(&b)
109
+ each(true, &b)
110
+ end
111
+
112
+ def keys
113
+ ks = []
114
+ self.each {|page| ks << page.key }
115
+ return ks
116
+ end
117
+
118
+ def title_list
119
+ return to_a.sort_by {|page|
120
+ page.get_title.downcase
121
+ }
122
+ end
123
+
124
+ def title_list_keys
125
+ ar = []
126
+ list.each {|key|
127
+ page = get(key)
128
+ title = page.get_title.downcase
129
+ ar << [title, key]
130
+ }
131
+ return ar.sort
132
+ end
133
+
134
+ def date_list
135
+ return to_a.sort_by {|page|
136
+ page.mtime
137
+ }
138
+ end
139
+
140
+ def date_list_keys
141
+ ar = []
142
+ list.each {|key|
143
+ page = get(key)
144
+ time = page.mtime.to_i
145
+ ar << [time, key]
146
+ }
147
+ return ar.sort
148
+ end
149
+
150
+ def find_title(title)
151
+ self.each(true, true) {|page|
152
+ if page.get_title == title
153
+ return page
154
+ end
155
+ }
156
+ return nil
157
+ end
158
+
159
+ def get_new_id
160
+ numkeys = keys.map {|k| /\A\d+\z/ =~ k ? k.to_i : 0 }
161
+ return (numkeys.max + 1).to_s if numkeys.max
162
+ return FIRST_PAGE_ID
163
+ end
164
+
165
+ def last_page_time
166
+ return @db.last_page_time
167
+ end
168
+
169
+ # QuickML support
170
+ def last_article_time
171
+ return @db.last_article_time
172
+ end
173
+
174
+ def get_by_title(title)
175
+ page = self[title] rescue nil
176
+ return page if page
177
+
178
+ page = self.find_title(title)
179
+ return page if page
180
+
181
+ return nil
182
+ end
183
+ end
184
+ end
185
+
186
+ if $0 == __FILE__
187
+ require 'qwik/farm'
188
+ require 'qwik/server-memory'
189
+ require 'qwik/test-module-session'
190
+ $test = true
191
+ end
192
+
193
+ if defined?($test) && $test
194
+ module Qwik
195
+ class Site
196
+ # Only for test.
197
+ if ! defined?(get_pages)
198
+ def get_pages
199
+ return @pages
200
+ end
201
+ end
202
+ end
203
+ end
204
+
205
+ class TestPages < Test::Unit::TestCase
206
+ include TestSession
207
+
208
+ def test_pages
209
+ pages = @site.get_pages
210
+
211
+ # test_create
212
+ page = pages.create('1')
213
+
214
+ # test_last_page_time
215
+ page.put_with_time('test1', 0)
216
+ ok_eq(0, pages.last_page_time.to_i)
217
+
218
+ # test_each
219
+ pages.each {|page|
220
+ assert_instance_of(Qwik::Page, page)
221
+ assert_instance_of(String, page.key)
222
+ }
223
+
224
+ # test_get_page
225
+ page = pages['1']
226
+ page.put('test2')
227
+ ok_eq('test2', page.get)
228
+
229
+ # test_page_exist_error
230
+ assert_raises(Qwik::PageExistError) {
231
+ pages.create('1')
232
+ }
233
+
234
+ # test_exist?
235
+ ok_eq(true, pages.exist?('1'))
236
+
237
+ # test_[]
238
+ ok_eq('1', pages['1'].key)
239
+
240
+ # test_delete
241
+ pages.delete('1')
242
+ ok_eq(false, pages.exist?('1'))
243
+ ok_eq(nil, pages['1'])
244
+
245
+ # test_get_new_id
246
+ page = pages.create('0')
247
+ page.store('t')
248
+ ok_eq('1', pages.get_new_id)
249
+
250
+ page = pages.create(pages.get_new_id)
251
+ page.store('t')
252
+ ok_eq(true, pages.exist?('1'))
253
+ ok_eq('2', pages.get_new_id)
254
+
255
+ page = pages.create('t')
256
+ page.store('t')
257
+ ok_eq('2', pages.get_new_id)
258
+ ok_eq('2', pages.get_new_id)
259
+
260
+ page = pages.create('4')
261
+ page.store('t')
262
+ ok_eq('5', pages.get_new_id)
263
+ end
264
+
265
+ def test_compare
266
+ pages = @site.get_pages
267
+ pages.erase_all
268
+ a = pages.create('a')
269
+ b = pages.create('b')
270
+ # pages = pages.sort
271
+ # ok_eq('a', pages[0].get_title)
272
+ # ok_eq('b', pages[1].get_title)
273
+ end
274
+
275
+ def test_list
276
+ pages = @site.get_pages
277
+
278
+ pages.create('t1').store('')
279
+ pages.create('t2').store('')
280
+ pages.create('1').store('t3')
281
+ pages.create('2').store('t4')
282
+
283
+ pages.each {|page|
284
+ assert_instance_of(Qwik::Page, page)
285
+ }
286
+
287
+ tlist = pages.title_list
288
+ ok_eq('1', tlist[0].key)
289
+ ok_eq('2', tlist[1].key)
290
+ ok_eq('t1', tlist[2].key)
291
+ ok_eq('t2', tlist[3].key)
292
+ tlist.each {|page|
293
+ assert_instance_of(String, page.get_title)
294
+ }
295
+
296
+ list = pages.title_list_keys
297
+ is [["1", "1"], ["2", "2"], ["t1", "t1"], ["t2", "t2"]], list
298
+ end
299
+
300
+ def test_last_article_time
301
+ pages = @site.get_pages
302
+ a = pages.last_article_time
303
+ ok_eq(nil, a)
304
+ page = pages.create_new
305
+ a = pages.last_article_time
306
+ assert_instance_of(Time, a)
307
+ end
308
+
309
+ def test_enumerable
310
+ pages = @site.get_pages
311
+
312
+ #test_find_title
313
+ pages.create_new.store("* ��")
314
+ pages.create_new.store("* ��")
315
+ pages.create_new.store("* ��")
316
+
317
+ #page = pages.find_title("��")
318
+ page = pages.get_by_title("��")
319
+ ok_eq('2', page.key)
320
+ ok_eq(['1', '2', '3'], pages.keys)
321
+ end
322
+
323
+ def test_recent_list
324
+ pages = @site.get_pages
325
+
326
+ pages.create('t1').put_with_time('t', Time.at(0))
327
+ pages.create('t2').put_with_time('t', Time.at(1))
328
+ pages.create('1').put_with_time('t3', Time.at(2))
329
+ pages.create('2').put_with_time('t4', Time.at(3))
330
+
331
+ dlist = pages.date_list
332
+ eq ["t1", "t2", "1", "2"], dlist.map {|page| page.key }
333
+ dlist.each {|page|
334
+ assert_instance_of(Time, page.mtime)
335
+ }
336
+
337
+ list = pages.date_list_keys
338
+ is [[0, "t1"], [1, "t2"], [2, "1"], [3, "2"]], list
339
+ end
340
+
341
+ def nutest_cache
342
+ pages = @site
343
+
344
+ # Since this test takes long time, ignore this if under test suite.
345
+ return if $0 != __FILE__ # just only for unit test.
346
+
347
+ length, repeat = 100, 100
348
+
349
+ page = pages.create_new
350
+ page.store('a' * length)
351
+ sleep 1
352
+ repeat.times {
353
+ str = page.load
354
+ }
355
+ end
356
+
357
+ def test_backup
358
+ pages = @site.get_pages
359
+
360
+ page = pages.create('1')
361
+ page.put_with_time('t', Time.at(0))
362
+ ok_eq('t', page.load)
363
+
364
+ bdb = pages.backupdb
365
+ ar = bdb.map {|key, v, time| v }
366
+ # ok_eq('t', ar[0])
367
+ # ok_eq('', ar[1])
368
+
369
+ page.put_with_time('t2', Time.at(1))
370
+
371
+ ar = bdb.map {|key, v, time| v }
372
+ # ok_eq('t', ar[0])
373
+ # ok_eq('t2', ar[1])
374
+ # ok_eq('', ar[2])
375
+ end
376
+
377
+ def test_touch
378
+ pages = @site
379
+
380
+ # touch does not affect the content.
381
+ page = pages['FrontPage']
382
+ org = page.load
383
+ assert_match(/FrontPage/, page.load)
384
+
385
+ page.touch
386
+ assert_match(/FrontPage/, page.load)
387
+ ok_eq(org, page.load)
388
+ end
389
+
390
+ def test_with_underbar
391
+ pages = @site.get_pages
392
+
393
+ page3 = pages.create('_t')
394
+ page3.store('t')
395
+ found = false
396
+ pages.each {|page|
397
+ found = true if page.key[0] == ?_
398
+ }
399
+ ok_eq(false, found)
400
+
401
+ pages.each(true) {|page|
402
+ found = true if page.key[0] == ?_
403
+ }
404
+ ok_eq(true, found)
405
+
406
+ found = false
407
+ pages.each_all {|page|
408
+ found = true if page.key[0] == ?_
409
+ }
410
+ ok_eq(true, found)
411
+ end
412
+
413
+ def test_super_pages
414
+ pages = @site.get_pages
415
+
416
+ # test_super_exist?
417
+ ok_eq(true, pages.exist?('_SideMenu'))
418
+
419
+ # test_baseexist?
420
+ ok_eq(false, pages.baseexist?('_SideMenu'))
421
+
422
+ # test_get_superpage
423
+ page = pages['_SideMenu']
424
+ ok_eq('Menu', page.get_title)
425
+
426
+ # test_super_find_title
427
+ page = pages.find_title('Menu')
428
+ ok_eq('_SideMenu', page.key)
429
+
430
+ # test_override_superpage
431
+ page.store('* New menu')
432
+ ok_eq('New menu', page.get_title)
433
+ ok_eq(true, pages.baseexist?('_SideMenu'))
434
+ page.delete
435
+ ok_eq(false, pages.baseexist?('_SideMenu'))
436
+
437
+ # test_override_create
438
+ page = pages.create('_SideMenu')
439
+ ok_eq(false, pages.baseexist?('_SideMenu')) # not yet
440
+ page.store('t')
441
+ ok_eq(true, pages.baseexist?('_SideMenu')) # become true here
442
+ end
443
+ end
444
+ end