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,150 @@
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/parser-emode'
7
+ require 'qwik/act-include'
8
+
9
+ module Qwik
10
+ class Action
11
+ def plg_emode_date_link
12
+ years = []
13
+ months = {}
14
+
15
+ emode_each_month {|y, m|
16
+ years << y unless years.include?(y)
17
+ months[y] = [] if months[y].nil?
18
+ months[y] << m
19
+ }
20
+
21
+ list = [:ul]
22
+ years.each {|y|
23
+ ar = [:li]
24
+ ar << "20#{y} "
25
+ months[y].each {|m|
26
+ ar << [:a, {:href=>y+m+'.html'}, m]
27
+ ar << ' '
28
+ }
29
+ ar.pop
30
+ list << ar
31
+ }
32
+
33
+ return [:div, list]
34
+ end
35
+
36
+ def plg_emode_include_recent
37
+ max = 0
38
+ emode_each_month {|y, m|
39
+ ym = (y+m).to_i
40
+ max = ym if max < ym
41
+ }
42
+ str = sprintf('%04d', max)
43
+ return plg_include(str)
44
+ end
45
+
46
+ def emode_each_month
47
+ @site.to_a.sort.each {|page|
48
+ title = page.key
49
+ if /\A(\d\d)([0-1]\d)\z/ =~ title
50
+ y = $1
51
+ m = $2
52
+ yield(y, m)
53
+ end
54
+ }
55
+ end
56
+ end
57
+ end
58
+
59
+ if $0 == __FILE__
60
+ require 'qwik/test-common'
61
+ $test = true
62
+ end
63
+
64
+ if defined?($test) && $test
65
+ class TestActEmode < Test::Unit::TestCase
66
+ include TestSession
67
+
68
+ def test_emode_date_link
69
+ page = @site.create('0002')
70
+ page = @site.create('0003')
71
+ page = @site.create('0101')
72
+ page = @site.create('0110')
73
+ ok_wi([:div, [:ul,
74
+ [:li, '2000 ',
75
+ [:a, {:href=>'0002.html'}, '02'], ' ',
76
+ [:a, {:href=>'0003.html'}, '03']],
77
+ [:li, '2001 ',
78
+ [:a, {:href=>'0101.html'}, '01'], ' ',
79
+ [:a, {:href=>'0110.html'}, '10']]]],
80
+ '{{emode_date_link}}')
81
+ end
82
+
83
+ def test_emode_include_recent
84
+ page = @site.create('0002')
85
+ page = @site.create('0003')
86
+ page = @site.create('0101')
87
+ page = @site.create('0110')
88
+ page.store('01/10')
89
+ ok_wi([:div, {:class=>'day'}, '',
90
+ [:div, {:class=>'body'},
91
+ [:div, {:class=>'section'},
92
+ [[:p, '01/10']]]]],
93
+ '{{emode_include_recent}}')
94
+ end
95
+
96
+ def ok(e, w, user=DEFAULT_USER) # assert_body_main
97
+ assert_path(e, w, user, "//div[@class='body_main']")
98
+ end
99
+
100
+ def test_emode_include
101
+ page = @site.create_new
102
+ page.store("* t
103
+ * t")
104
+ page2 = @site.create_new
105
+ page2.store("* t2
106
+ * t2")
107
+ key = page2.key
108
+
109
+ config = @site['_SiteConfig']
110
+ config.store(':emode_titlelink:true')
111
+ ok([:div,
112
+ {:class=>'day'},
113
+ '',
114
+ [:div,
115
+ {:class=>'body'},
116
+ [:div,
117
+ {:class=>'section'},
118
+ [[:div,
119
+ {:class=>'day'},
120
+ [:h2,
121
+ [:a, {:href=>"2.html#t2", :name=>'t2', :class=>'label'},
122
+ "��"],
123
+ 't2'],
124
+ [:div, {:class=>'body'},
125
+ [:div, {:class=>'section'}, []]]]]]]],
126
+ "{{include(#{key})}}")
127
+
128
+ config.store('')
129
+ end
130
+
131
+ def test_emode_include_with_titlelink
132
+ t_add_user
133
+
134
+ page = @site.create('t1')
135
+ page.store("* t1
136
+ {{include(t2)}}")
137
+ page2 = @site.create('t2')
138
+ page2.store("* t2!
139
+ * t2!")
140
+
141
+ config = @site['_SiteConfig']
142
+ config.store(':emode_titlelink:true')
143
+ res = session('/test/t1.html')
144
+ ok_in([[:a, {:href=>"t2.html#Xb_M6_lBLMaGGH88jpd-rQ",
145
+ :name=>'Xb_M6_lBLMaGGH88jpd-rQ',
146
+ :class=>'label'}, "��"], "t2!"],
147
+ "//div[@class='day']/h2")
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,187 @@
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-event'
7
+
8
+ module Qwik
9
+ class Action
10
+ # ==================== Show current event.
11
+ def plg_event(pagename=nil)
12
+ return if defined?(@event_defined)
13
+ @event_defined = true
14
+
15
+ pagename ||= @req.base
16
+
17
+ url = "#{pagename}.event"
18
+ url = c_relative_to_root(url)
19
+
20
+ ar = []
21
+ div = [:div, {:id=>'event'}]
22
+ div << [:strong, 'plg_event'] if @config.debug
23
+ ar << div
24
+ ar << [:script, {:type=>'text/javascript',
25
+ :src=>'.theme/js/event.js'}, '']
26
+ ar << [:script, {:type=>'text/javascript'}, "
27
+ //alert('start');
28
+ g_eventwatcher.add('#{url}');
29
+ g_eventwatcher.start();
30
+ "]
31
+ return ar
32
+ end
33
+
34
+ # ==================== Event occurred.
35
+ def c_event(cmd)
36
+ time = @req.start_time.to_i
37
+ user = @req.user
38
+ user ||= 'anonymous'
39
+ key = @req.base
40
+ ext = @req.ext
41
+ event = [time, user, key, ext, cmd] # When, Who, Where, What
42
+ @site.event.occurred(event)
43
+ end
44
+
45
+ # ==================== Event callback
46
+ def get_sitename
47
+ return @site.sitename
48
+ end
49
+
50
+ def get_start_time
51
+ return @req.start_time
52
+ end
53
+
54
+ def event_occurred(event)
55
+ @event = event
56
+ end
57
+
58
+ def event_disconnect(reason)
59
+ if @event.nil?
60
+ @event = reason
61
+ end
62
+ end
63
+
64
+ # ==================== Wait for event.
65
+ def ext_event
66
+ @event = nil
67
+ siteevent = @site.event
68
+
69
+ begin
70
+ siteevent.add_listener(self)
71
+ rescue ListenerMaxExceed
72
+ @event = 'max_exceed'
73
+ end
74
+
75
+ while @event.nil?
76
+ sleep 0.1
77
+ end
78
+
79
+ if @event.is_a?(String)
80
+ return event_error(@event)
81
+ end
82
+
83
+ return event_tell(@event)
84
+ end
85
+
86
+ def event_error(msg)
87
+ return event_send(",#{msg}\n")
88
+ end
89
+
90
+ def event_tell(event)
91
+ time, user, key, ext, cmd = event
92
+ ar = []
93
+ title = "#{Time.at(time).ymd} : #{cmd}"
94
+ user = MailAddress.obfuscate(user)
95
+ msg = "#{user}: #{cmd} #{key}"
96
+ ar << [:h2, title]
97
+ ar << [:p, msg]
98
+ return event_send(ar)
99
+ end
100
+
101
+ def event_send(body)
102
+ @res.status = 200
103
+ @res['Cache-Control'] = 'no-cache, must-revalidate'
104
+ @res['Pragma'] = 'no-cache'
105
+ @res.body = body
106
+ end
107
+ end
108
+ end
109
+
110
+ if $0 == __FILE__
111
+ require 'qwik/test-common'
112
+ $test = true
113
+ end
114
+
115
+ if defined?($test) && $test
116
+ class TestActEvent < Test::Unit::TestCase
117
+ include TestSession
118
+
119
+ def setup_event
120
+ Thread.abort_on_exception = true
121
+ t_add_user
122
+ page = @site.create_new
123
+ page.store('*t')
124
+ end
125
+
126
+ def test_event_1
127
+ setup_event
128
+ t = Thread.new {
129
+ tres = session('/test/1.save?contents=t2')
130
+ ok_in(['Page is saved.'], 'title', tres)
131
+ }
132
+ res = session('/test/1.event') # Wait for update.
133
+ #ok_eq(",0,user@e.com,1,save,save\n", res.body)
134
+ t.join # Wait for the thread.
135
+ end
136
+
137
+ def test_event_2
138
+ setup_event
139
+ t = Thread.new {
140
+ res = session('/test/1.event') # Wait for update.
141
+ #ok_eq(",0,user@e.com,1,save,save\n", res.body)
142
+ }
143
+ tres = session('/test/1.save?contents=t2')
144
+ ok_in(['Page is saved.'], 'title', tres)
145
+ t.join # Wait for the thread.
146
+ end
147
+
148
+ def test_event_3_several_watchers
149
+ setup_event
150
+ t1 = Thread.new {
151
+ t1res = session('/test/1.event') # Wait for update.
152
+ #ok_eq(",0,user@e.com,1,save,save\n", t1res.body)
153
+ }
154
+ t2 = Thread.new {
155
+ t2res = session('/test/1.event') # Wait for update.
156
+ #ok_eq(",0,user@e.com,1,save,save\n", t2res.body)
157
+ }
158
+ tres = session('/test/1.save?contents=t2')
159
+ ok_in(['Page is saved.'], 'title', tres)
160
+ t1.join # Wait for the thread.
161
+ t2.join # Wait for the thread.
162
+ end
163
+
164
+ def test_event_4_many_watchers
165
+ setup_event
166
+ ts = []
167
+ res = []
168
+ #max = 20
169
+ max = 5
170
+ (0..max).each {|i|
171
+ ts[i] = Thread.new {
172
+ res[i] = session('/test/1.event') # Wait for update.
173
+ str = res[i].body
174
+ if !(str == ",0,user@e.com,1,save,save\n" ||
175
+ str == ",max_exceed\n" || str == ",disconnect\n")
176
+ #ok_eq('', str) # error
177
+ end
178
+ }
179
+ }
180
+ tres = session('/test/1.save?contents=t3')
181
+ ok_in(['Page is saved.'], 'title', tres)
182
+ (0..max).each {|i|
183
+ ts[i].join # Wait for the thread.
184
+ }
185
+ end
186
+ end
187
+ end
@@ -0,0 +1,303 @@
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-images'
7
+
8
+ module Qwik
9
+ class Action
10
+ def plg_file(f=nil, alt=f, base=@req.base)
11
+ return if f.nil?
12
+
13
+ encoded = Filename.encode(f)
14
+ href = "#{base}.files/#{encoded}"
15
+ download = "#{base}.download/#{encoded}"
16
+
17
+ files = @site.files(base)
18
+ if files.nil? || ! files.exist?(f)
19
+ src = icon_path('broken')
20
+ return [:div, {:class=>'ref'},
21
+ [:a, {:href=>href},
22
+ [:img, {:class=>'icon', :src=>src, :alt=>alt}],
23
+ [:br], alt]]
24
+ end
25
+
26
+ src = thumb_check(f)
27
+ if src
28
+ return [:div, {:class=>'ref'},
29
+ [:a, {:href=>href},
30
+ [:img, {:class=>'thumb', :src=>src, :alt=>alt}],
31
+ [:br], alt],
32
+ [:br],
33
+ [:a, {:href=>download}, 'download']
34
+ ]
35
+ end
36
+
37
+ ext = Filename.extname(f)
38
+ src = icon_find(ext)
39
+ if src
40
+ return [:div, {:class=>'ref'},
41
+ [:a, {:href=>href},
42
+ [:img, {:class=>'icon', :src=>src, :alt=>alt}],
43
+ [:br], alt],
44
+ [:br],
45
+ [:a, {:href=>download}, 'download']
46
+ ]
47
+ end
48
+
49
+ return [:div, {:class=>'ref'},
50
+ [:a, {:href=>href}, alt]]
51
+ end
52
+
53
+ def file_html(href, klass, src, alt, message)
54
+ return [:div, {:class=>'ref'},
55
+ [:a, {:href=>href},
56
+ [:img, {:class=>klass, :src=>src, :alt=>alt}],
57
+ [:br], message]]
58
+ end
59
+
60
+ def plg_imgfile(f=nil, alt=f, base=@req.base)
61
+ return nil if f.nil?
62
+ src = base+'.files/'+f
63
+ return [:img, {:src=>src, :alt=>alt}]
64
+ end
65
+
66
+ # ============================== thumbnail
67
+ def thumb_generate(f)
68
+ files = @site.files(@req.base)
69
+ files.generate_thumb(f) # page-images.rb
70
+ return @req.base+'.files/.thumb/'+f.to_s
71
+ end
72
+
73
+ def thumb_check(f)
74
+ ext = Filename.extname(f)
75
+ return thumb_generate(f) if PageFiles.is_image?(ext)
76
+ return nil
77
+ end
78
+
79
+ # ============================== icon
80
+ ICON_SUF_TABLE = {
81
+ 'tgz' => 'tar',
82
+ }
83
+
84
+ ICON_MIMETYPE_TABLE = {
85
+ 'application/octet-stream' => 'binary',
86
+ 'application/pdf' => 'pdf',
87
+ 'application/postscript' => 'ps',
88
+ 'application/zip' => 'compressed',
89
+ }
90
+
91
+ ICON_GENRE_TABLE = {
92
+ 'application' => 'a',
93
+ 'audio' => 'sound2',
94
+ 'image' => 'image2',
95
+ 'message' => 'text',
96
+ 'model' => 'sphere2',
97
+ 'multipart' => 'text',
98
+ 'text' => 'text',
99
+ 'video' => 'movie',
100
+ }
101
+
102
+ def icon_find(ext)
103
+ mimetype = @res.get_mimetypes ext
104
+ return icon_find_internal(mimetype, ext)
105
+ end
106
+
107
+ def icon_find_internal(mimetype, ext)
108
+ ext.downcase!
109
+
110
+ type = ICON_SUF_TABLE[ext]
111
+ return icon_path(type) if type
112
+
113
+ if mimetype
114
+ type = ICON_MIMETYPE_TABLE[mimetype]
115
+ if type
116
+ path = icon_path(type)
117
+ return path if path
118
+ end
119
+
120
+ genre, spec = mimetype.split('/')
121
+ type = ICON_GENRE_TABLE[genre]
122
+ if type
123
+ path = icon_path(type)
124
+ return path if path
125
+ end
126
+ end
127
+
128
+ return icon_path('generic')
129
+ end
130
+
131
+ def icon_path(type)
132
+ return icon_path_internal(@config.theme_dir.path+'i', type)
133
+ end
134
+
135
+ def icon_path_internal(path, type)
136
+ file = "#{type}.gif"
137
+ return nil unless (path+file).exist?
138
+ return ".theme/i/#{file}"
139
+ end
140
+
141
+ # ============================== ref
142
+ def plg_ref(f=nil, alt=f)
143
+ return nil if f.nil?
144
+ return [:div, {:class=>'ref'},
145
+ [:a, {:href=>'.attach/'+f}, alt]]
146
+ end
147
+ end
148
+ end
149
+
150
+ if $0 == __FILE__
151
+ require 'qwik/test-common'
152
+ require 'qwik/act-attach'
153
+ $test = true
154
+ end
155
+
156
+ if defined?($test) && $test
157
+ class TestActFile < Test::Unit::TestCase
158
+ include TestSession
159
+
160
+ def test_all
161
+ ok_wi('', '')
162
+
163
+ files = @site.files('1')
164
+
165
+ if files.exist?('1x1.png')
166
+ files.delete('1x1.png')
167
+ end
168
+
169
+ ok_wi([], '{{file}}')
170
+
171
+ ok_wi([:div, {:class=>'ref'},
172
+ [:a, {:href=>'1.files/1x1.png'},
173
+ [:img, {:alt=>'1x1.png', :class=>'icon',
174
+ :src=>'.theme/i/broken.gif'}],
175
+ [:br], '1x1.png']],
176
+ '{{file(1x1.png)}}')
177
+
178
+ png = TEST_PNG_DATA
179
+ files.fput('1x1.png', png)
180
+ ok_wi([:div, {:class=>'ref'},
181
+ [:a, {:href=>'1.files/1x1.png'},
182
+ [:img, {:alt=>'1x1.png',
183
+ :class=>'thumb', :src=>'1.files/.thumb/1x1.png'}],
184
+ [:br], '1x1.png'],
185
+ [:br],
186
+ [:a, {:href=>'1.download/1x1.png'}, 'download']],
187
+ '{{file(1x1.png)}}')
188
+
189
+ files.delete('test.pdf') if files.exist?('test.pdf')
190
+ pdf = 'PDF...dummy'
191
+ files.fput('test.pdf', pdf)
192
+ ok_wi([:div, {:class=>'ref'},
193
+ [:a, {:href=>'1.files/test.pdf'},
194
+ [:img, {:alt=>'test.pdf',
195
+ :class=>'icon', :src=>'.theme/i/pdf.gif'}],
196
+ [:br], 'test.pdf'],
197
+ [:br],
198
+ [:a, {:href=>'1.download/test.pdf'}, 'download']],
199
+ '{{file(test.pdf)}}')
200
+
201
+ files.delete('test.txt') if files.exist?('test.txt')
202
+ file = 'text file dummy'
203
+ files.fput('test.txt', file)
204
+ ok_wi([:div, {:class=>'ref'},
205
+ [:a, {:href=>'1.files/test.txt'},
206
+ [:img, {:alt=>'test.txt',
207
+ :class=>'icon', :src=>'.theme/i/text.gif'}],
208
+ [:br], 'test.txt'],
209
+ [:br],
210
+ [:a, {:href=>'1.download/test.txt'}, 'download']],
211
+ '{{file(test.txt)}}')
212
+
213
+ if files.exist?('test.nosuchext')
214
+ files.delete('test.nosuchext')
215
+ end
216
+
217
+ file = 'unknown file dummy'
218
+ files.fput('test.nosuchext', file)
219
+ ok_wi([:div, {:class=>'ref'},
220
+ [:a, {:href=>'1.files/test.nosuchext'},
221
+ [:img,
222
+ {:alt=>'test.nosuchext',
223
+ :class=>'icon', :src=>'.theme/i/generic.gif'}],
224
+ [:br], 'test.nosuchext'],
225
+ [:br],
226
+ [:a, {:href=>'1.download/test.nosuchext'}, 'download']],
227
+ '{{file(test.nosuchext)}}')
228
+ end
229
+
230
+ def test_bug
231
+ eq '=7E', Qwik::Filename.encode('~')
232
+
233
+ ok_wi [:div, {:class=>'ref'},
234
+ [:a, {:href=>'1.files/=7E.txt'},
235
+ [:img, {:src=>'.theme/i/broken.gif', :alt=>'~.txt', :class=>'icon'}],
236
+ [:br],
237
+ '~.txt']], '{{file(~.txt)}}'
238
+ end
239
+ end
240
+
241
+ class TestActIcon < Test::Unit::TestCase
242
+ include TestSession
243
+
244
+ def test_all
245
+ res = session
246
+ a = @action
247
+
248
+ # test_icon_path
249
+ ok_eq('.theme/i/broken.gif', a.icon_path('broken'))
250
+ ok_eq('.theme/i/image2.gif', a.icon_path('image2'))
251
+
252
+ # test_find_icon
253
+ ok_eq('.theme/i/tar.gif', a.icon_find('tgz'))
254
+ ok_eq('.theme/i/text.gif', a.icon_find('txt'))
255
+ ok_eq('.theme/i/text.gif', a.icon_find('css'))
256
+ ok_eq('.theme/i/image2.gif', a.icon_find('png'))
257
+ ok_eq('.theme/i/image2.gif', a.icon_find('gif'))
258
+ ok_eq('.theme/i/pdf.gif', a.icon_find('pdf'))
259
+ ok_eq('.theme/i/ps.gif', a.icon_find('ps'))
260
+ ok_eq('.theme/i/compressed.gif', a.icon_find('zip'))
261
+ ok_eq('.theme/i/binary.gif', a.icon_find('exe'))
262
+ ok_eq('.theme/i/generic.gif', a.icon_find('nosuchext'))
263
+ end
264
+ end
265
+
266
+ class TestActRef < Test::Unit::TestCase
267
+ include TestSession
268
+
269
+ def test_ref_plugin
270
+ attach = @site.attach
271
+ attach.delete('1x1.png') if attach.exist?('1x1.png')
272
+
273
+ ok_wi([], '{{ref}}')
274
+
275
+ ok_wi([:div, {:class=>'ref'},
276
+ [:a, {:href=>'.attach/1x1.png'}, '1x1.png']],
277
+ '{{ref(1x1.png)}}')
278
+
279
+ attach.delete('test.pdf') if attach.exist?('test.pdf')
280
+ pdf = 'PDF...dummy'
281
+ attach.fput('test.pdf', pdf)
282
+ ok_wi([:div, {:class=>'ref'},
283
+ [:a, {:href=>'.attach/test.pdf'}, 'test.pdf']],
284
+ '{{ref(test.pdf)}}')
285
+
286
+ attach.delete('test.txt') if attach.exist?('test.txt')
287
+ file = 'text file dummy'
288
+ attach.fput('test.txt', file)
289
+ ok_wi([:div, {:class=>'ref'},
290
+ [:a, {:href=>'.attach/test.txt'}, 'test.txt']],
291
+ '{{ref(test.txt)}}')
292
+
293
+ if attach.exist?('test.nosuchext')
294
+ attach.delete('test.nosuchext')
295
+ end
296
+ file = 'unknown file dummy'
297
+ attach.fput('test.nosuchext', file)
298
+ ok_wi([:div, {:class=>'ref'},
299
+ [:a, {:href=>'.attach/test.nosuchext'}, 'test.nosuchext']],
300
+ '{{ref(test.nosuchext)}}')
301
+ end
302
+ end
303
+ end