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,49 @@
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
+ module Qwik
8
+ class Action
9
+ def plg_thissitename
10
+ return @site.title
11
+ end
12
+
13
+ def plg_thislist
14
+ return @site.ml_address
15
+ end
16
+
17
+ # Thanks to Mr. Shuhei Yamamoto.
18
+ def plg_ml_submit_form
19
+ href = "/formmail.php?user=#{@req.user}&site=#{@site.sitename}"
20
+ return [:a, {:href=>href, :target=>'_new'}, _('Mlcommit')]
21
+ end
22
+ end
23
+ end
24
+
25
+ if $0 == __FILE__
26
+ require 'qwik/test-common'
27
+ $test = true
28
+ end
29
+
30
+ if defined?($test) && $test
31
+ class TestActMLSubmitForm < Test::Unit::TestCase
32
+ include TestSession
33
+
34
+ def test_all
35
+ res = session
36
+
37
+ # test_plg_thissitename
38
+ eq '', @action.plg_thissitename
39
+
40
+ # test_plg_thislist
41
+ eq 'test@q.example.com', @action.plg_thislist
42
+
43
+ # test_plg_ml_submit_form
44
+ eq [:a, {:href=>"/formmail.php?user=user@e.com&site=test",
45
+ :target=>'_new'}, 'Mlcommit'],
46
+ @action.plg_ml_submit_form
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,167 @@
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/site-monitor'
7
+
8
+ module Qwik
9
+ class Action
10
+ # ============================== shout to monitor
11
+ def c_monitor(cmd)
12
+ ev = {}
13
+ ev[:title] = 'Event occured.'
14
+ ev[:cmd] = cmd.to_s
15
+ ev[:pagename] = @req.base
16
+ @site.sitemonitor.shout(ev)
17
+ end
18
+
19
+ # ============================== monitor plugin
20
+ def plg_monitor(pagename=@req.base)
21
+ return if defined?(@monitor_defined)
22
+ @monitor_defined = true
23
+ script = "
24
+ g_monitor_env.add('#{pagename}');
25
+ g_monitor_env.start();
26
+ "
27
+ div = [:div, {:id=>'monitor'}]
28
+ div << "monitor(#{pagename})" if defined?($test) && $test
29
+ div << [:script, {:type=>'text/javascript',
30
+ :src=>'.theme/js/monitor.js'}, '']
31
+ div << [:script, {:type=>'text/javascript'}, script]
32
+ return div
33
+ end
34
+
35
+ # ============================== monitor connection
36
+ def ext_monitor
37
+ mon = @site.sitemonitor # Connect to site monitor.
38
+ mon.listen(self) {|ev| # Wait for update.
39
+ next if ev[:pagename] != @req.base
40
+ if ev[:cmd] == 'save'
41
+ return monitor_save
42
+ end
43
+ }
44
+ return monitor_disconnect
45
+ end
46
+
47
+ def monitor_save
48
+ c_set_status
49
+ c_set_html
50
+ c_set_no_cache('no-cache', 'no-cache, must-revalidate')
51
+ page = @site[@req.base]
52
+ str = page.get_body
53
+ w = c_res(str)
54
+ w = c_tdiary_resolve(w)
55
+ w = w.format_xml.page_to_xml if ! $test
56
+ c_set_body(w)
57
+ end
58
+
59
+ def monitor_disconnect
60
+ monitor_message('disconnect')
61
+ end
62
+
63
+ def monitor_message(title)
64
+ c_set_status
65
+ c_set_html
66
+ c_set_no_cache('no-cache', 'no-cache, must-revalidate')
67
+ w = [:msg, title]
68
+ w = w.format_xml.page_to_xml if ! $test
69
+ c_set_body(w)
70
+ end
71
+
72
+ end
73
+ end
74
+
75
+ if $0 == __FILE__
76
+ require 'qwik/test-common'
77
+ $test = true
78
+ end
79
+
80
+ if defined?($test) && $test
81
+ #class TestActMonitor < Test::Unit::TestCase
82
+ class TestActMonitor
83
+ include TestSession
84
+
85
+ def setup_monitor
86
+ #Thread.abort_on_exception = true
87
+ t_add_user
88
+ page = @site.create_new
89
+ page.store('*t')
90
+ end
91
+
92
+ def test_act_monitor_1st
93
+ setup_monitor
94
+
95
+ t = Thread.new {
96
+ tres = session('/test/1.save?contents=t2')
97
+ ok_in(['Page is saved.'], 'title', tres)
98
+ }
99
+
100
+ res = session('/test/1.monitor') # Wait for update.
101
+ ok_in([:p, 't2'], "//div[@class='section']", res)
102
+
103
+ t.join # Wait for the thread.
104
+ end
105
+
106
+ def test_act_monitor
107
+ setup_monitor
108
+
109
+ t = Thread.new {
110
+ res = session('/test/1.monitor') # Wait for update.
111
+ ok_in([:p, 't2'], "//div[@class='section']", res)
112
+ }
113
+
114
+ tres = session('/test/1.save?contents=t2')
115
+ ok_in(['Page is saved.'], 'title', tres)
116
+
117
+ t.join # Wait for the thread.
118
+ end
119
+
120
+ def test_several_monitors
121
+ setup_monitor
122
+
123
+ # FIXME: This test sometimes fails.
124
+ t1 = Thread.new {
125
+ t1res = session('/test/1.monitor') # Wait for update.
126
+ ok_in([:p, 't3'], "//div[@class='section']", t1res)
127
+ }
128
+
129
+ # FIXME: Sometimes fails.
130
+ t2 = Thread.new {
131
+ t2res = session('/test/1.monitor') # Wait for update.
132
+ ok_in([:p, 't3'], "//div[@class='section']", t2res)
133
+ }
134
+
135
+ #sleep 0.5
136
+ #sleep 0.1
137
+ tres = session('/test/1.save?contents=t3')
138
+ ok_in(['Page is saved.'], 'title', tres)
139
+
140
+ t1.join # Wait for the thread.
141
+ t2.join # Wait for the thread.
142
+ end
143
+
144
+ def nutest_many_monitors
145
+ setup_monitor
146
+
147
+ ts = []
148
+ res = []
149
+ max = 15
150
+
151
+ (0..max).each {|i|
152
+ ts[i] = Thread.new {
153
+ res[i] = session('/test/1.monitor') # Wait for update.
154
+ ok_in([:p, 't3'], "//div[@class='section']", res[i])
155
+ }
156
+ }
157
+
158
+ #sleep 0.1
159
+ tres = session('/test/1.save?contents=t3')
160
+ assert_text('Page is saved.', 'title', tres)
161
+
162
+ (0..max).each {|i|
163
+ ts[i].join # Wait for the thread.
164
+ }
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,418 @@
1
+ # -*- coding: shift_jis -*-
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/act-monitor'
8
+ #require 'qwik/act-rrefs'
9
+ require 'qwik/page-title'
10
+
11
+ module Qwik
12
+ class Action
13
+ def act_new
14
+ c_require_login
15
+
16
+ # Check if the title is specified.
17
+ title = @req.query['t']
18
+ return new_input_title if title.nil? || title.empty?
19
+
20
+ # Parse page title.
21
+ page_title, tags = Page.parse_title(title)
22
+
23
+ # Check if the page title is here.
24
+ return new_input_title if page_title.nil? || page_title.empty?
25
+
26
+ # Check if the title is already exist.
27
+ page = @site.get_by_title(page_title)
28
+ return new_already_exist(page_title, page.key) if page
29
+
30
+ # Check if the request is GET.
31
+ return new_confirm(title) if ! @req.is_post?
32
+
33
+ if Page.valid_as_pagekey?(page_title)
34
+ key = page_title
35
+ else
36
+ key = @site.get_new_id
37
+ end
38
+
39
+ begin
40
+ page = @site.create(key) # CREATE
41
+ rescue PageExistError
42
+ # FIXME: should retry?
43
+ return new_already_exist(page_title, key)
44
+ end
45
+
46
+ c_make_log('create', key) # CREATE
47
+ c_monitor("create#{key}") # CREATE
48
+
49
+ page.store("* #{title}\n") # with tag
50
+
51
+ url = "#{key}.edit"
52
+
53
+ # create_rrefs(key)
54
+ site_updated
55
+
56
+ return c_notice(_('New page'), url, 201) { # 201, Created
57
+ [[:h2, _('Created.')],
58
+ [:p, [:a, {:href=>url}, _('Edit new page')]]]
59
+ }
60
+ end
61
+
62
+ def new_input_title
63
+ ar = []
64
+ form = new_form
65
+ return new_tail(ar, form)
66
+ end
67
+
68
+ def new_already_exist(title, key)
69
+ ar = []
70
+ ar << [:h2, _('Already exists')]
71
+ form = new_form(title) {
72
+ [:p, [:a, {:href=>key+'.html'}, [:strong, title]],
73
+ _(' already exists.'), [:br],
74
+ _('Please specify another title.')]
75
+ }
76
+ return new_tail(ar, form)
77
+ end
78
+
79
+ def new_confirm(title)
80
+ ar = []
81
+ ar << [:h2, _('Confirm')]
82
+ form = new_form(title) {
83
+ [:p, _('Push create.')]
84
+ }
85
+ return new_tail(ar, form)
86
+ end
87
+
88
+ def new_form(title=nil)
89
+ form = [:form, {:action=>'.new', :method=>'POST'},
90
+ [:dl, [:dt, _('Title')],
91
+ [:dd, [:input, {:name=>'t', :value=>title, :class=>'focus'}]]]]
92
+ form << yield if block_given?
93
+ form << [:p, [:input, {:type=>'submit', :value=>_("New page")}]]
94
+ end
95
+
96
+ def new_tail(ar, form)
97
+ ar << [:div, {:class=>'form'}, form]
98
+ ar << [:hr]
99
+ ar << [:p, [:a, {:href=>"FrontPage.html"}, _("Go back")]]
100
+ return c_notice(_('New page')) { ar }
101
+ end
102
+
103
+ def action_page_not_found
104
+ # Assert that the title is encoded in UTF8.
105
+ # @req.base.charset is already set to 'UTF-8' in request-path.rb
106
+ title = @req.base.to_page_charset
107
+ c_notfound(_('Page not found.')) {
108
+ [[:h2, _('Page not found.')],
109
+ [:p, [:a, {:href=>'FrontPage.html'}, _('Go back')]],
110
+ [:hr],
111
+ new_form(title) {
112
+ [:p, _('Push create if you would like to create the page.')]
113
+ }
114
+ ]
115
+ }
116
+ end
117
+ end
118
+ end
119
+
120
+ if $0 == __FILE__
121
+ require 'qwik/test-common'
122
+ $test = true
123
+ end
124
+
125
+ if defined?($test) && $test
126
+ class TestActNew < Test::Unit::TestCase
127
+ include TestSession
128
+
129
+ def test_create_new
130
+ t_add_user
131
+
132
+ # See .new page
133
+ res = session('/test/.new')
134
+ assert_attr({:action=>'.new', :method=>'POST'}, 'form')
135
+ ok_xp([:input, {:value=>nil, :class=>'focus', :name=>'t'}], '//input')
136
+ ok_xp([:input, {:value=>'New page', :type=>'submit'}], "//input[2]")
137
+
138
+ # Create a new page.
139
+ res = session("POST /test/.new?t=FirstPage")
140
+ ok_title('New page')
141
+ ok_in(['Edit new page'], "//div[@class='section']//a")
142
+ ok_xp([:a, {:href=>'FirstPage.edit'}, 'Edit new page'],
143
+ "//div[@class='section']//a")
144
+ end
145
+
146
+ def test_with_tag
147
+ t_add_user
148
+
149
+ res = session("POST /test/.new?t=[tag] t")
150
+ ok_xp([:a, {:href=>'t.edit'}, 'Edit new page'],
151
+ "//div[@class='section']//a")
152
+ page = @site['t']
153
+ ok_eq("* [tag] t\n", page.load)
154
+ end
155
+
156
+ def test_opensite_new
157
+ t_add_user
158
+ t_site_open # OPEN site
159
+
160
+ res = session('/test/') {|req|
161
+ req.cookies.clear
162
+ }
163
+ ok_title('FrontPage') # You can see the FrontPage.
164
+ ok_in(['Login'], "//div[@class='adminmenu']//a") # But, not logged in.
165
+
166
+ # Try to see the .new page
167
+ res = session('/test/.new') {|req|
168
+ req.cookies.clear
169
+ }
170
+ ok_title('Please log in.') # You can't see the form.
171
+ ok_in(['You need to log in to use this function.'], 'p')
172
+ end
173
+ end
174
+
175
+ class TestActNewWithEmbed < Test::Unit::TestCase
176
+ include TestSession
177
+
178
+ def test_embeded_new
179
+ t_add_user
180
+ page = @site['FrontPage']
181
+ page.store("[[FirstPage]]")
182
+
183
+ # See FrontPage
184
+ res = session('/test/')
185
+ ok_title('FrontPage')
186
+ ok_in([:span, {:class=>'new'}, 'FirstPage',
187
+ [:a, {:href=>".new?t=FirstPage"},
188
+ [:img, {:src=>'.theme/i/new.png', :alt=>'create'}]]],
189
+ "//div[@class='section']/p")
190
+
191
+ # To confirm
192
+ res = session("/test/.new?t=FirstPage")
193
+ ok_title('New page')
194
+ ok_in(['New page'], 'h1')
195
+ ok_in(['Confirm'], 'h2')
196
+ assert_attr({:action=>'.new', :method=>'POST'}, 'form')
197
+ ok_xp([:input, {:value=>'FirstPage', :class=>'focus', :name=>'t'}],
198
+ '//input')
199
+ ok_xp([:input, {:value=>'New page', :type=>'submit'}],
200
+ "//input[2]")
201
+
202
+ # Create a new page.
203
+ res = session("POST /test/.new?t=FirstPage")
204
+ ok_in(['Edit new page'], "//div[@class='section']//a")
205
+ ok_xp([:a, {:href=>'FirstPage.edit'}, 'Edit new page'],
206
+ "//div[@class='section']//a")
207
+
208
+ # Check the new page
209
+ ok_eq("* FirstPage\n", @site['FirstPage'].load)
210
+
211
+ # Try to create with the same key.
212
+ res = session("/test/.new?t=FirstPage")
213
+ ok_in(['Already exists'], '//h2')
214
+ ok_xp([:a, {:href=>'FirstPage.html'}, [:strong, 'FirstPage']],
215
+ "//div[@class='section']/a")
216
+
217
+ # Try to create with the same key.
218
+ res = session("POST /test/.new?t=FirstPage")
219
+ ok_in(['Already exists'], '//h2')
220
+ ok_xp([:a, {:href=>'FirstPage.html'}, [:strong, 'FirstPage']],
221
+ "//div[@class='section']/a")
222
+ end
223
+
224
+ def test_embeded_new_with_space
225
+ t_add_user
226
+ page = @site['FrontPage']
227
+ page.store("[[First Page]]")
228
+ ok_eq('FrontPage', page.get_title)
229
+
230
+ # see a page
231
+ res = session('/test/')
232
+ ok_in(['First Page', [:a, {:href=>".new?t=First+Page"},
233
+ [:img, {:src=>'.theme/i/new.png', :alt=>'create'}]]],
234
+ "//span[@class='new']")
235
+
236
+ # Please input corresponding page key
237
+ res = session("/test/.new?t=First+Page")
238
+ ok_in(['New page'], 'h1')
239
+ ok_in(['Confirm'], 'h2')
240
+ assert_attr({:action=>'.new', :method=>'POST'}, 'form')
241
+ ok_xp([:input, {:value=>'First Page',
242
+ :class=>'focus', :name=>'t'}], '//input')
243
+ ok_xp([:input, {:value=>'New page', :type=>'submit'}], "//input[2]")
244
+
245
+ # POST
246
+ res = session("POST /test/.new?t=First Page")
247
+ ok_in(['New page'], 'h1')
248
+ ok_in(['Edit new page'], "//div[@class='section']//a")
249
+ ok_xp([:a, {:href=>'1.edit'}, 'Edit new page'],
250
+ "//div[@class='section']//a")
251
+
252
+ # check the new page
253
+ ok_eq("* First Page\n", @site['1'].load)
254
+ page = @site.get_by_title('First Page')
255
+ ok_eq('1', page.key)
256
+
257
+ # check title
258
+ page = @site['1']
259
+ ok_eq('First Page', page.get_title)
260
+ ok_eq('1', @site.get_by_title('First Page').key.to_s)
261
+ ok_eq(false, @site.exist?('First Page'))
262
+ ok_eq(true, @site.exist?('1'))
263
+
264
+ # check the source page
265
+ res = session('/test/')
266
+ ok_in(['First Page'], "//div[@class='section']//a")
267
+ ok_xp([:a, {:href=>'1.html'}, 'First Page'],
268
+ "//div[@class='section']//a")
269
+ ok_eq("[[First Page]]", @site['FrontPage'].load)
270
+
271
+ # Try to create with the same key.
272
+ res = session("/test/.new?t=First+Page")
273
+ ok_in(['Already exists'], '//h2')
274
+ ok_xp([:a, {:href=>'1.html'}, [:strong, 'First Page']],
275
+ "//div[@class='section']/a")
276
+
277
+ # Try to create with the same key.
278
+ res = session("POST /test/.new?t=First+Page")
279
+ ok_in(['Already exists'], '//h2')
280
+ ok_xp([:a, {:href=>'1.html'}, [:strong, 'First Page']],
281
+ "//div[@class='section']/a")
282
+
283
+ # Let's create a page again. At the first, embed the title.
284
+ page = @site['FrontPage']
285
+ page.store("[[2nd Page]]")
286
+
287
+ # See the page
288
+ res = session('/test/')
289
+ ok_in(['2nd Page', [:a, {:href=>".new?t=2nd+Page"},
290
+ [:img, {:src=>'.theme/i/new.png', :alt=>'create'}]]],
291
+ "//div[@class='section']//span")
292
+
293
+ # please input a corresponding page key
294
+ res = session("/test/.new?t=2nd+Page")
295
+ ok_xp([:input, {:value=>'2nd Page', :class=>'focus', :name=>'t'}],
296
+ '//input')
297
+
298
+ # try again
299
+ res = session("POST /test/.new?t=2nd+Page")
300
+ ok_in(['Edit new page'], "//div[@class='section']//a")
301
+ ok_xp([:a, {:href=>'2.edit'}, 'Edit new page'],
302
+ "//div[@class='section']//a")
303
+
304
+ page = @site['2']
305
+ ok_eq("* 2nd Page\n", page.load)
306
+
307
+ # check the source page again
308
+ res = session('/test/')
309
+ ok_in(['2nd Page'], "//div[@class='section']//a")
310
+ ok_xp([:a, {:href=>'2.html'}, '2nd Page'],
311
+ "//div[@class='section']//a")
312
+ ok_eq("[[2nd Page]]", @site['FrontPage'].load)
313
+ end
314
+
315
+ def test_new_sjis
316
+ t_add_user
317
+ page = @site['FrontPage']
318
+ page.store("[[�|�X]]")
319
+
320
+ # See FrontPage
321
+ res = session('/test/')
322
+ ok_title('FrontPage')
323
+ ok_in([:span, {:class=>'new'}, "�|�X",
324
+ [:a, {:href=>".new?t=%83%7C%83X"},
325
+ [:img, {:src=>'.theme/i/new.png', :alt=>'create'}]]],
326
+ "//div[@class='section']/p")
327
+ end
328
+
329
+ def test_embeded_new_with_japanese_name
330
+ t_add_user
331
+
332
+ page = @site['FrontPage']
333
+ page.store("[[�ŏ��̃y�[�W]]")
334
+ ok_eq('FrontPage', page.get_title)
335
+
336
+ # See a page
337
+ res = session('/test/')
338
+ ok_in(["�ŏ��̃y�[�W",
339
+ [:a, {:href=>".new?t=%8D%C5%8F%89%82%CC%83y%81%5B%83W"},
340
+ [:img, {:src=>'.theme/i/new.png', :alt=>'create'}]]],
341
+ "//span[@class='new']")
342
+
343
+ # Please input corresponding page key
344
+ res = session("/test/.new?t=�ŏ��̃y�[�W")
345
+ ok_in(['New page'], 'h1')
346
+ ok_in(['Confirm'], 'h2')
347
+ assert_attr({:action=>'.new', :method=>'POST'}, 'form')
348
+ ok_xp([:input, {:value=>"�ŏ��̃y�[�W",
349
+ :class=>'focus', :name=>'t'}], '//input')
350
+ ok_xp([:input, {:value=>'New page', :type=>'submit'}],
351
+ "//input[2]")
352
+
353
+ # POST
354
+ res = session("POST /test/.new?t=�ŏ��̃y�[�W")
355
+ ok_in(['New page'], 'h1')
356
+ ok_in(['Edit new page'], "//div[@class='section']//a")
357
+ ok_xp([:a, {:href=>'1.edit'}, 'Edit new page'],
358
+ "//div[@class='section']//a")
359
+
360
+ # Check the new page.
361
+ ok_eq("* �ŏ��̃y�[�W\n", @site['1'].load)
362
+ page = @site.get_by_title("�ŏ��̃y�[�W")
363
+ ok_eq('1', page.key)
364
+
365
+ # Check title.
366
+ page = @site['1']
367
+ ok_eq("�ŏ��̃y�[�W", page.get_title)
368
+ ok_eq('1', @site.get_by_title("�ŏ��̃y�[�W").key.to_s)
369
+ ok_eq(false, @site.exist?("�ŏ��̃y�[�W"))
370
+ ok_eq(true, @site.exist?('1'))
371
+
372
+ # Check the source page.
373
+ res = session('/test/')
374
+ ok_in(["�ŏ��̃y�[�W"], "//div[@class='section']//a")
375
+ ok_xp([:a, {:href=>'1.html'}, "�ŏ��̃y�[�W"],
376
+ "//div[@class='section']//a")
377
+ ok_eq("[[�ŏ��̃y�[�W]]", @site['FrontPage'].load)
378
+
379
+ # Try to create with the same key.
380
+ res = session("/test/.new?t=�ŏ��̃y�[�W")
381
+
382
+ # Try to create with the same key.
383
+ res = session("POST /test/.new?t=�ŏ��̃y�[�W")
384
+ ok_in(['Already exists'], '//h2')
385
+
386
+ # Let's create a page again. At the first, embed the title.
387
+ page = @site['FrontPage']
388
+ page.store("[[���]]")
389
+
390
+ # See the page
391
+ res = session('/test/')
392
+ ok_in(["���",
393
+ [:a, {:href=>".new?t=%93%F1%95%C5"},
394
+ [:img, {:src=>'.theme/i/new.png', :alt=>'create'}]]],
395
+ "//div[@class='section']//span")
396
+
397
+ # please input a corresponding page key
398
+ res = session("/test/.new?t=���")
399
+ ok_xp([:input, {:value=>"���", :class=>'focus', :name=>'t'}], '//input')
400
+
401
+ # try again
402
+ res = session("POST /test/.new?t=���")
403
+ ok_in(['Edit new page'], "//div[@class='section']//a")
404
+ ok_xp([:a, {:href=>'2.edit'}, 'Edit new page'],
405
+ "//div[@class='section']//a")
406
+
407
+ page = @site['2']
408
+ ok_eq("* ���\n", page.load)
409
+
410
+ # check the source page again
411
+ res = session('/test/')
412
+ ok_in(["���"], "//div[@class='section']//a")
413
+ ok_xp([:a, {:href=>'2.html'}, "���"],
414
+ "//div[@class='section']//a")
415
+ ok_eq("[[���]]", @site['FrontPage'].load)
416
+ end
417
+ end
418
+ end