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
@@ -0,0 +1,350 @@
1
+ #encoding: sjis
2
+ # Copyright (C) 2003-2006 Kouichirou Eto, All rights reserved.
3
+ # This is free software with ABSOLUTELY NO WARRANTY.
4
+ # You can redistribute it and/or modify it under the terms of the GNU GPL 2.
5
+
6
+ $LOAD_PATH.unshift '..' unless $LOAD_PATH.include? '..'
7
+ require 'qwik/util-string'
8
+ require 'qwik/tokenizer'
9
+ require 'qwik/parser-inline'
10
+ require 'qwik/tokenizer-inline'
11
+ require 'qwik/html-to-wabisabi'
12
+ require 'qwik/wabisabi-validator'
13
+
14
+ module Qwik
15
+ class TextParser
16
+ # Make a tree from tokens.
17
+ def self.make_tree(tokens)
18
+ ar = []
19
+
20
+ tokens.each {|token|
21
+ tag = token.first
22
+ case tag
23
+
24
+ when :h2, :h3, :h4, :h5, :h6
25
+ ar << [tag, *inline(token[1])]
26
+
27
+ when :ul, :ol
28
+ lu = ar
29
+ token[1].times {
30
+ if lu.last && lu.last.is_a?(Array) && lu.last.first == tag
31
+ lu = lu.last
32
+ else
33
+ a = [tag]
34
+ lu << a
35
+ lu = a
36
+ end
37
+ }
38
+ lu << [:li, *inline(token[2])]
39
+
40
+ when :pre, :blockquote
41
+ if ar.last && ar.last.first == tag
42
+ ar.last[1] << "\n"+token[1]
43
+ else
44
+ ar << [tag, token[1]]
45
+ end
46
+
47
+ when :dl
48
+ a = []
49
+ a << [:dt, *inline(token[1])] if token[1]
50
+ a << [:dd, *inline(token[2])] if token[2]
51
+ if ar.last && ar.last.first == tag
52
+ ar.last << a[0]
53
+ ar.last << a[1] if a[1]
54
+ else
55
+ ar << [tag, *a]
56
+ end
57
+
58
+ when :table
59
+ token.shift
60
+ table_ar = token.map {|td|
61
+ inline_ar = inline(td)
62
+ inline_ar << '' if inline_ar.empty?
63
+ [:td] + inline_ar
64
+ }
65
+ tr = [:tr] + table_ar
66
+ if ar.last && ar.last.first == tag
67
+ ar.last << tr
68
+ else
69
+ ar << [tag, tr]
70
+ end
71
+
72
+ when :text
73
+ line_ar = inline(token[1])
74
+ if ar.last && ar.last.is_a?(Array) && ar.last.first == :p
75
+ ar[-1] << "\n" if ar.last.last != [:br]
76
+ ar[-1] += line_ar
77
+ else
78
+ ar << [:p, *line_ar]
79
+ end
80
+
81
+ when :empty
82
+ ar << ["\n"]
83
+
84
+ when :plugin
85
+ ar << parse_plugin(token)
86
+
87
+ when :html
88
+ ar << parse_html(token)
89
+
90
+ else
91
+ ar << token
92
+ end
93
+ }
94
+
95
+ nar = []
96
+ ar.each {|block|
97
+ tag = block.first
98
+ case tag
99
+ when :blockquote
100
+ str = block[1]
101
+
102
+ tokens = TextTokenizer.tokenize(str)
103
+ tree = make_tree(tokens) # Recursive.
104
+ nar << [tag, *tree]
105
+
106
+ when :p
107
+ while block[1] == [:br]
108
+ block.delete_at(1)
109
+ end
110
+ while block.last == [:br]
111
+ block.pop
112
+ end
113
+ nar << block
114
+ else
115
+ nar << block
116
+ end
117
+ }
118
+
119
+ return nar
120
+ end
121
+
122
+ def self.inline(str)
123
+ return str if str.is_a? Array
124
+
125
+ tokens = InlineTokenizer.tokenize(str)
126
+ tree = InlineParser.make_tree(tokens)
127
+ return tree
128
+ end
129
+
130
+ def self.parse_plugin(token)
131
+ method = token[1].to_s
132
+ param = token[2].to_s
133
+ plugin = [:plugin, {:method=>method, :param=>param}]
134
+ plugin << token[3].to_s if token[3]
135
+ return plugin
136
+ end
137
+
138
+ def self.parse_html(token)
139
+ str = token[1]
140
+ wabisabi = HtmlToWabisabi.parse(str)
141
+
142
+ v = WabisabiValidator.valid?(wabisabi)
143
+ if v == true
144
+ return [:html, *wabisabi]
145
+ else
146
+ return [:div, {:class=>'error'}, "can not use [#{v}]"]
147
+ end
148
+ end
149
+
150
+ end
151
+ end
152
+
153
+ if $0 == __FILE__
154
+ if ARGV[0] == '-b'
155
+ $bench = true
156
+ else
157
+ require 'qwik/testunit'
158
+ $test = true
159
+ end
160
+ end
161
+
162
+ if defined?($test) && $test
163
+ class TestParser < Test::Unit::TestCase
164
+ def ok(e, str)
165
+ tokens = Qwik::TextTokenizer.tokenize(str)
166
+ ok_eq(e, Qwik::TextParser.make_tree(tokens))
167
+ end
168
+
169
+ def test_all
170
+ # test none
171
+ ok([], '')
172
+ ok([["\n"]], "#t")
173
+
174
+ # test p
175
+ ok([[:p, 't']], 't')
176
+ ok([[:p, 's', "\n", 't']], "s\nt")
177
+ ok([[:p, 's'], ["\n"], [:p, 't']], "s\n\nt")
178
+ ok([[:p, 's', [:br], 't']], "s~\nt~")
179
+
180
+ ok([[:dl, [:dt, 'dt1'], [:dd, 'dd1']], [:p, 'p1'],
181
+ [:dl, [:dd, 'dd2']]], ":dt1:dd1\np1\n::dd2")
182
+
183
+ # test header
184
+ ok([[:h2, 't']], '*t')
185
+ ok([[:h2, 't'], [:p, 't']], "*t\nt")
186
+ ok([[:h3, 't']], '**t')
187
+ ok([[:h4, 't']], '***t')
188
+ ok([[:h5, 't']], '****t')
189
+ ok([[:h6, 't']], '*****t')
190
+ ok([[:h6, '*t']], '******t')
191
+ ok([[:h6, '**t']], '*******t')
192
+
193
+ # test_ignore_space
194
+ ok([[:h2, 't']], '* t')
195
+ ok([[:h2, 't']], '*t ')
196
+ ok([[:h2, 't']], '* t ')
197
+ ok([[:h3, 't']], '** t')
198
+ ok([[:h3, 't']], '**t ')
199
+ ok([[:h3, 't']], '** t ')
200
+
201
+ # test listing
202
+ ok([[:ul, [:li, 't']]], '-t')
203
+ ok([[:ul, [:ul, [:li, 't']]]], '--t')
204
+ ok([[:ul, [:ul, [:ul, [:li, 't']]]]], '---t')
205
+ ok([[:ul, [:li, 't']], [:p, 't']], "-t\nt")
206
+ ok([[:ul, [:li, 't'], [:li, 't']]], "-t\n-t")
207
+ ok([[:ul, [:li, 't'], [:ul, [:li, 't']]]], "-t\n--t")
208
+ ok([[:ul, [:ul, [:li, 't']], [:li, 't']]], "--t\n-t")
209
+ ok([[:ul, [:ul, [:li, 't']], [:li, 't'], [:ul, [:li, 't']]]],
210
+ "--t\n-t\n--t")
211
+ ok([[:ol, [:li, 't']]], "+t")
212
+ ok([[:ul, [:li, 't']], [:ol, [:li, 't']]], "-t\n+t")
213
+ ok([[:ul, [:li, 't1']], ["\n"], [:ul, [:li, 't2']]], "-t1\n\n-t2")
214
+ ok([["\n"], [:ul, [:li, 't1'], [:li, 't2']]], "\n-t1\n-t2")
215
+
216
+ # test blockquote
217
+ ok([[:blockquote, [:p, 't']]], ">t")
218
+ ok([[:blockquote, [:p, 's', "\n", 't']]], ">s\n>t")
219
+ ok([[:blockquote, [:ul, [:li, 's'], [:li, 't']]]], ">-s\n>-t")
220
+
221
+ # test dl
222
+ ok([[:dl, [:dt, 'dt'],[:dd, 'dd']]], ':dt:dd')
223
+ ok([[:dl, [:dt, 'dt']]], ':dt')
224
+ ok([[:dl]], ':')
225
+ ok([[:dl]], '::')
226
+ ok([[:dl, [:dd, 'dd']]], '::dd')
227
+ ok([[:dl, [:dt, 'dt'], [:dd, 'dd'], [:dt, 'dt2'], [:dd, 'dd2']]],
228
+ ":dt:dd\n:dt2:dd2")
229
+ ok([[:dl, [:dt, 'dt'], [:dd, 'dd'], [:dd, 'dd2']]], ":dt:dd\n::dd2")
230
+
231
+ # test pre
232
+ ok([[:pre, 't']], ' t')
233
+ ok([[:pre, "s\nt"]], " s\n t")
234
+
235
+ ok([[:pre, "s\n"]], "{{{\ns\n}}}")
236
+ ok([[:pre, "s\nt\n"]], "{{{\ns\nt\n}}}")
237
+ ok([[:pre, "#s\n"]], "{{{\n#s\n}}}")
238
+
239
+ ok([[:pre, 't1'], ["\n"], [:pre, 't2']], " t1\n\n t2")
240
+
241
+ # test_table
242
+ ok([[:table, [:tr, [:td, 't']]]], ',t')
243
+ ok([[:table, [:tr, [:td, 't1'], [:td, 't2']]]], ',t1,t2')
244
+ ok([[:table, [:tr, [:td, ''], [:td, 't2']]]], ',,t2')
245
+ ok([[:table, [:tr, [:td, 's']], [:tr, [:td, 't']]]], ",s\n,t")
246
+ ok([[:table, [:tr, [:td, 's1'], [:td, 's2']],
247
+ [:tr, [:td, 't1'], [:td, 't2']]]], ",s1,s2\n,t1,t2")
248
+
249
+ # test plugin
250
+ ok([[:plugin, {:method=>'t', :param=>''}]], "{{t}}")
251
+ ok([[:plugin, {:method=>'t', :param=>'a'}]], "{{t(a)}}")
252
+ ok([[:plugin, {:method=>'t', :param=>""}, "s\n"]], "{{t\ns\n}}")
253
+ ok([[:plugin, {:method=>'t', :param=>""}, "s1\ns2\n"]],
254
+ "{{t\ns1\ns2\n}}")
255
+
256
+ # test_multiline
257
+ ok([[:p, 's', "\n", 't']], "s\nt")
258
+ ok([[:p, 's', [:br], 't']], "s~\nt~")
259
+ ok([[:p, 's'], ["\n"], [:p, 't']], "s\n\nt")
260
+ ok([[:p, 's', [:br], [:br], 't']], "s~\n~\nt~")
261
+
262
+ str = <<'EOT'
263
+ p1~
264
+ ~
265
+ > b1~
266
+ > b2~
267
+ > ~
268
+ > > bb1~
269
+ > > bb2~
270
+ > ~
271
+ > b3~
272
+ > b4~
273
+ ~
274
+ p2~
275
+ EOT
276
+ ok([[:p, 'p1'],
277
+ [:blockquote, [:p, 'b1', [:br], 'b2'],
278
+ [:blockquote, [:p, 'bb1', [:br], 'bb2']],
279
+ [:p, 'b3', [:br], 'b4']],
280
+ [:p, 'p2']],
281
+ str)
282
+
283
+ # test_html
284
+ ok([[:html, "t\n"]], "<html>\nt\n</html>")
285
+ ok([[:div, {:class=>'error'}, "can not use [script]"]],
286
+ "<html>\n<script>t</script>\n</html>")
287
+
288
+ # test_ref
289
+ ok([[:ul, [:li, [:a, {:href=>'http://e.com/'}, 't']]]],
290
+ "- [http://e.com/ t]")
291
+
292
+ # test_hr
293
+ ok([[:hr]], "====")
294
+
295
+ # test_bug
296
+ ok_eq("\226]", '�]')
297
+ ok([[:p, [:a, {:href=>"\226].html"}, "\226]"]]], '[[�]]]')
298
+ end
299
+
300
+ def test_from_resolve
301
+ # test_lines
302
+ ok([[:ul, [:li, 't1'], [:li, 't2']]], "- t1\n- t2")
303
+ ok([[:p, 't1'], [:ul, [:li, 't2']]], "t1\n- t2")
304
+
305
+ # test_qwik_text
306
+ ok([[:ul, [:li, 't']]], '- t')
307
+ ok([[:ul, [:li, 's'], [:ul, [:li, 't']]]], "- s\n-- t")
308
+ ok([[:ol, [:li, 't']]], "+ t")
309
+
310
+ # test_ul
311
+ ok([[:ul, [:li, 't1']], ["\n"], [:ul, [:li, 't2']]], "- t1\n\n- t2")
312
+ end
313
+
314
+ def test_format
315
+ # test_inline
316
+ ok([[:p, [:em, 't']]], "''t''")
317
+ ok([[:p, [:a, {:href=>'t.html'}, 't']]], "[[t]]")
318
+ ok([[:p, [:a, {:href=>'1.html'}, '1']]], "[[1]]")
319
+ ok([[:p, [:plugin, {:method=>'interwiki', :param=>'Test:t'}, 'Test:t']]],
320
+ "[[Test:t]]")
321
+ ok([[:plugin, {:method=>'t', :param=>''}]], "{{t}}")
322
+ ok([[:p, 'a', [:plugin, {:method=>'t', :param=>''}, ''], 'b']], "a{{t}}b")
323
+ ok([[:p, [:a, {:href=>'http://e.com/'}, 'http://e.com/']]],
324
+ 'http://e.com/')
325
+ ok([[:p, 'a ', [:a, {:href=>'http://e.com/'}, 'http://e.com/'], ' b']],
326
+ 'a http://e.com/ b')
327
+
328
+ # test_escape
329
+ ok([[:h2, "'"]], "*'")
330
+ ok([[:h2, "<"]], "*<")
331
+
332
+ # test_sjis
333
+ ok([[:h2, "\202\240"]], "* ��")
334
+ ok([[:h3, "\202\240"]], "** ��")
335
+ ok([[:h3, "\212\277\216\232"]], "** ����")
336
+ ok([[:h3, "\221\322"]], "** ��")
337
+
338
+ # test ?
339
+ ok([[:h2, [:a, {:href=>'t.html'}, 't']]], "*[[t]]")
340
+ ok([[:h2, [:a, {:href=>'t.html'}, 't']]], "* [[t]]")
341
+ ok([[:h2, [:a, {:href=>'t.html'}, 't']]], "* [[t]] ")
342
+ ok([[:h2, [:a, {:href=>'t.html'}, 't'], ' a']], "* [[t]] a")
343
+ ok([[:h2, [:a, {:href=>'t.html'}, 't'], ' a']], "* [[t]] a")
344
+
345
+ # test_format
346
+ ok([[:h2, "<"]], "*<")
347
+ ok([[:p, [:strong, '']]], "''''''")
348
+ end
349
+ end
350
+ end
@@ -0,0 +1,183 @@
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/util-pathname'
7
+ require 'qwik/util-string'
8
+ require 'qwik/server-memory'
9
+
10
+ module Qwik
11
+ class ServerMemory
12
+ # password
13
+ def passgen
14
+ @passgen = PasswordGenerator.new(@config) unless defined? @passgen
15
+ return @passgen
16
+ end
17
+ end
18
+
19
+ class PasswordGenerator
20
+ DEFAULT_SITE_PASSWORD = ''
21
+ PASSWORD_FILE = 'password.txt'
22
+ GENERATION_FILE = 'generation.txt'
23
+
24
+ def initialize(config)
25
+ etc_path = config.etc_dir.path
26
+ @site_password_file = etc_path + PASSWORD_FILE
27
+ @site_password = DEFAULT_SITE_PASSWORD
28
+ if @site_password_file.exist?
29
+ @site_password = @site_password_file.read.to_s.chomp
30
+ end
31
+ @generation_file = etc_path + GENERATION_FILE
32
+ @generation = PasswordGenerator.generation_get(@generation_file)
33
+ end
34
+
35
+ def generate(user)
36
+ generation = 0
37
+ generation = @generation[user] if @generation[user]
38
+ return PasswordGenerator.generate_md5hex(@site_password,
39
+ user, generation).hex.to_s[-8, 8]
40
+ end
41
+
42
+ def generate_hex(user)
43
+ generation = 0
44
+ generation = @generation[user] if @generation[user]
45
+ return PasswordGenerator.generate_md5hex(@site_password,
46
+ user, generation).upcase[0, 8]
47
+ end
48
+
49
+ def match?(user, pass)
50
+ return false if user.nil? || user.empty?
51
+ return false if pass.nil? || pass.empty?
52
+
53
+ pa = generate(user)
54
+ return true if pa == pass
55
+ pa = generate_hex(user)
56
+ return true if pa == pass
57
+ return true if pa == pass.upcase
58
+ return false
59
+ end
60
+
61
+ def generation_inc(user)
62
+ generation = PasswordGenerator.generation_get(@generation_file)
63
+ gen = 0
64
+ gen = generation[user] if generation[user]
65
+ gen += 1 # Increment the generation of the user.
66
+ PasswordGenerator.generation_add(@generation_file, user, gen)
67
+ @generation = PasswordGenerator.generation_get(@generation_file)
68
+ return gen
69
+ end
70
+
71
+ def generation_store
72
+ PasswordGenerator.generation_store(@generation_file, @generation)
73
+ return nil
74
+ end
75
+
76
+ private
77
+
78
+ def self.generation_get(file)
79
+ file.write('') if ! file.exist?
80
+ str = file.read
81
+ generation = {}
82
+ str.each {|line|
83
+ next unless line[0] == ?,
84
+ dummy, user, gen = line.chomp.split(',')
85
+ generation[user] = gen.to_i
86
+ }
87
+ return generation
88
+ end
89
+
90
+ def self.generate_md5hex(site_password, user, generation=0)
91
+ return "#{user}:#{site_password}:#{generation}".md5hex
92
+ end
93
+
94
+ def self.generation_add(file, user, gen)
95
+ file.add(",#{user},#{gen}\n")
96
+ end
97
+
98
+ def self.generation_store(file, generation)
99
+ str = generation.map {|user, gen|
100
+ [user, gen]
101
+ }.sort.map {|user, gen|
102
+ ",#{user},#{gen}\n"
103
+ }.join
104
+ file.write(str)
105
+ end
106
+ end
107
+ end
108
+
109
+ if $0 == __FILE__
110
+ require 'qwik/testunit'
111
+ require 'qwik/config'
112
+ $test = true
113
+ end
114
+
115
+ if defined?($test) && $test
116
+ class TestPasswordGenerator < Test::Unit::TestCase
117
+ def test_all
118
+ config = Qwik::Config.new
119
+ config.update Qwik::Config::DebugConfig
120
+ config.update Qwik::Config::TestConfig
121
+ generation_file = config.etc_dir.path +
122
+ Qwik::PasswordGenerator::GENERATION_FILE
123
+ generation_file.write('')
124
+
125
+ gen = Qwik::PasswordGenerator.new(config)
126
+
127
+ # test_generate
128
+ assert_equal '95988593', gen.generate('user@e.com')
129
+
130
+ # test_generate_hex
131
+ assert_equal '68246775', gen.generate_hex('user@e.com')
132
+
133
+ # test_match?
134
+ assert_equal true, gen.match?('user@e.com', '95988593')
135
+ # generation 0
136
+ assert_equal false, gen.match?('user@e.com', '64006086')
137
+ assert_equal true, gen.match?('user@e.com', '68246775')
138
+
139
+ # test_generation_inc
140
+ gen.generation_inc('user@e.com')
141
+ assert_equal ",user@e.com,1\n", generation_file.read
142
+ assert_equal false, gen.match?('user@e.com', '95988593') # Changed.
143
+ assert_equal '85127862', gen.generate('user@e.com') # generation 1
144
+ assert_equal true, gen.match?('user@e.com', '85127862')
145
+
146
+ # test_generation_inc, again
147
+ gen.generation_inc('user@e.com')
148
+ assert_equal ",user@e.com,1\n,user@e.com,2\n", generation_file.read
149
+ assert_equal '78735937', gen.generate('user@e.com')
150
+
151
+ # test_store
152
+ gen.generation_store
153
+ assert_equal ",user@e.com,2\n", generation_file.read
154
+
155
+ # test_another_user
156
+ gen.generation_inc('another@e.com')
157
+ assert_equal ",user@e.com,2\n,another@e.com,1\n", generation_file.read
158
+ gen.generation_store
159
+ assert_equal ",another@e.com,1\n,user@e.com,2\n", generation_file.read
160
+
161
+ # teardown
162
+ generation_file.unlink
163
+ end
164
+
165
+ def test_password_file
166
+ config = Qwik::Config.new
167
+ config.update Qwik::Config::DebugConfig
168
+ config.update Qwik::Config::TestConfig
169
+ password_file = config.etc_dir.path+Qwik::PasswordGenerator::PASSWORD_FILE
170
+ password_file.write('')
171
+
172
+ gen = Qwik::PasswordGenerator.new(config)
173
+ assert_equal '95988593', gen.generate('user@e.com')
174
+
175
+ password_file.write('t')
176
+ gen = Qwik::PasswordGenerator.new(config)
177
+ assert_equal '57318391', gen.generate('user@e.com')
178
+
179
+ # teardown
180
+ password_file.unlink
181
+ end
182
+ end
183
+ end